diff options
-rw-r--r-- | cwd/assets/altcraft/init.lua | 1 | ||||
-rw-r--r-- | cwd/assets/altcraft/scripts/init.lua | 12 | ||||
-rw-r--r-- | src/AssetManager.cpp | 53 |
3 files changed, 49 insertions, 17 deletions
diff --git a/cwd/assets/altcraft/init.lua b/cwd/assets/altcraft/init.lua deleted file mode 100644 index a3ea3c6..0000000 --- a/cwd/assets/altcraft/init.lua +++ /dev/null @@ -1 +0,0 @@ -print("Hello")
\ No newline at end of file diff --git a/cwd/assets/altcraft/scripts/init.lua b/cwd/assets/altcraft/scripts/init.lua new file mode 100644 index 0000000..d48ecd0 --- /dev/null +++ b/cwd/assets/altcraft/scripts/init.lua @@ -0,0 +1,12 @@ +plug = { + name = 'altcraft', + displayName = "AltCraft Core Plugin", + onLoad = nil, + onUnload = nil, +} + +function plug:onLoad () + print("Loaded "..self.name.."-plugin!") +end + +AC:RegisterPlugin(plug)
\ No newline at end of file diff --git a/src/AssetManager.cpp b/src/AssetManager.cpp index 1ae9929..361e2ef 100644 --- a/src/AssetManager.cpp +++ b/src/AssetManager.cpp @@ -103,34 +103,55 @@ void LoadTextures() { void LoadScripts() { lua.open_libraries(sol::lib::base, sol::lib::table); + lua["AC"] = lua.create_table(); + lua["plugins"] = lua.create_table(); + lua["AC"]["RegisterPlugin"].set_function([&](sol::table &self, sol::table &plugin) { + std::string pluginName; + try { + pluginName = plugin["name"]; + lua["plugins"][pluginName] = plugin; + LOG(INFO) << "Loading plugin " << (lua["plugins"][pluginName]["displayName"] ? lua["plugins"][pluginName]["displayName"] : pluginName); + if (lua["plugins"][pluginName]["onLoad"]) + lua["plugins"][pluginName]["onLoad"].call(lua["plugins"][pluginName]); + } catch (sol::error &e) { + if (pluginName.empty()) + return; + + LOG(ERROR) << "Plugin " << pluginName << " loading failed: " << e.what(); + lua["plugins"][pluginName] = sol::lua_nil; + } + }); - LOG(INFO) << "Loading lua-init-scripts"; + LOG(INFO) << "Loading Lua..."; std::vector<std::string> loadedScripts; std::vector<std::string> failedScripts; AssetTreeNode *node = AssetManager::GetAssetByAssetName("/"); for (auto &it : node->childs) { for (auto &child : it->childs) { - if (child->name == "init") { - AssetScript *asset = dynamic_cast<AssetScript *>(child->asset.get()); - if (!asset) { - LOG(ERROR) << "Unrecognised script file /" << it->name; - continue; - } - try { - lua.script(asset->code); - } - catch (sol::error &e) { - LOG(ERROR) << "LUA init-script " << child->name << " failed: " << e.what(); - failedScripts.push_back(it->name); - continue; + if (child->name == "scripts") { + for (auto &script : child->childs) + { + AssetScript *asset = dynamic_cast<AssetScript *>(script->asset.get()); + if (!asset) { + LOG(ERROR) << "Unrecognised script file /" << it->name; + continue; + } + try { + lua.script(asset->code); + } + catch (sol::error &e) { + LOG(ERROR) << "LUA script " << it->name << "/" << child->name << "/" << script->name << " parsing failed: " << e.what(); + failedScripts.push_back(it->name); + continue; + } + loadedScripts.push_back(it->name); } - loadedScripts.push_back(it->name); } } } - LOG(INFO) << "Lua loaded: " << loadedScripts.size() << " failed: " << failedScripts.size(); + LOG(INFO) << "Lua loaded: " << loadedScripts.size() << " failed: " << failedScripts.size(); } void WalkDirEntry(const fs::directory_entry &dirEntry, AssetTreeNode *node) { |