Core/Object: Use updatefield flags extracted from client to determine whether to send or not a field value instead of sending all data to client for non-player objects
This commit is contained in:
@@ -41,12 +41,13 @@
|
|||||||
#include "GridNotifiers.h"
|
#include "GridNotifiers.h"
|
||||||
#include "GridNotifiersImpl.h"
|
#include "GridNotifiersImpl.h"
|
||||||
#include "SpellAuraEffects.h"
|
#include "SpellAuraEffects.h"
|
||||||
|
#include "UpdateFieldFlags.h"
|
||||||
#include "TemporarySummon.h"
|
#include "TemporarySummon.h"
|
||||||
#include "Totem.h"
|
#include "Totem.h"
|
||||||
#include "OutdoorPvPMgr.h"
|
#include "OutdoorPvPMgr.h"
|
||||||
#include "MovementPacketBuilder.h"
|
#include "MovementPacketBuilder.h"
|
||||||
#include "DynamicTree.h"
|
#include "DynamicTree.h"
|
||||||
|
#include "Group.h"
|
||||||
|
|
||||||
uint32 GuidHigh2TypeId(uint32 guid_hi)
|
uint32 GuidHigh2TypeId(uint32 guid_hi)
|
||||||
{
|
{
|
||||||
@@ -74,6 +75,7 @@ Object::Object() : m_PackGUID(sizeof(uint64)+1)
|
|||||||
m_uint32Values = NULL;
|
m_uint32Values = NULL;
|
||||||
_changedFields = NULL;
|
_changedFields = NULL;
|
||||||
m_valuesCount = 0;
|
m_valuesCount = 0;
|
||||||
|
_fieldNotifyFlags = UF_FLAG_DYNAMIC;
|
||||||
|
|
||||||
m_inWorld = false;
|
m_inWorld = false;
|
||||||
m_objectUpdated = false;
|
m_objectUpdated = false;
|
||||||
@@ -463,28 +465,22 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask*
|
|||||||
if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
|
if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
|
||||||
IsActivateToQuest = true;
|
IsActivateToQuest = true;
|
||||||
|
|
||||||
updateMask->SetBit(GAMEOBJECT_DYNAMIC);
|
|
||||||
|
|
||||||
if (((GameObject*)this)->GetGoArtKit())
|
if (((GameObject*)this)->GetGoArtKit())
|
||||||
updateMask->SetBit(GAMEOBJECT_BYTES_1);
|
updateMask->SetBit(GAMEOBJECT_BYTES_1);
|
||||||
}
|
}
|
||||||
else if (isType(TYPEMASK_UNIT))
|
else if (isType(TYPEMASK_UNIT))
|
||||||
{
|
{
|
||||||
if (((Unit*)this)->HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK))
|
if (((Unit*)this)->HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK))
|
||||||
{
|
|
||||||
updateMask->SetBit(UNIT_FIELD_AURASTATE);
|
updateMask->SetBit(UNIT_FIELD_AURASTATE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else // case UPDATETYPE_VALUES
|
else // case UPDATETYPE_VALUES
|
||||||
{
|
{
|
||||||
if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport())
|
if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport())
|
||||||
{
|
{
|
||||||
if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
|
if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
|
||||||
{
|
|
||||||
IsActivateToQuest = true;
|
IsActivateToQuest = true;
|
||||||
}
|
|
||||||
updateMask->SetBit(GAMEOBJECT_DYNAMIC);
|
|
||||||
updateMask->SetBit(GAMEOBJECT_BYTES_1);
|
updateMask->SetBit(GAMEOBJECT_BYTES_1);
|
||||||
|
|
||||||
if (ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_CHEST && ToGameObject()->GetGOInfo()->chest.groupLootRules &&
|
if (ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_CHEST && ToGameObject()->GetGOInfo()->chest.groupLootRules &&
|
||||||
@@ -494,11 +490,9 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask*
|
|||||||
else if (isType(TYPEMASK_UNIT))
|
else if (isType(TYPEMASK_UNIT))
|
||||||
{
|
{
|
||||||
if (((Unit*)this)->HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK))
|
if (((Unit*)this)->HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK))
|
||||||
{
|
|
||||||
updateMask->SetBit(UNIT_FIELD_AURASTATE);
|
updateMask->SetBit(UNIT_FIELD_AURASTATE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
WPAssert(updateMask && updateMask->GetCount() == m_valuesCount);
|
WPAssert(updateMask && updateMask->GetCount() == m_valuesCount);
|
||||||
|
|
||||||
@@ -788,26 +782,96 @@ void Object::_LoadIntoDataField(char const* data, uint32 startOffset, uint32 cou
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::_SetUpdateBits(UpdateMask* updateMask, Player* /*target*/) const
|
void Object::GetUpdateFieldData(Player const* target, uint32*& flags, bool& isOwner, bool& isItemOwner, bool& hasSpecialInfo, bool& isPartyMember) const
|
||||||
{
|
{
|
||||||
bool* indexes = _changedFields;
|
// This function assumes updatefield index is always valid
|
||||||
|
switch (GetTypeId())
|
||||||
for (uint16 index = 0; index < m_valuesCount; ++index, ++indexes)
|
|
||||||
{
|
{
|
||||||
if (*indexes)
|
case TYPEID_ITEM:
|
||||||
updateMask->SetBit(index);
|
case TYPEID_CONTAINER:
|
||||||
|
flags = ItemUpdateFieldFlags;
|
||||||
|
isOwner = isItemOwner = ((Item*)this)->GetOwnerGUID() == target->GetGUID();
|
||||||
|
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);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TYPEID_GAMEOBJECT:
|
||||||
|
flags = GameObjectUpdateFieldFlags;
|
||||||
|
isOwner = ToGameObject()->GetOwnerGUID() == target->GetGUID();
|
||||||
|
break;
|
||||||
|
case TYPEID_DYNAMICOBJECT:
|
||||||
|
flags = DynamicObjectUpdateFieldFlags;
|
||||||
|
isOwner = ((DynamicObject*)this)->GetCasterGUID() == target->GetGUID();
|
||||||
|
break;
|
||||||
|
case TYPEID_CORPSE:
|
||||||
|
flags = CorpseUpdateFieldFlags;
|
||||||
|
isOwner = ToCorpse()->GetOwnerGUID() == target->GetGUID();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::_SetCreateBits(UpdateMask* updateMask, Player* /*target*/) const
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::_SetUpdateBits(UpdateMask* updateMask, Player* target) const
|
||||||
|
{
|
||||||
|
bool* indexes = _changedFields;
|
||||||
|
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);
|
||||||
|
|
||||||
|
for (uint16 index = 0; index < m_valuesCount; ++index, ++indexes)
|
||||||
|
if (_fieldNotifyFlags & flags[index] || (flags[index] & UF_FLAG_SPECIAL_INFO && hasSpecialInfo) || (*indexes && IsUpdateFieldVisible(flags[index], isSelf, isOwner, isItemOwner, isPartyMember)))
|
||||||
|
updateMask->SetBit(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::_SetCreateBits(UpdateMask* updateMask, Player* target) const
|
||||||
{
|
{
|
||||||
uint32* value = m_uint32Values;
|
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);
|
||||||
|
|
||||||
for (uint16 index = 0; index < m_valuesCount; ++index, ++value)
|
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 (*value)
|
|
||||||
updateMask->SetBit(index);
|
updateMask->SetBit(index);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::SetInt32Value(uint16 index, int32 value)
|
void Object::SetInt32Value(uint16 index, int32 value)
|
||||||
|
|||||||
@@ -300,6 +300,9 @@ class Object
|
|||||||
virtual void BuildUpdate(UpdateDataMapType&) {}
|
virtual void BuildUpdate(UpdateDataMapType&) {}
|
||||||
void BuildFieldsUpdate(Player*, UpdateDataMapType &) const;
|
void BuildFieldsUpdate(Player*, UpdateDataMapType &) const;
|
||||||
|
|
||||||
|
void SetFieldNotifyFlag(uint16 flag) { _fieldNotifyFlags |= flag; }
|
||||||
|
void RemoveFieldNotifyFlag(uint16 flag) { _fieldNotifyFlags &= ~flag; }
|
||||||
|
|
||||||
// FG: some hacky helpers
|
// FG: some hacky helpers
|
||||||
void ForceValuesUpdateAtIndex(uint32);
|
void ForceValuesUpdateAtIndex(uint32);
|
||||||
|
|
||||||
@@ -320,13 +323,16 @@ class Object
|
|||||||
Object();
|
Object();
|
||||||
|
|
||||||
void _InitValues();
|
void _InitValues();
|
||||||
void _Create (uint32 guidlow, uint32 entry, HighGuid guidhigh);
|
void _Create(uint32 guidlow, uint32 entry, HighGuid guidhigh);
|
||||||
std::string _ConcatFields(uint16 startIndex, uint16 size) const;
|
std::string _ConcatFields(uint16 startIndex, uint16 size) const;
|
||||||
void _LoadIntoDataField(const char* data, uint32 startOffset, uint32 count);
|
void _LoadIntoDataField(const char* data, uint32 startOffset, uint32 count);
|
||||||
|
|
||||||
virtual void _SetUpdateBits(UpdateMask* updateMask, Player* target) const;
|
void GetUpdateFieldData(Player const* target, uint32*& flags, bool& isOwner, bool& isItemOwner, bool& hasSpecialInfo, bool& isPartyMember) const;
|
||||||
|
|
||||||
virtual void _SetCreateBits(UpdateMask* updateMask, Player* target) const;
|
bool IsUpdateFieldVisible(uint32 flags, bool isSelf, bool isOwner, bool isItemOwner, bool isPartyMember) const;
|
||||||
|
|
||||||
|
void _SetUpdateBits(UpdateMask* updateMask, Player* target) const;
|
||||||
|
void _SetCreateBits(UpdateMask* updateMask, Player* target) const;
|
||||||
void _BuildMovementUpdate(ByteBuffer * data, uint16 flags) const;
|
void _BuildMovementUpdate(ByteBuffer * data, uint16 flags) const;
|
||||||
void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask* updateMask, Player* target) const;
|
void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask* updateMask, Player* target) const;
|
||||||
|
|
||||||
@@ -346,6 +352,8 @@ class Object
|
|||||||
|
|
||||||
uint16 m_valuesCount;
|
uint16 m_valuesCount;
|
||||||
|
|
||||||
|
uint16 _fieldNotifyFlags;
|
||||||
|
|
||||||
bool m_objectUpdated;
|
bool m_objectUpdated;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UPDATEFIELDFLAGS_H
|
||||||
|
#define _UPDATEFIELDFLAGS_H
|
||||||
|
|
||||||
|
#include "UpdateFields.h"
|
||||||
|
|
||||||
|
enum UpdatefieldFlags
|
||||||
|
{
|
||||||
|
UF_FLAG_NONE = 0x000,
|
||||||
|
UF_FLAG_PUBLIC = 0x001,
|
||||||
|
UF_FLAG_PRIVATE = 0x002,
|
||||||
|
UF_FLAG_OWNER = 0x004,
|
||||||
|
UF_FLAG_UNUSED1 = 0x008,
|
||||||
|
UF_FLAG_ITEM_OWNER = 0x010,
|
||||||
|
UF_FLAG_SPECIAL_INFO = 0x020,
|
||||||
|
UF_FLAG_PARTY_MEMBER = 0x040,
|
||||||
|
UF_FLAG_UNUSED2 = 0x080,
|
||||||
|
UF_FLAG_DYNAMIC = 0x100,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern uint32 ItemUpdateFieldFlags[CONTAINER_END];
|
||||||
|
extern uint32 UnitUpdateFieldFlags[PLAYER_END];
|
||||||
|
extern uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END];
|
||||||
|
extern uint32 DynamicObjectUpdateFieldFlags[DYNAMICOBJECT_END];
|
||||||
|
extern uint32 CorpseUpdateFieldFlags[CORPSE_END];
|
||||||
|
|
||||||
|
#endif // _UPDATEFIELDFLAGS_H
|
||||||
@@ -26,26 +26,26 @@ class UpdateMask
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UpdateMask() : mCount(0), mBlocks(0), mUpdateMask(0) { }
|
UpdateMask() : mCount(0), mBlocks(0), mUpdateMask(0) { }
|
||||||
UpdateMask(const UpdateMask& mask) : mUpdateMask(0) { *this = mask; }
|
UpdateMask(UpdateMask const& mask) : mUpdateMask(0) { *this = mask; }
|
||||||
|
|
||||||
~UpdateMask()
|
~UpdateMask()
|
||||||
{
|
{
|
||||||
delete [] mUpdateMask;
|
delete[] mUpdateMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetBit (uint32 index)
|
void SetBit(uint32 index)
|
||||||
{
|
{
|
||||||
((uint8 *)mUpdateMask)[ index >> 3 ] |= 1 << (index & 0x7);
|
((uint8*)mUpdateMask)[index >> 3] |= 1 << (index & 0x7);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnsetBit (uint32 index)
|
void UnsetBit(uint32 index)
|
||||||
{
|
{
|
||||||
((uint8 *)mUpdateMask)[ index >> 3 ] &= (0xff ^ (1 << (index & 0x7)));
|
((uint8*)mUpdateMask)[index >> 3] &= (0xff ^ (1 << (index & 0x7)));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GetBit (uint32 index) const
|
bool GetBit(uint32 index) const
|
||||||
{
|
{
|
||||||
return (((uint8 *)mUpdateMask)[ index >> 3 ] & (1 << (index & 0x7))) != 0;
|
return (((uint8*)mUpdateMask)[index >> 3] & (1 << (index & 0x7))) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 GetBlockCount() const { return mBlocks; }
|
uint32 GetBlockCount() const { return mBlocks; }
|
||||||
@@ -70,7 +70,7 @@ class UpdateMask
|
|||||||
memset(mUpdateMask, 0, mBlocks << 2);
|
memset(mUpdateMask, 0, mBlocks << 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateMask& operator = (const UpdateMask& mask)
|
UpdateMask& operator=(UpdateMask const& mask)
|
||||||
{
|
{
|
||||||
if (this == &mask)
|
if (this == &mask)
|
||||||
return *this;
|
return *this;
|
||||||
@@ -81,21 +81,21 @@ class UpdateMask
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator &= (const UpdateMask& mask)
|
void operator&=(UpdateMask const& mask)
|
||||||
{
|
{
|
||||||
ASSERT(mask.mCount <= mCount);
|
ASSERT(mask.mCount <= mCount);
|
||||||
for (uint32 i = 0; i < mBlocks; ++i)
|
for (uint32 i = 0; i < mBlocks; ++i)
|
||||||
mUpdateMask[i] &= mask.mUpdateMask[i];
|
mUpdateMask[i] &= mask.mUpdateMask[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator |= (const UpdateMask& mask)
|
void operator|=(UpdateMask const& mask)
|
||||||
{
|
{
|
||||||
ASSERT(mask.mCount <= mCount);
|
ASSERT(mask.mCount <= mCount);
|
||||||
for (uint32 i = 0; i < mBlocks; ++i)
|
for (uint32 i = 0; i < mBlocks; ++i)
|
||||||
mUpdateMask[i] |= mask.mUpdateMask[i];
|
mUpdateMask[i] |= mask.mUpdateMask[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateMask operator & (const UpdateMask& mask) const
|
UpdateMask operator&(UpdateMask const& mask) const
|
||||||
{
|
{
|
||||||
ASSERT(mask.mCount <= mCount);
|
ASSERT(mask.mCount <= mCount);
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ class UpdateMask
|
|||||||
return newmask;
|
return newmask;
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateMask operator | (const UpdateMask& mask) const
|
UpdateMask operator|(UpdateMask const& mask) const
|
||||||
{
|
{
|
||||||
ASSERT(mask.mCount <= mCount);
|
ASSERT(mask.mCount <= mCount);
|
||||||
|
|
||||||
|
|||||||
@@ -630,8 +630,6 @@ void KillRewarder::Reward()
|
|||||||
|
|
||||||
// == Player ====================================================
|
// == Player ====================================================
|
||||||
|
|
||||||
UpdateMask Player::updateVisualBits;
|
|
||||||
|
|
||||||
// we can disable this warning for this since it only
|
// we can disable this warning for this since it only
|
||||||
// causes undefined behavior when passed to the base class constructor
|
// causes undefined behavior when passed to the base class constructor
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
@@ -4492,119 +4490,6 @@ Mail* Player::GetMail(uint32 id)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::_SetCreateBits(UpdateMask* updateMask, Player* target) const
|
|
||||||
{
|
|
||||||
if (target == this)
|
|
||||||
Object::_SetCreateBits(updateMask, target);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (uint16 index = 0; index < m_valuesCount; index++)
|
|
||||||
if (GetUInt32Value(index) != 0 && updateVisualBits.GetBit(index))
|
|
||||||
updateMask->SetBit(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::_SetUpdateBits(UpdateMask* updateMask, Player* target) const
|
|
||||||
{
|
|
||||||
if (target == this)
|
|
||||||
Object::_SetUpdateBits(updateMask, target);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Object::_SetUpdateBits(updateMask, target);
|
|
||||||
*updateMask &= updateVisualBits;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::InitVisibleBits()
|
|
||||||
{
|
|
||||||
updateVisualBits.SetCount(PLAYER_END);
|
|
||||||
|
|
||||||
updateVisualBits.SetBit(OBJECT_FIELD_GUID);
|
|
||||||
updateVisualBits.SetBit(OBJECT_FIELD_TYPE);
|
|
||||||
updateVisualBits.SetBit(OBJECT_FIELD_ENTRY);
|
|
||||||
updateVisualBits.SetBit(OBJECT_FIELD_SCALE_X);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_CHARM + 0);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_CHARM + 1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_SUMMON + 0);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_SUMMON + 1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY + 0);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY + 1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_TARGET + 0);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_TARGET + 1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT + 0);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT + 1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_BYTES_0);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_HEALTH);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_POWER1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_POWER2);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_POWER3);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_POWER4);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_POWER5);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_POWER6);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_POWER7);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MAXHEALTH);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER2);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER3);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER4);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER5);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER6);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER7);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_LEVEL);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_FACTIONTEMPLATE);
|
|
||||||
updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 0);
|
|
||||||
updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 1);
|
|
||||||
updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 2);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_FLAGS);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_FLAGS_2);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_AURASTATE);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 0);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_BOUNDINGRADIUS);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_COMBATREACH);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_DISPLAYID);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_NATIVEDISPLAYID);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_MOUNTDISPLAYID);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_BYTES_1);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_PETNUMBER);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_PET_NAME_TIMESTAMP);
|
|
||||||
updateVisualBits.SetBit(UNIT_DYNAMIC_FLAGS);
|
|
||||||
updateVisualBits.SetBit(UNIT_CHANNEL_SPELL);
|
|
||||||
updateVisualBits.SetBit(UNIT_MOD_CAST_SPEED);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_BASE_MANA);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_BYTES_2);
|
|
||||||
updateVisualBits.SetBit(UNIT_FIELD_HOVERHEIGHT);
|
|
||||||
|
|
||||||
updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 0);
|
|
||||||
updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 1);
|
|
||||||
updateVisualBits.SetBit(PLAYER_FLAGS);
|
|
||||||
updateVisualBits.SetBit(PLAYER_GUILDID);
|
|
||||||
updateVisualBits.SetBit(PLAYER_GUILDRANK);
|
|
||||||
updateVisualBits.SetBit(PLAYER_BYTES);
|
|
||||||
updateVisualBits.SetBit(PLAYER_BYTES_2);
|
|
||||||
updateVisualBits.SetBit(PLAYER_BYTES_3);
|
|
||||||
updateVisualBits.SetBit(PLAYER_DUEL_TEAM);
|
|
||||||
updateVisualBits.SetBit(PLAYER_GUILD_TIMESTAMP);
|
|
||||||
updateVisualBits.SetBit(UNIT_NPC_FLAGS);
|
|
||||||
|
|
||||||
// PLAYER_QUEST_LOG_x also visible bit on official (but only on party/raid)...
|
|
||||||
for (uint16 i = PLAYER_QUEST_LOG_1_1; i < PLAYER_QUEST_LOG_25_2; i += MAX_QUEST_OFFSET)
|
|
||||||
updateVisualBits.SetBit(i);
|
|
||||||
|
|
||||||
// Players visible items are not inventory stuff
|
|
||||||
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
|
||||||
{
|
|
||||||
uint16 offset = i * 2;
|
|
||||||
|
|
||||||
// item entry
|
|
||||||
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENTRYID + offset);
|
|
||||||
// enchant
|
|
||||||
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const
|
void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const
|
||||||
{
|
{
|
||||||
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||||
@@ -17217,7 +17102,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
|
|||||||
SetUInt32Value(UNIT_CHANNEL_SPELL, 0);
|
SetUInt32Value(UNIT_CHANNEL_SPELL, 0);
|
||||||
|
|
||||||
// clear charm/summon related fields
|
// clear charm/summon related fields
|
||||||
SetUInt64Value(UNIT_FIELD_SUMMONEDBY, 0);
|
SetOwnerGUID(0);
|
||||||
SetUInt64Value(UNIT_FIELD_CHARMEDBY, 0);
|
SetUInt64Value(UNIT_FIELD_CHARMEDBY, 0);
|
||||||
SetUInt64Value(UNIT_FIELD_CHARM, 0);
|
SetUInt64Value(UNIT_FIELD_CHARM, 0);
|
||||||
SetUInt64Value(UNIT_FIELD_SUMMON, 0);
|
SetUInt64Value(UNIT_FIELD_SUMMON, 0);
|
||||||
|
|||||||
@@ -1069,9 +1069,6 @@ class Player : public Unit, public GridObject<Player>
|
|||||||
|
|
||||||
void CleanupsBeforeDelete(bool finalCleanup = true);
|
void CleanupsBeforeDelete(bool finalCleanup = true);
|
||||||
|
|
||||||
static UpdateMask updateVisualBits;
|
|
||||||
static void InitVisibleBits();
|
|
||||||
|
|
||||||
void AddToWorld();
|
void AddToWorld();
|
||||||
void RemoveFromWorld();
|
void RemoveFromWorld();
|
||||||
|
|
||||||
@@ -2620,9 +2617,6 @@ class Player : public Unit, public GridObject<Player>
|
|||||||
void _SaveStats(SQLTransaction& trans);
|
void _SaveStats(SQLTransaction& trans);
|
||||||
void _SaveInstanceTimeRestrictions(SQLTransaction& trans);
|
void _SaveInstanceTimeRestrictions(SQLTransaction& trans);
|
||||||
|
|
||||||
void _SetCreateBits(UpdateMask* updateMask, Player* target) const;
|
|
||||||
void _SetUpdateBits(UpdateMask* updateMask, Player* target) const;
|
|
||||||
|
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
/*** ENVIRONMENTAL SYSTEM ***/
|
/*** ENVIRONMENTAL SYSTEM ***/
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
#include "MoveSplineInit.h"
|
#include "MoveSplineInit.h"
|
||||||
#include "MoveSpline.h"
|
#include "MoveSpline.h"
|
||||||
#include "ConditionMgr.h"
|
#include "ConditionMgr.h"
|
||||||
|
#include "UpdateFieldFlags.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
@@ -9658,6 +9659,31 @@ bool Unit::HasAuraState(AuraStateType flag, SpellInfo const* spellProto, Unit co
|
|||||||
return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1));
|
return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Unit::SetOwnerGUID(uint64 owner)
|
||||||
|
{
|
||||||
|
if (GetOwnerGUID() == owner)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner);
|
||||||
|
if (!owner)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Update owner dependent fields
|
||||||
|
Player* player = ObjectAccessor::GetPlayer(*this, owner);
|
||||||
|
if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetFieldNotifyFlag(UF_FLAG_OWNER);
|
||||||
|
|
||||||
|
UpdateData udata;
|
||||||
|
WorldPacket packet;
|
||||||
|
BuildValuesUpdateBlockForPlayer(&udata, player);
|
||||||
|
udata.BuildPacket(&packet);
|
||||||
|
player->SendDirectMessage(&packet);
|
||||||
|
|
||||||
|
RemoveFieldNotifyFlag(UF_FLAG_OWNER);
|
||||||
|
}
|
||||||
|
|
||||||
Unit* Unit::GetOwner() const
|
Unit* Unit::GetOwner() const
|
||||||
{
|
{
|
||||||
if (uint64 ownerid = GetOwnerGUID())
|
if (uint64 ownerid = GetOwnerGUID())
|
||||||
@@ -9743,12 +9769,14 @@ void Unit::SetMinion(Minion *minion, bool apply)
|
|||||||
|
|
||||||
if (apply)
|
if (apply)
|
||||||
{
|
{
|
||||||
if (!minion->AddUInt64Value(UNIT_FIELD_SUMMONEDBY, GetGUID()))
|
if (minion->GetOwnerGUID())
|
||||||
{
|
{
|
||||||
sLog->outCrash("SetMinion: Minion %u is not the minion of owner %u", minion->GetEntry(), GetEntry());
|
sLog->outCrash("SetMinion: Minion %u is not the minion of owner %u", minion->GetEntry(), GetEntry());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
minion->SetOwnerGUID(GetGUID());
|
||||||
|
|
||||||
m_Controlled.insert(minion);
|
m_Controlled.insert(minion);
|
||||||
|
|
||||||
if (GetTypeId() == TYPEID_PLAYER)
|
if (GetTypeId() == TYPEID_PLAYER)
|
||||||
|
|||||||
@@ -963,24 +963,6 @@ struct SpellPeriodicAuraLogInfo
|
|||||||
|
|
||||||
uint32 createProcExtendMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCondition);
|
uint32 createProcExtendMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCondition);
|
||||||
|
|
||||||
enum UnitAnimationState
|
|
||||||
{
|
|
||||||
ANIMATION_ON_GROUND = 0,
|
|
||||||
ANIMATION_SWIMMING = 1,
|
|
||||||
ANIMATION_HOVER = 2,
|
|
||||||
ANIMATION_FLYING = 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MonsterMoveData
|
|
||||||
{
|
|
||||||
MonsterMoveData() : SplineFlag(0), AnimationState(ANIMATION_ON_GROUND), Time(0), SpeedZ(0.0f) {}
|
|
||||||
Position DestLocation;
|
|
||||||
uint32 SplineFlag;
|
|
||||||
UnitAnimationState AnimationState; // Only used with SPLINEFLAG_ANIMATIONTIER
|
|
||||||
uint32 Time;
|
|
||||||
float SpeedZ; // Only used with SPLINEFLAG_TRAJECTORY
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MAX_DECLINED_NAME_CASES 5
|
#define MAX_DECLINED_NAME_CASES 5
|
||||||
|
|
||||||
struct DeclinedName
|
struct DeclinedName
|
||||||
@@ -1656,6 +1638,7 @@ class Unit : public WorldObject
|
|||||||
virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet
|
virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet
|
||||||
|
|
||||||
uint64 GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); }
|
uint64 GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); }
|
||||||
|
void SetOwnerGUID(uint64 owner);
|
||||||
uint64 GetCreatorGUID() const { return GetUInt64Value(UNIT_FIELD_CREATEDBY); }
|
uint64 GetCreatorGUID() const { return GetUInt64Value(UNIT_FIELD_CREATEDBY); }
|
||||||
void SetCreatorGUID(uint64 creator) { SetUInt64Value(UNIT_FIELD_CREATEDBY, creator); }
|
void SetCreatorGUID(uint64 creator) { SetUInt64Value(UNIT_FIELD_CREATEDBY, creator); }
|
||||||
uint64 GetMinionGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMON); }
|
uint64 GetMinionGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMON); }
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#include "MapInstanced.h"
|
#include "MapInstanced.h"
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
#include "LFGMgr.h"
|
#include "LFGMgr.h"
|
||||||
|
#include "UpdateFieldFlags.h"
|
||||||
|
|
||||||
Roll::Roll(uint64 _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid),
|
Roll::Roll(uint64 _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid),
|
||||||
itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count),
|
itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count),
|
||||||
@@ -437,6 +438,47 @@ bool Group::AddMember(Player* player)
|
|||||||
if (isRaidGroup())
|
if (isRaidGroup())
|
||||||
player->UpdateForQuestWorldObjects();
|
player->UpdateForQuestWorldObjects();
|
||||||
|
|
||||||
|
{
|
||||||
|
// Broadcast new player group member fields to rest of the group
|
||||||
|
player->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
|
||||||
|
|
||||||
|
UpdateData groupData;
|
||||||
|
WorldPacket groupDataPacket;
|
||||||
|
|
||||||
|
// Broadcast group members' fields to player
|
||||||
|
for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
|
||||||
|
{
|
||||||
|
if (itr->getSource() == player)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (Player* member = itr->getSource())
|
||||||
|
{
|
||||||
|
if (player->HaveAtClient(member))
|
||||||
|
{
|
||||||
|
member->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
|
||||||
|
member->BuildValuesUpdateBlockForPlayer(&groupData, player);
|
||||||
|
member->RemoveFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (member->HaveAtClient(player))
|
||||||
|
{
|
||||||
|
UpdateData newData;
|
||||||
|
WorldPacket newDataPacket;
|
||||||
|
player->BuildValuesUpdateBlockForPlayer(&newData, member);
|
||||||
|
member->SendDirectMessage(&newDataPacket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (groupData.HasData())
|
||||||
|
{
|
||||||
|
groupData.BuildPacket(&groupDataPacket);
|
||||||
|
player->SendDirectMessage(&groupDataPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
player->RemoveFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
|
||||||
|
}
|
||||||
|
|
||||||
if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING))
|
if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING))
|
||||||
m_maxEnchantingLevel = player->GetSkillValue(SKILL_ENCHANTING);
|
m_maxEnchantingLevel = player->GetSkillValue(SKILL_ENCHANTING);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2405,7 +2405,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
|
|||||||
|
|
||||||
if (properties->Category == SUMMON_CATEGORY_ALLY)
|
if (properties->Category == SUMMON_CATEGORY_ALLY)
|
||||||
{
|
{
|
||||||
summon->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, m_originalCaster->GetGUID());
|
summon->SetOwnerGUID(m_originalCaster->GetGUID());
|
||||||
summon->setFaction(m_originalCaster->getFaction());
|
summon->setFaction(m_originalCaster->getFaction());
|
||||||
summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id);
|
summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1693,7 +1693,6 @@ void World::SetInitialWorldSettings()
|
|||||||
|
|
||||||
///- Initilize static helper structures
|
///- Initilize static helper structures
|
||||||
AIRegistry::Initialize();
|
AIRegistry::Initialize();
|
||||||
Player::InitVisibleBits();
|
|
||||||
|
|
||||||
///- Initialize MapManager
|
///- Initialize MapManager
|
||||||
sLog->outString("Starting Map System");
|
sLog->outString("Starting Map System");
|
||||||
|
|||||||
Reference in New Issue
Block a user