From bc89e1cdb0da10e53cc9fa4a97565c05bb4c052e Mon Sep 17 00:00:00 2001 From: Treeston Date: Sun, 1 Apr 2018 13:52:36 +0200 Subject: Core/Position: Refactor GetAngle -> GetAbsoluteAngle because code clarity is good. (cherry picked from commit 4692e10ca2ffed5ba2a0336e9c93962b0fad9eaa) --- src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 2 +- src/server/game/Entities/Object/Object.cpp | 6 +++--- src/server/game/Entities/Object/Position.cpp | 13 +++++-------- src/server/game/Entities/Object/Position.h | 20 ++++++++++---------- src/server/game/Entities/Player/CinematicMgr.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 19 +++---------------- src/server/game/Entities/Unit/Unit.h | 1 - 7 files changed, 23 insertions(+), 40 deletions(-) (limited to 'src/server/game/Entities') diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 195837c8ebb..7e22c4d3a58 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -910,7 +910,7 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff) if (GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR)) { G3D::Vector3 const& nextPoint = _spline->getPoint(lastPositionIndex + 1); - orientation = GetAngle(nextPoint.x, nextPoint.y); + orientation = GetAbsoluteAngle(nextPoint.x, nextPoint.y); } GetMap()->AreaTriggerRelocation(this, currentPosition.x, currentPosition.y, currentPosition.z, orientation); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 85a925a5dc3..aec9708e403 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1102,7 +1102,7 @@ Position WorldObject::GetHitSpherePointFor(Position const& dest) const G3D::Vector3 vObj(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ()); G3D::Vector3 contactPoint = vThis + (vObj - vThis).directionOrZero() * std::min(dest.GetExactDist(GetPosition()), GetCombatReach()); - return Position(contactPoint.x, contactPoint.y, contactPoint.z, GetAngle(contactPoint.x, contactPoint.y)); + return Position(contactPoint.x, contactPoint.y, contactPoint.z, GetAbsoluteAngle(contactPoint.x, contactPoint.y)); } bool WorldObject::IsWithinLOS(float ox, float oy, float oz, LineOfSightChecks checks, VMAP::ModelIgnoreFlags ignoreFlags) const @@ -1259,7 +1259,7 @@ bool WorldObject::IsInBetween(Position const& pos1, Position const& pos2, float if (!size) size = GetCombatReach() / 2; - float angle = pos1.GetAngle(pos2); + float angle = pos1.GetAbsoluteAngle(pos2); // not using sqrt() for performance return (size * size) >= GetExactDist2dSq(pos1.GetPositionX() + std::cos(angle) * dist, pos1.GetPositionY() + std::sin(angle) * dist); @@ -3047,7 +3047,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, GetAngle(obj)); + GetNearPoint(obj, x, y, z, obj->GetCombatReach(), distance2d, GetAbsoluteAngle(obj)); } void WorldObject::MovePosition(Position &pos, float dist, float angle) diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp index af6e3d035e1..3e469434dff 100644 --- a/src/server/game/Entities/Object/Position.cpp +++ b/src/server/game/Entities/Object/Position.cpp @@ -115,7 +115,7 @@ bool Position::IsWithinDoubleVerticalCylinder(Position const* center, float radi return IsInDist2d(center, radius) && std::abs(verticalDelta) <= height; } -bool Position::HasInArc(float arc, Position const* obj, float border, Optional orientation) const +bool Position::HasInArc(float arc, Position const* obj, float border) const { // always have self in arc if (obj == this) @@ -124,11 +124,8 @@ bool Position::HasInArc(float arc, Position const* obj, float border, Optional float(M_PI)) angle -= 2.0f * float(M_PI); @@ -137,13 +134,13 @@ bool Position::HasInArc(float arc, Position const* obj, float border, Optional= lborder) && (angle <= rborder)); } -bool Position::HasInLine(Position const* pos, float objSize, float width, Optional orientation) const +bool Position::HasInLine(Position const* pos, float objSize, float width) const { - if (!HasInArc(float(M_PI), pos, 2.0f, orientation)) + if (!HasInArc(float(M_PI), pos, 2.0f)) return false; width += objSize; - float angle = GetAngle(pos) - (orientation.is_initialized() ? *orientation : GetOrientation()); + float angle = GetRelativeAngle(pos); return std::fabs(std::sin(angle)) * GetExactDist2d(pos->GetPositionX(), pos->GetPositionY()) < width; } diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h index 6940da13885..271f19e563f 100644 --- a/src/server/game/Entities/Object/Position.h +++ b/src/server/game/Entities/Object/Position.h @@ -19,7 +19,6 @@ #define Trinity_game_Position_h__ #include "Define.h" -#include "Optional.h" #include #include @@ -124,19 +123,20 @@ public: void GetPositionOffsetTo(Position const & endPos, Position & retOffset) const; Position GetPositionWithOffset(Position const& offset) const; - float GetAngle(float x, float y) const + float GetAbsoluteAngle(float x, float y) const { float dx = m_positionX - x; float dy = m_positionY - y; return NormalizeOrientation(std::atan2(dy, dx)); } - float GetAngle(Position const& pos) const { return GetAngle(pos.m_positionX, pos.m_positionY); } - float GetAngle(Position const* pos) const { return GetAngle(*pos); } + float GetAbsoluteAngle(Position const& pos) const { return GetAbsoluteAngle(pos.m_positionX, pos.m_positionY); } + float GetAbsoluteAngle(Position const* pos) const { return GetAbsoluteAngle(*pos); } + float ToAbsoluteAngle(float relAngle) const { return NormalizeOrientation(relAngle + m_orientation); } - float GetAbsoluteAngle(float relAngle) const { return NormalizeOrientation(relAngle + m_orientation); } - float GetRelativeAngle(float absAngle) const { return NormalizeOrientation(absAngle - m_orientation); } - float GetRelativeAngle(float x, float y) const { return GetRelativeAngle(GetAngle(x, y)); } - float GetRelativeAngle(Position const* pos) const { return GetRelativeAngle(GetAngle(pos)); } + float ToRelativeAngle(float absAngle) const { return NormalizeOrientation(absAngle - m_orientation); } + float GetRelativeAngle(float x, float y) const { return ToRelativeAngle(GetAbsoluteAngle(x, y)); } + float GetRelativeAngle(Position const& pos) const { return ToRelativeAngle(GetAbsoluteAngle(pos)); } + float GetRelativeAngle(Position const* pos) const { return ToRelativeAngle(GetAbsoluteAngle(pos)); } void GetSinCos(float x, float y, float &vsin, float &vcos) const; @@ -152,8 +152,8 @@ public: // dist2d < radius && abs(dz) < height bool IsWithinDoubleVerticalCylinder(Position const* center, float radius, float height) const; - bool HasInArc(float arcangle, Position const* pos, float border = 2.0f, Optional orientation = {}) const; - bool HasInLine(Position const* pos, float objSize, float width, Optional orientation = {}) const; + bool HasInArc(float arcangle, Position const* pos, float border = 2.0f) const; + bool HasInLine(Position const* pos, float objSize, float width) const; std::string ToString() const; // constrain arbitrary radian orientation to interval [0,2*PI) diff --git a/src/server/game/Entities/Player/CinematicMgr.cpp b/src/server/game/Entities/Player/CinematicMgr.cpp index a67b6876afb..1081f248781 100644 --- a/src/server/game/Entities/Player/CinematicMgr.cpp +++ b/src/server/game/Entities/Player/CinematicMgr.cpp @@ -121,7 +121,7 @@ void CinematicMgr::UpdateCinematicLocation(uint32 /*diff*/) lastPosition.Relocate(cam.locations); lastTimestamp = cam.timeStamp; } - float angle = lastPosition.GetAngle(&nextPosition); + float angle = lastPosition.GetAbsoluteAngle(&nextPosition); angle -= lastPosition.GetOrientation(); if (angle < 0) angle += 2 * float(M_PI); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 10edd2ef852..90e06ba69af 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -590,19 +590,6 @@ bool Unit::IsWithinBoundaryRadius(const Unit* obj) const return IsInDist(obj, objBoundaryRadius); } -void Unit::GetRandomContactPoint(Unit const* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax) const -{ - float combat_reach = GetCombatReach(); - if (combat_reach < 0.1f) // sometimes bugged for players - combat_reach = DEFAULT_PLAYER_COMBAT_REACH; - - uint32 attacker_number = uint32(getAttackers().size()); - if (attacker_number > 0) - --attacker_number; - GetNearPoint(obj, x, y, z, obj->GetCombatReach(), distance2dMin+(distance2dMax-distance2dMin) * (float)rand_norm(), - GetAngle(obj) + (attacker_number ? (static_cast(M_PI/2) - static_cast(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0)); -} - void Unit::SetVisibleAura(AuraApplication* aurApp) { m_visibleAuras.insert(aurApp); @@ -11727,7 +11714,7 @@ void Unit::JumpTo(WorldObject* obj, float speedZ, bool withOrientation) float x, y, z; obj->GetContactPoint(this, x, y, z); float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ; - GetMotionMaster()->MoveJump(x, y, z, GetAngle(obj), speedXY, speedZ, EVENT_JUMP, withOrientation); + GetMotionMaster()->MoveJump(x, y, z, GetAbsoluteAngle(obj), speedXY, speedZ, EVENT_JUMP, withOrientation); } void Unit::HandleSpellClick(Unit* clicker, int8 seatId /*= -1*/) @@ -12302,7 +12289,7 @@ bool CharmInfo::IsReturning() void Unit::SetInFront(WorldObject const* target) { if (!HasUnitState(UNIT_STATE_CANNOT_TURN)) - SetOrientation(GetAngle(target)); + SetOrientation(GetAbsoluteAngle(target)); } void Unit::SetFacingTo(float ori, bool force) @@ -12328,7 +12315,7 @@ void Unit::SetFacingToObject(WorldObject const* object, bool force) /// @todo figure out under what conditions creature will move towards object instead of facing it where it currently is. Movement::MoveSplineInit init(this); init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false); - init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming + init.SetFacing(GetAbsoluteAngle(object)); // when on transport, GetAbsoluteAngle will still return global coordinates (and angle) that needs transforming init.Launch(); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 696c63bcacf..335ccbc0cb6 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -797,7 +797,6 @@ class TC_GAME_API Unit : public WorldObject float GetMeleeRange(Unit const* target) const; virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType = BASE_ATTACK) const = 0; bool IsWithinBoundaryRadius(const Unit* obj) const; - void GetRandomContactPoint(Unit const* target, float& x, float& y, float& z, float distance2dMin, float distance2dMax) const; uint32 m_extraAttacks; bool m_canDualWield; -- cgit v1.2.3