Merge branch '4jcraft:dev' into fix-with-ubsan

This commit is contained in:
Nikita Edel 2026-03-12 14:40:02 +01:00 committed by GitHub
commit 6cfc1efec2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 212 additions and 144 deletions

View file

@ -341,9 +341,11 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, std::shared_ptr
Tile *tile = Tile::tiles[itemId]; Tile *tile = Tile::tiles[itemId];
glPushMatrix(); glPushMatrix();
// 4J - original code left here for reference // 4J - original code left here for reference
#if 0 // 4jcraft: re-enable said original code to fix hotbar block rendering
#if 1
glTranslatef((float)(x), (float)(y), 0.0f); glTranslatef((float)(x), (float)(y), 0.0f);
glScalef(fScale, fScale, fScale); //glScalef(fScale, fScale, fScale);
glScalef(fScaleX, fScaleY, 1.0f); // 4jcraft: tweaked to use the new variables
glTranslatef(-2.0f,3.0f, -3.0f + blitOffset); glTranslatef(-2.0f,3.0f, -3.0f + blitOffset);
glScalef(10.0f, 10.0f, 10.0f); glScalef(10.0f, 10.0f, 10.0f);
glTranslatef(1.0f, 0.5f, 8.0f); glTranslatef(1.0f, 0.5f, 8.0f);

View file

@ -1756,7 +1756,8 @@ void GameRenderer::renderSnowAndRain(float a)
t->color(br, br, br, ((1 - dd * dd) * 0.5f + 0.5f) * rainLevel); t->color(br, br, br, ((1 - dd * dd) * 0.5f + 0.5f) * rainLevel);
t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s, yy0 * s / 4.0f + ra * s); t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s, yy0 * s / 4.0f + ra * s);
t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s); t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s);
t->color(br, br, br, 0.0f); // 4J - added to soften the top visible edge of the rain // 4jcraft: this color call made rain invisible
// t->color(br, br, br, 0.0f); // 4J - added to soften the top visible edge of the rain
t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s); t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s);
t->vertexUV(x - xa + 0.5, yy1, z - za + 0.5, 0 * s, yy1 * s / 4.0f + ra * s); t->vertexUV(x - xa + 0.5, yy1, z - za + 0.5, 0 * s, yy1 * s / 4.0f + ra * s);
#endif #endif

View file

@ -1559,15 +1559,16 @@ void LevelRenderer::renderAdvancedClouds(float alpha)
// This is because the complex sort of rendering is really there so that the clouds seem more solid when you might be in them, but it has more risk of artifacts so // This is because the complex sort of rendering is really there so that the clouds seem more solid when you might be in them, but it has more risk of artifacts so
// we don't want to do it when not necessary // we don't want to do it when not necessary
bool noBFCMode = ( (yy > -h - 1) && (yy <= h + 1) ); // 4jcraft: not needed for the tesselator-based implementation
if( noBFCMode ) // bool noBFCMode = ( (yy > -h - 1) && (yy <= h + 1) );
{ // if( noBFCMode )
glDisable(GL_CULL_FACE); // {
} // glDisable(GL_CULL_FACE);
else // }
{ // else
glEnable(GL_CULL_FACE); // {
} // glEnable(GL_CULL_FACE);
// }
MemSect(31); MemSect(31);
textures->bindTexture(TN_ENVIRONMENT_CLOUDS); // 4J was L"/environment/clouds.png" textures->bindTexture(TN_ENVIRONMENT_CLOUDS); // 4J was L"/environment/clouds.png"
@ -1632,7 +1633,9 @@ void LevelRenderer::renderAdvancedClouds(float alpha)
{ {
// 4J - reimplemented the clouds with full cube-per-texel geometry to get rid of seams. This is a huge amount more quads to render, so // 4J - reimplemented the clouds with full cube-per-texel geometry to get rid of seams. This is a huge amount more quads to render, so
// now using command buffers to render each section to cut CPU hit. // now using command buffers to render each section to cut CPU hit.
#if 1
// 4jcraft: switch back to the tesselator-based implementation of cloud renders
#if 0
float xx = (float)(xPos * D); float xx = (float)(xPos * D);
float zz = (float)(zPos * D); float zz = (float)(zPos * D);
float xp = xx - xoffs; float xp = xx - xoffs;
@ -1707,7 +1710,7 @@ void LevelRenderer::renderAdvancedClouds(float alpha)
glLoadIdentity(); glLoadIdentity();
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
#else #else
glDisable(GL_CULL_FACE);
t->begin(); t->begin();
float xx = (float)(xPos * D); float xx = (float)(xPos * D);
float zz = (float)(zPos * D); float zz = (float)(zPos * D);

View file

@ -44,12 +44,9 @@ int Entity::getSmallId()
// for final notification to the client that the entities are removed. We can't go re-using these small Ids yet, as otherwise we will // for final notification to the client that the entities are removed. We can't go re-using these small Ids yet, as otherwise we will
// potentially end up telling the client that the entity has been removed After we have already re-used its Id and created a new entity. // potentially end up telling the client that the entity has been removed After we have already re-used its Id and created a new entity.
// This ends up with newly created client-side entities being removed by accident, causing invisible mobs. // This ends up with newly created client-side entities being removed by accident, causing invisible mobs.
#ifdef _WIN32
if( ((size_t)TlsGetValue(tlsIdx) != 0 ) ) //4jcraft - i have no idea what 4j was cooking here ngl
#else
pthread_key_create(&tlsIdx, nullptr);
if ( ((size_t)pthread_getspecific(tlsIdx) != 0) ) if ( ((size_t)pthread_getspecific(tlsIdx) != 0) )
#endif
{ {
MinecraftServer *server = MinecraftServer::getInstance(); MinecraftServer *server = MinecraftServer::getInstance();
if( server ) if( server )

View file

@ -4,7 +4,7 @@
#include "PacketListener.h" #include "PacketListener.h"
#include "MoveEntityPacket.h" #include "MoveEntityPacket.h"
MoveEntityPacket::MoveEntityPacket() MoveEntityPacket::MoveEntityPacket()
{ {
hasRot = false; hasRot = false;
@ -28,7 +28,7 @@ MoveEntityPacket::MoveEntityPacket(int id)
xRot = 0; xRot = 0;
} }
void MoveEntityPacket::read(DataInputStream *dis) //throws IOException void MoveEntityPacket::read(DataInputStream *dis) //throws IOException
{ {
id = dis->readShort(); id = dis->readShort();
} }
@ -48,7 +48,7 @@ void MoveEntityPacket::handle(PacketListener *listener)
listener->handleMoveEntity(shared_from_this()); listener->handleMoveEntity(shared_from_this());
} }
int MoveEntityPacket::getEstimatedSize() int MoveEntityPacket::getEstimatedSize()
{ {
return 2; return 2;
} }
@ -69,66 +69,66 @@ MoveEntityPacket::PosRot::PosRot()
hasRot = true; hasRot = true;
} }
MoveEntityPacket::PosRot::PosRot(int id, int8_t xa, int8_t ya, int8_t za, int8_t yRot, int8_t xRot) : MoveEntityPacket( id ) MoveEntityPacket::PosRot::PosRot(int id, char xa, char ya, char za, char yRot, char xRot) : MoveEntityPacket( id )
{ {
this->xa = xa; this->xa = xa;
this->ya = ya; this->ya = ya;
this->za = za; this->za = za;
this->yRot = yRot; this->yRot = yRot;
this->xRot = xRot; this->xRot = xRot;
hasRot = true; hasRot = true;
} }
void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacket::read(dis); MoveEntityPacket::read(dis);
xa = (int8_t)dis->readByte(); xa = (int)dis->readByte();
ya = (int8_t)dis->readByte(); ya = (int)dis->readByte();
za = (int8_t)dis->readByte(); za = (int)dis->readByte();
yRot = (int8_t)dis->readByte(); yRot = (int)dis->readByte();
xRot = (int8_t)dis->readByte(); xRot = (int)dis->readByte();
} }
void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacket::write(dos); MoveEntityPacket::write(dos);
dos->writeByte((uint8_t)(xa & 0xFF)); dos->writeByte((uint8_t)xa);
dos->writeByte((uint8_t)(ya & 0xFF)); dos->writeByte((uint8_t)ya);
dos->writeByte((uint8_t)(za & 0xFF)); dos->writeByte((uint8_t)za);
dos->writeByte((uint8_t)(yRot & 0xFF)); dos->writeByte((uint8_t)yRot);
dos->writeByte((uint8_t)(xRot & 0xFF)); dos->writeByte((uint8_t)xRot);
} }
int MoveEntityPacket::PosRot::getEstimatedSize() int MoveEntityPacket::PosRot::getEstimatedSize()
{ {
return 2+5; return 2+5;
} }
MoveEntityPacket::Pos::Pos() MoveEntityPacket::Pos::Pos()
{ {
} }
MoveEntityPacket::Pos::Pos(int id, int8_t xa, int8_t ya, int8_t za) : MoveEntityPacket(id) MoveEntityPacket::Pos::Pos(int id, char xa, char ya, char za) : MoveEntityPacket(id)
{ {
this->xa = xa; this->xa = xa;
this->ya = ya; this->ya = ya;
this->za = za; this->za = za;
} }
void MoveEntityPacket::Pos::read(DataInputStream *dis) //throws IOException void MoveEntityPacket::Pos::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacket::read(dis); MoveEntityPacket::read(dis);
xa = (int8_t)dis->readByte(); xa = (int)dis->readByte();
ya = (int8_t)dis->readByte(); ya = (int)dis->readByte();
za = (int8_t)dis->readByte(); za = (int)dis->readByte();
} }
void MoveEntityPacket::Pos::write(DataOutputStream *dos) //throws IOException void MoveEntityPacket::Pos::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacket::write(dos); MoveEntityPacket::write(dos);
dos->writeByte((uint8_t)(xa & 0xFF)); dos->writeByte((uint8_t)xa);
dos->writeByte((uint8_t)(ya & 0xFF)); dos->writeByte((uint8_t)ya);
dos->writeByte((uint8_t)(za & 0xFF)); dos->writeByte((uint8_t)za);
} }
int MoveEntityPacket::Pos::getEstimatedSize() int MoveEntityPacket::Pos::getEstimatedSize()
@ -136,30 +136,30 @@ int MoveEntityPacket::Pos::getEstimatedSize()
return 2+3; return 2+3;
} }
MoveEntityPacket::Rot::Rot() MoveEntityPacket::Rot::Rot()
{ {
hasRot = true; hasRot = true;
} }
MoveEntityPacket::Rot::Rot(int id, int8_t yRot, int8_t xRot) : MoveEntityPacket(id) MoveEntityPacket::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacket(id)
{ {
this->yRot = yRot; this->yRot = yRot;
this->xRot = xRot; this->xRot = xRot;
hasRot = true; hasRot = true;
} }
void MoveEntityPacket::Rot::read(DataInputStream *dis) //throws IOException void MoveEntityPacket::Rot::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacket::read(dis); MoveEntityPacket::read(dis);
yRot = (int8_t)dis->readByte(); yRot = (int)dis->readByte();
xRot = (int8_t)dis->readByte(); xRot = (int)dis->readByte();
} }
void MoveEntityPacket::Rot::write(DataOutputStream *dos) //throws IOException void MoveEntityPacket::Rot::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacket::write(dos); MoveEntityPacket::write(dos);
dos->writeByte((uint8_t)(yRot & 0xFF)); dos->writeByte((uint8_t)yRot);
dos->writeByte((uint8_t)(xRot & 0xFF)); dos->writeByte((uint8_t)xRot);
} }
int MoveEntityPacket::Rot::getEstimatedSize() int MoveEntityPacket::Rot::getEstimatedSize()

View file

@ -13,7 +13,7 @@ public:
class Rot; class Rot;
int id; int id;
int8_t xa, ya, za, yRot, xRot; char xa, ya, za, yRot, xRot;
bool hasRot; bool hasRot;
MoveEntityPacket(); MoveEntityPacket();
@ -35,7 +35,7 @@ class MoveEntityPacket::PosRot : public MoveEntityPacket
{ {
public: public:
PosRot(); PosRot();
PosRot(int id, int8_t xa, int8_t ya, int8_t za, int8_t yRot, int8_t xRot); PosRot(int id, char xa, char ya, char za, char yRot, char xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
@ -50,7 +50,7 @@ class MoveEntityPacket::Pos : public MoveEntityPacket
{ {
public: public:
Pos(); Pos();
Pos(int id, int8_t xa, int8_t ya, int8_t za); Pos(int id, char xa, char ya, char za);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
@ -65,7 +65,7 @@ class MoveEntityPacket::Rot : public MoveEntityPacket
{ {
public: public:
Rot(); Rot();
Rot(int id, int8_t yRot, int8_t xRot); Rot(int id, char yRot, char xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);

View file

@ -1,6 +1,5 @@
#include "../../Platform/stdafx.h" #include "../../Platform/stdafx.h"
#include <iostream> #include <iostream>
#include <limits>
#include "../../IO/Streams/InputOutputStream.h" #include "../../IO/Streams/InputOutputStream.h"
#include "PacketListener.h" #include "PacketListener.h"
#include "MoveEntityPacketSmall.h" #include "MoveEntityPacketSmall.h"
@ -20,19 +19,30 @@ MoveEntityPacketSmall::MoveEntityPacketSmall()
MoveEntityPacketSmall::MoveEntityPacketSmall(int id) 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; this->id = id;
hasRot = false; hasRot = false;
xa = ya = za = yRot = xRot = 0;
xa = 0;
ya = 0;
za = 0;
yRot = 0;
xRot = 0;
} }
void MoveEntityPacketSmall::read(DataInputStream *dis) //throws IOException void MoveEntityPacketSmall::read(DataInputStream *dis) //throws IOException
{ {
id = dis->readShort(); id = dis->readShort();
} }
void MoveEntityPacketSmall::write(DataOutputStream *dos) //throws IOException void MoveEntityPacketSmall::write(DataOutputStream *dos) //throws IOException
{ {
if(id < 0 || id > std::numeric_limits<int16_t>::max() ) if( (id < 0 ) || (id >= 2048 ) )
{ {
// We shouln't be tracking an entity that doesn't have a short type of id // We shouln't be tracking an entity that doesn't have a short type of id
__debugbreak(); __debugbreak();
@ -45,7 +55,7 @@ void MoveEntityPacketSmall::handle(PacketListener *listener)
listener->handleMoveEntitySmall(shared_from_this()); listener->handleMoveEntitySmall(shared_from_this());
} }
int MoveEntityPacketSmall::getEstimatedSize() int MoveEntityPacketSmall::getEstimatedSize()
{ {
return 2; return 2;
} }
@ -66,7 +76,7 @@ MoveEntityPacketSmall::PosRot::PosRot()
hasRot = true; hasRot = true;
} }
MoveEntityPacketSmall::PosRot::PosRot(int id, int8_t xa, int8_t ya, int8_t za, int8_t yRot, int8_t xRot) : MoveEntityPacketSmall( id ) MoveEntityPacketSmall::PosRot::PosRot(int id, char xa, char ya, char za, char yRot, char xRot) : MoveEntityPacketSmall( id )
{ {
this->xa = xa; this->xa = xa;
this->ya = ya; this->ya = ya;
@ -76,69 +86,80 @@ MoveEntityPacketSmall::PosRot::PosRot(int id, int8_t xa, int8_t ya, int8_t za, i
hasRot = true; hasRot = true;
} }
void MoveEntityPacketSmall::PosRot::read(DataInputStream *dis) //throws IOException void MoveEntityPacketSmall::PosRot::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacketSmall::read(dis); int idAndRot = dis->readShort();
xa = (int8_t)dis->readByte(); this->id = idAndRot & 0x07ff;
ya = (int8_t)dis->readByte(); this->yRot = idAndRot >> 11;
za = (int8_t)dis->readByte(); int xAndYAndZ = (int)dis->readShort();
yRot = (int8_t)dis->readByte(); this->xa = xAndYAndZ >> 11;
xRot = (int8_t)dis->readByte(); this->ya = (xAndYAndZ << 21 ) >> 26;
this->za = (xAndYAndZ << 27 ) >> 27;
} }
void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOException void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacketSmall::write(dos); if( (id < 0 ) || (id >= 2048 ) )
dos->writeByte((uint8_t)(xa & 0xFF)); {
dos->writeByte((uint8_t)(ya & 0xFF)); // We shouln't be tracking an entity that doesn't have a short type of id
dos->writeByte((uint8_t)(za & 0xFF)); __debugbreak();
dos->writeByte((uint8_t)(yRot & 0xFF)); }
dos->writeByte((uint8_t)(xRot & 0xFF)); short idAndRot = id | yRot << 11;
dos->writeShort(idAndRot);
short xAndYAndZ = ( xa << 11 ) | ( ( ya & 0x3f ) << 5 ) | ( za & 0x1f );
dos->writeShort(xAndYAndZ);
} }
int MoveEntityPacketSmall::PosRot::getEstimatedSize() int MoveEntityPacketSmall::PosRot::getEstimatedSize()
{ {
return 2+5; return 4;
} }
MoveEntityPacketSmall::Pos::Pos() MoveEntityPacketSmall::Pos::Pos()
{ {
} }
MoveEntityPacketSmall::Pos::Pos(int id, int8_t xa, int8_t ya, int8_t za) : MoveEntityPacketSmall(id) MoveEntityPacketSmall::Pos::Pos(int id, char xa, char ya, char za) : MoveEntityPacketSmall(id)
{ {
this->xa = xa; this->xa = xa;
this->ya = ya; this->ya = ya;
this->za = za; this->za = za;
} }
void MoveEntityPacketSmall::Pos::read(DataInputStream *dis) //throws IOException void MoveEntityPacketSmall::Pos::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacketSmall::read(dis); int idAndY = dis->readShort();
xa = (int8_t)dis->readByte(); this->id = idAndY & 0x07ff;
ya = (int8_t)dis->readByte(); this->ya = idAndY >> 11;
za = (int8_t)dis->readByte(); int XandZ = (int)((signed char)(dis->readByte()));
xa = XandZ >> 4;
za = ( XandZ << 28 ) >> 28;
} }
void MoveEntityPacketSmall::Pos::write(DataOutputStream *dos) //throws IOException void MoveEntityPacketSmall::Pos::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacketSmall::write(dos); if( (id < 0 ) || (id >= 2048 ) )
dos->writeByte((uint8_t)(xa & 0xFF)); {
dos->writeByte((uint8_t)(ya & 0xFF)); // We shouln't be tracking an entity that doesn't have a short type of id
dos->writeByte((uint8_t)(za & 0xFF)); __debugbreak();
}
short idAndY = id | ya << 11;
dos->writeShort(idAndY);
char XandZ = ( xa << 4 ) | ( za & 0x0f );
dos->writeByte((uint8_t)XandZ);
} }
int MoveEntityPacketSmall::Pos::getEstimatedSize() int MoveEntityPacketSmall::Pos::getEstimatedSize()
{ {
return 2+3; return 3;
} }
MoveEntityPacketSmall::Rot::Rot() MoveEntityPacketSmall::Rot::Rot()
{ {
hasRot = true; hasRot = true;
} }
MoveEntityPacketSmall::Rot::Rot(int id, int8_t yRot, int8_t xRot) : MoveEntityPacketSmall(id) MoveEntityPacketSmall::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacketSmall(id)
{ {
this->yRot = yRot; this->yRot = yRot;
@ -146,19 +167,25 @@ MoveEntityPacketSmall::Rot::Rot(int id, int8_t yRot, int8_t xRot) : MoveEntityPa
hasRot = true; hasRot = true;
} }
void MoveEntityPacketSmall::Rot::read(DataInputStream *dis) //throws IOException void MoveEntityPacketSmall::Rot::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacketSmall::read(dis); int idAndRot = (int)dis->readShort();
yRot = (int8_t)dis->readByte(); this->id = idAndRot & 0x07ff;
this->yRot = idAndRot >> 11;
} }
void MoveEntityPacketSmall::Rot::write(DataOutputStream *dos) //throws IOException void MoveEntityPacketSmall::Rot::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacketSmall::write(dos); if( (id < 0 ) || (id >= 2048 ) )
dos->writeByte((uint8_t)(yRot & 0xFF)); {
// 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);
} }
int MoveEntityPacketSmall::Rot::getEstimatedSize() int MoveEntityPacketSmall::Rot::getEstimatedSize()
{ {
return 2+1; return 2;
} }

View file

@ -13,8 +13,8 @@ public:
class Rot; class Rot;
int id; int id;
int8_t xa, ya, za, yRot, xRot; char xa, ya, za, yRot, xRot;
bool hasRot; bool hasRot;
MoveEntityPacketSmall(); MoveEntityPacketSmall();
MoveEntityPacketSmall(int id); MoveEntityPacketSmall(int id);
@ -34,8 +34,8 @@ public:
class MoveEntityPacketSmall::PosRot : public MoveEntityPacketSmall class MoveEntityPacketSmall::PosRot : public MoveEntityPacketSmall
{ {
public: public:
PosRot(); PosRot();
PosRot(int id, int8_t xa, int8_t ya, int8_t za, int8_t yRot, int8_t xRot); PosRot(int id, char xa, char ya, char za, char yRot, char xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
@ -50,7 +50,7 @@ class MoveEntityPacketSmall::Pos : public MoveEntityPacketSmall
{ {
public: public:
Pos(); Pos();
Pos(int id, int8_t xa, int8_t ya, int8_t za); Pos(int id, char xa, char ya, char za);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
@ -66,7 +66,7 @@ class MoveEntityPacketSmall::Rot : public MoveEntityPacketSmall
{ {
public: public:
Rot(); Rot();
Rot(int id, int8_t yRot, int8_t xRot); Rot(int id, char yRot, char xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);

View file

@ -17,14 +17,22 @@ void SetEntityMotionPacket::_init(int id, double xd, double yd, double zd)
if (xd > m) xd = m; if (xd > m) xd = m;
if (yd > m) yd = m; if (yd > m) yd = m;
if (zd > m) zd = m; if (zd > m) zd = m;
xa = (int16_t) (xd * 8000.0); xa = (int) (xd * 8000.0);
ya = (int16_t) (yd * 8000.0); ya = (int) (yd * 8000.0);
za = (int16_t) (zd * 8000.0); za = (int) (zd * 8000.0);
// 4J - if we could transmit this as bytes (in 1/16 accuracy) then flag to do so
useBytes = false; if( ( xa >= (-128 * 16 ) ) && ( ya >= (-128 * 16 ) ) && ( za >= (-128 * 16 ) ) &&
( xa < (128 * 16 ) ) && ( ya < (128 * 16 ) ) && ( za < (128 * 16 ) ) )
{
useBytes = true;
}
else
{
useBytes = false;
}
} }
SetEntityMotionPacket::SetEntityMotionPacket() SetEntityMotionPacket::SetEntityMotionPacket()
{ {
_init(0, 0.0f, 0.0f, 0.0f); _init(0, 0.0f, 0.0f, 0.0f);
} }
@ -36,27 +44,51 @@ SetEntityMotionPacket::SetEntityMotionPacket(std::shared_ptr<Entity> e)
SetEntityMotionPacket::SetEntityMotionPacket(int id, double xd, double yd, double zd) 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
{ {
id = dis->readShort(); short idAndFlag = dis->readShort();
id = idAndFlag & 0x07ff;
xa = dis->readShort(); if( idAndFlag & 0x0800 )
ya = dis->readShort(); {
za = dis->readShort(); xa = (int)dis->readByte();
ya = (int)dis->readByte();
useBytes = false; 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;
}
} }
void SetEntityMotionPacket::write(DataOutputStream *dos) //throws IOException void SetEntityMotionPacket::write(DataOutputStream *dos) //throws IOException
{ {
dos->writeShort(id); if( useBytes )
{
dos->writeShort(xa); dos->writeShort(id | 0x800);
dos->writeShort(ya); dos->writeByte(xa/16);
dos->writeShort(za); dos->writeByte(ya/16);
dos->writeByte(za/16);
}
else
{
dos->writeShort(id);
dos->writeShort(xa);
dos->writeShort(ya);
dos->writeShort(za);
}
} }
void SetEntityMotionPacket::handle(PacketListener *listener) void SetEntityMotionPacket::handle(PacketListener *listener)
@ -66,7 +98,7 @@ void SetEntityMotionPacket::handle(PacketListener *listener)
int SetEntityMotionPacket::getEstimatedSize() int SetEntityMotionPacket::getEstimatedSize()
{ {
return 8; return useBytes ? 5 : 8;
} }
bool SetEntityMotionPacket::canBeInvalidated() bool SetEntityMotionPacket::canBeInvalidated()

View file

@ -7,7 +7,7 @@ class SetEntityMotionPacket : public Packet, public std::enable_shared_from_this
{ {
public: public:
int id; int id;
int16_t xa, ya, za; int xa, ya, za;
bool useBytes; // 4J added bool useBytes; // 4J added
private: private:

View file

@ -17,7 +17,7 @@ TeleportEntityPacket::TeleportEntityPacket()
xRot = 0; xRot = 0;
} }
TeleportEntityPacket::TeleportEntityPacket(std::shared_ptr<Entity> e) TeleportEntityPacket::TeleportEntityPacket(std::shared_ptr<Entity> e)
{ {
id = e->entityId; id = e->entityId;
x = Mth::floor(e->x * 32); x = Mth::floor(e->x * 32);
@ -27,7 +27,7 @@ TeleportEntityPacket::TeleportEntityPacket(std::shared_ptr<Entity> e)
xRot = (uint8_t) (e->xRot * 256 / 360); xRot = (uint8_t) (e->xRot * 256 / 360);
} }
TeleportEntityPacket::TeleportEntityPacket(int id, int32_t x, int32_t y, int32_t z, uint8_t yRot, uint8_t xRot) TeleportEntityPacket::TeleportEntityPacket(int id, int x, int y, int z, uint8_t yRot, uint8_t xRot)
{ {
this->id = id; this->id = id;
this->x = x; this->x = x;
@ -53,22 +53,28 @@ void TeleportEntityPacket::read(DataInputStream *dis) //throws IOException
xRot = (uint8_t) dis->read(); xRot = (uint8_t) dis->read();
} }
void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException
{ {
dos->writeShort((short)id); dos->writeShort(id);
#ifdef _LARGE_WORLDS
dos->writeInt(x); dos->writeInt(x);
dos->writeInt(y); dos->writeInt(y);
dos->writeInt(z); dos->writeInt(z);
#else
dos->writeShort(x);
dos->writeShort(y);
dos->writeShort(z);
#endif
dos->write(yRot); dos->write(yRot);
dos->write(xRot); dos->write(xRot);
} }
void TeleportEntityPacket::handle(PacketListener *listener) void TeleportEntityPacket::handle(PacketListener *listener)
{ {
listener->handleTeleportEntity(shared_from_this()); listener->handleTeleportEntity(shared_from_this());
} }
int TeleportEntityPacket::getEstimatedSize() int TeleportEntityPacket::getEstimatedSize()
{ {
return 2 + 2 + 2 + 2 + 1 + 1; return 2 + 2 + 2 + 2 + 1 + 1;
} }

View file

@ -7,19 +7,19 @@ class TeleportEntityPacket : public Packet, public std::enable_shared_from_this<
{ {
public: public:
int id; int id;
int32_t x, y, z; int x, y, z;
uint8_t yRot, xRot; uint8_t yRot, xRot;
TeleportEntityPacket(); TeleportEntityPacket();
TeleportEntityPacket(std::shared_ptr<Entity> e); TeleportEntityPacket(std::shared_ptr<Entity> e);
TeleportEntityPacket(int id, int32_t x, int32_t y, int32_t z, uint8_t yRot, uint8_t xRot); TeleportEntityPacket(int id, int x, int y, int z, uint8_t yRot, uint8_t xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
virtual void handle(PacketListener *listener); virtual void handle(PacketListener *listener);
virtual int getEstimatedSize(); virtual int getEstimatedSize();
virtual bool canBeInvalidated(); virtual bool canBeInvalidated();
virtual bool isInvalidatedBy(std::shared_ptr<Packet> packet); virtual bool isInvalidatedBy(std::shared_ptr<Packet> packet);
public: public:
static std::shared_ptr<Packet> create() { return std::shared_ptr<Packet>(new TeleportEntityPacket()); } static std::shared_ptr<Packet> create() { return std::shared_ptr<Packet>(new TeleportEntityPacket()); }