mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-29 20:23:38 +00:00
Rewrote the entity movement packets to use full 16-bit signed short increasing the entity ID limit from 2048 (artifical lce limit) to 32768 ids (0 to 32767)
This commit is contained in:
parent
9c254bbf4d
commit
dac0e883b6
|
|
@ -4,7 +4,7 @@
|
|||
#include "PacketListener.h"
|
||||
#include "MoveEntityPacket.h"
|
||||
|
||||
MoveEntityPacket::MoveEntityPacket()
|
||||
MoveEntityPacket::MoveEntityPacket()
|
||||
{
|
||||
hasRot = false;
|
||||
|
||||
|
|
@ -28,7 +28,7 @@ MoveEntityPacket::MoveEntityPacket(int id)
|
|||
xRot = 0;
|
||||
}
|
||||
|
||||
void MoveEntityPacket::read(DataInputStream *dis) //throws IOException
|
||||
void MoveEntityPacket::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
id = dis->readShort();
|
||||
}
|
||||
|
|
@ -48,7 +48,7 @@ void MoveEntityPacket::handle(PacketListener *listener)
|
|||
listener->handleMoveEntity(shared_from_this());
|
||||
}
|
||||
|
||||
int MoveEntityPacket::getEstimatedSize()
|
||||
int MoveEntityPacket::getEstimatedSize()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
|
@ -71,40 +71,40 @@ MoveEntityPacket::PosRot::PosRot()
|
|||
|
||||
MoveEntityPacket::PosRot::PosRot(int id, char xa, char ya, char za, char yRot, char xRot) : MoveEntityPacket( id )
|
||||
{
|
||||
this->xa = xa;
|
||||
this->ya = ya;
|
||||
this->za = za;
|
||||
this->yRot = yRot;
|
||||
this->xRot = xRot;
|
||||
this->xa = (int)(signed char)xa;
|
||||
this->ya = (int)(signed char)ya;
|
||||
this->za = (int)(signed char)za;
|
||||
this->yRot = (int)(signed char)yRot;
|
||||
this->xRot = (int)(signed char)xRot;
|
||||
hasRot = true;
|
||||
}
|
||||
|
||||
void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException
|
||||
void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
MoveEntityPacket::read(dis);
|
||||
xa = (int)dis->readByte();
|
||||
ya = (int)dis->readByte();
|
||||
za = (int)dis->readByte();
|
||||
yRot = (int)dis->readByte();
|
||||
xRot = (int)dis->readByte();
|
||||
xa = (int)(signed char)dis->readByte();
|
||||
ya = (int)(signed char)dis->readByte();
|
||||
za = (int)(signed char)dis->readByte();
|
||||
yRot = (int)(signed char)dis->readByte();
|
||||
xRot = (int)(signed char)dis->readByte();
|
||||
}
|
||||
|
||||
void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException
|
||||
void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
MoveEntityPacket::write(dos);
|
||||
dos->writeByte((uint8_t)xa);
|
||||
dos->writeByte((uint8_t)ya);
|
||||
dos->writeByte((uint8_t)za);
|
||||
dos->writeByte((uint8_t)yRot);
|
||||
dos->writeByte((uint8_t)xRot);
|
||||
dos->writeByte((uint8_t)(xa & 0xFF));
|
||||
dos->writeByte((uint8_t)(ya & 0xFF));
|
||||
dos->writeByte((uint8_t)(za & 0xFF));
|
||||
dos->writeByte((uint8_t)(yRot & 0xFF));
|
||||
dos->writeByte((uint8_t)(xRot & 0xFF));
|
||||
}
|
||||
|
||||
int MoveEntityPacket::PosRot::getEstimatedSize()
|
||||
int MoveEntityPacket::PosRot::getEstimatedSize()
|
||||
{
|
||||
return 2+5;
|
||||
}
|
||||
|
||||
MoveEntityPacket::Pos::Pos()
|
||||
MoveEntityPacket::Pos::Pos()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -115,20 +115,20 @@ MoveEntityPacket::Pos::Pos(int id, char xa, char ya, char za) : MoveEntityPacket
|
|||
this->za = za;
|
||||
}
|
||||
|
||||
void MoveEntityPacket::Pos::read(DataInputStream *dis) //throws IOException
|
||||
void MoveEntityPacket::Pos::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
MoveEntityPacket::read(dis);
|
||||
xa = (int)dis->readByte();
|
||||
ya = (int)dis->readByte();
|
||||
za = (int)dis->readByte();
|
||||
xa = (int)(signed char)dis->readByte();
|
||||
ya = (int)(signed char)dis->readByte();
|
||||
za = (int)(signed char)dis->readByte();
|
||||
}
|
||||
|
||||
void MoveEntityPacket::Pos::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
MoveEntityPacket::write(dos);
|
||||
dos->writeByte((uint8_t)xa);
|
||||
dos->writeByte((uint8_t)ya);
|
||||
dos->writeByte((uint8_t)za);
|
||||
dos->writeByte((uint8_t)(xa & 0xFF));
|
||||
dos->writeByte((uint8_t)(ya & 0xFF));
|
||||
dos->writeByte((uint8_t)(za & 0xFF));
|
||||
}
|
||||
|
||||
int MoveEntityPacket::Pos::getEstimatedSize()
|
||||
|
|
@ -136,7 +136,7 @@ int MoveEntityPacket::Pos::getEstimatedSize()
|
|||
return 2+3;
|
||||
}
|
||||
|
||||
MoveEntityPacket::Rot::Rot()
|
||||
MoveEntityPacket::Rot::Rot()
|
||||
{
|
||||
hasRot = true;
|
||||
}
|
||||
|
|
@ -148,18 +148,18 @@ MoveEntityPacket::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacket(id)
|
|||
hasRot = true;
|
||||
}
|
||||
|
||||
void MoveEntityPacket::Rot::read(DataInputStream *dis) //throws IOException
|
||||
void MoveEntityPacket::Rot::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
MoveEntityPacket::read(dis);
|
||||
yRot = (int)dis->readByte();
|
||||
xRot = (int)dis->readByte();
|
||||
yRot = (int)(signed char)dis->readByte();
|
||||
xRot = (int)(signed char)dis->readByte();
|
||||
}
|
||||
|
||||
void MoveEntityPacket::Rot::write(DataOutputStream *dos) //throws IOException
|
||||
void MoveEntityPacket::Rot::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
MoveEntityPacket::write(dos);
|
||||
dos->writeByte((uint8_t)yRot);
|
||||
dos->writeByte((uint8_t)xRot);
|
||||
dos->writeByte((uint8_t)(yRot & 0xFF));
|
||||
dos->writeByte((uint8_t)(xRot & 0xFF));
|
||||
}
|
||||
|
||||
int MoveEntityPacket::Rot::getEstimatedSize()
|
||||
|
|
|
|||
|
|
@ -19,30 +19,19 @@ MoveEntityPacketSmall::MoveEntityPacketSmall()
|
|||
|
||||
MoveEntityPacketSmall::MoveEntityPacketSmall(int id)
|
||||
{
|
||||
if( (id < 0 ) || (id >= 2048 ) )
|
||||
{
|
||||
// We shouln't be tracking an entity that doesn't have a short type of id
|
||||
__debugbreak();
|
||||
}
|
||||
|
||||
this->id = id;
|
||||
hasRot = false;
|
||||
|
||||
xa = 0;
|
||||
ya = 0;
|
||||
za = 0;
|
||||
yRot = 0;
|
||||
xRot = 0;
|
||||
xa = ya = za = yRot = xRot = 0;
|
||||
}
|
||||
|
||||
void MoveEntityPacketSmall::read(DataInputStream *dis) //throws IOException
|
||||
void MoveEntityPacketSmall::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
id = dis->readShort();
|
||||
}
|
||||
|
||||
void MoveEntityPacketSmall::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
if( (id < 0 ) || (id >= 2048 ) )
|
||||
if(id < 0 || id > 32767 )
|
||||
{
|
||||
// We shouln't be tracking an entity that doesn't have a short type of id
|
||||
__debugbreak();
|
||||
|
|
@ -55,7 +44,7 @@ void MoveEntityPacketSmall::handle(PacketListener *listener)
|
|||
listener->handleMoveEntitySmall(shared_from_this());
|
||||
}
|
||||
|
||||
int MoveEntityPacketSmall::getEstimatedSize()
|
||||
int MoveEntityPacketSmall::getEstimatedSize()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
|
@ -86,36 +75,32 @@ MoveEntityPacketSmall::PosRot::PosRot(int id, char xa, char ya, char za, char yR
|
|||
hasRot = true;
|
||||
}
|
||||
|
||||
void MoveEntityPacketSmall::PosRot::read(DataInputStream *dis) //throws IOException
|
||||
void MoveEntityPacketSmall::PosRot::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
int idAndRot = dis->readShort();
|
||||
this->id = idAndRot & 0x07ff;
|
||||
this->yRot = idAndRot >> 11;
|
||||
int xAndYAndZ = (int)dis->readShort();
|
||||
this->xa = xAndYAndZ >> 11;
|
||||
this->ya = (xAndYAndZ << 21 ) >> 26;
|
||||
this->za = (xAndYAndZ << 27 ) >> 27;
|
||||
MoveEntityPacketSmall::read(dis);
|
||||
xa = (signed char)dis->readByte();
|
||||
ya = (signed char)dis->readByte();
|
||||
za = (signed char)dis->readByte();
|
||||
yRot = (signed char)dis->readByte();
|
||||
xRot = (signed char)dis->readByte();
|
||||
}
|
||||
|
||||
void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOException
|
||||
void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
if( (id < 0 ) || (id >= 2048 ) )
|
||||
{
|
||||
// We shouln't be tracking an entity that doesn't have a short type of id
|
||||
__debugbreak();
|
||||
}
|
||||
short idAndRot = id | yRot << 11;
|
||||
dos->writeShort(idAndRot);
|
||||
short xAndYAndZ = ( xa << 11 ) | ( ( ya & 0x3f ) << 5 ) | ( za & 0x1f );
|
||||
dos->writeShort(xAndYAndZ);
|
||||
MoveEntityPacketSmall::write(dos);
|
||||
dos->writeByte((uint8_t)(xa & 0xFF));
|
||||
dos->writeByte((uint8_t)(ya & 0xFF));
|
||||
dos->writeByte((uint8_t)(za & 0xFF));
|
||||
dos->writeByte((uint8_t)(yRot & 0xFF));
|
||||
dos->writeByte((uint8_t)(xRot & 0xFF));
|
||||
}
|
||||
|
||||
int MoveEntityPacketSmall::PosRot::getEstimatedSize()
|
||||
int MoveEntityPacketSmall::PosRot::getEstimatedSize()
|
||||
{
|
||||
return 4;
|
||||
return 2+5;
|
||||
}
|
||||
|
||||
MoveEntityPacketSmall::Pos::Pos()
|
||||
MoveEntityPacketSmall::Pos::Pos()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -126,35 +111,28 @@ MoveEntityPacketSmall::Pos::Pos(int id, char xa, char ya, char za) : MoveEntityP
|
|||
this->za = za;
|
||||
}
|
||||
|
||||
void MoveEntityPacketSmall::Pos::read(DataInputStream *dis) //throws IOException
|
||||
void MoveEntityPacketSmall::Pos::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
int idAndY = dis->readShort();
|
||||
this->id = idAndY & 0x07ff;
|
||||
this->ya = idAndY >> 11;
|
||||
int XandZ = (int)((signed char)(dis->readByte()));
|
||||
xa = XandZ >> 4;
|
||||
za = ( XandZ << 28 ) >> 28;
|
||||
MoveEntityPacketSmall::read(dis);
|
||||
xa = (signed char)dis->readByte();
|
||||
ya = (signed char)dis->readByte();
|
||||
za = (signed char)dis->readByte();
|
||||
}
|
||||
|
||||
void MoveEntityPacketSmall::Pos::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
if( (id < 0 ) || (id >= 2048 ) )
|
||||
{
|
||||
// We shouln't be tracking an entity that doesn't have a short type of id
|
||||
__debugbreak();
|
||||
}
|
||||
short idAndY = id | ya << 11;
|
||||
dos->writeShort(idAndY);
|
||||
char XandZ = ( xa << 4 ) | ( za & 0x0f );
|
||||
dos->writeByte((uint8_t)XandZ);
|
||||
MoveEntityPacketSmall::write(dos);
|
||||
dos->writeByte((uint8_t)(xa & 0xFF));
|
||||
dos->writeByte((uint8_t)(ya & 0xFF));
|
||||
dos->writeByte((uint8_t)(za & 0xFF));
|
||||
}
|
||||
|
||||
int MoveEntityPacketSmall::Pos::getEstimatedSize()
|
||||
{
|
||||
return 3;
|
||||
return 2+3;
|
||||
}
|
||||
|
||||
MoveEntityPacketSmall::Rot::Rot()
|
||||
MoveEntityPacketSmall::Rot::Rot()
|
||||
{
|
||||
hasRot = true;
|
||||
}
|
||||
|
|
@ -167,25 +145,19 @@ MoveEntityPacketSmall::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacket
|
|||
hasRot = true;
|
||||
}
|
||||
|
||||
void MoveEntityPacketSmall::Rot::read(DataInputStream *dis) //throws IOException
|
||||
void MoveEntityPacketSmall::Rot::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
int idAndRot = (int)dis->readShort();
|
||||
this->id = idAndRot & 0x07ff;
|
||||
this->yRot = idAndRot >> 11;
|
||||
MoveEntityPacketSmall::read(dis);
|
||||
yRot = (signed char)dis->readByte();
|
||||
}
|
||||
|
||||
void MoveEntityPacketSmall::Rot::write(DataOutputStream *dos) //throws IOException
|
||||
void MoveEntityPacketSmall::Rot::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
if( (id < 0 ) || (id >= 2048 ) )
|
||||
{
|
||||
// We shouln't be tracking an entity that doesn't have a short type of id
|
||||
__debugbreak();
|
||||
}
|
||||
short idAndRot = id | yRot << 11;
|
||||
dos->writeShort(idAndRot);
|
||||
MoveEntityPacketSmall::write(dos);
|
||||
dos->writeByte((uint8_t)(yRot & 0xFF));
|
||||
}
|
||||
|
||||
int MoveEntityPacketSmall::Rot::getEstimatedSize()
|
||||
{
|
||||
return 2;
|
||||
return 2+1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,19 +20,11 @@ void SetEntityMotionPacket::_init(int id, double xd, double yd, double zd)
|
|||
xa = (int) (xd * 8000.0);
|
||||
ya = (int) (yd * 8000.0);
|
||||
za = (int) (zd * 8000.0);
|
||||
// 4J - if we could transmit this as bytes (in 1/16 accuracy) then flag to do so
|
||||
if( ( xa >= (-128 * 16 ) ) && ( ya >= (-128 * 16 ) ) && ( za >= (-128 * 16 ) ) &&
|
||||
( xa < (128 * 16 ) ) && ( ya < (128 * 16 ) ) && ( za < (128 * 16 ) ) )
|
||||
{
|
||||
useBytes = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
useBytes = false;
|
||||
}
|
||||
|
||||
useBytes = false;
|
||||
}
|
||||
|
||||
SetEntityMotionPacket::SetEntityMotionPacket()
|
||||
SetEntityMotionPacket::SetEntityMotionPacket()
|
||||
{
|
||||
_init(0, 0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
|
|
@ -44,53 +36,27 @@ SetEntityMotionPacket::SetEntityMotionPacket(std::shared_ptr<Entity> e)
|
|||
|
||||
SetEntityMotionPacket::SetEntityMotionPacket(int id, double xd, double yd, double zd)
|
||||
{
|
||||
_init(id, xd, yd, zd);
|
||||
_init(id, xd, yd, zd);
|
||||
}
|
||||
|
||||
void SetEntityMotionPacket::read(DataInputStream *dis) //throws IOException
|
||||
void SetEntityMotionPacket::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
short idAndFlag = dis->readShort();
|
||||
id = idAndFlag & 0x07ff;
|
||||
if( idAndFlag & 0x0800 )
|
||||
{
|
||||
xa = (int)dis->readByte();
|
||||
ya = (int)dis->readByte();
|
||||
za = (int)dis->readByte();
|
||||
xa = ( xa << 24 ) >> 24;
|
||||
ya = ( ya << 24 ) >> 24;
|
||||
za = ( za << 24 ) >> 24;
|
||||
xa *= 16;
|
||||
ya *= 16;
|
||||
za *= 16;
|
||||
useBytes = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
xa = dis->readShort();
|
||||
ya = dis->readShort();
|
||||
za = dis->readShort();
|
||||
useBytes = false;
|
||||
}
|
||||
id = dis->readShort();
|
||||
|
||||
xa = dis->readShort();
|
||||
ya = dis->readShort();
|
||||
za = dis->readShort();
|
||||
|
||||
useBytes = false;
|
||||
}
|
||||
|
||||
void SetEntityMotionPacket::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
if( useBytes )
|
||||
{
|
||||
// Masking the id to 11 bits before writing to account for large entitty ids.
|
||||
dos->writeShort((id & 0x07FF) | 0x800);
|
||||
dos->writeByte(xa/16);
|
||||
dos->writeByte(ya/16);
|
||||
dos->writeByte(za/16);
|
||||
}
|
||||
else
|
||||
{
|
||||
// same thing as line 80 here
|
||||
dos->writeShort((id & 0x07FF));
|
||||
dos->writeShort(xa);
|
||||
dos->writeShort(ya);
|
||||
dos->writeShort(za);
|
||||
}
|
||||
dos->writeShort(id);
|
||||
|
||||
dos->writeShort(xa);
|
||||
dos->writeShort(ya);
|
||||
dos->writeShort(za);
|
||||
}
|
||||
|
||||
void SetEntityMotionPacket::handle(PacketListener *listener)
|
||||
|
|
@ -100,7 +66,7 @@ void SetEntityMotionPacket::handle(PacketListener *listener)
|
|||
|
||||
int SetEntityMotionPacket::getEstimatedSize()
|
||||
{
|
||||
return useBytes ? 5 : 8;
|
||||
return 8;
|
||||
}
|
||||
|
||||
bool SetEntityMotionPacket::canBeInvalidated()
|
||||
|
|
|
|||
|
|
@ -55,16 +55,10 @@ void TeleportEntityPacket::read(DataInputStream *dis) //throws IOException
|
|||
|
||||
void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException
|
||||
{
|
||||
dos->writeShort(id);
|
||||
#ifdef _LARGE_WORLDS
|
||||
dos->writeShort((short)id);
|
||||
dos->writeInt(x);
|
||||
dos->writeInt(y);
|
||||
dos->writeInt(z);
|
||||
#else
|
||||
dos->writeShort(x);
|
||||
dos->writeShort(y);
|
||||
dos->writeShort(z);
|
||||
#endif
|
||||
dos->write(yRot);
|
||||
dos->write(xRot);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue