diff --git a/src/main/java/com/replaymod/core/LoadingPlugin.java b/src/main/java/com/replaymod/core/LoadingPlugin.java index 2f0cc730..9a251ed9 100755 --- a/src/main/java/com/replaymod/core/LoadingPlugin.java +++ b/src/main/java/com/replaymod/core/LoadingPlugin.java @@ -20,6 +20,7 @@ public class LoadingPlugin implements IFMLLoadingPlugin { Mixins.addConfiguration("mixins.render.replaymod.json"); Mixins.addConfiguration("mixins.replay.replaymod.json"); Mixins.addConfiguration("mixins.compat.shaders.replaymod.json"); + Mixins.addConfiguration("mixins.extras.playeroverview.replaymod.json"); CodeSource codeSource = getClass().getProtectionDomain().getCodeSource(); if (codeSource != null) { diff --git a/src/main/java/com/replaymod/extras/ReplayModExtras.java b/src/main/java/com/replaymod/extras/ReplayModExtras.java index 5e414197..93ed038a 100644 --- a/src/main/java/com/replaymod/extras/ReplayModExtras.java +++ b/src/main/java/com/replaymod/extras/ReplayModExtras.java @@ -10,7 +10,10 @@ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import org.apache.logging.log4j.Logger; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; @Mod(modid = ReplayModExtras.MOD_ID, version = "@MOD_VERSION@", @@ -33,6 +36,8 @@ public class ReplayModExtras { OpenEyeExtra.class ); + private final Map, Extra> instances = new HashMap<>(); + public static Logger LOGGER; @Mod.EventHandler @@ -46,9 +51,14 @@ public class ReplayModExtras { try { Extra extra = cls.newInstance(); extra.register(ReplayMod.instance); + instances.put(cls, extra); } catch (Throwable t) { LOGGER.warn("Failed to load extra " + cls.getName() + ": ", t); } } } + + public Optional get(Class cls) { + return Optional.ofNullable(instances.get(cls)).map(cls::cast); + } } diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java index 774cce95..67619f84 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java @@ -9,8 +9,6 @@ import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayOpenEvent; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderHandEvent; @@ -60,12 +58,6 @@ public class PlayerOverview implements Extra { FMLCommonHandler.instance().bus().register(this); MinecraftForge.EVENT_BUS.register(this); - - RenderManager renderManager = mod.getMinecraft().getRenderManager(); - @SuppressWarnings("unchecked") - Map skinMap = renderManager.skinMap; - skinMap.put("default", new PlayerRenderHook(this, renderManager, false)); - skinMap.put("slim", new PlayerRenderHook(this, renderManager, true)); } public boolean isHidden(UUID uuid) { diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerRenderHook.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerRenderHook.java deleted file mode 100644 index 66c7eb42..00000000 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerRenderHook.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.replaymod.extras.playeroverview; - -import net.minecraft.client.renderer.culling.ICamera; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.RenderPlayer; -import net.minecraft.entity.Entity; - -public class PlayerRenderHook extends RenderPlayer { - private final PlayerOverview extra; - - public PlayerRenderHook(PlayerOverview extra, RenderManager renderManager, boolean useSmallArms) { - super(renderManager, useSmallArms); - this.extra = extra; - } - - @Override - public boolean shouldRender(Entity entity, ICamera camera, double camX, double camY, double camZ) { - return !extra.isHidden(entity.getUniqueID()) && super.shouldRender(entity, camera, camX, camY, camZ); - } -} diff --git a/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java b/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java new file mode 100644 index 00000000..fd750943 --- /dev/null +++ b/src/main/java/com/replaymod/extras/playeroverview/mixin/MixinRender.java @@ -0,0 +1,40 @@ +package com.replaymod.extras.playeroverview.mixin; + +import com.replaymod.extras.ReplayModExtras; +import com.replaymod.extras.playeroverview.PlayerOverview; +import net.minecraft.client.renderer.culling.ICamera; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +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; + +/** + * This mixin prevents players that are hidden in the PlayerOverview from being rendered. + * + * Cancelling the RenderPlayerEvent.Pre is insufficient because it affects neither the shadows nor the fire texture. + * See: https://github.com/MinecraftForge/MinecraftForge/issues/2987 + * + * The previous solution was to overwrite the RenderPlayer instances which has been dropped in favor of this one + * because it is less compatible with other mods whereas this one should be fine as long as no other mod completely + * overwrites the shouldRender method. + * One example of the previous solution breaking is when used with VanillaEnhancements because it replaces the + * RenderManager with a new custom one which in turn will reset our registered RenderPlayer instances because + * it does so after we have already registered with the old RenderManager. + */ +@Mixin(value = Render.class, priority = 1200) +public abstract class MixinRender { + @Inject(method = "shouldRender", at=@At("HEAD"), cancellable = true) + public void replayModExtras_isPlayerHidden(Entity entity, ICamera camera, double camX, double camY, double camZ, CallbackInfoReturnable ci) { + ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { + if (entity instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entity; + if (playerOverview.isHidden(player.getUniqueID())) { + ci.setReturnValue(false); + } + } + }); + } +} diff --git a/src/main/resources/mixins.extras.playeroverview.replaymod.json b/src/main/resources/mixins.extras.playeroverview.replaymod.json new file mode 100644 index 00000000..7c9a0a1f --- /dev/null +++ b/src/main/resources/mixins.extras.playeroverview.replaymod.json @@ -0,0 +1,11 @@ +{ + "required": true, + "package": "com.replaymod.extras.playeroverview.mixin", + "mixins": [], + "server": [], + "client": [ + "MixinRender" + ], + "compatibilityLevel": "JAVA_8", + "refmap": "mixins.replaymod.refmap.json" +} \ No newline at end of file