From d8e9f621bdc3fa02da8d3ca8016dd13fc07077c1 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Wed, 14 Sep 2016 20:04:22 +0200 Subject: [PATCH] Completely hide invisible entities during replay Fixes invisible entities when in spectator mode during recording --- .../mixin/MixinRendererLivingEntity.java | 17 ----------- .../replay/mixin/MixinArmorStandRenderer.java | 22 +++++++++++++++ .../mixin/MixinRendererLivingEntity.java | 28 +++++++++++++++++++ .../resources/mixins.replay.replaymod.json | 2 ++ 4 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/replaymod/replay/mixin/MixinArmorStandRenderer.java create mode 100644 src/main/java/com/replaymod/replay/mixin/MixinRendererLivingEntity.java diff --git a/src/main/java/com/replaymod/render/mixin/MixinRendererLivingEntity.java b/src/main/java/com/replaymod/render/mixin/MixinRendererLivingEntity.java index 7d87b1b7..38cbe2ae 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinRendererLivingEntity.java +++ b/src/main/java/com/replaymod/render/mixin/MixinRendererLivingEntity.java @@ -4,11 +4,9 @@ import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.RendererLivingEntity; import net.minecraft.entity.EntityLivingBase; -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.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(RendererLivingEntity.class) @@ -19,20 +17,5 @@ public abstract class MixinRendererLivingEntity { if (handler != null && !handler.getSettings().isRenderNameTags()) { ci.setReturnValue(false); //this calls the cancel method } - - // TODO -// if(ReplayHandler.isInReplay() && entity.isInvisible() -// && ReplaySettings.ReplayOptions.renderInvisible.getValue() == Boolean.FALSE) { -// ci.setReturnValue(false); -// } - } - - @Redirect(method = "renderModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityLivingBase;isInvisibleToPlayer(Lnet/minecraft/entity/player/EntityPlayer;)Z")) - private boolean replayModRender_shouldInvisibleNotBeRendered(EntityLivingBase entity, EntityPlayer thePlayer) { - // TODO -// if(ReplaySettings.ReplayOptions.renderInvisible.getValue() == Boolean.TRUE|| !ReplayHandler.isInReplay()) { -// return entity.isInvisibleToPlayer(thePlayer); -// } - return true; //the original method inverts the return value } } diff --git a/src/main/java/com/replaymod/replay/mixin/MixinArmorStandRenderer.java b/src/main/java/com/replaymod/replay/mixin/MixinArmorStandRenderer.java new file mode 100644 index 00000000..71c8f6d5 --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/MixinArmorStandRenderer.java @@ -0,0 +1,22 @@ +package com.replaymod.replay.mixin; + +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.ArmorStandRenderer; +import net.minecraft.entity.item.EntityArmorStand; +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.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ArmorStandRenderer.class) +public abstract class MixinArmorStandRenderer { + @Inject(method = "func_177099_b", at = @At("HEAD"), cancellable = true) + private void replayModReplay_canRenderInvisibleName(EntityArmorStand entity, CallbackInfoReturnable ci) { + EntityPlayer thePlayer = Minecraft.getMinecraft().thePlayer; + if (thePlayer instanceof CameraEntity && entity.isInvisible()) { + ci.setReturnValue(false); + } + } +} diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRendererLivingEntity.java b/src/main/java/com/replaymod/replay/mixin/MixinRendererLivingEntity.java new file mode 100644 index 00000000..14f86443 --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/MixinRendererLivingEntity.java @@ -0,0 +1,28 @@ +package com.replaymod.replay.mixin; + +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.entity.EntityLivingBase; +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.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(RendererLivingEntity.class) +public abstract class MixinRendererLivingEntity { + @Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true) + private void replayModReplay_canRenderInvisibleName(EntityLivingBase entity, CallbackInfoReturnable ci) { + EntityPlayer thePlayer = Minecraft.getMinecraft().thePlayer; + if (thePlayer instanceof CameraEntity && entity.isInvisible()) { + ci.setReturnValue(false); + } + } + + @Redirect(method = "renderModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityLivingBase;isInvisibleToPlayer(Lnet/minecraft/entity/player/EntityPlayer;)Z")) + private boolean replayModReplay_shouldInvisibleNotBeRendered(EntityLivingBase entity, EntityPlayer thePlayer) { + return thePlayer instanceof CameraEntity || entity.isInvisibleToPlayer(thePlayer); + } +} diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index 9adbc7f7..b18e7b9f 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -2,9 +2,11 @@ "required": true, "package": "com.replaymod.replay.mixin", "mixins": [ + "MixinArmorStandRenderer", "MixinGuiSpectator", "MixinPlayerControllerMP", "MixinRenderArrow", + "MixinRendererLivingEntity", "MixinRenderItem", "MixinRenderManager", "MixinTileEntityEndPortalRenderer",