Core/Movement: implement MovementGeneratorMode::MOTION_MODE_OVERRIDE

(cherry picked from commit 2b24bc90fb4453c2d98ba4ad94d0a16532e1585a)
This commit is contained in:
ccrs
2026-06-29 15:02:28 +02:00
committed by Shauren
parent 8791e8b17c
commit 613c40f94f
2 changed files with 16 additions and 39 deletions
+15 -38
View File
@@ -386,16 +386,16 @@ void MotionMaster::Remove(MovementGenerator* movement, MovementSlot slot/* = MOT
}
}
void MotionMaster::Remove(MovementGeneratorType type, MovementSlot slot/* = MOTION_SLOT_ACTIVE*/)
void MotionMaster::Remove(MovementGeneratorType type, MovementSlot slot/* = MOTION_SLOT_ACTIVE*/, MovementGeneratorMode mode/* = MOTION_MODE_DEFAULT*/)
{
if (IsInvalidMovementGeneratorType(type) || IsInvalidMovementSlot(slot))
return;
if (HasFlag(MOTIONMASTER_FLAG_DELAYED))
{
DelayedActionDefine action = [this, type, slot]()
DelayedActionDefine action = [this, type, slot, mode]()
{
Remove(type, slot);
Remove(type, slot, mode);
};
_delayedActions.emplace_back(std::move(action), MOTIONMASTER_DELAYED_REMOVE_TYPE);
return;
@@ -413,9 +413,9 @@ void MotionMaster::Remove(MovementGeneratorType type, MovementSlot slot/* = MOTI
case MOTION_SLOT_ACTIVE:
if (!_generators.empty())
{
auto itr = std::find_if(_generators.begin(), _generators.end(), [type](MovementGenerator const* a) -> bool
auto itr = std::find_if(_generators.begin(), _generators.end(), [type, mode](MovementGenerator const* a) -> bool
{
return a->GetMovementGeneratorType() == type;
return a->GetMovementGeneratorType() == type && a->Mode == mode;
});
if (itr != _generators.end())
@@ -1279,35 +1279,6 @@ void MotionMaster::DirectClear(std::function<bool(MovementGenerator*)> const& fi
void MotionMaster::DirectAdd(MovementGenerator* movement, MovementSlot slot/* = MOTION_SLOT_ACTIVE*/)
{
/*
if (MovementGenerator* curr = _slot[slot])
{
_slot[slot] = nullptr; // in case a new one is generated in this slot during directdelete
if (_top == slot && (_cleanFlag & MOTIONMMASTER_CLEANFLAG_UPDATE))
DelayedDelete(curr);
else
DirectDelete(curr);
}
else if (_top < slot)
{
_top = slot;
}
_slot[slot] = m;
if (_top > slot)
_initialize[slot] = true;
else
{
_initialize[slot] = false;
m->Initialize(_owner);
}
*/
/*
* NOTE: This mimics old behaviour: only one MOTION_SLOT_IDLE, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED
* On future changes support for multiple will be added
*/
switch (slot)
{
case MOTION_SLOT_DEFAULT:
@@ -1324,16 +1295,22 @@ void MotionMaster::DirectAdd(MovementGenerator* movement, MovementSlot slot/* =
if (movement->Priority >= (*_generators.begin())->Priority)
{
auto itr = _generators.begin();
if (movement->Priority == (*itr)->Priority)
Remove(itr, true, false);
MovementGenerator* currentTopMovement = *itr;
if (movement->Priority == currentTopMovement->Priority)
{
if (movement->Mode > currentTopMovement->Mode)
currentTopMovement->Deactivate(_owner);
else
Remove(itr, true, false);
}
else
(*itr)->Deactivate(_owner);
currentTopMovement->Deactivate(_owner);
}
else
{
auto itr = std::find_if(_generators.begin(), _generators.end(), [movement](MovementGenerator const* a) -> bool
{
return a->Priority == movement->Priority;
return a->Priority == movement->Priority && a->Mode == movement->Mode;
});
if (itr != _generators.end())
+1 -1
View File
@@ -139,7 +139,7 @@ class TC_GAME_API MotionMaster
void Remove(MovementGenerator* movement, MovementSlot slot = MOTION_SLOT_ACTIVE);
// Removes first found movement
// NOTE: MOTION_SLOT_DEFAULT will be autofilled with IDLE_MOTION_TYPE
void Remove(MovementGeneratorType type, MovementSlot slot = MOTION_SLOT_ACTIVE);
void Remove(MovementGeneratorType type, MovementSlot slot = MOTION_SLOT_ACTIVE, MovementGeneratorMode mode = MOTION_MODE_DEFAULT);
// NOTE: MOTION_SLOT_DEFAULT wont be affected
void Clear();
// Removes all movements for the given MovementSlot