mirror of
git://repo.or.cz/minetest_schemedit.git
synced 2025-07-05 01:20:23 +02:00
Compare commits
51 Commits
Author | SHA1 | Date | |
---|---|---|---|
3b22a19e60 | |||
cd21509a01 | |||
148505fd2f | |||
bdd44a6871 | |||
cfbf62913d | |||
ad6bf63f3b | |||
433878a938 | |||
e9ad4bcf00 | |||
329f394499 | |||
f0c5c2659f | |||
cd808777c8 | |||
0240a09800 | |||
6f8a575786 | |||
cb1e33485e | |||
8e0794217d | |||
b8e5c5cda7 | |||
e19d5e0bfa | |||
b6e4d2f7f0 | |||
abfd913862 | |||
01a3a970d2 | |||
e389fcc041 | |||
05ca8d90be | |||
84d6dc3c69 | |||
fedc4c51fa | |||
4199f645f3 | |||
a639c2b9c0 | |||
7f279bbd7a | |||
54aa7f35df | |||
bbed49e365 | |||
5cf551dccd | |||
b8cbb66d83 | |||
a6cf015631 | |||
5aba3aada8 | |||
3c7c208dcb | |||
0fc0180a04 | |||
2c8e6fae3e | |||
cdcda91fd6 | |||
1d53577085 | |||
59cf898ddc | |||
02acad209b | |||
fee142eab2 | |||
9cb700327a | |||
476f62c286 | |||
d7363f470d | |||
713deec575 | |||
442329d886 | |||
f4470596dc | |||
27c0c2764c | |||
7797aa8de6 | |||
ab122a1692 | |||
16950a773d |
2
LICENSE
2
LICENSE
@ -1,5 +1,5 @@
|
||||
MIT License
|
||||
Copyright (c) 2017 Elijah Duffy
|
||||
Copyright (c) 2017-2020 Elijah Duffy and Wuzzy
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
|
26
README.md
26
README.md
@ -1,25 +1,39 @@
|
||||
# Schematic Editor [`schemedit`]
|
||||
|
||||
## Version
|
||||
1.1.0
|
||||
1.4.2
|
||||
|
||||
## Description
|
||||
This is a mod which allows you to edit and export schematics (`.mts` files).
|
||||
|
||||
It supports node porbabilities, forced node placement and slice probabilities.
|
||||
This mod works in Minetest 5.0.0 or later, but recommended is version 5.1.0
|
||||
or later.
|
||||
|
||||
It supports node probabilities, forced node placement and slice probabilities.
|
||||
|
||||
It adds 3 items:
|
||||
|
||||
* Schematic Creator: Used to mark a region and export it as schematic
|
||||
* Schematic Creator: Used to mark a region and export or import it as schematic
|
||||
* Schematic Void: Marks a position in a schematic which should not replace anything when placed as a schematic
|
||||
* Schematic Node Probability Tool: Set per-node probabilities and forced node placement
|
||||
|
||||
It also adds the server command `placeschem` to place a schematic.
|
||||
Note: The import feature requires Minetest 5.1.0 or later.
|
||||
|
||||
It also adds these server commands:
|
||||
|
||||
* `placeschem` to place a schematic
|
||||
* `mts2lua` to convert .mts files to .lua files (Lua code)
|
||||
|
||||
There's also a setting `schemedit_export_lua` to enable automatic export to .lua files.
|
||||
|
||||
## Usage help
|
||||
Usage help can be found when you use the optional Help modpack (mods `doc` and `doc_items`).
|
||||
This mod assumes you already have a basic understanding about how schematics in Minetest work.
|
||||
If not, refer to the Minetest Lua API documentation to understand more about schematics.
|
||||
|
||||
You should also refer to the Minetest Lua API documentation to understand more about schematics.
|
||||
To learn how to use all the items in this mod, read `USAGE.md`.
|
||||
|
||||
You can also find the same help texts in-game if you if you use the optional Help modpack
|
||||
(mods `doc` and `doc_items`).
|
||||
|
||||
## License of everything
|
||||
MIT License
|
||||
|
44
USAGE.md
Normal file
44
USAGE.md
Normal file
@ -0,0 +1,44 @@
|
||||
## Usage help
|
||||
In this section you'll learn how to use the items of this mod.
|
||||
Note: If you have the `doc` and `doc_items` mods installed, you can also access the same help texts in-game (possibly translated).
|
||||
|
||||
### Schematic Creator
|
||||
The schematic creator is used to save a region of the world into a schematic file (.mts).
|
||||
|
||||
#### Usage
|
||||
To get started, place the block facing directly in front of any bottom left corner of the structure you want to save. This block can only be accessed by the placer or by anyone with the “`schematic_override`” privilege.
|
||||
To save a region, use the block, enter the size and a schematic name and hit “Export schematic”. The file will always be saved in the world directory. Note you can use this name in the /placeschem command to place the schematic again.
|
||||
|
||||
Importing a schematic will load a schematic from the world directory, place it in front of the schematic creator and sets probability and force-place data accordingly.
|
||||
The other features of the schematic creator are optional and are used to allow to add randomness and fine-tuning.
|
||||
|
||||
Y slices are used to remove entire slices based on chance. For each slice of the schematic region along the Y axis, you can specify that it occurs only with a certain chance. In the Y slice tab, you have to specify the Y slice height (0 = bottom) and a probability from 0 to 255 (255 is for 100%). By default, all Y slices occur always.
|
||||
|
||||
With a schematic node probability tool, you can set a probability for each node and enable them to overwrite all nodes when placed as schematic. This tool must be used prior to the file export.
|
||||
|
||||
|
||||
### Schematic Node Probability Tool
|
||||
This is an advanced tool which only makes sense when used together with a schematic creator. It is used to finetune the way how nodes from a schematic are placed.
|
||||
It allows you to set two things:
|
||||
1) Set probability: Chance for any particular node to be actually placed (default: always placed)
|
||||
2) Enable force placement: These nodes replace node other than air and ignore when placed in a schematic (default: off)
|
||||
|
||||
#### Usage
|
||||
|
||||
BASIC USAGE:
|
||||
Punch to configure the tool. Select a probability (0-255; 255 is for 100%) and enable or disable force placement. Now place the tool on any node to apply these values to the node. This information is preserved in the node until it is destroyed or changed by the tool again. This tool has no effect on schematic voids.
|
||||
Now you can use a schematic creator to save a region as usual, the nodes will now be saved with the special node settings applied.
|
||||
|
||||
NODE HUD:
|
||||
To help you remember the node values, the nodes with special values are labelled in the HUD. The first line shows probability and force placement (with “[F]”). The second line is the current distance to the node. Nodes with default settings and schematic voids are not labelled.
|
||||
To disable the node HUD, unselect the tool or hit “place” while not pointing anything.
|
||||
|
||||
UPDATING THE NODE HUD:
|
||||
The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simultaneously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big.
|
||||
|
||||
|
||||
### Schematic Void
|
||||
This is an utility block used in the creation of schematic files. It should be used together with a schematic creator. When saving a schematic, all nodes with a schematic void will be left unchanged when the schematic is placed again. Technically, this is equivalent to a block with the node probability set to 0.
|
||||
|
||||
#### Usage
|
||||
Just place the schematic void like any other block and use the schematic creator to save a portion of the world.
|
467
init.lua
467
init.lua
@ -3,10 +3,11 @@ local F = minetest.formspec_escape
|
||||
|
||||
local schemedit = {}
|
||||
|
||||
-- Directory delimeter fallback (normally comes from builtin)
|
||||
if not DIR_DELIM then
|
||||
DIR_DELIM = "/"
|
||||
end
|
||||
local DIR_DELIM = "/"
|
||||
|
||||
-- Set to true to enable `make_schemedit_readme` command
|
||||
local MAKE_README = false
|
||||
|
||||
local export_path_full = table.concat({minetest.get_worldpath(), "schems"}, DIR_DELIM)
|
||||
|
||||
-- truncated export path so the server directory structure is not exposed publicly
|
||||
@ -15,6 +16,8 @@ local export_path_trunc = table.concat({S("<world path>"), "schems"}, DIR_DELIM)
|
||||
local text_color = "#D79E9E"
|
||||
local text_color_number = 0xD79E9E
|
||||
|
||||
local can_import = minetest.read_schematic ~= nil
|
||||
|
||||
schemedit.markers = {}
|
||||
|
||||
-- [local function] Renumber table
|
||||
@ -26,6 +29,38 @@ local function renumber(t)
|
||||
return res
|
||||
end
|
||||
|
||||
local NEEDED_PRIV = "server"
|
||||
local function check_priv(player_name, quit)
|
||||
local privs = minetest.get_player_privs(player_name)
|
||||
if privs[NEEDED_PRIV] then
|
||||
return true
|
||||
else
|
||||
if not quit then
|
||||
minetest.chat_send_player(player_name, minetest.colorize("red",
|
||||
S("Insufficient privileges! You need the “@1” privilege to use this.", NEEDED_PRIV)))
|
||||
end
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
-- Lua export
|
||||
local export_schematic_to_lua
|
||||
if can_import then
|
||||
export_schematic_to_lua = function(schematic, filepath, options)
|
||||
if not options then options = {} end
|
||||
local str = minetest.serialize_schematic(schematic, "lua", options)
|
||||
local file = io.open(filepath, "w")
|
||||
if file and str then
|
||||
file:write(str)
|
||||
file:flush()
|
||||
file:close()
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---
|
||||
--- Formspec API
|
||||
---
|
||||
@ -110,7 +145,8 @@ function schemedit.show_formspec(pos, player, tab, show, ...)
|
||||
|
||||
-- Update player attribute
|
||||
if forms[tab].cache_name ~= false then
|
||||
player:set_attribute("schemedit:tab", tab)
|
||||
local pmeta = player:get_meta()
|
||||
pmeta:set_string("schemedit:tab", tab)
|
||||
end
|
||||
else
|
||||
minetest.close_formspec(pname, "schemedit:"..tab)
|
||||
@ -231,7 +267,10 @@ end
|
||||
---
|
||||
--- Formspec Tabs
|
||||
---
|
||||
|
||||
local import_btn = ""
|
||||
if can_import then
|
||||
import_btn = "button[0.5,2.5;6,1;import;"..F(S("Import schematic")).."]"
|
||||
end
|
||||
schemedit.add_form("main", {
|
||||
tab = true,
|
||||
caption = S("Main"),
|
||||
@ -247,27 +286,36 @@ schemedit.add_form("main", {
|
||||
border_button = "button[3.5,7.5;3,1;border;"..F(S("Show border")).."]"
|
||||
end
|
||||
|
||||
-- TODO: Show information regarding volume, pos1, pos2, etc... in formspec
|
||||
local xs, ys, zs = meta.x_size or 1, meta.y_size or 1, meta.z_size or 1
|
||||
local size = {x=xs, y=ys, z=zs}
|
||||
local schem_name = meta.schem_name or ""
|
||||
|
||||
local form = [[
|
||||
size[7,8]
|
||||
label[0.5,-0.1;]]..F(S("Position: @1", strpos))..[[]
|
||||
label[3,-0.1;]]..F(S("Owner: @1", name))..[[]
|
||||
label[0.5,0.4;]]..F(S("Schematic name: @1", F(schem_name)))..[[]
|
||||
label[0.5,0.9;]]..F(S("Size: @1", minetest.pos_to_string(size)))..[[]
|
||||
|
||||
field[0.8,1;5,1;name;]]..F(S("Schematic name:"))..[[;]]..F(meta.schem_name or "")..[[]
|
||||
button[5.3,0.69;1.2,1;save_name;]]..F(S("Save"))..[[]
|
||||
field[0.8,2;5,1;name;]]..F(S("Schematic name:"))..[[;]]..F(schem_name or "")..[[]
|
||||
button[5.3,1.69;1.2,1;save_name;]]..F(S("OK"))..[[]
|
||||
tooltip[save_name;]]..F(S("Save schematic name"))..[[]
|
||||
field_close_on_enter[name;false]
|
||||
|
||||
button[0.5,1.5;6,1;export;]]..F(S("Export schematic"))..[[]
|
||||
textarea[0.8,2.5;6.2,5;;]]..F(S("The schematic will be exported as a .mts file and stored in\n@1",
|
||||
export_path_trunc .. DIR_DELIM .. "<name>.mts."))..[[;]
|
||||
field[0.8,7;2,1;x;]]..F(S("X size:"))..[[;]]..meta.x_size..[[]
|
||||
field[2.8,7;2,1;y;]]..F(S("Y size:"))..[[;]]..meta.y_size..[[]
|
||||
field[4.8,7;2,1;z;]]..F(S("Z size:"))..[[;]]..meta.z_size..[[]
|
||||
button[0.5,3.5;6,1;export;]]..F(S("Export schematic")).."]"..
|
||||
import_btn..[[
|
||||
textarea[0.8,4.5;6.2,1;;]]..F(S("Export/import path:\n@1",
|
||||
export_path_trunc .. DIR_DELIM .. F(S("<name>"))..".mts"))..[[;]
|
||||
button[0.5,5.5;3,1;air2void;]]..F(S("Air to voids"))..[[]
|
||||
button[3.5,5.5;3,1;void2air;]]..F(S("Voids to air"))..[[]
|
||||
tooltip[air2void;]]..F(S("Turn all air nodes into schematic void nodes"))..[[]
|
||||
tooltip[void2air;]]..F(S("Turn all schematic void nodes into air nodes"))..[[]
|
||||
field[0.8,7;2,1;x;]]..F(S("X size:"))..[[;]]..xs..[[]
|
||||
field[2.8,7;2,1;y;]]..F(S("Y size:"))..[[;]]..ys..[[]
|
||||
field[4.8,7;2,1;z;]]..F(S("Z size:"))..[[;]]..zs..[[]
|
||||
field_close_on_enter[x;false]
|
||||
field_close_on_enter[y;false]
|
||||
field_close_on_enter[z;false]
|
||||
|
||||
button[0.5,7.5;3,1;save;]]..F(S("Save size"))..[[]
|
||||
]]..
|
||||
border_button
|
||||
@ -278,12 +326,56 @@ schemedit.add_form("main", {
|
||||
return form
|
||||
end,
|
||||
handle = function(self, pos, name, fields)
|
||||
if fields.doc then
|
||||
doc.show_entry(name, "nodes", "schemedit:creator", true)
|
||||
return
|
||||
end
|
||||
|
||||
if not check_priv(name, fields.quit) then
|
||||
return
|
||||
end
|
||||
|
||||
local realmeta = minetest.get_meta(pos)
|
||||
local meta = realmeta:to_table().fields
|
||||
local hashpos = minetest.hash_node_position(pos)
|
||||
|
||||
if fields.doc then
|
||||
doc.show_entry(name, "nodes", "schemedit:creator", true)
|
||||
-- Save size vector values
|
||||
if (fields.x and fields.x ~= "") then
|
||||
local x = tonumber(fields.x)
|
||||
if x then
|
||||
meta.x_size = math.max(x, 1)
|
||||
end
|
||||
end
|
||||
if (fields.y and fields.y ~= "") then
|
||||
local y = tonumber(fields.y)
|
||||
if y then
|
||||
meta.y_size = math.max(y, 1)
|
||||
end
|
||||
end
|
||||
if (fields.z and fields.z ~= "") then
|
||||
local z = tonumber(fields.z)
|
||||
if z then
|
||||
meta.z_size = math.max(z, 1)
|
||||
end
|
||||
end
|
||||
|
||||
-- Save schematic name
|
||||
if fields.name then
|
||||
meta.schem_name = fields.name
|
||||
end
|
||||
|
||||
-- Node conversion
|
||||
if (fields.air2void) then
|
||||
local pos1, pos2 = schemedit.size(pos)
|
||||
pos1, pos2 = schemedit.sort_pos(pos1, pos2)
|
||||
local nodes = minetest.find_nodes_in_area(pos1, pos2, {"air"})
|
||||
minetest.bulk_set_node(nodes, {name="schemedit:void"})
|
||||
return
|
||||
elseif (fields.void2air) then
|
||||
local pos1, pos2 = schemedit.size(pos)
|
||||
pos1, pos2 = schemedit.sort_pos(pos1, pos2)
|
||||
local nodes = minetest.find_nodes_in_area(pos1, pos2, {"schemedit:void"})
|
||||
minetest.bulk_set_node(nodes, {name="air"})
|
||||
return
|
||||
end
|
||||
|
||||
@ -298,30 +390,6 @@ schemedit.add_form("main", {
|
||||
end
|
||||
end
|
||||
|
||||
-- Save size vector values
|
||||
if (fields.save or fields.key_enter_field == "x" or
|
||||
fields.key_enter_field == "y" or fields.key_enter_field == "z")
|
||||
and (fields.x and fields.y and fields.z and fields.x ~= ""
|
||||
and fields.y ~= "" and fields.z ~= "") then
|
||||
local x, y, z = tonumber(fields.x), tonumber(fields.y), tonumber(fields.z)
|
||||
|
||||
if x then
|
||||
meta.x_size = math.max(x, 1)
|
||||
end
|
||||
if y then
|
||||
meta.y_size = math.max(y, 1)
|
||||
end
|
||||
if z then
|
||||
meta.z_size = math.max(z, 1)
|
||||
end
|
||||
end
|
||||
|
||||
-- Save schematic name
|
||||
if fields.save_name or fields.key_enter_field == "name" and fields.name and
|
||||
fields.name ~= "" then
|
||||
meta.schem_name = fields.name
|
||||
end
|
||||
|
||||
-- Export schematic
|
||||
if fields.export and meta.schem_name and meta.schem_name ~= "" then
|
||||
local pos1, pos2 = schemedit.size(pos)
|
||||
@ -358,12 +426,106 @@ schemedit.add_form("main", {
|
||||
if res then
|
||||
minetest.chat_send_player(name, minetest.colorize("#00ff00",
|
||||
S("Exported schematic to @1", filepath)))
|
||||
-- Additional export to Lua file if MTS export was successful
|
||||
local schematic = minetest.read_schematic(filepath, {})
|
||||
if schematic and minetest.settings:get_bool("schemedit_export_lua") then
|
||||
local filepath_lua = path..meta.schem_name..".lua"
|
||||
res = export_schematic_to_lua(schematic, filepath_lua)
|
||||
if res then
|
||||
minetest.chat_send_player(name, minetest.colorize("#00ff00",
|
||||
S("Exported schematic to @1", filepath_lua)))
|
||||
end
|
||||
end
|
||||
else
|
||||
minetest.chat_send_player(name, minetest.colorize("red",
|
||||
S("Failed to export schematic to @1", filepath)))
|
||||
end
|
||||
end
|
||||
|
||||
-- Import schematic
|
||||
if fields.import and meta.schem_name and meta.schem_name ~= "" then
|
||||
if not can_import then
|
||||
return
|
||||
end
|
||||
local pos1
|
||||
local node = minetest.get_node(pos)
|
||||
local path = export_path_full .. DIR_DELIM
|
||||
|
||||
local filepath = path..meta.schem_name..".mts"
|
||||
local schematic = minetest.read_schematic(filepath, {write_yslice_prob="low"})
|
||||
local success = false
|
||||
|
||||
if schematic then
|
||||
meta.x_size = schematic.size.x
|
||||
meta.y_size = schematic.size.y
|
||||
meta.z_size = schematic.size.z
|
||||
meta.slices = minetest.serialize(renumber(schematic.yslice_prob))
|
||||
local special_x_size = meta.x_size
|
||||
local special_y_size = meta.y_size
|
||||
local special_z_size = meta.z_size
|
||||
|
||||
if node.param2 == 1 then
|
||||
pos1 = vector.add(pos, {x=1,y=0,z=-meta.z_size+1})
|
||||
meta.x_size, meta.z_size = meta.z_size, meta.x_size
|
||||
elseif node.param2 == 2 then
|
||||
pos1 = vector.add(pos, {x=-meta.x_size+1,y=0,z=-meta.z_size})
|
||||
elseif node.param2 == 3 then
|
||||
pos1 = vector.add(pos, {x=-meta.x_size,y=0,z=0})
|
||||
meta.x_size, meta.z_size = meta.z_size, meta.x_size
|
||||
else
|
||||
pos1 = vector.add(pos, {x=0,y=0,z=1})
|
||||
end
|
||||
|
||||
local schematic_for_meta = table.copy(schematic)
|
||||
-- Strip probability data for placement
|
||||
schematic.yslice_prob = {}
|
||||
for d=1, #schematic.data do
|
||||
schematic.data[d].prob = nil
|
||||
end
|
||||
|
||||
-- Place schematic
|
||||
success = minetest.place_schematic(pos1, schematic, "0", nil, true)
|
||||
|
||||
-- Add special schematic data to nodes
|
||||
if success then
|
||||
local d = 1
|
||||
for z=0, special_z_size-1 do
|
||||
for y=0, special_y_size-1 do
|
||||
for x=0, special_x_size-1 do
|
||||
local data = schematic_for_meta.data[d]
|
||||
local pp = {x=pos1.x+x, y=pos1.y+y, z=pos1.z+z}
|
||||
if data.prob == 0 then
|
||||
minetest.set_node(pp, {name="schemedit:void"})
|
||||
else
|
||||
local meta = minetest.get_meta(pp)
|
||||
if data.prob and data.prob ~= 255 and data.prob ~= 254 then
|
||||
meta:set_string("schemedit_prob", tostring(data.prob))
|
||||
else
|
||||
meta:set_string("schemedit_prob", "")
|
||||
end
|
||||
if data.force_place then
|
||||
meta:set_string("schemedit_force_place", "true")
|
||||
else
|
||||
meta:set_string("schemedit_force_place", "")
|
||||
end
|
||||
end
|
||||
d = d + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if success then
|
||||
minetest.chat_send_player(name, minetest.colorize("#00ff00",
|
||||
S("Imported schematic from @1", filepath)))
|
||||
else
|
||||
minetest.chat_send_player(name, minetest.colorize("red",
|
||||
S("Failed to import schematic from @1", filepath)))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- Save meta before updating visuals
|
||||
local inv = realmeta:get_inventory():get_lists()
|
||||
realmeta:from_table({fields = meta, inventory = inv})
|
||||
@ -403,17 +565,22 @@ schemedit.add_form("slice", {
|
||||
|
||||
if self.panel_add or self.panel_edit then
|
||||
local ypos_default, prob_default = "", ""
|
||||
local done_button = "button[5,7.18;2,1;done_add;"..F(S("Done")).."]"
|
||||
local done_button = "button[5,7.18;2,1;done_add;"..F(S("Add")).."]"
|
||||
if self.panel_edit then
|
||||
done_button = "button[5,7.18;2,1;done_edit;"..F(S("Done")).."]"
|
||||
done_button = "button[5,7.18;2,1;done_edit;"..F(S("Apply")).."]"
|
||||
if slice_list[self.selected] then
|
||||
ypos_default = slice_list[self.selected].ypos
|
||||
prob_default = slice_list[self.selected].prob
|
||||
end
|
||||
end
|
||||
|
||||
local field_ypos = ""
|
||||
if self.panel_add then
|
||||
field_ypos = "field[0.3,7.5;2.5,1;ypos;"..F(S("Y position (max. @1):", (meta.y_size - 1)))..";"..ypos_default.."]"
|
||||
end
|
||||
|
||||
form = form..[[
|
||||
field[0.3,7.5;2.5,1;ypos;]]..F(S("Y position (max. @1):", (meta.y_size - 1)))..[[;]]..ypos_default..[[]
|
||||
]]..field_ypos..[[
|
||||
field[2.8,7.5;2.5,1;prob;]]..F(S("Probability (0-255):"))..[[;]]..prob_default..[[]
|
||||
field_close_on_enter[ypos;false]
|
||||
field_close_on_enter[prob;false]
|
||||
@ -421,19 +588,22 @@ schemedit.add_form("slice", {
|
||||
end
|
||||
|
||||
if not self.panel_edit then
|
||||
form = form.."button[0,6;2,1;add;"..F(S("+ Add slice")).."]"
|
||||
if self.panel_add then
|
||||
form = form.."button[0,6;2.4,1;add;"..F(S("Cancel")).."]"
|
||||
else
|
||||
form = form.."button[0,6;2.4,1;add;"..F(S("Add slice")).."]"
|
||||
end
|
||||
end
|
||||
|
||||
if slices ~= "" and self.selected and not self.panel_add then
|
||||
if not self.panel_edit then
|
||||
form = form..[[
|
||||
button[2,6;2,1;remove;]]..F(S("- Remove slice"))..[[]
|
||||
button[4,6;2,1;edit;]]..F(S("+/- Edit slice"))..[[]
|
||||
button[2.4,6;2.4,1;remove;]]..F(S("Remove slice"))..[[]
|
||||
button[4.8,6;2.4,1;edit;]]..F(S("Edit slice"))..[[]
|
||||
]]
|
||||
else
|
||||
form = form..[[
|
||||
button[2,6;2,1;remove;]]..F(S("- Remove slice"))..[[]
|
||||
button[4,6;2,1;edit;]]..F(S("+/- Edit slice"))..[[]
|
||||
button[4.8,6;2.4,1;edit;]]..F(S("Back"))..[[]
|
||||
]]
|
||||
end
|
||||
end
|
||||
@ -441,6 +611,10 @@ schemedit.add_form("slice", {
|
||||
return form
|
||||
end,
|
||||
handle = function(self, pos, name, fields)
|
||||
if not check_priv(name, fields.quit) then
|
||||
return
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
|
||||
@ -460,8 +634,10 @@ schemedit.add_form("slice", {
|
||||
end
|
||||
|
||||
local ypos, prob = tonumber(fields.ypos), tonumber(fields.prob)
|
||||
if (fields.done_add or fields.done_edit) and fields.ypos and fields.prob and
|
||||
fields.ypos ~= "" and fields.prob ~= "" and ypos and prob and
|
||||
if fields.done_edit then
|
||||
ypos = 0
|
||||
end
|
||||
if (fields.done_add or fields.done_edit) and ypos and prob and
|
||||
ypos <= (meta:get_int("y_size") - 1) and prob >= 0 and prob <= 255 then
|
||||
local slice_list = minetest.deserialize(meta:get_string("slices"))
|
||||
local index = #slice_list + 1
|
||||
@ -469,7 +645,21 @@ schemedit.add_form("slice", {
|
||||
index = self.selected
|
||||
end
|
||||
|
||||
slice_list[index] = {ypos = ypos, prob = prob}
|
||||
local dupe = false
|
||||
if fields.done_add then
|
||||
for k,v in pairs(slice_list) do
|
||||
if v.ypos == ypos then
|
||||
v.prob = prob
|
||||
dupe = true
|
||||
end
|
||||
end
|
||||
end
|
||||
if fields.done_edit and slice_list[index] then
|
||||
ypos = slice_list[index].ypos
|
||||
end
|
||||
if not dupe then
|
||||
slice_list[index] = {ypos = ypos, prob = prob}
|
||||
end
|
||||
|
||||
meta:set_string("slices", minetest.serialize(slice_list))
|
||||
|
||||
@ -484,7 +674,7 @@ schemedit.add_form("slice", {
|
||||
meta:set_string("slices", minetest.serialize(renumber(slice_list)))
|
||||
|
||||
-- Update formspec
|
||||
self.selected = 1
|
||||
self.selected = math.max(1, self.selected-1)
|
||||
self.panel_edit = nil
|
||||
schemedit.show_formspec(pos, player, "slice")
|
||||
end
|
||||
@ -536,6 +726,10 @@ schemedit.add_form("probtool", {
|
||||
return form
|
||||
end,
|
||||
handle = function(self, pos, name, fields)
|
||||
if not check_priv(name, fields.quit) then
|
||||
return
|
||||
end
|
||||
|
||||
if fields.submit then
|
||||
local prob = tonumber(fields.prob)
|
||||
if prob then
|
||||
@ -651,7 +845,7 @@ function schemedit.mark(pos)
|
||||
local marker = minetest.add_entity({x = pos1.x + sizex - 0.5, y = pos1.y + sizey - 0.5, z = z + offset}, "schemedit:display")
|
||||
if marker ~= nil then
|
||||
marker:set_properties({
|
||||
visual_size={x=(sizex+0.01) * 2, y=sizey * 2},
|
||||
visual_size={x=(sizex+0.01) * 2, y=(sizey+0.01) * 2},
|
||||
})
|
||||
marker:get_luaentity().id = id
|
||||
marker:get_luaentity().owner = owner
|
||||
@ -672,9 +866,9 @@ function schemedit.mark(pos)
|
||||
local marker = minetest.add_entity({x = x + offset, y = pos1.y + sizey - 0.5, z = pos1.z + sizez - 0.5}, "schemedit:display")
|
||||
if marker ~= nil then
|
||||
marker:set_properties({
|
||||
visual_size={x=(sizez+0.01) * 2, y=sizey * 2},
|
||||
visual_size={x=(sizez+0.01) * 2, y=(sizey+0.01) * 2},
|
||||
})
|
||||
marker:set_yaw(math.pi / 2)
|
||||
marker:set_rotation({x=0, y=math.pi / 2, z=0})
|
||||
marker:get_luaentity().id = id
|
||||
marker:get_luaentity().owner = owner
|
||||
table.insert(m, marker)
|
||||
@ -682,6 +876,30 @@ function schemedit.mark(pos)
|
||||
low = false
|
||||
end
|
||||
|
||||
low = true
|
||||
-- XZ plane markers
|
||||
for _, y in ipairs({pos1.y - 0.5, pos2.y + 0.5}) do
|
||||
if low then
|
||||
offset = -0.01
|
||||
else
|
||||
offset = 0.01
|
||||
end
|
||||
|
||||
local marker = minetest.add_entity({x = pos1.x + sizex - 0.5, y = y + offset, z = pos1.z + sizez - 0.5}, "schemedit:display")
|
||||
if marker ~= nil then
|
||||
marker:set_properties({
|
||||
visual_size={x=(sizex+0.01) * 2, y=(sizez+0.01) * 2},
|
||||
})
|
||||
marker:set_rotation({x=math.pi/2, y=0, z=0})
|
||||
marker:get_luaentity().id = id
|
||||
marker:get_luaentity().owner = owner
|
||||
table.insert(m, marker)
|
||||
end
|
||||
low = false
|
||||
end
|
||||
|
||||
|
||||
|
||||
schemedit.markers[id] = m
|
||||
return true
|
||||
end
|
||||
@ -706,12 +924,12 @@ end
|
||||
-- Show probability and force_place status of a particular position for player in HUD.
|
||||
-- Probability is shown as a number followed by “[F]” if the node is force-placed.
|
||||
-- The distance to the node is also displayed below that. This can't be avoided and is
|
||||
-- and artifact of the waypoint HUD element. TODO: Hide displayed distance.
|
||||
-- and artifact of the waypoint HUD element.
|
||||
function schemedit.display_node_prob(player, pos, prob, force_place)
|
||||
local wpstring
|
||||
if prob and force_place == true then
|
||||
wpstring = string.format("%d [F]", prob)
|
||||
elseif prob then
|
||||
wpstring = string.format("%s [F]", prob)
|
||||
elseif prob and type(tonumber(prob)) == "number" then
|
||||
wpstring = prob
|
||||
elseif force_place == true then
|
||||
wpstring = "[F]"
|
||||
@ -720,6 +938,7 @@ function schemedit.display_node_prob(player, pos, prob, force_place)
|
||||
return player:hud_add({
|
||||
hud_elem_type = "waypoint",
|
||||
name = wpstring,
|
||||
precision = 0,
|
||||
text = "m", -- For the distance artifact
|
||||
number = text_color_number,
|
||||
world_pos = pos,
|
||||
@ -756,7 +975,7 @@ function schemedit.display_node_probs_region(player, pos1, pos2)
|
||||
|
||||
local prob, force_place
|
||||
local meta = minetest.get_meta(checkpos)
|
||||
prob = tonumber(meta:get_string("schemedit_prob"))
|
||||
prob = meta:get_string("schemedit_prob")
|
||||
force_place = meta:get_string("schemedit_force_place") == "true"
|
||||
local hud_id = schemedit.display_node_prob(player, checkpos, prob, force_place)
|
||||
if hud_id then
|
||||
@ -822,12 +1041,18 @@ minetest.register_privilege("schematic_override", {
|
||||
give_to_singleplayer = false,
|
||||
})
|
||||
|
||||
local help_import = ""
|
||||
if can_import then
|
||||
help_import = S("Importing a schematic will load a schematic from the world directory, place it in front of the schematic creator and sets probability and force-place data accordingly.").."\n"
|
||||
end
|
||||
|
||||
-- [node] Schematic creator
|
||||
minetest.register_node("schemedit:creator", {
|
||||
description = S("Schematic Creator"),
|
||||
_doc_items_longdesc = S("The schematic creator is used to save a region of the world into a schematic file (.mts)."),
|
||||
_doc_items_usagehelp = S("To get started, place the block facing directly in front of any bottom left corner of the structure you want to save. This block can only be accessed by the placer or by anyone with the “schematic_override” privilege.").."\n"..
|
||||
S("To save a region, use the block, enter the size and a schematic name and hit “Export schematic”. The file will always be saved in the world directory. Note you can use this name in the /placeschem command to place the schematic again.").."\n\n"..
|
||||
help_import..
|
||||
S("The other features of the schematic creator are optional and are used to allow to add randomness and fine-tuning.").."\n\n"..
|
||||
S("Y slices are used to remove entire slices based on chance. For each slice of the schematic region along the Y axis, you can specify that it occurs only with a certain chance. In the Y slice tab, you have to specify the Y slice height (0 = bottom) and a probability from 0 to 255 (255 is for 100%). By default, all Y slices occur always.").."\n\n"..
|
||||
S("With a schematic node probability tool, you can set a probability for each node and enable them to overwrite all nodes when placed as schematic. This tool must be used prior to the file export."),
|
||||
@ -872,7 +1097,8 @@ S("With a schematic node probability tool, you can set a probability for each no
|
||||
if meta:get_string("owner") == name or
|
||||
minetest.check_player_privs(player, "schematic_override") == true then
|
||||
-- Get player attribute
|
||||
local tab = player:get_attribute("schemedit:tab")
|
||||
local pmeta = player:get_meta()
|
||||
local tab = pmeta:get_string("schemedit:tab")
|
||||
if not forms[tab] or not tab then
|
||||
tab = "main"
|
||||
end
|
||||
@ -883,6 +1109,9 @@ S("With a schematic node probability tool, you can set a probability for each no
|
||||
after_destruct = function(pos)
|
||||
schemedit.unmark(pos)
|
||||
end,
|
||||
|
||||
-- No support for Minetest Game's screwdriver
|
||||
on_rotate = false,
|
||||
})
|
||||
|
||||
minetest.register_tool("schemedit:probtool", {
|
||||
@ -900,12 +1129,17 @@ S("NODE HUD:").."\n"..
|
||||
S("To help you remember the node values, the nodes with special values are labelled in the HUD. The first line shows probability and force placement (with “[F]”). The second line is the current distance to the node. Nodes with default settings and schematic voids are not labelled.").."\n"..
|
||||
S("To disable the node HUD, unselect the tool or hit “place” while not pointing anything.").."\n\n"..
|
||||
S("UPDATING THE NODE HUD:").."\n"..
|
||||
S("The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simutanously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big."),
|
||||
S("The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simultaneously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big."),
|
||||
wield_image = "schemedit_probtool.png",
|
||||
inventory_image = "schemedit_probtool.png",
|
||||
liquids_pointable = true,
|
||||
groups = { disable_repair = 1 },
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
local uname = user:get_player_name()
|
||||
if uname and not check_priv(uname) then
|
||||
return
|
||||
end
|
||||
|
||||
local ctrl = user:get_player_control()
|
||||
-- Simple use
|
||||
if not ctrl.sneak then
|
||||
@ -920,7 +1154,7 @@ S("The node HUD is not updated automatically and may be outdated. The node HUD o
|
||||
-- within the creator's region.
|
||||
local use_creator_region = false
|
||||
if pointed_thing and pointed_thing.type == "node" and pointed_thing.under then
|
||||
punchpos = pointed_thing.under
|
||||
local punchpos = pointed_thing.under
|
||||
local node = minetest.get_node(punchpos)
|
||||
if node.name == "schemedit:creator" then
|
||||
local pos1, pos2 = schemedit.size(punchpos)
|
||||
@ -935,10 +1169,20 @@ S("The node HUD is not updated automatically and may be outdated. The node HUD o
|
||||
end
|
||||
end,
|
||||
on_secondary_use = function(itemstack, user, pointed_thing)
|
||||
local uname = user:get_player_name()
|
||||
if uname and not check_priv(uname) then
|
||||
return
|
||||
end
|
||||
|
||||
schemedit.clear_displayed_node_probs(user)
|
||||
end,
|
||||
-- Set note probability and force_place and enable node probability display
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local pname = placer:get_player_name()
|
||||
if pname and not check_priv(pname) then
|
||||
return
|
||||
end
|
||||
|
||||
-- Use pointed node's on_rightclick function first, if present
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
if placer and not placer:get_player_control().sneak then
|
||||
@ -978,11 +1222,19 @@ S("The node HUD is not updated automatically and may be outdated. The node HUD o
|
||||
end,
|
||||
})
|
||||
|
||||
local use_texture_alpha_void
|
||||
if minetest.features.use_texture_alpha_string_modes then
|
||||
use_texture_alpha_void = "clip"
|
||||
else
|
||||
use_texture_alpha_void = true
|
||||
end
|
||||
|
||||
minetest.register_node("schemedit:void", {
|
||||
description = S("Schematic Void"),
|
||||
_doc_items_longdesc = S("This is an utility block used in the creation of schematic files. It should be used together with a schematic creator. When saving a schematic, all nodes with a schematic void will be left unchanged when the schematic is placed again. Technically, this is equivalent to a block with the node probability set to 0."),
|
||||
_doc_items_usagehelp = S("Just place the schematic void like any other block and use the schematic creator to save a portion of the world."),
|
||||
tiles = { "schemedit_void.png" },
|
||||
use_texture_alpha = use_texture_alpha_void,
|
||||
drawtype = "nodebox",
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
@ -1004,6 +1256,7 @@ minetest.register_entity("schemedit:display", {
|
||||
visual_size = {x=10, y=10},
|
||||
pointable = false,
|
||||
physical = false,
|
||||
static_save = false,
|
||||
glow = minetest.LIGHT_MAX,
|
||||
|
||||
on_step = function(self, dtime)
|
||||
@ -1018,10 +1271,34 @@ minetest.register_entity("schemedit:display", {
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "Reset schematic creator border entities",
|
||||
name = "schemedit:reset_border",
|
||||
nodenames = "schemedit:creator",
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("schem_border", "false")
|
||||
end,
|
||||
})
|
||||
|
||||
local function add_suffix(schem)
|
||||
-- Automatically add file name suffix if omitted
|
||||
local schem_full, schem_lua
|
||||
if string.sub(schem, string.len(schem)-3, string.len(schem)) == ".mts" then
|
||||
schem_full = schem
|
||||
schem_lua = string.sub(schem, 1, -5) .. ".lua"
|
||||
else
|
||||
schem_full = schem .. ".mts"
|
||||
schem_lua = schem .. ".lua"
|
||||
end
|
||||
return schem_full, schem_lua
|
||||
end
|
||||
|
||||
-- [chatcommand] Place schematic
|
||||
minetest.register_chatcommand("placeschem", {
|
||||
description = S("Place schematic at the position specified or the current player position (loaded from @1)", export_path_trunc),
|
||||
privs = {debug = true},
|
||||
privs = {server = true},
|
||||
params = S("<schematic name>[.mts] [<x> <y> <z>]"),
|
||||
func = function(name, param)
|
||||
local schem, p = string.match(param, "^([^ ]+) *(.*)$")
|
||||
@ -1035,16 +1312,22 @@ minetest.register_chatcommand("placeschem", {
|
||||
pos = minetest.get_player_by_name(name):get_pos()
|
||||
end
|
||||
|
||||
-- Automatiically add file name suffix if omitted
|
||||
local schem_full
|
||||
if string.sub(schem, string.len(schem)-3, string.len(schem)) == ".mts" then
|
||||
schem_full = schem
|
||||
local schem_full, schem_lua = add_suffix(schem)
|
||||
local success = false
|
||||
local schem_path = export_path_full .. DIR_DELIM .. schem_full
|
||||
if minetest.read_schematic then
|
||||
-- We don't call minetest.place_schematic with the path name directly because
|
||||
-- this would trigger the caching and we wouldn't get any updates to the schematic
|
||||
-- files when we reload. minetest.read_schematic circumvents that.
|
||||
local schematic = minetest.read_schematic(schem_path, {})
|
||||
if schematic then
|
||||
success = minetest.place_schematic(pos, schematic, "random", nil, false)
|
||||
end
|
||||
else
|
||||
schem_full = schem .. ".mts"
|
||||
-- Legacy support for Minetest versions that do not have minetest.read_schematic
|
||||
success = minetest.place_schematic(schem_path, schematic, "random", nil, false)
|
||||
end
|
||||
|
||||
local success = minetest.place_schematic(pos, export_path_full .. DIR_DELIM .. schem_full, "random", nil, false)
|
||||
|
||||
if success == nil then
|
||||
return false, S("Schematic file could not be loaded!")
|
||||
else
|
||||
@ -1053,3 +1336,43 @@ minetest.register_chatcommand("placeschem", {
|
||||
end,
|
||||
})
|
||||
|
||||
if can_import then
|
||||
-- [chatcommand] Convert MTS schematic file to .lua file
|
||||
minetest.register_chatcommand("mts2lua", {
|
||||
description = S("Convert .mts schematic file to .lua file (loaded from @1)", export_path_trunc),
|
||||
privs = {server = true},
|
||||
params = S("<schematic name>[.mts] [comments]"),
|
||||
func = function(name, param)
|
||||
local schem, comments_str = string.match(param, "^([^ ]+) *(.*)$")
|
||||
|
||||
if not schem then
|
||||
return false, S("No schematic file specified.")
|
||||
end
|
||||
|
||||
local comments = comments_str == "comments"
|
||||
|
||||
-- Automatically add file name suffix if omitted
|
||||
local schem_full, schem_lua = add_suffix(schem)
|
||||
local schem_path = export_path_full .. DIR_DELIM .. schem_full
|
||||
local schematic = minetest.read_schematic(schem_path, {})
|
||||
|
||||
if schematic then
|
||||
local str = minetest.serialize_schematic(schematic, "lua", {lua_use_comments=comments})
|
||||
local lua_path = export_path_full .. DIR_DELIM .. schem_lua
|
||||
local file = io.open(lua_path, "w")
|
||||
if file and str then
|
||||
file:write(str)
|
||||
file:flush()
|
||||
file:close()
|
||||
return true, S("Exported schematic to @1", lua_path)
|
||||
else
|
||||
return false, S("Failed!")
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
if MAKE_README then
|
||||
dofile(minetest.get_modpath("schemedit")..DIR_DELIM.."make_readme.lua")
|
||||
end
|
||||
|
@ -1,36 +1,53 @@
|
||||
# textdomain: schemedit
|
||||
<world path>=<Weltpfad>
|
||||
Insufficient privileges! You need the “@1” privilege to use this.=Unzureichende Privilegien! Sie benötigen das „@1“-Privileg, um dies benutzen zu können.
|
||||
Probability: @1=Wahrscheinlichkeit: @1
|
||||
Not Set=Nicht gesetzt
|
||||
Force placement=Platzierung erzwingen
|
||||
Import schematic=Schematic importieren
|
||||
Main=Grundeinstellungen
|
||||
Hide border=Rand verbergen
|
||||
Show border=Rand anzeigen
|
||||
Position: @1=Position: @1
|
||||
Owner: @1=Eigentümer: @1
|
||||
Schematic name: @1=Schematic-Name: @1
|
||||
Size: @1=Größe: @1
|
||||
Schematic name:=Schematic-Name:
|
||||
Save=Speichern
|
||||
OK=OK
|
||||
Save schematic name=Schematic-Name speichern
|
||||
Export schematic=Schematic exportieren
|
||||
The schematic will be exported as a .mts file and stored in@n@1=Das Schematic wird als .mts-Datei gespeichert in:@n@1
|
||||
Export/import path:@n@1=Export-/Importpfad:@n@1
|
||||
<name>=<Name>
|
||||
Air to voids=Luft zu Lücken
|
||||
Voids to air=Lücken zu Luft
|
||||
Turn all air nodes into schematic void nodes=Alle Luft-Nodes zu Schematic-Lücken umwandeln
|
||||
Turn all schematic void nodes into air nodes=Alle Schematic-Lücken zu Luft-Nodes umwandeln
|
||||
X size:=X-Größe:
|
||||
Y size:=Y-Größe:
|
||||
Z size:=Z-Größe:
|
||||
Save size=Größe speichern
|
||||
Help=Hilfe
|
||||
Exported schematic to @1=Schematic nach @1 exportiert
|
||||
Failed to export schematic to @1=Schematic konnte nicht nach @1 exportiert werden
|
||||
Imported schematic from @1=Schematic von @1 importiert
|
||||
Failed to import schematic from @1=Schematic konnte nicht von @1 importiert werden
|
||||
Y Slices=Y-Scheiben
|
||||
Y @= @1; Probability @= @2=Y @= @1; Wahrscheinlichkeit @= @2
|
||||
Done=Fertig
|
||||
Add=Hinzufügen
|
||||
Apply=Anwenden
|
||||
Y position (max. @1):=Y-Position (max. @1):
|
||||
Probability (0-255):=Wahrscheinlichkeit (0-255):
|
||||
+ Add slice=+ Neue Scheibe
|
||||
+/- Edit slice=+/- Scheibe bearbeiten
|
||||
- Remove slice=- Scheibe entfernen
|
||||
Cancel=Abbrechen
|
||||
Add slice=Neue Scheibe
|
||||
Remove slice=Scheibe entfernen
|
||||
Edit slice=Scheibe anpassen
|
||||
Back=Zurück
|
||||
Schematic Node Probability Tool=Schematic-Node-Wahrscheinlichkeitswerkzeug
|
||||
Probability (0-255)=Wahrscheinlichkeit
|
||||
Cancel=Abbrechen
|
||||
Apply=Anwenden
|
||||
Probability that the node will be placed=Wahrscheinlichkeit, dass der Node platizert wird
|
||||
If enabled, the node will replace nodes other than air and ignore=Wenn aktiviert, wird der Node alle Nodes außer Luft und Ignorieren ersetzen
|
||||
Allows you to access schemedit nodes not owned by you=Damit können Sie auf Schemedit-Nodes, die ihnen nicht gehören, zugreifen
|
||||
Importing a schematic will load a schematic from the world directory, place it in front of the schematic creator and sets probability and force-place data accordingly.=Das Importieren eines Schematics wird eine Schematicdatei aus dem Weltverzeichnis laden, sie vor dem Schematic-Macher platzieren und die Wahrscheinlichkeits- und Zwangsplatzierungsdaten entsprechend setzen.
|
||||
Schematic Creator=Schematic-Macher
|
||||
The schematic creator is used to save a region of the world into a schematic file (.mts).=Der Schematic-Macher wird benutzt, um eine Region der Welt in eine Schematic-Datei (.mts) zu speichern.
|
||||
To get started, place the block facing directly in front of any bottom left corner of the structure you want to save. This block can only be accessed by the placer or by anyone with the “schematic_override” privilege.=Um anzufangen, platzieren Sie den Block direkt vor einer beliebigen unteren linken Ecke des Gebäudes, das Sie speichern möchten. Dieser Block kann nur vom Platzierer oder von Spielern mit dem „schematic_override“-Privileg benutzt werden.
|
||||
@ -50,7 +67,7 @@ NODE HUD:=NODE-HUD:
|
||||
To help you remember the node values, the nodes with special values are labelled in the HUD. The first line shows probability and force placement (with “[F]”). The second line is the current distance to the node. Nodes with default settings and schematic voids are not labelled.=Um Ihnen dabei zu helfen, sich die Node-Werte zu merken, werden die Nodes mit besonderen Werten in der Benutzeroberfläche gekennzeichnet. Die erste Zeile zeigt die Wahrscheinlichkeit und die Zwangsplatzierung (mit „[F]“) an. Die zweite Zeile zeigt die momentane Entfernung zum Node an. Nodes mit den Standardeinstellungen und Schematic-Lücken werden nicht gekennzeichnet.
|
||||
To disable the node HUD, unselect the tool or hit “place” while not pointing anything.=Um die Node-HUD zu deaktivieren, wählen Sie das Werkzeug ab oder drücken Sie die Platzierentaste, während Sie auf nichts zeigen.
|
||||
UPDATING THE NODE HUD:=NODE-HUD AKTUALISIEREN:
|
||||
The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simutanously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big.=Die Node-HUD wird nicht automatisch aktualisiert und kann veraltet sein. Die Node-HUD wird nur die HUD für Nodes in Ihrer Nähe aktualisieren oder wenn Sie das Werkzeug benutzen oder gleichzeitig die Schlag- und Schleichtaste drücken. Wenn Sie auf einen Schematic-Macher schleichschlagen, wird die Node-HUD für alle Nodes innerhalb der Region des Schematic-Machers aktualisiert, selbst, wenn diese Region sehr groß ist.
|
||||
The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simultaneously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big.=Die Node-HUD wird nicht automatisch aktualisiert und kann veraltet sein. Die Node-HUD wird nur die HUD für Nodes in Ihrer Nähe aktualisieren oder wenn Sie das Werkzeug benutzen oder gleichzeitig die Schlag- und Schleichtaste drücken. Wenn Sie auf einen Schematic-Macher schleichschlagen, wird die Node-HUD für alle Nodes innerhalb der Region des Schematic-Machers aktualisiert, selbst, wenn diese Region sehr groß ist.
|
||||
Schematic Void=Schematic-Lücke
|
||||
This is an utility block used in the creation of schematic files. It should be used together with a schematic creator. When saving a schematic, all nodes with a schematic void will be left unchanged when the schematic is placed again. Technically, this is equivalent to a block with the node probability set to 0.=Dies ist ein Hilfsblock, der bei der Erstellung von Schematic-Dateien benutzt wird. Er sollte zusammen mit einem Schematic-Macher benutzt werden. Wenn ein Schematic gespeichert wird, werden alle Nodes mit einer Schematic-Lücke unverändert gelassen, wenn das Schematic erneut platziert wird. Technisch gesehen ist dieses Verhalten identisch mit einem Block, der eine Node-Wahrscheinlichkeit von 0 hat.
|
||||
Just place the schematic void like any other block and use the schematic creator to save a portion of the world.=Platzieren Sie einfach die Schematic-Lücke wie jeden anderen Block und benutzen Sie den Schematic-Macher, um einen Teil der Welt zu speichern.
|
||||
@ -58,7 +75,6 @@ Place schematic at the position specified or the current player position (loaded
|
||||
<schematic name>[.mts] [<x> <y> <z>]=<Schematic-Name>[.mts] [<x> <y> <z>]
|
||||
No schematic file specified.=Keinen Schematic-Namen angegeben.
|
||||
Schematic file could not be loaded!=Schematic-Datei konnte nicht geladen werden!
|
||||
Main=Grundeinstellungen
|
||||
X size:=X-Größe:
|
||||
Y size:=Y-Größe:
|
||||
Z size:=Z-Größe:
|
||||
Convert .mts schematic file to .lua file (loaded from @1)=„.mts“-Schematicdatei zu „.lua“-Datei konvertieren (geladen von @1)
|
||||
<schematic name>[.mts] [comments]=<Schematic-Name>[.mts] [comments]
|
||||
Failed!=Fehlgeschlagen!
|
||||
|
@ -1,35 +1,53 @@
|
||||
# textdomain: schemedit
|
||||
<world path>=
|
||||
Not Set=
|
||||
Insufficient privileges! You need the “@1” privilege to use this.=
|
||||
Probability: @1=
|
||||
Not Set=
|
||||
Force placement=
|
||||
Import schematic=
|
||||
Main=
|
||||
Hide border=
|
||||
Show border=
|
||||
Position: @1=
|
||||
Owner: @1=
|
||||
Schematic name: @1=
|
||||
Size: @1=
|
||||
Schematic name:=
|
||||
Save=
|
||||
OK=
|
||||
Save schematic name=
|
||||
Export schematic=
|
||||
The schematic will be exported as a .mts file and stored in@n@1=
|
||||
Export/import path:@n@1=
|
||||
<name>=
|
||||
Air to voids=
|
||||
Voids to air=
|
||||
Turn all air nodes into schematic void nodes=
|
||||
Turn all schematic void nodes into air nodes=
|
||||
X size:=
|
||||
Y size:=
|
||||
Z size:=
|
||||
Save size=
|
||||
Help=
|
||||
Exported schematic to @1=
|
||||
Failed to export schematic to @1=
|
||||
Imported schematic from @1=
|
||||
Failed to import schematic from @1=
|
||||
Y Slices=
|
||||
Y @= @1; Probability @= @2=
|
||||
Done=
|
||||
Add=
|
||||
Apply=
|
||||
Y position (max. @1):=
|
||||
Probability (0-255):=
|
||||
+ Add slice=
|
||||
+/- Edit slice=
|
||||
Cancel=
|
||||
Add slice=
|
||||
Remove slice=
|
||||
Edit slice=
|
||||
Back=
|
||||
Schematic Node Probability Tool=
|
||||
Probability (0-255)=
|
||||
Cancel=
|
||||
Apply=
|
||||
Probability that the node will be placed=
|
||||
If enabled, the node will replace nodes other than air and ignore=
|
||||
Allows you to access schemedit nodes not owned by you=
|
||||
Importing a schematic will load a schematic from the world directory, place it in front of the schematic creator and sets probability and force-place data accordingly.=
|
||||
Schematic Creator=
|
||||
The schematic creator is used to save a region of the world into a schematic file (.mts).=
|
||||
To get started, place the block facing directly in front of any bottom left corner of the structure you want to save. This block can only be accessed by the placer or by anyone with the “schematic_override” privilege.=
|
||||
@ -49,7 +67,7 @@ NODE HUD:=
|
||||
To help you remember the node values, the nodes with special values are labelled in the HUD. The first line shows probability and force placement (with “[F]”). The second line is the current distance to the node. Nodes with default settings and schematic voids are not labelled.=
|
||||
To disable the node HUD, unselect the tool or hit “place” while not pointing anything.=
|
||||
UPDATING THE NODE HUD:=
|
||||
The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simutanously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big.=
|
||||
The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simultaneously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big.=
|
||||
Schematic Void=
|
||||
This is an utility block used in the creation of schematic files. It should be used together with a schematic creator. When saving a schematic, all nodes with a schematic void will be left unchanged when the schematic is placed again. Technically, this is equivalent to a block with the node probability set to 0.=
|
||||
Just place the schematic void like any other block and use the schematic creator to save a portion of the world.=
|
||||
@ -57,7 +75,6 @@ Place schematic at the position specified or the current player position (loaded
|
||||
<schematic name>[.mts] [<x> <y> <z>]=
|
||||
No schematic file specified.=
|
||||
Schematic file could not be loaded!=
|
||||
Main=
|
||||
X size:=
|
||||
Y size:=
|
||||
Z size:=
|
||||
Convert .mts schematic file to .lua file (loaded from @1)=
|
||||
<schematic name>[.mts] [comments]=
|
||||
Failed!=
|
||||
|
69
make_readme.lua
Normal file
69
make_readme.lua
Normal file
@ -0,0 +1,69 @@
|
||||
-- This file adds a command for generating the schemedit usage help readme
|
||||
-- file, in Markdown format. The text is extracted from the metadata of
|
||||
-- the items. This is only used for development purposes, after the
|
||||
-- help text of any of the items was changed.
|
||||
|
||||
-- How to use: Temporarily set MAKE_README to true in init.lua, then
|
||||
-- start the game as admin and run “/make_schemedit_readme”. Copy the
|
||||
-- generated file back to the mod directory (USAGE.md).
|
||||
|
||||
-- Everything here is intentionally NOT translated because it is for text
|
||||
-- files only.
|
||||
|
||||
|
||||
-- Extract text from item definition
|
||||
local get_text = function(item, field)
|
||||
local text = minetest.registered_items[item][field]
|
||||
|
||||
-- Remove translation escapes
|
||||
text = string.gsub(text, "\x1BE", "")
|
||||
text = string.gsub(text, "\x1B%(T@schemedit%)", "")
|
||||
|
||||
-- Fix Markdown syntax error
|
||||
text = string.gsub(text, "schematic_override", "`schematic_override`")
|
||||
return text
|
||||
end
|
||||
|
||||
|
||||
-- Schemedit items to generate the readme from
|
||||
local items = { "creator", "probtool", "void" }
|
||||
|
||||
minetest.register_chatcommand("make_schemedit_readme", {
|
||||
description = "Generate the schemedit usage help readme file",
|
||||
privs = {server=true},
|
||||
func = function(name, param)
|
||||
|
||||
local readme = "## Usage help".."\n"
|
||||
readme = readme .. "In this section you'll learn how to use the items of this mod.".."\n"
|
||||
readme = readme .. "Note: If you have the `doc` and `doc_items` mods installed, you can also access the same help texts in-game (possibly translated).".."\n\n"
|
||||
|
||||
local entries = {}
|
||||
for i=1, #items do
|
||||
local item = items[i]
|
||||
local desc = get_text("schemedit:"..item, "description")
|
||||
local longdesc = get_text("schemedit:"..item, "_doc_items_longdesc")
|
||||
local usagehelp = get_text("schemedit:"..item, "_doc_items_usagehelp")
|
||||
|
||||
readme = readme .. "### "..desc.."\n"
|
||||
readme = readme .. longdesc .."\n\n"
|
||||
readme = readme .. "#### Usage\n"
|
||||
readme = readme .. usagehelp
|
||||
if i < #items then
|
||||
readme = readme .. "\n\n\n"
|
||||
end
|
||||
end
|
||||
|
||||
local path = minetest.get_worldpath().."/schemedit_readme.md"
|
||||
local file = io.open(path, "w")
|
||||
if not file then
|
||||
return false, "Failed to open file!"
|
||||
end
|
||||
local ok = file:write(readme)
|
||||
file:close()
|
||||
if ok then
|
||||
return true, "File written to: "..path
|
||||
else
|
||||
return false, "Failed to write file!"
|
||||
end
|
||||
end
|
||||
})
|
3
settingtypes.txt
Normal file
3
settingtypes.txt
Normal file
@ -0,0 +1,3 @@
|
||||
# If enabled, exporting a schematic will also create a .lua file
|
||||
# in addition to the .mts file.
|
||||
schemedit_export_lua (.lua file schematic export) bool false
|
Reference in New Issue
Block a user