mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 08:55:32 +01:00
Core/Vehicles: Store guids in vehicleseat structures instead of pointers. Fixes a crash with vendor-carrying Mammoth mounts.
This commit is contained in:
@@ -131,7 +131,7 @@ void Vehicle::Uninstall()
|
||||
{
|
||||
sLog->outDebug("Vehicle::Uninstall %u", me->GetEntry());
|
||||
for (SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (Unit *passenger = itr->second.passenger)
|
||||
if (Unit *passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
|
||||
if (passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
|
||||
passenger->ToTempSummon()->UnSummon();
|
||||
|
||||
@@ -145,7 +145,7 @@ void Vehicle::Die()
|
||||
{
|
||||
sLog->outDebug("Vehicle::Die %u", me->GetEntry());
|
||||
for (SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (Unit *passenger = itr->second.passenger)
|
||||
if (Unit *passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
|
||||
if (passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
|
||||
passenger->setDeathState(JUST_DIED);
|
||||
|
||||
@@ -178,17 +178,23 @@ void Vehicle::RemoveAllPassengers()
|
||||
{
|
||||
sLog->outDebug("Vehicle::RemoveAllPassengers");
|
||||
for (SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (Unit *passenger = itr->second.passenger)
|
||||
if (Unit *passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
|
||||
{
|
||||
ASSERT(passenger->IsInWorld());
|
||||
ASSERT(passenger->IsOnVehicle(GetBase()));
|
||||
ASSERT(GetSeatForPassenger(passenger));
|
||||
|
||||
if (passenger->IsVehicle())
|
||||
passenger->GetVehicleKit()->RemoveAllPassengers();
|
||||
|
||||
if (passenger->GetVehicle() != this)
|
||||
sLog->outCrash("Vehicle %u has invalid passenger %u.", me->GetEntry(), passenger->GetEntry());
|
||||
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. %u is still on vehicle.", me->GetEntry(), passenger->GetEntry(), itr->second.passenger->GetEntry());
|
||||
itr->second.passenger = NULL;
|
||||
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
|
||||
@@ -210,7 +216,8 @@ Unit *Vehicle::GetPassenger(int8 seatId) const
|
||||
SeatMap::const_iterator seat = m_Seats.find(seatId);
|
||||
if (seat == m_Seats.end())
|
||||
return NULL;
|
||||
return seat->second.passenger;
|
||||
|
||||
return ObjectAccessor::GetUnit(*GetBase(), seat->second.passenger);
|
||||
}
|
||||
|
||||
int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next, bool byAura) const
|
||||
@@ -280,7 +287,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId, bool byAura)
|
||||
if (seatId < 0) // no specific seat requirement
|
||||
{
|
||||
for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat)
|
||||
if (!seat->second.passenger && ((!(byAura && seat->second.seatInfo->CanEnterOrExit()) || (byAura && seat->second.seatInfo->IsUsableByAura()))))
|
||||
if (!seat->second.passenger && (!(byAura && seat->second.seatInfo->CanEnterOrExit()) || (byAura && seat->second.seatInfo->IsUsableByAura())))
|
||||
break;
|
||||
|
||||
if (seat == m_Seats.end()) // no available seat
|
||||
@@ -293,14 +300,17 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId, bool byAura)
|
||||
return false;
|
||||
|
||||
if (seat->second.passenger)
|
||||
seat->second.passenger->ExitVehicle();
|
||||
if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.passenger))
|
||||
passenger->ExitVehicle();
|
||||
else
|
||||
seat->second.passenger = 0;
|
||||
|
||||
ASSERT(!seat->second.passenger);
|
||||
}
|
||||
|
||||
sLog->outDebug("Unit %s enter vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32)seat->first);
|
||||
|
||||
seat->second.passenger = unit;
|
||||
seat->second.passenger = unit->GetGUID();
|
||||
if (seat->second.seatInfo->CanEnterOrExit())
|
||||
{
|
||||
ASSERT(m_usableSeatNum);
|
||||
@@ -374,16 +384,12 @@ void Vehicle::RemovePassenger(Unit *unit)
|
||||
if (unit->GetVehicle() != this)
|
||||
return;
|
||||
|
||||
SeatMap::iterator seat;
|
||||
for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat)
|
||||
if (seat->second.passenger == unit)
|
||||
break;
|
||||
|
||||
SeatMap::iterator seat = GetSeatIteratorForPassenger(unit);
|
||||
ASSERT(seat != m_Seats.end());
|
||||
|
||||
sLog->outDebug("Unit %s exit vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32)seat->first);
|
||||
|
||||
seat->second.passenger = NULL;
|
||||
seat->second.passenger = 0;
|
||||
if (seat->second.seatInfo->CanEnterOrExit())
|
||||
{
|
||||
if (!m_usableSeatNum)
|
||||
@@ -430,9 +436,11 @@ void Vehicle::RelocatePassengers(float x, float y, float z, float ang)
|
||||
|
||||
// not sure that absolute position calculation is correct, it must depend on vehicle orientation and pitch angle
|
||||
for (SeatMap::const_iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (Unit *passenger = itr->second.passenger)
|
||||
if (Unit *passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger))
|
||||
{
|
||||
ASSERT(passenger->IsInWorld());
|
||||
ASSERT(passenger->IsOnVehicle(GetBase()));
|
||||
ASSERT(GetSeatForPassenger(passenger));
|
||||
|
||||
float px = x + passenger->m_movementInfo.t_pos.m_positionX;
|
||||
float py = y + passenger->m_movementInfo.t_pos.m_positionY;
|
||||
@@ -476,8 +484,18 @@ VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit* passenger)
|
||||
{
|
||||
SeatMap::iterator itr;
|
||||
for (itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (itr->second.passenger = passenger)
|
||||
if (itr->second.passenger == passenger->GetGUID())
|
||||
return itr->second.seatInfo;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SeatMap::iterator Vehicle::GetSeatIteratorForPassenger(Unit* passenger)
|
||||
{
|
||||
SeatMap::iterator itr;
|
||||
for (itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
|
||||
if (itr->second.passenger == passenger->GetGUID())
|
||||
return itr;
|
||||
|
||||
return m_Seats.end();
|
||||
}
|
||||
@@ -80,7 +80,7 @@ struct VehicleSeat
|
||||
{
|
||||
explicit VehicleSeat(VehicleSeatEntry const *_seatInfo) : seatInfo(_seatInfo), passenger(NULL) {}
|
||||
VehicleSeatEntry const *seatInfo;
|
||||
Unit* passenger;
|
||||
uint64 passenger;
|
||||
};
|
||||
|
||||
struct VehicleAccessory
|
||||
@@ -139,6 +139,9 @@ class Vehicle
|
||||
uint16 GetExtraMovementFlagsForBase() const;
|
||||
VehicleSeatEntry const* GetSeatForPassenger(Unit* passenger);
|
||||
|
||||
private:
|
||||
SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger);
|
||||
|
||||
protected:
|
||||
Unit *me;
|
||||
VehicleEntry const *m_vehicleInfo;
|
||||
|
||||
@@ -655,10 +655,13 @@ void WorldSession::HandleEjectPassenger(WorldPacket &data)
|
||||
if (Unit *unit = ObjectAccessor::GetUnit(*_player, guid)) // creatures can be ejected too from player mounts
|
||||
{
|
||||
VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(unit);
|
||||
ASSERT(seat);
|
||||
if (seat->IsEjectable())
|
||||
{
|
||||
ASSERT(GetPlayer() == vehicle->GetBase());
|
||||
unit->ExitVehicle();
|
||||
unit->ToCreature()->ForcedDespawn(1000);
|
||||
ASSERT(!unit->IsOnVehicle(vehicle->GetBase()));
|
||||
}
|
||||
else
|
||||
sLog->outError("Player %u attempted to eject creature GUID "UI64FMTD" from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
|
||||
|
||||
Reference in New Issue
Block a user