mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-02-06 08:59:11 +01:00
Core/Movement: Defined and implemented new spline flag - JumpOrientationFixed
This commit is contained in:
@@ -1973,11 +1973,11 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
||||
{
|
||||
float gravity = e.action.jump.UseDefaultGravity ? Movement::gravity : e.action.jump.Gravity;
|
||||
me->GetMotionMaster()->MoveJumpWithGravity(pos, float(e.action.jump.SpeedXY), gravity, e.action.jump.PointId,
|
||||
{}, nullptr, nullptr, std::move(actionResultSetter));
|
||||
{}, false, nullptr, nullptr, std::move(actionResultSetter));
|
||||
}
|
||||
else
|
||||
me->GetMotionMaster()->MoveJump(pos, float(e.action.jump.SpeedXY), float(e.action.jump.SpeedZ), e.action.jump.PointId,
|
||||
{}, nullptr, nullptr, std::move(actionResultSetter));
|
||||
{}, false, nullptr, nullptr, std::move(actionResultSetter));
|
||||
|
||||
mTimedActionWaitEvent = std::move(waitEvent);
|
||||
break;
|
||||
|
||||
@@ -846,16 +846,16 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ)
|
||||
MoveJump(x, y, z, speedXY, speedZ);
|
||||
}
|
||||
|
||||
void MotionMaster::MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id/* = EVENT_JUMP*/, MovementFacingTarget const& facing/* = {}*/,
|
||||
JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/,
|
||||
void MotionMaster::MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id /*= EVENT_JUMP*/, MovementFacingTarget const& facing /*= {}*/,
|
||||
bool orientationFixed /*= false*/, JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/,
|
||||
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult /*= {}*/)
|
||||
{
|
||||
MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ, id, facing, arrivalCast,
|
||||
MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ, id, facing, orientationFixed, arrivalCast,
|
||||
spellEffectExtraData, std::move(scriptResult));
|
||||
}
|
||||
|
||||
void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id /*= EVENT_JUMP*/, MovementFacingTarget const& facing /* = {}*/,
|
||||
JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/,
|
||||
bool orientationFixed /*= false*/, JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/,
|
||||
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult /*= {}*/)
|
||||
{
|
||||
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveJump: '{}', jumps to point Id: {} (X: {}, Y: {}, Z: {})", _owner->GetGUID(), id, x, y, z);
|
||||
@@ -875,6 +875,7 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee
|
||||
init.SetParabolic(max_height, 0);
|
||||
init.SetVelocity(speedXY);
|
||||
std::visit(Movement::MoveSplineInitFacingVisitor(init), facing);
|
||||
init.SetJumpOrientationFixed(orientationFixed);
|
||||
if (effect)
|
||||
init.SetSpellEffectExtraData(*effect);
|
||||
};
|
||||
@@ -895,7 +896,7 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee
|
||||
}
|
||||
|
||||
void MotionMaster::MoveJumpWithGravity(Position const& pos, float speedXY, float gravity, uint32 id/* = EVENT_JUMP*/, MovementFacingTarget const& facing/* = {}*/,
|
||||
JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/,
|
||||
bool orientationFixed /*= false*/, JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/,
|
||||
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult /*= {}*/)
|
||||
{
|
||||
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveJumpWithGravity: '{}', jumps to point Id: {} ({})", _owner->GetGUID(), id, pos.ToString());
|
||||
@@ -914,6 +915,7 @@ void MotionMaster::MoveJumpWithGravity(Position const& pos, float speedXY, float
|
||||
init.SetVelocity(speedXY);
|
||||
init.SetUnlimitedSpeed();
|
||||
std::visit(Movement::MoveSplineInitFacingVisitor(init), facing);
|
||||
init.SetJumpOrientationFixed(orientationFixed);
|
||||
if (effect)
|
||||
init.SetSpellEffectExtraData(*effect);
|
||||
};
|
||||
|
||||
@@ -189,13 +189,13 @@ class TC_GAME_API MotionMaster
|
||||
void MoveKnockbackFrom(Position const& origin, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr);
|
||||
void MoveJumpTo(float angle, float speedXY, float speedZ);
|
||||
void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP, MovementFacingTarget const& facing = {},
|
||||
JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr,
|
||||
bool orientationFixed = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr,
|
||||
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult = {});
|
||||
void MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id = EVENT_JUMP, MovementFacingTarget const& facing = {},
|
||||
JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr,
|
||||
bool orientationFixed = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr,
|
||||
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult = {});
|
||||
void MoveJumpWithGravity(Position const& pos, float speedXY, float gravity, uint32 id = EVENT_JUMP, MovementFacingTarget const& facing = {},
|
||||
JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr,
|
||||
bool orientationFixed = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr,
|
||||
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult = {});
|
||||
void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount,
|
||||
Optional<Milliseconds> duration = {}, Optional<float> speed = {},
|
||||
|
||||
@@ -54,7 +54,7 @@ Location MoveSpline::computePosition(int32 time_point, int32 point_index) const
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!splineflags.HasFlag(MoveSplineFlagEnum::OrientationFixed | MoveSplineFlagEnum::Falling | MoveSplineFlagEnum::Unknown_0x8))
|
||||
if (!splineflags.HasFlag(MoveSplineFlagEnum::OrientationFixed | MoveSplineFlagEnum::Falling | MoveSplineFlagEnum::JumpOrientationFixed))
|
||||
{
|
||||
Vector3 hermite;
|
||||
spline.evaluate_derivative(point_Idx, u, hermite);
|
||||
|
||||
@@ -31,14 +31,14 @@ namespace Movement
|
||||
Unknown_0x1 = 0x00000001, // NOT VERIFIED
|
||||
Unknown_0x2 = 0x00000002, // NOT VERIFIED
|
||||
Unknown_0x4 = 0x00000004, // NOT VERIFIED
|
||||
Unknown_0x8 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation
|
||||
JumpOrientationFixed= 0x00000008, // Model orientation fixed (jump animation)
|
||||
FallingSlow = 0x00000010,
|
||||
Done = 0x00000020,
|
||||
Falling = 0x00000040, // Affects elevation computation, can't be combined with Parabolic flag
|
||||
No_Spline = 0x00000080,
|
||||
Unknown_0x100 = 0x00000100, // NOT VERIFIED
|
||||
Flying = 0x00000200, // Smooth movement(Catmullrom interpolation mode), flying animation
|
||||
OrientationFixed = 0x00000400, // Model orientation fixed
|
||||
OrientationFixed = 0x00000400, // Model orientation fixed (knockback animation)
|
||||
Catmullrom = 0x00000800, // Used Catmullrom interpolation mode
|
||||
Cyclic = 0x00001000, // Movement by cycled spline
|
||||
Enter_Cycle = 0x00002000, // Everytimes appears with cyclic flag in monster move packet, erases first spline vertex after first cycle done
|
||||
@@ -65,7 +65,7 @@ namespace Movement
|
||||
// flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
|
||||
Mask_No_Monster_Move = Done, // SKIP
|
||||
// Unused, not suported flags
|
||||
Mask_Unused = No_Spline | Enter_Cycle | Frozen | Unknown_0x8 | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
|
||||
Mask_Unused = No_Spline | Enter_Cycle | Frozen | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
|
||||
| Unknown_0x800000 | FadeObject | UnlimitedSpeed | Unknown_0x40000000 | Unknown_0x80000000 // SKIP
|
||||
};
|
||||
|
||||
@@ -75,8 +75,10 @@ namespace Movement
|
||||
{
|
||||
switch (flag)
|
||||
{
|
||||
case MoveSplineFlagEnum::JumpOrientationFixed: return MoveSplineFlagEnum::OrientationFixed;
|
||||
case MoveSplineFlagEnum::Falling: return MoveSplineFlagEnum::Parabolic | MoveSplineFlagEnum::Animation | MoveSplineFlagEnum::Flying;
|
||||
case MoveSplineFlagEnum::Flying: return MoveSplineFlagEnum::FallingSlow | MoveSplineFlagEnum::Falling;
|
||||
case MoveSplineFlagEnum::OrientationFixed: return MoveSplineFlagEnum::JumpOrientationFixed;
|
||||
case MoveSplineFlagEnum::Catmullrom: return MoveSplineFlagEnum::SmoothGroundPath;
|
||||
case MoveSplineFlagEnum::TransportEnter: return MoveSplineFlagEnum::TransportExit;
|
||||
case MoveSplineFlagEnum::TransportExit: return MoveSplineFlagEnum::TransportEnter;
|
||||
@@ -129,7 +131,7 @@ namespace Movement
|
||||
MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x1);
|
||||
MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x2);
|
||||
MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x4);
|
||||
MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x8);
|
||||
MAKE_FLAG_ACCESSOR_FIELD(JumpOrientationFixed);
|
||||
MAKE_FLAG_ACCESSOR_FIELD(FallingSlow);
|
||||
MAKE_FLAG_ACCESSOR_FIELD(Done);
|
||||
MAKE_FLAG_ACCESSOR_FIELD(Falling);
|
||||
|
||||
@@ -294,6 +294,6 @@ namespace Movement
|
||||
|
||||
void MoveSplineInitFacingVisitor::operator()(Position const& point) const
|
||||
{
|
||||
init.SetFacing(point.GetPositionX(), point.GetPositionY(), point.GetPositionZ());
|
||||
_init.SetFacing(point.GetPositionX(), point.GetPositionY(), point.GetPositionZ());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,10 +145,14 @@ namespace Movement
|
||||
*/
|
||||
void SetBackward();
|
||||
|
||||
/* Fixes unit's model rotation. Disabled by default
|
||||
/* Fixes unit's model rotation (plays knockback animation). Disabled by default
|
||||
*/
|
||||
void SetOrientationFixed(bool enable);
|
||||
|
||||
/* Fixes unit's model rotation (plays jump animation). Disabled by default
|
||||
*/
|
||||
void SetJumpOrientationFixed(bool enable);
|
||||
|
||||
/* Enables avoiding minor obstacles clientside (might cause visual position on client to not be accurate with the serverside one). Disabled by default
|
||||
*/
|
||||
void SetSteering();
|
||||
@@ -188,6 +192,7 @@ namespace Movement
|
||||
inline void MoveSplineInit::SetTransportEnter() { args.flags.TransportEnter = true; }
|
||||
inline void MoveSplineInit::SetTransportExit() { args.flags.TransportExit = true; }
|
||||
inline void MoveSplineInit::SetOrientationFixed(bool enable) { args.flags.OrientationFixed = enable; }
|
||||
inline void MoveSplineInit::SetJumpOrientationFixed(bool enable) { args.flags.JumpOrientationFixed = enable; }
|
||||
inline void MoveSplineInit::SetSteering() { args.flags.Steering = true; }
|
||||
inline void MoveSplineInit::SetUnlimitedSpeed() { args.flags.UnlimitedSpeed = true; }
|
||||
|
||||
@@ -227,14 +232,14 @@ namespace Movement
|
||||
|
||||
struct TC_GAME_API MoveSplineInitFacingVisitor
|
||||
{
|
||||
explicit MoveSplineInitFacingVisitor(MoveSplineInit& init_) : init(init_) { }
|
||||
explicit MoveSplineInitFacingVisitor(MoveSplineInit& init) : _init(init) { }
|
||||
|
||||
void operator()(std::monostate) const { }
|
||||
void operator()(Position const& point) const;
|
||||
void operator()(Unit const* target) const { init.SetFacing(target); }
|
||||
void operator()(float angle) const { init.SetFacing(angle); }
|
||||
void operator()(Unit const* target) const { _init.SetFacing(target); }
|
||||
void operator()(float angle) const { _init.SetFacing(angle); }
|
||||
|
||||
MoveSplineInit& init;
|
||||
MoveSplineInit& _init;
|
||||
};
|
||||
}
|
||||
#endif // TRINITYSERVER_MOVESPLINEINIT_H
|
||||
|
||||
@@ -37,14 +37,14 @@ TC_API_EXPORT EnumText EnumUtils<MoveSplineFlagEnum>::ToString(MoveSplineFlagEnu
|
||||
case MoveSplineFlagEnum::Unknown_0x1: return { "Unknown_0x1", "Unknown_0x1", "NOT VERIFIED" };
|
||||
case MoveSplineFlagEnum::Unknown_0x2: return { "Unknown_0x2", "Unknown_0x2", "NOT VERIFIED" };
|
||||
case MoveSplineFlagEnum::Unknown_0x4: return { "Unknown_0x4", "Unknown_0x4", "NOT VERIFIED" };
|
||||
case MoveSplineFlagEnum::Unknown_0x8: return { "Unknown_0x8", "Unknown_0x8", "NOT VERIFIED - does someting related to falling/fixed orientation" };
|
||||
case MoveSplineFlagEnum::JumpOrientationFixed: return { "JumpOrientationFixed", "JumpOrientationFixed", "Model orientation fixed (jump animation)" };
|
||||
case MoveSplineFlagEnum::FallingSlow: return { "FallingSlow", "FallingSlow", "" };
|
||||
case MoveSplineFlagEnum::Done: return { "Done", "Done", "" };
|
||||
case MoveSplineFlagEnum::Falling: return { "Falling", "Falling", "Affects elevation computation, can't be combined with Parabolic flag" };
|
||||
case MoveSplineFlagEnum::No_Spline: return { "No_Spline", "No_Spline", "" };
|
||||
case MoveSplineFlagEnum::Unknown_0x100: return { "Unknown_0x100", "Unknown_0x100", "NOT VERIFIED" };
|
||||
case MoveSplineFlagEnum::Flying: return { "Flying", "Flying", "Smooth movement(Catmullrom interpolation mode), flying animation" };
|
||||
case MoveSplineFlagEnum::OrientationFixed: return { "OrientationFixed", "OrientationFixed", "Model orientation fixed" };
|
||||
case MoveSplineFlagEnum::OrientationFixed: return { "OrientationFixed", "OrientationFixed", "Model orientation fixed (knockback animation)" };
|
||||
case MoveSplineFlagEnum::Catmullrom: return { "Catmullrom", "Catmullrom", "Used Catmullrom interpolation mode" };
|
||||
case MoveSplineFlagEnum::Cyclic: return { "Cyclic", "Cyclic", "Movement by cycled spline" };
|
||||
case MoveSplineFlagEnum::Enter_Cycle: return { "Enter_Cycle", "Enter_Cycle", "Everytimes appears with cyclic flag in monster move packet, erases first spline vertex after first cycle done" };
|
||||
@@ -82,7 +82,7 @@ TC_API_EXPORT MoveSplineFlagEnum EnumUtils<MoveSplineFlagEnum>::FromIndex(size_t
|
||||
case 1: return MoveSplineFlagEnum::Unknown_0x1;
|
||||
case 2: return MoveSplineFlagEnum::Unknown_0x2;
|
||||
case 3: return MoveSplineFlagEnum::Unknown_0x4;
|
||||
case 4: return MoveSplineFlagEnum::Unknown_0x8;
|
||||
case 4: return MoveSplineFlagEnum::JumpOrientationFixed;
|
||||
case 5: return MoveSplineFlagEnum::FallingSlow;
|
||||
case 6: return MoveSplineFlagEnum::Done;
|
||||
case 7: return MoveSplineFlagEnum::Falling;
|
||||
@@ -124,7 +124,7 @@ TC_API_EXPORT size_t EnumUtils<MoveSplineFlagEnum>::ToIndex(MoveSplineFlagEnum v
|
||||
case MoveSplineFlagEnum::Unknown_0x1: return 1;
|
||||
case MoveSplineFlagEnum::Unknown_0x2: return 2;
|
||||
case MoveSplineFlagEnum::Unknown_0x4: return 3;
|
||||
case MoveSplineFlagEnum::Unknown_0x8: return 4;
|
||||
case MoveSplineFlagEnum::JumpOrientationFixed: return 4;
|
||||
case MoveSplineFlagEnum::FallingSlow: return 5;
|
||||
case MoveSplineFlagEnum::Done: return 6;
|
||||
case MoveSplineFlagEnum::Falling: return 7;
|
||||
|
||||
@@ -903,7 +903,7 @@ void Spell::EffectJump()
|
||||
JumpArrivalCastArgs arrivalCast;
|
||||
arrivalCast.SpellId = effectInfo->TriggerSpell;
|
||||
arrivalCast.Target = unitTarget->GetGUID();
|
||||
unitCaster->GetMotionMaster()->MoveJump(*unitTarget, speedXY, speedZ, EVENT_JUMP, facing, &arrivalCast);
|
||||
unitCaster->GetMotionMaster()->MoveJump(*unitTarget, speedXY, speedZ, EVENT_JUMP, facing, false, &arrivalCast);
|
||||
}
|
||||
|
||||
void Spell::EffectJumpDest()
|
||||
@@ -934,7 +934,7 @@ void Spell::EffectJumpDest()
|
||||
|
||||
JumpArrivalCastArgs arrivalCast;
|
||||
arrivalCast.SpellId = effectInfo->TriggerSpell;
|
||||
unitCaster->GetMotionMaster()->MoveJump(*destTarget, speedXY, speedZ, EVENT_JUMP, facing, &arrivalCast);
|
||||
unitCaster->GetMotionMaster()->MoveJump(*destTarget, speedXY, speedZ, EVENT_JUMP, facing, false, &arrivalCast);
|
||||
}
|
||||
|
||||
TeleportToOptions GetTeleportOptions(WorldObject const* caster, Unit const* unitTarget, SpellDestination const& targetDest)
|
||||
@@ -5806,6 +5806,7 @@ void Spell::EffectJumpCharge()
|
||||
}
|
||||
|
||||
unitCaster->GetMotionMaster()->MoveJumpWithGravity(*destTarget, speed, params->JumpGravity, EVENT_JUMP, facing,
|
||||
false,
|
||||
arrivalCast ? &*arrivalCast : nullptr,
|
||||
effectExtra ? &*effectExtra : nullptr);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user