public void SetupLua(ProfileModel profileModel) { _logger.Debug("Setting up LUA for profile '{0}', module '{1}'", profileModel?.Name, profileModel?.GameName); // Clear old state ClearLua(); // Stop after that if no model provided/there is no keyboard if (profileModel == null || _deviceManager.ActiveKeyboard == null) { return; } ProfileModel = profileModel; KeyboardProvider = _deviceManager.ActiveKeyboard; // Get new instances of all modules _luaModules = _kernel.Get <List <LuaModule> >(); ProfileModule = (LuaProfileModule)_luaModules.First(m => m.ModuleName == "Profile"); EventsModule = (LuaEventsModule)_luaModules.First(m => m.ModuleName == "Events"); // Setup new state LuaScript.Options.DebugPrint = LuaPrint; // Insert each module with a ModuleName into the script's globals foreach (var luaModule in _luaModules.Where(m => m.ModuleName != null)) { LuaScript.Globals[luaModule.ModuleName] = luaModule; } // If there is no LUA script, don't bother executing the string if (ProfileModel.LuaScript.IsNullOrEmpty()) { return; } try { lock (EventsModule.InvokeLock) { lock (LuaScript) { LuaScript.DoString(ProfileModel.LuaScript); } } } catch (InternalErrorException e) { _logger.Error("[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); } catch (SyntaxErrorException e) { _logger.Error("[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); } catch (ScriptRuntimeException e) { _logger.Error("[{0}-LUA]: Error: {1}", ProfileModel.Name, e.DecoratedMessage); } }
private IEnumerator ExecuteScriptInternal(string script) { var luaFunc = DynValue.Nil; try { luaFunc = LuaScript.DoString(script); } catch (InterpreterException ex) { Debug.LogErrorFormat("Lua Execute error:\n{0}", ex.DecoratedMessage); } catch (Exception ex) { Debug.LogException(ex); } if (luaFunc.IsNil()) { yield break; } luaCoroutine = null; var dynValue = LuaScript.CreateCoroutine(luaFunc); if (dynValue.IsNil()) { yield break; } luaCoroutine = dynValue.Coroutine; luaCoroutine.AutoYieldCounter = 1000; luaCoroutine.Resume(); while (true) { if (luaCoroutine == null) { break; } if (luaCoroutine.State == CoroutineState.Dead) { break; } yield return(null); } }
// GUI Events private void CmdTxtBx_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { try { script.DoString(cmdTxtBx.Text); } catch (Exception ex) { LogError($"ERROR: {ex.Message}"); } cmdTxtBx.Text = ""; e.Handled = true; } }
public void ClearLua() { if (_luaModules != null) { foreach (var luaModule in _luaModules) { luaModule.Dispose(); } _luaModules.Clear(); } try { LuaScript.Globals.Clear(); LuaScript.Registry.Clear(); LuaScript.Registry.RegisterConstants(); LuaScript.Registry.RegisterCoreModules(CoreModules.Preset_SoftSandbox); LuaScript.Globals.RegisterConstants(); LuaScript.Globals.RegisterCoreModules(CoreModules.Preset_SoftSandbox); } catch (NullReferenceException) { // TODO: Ask MoonSharp folks why this is happening } if (EventsModule != null) { lock (EventsModule.InvokeLock) { lock (LuaScript) { LuaScript.DoString(""); } } } else { lock (LuaScript) { LuaScript.DoString(""); } } }