Added LoadAll and StopAll function. Some Javascript changes

This commit is contained in:
EntenKoeniq
2022-03-25 21:51:29 +01:00
parent 26d7a4d4a5
commit b1325bcef8
4 changed files with 63 additions and 46 deletions

View File

@ -8,7 +8,6 @@ using Microsoft.ClearScript;
using Microsoft.ClearScript.V8; using Microsoft.ClearScript.V8;
using GTA; using GTA;
using GTA.Native;
namespace CoopClient namespace CoopClient
{ {
@ -17,8 +16,6 @@ namespace CoopClient
/// </summary> /// </summary>
public class JavascriptHook : Script public class JavascriptHook : Script
{ {
private bool LoadedEngine = false;
private static List<V8ScriptEngine> ScriptEngines; private static List<V8ScriptEngine> ScriptEngines;
/// <summary> /// <summary>
@ -36,31 +33,37 @@ namespace CoopClient
return; return;
} }
if (!LoadedEngine) lock (ScriptEngines)
{ {
LoadedEngine = true; ScriptEngines.ForEach(engine => engine.Script.API.InvokeTick());
}
}
ScriptEngines = new List<V8ScriptEngine>(); internal static void LoadAll()
{
ScriptEngines = new List<V8ScriptEngine>();
string serverAddress = Main.MainSettings.LastServerAddress.Replace(":", "."); string serverAddress = Main.MainSettings.LastServerAddress.Replace(":", ".");
if (!Directory.Exists("scripts\\resources\\" + serverAddress)) if (!Directory.Exists("scripts\\resources\\" + serverAddress))
{
try
{ {
try Directory.CreateDirectory("scripts\\resources\\" + serverAddress);
{
Directory.CreateDirectory("scripts\\resources\\" + serverAddress);
}
catch (Exception ex)
{
// TODO
}
} }
catch (Exception ex)
{
// TODO
}
}
lock (ScriptEngines)
{
foreach (string script in Directory.GetFiles("scripts\\resources\\" + serverAddress, "*.js")) foreach (string script in Directory.GetFiles("scripts\\resources\\" + serverAddress, "*.js"))
{ {
V8ScriptEngine engine = new V8ScriptEngine(); V8ScriptEngine engine = new V8ScriptEngine();
engine.AddHostObject("SHV", new HostTypeCollection(Assembly.LoadFrom("ScriptHookVDotNet3.dll"))); engine.AddHostObject("SHVDN", new HostTypeCollection(Assembly.LoadFrom("ScriptHookVDotNet3.dll")));
engine.AddHostObject("LemonUI", new HostTypeCollection(Assembly.LoadFrom("scripts\\LemonUI.SHVDN3.dll"))); engine.AddHostObject("LemonUI", new HostTypeCollection(Assembly.LoadFrom("scripts\\LemonUI.SHVDN3.dll")));
engine.AddHostObject("API", new ScriptContext()); engine.AddHostObject("API", new ScriptContext());
@ -74,12 +77,20 @@ namespace CoopClient
} }
finally finally
{ {
engine.Script.API.InvokeStart();
ScriptEngines.Add(engine); ScriptEngines.Add(engine);
} }
} }
} }
}
ScriptEngines.ForEach(engine => engine.Script.API.InvokeRender()); internal static void StopAll()
{
lock (ScriptEngines)
{
ScriptEngines.ForEach(engine => engine.Script.API.InvokeStop());
ScriptEngines.Clear();
}
} }
} }
@ -91,33 +102,28 @@ namespace CoopClient
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public event EventHandler OnRender; public event EventHandler OnStart, OnStop, OnTick;
internal void InvokeRender() internal void InvokeStart()
{ {
OnRender?.Invoke(this, EventArgs.Empty); OnStart?.Invoke(this, EventArgs.Empty);
} }
/// <summary> internal void InvokeStop()
///
/// </summary>
/// <param name="hash"></param>
/// <param name="args"></param>
public void CallNative(string hash, params object[] args)
{ {
if (!Hash.TryParse(hash, out Hash ourHash)) OnStop?.Invoke(this, EventArgs.Empty);
{ }
return;
}
Function.Call(ourHash, args.Select(o => new InputArgument(o)).ToArray()); internal void InvokeTick()
{
OnTick?.Invoke(this, EventArgs.Empty);
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
/// <param name="message"></param> /// <param name="message"></param>
public void SendMessage(string message) public void SendLocalMessage(string message)
{ {
Main.MainChat.AddMessage("JAVASCRIPT", message); Main.MainChat.AddMessage("JAVASCRIPT", message);
} }

View File

@ -129,6 +129,8 @@ namespace CoopClient
COOPAPI.Connected(); COOPAPI.Connected();
GTA.UI.Notification.Show("~g~Connected!"); GTA.UI.Notification.Show("~g~Connected!");
JavascriptHook.LoadAll();
} }
break; break;
case NetConnectionStatus.Disconnected: case NetConnectionStatus.Disconnected:
@ -153,6 +155,8 @@ namespace CoopClient
COOPAPI.Disconnected(reason); COOPAPI.Disconnected(reason);
GTA.UI.Notification.Show("~r~Disconnected: " + reason); GTA.UI.Notification.Show("~r~Disconnected: " + reason);
JavascriptHook.StopAll();
break; break;
} }
break; break;

View File

@ -1 +1 @@
API.SendMessage('test.js loaded lalala'); API.SendLocalMessage('test.js loaded lalala');

View File

@ -1,17 +1,24 @@
var testVar = 0; function testFunction(message)
var testVar2 = false; {
SHVDN.GTA.UI.Notification.Show(message);
}
// Called every frame var messageCount = 0;
API.OnRender.connect(function() {
if (!testVar2) // Called every tick
API.OnTick.connect(function() {
if (messageCount < 5)
{ {
testVar2 = true; API.SendLocalMessage("testFunction " + ++messageCount);
SHV.GTA.UI.Notification.Show("test2.js loaded!");
} }
});
if (testVar < 10) // Called on connect
{ API.OnStart.connect(function() {
API.SendMessage("Test2 number: " + ++testVar); testFunction("hello test2.js!");
} });
// Called on disconnect
API.OnStop.connect(function() {
testFunction("bye test2.js!");
}); });