diff options
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.cpp | 54 | ||||
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.h | 5 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/MovementHandler.cpp | 3 |
3 files changed, 43 insertions, 19 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 6e4d49f65ef..10ba0e66ff8 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -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(); }
\ No newline at end of file diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index a536df991ae..c2d476a878c 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -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; diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp index 675286e538f..639be0110eb 100755 --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp @@ -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)); |