diff --git a/SlipeServer.Console/AdditionalResources/Parachute/ServerBuilderExtensions.cs b/SlipeServer.Console/AdditionalResources/Parachute/ServerBuilderExtensions.cs index fbed20f7..41e7012b 100644 --- a/SlipeServer.Console/AdditionalResources/Parachute/ServerBuilderExtensions.cs +++ b/SlipeServer.Console/AdditionalResources/Parachute/ServerBuilderExtensions.cs @@ -2,7 +2,7 @@ using SlipeServer.Server.ServerBuilders; namespace SlipeServer.Console.AdditionalResources; -public static class ServerBuilderExtensions +public static partial class ServerBuilderExtensions { public static void AddParachuteResource(this ServerBuilder builder) { diff --git a/SlipeServer.Console/Logic/LuaTestLogic.cs b/SlipeServer.Console/Logic/LuaTestLogic.cs index 5b2e1577..c283f1fc 100644 --- a/SlipeServer.Console/Logic/LuaTestLogic.cs +++ b/SlipeServer.Console/Logic/LuaTestLogic.cs @@ -24,23 +24,24 @@ ILogger logger this.eventRuntime = eventRuntime; this.luaService = luaService; this.logger = logger; - commandService.AddCommand("lua").Triggered += (source, args) => Init(); + //commandService.AddCommand("lua").Triggered += (source, args) => Init(); + Init(); } private void Init() { this.eventRuntime.LoadDefaultEvents(); - this.luaService.LoadDefaultDefinitions(); - - this.luaService.LoadDefinitions(); - this.luaService.LoadDefinitions(); - using FileStream testLua = File.OpenRead("test.lua"); using StreamReader reader = new StreamReader(testLua); try { - this.luaService.LoadScript("test.lua", reader.ReadToEnd()); + Script createdScript = this.luaService.LoadScript("test.lua", reader.ReadToEnd()); + + this.luaService.LoadDefaultDefinitions(createdScript); + this.luaService.LoadDefinitions(createdScript); + this.luaService.LoadDefinitions(createdScript); + } catch (InterpreterException ex) { diff --git a/SlipeServer.Console/Program.cs b/SlipeServer.Console/Program.cs index c83cbddb..b2d6dc1e 100644 --- a/SlipeServer.Console/Program.cs +++ b/SlipeServer.Console/Program.cs @@ -14,6 +14,7 @@ using SlipeServer.Server; using SlipeServer.Server.Loggers; using SlipeServer.Server.PacketHandling.Handlers.Middleware; +using SlipeServer.Server.Resources.Providers; using SlipeServer.Server.ServerBuilders; using System; using System.Threading; diff --git a/SlipeServer.Console/Resources/SecondTestResource/test.lua b/SlipeServer.Console/Resources/SecondTestResource/test.lua index 0a529bba..51183cc1 100644 --- a/SlipeServer.Console/Resources/SecondTestResource/test.lua +++ b/SlipeServer.Console/Resources/SecondTestResource/test.lua @@ -1 +1 @@ -outputChatBox("I am a second resource") +outputChatBox("This is the second resource") diff --git a/SlipeServer.Console/test.lua b/SlipeServer.Console/test.lua index 024097cc..6bdbf7bc 100644 --- a/SlipeServer.Console/test.lua +++ b/SlipeServer.Console/test.lua @@ -1,4 +1,16 @@ if(isSlipeServer)then + + iprint("This is a message on server printed using iprint", "This is the second Argument from iprint") + + local customElement = createElement("MyCustomType") + iprint("Custom Element ", customElement) + + --setElementData(customElement, "dummyKey", "dummyValue") + + --local elementData = getElementData(customElement, "dummyKey") + + --iprint("Element Data Is ", elementData) + local object = createObject(321, 5, 5, 5) setElementPosition(object, 50, 50, 250) setElementRotation(object, 180, 180, 90) @@ -20,6 +32,8 @@ outputDebugString("Debug message, elapsed time: "..getTickCount()) + print("iprint is ", iprint) + print("base64 test:", base64Encode("sample text"), base64Decode(base64Encode("sample text"))) print("Some color: ", tocolor(235,23,77,159), tocolor(235,23,77,159) == -1611983027) print("getColorFromString: ", getColorFromString("#ff0000")); @@ -81,4 +95,5 @@ addCommandHandler("foo3", commandHandler3) addCommandHandler("foo4", commandHandler2) addCommandHandler("foo4", commandHandler3) removeCommandHandler("foo3", commandHandler2) -removeCommandHandler("foo4") \ No newline at end of file +removeCommandHandler("foo4") + diff --git a/SlipeServer.Lua/LuaService.cs b/SlipeServer.Lua/LuaService.cs index 9a0069d9..0c887637 100644 --- a/SlipeServer.Lua/LuaService.cs +++ b/SlipeServer.Lua/LuaService.cs @@ -19,7 +19,7 @@ public class LuaService private readonly ILogger logger; private readonly RootElement root; private readonly Dictionary scripts; - private readonly Dictionary methods; + private readonly Dictionary> methods; private readonly LuaTranslator translator; public LuaService(MtaServer server, ILogger logger, RootElement root) @@ -28,11 +28,11 @@ public LuaService(MtaServer server, ILogger logger, RootElement root) this.logger = logger; this.root = root; this.scripts = new Dictionary(); - this.methods = new Dictionary(); + this.methods = new Dictionary>(); this.translator = new LuaTranslator(); } - public void LoadDefinitions(object methodSet) + public void LoadDefinitions(object methodSet, Script owner) { foreach (var method in methodSet.GetType().GetMethods() .Where(method => method.CustomAttributes @@ -40,11 +40,12 @@ public void LoadDefinitions(object methodSet) { var attribute = method.GetCustomAttribute(); - if (this.methods.ContainsKey(attribute!.NiceName)) + if (methods.TryGetValue(owner, out Dictionary? _) && this.methods[owner].ContainsKey(attribute!.NiceName)) throw new Exception($"Lua name conflict for '{attribute.NiceName}'"); var methodParameters = method.GetParameters(); - this.methods[attribute.NiceName] = (values) => + this.methods.TryAdd(owner, new Dictionary()); + this.methods[owner][attribute.NiceName] = (values) => { var valueQueue = new Queue(values.AsEnumerable()); @@ -55,7 +56,7 @@ public void LoadDefinitions(object methodSet) { if (valueQueue.Any()) { - parameters[i] = this.translator.FromDynValue(methodParameters[i].ParameterType, valueQueue); + parameters[i] = this.translator.FromDynValue(methodParameters[i].ParameterType, valueQueue, owner); } else { if (!methodParameters[i].IsOptional) @@ -74,40 +75,43 @@ public void LoadDefinitions(object methodSet) } var result = method.Invoke(methodSet, parameters); - return this.translator.ToDynValues(result).ToArray(); + return this.translator.ToDynValues(result, owner).ToArray(); }; } } - public void LoadDefinitions() + public void LoadDefinitions(Script script) { - LoadDefinitions(this.server.Instantiate()!); + LoadDefinitions(this.server.Instantiate()!, script); } - public void LoadDefaultDefinitions() + public void LoadDefaultDefinitions(Script script) { foreach (var type in typeof(ScriptFunctionDefinitionAttribute).Assembly.DefinedTypes .Where(type => type.GetMethods() .Any(method => method.CustomAttributes .Any(attribute => attribute.AttributeType == typeof(ScriptFunctionDefinitionAttribute))))) { - LoadDefinitions(this.server.Instantiate(type)); + LoadDefinitions(this.server.Instantiate(type), script); } } - public void LoadScript(string identifier, string code) + public Script LoadScript(string identifier, string code) { var script = new Script(CoreModules.Preset_SoftSandbox); script.Options.DebugPrint = (value) => this.logger.LogInformation(value); this.scripts[identifier] = script; LoadGlobals(script); + LoadDefaultDefinitions(script); LoadDefinitions(script); script.DoString(code, codeFriendlyName: identifier); + + return script; } - public void LoadScript(string identifier, string[] codes) + public Script LoadScript(string identifier, string[] codes) { var script = new Script(CoreModules.Preset_SoftSandbox); script.Options.DebugPrint = (value) => @@ -118,18 +122,22 @@ public void LoadScript(string identifier, string[] codes) this.scripts[identifier] = script; LoadGlobals(script); + LoadDefaultDefinitions(script); LoadDefinitions(script); foreach (var code in codes) script.DoString(code, codeFriendlyName: identifier); + + return script; } - public async Task LoadScriptFromPath(string path) => LoadScript(path, await File.ReadAllTextAsync(path)); - public async Task LoadScriptFromPaths(string identifier, string[] paths) + public async Task