aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Unit
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2010-12-31 15:37:44 +0100
committerQAston <qaston@gmail.com>2010-12-31 15:37:44 +0100
commitdd5a77bebc6f5f747a1b1fd4ad64d0f191f1c5ec (patch)
tree0d78ca3b728413961dfa36093d415e39aebeb8e5 /src/server/game/Entities/Unit
parent4eccbb81afd8c94950f704c317848d38831aaec9 (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-xsrc/server/game/Entities/Unit/Unit.cpp23
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h6
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);