diff options
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.h | 2 |
2 files changed, 15 insertions, 3 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 37de19522f5..51a127fe34e 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -324,7 +324,7 @@ SeatMap::const_iterator Vehicle::GetNextEmptySeat(int8 seatId, bool next) const if (seat == Seats.end()) return seat; - while (!seat->second.IsEmpty() || (!seat->second.SeatInfo->CanEnterOrExit() && !seat->second.SeatInfo->IsUsableByOverride())) + while (!seat->second.IsEmpty() || HasPendingEventForSeat(seat->first) || (!seat->second.SeatInfo->CanEnterOrExit() && !seat->second.SeatInfo->IsUsableByOverride())) { if (next) { @@ -429,7 +429,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) if (seatId < 0) // no specific seat requirement { for (seat = Seats.begin(); seat != Seats.end(); ++seat) - if (seat->second.IsEmpty() && (seat->second.SeatInfo->CanEnterOrExit() || seat->second.SeatInfo->IsUsableByOverride())) + if (seat->second.IsEmpty() && !HasPendingEventForSeat(seat->first) && (seat->second.SeatInfo->CanEnterOrExit() || seat->second.SeatInfo->IsUsableByOverride())) break; if (seat == Seats.end()) // no available seat @@ -664,7 +664,7 @@ uint8 Vehicle::GetAvailableSeatCount() const uint8 ret = 0; SeatMap::const_iterator itr; for (itr = Seats.begin(); itr != Seats.end(); ++itr) - if (itr->second.IsEmpty() && (itr->second.SeatInfo->CanEnterOrExit() || itr->second.SeatInfo->IsUsableByOverride())) + if (itr->second.IsEmpty() && !HasPendingEventForSeat(itr->first) && (itr->second.SeatInfo->CanEnterOrExit() || itr->second.SeatInfo->IsUsableByOverride())) ++ret; return ret; @@ -906,3 +906,13 @@ void VehicleJoinEvent::Abort(uint64) if (Passenger->IsInWorld() && Passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY)) Passenger->ToCreature()->DespawnOrUnsummon(); } + +bool Vehicle::HasPendingEventForSeat(int8 seatId) const +{ + for (PendingJoinEventContainer::const_iterator itr = _pendingJoinEvents.begin(); itr != _pendingJoinEvents.end(); ++itr) + { + if ((*itr)->Seat->first == seatId) + return true; + } + return false; +} diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index a8bc9eb00b0..4797390e048 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -105,6 +105,8 @@ class TC_GAME_API Vehicle : public TransportBase void RemovePendingEvent(VehicleJoinEvent* e); void RemovePendingEventsForSeat(int8 seatId); + bool HasPendingEventForSeat(int8 seatId) const; + private: Unit* _me; ///< The underlying unit with the vehicle kit. Can be player or creature. VehicleEntry const* _vehicleInfo; ///< DBC data for vehicle |