diff --git a/gradle.properties b/gradle.properties index c2bf664..0ecb5e9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.configuration-cache=false # Mod mod_id=video_player -mod_version=0.4.24 +mod_version=0.4.25 maven_group=com.ejclaw.videoplayer archives_base_name=video_player diff --git a/src/main/java/com/ejclaw/videoplayer/command/VideoPlaceCommand.java b/src/main/java/com/ejclaw/videoplayer/command/VideoPlaceCommand.java index 4cfbdf5..9885414 100644 --- a/src/main/java/com/ejclaw/videoplayer/command/VideoPlaceCommand.java +++ b/src/main/java/com/ejclaw/videoplayer/command/VideoPlaceCommand.java @@ -22,7 +22,13 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.permissions.Permissions; import net.minecraft.world.level.block.Block; -/** SPEC §4.5.1 — {@code /videoPlace } */ +/** + * SPEC §4.5.1 — {@code /videoPlace }. + * + *

{@code volume} is an integer 0..100 (percent) or {@code -1} to start muted. The percent + * form mirrors the GUI slider; {@code -1} is a CLI shortcut so admins don't need a follow-up + * {@code /videoMute} step. + */ public final class VideoPlaceCommand { private VideoPlaceCommand() {} @@ -38,8 +44,9 @@ public final class VideoPlaceCommand { .then(Commands.argument("facing", StringArgumentType.word()) .then(Commands.argument("width", IntegerArgumentType.integer(1, 32)) .then(Commands.argument("height", IntegerArgumentType.integer(1, 32)) - .then(Commands.argument("url", StringArgumentType.greedyString()) - .executes(VideoPlaceCommand::run)))))); + .then(Commands.argument("volume", IntegerArgumentType.integer(-1, 100)) + .then(Commands.argument("url", StringArgumentType.greedyString()) + .executes(VideoPlaceCommand::run))))))); } private static int run(com.mojang.brigadier.context.CommandContext ctx) @@ -54,6 +61,12 @@ public final class VideoPlaceCommand { } int width = IntegerArgumentType.getInteger(ctx, "width"); int height = IntegerArgumentType.getInteger(ctx, "height"); + int volumeArg = IntegerArgumentType.getInteger(ctx, "volume"); + // -1 is the CLI mute shortcut; the BE keeps the underlying volume so an admin can + // /videoMute false later without re-typing a level. Anything 0..100 sets %-volume and + // clears mute. + boolean placeMuted = volumeArg < 0; + float placeVolume = placeMuted ? 0.5F : (volumeArg / 100.0F); String raw = StringArgumentType.getString(ctx, "url").trim(); // Accept either an http(s) URL or a /videoCache add entry: resolveUrlOrName() // returns the canonical URL in both cases, or null when a non-URL string didn't match @@ -75,6 +88,8 @@ public final class VideoPlaceCommand { be.setWidth(width); be.setHeight(height); be.setUrl(url); + be.setVolume(placeVolume); + be.setMuted(placeMuted); CompoundTag nbt = be.toNbt(); for (ServerPlayer p : PlayerLookup.tracking(level, pos)) {