diff options
| author | QAston <qaston@gmail.com> | 2010-12-31 15:37:44 +0100 |
|---|---|---|
| committer | QAston <qaston@gmail.com> | 2010-12-31 15:37:44 +0100 |
| commit | dd5a77bebc6f5f747a1b1fd4ad64d0f191f1c5ec (patch) | |
| tree | 0d78ca3b728413961dfa36093d415e39aebeb8e5 /src/server/game/Entities/Unit | |
| parent | 4eccbb81afd8c94950f704c317848d38831aaec9 (diff) | |
Core/Auras: Recheck aura presence on target after calling linked events in charm and vehicle aura effect handlers.
Diffstat (limited to 'src/server/game/Entities/Unit')
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 23 | ||||
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.h | 6 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b1c96166c1c..198f890fb9d 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -15275,7 +15275,7 @@ void Unit::SetConfused(bool apply) this->ToPlayer()->SetClientControl(this, !apply); } -bool Unit::SetCharmedBy(Unit* charmer, CharmType type) +bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const * aurApp) { if (!charmer) return false; @@ -15336,6 +15336,11 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type) return false; } + // charm is set by aura, and aura effect remove handler was called during apply handler execution + // prevent undefined behaviour + if (aurApp && aurApp->GetRemoveMode()) + return false; + // Set charmed Map* pMap = GetMap(); if (!IsVehicle() || (IsVehicle() && pMap && !pMap->IsBattleground())) @@ -15355,6 +15360,11 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type) this->ToPlayer()->SetClientControl(this, 0); } + // charm is set by aura, and aura effect remove handler was called during apply handler execution + // prevent undefined behaviour + if (aurApp && aurApp->GetRemoveMode()) + return false; + // Pets already have a properly initialized CharmInfo, don't overwrite it. if (type != CHARM_TYPE_VEHICLE && !GetCharmInfo()) { @@ -16308,7 +16318,7 @@ bool Unit::CheckPlayerCondition(Player* pPlayer) } } -void Unit::EnterVehicle(Vehicle *vehicle, int8 seatId, bool byAura) +void Unit::EnterVehicle(Vehicle *vehicle, int8 seatId, AuraApplication const * aurApp) { if (!isAlive() || GetVehicleKit() == vehicle) return; @@ -16320,7 +16330,7 @@ void Unit::EnterVehicle(Vehicle *vehicle, int8 seatId, bool byAura) if (seatId >= 0 && seatId != GetTransSeat()) { sLog->outDebug("EnterVehicle: %u leave vehicle %u seat %d and enter %d.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId); - ChangeSeat(seatId, byAura); + ChangeSeat(seatId, bool(aurApp)); } return; } @@ -16347,9 +16357,14 @@ void Unit::EnterVehicle(Vehicle *vehicle, int8 seatId, bool byAura) bg->EventPlayerDroppedFlag(plr); } + // vehicle is applied by aura, and aura effect remove handler was called during apply handler execution + // prevent undefined behaviour + if (aurApp && aurApp->GetRemoveMode()) + return; + ASSERT(!m_vehicle); m_vehicle = vehicle; - if (!m_vehicle->AddPassenger(this, seatId, byAura)) + if (!m_vehicle->AddPassenger(this, seatId, bool(aurApp))) { m_vehicle = NULL; return; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index d9c9acdfa5f..0f074e50a47 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1564,7 +1564,7 @@ class Unit : public WorldObject void RemoveAllMinionsByEntry(uint32 entry); void SetCharm(Unit* target, bool apply); Unit* GetNextRandomRaidMemberOrPet(float radius); - bool SetCharmedBy(Unit* charmer, CharmType type); + bool SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const * aurApp = NULL); void RemoveCharmedBy(Unit* charmer); void RestoreFaction(); @@ -2028,8 +2028,8 @@ class Unit : public WorldObject bool m_ControlledByPlayer; bool CheckPlayerCondition(Player* pPlayer); - void EnterVehicle(Unit *base, int8 seatId = -1, bool byAura = false) { EnterVehicle(base->GetVehicleKit(), seatId, byAura); } - void EnterVehicle(Vehicle *vehicle, int8 seatId = -1, bool byAura = false); + void EnterVehicle(Unit *base, int8 seatId = -1, AuraApplication const * aurApp = NULL) { EnterVehicle(base->GetVehicleKit(), seatId, aurApp); } + void EnterVehicle(Vehicle *vehicle, int8 seatId = -1, AuraApplication const * aurApp = NULL); void ExitVehicle(); void ChangeSeat(int8 seatId, bool next = true, bool byAura = false); |
