diff options
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.h | 6 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSpline.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineFlag.h | 10 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.h | 15 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 5 |
9 files changed, 37 insertions, 27 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 64a2a6e8cc1..ad0e71c2c83 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -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; diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index bf12944969a..90313da2a4a 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -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); }; diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 3600a6bb1ec..d3964f177cd 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -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 = {}, diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index 1a5f1c8f4fa..766cf6ea223 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -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); diff --git a/src/server/game/Movement/Spline/MoveSplineFlag.h b/src/server/game/Movement/Spline/MoveSplineFlag.h index 19fb0c6973f..7a8317aa04d 100644 --- a/src/server/game/Movement/Spline/MoveSplineFlag.h +++ b/src/server/game/Movement/Spline/MoveSplineFlag.h @@ -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); diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 8b46249b21e..b0621256a64 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -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()); } } diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index e59edb99c90..5b1da802a5e 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -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 diff --git a/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp b/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp index 41fd7622ed0..7e404624732 100644 --- a/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp +++ b/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp @@ -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; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 74fe102ed7b..1a969bdb7e2 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -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); } |