feat: load block and item scripts after content load

This commit is contained in:
MihailRis
2024-11-22 08:56:59 +03:00
parent 4c0c6dd51a
commit a641099d36
5 changed files with 45 additions and 28 deletions
+28 -21
View File
@@ -483,16 +483,6 @@ void ContentLoader::loadBlock(
auto configFile = folder / fs::path("blocks/" + name + ".json");
if (fs::exists(configFile)) loadBlock(def, full, configFile);
auto scriptfile = folder / fs::path("scripts/" + def.scriptName + ".lua");
if (fs::is_regular_file(scriptfile)) {
scripting::load_block_script(
env,
full,
scriptfile,
pack->id + ":scripts/" + def.scriptName + ".lua",
def.rt.funcsset
);
}
if (!def.hidden) {
auto& item = builder.items.create(full + BLOCK_ITEM_SUFFIX);
item.generated = true;
@@ -514,17 +504,6 @@ void ContentLoader::loadItem(
auto folder = pack->folder;
auto configFile = folder / fs::path("items/" + name + ".json");
if (fs::exists(configFile)) loadItem(def, full, configFile);
auto scriptfile = folder / fs::path("scripts/" + def.scriptName + ".lua");
if (fs::is_regular_file(scriptfile)) {
scripting::load_item_script(
env,
full,
scriptfile,
pack->id + ":scripts/" + def.scriptName + ".lua",
def.rt.funcsset
);
}
}
static std::tuple<std::string, std::string, std::string> create_unit_id(
@@ -825,6 +804,34 @@ void ContentLoader::load() {
}
}
template <class T>
static void load_scripts(Content& content, ContentUnitDefs<T>& units) {
for (const auto& [name, def] : units.getDefs()) {
size_t pos = name.find(':');
if (pos == std::string::npos) {
throw std::runtime_error("invalid content unit name");
}
const auto runtime = content.getPackRuntime(name.substr(0, pos));
const auto& pack = runtime->getInfo();
const auto& folder = pack.folder;
auto scriptfile = folder / fs::path("scripts/" + def->scriptName + ".lua");
if (fs::is_regular_file(scriptfile)) {
scripting::load_content_script(
runtime->getEnvironment(),
name,
scriptfile,
pack.id + ":scripts/" + def->scriptName + ".lua",
def->rt.funcsset
);
}
}
}
void ContentLoader::loadScripts(Content& content) {
load_scripts(content, content.blocks);
load_scripts(content, content.items);
}
void ContentLoader::loadResources(ResourceType type, const dv::value& list) {
for (size_t i = 0; i < list.size(); i++) {
builder.resourceIndices[static_cast<size_t>(type)].add(