Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4

This commit is contained in:
Shauren
2012-07-23 00:13:13 +02:00
41 changed files with 2852 additions and 908 deletions
+84 -20
View File
@@ -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)