Core/Movement: implement MovementGeneratorMode::MOTION_MODE_OVERRIDE
(cherry picked from commit 2b24bc90fb4453c2d98ba4ad94d0a16532e1585a)
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user