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
Binary file not shown.
@@ -400,51 +400,29 @@ internal sealed partial class GameRouter
|
|||||||
[Handler(MethodId.AskClaimVehicleSeat, HandlerPacketKind.Invoke)]
|
[Handler(MethodId.AskClaimVehicleSeat, HandlerPacketKind.Invoke)]
|
||||||
private async Task AskClaimVehicleSeatStory(Connection conn, UxRpcMessage msg)
|
private async Task AskClaimVehicleSeatStory(Connection conn, UxRpcMessage msg)
|
||||||
{
|
{
|
||||||
if (!msg.TryGetArgs<SceneMethods.AskClaimVehicleSeatArgs>(out var args) || args is null)
|
ulong vehicleId = 0;
|
||||||
{
|
|
||||||
conn.Log.Warn($"[VEHICLE] AskClaimVehicleSeat undecodable bytes={msg.Body.Length}");
|
|
||||||
await conn.ReturnEmptyOkAsync(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var story = GetVehicleStoryState(msg.Context.Session);
|
|
||||||
byte selected = 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 (story.SyncRoot)
|
||||||
{
|
{
|
||||||
lock (SummonedVehiclesSync)
|
story.EnterVehicleId = vehicleId;
|
||||||
{
|
story.EnterSeat = selected;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conn.Log.Info($"[VEHICLE-STORY] seat claim vehicle={vehicleId} seat={selected}");
|
||||||
await conn.ReturnAsync(msg, 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)
|
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;
|
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.Notify)]
|
||||||
[Handler(MethodId.AskReleaseVehicleSeat, HandlerPacketKind.Invoke)]
|
[Handler(MethodId.AskReleaseVehicleSeat, HandlerPacketKind.Invoke)]
|
||||||
|
|||||||
Reference in new issue
Block a user