aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-07-10 00:11:19 +0200
committerShauren <shauren.trinity@gmail.com>2016-07-10 00:11:19 +0200
commita78aa3cf4ef3f33903ec9f06d8fdc46e81c51cb3 (patch)
tree3c94170a7b7c2a17ee8d30517388036d577301a5 /src
parentdd20865cd7014c42146ea0c0ade511a9791dcc2a (diff)
Core/PacketIO: Refactored building SMSG_UPDATE_OBJECT to append directly to final buffer and removed UpdateMask class
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp1
-rw-r--r--src/server/game/Entities/Creature/Creature.h1
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp1
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp32
-rw-r--r--src/server/game/Entities/Item/Item.cpp62
-rw-r--r--src/server/game/Entities/Item/Item.h3
-rw-r--r--src/server/game/Entities/Object/Object.cpp149
-rw-r--r--src/server/game/Entities/Object/Object.h8
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateMask.h147
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp45
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp1
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp1
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp1
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp1
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp1
-rw-r--r--src/server/game/Spells/Spell.cpp1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp1
-rw-r--r--src/server/game/Tools/PlayerDump.cpp1
19 files changed, 141 insertions, 318 deletions
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index 6e0aa99e1c1..d09b417a0b5 100644
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -19,7 +19,6 @@
#include "Common.h"
#include "Corpse.h"
#include "Player.h"
-#include "UpdateMask.h"
#include "ObjectAccessor.h"
#include "DatabaseEnv.h"
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 6e723a29191..449e9e2f35f 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -21,7 +21,6 @@
#include "Common.h"
#include "Unit.h"
-#include "UpdateMask.h"
#include "ItemTemplate.h"
#include "LootMgr.h"
#include "DatabaseEnv.h"
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index 25684b44db6..793bbcd656e 100644
--- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
@@ -17,7 +17,6 @@
*/
#include "Common.h"
-#include "UpdateMask.h"
#include "Opcodes.h"
#include "World.h"
#include "ObjectAccessor.h"
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index ee7241a02d7..fd538c31809 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -34,6 +34,7 @@
#include "UpdateFieldFlags.h"
#include "World.h"
#include "Transport.h"
+#include <boost/dynamic_bitset.hpp>
GameObject::GameObject() : WorldObject(false), MapObject(),
m_model(NULL), m_goValue(), m_AI(NULL), _animKitId(0)
@@ -2299,23 +2300,24 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
bool forcedFlags = GetGoType() == GAMEOBJECT_TYPE_CHEST && GetGOInfo()->chest.usegrouplootrules && HasLootRecipient();
bool targetIsGM = target->IsGameMaster();
- ByteBuffer fieldBuffer;
-
- UpdateMask updateMask;
- updateMask.SetCount(m_valuesCount);
+ boost::dynamic_bitset<uint32> updateMask(m_valuesCount);
uint32* flags = GameObjectUpdateFieldFlags;
uint32 visibleFlag = UF_FLAG_PUBLIC;
if (GetOwnerGUID() == target->GetGUID())
visibleFlag |= UF_FLAG_OWNER;
+ *data << uint8(updateMask.num_blocks());
+ std::size_t maskPos = data->wpos();
+ data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+
for (uint16 index = 0; index < m_valuesCount; ++index)
{
if (_fieldNotifyFlags & flags[index] ||
- ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
+ ((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
(index == GAMEOBJECT_FLAGS && forcedFlags))
{
- updateMask.SetBit(index);
+ updateMask.set(index);
if (index == OBJECT_DYNAMIC_FLAGS)
{
@@ -2352,8 +2354,8 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
break;
}
- fieldBuffer << uint16(dynFlags);
- fieldBuffer << int16(pathProgress);
+ *data << uint16(dynFlags);
+ *data << int16(pathProgress);
}
else if (index == GAMEOBJECT_FLAGS)
{
@@ -2362,14 +2364,14 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
if (GetGOInfo()->chest.usegrouplootrules && !IsLootAllowedFor(target))
goFlags |= GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE;
- fieldBuffer << goFlags;
+ *data << goFlags;
}
else if (index == GAMEOBJECT_LEVEL)
{
if (isStoppableTransport)
- fieldBuffer << uint32(m_goValue.Transport.PathProgress);
+ *data << uint32(m_goValue.Transport.PathProgress);
else
- fieldBuffer << m_uint32Values[index];
+ *data << m_uint32Values[index];
}
else if (index == GAMEOBJECT_BYTES_1)
{
@@ -2383,16 +2385,14 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
}
}
- fieldBuffer << bytes1;
+ *data << bytes1;
}
else
- fieldBuffer << m_uint32Values[index]; // other cases
+ *data << m_uint32Values[index]; // other cases
}
}
- *data << uint8(updateMask.GetBlockCount());
- updateMask.AppendToPacket(data);
- data->append(fieldBuffer);
+ boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void GameObject::GetRespawnPosition(float &x, float &y, float &z, float* ori /* = NULL*/) const
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 47e711c33cd..20efd3ae93d 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -31,6 +31,7 @@
#include "WorldSession.h"
#include "ItemPackets.h"
#include "TradeData.h"
+#include <boost/dynamic_bitset.hpp>
void AddItemsSetItem(Player* player, Item* item)
{
@@ -247,7 +248,6 @@ Item::Item()
m_paidMoney = 0;
m_paidExtendedCost = 0;
- memset(_modifiers, 0, sizeof(_modifiers));
memset(&_bonusData, 0, sizeof(_bonusData));
}
@@ -1128,60 +1128,59 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player*
if (!target)
return;
- ByteBuffer fieldBuffer;
- UpdateMask updateMask;
- updateMask.SetCount(_dynamicValuesCount);
+ boost::dynamic_bitset<uint32> updateMask(_dynamicValuesCount);
uint32* flags = nullptr;
uint32 visibleFlag = GetDynamicUpdateFieldData(target, flags);
+ *data << uint8(updateMask.num_blocks());
+ std::size_t maskPos = data->wpos();
+ data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+
for (uint16 index = 0; index < _dynamicValuesCount; ++index)
{
- ByteBuffer buffer;
std::vector<uint32> const& values = _dynamicValues[index];
if (_fieldNotifyFlags & flags[index] ||
- ((updateType == UPDATETYPE_VALUES ? _dynamicChangesMask.GetBit(index) : !values.empty()) && (flags[index] & visibleFlag)) ||
- (index == ITEM_DYNAMIC_FIELD_MODIFIERS && (updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(ITEM_FIELD_MODIFIERS_MASK) : GetUInt32Value(ITEM_FIELD_MODIFIERS_MASK) != 0)))
+ ((updateType == UPDATETYPE_VALUES ? _dynamicChangesMask[index] : !values.empty()) && (flags[index] & visibleFlag)))
{
- updateMask.SetBit(index);
+ updateMask.set(index);
- UpdateMask arrayMask;
+ boost::dynamic_bitset<uint32> arrayMask(values.size());
+ *data << uint8(arrayMask.num_blocks());
+ std::size_t fieldMaskPos = data->wpos();
+ data->resize(data->size() + arrayMask.num_blocks() * sizeof(uint32));
if (index != ITEM_DYNAMIC_FIELD_MODIFIERS)
{
- arrayMask.SetCount(values.size());
for (std::size_t v = 0; v < values.size(); ++v)
{
- if (updateType != UPDATETYPE_VALUES || _dynamicChangesArrayMask[index].GetBit(v))
+ if (updateType == UPDATETYPE_VALUES ? _dynamicChangesArrayMask[index][v] : values[v])
{
- arrayMask.SetBit(v);
- buffer << uint32(values[v]);
+ arrayMask.set(v);
+ *data << uint32(values[v]);
}
}
+
}
else
{
- uint32 count = 0;
- arrayMask.SetCount(MAX_ITEM_MODIFIERS);
- for (uint32 v = 0; v < MAX_ITEM_MODIFIERS; ++v)
+ // in case of ITEM_DYNAMIC_FIELD_MODIFIERS it is ITEM_FIELD_MODIFIERS_MASK that controls index of each value, not updatemask
+ // so we just have to write this starting from 0 index
+ for (std::size_t v = 0, m = 0; v < values.size(); ++v)
{
- if (uint32 modifier = _modifiers[v])
+ if (values[v] || _dynamicChangesArrayMask[index][v])
{
- arrayMask.SetBit(count++);
- buffer << uint32(modifier);
+ arrayMask.set(m++);
+ *data << uint32(values[v]);
}
}
}
- fieldBuffer << uint8(arrayMask.GetBlockCount());
- arrayMask.AppendToPacket(&fieldBuffer);
- fieldBuffer.append(buffer);
+ boost::to_block_range(arrayMask, reinterpret_cast<uint32*>(data->contents() + fieldMaskPos));
}
}
- *data << uint8(updateMask.GetBlockCount());
- updateMask.AppendToPacket(data);
- data->append(fieldBuffer);
+ boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void Item::AddToObjectUpdate()
@@ -1896,16 +1895,15 @@ uint32 Item::GetDisplayId() const
return sDB2Manager.GetItemDisplayId(GetEntry(), GetAppearanceModId());
}
-void Item::SetModifier(ItemModifier modifier, uint32 value)
+uint32 Item::GetModifier(ItemModifier modifier) const
{
- if (_modifiers[modifier] != value)
- {
- _dynamicChangesMask.SetBit(ITEM_DYNAMIC_FIELD_MODIFIERS);
- AddToObjectUpdateIfNeeded();
- }
+ return GetDynamicValues(ITEM_DYNAMIC_FIELD_MODIFIERS)[modifier];
+}
- _modifiers[modifier] = value;
+void Item::SetModifier(ItemModifier modifier, uint32 value)
+{
ApplyModFlag(ITEM_FIELD_MODIFIERS_MASK, 1 << modifier, value != 0);
+ SetDynamicValue(ITEM_DYNAMIC_FIELD_MODIFIERS, modifier, value);
}
uint32 Item::GetVisibleEntry() const
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 44c4e546188..6f96ef670ba 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -439,7 +439,7 @@ class TC_GAME_API Item : public Object
static uint32 GetSellPrice(ItemTemplate const* proto, bool& success);
- uint32 GetModifier(ItemModifier modifier) const { return _modifiers[modifier]; }
+ uint32 GetModifier(ItemModifier modifier) const;
void SetModifier(ItemModifier modifier, uint32 value);
protected:
@@ -457,6 +457,5 @@ class TC_GAME_API Item : public Object
uint32 m_paidMoney;
uint32 m_paidExtendedCost;
GuidSet allowedGUIDs;
- uint32 _modifiers[MAX_ITEM_MODIFIERS];
};
#endif
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 9493df4449c..56538513a92 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -28,7 +28,6 @@
#include "Vehicle.h"
#include "ObjectMgr.h"
#include "UpdateData.h"
-#include "UpdateMask.h"
#include "Util.h"
#include "ObjectAccessor.h"
#include "Transport.h"
@@ -46,6 +45,7 @@
#include "BattlefieldMgr.h"
#include "GameObjectPackets.h"
#include "MiscPackets.h"
+#include <boost/dynamic_bitset.hpp>
Object::Object()
{
@@ -108,15 +108,14 @@ Object::~Object()
void Object::_InitValues()
{
m_uint32Values = new uint32[m_valuesCount];
- memset(m_uint32Values, 0, m_valuesCount*sizeof(uint32));
+ memset(m_uint32Values, 0, m_valuesCount * sizeof(uint32));
- _changesMask.SetCount(m_valuesCount);
-
- _dynamicChangesMask.SetCount(_dynamicValuesCount);
+ _changesMask.resize(m_valuesCount);
+ _dynamicChangesMask.resize(_dynamicValuesCount);
if (_dynamicValuesCount)
{
_dynamicValues = new std::vector<uint32>[_dynamicValuesCount];
- _dynamicChangesArrayMask = new UpdateMask[_dynamicValuesCount];
+ _dynamicChangesArrayMask = new std::vector<uint8>[_dynamicValuesCount];
}
m_objectUpdated = false;
@@ -751,27 +750,27 @@ void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* targe
if (!target)
return;
- ByteBuffer fieldBuffer;
- UpdateMask updateMask;
- updateMask.SetCount(m_valuesCount);
+ boost::dynamic_bitset<uint32> updateMask(m_valuesCount);
uint32* flags = NULL;
uint32 visibleFlag = GetUpdateFieldData(target, flags);
ASSERT(flags);
+ *data << uint8(updateMask.num_blocks());
+ std::size_t maskPos = data->wpos();
+ data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+
for (uint16 index = 0; index < m_valuesCount; ++index)
{
if (_fieldNotifyFlags & flags[index] ||
- ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)))
+ ((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag)))
{
- updateMask.SetBit(index);
- fieldBuffer << m_uint32Values[index];
+ updateMask.set(index);
+ *data << m_uint32Values[index];
}
}
- *data << uint8(updateMask.GetBlockCount());
- updateMask.AppendToPacket(data);
- data->append(fieldBuffer);
+ boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const
@@ -779,42 +778,41 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player
if (!target)
return;
- ByteBuffer fieldBuffer;
- UpdateMask updateMask;
- updateMask.SetCount(_dynamicValuesCount);
+ boost::dynamic_bitset<uint32> updateMask(_dynamicValuesCount);
uint32* flags = nullptr;
uint32 visibleFlag = GetDynamicUpdateFieldData(target, flags);
+ *data << uint8(updateMask.num_blocks());
+ std::size_t maskPos = data->wpos();
+ data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+
for (uint16 index = 0; index < _dynamicValuesCount; ++index)
{
- ByteBuffer buffer;
std::vector<uint32> const& values = _dynamicValues[index];
if (_fieldNotifyFlags & flags[index] ||
- ((updateType == UPDATETYPE_VALUES ? _dynamicChangesMask.GetBit(index) : !values.empty()) && (flags[index] & visibleFlag)))
+ ((updateType == UPDATETYPE_VALUES ? _dynamicChangesMask[index] : !values.empty()) && (flags[index] & visibleFlag)))
{
- updateMask.SetBit(index);
+ updateMask.set(index);
- UpdateMask arrayMask;
- arrayMask.SetCount(values.size());
+ boost::dynamic_bitset<uint32> arrayMask(values.size());
+ *data << uint8(arrayMask.num_blocks());
+ std::size_t fieldMaskPos = data->wpos();
+ data->resize(data->size() + arrayMask.num_blocks() * sizeof(uint32));
for (std::size_t v = 0; v < values.size(); ++v)
{
- if (updateType != UPDATETYPE_VALUES || _dynamicChangesArrayMask[index].GetBit(v))
+ if (updateType == UPDATETYPE_VALUES ? _dynamicChangesArrayMask[index][v] : values[v])
{
- arrayMask.SetBit(v);
- buffer << uint32(values[v]);
+ arrayMask.set(v);
+ *data << uint32(values[v]);
}
}
- fieldBuffer << uint8(arrayMask.GetBlockCount());
- arrayMask.AppendToPacket(&fieldBuffer);
- fieldBuffer.append(buffer);
+ boost::to_block_range(arrayMask, reinterpret_cast<uint32*>(data->contents() + fieldMaskPos));
}
}
- *data << uint8(updateMask.GetBlockCount());
- updateMask.AppendToPacket(data);
- data->append(fieldBuffer);
+ boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void Object::AddToObjectUpdateIfNeeded()
@@ -828,10 +826,10 @@ void Object::AddToObjectUpdateIfNeeded()
void Object::ClearUpdateMask(bool remove)
{
- _changesMask.Clear();
- _dynamicChangesMask.Clear();
+ memset(_changesMask.data(), 0, _changesMask.size());
+ memset(_dynamicChangesMask.data(), 0, _dynamicChangesMask.size());
for (uint32 i = 0; i < _dynamicValuesCount; ++i)
- _dynamicChangesArrayMask[i].Clear();
+ memset(_dynamicChangesArrayMask[i].data(), 0, _dynamicChangesArrayMask[i].size());
if (m_objectUpdated)
{
@@ -976,7 +974,7 @@ void Object::_LoadIntoDataField(std::string const& data, uint32 startOffset, uin
for (uint32 index = 0; index < count; ++index)
{
m_uint32Values[startOffset + index] = atoul(tokens[index]);
- _changesMask.SetBit(startOffset + index);
+ _changesMask[startOffset + index] = 1;
}
}
@@ -987,7 +985,7 @@ void Object::SetInt32Value(uint16 index, int32 value)
if (m_int32Values[index] != value)
{
m_int32Values[index] = value;
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1000,7 +998,7 @@ void Object::SetUInt32Value(uint16 index, uint32 value)
if (m_uint32Values[index] != value)
{
m_uint32Values[index] = value;
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1011,7 +1009,7 @@ void Object::UpdateUInt32Value(uint16 index, uint32 value)
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
m_uint32Values[index] = value;
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
}
void Object::SetUInt64Value(uint16 index, uint64 value)
@@ -1021,8 +1019,8 @@ void Object::SetUInt64Value(uint16 index, uint64 value)
{
m_uint32Values[index] = PAIR64_LOPART(value);
m_uint32Values[index + 1] = PAIR64_HIPART(value);
- _changesMask.SetBit(index);
- _changesMask.SetBit(index + 1);
+ _changesMask[index] = 1;
+ _changesMask[index + 1] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1034,10 +1032,10 @@ bool Object::AddGuidValue(uint16 index, ObjectGuid const& value)
if (!value.IsEmpty() && ((ObjectGuid*)&(m_uint32Values[index]))->IsEmpty())
{
*((ObjectGuid*)&(m_uint32Values[index])) = value;
- _changesMask.SetBit(index);
- _changesMask.SetBit(index + 1);
- _changesMask.SetBit(index + 2);
- _changesMask.SetBit(index + 3);
+ _changesMask[index] = 1;
+ _changesMask[index + 1] = 1;
+ _changesMask[index + 2] = 1;
+ _changesMask[index + 3] = 1;
AddToObjectUpdateIfNeeded();
return true;
@@ -1052,10 +1050,10 @@ bool Object::RemoveGuidValue(uint16 index, ObjectGuid const& value)
if (!value.IsEmpty() && *((ObjectGuid*)&(m_uint32Values[index])) == value)
{
((ObjectGuid*)&(m_uint32Values[index]))->Clear();
- _changesMask.SetBit(index);
- _changesMask.SetBit(index + 1);
- _changesMask.SetBit(index + 2);
- _changesMask.SetBit(index + 3);
+ _changesMask[index] = 1;
+ _changesMask[index + 1] = 1;
+ _changesMask[index + 2] = 1;
+ _changesMask[index + 3] = 1;
AddToObjectUpdateIfNeeded();
return true;
@@ -1071,7 +1069,7 @@ void Object::SetFloatValue(uint16 index, float value)
if (m_floatValues[index] != value)
{
m_floatValues[index] = value;
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1091,7 +1089,7 @@ void Object::SetByteValue(uint16 index, uint8 offset, uint8 value)
{
m_uint32Values[index] &= ~uint32(uint32(0xFF) << (offset * 8));
m_uint32Values[index] |= uint32(uint32(value) << (offset * 8));
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1111,7 +1109,7 @@ void Object::SetUInt16Value(uint16 index, uint8 offset, uint16 value)
{
m_uint32Values[index] &= ~uint32(uint32(0xFFFF) << (offset * 16));
m_uint32Values[index] |= uint32(uint32(value) << (offset * 16));
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1123,10 +1121,10 @@ void Object::SetGuidValue(uint16 index, ObjectGuid const& value)
if (*((ObjectGuid*)&(m_uint32Values[index])) != value)
{
*((ObjectGuid*)&(m_uint32Values[index])) = value;
- _changesMask.SetBit(index);
- _changesMask.SetBit(index + 1);
- _changesMask.SetBit(index + 2);
- _changesMask.SetBit(index + 3);
+ _changesMask[index] = 1;
+ _changesMask[index + 1] = 1;
+ _changesMask[index + 2] = 1;
+ _changesMask[index + 3] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1205,7 +1203,7 @@ void Object::SetFlag(uint16 index, uint32 newFlag)
if (oldval != newval)
{
m_uint32Values[index] = newval;
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1222,7 +1220,7 @@ void Object::RemoveFlag(uint16 index, uint32 oldFlag)
if (oldval != newval)
{
m_uint32Values[index] = newval;
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1262,7 +1260,7 @@ void Object::SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
if (!(uint8(m_uint32Values[index] >> (offset * 8)) & newFlag))
{
m_uint32Values[index] |= uint32(uint32(newFlag) << (offset * 8));
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1281,7 +1279,7 @@ void Object::RemoveByteFlag(uint16 index, uint8 offset, uint8 oldFlag)
if (uint8(m_uint32Values[index] >> (offset * 8)) & oldFlag)
{
m_uint32Values[index] &= ~uint32(uint32(oldFlag) << (offset * 8));
- _changesMask.SetBit(index);
+ _changesMask[index] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -1344,21 +1342,7 @@ std::vector<uint32> const& Object::GetDynamicValues(uint16 index) const
void Object::AddDynamicValue(uint16 index, uint32 value)
{
ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false));
-
- std::vector<uint32>& values = _dynamicValues[index];
- UpdateMask& mask = _dynamicChangesArrayMask[index];
-
- _dynamicChangesMask.SetBit(index);
- if (values.size() >= values.capacity())
- values.reserve(values.capacity() + 32);
-
- values.push_back(value);
- if (mask.GetCount() < values.size())
- mask.AddBlock();
-
- mask.SetBit(values.size() - 1);
-
- AddToObjectUpdateIfNeeded();
+ SetDynamicValue(index, _dynamicValues[index].size(), value);
}
void Object::RemoveDynamicValue(uint16 index, uint32 /*value*/)
@@ -1374,8 +1358,8 @@ void Object::ClearDynamicValue(uint16 index)
if (!_dynamicValues[index].empty())
{
_dynamicValues[index].clear();
- _dynamicChangesMask.SetBit(index);
- _dynamicChangesArrayMask[index].SetCount(0);
+ _dynamicChangesMask[index] = 1;
+ _dynamicChangesArrayMask[index].clear();
AddToObjectUpdateIfNeeded();
}
@@ -1386,14 +1370,17 @@ void Object::SetDynamicValue(uint16 index, uint8 offset, uint32 value)
ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false));
std::vector<uint32>& values = _dynamicValues[index];
+ if (values.size() <= offset)
+ values.resize(offset + 1);
- ASSERT(offset < values.size());
+ if (_dynamicChangesArrayMask[index].size() <= offset)
+ _dynamicChangesArrayMask[index].resize((offset / 32 + 1) * 32);
if (values[offset] != value)
{
values[offset] = value;
- _dynamicChangesMask.SetBit(index);
- _dynamicChangesArrayMask[index].SetBit(offset);
+ _dynamicChangesMask[index] = 1;
+ _dynamicChangesArrayMask[index][offset] = 1;
AddToObjectUpdateIfNeeded();
}
@@ -2137,7 +2124,7 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) co
void Object::ForceValuesUpdateAtIndex(uint32 i)
{
- _changesMask.SetBit(i);
+ _changesMask[i] = 1;
AddToObjectUpdateIfNeeded();
}
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 503555037e1..4492a184895 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -21,10 +21,10 @@
#include "Common.h"
#include "Position.h"
-#include "UpdateMask.h"
#include "GridReference.h"
#include "ObjectDefines.h"
#include "Map.h"
+#include "UpdateFields.h"
#include <set>
#include <string>
@@ -238,9 +238,9 @@ class TC_GAME_API Object
std::vector<uint32>* _dynamicValues;
- UpdateMask _changesMask;
- UpdateMask _dynamicChangesMask;
- UpdateMask* _dynamicChangesArrayMask;
+ std::vector<uint8> _changesMask;
+ std::vector<uint8> _dynamicChangesMask;
+ std::vector<uint8>* _dynamicChangesArrayMask;
uint16 m_valuesCount;
uint16 _dynamicValuesCount;
diff --git a/src/server/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h
deleted file mode 100644
index cadc905ffe1..00000000000
--- a/src/server/game/Entities/Object/Updates/UpdateMask.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __UPDATEMASK_H
-#define __UPDATEMASK_H
-
-#include "UpdateFields.h"
-#include "Errors.h"
-#include "ByteBuffer.h"
-
-class UpdateMask
-{
- public:
- /// Type representing how client reads update mask
- typedef uint32 ClientUpdateMaskType;
-
- enum UpdateMaskCount
- {
- CLIENT_UPDATE_MASK_BITS = sizeof(ClientUpdateMaskType) * 8,
- };
-
- UpdateMask() : _fieldCount(0), _blockCount(0), _bits(NULL) { }
-
- UpdateMask(UpdateMask const& right) : _bits(NULL)
- {
- SetCount(right.GetCount());
- memcpy(_bits, right._bits, sizeof(uint8) * _blockCount * 32);
- }
-
- ~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)
- {
- 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 _blockCount; }
- uint32 GetCount() const { return _fieldCount; }
-
- void SetCount(uint32 valuesCount)
- {
- delete[] _bits;
-
- _fieldCount = valuesCount;
- _blockCount = (valuesCount + CLIENT_UPDATE_MASK_BITS - 1) / CLIENT_UPDATE_MASK_BITS;
-
- if (!valuesCount)
- {
- _bits = nullptr;
- return;
- }
-
- _bits = new uint8[_blockCount * CLIENT_UPDATE_MASK_BITS];
- memset(_bits, 0, sizeof(uint8) * _blockCount * CLIENT_UPDATE_MASK_BITS);
- }
-
- void AddBlock()
- {
- uint8* curr = _bits;
- _fieldCount += CLIENT_UPDATE_MASK_BITS;
- ++_blockCount;
-
- _bits = new uint8[_blockCount * CLIENT_UPDATE_MASK_BITS];
- memset(&_bits[(_blockCount - 1) * CLIENT_UPDATE_MASK_BITS], 0, CLIENT_UPDATE_MASK_BITS);
- if (curr)
- {
- memcpy(_bits, curr, sizeof(uint8) * (_blockCount - 1) * CLIENT_UPDATE_MASK_BITS);
- delete[] curr;
- }
- }
-
- void Clear()
- {
- if (_bits)
- memset(_bits, 0, sizeof(uint8) * _blockCount * CLIENT_UPDATE_MASK_BITS);
- }
-
- UpdateMask& operator=(UpdateMask const& right)
- {
- if (this == &right)
- return *this;
-
- SetCount(right.GetCount());
- memcpy(_bits, right._bits, sizeof(uint8) * _blockCount * CLIENT_UPDATE_MASK_BITS);
- return *this;
- }
-
- UpdateMask& operator&=(UpdateMask const& right)
- {
- ASSERT(right.GetCount() <= GetCount());
- for (uint32 i = 0; i < _fieldCount; ++i)
- _bits[i] &= right._bits[i];
-
- return *this;
- }
-
- UpdateMask& operator|=(UpdateMask const& right)
- {
- ASSERT(right.GetCount() <= GetCount());
- for (uint32 i = 0; i < _fieldCount; ++i)
- _bits[i] |= right._bits[i];
-
- return *this;
- }
-
- UpdateMask operator|(UpdateMask const& right)
- {
- UpdateMask ret(*this);
- ret |= right;
- return ret;
- }
-
- private:
- uint32 _fieldCount;
- uint32 _blockCount;
- uint8* _bits;
-};
-
-#endif
-
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index ad9bc52a335..59584744a2a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -92,7 +92,6 @@
#include "Transport.h"
#include "UpdateData.h"
#include "UpdateFieldFlags.h"
-#include "UpdateMask.h"
#include "Util.h"
#include "VehiclePackets.h"
#include "Weather.h"
@@ -131,7 +130,6 @@ Player::Player(WorldSession* session) : Unit(true)
m_ExtraFlags = 0;
m_spellModTakingSpell = nullptr;
- //m_pad = 0;
// players always accept
if (!GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS))
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 9fba121a4cb..002cc54ebd9 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -70,7 +70,7 @@
#include "VehiclePackets.h"
#include "LootPackets.h"
#include "PartyPackets.h"
-
+#include <boost/dynamic_bitset.hpp>
#include <cmath>
float baseMoveSpeed[MAX_MOVE_TYPE] =
@@ -15743,11 +15743,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
if (!target)
return;
- ByteBuffer fieldBuffer;
- UpdateMask updateMask;
-
uint32 valCount = m_valuesCount;
-
uint32* flags = UnitUpdateFieldFlags;
uint32 visibleFlag = UF_FLAG_PUBLIC;
@@ -15756,7 +15752,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
else if (GetTypeId() == TYPEID_PLAYER)
valCount = PLAYER_FIELD_END_NOT_SELF;
- updateMask.SetCount(valCount);
+ boost::dynamic_bitset<uint32> updateMask(valCount);
Player* plr = GetCharmerOrOwnerPlayerOrPlayerItself();
if (GetOwnerGUID() == target->GetGUID())
@@ -15770,14 +15766,19 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
visibleFlag |= UF_FLAG_PARTY_MEMBER;
Creature const* creature = ToCreature();
+
+ *data << uint8(updateMask.num_blocks());
+ std::size_t maskPos = data->wpos();
+ data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+
for (uint16 index = 0; index < valCount; ++index)
{
if (_fieldNotifyFlags & flags[index] ||
((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
- ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
+ ((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
(index == UNIT_FIELD_AURASTATE && HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK)))
{
- updateMask.SetBit(index);
+ updateMask.set(index);
if (index == UNIT_NPC_FLAGS)
{
@@ -15787,18 +15788,18 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
if (!target->CanSeeSpellClickOn(creature))
appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
- fieldBuffer << uint32(appendValue);
+ *data << uint32(appendValue);
}
else if (index == UNIT_FIELD_AURASTATE)
{
// Check per caster aura states to not enable using a spell in client if specified aura is not by target
- fieldBuffer << BuildAuraStateUpdateForTarget(target);
+ *data << BuildAuraStateUpdateForTarget(target);
}
// FIXME: Some values at server stored in float format but must be sent to client in uint32 format
else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
{
// convert from float to uint32 and send
- fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
+ *data << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
}
// there are some float values which may be negative or can't get negative due to other checks
else if ((index >= UNIT_FIELD_NEGSTAT && index < UNIT_FIELD_NEGSTAT + 5) ||
@@ -15806,7 +15807,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
(index >= UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE && index <= (UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE + 6)) ||
(index >= UNIT_FIELD_POSSTAT && index < UNIT_FIELD_POSSTAT + 5))
{
- fieldBuffer << uint32(m_floatValues[index]);
+ *data << uint32(m_floatValues[index]);
}
// Gamemasters should be always able to select units - remove not selectable flag
else if (index == UNIT_FIELD_FLAGS)
@@ -15815,7 +15816,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
if (target->IsGameMaster())
appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
- fieldBuffer << uint32(appendValue);
+ *data << uint32(appendValue);
}
// use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
else if (index == UNIT_FIELD_DISPLAYID)
@@ -15840,7 +15841,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
displayId = cinfo->GetFirstVisibleModel();
}
- fieldBuffer << uint32(displayId);
+ *data << uint32(displayId);
}
// hide lootable animation for unallowed players
else if (index == OBJECT_DYNAMIC_FLAGS)
@@ -15865,7 +15866,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
if (!HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, target->GetGUID()))
dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
- fieldBuffer << dynamicFlags;
+ *data << dynamicFlags;
}
// FG: pretend that OTHER players in own group are friendly ("blue")
else if (index == UNIT_FIELD_BYTES_2 || index == UNIT_FIELD_FACTIONTEMPLATE)
@@ -15878,28 +15879,26 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
{
if (index == UNIT_FIELD_BYTES_2)
// Allow targetting opposite faction in party when enabled in config
- fieldBuffer << (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8)); // this flag is at uint8 offset 1 !!
+ *data << (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8)); // this flag is at uint8 offset 1 !!
else
// pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
- fieldBuffer << uint32(target->getFaction());
+ *data << uint32(target->getFaction());
}
else
- fieldBuffer << m_uint32Values[index];
+ *data << m_uint32Values[index];
}
else
- fieldBuffer << m_uint32Values[index];
+ *data << m_uint32Values[index];
}
else
{
// send in current format (float as float, uint32 as uint32)
- fieldBuffer << m_uint32Values[index];
+ *data << m_uint32Values[index];
}
}
}
- *data << uint8(updateMask.GetBlockCount());
- updateMask.AppendToPacket(data);
- data->append(fieldBuffer);
+ boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void Unit::DestroyForPlayer(Player* target) const
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 84f91e35720..b32bc623500 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -43,7 +43,6 @@
#include "SpellAuras.h"
#include "SpellMgr.h"
#include "SpellScript.h"
-#include "UpdateMask.h"
#include "Util.h"
#include "Vehicle.h"
#include "World.h"
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index 43a0baa75a7..7e3048f3d93 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -24,7 +24,6 @@
#include "AuctionHouseMgr.h"
#include "Log.h"
#include "Language.h"
-#include "UpdateMask.h"
#include "Util.h"
#include "AccountMgr.h"
#include "AuctionHousePackets.h"
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index c1455d355d7..f7f198809aa 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -49,7 +49,6 @@
#include "SharedDefines.h"
#include "SocialMgr.h"
#include "SystemPackets.h"
-#include "UpdateMask.h"
#include "Util.h"
#include "World.h"
#include "WorldPacket.h"
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index ef1155a38b2..ae8ee2f221a 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -27,7 +27,6 @@
#include "SpellMgr.h"
#include "Player.h"
#include "GossipDef.h"
-#include "UpdateMask.h"
#include "ObjectAccessor.h"
#include "Creature.h"
#include "Pet.h"
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index 0f3dec166c3..85ac5af064c 100644
--- a/src/server/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
@@ -24,7 +24,6 @@
#include "World.h"
#include "ObjectMgr.h"
#include "Player.h"
-#include "UpdateMask.h"
#include "NPCHandler.h"
#include "MapManager.h"
#include "QueryPackets.h"
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 175b921b164..976038a9408 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -24,7 +24,6 @@
#include "GridNotifiersImpl.h"
#include "Opcodes.h"
#include "Log.h"
-#include "UpdateMask.h"
#include "World.h"
#include "ObjectMgr.h"
#include "SpellMgr.h"
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 193cdeb2c8f..b85d334db90 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -21,7 +21,6 @@
#include "WorldPacket.h"
#include "Opcodes.h"
#include "Log.h"
-#include "UpdateMask.h"
#include "World.h"
#include "ObjectMgr.h"
#include "SpellMgr.h"
diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp
index b3417cebc1e..877dcc3a07d 100644
--- a/src/server/game/Tools/PlayerDump.cpp
+++ b/src/server/game/Tools/PlayerDump.cpp
@@ -19,7 +19,6 @@
#include "Common.h"
#include "PlayerDump.h"
#include "DatabaseEnv.h"
-#include "UpdateFields.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "AccountMgr.h"