From cf7641cee02471237235414c86b97677cb7cc69d Mon Sep 17 00:00:00 2001 From: Sardelka Date: Tue, 5 Jul 2022 10:52:22 +0800 Subject: [PATCH] Change object list to array for CustomEvent --- RageCoop.Client/Networking/Receive.cs | 1 + RageCoop.Client/Scripting/API.cs | 18 +---- RageCoop.Client/Scripting/BaseScript.cs | 2 +- RageCoop.Core/Packets/CustomEvent.cs | 39 +++++------ RageCoop.Server/Client.cs | 37 ++--------- RageCoop.Server/Scripting/API.cs | 65 ++++--------------- .../Scripting/EventArgs/EventArgs.cs | 2 +- 7 files changed, 41 insertions(+), 123 deletions(-) diff --git a/RageCoop.Client/Networking/Receive.cs b/RageCoop.Client/Networking/Receive.cs index df14404..80b3bfa 100644 --- a/RageCoop.Client/Networking/Receive.cs +++ b/RageCoop.Client/Networking/Receive.cs @@ -267,6 +267,7 @@ namespace RageCoop.Client { Packets.CustomEvent packet = new Packets.CustomEvent(_resolveHandle); packet.Unpack(data); + Main.Logger.Debug(packet.Args.DumpWithType()); Scripting.API.Events.InvokeCustomEventReceived(packet); } break; diff --git a/RageCoop.Client/Scripting/API.cs b/RageCoop.Client/Scripting/API.cs index 0fb57e9..8c0ac27 100644 --- a/RageCoop.Client/Scripting/API.cs +++ b/RageCoop.Client/Scripting/API.cs @@ -19,7 +19,7 @@ namespace RageCoop.Client.Scripting /// /// Supported types: byte, short, ushort, int, uint, long, ulong, float, bool, string, Vector3, Quaternion /// - public List Args { get; set; } + public object[] Args { get; set; } } /// /// Provides vital functionality to interact with RAGECOOP @@ -241,7 +241,7 @@ namespace RageCoop.Client.Scripting /// /// An unique identifier of the event /// The objects conataing your data, see for a list of supported types - public static void SendCustomEvent(int eventHash, List args) + public static void SendCustomEvent(int eventHash, params object[] args) { var p = new Packets.CustomEvent() { @@ -250,20 +250,6 @@ namespace RageCoop.Client.Scripting }; Networking.Send(p, ConnectionChannel.Event, Lidgren.Network.NetDeliveryMethod.ReliableOrdered); } - /// - /// Send an event and data to the server. - /// - /// - /// - public static void SendCustomEvent(int eventHash,params object[] args) - { - var p = new Packets.CustomEvent() - { - Args=new List(args), - Hash=eventHash - }; - Networking.Send(p, ConnectionChannel.Event, Lidgren.Network.NetDeliveryMethod.ReliableOrdered); - } /// /// Register an handler to the specifed event hash, one event can have multiple handlers. This will be invoked from backgound thread, use in the handler to dispatch code to script thread. diff --git a/RageCoop.Client/Scripting/BaseScript.cs b/RageCoop.Client/Scripting/BaseScript.cs index 57d0b9e..f0f0490 100644 --- a/RageCoop.Client/Scripting/BaseScript.cs +++ b/RageCoop.Client/Scripting/BaseScript.cs @@ -168,7 +168,7 @@ namespace RageCoop.Client.Scripting TypeCode returnType=(TypeCode)ty; i = returnType==TypeCode.Empty ? 1 : 2; var hash = (Hash)e.Args[i++]; - for(; i _resolve { get; set; } public int Hash { get; set; } - public List Args { get; set; } + public bool IsStaged { get; set; }=false; + public object[] Args { get; set; } public override void Pack(NetOutgoingMessage message) { - Args= Args ?? new List(0); + Args= Args ?? new object[] { }; message.Write((byte)PacketType.CustomEvent); List result = new List(); result.AddInt(Hash); - result.AddInt(Args.Count); + result.AddInt(Args.Length); (byte, byte[]) tup; foreach (var arg in Args) { @@ -47,40 +48,40 @@ namespace RageCoop.Core Hash = reader.ReadInt(); var len=reader.ReadInt(); - Args=new List(len); + Args=new object[len]; for (int i = 0; i < len; i++) { byte type = reader.ReadByte(); switch (type) { case 0x01: - Args.Add(reader.ReadByte()); break; + Args[i]=reader.ReadByte(); break; case 0x02: - Args.Add(reader.ReadShort()); break; + Args[i]=reader.ReadShort(); break; case 0x03: - Args.Add(reader.ReadUShort()); break; + Args[i]=reader.ReadUShort(); break; case 0x04: - Args.Add(reader.ReadInt()); break; + Args[i]=reader.ReadInt(); break; case 0x05: - Args.Add(reader.ReadUInt()); break; + Args[i]=reader.ReadUInt(); break; case 0x06: - Args.Add(reader.ReadLong()); break; + Args[i]=reader.ReadLong(); break; case 0x07: - Args.Add(reader.ReadULong()); break; + Args[i]=reader.ReadULong(); break; case 0x08: - Args.Add(reader.ReadFloat()); break; + Args[i]=reader.ReadFloat(); break; case 0x09: - Args.Add(reader.ReadBool()); break; + Args[i]=reader.ReadBool(); break; case 0x10: - Args.Add(reader.ReadString()); break; + Args[i]=reader.ReadString(); break; case 0x11: - Args.Add(reader.ReadVector3()); break; + Args[i]=reader.ReadVector3(); break; case 0x12: - Args.Add(reader.ReadQuaternion()); break; + Args[i]=reader.ReadQuaternion(); break; case 0x13: - Args.Add((GTA.Model)reader.ReadInt()); break; + Args[i]=(GTA.Model)reader.ReadInt(); break; case 0x14: - Args.Add(reader.ReadVector2()); break; + Args[i]=reader.ReadVector2(); break; default: if (_resolve==null) { @@ -88,7 +89,7 @@ namespace RageCoop.Core } else { - Args.Add(_resolve(type, reader)); break; + Args[i]=_resolve(type, reader); break; } } } diff --git a/RageCoop.Server/Client.cs b/RageCoop.Server/Client.cs index bc338d9..918dbb8 100644 --- a/RageCoop.Server/Client.cs +++ b/RageCoop.Server/Client.cs @@ -159,7 +159,7 @@ namespace RageCoop.Server var argsList= new List(args); argsList.InsertRange(0, new object[] { (byte)Type.GetTypeCode(typeof(T)), RequestNativeCallID(callBack), (ulong)hash }); - SendCustomEvent(CustomEvents.NativeCall, argsList); + SendCustomEvent(CustomEvents.NativeCall, argsList.ToArray()); } /// /// Send a native call to client and ignore it's response. @@ -169,9 +169,9 @@ namespace RageCoop.Server public void SendNativeCall(GTA.Native.Hash hash, params object[] args) { var argsList = new List(args); - argsList.InsertRange(0, new object[] { (byte)TypeCode.Empty,(ulong)hash}); + argsList.InsertRange(0, new object[] { (byte)TypeCode.Empty,(ulong)hash }); // Server.Logger?.Debug(argsList.DumpWithType()); - SendCustomEvent(CustomEvents.NativeCall, argsList); + SendCustomEvent(CustomEvents.NativeCall, argsList.ToArray()); } private int RequestNativeCallID(Action callback) { @@ -197,7 +197,7 @@ namespace RageCoop.Server /// /// An unique identifier of the event, you can use to get it from a string /// Arguments - public void SendCustomEvent(int hash,List args) + public void SendCustomEvent(int hash,params object[] args) { if (!IsReady) { @@ -221,35 +221,6 @@ namespace RageCoop.Server Server.Logger?.Error(ex); } } - /// - /// Trigger a CustomEvent for this client - /// - /// An unique identifier of the event, you can use to get it from a string - /// Arguments - public void SendCustomEvent(int hash,params object[] args) - { - if (!IsReady) - { - Server.Logger?.Warning($"Player \"{Username}\" is not ready!"); - } - - try - { - - NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage(); - new Packets.CustomEvent() - { - Hash=hash, - Args=new(args) - }.Pack(outgoingMessage); - Server.MainNetServer.SendMessage(outgoingMessage, Connection, NetDeliveryMethod.ReliableOrdered, (byte)ConnectionChannel.Event); - - } - catch (Exception ex) - { - Server.Logger?.Error(ex); - } - } #endregion } diff --git a/RageCoop.Server/Scripting/API.cs b/RageCoop.Server/Scripting/API.cs index 5e25c81..a404502 100644 --- a/RageCoop.Server/Scripting/API.cs +++ b/RageCoop.Server/Scripting/API.cs @@ -245,38 +245,6 @@ namespace RageCoop.Server.Scripting (ctx) => { method.Invoke(obj, new object[] { ctx }); }); } } - /// - /// Send an event and data to the specified clients. Use if you want to send event to individual client. - /// - /// The name of the event, will be hashed to an int. For optimal performence, you should hash it in a static contructor inside the shared library, then call . - /// See for a list of supported types. - /// The target clients to send. Leave it null to send to all clients - public void SendCustomEvent(List targets, string name, List args = null) - { - targets ??= new(Server.Clients.Values); - var p = new Packets.CustomEvent() - { - Args=args, - Hash=CustomEvents.Hash(name) - }; - foreach (var c in targets) - { - Server.Send(p, c, ConnectionChannel.Event, NetDeliveryMethod.ReliableOrdered); - } - } - - /// - /// Send native call specified clients. - /// - /// - /// - /// /// Clients to send, null for all clients - public void SendNativeCall(List clients, GTA.Native.Hash hash, List args) - { - var argsList = new List(args); - argsList.InsertRange(0, new object[] { (byte)TypeCode.Empty, (ulong)hash }); - SendCustomEvent(clients, CustomEvents.NativeCall, argsList); - } /// /// Send native call specified clients. @@ -288,28 +256,9 @@ namespace RageCoop.Server.Scripting { var argsList = new List(args); argsList.InsertRange(0, new object[] { (byte)TypeCode.Empty, (ulong)hash }); - SendCustomEvent(clients, CustomEvents.NativeCall, argsList); + SendCustomEvent(clients, CustomEvents.NativeCall, argsList.ToArray()); } - /// - /// Send an event and data to the specified clients. Use if you want to send event to individual client. - /// - /// An unique identifier of the event, you can use to get it from a string - /// The objects conataing your data, see for supported types. - /// The target clients to send. Leave it null to send to all clients - public void SendCustomEvent(List targets , int eventHash, List args=null) - { - targets ??= new(Server.Clients.Values); - var p = new Packets.CustomEvent() - { - Args=args, - Hash=eventHash - }; - foreach(var c in targets) - { - Server.Send(p,c,ConnectionChannel.Event,NetDeliveryMethod.ReliableOrdered); - } - } /// /// Send an event and data to the specified clients. Use if you want to send event to individual client. @@ -319,7 +268,17 @@ namespace RageCoop.Server.Scripting /// The target clients to send. Leave it null to send to all clients public void SendCustomEvent(List targets, int eventHash, params object[] args) { - SendCustomEvent(targets, eventHash,new List(args)); + + targets ??= new(Server.Clients.Values); + var p = new Packets.CustomEvent() + { + Args=args, + Hash=eventHash + }; + foreach (var c in targets) + { + Server.Send(p, c, ConnectionChannel.Event, NetDeliveryMethod.ReliableOrdered); + } } /// /// Register an handler to the specifed event hash, one event can have multiple handlers. diff --git a/RageCoop.Server/Scripting/EventArgs/EventArgs.cs b/RageCoop.Server/Scripting/EventArgs/EventArgs.cs index 92fb95a..31cdd92 100644 --- a/RageCoop.Server/Scripting/EventArgs/EventArgs.cs +++ b/RageCoop.Server/Scripting/EventArgs/EventArgs.cs @@ -39,7 +39,7 @@ namespace RageCoop.Server.Scripting /// /// Supported types: byte, short, ushort, int, uint, long, ulong, float, bool, string, Vector3, Quaternion, Vector2 /// - public List Args { get; set; } + public object[] Args { get; set; } } /// ///