From 2aa434b1e95677cc8d2636358f18a76a79ba5274 Mon Sep 17 00:00:00 2001 From: CAtlas0784 Date: Wed, 16 Sep 2026 02:48:29 +0700 Subject: [PATCH] fix(vehicles): resolve duplicate AskClaimVehicleSeat invoke handler crash --- .../proxy/public/fastpatch_4229938.zip | Bin 5527 -> 5521 bytes .../Game/GameRouter.VehicleStory.cs | 58 ++++++------------ .../Game/GameRouter.Vehicles.cs | 17 ----- 3 files changed, 18 insertions(+), 57 deletions(-) diff --git a/Ananta.Proxy/proxy/public/fastpatch_4229938.zip b/Ananta.Proxy/proxy/public/fastpatch_4229938.zip index a306820907d3b0e9ebaa8c3d72dd4d757ff7fa35..77e61bc1e48be32f122a4b5453758f7413a8b4a7 100644 GIT binary patch delta 5263 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 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(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) diff --git a/Ananta.Server/Ananta.Handlers/Game/GameRouter.Vehicles.cs b/Ananta.Server/Ananta.Handlers/Game/GameRouter.Vehicles.cs index cdf3521..f0fd047 100644 --- a/Ananta.Server/Ananta.Handlers/Game/GameRouter.Vehicles.cs +++ b/Ananta.Server/Ananta.Handlers/Game/GameRouter.Vehicles.cs @@ -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(); - 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)]