diff options
Diffstat (limited to 'src')
9 files changed, 43 insertions, 32 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 632e9d0050b..e2f19a2ac9f 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -3119,18 +3119,38 @@ 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); @@ -3151,7 +3171,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)) @@ -3164,10 +3184,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) @@ -3194,7 +3214,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) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 2c5bdd19dbd..2cb0583cf38 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -273,8 +273,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); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 92ac7b11fc1..cb00f455959 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -436,7 +436,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); @@ -457,7 +457,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); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 09b187dc976..ad702575726 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -125,34 +125,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()) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index 1b022b2c6f3..3f9f9b715ff 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -972,7 +972,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()); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 7830e96c29b..97f2079cbec 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -381,7 +381,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 { @@ -394,7 +394,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()); diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 72acb22914a..61faa846a85 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -464,7 +464,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); @@ -847,7 +847,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; } @@ -1673,7 +1673,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); } } diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 32ace5b6b0e..cbce40f67f6 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -751,7 +751,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); } } diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index b7a0acdc892..bdb4ac7415b 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -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); } |
