From b66937c61d711536556988103e90f36f217097af Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 13 Mar 2025 00:28:40 +0300 Subject: [PATCH] feat: scripts classification --- res/layouts/console.xml.lua | 36 +++++++++++++++++++++++++++------ res/preload.json | 3 ++- res/scripts/post_content.lua | 2 +- res/textures/gui/block.png | Bin 150 -> 114 bytes res/textures/gui/module.png | Bin 0 -> 150 bytes src/content/ContentBuilder.cpp | 4 +++- src/content/ContentLoader.cpp | 5 ++++- src/items/ItemDef.hpp | 2 ++ src/voxels/Block.hpp | 2 ++ 9 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 res/textures/gui/module.png diff --git a/res/layouts/console.xml.lua b/res/layouts/console.xml.lua index 09092f6f..aab8d0dd 100644 --- a/res/layouts/console.xml.lua +++ b/res/layouts/console.xml.lua @@ -11,6 +11,7 @@ local error_id = 0 local writeables = {} local filenames = {} +local scripts_classification = {} local current_file = { filename = "", @@ -92,7 +93,7 @@ function build_files_list(filenames, selected) filename = filename:gsub(selected, "**"..selected.."**") end local parent = file.parent(filename) - local script_type = "file" + local script_type = scripts_classification[actual_filename] or "file" files_list:add(gui.template("script_file", { path = parent .. (parent[#parent] == ':' and '' or '/'), name = file.name(filename), @@ -319,6 +320,31 @@ local function collect_scripts(dirname, dest) end end +local function build_scripts_classification() + for id, props in pairs(block.properties) do + scripts_classification[props["script-file"]] = "block" + end + for id, props in pairs(item.properties) do + scripts_classification[props["script-file"]] = "item" + end +end + +local function load_scripts_list() + local packs = pack.get_installed() + for _, packid in ipairs(packs) do + collect_scripts(packid..":modules", filenames) + end + + for _, filename in ipairs(filenames) do + scripts_classification[filename] = "module" + end + + for _, packid in ipairs(packs) do + collect_scripts(packid..":scripts", filenames) + end + +end + function on_open(mode) if modes == nil then modes = RadioGroup({ @@ -330,12 +356,10 @@ function on_open(mode) end, mode or "console") local files_list = document.filesList - local packs = pack.get_installed() - for _, packid in ipairs(packs) do - collect_scripts(packid..":modules", filenames) - collect_scripts(packid..":scripts", filenames) - end + load_scripts_list() + build_scripts_classification() + table.sort(filenames) build_files_list(filenames) diff --git a/res/preload.json b/res/preload.json index a8426ba4..2b00a440 100644 --- a/res/preload.json +++ b/res/preload.json @@ -29,7 +29,8 @@ "gui/save", "gui/block", "gui/item", - "gui/file" + "gui/file", + "gui/module" ], "fonts": [ { diff --git a/res/scripts/post_content.lua b/res/scripts/post_content.lua index 8725ed97..e7361bb2 100644 --- a/res/scripts/post_content.lua +++ b/res/scripts/post_content.lua @@ -7,7 +7,7 @@ local names = { "hidden", "draw-group", "picking-item", "surface-replacement", "script-name", "ui-layout", "inventory-size", "tick-interval", "overlay-texture", "translucent", "fields", "particles", "icon-type", "icon", "placing-block", - "stack-size", "name" + "stack-size", "name", "script-file" } for name, _ in pairs(user_props) do table.insert(names, name) diff --git a/res/textures/gui/block.png b/res/textures/gui/block.png index 84922d72eaae440d120419ca584161a1babddec0..dfcc239a4ca4744ae7f9fb22d336350d8ffd33b5 100644 GIT binary patch delta 84 zcmbQnSTsS!&(hPyF{ENna^eDk4FN|R{yRAIB)KU#gz-NLKF%s4%}^}0ks;DHmr2le o!-t(I6WEmu8?9#vt(+jl$SW@qxmDY_hye&ZUHx3vIVCg!0P(dO>;M1& delta 120 zcmV-;0Eho_mI06?a$QM8K~#90V_~2Wu;7#Y4+J2Z5eP^!0H%=`gIKUBB*jH6#Aw84 z5DT)2#2SR*0(1#n2H^|?bibh+gsu_83)m#^X~b{=IzTrFU)bPHNW_3aV!*(s140V% aDWcm`nCAlx|rkc$oW!%7@G& y1&me><{a@i9{743X>d$Ba9}yJ6W7P5ZVctk9=<1g+@ydOF?hQAxvX ContentBuilder::build() { def->rt.surfaceReplacement = content->blocks.require(def->surfaceReplacement).rt.id; if (def->properties == nullptr) { def->properties = dv::object(); - def->properties["name"] = def->name; } + def->properties["name"] = def->name; + def->properties["script-file"] = def->scriptFile; } for (ItemDef* def : itemDefsIndices) { @@ -104,6 +105,7 @@ std::unique_ptr ContentBuilder::build() { def->properties = dv::object(); } def->properties["name"] = def->name; + def->properties["script-file"] = def->scriptFile; } for (auto& [name, def] : content->generators.getDefs()) { diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 9b14bc86..bc8598bd 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -394,6 +394,7 @@ void ContentLoader::loadBlock( if (def.hidden && def.pickingItem == def.name + BLOCK_ITEM_SUFFIX) { def.pickingItem = CORE_EMPTY; } + def.scriptFile = pack->id + ":scripts/" + def.scriptName + ".lua"; } void ContentLoader::loadItem( @@ -452,6 +453,8 @@ void ContentLoader::loadItem( def.emission[1] = emissionarr[1].asNumber(); def.emission[2] = emissionarr[2].asNumber(); } + + def.scriptFile = pack->id + ":scripts/" + def.scriptName + ".lua"; } void ContentLoader::loadEntity( @@ -865,7 +868,7 @@ static void load_scripts(Content& content, ContentUnitDefs& units) { runtime->getEnvironment(), name, scriptfile, - pack.id + ":scripts/" + def->scriptName + ".lua", + def->scriptFile, def->rt.funcsset ); } diff --git a/src/items/ItemDef.hpp b/src/items/ItemDef.hpp index db4ff9f3..00870cc3 100644 --- a/src/items/ItemDef.hpp +++ b/src/items/ItemDef.hpp @@ -59,6 +59,8 @@ struct ItemDef { std::string modelName = name + ".model"; + std::string scriptFile; + struct { itemid_t id; blockid_t placingBlock; diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index a7b3aeb1..972b405f 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -204,6 +204,8 @@ public: /// @brief Block script name in blocks/ without extension std::string scriptName = name.substr(name.find(':') + 1); + std::string scriptFile; + /// @brief Block will be used instead of this if generated on surface std::string surfaceReplacement = name;