#include "../../Platform/stdafx.h" #include #include "../../IO/Streams/InputOutputStream.h" #include "../../Headers/net.minecraft.world.entity.h" #include "PacketListener.h" #include "AddMobPacket.h" AddMobPacket::AddMobPacket() { id = -1; type = 0; x = 0; y = 0; z = 0; yRot = static_cast(0); xRot = static_cast(0); entityData = nullptr; unpack = NULL; } AddMobPacket::~AddMobPacket() { delete unpack; } AddMobPacket::AddMobPacket(std::shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp) { id = mob->entityId; type = EntityIO::getId(mob); // 4J Stu - We should add entities at their "last sent" position so that the // relative update packets put them in the correct place x = xp; // Mth::floor(mob->x * 32); y = yp; // Mth::floor(mob->y * 32); z = zp; // Mth::floor(mob->z * 32); // 4J - changed - send current "previously sent" value of rotations to put // this in sync with other clients yRot = static_cast(yRotp); xRot = static_cast(xRotp); yHeadRot = static_cast(yHeadRotp); // yRot = (uint8_t) (mob->yRot * 256 / 360); // xRot = (uint8_t) (mob->xRot * 256 / 360); // yHeadRot = (uint8_t) (mob->yHeadRot * 256 / 360); // From SetEntityMotionpacket double m = 3.9; double xd = mob->xd; double yd = mob->yd; double zd = mob->zd; if (xd < -m) xd = -m; if (yd < -m) yd = -m; if (zd < -m) zd = -m; if (xd > m) xd = m; if (yd > m) yd = m; if (zd > m) zd = m; this->xd = (int)(xd * 8000.0); this->yd = (int)(yd * 8000.0); this->zd = (int)(zd * 8000.0); // printf("%d: New add mob rot %d\n",id,yRot); entityData = mob->getEntityData(); unpack = NULL; } void AddMobPacket::read(DataInputStream* dis) // throws IOException { id = dis->readShort(); type = static_cast(dis->readByte()) & 0xff; #ifdef _LARGE_WORLDS x = dis->readInt(); y = dis->readInt(); z = dis->readInt(); #else x = dis->readShort(); y = dis->readShort(); z = dis->readShort(); #endif yRot = dis->readByte(); xRot = dis->readByte(); yHeadRot = dis->readByte(); xd = dis->readShort(); yd = dis->readShort(); zd = dis->readShort(); MemSect(1); unpack = SynchedEntityData::unpack(dis); MemSect(0); } void AddMobPacket::write(DataOutputStream* dos) // throws IOException { dos->writeShort(id); dos->writeByte(static_cast(type & 0xff)); #ifdef _LARGE_WORLDS dos->writeInt(x); dos->writeInt(y); dos->writeInt(z); #else dos->writeShort(x); dos->writeShort(y); dos->writeShort(z); #endif dos->writeByte(yRot); dos->writeByte(xRot); dos->writeByte(yHeadRot); dos->writeShort(xd); dos->writeShort(yd); dos->writeShort(zd); entityData->packAll(dos); } void AddMobPacket::handle(PacketListener* listener) { listener->handleAddMob(shared_from_this()); } int AddMobPacket::getEstimatedSize() { int size = 11; if (entityData != NULL) { size += entityData->getSizeInBytes(); } else if (unpack != NULL) { // 4J Stu - This is an incoming value which we aren't currently // analysing // size += unpack->get } return size; } std::vector >* AddMobPacket::getUnpackedData() { if (unpack == NULL) { unpack = entityData->getAll(); } return unpack; }