diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java index b4b9bc4c..9178d2fc 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java @@ -14,12 +14,14 @@ import net.minecraft.client.gui.GuiOptions; import net.minecraft.client.gui.GuiVideoSettings; import net.minecraft.client.gui.inventory.GuiInventory; import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.resources.I18n; import net.minecraft.client.settings.GameSettings.Options; import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; import net.minecraftforge.client.event.GuiScreenEvent.DrawScreenEvent; import net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent; +import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.Event.Result; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import eu.crushedpixel.replaymod.ReplayMod; @@ -114,6 +116,7 @@ public class GuiEventHandler { if(b.id == 1) { b.displayString = "Exit Replay"; b.yPosition -= 24*2; + b.id = GuiConstants.EXIT_REPLAY_BUTTON; } else if(b.id >= 5 && b.id <= 7) { event.buttonList.remove(b); } else if(b.id != 4) { @@ -161,21 +164,19 @@ public class GuiEventHandler { mc.displayGuiScreen(new GuiReplaySettings(event.gui)); } - if(ReplayHandler.replayActive() && event.gui instanceof GuiIngameMenu && event.button.id == 1) { + if(ReplayHandler.replayActive() && event.gui instanceof GuiIngameMenu && event.button.id == GuiConstants.EXIT_REPLAY_BUTTON) { + ReplayHandler.endReplay(); + event.button.enabled = false; mc.gameSettings.setOptionFloatValue(Options.GAMMA, ReplayHandler.getInitialGamma()); ReplayHandler.lastExit = System.currentTimeMillis(); - /* This is already being executed by the default Exit action handling (vanilla code) mc.theWorld.sendQuittingDisconnectingPacket(); mc.loadWorld((WorldClient)null); mc.displayGuiScreen(new GuiMainMenu()); - */ - ReplayHandler.endReplay(); - ReplayGuiRegistry.show(); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java index 7bd6f75c..ec584c20 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java @@ -135,7 +135,7 @@ public class GuiReplayOverlay extends Gui { if(mc != null && mc.thePlayer != null) MinecraftTicker.runMouseKeyboardTick(mc); } - if(mc.getRenderViewEntity() == mc.thePlayer || !mc.getRenderViewEntity().isEntityAlive() + if((mc.getRenderViewEntity() == mc.thePlayer || !mc.getRenderViewEntity().isEntityAlive()) && ReplayHandler.getCameraEntity() != null) { ReplayHandler.spectateCamera(); ReplayHandler.getCameraEntity().movePath(new Position(lastX, lastY, lastZ, lastPitch, lastYaw)); diff --git a/src/main/java/eu/crushedpixel/replaymod/events/RecordingHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/RecordingHandler.java index ce68d44c..3d5892ba 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/RecordingHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/RecordingHandler.java @@ -3,13 +3,12 @@ package eu.crushedpixel.replaymod.events; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.io.IOException; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayer.EnumStatus; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.network.Packet; @@ -21,18 +20,17 @@ import net.minecraft.network.play.server.S0CPacketSpawnPlayer; import net.minecraft.network.play.server.S0DPacketCollectItem; import net.minecraft.network.play.server.S12PacketEntityVelocity; import net.minecraft.network.play.server.S13PacketDestroyEntities; -import net.minecraft.network.play.server.S1BPacketEntityAttach; import net.minecraft.network.play.server.S14PacketEntity.S17PacketEntityLookMove; import net.minecraft.network.play.server.S18PacketEntityTeleport; import net.minecraft.network.play.server.S19PacketEntityHeadLook; import net.minecraft.network.play.server.S19PacketEntityStatus; +import net.minecraft.network.play.server.S1BPacketEntityAttach; import net.minecraft.network.play.server.S38PacketPlayerListItem; import net.minecraft.network.play.server.S38PacketPlayerListItem.Action; import net.minecraft.util.MathHelper; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.minecart.MinecartEvent; import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; import net.minecraftforge.event.entity.player.PlayerUseItemEvent; @@ -41,6 +39,7 @@ import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; +import eu.crushedpixel.replaymod.reflection.MCPNames; public class RecordingHandler { @@ -81,6 +80,17 @@ public class RecordingHandler { } } + private static Field dataWatcherField; + + static { + try { + dataWatcherField = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_148960_i")); + dataWatcherField.setAccessible(true); + } catch(Exception e) { + e.printStackTrace(); + } + } + private S0CPacketSpawnPlayer spawnPlayer(EntityPlayer player) { try { S0CPacketSpawnPlayer packet = new S0CPacketSpawnPlayer(); @@ -98,11 +108,14 @@ public class RecordingHandler { pb.writeByte((byte)((int)(player.rotationPitch * 256.0F / 360.0F))); ItemStack itemstack = player.inventory.getCurrentItem(); - pb.writeInt(itemstack == null ? 0 : Item.getIdFromItem(itemstack.getItem())); + pb.writeShort(itemstack == null ? 0 : Item.getIdFromItem(itemstack.getItem())); + player.getDataWatcher().writeTo(pb); packet.readPacketData(pb); - + + dataWatcherField.set(packet, player.getDataWatcher()); + return packet; } catch(Exception e) { e.printStackTrace(); diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiConstants.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiConstants.java index 5286fa6d..00df970e 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiConstants.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiConstants.java @@ -19,6 +19,8 @@ public class GuiConstants { public static final int UPLOAD_TAG_INPUT = 3007; public static final int UPLOAD_TAG_PLACEHOLDER = 3008; + public static final int EXIT_REPLAY_BUTTON = 4001; + public static final int REPLAY_OPTIONS_BUTTON_ID = 8000; public static final int REPLAY_MANAGER_BUTTON_ID = 9001; diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java b/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java index d12954c1..5df66209 100644 --- a/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java @@ -106,26 +106,7 @@ public class PacketListener extends DataListener { //Converts the packet back to a ByteBuffer for correct saving ByteBuf bb = Unpooled.buffer(); - if(packet instanceof S0FPacketSpawnMob) { - Field field_149043_l = S0FPacketSpawnMob.class.getDeclaredField(MCPNames.field("field_149043_l")); - field_149043_l.setAccessible(true); - DataWatcher l = (DataWatcher)field_149043_l.get(packet); - DataWatcher dw = new DataWatcher(null); - if(l == null) { - field_149043_l.set(packet, dw); - } - } - - if(packet instanceof S0CPacketSpawnPlayer) { - Field field_149043_l = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_148960_i")); - field_149043_l.setAccessible(true); - DataWatcher l = (DataWatcher)field_149043_l.get(packet); - DataWatcher dw = new DataWatcher(null); - if(l == null) { - field_149043_l.set(packet, dw); - } - } - + packetSerializer.encode(ctx, packet, bb); bb.readerIndex(0); diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index f1f5784a..5727c7d1 100644 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -362,6 +362,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { private static Field playerUUIDField; private static Field gameProfileField; + + //private static Field dataWatcherField; static { try { @@ -370,6 +372,9 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { gameProfileField = S38PacketPlayerListItem.AddPlayerData.class.getDeclaredField("field_179964_d"); gameProfileField.setAccessible(true); + + //dataWatcherField = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_148960_i")); + //dataWatcherField.setAccessible(true); } catch(Exception e) { e.printStackTrace(); } @@ -472,6 +477,13 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { p = sp; } */ + + /* + if(p instanceof S0CPacketSpawnPlayer) { + System.out.println(dataWatcherField.get(p)); + System.out.println(((S0CPacketSpawnPlayer) p).func_148944_c()); + } + */ if(p instanceof S07PacketRespawn) { allowMovement = true;