From a2fdd2eccf5d3d028e4a4d682e676bb8721899f0 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 7 Dec 2021 14:15:44 -0500 Subject: [PATCH] Core/Vehicles: Fix multiple vehicle join events on same seat Port From (https://github.com/TrinityCore/TrinityCore/commit/910e0b70ef463459e2e1b59976c9675394ff81c8) --- Source/Game/Entities/Vehicle.cs | 37 +++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/Source/Game/Entities/Vehicle.cs b/Source/Game/Entities/Vehicle.cs index be2e7e338..c7115ab61 100644 --- a/Source/Game/Entities/Vehicle.cs +++ b/Source/Game/Entities/Vehicle.cs @@ -228,12 +228,26 @@ namespace Game.Entities if (seat == null) return null; - foreach (var sea in Seats) + var newSeatId = seatId; + while (!seat.IsEmpty() || HasPendingEventForSeat(newSeatId) || (!seat.SeatInfo.CanEnterOrExit() && !seat.SeatInfo.IsUsableByOverride())) { - if (!seat.IsEmpty() || (!seat.SeatInfo.CanEnterOrExit() && !seat.SeatInfo.IsUsableByOverride())) - continue; + if (next) + { + if (!Seats.ContainsKey(++newSeatId)) + newSeatId = 0; + } + else + { + if (!Seats.ContainsKey(newSeatId)) + newSeatId = SharedConst.MaxVehicleSeats; + --newSeatId; + } - seat = sea.Value; + // Make sure we don't loop indefinetly + if (newSeatId == seatId) + return null; + + seat = Seats[newSeatId]; } return seat; @@ -291,7 +305,7 @@ namespace Game.Entities foreach (var _seat in Seats) { seat = _seat; - if (seat.Value.IsEmpty() && (_seat.Value.SeatInfo.CanEnterOrExit() || _seat.Value.SeatInfo.IsUsableByOverride())) + if (seat.Value.IsEmpty() && !HasPendingEventForSeat(seat.Key) && (_seat.Value.SeatInfo.CanEnterOrExit() || _seat.Value.SeatInfo.IsUsableByOverride())) break; } @@ -445,7 +459,7 @@ namespace Game.Entities { byte ret = 0; foreach (var pair in Seats) - if (pair.Value.IsEmpty() && (pair.Value.SeatInfo.CanEnterOrExit() || pair.Value.SeatInfo.IsUsableByOverride())) + if (pair.Value.IsEmpty() && !HasPendingEventForSeat(pair.Key) && (pair.Value.SeatInfo.CanEnterOrExit() || pair.Value.SeatInfo.IsUsableByOverride())) ++ret; return ret; @@ -503,6 +517,17 @@ namespace Game.Entities } } + bool HasPendingEventForSeat(sbyte seatId) + { + for (var i = 0; i < _pendingJoinEvents.Count; ++i) + { + var joinEvent = _pendingJoinEvents[i]; + if (joinEvent.Seat.Key == seatId) + return true; + } + return false; + } + public TimeSpan GetDespawnDelay() { VehicleTemplate vehicleTemplate = Global.ObjectMgr.GetVehicleTemplate(this);