Skip to content

Commit caab6b8

Browse files
committed
Added STOP_ALL_SOUNDS, RECEIVE_SOUND (event) and several client values regarding the event
1 parent aac8d5d commit caab6b8

File tree

8 files changed

+105
-30
lines changed

8 files changed

+105
-30
lines changed

src/main/java/io/github/techstreet/dfscript/event/RecieveSoundEvent.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
11
package io.github.techstreet.dfscript.event;
22

33
import io.github.techstreet.dfscript.event.system.CancellableEvent;
4+
import net.minecraft.client.sound.SoundInstance;
5+
import net.minecraft.network.packet.s2c.play.PlaySoundFromEntityS2CPacket;
6+
import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket;
47
import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket;
8+
import net.minecraft.sound.SoundEvent;
9+
import net.minecraft.util.Identifier;
510

611
public class RecieveSoundEvent implements CancellableEvent {
712
private boolean cancelled = false;
8-
private final PlaySoundS2CPacket packet;
913

10-
public RecieveSoundEvent(PlaySoundS2CPacket packet) {
11-
this.packet = packet;
14+
private final SoundInstance sound;
15+
16+
public RecieveSoundEvent(SoundInstance sound) {
17+
this.sound = sound;
18+
}
19+
20+
public Identifier getSoundId() {
21+
return sound.getId();
22+
}
23+
public float getVolume() {
24+
return sound.getVolume();
1225
}
1326

14-
public PlaySoundS2CPacket getPacket() {
15-
return packet;
27+
public float getPitch() {
28+
return sound.getPitch();
1629
}
1730

1831
@Override

src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,7 @@
1515
import java.net.InetSocketAddress;
1616
import net.minecraft.client.network.ClientPlayNetworkHandler;
1717
import net.minecraft.network.ClientConnection;
18-
import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket;
19-
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
20-
import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket;
21-
import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket;
22-
import net.minecraft.network.packet.s2c.play.TeamS2CPacket;
18+
import net.minecraft.network.packet.s2c.play.*;
2319
import org.spongepowered.asm.mixin.Mixin;
2420
import org.spongepowered.asm.mixin.injection.At;
2521
import org.spongepowered.asm.mixin.injection.Inject;
@@ -94,7 +90,7 @@ private void onDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) {
9490
EventManager.getInstance().dispatch(event);
9591
}
9692

97-
@Inject(method = "onPlaySound", at = @At("HEAD"), cancellable = true)
93+
/*@Inject(method = "onPlaySound", at = @At("HEAD"), cancellable = true)
9894
private void onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) {
9995
RecieveSoundEvent event = new RecieveSoundEvent(packet);
10096
EventManager.getInstance().dispatch(event);
@@ -103,4 +99,24 @@ private void onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) {
10399
ci.cancel();
104100
}
105101
}
102+
103+
@Inject(method = "onPlaySoundFromEntity", at = @At("HEAD"), cancellable = true)
104+
private void onPlaySoundFromEntity(PlaySoundFromEntityS2CPacket packet, CallbackInfo ci) {
105+
RecieveSoundEvent event = new RecieveSoundEvent(packet);
106+
EventManager.getInstance().dispatch(event);
107+
108+
if (event.isCancelled()) {
109+
ci.cancel();
110+
}
111+
}
112+
113+
@Inject(method = "onPlaySoundId", at = @At("HEAD"), cancellable = true)
114+
private void onPlaySoundId(PlaySoundIdS2CPacket packet, CallbackInfo ci) {
115+
RecieveSoundEvent event = new RecieveSoundEvent(packet);
116+
EventManager.getInstance().dispatch(event);
117+
118+
if (event.isCancelled()) {
119+
ci.cancel();
120+
}
121+
}*/
106122
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.github.techstreet.dfscript.mixin.sound;
2+
3+
import io.github.techstreet.dfscript.event.RecieveSoundEvent;
4+
import io.github.techstreet.dfscript.event.system.EventManager;
5+
import io.github.techstreet.dfscript.util.chat.ChatUtil;
6+
import net.minecraft.client.sound.SoundInstance;
7+
import net.minecraft.client.sound.SoundSystem;
8+
import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
13+
14+
@Mixin(SoundSystem.class)
15+
public class MSoundSystem {
16+
@Inject(method = "play", at = @At("HEAD"), cancellable = true)
17+
public void play(SoundInstance sound, CallbackInfo ci) {
18+
RecieveSoundEvent event = new RecieveSoundEvent(sound);
19+
EventManager.getInstance().dispatch(event);
20+
21+
if (event.isCancelled()) {
22+
ci.cancel();
23+
}
24+
}
25+
}

src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,7 @@
33
import com.google.gson.Gson;
44
import com.google.gson.GsonBuilder;
55
import io.github.techstreet.dfscript.DFScript;
6-
import io.github.techstreet.dfscript.event.BuildModeEvent;
7-
import io.github.techstreet.dfscript.event.DevModeEvent;
8-
import io.github.techstreet.dfscript.event.HudRenderEvent;
9-
import io.github.techstreet.dfscript.event.KeyPressEvent;
10-
import io.github.techstreet.dfscript.event.PlayModeEvent;
11-
import io.github.techstreet.dfscript.event.ReceiveChatEvent;
12-
import io.github.techstreet.dfscript.event.SendChatEvent;
13-
import io.github.techstreet.dfscript.event.TickEvent;
6+
import io.github.techstreet.dfscript.event.*;
147
import io.github.techstreet.dfscript.event.system.Event;
158
import io.github.techstreet.dfscript.event.system.EventManager;
169
import io.github.techstreet.dfscript.loader.Loadable;
@@ -202,6 +195,7 @@ private void loadEvents() {
202195
manager.register(BuildModeEvent.class, this::handleEvent);
203196
manager.register(DevModeEvent.class, this::handleEvent);
204197
manager.register(HudRenderEvent.class, this::handleEvent);
198+
manager.register(RecieveSoundEvent.class, this::handleEvent);
205199
}
206200

207201
public void handleEvent(Event event) {

src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,6 +1193,12 @@ public enum ScriptActionType {
11931193
}
11941194
})),
11951195

1196+
STOP_ALL_SOUNDS(builder -> builder.name("Stop All Sounds")
1197+
.description("Stops all sounds.")
1198+
.icon(Items.COAL)
1199+
.category(ScriptActionCategory.VISUALS)
1200+
.action(ctx -> DFScript.MC.getSoundManager().stopAll())),
1201+
11961202
DISPLAY_TITLE(builder -> builder.name("Display Title")
11971203
.description("Displays a title.")
11981204
.icon(Items.WARPED_SIGN)

src/main/java/io/github/techstreet/dfscript/script/argument/ScriptClientValueArgument.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.github.techstreet.dfscript.DFScript;
88
import io.github.techstreet.dfscript.event.KeyPressEvent;
99
import io.github.techstreet.dfscript.event.ReceiveChatEvent;
10+
import io.github.techstreet.dfscript.event.RecieveSoundEvent;
1011
import io.github.techstreet.dfscript.event.SendChatEvent;
1112
import io.github.techstreet.dfscript.event.system.Event;
1213
import io.github.techstreet.dfscript.script.action.ScriptActionArgument.ScriptActionArgumentType;
@@ -137,7 +138,31 @@ public enum ScriptClientValueArgument implements ScriptArgument {
137138
(event, context) -> new ScriptTextValue(DFScript.PLAYER_UUID)),
138139

139140
PLAYER_NAME("Player Name", "The name of the player.", Items.PLAYER_HEAD, ScriptActionArgumentType.TEXT,
140-
(event, context) -> new ScriptTextValue(DFScript.PLAYER_NAME));
141+
(event, context) -> new ScriptTextValue(DFScript.PLAYER_NAME)),
142+
143+
EVENT_SOUND("ReceivedSound", "The ID of the sound. (OnReceiveSound)", Items.NAUTILUS_SHELL, ScriptActionArgumentType.TEXT, (event, context) -> {
144+
if(event instanceof RecieveSoundEvent e) {
145+
return new ScriptTextValue(e.getSoundId().toString().replaceAll("^minecraft:", ""));
146+
} else {
147+
throw new IllegalStateException("The event is not a receive sound event.");
148+
}
149+
}),
150+
151+
EVENT_VOLUME("ReceivedSoundVolume", "The volume of the sound received. (OnReceiveSound)", Items.NOTE_BLOCK, ScriptActionArgumentType.NUMBER, (event, context) -> {
152+
if(event instanceof RecieveSoundEvent e) {
153+
return new ScriptNumberValue(e.getVolume());
154+
} else {
155+
throw new IllegalStateException("The event is not a receive sound event.");
156+
}
157+
}),
158+
159+
EVENT_PITCH("ReceivedSoundPitch", "The pitch of the sound received. (OnReceiveSound)", Items.JUKEBOX, ScriptActionArgumentType.NUMBER, (event, context) -> {
160+
if(event instanceof RecieveSoundEvent e) {
161+
return new ScriptNumberValue(e.getPitch());
162+
} else {
163+
throw new IllegalStateException("The event is not a receive sound event.");
164+
}
165+
});
141166

142167
private final String name;
143168
private final ItemStack icon;

src/main/java/io/github/techstreet/dfscript/script/event/ScriptEventType.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
package io.github.techstreet.dfscript.script.event;
22

3-
import io.github.techstreet.dfscript.event.BuildModeEvent;
4-
import io.github.techstreet.dfscript.event.DevModeEvent;
5-
import io.github.techstreet.dfscript.event.HudRenderEvent;
6-
import io.github.techstreet.dfscript.event.KeyPressEvent;
7-
import io.github.techstreet.dfscript.event.PlayModeEvent;
8-
import io.github.techstreet.dfscript.event.ReceiveChatEvent;
9-
import io.github.techstreet.dfscript.event.SendChatEvent;
10-
import io.github.techstreet.dfscript.event.TickEvent;
3+
import io.github.techstreet.dfscript.event.*;
114
import io.github.techstreet.dfscript.event.system.Event;
125
import io.github.techstreet.dfscript.script.menu.ScriptMenuClickButtonEvent;
136
import net.minecraft.item.Item;
@@ -39,7 +32,9 @@ public enum ScriptEventType {
3932

4033
OVERLAY_EVENT(HudRenderEvent.class, "OnOverlay", "Executed when the overlay is being rendered.", Items.GREEN_STAINED_GLASS_PANE),
4134

42-
MENU_BUTTON_EVENT(ScriptMenuClickButtonEvent.class, "OnMenuButtonClick", "Executed when a player clicks a button inside a custom menu.", Items.CHISELED_STONE_BRICKS);
35+
MENU_BUTTON_EVENT(ScriptMenuClickButtonEvent.class, "OnMenuButtonClick", "Executed when a player clicks a button inside a custom menu.", Items.CHISELED_STONE_BRICKS),
36+
37+
RECEIVE_SOUND(RecieveSoundEvent.class, "OnReceiveSound", "Executed when a player receives a sound", Items.NAUTILUS_SHELL);
4338

4439
private final String name;
4540
private final ItemStack icon;

src/main/resources/dfscript.mixins.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"player.MLocalPlayer",
1111
"render.MInGameHUD",
1212
"render.MMultiplayerScreen",
13-
"render.MOptionsScreen"
13+
"render.MOptionsScreen",
14+
"sound.MSoundSystem"
1415
],
1516
"client": [
1617
],

0 commit comments

Comments
 (0)