mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-14 17:49:10 +00:00
feat(Core/SAI): new Actions + Polar Coords System Offset Relocating (#2880)
This commit is contained in:
@@ -122,7 +122,7 @@ Object::~Object()
|
||||
}
|
||||
|
||||
void Object::_InitValues()
|
||||
{
|
||||
{
|
||||
m_uint32Values = new uint32[m_valuesCount];
|
||||
memset(m_uint32Values, 0, m_valuesCount*sizeof(uint32));
|
||||
|
||||
@@ -132,7 +132,7 @@ void Object::_InitValues()
|
||||
}
|
||||
|
||||
void Object::_Create(uint32 guidlow, uint32 entry, HighGuid guidhigh)
|
||||
{
|
||||
{
|
||||
if (!m_uint32Values) _InitValues();
|
||||
|
||||
uint64 guid = MAKE_NEW_GUID(guidlow, entry, guidhigh);
|
||||
@@ -143,7 +143,7 @@ void Object::_Create(uint32 guidlow, uint32 entry, HighGuid guidhigh)
|
||||
}
|
||||
|
||||
std::string Object::_ConcatFields(uint16 startIndex, uint16 size) const
|
||||
{
|
||||
{
|
||||
std::ostringstream ss;
|
||||
for (uint16 index = 0; index < size; ++index)
|
||||
ss << GetUInt32Value(index + startIndex) << ' ';
|
||||
@@ -151,7 +151,7 @@ std::string Object::_ConcatFields(uint16 startIndex, uint16 size) const
|
||||
}
|
||||
|
||||
void Object::AddToWorld()
|
||||
{
|
||||
{
|
||||
if (m_inWorld)
|
||||
return;
|
||||
|
||||
@@ -164,7 +164,7 @@ void Object::AddToWorld()
|
||||
}
|
||||
|
||||
void Object::RemoveFromWorld()
|
||||
{
|
||||
{
|
||||
if (!m_inWorld)
|
||||
return;
|
||||
|
||||
@@ -175,7 +175,7 @@ void Object::RemoveFromWorld()
|
||||
}
|
||||
|
||||
void Object::BuildMovementUpdateBlock(UpdateData* data, uint32 flags) const
|
||||
{
|
||||
{
|
||||
ByteBuffer buf(500);
|
||||
|
||||
buf << uint8(UPDATETYPE_MOVEMENT);
|
||||
@@ -187,7 +187,7 @@ void Object::BuildMovementUpdateBlock(UpdateData* data, uint32 flags) const
|
||||
}
|
||||
|
||||
void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const
|
||||
{
|
||||
{
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
@@ -246,7 +246,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
|
||||
}
|
||||
|
||||
void Object::SendUpdateToPlayer(Player* player)
|
||||
{
|
||||
{
|
||||
// send create update to player
|
||||
UpdateData upd;
|
||||
WorldPacket packet;
|
||||
@@ -257,7 +257,7 @@ void Object::SendUpdateToPlayer(Player* player)
|
||||
}
|
||||
|
||||
void Object::BuildValuesUpdateBlockForPlayer(UpdateData* data, Player* target) const
|
||||
{
|
||||
{
|
||||
ByteBuffer buf(500);
|
||||
|
||||
buf << (uint8) UPDATETYPE_VALUES;
|
||||
@@ -269,12 +269,12 @@ void Object::BuildValuesUpdateBlockForPlayer(UpdateData* data, Player* target) c
|
||||
}
|
||||
|
||||
void Object::BuildOutOfRangeUpdateBlock(UpdateData* data) const
|
||||
{
|
||||
{
|
||||
data->AddOutOfRangeGUID(GetGUID());
|
||||
}
|
||||
|
||||
void Object::DestroyForPlayer(Player* target, bool onDeath) const
|
||||
{
|
||||
{
|
||||
ASSERT(target);
|
||||
|
||||
if (isType(TYPEMASK_UNIT) || isType(TYPEMASK_PLAYER))
|
||||
@@ -299,7 +299,7 @@ void Object::DestroyForPlayer(Player* target, bool onDeath) const
|
||||
}
|
||||
|
||||
void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const
|
||||
{
|
||||
{
|
||||
Unit const* unit = NULL;
|
||||
WorldObject const* object = NULL;
|
||||
|
||||
@@ -455,7 +455,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const
|
||||
}
|
||||
|
||||
void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const
|
||||
{
|
||||
{
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
@@ -482,7 +482,7 @@ void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* targe
|
||||
}
|
||||
|
||||
void Object::ClearUpdateMask(bool remove)
|
||||
{
|
||||
{
|
||||
_changesMask.Clear();
|
||||
|
||||
if (m_objectUpdated)
|
||||
@@ -494,7 +494,7 @@ void Object::ClearUpdateMask(bool remove)
|
||||
}
|
||||
|
||||
void Object::BuildFieldsUpdate(Player* player, UpdateDataMapType& data_map) const
|
||||
{
|
||||
{
|
||||
UpdateDataMapType::iterator iter = data_map.find(player);
|
||||
|
||||
if (iter == data_map.end())
|
||||
@@ -508,7 +508,7 @@ void Object::BuildFieldsUpdate(Player* player, UpdateDataMapType& data_map) cons
|
||||
}
|
||||
|
||||
uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const
|
||||
{
|
||||
{
|
||||
uint32 visibleFlag = UF_FLAG_PUBLIC;
|
||||
|
||||
if (target == this)
|
||||
@@ -561,7 +561,7 @@ uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const
|
||||
}
|
||||
|
||||
void Object::_LoadIntoDataField(std::string const& data, uint32 startOffset, uint32 count)
|
||||
{
|
||||
{
|
||||
if (data.empty())
|
||||
return;
|
||||
|
||||
@@ -578,7 +578,7 @@ void Object::_LoadIntoDataField(std::string const& data, uint32 startOffset, uin
|
||||
}
|
||||
|
||||
void Object::SetInt32Value(uint16 index, int32 value)
|
||||
{
|
||||
{
|
||||
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
|
||||
|
||||
if (m_int32Values[index] != value)
|
||||
@@ -595,7 +595,7 @@ void Object::SetInt32Value(uint16 index, int32 value)
|
||||
}
|
||||
|
||||
void Object::SetUInt32Value(uint16 index, uint32 value)
|
||||
{
|
||||
{
|
||||
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
|
||||
|
||||
if (m_uint32Values[index] != value)
|
||||
@@ -612,7 +612,7 @@ void Object::SetUInt32Value(uint16 index, uint32 value)
|
||||
}
|
||||
|
||||
void Object::UpdateUInt32Value(uint16 index, uint32 value)
|
||||
{
|
||||
{
|
||||
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
|
||||
|
||||
m_uint32Values[index] = value;
|
||||
@@ -620,7 +620,7 @@ void Object::UpdateUInt32Value(uint16 index, uint32 value)
|
||||
}
|
||||
|
||||
void Object::SetUInt64Value(uint16 index, uint64 value)
|
||||
{
|
||||
{
|
||||
ASSERT(index + 1 < m_valuesCount || PrintIndexError(index, true));
|
||||
if (*((uint64*)&(m_uint32Values[index])) != value)
|
||||
{
|
||||
@@ -638,7 +638,7 @@ void Object::SetUInt64Value(uint16 index, uint64 value)
|
||||
}
|
||||
|
||||
bool Object::AddUInt64Value(uint16 index, uint64 value)
|
||||
{
|
||||
{
|
||||
ASSERT(index + 1 < m_valuesCount || PrintIndexError(index, true));
|
||||
if (value && !*((uint64*)&(m_uint32Values[index])))
|
||||
{
|
||||
@@ -660,7 +660,7 @@ bool Object::AddUInt64Value(uint16 index, uint64 value)
|
||||
}
|
||||
|
||||
bool Object::RemoveUInt64Value(uint16 index, uint64 value)
|
||||
{
|
||||
{
|
||||
ASSERT(index + 1 < m_valuesCount || PrintIndexError(index, true));
|
||||
if (value && *((uint64*)&(m_uint32Values[index])) == value)
|
||||
{
|
||||
@@ -682,7 +682,7 @@ bool Object::RemoveUInt64Value(uint16 index, uint64 value)
|
||||
}
|
||||
|
||||
void Object::SetFloatValue(uint16 index, float value)
|
||||
{
|
||||
{
|
||||
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
|
||||
|
||||
if (m_floatValues[index] != value)
|
||||
@@ -699,7 +699,7 @@ void Object::SetFloatValue(uint16 index, float value)
|
||||
}
|
||||
|
||||
void Object::SetByteValue(uint16 index, uint8 offset, uint8 value)
|
||||
{
|
||||
{
|
||||
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
|
||||
|
||||
if (offset > 3)
|
||||
@@ -723,7 +723,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));
|
||||
|
||||
if (offset > 1)
|
||||
@@ -747,7 +747,7 @@ void Object::SetUInt16Value(uint16 index, uint8 offset, uint16 value)
|
||||
}
|
||||
|
||||
void Object::SetStatFloatValue(uint16 index, float value)
|
||||
{
|
||||
{
|
||||
if (value < 0)
|
||||
value = 0.0f;
|
||||
|
||||
@@ -755,7 +755,7 @@ void Object::SetStatFloatValue(uint16 index, float value)
|
||||
}
|
||||
|
||||
void Object::SetStatInt32Value(uint16 index, int32 value)
|
||||
{
|
||||
{
|
||||
if (value < 0)
|
||||
value = 0;
|
||||
|
||||
@@ -763,7 +763,7 @@ void Object::SetStatInt32Value(uint16 index, int32 value)
|
||||
}
|
||||
|
||||
void Object::ApplyModUInt32Value(uint16 index, int32 val, bool apply)
|
||||
{
|
||||
{
|
||||
int32 cur = GetUInt32Value(index);
|
||||
cur += (apply ? val : -val);
|
||||
if (cur < 0)
|
||||
@@ -772,21 +772,21 @@ void Object::ApplyModUInt32Value(uint16 index, int32 val, bool apply)
|
||||
}
|
||||
|
||||
void Object::ApplyModInt32Value(uint16 index, int32 val, bool apply)
|
||||
{
|
||||
{
|
||||
int32 cur = GetInt32Value(index);
|
||||
cur += (apply ? val : -val);
|
||||
SetInt32Value(index, cur);
|
||||
}
|
||||
|
||||
void Object::ApplyModSignedFloatValue(uint16 index, float val, bool apply)
|
||||
{
|
||||
{
|
||||
float cur = GetFloatValue(index);
|
||||
cur += (apply ? val : -val);
|
||||
SetFloatValue(index, cur);
|
||||
}
|
||||
|
||||
void Object::ApplyModPositiveFloatValue(uint16 index, float val, bool apply)
|
||||
{
|
||||
{
|
||||
float cur = GetFloatValue(index);
|
||||
cur += (apply ? val : -val);
|
||||
if (cur < 0)
|
||||
@@ -795,7 +795,7 @@ void Object::ApplyModPositiveFloatValue(uint16 index, float val, bool apply)
|
||||
}
|
||||
|
||||
void Object::SetFlag(uint16 index, uint32 newFlag)
|
||||
{
|
||||
{
|
||||
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
|
||||
uint32 oldval = m_uint32Values[index];
|
||||
uint32 newval = oldval | newFlag;
|
||||
@@ -814,7 +814,7 @@ void Object::SetFlag(uint16 index, uint32 newFlag)
|
||||
}
|
||||
|
||||
void Object::RemoveFlag(uint16 index, uint32 oldFlag)
|
||||
{
|
||||
{
|
||||
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
|
||||
ASSERT(m_uint32Values);
|
||||
|
||||
@@ -835,7 +835,7 @@ void Object::RemoveFlag(uint16 index, uint32 oldFlag)
|
||||
}
|
||||
|
||||
void Object::SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
|
||||
{
|
||||
{
|
||||
ASSERT(index < m_valuesCount || PrintIndexError(index, true));
|
||||
|
||||
if (offset > 3)
|
||||
@@ -858,7 +858,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));
|
||||
|
||||
if (offset > 3)
|
||||
@@ -881,13 +881,22 @@ void Object::RemoveByteFlag(uint16 index, uint8 offset, uint8 oldFlag)
|
||||
}
|
||||
|
||||
bool Object::PrintIndexError(uint32 index, bool set) const
|
||||
{
|
||||
{
|
||||
sLog->outString("Attempt %s non-existed value field: %u (count: %u) for object typeid: %u type mask: %u", (set ? "set value to" : "get value from"), index, m_valuesCount, GetTypeId(), m_objectType);
|
||||
|
||||
// ASSERT must fail after function call
|
||||
return false;
|
||||
}
|
||||
|
||||
void Position::RelocatePolarOffset(float angle, float dist, float z /*= 0.0f*/)
|
||||
{
|
||||
SetOrientation(GetOrientation() + angle);
|
||||
|
||||
m_positionX = GetPositionX() + dist * std::cos(GetOrientation());
|
||||
m_positionY = GetPositionY() + dist * std::sin(GetOrientation());
|
||||
m_positionZ = GetPositionZ() + z;
|
||||
}
|
||||
|
||||
bool Position::HasInLine(WorldObject const* target, float width) const
|
||||
{
|
||||
if (!HasInArc(M_PI, target))
|
||||
@@ -985,7 +994,7 @@ void WorldObject::Update(uint32 time_diff)
|
||||
#endif
|
||||
|
||||
void WorldObject::SetWorldObject(bool on)
|
||||
{
|
||||
{
|
||||
if (!IsInWorld())
|
||||
return;
|
||||
|
||||
@@ -993,7 +1002,7 @@ void WorldObject::SetWorldObject(bool on)
|
||||
}
|
||||
|
||||
bool WorldObject::IsWorldObject() const
|
||||
{
|
||||
{
|
||||
if (m_isWorldObject)
|
||||
return true;
|
||||
|
||||
@@ -1004,7 +1013,7 @@ bool WorldObject::IsWorldObject() const
|
||||
}
|
||||
|
||||
void WorldObject::setActive(bool on)
|
||||
{
|
||||
{
|
||||
if (m_isActive == on)
|
||||
return;
|
||||
|
||||
@@ -1049,13 +1058,13 @@ void WorldObject::SetVisibilityDistanceOverride(bool isVisibilityDistanceOverrid
|
||||
}
|
||||
|
||||
void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
|
||||
{
|
||||
{
|
||||
if (IsInWorld())
|
||||
RemoveFromWorld();
|
||||
}
|
||||
|
||||
void WorldObject::_Create(uint32 guidlow, HighGuid guidhigh, uint32 phaseMask)
|
||||
{
|
||||
{
|
||||
Object::_Create(guidlow, 0, guidhigh);
|
||||
SetPhaseMask(phaseMask, false);
|
||||
}
|
||||
@@ -1076,13 +1085,13 @@ void WorldObject::GetZoneAndAreaId(uint32& zoneid, uint32& areaid, bool /*forceR
|
||||
}
|
||||
|
||||
InstanceScript* WorldObject::GetInstanceScript()
|
||||
{
|
||||
{
|
||||
Map* map = GetMap();
|
||||
return map->IsDungeon() ? map->ToInstanceMap()->GetInstanceScript() : NULL;
|
||||
}
|
||||
|
||||
float WorldObject::GetDistanceZ(const WorldObject* obj) const
|
||||
{
|
||||
{
|
||||
float dz = fabs(GetPositionZ() - obj->GetPositionZ());
|
||||
float sizefactor = GetObjectSize() + obj->GetObjectSize();
|
||||
float dist = dz - sizefactor;
|
||||
@@ -1090,7 +1099,7 @@ float WorldObject::GetDistanceZ(const WorldObject* obj) const
|
||||
}
|
||||
|
||||
bool WorldObject::_IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D) const
|
||||
{
|
||||
{
|
||||
float sizefactor = GetObjectSize() + obj->GetObjectSize();
|
||||
float maxdist = dist2compare + sizefactor;
|
||||
|
||||
@@ -1129,7 +1138,7 @@ Position WorldObject::GetHitSpherePointFor(Position const& dest) const
|
||||
}
|
||||
|
||||
bool WorldObject::IsWithinLOS(float ox, float oy, float oz, LineOfSightChecks checks) const
|
||||
{
|
||||
{
|
||||
if (IsInWorld())
|
||||
{
|
||||
float x, y, z;
|
||||
@@ -1166,7 +1175,7 @@ void WorldObject::GetHitSpherePointFor(Position const& dest, float& x, float& y,
|
||||
}
|
||||
|
||||
bool WorldObject::GetDistanceOrder(WorldObject const* obj1, WorldObject const* obj2, bool is3D /* = true */) const
|
||||
{
|
||||
{
|
||||
float dx1 = GetPositionX() - obj1->GetPositionX();
|
||||
float dy1 = GetPositionY() - obj1->GetPositionY();
|
||||
float distsq1 = dx1*dx1 + dy1*dy1;
|
||||
@@ -1189,7 +1198,7 @@ bool WorldObject::GetDistanceOrder(WorldObject const* obj1, WorldObject const* o
|
||||
}
|
||||
|
||||
bool WorldObject::IsInRange(WorldObject const* obj, float minRange, float maxRange, bool is3D /* = true */) const
|
||||
{
|
||||
{
|
||||
float dx = GetPositionX() - obj->GetPositionX();
|
||||
float dy = GetPositionY() - obj->GetPositionY();
|
||||
float distsq = dx*dx + dy*dy;
|
||||
@@ -1214,7 +1223,7 @@ bool WorldObject::IsInRange(WorldObject const* obj, float minRange, float maxRan
|
||||
}
|
||||
|
||||
bool WorldObject::IsInRange2d(float x, float y, float minRange, float maxRange) const
|
||||
{
|
||||
{
|
||||
float dx = GetPositionX() - x;
|
||||
float dy = GetPositionY() - y;
|
||||
float distsq = dx*dx + dy*dy;
|
||||
@@ -1234,7 +1243,7 @@ bool WorldObject::IsInRange2d(float x, float y, float minRange, float maxRange)
|
||||
}
|
||||
|
||||
bool WorldObject::IsInRange3d(float x, float y, float z, float minRange, float maxRange) const
|
||||
{
|
||||
{
|
||||
float dx = GetPositionX() - x;
|
||||
float dy = GetPositionY() - y;
|
||||
float dz = GetPositionZ() - z;
|
||||
@@ -1359,23 +1368,23 @@ bool Position::HasInArc(float arc, const Position* obj, float targetRadius) cons
|
||||
float lborder = -1 * (arc/2.0f); // in range -pi..0
|
||||
float rborder = (arc/2.0f); // in range 0..pi
|
||||
|
||||
// pussywizard: take into consideration target size
|
||||
if (targetRadius > 0.0f)
|
||||
{
|
||||
float distSq = GetExactDist2dSq(obj);
|
||||
// pussywizard: at least a part of target's model is in every direction
|
||||
if (distSq < targetRadius*targetRadius)
|
||||
return true;
|
||||
float angularRadius = 2.0f * atan(targetRadius / (2.0f * sqrt(distSq)));
|
||||
lborder -= angularRadius;
|
||||
rborder += angularRadius;
|
||||
// pussywizard: take into consideration target size
|
||||
if (targetRadius > 0.0f)
|
||||
{
|
||||
float distSq = GetExactDist2dSq(obj);
|
||||
// pussywizard: at least a part of target's model is in every direction
|
||||
if (distSq < targetRadius*targetRadius)
|
||||
return true;
|
||||
float angularRadius = 2.0f * atan(targetRadius / (2.0f * sqrt(distSq)));
|
||||
lborder -= angularRadius;
|
||||
rborder += angularRadius;
|
||||
}
|
||||
|
||||
return ((angle >= lborder) && (angle <= rborder));
|
||||
}
|
||||
|
||||
bool WorldObject::IsInBetween(const WorldObject* obj1, const WorldObject* obj2, float size) const
|
||||
{
|
||||
{
|
||||
if (!obj1 || !obj2)
|
||||
return false;
|
||||
|
||||
@@ -1397,17 +1406,17 @@ bool WorldObject::IsInBetween(const WorldObject* obj1, const WorldObject* obj2,
|
||||
}
|
||||
|
||||
bool WorldObject::isInFront(WorldObject const* target, float arc) const
|
||||
{
|
||||
{
|
||||
return HasInArc(arc, target);
|
||||
}
|
||||
|
||||
bool WorldObject::isInBack(WorldObject const* target, float arc) const
|
||||
{
|
||||
{
|
||||
return !HasInArc(2 * M_PI - arc, target);
|
||||
}
|
||||
|
||||
void WorldObject::GetRandomPoint(const Position &pos, float distance, float &rand_x, float &rand_y, float &rand_z) const
|
||||
{
|
||||
{
|
||||
if (!distance)
|
||||
{
|
||||
pos.GetPosition(rand_x, rand_y, rand_z);
|
||||
@@ -1428,14 +1437,14 @@ void WorldObject::GetRandomPoint(const Position &pos, float distance, float &ran
|
||||
}
|
||||
|
||||
void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const
|
||||
{
|
||||
{
|
||||
float new_z = GetMap()->GetHeight(GetPhaseMask(), x, y, z /*+ 2.0f*/, true); // pussywizard: +2.0f is added in all inner functions
|
||||
if (new_z > INVALID_HEIGHT)
|
||||
z = new_z + 0.05f; // just to be sure that we are not a few pixel under the surface
|
||||
}
|
||||
|
||||
void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const
|
||||
{
|
||||
{
|
||||
// TODO: Allow transports to be part of dynamic vmap tree
|
||||
//if (GetTransport())
|
||||
// return;
|
||||
@@ -1508,7 +1517,7 @@ bool Position::IsPositionValid() const
|
||||
}
|
||||
|
||||
float WorldObject::GetGridActivationRange() const
|
||||
{
|
||||
{
|
||||
if (ToPlayer())
|
||||
return IsInWintergrasp() ? VISIBILITY_DIST_WINTERGRASP : GetMap()->GetVisibilityRange();
|
||||
else if (ToCreature())
|
||||
@@ -1520,7 +1529,7 @@ float WorldObject::GetGridActivationRange() const
|
||||
}
|
||||
|
||||
float WorldObject::GetVisibilityRange() const
|
||||
{
|
||||
{
|
||||
if (IsVisibilityOverridden() && GetTypeId() == TYPEID_UNIT)
|
||||
return MAX_VISIBILITY_DISTANCE;
|
||||
else if (GetTypeId() == TYPEID_GAMEOBJECT)
|
||||
@@ -1537,7 +1546,7 @@ float WorldObject::GetVisibilityRange() const
|
||||
}
|
||||
|
||||
float WorldObject::GetSightRange(const WorldObject* target) const
|
||||
{
|
||||
{
|
||||
if (ToUnit())
|
||||
{
|
||||
if (ToPlayer())
|
||||
@@ -1684,7 +1693,7 @@ bool WorldObject::CanNeverSee(WorldObject const* obj) const
|
||||
}
|
||||
|
||||
bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool checkClient, bool checkAlert) const
|
||||
{
|
||||
{
|
||||
const WorldObject* seer = this;
|
||||
|
||||
// Pets don't have detection, they use the detection of their masters
|
||||
@@ -1717,7 +1726,7 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool che
|
||||
}
|
||||
|
||||
bool WorldObject::CanDetectInvisibilityOf(WorldObject const* obj) const
|
||||
{
|
||||
{
|
||||
uint32 mask = obj->m_invisibility.GetFlags() & m_invisibilityDetect.GetFlags();
|
||||
// xinef: include invisible flags of caster in the mask, 2 invisible objects should be able to detect eachother
|
||||
mask |= obj->m_invisibility.GetFlags() & m_invisibility.GetFlags();
|
||||
@@ -1759,7 +1768,7 @@ bool WorldObject::CanDetectInvisibilityOf(WorldObject const* obj) const
|
||||
}
|
||||
|
||||
bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) const
|
||||
{
|
||||
{
|
||||
// Combat reach is the minimal distance (both in front and behind),
|
||||
// and it is also used in the range calculation.
|
||||
// One stealth point increases the visibility range by 0.3 yard.
|
||||
@@ -1839,7 +1848,7 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) co
|
||||
}
|
||||
|
||||
void WorldObject::SendPlaySound(uint32 Sound, bool OnlySelf)
|
||||
{
|
||||
{
|
||||
WorldPacket data(SMSG_PLAY_SOUND, 4);
|
||||
data << Sound;
|
||||
if (OnlySelf && GetTypeId() == TYPEID_PLAYER)
|
||||
@@ -1859,7 +1868,7 @@ void WorldObject::SendPlayMusic(uint32 Music, bool OnlySelf)
|
||||
}
|
||||
|
||||
void Object::ForceValuesUpdateAtIndex(uint32 i)
|
||||
{
|
||||
{
|
||||
_changesMask.SetBit(i);
|
||||
if (m_inWorld && !m_objectUpdated)
|
||||
{
|
||||
@@ -1919,7 +1928,7 @@ namespace acore
|
||||
} // namespace acore
|
||||
|
||||
void WorldObject::MonsterSay(const char* text, uint32 language, WorldObject const* target)
|
||||
{
|
||||
{
|
||||
CellCoord p = acore::ComputeCellCoord(GetPositionX(), GetPositionY());
|
||||
|
||||
Cell cell(p);
|
||||
@@ -1933,7 +1942,7 @@ void WorldObject::MonsterSay(const char* text, uint32 language, WorldObject cons
|
||||
}
|
||||
|
||||
void WorldObject::MonsterSay(int32 textId, uint32 language, WorldObject const* target)
|
||||
{
|
||||
{
|
||||
CellCoord p = acore::ComputeCellCoord(GetPositionX(), GetPositionY());
|
||||
|
||||
Cell cell(p);
|
||||
@@ -1947,7 +1956,7 @@ void WorldObject::MonsterSay(int32 textId, uint32 language, WorldObject const* t
|
||||
}
|
||||
|
||||
void WorldObject::MonsterYell(const char* text, uint32 language, WorldObject const* target)
|
||||
{
|
||||
{
|
||||
CellCoord p = acore::ComputeCellCoord(GetPositionX(), GetPositionY());
|
||||
|
||||
Cell cell(p);
|
||||
@@ -1961,7 +1970,7 @@ void WorldObject::MonsterYell(const char* text, uint32 language, WorldObject con
|
||||
}
|
||||
|
||||
void WorldObject::MonsterYell(int32 textId, uint32 language, WorldObject const* target)
|
||||
{
|
||||
{
|
||||
CellCoord p = acore::ComputeCellCoord(GetPositionX(), GetPositionY());
|
||||
|
||||
Cell cell(p);
|
||||
@@ -1975,7 +1984,7 @@ void WorldObject::MonsterYell(int32 textId, uint32 language, WorldObject const*
|
||||
}
|
||||
|
||||
void WorldObject::MonsterTextEmote(const char* text, WorldObject const* target, bool IsBossEmote)
|
||||
{
|
||||
{
|
||||
WorldPacket data;
|
||||
ChatHandler::BuildChatPacket(data, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, LANG_UNIVERSAL,
|
||||
this, target, text);
|
||||
@@ -1983,7 +1992,7 @@ void WorldObject::MonsterTextEmote(const char* text, WorldObject const* target,
|
||||
}
|
||||
|
||||
void WorldObject::MonsterTextEmote(int32 textId, WorldObject const* target, bool IsBossEmote)
|
||||
{
|
||||
{
|
||||
CellCoord p = acore::ComputeCellCoord(GetPositionX(), GetPositionY());
|
||||
|
||||
Cell cell(p);
|
||||
@@ -1997,7 +2006,7 @@ void WorldObject::MonsterTextEmote(int32 textId, WorldObject const* target, bool
|
||||
}
|
||||
|
||||
void WorldObject::MonsterWhisper(const char* text, Player const* target, bool IsBossWhisper)
|
||||
{
|
||||
{
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
@@ -2008,7 +2017,7 @@ void WorldObject::MonsterWhisper(const char* text, Player const* target, bool Is
|
||||
}
|
||||
|
||||
void WorldObject::MonsterWhisper(int32 textId, Player const* target, bool IsBossWhisper)
|
||||
{
|
||||
{
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
@@ -2028,7 +2037,7 @@ void WorldObject::MonsterWhisper(int32 textId, Player const* target, bool IsBoss
|
||||
}
|
||||
|
||||
void Unit::BuildHeartBeatMsg(WorldPacket* data) const
|
||||
{
|
||||
{
|
||||
data->Initialize(MSG_MOVE_HEARTBEAT, 32);
|
||||
data->append(GetPackGUID());
|
||||
BuildMovementPacket(data);
|
||||
@@ -2036,7 +2045,7 @@ void Unit::BuildHeartBeatMsg(WorldPacket* data) const
|
||||
|
||||
// pussywizard!
|
||||
void WorldObject::SendMessageToSetInRange(WorldPacket* data, float dist, bool /*self*/, bool includeMargin, Player const* skipped_rcvr)
|
||||
{
|
||||
{
|
||||
dist += GetObjectSize();
|
||||
if (includeMargin)
|
||||
dist += VISIBILITY_COMPENSATION; // pussywizard: to ensure everyone receives all important packets
|
||||
@@ -2045,14 +2054,14 @@ void WorldObject::SendMessageToSetInRange(WorldPacket* data, float dist, bool /*
|
||||
}
|
||||
|
||||
void WorldObject::SendObjectDeSpawnAnim(uint64 guid)
|
||||
{
|
||||
{
|
||||
WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8);
|
||||
data << uint64(guid);
|
||||
SendMessageToSet(&data, true);
|
||||
}
|
||||
|
||||
void WorldObject::SetMap(Map* map)
|
||||
{
|
||||
{
|
||||
ASSERT(map);
|
||||
ASSERT(!IsInWorld() || GetTypeId() == TYPEID_CORPSE);
|
||||
if (m_currMap == map) // command add npc: first create, than loadfromdb
|
||||
@@ -2077,7 +2086,7 @@ void WorldObject::SetMap(Map* map)
|
||||
}
|
||||
|
||||
void WorldObject::ResetMap()
|
||||
{
|
||||
{
|
||||
ASSERT(m_currMap);
|
||||
ASSERT(!IsInWorld());
|
||||
if (IsWorldObject())
|
||||
@@ -2095,13 +2104,13 @@ void WorldObject::ResetMap()
|
||||
}
|
||||
|
||||
Map const* WorldObject::GetBaseMap() const
|
||||
{
|
||||
{
|
||||
ASSERT(m_currMap);
|
||||
return m_currMap->GetParent();
|
||||
}
|
||||
|
||||
void WorldObject::AddObjectToRemoveList()
|
||||
{
|
||||
{
|
||||
ASSERT(m_uint32Values);
|
||||
|
||||
Map* map = FindMap();
|
||||
@@ -2115,7 +2124,7 @@ void WorldObject::AddObjectToRemoveList()
|
||||
}
|
||||
|
||||
TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= NULL*/, uint32 duration /*= 0*/, Unit* summoner /*= NULL*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/)
|
||||
{
|
||||
{
|
||||
uint32 mask = UNIT_MASK_SUMMON;
|
||||
if (properties)
|
||||
{
|
||||
@@ -2219,7 +2228,7 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert
|
||||
*/
|
||||
|
||||
void Map::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list /*= NULL*/)
|
||||
{
|
||||
{
|
||||
std::vector<TempSummonData> const* data = sObjectMgr->GetSummonGroup(GetId(), SUMMONER_TYPE_MAP, group);
|
||||
if (!data)
|
||||
return;
|
||||
@@ -2231,7 +2240,7 @@ void Map::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list /*= NULL
|
||||
}
|
||||
|
||||
GameObject* Map::SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport)
|
||||
{
|
||||
{
|
||||
GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
|
||||
if (!goinfo)
|
||||
{
|
||||
@@ -2257,7 +2266,7 @@ GameObject* Map::SummonGameObject(uint32 entry, float x, float y, float z, float
|
||||
}
|
||||
|
||||
void WorldObject::SetZoneScript()
|
||||
{
|
||||
{
|
||||
if (Map* map = FindMap())
|
||||
{
|
||||
if (map->IsDungeon())
|
||||
@@ -2274,7 +2283,7 @@ void WorldObject::SetZoneScript()
|
||||
}
|
||||
|
||||
TempSummon* WorldObject::SummonCreature(uint32 entry, const Position &pos, TempSummonType spwtype, uint32 duration, uint32 /*vehId*/, SummonPropertiesEntry const *properties) const
|
||||
{
|
||||
{
|
||||
if (Map* map = FindMap())
|
||||
{
|
||||
if (TempSummon* summon = map->SummonCreature(entry, pos, properties, duration, isType(TYPEMASK_UNIT) ? (Unit*)this : NULL))
|
||||
@@ -2288,7 +2297,7 @@ TempSummon* WorldObject::SummonCreature(uint32 entry, const Position &pos, TempS
|
||||
}
|
||||
|
||||
GameObject* WorldObject::SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport)
|
||||
{
|
||||
{
|
||||
if (!IsInWorld())
|
||||
return NULL;
|
||||
|
||||
@@ -2323,7 +2332,7 @@ GameObject* WorldObject::SummonGameObject(uint32 entry, float x, float y, float
|
||||
}
|
||||
|
||||
Creature* WorldObject::SummonTrigger(float x, float y, float z, float ang, uint32 duration, bool setLevel, CreatureAI* (*GetAI)(Creature*))
|
||||
{
|
||||
{
|
||||
TempSummonType summonType = (duration == 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN;
|
||||
Creature* summon = SummonCreature(WORLD_TRIGGER, x, y, z, ang, summonType, duration);
|
||||
if (!summon)
|
||||
@@ -2351,7 +2360,7 @@ Creature* WorldObject::SummonTrigger(float x, float y, float z, float ang, uint3
|
||||
* @param list List to store pointers to summoned creatures.
|
||||
*/
|
||||
void WorldObject::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list /*= NULL*/)
|
||||
{
|
||||
{
|
||||
ASSERT((GetTypeId() == TYPEID_GAMEOBJECT || GetTypeId() == TYPEID_UNIT) && "Only GOs and creatures can summon npc groups!");
|
||||
|
||||
std::vector<TempSummonData> const* data = sObjectMgr->GetSummonGroup(GetEntry(), GetTypeId() == TYPEID_GAMEOBJECT ? SUMMONER_TYPE_GAMEOBJECT : SUMMONER_TYPE_CREATURE, group);
|
||||
@@ -2365,7 +2374,7 @@ void WorldObject::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list
|
||||
}
|
||||
|
||||
Creature* WorldObject::FindNearestCreature(uint32 entry, float range, bool alive) const
|
||||
{
|
||||
{
|
||||
Creature* creature = NULL;
|
||||
acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck checker(*this, entry, alive, range);
|
||||
acore::CreatureLastSearcher<acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(this, creature, checker);
|
||||
@@ -2374,7 +2383,7 @@ Creature* WorldObject::FindNearestCreature(uint32 entry, float range, bool alive
|
||||
}
|
||||
|
||||
GameObject* WorldObject::FindNearestGameObject(uint32 entry, float range) const
|
||||
{
|
||||
{
|
||||
GameObject* go = NULL;
|
||||
acore::NearestGameObjectEntryInObjectRangeCheck checker(*this, entry, range);
|
||||
acore::GameObjectLastSearcher<acore::NearestGameObjectEntryInObjectRangeCheck> searcher(this, go, checker);
|
||||
@@ -2383,7 +2392,7 @@ GameObject* WorldObject::FindNearestGameObject(uint32 entry, float range) const
|
||||
}
|
||||
|
||||
GameObject* WorldObject::FindNearestGameObjectOfType(GameobjectTypes type, float range) const
|
||||
{
|
||||
{
|
||||
GameObject* go = NULL;
|
||||
acore::NearestGameObjectTypeInObjectRangeCheck checker(*this, type, range);
|
||||
acore::GameObjectLastSearcher<acore::NearestGameObjectTypeInObjectRangeCheck> searcher(this, go, checker);
|
||||
@@ -2392,7 +2401,7 @@ GameObject* WorldObject::FindNearestGameObjectOfType(GameobjectTypes type, float
|
||||
}
|
||||
|
||||
Player* WorldObject::SelectNearestPlayer(float distance) const
|
||||
{
|
||||
{
|
||||
Player* target = NULL;
|
||||
|
||||
acore::NearestPlayerInObjectRangeCheck checker(this, distance);
|
||||
@@ -2403,7 +2412,7 @@ Player* WorldObject::SelectNearestPlayer(float distance) const
|
||||
}
|
||||
|
||||
void WorldObject::GetGameObjectListWithEntryInGrid(std::list<GameObject*>& gameobjectList, uint32 entry, float maxSearchRange) const
|
||||
{
|
||||
{
|
||||
CellCoord pair(acore::ComputeCellCoord(this->GetPositionX(), this->GetPositionY()));
|
||||
Cell cell(pair);
|
||||
cell.SetNoCreate();
|
||||
@@ -2416,7 +2425,7 @@ void WorldObject::GetGameObjectListWithEntryInGrid(std::list<GameObject*>& gameo
|
||||
}
|
||||
|
||||
void WorldObject::GetCreatureListWithEntryInGrid(std::list<Creature*>& creatureList, uint32 entry, float maxSearchRange) const
|
||||
{
|
||||
{
|
||||
CellCoord pair(acore::ComputeCellCoord(this->GetPositionX(), this->GetPositionY()));
|
||||
Cell cell(pair);
|
||||
cell.SetNoCreate();
|
||||
@@ -2504,7 +2513,7 @@ namespace acore
|
||||
//===================================================================================================
|
||||
|
||||
void WorldObject::GetNearPoint2D(float &x, float &y, float distance2d, float absAngle) const
|
||||
{
|
||||
{
|
||||
x = GetPositionX() + (GetObjectSize() + distance2d) * cos(absAngle);
|
||||
y = GetPositionY() + (GetObjectSize() + distance2d) * sin(absAngle);
|
||||
|
||||
@@ -2513,7 +2522,7 @@ void WorldObject::GetNearPoint2D(float &x, float &y, float distance2d, float abs
|
||||
}
|
||||
|
||||
void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ) const
|
||||
{
|
||||
{
|
||||
GetNearPoint2D(x, y, distance2d+searcher_size, absAngle);
|
||||
z = GetPositionZ();
|
||||
if (searcher)
|
||||
@@ -2560,7 +2569,7 @@ void WorldObject::GetVoidClosePoint(float& x, float& y, float& z, float size, fl
|
||||
}
|
||||
|
||||
bool WorldObject::GetClosePoint(float &x, float &y, float &z, float size, float distance2d, float angle, const WorldObject* forWho, bool force) const
|
||||
{
|
||||
{
|
||||
// angle calculated from current orientation
|
||||
GetNearPoint(forWho, x, y, z, size, distance2d, GetOrientation() + angle);
|
||||
|
||||
@@ -2589,7 +2598,7 @@ bool WorldObject::GetClosePoint(float &x, float &y, float &z, float size, float
|
||||
}
|
||||
|
||||
void WorldObject::GetContactPoint(const WorldObject* obj, float &x, float &y, float &z, float distance2d) const
|
||||
{
|
||||
{
|
||||
// angle to face `obj` to `this` using distance includes size of `obj`
|
||||
GetNearPoint(obj, x, y, z, obj->GetObjectSize(), distance2d, GetAngle(obj));
|
||||
|
||||
@@ -2604,7 +2613,7 @@ void WorldObject::GetContactPoint(const WorldObject* obj, float &x, float &y, fl
|
||||
|
||||
|
||||
void WorldObject::GetChargeContactPoint(const WorldObject* obj, float &x, float &y, float &z, float distance2d) const
|
||||
{
|
||||
{
|
||||
// angle to face `obj` to `this` using distance includes size of `obj`
|
||||
GetNearPoint(obj, x, y, z, obj->GetObjectSize(), distance2d, GetAngle(obj));
|
||||
|
||||
@@ -2618,7 +2627,7 @@ void WorldObject::GetChargeContactPoint(const WorldObject* obj, float &x, float
|
||||
}
|
||||
|
||||
void WorldObject::MovePosition(Position &pos, float dist, float angle)
|
||||
{
|
||||
{
|
||||
angle += m_orientation;
|
||||
float destx, desty, destz, ground, floor;
|
||||
destx = pos.m_positionX + dist * cos(angle);
|
||||
@@ -2662,7 +2671,7 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle)
|
||||
}
|
||||
|
||||
void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float angle)
|
||||
{
|
||||
{
|
||||
angle += m_orientation;
|
||||
float destx, desty, destz;
|
||||
destx = pos.m_positionX + dist * cos(angle);
|
||||
@@ -2763,7 +2772,7 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float
|
||||
}
|
||||
|
||||
void WorldObject::MovePositionToFirstCollisionForTotem(Position &pos, float dist, float angle, bool forGameObject)
|
||||
{
|
||||
{
|
||||
angle += m_orientation;
|
||||
float destx, desty, destz, ground, floor;
|
||||
pos.m_positionZ += 2.0f;
|
||||
@@ -2865,7 +2874,7 @@ void WorldObject::SetPhaseMask(uint32 newPhaseMask, bool update)
|
||||
}
|
||||
|
||||
void WorldObject::PlayDistanceSound(uint32 sound_id, Player* target /*= NULL*/)
|
||||
{
|
||||
{
|
||||
WorldPacket data(SMSG_PLAY_OBJECT_SOUND, 4+8);
|
||||
data << uint32(sound_id);
|
||||
data << uint64(GetGUID());
|
||||
@@ -2876,7 +2885,7 @@ void WorldObject::PlayDistanceSound(uint32 sound_id, Player* target /*= NULL*/)
|
||||
}
|
||||
|
||||
void WorldObject::PlayDirectSound(uint32 sound_id, Player* target /*= NULL*/)
|
||||
{
|
||||
{
|
||||
WorldPacket data(SMSG_PLAY_SOUND, 4);
|
||||
data << uint32(sound_id);
|
||||
if (target)
|
||||
@@ -2886,7 +2895,7 @@ void WorldObject::PlayDirectSound(uint32 sound_id, Player* target /*= NULL*/)
|
||||
}
|
||||
|
||||
void WorldObject::DestroyForNearbyPlayers()
|
||||
{
|
||||
{
|
||||
if (!IsInWorld())
|
||||
return;
|
||||
|
||||
@@ -2913,14 +2922,14 @@ void WorldObject::DestroyForNearbyPlayers()
|
||||
}
|
||||
|
||||
void WorldObject::UpdateObjectVisibility(bool /*forced*/, bool /*fromUpdate*/)
|
||||
{
|
||||
{
|
||||
//updates object's visibility for nearby players
|
||||
acore::VisibleChangesNotifier notifier(*this);
|
||||
VisitNearbyWorldObject(GetVisibilityRange()+VISIBILITY_COMPENSATION, notifier);
|
||||
}
|
||||
|
||||
void WorldObject::AddToNotify(uint16 f)
|
||||
{
|
||||
{
|
||||
if (!(m_notifyflags & f))
|
||||
if (Unit* u = ToUnit())
|
||||
{
|
||||
@@ -3019,7 +3028,7 @@ struct WorldObjectChangeAccumulator
|
||||
};
|
||||
|
||||
void WorldObject::BuildUpdate(UpdateDataMapType& data_map, UpdatePlayerSet& player_set)
|
||||
{
|
||||
{
|
||||
CellCoord p = acore::ComputeCellCoord(GetPositionX(), GetPositionY());
|
||||
Cell cell(p);
|
||||
cell.SetNoCreate();
|
||||
@@ -3033,7 +3042,7 @@ void WorldObject::BuildUpdate(UpdateDataMapType& data_map, UpdatePlayerSet& play
|
||||
}
|
||||
|
||||
void WorldObject::GetCreaturesWithEntryInRange(std::list<Creature*> &creatureList, float radius, uint32 entry)
|
||||
{
|
||||
{
|
||||
CellCoord pair(acore::ComputeCellCoord(this->GetPositionX(), this->GetPositionY()));
|
||||
Cell cell(pair);
|
||||
cell.SetNoCreate();
|
||||
@@ -3049,7 +3058,7 @@ void WorldObject::GetCreaturesWithEntryInRange(std::list<Creature*> &creatureLis
|
||||
}
|
||||
|
||||
uint64 WorldObject::GetTransGUID() const
|
||||
{
|
||||
{
|
||||
if (GetTransport())
|
||||
return GetTransport()->GetGUID();
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user