aboutsummaryrefslogtreecommitdiff
path: root/src/game/Object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/Object.cpp')
-rw-r--r--src/game/Object.cpp112
1 files changed, 79 insertions, 33 deletions
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 3561621f0bd..69a286289b3 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -259,13 +259,13 @@ void Object::BuildOutOfRangeUpdateBlock(UpdateData * data) const
data->AddOutOfRangeGUID(GetGUID());
}
-void Object::DestroyForPlayer(Player *target) const
+void Object::DestroyForPlayer( Player *target, bool anim ) const
{
ASSERT(target);
WorldPacket data(SMSG_DESTROY_OBJECT, 8);
data << uint64(GetGUID());
- data << uint8(0); // WotLK (bool)
+ data << uint8(anim ? 1 : 0); // WotLK (bool), may be despawn animation
target->GetSession()->SendPacket( &data );
}
@@ -477,6 +477,13 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
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
{
@@ -489,6 +496,13 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
updateMask->SetBit(GAMEOBJECT_DYNAMIC);
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);
+ }
+ }
}
WPAssert(updateMask && updateMask->GetCount() == m_valuesCount);
@@ -513,6 +527,11 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
*data << uint32(appendValue);
}
+ else if (index == UNIT_FIELD_AURASTATE)
+ {
+ // Check per caster aura states to not enable using a pell in client if specified aura is not by target
+ *data << ((Unit*)this)->BuildAuraStateUpdateForTarget(target);
+ }
// FIXME: Some values at server stored in float format but must be sent to client in uint32 format
else if(index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
{
@@ -730,7 +749,7 @@ void Object::_SetCreateBits(UpdateMask *updateMask, Player* /*target*/) const
void Object::SetInt32Value( uint16 index, int32 value )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
if(m_int32Values[ index ] != value)
{
@@ -749,7 +768,7 @@ void Object::SetInt32Value( uint16 index, int32 value )
void Object::SetUInt32Value( uint16 index, uint32 value )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
if(m_uint32Values[ index ] != value)
{
@@ -768,7 +787,7 @@ void Object::SetUInt32Value( uint16 index, uint32 value )
void Object::SetUInt64Value( uint16 index, const uint64 &value )
{
- ASSERT( index + 1 < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index + 1 < m_valuesCount || PrintIndexError( index, true ) );
if(*((uint64*)&(m_uint32Values[ index ])) != value)
{
m_uint32Values[ index ] = *((uint32*)&value);
@@ -829,7 +848,7 @@ bool Object::RemoveUInt64Value(uint16 index, const uint64 &value)
void Object::SetFloatValue( uint16 index, float value )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
if(m_floatValues[ index ] != value)
{
@@ -848,7 +867,7 @@ void Object::SetFloatValue( uint16 index, float value )
void Object::SetByteValue( uint16 index, uint8 offset, uint8 value )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
if(offset > 4)
{
@@ -874,7 +893,7 @@ void Object::SetByteValue( uint16 index, uint8 offset, uint8 value )
void Object::SetUInt16Value( uint16 index, uint8 offset, uint16 value )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
if(offset > 2)
{
@@ -948,7 +967,7 @@ void Object::ApplyModPositiveFloatValue(uint16 index, float val, bool apply)
void Object::SetFlag( uint16 index, uint32 newFlag )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
uint32 oldval = m_uint32Values[ index ];
uint32 newval = oldval | newFlag;
@@ -969,7 +988,7 @@ void Object::SetFlag( uint16 index, uint32 newFlag )
void Object::RemoveFlag( uint16 index, uint32 oldFlag )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
uint32 oldval = m_uint32Values[ index ];
uint32 newval = oldval & ~oldFlag;
@@ -990,7 +1009,7 @@ void Object::RemoveFlag( uint16 index, uint32 oldFlag )
void Object::SetByteFlag( uint16 index, uint8 offset, uint8 newFlag )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
if(offset > 4)
{
@@ -1015,7 +1034,7 @@ void Object::SetByteFlag( uint16 index, uint8 offset, uint8 newFlag )
void Object::RemoveByteFlag( uint16 index, uint8 offset, uint8 oldFlag )
{
- ASSERT( index < m_valuesCount || PrintIndexError( index , true ) );
+ ASSERT( index < m_valuesCount || PrintIndexError( index, true ) );
if(offset > 4)
{
@@ -1047,9 +1066,9 @@ bool Object::PrintIndexError(uint32 index, bool set) const
}
WorldObject::WorldObject()
- : m_mapId(0), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL),
- m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f)
- , m_map(NULL), m_zoneScript(NULL)
+ : m_phaseMask(PHASEMASK_NORMAL),
+ m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f), m_currMap(NULL)
+ , m_zoneScript(NULL)
, m_isActive(false), IsTempWorldObject(false)
, m_name("")
{
@@ -1096,11 +1115,13 @@ void WorldObject::setActive( bool on )
}
}
-void WorldObject::_Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid, uint32 phaseMask )
+void WorldObject::CleanupsBeforeDelete()
{
- Object::_Create(guidlow, 0, guidhigh);
+}
- m_mapId = mapid;
+void WorldObject::_Create( uint32 guidlow, HighGuid guidhigh, uint32 phaseMask )
+{
+ Object::_Create(guidlow, 0, guidhigh);
m_phaseMask = phaseMask;
}
@@ -1430,7 +1451,7 @@ bool WorldObject::IsInBetween(const WorldObject *obj1, const WorldObject *obj2,
void WorldObject::GetRandomPoint( float x, float y, float z, float distance, float &rand_x, float &rand_y, float &rand_z) const
{
- if(distance==0)
+ if(distance == 0)
{
rand_x = x;
rand_y = y;
@@ -1621,8 +1642,6 @@ void WorldObject::MonsterWhisper(int32 textId, uint64 receiver, bool IsBossWhisp
void WorldObject::BuildMonsterChat(WorldPacket *data, uint8 msgtype, char const* text, uint32 language, char const* name, uint64 targetGuid) const
{
- bool pre = (msgtype==CHAT_MSG_MONSTER_EMOTE || msgtype==CHAT_MSG_RAID_BOSS_EMOTE);
-
*data << (uint8)msgtype;
*data << (uint32)language;
*data << (uint64)GetGUID();
@@ -1635,9 +1654,7 @@ void WorldObject::BuildMonsterChat(WorldPacket *data, uint8 msgtype, char const*
*data << (uint32)1; // target name length
*data << (uint8)0; // target name
}
- *data << (uint32)(strlen(text)+1+(pre?3:0));
- if(pre)
- data->append("%s ",3);
+ *data << (uint32)(strlen(text)+1);
*data << text;
*data << (uint8)0; // ChatTag
}
@@ -1668,23 +1685,20 @@ void WorldObject::SendMessageToSetInRange(WorldPacket *data, float dist, bool /*
void WorldObject::SendObjectDeSpawnAnim(uint64 guid)
{
WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8);
- data << guid;
+ data << uint64(guid);
SendMessageToSet(&data, true);
}
-Map* WorldObject::_getMap()
-{
- return m_map = MapManager::Instance().GetMap(GetMapId(), this);
-}
-
-Map* WorldObject::_findMap()
+void WorldObject::SetMap(Map * map)
{
- return m_map = MapManager::Instance().FindMap(GetMapId(), GetInstanceId());
+ ASSERT(map);
+ m_currMap = map;
}
Map const* WorldObject::GetBaseMap() const
{
- return MapManager::Instance().CreateBaseMap(GetMapId());
+ ASSERT(m_currMap);
+ return m_currMap->GetParent();
}
void WorldObject::AddObjectToRemoveList()
@@ -1720,6 +1734,8 @@ TempSummon *Map::SummonCreature(uint32 entry, float x, float y, float z, float a
mask = SUMMON_MASK_PUPPET;
else if(properties->Type == SUMMON_TYPE_MINIPET)
mask = SUMMON_MASK_MINION;
+ else if (properties->Flags & 512) // Mirror Image, Summon Gargoyle
+ mask = SUMMON_MASK_GUARDIAN;
}
uint32 phase = PHASEMASK_NORMAL, team = 0;
@@ -1992,6 +2008,36 @@ GameObject* WorldObject::FindNearestGameObject(uint32 entry, float range)
return go;
}
+void WorldObject::GetGameObjectListWithEntryInGrid(std::list<GameObject*>& lList, uint32 uiEntry, float fMaxSearchRange)
+{
+ CellPair pair(Trinity::ComputeCellPair(this->GetPositionX(), this->GetPositionY()));
+ Cell cell(pair);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
+
+ Trinity::AllGameObjectsWithEntryInRange check(this, uiEntry, fMaxSearchRange);
+ Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInRange> searcher(this, lList, check);
+ TypeContainerVisitor<Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInRange>, GridTypeMapContainer> visitor(searcher);
+
+ CellLock<GridReadGuard> cell_lock(cell, pair);
+ cell_lock->Visit(cell_lock, visitor, *(this->GetMap()));
+}
+
+void WorldObject::GetCreatureListWithEntryInGrid(std::list<Creature*>& lList, uint32 uiEntry, float fMaxSearchRange)
+{
+ CellPair pair(Trinity::ComputeCellPair(this->GetPositionX(), this->GetPositionY()));
+ Cell cell(pair);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
+
+ Trinity::AllCreaturesOfEntryInRange check(this, uiEntry, fMaxSearchRange);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(this, lList, check);
+ TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> visitor(searcher);
+
+ CellLock<GridReadGuard> cell_lock(cell, pair);
+ cell_lock->Visit(cell_lock, visitor, *(this->GetMap()));
+}
+
/*
namespace MaNGOS
{