aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/DynamicObject
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-06-03 20:40:34 +0200
committerShauren <shauren.trinity@gmail.com>2019-06-08 17:06:57 +0200
commit455959c6064af6f7863a6b4b57cb0ef1646bd8ef (patch)
tree7d7a7cdd3a44643ee5fc7d19521ced1c8b815c66 /src/server/game/Entities/DynamicObject
parent31fda79556e55375962a3c9e46f6dbdbf6e90d18 (diff)
Core/PacketIO: Rewrite updatefield handling
Diffstat (limited to 'src/server/game/Entities/DynamicObject')
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp52
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.h13
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