aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/TileUpdatePacket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/TileUpdatePacket.cpp')
-rw-r--r--Minecraft.World/TileUpdatePacket.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/Minecraft.World/TileUpdatePacket.cpp b/Minecraft.World/TileUpdatePacket.cpp
new file mode 100644
index 00000000..6ca37faf
--- /dev/null
+++ b/Minecraft.World/TileUpdatePacket.cpp
@@ -0,0 +1,92 @@
+#include "stdafx.h"
+#include <iostream>
+#include "InputOutputStream.h"
+#include "net.minecraft.world.level.h"
+#include "PacketListener.h"
+#include "TileUpdatePacket.h"
+#include "Dimension.h"
+
+
+
+TileUpdatePacket::TileUpdatePacket()
+{
+ shouldDelay = true;
+}
+
+TileUpdatePacket::TileUpdatePacket(int x, int y, int z, Level *level)
+{
+ shouldDelay = true;
+ this->x = x;
+ this->y = y;
+ this->z = z;
+ block = level->getTile(x, y, z);
+ data = level->getData(x, y, z);
+ levelIdx = ( ( level->dimension->id == 0 ) ? 0 : ( (level->dimension->id == -1) ? 1 : 2 ) );
+}
+
+void TileUpdatePacket::read(DataInputStream *dis) //throws IOException
+{
+#ifdef _LARGE_WORLDS
+ x = dis->readInt();
+ y = dis->read();
+ z = dis->readInt();
+
+ block = (int)dis->readShort() & 0xffff;
+
+ BYTE dataLevel = dis->readByte();
+ data = dataLevel & 0xf;
+ levelIdx = (dataLevel>>4) & 0xf;
+#else
+ // 4J - See comments in write for packing
+ int xyzdata = dis->readInt();
+ x = ( xyzdata >> 22 ) & 0x3ff;
+ y = ( xyzdata >> 14 ) & 0xff;
+ z = ( xyzdata >> 4 ) & 0x3ff;
+ x = ( x << 22 ) >> 22;
+ z = ( z << 22 ) >> 22;
+ data = xyzdata & 0xf;
+ block = (int)dis->readShort() & 0xffff;
+ //levelIdx = ( xyzdata >> 31 ) & 1;
+
+ // Can't pack this as it's now 2 bits
+ levelIdx = (int)dis->readByte();
+#endif
+}
+
+void TileUpdatePacket::write(DataOutputStream *dos) //throws IOException
+{
+#ifdef _LARGE_WORLDS
+ dos->writeInt(x);
+ dos->write(y);
+ dos->writeInt(z);
+ dos->writeShort(block);
+
+ BYTE dataLevel = ((levelIdx & 0xf ) << 4) | (data & 0xf);
+ dos->writeByte(dataLevel);
+#else
+ // 4J - for our fixed size map, we can pack x & z into 10 bits each (-512 -> 511), y into 8 bits (0 to 255)
+ // block type could really be 7 bits but leaving that as 8 for future ease of expansion. Data only needs to be 4-bits as that is how it
+ // is ultimately stored
+ int xyzdata = ( ( x & 0x3ff ) << 22 ) | ( ( y & 0xff ) << 14 ) | ( ( z & 0x3ff ) << 4 ) | ( data & 0xf);
+ //xyzdata |= levelIdx << 31;
+ dos->writeInt(xyzdata);
+ dos->writeShort(block);
+
+ // Can't pack this as it's now 2 bits
+ dos->write(levelIdx);
+#endif
+}
+
+void TileUpdatePacket::handle(PacketListener *listener)
+{
+ listener->handleTileUpdate(shared_from_this());
+}
+
+int TileUpdatePacket::getEstimatedSize()
+{
+#ifdef _LARGE_WORLDS
+ return 12;
+#else
+ return 5;
+#endif
+}