Core/Vehicles: Make the vehicle system more aura driven. Get rid of redundant checks and update relevant data.
Closes #805
This commit is contained in:
@@ -122,7 +122,7 @@ void Vehicle::Install()
|
||||
|
||||
void Vehicle::InstallAllAccessories()
|
||||
{
|
||||
me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE); // We might have aura's saved in the DB with now invalid casters - remove
|
||||
RemoveAllPassengers(); // We might have aura's saved in the DB with now invalid casters - remove
|
||||
|
||||
VehicleAccessoryList const* mVehicleList = sObjectMgr->GetVehicleAccessoryList(m_creatureEntry);
|
||||
if (!mVehicleList)
|
||||
@@ -134,12 +134,7 @@ void Vehicle::InstallAllAccessories()
|
||||
|
||||
void Vehicle::Uninstall()
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Uninstall %u", me->GetEntry());
|
||||
for (SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (Unit *passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
|
||||
if (passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
|
||||
passenger->ToTempSummon()->UnSummon();
|
||||
|
||||
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Uninstall Entry: %u, GuidLow: %u", m_creatureEntry, me->GetGUIDLow());
|
||||
RemoveAllPassengers();
|
||||
|
||||
if (GetBase()->GetTypeId() == TYPEID_UNIT)
|
||||
@@ -148,12 +143,7 @@ void Vehicle::Uninstall()
|
||||
|
||||
void Vehicle::Die()
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Die %u", me->GetEntry());
|
||||
for (SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (Unit *passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
|
||||
if (passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
|
||||
passenger->setDeathState(JUST_DIED);
|
||||
|
||||
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Die Entry: %u, GuidLow: %u", m_creatureEntry, me->GetGUIDLow());
|
||||
RemoveAllPassengers();
|
||||
|
||||
if (GetBase()->GetTypeId() == TYPEID_UNIT)
|
||||
@@ -181,31 +171,18 @@ void Vehicle::Reset()
|
||||
|
||||
void Vehicle::RemoveAllPassengers()
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::RemoveAllPassengers");
|
||||
for (SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (Unit *passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
|
||||
{
|
||||
ASSERT(passenger->IsInWorld());
|
||||
ASSERT(passenger->IsOnVehicle(GetBase()));
|
||||
ASSERT(GetSeatForPassenger(passenger));
|
||||
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::RemoveAllPassengers. Entry: %u, GuidLow: %u", m_creatureEntry, me->GetGUIDLow());
|
||||
|
||||
if (passenger->IsVehicle())
|
||||
passenger->GetVehicleKit()->RemoveAllPassengers();
|
||||
// Passengers always cast an aura with SPELL_AURA_CONTROL_VEHICLE on the vehicle
|
||||
// We just remove the aura and the unapply handler will make the target leave the vehicle.
|
||||
// We don't need to iterate over m_Seats
|
||||
me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE);
|
||||
|
||||
if (passenger->GetVehicle() != this)
|
||||
sLog->outCrash("Vehicle %u has invalid passenger %u. Seat: %i", me->GetEntry(), passenger->GetEntry(), itr->first);
|
||||
|
||||
passenger->ExitVehicle();
|
||||
if (itr->second.passenger)
|
||||
{
|
||||
sLog->outCrash("Vehicle %u cannot remove passenger %u. "UI64FMTD" is still on vehicle.", me->GetEntry(), passenger->GetEntry(), itr->second.passenger);
|
||||
itr->second.passenger = 0;
|
||||
}
|
||||
|
||||
// creature passengers mounted on player mounts should be despawned at dismount
|
||||
if (GetBase()->GetTypeId() == TYPEID_PLAYER && passenger->ToCreature())
|
||||
passenger->ToCreature()->DespawnOrUnsummon();
|
||||
}
|
||||
// Following the above logic, this assertion should NEVER fail.
|
||||
// Even in 'hacky' cases, there should at least be VEHICLE_SPELL_RIDE_HARDCODED on us.
|
||||
SeatMap::const_iterator itr;
|
||||
for (itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
ASSERT(!itr->second.passenger);
|
||||
}
|
||||
|
||||
bool Vehicle::HasEmptySeat(int8 seatId) const
|
||||
@@ -264,16 +241,8 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ
|
||||
if (me->GetTypeId() == TYPEID_UNIT)
|
||||
{
|
||||
if (me->ToCreature()->IsInEvadeMode() && passenger->ToCreature()->IsAIEnabled)
|
||||
{
|
||||
passenger->ToCreature()->AI()->EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
else if (passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY) && passenger->ToTempSummon()->GetSummonType() == TEMPSUMMON_MANUAL_DESPAWN)
|
||||
{
|
||||
passenger->ExitVehicle();
|
||||
passenger->ToTempSummon()->DespawnOrUnsummon();
|
||||
ASSERT(!GetPassenger(seatId))
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -288,9 +257,16 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ
|
||||
|
||||
if (!me->HandleSpellClick(accessory, seatId))
|
||||
{
|
||||
sLog->outErrorDb("Vehicle entry %u in vehicle_accessory does not have a valid record in npc_spellclick_spells! Calling default EnterVehicle()",
|
||||
sLog->outErrorDb("Vehicle entry %u in vehicle_accessory does not have a valid record in npc_spellclick_spells! Cannot join vehicle.",
|
||||
m_creatureEntry);
|
||||
accessory->EnterVehicle(this, seatId);
|
||||
accessory->AddObjectToRemoveList();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!accessory->IsOnVehicle(me))
|
||||
{
|
||||
accessory->AddObjectToRemoveList();
|
||||
return; // Something went wrong in the spellsystem
|
||||
}
|
||||
|
||||
// This is not good, we have to send update twice
|
||||
@@ -489,7 +465,7 @@ void Vehicle::RelocatePassengers(float x, float y, float z, float ang)
|
||||
|
||||
void Vehicle::Dismiss()
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Dismiss %u", me->GetEntry());
|
||||
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Dismiss Entry: %u, GuidLow %u", m_creatureEntry, me->GetGUIDLow());
|
||||
Uninstall();
|
||||
me->DestroyForNearbyPlayers();
|
||||
me->CombatStop();
|
||||
|
||||
Reference in New Issue
Block a user