Core/Movement: Move facing splines into MotionMaster
(cherry picked from commit fa4d4550b30dfdf70296a9958263f290b860d450)
This commit is contained in:
@@ -13307,39 +13307,22 @@ void Unit::SetInFront(WorldObject const* target)
|
|||||||
SetOrientation(GetAbsoluteAngle(target));
|
SetOrientation(GetAbsoluteAngle(target));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::SetFacingTo(float ori, bool force)
|
void Unit::SetFacingTo(float ori, bool force /*= true*/, uint32 movementId /*= EVENT_FACE*/)
|
||||||
{
|
{
|
||||||
// do not face when already moving
|
// do not face when already moving
|
||||||
if (!force && (!IsStopped() || !movespline->Finalized()))
|
if (!force && (!IsStopped() || !movespline->Finalized()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Movement::MoveSplineInit init(this);
|
GetMotionMaster()->MoveFace(ori, movementId);
|
||||||
init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
|
|
||||||
if (GetTransport())
|
|
||||||
init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
|
|
||||||
init.SetFacing(ori);
|
|
||||||
|
|
||||||
//GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_FACE, MOTION_PRIORITY_HIGHEST);
|
|
||||||
UpdateSplineMovement(init.Launch());
|
|
||||||
if (Creature* creature = ToCreature())
|
|
||||||
creature->AI()->MovementInform(EFFECT_MOTION_TYPE, EVENT_FACE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::SetFacingToObject(WorldObject const* object, bool force)
|
void Unit::SetFacingToObject(WorldObject const* object, bool force /*= true*/, uint32 movementId /*= EVENT_FACE*/)
|
||||||
{
|
{
|
||||||
// do not face when already moving
|
// do not face when already moving
|
||||||
if (!force && (!IsStopped() || !movespline->Finalized()))
|
if (!force && (!IsStopped() || !movespline->Finalized()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/// @todo figure out under what conditions creature will move towards object instead of facing it where it currently is.
|
GetMotionMaster()->MoveFace(object, movementId);
|
||||||
Movement::MoveSplineInit init(this);
|
|
||||||
init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
|
|
||||||
init.SetFacing(GetAbsoluteAngle(object)); // when on transport, GetAbsoluteAngle will still return global coordinates (and angle) that needs transforming
|
|
||||||
|
|
||||||
//GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_FACE, MOTION_PRIORITY_HIGHEST);
|
|
||||||
UpdateSplineMovement(init.Launch());
|
|
||||||
if (Creature* creature = ToCreature())
|
|
||||||
creature->AI()->MovementInform(EFFECT_MOTION_TYPE, EVENT_FACE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::SetFacingToPoint(Position const& point, bool force)
|
void Unit::SetFacingToPoint(Position const& point, bool force)
|
||||||
|
|||||||
@@ -1177,8 +1177,8 @@ class TC_GAME_API Unit : public WorldObject
|
|||||||
void UpdateMovementForcesModMagnitude();
|
void UpdateMovementForcesModMagnitude();
|
||||||
|
|
||||||
void SetInFront(WorldObject const* target);
|
void SetInFront(WorldObject const* target);
|
||||||
void SetFacingTo(float const ori, bool force = true);
|
void SetFacingTo(float ori, bool force = true, uint32 movementId = EVENT_FACE);
|
||||||
void SetFacingToObject(WorldObject const* object, bool force = true);
|
void SetFacingToObject(WorldObject const* object, bool force = true, uint32 movementId = EVENT_FACE);
|
||||||
void SetFacingToPoint(Position const& point, bool force = true);
|
void SetFacingToPoint(Position const& point, bool force = true);
|
||||||
|
|
||||||
bool IsAlive() const { return (m_deathState == ALIVE); }
|
bool IsAlive() const { return (m_deathState == ALIVE); }
|
||||||
|
|||||||
@@ -1159,6 +1159,37 @@ void MotionMaster::MoveFormation(Unit* leader, float range, float angle, uint32
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MotionMaster::MoveFace(float orientation, uint32 id /*= EVENT_FACE*/)
|
||||||
|
{
|
||||||
|
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveFace: '{}', faces '{}'", _owner->GetGUID(), orientation);
|
||||||
|
|
||||||
|
std::function<void(Movement::MoveSplineInit&)> initializer = [owner = _owner, orientation](Movement::MoveSplineInit& init)
|
||||||
|
{
|
||||||
|
init.MoveTo(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), false);
|
||||||
|
if (owner->GetTransport())
|
||||||
|
init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
|
||||||
|
init.SetFacing(orientation);
|
||||||
|
};
|
||||||
|
|
||||||
|
Add(new ImmediateMovementGenerator(std::move(initializer), FACE_MOTION_TYPE, id));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MotionMaster::MoveFace(WorldObject const* object, uint32 id /*= EVENT_FACE*/)
|
||||||
|
{
|
||||||
|
if (!object)
|
||||||
|
return;
|
||||||
|
|
||||||
|
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveFace: '{}', faces '{}'", _owner->GetGUID(), object->GetGUID());
|
||||||
|
|
||||||
|
std::function<void(Movement::MoveSplineInit&)> initializer = [owner = _owner, object](Movement::MoveSplineInit& init)
|
||||||
|
{
|
||||||
|
init.MoveTo(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), false);
|
||||||
|
init.SetFacing(owner->GetAbsoluteAngle(object)); // when on transport, GetAbsoluteAngle will still return global coordinates (and angle) that needs transforming
|
||||||
|
};
|
||||||
|
|
||||||
|
Add(new ImmediateMovementGenerator(std::move(initializer), FACE_MOTION_TYPE, id));
|
||||||
|
}
|
||||||
|
|
||||||
void MotionMaster::LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id/*= 0*/, MovementGeneratorPriority priority/* = MOTION_PRIORITY_NORMAL*/, MovementGeneratorType type/*= EFFECT_MOTION_TYPE*/, Scripting::v2::ActionResultSetter<MovementStopReason>&& scriptResult /*= {}*/)
|
void MotionMaster::LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id/*= 0*/, MovementGeneratorPriority priority/* = MOTION_PRIORITY_NORMAL*/, MovementGeneratorType type/*= EFFECT_MOTION_TYPE*/, Scripting::v2::ActionResultSetter<MovementStopReason>&& scriptResult /*= {}*/)
|
||||||
{
|
{
|
||||||
if (IsInvalidMovementGeneratorType(type))
|
if (IsInvalidMovementGeneratorType(type))
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
class PathGenerator;
|
class PathGenerator;
|
||||||
class Unit;
|
class Unit;
|
||||||
|
class WorldObject;
|
||||||
struct Position;
|
struct Position;
|
||||||
struct SplineChainLink;
|
struct SplineChainLink;
|
||||||
struct SplineChainResumeInfo;
|
struct SplineChainResumeInfo;
|
||||||
@@ -237,6 +238,8 @@ class TC_GAME_API MotionMaster
|
|||||||
Optional<float> turnSpeed = {}, Optional<float> totalTurnAngle = {},
|
Optional<float> turnSpeed = {}, Optional<float> totalTurnAngle = {},
|
||||||
Scripting::v2::ActionResultSetter<MovementStopReason>&& scriptResult = {});
|
Scripting::v2::ActionResultSetter<MovementStopReason>&& scriptResult = {});
|
||||||
void MoveFormation(Unit* leader, float range, float angle, uint32 point1, uint32 point2);
|
void MoveFormation(Unit* leader, float range, float angle, uint32 point1, uint32 point2);
|
||||||
|
void MoveFace(float orientation, uint32 id = EVENT_FACE);
|
||||||
|
void MoveFace(WorldObject const* object, uint32 id = EVENT_FACE);
|
||||||
|
|
||||||
void LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id = 0, MovementGeneratorPriority priority = MOTION_PRIORITY_NORMAL, MovementGeneratorType type = EFFECT_MOTION_TYPE, Scripting::v2::ActionResultSetter<MovementStopReason>&& scriptResult = {});
|
void LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id = 0, MovementGeneratorPriority priority = MOTION_PRIORITY_NORMAL, MovementGeneratorType type = EFFECT_MOTION_TYPE, Scripting::v2::ActionResultSetter<MovementStopReason>&& scriptResult = {});
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ enum MovementGeneratorType : uint8
|
|||||||
EFFECT_MOTION_TYPE = 16,
|
EFFECT_MOTION_TYPE = 16,
|
||||||
SPLINE_CHAIN_MOTION_TYPE = 17, // SplineChainMovementGenerator.h
|
SPLINE_CHAIN_MOTION_TYPE = 17, // SplineChainMovementGenerator.h
|
||||||
FORMATION_MOTION_TYPE = 18, // FormationMovementGenerator.h
|
FORMATION_MOTION_TYPE = 18, // FormationMovementGenerator.h
|
||||||
|
FACE_MOTION_TYPE = 19,
|
||||||
MAX_MOTION_TYPE // SKIP
|
MAX_MOTION_TYPE // SKIP
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -50,12 +50,13 @@ TC_API_EXPORT EnumText EnumUtils<MovementGeneratorType>::ToString(MovementGenera
|
|||||||
case EFFECT_MOTION_TYPE: return { "EFFECT_MOTION_TYPE", "EFFECT_MOTION_TYPE", "" };
|
case EFFECT_MOTION_TYPE: return { "EFFECT_MOTION_TYPE", "EFFECT_MOTION_TYPE", "" };
|
||||||
case SPLINE_CHAIN_MOTION_TYPE: return { "SPLINE_CHAIN_MOTION_TYPE", "SPLINE_CHAIN_MOTION_TYPE", "SplineChainMovementGenerator.h" };
|
case SPLINE_CHAIN_MOTION_TYPE: return { "SPLINE_CHAIN_MOTION_TYPE", "SPLINE_CHAIN_MOTION_TYPE", "SplineChainMovementGenerator.h" };
|
||||||
case FORMATION_MOTION_TYPE: return { "FORMATION_MOTION_TYPE", "FORMATION_MOTION_TYPE", "FormationMovementGenerator.h" };
|
case FORMATION_MOTION_TYPE: return { "FORMATION_MOTION_TYPE", "FORMATION_MOTION_TYPE", "FormationMovementGenerator.h" };
|
||||||
|
case FACE_MOTION_TYPE: return { "FACE_MOTION_TYPE", "FACE_MOTION_TYPE", "" };
|
||||||
default: throw std::out_of_range("value");
|
default: throw std::out_of_range("value");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
TC_API_EXPORT size_t EnumUtils<MovementGeneratorType>::Count() { return 19; }
|
TC_API_EXPORT size_t EnumUtils<MovementGeneratorType>::Count() { return 20; }
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
TC_API_EXPORT MovementGeneratorType EnumUtils<MovementGeneratorType>::FromIndex(size_t index)
|
TC_API_EXPORT MovementGeneratorType EnumUtils<MovementGeneratorType>::FromIndex(size_t index)
|
||||||
@@ -81,6 +82,7 @@ TC_API_EXPORT MovementGeneratorType EnumUtils<MovementGeneratorType>::FromIndex(
|
|||||||
case 16: return EFFECT_MOTION_TYPE;
|
case 16: return EFFECT_MOTION_TYPE;
|
||||||
case 17: return SPLINE_CHAIN_MOTION_TYPE;
|
case 17: return SPLINE_CHAIN_MOTION_TYPE;
|
||||||
case 18: return FORMATION_MOTION_TYPE;
|
case 18: return FORMATION_MOTION_TYPE;
|
||||||
|
case 19: return FACE_MOTION_TYPE;
|
||||||
default: throw std::out_of_range("index");
|
default: throw std::out_of_range("index");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,6 +111,7 @@ TC_API_EXPORT size_t EnumUtils<MovementGeneratorType>::ToIndex(MovementGenerator
|
|||||||
case EFFECT_MOTION_TYPE: return 16;
|
case EFFECT_MOTION_TYPE: return 16;
|
||||||
case SPLINE_CHAIN_MOTION_TYPE: return 17;
|
case SPLINE_CHAIN_MOTION_TYPE: return 17;
|
||||||
case FORMATION_MOTION_TYPE: return 18;
|
case FORMATION_MOTION_TYPE: return 18;
|
||||||
|
case FACE_MOTION_TYPE: return 19;
|
||||||
default: throw std::out_of_range("value");
|
default: throw std::out_of_range("value");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user