diff options
| author | Shauren <shauren.trinity@gmail.com> | 2019-06-03 20:40:34 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-06-08 17:06:57 +0200 |
| commit | 455959c6064af6f7863a6b4b57cb0ef1646bd8ef (patch) | |
| tree | 7d7a7cdd3a44643ee5fc7d19521ced1c8b815c66 /src/server/game/Entities/DynamicObject | |
| parent | 31fda79556e55375962a3c9e46f6dbdbf6e90d18 (diff) | |
Core/PacketIO: Rewrite updatefield handling
Diffstat (limited to 'src/server/game/Entities/DynamicObject')
| -rw-r--r-- | src/server/game/Entities/DynamicObject/DynamicObject.cpp | 52 | ||||
| -rw-r--r-- | src/server/game/Entities/DynamicObject/DynamicObject.h | 13 |
2 files changed, 50 insertions, 15 deletions
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 2ba13daf39b..5947680d131 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -33,15 +33,12 @@ #include "World.h" DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject), - _aura(NULL), _removedAura(NULL), _caster(NULL), _duration(0), _spellXSpellVisualId(0), _isViewpoint(false) + _aura(NULL), _removedAura(NULL), _caster(NULL), _duration(0), _isViewpoint(false) { m_objectType |= TYPEMASK_DYNAMICOBJECT; m_objectTypeId = TYPEID_DYNAMICOBJECT; m_updateFlag.Stationary = true; - - m_valuesCount = DYNAMICOBJECT_END; - _dynamicValuesCount = DYNAMICOBJECT_DYNAMIC_END; } DynamicObject::~DynamicObject() @@ -87,7 +84,6 @@ void DynamicObject::RemoveFromWorld() bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type, uint32 spellXSpellVisualId) { - _spellXSpellVisualId = spellXSpellVisualId; SetMap(caster->GetMap()); Relocate(pos); if (!IsPositionValid()) @@ -101,12 +97,13 @@ bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caste SetEntry(spell->Id); SetObjectScale(1.0f); - SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetGUID()); - SetUInt32Value(DYNAMICOBJECT_TYPE, type); - SetUInt32Value(DYNAMICOBJECT_SPELL_X_SPELL_VISUAL_ID, spellXSpellVisualId); - SetUInt32Value(DYNAMICOBJECT_SPELLID, spell->Id); - SetFloatValue(DYNAMICOBJECT_RADIUS, radius); - SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime()); + auto dynamicObjectData = m_values.ModifyValue(&DynamicObject::m_dynamicObjectData); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Caster), caster->GetGUID()); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Type), type); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellXSpellVisualID), spellXSpellVisualId); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellID), spell->Id); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Radius), radius); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::CastTime), getMSTime()); if (IsWorldObject()) setActive(true); //must before add to map to be put in world container @@ -248,3 +245,36 @@ SpellInfo const* DynamicObject::GetSpellInfo() const { return sSpellMgr->GetSpellInfo(GetSpellId()); } + +void DynamicObject::BuildValuesCreate(ByteBuffer* data, Player const* target) const +{ + UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + std::size_t sizePos = data->wpos(); + *data << uint32(0); + *data << uint8(flags); + m_objectData->WriteCreate(*data, flags, this, target); + m_dynamicObjectData->WriteCreate(*data, flags, this, target); + data->put<uint32>(sizePos, data->wpos() - sizePos - 4); +} + +void DynamicObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) const +{ + UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + std::size_t sizePos = data->wpos(); + *data << uint32(0); + *data << uint32(m_values.GetChangedObjectTypeMask()); + + if (m_values.HasChanged(TYPEID_OBJECT)) + m_objectData->WriteUpdate(*data, flags, this, target); + + if (m_values.HasChanged(TYPEID_DYNAMICOBJECT)) + m_dynamicObjectData->WriteUpdate(*data, flags, this, target); + + data->put<uint32>(sizePos, data->wpos() - sizePos - 4); +} + +void DynamicObject::ClearUpdateMask(bool remove) +{ + m_values.ClearChangesMask(&DynamicObject::m_dynamicObjectData); + Object::ClearUpdateMask(remove); +} diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h index 31ab2c0fa8b..269b414272c 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.h +++ b/src/server/game/Entities/DynamicObject/DynamicObject.h @@ -39,6 +39,10 @@ class TC_GAME_API DynamicObject : public WorldObject, public GridObject<DynamicO DynamicObject(bool isWorldObject); ~DynamicObject(); + void BuildValuesCreate(ByteBuffer* data, Player const* target) const override; + void BuildValuesUpdate(ByteBuffer* data, Player const* target) const override; + void ClearUpdateMask(bool remove) override; + void AddToWorld() override; void RemoveFromWorld() override; @@ -55,17 +59,18 @@ class TC_GAME_API DynamicObject : public WorldObject, public GridObject<DynamicO Unit* GetCaster() const { return _caster; } void BindToCaster(); void UnbindFromCaster(); - uint32 GetSpellId() const { return GetUInt32Value(DYNAMICOBJECT_SPELLID); } + uint32 GetSpellId() const { return m_dynamicObjectData->SpellID; } SpellInfo const* GetSpellInfo() const; - ObjectGuid GetCasterGUID() const { return GetGuidValue(DYNAMICOBJECT_CASTER); } - float GetRadius() const { return GetFloatValue(DYNAMICOBJECT_RADIUS); } + ObjectGuid GetCasterGUID() const { return m_dynamicObjectData->Caster; } + float GetRadius() const { return m_dynamicObjectData->Radius; } + + UF::UpdateField<UF::DynamicObjectData, 0, TYPEID_DYNAMICOBJECT> m_dynamicObjectData; protected: Aura* _aura; Aura* _removedAura; Unit* _caster; int32 _duration; // for non-aura dynobjects - uint32 _spellXSpellVisualId; bool _isViewpoint; }; #endif |
