mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 18:15:31 +01:00
Core/Object: Bump hover delta handling on nearpoints downstack into GetNearPoint2D (from movement generators); functionality should be unchanged
(cherry picked from commit ebc96af6bb)
This commit is contained in:
@@ -2972,20 +2972,40 @@ void WorldObject::GetPlayerListInGrid(Container& playerContainer, float maxSearc
|
||||
Cell::VisitWorldObjects(this, searcher, maxSearchRange);
|
||||
}
|
||||
|
||||
void WorldObject::GetNearPoint2D(float &x, float &y, float distance2d, float absAngle) const
|
||||
void WorldObject::GetNearPoint2D(WorldObject const* searcher, float &x, float &y, float distance2d, float absAngle) const
|
||||
{
|
||||
x = GetPositionX() + (GetCombatReach() + distance2d) * std::cos(absAngle);
|
||||
y = GetPositionY() + (GetCombatReach() + distance2d) * std::sin(absAngle);
|
||||
float effectiveReach = GetCombatReach();
|
||||
|
||||
if (searcher)
|
||||
{
|
||||
effectiveReach += searcher->GetCombatReach();
|
||||
|
||||
if (this != searcher)
|
||||
{
|
||||
float myHover = 0.0f, searcherHover = 0.0f;
|
||||
if (Unit const* unit = ToUnit())
|
||||
myHover = unit->GetHoverOffset();
|
||||
if (Unit const* searchUnit = searcher->ToUnit())
|
||||
searcherHover = searchUnit->GetHoverOffset();
|
||||
|
||||
float hoverDelta = myHover - searcherHover;
|
||||
if (hoverDelta != 0.0f)
|
||||
effectiveReach = std::sqrt(effectiveReach * effectiveReach - hoverDelta * hoverDelta);
|
||||
}
|
||||
}
|
||||
|
||||
x = GetPositionX() + (effectiveReach + distance2d) * std::cos(absAngle);
|
||||
y = GetPositionY() + (effectiveReach + distance2d) * std::sin(absAngle);
|
||||
|
||||
Trinity::NormalizeMapCoord(x);
|
||||
Trinity::NormalizeMapCoord(y);
|
||||
}
|
||||
|
||||
void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle) const
|
||||
void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y, float &z, float distance2d, float absAngle) const
|
||||
{
|
||||
GetNearPoint2D(x, y, distance2d+searcher_size, absAngle);
|
||||
GetNearPoint2D(searcher, x, y, distance2d, absAngle);
|
||||
z = GetPositionZ();
|
||||
|
||||
|
||||
(searcher ? searcher : this)->UpdateAllowedPositionZ(x, y, z);
|
||||
|
||||
// if detection disabled, return first point
|
||||
@@ -3004,7 +3024,7 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y,
|
||||
// loop in a circle to look for a point in LoS using small steps
|
||||
for (float angle = float(M_PI) / 8; angle < float(M_PI) * 2; angle += float(M_PI) / 8)
|
||||
{
|
||||
GetNearPoint2D(x, y, distance2d + searcher_size, absAngle + angle);
|
||||
GetNearPoint2D(searcher, x, y, distance2d, absAngle + angle);
|
||||
z = GetPositionZ();
|
||||
(searcher ? searcher : this)->UpdateAllowedPositionZ(x, y, z);
|
||||
if (IsWithinLOS(x, y, z))
|
||||
@@ -3017,10 +3037,10 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y,
|
||||
z = first_z;
|
||||
}
|
||||
|
||||
void WorldObject::GetClosePoint(float &x, float &y, float &z, float size, float distance2d /*= 0*/, float angle /*= 0*/) const
|
||||
void WorldObject::GetClosePoint(float &x, float &y, float &z, float size, float distance2d /*= 0*/, float relAngle /*= 0*/) const
|
||||
{
|
||||
// angle calculated from current orientation
|
||||
GetNearPoint(nullptr, x, y, z, size, distance2d, GetOrientation() + angle);
|
||||
GetNearPoint(nullptr, x, y, z, distance2d+size, GetOrientation() + relAngle);
|
||||
}
|
||||
|
||||
Position WorldObject::GetNearPosition(float dist, float angle)
|
||||
@@ -3047,7 +3067,7 @@ Position WorldObject::GetRandomNearPosition(float radius)
|
||||
void WorldObject::GetContactPoint(WorldObject const* obj, float& x, float& y, float& z, float distance2d /*= CONTACT_DISTANCE*/) const
|
||||
{
|
||||
// angle to face `obj` to `this` using distance includes size of `obj`
|
||||
GetNearPoint(obj, x, y, z, obj->GetCombatReach(), distance2d, GetAbsoluteAngle(obj));
|
||||
GetNearPoint(obj, x, y, z, distance2d, GetAbsoluteAngle(obj));
|
||||
}
|
||||
|
||||
void WorldObject::MovePosition(Position &pos, float dist, float angle)
|
||||
|
||||
@@ -419,8 +419,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
|
||||
void AddToWorld() override;
|
||||
void RemoveFromWorld() override;
|
||||
|
||||
void GetNearPoint2D(float &x, float &y, float distance, float absAngle) const;
|
||||
void GetNearPoint(WorldObject const* searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle) const;
|
||||
void GetNearPoint2D(WorldObject const* searcher, float &x, float &y, float distance, float absAngle) const;
|
||||
void GetNearPoint(WorldObject const* searcher, float &x, float &y, float &z, float distance2d, float absAngle) const;
|
||||
void GetClosePoint(float &x, float &y, float &z, float size, float distance2d = 0, float relAngle = 0) const;
|
||||
void MovePosition(Position &pos, float dist, float angle);
|
||||
Position GetNearPosition(float dist, float angle);
|
||||
|
||||
@@ -432,7 +432,7 @@ void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, floa
|
||||
float dist = 2 * moveTimeHalf * speedXY;
|
||||
float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
|
||||
|
||||
_owner->GetNearPoint(_owner, x, y, z, _owner->GetCombatReach(), dist, _owner->GetAbsoluteAngle(srcX, srcY) + float(M_PI));
|
||||
_owner->GetNearPoint(_owner, x, y, z, dist, _owner->GetAbsoluteAngle(srcX, srcY) + float(M_PI));
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
init.MoveTo(x, y, z);
|
||||
@@ -456,7 +456,7 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ)
|
||||
|
||||
float moveTimeHalf = speedZ / Movement::gravity;
|
||||
float dist = 2 * moveTimeHalf * speedXY;
|
||||
_owner->GetNearPoint2D(x, y, dist, _owner->GetOrientation() + angle);
|
||||
_owner->GetNearPoint2D(nullptr, x, y, dist, _owner->GetOrientation() + angle);
|
||||
z = _owner->GetPositionZ();
|
||||
_owner->UpdateAllowedPositionZ(x, y, z);
|
||||
MoveJump(x, y, z, 0.0f, speedXY, speedZ);
|
||||
|
||||
@@ -124,34 +124,25 @@ void TargetedMovementGenerator<T, D>::SetTargetLocation(T* owner, bool updateDes
|
||||
float x, y, z;
|
||||
if (updateDestination || !_path)
|
||||
{
|
||||
float size = owner->GetCombatReach();
|
||||
float hoverDiff = std::abs(owner->GetHoverOffset() - GetTarget()->GetHoverOffset());
|
||||
if (!_offset)
|
||||
{
|
||||
if (GetTarget()->IsWithinDistInMap(owner, CONTACT_DISTANCE))
|
||||
return;
|
||||
|
||||
if (hoverDiff)
|
||||
size = size > hoverDiff ? std::sqrt(size * size - hoverDiff * hoverDiff) : 0.0f;
|
||||
|
||||
GetTarget()->GetNearPoint(owner, x, y, z, size, CONTACT_DISTANCE, GetTarget()->GetAbsoluteAngle(owner));
|
||||
GetTarget()->GetNearPoint(owner, x, y, z, CONTACT_DISTANCE, GetTarget()->GetAbsoluteAngle(owner));
|
||||
}
|
||||
else
|
||||
{
|
||||
float distance = _offset + 1.0f;
|
||||
|
||||
if (owner->IsPet() && GetTarget()->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
distance = 1.0f;
|
||||
size = 1.0f;
|
||||
}
|
||||
else if (hoverDiff)
|
||||
size = size > hoverDiff ? std::sqrt(size * size - hoverDiff * hoverDiff) : 0.0f;
|
||||
|
||||
if (GetTarget()->IsWithinDistInMap(owner, distance))
|
||||
return;
|
||||
|
||||
GetTarget()->GetClosePoint(x, y, z, size, _offset, _angle);
|
||||
GetTarget()->GetClosePoint(x, y, z, _offset, _angle);
|
||||
}
|
||||
|
||||
if (owner->IsHovering())
|
||||
|
||||
@@ -392,7 +392,7 @@ class npc_chained_spirit : public CreatureScript
|
||||
Position pos;
|
||||
if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID))
|
||||
{
|
||||
target->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.0f, 5.0f, target->GetAbsoluteAngle(me));
|
||||
target->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 5.0f, target->GetAbsoluteAngle(me));
|
||||
me->GetMotionMaster()->MovePoint(POINT_START_REVIVE, pos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -971,7 +971,7 @@ void hyjalAI::WaypointReached(uint32 waypointId, uint32 /*pathId*/)
|
||||
(*itr)->GetMotionMaster()->Initialize();
|
||||
float range = 10;
|
||||
if (me->GetEntry() == THRALL)range = 20;
|
||||
me->GetNearPoint(me, x, y, z, range, 0, me->GetAbsoluteAngle((*itr)));
|
||||
me->GetNearPoint(nullptr, x, y, z, range, me->GetAbsoluteAngle((*itr)));
|
||||
(*itr)->GetMotionMaster()->MovePoint(0, x+irand(-5, 5), y+irand(-5, 5), me->GetPositionZ());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -380,7 +380,7 @@ class npc_coldflame : public CreatureScript
|
||||
{
|
||||
float ang = pos.GetAbsoluteAngle(me);
|
||||
me->SetOrientation(ang);
|
||||
owner->GetNearPoint2D(pos.m_positionX, pos.m_positionY, 5.0f - owner->GetCombatReach(), ang);
|
||||
owner->GetNearPoint2D(nullptr, pos.m_positionX, pos.m_positionY, 5.0f - owner->GetCombatReach(), ang);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -393,7 +393,7 @@ class npc_coldflame : public CreatureScript
|
||||
|
||||
float ang = pos.GetAbsoluteAngle(target);
|
||||
me->SetOrientation(ang);
|
||||
owner->GetNearPoint2D(pos.m_positionX, pos.m_positionY, 15.0f - owner->GetCombatReach(), ang);
|
||||
owner->GetNearPoint2D(nullptr, pos.m_positionX, pos.m_positionY, 15.0f - owner->GetCombatReach(), ang);
|
||||
}
|
||||
|
||||
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
|
||||
@@ -462,7 +462,7 @@ public:
|
||||
{
|
||||
Position pos;
|
||||
pos.m_positionZ = alexstraszaBunny->GetPositionZ();
|
||||
alexstraszaBunny->GetNearPoint2D(pos.m_positionX, pos.m_positionY, 30.0f, alexstraszaBunny->GetAbsoluteAngle(me));
|
||||
alexstraszaBunny->GetNearPoint2D(nullptr, pos.m_positionX, pos.m_positionY, 30.0f, alexstraszaBunny->GetAbsoluteAngle(me));
|
||||
me->GetMotionMaster()->MoveLand(POINT_LAND_P_ONE, pos);
|
||||
me->SetImmuneToAll(false);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
@@ -845,7 +845,7 @@ public:
|
||||
Position randomPosOnRadius;
|
||||
// Hardcodded retail value, reason is Z getters can fail... (TO DO: Change to getter when height calculation works on 100%!)
|
||||
randomPosOnRadius.m_positionZ = 283.0521f;
|
||||
alexstraszaBunny->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 120.0f, alexstraszaBunny->GetAbsoluteAngle(me));
|
||||
alexstraszaBunny->GetNearPoint2D(nullptr, randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 120.0f, alexstraszaBunny->GetAbsoluteAngle(me));
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLY_OUT_OF_PLATFORM_P_TWO, randomPosOnRadius);
|
||||
_flyingOutOfPlatform = true;
|
||||
}
|
||||
@@ -1678,7 +1678,7 @@ class spell_malygos_random_portal : public SpellScriptLoader
|
||||
{
|
||||
Position pos;
|
||||
pos.m_positionZ = target->GetPositionZ();
|
||||
target->GetNearPoint2D(pos.m_positionX, pos.m_positionY, frand(29.1f, 30.0f), target->GetAbsoluteAngle(malygos));
|
||||
target->GetNearPoint2D(nullptr, pos.m_positionX, pos.m_positionY, frand(29.1f, 30.0f), target->GetAbsoluteAngle(malygos));
|
||||
malygos->GetMotionMaster()->MovePoint(POINT_NEAR_RANDOM_PORTAL_P_NONE, pos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -750,7 +750,7 @@ class npc_frostbrood_skytalon : public CreatureScript
|
||||
{
|
||||
Position randomPosOnRadius;
|
||||
randomPosOnRadius.m_positionZ = (me->GetPositionZ() + 40.0f);
|
||||
me->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAbsoluteAngle(me));
|
||||
me->GetNearPoint2D(nullptr, randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAbsoluteAngle(me));
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLY_AWAY, randomPosOnRadius);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,7 +183,7 @@ struct npc_molten_flame : public NullCreatureAI
|
||||
void InitializeAI() override
|
||||
{
|
||||
float x, y, z;
|
||||
me->GetNearPoint(me, x, y, z, 1, 100.0f, frand(0.f, 2.f * float(M_PI)));
|
||||
me->GetNearPoint(me, x, y, z, 100.0f, frand(0.f, 2.f * float(M_PI)));
|
||||
me->GetMotionMaster()->MovePoint(0, x, y, z);
|
||||
DoCastSelf(SPELL_MOLTEN_FLAME, true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user