Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/scripting/StarLuaRoot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/scripting/StarLuaRoot.cpp')
-rw-r--r--source/game/scripting/StarLuaRoot.cpp76
1 files changed, 52 insertions, 24 deletions
diff --git a/source/game/scripting/StarLuaRoot.cpp b/source/game/scripting/StarLuaRoot.cpp
index 4d6e8cf..d41e8fc 100644
--- a/source/game/scripting/StarLuaRoot.cpp
+++ b/source/game/scripting/StarLuaRoot.cpp
@@ -5,16 +5,10 @@ namespace Star {
LuaRoot::LuaRoot() {
auto& root = Root::singleton();
-
- m_luaEngine = LuaEngine::create(root.configuration()->get("safeScripts").toBool());
-
- m_luaEngine->setRecursionLimit(root.configuration()->get("scriptRecursionLimit").toUInt());
- m_luaEngine->setInstructionLimit(root.configuration()->get("scriptInstructionLimit").toUInt());
- m_luaEngine->setProfilingEnabled(root.configuration()->get("scriptProfilingEnabled").toBool());
- m_luaEngine->setInstructionMeasureInterval(root.configuration()->get("scriptInstructionMeasureInterval").toUInt());
-
m_scriptCache = make_shared<ScriptCache>();
+ restart();
+
m_rootReloadListener = make_shared<CallbackListener>([cache = m_scriptCache]() {
cache->clear();
});
@@ -24,6 +18,40 @@ LuaRoot::LuaRoot() {
}
LuaRoot::~LuaRoot() {
+ shutdown();
+}
+
+void LuaRoot::loadScript(String const& assetPath) {
+ m_scriptCache->loadScript(*m_luaEngine, assetPath);
+}
+
+bool LuaRoot::scriptLoaded(String const& assetPath) const {
+ return m_scriptCache->scriptLoaded(assetPath);
+}
+
+void LuaRoot::unloadScript(String const& assetPath) {
+ m_scriptCache->unloadScript(assetPath);
+}
+
+void LuaRoot::restart() {
+ shutdown();
+
+ auto& root = Root::singleton();
+
+ m_luaEngine = LuaEngine::create(root.configuration()->get("safeScripts").toBool());
+
+ m_luaEngine->setRecursionLimit(root.configuration()->get("scriptRecursionLimit").toUInt());
+ m_luaEngine->setInstructionLimit(root.configuration()->get("scriptInstructionLimit").toUInt());
+ m_luaEngine->setProfilingEnabled(root.configuration()->get("scriptProfilingEnabled").toBool());
+ m_luaEngine->setInstructionMeasureInterval(root.configuration()->get("scriptInstructionMeasureInterval").toUInt());
+}
+
+void LuaRoot::shutdown() {
+ clearScriptCache();
+
+ if (!m_luaEngine)
+ return;
+
auto profile = m_luaEngine->getProfile();
if (!profile.empty()) {
profile.sort([](auto const& a, auto const& b) {
@@ -56,18 +84,8 @@ LuaRoot::~LuaRoot() {
Logger::info("Writing lua profile {}", filename);
File::writeFile(profileSummary, path);
}
-}
-void LuaRoot::loadScript(String const& assetPath) {
- m_scriptCache->loadScript(*m_luaEngine, assetPath);
-}
-
-bool LuaRoot::scriptLoaded(String const& assetPath) const {
- return m_scriptCache->scriptLoaded(assetPath);
-}
-
-void LuaRoot::unloadScript(String const& assetPath) {
- m_scriptCache->unloadScript(assetPath);
+ m_luaEngine.reset();
}
LuaContext LuaRoot::createContext(String const& script) {
@@ -91,33 +109,43 @@ LuaContext LuaRoot::createContext(StringList const& scriptPaths) {
for (auto const& scriptPath : scriptPaths)
cache->loadContextScript(newContext, scriptPath);
+ for (auto const& callbackPair : m_luaCallbacks)
+ newContext.setCallbacks(callbackPair.first, callbackPair.second);
+
return newContext;
}
void LuaRoot::collectGarbage(Maybe<unsigned> steps) {
- m_luaEngine->collectGarbage(steps);
+ if (m_luaEngine)
+ m_luaEngine->collectGarbage(steps);
}
void LuaRoot::setAutoGarbageCollection(bool autoGarbageColleciton) {
- m_luaEngine->setAutoGarbageCollection(autoGarbageColleciton);
+ if (m_luaEngine)
+ m_luaEngine->setAutoGarbageCollection(autoGarbageColleciton);
}
void LuaRoot::tuneAutoGarbageCollection(float pause, float stepMultiplier) {
- m_luaEngine->tuneAutoGarbageCollection(pause, stepMultiplier);
+ if (m_luaEngine)
+ m_luaEngine->tuneAutoGarbageCollection(pause, stepMultiplier);
}
size_t LuaRoot::luaMemoryUsage() const {
- return m_luaEngine->memoryUsage();
+ return m_luaEngine ? m_luaEngine->memoryUsage() : 0;
}
size_t LuaRoot::scriptCacheMemoryUsage() const {
- return m_scriptCache->memoryUsage();
+ return m_luaEngine ? m_scriptCache->memoryUsage() : 0;
}
void LuaRoot::clearScriptCache() const {
return m_scriptCache->clear();
}
+void LuaRoot::addCallbacks(String const& groupName, LuaCallbacks const& callbacks) {
+ m_luaCallbacks[groupName] = callbacks;
+}
+
LuaEngine& LuaRoot::luaEngine() const {
return *m_luaEngine;
}