@@ -387,16 +387,16 @@ void MotionMaster::Remove(MovementGenerator* movement, MovementSlot slot/* = MOT
387387 }
388388}
389389
390- void MotionMaster::Remove (MovementGeneratorType type, MovementSlot slot/* = MOTION_SLOT_ACTIVE*/ )
390+ void MotionMaster::Remove (MovementGeneratorType type, MovementSlot slot/* = MOTION_SLOT_ACTIVE*/ , MovementGeneratorMode mode /* = MOTION_MODE_DEFAULT */ )
391391{
392392 if (IsInvalidMovementGeneratorType (type) || IsInvalidMovementSlot (slot))
393393 return ;
394394
395395 if (HasFlag (MOTIONMASTER_FLAG_DELAYED))
396396 {
397- DelayedActionDefine action = [this , type, slot]()
397+ DelayedActionDefine action = [this , type, slot, mode ]()
398398 {
399- Remove (type, slot);
399+ Remove (type, slot, mode );
400400 };
401401 _delayedActions.emplace_back (std::move (action), MOTIONMASTER_DELAYED_REMOVE_TYPE);
402402 return ;
@@ -414,9 +414,9 @@ void MotionMaster::Remove(MovementGeneratorType type, MovementSlot slot/* = MOTI
414414 case MOTION_SLOT_ACTIVE:
415415 if (!_generators.empty ())
416416 {
417- auto itr = std::find_if (_generators.begin (), _generators.end (), [type](MovementGenerator const * a) -> bool
417+ auto itr = std::find_if (_generators.begin (), _generators.end (), [type, mode ](MovementGenerator const * a) -> bool
418418 {
419- return a->GetMovementGeneratorType () == type;
419+ return a->GetMovementGeneratorType () == type && a-> Mode == mode ;
420420 });
421421
422422 if (itr != _generators.end ())
@@ -1153,35 +1153,6 @@ void MotionMaster::DirectClear(std::function<bool(MovementGenerator*)> const& fi
11531153
11541154void MotionMaster::DirectAdd (MovementGenerator* movement, MovementSlot slot/* = MOTION_SLOT_ACTIVE*/ )
11551155{
1156- /*
1157- if (MovementGenerator* curr = _slot[slot])
1158- {
1159- _slot[slot] = nullptr; // in case a new one is generated in this slot during directdelete
1160- if (_top == slot && (_cleanFlag & MOTIONMMASTER_CLEANFLAG_UPDATE))
1161- DelayedDelete(curr);
1162- else
1163- DirectDelete(curr);
1164- }
1165- else if (_top < slot)
1166- {
1167- _top = slot;
1168- }
1169-
1170- _slot[slot] = m;
1171- if (_top > slot)
1172- _initialize[slot] = true;
1173- else
1174- {
1175- _initialize[slot] = false;
1176- m->Initialize(_owner);
1177- }
1178- */
1179-
1180- /*
1181- * NOTE: This mimics old behaviour: only one MOTION_SLOT_IDLE, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED
1182- * On future changes support for multiple will be added
1183- */
1184-
11851156 switch (slot)
11861157 {
11871158 case MOTION_SLOT_DEFAULT:
@@ -1198,16 +1169,22 @@ void MotionMaster::DirectAdd(MovementGenerator* movement, MovementSlot slot/* =
11981169 if (movement->Priority >= (*_generators.begin ())->Priority )
11991170 {
12001171 auto itr = _generators.begin ();
1201- if (movement->Priority == (*itr)->Priority )
1202- Remove (itr, true , false );
1172+ MovementGenerator* currentTopMovement = *itr;
1173+ if (movement->Priority == currentTopMovement->Priority )
1174+ {
1175+ if (movement->Mode > currentTopMovement->Mode )
1176+ currentTopMovement->Deactivate (_owner);
1177+ else
1178+ Remove (itr, true , false );
1179+ }
12031180 else
1204- (*itr) ->Deactivate (_owner);
1181+ currentTopMovement ->Deactivate (_owner);
12051182 }
12061183 else
12071184 {
12081185 auto itr = std::find_if (_generators.begin (), _generators.end (), [movement](MovementGenerator const * a) -> bool
12091186 {
1210- return a->Priority == movement->Priority ;
1187+ return a->Priority == movement->Priority && a-> Mode == movement-> Mode ;
12111188 });
12121189
12131190 if (itr != _generators.end ())
0 commit comments