#ifndef UPDATEBLOCK_H #define UPDATEBLOCK_H #include "stdafx.h" class CUpdateBlock { public: inline CUpdateBlock(void *buffer, int maxBits) { char blocks = (char)(maxBits>>5); // changed /32 to >> 5 if(maxBits&31) // %32 --> &31 optimization ++blocks; m_DataSize = 1+(blocks<<2); // *4 --> <<2 m_pData = (char*)buffer; *m_pData = blocks; m_pMask = m_pData+1; m_pValues = m_pData+m_DataSize; // lets just reuse that variable for efficiency m_ValPos = 0; m_pCompressed = NULL; } void AddDataUpdate(int maxBits, unsigned long guid, unsigned long guidHigh) { (*(unsigned long*)m_pBuffer)++; m_pData += m_ValPos; m_pData[0] = 0; m_pData++; *(unsigned long*)m_pData = guid; m_pData += 4; *(unsigned long*)m_pData = guidHigh; m_pData += 4; char blocks = (char)(maxBits>>5); if(maxBits&31) // %32 --> &31 optimization blocks++; *m_pData = blocks; m_pData++; m_DataSize += m_ValPos; m_DataSize += 10+(blocks<<2); //1+blocks*4+9; m_pMask = m_pData; m_pData += blocks<<2; //blocks*4; m_pValues = m_pData; m_ValPos = 0; } inline void ResetBlock(void *buffer, int bufsize) { m_pBuffer = buffer; memset(m_pBuffer, 0, bufsize); if(m_pCompressed != NULL) { free(m_pCompressed); m_pCompressed = NULL; m_CompressedSize = 0; } m_pData = (char*)buffer; *(unsigned long*)m_pData = 0; m_pData += 4; m_DataSize = 4; m_ValPos = 0; } // for data update inline CUpdateBlock(int bufsize, void *buffer) { m_pCompressed = NULL; m_CompressedSize = 0; ResetBlock(buffer, bufsize); } inline CUpdateBlock() { m_pCompressed = NULL; m_CompressedSize = 0; } inline ~CUpdateBlock(void) { if(m_pCompressed != NULL) free(m_pCompressed); } /*inline void SetCreateData(unsigned long MovementFlags, _Location &loc, float facing, float walkSpeed, float runSpeed, float swimSpeed, float turnRate, unsigned long flags) { *(unsigned long*)m_pData = MovementFlags; m_pData += 0x04; *(_Location*)m_pData = loc; m_pData += 0x0C;//+0x10 *(float*)m_pData = facing; m_pData += 0x04;//+0x14 *(float*)m_pData = walkSpeed; m_pData += 0x04;//+0x18 *(float*)m_pData = runSpeed; m_pData += 0x04;//+0x1C *(float*)m_pData = swimSpeed; m_pData += 0x04;//+0x20 *(float*)m_pData = turnRate; m_pData += 0x04;//+0x24 *(unsigned long*)m_pData = flags; m_pData += 0x04;//+0x28 }*/ #define FAdd32(_DataType_) inline void Add(unsigned long nBit, _DataType_ Val)\ {\ SetBit(nBit);\ *((_DataType_*)&m_pValues[m_ValPos]) = Val;\ m_ValPos += 4;\ } FAdd32(int); FAdd32(unsigned long); FAdd32(float); FAdd32(long); FAdd32(unsigned int); #undef FAdd32 inline void Add(unsigned long nBit, unsigned long ValLow, unsigned long ValHigh) { SetBit(nBit); SetBit(nBit+1); *((unsigned long*)&m_pValues[m_ValPos]) = ValLow; m_ValPos += 4; *((unsigned long*)&m_pValues[m_ValPos]) = ValHigh; m_ValPos += 4; } inline unsigned long GetSize() { return m_DataSize + m_ValPos; }; inline int GetCompressedSize() { return m_CompressedSize;}; //inline void* GetBuffer() { return m_pBuffer;}; private: void* m_pBuffer; char* m_pCompressed; int m_CompressedSize; unsigned long m_DataSize; char* m_pData; char* m_pMask; char* m_pValues; int m_ValPos; inline void SetBit(int n) { m_pMask[n >> 3] |= 1 << (n & 0x07); } }; #endif // UPDATEBLOCK_H