using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using LuaInterface; namespace TShockAPI.LuaSystem { public class LuaLoader { private Lua Lua = null; public string LuaPath = ""; public string LuaAutorunPath = ""; public Dictionary> Hooks = new Dictionary >(); public LuaLoader(string path) { Lua = new Lua(); LuaPath = path; LuaAutorunPath = Path.Combine(LuaPath, "autorun"); SendLuaDebugMsg("Lua 5.1 (serverside) initialized."); if (!string.IsNullOrEmpty(LuaPath) && !Directory.Exists(LuaPath)) { Directory.CreateDirectory(LuaPath); } if (!string.IsNullOrEmpty(LuaAutorunPath) && !Directory.Exists(LuaAutorunPath)) { Directory.CreateDirectory(LuaAutorunPath); } RegisterLuaFunctions(); LoadServerAutoruns(); } static void test() { var loader = new LuaLoader(""); loader.RunLuaString(@" function hookme() Print('Hook test') end Hook(""doesntmatter"", ""hookmeee"", hookme)"); loader.HookTest(); } public void LoadServerAutoruns() { try { foreach (string s in Directory.GetFiles(LuaAutorunPath)) { SendLuaDebugMsg("Loading: " + s); RunLuaFile(s); } } catch (Exception e) { SendLuaDebugMsg(e.Message); SendLuaDebugMsg(e.StackTrace); } } public void RunLuaString(string s) { try { Lua.DoString(s); } catch (LuaException e) { SendLuaDebugMsg(e.Message); } } public void RunLuaFile(string s) { try { Lua.DoFile(s); } catch (LuaException e) { SendLuaDebugMsg(e.Message); } } public void SendLuaDebugMsg(string s) { ConsoleColor previousColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("Lua: " + s); Console.ForegroundColor = previousColor; } public void RegisterLuaFunctions() { LuaFunctions LuaFuncs = new LuaFunctions(this); Lua.RegisterFunction("Print", LuaFuncs, LuaFuncs.GetType().GetMethod("Print")); Lua.RegisterFunction("Hook", LuaFuncs, LuaFuncs.GetType().GetMethod("Hook")); } public void HookTest() { Console.WriteLine("Running hook test."); foreach (KeyValuePair> kv in Hooks) { KeyValuePair hook = kv.Value; LuaFunction lf = hook.Value; if (lf != null) { lf.Call(); } } } } public class LuaFunctions { LuaLoader Parent; public LuaFunctions(LuaLoader parent) { Parent = parent; } public void Print(string s) { ConsoleColor previousColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(s); Console.ForegroundColor = previousColor; } public void Hook(string hook, string key, LuaFunction callback) { KeyValuePair internalhook = new KeyValuePair(hook, callback); Parent.Hooks.Add(key, internalhook); } } }