Fix replay not being closed properly
This commit is contained in:
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user