Core/Auras: Recheck aura presence on target after calling linked events in charm and vehicle aura effect handlers.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user