diff options
author | ariel- <ariel-@users.noreply.github.com> | 2018-02-21 22:38:22 -0300 |
---|---|---|
committer | funjoker <funjoker109@gmail.com> | 2021-08-08 21:21:34 +0200 |
commit | b1a76fc7569ab7338730d680e7b0c703fa6b1003 (patch) | |
tree | 0a5ab8d11c563cc8ef981b6b02bdc64b4ffbaa09 /src | |
parent | 841801718855c4f3cf082ac53c2bf863c03002ea (diff) |
Core/Unit: clear charmed/possessed state before returning client control. Works like a charm
Closes #21471
(cherry picked from commit fc678bb3c21d6c5a87a840c7bbf596eaea1cffc3)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
2 files changed, 5 insertions, 5 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 76ead47fe5e..ad91cc9b8ae 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6420,6 +6420,8 @@ void Unit::SetCharm(Unit* charm, bool apply) } else { + charm->ClearUnitState(UNIT_STATE_CHARMED); + if (GetTypeId() == TYPEID_PLAYER) { if (GetCharmGUID() == charm->GetGUID()) @@ -11941,11 +11943,11 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au playerCharmer->VehicleSpellInitialize(); break; case CHARM_TYPE_POSSESS: - AddUnitState(UNIT_STATE_POSSESSED); AddUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); charmer->AddUnitFlag(UNIT_FLAG_REMOVE_CLIENT_CONTROL); playerCharmer->SetClientControl(this, true); playerCharmer->PossessSpellInitialize(); + AddUnitState(UNIT_STATE_POSSESSED); break; case CHARM_TYPE_CHARM: if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK) @@ -12034,7 +12036,6 @@ void Unit::RemoveCharmedBy(Unit* charmer) charmer->SetCharm(this, false); Player* playerCharmer = charmer->ToPlayer(); - if (playerCharmer) { switch (type) @@ -12045,11 +12046,11 @@ void Unit::RemoveCharmedBy(Unit* charmer) RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); break; case CHARM_TYPE_POSSESS: + ClearUnitState(UNIT_STATE_POSSESSED); playerCharmer->SetClientControl(this, false); playerCharmer->SetClientControl(charmer, true); charmer->RemoveUnitFlag(UNIT_FLAG_REMOVE_CLIENT_CONTROL); RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); - ClearUnitState(UNIT_STATE_POSSESSED); break; case CHARM_TYPE_CHARM: if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK) @@ -12091,7 +12092,6 @@ void Unit::RemoveCharmedBy(Unit* charmer) // reset confused movement for example ApplyControlStatesIfNeeded(); - ClearUnitState(UNIT_STATE_CHARMED); } void Unit::RestoreFaction() diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index eee89e86692..e164484ce00 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -281,7 +281,7 @@ enum UnitState : uint32 UNIT_STATE_UNATTACKABLE = UNIT_STATE_IN_FLIGHT, UNIT_STATE_MOVING = UNIT_STATE_ROAMING_MOVE | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE | UNIT_STATE_CHASE_MOVE | UNIT_STATE_FOLLOW_MOVE, UNIT_STATE_CONTROLLED = UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING, - UNIT_STATE_CANT_CLIENT_CONTROL = UNIT_STATE_CONFUSED | UNIT_STATE_CHARMED | UNIT_STATE_POSSESSED | UNIT_STATE_FLEEING | UNIT_STATE_POSSESSED, + UNIT_STATE_CANT_CLIENT_CONTROL = UNIT_STATE_CHARMED | UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED | UNIT_STATE_POSSESSED, UNIT_STATE_LOST_CONTROL = UNIT_STATE_CONTROLLED | UNIT_STATE_POSSESSED | UNIT_STATE_JUMPING | UNIT_STATE_CHARGING, UNIT_STATE_CANNOT_AUTOATTACK = UNIT_STATE_CONTROLLED | UNIT_STATE_CHARGING | UNIT_STATE_CASTING, UNIT_STATE_SIGHTLESS = UNIT_STATE_LOST_CONTROL | UNIT_STATE_EVADE, |