Core/Misc: movement cleanup

Port From (https://github.com/TrinityCore/TrinityCore/commit/4793b073eec2af32622ff703911721100730e868)
This commit is contained in:
hondacrx
2021-09-26 12:17:10 -04:00
parent e747de7608
commit 569e20ebc1
12 changed files with 76 additions and 48 deletions
+28 -29
View File
@@ -35,7 +35,7 @@ namespace Game.Movement
{
_owner = me;
_top = -1;
_cleanFlag = MMCleanFlag.None;
_cleanFlag = MotionMasterCleanFlag.None;
for (byte i = 0; i < (int)MovementSlot.Max; ++i)
{
@@ -44,6 +44,12 @@ namespace Game.Movement
}
}
public IMovementGenerator Top()
{
Cypher.Assert(!Empty());
return _slot[_top];
}
public void Initialize()
{
while (!Empty())
@@ -61,7 +67,7 @@ namespace Game.Movement
{
if (_owner.IsTypeId(TypeId.Unit))
{
IMovementGenerator movement = AISelector.SelectMovementAI(_owner.ToCreature());
IMovementGenerator movement = AISelector.SelectMovementAI(_owner);
StartMovement(movement ?? staticIdleMovement, MovementSlot.Idle);
}
else
@@ -75,14 +81,14 @@ namespace Game.Movement
Cypher.Assert(!Empty());
_cleanFlag |= MMCleanFlag.Update;
_cleanFlag |= MotionMasterCleanFlag.Update;
if (!Top().Update(_owner, diff))
{
_cleanFlag &= ~MMCleanFlag.Update;
_cleanFlag &= ~MotionMasterCleanFlag.Update;
MovementExpired();
}
else
_cleanFlag &= ~MMCleanFlag.Update;
_cleanFlag &= ~MotionMasterCleanFlag.Update;
if (!_expireList.Empty())
ClearExpireList();
@@ -90,12 +96,12 @@ namespace Game.Movement
public void Clear(bool reset = true)
{
if (Convert.ToBoolean(_cleanFlag & MMCleanFlag.Update))
if (Convert.ToBoolean(_cleanFlag & MotionMasterCleanFlag.Update))
{
if (reset)
_cleanFlag |= MMCleanFlag.Reset;
_cleanFlag |= MotionMasterCleanFlag.Reset;
else
_cleanFlag &= ~MMCleanFlag.Reset;
_cleanFlag &= ~MotionMasterCleanFlag.Reset;
DelayedClean();
}
else
@@ -107,7 +113,7 @@ namespace Game.Movement
if (Empty() || slot >= MovementSlot.Max)
return;
if (_cleanFlag.HasAnyFlag(MMCleanFlag.Update))
if (_cleanFlag.HasAnyFlag(MotionMasterCleanFlag.Update))
DelayedClean(slot);
else
DirectClean(slot);
@@ -115,12 +121,12 @@ namespace Game.Movement
public void MovementExpired(bool reset = true)
{
if (Convert.ToBoolean(_cleanFlag & MMCleanFlag.Update))
if (Convert.ToBoolean(_cleanFlag & MotionMasterCleanFlag.Update))
{
if (reset)
_cleanFlag |= MMCleanFlag.Reset;
_cleanFlag |= MotionMasterCleanFlag.Reset;
else
_cleanFlag &= ~MMCleanFlag.Reset;
_cleanFlag &= ~MotionMasterCleanFlag.Reset;
DelayedExpire();
}
else
@@ -130,7 +136,11 @@ namespace Game.Movement
public MovementGeneratorType GetCurrentMovementGeneratorType()
{
if (Empty())
return MovementGeneratorType.Idle;
return MovementGeneratorType.Max;
IMovementGenerator movement = Top();
if (movement == null)
return MovementGeneratorType.Max;
return Top().GetMovementGeneratorType();
}
@@ -654,7 +664,7 @@ namespace Game.Movement
if (curr != null)
{
_slot[(int)slot] = null; // in case a new one is generated in this slot during directdelete
if (_top == (int)slot && Convert.ToBoolean(_cleanFlag & MMCleanFlag.Update))
if (_top == (int)slot && Convert.ToBoolean(_cleanFlag & MotionMasterCleanFlag.Update))
DelayedDelete(curr);
else
DirectDelete(curr);
@@ -794,27 +804,16 @@ namespace Game.Movement
Initialize();
else if (NeedInitTop())
InitTop();
else if (_cleanFlag.HasAnyFlag(MMCleanFlag.Reset))
else if (_cleanFlag.HasAnyFlag(MotionMasterCleanFlag.Reset))
Top().Reset(_owner);
_cleanFlag &= ~MMCleanFlag.Reset;
_cleanFlag &= ~MotionMasterCleanFlag.Reset;
}
public bool Empty() { return (_top < 0); }
int Size() { return _top + 1; }
public IMovementGenerator TopOrNull()
{
return Empty() ? null : Top();
}
public IMovementGenerator Top()
{
Cypher.Assert(!Empty());
return _slot[_top];
}
public static uint SplineId
{
get { return splineId++; }
@@ -829,7 +828,7 @@ namespace Game.Movement
Unit _owner { get; }
IMovementGenerator[] _slot = new IMovementGenerator[(int)MovementSlot.Max];
MMCleanFlag _cleanFlag;
MotionMasterCleanFlag _cleanFlag;
bool[] _initialize = new bool[(int)MovementSlot.Max];
int _top;
List<IMovementGenerator> _expireList = new();
@@ -841,7 +840,7 @@ namespace Game.Movement
public ObjectGuid Target;
}
enum MMCleanFlag
enum MotionMasterCleanFlag
{
None = 0,
Update = 1, // Clear or Expire called from update