Core/Movement: Implement initializing parabolic splines using jump gravity instead of max parabolic height
Port From (https://github.com/TrinityCore/TrinityCore/commit/684cd9d9681466019dcd06ad6f994890cff8cb2e)
This commit is contained in:
@@ -736,6 +736,38 @@ namespace Game.Movement
|
|||||||
Add(movement);
|
Add(movement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MoveJumpWithGravity(Position pos, float speedXY, float gravity, uint id = EventId.Jump, bool hasOrientation = false, JumpArrivalCastArgs arrivalCast = null, SpellEffectExtraData spellEffectExtraData = null)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Movement, $"MotionMaster.MoveJumpWithGravity: '{_owner.GetGUID()}', jumps to point Id: {id} ({pos})");
|
||||||
|
if (speedXY < 0.01f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
MoveSplineInit init = new(_owner);
|
||||||
|
init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false);
|
||||||
|
init.SetParabolicVerticalAcceleration(gravity, 0);
|
||||||
|
init.SetUncompressed();
|
||||||
|
init.SetVelocity(speedXY);
|
||||||
|
|
||||||
|
if (hasOrientation)
|
||||||
|
init.SetFacing(pos.GetOrientation());
|
||||||
|
|
||||||
|
if (spellEffectExtraData != null)
|
||||||
|
init.SetSpellEffectExtraData(spellEffectExtraData);
|
||||||
|
|
||||||
|
uint arrivalSpellId = 0;
|
||||||
|
ObjectGuid arrivalSpellTargetGuid = default;
|
||||||
|
if (arrivalCast != null)
|
||||||
|
{
|
||||||
|
arrivalSpellId = arrivalCast.SpellId;
|
||||||
|
arrivalSpellTargetGuid = arrivalCast.Target;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenericMovementGenerator movement = new GenericMovementGenerator(init, MovementGeneratorType.Effect, id, arrivalSpellId, arrivalSpellTargetGuid);
|
||||||
|
movement.Priority = MovementGeneratorPriority.Highest;
|
||||||
|
movement.BaseUnitState = UnitState.Jumping;
|
||||||
|
Add(movement);
|
||||||
|
}
|
||||||
|
|
||||||
public void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, byte stepCount)
|
public void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, byte stepCount)
|
||||||
{
|
{
|
||||||
float step = 2 * MathFunctions.PI / stepCount * (clockwise ? -1.0f : 1.0f);
|
float step = 2 * MathFunctions.PI / stepCount * (clockwise ? -1.0f : 1.0f);
|
||||||
|
|||||||
@@ -70,9 +70,16 @@ namespace Game.Movement
|
|||||||
effect_start_time = (int)(Duration() * args.time_perc);
|
effect_start_time = (int)(Duration() * args.time_perc);
|
||||||
if (args.flags.HasFlag(SplineFlag.Parabolic) && effect_start_time < Duration())
|
if (args.flags.HasFlag(SplineFlag.Parabolic) && effect_start_time < Duration())
|
||||||
{
|
{
|
||||||
float f_duration = (float)TimeSpan.FromMilliseconds(Duration() - effect_start_time).TotalSeconds;
|
if (args.parabolic_amplitude != 0.0f)
|
||||||
|
{
|
||||||
|
float f_duration = MSToSec((uint)(Duration() - effect_start_time));
|
||||||
vertical_acceleration = args.parabolic_amplitude * 8.0f / (f_duration * f_duration);
|
vertical_acceleration = args.parabolic_amplitude * 8.0f / (f_duration * f_duration);
|
||||||
}
|
}
|
||||||
|
else if (args.vertical_acceleration != 0.0f)
|
||||||
|
{
|
||||||
|
vertical_acceleration = args.vertical_acceleration;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -293,6 +293,15 @@ namespace Game.Movement
|
|||||||
{
|
{
|
||||||
args.time_perc = time_shift;
|
args.time_perc = time_shift;
|
||||||
args.parabolic_amplitude = amplitude;
|
args.parabolic_amplitude = amplitude;
|
||||||
|
args.vertical_acceleration = 0.0f;
|
||||||
|
args.flags.EnableParabolic();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetParabolicVerticalAcceleration(float vertical_acceleration, float time_shift)
|
||||||
|
{
|
||||||
|
args.time_perc = time_shift;
|
||||||
|
args.parabolic_amplitude = 0.0f;
|
||||||
|
args.vertical_acceleration = vertical_acceleration;
|
||||||
args.flags.EnableParabolic();
|
args.flags.EnableParabolic();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ namespace Game.Movement
|
|||||||
public int path_Idx_offset;
|
public int path_Idx_offset;
|
||||||
public float velocity;
|
public float velocity;
|
||||||
public float parabolic_amplitude;
|
public float parabolic_amplitude;
|
||||||
|
public float vertical_acceleration;
|
||||||
public float time_perc;
|
public float time_perc;
|
||||||
public uint splineId;
|
public uint splineId;
|
||||||
public float initialOrientation;
|
public float initialOrientation;
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ namespace Game.Networking.Packets
|
|||||||
data.WriteBits(moveSpline.GetPath().Length, 16);
|
data.WriteBits(moveSpline.GetPath().Length, 16);
|
||||||
data.WriteBit(false); // HasSplineFilter
|
data.WriteBit(false); // HasSplineFilter
|
||||||
data.WriteBit(moveSpline.spell_effect_extra.HasValue); // HasSpellEffectExtraData
|
data.WriteBit(moveSpline.spell_effect_extra.HasValue); // HasSpellEffectExtraData
|
||||||
data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.Parabolic)); // HasJumpExtraData
|
bool hasJumpExtraData = data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.Parabolic) && (!moveSpline.spell_effect_extra.HasValue || moveSpline.effect_start_time != 0));
|
||||||
data.WriteBit(moveSpline.anim_tier.HasValue); // HasAnimationTierTransition
|
data.WriteBit(moveSpline.anim_tier.HasValue); // HasAnimationTierTransition
|
||||||
data.WriteBit(false); // HasUnknown901
|
data.WriteBit(false); // HasUnknown901
|
||||||
data.FlushBits();
|
data.FlushBits();
|
||||||
@@ -253,7 +253,7 @@ namespace Game.Networking.Packets
|
|||||||
data.WriteUInt32(moveSpline.spell_effect_extra.Value.ParabolicCurveId);
|
data.WriteUInt32(moveSpline.spell_effect_extra.Value.ParabolicCurveId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (moveSpline.splineflags.HasFlag(SplineFlag.Parabolic))
|
if (hasJumpExtraData)
|
||||||
{
|
{
|
||||||
data.WriteFloat(moveSpline.vertical_acceleration);
|
data.WriteFloat(moveSpline.vertical_acceleration);
|
||||||
data.WriteInt32(moveSpline.effect_start_time);
|
data.WriteInt32(moveSpline.effect_start_time);
|
||||||
@@ -385,7 +385,7 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
movementSpline.MoveTime = (uint)moveSpline.Duration();
|
movementSpline.MoveTime = (uint)moveSpline.Duration();
|
||||||
|
|
||||||
if (splineFlags.HasFlag(SplineFlag.Parabolic))
|
if (splineFlags.HasFlag(SplineFlag.Parabolic) && (!moveSpline.spell_effect_extra.HasValue || moveSpline.effect_start_time != 0))
|
||||||
{
|
{
|
||||||
movementSpline.JumpExtraData.HasValue = true;
|
movementSpline.JumpExtraData.HasValue = true;
|
||||||
movementSpline.JumpExtraData.Value.JumpGravity = moveSpline.vertical_acceleration;
|
movementSpline.JumpExtraData.Value.JumpGravity = moveSpline.vertical_acceleration;
|
||||||
|
|||||||
Reference in New Issue
Block a user