diff --git a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java index 13fbfabc..9cd049ec 100644 --- a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java +++ b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java @@ -28,7 +28,7 @@ public class ReplayMod //Known Bugs // //Keyframe removal doesn't seem to properly work - // + //Rain isn't working // // // diff --git a/src/main/java/eu/crushedpixel/replaymod/entities/CameraEntity.java b/src/main/java/eu/crushedpixel/replaymod/entities/CameraEntity.java index 511e49b1..d1b9511b 100644 --- a/src/main/java/eu/crushedpixel/replaymod/entities/CameraEntity.java +++ b/src/main/java/eu/crushedpixel/replaymod/entities/CameraEntity.java @@ -39,13 +39,13 @@ public class CameraEntity extends Entity { mc.thePlayer.rotationYaw = ReplayHandler.getCameraEntity().rotationYaw; //removes water/suffocation/shadow overlays in screen - //mc.thePlayer.posX = 0; - //mc.thePlayer.posY = 500; - //mc.thePlayer.posZ = 0; + mc.thePlayer.posX = 0; + mc.thePlayer.posY = 500; + mc.thePlayer.posZ = 0; - mc.thePlayer.posX = ReplayHandler.getCameraEntity().posX; - mc.thePlayer.posY = ReplayHandler.getCameraEntity().posY; - mc.thePlayer.posZ = ReplayHandler.getCameraEntity().posZ; + //mc.thePlayer.posX = ReplayHandler.getCameraEntity().posX; + //mc.thePlayer.posY = ReplayHandler.getCameraEntity().posY; + //mc.thePlayer.posZ = ReplayHandler.getCameraEntity().posZ; } if(direction == null || motion < 0.1) { diff --git a/src/main/java/eu/crushedpixel/replaymod/events/RecordingHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/RecordingHandler.java index 601a71aa..b26c221a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/RecordingHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/RecordingHandler.java @@ -4,22 +4,41 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.io.IOException; -import java.util.UUID; +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; import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.S04PacketEntityEquipment; +import net.minecraft.network.play.server.S0APacketUseBed; +import net.minecraft.network.play.server.S0BPacketAnimation; 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.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; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +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; @@ -27,108 +46,390 @@ public class RecordingHandler { private Minecraft mc = Minecraft.getMinecraft(); - private int entityID = Integer.MIN_VALUE+9001; + public static final int entityID = Integer.MIN_VALUE+9001; @SubscribeEvent - public void onPlayerJoin(EntityJoinWorldEvent e) throws IOException { - if(e.entity != mc.thePlayer) return; - if(!ConnectionEventHandler.isRecording()) return; + public void onPlayerJoin(EntityJoinWorldEvent e) { + try { + if(e.entity != mc.thePlayer) return; + if(!ConnectionEventHandler.isRecording()) return; - EntityPlayer player = (EntityPlayer)e.entity; + EntityPlayer player = (EntityPlayer)e.entity; - S38PacketPlayerListItem ppli = new S38PacketPlayerListItem(); - ByteBuf buf = Unpooled.buffer(); - PacketBuffer pbuf = new PacketBuffer(buf); + S38PacketPlayerListItem ppli = new S38PacketPlayerListItem(); + ByteBuf buf = Unpooled.buffer(); + PacketBuffer pbuf = new PacketBuffer(buf); - pbuf.writeEnumValue(Action.ADD_PLAYER); - pbuf.writeVarIntToBuffer(1); - pbuf.writeUuid(e.entity.getUniqueID()); + pbuf.writeEnumValue(Action.ADD_PLAYER); + pbuf.writeVarIntToBuffer(1); + pbuf.writeUuid(e.entity.getUniqueID()); - pbuf.writeString(player.getName()); - pbuf.writeVarIntToBuffer(0); - pbuf.writeVarIntToBuffer(mc.playerController.getCurrentGameType().getID()); - pbuf.writeVarIntToBuffer(0); + pbuf.writeString(player.getName()); + pbuf.writeVarIntToBuffer(0); + pbuf.writeVarIntToBuffer(mc.playerController.getCurrentGameType().getID()); + pbuf.writeVarIntToBuffer(0); - pbuf.writeBoolean(true); - pbuf.writeChatComponent(player.getDisplayName()); + pbuf.writeBoolean(true); + pbuf.writeChatComponent(player.getDisplayName()); - ppli.readPacketData(pbuf); - ConnectionEventHandler.insertPacket(ppli); + ppli.readPacketData(pbuf); + ConnectionEventHandler.insertPacket(ppli); - S0CPacketSpawnPlayer packet = new S0CPacketSpawnPlayer(); + ConnectionEventHandler.insertPacket(spawnPlayer(mc.thePlayer)); + } catch(Exception e1) { + e1.printStackTrace(); + } + } - ByteBuf bb = Unpooled.buffer(); - PacketBuffer pb = new PacketBuffer(bb); + private S0CPacketSpawnPlayer spawnPlayer(EntityPlayer player) { + try { + S0CPacketSpawnPlayer packet = new S0CPacketSpawnPlayer(); - pb.writeVarIntToBuffer(entityID); - pb.writeUuid(e.entity.getUniqueID()); + ByteBuf bb = Unpooled.buffer(); + PacketBuffer pb = new PacketBuffer(bb); - pb.writeInt(MathHelper.floor_double(e.entity.posX * 32.0D)); - pb.writeInt(MathHelper.floor_double(e.entity.posY * 32.0D)); - pb.writeInt(MathHelper.floor_double(e.entity.posZ * 32.0D)); - pb.writeByte((byte)((int)(((EntityPlayer)e.entity).rotationYaw * 256.0F / 360.0F))); - pb.writeByte((byte)((int)(((EntityPlayer)e.entity).rotationPitch * 256.0F / 360.0F))); + pb.writeVarIntToBuffer(entityID); + pb.writeUuid(player.getUUID(player.getGameProfile())); - ItemStack itemstack = ((EntityPlayer)e.entity).inventory.getCurrentItem(); - pb.writeInt(itemstack == null ? 0 : Item.getIdFromItem(itemstack.getItem())); - ((EntityPlayer)e.entity).getDataWatcher().writeTo(pb); + pb.writeInt(MathHelper.floor_double(player.posX * 32.0D)); + pb.writeInt(MathHelper.floor_double(player.posY * 32.0D)); + pb.writeInt(MathHelper.floor_double(player.posZ * 32.0D)); + pb.writeByte((byte)((int)(player.rotationYaw * 256.0F / 360.0F))); + pb.writeByte((byte)((int)(player.rotationPitch * 256.0F / 360.0F))); - packet.readPacketData(pb); + ItemStack itemstack = player.inventory.getCurrentItem(); + pb.writeInt(itemstack == null ? 0 : Item.getIdFromItem(itemstack.getItem())); + player.getDataWatcher().writeTo(pb); - ConnectionEventHandler.insertPacket(packet); + packet.readPacketData(pb); + + return packet; + } catch(Exception e) { + e.printStackTrace(); + return null; + } } private Double lastX = null, lastY = null, lastZ = null; - - public void resetLastPositions() { + private List lastEffects = new ArrayList(); + + private ItemStack[] playerItems = new ItemStack[5]; + + public void resetVars() { lastX = lastY = lastZ = null; + lastEffects = new ArrayList(); + playerItems = new ItemStack[5]; } - + @SubscribeEvent public void onPlayerTick(PlayerTickEvent e) { - if(e.player != mc.thePlayer) return; - if(!ConnectionEventHandler.isRecording()) return; + try { + if(e.player != mc.thePlayer) return; + if(!ConnectionEventHandler.isRecording()) return; + + boolean force = false; + if(lastX == null || lastY == null || lastZ == null) { + force = true; + lastX = e.player.posX; + lastY = e.player.posY; + lastZ = e.player.posZ; + } + + double dx = e.player.posX - lastX; + double dy = e.player.posY - lastY; + double dz = e.player.posZ - lastZ; - boolean force = false; - if(lastX == null || lastY == null || lastZ == null) { - force = true; lastX = e.player.posX; lastY = e.player.posY; lastZ = e.player.posZ; - } - - double dx = e.player.posX - lastX; - double dy = e.player.posY - lastY; - double dz = e.player.posZ - lastZ; - - lastX = e.player.posX; - lastY = e.player.posY; - lastZ = e.player.posZ; - Packet packet = null; - if(force || Math.abs(dx) > 4.0 || Math.abs(dy) > 4.0 || Math.abs(dz) > 4.0) { - int x = MathHelper.floor_double(e.player.posX * 32.0D); - int y = MathHelper.floor_double(e.player.posY * 32.0D); - int z = MathHelper.floor_double(e.player.posZ * 32.0D); - byte yaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F)); - byte pitch = (byte)((int)(e.player.rotationPitch * 256.0F / 360.0F)); - packet = new S18PacketEntityTeleport(entityID, x, y, z, yaw, pitch, e.player.onGround); + Packet packet = null; + if(force || Math.abs(dx) > 4.0 || Math.abs(dy) > 4.0 || Math.abs(dz) > 4.0) { + int x = MathHelper.floor_double(e.player.posX * 32.0D); + int y = MathHelper.floor_double(e.player.posY * 32.0D); + int z = MathHelper.floor_double(e.player.posZ * 32.0D); + byte yaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F)); + byte pitch = (byte)((int)(e.player.rotationPitch * 256.0F / 360.0F)); + packet = new S18PacketEntityTeleport(entityID, x, y, z, yaw, pitch, e.player.onGround); - } else { - byte oldYaw = (byte)((int)(e.player.prevRotationYaw * 256.0F / 360.0F)); - byte newYaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F)); - byte oldPitch = (byte)((int)(e.player.prevRotationPitch * 256.0F / 360.0F)); - byte newPitch = (byte)((int)(e.player.rotationPitch * 256.0F / 360.0F)); + } else { + byte oldYaw = (byte)((int)(e.player.prevRotationYaw * 256.0F / 360.0F)); + byte newYaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F)); + byte oldPitch = (byte)((int)(e.player.prevRotationPitch * 256.0F / 360.0F)); + byte newPitch = (byte)((int)(e.player.rotationPitch * 256.0F / 360.0F)); - byte dPitch = (byte)(newPitch-oldPitch); - byte dYaw = (byte)(newYaw-oldYaw); + byte dPitch = (byte)(newPitch-oldPitch); + byte dYaw = (byte)(newYaw-oldYaw); + + packet = new S17PacketEntityLookMove(entityID, + (byte)Math.round(dx*32), (byte)Math.round(dy*32), (byte)Math.round(dz*32), + newYaw, newPitch, e.player.onGround); + } - packet = new S17PacketEntityLookMove(entityID, - (byte)Math.round(dx*32), (byte)Math.round(dy*32), (byte)Math.round(dz*32), - dYaw, dPitch, e.player.onGround); - } - if(packet != null) { ConnectionEventHandler.insertPacket(packet); + + //HEAD POS + S19PacketEntityHeadLook head = new S19PacketEntityHeadLook(); + ByteBuf bb1 = Unpooled.buffer(); + PacketBuffer pb1 = new PacketBuffer(bb1); + + pb1.writeVarIntToBuffer(entityID); + pb1.writeByte(((int)(e.player.rotationYawHead * 256.0F / 360.0F))); + + head.readPacketData(pb1); + + ConnectionEventHandler.insertPacket(head); + + S12PacketEntityVelocity vel = new S12PacketEntityVelocity(entityID, e.player.motionX, e.player.motionY, e.player.motionZ); + ConnectionEventHandler.insertPacket(vel); + + //Animation Packets + //Swing Animation + if(e.player.swingProgressInt == 1) { + S0BPacketAnimation pac = new S0BPacketAnimation(); + + ByteBuf bb = Unpooled.buffer(); + PacketBuffer pb = new PacketBuffer(bb); + + pb.writeVarIntToBuffer(entityID); + pb.writeByte(0); + + pac.readPacketData(pb); + + ConnectionEventHandler.insertPacket(pac); + } + + /* + //Potion Effect Handling + List found = new ArrayList(); + for(PotionEffect pe : (Collection)e.player.getActivePotionEffects()) { + found.add(pe.getPotionID()); + if(lastEffects.contains(found)) continue; + S1DPacketEntityEffect pee = new S1DPacketEntityEffect(entityID, pe); + ConnectionEventHandler.insertPacket(pee); + } + + for(int id : lastEffects) { + if(!found.contains(id)) { + S1EPacketRemoveEntityEffect pre = new S1EPacketRemoveEntityEffect(entityID, new PotionEffect(id, 0)); + ConnectionEventHandler.insertPacket(pre); + } + } + + lastEffects = found; + */ + + //Inventory Handling + if(playerItems[0] != mc.thePlayer.getHeldItem()) { + playerItems[0] = mc.thePlayer.getHeldItem(); + S04PacketEntityEquipment pee = new S04PacketEntityEquipment(entityID, 0, playerItems[0]); + ConnectionEventHandler.insertPacket(pee); + } + + if(playerItems[1] != mc.thePlayer.inventory.armorInventory[0]) { + playerItems[1] = mc.thePlayer.inventory.armorInventory[0]; + S04PacketEntityEquipment pee = new S04PacketEntityEquipment(entityID, 1, playerItems[1]); + ConnectionEventHandler.insertPacket(pee); + } + + if(playerItems[2] != mc.thePlayer.inventory.armorInventory[1]) { + playerItems[2] = mc.thePlayer.inventory.armorInventory[1]; + S04PacketEntityEquipment pee = new S04PacketEntityEquipment(entityID, 2, playerItems[2]); + ConnectionEventHandler.insertPacket(pee); + } + + if(playerItems[3] != mc.thePlayer.inventory.armorInventory[2]) { + playerItems[3] = mc.thePlayer.inventory.armorInventory[2]; + S04PacketEntityEquipment pee = new S04PacketEntityEquipment(entityID, 3, playerItems[3]); + ConnectionEventHandler.insertPacket(pee); + } + + if(playerItems[4] != mc.thePlayer.inventory.armorInventory[3]) { + playerItems[4] = mc.thePlayer.inventory.armorInventory[3]; + S04PacketEntityEquipment pee = new S04PacketEntityEquipment(entityID, 4, playerItems[4]); + ConnectionEventHandler.insertPacket(pee); + } + + //Leaving Ride + + if((!mc.thePlayer.isRiding() && lastRiding != -1) || + (mc.thePlayer.isRiding() && lastRiding != mc.thePlayer.ridingEntity.getEntityId())) { + if(!mc.thePlayer.isRiding()) { + lastRiding = -1; + } else { + lastRiding = mc.thePlayer.ridingEntity.getEntityId(); + } + + S1BPacketEntityAttach pea = new S1BPacketEntityAttach(); + + ByteBuf buf = Unpooled.buffer(); + PacketBuffer pbuf = new PacketBuffer(buf); + + pbuf.writeInt(entityID); + pbuf.writeInt(lastRiding); + pbuf.writeBoolean(false); + + pea.readPacketData(pbuf); + + ConnectionEventHandler.insertPacket(pea); + } + + } catch(Exception e1) { + e1.printStackTrace(); + } + } + + @SubscribeEvent + public void onPickupItem(ItemPickupEvent event) { + try { + ConnectionEventHandler.insertPacket(new S0DPacketCollectItem(event.pickedUp.getEntityId(), entityID)); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @SubscribeEvent + public void onRespawn(PlayerRespawnEvent event) { + try { + //destroy entity, then respawn + ConnectionEventHandler.insertPacket(new S13PacketDestroyEntities(entityID)); + ConnectionEventHandler.insertPacket(spawnPlayer(mc.thePlayer)); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @SubscribeEvent + public void onHurt(LivingHurtEvent event) { + try { + if(event.entity.getEntityId() != mc.thePlayer.getEntityId()) { + return; + }; + + S19PacketEntityStatus packet = new S19PacketEntityStatus(); + + ByteBuf buf = Unpooled.buffer(); + PacketBuffer pbuf = new PacketBuffer(buf); + + pbuf.writeInt(entityID); + pbuf.writeByte(2); + + packet.readPacketData(pbuf); + + ConnectionEventHandler.insertPacket(packet); + + //Damage Animation + S0BPacketAnimation pac = new S0BPacketAnimation(); + + ByteBuf bb = Unpooled.buffer(); + PacketBuffer pb = new PacketBuffer(bb); + + pb.writeVarIntToBuffer(entityID); + pb.writeByte(1); + + pac.readPacketData(pb); + + ConnectionEventHandler.insertPacket(pac); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @SubscribeEvent + public void onDeath(LivingDeathEvent event) { + try { + if(event.entity.getEntityId() != mc.thePlayer.getEntityId()) { + return; + }; + + S19PacketEntityStatus packet = new S19PacketEntityStatus(); + + ByteBuf buf = Unpooled.buffer(); + PacketBuffer pbuf = new PacketBuffer(buf); + + pbuf.writeInt(entityID); + pbuf.writeByte(3); + + packet.readPacketData(pbuf); + + ConnectionEventHandler.insertPacket(packet); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @SubscribeEvent + public void onStartEating(PlayerUseItemEvent.Start event) { + try { + if(!event.entityPlayer.isEating()) return; + S0BPacketAnimation packet = new S0BPacketAnimation(); + + ByteBuf bb = Unpooled.buffer(); + PacketBuffer pb = new PacketBuffer(bb); + + pb.writeVarIntToBuffer(entityID); + pb.writeByte(3); + + packet.readPacketData(pb); + + ConnectionEventHandler.insertPacket(packet); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @SubscribeEvent + public void onSleep(PlayerSleepInBedEvent event) { + try { + if(event.entity.getEntityId() != mc.thePlayer.getEntityId()) { + return; + }; + + if(event.result == EnumStatus.OK) { + S0APacketUseBed pub = new S0APacketUseBed(); + + ByteBuf buf = Unpooled.buffer(); + PacketBuffer pbuf = new PacketBuffer(buf); + + pbuf.writeVarIntToBuffer(entityID); + pbuf.writeBlockPos(event.pos); + + pub.readPacketData(pbuf); + + ConnectionEventHandler.insertPacket(pub); + + System.out.println("SLEEP PACKET SENT"); + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + private int lastRiding = -1; + + @SubscribeEvent + public void enterMinecart(MinecartInteractEvent event) { + try { + if(event.player != mc.thePlayer) { + return; + }; + + S1BPacketEntityAttach pea = new S1BPacketEntityAttach(); + + ByteBuf buf = Unpooled.buffer(); + PacketBuffer pbuf = new PacketBuffer(buf); + + pbuf.writeInt(entityID); + pbuf.writeInt(event.minecart.getEntityId()); + pbuf.writeBoolean(false); + + pea.readPacketData(pbuf); + + ConnectionEventHandler.insertPacket(pea); + + lastRiding = event.minecart.getEntityId(); + } catch(Exception e) { + e.printStackTrace(); } } } diff --git a/src/main/java/eu/crushedpixel/replaymod/events/ReplayTickHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/ReplayTickHandler.java index eb2b91d4..4f3ee56a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/ReplayTickHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/ReplayTickHandler.java @@ -30,7 +30,6 @@ public class ReplayTickHandler { } } - @SubscribeEvent public void onFovChange(FOVUpdateEvent event) { if(ReplayHandler.replayActive()) { diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java b/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java index e6137d10..82480086 100644 --- a/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java @@ -62,7 +62,7 @@ public class ConnectionEventHandler { ChatMessageRequests.initialize(); - ReplayMod.recordingHandler.resetLastPositions(); + ReplayMod.recordingHandler.resetVars(); try { if(event.isLocal) { diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java b/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java index b1f88fd3..854015b9 100644 --- a/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java @@ -9,10 +9,12 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Field; +import net.minecraft.client.Minecraft; import net.minecraft.entity.DataWatcher; import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S0CPacketSpawnPlayer; +import net.minecraft.network.play.server.S0DPacketCollectItem; import net.minecraft.network.play.server.S0FPacketSpawnMob; import eu.crushedpixel.replaymod.chat.ChatMessageRequests; import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType; @@ -24,11 +26,13 @@ public class PacketListener extends DataListener { public PacketListener(File file, String name, String worldName, long startTime, int maxSize, boolean singleplayer) throws FileNotFoundException { super(file, name, worldName, startTime, maxSize, singleplayer); } - + + private static final Minecraft mc = Minecraft.getMinecraft(); + private ChannelHandlerContext context = null; private static final PacketSerializer packetSerializer = new PacketSerializer(EnumPacketDirection.CLIENTBOUND); - + public void saveOnly(Packet packet) { try { PacketData pd = getPacketData(context, packet); @@ -38,8 +42,8 @@ public class PacketListener extends DataListener { e.printStackTrace(); } } - - + + @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if(ctx == null) { @@ -58,6 +62,14 @@ public class PacketListener extends DataListener { try { Packet packet = (Packet)msg; + if(packet instanceof S0DPacketCollectItem) { + if(mc.thePlayer != null || + ((S0DPacketCollectItem) packet).func_149353_d() == mc.thePlayer.getEntityId()) { + super.channelRead(ctx, msg); + return; + } + } + PacketData pd = getPacketData(ctx, packet); dataWriter.writeData(pd); lastSentPacket = pd.getTimestamp(); @@ -69,11 +81,11 @@ public class PacketListener extends DataListener { super.channelRead(ctx, msg); } - + private PacketData getPacketData(ChannelHandlerContext ctx, Packet packet) throws IOException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { - + if(startTime == null) startTime = System.currentTimeMillis(); - + int timestamp = (int)(System.currentTimeMillis() - startTime); //Converts the packet back to a ByteBuffer for correct saving @@ -98,7 +110,7 @@ public class PacketListener extends DataListener { field_149043_l.set(packet, dw); } } - + packetSerializer.encode(ctx, packet, bb); bb.readerIndex(0); @@ -113,7 +125,7 @@ public class PacketListener extends DataListener { } bb.readerIndex(0); - + return new PacketData(array, timestamp); } diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index fb55d716..e82fabaf 100644 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -29,6 +29,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.network.play.server.S01PacketJoinGame; import net.minecraft.network.play.server.S02PacketChat; import net.minecraft.network.play.server.S06PacketUpdateHealth; +import net.minecraft.network.play.server.S07PacketRespawn; import net.minecraft.network.play.server.S08PacketPlayerPosLook; import net.minecraft.network.play.server.S0BPacketAnimation; import net.minecraft.network.play.server.S18PacketEntityTeleport; @@ -61,6 +62,7 @@ import org.apache.commons.io.FilenameUtils; import com.google.gson.Gson; import eu.crushedpixel.replaymod.entities.CameraEntity; +import eu.crushedpixel.replaymod.events.RecordingHandler; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; import eu.crushedpixel.replaymod.recording.ReplayMetaData; import eu.crushedpixel.replaymod.reflection.MCPNames; @@ -109,6 +111,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { private int replayLength = 0; + private int actualID = -1; + private EffectRenderer old = mc.effectRenderer; private ZipArchiveEntry replayEntry; @@ -304,9 +308,9 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if(hurryToTimestamp && currentTimeStamp >= desiredTimeStamp && !startFromBeginning) { hurryToTimestamp = false; if(!ReplayHandler.isReplaying() || hasRestarted) { - ((Timer)mcTimer.get(mc)).elapsedPartialTicks = 5; - ((Timer)mcTimer.get(mc)).elapsedTicks = 5; - ((Timer)mcTimer.get(mc)).renderPartialTicks = 5; + ((Timer)mcTimer.get(mc)).elapsedPartialTicks += 5; + ((Timer)mcTimer.get(mc)).elapsedTicks += 5; + ((Timer)mcTimer.get(mc)).renderPartialTicks += 5; } if(!ReplayHandler.isReplaying()) { setReplaySpeed(0); @@ -343,6 +347,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } }; + private boolean allowMovement = false; + @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { @@ -397,10 +403,17 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } */ - if(p instanceof S01PacketJoinGame) { + if(p instanceof S1CPacketEntityMetadata) { + if((Integer)metadataPacketEntityId.get(p) == actualID) { + metadataPacketEntityId.set(p, RecordingHandler.entityID); + } + } + if(p instanceof S01PacketJoinGame) { + allowMovement = true; int entId = (Integer)joinPacketEntityId.get(p); - entId = -1; + actualID = entId; + entId = Integer.MIN_VALUE+9002; int dimension = (Integer)joinPacketDimension.get(p); EnumDifficulty difficulty = (EnumDifficulty)joinPacketDifficulty.get(p); int maxPlayers = (Integer)joinPacketMaxPlayers.get(p); @@ -409,20 +422,26 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension, difficulty, maxPlayers, worldType, false); } - - if(p instanceof S18PacketEntityTeleport) { - //System.out.println(((S18PacketEntityTeleport) p).func_149449_d()); - if(mc.theWorld != null) { - for(EntityPlayer ep : (List)mc.theWorld.playerEntities) { - System.out.println(ep.posX+" "+ep.posY+" "+ep.posZ); - } - } + + + if(p instanceof S07PacketRespawn) { + allowMovement = true; } + if(p instanceof S08PacketPlayerPosLook) { final S08PacketPlayerPosLook ppl = (S08PacketPlayerPosLook)p; - //if(ReplayHandler.isReplaying()) return; + if(ReplayHandler.isReplaying() && !hurryToTimestamp) return; + + CameraEntity cent = ReplayHandler.getCameraEntity(); + + if(!allowMovement && !((Math.abs(cent.posX - ppl.func_148932_c()) > 100) || (Math.abs(cent.posZ - ppl.func_148933_e()) > 100))) { + return; + } else { + allowMovement = false; + } + Thread t = new Thread(new Runnable() { @Override