Core/Movement: Defined and implemented new spline flag - JumpOrientationFixed

This commit is contained in:
Shauren
2024-06-29 18:15:43 +02:00
parent 8ce710fa6f
commit bd9fb4a563
9 changed files with 37 additions and 27 deletions

View File

@@ -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;

View File

@@ -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);
};

View File

@@ -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 = {},

View File

@@ -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);

View File

@@ -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);

View File

@@ -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());
}
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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);
}