From 38124bcce3c5e8ed8e4dba904dc4f15f89a82c14 Mon Sep 17 00:00:00 2001 From: Howaner Date: Mon, 8 Sep 2014 12:24:06 +0200 Subject: [PATCH] Updated chunk sending to 1.8 --- src/Protocol/ChunkDataSerializer.cpp | 17 +++++++++-------- src/Protocol/Protocol17x.cpp | 12 ++++++------ src/Protocol/Protocol18x.cpp | 17 +++++++---------- src/Protocol/Protocol18x.h | 2 -- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/Protocol/ChunkDataSerializer.cpp b/src/Protocol/ChunkDataSerializer.cpp index a2e0c9ef9..d4574954e 100644 --- a/src/Protocol/ChunkDataSerializer.cpp +++ b/src/Protocol/ChunkDataSerializer.cpp @@ -182,25 +182,26 @@ void cChunkDataSerializer::Serialize80(AString & a_Data, int a_ChunkX, int a_Chu // TODO: Do not copy data and then compress it; rather, compress partial blocks of data (zlib *can* stream) // Blocktypes converter (1.8 included the meta into the blocktype): - /*unsigned short Blocks[ARRAYCOUNT(m_BlockTypes)]; + unsigned char Blocks[cChunkDef::NumBlocks * 2]; + size_t LastOffset = 0; for (size_t Index = 0; Index < cChunkDef::NumBlocks; Index++) { - BLOCKTYPE BlockType = m_BlockTypes[Index]; + BLOCKTYPE BlockType = m_BlockTypes[Index] & 0xFF; NIBBLETYPE BlockMeta = m_BlockMetas[Index / 2] >> ((Index & 1) * 4) & 0x0f; - Blocks[Index] = ((unsigned short)BlockType << 4) | ((unsigned short)BlockMeta); - }*/ + Blocks[LastOffset] = (BlockType << 4) | ((unsigned char)BlockMeta); + Blocks[LastOffset + 1] = (unsigned char)BlockType >> 4; + LastOffset += 2; + } const int BiomeDataSize = cChunkDef::Width * cChunkDef::Width; - const int MetadataOffset = sizeof(m_BlockTypes); - const int BlockLightOffset = MetadataOffset + sizeof(m_BlockMetas); + const int BlockLightOffset = sizeof(Blocks); const int SkyLightOffset = BlockLightOffset + sizeof(m_BlockLight); const int BiomeOffset = SkyLightOffset + sizeof(m_BlockSkyLight); const int DataSize = BiomeOffset + BiomeDataSize; // Temporary buffer for the composed data: char AllData [DataSize]; - memcpy(AllData, m_BlockTypes, sizeof(m_BlockTypes)); - memcpy(AllData + MetadataOffset, m_BlockMetas, sizeof(m_BlockMetas)); + memcpy(AllData, Blocks, sizeof(Blocks)); memcpy(AllData + BlockLightOffset, m_BlockLight, sizeof(m_BlockLight)); memcpy(AllData + SkyLightOffset, m_BlockSkyLight, sizeof(m_BlockSkyLight)); memcpy(AllData + BiomeOffset, m_BiomeData, BiomeDataSize); diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index e34a61818..34bfbc82b 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1503,14 +1503,14 @@ void cProtocol172::AddReceivedData(const char * a_Data, size_t a_Size) ); m_CommLogFile.Flush(); } - + if (!m_ReceivedData.Write(a_Data, a_Size)) { // Too much data in the incoming queue, report to caller: m_Client->PacketBufferFull(); return; } - + // Handle all complete packets: for (;;) { @@ -1530,10 +1530,7 @@ void cProtocol172::AddReceivedData(const char * a_Data, size_t a_Size) cByteBuffer bb(PacketLen + 1); VERIFY(m_ReceivedData.ReadToByteBuffer(bb, (int)PacketLen)); m_ReceivedData.CommitRead(); - - // Write one NUL extra, so that we can detect over-reads - bb.Write("\0", 1); - + // 1.8 - Compressed packets if ((m_State == 3) && (GetProtocolVersion() == cProtocolRecognizer::PROTO_VERSION_1_8_0)) { @@ -1544,6 +1541,9 @@ void cProtocol172::AddReceivedData(const char * a_Data, size_t a_Size) break; } } + + // Write one NUL extra, so that we can detect over-reads + bb.Write("\0", 1); UInt32 PacketType; if (!bb.ReadVarInt(PacketType)) diff --git a/src/Protocol/Protocol18x.cpp b/src/Protocol/Protocol18x.cpp index 302fcc836..386e3dfb2 100644 --- a/src/Protocol/Protocol18x.cpp +++ b/src/Protocol/Protocol18x.cpp @@ -121,7 +121,7 @@ void cProtocol180::SendPlayerMoveLook(void) { ASSERT(m_State == 3); // In game mode? - /*cPacketizer Pkt(*this, 0x08); // Player Position And Look packet + cPacketizer Pkt(*this, 0x08); // Player Position And Look packet cPlayer * Player = m_Client->GetPlayer(); Pkt.WriteDouble(Player->GetPosX()); @@ -131,7 +131,7 @@ void cProtocol180::SendPlayerMoveLook(void) Pkt.WriteDouble(Player->GetPosZ()); Pkt.WriteFloat((float)Player->GetYaw()); Pkt.WriteFloat((float)Player->GetPitch()); - Pkt.WriteByte(0);*/ + Pkt.WriteByte(0); } @@ -168,12 +168,12 @@ void cProtocol180::SendEntityVelocity(const cEntity & a_Entity) { ASSERT(m_State == 3); // In game mode? - /*cPacketizer Pkt(*this, 0x12); // Entity Velocity packet + cPacketizer Pkt(*this, 0x12); // Entity Velocity packet Pkt.WriteVarInt(a_Entity.GetUniqueID()); // 400 = 8000 / 20 ... Conversion from our speed in m/s to 8000 m/tick Pkt.WriteShort((short)(a_Entity.GetSpeedX() * 400)); Pkt.WriteShort((short)(a_Entity.GetSpeedY() * 400)); - Pkt.WriteShort((short)(a_Entity.GetSpeedZ() * 400));*/ + Pkt.WriteShort((short)(a_Entity.GetSpeedZ() * 400)); } @@ -395,9 +395,9 @@ void cProtocol180::SendPluginMessage(const AString & a_Channel, const AString & { ASSERT(m_State == 3); // In game mode? - /*cPacketizer Pkt(*this, 0x3f); + cPacketizer Pkt(*this, 0x3f); Pkt.WriteString(a_Channel); - Pkt.WriteBuf(a_Message.data(), a_Message.size());*/ + Pkt.WriteBuf(a_Message.data(), a_Message.size()); } @@ -672,10 +672,7 @@ void cProtocol180::HandlePacketPluginMessage(cByteBuffer & a_ByteBuffer) { HANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Channel); AString Data; - if (!a_ByteBuffer.ReadString(Data, a_ByteBuffer.GetReadableSpace() - 1)) - { - return; - } + a_ByteBuffer.ReadAll(Data); m_Client->HandlePluginMessage(Channel, Data); } diff --git a/src/Protocol/Protocol18x.h b/src/Protocol/Protocol18x.h index d64742939..d9fd5d573 100644 --- a/src/Protocol/Protocol18x.h +++ b/src/Protocol/Protocol18x.h @@ -56,8 +56,6 @@ public: virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override; virtual void SendLoginSuccess (void) override; - virtual void SendPlayerAbilities (void) override {} - virtual void SendWindowClose (const cWindow & a_Window) override {} virtual void SendPickupSpawn (const cPickup & a_Pickup) override {} virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override {} virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override {}