Skip to content

Commit 2b24bc9

Browse files
committed
Core/Movement: implement MovementGeneratorMode::MOTION_MODE_OVERRIDE
1 parent 1d2c7ad commit 2b24bc9

2 files changed

Lines changed: 16 additions & 39 deletions

File tree

src/server/game/Movement/MotionMaster.cpp

Lines changed: 15 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

11541154
void 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())

src/server/game/Movement/MotionMaster.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class TC_GAME_API MotionMaster
135135
void Remove(MovementGenerator* movement, MovementSlot slot = MOTION_SLOT_ACTIVE);
136136
// Removes first found movement
137137
// NOTE: MOTION_SLOT_DEFAULT will be autofilled with IDLE_MOTION_TYPE
138-
void Remove(MovementGeneratorType type, MovementSlot slot = MOTION_SLOT_ACTIVE);
138+
void Remove(MovementGeneratorType type, MovementSlot slot = MOTION_SLOT_ACTIVE, MovementGeneratorMode mode = MOTION_MODE_DEFAULT);
139139
// NOTE: MOTION_SLOT_DEFAULT wont be affected
140140
void Clear();
141141
// Removes all movements for the given MovementSlot

0 commit comments

Comments
 (0)