aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateMask.h116
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