From afac024e9edde08b35137fe61af4784041664470 Mon Sep 17 00:00:00 2001 From: Motschen Date: Sun, 28 Mar 2021 12:07:47 +0200 Subject: [PATCH] Client side implementation of the jukebox overhaul Uses a mixin into the sound system to determine the sound played at the position of the jukebox, then tries to get the record item of the sound. If it fails it will fall back to the server side implementation. --- gradle.properties | 2 +- .../renderer/JukeboxBlockEntityRenderer.java | 26 +++++++++++++- .../mixin/MixinSoundSystem.java | 36 +++++++++++++++++++ .../visualoverhaul/util/sound/SoundTest.java | 23 ++++++++++++ src/main/resources/visualoverhaul.mixins.json | 3 ++ 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinSoundSystem.java create mode 100644 src/main/java/eu/midnightdust/visualoverhaul/util/sound/SoundTest.java diff --git a/gradle.properties b/gradle.properties index 470e510..f5cd9c1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.11.1 # Mod Properties - mod_version = 3.0.1 + mod_version = 3.1.0 maven_group = eu.midnightdust archives_base_name = visualoverhaul diff --git a/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java b/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java index e030135..7c7c775 100644 --- a/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java +++ b/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java @@ -2,6 +2,7 @@ package eu.midnightdust.visualoverhaul.block.renderer; import eu.midnightdust.visualoverhaul.VisualOverhaulClient; import eu.midnightdust.visualoverhaul.config.VOConfig; +import eu.midnightdust.visualoverhaul.util.sound.SoundTest; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.block.Blocks; @@ -17,11 +18,15 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.Vector3f; import net.minecraft.item.ItemStack; import net.minecraft.state.property.Properties; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; import java.util.Random; @Environment(EnvType.CLIENT) public class JukeboxBlockEntityRenderer extends BlockEntityRenderer { + private ItemStack record; + private Identifier discItem; public JukeboxBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) { super(blockEntityRenderDispatcher); @@ -32,7 +37,26 @@ public class JukeboxBlockEntityRenderer extends BlockEntityRenderer minecraft:music_disc_cat) // + discItem = new Identifier(String.valueOf(SoundTest.getSound(blockEntity.getPos())).replace(".", "_")); + } + // If the sound is stopped or no sound is playing, the stack is set to an empty stack // + if (SoundTest.getSound(blockEntity.getPos()) == null) { + discItem = null; + record = ItemStack.EMPTY; + } + // Tries to get the disc item from the registry // + else if (Registry.ITEM.getOrEmpty(discItem).isPresent()) { + record = new ItemStack(Registry.ITEM.get(discItem)); + } + // Fallback to serverside implementation if the id doesn't match an item // + else { + record = blockEntity.getRecord(); + } + record.setCount(2); matrices.push(); diff --git a/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinSoundSystem.java b/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinSoundSystem.java new file mode 100644 index 0000000..b8985d8 --- /dev/null +++ b/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinSoundSystem.java @@ -0,0 +1,36 @@ +package eu.midnightdust.visualoverhaul.mixin; + +import eu.midnightdust.visualoverhaul.util.sound.SoundTest; +import net.minecraft.client.sound.SoundInstance; +import net.minecraft.client.sound.SoundSystem; +import net.minecraft.sound.SoundCategory; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +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.callback.CallbackInfo; + +@Mixin(SoundSystem.class) +public abstract class MixinSoundSystem { + + @Shadow private boolean started; + + private BlockPos jukeboxPos; + + @Inject(at = @At("TAIL"),method = "play(Lnet/minecraft/client/sound/SoundInstance;)V") + public void onPlayRecordSound(SoundInstance soundInstance, CallbackInfo ci) { + if (soundInstance.getCategory().equals(SoundCategory.RECORDS) && this.started) { + jukeboxPos = new BlockPos(soundInstance.getX(),soundInstance.getY(),soundInstance.getZ()); + SoundTest.soundPos.put(jukeboxPos, soundInstance.getId()); + } + } + + @Inject(at = @At("TAIL"),method = "stop(Lnet/minecraft/client/sound/SoundInstance;)V") + public void onStopRecordSound(SoundInstance soundInstance, CallbackInfo ci) { + if (soundInstance.getCategory().equals(SoundCategory.RECORDS) && SoundTest.soundPos.containsKey(new BlockPos(soundInstance.getX(),soundInstance.getY(),soundInstance.getZ()))) { + jukeboxPos = new BlockPos(soundInstance.getX(),soundInstance.getY(),soundInstance.getZ()); + SoundTest.soundPos.remove(jukeboxPos,soundInstance.getId()); + } + } +} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/visualoverhaul/util/sound/SoundTest.java b/src/main/java/eu/midnightdust/visualoverhaul/util/sound/SoundTest.java new file mode 100644 index 0000000..1d3c126 --- /dev/null +++ b/src/main/java/eu/midnightdust/visualoverhaul/util/sound/SoundTest.java @@ -0,0 +1,23 @@ +package eu.midnightdust.visualoverhaul.util.sound; + +import com.google.common.collect.Maps; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; + +import java.util.Map; + +public class SoundTest { + + public static Map soundPos = Maps.newHashMap(); + + /** + * Returns the Sound provided in MixinSoundSystem + * {@link eu.midnightdust.visualoverhaul.mixin.MixinSoundSystem} + */ + public static Identifier getSound(BlockPos pos) { + if (soundPos.containsKey(pos)) { + return soundPos.get(pos); + } + return null; + } +} diff --git a/src/main/resources/visualoverhaul.mixins.json b/src/main/resources/visualoverhaul.mixins.json index aa0110b..716e32c 100644 --- a/src/main/resources/visualoverhaul.mixins.json +++ b/src/main/resources/visualoverhaul.mixins.json @@ -8,6 +8,9 @@ "MixinAbstractFurnaceBlockEntity", "MixinServerWorld" ], + "client": [ + "MixinSoundSystem" + ], "injectors": { "defaultRequire": 1 }