Added Recording Player to Replay (many more details)
This commit is contained in:
@@ -28,7 +28,7 @@ public class ReplayMod
|
|||||||
//Known Bugs
|
//Known Bugs
|
||||||
//
|
//
|
||||||
//Keyframe removal doesn't seem to properly work
|
//Keyframe removal doesn't seem to properly work
|
||||||
//
|
//Rain isn't working
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -39,13 +39,13 @@ public class CameraEntity extends Entity {
|
|||||||
mc.thePlayer.rotationYaw = ReplayHandler.getCameraEntity().rotationYaw;
|
mc.thePlayer.rotationYaw = ReplayHandler.getCameraEntity().rotationYaw;
|
||||||
|
|
||||||
//removes water/suffocation/shadow overlays in screen
|
//removes water/suffocation/shadow overlays in screen
|
||||||
//mc.thePlayer.posX = 0;
|
mc.thePlayer.posX = 0;
|
||||||
//mc.thePlayer.posY = 500;
|
mc.thePlayer.posY = 500;
|
||||||
//mc.thePlayer.posZ = 0;
|
mc.thePlayer.posZ = 0;
|
||||||
|
|
||||||
mc.thePlayer.posX = ReplayHandler.getCameraEntity().posX;
|
//mc.thePlayer.posX = ReplayHandler.getCameraEntity().posX;
|
||||||
mc.thePlayer.posY = ReplayHandler.getCameraEntity().posY;
|
//mc.thePlayer.posY = ReplayHandler.getCameraEntity().posY;
|
||||||
mc.thePlayer.posZ = ReplayHandler.getCameraEntity().posZ;
|
//mc.thePlayer.posZ = ReplayHandler.getCameraEntity().posZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(direction == null || motion < 0.1) {
|
if(direction == null || motion < 0.1) {
|
||||||
|
|||||||
@@ -4,22 +4,41 @@ import io.netty.buffer.ByteBuf;
|
|||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.UUID;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer.EnumStatus;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.network.Packet;
|
import net.minecraft.network.Packet;
|
||||||
import net.minecraft.network.PacketBuffer;
|
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.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.S14PacketEntity.S17PacketEntityLookMove;
|
||||||
import net.minecraft.network.play.server.S18PacketEntityTeleport;
|
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;
|
||||||
import net.minecraft.network.play.server.S38PacketPlayerListItem.Action;
|
import net.minecraft.network.play.server.S38PacketPlayerListItem.Action;
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
|
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.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 net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent;
|
||||||
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
|
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
|
||||||
|
|
||||||
@@ -27,108 +46,390 @@ public class RecordingHandler {
|
|||||||
|
|
||||||
private Minecraft mc = Minecraft.getMinecraft();
|
private Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
|
||||||
private int entityID = Integer.MIN_VALUE+9001;
|
public static final int entityID = Integer.MIN_VALUE+9001;
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onPlayerJoin(EntityJoinWorldEvent e) throws IOException {
|
public void onPlayerJoin(EntityJoinWorldEvent e) {
|
||||||
if(e.entity != mc.thePlayer) return;
|
try {
|
||||||
if(!ConnectionEventHandler.isRecording()) return;
|
if(e.entity != mc.thePlayer) return;
|
||||||
|
if(!ConnectionEventHandler.isRecording()) return;
|
||||||
|
|
||||||
EntityPlayer player = (EntityPlayer)e.entity;
|
EntityPlayer player = (EntityPlayer)e.entity;
|
||||||
|
|
||||||
S38PacketPlayerListItem ppli = new S38PacketPlayerListItem();
|
S38PacketPlayerListItem ppli = new S38PacketPlayerListItem();
|
||||||
ByteBuf buf = Unpooled.buffer();
|
ByteBuf buf = Unpooled.buffer();
|
||||||
PacketBuffer pbuf = new PacketBuffer(buf);
|
PacketBuffer pbuf = new PacketBuffer(buf);
|
||||||
|
|
||||||
pbuf.writeEnumValue(Action.ADD_PLAYER);
|
pbuf.writeEnumValue(Action.ADD_PLAYER);
|
||||||
pbuf.writeVarIntToBuffer(1);
|
pbuf.writeVarIntToBuffer(1);
|
||||||
pbuf.writeUuid(e.entity.getUniqueID());
|
pbuf.writeUuid(e.entity.getUniqueID());
|
||||||
|
|
||||||
pbuf.writeString(player.getName());
|
pbuf.writeString(player.getName());
|
||||||
pbuf.writeVarIntToBuffer(0);
|
pbuf.writeVarIntToBuffer(0);
|
||||||
pbuf.writeVarIntToBuffer(mc.playerController.getCurrentGameType().getID());
|
pbuf.writeVarIntToBuffer(mc.playerController.getCurrentGameType().getID());
|
||||||
pbuf.writeVarIntToBuffer(0);
|
pbuf.writeVarIntToBuffer(0);
|
||||||
|
|
||||||
pbuf.writeBoolean(true);
|
pbuf.writeBoolean(true);
|
||||||
pbuf.writeChatComponent(player.getDisplayName());
|
pbuf.writeChatComponent(player.getDisplayName());
|
||||||
|
|
||||||
ppli.readPacketData(pbuf);
|
ppli.readPacketData(pbuf);
|
||||||
ConnectionEventHandler.insertPacket(ppli);
|
ConnectionEventHandler.insertPacket(ppli);
|
||||||
|
|
||||||
S0CPacketSpawnPlayer packet = new S0CPacketSpawnPlayer();
|
ConnectionEventHandler.insertPacket(spawnPlayer(mc.thePlayer));
|
||||||
|
} catch(Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ByteBuf bb = Unpooled.buffer();
|
private S0CPacketSpawnPlayer spawnPlayer(EntityPlayer player) {
|
||||||
PacketBuffer pb = new PacketBuffer(bb);
|
try {
|
||||||
|
S0CPacketSpawnPlayer packet = new S0CPacketSpawnPlayer();
|
||||||
|
|
||||||
pb.writeVarIntToBuffer(entityID);
|
ByteBuf bb = Unpooled.buffer();
|
||||||
pb.writeUuid(e.entity.getUniqueID());
|
PacketBuffer pb = new PacketBuffer(bb);
|
||||||
|
|
||||||
pb.writeInt(MathHelper.floor_double(e.entity.posX * 32.0D));
|
pb.writeVarIntToBuffer(entityID);
|
||||||
pb.writeInt(MathHelper.floor_double(e.entity.posY * 32.0D));
|
pb.writeUuid(player.getUUID(player.getGameProfile()));
|
||||||
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)));
|
|
||||||
|
|
||||||
ItemStack itemstack = ((EntityPlayer)e.entity).inventory.getCurrentItem();
|
pb.writeInt(MathHelper.floor_double(player.posX * 32.0D));
|
||||||
pb.writeInt(itemstack == null ? 0 : Item.getIdFromItem(itemstack.getItem()));
|
pb.writeInt(MathHelper.floor_double(player.posY * 32.0D));
|
||||||
((EntityPlayer)e.entity).getDataWatcher().writeTo(pb);
|
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;
|
private Double lastX = null, lastY = null, lastZ = null;
|
||||||
|
private List<Integer> lastEffects = new ArrayList<Integer>();
|
||||||
public void resetLastPositions() {
|
|
||||||
|
private ItemStack[] playerItems = new ItemStack[5];
|
||||||
|
|
||||||
|
public void resetVars() {
|
||||||
lastX = lastY = lastZ = null;
|
lastX = lastY = lastZ = null;
|
||||||
|
lastEffects = new ArrayList<Integer>();
|
||||||
|
playerItems = new ItemStack[5];
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onPlayerTick(PlayerTickEvent e) {
|
public void onPlayerTick(PlayerTickEvent e) {
|
||||||
if(e.player != mc.thePlayer) return;
|
try {
|
||||||
if(!ConnectionEventHandler.isRecording()) return;
|
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;
|
lastX = e.player.posX;
|
||||||
lastY = e.player.posY;
|
lastY = e.player.posY;
|
||||||
lastZ = e.player.posZ;
|
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;
|
Packet packet = null;
|
||||||
if(force || Math.abs(dx) > 4.0 || Math.abs(dy) > 4.0 || Math.abs(dz) > 4.0) {
|
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 x = MathHelper.floor_double(e.player.posX * 32.0D);
|
||||||
int y = MathHelper.floor_double(e.player.posY * 32.0D);
|
int y = MathHelper.floor_double(e.player.posY * 32.0D);
|
||||||
int z = MathHelper.floor_double(e.player.posZ * 32.0D);
|
int z = MathHelper.floor_double(e.player.posZ * 32.0D);
|
||||||
byte yaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F));
|
byte yaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F));
|
||||||
byte pitch = (byte)((int)(e.player.rotationPitch * 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 = new S18PacketEntityTeleport(entityID, x, y, z, yaw, pitch, e.player.onGround);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
byte oldYaw = (byte)((int)(e.player.prevRotationYaw * 256.0F / 360.0F));
|
byte oldYaw = (byte)((int)(e.player.prevRotationYaw * 256.0F / 360.0F));
|
||||||
byte newYaw = (byte)((int)(e.player.rotationYaw * 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 oldPitch = (byte)((int)(e.player.prevRotationPitch * 256.0F / 360.0F));
|
||||||
byte newPitch = (byte)((int)(e.player.rotationPitch * 256.0F / 360.0F));
|
byte newPitch = (byte)((int)(e.player.rotationPitch * 256.0F / 360.0F));
|
||||||
|
|
||||||
byte dPitch = (byte)(newPitch-oldPitch);
|
byte dPitch = (byte)(newPitch-oldPitch);
|
||||||
byte dYaw = (byte)(newYaw-oldYaw);
|
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);
|
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<Integer> found = new ArrayList<Integer>();
|
||||||
|
for(PotionEffect pe : (Collection<PotionEffect>)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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ public class ReplayTickHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onFovChange(FOVUpdateEvent event) {
|
public void onFovChange(FOVUpdateEvent event) {
|
||||||
if(ReplayHandler.replayActive()) {
|
if(ReplayHandler.replayActive()) {
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class ConnectionEventHandler {
|
|||||||
|
|
||||||
ChatMessageRequests.initialize();
|
ChatMessageRequests.initialize();
|
||||||
|
|
||||||
ReplayMod.recordingHandler.resetLastPositions();
|
ReplayMod.recordingHandler.resetVars();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if(event.isLocal) {
|
if(event.isLocal) {
|
||||||
|
|||||||
@@ -9,10 +9,12 @@ import java.io.FileNotFoundException;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.entity.DataWatcher;
|
import net.minecraft.entity.DataWatcher;
|
||||||
import net.minecraft.network.EnumPacketDirection;
|
import net.minecraft.network.EnumPacketDirection;
|
||||||
import net.minecraft.network.Packet;
|
import net.minecraft.network.Packet;
|
||||||
import net.minecraft.network.play.server.S0CPacketSpawnPlayer;
|
import net.minecraft.network.play.server.S0CPacketSpawnPlayer;
|
||||||
|
import net.minecraft.network.play.server.S0DPacketCollectItem;
|
||||||
import net.minecraft.network.play.server.S0FPacketSpawnMob;
|
import net.minecraft.network.play.server.S0FPacketSpawnMob;
|
||||||
import eu.crushedpixel.replaymod.chat.ChatMessageRequests;
|
import eu.crushedpixel.replaymod.chat.ChatMessageRequests;
|
||||||
import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType;
|
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 {
|
public PacketListener(File file, String name, String worldName, long startTime, int maxSize, boolean singleplayer) throws FileNotFoundException {
|
||||||
super(file, name, worldName, startTime, maxSize, singleplayer);
|
super(file, name, worldName, startTime, maxSize, singleplayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
|
||||||
private ChannelHandlerContext context = null;
|
private ChannelHandlerContext context = null;
|
||||||
|
|
||||||
private static final PacketSerializer packetSerializer = new PacketSerializer(EnumPacketDirection.CLIENTBOUND);
|
private static final PacketSerializer packetSerializer = new PacketSerializer(EnumPacketDirection.CLIENTBOUND);
|
||||||
|
|
||||||
public void saveOnly(Packet packet) {
|
public void saveOnly(Packet packet) {
|
||||||
try {
|
try {
|
||||||
PacketData pd = getPacketData(context, packet);
|
PacketData pd = getPacketData(context, packet);
|
||||||
@@ -38,8 +42,8 @@ public class PacketListener extends DataListener {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
if(ctx == null) {
|
if(ctx == null) {
|
||||||
@@ -58,6 +62,14 @@ public class PacketListener extends DataListener {
|
|||||||
try {
|
try {
|
||||||
Packet packet = (Packet)msg;
|
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);
|
PacketData pd = getPacketData(ctx, packet);
|
||||||
dataWriter.writeData(pd);
|
dataWriter.writeData(pd);
|
||||||
lastSentPacket = pd.getTimestamp();
|
lastSentPacket = pd.getTimestamp();
|
||||||
@@ -69,11 +81,11 @@ public class PacketListener extends DataListener {
|
|||||||
|
|
||||||
super.channelRead(ctx, msg);
|
super.channelRead(ctx, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PacketData getPacketData(ChannelHandlerContext ctx, Packet packet) throws IOException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
|
private PacketData getPacketData(ChannelHandlerContext ctx, Packet packet) throws IOException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
|
||||||
|
|
||||||
if(startTime == null) startTime = System.currentTimeMillis();
|
if(startTime == null) startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
int timestamp = (int)(System.currentTimeMillis() - startTime);
|
int timestamp = (int)(System.currentTimeMillis() - startTime);
|
||||||
|
|
||||||
//Converts the packet back to a ByteBuffer for correct saving
|
//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);
|
field_149043_l.set(packet, dw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
packetSerializer.encode(ctx, packet, bb);
|
packetSerializer.encode(ctx, packet, bb);
|
||||||
|
|
||||||
bb.readerIndex(0);
|
bb.readerIndex(0);
|
||||||
@@ -113,7 +125,7 @@ public class PacketListener extends DataListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bb.readerIndex(0);
|
bb.readerIndex(0);
|
||||||
|
|
||||||
return new PacketData(array, timestamp);
|
return new PacketData(array, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import net.minecraft.network.PacketBuffer;
|
|||||||
import net.minecraft.network.play.server.S01PacketJoinGame;
|
import net.minecraft.network.play.server.S01PacketJoinGame;
|
||||||
import net.minecraft.network.play.server.S02PacketChat;
|
import net.minecraft.network.play.server.S02PacketChat;
|
||||||
import net.minecraft.network.play.server.S06PacketUpdateHealth;
|
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.S08PacketPlayerPosLook;
|
||||||
import net.minecraft.network.play.server.S0BPacketAnimation;
|
import net.minecraft.network.play.server.S0BPacketAnimation;
|
||||||
import net.minecraft.network.play.server.S18PacketEntityTeleport;
|
import net.minecraft.network.play.server.S18PacketEntityTeleport;
|
||||||
@@ -61,6 +62,7 @@ import org.apache.commons.io.FilenameUtils;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
|
||||||
import eu.crushedpixel.replaymod.entities.CameraEntity;
|
import eu.crushedpixel.replaymod.entities.CameraEntity;
|
||||||
|
import eu.crushedpixel.replaymod.events.RecordingHandler;
|
||||||
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
|
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
|
||||||
import eu.crushedpixel.replaymod.recording.ReplayMetaData;
|
import eu.crushedpixel.replaymod.recording.ReplayMetaData;
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
||||||
@@ -109,6 +111,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
private int replayLength = 0;
|
private int replayLength = 0;
|
||||||
|
|
||||||
|
private int actualID = -1;
|
||||||
|
|
||||||
private EffectRenderer old = mc.effectRenderer;
|
private EffectRenderer old = mc.effectRenderer;
|
||||||
|
|
||||||
private ZipArchiveEntry replayEntry;
|
private ZipArchiveEntry replayEntry;
|
||||||
@@ -304,9 +308,9 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
if(hurryToTimestamp && currentTimeStamp >= desiredTimeStamp && !startFromBeginning) {
|
if(hurryToTimestamp && currentTimeStamp >= desiredTimeStamp && !startFromBeginning) {
|
||||||
hurryToTimestamp = false;
|
hurryToTimestamp = false;
|
||||||
if(!ReplayHandler.isReplaying() || hasRestarted) {
|
if(!ReplayHandler.isReplaying() || hasRestarted) {
|
||||||
((Timer)mcTimer.get(mc)).elapsedPartialTicks = 5;
|
((Timer)mcTimer.get(mc)).elapsedPartialTicks += 5;
|
||||||
((Timer)mcTimer.get(mc)).elapsedTicks = 5;
|
((Timer)mcTimer.get(mc)).elapsedTicks += 5;
|
||||||
((Timer)mcTimer.get(mc)).renderPartialTicks = 5;
|
((Timer)mcTimer.get(mc)).renderPartialTicks += 5;
|
||||||
}
|
}
|
||||||
if(!ReplayHandler.isReplaying()) {
|
if(!ReplayHandler.isReplaying()) {
|
||||||
setReplaySpeed(0);
|
setReplaySpeed(0);
|
||||||
@@ -343,6 +347,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private boolean allowMovement = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg)
|
public void channelRead(ChannelHandlerContext ctx, Object msg)
|
||||||
throws Exception {
|
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);
|
int entId = (Integer)joinPacketEntityId.get(p);
|
||||||
entId = -1;
|
actualID = entId;
|
||||||
|
entId = Integer.MIN_VALUE+9002;
|
||||||
int dimension = (Integer)joinPacketDimension.get(p);
|
int dimension = (Integer)joinPacketDimension.get(p);
|
||||||
EnumDifficulty difficulty = (EnumDifficulty)joinPacketDifficulty.get(p);
|
EnumDifficulty difficulty = (EnumDifficulty)joinPacketDifficulty.get(p);
|
||||||
int maxPlayers = (Integer)joinPacketMaxPlayers.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,
|
p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension,
|
||||||
difficulty, maxPlayers, worldType, false);
|
difficulty, maxPlayers, worldType, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(p instanceof S18PacketEntityTeleport) {
|
|
||||||
//System.out.println(((S18PacketEntityTeleport) p).func_149449_d());
|
if(p instanceof S07PacketRespawn) {
|
||||||
if(mc.theWorld != null) {
|
allowMovement = true;
|
||||||
for(EntityPlayer ep : (List<EntityPlayer>)mc.theWorld.playerEntities) {
|
|
||||||
System.out.println(ep.posX+" "+ep.posY+" "+ep.posZ);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(p instanceof S08PacketPlayerPosLook) {
|
if(p instanceof S08PacketPlayerPosLook) {
|
||||||
final S08PacketPlayerPosLook ppl = (S08PacketPlayerPosLook)p;
|
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() {
|
Thread t = new Thread(new Runnable() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user