public void TriggerEvent(string eventName, byte[] argsSerialized, string sourceString) { try { var obj = MsgPackDeserializer.Deserialize(argsSerialized, netSource: (sourceString.StartsWith("net") ? sourceString : null)) as List <object> ?? (IEnumerable <object>) new object[0]; var scripts = ms_definedScripts.ToArray(); var objArray = obj.ToArray(); NetworkFunctionManager.HandleEventTrigger(eventName, objArray, sourceString); foreach (var script in scripts) { Task.Factory.StartNew(() => script.EventHandlers.Invoke(eventName, sourceString, objArray)).Unwrap().ContinueWith(a => { if (a.IsFaulted) { Debug.WriteLine($"Error invoking event handlers for {eventName}: {a.Exception?.InnerExceptions.Aggregate("", (b, s) => s + b.ToString() + "\n")}"); } }); } ExportDictionary.Invoke(eventName, objArray); // invoke a single task tick CitizenTaskScheduler.Instance.Tick(); } catch (Exception e) { Debug.WriteLine(e.ToString()); } }
public void TriggerEvent(string eventName, byte[] argsSerialized, string sourceString) { if (GameInterface.SnapshotStackBoundary(out var bo)) { ScriptHost.SubmitBoundaryStart(bo, bo.Length); } try { #if IS_FXSERVER var netSource = (sourceString.StartsWith("net") || sourceString.StartsWith("internal-net")) ? sourceString : null; #else var netSource = sourceString.StartsWith("net") ? sourceString : null; #endif var obj = MsgPackDeserializer.Deserialize(argsSerialized, netSource) as List <object> ?? (IEnumerable <object>) new object[0]; var scripts = ms_definedScripts.ToArray(); var objArray = obj.ToArray(); NetworkFunctionManager.HandleEventTrigger(eventName, objArray, sourceString); foreach (var script in scripts) { Task.Factory.StartNew(() => { BaseScript.CurrentName = $"eventHandler {script.GetType().Name} -> {eventName}"; var t = script.EventHandlers.Invoke(eventName, sourceString, objArray); BaseScript.CurrentName = null; return(t); }, CancellationToken.None, TaskCreationOptions.None, CitizenTaskScheduler.Instance).Unwrap().ContinueWith(a => { if (a.IsFaulted) { Debug.WriteLine($"Error invoking event handlers for {eventName}: {a.Exception?.InnerExceptions.Aggregate("", (b, s) => s + b.ToString() + "\n")}"); } }); } ExportDictionary.Invoke(eventName, objArray); // invoke a single task tick CitizenTaskScheduler.Instance.Tick(); } catch (Exception e) { PrintError($"event ({eventName})", e); } finally { ScriptHost.SubmitBoundaryStart(null, 0); } }
static object CreateNetworkFunctionReference(byte[] funcRefData, string netSource) { return(NetworkFunctionManager.CreateReference(funcRefData, netSource)); }