diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java b/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java index 8828e630..e2774eea 100755 --- a/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java +++ b/src/main/java/eu/crushedpixel/replaymod/coremod/LoadingPlugin.java @@ -41,8 +41,7 @@ public class LoadingPlugin implements IFMLLoadingPlugin { public String[] getASMTransformerClass() { return new String[]{ ForceChunkLoadingCT.class.getName(), - NoNameTagCT.class.getName(), - SoundManagerCT.class.getName() + NoNameTagCT.class.getName() }; } diff --git a/src/main/java/eu/crushedpixel/replaymod/coremod/SoundManagerCT.java b/src/main/java/eu/crushedpixel/replaymod/coremod/SoundManagerCT.java deleted file mode 100644 index 263bf7e5..00000000 --- a/src/main/java/eu/crushedpixel/replaymod/coremod/SoundManagerCT.java +++ /dev/null @@ -1,70 +0,0 @@ -package eu.crushedpixel.replaymod.coremod; - -import net.minecraft.launchwrapper.IClassTransformer; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.*; - -import java.util.ListIterator; - -import static org.objectweb.asm.Opcodes.*; - -public class SoundManagerCT implements IClassTransformer { - - private static final String REPLAY_HANDLER = "eu/crushedpixel/replaymod/replay/ReplayHandler"; - private static final String CAMERA_ENTITY = "eu/crushedpixel/replaymod/entities/CameraEntity"; - private static final String CLASS_NAME = "net.minecraft.client.audio.SoundManager"; - - @Override - public byte[] transform(String name, String transformedName, byte[] bytes) { - if (CLASS_NAME.equals(transformedName)) { - if (name.equals(transformedName)) { - return transform(bytes, "setListener", "(Lnet/minecraft/entity/player/EntityPlayer;F)V"); - } else { - return transform(bytes, "a", "(Lahd;F)V"); - } - } - return bytes; - } - - private byte[] transform(byte[] bytes, String name_setListener, String desc_setListener) { - ClassReader classReader = new ClassReader(bytes); - ClassNode classNode = new ClassNode(); - classReader.accept(classNode, 0); - - boolean success = false; - for (MethodNode m : classNode.methods) { - if (desc_setListener.equals(m.desc) && name_setListener.equals(m.name)) { - ListIterator iter = m.instructions.iterator(); - inject(iter); - success = true; - break; - } - } - if (!success) { - throw new NoSuchMethodError(); - } - - ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); - classNode.accept(classWriter); - return classWriter.toByteArray(); - } - - /** - * public void setListener(EntityPlayer player, float partialTicks) { - * ... - * if (ReplayHandler.isInReplay()) { - * player = ReplayHandler.getCameraEntity(); - * } - * ... - * } - */ - private void inject(ListIterator iter) { - LabelNode l = new LabelNode(); - iter.add(new MethodInsnNode(INVOKESTATIC, REPLAY_HANDLER, "isInReplay", "()Z", false)); - iter.add(new JumpInsnNode(IFEQ, l)); - iter.add(new MethodInsnNode(INVOKESTATIC, REPLAY_HANDLER, "getCameraEntity", "()L" + CAMERA_ENTITY + ";", false)); - iter.add(new VarInsnNode(ASTORE, 1)); - iter.add(l); - } -} diff --git a/src/main/java/eu/crushedpixel/replaymod/mixin/MixinMinecraft.java b/src/main/java/eu/crushedpixel/replaymod/mixin/MixinMinecraft.java new file mode 100644 index 00000000..df9f7665 --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/mixin/MixinMinecraft.java @@ -0,0 +1,17 @@ +package eu.crushedpixel.replaymod.mixin; + +import eu.crushedpixel.replaymod.replay.ReplayHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.SoundHandler; +import net.minecraft.entity.player.EntityPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(Minecraft.class) +public class MixinMinecraft { + @Redirect(method = "runGameLoop", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/audio/SoundHandler;setListener(Lnet/minecraft/entity/player/EntityPlayer;F)V")) + public void setSoundSystemListener(SoundHandler soundHandler, EntityPlayer listener, float renderPartialTicks) { + soundHandler.setListener(ReplayHandler.isInReplay() ? ReplayHandler.getCameraEntity() : listener, renderPartialTicks); + } +} diff --git a/src/main/resources/mixins.replaymod.json b/src/main/resources/mixins.replaymod.json index 6749ad31..5d534a4e 100644 --- a/src/main/resources/mixins.replaymod.json +++ b/src/main/resources/mixins.replaymod.json @@ -4,6 +4,7 @@ "mixins": [ "MixinEffectRenderer", "MixinEntityRenderer", + "MixinMinecraft", "MixinRenderItem", "MixinRenderManager" ],