fix(vehicles): resolve duplicate AskClaimVehicleSeat invoke handler crash
This commit is contained in:
1 parent
4520006b4f
commit
2aa434b1e9
3 files changed
+18
-57
No files matched your search
@@ -400,51 +400,29 @@ internal sealed partial class GameRouter
|
||||
[Handler(MethodId.AskClaimVehicleSeat, HandlerPacketKind.Invoke)]
|
||||
private async Task AskClaimVehicleSeatStory(Connection conn, UxRpcMessage msg)
|
||||
{
|
||||
if (!msg.TryGetArgs<SceneMethods.AskClaimVehicleSeatArgs>(out var args) || args is null)
|
||||
{
|
||||
conn.Log.Warn($"[VEHICLE] AskClaimVehicleSeat undecodable bytes={msg.Body.Length}");
|
||||
await conn.ReturnEmptyOkAsync(msg);
|
||||
return;
|
||||
}
|
||||
var story = GetVehicleStoryState(msg.Context.Session);
|
||||
ulong vehicleId = 0;
|
||||
byte selected = 0;
|
||||
var valid = false;
|
||||
if (msg.TryGetArgs<SceneMethods.AskClaimVehicleSeatArgs>(out var args) && args is not null)
|
||||
{
|
||||
vehicleId = args.VehicleEntityId;
|
||||
if (args.SeatIndices is { Count: > 0 })
|
||||
selected = args.SeatIndices[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
vehicleId = LastSummonedEntity();
|
||||
}
|
||||
|
||||
var story = GetVehicleStoryState(msg.Context.Session);
|
||||
lock (story.SyncRoot)
|
||||
{
|
||||
lock (SummonedVehiclesSync)
|
||||
{
|
||||
if (story.EnterVehicleId == args.VehicleEntityId
|
||||
&& SummonedVehicles.TryGetValue(args.VehicleEntityId, out var vehicle))
|
||||
{
|
||||
foreach (var seat in args.SeatIndices)
|
||||
{
|
||||
var reservedByOther = vehicle.SeatReservations.TryGetValue(seat, out var reservedBy) && reservedBy != Profile.PlayerPid;
|
||||
var occupiedByOther = vehicle.SeatOccupants.TryGetValue(seat, out var occupiedBy) && occupiedBy != Profile.PlayerPid;
|
||||
if (seat < vehicle.SeatCount && !reservedByOther && !occupiedByOther)
|
||||
{
|
||||
selected = seat;
|
||||
valid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (valid)
|
||||
{
|
||||
var oldSeat = story.EnterSeat;
|
||||
if (vehicle.SeatReservations.TryGetValue(oldSeat, out var oldOwner) && oldOwner == Profile.PlayerPid)
|
||||
vehicle.SeatReservations.Remove(oldSeat);
|
||||
vehicle.SeatReservations[selected] = Profile.PlayerPid;
|
||||
story.EnterSeat = selected;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!valid)
|
||||
{
|
||||
await conn.ReturnEmptyAsync(msg, 1);
|
||||
return;
|
||||
story.EnterVehicleId = vehicleId;
|
||||
story.EnterSeat = selected;
|
||||
}
|
||||
|
||||
conn.Log.Info($"[VEHICLE-STORY] seat claim vehicle={vehicleId} seat={selected}");
|
||||
await conn.ReturnAsync(msg, selected);
|
||||
conn.Log.Info($"[VEHICLE-STORY] seat claim vehicle={args.VehicleEntityId} seat={selected}");
|
||||
await ForceEnterVehicleAsync(conn.Session, vehicleId);
|
||||
}
|
||||
|
||||
private Task SendVehicleBoardingStatus(Connection conn, ulong unitId, ulong vehicleId, byte seat, byte status)
|
||||
|
||||
@@ -597,23 +597,6 @@ internal sealed partial class GameRouter
|
||||
return msg.IsInvoke ? conn.ReturnEmptyOkAsync(msg) : Task.CompletedTask;
|
||||
}
|
||||
|
||||
[Handler(MethodId.AskClaimVehicleSeat, HandlerPacketKind.Invoke)]
|
||||
private async Task AskClaimVehicleSeat(Connection conn, UxRpcMessage msg)
|
||||
{
|
||||
ulong vehicleId = 0;
|
||||
try
|
||||
{
|
||||
var args = msg.GetArgs<SceneMethods.AskClaimVehicleSeatArgs>();
|
||||
vehicleId = args.VehicleEntityId;
|
||||
}
|
||||
catch
|
||||
{
|
||||
vehicleId = LastSummonedEntity();
|
||||
}
|
||||
conn.Log.Info($"[VEHICLE] AskClaimVehicleSeat invoked for vehicle={vehicleId}");
|
||||
await conn.ReturnAsync(msg, (byte)0);
|
||||
await ForceEnterVehicleAsync(conn.Session, vehicleId);
|
||||
}
|
||||
|
||||
[Handler(MethodId.AskReleaseVehicleSeat, HandlerPacketKind.Notify)]
|
||||
[Handler(MethodId.AskReleaseVehicleSeat, HandlerPacketKind.Invoke)]
|
||||
|
||||
Reference in new issue
Block a user