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 "GridNotifiersImpl.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
|
||||
#include "UpdateFieldFlags.h"
|
||||
#include "TemporarySummon.h"
|
||||
#include "Totem.h"
|
||||
#include "OutdoorPvPMgr.h"
|
||||
#include "MovementPacketBuilder.h"
|
||||
#include "DynamicTree.h"
|
||||
#include "Group.h"
|
||||
|
||||
uint32 GuidHigh2TypeId(uint32 guid_hi)
|
||||
{
|
||||
@@ -74,6 +75,7 @@ Object::Object() : m_PackGUID(sizeof(uint64)+1)
|
||||
m_uint32Values = NULL;
|
||||
_changedFields = NULL;
|
||||
m_valuesCount = 0;
|
||||
_fieldNotifyFlags = UF_FLAG_DYNAMIC;
|
||||
|
||||
m_inWorld = false;
|
||||
m_objectUpdated = false;
|
||||
@@ -463,17 +465,13 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask*
|
||||
if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
|
||||
IsActivateToQuest = true;
|
||||
|
||||
updateMask->SetBit(GAMEOBJECT_DYNAMIC);
|
||||
|
||||
if (((GameObject*)this)->GetGoArtKit())
|
||||
updateMask->SetBit(GAMEOBJECT_BYTES_1);
|
||||
}
|
||||
else if (isType(TYPEMASK_UNIT))
|
||||
{
|
||||
if (((Unit*)this)->HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK))
|
||||
{
|
||||
updateMask->SetBit(UNIT_FIELD_AURASTATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
else // case UPDATETYPE_VALUES
|
||||
@@ -481,10 +479,8 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask*
|
||||
if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport())
|
||||
{
|
||||
if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
|
||||
{
|
||||
IsActivateToQuest = true;
|
||||
}
|
||||
updateMask->SetBit(GAMEOBJECT_DYNAMIC);
|
||||
|
||||
updateMask->SetBit(GAMEOBJECT_BYTES_1);
|
||||
|
||||
if (ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_CHEST && ToGameObject()->GetGOInfo()->chest.groupLootRules &&
|
||||
@@ -494,9 +490,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask*
|
||||
else if (isType(TYPEMASK_UNIT))
|
||||
{
|
||||
if (((Unit*)this)->HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK))
|
||||
{
|
||||
updateMask->SetBit(UNIT_FIELD_AURASTATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
for (uint16 index = 0; index < m_valuesCount; ++index, ++indexes)
|
||||
// This function assumes updatefield index is always valid
|
||||
switch (GetTypeId())
|
||||
{
|
||||
if (*indexes)
|
||||
updateMask->SetBit(index);
|
||||
case TYPEID_ITEM:
|
||||
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* 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)
|
||||
{
|
||||
if (*value)
|
||||
if (_fieldNotifyFlags & flags[index] || (flags[index] & UF_FLAG_SPECIAL_INFO && hasSpecialInfo) || (*value && IsUpdateFieldVisible(flags[index], isSelf, isOwner, isItemOwner, isPartyMember)))
|
||||
updateMask->SetBit(index);
|
||||
}
|
||||
}
|
||||
|
||||
void Object::SetInt32Value(uint16 index, int32 value)
|
||||
|
||||
@@ -300,6 +300,9 @@ class Object
|
||||
virtual void BuildUpdate(UpdateDataMapType&) {}
|
||||
void BuildFieldsUpdate(Player*, UpdateDataMapType &) const;
|
||||
|
||||
void SetFieldNotifyFlag(uint16 flag) { _fieldNotifyFlags |= flag; }
|
||||
void RemoveFieldNotifyFlag(uint16 flag) { _fieldNotifyFlags &= ~flag; }
|
||||
|
||||
// FG: some hacky helpers
|
||||
void ForceValuesUpdateAtIndex(uint32);
|
||||
|
||||
@@ -320,13 +323,16 @@ class Object
|
||||
Object();
|
||||
|
||||
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;
|
||||
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 _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask* updateMask, Player* target) const;
|
||||
|
||||
@@ -346,6 +352,8 @@ class Object
|
||||
|
||||
uint16 m_valuesCount;
|
||||
|
||||
uint16 _fieldNotifyFlags;
|
||||
|
||||
bool m_objectUpdated;
|
||||
|
||||
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:
|
||||
UpdateMask() : mCount(0), mBlocks(0), mUpdateMask(0) { }
|
||||
UpdateMask(const UpdateMask& mask) : mUpdateMask(0) { *this = mask; }
|
||||
UpdateMask(UpdateMask const& mask) : mUpdateMask(0) { *this = mask; }
|
||||
|
||||
~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; }
|
||||
@@ -70,7 +70,7 @@ class UpdateMask
|
||||
memset(mUpdateMask, 0, mBlocks << 2);
|
||||
}
|
||||
|
||||
UpdateMask& operator = (const UpdateMask& mask)
|
||||
UpdateMask& operator=(UpdateMask const& mask)
|
||||
{
|
||||
if (this == &mask)
|
||||
return *this;
|
||||
@@ -81,21 +81,21 @@ class UpdateMask
|
||||
return *this;
|
||||
}
|
||||
|
||||
void operator &= (const UpdateMask& mask)
|
||||
void operator&=(UpdateMask const& mask)
|
||||
{
|
||||
ASSERT(mask.mCount <= mCount);
|
||||
for (uint32 i = 0; i < mBlocks; ++i)
|
||||
mUpdateMask[i] &= mask.mUpdateMask[i];
|
||||
}
|
||||
|
||||
void operator |= (const UpdateMask& mask)
|
||||
void operator|=(UpdateMask const& mask)
|
||||
{
|
||||
ASSERT(mask.mCount <= mCount);
|
||||
for (uint32 i = 0; i < mBlocks; ++i)
|
||||
mUpdateMask[i] |= mask.mUpdateMask[i];
|
||||
}
|
||||
|
||||
UpdateMask operator & (const UpdateMask& mask) const
|
||||
UpdateMask operator&(UpdateMask const& mask) const
|
||||
{
|
||||
ASSERT(mask.mCount <= mCount);
|
||||
|
||||
@@ -106,7 +106,7 @@ class UpdateMask
|
||||
return newmask;
|
||||
}
|
||||
|
||||
UpdateMask operator | (const UpdateMask& mask) const
|
||||
UpdateMask operator|(UpdateMask const& mask) const
|
||||
{
|
||||
ASSERT(mask.mCount <= mCount);
|
||||
|
||||
|
||||
@@ -630,8 +630,6 @@ void KillRewarder::Reward()
|
||||
|
||||
// == Player ====================================================
|
||||
|
||||
UpdateMask Player::updateVisualBits;
|
||||
|
||||
// we can disable this warning for this since it only
|
||||
// causes undefined behavior when passed to the base class constructor
|
||||
#ifdef _MSC_VER
|
||||
@@ -4492,119 +4490,6 @@ Mail* Player::GetMail(uint32 id)
|
||||
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
|
||||
{
|
||||
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);
|
||||
|
||||
// clear charm/summon related fields
|
||||
SetUInt64Value(UNIT_FIELD_SUMMONEDBY, 0);
|
||||
SetOwnerGUID(0);
|
||||
SetUInt64Value(UNIT_FIELD_CHARMEDBY, 0);
|
||||
SetUInt64Value(UNIT_FIELD_CHARM, 0);
|
||||
SetUInt64Value(UNIT_FIELD_SUMMON, 0);
|
||||
|
||||
@@ -1069,9 +1069,6 @@ class Player : public Unit, public GridObject<Player>
|
||||
|
||||
void CleanupsBeforeDelete(bool finalCleanup = true);
|
||||
|
||||
static UpdateMask updateVisualBits;
|
||||
static void InitVisibleBits();
|
||||
|
||||
void AddToWorld();
|
||||
void RemoveFromWorld();
|
||||
|
||||
@@ -2620,9 +2617,6 @@ class Player : public Unit, public GridObject<Player>
|
||||
void _SaveStats(SQLTransaction& trans);
|
||||
void _SaveInstanceTimeRestrictions(SQLTransaction& trans);
|
||||
|
||||
void _SetCreateBits(UpdateMask* updateMask, Player* target) const;
|
||||
void _SetUpdateBits(UpdateMask* updateMask, Player* target) const;
|
||||
|
||||
/*********************************************************/
|
||||
/*** ENVIRONMENTAL SYSTEM ***/
|
||||
/*********************************************************/
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include "MoveSplineInit.h"
|
||||
#include "MoveSpline.h"
|
||||
#include "ConditionMgr.h"
|
||||
#include "UpdateFieldFlags.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));
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
if (uint64 ownerid = GetOwnerGUID())
|
||||
@@ -9743,12 +9769,14 @@ void Unit::SetMinion(Minion *minion, bool 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());
|
||||
return;
|
||||
}
|
||||
|
||||
minion->SetOwnerGUID(GetGUID());
|
||||
|
||||
m_Controlled.insert(minion);
|
||||
|
||||
if (GetTypeId() == TYPEID_PLAYER)
|
||||
|
||||
@@ -963,24 +963,6 @@ struct SpellPeriodicAuraLogInfo
|
||||
|
||||
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
|
||||
|
||||
struct DeclinedName
|
||||
@@ -1656,6 +1638,7 @@ class Unit : public WorldObject
|
||||
virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet
|
||||
|
||||
uint64 GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); }
|
||||
void SetOwnerGUID(uint64 owner);
|
||||
uint64 GetCreatorGUID() const { return GetUInt64Value(UNIT_FIELD_CREATEDBY); }
|
||||
void SetCreatorGUID(uint64 creator) { SetUInt64Value(UNIT_FIELD_CREATEDBY, creator); }
|
||||
uint64 GetMinionGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMON); }
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "MapInstanced.h"
|
||||
#include "Util.h"
|
||||
#include "LFGMgr.h"
|
||||
#include "UpdateFieldFlags.h"
|
||||
|
||||
Roll::Roll(uint64 _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid),
|
||||
itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count),
|
||||
@@ -437,6 +438,47 @@ bool Group::AddMember(Player* player)
|
||||
if (isRaidGroup())
|
||||
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))
|
||||
m_maxEnchantingLevel = player->GetSkillValue(SKILL_ENCHANTING);
|
||||
}
|
||||
|
||||
@@ -2405,7 +2405,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
|
||||
|
||||
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->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id);
|
||||
}
|
||||
|
||||
@@ -1693,7 +1693,6 @@ void World::SetInitialWorldSettings()
|
||||
|
||||
///- Initilize static helper structures
|
||||
AIRegistry::Initialize();
|
||||
Player::InitVisibleBits();
|
||||
|
||||
///- Initialize MapManager
|
||||
sLog->outString("Starting Map System");
|
||||
|
||||
Reference in New Issue
Block a user