Skip to content

Commit ea9396f

Browse files
committed
MTR Patch: Re-add lift ding sound
1 parent a5cc18d commit ea9396f

File tree

8 files changed

+167
-1
lines changed

8 files changed

+167
-1
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
# JCM v2.2.0-beta-2 for MTR 4.0.4 has been released!
22

3-
This enhances compatibility with NTE scripts and fix some issues.
3+
This release brings back the MTR 3 lift arrival sound (The ding sound), enhance compatibility with NTE scripts and fix some issue.
44

55
**Client & Server Update is required**
66

77
Unless otherwise noted, all changes below pertains to the Scripting feature in JCM.
88

99
## Additions
10+
- **(Non-scripting) MTR Patch**
11+
- Revive the **lift ding** sound feature from MTR 3, now they should function mostly equivalently.
1012
- Add `RawMeshBuilder` and `RawMesh`, both are *mostly* API-compatible with NTE.
1113
- Add `generateNormal()`, `distinct()` and `triangulate()` to `RawModel`.
1214
- Add `customDestination` to `Stop`, which exposes the raw custom destination value.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.lx862.jcm.mixin.modded.mtrpatch;
2+
3+
import com.lx862.jcm.mod.extra.JCMPatchForMTR;
4+
import org.mtr.core.data.Data;
5+
import org.mtr.core.data.Lift;
6+
import org.mtr.core.data.LiftFloor;
7+
import org.mtr.core.data.TransportMode;
8+
import org.mtr.core.generated.data.LiftSchema;
9+
import org.mtr.mapping.holder.*;
10+
import org.mtr.mapping.mapper.SoundHelper;
11+
import org.mtr.mod.Init;
12+
import org.mtr.mod.block.BlockLiftTrackFloor;
13+
import org.spongepowered.asm.mixin.Final;
14+
import org.spongepowered.asm.mixin.Mixin;
15+
import org.spongepowered.asm.mixin.Shadow;
16+
import org.spongepowered.asm.mixin.injection.At;
17+
import org.spongepowered.asm.mixin.injection.Inject;
18+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
19+
20+
@Mixin(value = Lift.class, remap = false)
21+
public abstract class LiftMixin extends LiftSchema {
22+
@Shadow
23+
@Final
24+
private boolean isClientside;
25+
26+
@Shadow
27+
public abstract LiftFloor getCurrentFloor();
28+
29+
protected LiftMixin(TransportMode transportMode, Data data) {
30+
super(transportMode, data);
31+
}
32+
33+
@Inject(method = "tick", at = @At("HEAD"))
34+
private void jsblock$playArrivalDingSound(long millisElapsed, CallbackInfo ci) {
35+
if(isClientside && JCMPatchForMTR.liftJustArrived(id, instructions.size())) {
36+
LiftFloor currentFloor = getCurrentFloor();
37+
BlockPos pos = Init.positionToBlockPos(currentFloor.getPosition());
38+
ClientWorld mcWorld = MinecraftClient.getInstance().getWorldMapped();
39+
ClientPlayerEntity mcPlayer = MinecraftClient.getInstance().getPlayerMapped();
40+
41+
if(mcWorld != null && mcPlayer != null) {
42+
BlockEntity be = mcWorld.getBlockEntity(pos);
43+
if(be != null && be.data instanceof BlockLiftTrackFloor.BlockEntity) {
44+
BlockLiftTrackFloor.BlockEntity floorBE = (BlockLiftTrackFloor.BlockEntity)be.data;
45+
if(floorBE.getShouldDing()) {
46+
mcWorld.playSound(PlayerEntity.cast(mcPlayer), pos, SoundHelper.createSoundEvent(JCMPatchForMTR.LIFT_DING_SOUND), SoundCategory.BLOCKS, 1, 2);
47+
}
48+
}
49+
}
50+
}
51+
}
52+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.lx862.jcm.mixin.modded.mtrpatch;
2+
3+
import org.mtr.mapping.holder.ClickableWidget;
4+
import org.mtr.mapping.mapper.CheckboxWidgetExtension;
5+
import org.mtr.mod.screen.LiftTrackFloorScreen;
6+
import org.spongepowered.asm.mixin.Final;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Shadow;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
13+
@Mixin(value = LiftTrackFloorScreen.class, remap = false)
14+
public class LiftTrackFloorScreenMixin {
15+
@Shadow
16+
@Final
17+
private CheckboxWidgetExtension checkboxShouldDing;
18+
19+
@Inject(method = "init2", at = @At("TAIL"))
20+
private void jsblock$addDingCheckbox(CallbackInfo ci) {
21+
((LiftTrackFloorScreen)(Object)this).addChild(new ClickableWidget(checkboxShouldDing));
22+
}
23+
}

fabric/src/main/java/com/lx862/jcm/mod/extra/JCMPatchForMTR.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.lx862.jcm.mixin.modded.mtrpatch.OptimizedRendererAccessorMixin;
44
import com.lx862.jcm.mixin.modded.mtrpatch.OptimizedRendererWrapperAccessorMixin;
5+
import it.unimi.dsi.fastutil.longs.Long2IntArrayMap;
56
import org.mtr.mapping.holder.Identifier;
67
import org.mtr.mapping.mapper.OptimizedRenderer;
78
import org.mtr.mapping.render.shader.ModShaderHandler;
@@ -13,7 +14,9 @@
1314
import java.util.Locale;
1415

1516
public class JCMPatchForMTR {
17+
public static Identifier LIFT_DING_SOUND = new Identifier("minecraft:block.note_block.pling");
1618
private static boolean cachedRenderingShadow = false;
19+
private static Long2IntArrayMap liftInstructions = new Long2IntArrayMap();
1720

1821
/**
1922
* Reload optimized rendering shaders.<br>
@@ -54,4 +57,11 @@ public static void updateRenderingShadow() {
5457
public static boolean isRenderingShadow() {
5558
return cachedRenderingShadow;
5659
}
60+
61+
public static boolean liftJustArrived(long liftId, int currentInstructionSize) {
62+
long lastValue = liftInstructions.getOrDefault(liftId, currentInstructionSize);
63+
boolean liftJustArrived = currentInstructionSize == 0 && lastValue == 1;
64+
liftInstructions.put(liftId, currentInstructionSize);
65+
return liftJustArrived;
66+
}
5767
}

fabric/src/main/resources/jsblock.mixins.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
"modded.mtr.VertexAttributeStateAccessor",
3030
"modded.mtrpatch.CustomResourceLoaderMixin",
3131
"modded.mtrpatch.CustomResourceToolsMixin",
32+
"modded.mtrpatch.LiftMixin",
33+
"modded.mtrpatch.LiftTrackFloorScreenMixin",
3234
"modded.mtrpatch.MainRendererMixin",
3335
"modded.mtrpatch.ObjectResourceSchemaMixin",
3436
"modded.mtrpatch.OptimizedRendererAccessorMixin",
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.lx862.jcm.mixin.modded.mtrpatch;
2+
3+
import com.lx862.jcm.mod.extra.JCMPatchForMTR;
4+
import org.mtr.core.data.Data;
5+
import org.mtr.core.data.Lift;
6+
import org.mtr.core.data.LiftFloor;
7+
import org.mtr.core.data.TransportMode;
8+
import org.mtr.core.generated.data.LiftSchema;
9+
import org.mtr.mapping.holder.*;
10+
import org.mtr.mapping.mapper.SoundHelper;
11+
import org.mtr.mod.Init;
12+
import org.mtr.mod.block.BlockLiftTrackFloor;
13+
import org.spongepowered.asm.mixin.Final;
14+
import org.spongepowered.asm.mixin.Mixin;
15+
import org.spongepowered.asm.mixin.Shadow;
16+
import org.spongepowered.asm.mixin.injection.At;
17+
import org.spongepowered.asm.mixin.injection.Inject;
18+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
19+
20+
@Mixin(value = Lift.class, remap = false)
21+
public abstract class LiftMixin extends LiftSchema {
22+
@Shadow
23+
@Final
24+
private boolean isClientside;
25+
26+
@Shadow
27+
public abstract LiftFloor getCurrentFloor();
28+
29+
protected LiftMixin(TransportMode transportMode, Data data) {
30+
super(transportMode, data);
31+
}
32+
33+
@Inject(method = "tick", at = @At("HEAD"))
34+
private void jsblock$playArrivalDingSound(long millisElapsed, CallbackInfo ci) {
35+
if(isClientside && JCMPatchForMTR.liftJustArrived(id, instructions.size())) {
36+
LiftFloor currentFloor = getCurrentFloor();
37+
BlockPos pos = Init.positionToBlockPos(currentFloor.getPosition());
38+
ClientWorld mcWorld = MinecraftClient.getInstance().getWorldMapped();
39+
ClientPlayerEntity mcPlayer = MinecraftClient.getInstance().getPlayerMapped();
40+
41+
if(mcWorld != null && mcPlayer != null) {
42+
BlockEntity be = mcWorld.getBlockEntity(pos);
43+
if(be != null && be.data instanceof BlockLiftTrackFloor.BlockEntity) {
44+
BlockLiftTrackFloor.BlockEntity floorBE = (BlockLiftTrackFloor.BlockEntity)be.data;
45+
if(floorBE.getShouldDing()) {
46+
mcWorld.playSound(PlayerEntity.cast(mcPlayer), pos, SoundHelper.createSoundEvent(JCMPatchForMTR.LIFT_DING_SOUND), SoundCategory.BLOCKS, 1, 2);
47+
}
48+
}
49+
}
50+
}
51+
}
52+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.lx862.jcm.mixin.modded.mtrpatch;
2+
3+
import org.mtr.mapping.holder.ClickableWidget;
4+
import org.mtr.mapping.mapper.CheckboxWidgetExtension;
5+
import org.mtr.mod.screen.LiftTrackFloorScreen;
6+
import org.spongepowered.asm.mixin.Final;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Shadow;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
13+
@Mixin(value = LiftTrackFloorScreen.class, remap = false)
14+
public class LiftTrackFloorScreenMixin {
15+
@Shadow
16+
@Final
17+
private CheckboxWidgetExtension checkboxShouldDing;
18+
19+
@Inject(method = "init2", at = @At("TAIL"))
20+
private void jsblock$addDingCheckbox(CallbackInfo ci) {
21+
((LiftTrackFloorScreen)(Object)this).addChild(new ClickableWidget(checkboxShouldDing));
22+
}
23+
}

forge/src/main/resources/jsblock.mixins.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
"modded.mtr.VertexAttributeStateAccessor",
3030
"modded.mtrpatch.CustomResourceLoaderMixin",
3131
"modded.mtrpatch.CustomResourceToolsMixin",
32+
"modded.mtrpatch.LiftMixin",
33+
"modded.mtrpatch.LiftTrackFloorScreenMixin",
3234
"modded.mtrpatch.MainRendererMixin",
3335
"modded.mtrpatch.ObjectResourceSchemaMixin",
3436
"modded.mtrpatch.OptimizedRendererAccessorMixin",

0 commit comments

Comments
 (0)