Core/Vehicles: Fix multiple vehicle join events on same seat

Port From (https://github.com/TrinityCore/TrinityCore/commit/910e0b70ef463459e2e1b59976c9675394ff81c8)
This commit is contained in:
hondacrx
2021-12-07 14:15:44 -05:00
parent 2ded315eaa
commit a2fdd2eccf
+31 -6
View File
@@ -228,12 +228,26 @@ namespace Game.Entities
if (seat == null) if (seat == null)
return 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())) if (next)
continue; {
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; return seat;
@@ -291,7 +305,7 @@ namespace Game.Entities
foreach (var _seat in Seats) foreach (var _seat in Seats)
{ {
seat = _seat; 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; break;
} }
@@ -445,7 +459,7 @@ namespace Game.Entities
{ {
byte ret = 0; byte ret = 0;
foreach (var pair in Seats) 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; ++ret;
return 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() public TimeSpan GetDespawnDelay()
{ {
VehicleTemplate vehicleTemplate = Global.ObjectMgr.GetVehicleTemplate(this); VehicleTemplate vehicleTemplate = Global.ObjectMgr.GetVehicleTemplate(this);