diff options
author | ariel- <ariel-@users.noreply.github.com> | 2018-02-20 19:34:58 -0300 |
---|---|---|
committer | funjoker <funjoker109@gmail.com> | 2021-08-08 21:21:34 +0200 |
commit | 489b111a8a08dd3b2e14cc926f5c0b5c2ae17f1d (patch) | |
tree | bed27c36435b7a84cd7cd285b1b5617218c6ae59 /src | |
parent | 70c26d53cb94f0e78a57ecc2279c960370891aa4 (diff) |
Core/Vehicles: fix crash
- Aura could be removed in Unit::SetCharmedBy (StopMoving->Relocate->ProcessTerrainStatusUpdate->RemoveAurasWithInterruptFlags)
- By not passing AuraApplication parameter execution continued with a removed application leaving vehicle in a invalid state (m_sharedVision not empty)
Closes #18281
(cherry picked from commit eb7d22d23eedb0d1b5374f80518cd7994d7c7b3a)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 0d087d971aa..134c62ef192 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -27,6 +27,7 @@ #include "ObjectMgr.h" #include "Player.h" #include "ScriptMgr.h" +#include "SpellAuraEffects.h" #include "TemporarySummon.h" #include "Unit.h" #include "Util.h" @@ -761,7 +762,16 @@ bool VehicleJoinEvent::Execute(uint64, uint32) { ASSERT(Passenger->IsInWorld()); ASSERT(Target && Target->GetBase()->IsInWorld()); - ASSERT(Target->GetBase()->HasAuraTypeWithCaster(SPELL_AURA_CONTROL_VEHICLE, Passenger->GetGUID())); + + Unit::AuraEffectList const& vehicleAuras = Target->GetBase()->GetAuraEffectsByType(SPELL_AURA_CONTROL_VEHICLE); + auto itr = std::find_if(vehicleAuras.begin(), vehicleAuras.end(), [this](AuraEffect const* aurEff) -> bool + { + return aurEff->GetCasterGUID() == Passenger->GetGUID(); + }); + ASSERT(itr != vehicleAuras.end()); + + AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(Target->GetBase()->GetGUID()); + ASSERT(aurApp && !aurApp->GetRemoveMode()); Target->RemovePendingEventsForSeat(Seat->first); Target->RemovePendingEventsForPassenger(Passenger); @@ -805,14 +815,14 @@ bool VehicleJoinEvent::Execute(uint64, uint32) player->StopCastingCharm(); player->StopCastingBindSight(); player->SendOnCancelExpectedVehicleRideAura(); - if (!(veSeat->FlagsB & VEHICLE_SEAT_FLAG_B_KEEP_PET)) + if (!veSeat->HasFlag(VEHICLE_SEAT_FLAG_B_KEEP_PET)) player->UnsummonPetTemporaryIfAny(); } - if (veSeat->Flags & VEHICLE_SEAT_FLAG_DISABLE_GRAVITY) + if (veSeat->HasFlag(VEHICLE_SEAT_FLAG_DISABLE_GRAVITY)) Passenger->SetDisableGravity(true); - if (Seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE) + if (Seat->second.SeatInfo->HasFlag(VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE)) Passenger->AddUnitFlag(UNIT_FLAG_NOT_SELECTABLE); Passenger->m_movementInfo.transport.pos.Relocate(veSeat->AttachmentOffset.X, veSeat->AttachmentOffset.Y, veSeat->AttachmentOffset.Z); @@ -822,10 +832,15 @@ bool VehicleJoinEvent::Execute(uint64, uint32) Passenger->m_movementInfo.transport.vehicleId = Target->GetVehicleInfo()->ID; if (Target->GetBase()->GetTypeId() == TYPEID_UNIT && Passenger->GetTypeId() == TYPEID_PLAYER && - Seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + Seat->second.SeatInfo->HasFlag(VEHICLE_SEAT_FLAG_CAN_CONTROL)) { - bool charmedByResult = Target->GetBase()->SetCharmedBy(Passenger, CHARM_TYPE_VEHICLE); // SMSG_CLIENT_CONTROL - ASSERT(charmedByResult); + // handles SMSG_CLIENT_CONTROL + if (!Target->GetBase()->SetCharmedBy(Passenger, CHARM_TYPE_VEHICLE, aurApp)) + { + // charming failed, probably aura was removed by relocation/scripts/whatever + Abort(0); + return true; + } } Passenger->SendClearTarget(); // SMSG_BREAK_TARGET |