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:
Shauren
2012-07-22 14:20:26 +02:00
parent 395994c707
commit 1fd37ac61b
12 changed files with 1793 additions and 179 deletions
+84 -20
View File
@@ -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)
+11 -3
View File
@@ -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);
+1 -116
View File
@@ -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);
-6
View File
@@ -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 ***/
/*********************************************************/ /*********************************************************/
+29 -1
View File
@@ -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)
+1 -18
View File
@@ -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); }
+42
View File
@@ -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);
} }
+1 -1
View File
@@ -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);
} }
-1
View File
@@ -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");