mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-02-10 20:19:49 +01:00
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
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
#include "ObjectMgr.h"
|
||||
#include "Player.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "TemporarySummon.h"
|
||||
#include "Unit.h"
|
||||
#include "Util.h"
|
||||
@@ -768,7 +769,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);
|
||||
@@ -811,11 +821,11 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
|
||||
player->StopCastingCharm();
|
||||
player->StopCastingBindSight();
|
||||
player->SendOnCancelExpectedVehicleRideAura();
|
||||
if (!(veSeat->m_flagsB & VEHICLE_SEAT_FLAG_B_KEEP_PET))
|
||||
if (!veSeat->HasFlag(VEHICLE_SEAT_FLAG_B_KEEP_PET))
|
||||
player->UnsummonPetTemporaryIfAny();
|
||||
}
|
||||
|
||||
if (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE)
|
||||
if (veSeat->HasFlag(VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE))
|
||||
Passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
Passenger->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
|
||||
@@ -825,10 +835,15 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
|
||||
Passenger->m_movementInfo.transport.guid = Target->GetBase()->GetGUID();
|
||||
|
||||
if (Target->GetBase()->GetTypeId() == TYPEID_UNIT && Passenger->GetTypeId() == TYPEID_PLAYER &&
|
||||
Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
|
||||
veSeat->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
|
||||
|
||||
Reference in New Issue
Block a user