Skip to content

Commit f1f4cac

Browse files
committed
fix(server): try async rpc handling
1 parent 37df391 commit f1f4cac

File tree

11 files changed

+108
-36
lines changed

11 files changed

+108
-36
lines changed

api/AltV.Net.Async/AsyncCore.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -968,17 +968,27 @@ public override void OnPlayerStopTalkingEvent(IPlayer player)
968968
});
969969
}
970970

971-
public override void OnScriptRPCEvent(IntPtr eventpointer, IPlayer target, string name, IntPtr[] args, ushort answerId)
971+
public override void OnScriptRPCEvent(IntPtr eventpointer, IPlayer target, string name, IntPtr[] args, ushort answerId, bool async)
972972
{
973-
base.OnScriptRPCEvent(eventpointer, target, name, args, answerId);
973+
if (!UnansweredServerRpcRequest.Contains(answerId))
974+
{
975+
UnansweredServerRpcRequest.Add(answerId);
976+
}
977+
base.OnScriptRPCEvent(eventpointer, target, name, args, answerId, true);
974978

975979
if (!ScriptRpcAsyncEventHandler.HasEvents()) return;
976980
Task.Run(async () =>
977981
{
978982
var mValues = MValueConst.CreateFrom(this, args);
979-
var clientScriptRPCEvent = new AsyncScriptRpcEvent(eventpointer);
983+
var clientScriptRPCEvent = new AsyncScriptRpcEvent(target, answerId);
980984
await ScriptRpcAsyncEventHandler.CallAsync(@delegate => @delegate(clientScriptRPCEvent, target, name, mValues.Select(x => x.ToObject()).ToArray(), answerId));
981985
});
986+
987+
if (UnansweredServerRpcRequest.Contains(answerId))
988+
{
989+
target.EmitRPCAnswer(answerId, null, "Answer not handled");
990+
UnansweredServerRpcRequest.Remove(answerId);
991+
}
982992
}
983993

984994
public override void OnScriptAnswerRPCEvent(IPlayer target, ushort answerid, IntPtr mValue, string answererror)
Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,36 @@
11
using System;
2-
using System.Runtime.InteropServices;
3-
using AltV.Net.Elements.Args;
2+
using AltV.Net.Elements.Entities;
43
using AltV.Net.Shared.Elements.Entities;
5-
using AltV.Net.Shared.Utils;
64

75
namespace AltV.Net.Async;
86

97
public class AsyncScriptRpcEvent : IScriptRPCEvent
108
{
11-
public AsyncScriptRpcEvent(IntPtr clientScriptRPCNativePointer)
9+
private readonly IPlayer _target;
10+
private readonly ushort _answerId;
11+
12+
public AsyncScriptRpcEvent(IPlayer target, ushort answerId)
1213
{
13-
ScriptRPCNativePointer = clientScriptRPCNativePointer;
14+
_target = target;
15+
_answerId = answerId;
1416
}
1517

1618
public IntPtr ScriptRPCNativePointer { get; }
1719

1820
public bool WillAnswer()
1921
{
20-
unsafe
21-
{
22-
return Alt.Core.Library.Shared.Event_ScriptRPCEvent_WillAnswer(ScriptRPCNativePointer) == 1;
23-
}
22+
return true;
2423
}
2524

2625
public bool Answer(object answer)
2726
{
28-
MValueConstLockedNoRefs.CreateFromObjectLocked(answer, out MValueConst mValue);
29-
bool result;
30-
unsafe
31-
{
32-
result = Alt.Core.Library.Shared.Event_ScriptRPCEvent_Answer(ScriptRPCNativePointer, mValue.nativePointer) == 1;
33-
}
34-
mValue.Dispose();
35-
36-
return result;
27+
_target.EmitRPCAnswer(_answerId, answer, "");
28+
return true;
3729
}
3830

3931
public bool AnswerWithError(string error)
4032
{
41-
var errorPtr = MemoryUtils.StringToHGlobalUtf8(error);
42-
43-
bool result;
44-
unsafe
45-
{
46-
result = Alt.Core.Library.Shared.Event_ScriptRPCEvent_AnswerWithError(ScriptRPCNativePointer, errorPtr) == 1;
47-
}
48-
Marshal.FreeHGlobal(errorPtr);
49-
50-
return result;
33+
_target.EmitRPCAnswer(_answerId, null, error);
34+
return true;
5135
}
5236
}

api/AltV.Net.Async/Elements/Entities/AsyncPlayer.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,11 @@ public void EmitRPCAnswer(ushort answerId, object answer, string error)
722722
mValue.Dispose();
723723

724724
Marshal.FreeHGlobal(errorPtr);
725+
726+
if (Core.UnansweredServerRpcRequest.Contains(answerId))
727+
{
728+
Core.UnansweredServerRpcRequest.Remove(answerId);
729+
}
725730
}
726731

727732
public void EmitUnreliable(string eventName, params object[] args)

api/AltV.Net.Client/Core.Events.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -705,9 +705,19 @@ public void OnScriptRPCAnswer(ushort answerid, IntPtr answer, string answerError
705705

706706
public void OnScriptRPC(IntPtr eventpointer, string name, IntPtr[] args, ushort answerid)
707707
{
708+
if (!UnansweredClientRpcRequest.Contains(answerid))
709+
{
710+
UnansweredClientRpcRequest.Add(answerid);
711+
}
708712
var mValues = MValueConst.CreateFrom(this, args);
709-
var clientScriptRPCEvent = new ScriptRpcEvent(this, eventpointer);
713+
var clientScriptRPCEvent = new ScriptRpcEvent(this, eventpointer, answerid, true);
710714
ScriptRPCHandler.GetEvents().ForEachCatching(fn => fn(clientScriptRPCEvent, name, mValues.Select(x => x.ToObject()).ToArray(), answerid), $"event {nameof(OnScriptRPC)}");
715+
716+
if (UnansweredClientRpcRequest.Contains(answerid))
717+
{
718+
clientScriptRPCEvent.AnswerWithError("Answer not handled");
719+
UnansweredClientRpcRequest.Remove(answerid);
720+
}
711721
}
712722
}
713723
}

api/AltV.Net.Client/Core.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,11 @@ public void TriggerServerRPCAnswer(ushort answerId, MValueConst answer, string e
828828
Library.Client.Core_TriggerServerRPCAnswer(NativePointer, answerId, answer.nativePointer, errorPtr);
829829
Marshal.FreeHGlobal(errorPtr);
830830
}
831+
832+
if (UnansweredClientRpcRequest.Contains(answerId))
833+
{
834+
UnansweredClientRpcRequest.Remove(answerId);
835+
}
831836
}
832837

833838
[MethodImpl(MethodImplOptions.AggressiveInlining)]

api/AltV.Net.Mock/MockCore.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ namespace AltV.Net.Mock
1717
{
1818
public class MockCore : ICore
1919
{
20+
public IList<ushort> UnansweredServerRpcRequest { get; }
21+
public IList<ushort> UnansweredClientRpcRequest { get; }
2022
ISharedPoolManager ISharedCore.PoolManager => PoolManager;
2123
public Dictionary<IntPtr, List<InternalPlayerSeat>> VehiclePassengers { get; }
2224
public IPoolManager PoolManager { get; }

api/AltV.Net.Shared/Elements/Entities/ScriptRpcEvent.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ namespace AltV.Net.Shared.Elements.Entities;
66

77
public class ScriptRpcEvent : IScriptRPCEvent
88
{
9-
public ScriptRpcEvent(ISharedCore core, IntPtr clientScriptRPCNativePointer)
9+
private readonly ushort _answerId;
10+
private readonly bool _clientSide;
11+
12+
public ScriptRpcEvent(ISharedCore core, IntPtr clientScriptRPCNativePointer, ushort answerId, bool clientSide)
1013
{
14+
_answerId = answerId;
15+
_clientSide = clientSide;
1116
ScriptRPCNativePointer = clientScriptRPCNativePointer;
1217
Core = core;
1318
}
@@ -33,6 +38,21 @@ public bool Answer(object answer)
3338
}
3439
mValue.Dispose();
3540

41+
if (_clientSide)
42+
{
43+
if (Core.UnansweredClientRpcRequest.Contains(_answerId))
44+
{
45+
Core.UnansweredClientRpcRequest.Remove(_answerId);
46+
}
47+
}
48+
else
49+
{
50+
if (Core.UnansweredServerRpcRequest.Contains(_answerId))
51+
{
52+
Core.UnansweredServerRpcRequest.Remove(_answerId);
53+
}
54+
}
55+
3656
return result;
3757
}
3858

@@ -47,6 +67,21 @@ public bool AnswerWithError(string error)
4767
}
4868
Marshal.FreeHGlobal(errorPtr);
4969

70+
if (_clientSide)
71+
{
72+
if (Core.UnansweredClientRpcRequest.Contains(_answerId))
73+
{
74+
Core.UnansweredClientRpcRequest.Remove(_answerId);
75+
}
76+
}
77+
else
78+
{
79+
if (Core.UnansweredServerRpcRequest.Contains(_answerId))
80+
{
81+
Core.UnansweredServerRpcRequest.Remove(_answerId);
82+
}
83+
}
84+
5085
return result;
5186
}
5287
}

api/AltV.Net.Shared/ISharedCore.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ namespace AltV.Net.Shared
1010
{
1111
public interface ISharedCore : ICApiCore
1212
{
13+
IList<ushort> UnansweredServerRpcRequest { get; }
14+
IList<ushort> UnansweredClientRpcRequest { get; }
1315
ISharedPoolManager PoolManager { get; }
1416
EventStateManager EventStateManager { get; }
1517

api/AltV.Net.Shared/SharedCore.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,13 @@ public SharedCore(IntPtr nativePointer, ILibrary library)
2929
Library = library;
3030
MainThread = Thread.CurrentThread;
3131
EventStateManager = new EventStateManager(this);
32+
UnansweredServerRpcRequest = new List<ushort>();
33+
UnansweredClientRpcRequest = new List<ushort>();
3234
}
3335

3436
public abstract ISharedNativeResource Resource { get; }
37+
public IList<ushort> UnansweredServerRpcRequest { get; }
38+
public IList<ushort> UnansweredClientRpcRequest { get; }
3539
public abstract ISharedPoolManager PoolManager { get; }
3640
public EventStateManager EventStateManager { get; }
3741

api/AltV.Net/Core.Events.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2648,13 +2648,17 @@ public void OnScriptRPC(IntPtr eventpointer, IntPtr targetpointer, string name,
26482648
Marshal.Copy(pointer, args, 0, (int) size);
26492649
}
26502650

2651-
OnScriptRPCEvent(eventpointer, target, name, args, answerId);
2651+
OnScriptRPCEvent(eventpointer, target, name, args, answerId, false);
26522652
}
26532653

2654-
public virtual void OnScriptRPCEvent(IntPtr eventpointer, IPlayer target, string name, IntPtr[] args, ushort answerId)
2654+
public virtual void OnScriptRPCEvent(IntPtr eventpointer, IPlayer target, string name, IntPtr[] args, ushort answerId, bool async)
26552655
{
2656+
if (!UnansweredServerRpcRequest.Contains(answerId))
2657+
{
2658+
UnansweredServerRpcRequest.Add(answerId);
2659+
}
26562660
var mValues = MValueConst.CreateFrom(this, args);
2657-
var clientScriptRPCEvent = new ScriptRpcEvent(this, eventpointer);
2661+
var clientScriptRPCEvent = new ScriptRpcEvent(this, eventpointer, answerId, false);
26582662
foreach (var @delegate in ScriptRpcHandler.GetEvents())
26592663
{
26602664
try
@@ -2670,6 +2674,12 @@ public virtual void OnScriptRPCEvent(IntPtr eventpointer, IPlayer target, string
26702674
Alt.Log("exception at event:" + "OnScriptRPCEvent" + ":" + exception);
26712675
}
26722676
}
2677+
2678+
if (!async && UnansweredServerRpcRequest.Contains(answerId))
2679+
{
2680+
clientScriptRPCEvent.AnswerWithError("Answer not handled");
2681+
UnansweredServerRpcRequest.Remove(answerId);
2682+
}
26732683
}
26742684

26752685
public void OnScriptAnswerRPC(IntPtr targetpointer, ushort answerid, IntPtr answer, string answererror)

0 commit comments

Comments
 (0)