From 4dda2a5c2bf594a401f591095faf2c7e8ba19a7d Mon Sep 17 00:00:00 2001 From: faketruth Date: Fri, 2 Mar 2012 01:22:06 +0000 Subject: [PATCH] MultiBlock packet is working partly.. I really don't understand what's wrong with this packet :/ git-svn-id: http://mc-server.googlecode.com/svn/trunk@351 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/cChunk.cpp | 13 +++++++++++++ source/packets/cPacket_MapChunk.cpp | 5 +++-- source/packets/cPacket_MultiBlock.cpp | 17 +++++++++++++++++ source/packets/cPacket_MultiBlock.h | 21 +++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/source/cChunk.cpp b/source/cChunk.cpp index 7e79fc80..9a18ab0f 100644 --- a/source/cChunk.cpp +++ b/source/cChunk.cpp @@ -341,9 +341,14 @@ void cChunk::Tick(float a_Dt, MTRand & a_TickRandom) MultiBlock.m_ChunkX = m_PosX; MultiBlock.m_ChunkZ = m_PosZ; MultiBlock.m_NumBlocks = (short)PendingSendBlocks; +#if (MINECRAFT_1_2_2 == 1) + MultiBlock.m_Data = new cPacket_MultiBlock::sBlockChange[ PendingSendBlocks ]; + MultiBlock.m_DataSize = PendingSendBlocks * sizeof( cPacket_MultiBlock::sBlockChange ); +#else MultiBlock.m_BlockCoordinates = new unsigned short[PendingSendBlocks]; MultiBlock.m_BlockTypes = new char[PendingSendBlocks]; MultiBlock.m_BlockMetas = new char[PendingSendBlocks]; +#endif //LOG("Sending multiblock packet for %i blocks", PendingSendBlocks ); for( unsigned int i = 0; i < PendingSendBlocks; i++) { @@ -352,10 +357,18 @@ void cChunk::Tick(float a_Dt, MTRand & a_TickRandom) unsigned int Z = (index / 128) % 16; unsigned int X = (index / (128*16)); +#if (MINECRAFT_1_2_2 == 1) + unsigned int Coords = Z | (X << 4) | (Y << 8); + unsigned int Blocks = E_BLOCK_DIRT;//E_BLOCK_STONE; + MultiBlock.m_Data[i].Data = Coords | (E_BLOCK_STONE) << 16; +// MultiBlock.m_Data[i].Coords = E_BLOCK_STONE;//(Z&0xf) | (X&0xf)<<4 | (Y&0xff)<<8;//(Y&0xff) | (Z&0xf) << 8 | (X&0xf) << 12; + +#else MultiBlock.m_BlockCoordinates[i] = (Z&0xf) | (X&0xf)<<4 | (Y&0xff)<<8; //LOG("X: %i Y: %i Z: %i Combo: 0x%04x", X, Y, Z, MultiBlock.m_BlockCoordinates[i] ); MultiBlock.m_BlockTypes[i] = m_BlockType[index]; MultiBlock.m_BlockMetas[i] = GetLight( m_BlockMeta, index ); +#endif } m_PendingSendBlocks.clear(); PendingSendBlocks = m_PendingSendBlocks.size(); diff --git a/source/packets/cPacket_MapChunk.cpp b/source/packets/cPacket_MapChunk.cpp index 99afd9a4..e9ebf835 100644 --- a/source/packets/cPacket_MapChunk.cpp +++ b/source/packets/cPacket_MapChunk.cpp @@ -49,9 +49,10 @@ cPacket_MapChunk::cPacket_MapChunk(cChunk * a_Chunk) AllData[iterator] = a_Chunk->GetBlock( x, y+i*16, z ); ++iterator; } - - //iterator+=2048*2; // Ignore light and stuff } + //TODO: Send block metadata + //TODO: Send block light + //TODO: Send sky light uLongf CompressedSize = compressBound( DataSize ); char * CompressedBlockData = new char[CompressedSize]; diff --git a/source/packets/cPacket_MultiBlock.cpp b/source/packets/cPacket_MultiBlock.cpp index dbdc11c0..2c9165d0 100644 --- a/source/packets/cPacket_MultiBlock.cpp +++ b/source/packets/cPacket_MultiBlock.cpp @@ -13,12 +13,20 @@ cPacket_MultiBlock::cPacket_MultiBlock( const cPacket_MultiBlock & a_Copy ) m_ChunkX = a_Copy.m_ChunkX; m_ChunkZ = a_Copy.m_ChunkZ; m_NumBlocks = a_Copy.m_NumBlocks; + +#if (MINECRAFT_1_2_2 == 1) + m_DataSize = a_Copy.m_DataSize; + + m_Data = new sBlockChange[m_NumBlocks]; + memcpy( m_Data, a_Copy.m_Data, sizeof(sBlockChange)*m_NumBlocks ); +#else m_BlockCoordinates = new unsigned short[m_NumBlocks]; memcpy( m_BlockCoordinates, a_Copy.m_BlockCoordinates, sizeof(short)*m_NumBlocks ); m_BlockTypes = new char[m_NumBlocks]; memcpy( m_BlockTypes, a_Copy.m_BlockTypes, m_NumBlocks ); m_BlockMetas = new char[m_NumBlocks]; memcpy( m_BlockMetas, a_Copy.m_BlockMetas, m_NumBlocks ); +#endif } @@ -27,9 +35,13 @@ cPacket_MultiBlock::cPacket_MultiBlock( const cPacket_MultiBlock & a_Copy ) cPacket_MultiBlock::~cPacket_MultiBlock() { +#if (MINECRAFT_1_2_2 == 1) + delete [] m_Data; +#else if( m_BlockCoordinates ) delete [] m_BlockCoordinates; if( m_BlockTypes ) delete [] m_BlockTypes; if( m_BlockMetas ) delete [] m_BlockMetas; +#endif } @@ -43,9 +55,14 @@ void cPacket_MultiBlock::Serialize(AString & a_Data) const AppendInteger(a_Data, m_ChunkZ); AppendShort (a_Data, m_NumBlocks); +#if (MINECRAFT_1_2_2 == 1) + AppendInteger(a_Data, m_DataSize); + AppendData (a_Data, (const char*)m_Data, m_DataSize); +#else AppendData (a_Data, (char *)m_BlockCoordinates, sizeof(short) * m_NumBlocks); AppendData (a_Data, m_BlockTypes, m_NumBlocks); AppendData (a_Data, m_BlockMetas, m_NumBlocks); +#endif } diff --git a/source/packets/cPacket_MultiBlock.h b/source/packets/cPacket_MultiBlock.h index aeabbbfe..cd2e5b8f 100644 --- a/source/packets/cPacket_MultiBlock.h +++ b/source/packets/cPacket_MultiBlock.h @@ -10,13 +10,28 @@ class cPacket_MultiBlock : public cPacket { public: + struct sBlockChange + { + sBlockChange() + : Data( 0 ) + {} + unsigned int Data; +// short Data; // 4bits metadata ... 12bits block ID +// short Coords; // 8bits Y ... 4bits Z ... 4bits X + }; + cPacket_MultiBlock() : m_ChunkX( 0 ) , m_ChunkZ( 0 ) , m_NumBlocks( 0 ) +#if (MINECRAFT_1_2_2 == 1) + , m_DataSize( 0 ) + , m_Data( 0 ) +#else , m_BlockCoordinates( 0 ) , m_BlockTypes( 0 ) , m_BlockMetas( 0 ) +#endif { m_PacketID = E_MULTI_BLOCK; } cPacket_MultiBlock( const cPacket_MultiBlock & a_Copy ); ~cPacket_MultiBlock(); @@ -28,11 +43,17 @@ public: int m_ChunkZ; short m_NumBlocks; +#if (MINECRAFT_1_2_2 == 1) + int m_DataSize; // Should be 4*m_NumBlocks ?? + sBlockChange* m_Data; + static const unsigned int cSize = 1 + 4 + 4 + 2 + 4; // Minimum size (when NumBlocks == 0) +#else static const unsigned int c_Size = 1 + 4 + 4 + 2; // Minimum size (when NumBlocks == 0) unsigned short* m_BlockCoordinates; // x<<12 | z<<8 | y char* m_BlockTypes; char* m_BlockMetas; +#endif };