Add reading schematics from a Lua table
This commit is contained in:
parent
491182af46
commit
85cc63aad2
54
README.md
54
README.md
@ -6,27 +6,33 @@ Contributors: [Gael-de-Sailly](https://github.com/Gael-de-Sailly)
|
|||||||
|
|
||||||
License: LGPL 2.1
|
License: LGPL 2.1
|
||||||
|
|
||||||
This mod reads minetest schematics (.mts files), and does any or all of the following things:
|
This mod reads one or more minetest schematics (.mts files). It also accepts schematics as Lua
|
||||||
|
tables.
|
||||||
|
|
||||||
|
Then, it does any or all of the following things:
|
||||||
|
|
||||||
* Displays the contents of the schematic in the chat window/debug file
|
* Displays the contents of the schematic in the chat window/debug file
|
||||||
* Converts the contents of the schematic to a .lua file
|
* Swaps nodes in the schematic (e.g. swaps **default:stone** for **mymod:rock**)
|
||||||
* Swaps nodes in the schematic (e.g. swaps **default:stone** for **mymod:rock**), and saves the
|
* Saves the schematic as a .mts and/or .lua file
|
||||||
modified schematic either as .mts or as .lua
|
|
||||||
|
|
||||||
This mod has no gameplay value, and is only useful for developers.
|
Thus, this mod is useful for the following purposes:
|
||||||
|
|
||||||
This mod has been tested on Minetest 5.4.1. It has not been tested on MS Windows.
|
* Updating nodes, when .mts schematics are copied from one mod to another
|
||||||
|
* A general-purpose Lua > .mts > Lua schematic converter
|
||||||
|
|
||||||
# How to use
|
This mod has no gameplay value, and is only useful for developers. It has been tested on Minetest
|
||||||
|
5.4.1. It has not been tested on MS Windows.
|
||||||
|
|
||||||
Firstly, open the the **init.lua** file in your preferred text editor. There are some flags there
|
# Importing schematics
|
||||||
that can be modified to change the mod's behaviour. (Since this mod is for developers, we assume you
|
|
||||||
don't need the crutch of reading from a **settingtypes.txt** file).
|
|
||||||
|
|
||||||
The default behaviour is to convert original .mts file, but not to write additional .lua files.
|
Open the the **init.lua** file in your preferred text editor. There are some flags there that can be
|
||||||
|
modified to change the mod's behaviour. (Since this mod is for developers, we assume you don't need
|
||||||
|
the crutch of reading from a **settingtypes.txt** file).
|
||||||
|
|
||||||
Next, there is a folder called **input**. Copy the .mts files into this folder. Files in this
|
There are two ways to import schematics.
|
||||||
folder are never modified.
|
|
||||||
|
Firstly, .mts schematics should be copied into the folder called **input**. Files in this folder are
|
||||||
|
never modified or overwritten.
|
||||||
|
|
||||||
Unfortunately, there is no easy way for Lua to get a list of files from a folder; therefore we have
|
Unfortunately, there is no easy way for Lua to get a list of files from a folder; therefore we have
|
||||||
to write the list ourselves in **files.txt**. This should contain one file per line. Empty lines
|
to write the list ourselves in **files.txt**. This should contain one file per line. Empty lines
|
||||||
@ -35,6 +41,15 @@ and lines starting with the # character are ignored.
|
|||||||
There is a shortcut: if a file called **test.mts** exists, it will be loaded, regardless of whether
|
There is a shortcut: if a file called **test.mts** exists, it will be loaded, regardless of whether
|
||||||
it is mentioned in **files.txt**.
|
it is mentioned in **files.txt**.
|
||||||
|
|
||||||
|
Secondly, Lua tables can be copy-pasted into the **schematics.lua** file.
|
||||||
|
|
||||||
|
You can find some examples of schematics in the form of Lua tables in **minetest-game**, in the file
|
||||||
|
**schematic-tables.txt**. If you like, you could copy-paste the whole of that file into
|
||||||
|
**schematics.lua**. Don't forget to change the function calls from **mts_save()** to
|
||||||
|
**schemconvert.add_schem()**.
|
||||||
|
|
||||||
|
# Setting up node conversion
|
||||||
|
|
||||||
Next, the **convert.csv** file provides a list of nodes to convert. Once again, empty lines and
|
Next, the **convert.csv** file provides a list of nodes to convert. Once again, empty lines and
|
||||||
lines starting with the # character are ignored.
|
lines starting with the # character are ignored.
|
||||||
|
|
||||||
@ -50,12 +65,13 @@ For example
|
|||||||
It is not necessary for either mod to be loaded; **schemconvert** deals with simple strings, it does
|
It is not necessary for either mod to be loaded; **schemconvert** deals with simple strings, it does
|
||||||
not check whether the nodes **default:stone** or **mymod:rock** actually exist in the game.
|
not check whether the nodes **default:stone** or **mymod:rock** actually exist in the game.
|
||||||
|
|
||||||
Now, start the game (with **schemconvert** enabled). The converted .mts files are written to the
|
# How to use
|
||||||
**output** folder.
|
|
||||||
|
|
||||||
Nervous users can check the results of their work by changing the flags (as described above) to
|
Start the game (with **schemconvert** enabled). Converted files are written to the **output**
|
||||||
|
folder.
|
||||||
|
|
||||||
|
You can check the results of your work by changing the flags (as described above) to
|
||||||
write the orginal and/or converted files as .lua files, so the changes can be inspected visually.
|
write the orginal and/or converted files as .lua files, so the changes can be inspected visually.
|
||||||
The .lua files are also written to the **output** folder.
|
|
||||||
|
|
||||||
# Comparable mods
|
# Comparable mods
|
||||||
|
|
||||||
@ -66,3 +82,7 @@ Converts lua tables to .mts files
|
|||||||
[schemedit, by Wuzzy](https://repo.or.cz/minetest_schemedit.git)
|
[schemedit, by Wuzzy](https://repo.or.cz/minetest_schemedit.git)
|
||||||
|
|
||||||
Allows players to edit and export schematics in-game
|
Allows players to edit and export schematics in-game
|
||||||
|
|
||||||
|
[mtsedit, by bzt](https://gitlab.com/bztsrc/mtsedit)
|
||||||
|
|
||||||
|
An interactive MTS editor with GUI, and batch mode capabilities
|
||||||
|
166
init.lua
166
init.lua
@ -1,20 +1,27 @@
|
|||||||
---------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------
|
||||||
-- schemconvert mod by A S Lewis
|
-- schemconvert mod by A S Lewis
|
||||||
-- v1.1 22 Jun 2021
|
|
||||||
-- Lieence: LGPL 2.1
|
-- Lieence: LGPL 2.1
|
||||||
---------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
local S = minetest.get_translator(minetest.get_current_modname())
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
|
||||||
|
schemconvert = {}
|
||||||
|
schemconvert.name = "schemconvert"
|
||||||
|
schemconvert.ver_max = 1
|
||||||
|
schemconvert.ver_min = 2
|
||||||
|
schemconvert.ver_rev = 0
|
||||||
|
|
||||||
local mod_path = minetest.get_modpath(minetest.get_current_modname())
|
local mod_path = minetest.get_modpath(minetest.get_current_modname())
|
||||||
|
|
||||||
local file_list = {}
|
local file_list = {}
|
||||||
|
schemconvert.schem_table = {}
|
||||||
local convert_table = {}
|
local convert_table = {}
|
||||||
local check_table = {}
|
local check_table = {}
|
||||||
local converted_table = {}
|
local converted_table = {}
|
||||||
local not_converted_table = {}
|
local not_converted_table = {}
|
||||||
|
|
||||||
local convert_count = 0
|
local mts_count = 0
|
||||||
|
local schem_count = 0
|
||||||
local error_count = 0
|
local error_count = 0
|
||||||
|
|
||||||
-- If enabled, show info/error messages in the chat window and debug file
|
-- If enabled, show info/error messages in the chat window and debug file
|
||||||
@ -44,15 +51,19 @@ local show_summary_flag = true
|
|||||||
---------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
local function show_info(msg)
|
local function show_info(msg)
|
||||||
|
|
||||||
if show_msg_flag then
|
if show_msg_flag then
|
||||||
minetest.log("[SCHEMCONVERT] " .. msg)
|
minetest.log("[SCHEMCONVERT] " .. msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function show_error(msg)
|
local function show_error(msg)
|
||||||
|
|
||||||
if show_msg_flag then
|
if show_msg_flag then
|
||||||
minetest.log("[SCHEMCONVERT] [ERROR] " .. msg)
|
minetest.log("[SCHEMCONVERT] [ERROR] " .. msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------
|
||||||
@ -190,6 +201,54 @@ local function print_table(table_to_show, optional_title)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Add a Lua schematic
|
||||||
|
function schemconvert.add_schem(name, schem_table)
|
||||||
|
|
||||||
|
-- Called from schematics.lua
|
||||||
|
-- The code there could easily add a key/value pair to schemconvert.schem_table, but usually
|
||||||
|
-- it's preferable to use a function call
|
||||||
|
-- (Specifically, the official minetest-game schematic list uses mts_save(), so that code could
|
||||||
|
-- be copy-pasted into our schematics.lua, with just the function name changed)
|
||||||
|
|
||||||
|
schemconvert.schem_table[name] = schem_table
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Convert old nodes in a schematic table to new nodes
|
||||||
|
local function convert_nodes(schem_table)
|
||||||
|
|
||||||
|
for i, mini_table in ipairs(schem_table.data) do
|
||||||
|
|
||||||
|
if convert_table[mini_table.name] ~= nil then
|
||||||
|
|
||||||
|
-- (Keep track of which convertable nodes have been found at least once)
|
||||||
|
check_table[mini_table.name] = nil
|
||||||
|
|
||||||
|
-- Convert this node
|
||||||
|
mini_table.name = convert_table[mini_table.name]
|
||||||
|
schem_table.data[i] = mini_table
|
||||||
|
|
||||||
|
-- (Show converted nodes at the end, if required)
|
||||||
|
if converted_table[mini_table.name] == nil then
|
||||||
|
converted_table[mini_table.name] = 1
|
||||||
|
else
|
||||||
|
converted_table[mini_table.name] = converted_table[mini_table.name] + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if not_converted_table[mini_table.name] == nil then
|
||||||
|
not_converted_table[mini_table.name] = 1
|
||||||
|
else
|
||||||
|
not_converted_table[mini_table.name] = not_converted_table[mini_table.name] + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
-- Save a schematic as .mts
|
-- Save a schematic as .mts
|
||||||
local function save_mts(schem_table, output_path)
|
local function save_mts(schem_table, output_path)
|
||||||
|
|
||||||
@ -232,7 +291,7 @@ local function save_lua(schem_table, output_path)
|
|||||||
end
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------
|
||||||
-- Do the conversion
|
-- Read schematics
|
||||||
---------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
-- Read the file list, ignoring anything that isn't an .mts file
|
-- Read the file list, ignoring anything that isn't an .mts file
|
||||||
@ -244,8 +303,10 @@ if file_exists(mod_path .. "/input/test.mts") then
|
|||||||
for _, value in ipairs(file_list) do
|
for _, value in ipairs(file_list) do
|
||||||
|
|
||||||
if value == "test.mts" then
|
if value == "test.mts" then
|
||||||
|
|
||||||
match_flag = true
|
match_flag = true
|
||||||
break
|
break
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -258,6 +319,20 @@ end
|
|||||||
|
|
||||||
show_info(S("Number of .mts files specified: @1", #file_list))
|
show_info(S("Number of .mts files specified: @1", #file_list))
|
||||||
|
|
||||||
|
-- Read Lua schematics into a table
|
||||||
|
dofile(mod_path .. "/schematics.lua")
|
||||||
|
|
||||||
|
local count = 0
|
||||||
|
for k, v in pairs(schemconvert.schem_table) do
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
show_info(S("Number of Lua schematics specified: @1", count))
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
-- Read conversion table
|
||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
-- Read the conversion table. Every line in the CSV file should be in the form
|
-- Read the conversion table. Every line in the CSV file should be in the form
|
||||||
-- original_node|replacement_node
|
-- original_node|replacement_node
|
||||||
-- For example
|
-- For example
|
||||||
@ -275,7 +350,11 @@ end
|
|||||||
|
|
||||||
show_info(S("Number of convertable nodes specified: @1", tostring(count)))
|
show_info(S("Number of convertable nodes specified: @1", tostring(count)))
|
||||||
|
|
||||||
-- Convert each schematic, one at a time
|
---------------------------------------------------------------------------------------------------
|
||||||
|
-- Convert schematics
|
||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- Convert each MTS schematic, one at a time
|
||||||
for _, local_path in ipairs(file_list) do
|
for _, local_path in ipairs(file_list) do
|
||||||
|
|
||||||
local input_path = mod_path .. "/input/" .. local_path
|
local input_path = mod_path .. "/input/" .. local_path
|
||||||
@ -301,35 +380,7 @@ for _, local_path in ipairs(file_list) do
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Convert old nodes to new
|
-- Convert old nodes to new
|
||||||
for i, mini_table in ipairs(schem_table.data) do
|
convert_nodes(schem_table)
|
||||||
|
|
||||||
if convert_table[mini_table.name] ~= nil then
|
|
||||||
|
|
||||||
-- (Keep track of which convertable nodes have been found at least once)
|
|
||||||
check_table[mini_table.name] = nil
|
|
||||||
|
|
||||||
-- Convert this node
|
|
||||||
mini_table.name = convert_table[mini_table.name]
|
|
||||||
schem_table.data[i] = mini_table
|
|
||||||
|
|
||||||
-- (Show converted nodes at the end, if required)
|
|
||||||
if converted_table[mini_table.name] == nil then
|
|
||||||
converted_table[mini_table.name] = 1
|
|
||||||
else
|
|
||||||
converted_table[mini_table.name] = converted_table[mini_table.name] + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
if not_converted_table[mini_table.name] == nil then
|
|
||||||
not_converted_table[mini_table.name] = 1
|
|
||||||
else
|
|
||||||
not_converted_table[mini_table.name] = not_converted_table[mini_table.name] + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Save the converted .mts file
|
-- Save the converted .mts file
|
||||||
if do_convert_flag then
|
if do_convert_flag then
|
||||||
@ -337,7 +388,7 @@ for _, local_path in ipairs(file_list) do
|
|||||||
if not save_mts(schem_table, output_path) then
|
if not save_mts(schem_table, output_path) then
|
||||||
error_count = error_count + 1
|
error_count = error_count + 1
|
||||||
else
|
else
|
||||||
convert_count = convert_count + 1
|
mts_count = mts_count + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -354,8 +405,51 @@ for _, local_path in ipairs(file_list) do
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Show the results
|
-- Convert each Lua schematic, one at a time
|
||||||
show_info(S("Number of .mts files converted: @1", convert_count))
|
for name, schem_table in pairs(schemconvert.schem_table) do
|
||||||
|
|
||||||
|
local output_path = mod_path .. "/output/" .. name .. ".mts"
|
||||||
|
local input_lua_path = mod_path .. "/output/" .. name .. ".input.lua"
|
||||||
|
local output_lua_path = mod_path .. "/output/" .. name .. ".output.lua"
|
||||||
|
|
||||||
|
-- Write/display the original .lua schematic, if required
|
||||||
|
if write_converted_lua_flag then
|
||||||
|
save_lua(schem_table, input_lua_path)
|
||||||
|
end
|
||||||
|
if show_original_lua_flag then
|
||||||
|
print_table(schem_table, S("Contents of schematic @1", name))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Convert old nodes to new
|
||||||
|
convert_nodes(schem_table)
|
||||||
|
|
||||||
|
-- Save the converted .mts file
|
||||||
|
if do_convert_flag then
|
||||||
|
|
||||||
|
if not save_mts(schem_table, output_path) then
|
||||||
|
error_count = error_count + 1
|
||||||
|
else
|
||||||
|
schem_count = schem_count + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Write/display the converted .mts file as lua, if required
|
||||||
|
if write_converted_lua_flag then
|
||||||
|
save_lua(schem_table, output_lua_path)
|
||||||
|
end
|
||||||
|
if show_converted_lua_flag then
|
||||||
|
print_table(schem_table, S("Contents of schematic @1", name))
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
-- Show results
|
||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
show_info(S("Number of .mts files converted: @1", mts_count))
|
||||||
|
show_info(S("Number of Lua schematics converted: @1", schem_count))
|
||||||
show_info(S("Number of conversion errors: @1", error_count))
|
show_info(S("Number of conversion errors: @1", error_count))
|
||||||
|
|
||||||
if show_summary_flag then
|
if show_summary_flag then
|
||||||
|
33
schematics.lua
Normal file
33
schematics.lua
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
-- schemconvert mod by A S Lewis
|
||||||
|
-- Lieence: LGPL 2.1
|
||||||
|
---------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- You can add LUA schematics to this file
|
||||||
|
-- They will be processed together with the .mts files loaded from ../input
|
||||||
|
--
|
||||||
|
-- For some examples of LUA schematics, see the schematic_tables.txt file in minetest-game
|
||||||
|
--
|
||||||
|
-- Each LUA schematic should be added with a function call in the usual format:
|
||||||
|
--
|
||||||
|
-- schemconvert.add_schem("apple_tree", {
|
||||||
|
-- size = {x = 7, y = 8, z = 7},
|
||||||
|
-- data = {
|
||||||
|
-- _, _, _, _, _, _, _,
|
||||||
|
-- _, _, _, _, _, _, _,
|
||||||
|
-- _, _, _, _, _, _, _,
|
||||||
|
-- -- ...and so on
|
||||||
|
-- },
|
||||||
|
-- })
|
||||||
|
--
|
||||||
|
-- You could also write to the table directly, if you prefer:
|
||||||
|
--
|
||||||
|
-- schemconvert.schem_table["apple_tree"] = {
|
||||||
|
-- size = {x = 7, y = 8, z = 7},
|
||||||
|
-- data = {
|
||||||
|
-- _, _, _, _, _, _, _,
|
||||||
|
-- _, _, _, _, _, _, _,
|
||||||
|
-- _, _, _, _, _, _, _,
|
||||||
|
-- -- ...and so on
|
||||||
|
-- },
|
||||||
|
-- })
|
BIN
screenshot.png
BIN
screenshot.png
Binary file not shown.
Before Width: | Height: | Size: 362 KiB After Width: | Height: | Size: 1.1 MiB |
Loading…
x
Reference in New Issue
Block a user