From 1323ae116c812c047c4afa5b258ae4be7ca946f3 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 27 May 2019 14:56:46 +0200 Subject: [PATCH] Core/Vehicles: fixed a crash caused when changing vehicle seats via spell *cleaned up some code for aura target limits --- src/server/game/Entities/Player/Player.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 16 ++++++++++------ src/server/game/Spells/Auras/SpellAuras.cpp | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 22b9ebd63f..8cf16988e6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -27243,7 +27243,7 @@ void Player::ActivateSpec(uint8 spec) AurasBySpellIdMap& ltAurasBySpellId = GetAllLimitedCastAuras(); for (AurasBySpellIdMap::iterator itr = ltAurasBySpellId.begin(); itr != ltAurasBySpellId.end(); itr++) { - AuraList list = itr->second; + AuraList& list = itr->second; for (AuraList::iterator iter = list.begin(); iter != list.end();) { Aura* aura = *iter; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1b1c21c794..3f84d0c7ee 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3402,16 +3402,15 @@ void Unit::_AddAura(UnitAura* aura, Unit* caster) */ // register limited target aura - caster->GetLimitedCastAuras(aura->GetSpellInfo()->Id).push_back(aura); + caster->GetLimitedCastAuras(aura->GetId()).push_back(aura); - Unit::AuraList& ltAuras = caster->GetLimitedCastAuras(aura->GetSpellInfo()->Id); - bool isSingleTarget = aura->GetSpellInfo()->IsSingleTarget(); + Unit::AuraList& ltAuras = caster->GetLimitedCastAuras(aura->GetId()); uint32 targetLimit = aura->GetSpellInfo()->GetAuraTargetLimit(); // remove other limited target auras for (Unit::AuraList::iterator itr = ltAuras.begin(); itr != ltAuras.end();) { - if ((*itr) != aura && (*itr)->IsLimitedTargetWith(aura) && isSingleTarget) + if ((*itr) != aura && (*itr)->IsLimitedTargetWith(aura) && !targetLimit) { (*itr)->Remove(); itr = ltAuras.begin(); @@ -4007,7 +4006,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGUID, U newAura->UnregisterLimitedTarget(); // bring back single target aura status to the old aura aura->SetIsLimitedTarget(true); - caster->GetLimitedCastAuras(aura->GetSpellInfo()->Id).push_back(aura); + caster->GetLimitedCastAuras(aura->GetId()).push_back(aura); } // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]); @@ -4107,7 +4106,7 @@ void Unit::RemoveNotOwnLimitedTargetAuras(bool onPhaseChange /*= false*/) // limited target auras at other targets AurasBySpellIdMap& ltAurasBySpellId = GetAllLimitedCastAuras(); - for (AurasBySpellIdMap::iterator itr = ltAurasBySpellId.begin(); itr != ltAurasBySpellId.end(); ++itr) + for (AurasBySpellIdMap::iterator itr = ltAurasBySpellId.begin(); itr != ltAurasBySpellId.end(); itr++) { AuraList& list = itr->second; for (AuraList::iterator iter = list.begin(); iter != list.end();) @@ -13453,6 +13452,11 @@ void Unit::_EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* a } else if (seatId >= 0 && seatId == GetTransSeat()) return; + else + { + //Exit the current vehicle because unit will reenter in a new seat. + m_vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE, GetGUID(), aurApp->GetBase()); + } } if (aurApp->GetRemoveMode()) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index cbbbb5fba1..b069fc9143 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1084,7 +1084,7 @@ void Aura::UnregisterLimitedTarget() ASSERT(m_isLimitedTarget); Unit* caster = GetCaster(); ASSERT(caster); - caster->GetLimitedCastAuras(GetSpellInfo()->Id).remove(this); + caster->GetLimitedCastAuras(GetId()).remove(this); SetIsLimitedTarget(false); }