diff --git a/Ananta.Proxy/proxy/public/fastpatch_4229938.zip b/Ananta.Proxy/proxy/public/fastpatch_4229938.zip index a306820..77e61bc 100644 Binary files a/Ananta.Proxy/proxy/public/fastpatch_4229938.zip and b/Ananta.Proxy/proxy/public/fastpatch_4229938.zip differ diff --git a/Ananta.Server/Ananta.Handlers/Game/GameRouter.VehicleStory.cs b/Ananta.Server/Ananta.Handlers/Game/GameRouter.VehicleStory.cs index e33ec18..f72a2e4 100644 --- a/Ananta.Server/Ananta.Handlers/Game/GameRouter.VehicleStory.cs +++ b/Ananta.Server/Ananta.Handlers/Game/GameRouter.VehicleStory.cs @@ -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(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(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)]