diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 880d66b4..13a0307b 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -111,6 +111,10 @@ public class ReplayHandler { channel.close().awaitUninterruptibly(); + if (mc.thePlayer instanceof CameraEntity) { + mc.thePlayer.setDead(); + } + if (mc.theWorld != null) { mc.theWorld.sendQuittingDisconnectingPacket(); mc.loadWorld(null); @@ -122,6 +126,8 @@ public class ReplayHandler { // These might have been hidden by the overlay, so we have to make sure they're visible again ReplayGuiRegistry.show(); + ReplayModReplay.instance.replayHandler = null; + FMLCommonHandler.instance().bus().post(new ReplayCloseEvent.Post(this)); } diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index 66fa4229..fc14e856 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -38,7 +38,7 @@ public class ReplayModReplay { private Logger logger; - private ReplayHandler replayHandler; + protected ReplayHandler replayHandler; public ReplayHandler getReplayHandler() { return replayHandler; diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index 1f9c6b56..69a5b658 100755 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -54,10 +54,17 @@ public class CameraEntity extends EntityPlayerSP { */ private Entity lastHandRendered = null; + /** + * The hashCode and equals methods of Entity are not stable. + * Therefore we cannot register any event handlers directly in the CameraEntity class and + * instead have this inner class. + */ + private final EventHandler eventHandler = new EventHandler(); + public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) { super(mcIn, worldIn, netHandlerPlayClient, statFileWriter); - FMLCommonHandler.instance().bus().register(this); - MinecraftForge.EVENT_BUS.register(this); + FMLCommonHandler.instance().bus().register(eventHandler); + MinecraftForge.EVENT_BUS.register(eventHandler); cameraController = ReplayModReplay.instance.createCameraController(this); } @@ -260,23 +267,8 @@ public class CameraEntity extends EntityPlayerSP { @Override public void setDead() { super.setDead(); - FMLCommonHandler.instance().bus().unregister(this); - MinecraftForge.EVENT_BUS.unregister(this); - } - - @SubscribeEvent - public void onPreClientTick(TickEvent.ClientTickEvent event) { - if (event.phase == TickEvent.Phase.START) { - update(); - updateArmYawAndPitch(); - } - } - - @SubscribeEvent - public void onRenderUpdate(TickEvent.RenderTickEvent event) { - if (event.phase == TickEvent.Phase.START) { - update(); - } + FMLCommonHandler.instance().bus().unregister(eventHandler); + MinecraftForge.EVENT_BUS.unregister(eventHandler); } private void update() { @@ -301,58 +293,75 @@ public class CameraEntity extends EntityPlayerSP { renderArmYaw = renderArmYaw + (rotationYaw - renderArmYaw) * 0.5f; } - @SubscribeEvent - public void preCrosshairRender(RenderGameOverlayEvent.Pre event) { - // The crosshair should only render if targeted entity can actually be spectated - if (event.type == RenderGameOverlayEvent.ElementType.CROSSHAIRS) { - event.setCanceled(!canSpectate(mc.pointedEntity)); - } - } - public boolean canSpectate(Entity e) { return e != null && !e.isInvisible() && (e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame); } - @SubscribeEvent - public void onSettingsChanged(SettingsChangedEvent event) { - if (event.getKey() == Setting.CAMERA) { - cameraController = ReplayModReplay.instance.createCameraController(this); + private class EventHandler { + @SubscribeEvent + public void onPreClientTick(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + update(); + updateArmYawAndPitch(); + } } - } - @SubscribeEvent - public void onRenderHand(RenderHandEvent event) { - // Unless we are spectating another player, don't render our hand - if (mc.getRenderViewEntity() == this || !(mc.getRenderViewEntity() instanceof EntityPlayer)) { - event.setCanceled(true); + @SubscribeEvent + public void onRenderUpdate(TickEvent.RenderTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + update(); + } } - } - @SubscribeEvent(priority = EventPriority.LOWEST) - public void onRenderHandMonitor(RenderHandEvent event) { - Entity view = mc.getRenderViewEntity(); - if (view instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) view; - // When the spectated player has changed, force equip their items to prevent the equip animation - if (lastHandRendered != player) { - lastHandRendered = player; + @SubscribeEvent + public void preCrosshairRender(RenderGameOverlayEvent.Pre event) { + // The crosshair should only render if targeted entity can actually be spectated + if (event.type == RenderGameOverlayEvent.ElementType.CROSSHAIRS) { + event.setCanceled(!canSpectate(mc.pointedEntity)); + } + } - mc.entityRenderer.itemRenderer.prevEquippedProgress = 1; - mc.entityRenderer.itemRenderer.equippedProgress = 1; - mc.entityRenderer.itemRenderer.itemToRender = player.inventory.getCurrentItem(); - mc.entityRenderer.itemRenderer.equippedItemSlot = player.inventory.currentItem; + @SubscribeEvent + public void onSettingsChanged(SettingsChangedEvent event) { + if (event.getKey() == Setting.CAMERA) { + cameraController = ReplayModReplay.instance.createCameraController(CameraEntity.this); + } + } - mc.thePlayer.renderArmYaw = mc.thePlayer.prevRenderArmYaw = player.rotationYaw; - mc.thePlayer.renderArmPitch = mc.thePlayer.prevRenderArmPitch = player.rotationPitch; + @SubscribeEvent + public void onRenderHand(RenderHandEvent event) { + // Unless we are spectating another player, don't render our hand + if (mc.getRenderViewEntity() == CameraEntity.this || !(mc.getRenderViewEntity() instanceof EntityPlayer)) { + event.setCanceled(true); + } + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onRenderHandMonitor(RenderHandEvent event) { + Entity view = mc.getRenderViewEntity(); + if (view instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) view; + // When the spectated player has changed, force equip their items to prevent the equip animation + if (lastHandRendered != player) { + lastHandRendered = player; + + mc.entityRenderer.itemRenderer.prevEquippedProgress = 1; + mc.entityRenderer.itemRenderer.equippedProgress = 1; + mc.entityRenderer.itemRenderer.itemToRender = player.inventory.getCurrentItem(); + mc.entityRenderer.itemRenderer.equippedItemSlot = player.inventory.currentItem; + + mc.thePlayer.renderArmYaw = mc.thePlayer.prevRenderArmYaw = player.rotationYaw; + mc.thePlayer.renderArmPitch = mc.thePlayer.prevRenderArmPitch = player.rotationPitch; + } + } + } + + @SubscribeEvent + public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) { + if (mc.getRenderViewEntity() == CameraEntity.this) { + event.roll = roll; } } } - - @SubscribeEvent - public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) { - if (mc.getRenderViewEntity() == this) { - event.roll = roll; - } - } }