diff options
| author | Shauren <shauren.trinity@gmail.com> | 2013-06-15 15:16:36 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2013-06-15 15:16:36 +0200 |
| commit | fa75fe78bd76e910ab7dfc614bc75f3ce43f9793 (patch) | |
| tree | c58fbf5ca08da0f9726b8045d42a774aaf1fc576 /src/server/game/Entities/GameObject | |
| parent | a8a5239aad6f0396948978bdeae0979e7a8dfa97 (diff) | |
Core/Objects
* Split BuildValuesUpdate into separate virtual methods for every object type that does something special with update fields
* Removed _SetCreateBits/_SetUpdateBits to halve the amount of checks if field needs to be sent
Diffstat (limited to 'src/server/game/Entities/GameObject')
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 88 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 2 |
2 files changed, 79 insertions, 11 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index fbad85e8182..2a4c0b1c1c9 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -17,21 +17,21 @@ */ #include "GameObjectAI.h" -#include "ObjectMgr.h" +#include "BattlegroundAV.h" +#include "CellImpl.h" +#include "CreatureAISelector.h" +#include "DynamicTree.h" +#include "GameObjectModel.h" +#include "GridNotifiersImpl.h" +#include "Group.h" #include "GroupMgr.h" +#include "ObjectMgr.h" +#include "OutdoorPvPMgr.h" #include "PoolMgr.h" +#include "ScriptMgr.h" #include "SpellMgr.h" +#include "UpdateFieldFlags.h" #include "World.h" -#include "GridNotifiersImpl.h" -#include "CellImpl.h" -#include "OutdoorPvPMgr.h" -#include "BattlegroundAV.h" -#include "ScriptMgr.h" -#include "CreatureAISelector.h" -#include "Group.h" - -#include "GameObjectModel.h" -#include "DynamicTree.h" GameObject::GameObject(): WorldObject(false), m_model(NULL), m_goValue(), m_AI(NULL) { @@ -2083,3 +2083,69 @@ bool GameObject::IsLootAllowedFor(Player const* player) const return true; } + +void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const +{ + if (!target) + return; + + bool forcedFlags = GetGoType() == GAMEOBJECT_TYPE_CHEST && GetGOInfo()->chest.groupLootRules && HasLootRecipient(); + bool targetIsGM = target->IsGameMaster(); + + ByteBuffer fieldBuffer; + + UpdateMask updateMask; + updateMask.SetCount(m_valuesCount); + + uint32* flags = GameObjectUpdateFieldFlags; + uint32 visibleFlag = UF_FLAG_PUBLIC; + if (GetOwnerGUID() == target->GetGUID()) + visibleFlag |= UF_FLAG_OWNER; + + for (uint16 index = 0; index < m_valuesCount; ++index) + { + if (_fieldNotifyFlags & flags[index] || + ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) || + (index == GAMEOBJECT_FLAGS && forcedFlags)) + { + updateMask.SetBit(index); + + if (index == GAMEOBJECT_DYNAMIC) + { + uint16 dynFlags = 0; + switch (GetGoType()) + { + case GAMEOBJECT_TYPE_CHEST: + case GAMEOBJECT_TYPE_GOOBER: + if (ActivateToQuest(target)) + dynFlags |= GO_DYNFLAG_LO_ACTIVATE | GO_DYNFLAG_LO_SPARKLE; + else if (targetIsGM) + dynFlags |= GO_DYNFLAG_LO_ACTIVATE; + break; + case GAMEOBJECT_TYPE_GENERIC: + if (ActivateToQuest(target)) + dynFlags |= GO_DYNFLAG_LO_SPARKLE; + break; + } + + fieldBuffer << uint16(dynFlags); + fieldBuffer << uint16(-1); + } + else if (index == GAMEOBJECT_FLAGS) + { + uint32 flags = m_uint32Values[GAMEOBJECT_FLAGS]; + if (GetGoType() == GAMEOBJECT_TYPE_CHEST) + if (GetGOInfo()->chest.groupLootRules && !IsLootAllowedFor(target)) + flags |= GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE; + + fieldBuffer << flags; + } + else + fieldBuffer << m_uint32Values[index]; // other cases + } + } + + *data << uint8(updateMask.GetBlockCount()); + updateMask.AppendToPacket(data); + data->append(fieldBuffer); +} diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 164735a56b5..cf916afd6dc 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -623,6 +623,8 @@ class GameObject : public WorldObject, public GridObject<GameObject> explicit GameObject(); ~GameObject(); + void BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const; + void AddToWorld(); void RemoveFromWorld(); void CleanupsBeforeDelete(bool finalCleanup = true); |
