diff options
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateMask.h | 116 |
2 files changed, 59 insertions, 59 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 8f89e58ad5a..893d4c1ea69 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -509,7 +509,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* WPAssert(updateMask && updateMask->GetCount() == m_valuesCount); *data << (uint8)updateMask->GetBlockCount(); - data->append(updateMask->GetMask(), updateMask->GetLength()); + updateMask->AppendToPacket(data); // 2 specialized loops for speed optimization in non-unit case if (isType(TYPEMASK_UNIT)) // unit (creature/player) case diff --git a/src/server/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h index 784c4eba96f..8be8dfecdaf 100644 --- a/src/server/game/Entities/Object/Updates/UpdateMask.h +++ b/src/server/game/Entities/Object/Updates/UpdateMask.h @@ -21,106 +21,106 @@ #include "UpdateFields.h" #include "Errors.h" +#include "ByteBuffer.h" class UpdateMask { public: - UpdateMask() : mCount(0), mBlocks(0), mUpdateMask(0) { } - UpdateMask(UpdateMask const& mask) : mUpdateMask(0) { *this = mask; } + /// Type representing how client reads update mask + typedef uint32 ClientUpdateMaskType; - ~UpdateMask() + enum UpdateMaskCount { - delete[] mUpdateMask; - } + CLIENT_UPDATE_MASK_BITS = sizeof(ClientUpdateMaskType) * 8, + }; - void SetBit(uint32 index) - { - ((uint8*)mUpdateMask)[index >> 3] |= 1 << (index & 0x7); - } + UpdateMask() : _fieldCount(0), _blockCount(0), _bits(NULL) { } - void UnsetBit(uint32 index) + UpdateMask(UpdateMask const& right) { - ((uint8*)mUpdateMask)[index >> 3] &= (0xff ^ (1 << (index & 0x7))); + SetCount(right.GetCount()); + memcpy(_bits, right._bits, sizeof(uint8) * _blockCount * 32); } - bool GetBit(uint32 index) const + ~UpdateMask() { delete[] _bits; } + + void SetBit(uint32 index) { _bits[index] = 1; } + void UnsetBit(uint32 index) { _bits[index] = 0; } + bool GetBit(uint32 index) const { return _bits[index] != 0; } + + void AppendToPacket(ByteBuffer* data) { - return (((uint8*)mUpdateMask)[index >> 3] & (1 << (index & 0x7))) != 0; + for (uint32 i = 0; i < GetBlockCount(); ++i) + { + ClientUpdateMaskType maskPart = 0; + for (uint32 j = 0; j < CLIENT_UPDATE_MASK_BITS; ++j) + if (_bits[CLIENT_UPDATE_MASK_BITS * i + j]) + maskPart |= 1 << j; + + *data << maskPart; + } } - uint32 GetBlockCount() const { return mBlocks; } - uint32 GetLength() const { return mBlocks << 2; } - uint32 GetCount() const { return mCount; } - uint8* GetMask() { return (uint8*)mUpdateMask; } + uint32 GetBlockCount() const { return _blockCount; } + uint32 GetCount() const { return _fieldCount; } - void SetCount (uint32 valuesCount) + void SetCount(uint32 valuesCount) { - delete [] mUpdateMask; + delete[] _bits; - mCount = valuesCount; - mBlocks = (valuesCount + 31) / 32; + _fieldCount = valuesCount; + _blockCount = (valuesCount + CLIENT_UPDATE_MASK_BITS - 1) / CLIENT_UPDATE_MASK_BITS; - mUpdateMask = new uint32[mBlocks]; - memset(mUpdateMask, 0, mBlocks << 2); + _bits = new uint8[_blockCount * CLIENT_UPDATE_MASK_BITS]; + memset(_bits, 0, sizeof(uint8) * _blockCount * CLIENT_UPDATE_MASK_BITS); } void Clear() { - if (mUpdateMask) - memset(mUpdateMask, 0, mBlocks << 2); + if (_bits) + memset(_bits, 0, sizeof(uint8) * _blockCount * CLIENT_UPDATE_MASK_BITS); } - UpdateMask& operator=(UpdateMask const& mask) + UpdateMask& operator=(UpdateMask const& right) { - if (this == &mask) + if (this == &right) return *this; - SetCount(mask.mCount); - memcpy(mUpdateMask, mask.mUpdateMask, mBlocks << 2); - + SetCount(right.GetCount()); + memcpy(_bits, right._bits, sizeof(uint8) * _blockCount * CLIENT_UPDATE_MASK_BITS); return *this; } - void operator&=(UpdateMask const& mask) + UpdateMask& operator&=(UpdateMask const& right) { - ASSERT(mask.mCount <= mCount); - for (uint32 i = 0; i < mBlocks; ++i) - mUpdateMask[i] &= mask.mUpdateMask[i]; - } + ASSERT(right.GetCount() <= GetCount()); + for (uint32 i = 0; i < _fieldCount; ++i) + _bits[i] &= right._bits[i]; - void operator|=(UpdateMask const& mask) - { - ASSERT(mask.mCount <= mCount); - for (uint32 i = 0; i < mBlocks; ++i) - mUpdateMask[i] |= mask.mUpdateMask[i]; + return *this; } - UpdateMask operator&(UpdateMask const& mask) const + UpdateMask& operator|=(UpdateMask const& right) { - ASSERT(mask.mCount <= mCount); + ASSERT(right.GetCount() <= GetCount()); + for (uint32 i = 0; i < _fieldCount; ++i) + _bits[i] |= right._bits[i]; - UpdateMask newmask; - newmask = *this; - newmask &= mask; - - return newmask; + return *this; } - UpdateMask operator|(UpdateMask const& mask) const + UpdateMask operator|(UpdateMask const& right) { - ASSERT(mask.mCount <= mCount); - - UpdateMask newmask; - newmask = *this; - newmask |= mask; - - return newmask; + UpdateMask ret(*this); + ret |= right; + return ret; } private: - uint32 mCount; - uint32 mBlocks; - uint32 *mUpdateMask; + uint32 _fieldCount; + uint32 _blockCount; + uint8* _bits; }; + #endif |