diff --git a/src/main/java/io/github/techstreet/dfscript/event/RecieveSoundEvent.java b/src/main/java/io/github/techstreet/dfscript/event/RecieveSoundEvent.java index c5b23e8..3b567ed 100644 --- a/src/main/java/io/github/techstreet/dfscript/event/RecieveSoundEvent.java +++ b/src/main/java/io/github/techstreet/dfscript/event/RecieveSoundEvent.java @@ -1,18 +1,31 @@ package io.github.techstreet.dfscript.event; import io.github.techstreet.dfscript.event.system.CancellableEvent; +import net.minecraft.client.sound.SoundInstance; +import net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket; +import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket; import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.Identifier; public class RecieveSoundEvent implements CancellableEvent { private boolean cancelled = false; - private final PlaySoundS2CPacket packet; - public RecieveSoundEvent(PlaySoundS2CPacket packet) { - this.packet = packet; + private final SoundInstance sound; + + public RecieveSoundEvent(SoundInstance sound) { + this.sound = sound; + } + + public Identifier getSoundId() { + return sound.getId(); + } + public float getVolume() { + return sound.getVolume(); } - public PlaySoundS2CPacket getPacket() { - return packet; + public float getPitch() { + return sound.getPitch(); } @Override diff --git a/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java b/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java index 5d8916e..73403c0 100644 --- a/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java +++ b/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java @@ -15,11 +15,7 @@ import java.net.InetSocketAddress; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.network.ClientConnection; -import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; -import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; -import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket; -import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; -import net.minecraft.network.packet.s2c.play.TeamS2CPacket; +import net.minecraft.network.packet.s2c.play.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -94,7 +90,7 @@ private void onDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { EventManager.getInstance().dispatch(event); } - @Inject(method = "onPlaySound", at = @At("HEAD"), cancellable = true) + /*@Inject(method = "onPlaySound", at = @At("HEAD"), cancellable = true) private void onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) { RecieveSoundEvent event = new RecieveSoundEvent(packet); EventManager.getInstance().dispatch(event); @@ -103,4 +99,24 @@ private void onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) { ci.cancel(); } } + + @Inject(method = "onPlaySoundFromEntity", at = @At("HEAD"), cancellable = true) + private void onPlaySoundFromEntity(PlaySoundFromEntityS2CPacket packet, CallbackInfo ci) { + RecieveSoundEvent event = new RecieveSoundEvent(packet); + EventManager.getInstance().dispatch(event); + + if (event.isCancelled()) { + ci.cancel(); + } + } + + @Inject(method = "onPlaySoundId", at = @At("HEAD"), cancellable = true) + private void onPlaySoundId(PlaySoundIdS2CPacket packet, CallbackInfo ci) { + RecieveSoundEvent event = new RecieveSoundEvent(packet); + EventManager.getInstance().dispatch(event); + + if (event.isCancelled()) { + ci.cancel(); + } + }*/ } diff --git a/src/main/java/io/github/techstreet/dfscript/mixin/sound/MSoundSystem.java b/src/main/java/io/github/techstreet/dfscript/mixin/sound/MSoundSystem.java new file mode 100644 index 0000000..44a9eb7 --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/mixin/sound/MSoundSystem.java @@ -0,0 +1,25 @@ +package io.github.techstreet.dfscript.mixin.sound; + +import io.github.techstreet.dfscript.event.RecieveSoundEvent; +import io.github.techstreet.dfscript.event.system.EventManager; +import io.github.techstreet.dfscript.util.chat.ChatUtil; +import net.minecraft.client.sound.SoundInstance; +import net.minecraft.client.sound.SoundSystem; +import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(SoundSystem.class) +public class MSoundSystem { + @Inject(method = "play", at = @At("HEAD"), cancellable = true) + public void play(SoundInstance sound, CallbackInfo ci) { + RecieveSoundEvent event = new RecieveSoundEvent(sound); + EventManager.getInstance().dispatch(event); + + if (event.isCancelled()) { + ci.cancel(); + } + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java b/src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java index d52d00f..61ad124 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java +++ b/src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java @@ -3,14 +3,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import io.github.techstreet.dfscript.DFScript; -import io.github.techstreet.dfscript.event.BuildModeEvent; -import io.github.techstreet.dfscript.event.DevModeEvent; -import io.github.techstreet.dfscript.event.HudRenderEvent; -import io.github.techstreet.dfscript.event.KeyPressEvent; -import io.github.techstreet.dfscript.event.PlayModeEvent; -import io.github.techstreet.dfscript.event.ReceiveChatEvent; -import io.github.techstreet.dfscript.event.SendChatEvent; -import io.github.techstreet.dfscript.event.TickEvent; +import io.github.techstreet.dfscript.event.*; import io.github.techstreet.dfscript.event.system.Event; import io.github.techstreet.dfscript.event.system.EventManager; import io.github.techstreet.dfscript.loader.Loadable; @@ -202,6 +195,7 @@ private void loadEvents() { manager.register(BuildModeEvent.class, this::handleEvent); manager.register(DevModeEvent.class, this::handleEvent); manager.register(HudRenderEvent.class, this::handleEvent); + manager.register(RecieveSoundEvent.class, this::handleEvent); } public void handleEvent(Event event) { diff --git a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java index c17b91d..6067089 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java +++ b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java @@ -1193,6 +1193,12 @@ public enum ScriptActionType { } })), + STOP_ALL_SOUNDS(builder -> builder.name("Stop All Sounds") + .description("Stops all sounds.") + .icon(Items.COAL) + .category(ScriptActionCategory.VISUALS) + .action(ctx -> DFScript.MC.getSoundManager().stopAll())), + DISPLAY_TITLE(builder -> builder.name("Display Title") .description("Displays a title.") .icon(Items.WARPED_SIGN) diff --git a/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptClientValueArgument.java b/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptClientValueArgument.java index f383445..c86e57f 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptClientValueArgument.java +++ b/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptClientValueArgument.java @@ -7,6 +7,7 @@ import io.github.techstreet.dfscript.DFScript; import io.github.techstreet.dfscript.event.KeyPressEvent; import io.github.techstreet.dfscript.event.ReceiveChatEvent; +import io.github.techstreet.dfscript.event.RecieveSoundEvent; import io.github.techstreet.dfscript.event.SendChatEvent; import io.github.techstreet.dfscript.event.system.Event; import io.github.techstreet.dfscript.script.action.ScriptActionArgument.ScriptActionArgumentType; @@ -137,7 +138,31 @@ public enum ScriptClientValueArgument implements ScriptArgument { (event, context) -> new ScriptTextValue(DFScript.PLAYER_UUID)), PLAYER_NAME("Player Name", "The name of the player.", Items.PLAYER_HEAD, ScriptActionArgumentType.TEXT, - (event, context) -> new ScriptTextValue(DFScript.PLAYER_NAME)); + (event, context) -> new ScriptTextValue(DFScript.PLAYER_NAME)), + + EVENT_SOUND("ReceivedSound", "The ID of the sound. (OnReceiveSound)", Items.NAUTILUS_SHELL, ScriptActionArgumentType.TEXT, (event, context) -> { + if(event instanceof RecieveSoundEvent e) { + return new ScriptTextValue(e.getSoundId().toString().replaceAll("^minecraft:", "")); + } else { + throw new IllegalStateException("The event is not a receive sound event."); + } + }), + + EVENT_VOLUME("ReceivedSoundVolume", "The volume of the sound received. (OnReceiveSound)", Items.NOTE_BLOCK, ScriptActionArgumentType.NUMBER, (event, context) -> { + if(event instanceof RecieveSoundEvent e) { + return new ScriptNumberValue(e.getVolume()); + } else { + throw new IllegalStateException("The event is not a receive sound event."); + } + }), + + EVENT_PITCH("ReceivedSoundPitch", "The pitch of the sound received. (OnReceiveSound)", Items.JUKEBOX, ScriptActionArgumentType.NUMBER, (event, context) -> { + if(event instanceof RecieveSoundEvent e) { + return new ScriptNumberValue(e.getPitch()); + } else { + throw new IllegalStateException("The event is not a receive sound event."); + } + }); private final String name; private final ItemStack icon; diff --git a/src/main/java/io/github/techstreet/dfscript/script/event/ScriptEventType.java b/src/main/java/io/github/techstreet/dfscript/script/event/ScriptEventType.java index 4b68b98..f5d8ed8 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/event/ScriptEventType.java +++ b/src/main/java/io/github/techstreet/dfscript/script/event/ScriptEventType.java @@ -1,13 +1,6 @@ package io.github.techstreet.dfscript.script.event; -import io.github.techstreet.dfscript.event.BuildModeEvent; -import io.github.techstreet.dfscript.event.DevModeEvent; -import io.github.techstreet.dfscript.event.HudRenderEvent; -import io.github.techstreet.dfscript.event.KeyPressEvent; -import io.github.techstreet.dfscript.event.PlayModeEvent; -import io.github.techstreet.dfscript.event.ReceiveChatEvent; -import io.github.techstreet.dfscript.event.SendChatEvent; -import io.github.techstreet.dfscript.event.TickEvent; +import io.github.techstreet.dfscript.event.*; import io.github.techstreet.dfscript.event.system.Event; import io.github.techstreet.dfscript.script.menu.ScriptMenuClickButtonEvent; import net.minecraft.item.Item; @@ -39,7 +32,9 @@ public enum ScriptEventType { OVERLAY_EVENT(HudRenderEvent.class, "OnOverlay", "Executed when the overlay is being rendered.", Items.GREEN_STAINED_GLASS_PANE), - MENU_BUTTON_EVENT(ScriptMenuClickButtonEvent.class, "OnMenuButtonClick", "Executed when a player clicks a button inside a custom menu.", Items.CHISELED_STONE_BRICKS); + MENU_BUTTON_EVENT(ScriptMenuClickButtonEvent.class, "OnMenuButtonClick", "Executed when a player clicks a button inside a custom menu.", Items.CHISELED_STONE_BRICKS), + + RECEIVE_SOUND(RecieveSoundEvent.class, "OnReceiveSound", "Executed when a player receives a sound", Items.NAUTILUS_SHELL); private final String name; private final ItemStack icon; diff --git a/src/main/resources/dfscript.mixins.json b/src/main/resources/dfscript.mixins.json index 6067ab2..6e225f1 100644 --- a/src/main/resources/dfscript.mixins.json +++ b/src/main/resources/dfscript.mixins.json @@ -10,7 +10,8 @@ "player.MLocalPlayer", "render.MInGameHUD", "render.MMultiplayerScreen", - "render.MOptionsScreen" + "render.MOptionsScreen", + "sound.MSoundSystem" ], "client": [ ],