aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/GameObject
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-06-15 15:16:36 +0200
committerShauren <shauren.trinity@gmail.com>2013-06-15 15:16:36 +0200
commitfa75fe78bd76e910ab7dfc614bc75f3ce43f9793 (patch)
treec58fbf5ca08da0f9726b8045d42a774aaf1fc576 /src/server/game/Entities/GameObject
parenta8a5239aad6f0396948978bdeae0979e7a8dfa97 (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.cpp88
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
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);