mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-19 14:39:43 -04:00
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
This commit is contained in:
@@ -41,13 +41,14 @@
|
||||
#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 "Unit.h"
|
||||
#include "Group.h"
|
||||
|
||||
uint32 GuidHigh2TypeId(uint32 guid_hi)
|
||||
{
|
||||
@@ -75,6 +76,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;
|
||||
@@ -586,17 +588,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
|
||||
@@ -604,10 +602,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 &&
|
||||
@@ -617,9 +613,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -911,26 +905,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)
|
||||
|
||||
Reference in New Issue
Block a user