Fix replay not being closed properly

This commit is contained in:
johni0702
2016-08-14 15:40:12 +02:00
parent 00c2404345
commit e8df61aeb2
3 changed files with 75 additions and 60 deletions

View File

@@ -111,6 +111,10 @@ public class ReplayHandler {
channel.close().awaitUninterruptibly(); channel.close().awaitUninterruptibly();
if (mc.thePlayer instanceof CameraEntity) {
mc.thePlayer.setDead();
}
if (mc.theWorld != null) { if (mc.theWorld != null) {
mc.theWorld.sendQuittingDisconnectingPacket(); mc.theWorld.sendQuittingDisconnectingPacket();
mc.loadWorld(null); 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 // These might have been hidden by the overlay, so we have to make sure they're visible again
ReplayGuiRegistry.show(); ReplayGuiRegistry.show();
ReplayModReplay.instance.replayHandler = null;
FMLCommonHandler.instance().bus().post(new ReplayCloseEvent.Post(this)); FMLCommonHandler.instance().bus().post(new ReplayCloseEvent.Post(this));
} }

View File

@@ -38,7 +38,7 @@ public class ReplayModReplay {
private Logger logger; private Logger logger;
private ReplayHandler replayHandler; protected ReplayHandler replayHandler;
public ReplayHandler getReplayHandler() { public ReplayHandler getReplayHandler() {
return replayHandler; return replayHandler;

View File

@@ -54,10 +54,17 @@ public class CameraEntity extends EntityPlayerSP {
*/ */
private Entity lastHandRendered = null; 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) { public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) {
super(mcIn, worldIn, netHandlerPlayClient, statFileWriter); super(mcIn, worldIn, netHandlerPlayClient, statFileWriter);
FMLCommonHandler.instance().bus().register(this); FMLCommonHandler.instance().bus().register(eventHandler);
MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(eventHandler);
cameraController = ReplayModReplay.instance.createCameraController(this); cameraController = ReplayModReplay.instance.createCameraController(this);
} }
@@ -260,23 +267,8 @@ public class CameraEntity extends EntityPlayerSP {
@Override @Override
public void setDead() { public void setDead() {
super.setDead(); super.setDead();
FMLCommonHandler.instance().bus().unregister(this); FMLCommonHandler.instance().bus().unregister(eventHandler);
MinecraftForge.EVENT_BUS.unregister(this); MinecraftForge.EVENT_BUS.unregister(eventHandler);
}
@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();
}
} }
private void update() { private void update() {
@@ -301,58 +293,75 @@ public class CameraEntity extends EntityPlayerSP {
renderArmYaw = renderArmYaw + (rotationYaw - renderArmYaw) * 0.5f; 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) { public boolean canSpectate(Entity e) {
return e != null && !e.isInvisible() return e != null && !e.isInvisible()
&& (e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame); && (e instanceof EntityPlayer || e instanceof EntityLiving || e instanceof EntityItemFrame);
} }
@SubscribeEvent private class EventHandler {
public void onSettingsChanged(SettingsChangedEvent event) { @SubscribeEvent
if (event.getKey() == Setting.CAMERA) { public void onPreClientTick(TickEvent.ClientTickEvent event) {
cameraController = ReplayModReplay.instance.createCameraController(this); if (event.phase == TickEvent.Phase.START) {
update();
updateArmYawAndPitch();
}
} }
}
@SubscribeEvent @SubscribeEvent
public void onRenderHand(RenderHandEvent event) { public void onRenderUpdate(TickEvent.RenderTickEvent event) {
// Unless we are spectating another player, don't render our hand if (event.phase == TickEvent.Phase.START) {
if (mc.getRenderViewEntity() == this || !(mc.getRenderViewEntity() instanceof EntityPlayer)) { update();
event.setCanceled(true); }
} }
}
@SubscribeEvent(priority = EventPriority.LOWEST) @SubscribeEvent
public void onRenderHandMonitor(RenderHandEvent event) { public void preCrosshairRender(RenderGameOverlayEvent.Pre event) {
Entity view = mc.getRenderViewEntity(); // The crosshair should only render if targeted entity can actually be spectated
if (view instanceof EntityPlayer) { if (event.type == RenderGameOverlayEvent.ElementType.CROSSHAIRS) {
EntityPlayer player = (EntityPlayer) view; event.setCanceled(!canSpectate(mc.pointedEntity));
// 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; @SubscribeEvent
mc.entityRenderer.itemRenderer.equippedProgress = 1; public void onSettingsChanged(SettingsChangedEvent event) {
mc.entityRenderer.itemRenderer.itemToRender = player.inventory.getCurrentItem(); if (event.getKey() == Setting.CAMERA) {
mc.entityRenderer.itemRenderer.equippedItemSlot = player.inventory.currentItem; cameraController = ReplayModReplay.instance.createCameraController(CameraEntity.this);
}
}
mc.thePlayer.renderArmYaw = mc.thePlayer.prevRenderArmYaw = player.rotationYaw; @SubscribeEvent
mc.thePlayer.renderArmPitch = mc.thePlayer.prevRenderArmPitch = player.rotationPitch; 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;
}
}
} }