diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java deleted file mode 100644 index f58bb2ae4..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; - -import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.valkyrienskies.core.api.ships.LoadedShip; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; - -@Pseudo -@Mixin(SpeakerPosition.class) -public abstract class MixinSpeakerPosition { - @Shadow - public abstract Level level(); - - @Inject(method = "position", at = @At("RETURN"), remap = false, cancellable = true) - public void ValkyrienSkies2$position(final CallbackInfoReturnable cir) { - final Vec3 pos = cir.getReturnValue(); - final LoadedShip ship = VSGameUtilsKt.getShipObjectManagingPos(level(), pos.x, pos.y, pos.z); - if (ship != null) { - cir.setReturnValue(VSGameUtilsKt.toWorldCoordinates(level(), pos)); - } - } - - @Redirect( - method = "withinDistance", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" - ) - ) - public double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { - final Ship ship = VSGameUtilsKt.getShipManagingPos(level(), instance); - if (ship != null) { - return VSGameUtilsKt.squaredDistanceBetweenInclShips(level(), instance.x, instance.y, instance.z, d.x, d.y, - d.z); - } - - return instance.distanceToSqr(d); - } -} diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java new file mode 100644 index 000000000..1244e4b49 --- /dev/null +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java @@ -0,0 +1,64 @@ +package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; + +import dan200.computercraft.client.sound.SpeakerSound; +import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3d; +import org.joml.Vector3dc; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.client.audio.VelocityTickableSoundInstance; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +@Mixin(SpeakerSound.class) +public abstract class MixinSpeakerSound extends AbstractSoundInstance implements VelocityTickableSoundInstance { + @Unique private SpeakerPosition speakerPosition; + @Unique private Ship ship; + + protected MixinSpeakerSound(ResourceLocation arg, SoundSource arg2) { + super(arg, arg2); + } + + @Inject( + method = "setPosition", + at = @At("RETURN"), + remap = false + ) + private void isOnShip(SpeakerPosition position, CallbackInfo ci) { + this.speakerPosition = position; + this.ship = VSGameUtilsKt.getShipManagingPos(position.level(), position.position()); + if (this.ship != null) { + Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + x = worldPos.x; + y = worldPos.y; + z = worldPos.z; + } + } + + @Inject( + method = "tick", + at = @At("HEAD") + ) + private void updateWorldPos(CallbackInfo ci) { + if (this.ship != null) { + Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + x = worldPos.x; + y = worldPos.y; + z = worldPos.z; + } + } + + @NotNull + @Override + public Vector3dc getVelocity() { + return ship != null ? ship.getVelocity() : new Vector3d(); + } +} diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD index 04360e4e0..86cfc1995 100644 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD @@ -1,6 +1,6 @@ Minimal ComputerCraft Compatibility Mixins -- MixinSpeakerPosition +- MixinSpeakerSound - Fixes Speakers on Ships not playing sounds in worldspace but in Shipyard - MixinTurtleBrain - Fails Movement if the turtle is in worldspace and the target position is a diff --git a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json index a4cadc46b..8a8fdc95e 100644 --- a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json +++ b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json @@ -4,7 +4,6 @@ "compatibilityLevel": "JAVA_8", "plugin": "org.valkyrienskies.mod.fabric.mixin.ValkyrienFabricMixinConfigPlugin", "mixins": [ - "compat.cc_restitched.MixinSpeakerPosition", "compat.cc_restitched.MixinTurtleBrain", "compat.cc_restitched.MixinTurtleMoveCommand", "compat.cc_restitched.MixinWirelessNetwork", @@ -18,6 +17,7 @@ "world.level.block.FireMixin" ], "client": [ + "compat.cc_restitched.MixinSpeakerSound", "compat.create.client.MixinContraptionHandlerClient", "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinCullingBlockEntityIterator", diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java deleted file mode 100644 index fa6304a8a..000000000 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; - -import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; - -@Pseudo -@Mixin(SpeakerPosition.class) -public abstract class MixinSpeakerPosition { - @Shadow - public abstract Level level(); - - @Inject(method = "position", at = @At("RETURN"), remap = false, cancellable = true) - public void ValkyrienSkies2$position(final CallbackInfoReturnable cir) { - final Vec3 pos = cir.getReturnValue(); - final Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level(), pos.x, pos.y, pos.z); - if (ship != null) { - cir.setReturnValue(VSGameUtilsKt.toWorldCoordinates(level(), pos)); - } - } - - @Redirect( - method = "withinDistance", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" - ) - ) - public double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { - final Ship ship = VSGameUtilsKt.getShipManagingPos(level(), instance); - if (ship != null) { - return VSGameUtilsKt.squaredDistanceBetweenInclShips(level(), instance.x, instance.y, instance.z, d.x, d.y, - d.z); - } - - return instance.distanceToSqr(d); - } -} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java new file mode 100644 index 000000000..3a3fa4244 --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java @@ -0,0 +1,64 @@ +package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; + +import dan200.computercraft.client.sound.SpeakerSound; +import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3d; +import org.joml.Vector3dc; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.client.audio.VelocityTickableSoundInstance; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +@Mixin(SpeakerSound.class) +public abstract class MixinSpeakerSound extends AbstractSoundInstance implements VelocityTickableSoundInstance { + @Unique private SpeakerPosition speakerPosition; + @Unique private Ship ship; + + protected MixinSpeakerSound(ResourceLocation arg, SoundSource arg2) { + super(arg, arg2); + } + + @Inject( + method = "setPosition", + at = @At("RETURN"), + remap = false + ) + private void isOnShip(SpeakerPosition position, CallbackInfo ci) { + this.speakerPosition = position; + this.ship = VSGameUtilsKt.getShipManagingPos(position.level(), position.position()); + if (this.ship != null) { + Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + x = worldPos.x; + y = worldPos.y; + z = worldPos.z; + } + } + + @Inject( + method = "tick", + at = @At("HEAD") + ) + private void updateWorldPos(CallbackInfo ci) { + if (this.ship != null) { + Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + x = worldPos.x; + y = worldPos.y; + z = worldPos.z; + } + } + + @NotNull + @Override + public Vector3dc getVelocity() { + return ship != null ? ship.getVelocity() : new Vector3d(); + } +} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD index 04360e4e0..86cfc1995 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD @@ -1,6 +1,6 @@ Minimal ComputerCraft Compatibility Mixins -- MixinSpeakerPosition +- MixinSpeakerSound - Fixes Speakers on Ships not playing sounds in worldspace but in Shipyard - MixinTurtleBrain - Fails Movement if the turtle is in worldspace and the target position is a diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index a2b9f0e36..a09fd8411 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -4,7 +4,6 @@ "compatibilityLevel": "JAVA_17", "plugin": "org.valkyrienskies.mod.forge.mixin.ValkyrienForgeMixinConfigPlugin", "mixins": [ - "compat.cc_tweaked.MixinSpeakerPosition", "compat.cc_tweaked.MixinTurtleBrain", "compat.cc_tweaked.MixinTurtleMoveCommand", "compat.cc_tweaked.MixinWirelessNetwork", @@ -23,14 +22,15 @@ ], "client": [ "client.render.MixinLevelRenderer", + "compat.cc_tweaked.MixinSpeakerSound", "compat.create.client.MixinContraptionHandlerClient", "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinFlwContraption", "compat.create.client.MixinSuperGlueSelectionHandler", + "compat.create.client.MixinTrackBlockOutline", "compat.sodium.MixinRenderSectionManager", "compat.tis3d.MixinCasingTileEntityRender", - "compat.tis3d.MixinRenderContextImpl", - "compat.create.client.MixinTrackBlockOutline" + "compat.tis3d.MixinRenderContextImpl" ], "injectors": { "defaultRequire": 1