Core/Objects: Some optimizations to object updatemask building
This commit is contained in:
1 parent
a216ef2ca0
commit
653557d335
3 files changed
+29
-56
No files matched your search
@@ -777,64 +777,56 @@ void Object::BuildFieldsUpdate(Player* player, UpdateDataMapType& data_map) cons
|
||||
BuildValuesUpdateBlockForPlayer(&iter->second, iter->first);
|
||||
}
|
||||
|
||||
void Object::GetUpdateFieldData(Player const* target, uint32*& flags, bool& isOwner, bool& isItemOwner, bool& hasSpecialInfo, bool& isPartyMember) const
|
||||
uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const
|
||||
{
|
||||
// This function assumes updatefield index is always valid
|
||||
uint32 visibleFlag = UF_FLAG_PUBLIC;
|
||||
|
||||
if (target == this)
|
||||
visibleFlag |= UF_FLAG_PRIVATE;
|
||||
|
||||
switch (GetTypeId())
|
||||
{
|
||||
case TYPEID_ITEM:
|
||||
case TYPEID_CONTAINER:
|
||||
flags = ItemUpdateFieldFlags;
|
||||
isOwner = isItemOwner = ((Item*)this)->GetOwnerGUID() == target->GetGUID();
|
||||
if (((Item*)this)->GetOwnerGUID() == target->GetGUID())
|
||||
visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
|
||||
break;
|
||||
case TYPEID_UNIT:
|
||||
case TYPEID_PLAYER:
|
||||
{
|
||||
Player* plr = ToUnit()->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
flags = UnitUpdateFieldFlags;
|
||||
isOwner = ToUnit()->GetOwnerGUID() == target->GetGUID();
|
||||
hasSpecialInfo = ToUnit()->HasAuraTypeWithCaster(SPELL_AURA_EMPATHY, target->GetGUID());
|
||||
isPartyMember = plr && plr->IsInSameGroupWith(target);
|
||||
if (ToUnit()->GetOwnerGUID() == target->GetGUID())
|
||||
visibleFlag |= UF_FLAG_OWNER;
|
||||
|
||||
if (ToUnit()->HasAuraTypeWithCaster(SPELL_AURA_EMPATHY, target->GetGUID()))
|
||||
visibleFlag |= UF_FLAG_SPECIAL_INFO;
|
||||
|
||||
if (plr && plr->IsInSameGroupWith(target))
|
||||
visibleFlag |= UF_FLAG_PARTY_MEMBER;
|
||||
break;
|
||||
}
|
||||
case TYPEID_GAMEOBJECT:
|
||||
flags = GameObjectUpdateFieldFlags;
|
||||
isOwner = ToGameObject()->GetOwnerGUID() == target->GetGUID();
|
||||
if (ToGameObject()->GetOwnerGUID() == target->GetGUID())
|
||||
visibleFlag |= UF_FLAG_OWNER;
|
||||
break;
|
||||
case TYPEID_DYNAMICOBJECT:
|
||||
flags = DynamicObjectUpdateFieldFlags;
|
||||
isOwner = ((DynamicObject*)this)->GetCasterGUID() == target->GetGUID();
|
||||
if (((DynamicObject*)this)->GetCasterGUID() == target->GetGUID())
|
||||
visibleFlag |= UF_FLAG_OWNER;
|
||||
break;
|
||||
case TYPEID_CORPSE:
|
||||
flags = CorpseUpdateFieldFlags;
|
||||
isOwner = ToCorpse()->GetOwnerGUID() == target->GetGUID();
|
||||
if (ToCorpse()->GetOwnerGUID() == target->GetGUID())
|
||||
visibleFlag |= UF_FLAG_OWNER;
|
||||
break;
|
||||
case TYPEID_OBJECT:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool Object::IsUpdateFieldVisible(uint32 flags, bool isSelf, bool isOwner, bool isItemOwner, bool isPartyMember) const
|
||||
{
|
||||
if (flags == UF_FLAG_NONE)
|
||||
return false;
|
||||
|
||||
if (flags & UF_FLAG_PUBLIC)
|
||||
return true;
|
||||
|
||||
if (flags & UF_FLAG_PRIVATE && isSelf)
|
||||
return true;
|
||||
|
||||
if (flags & UF_FLAG_OWNER && isOwner)
|
||||
return true;
|
||||
|
||||
if (flags & UF_FLAG_ITEM_OWNER && isItemOwner)
|
||||
return true;
|
||||
|
||||
if (flags & UF_FLAG_PARTY_MEMBER && isPartyMember)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return visibleFlag;
|
||||
}
|
||||
|
||||
void Object::_LoadIntoDataField(std::string const& data, uint32 startOffset, uint32 count)
|
||||
@@ -857,16 +849,10 @@ void Object::_LoadIntoDataField(std::string const& data, uint32 startOffset, uin
|
||||
void Object::_SetUpdateBits(UpdateMask* updateMask, Player* target) const
|
||||
{
|
||||
uint32* flags = NULL;
|
||||
bool isSelf = target == this;
|
||||
bool isOwner = false;
|
||||
bool isItemOwner = false;
|
||||
bool hasSpecialInfo = false;
|
||||
bool isPartyMember = false;
|
||||
|
||||
GetUpdateFieldData(target, flags, isOwner, isItemOwner, hasSpecialInfo, isPartyMember);
|
||||
uint32 visibleFlag = GetUpdateFieldData(target, flags);
|
||||
|
||||
for (uint16 index = 0; index < m_valuesCount; ++index)
|
||||
if (_fieldNotifyFlags & flags[index] || (flags[index] & UF_FLAG_SPECIAL_INFO && hasSpecialInfo) || (_changesMask.GetBit(index) && IsUpdateFieldVisible(flags[index], isSelf, isOwner, isItemOwner, isPartyMember)))
|
||||
if (_fieldNotifyFlags & flags[index] || ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) || (_changesMask.GetBit(index) && (flags[index] & visibleFlag)))
|
||||
updateMask->SetBit(index);
|
||||
}
|
||||
|
||||
@@ -874,16 +860,10 @@ void Object::_SetCreateBits(UpdateMask* updateMask, Player* target) const
|
||||
{
|
||||
uint32* value = m_uint32Values;
|
||||
uint32* flags = NULL;
|
||||
bool isSelf = target == this;
|
||||
bool isOwner = false;
|
||||
bool isItemOwner = false;
|
||||
bool hasSpecialInfo = false;
|
||||
bool isPartyMember = false;
|
||||
|
||||
GetUpdateFieldData(target, flags, isOwner, isItemOwner, hasSpecialInfo, isPartyMember);
|
||||
uint32 visibleFlag = GetUpdateFieldData(target, flags);
|
||||
|
||||
for (uint16 index = 0; index < m_valuesCount; ++index, ++value)
|
||||
if (_fieldNotifyFlags & flags[index] || (flags[index] & UF_FLAG_SPECIAL_INFO && hasSpecialInfo) || (*value && IsUpdateFieldVisible(flags[index], isSelf, isOwner, isItemOwner, isPartyMember)))
|
||||
if (_fieldNotifyFlags & flags[index] || ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) || (*value && (flags[index] & visibleFlag)))
|
||||
updateMask->SetBit(index);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user