summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVanessa Dannenberg <vanessa.e.dannenberg@gmail.com>2018-08-03 09:31:05 -0400
committerVanessa Dannenberg <vanessa.e.dannenberg@gmail.com>2018-08-03 09:31:05 -0400
commit2fa93b219eadfcdcf8f1d472aad046fc62d5b99d (patch)
treecff2e96e78cd89aa965976553d2ff8989b5a02b5
parent76594f4bd5f825eaf1245965e2c0933bec47320d (diff)
downloaddreambuilder_modpack-2fa93b219eadfcdcf8f1d472aad046fc62d5b99d.tar
dreambuilder_modpack-2fa93b219eadfcdcf8f1d472aad046fc62d5b99d.tar.gz
dreambuilder_modpack-2fa93b219eadfcdcf8f1d472aad046fc62d5b99d.tar.bz2
dreambuilder_modpack-2fa93b219eadfcdcf8f1d472aad046fc62d5b99d.tar.xz
dreambuilder_modpack-2fa93b219eadfcdcf8f1d472aad046fc62d5b99d.zip
update castles, cottages, digistuff, gloopblocks, locks,
maptools, mesecons, pipeworks, technic, unified inventory, unified dyes, and xban2
-rw-r--r--anvil/README.md (renamed from anvil/README.txt)0
-rw-r--r--castle_farming/README.md (renamed from castle_farming/README.txt)11
-rw-r--r--castle_lighting/README.md (renamed from castle_lighting/README.txt)9
-rw-r--r--castle_masonry/README.md34
-rw-r--r--castle_masonry/README.txt43
-rw-r--r--castle_shields/README.md23
-rw-r--r--castle_shields/README.txt25
-rw-r--r--castle_tapestries/README.md (renamed from castle_tapestries/README.txt)8
-rw-r--r--cottages/depends.txt4
-rw-r--r--cottages/init.lua5
-rw-r--r--cottages/nodes_feldweg.lua2
-rw-r--r--cottages/nodes_furniture.lua10
-rw-r--r--cottages/nodes_historic.lua6
-rw-r--r--cottages/nodes_mining.lua2
-rw-r--r--cottages/nodes_roof.lua4
-rw-r--r--cottages/nodes_straw.lua6
-rw-r--r--cottages/screenshot.jpgbin0 -> 108827 bytes
-rw-r--r--digistuff/init.lua86
-rw-r--r--gloopblocks/crafts.lua12
-rw-r--r--locks/init.lua1226
-rw-r--r--locks/shared_locked_chest.lua275
-rw-r--r--maptools/default_nodes.lua40
-rw-r--r--maptools/init.lua5
-rw-r--r--maptools/nodes.lua27
-rw-r--r--maptools/tools.lua4
-rw-r--r--mesecons/oldwires.lua2
-rw-r--r--mesecons_button/init.lua2
-rw-r--r--mesecons_delayer/init.lua1
-rw-r--r--mesecons_extrawires/corner.lua2
-rw-r--r--mesecons_extrawires/crossover.lua4
-rw-r--r--mesecons_extrawires/tjunction.lua2
-rw-r--r--mesecons_extrawires/vertical.lua9
-rw-r--r--mesecons_hydroturbine/init.lua4
-rw-r--r--mesecons_insulated/init.lua2
-rw-r--r--mesecons_luacontroller/init.lua6
-rw-r--r--mesecons_microcontroller/init.lua14
-rw-r--r--mesecons_movestones/init.lua16
-rw-r--r--mesecons_pistons/init.lua2
-rw-r--r--mesecons_powerplant/init.lua2
-rw-r--r--mesecons_pressureplates/init.lua25
-rw-r--r--mesecons_receiver/init.lua7
-rw-r--r--mesecons_torch/init.lua4
-rw-r--r--mesecons_wires/init.lua1
-rw-r--r--moreblocks/redefinitions.lua5
-rw-r--r--moreblocks/stairsplus/registrations.lua4
-rw-r--r--pipeworks/common.lua131
-rw-r--r--pipeworks/filter-injector.lua8
-rw-r--r--pipeworks/item_transport.lua30
-rw-r--r--pipeworks/legacy.lua2
-rw-r--r--pipeworks/luaentity.lua38
-rw-r--r--pipeworks/vacuum_tubes.lua2
-rw-r--r--pipeworks/wielder.lua91
-rw-r--r--player_textures/textures/player_cheapie.pngbin679 -> 4814 bytes
-rw-r--r--ropes/LICENSE.md23
-rw-r--r--signs_lib/init.lua2
-rw-r--r--technic/doc/api.md7
-rw-r--r--technic/helpers.lua63
-rw-r--r--technic/machines/LV/cnc.lua2
-rw-r--r--technic/machines/LV/solar_panel.lua5
-rw-r--r--technic/machines/MV/tool_workshop.lua2
-rw-r--r--technic/machines/MV/wind_mill.lua3
-rw-r--r--technic/machines/other/constructor.lua4
-rw-r--r--technic/machines/other/injector.lua2
-rw-r--r--technic/machines/power_monitor.lua2
-rw-r--r--technic/machines/register/battery_box.lua5
-rw-r--r--technic/machines/register/generator.lua2
-rw-r--r--technic/machines/register/machine_base.lua2
-rw-r--r--technic/machines/register/solar_array.lua5
-rw-r--r--technic/machines/supply_converter.lua4
-rw-r--r--technic/machines/switching_station.lua6
-rw-r--r--technic_chests/common.lua4
-rw-r--r--technic_chests/init.lua8
-rw-r--r--technic_worldgen/oregen.lua17
-rw-r--r--unified_inventory/api.lua12
-rw-r--r--unified_inventory/bags.lua24
-rw-r--r--unified_inventory/init.lua25
-rw-r--r--unified_inventory/internal.lua58
-rw-r--r--unified_inventory/intllib.lua45
-rw-r--r--unified_inventory/locale/de.po366
-rw-r--r--unified_inventory/locale/de.txt98
-rw-r--r--unified_inventory/locale/es.po366
-rw-r--r--unified_inventory/locale/es.txt72
-rw-r--r--unified_inventory/locale/fr.po364
-rw-r--r--unified_inventory/locale/fr.txt69
-rw-r--r--unified_inventory/locale/ms.po369
-rw-r--r--unified_inventory/locale/pl.po359
-rw-r--r--unified_inventory/locale/pl.txt68
-rw-r--r--unified_inventory/locale/pt.po366
-rw-r--r--unified_inventory/locale/pt.txt107
-rw-r--r--unified_inventory/locale/ru.po366
-rw-r--r--unified_inventory/locale/ru.txt73
-rw-r--r--unified_inventory/locale/template.pot358
-rw-r--r--unified_inventory/locale/template.txt104
-rw-r--r--unified_inventory/locale/tr.po360
-rw-r--r--unified_inventory/locale/tr.txt69
-rw-r--r--unified_inventory/register.lua60
-rw-r--r--unified_inventory/waypoints.lua30
-rw-r--r--unifieddyes/init.lua2
-rw-r--r--xban2/init.lua4
99 files changed, 4819 insertions, 1826 deletions
diff --git a/anvil/README.txt b/anvil/README.md
index 227321f..227321f 100644
--- a/anvil/README.txt
+++ b/anvil/README.md
diff --git a/castle_farming/README.txt b/castle_farming/README.md
index a0334bd..c67b5de 100644
--- a/castle_farming/README.txt
+++ b/castle_farming/README.md
@@ -1,14 +1,9 @@
-=-=-=-=-=-=-=-=-=-=
-
-Castles Mod
-by: Philipbenr And DanDuncombe
+## Castle farm products
-=-=-=-=-=-=-=-=-=-=
+B: Philipbenr, DanDuncombe, FaceDeer
Licence: MIT
-see: LICENSE
-
=-=-=-=-=-=-=-=-=-=
Contains farm products useful for decorating a castle:
@@ -16,5 +11,3 @@ Contains farm products useful for decorating a castle:
* Hide wall and floor coverings
* Bound straw bale
* Straw training dummy
-
-=-=-=-=-=-=-=-=-=-=
diff --git a/castle_lighting/README.txt b/castle_lighting/README.md
index 90fb450..85241a9 100644
--- a/castle_lighting/README.txt
+++ b/castle_lighting/README.md
@@ -1,14 +1,9 @@
-=-=-=-=-=-=-=-=-=-=
-
-Castles Mod
-by: Philipbenr And DanDuncombe
+## Castle Lighting
-=-=-=-=-=-=-=-=-=-=
+By: Philipbenr, DanDuncombe, FaceDeer
Licence: MIT
-see: LICENSE
-
=-=-=-=-=-=-=-=-=-=
This mod contains medieval lighting sources suitable for a castle. It includes:
diff --git a/castle_masonry/README.md b/castle_masonry/README.md
new file mode 100644
index 0000000..f1c0073
--- /dev/null
+++ b/castle_masonry/README.md
@@ -0,0 +1,34 @@
+## Castle Masonry
+
+by: Philipbenr, DanDuncombe, FaceDeer
+
+Licence: MIT
+
+This is a mod all about creating castles and castle dungeons. Many of the nodes are used for the outer-walls or dungeons.
+
+Contains:
+
+* Walls, Corner-walls,
+* Castlestone Stairs, Slabs, and Pillars
+* Arrowslits and embrasures
+* Rubble (to fill the interior of thick castle walls)
+* Murder holes and machicolations
+* Pillars and crossbraces
+* Roof slate
+* Paving stone
+* Dungeon stone
+
+Mod settings can allow for the basic castle masonry forms to be made for the following material types (all optional):
+
+* Cobble
+* Desert stone
+* Desert stone brick
+* Sandstone
+* Sandstone brick
+* Stone
+* Stone brick
+* Castle wall
+* Wood
+* Snow
+* Ice
+* Obsidian Brick \ No newline at end of file
diff --git a/castle_masonry/README.txt b/castle_masonry/README.txt
deleted file mode 100644
index 98b129a..0000000
--- a/castle_masonry/README.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-=-=-=-=-=-=-=-=-=-=
-
-Castles Mod
-by: Philipbenr And DanDuncombe
-
-=-=-=-=-=-=-=-=-=-=
-
-Licence: MIT
-
-see: LICENSE
-
-=-=-=-=-=-=-=-=-=-=
-
-This is a mod all about creating castles and castle dungeons. Many of the nodes are used for the outer-walls or dungeons.
-
-=-=-=-=-=-=-=-=-=-=
-
-Contains:
-
---Walls, Corner-walls,
---Castlestone Stairs, Slabs, and Pillars
---Arrowslits and embrasures
---Rubble (to fill the interior of thick castle walls)
---Murder holes and machicolations
---Pillars and crossbraces
---Roof slate
---Paving stone
---Dungeon stone
-
-Mod settings can allow for the basic castle masonry forms to be made for the following material types (all optional):
-
-Cobble
-Desert stone
-Desert stone brick
-Sandstone
-Sandstone brick
-Stone
-Stone brick
-Castle wall
-Wood
-Snow
-Ice
-Obsidian Brick \ No newline at end of file
diff --git a/castle_shields/README.md b/castle_shields/README.md
new file mode 100644
index 0000000..51d7703
--- /dev/null
+++ b/castle_shields/README.md
@@ -0,0 +1,23 @@
+## Castle Shields
+
+by: Philipbenr, DanDuncombe and FaceDeer
+
+Licence: MIT
+
+=-=-=-=-=-=-=-=-=-=
+
+This mod adds decorative wall-mounted shields. It comes with three default shields, but it's very easy to mix and match the colours and patterns to generate additional shields for your server; see default_shields.lua for a good place to insert your own, or make use of the castle_shields.register_shield method in your own mods.
+
+The three default shields were defined thusly:
+
+* castle_shields.register_shield("shield_1", "Mounted Shield", "red", "blue", "slash")
+* castle_shields.register_shield("shield_2", "Mounted Shield", "cyan", "yellow", "chevron")
+* castle_shields.register_shield("shield_3", "Mounted Shield", "grey", "green", "cross")
+
+The following colors are permitted:
+
+"black", "blue", "brown", "cyan", "dark_green", "dark_grey", "green", "grey", "magenta", "orange", "pink", "red", "violet", "white", "yellow"
+
+The following patterns are permitted:
+
+"slash", "chevron", "cross" \ No newline at end of file
diff --git a/castle_shields/README.txt b/castle_shields/README.txt
deleted file mode 100644
index e2b85ce..0000000
--- a/castle_shields/README.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-=-=-=-=-=-=-=-=-=-=
-
-Castles Mod
-by: Philipbenr And DanDuncombe
-
-=-=-=-=-=-=-=-=-=-=
-
-Licence: MIT
-
-see: LICENSE
-
-=-=-=-=-=-=-=-=-=-=
-
-This mod adds decorative wall-mounted shields. It comes with three default shields, but it's very easy to mix and match the colours and patterns to generate additional shields for your server; see default_shields.lua for a good place to insert your own, or make use of the castle_shields.register_shield method in your own mods.
-
-The three default shields were defined thusly:
-
-castle_shields.register_shield("shield_1", "Mounted Shield", "red", "blue", "slash")
-castle_shields.register_shield("shield_2", "Mounted Shield", "cyan", "yellow", "chevron")
-castle_shields.register_shield("shield_3", "Mounted Shield", "grey", "green", "cross")
-
-The following colors are permitted:
- "black", "blue", "brown", "cyan", "dark_green", "dark_grey", "green", "grey", "magenta", "orange", "pink", "red", "violet", "white", "yellow"
-The following patterns are permitted:
- "slash", "chevron", "cross" \ No newline at end of file
diff --git a/castle_tapestries/README.txt b/castle_tapestries/README.md
index dc5885f..ad75089 100644
--- a/castle_tapestries/README.txt
+++ b/castle_tapestries/README.md
@@ -1,13 +1,9 @@
-=-=-=-=-=-=-=-=-=-=
+## Tapestries Mod
-Tapestries Mod
-by: Philipbenr And DanDuncombe
+By: Philipbenr, DanDuncombe, VanessaE, FaceDeer
=-=-=-=-=-=-=-=-=-=
Licence: MIT
-see: LICENSE
-
-
This mod contains tapestries of three different lengths, and a wooden crosspiece to hang them from. The tapestries can be dyed any color once hung. \ No newline at end of file
diff --git a/cottages/depends.txt b/cottages/depends.txt
index e72ef00..d0220ae 100644
--- a/cottages/depends.txt
+++ b/cottages/depends.txt
@@ -1,5 +1,5 @@
-default
-farming
+default?
+farming?
stairs?
homedecor?
intllib?
diff --git a/cottages/init.lua b/cottages/init.lua
index 8149611..a2a4751 100644
--- a/cottages/init.lua
+++ b/cottages/init.lua
@@ -29,6 +29,11 @@ else
cottages.S = function(s) return s end
end
+-- MineClone2 needs special treatment; default is only needed for
+-- crafting materials and sounds (less important)
+if( not( minetest.get_modpath("default"))) then
+ default = {};
+end
--cottages.config_use_mesh_barrel = false;
--cottages.config_use_mesh_handmill = true;
diff --git a/cottages/nodes_feldweg.lua b/cottages/nodes_feldweg.lua
index 39798f9..bb21479 100644
--- a/cottages/nodes_feldweg.lua
+++ b/cottages/nodes_feldweg.lua
@@ -342,7 +342,7 @@ if( minetest.get_modpath("stairs") and stairs and stairs.register_stair_and_slab
{"cottages_feldweg.png","default_dirt.png", "default_grass.png","default_grass.png","cottages_feldweg.png","cottages_feldweg.png"},
S("Dirt Road Stairs"),
S("Dirt Road, half height"),
- default.node_sound_dirt_defaults())
+ default.node_sound_dirt_defaults)
end
if( cottages_feldweg_mode == "nodebox" or cottages_feldweg_mode == "mesh" ) then
diff --git a/cottages/nodes_furniture.lua b/cottages/nodes_furniture.lua
index 5534975..056c8d7 100644
--- a/cottages/nodes_furniture.lua
+++ b/cottages/nodes_furniture.lua
@@ -23,7 +23,7 @@ minetest.register_node("cottages:bed_foot", {
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
- sounds = default.node_sound_wood_defaults(),
+ sounds = default.node_sound_wood_defaults,
node_box = {
type = "fixed",
fixed = {
@@ -58,7 +58,7 @@ minetest.register_node("cottages:bed_head", {
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
- sounds = default.node_sound_wood_defaults(),
+ sounds = default.node_sound_wood_defaults,
node_box = {
type = "fixed",
fixed = {
@@ -99,7 +99,7 @@ minetest.register_node("cottages:sleeping_mat", {
paramtype2 = "facedir",
walkable = false,
groups = { snappy = 3 },
- sounds = default.node_sound_leaves_defaults(),
+ sounds = default.node_sound_leaves_defaults,
selection_box = {
type = "wallmounted",
},
@@ -133,7 +133,7 @@ minetest.register_node("cottages:sleeping_mat_head", {
paramtype = 'light',
paramtype2 = "facedir",
groups = { snappy = 3 },
- sounds = default.node_sound_leaves_defaults(),
+ sounds = default.node_sound_leaves_defaults,
node_box = {
type = "fixed",
fixed = {
@@ -162,7 +162,7 @@ minetest.register_node("cottages:bench", {
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
- sounds = default.node_sound_wood_defaults(),
+ sounds = default.node_sound_wood_defaults,
node_box = {
type = "fixed",
fixed = {
diff --git a/cottages/nodes_historic.lua b/cottages/nodes_historic.lua
index 1fa5ea4..90e48c4 100644
--- a/cottages/nodes_historic.lua
+++ b/cottages/nodes_historic.lua
@@ -27,7 +27,7 @@ minetest.register_node("cottages:wagon_wheel", {
},
groups = {choppy=2,dig_immediate=2,attached_node=1},
legacy_wallmounted = true,
- sounds = default.node_sound_defaults(),
+ sounds = default.node_sound_defaults,
is_ground_content = false,
})
@@ -50,7 +50,7 @@ if( minetest.get_modpath("stairs") and stairs and stairs.register_stair_and_slab
{"cottages_loam.png"},
S("Loam Stairs"),
S("Loam Slab"),
- default.node_sound_dirt_defaults())
+ default.node_sound_dirt_defaults)
if( minetest.registered_nodes["default:clay"]) then
stairs.register_stair_and_slab("clay", "default:clay",
@@ -58,7 +58,7 @@ if( minetest.get_modpath("stairs") and stairs and stairs.register_stair_and_slab
{"cottages_clay.png"},
S("Clay Stairs"),
S("Clay Slab"),
- default.node_sound_dirt_defaults())
+ default.node_sound_dirt_defaults)
end
end
diff --git a/cottages/nodes_mining.lua b/cottages/nodes_mining.lua
index 3af4f71..b33ec3d 100644
--- a/cottages/nodes_mining.lua
+++ b/cottages/nodes_mining.lua
@@ -54,7 +54,7 @@ minetest.register_node("cottages:ladder_with_rope_and_rail", {
},
groups = {choppy=2,oddly_breakable_by_hand=3,rail=1,connect_to_raillike=1}, --connect_to_raillike=minetest.raillike_group("rail")},
legacy_wallmounted = true,
- sounds = default.node_sound_wood_defaults(),
+ sounds = default.node_sound_wood_defaults,
})
diff --git a/cottages/nodes_roof.lua b/cottages/nodes_roof.lua
index 11174d8..9503e86 100644
--- a/cottages/nodes_roof.lua
+++ b/cottages/nodes_roof.lua
@@ -191,7 +191,7 @@ minetest.register_node("cottages:slate_vertical", {
tiles = {"cottages_slate.png",cottages.texture_roof_sides,"cottages_slate.png","cottages_slate.png",cottages.texture_roof_sides,"cottages_slate.png"},
paramtype2 = "facedir",
groups = {cracky=2, stone=1},
- sounds = default.node_sound_stone_defaults(),
+ sounds = default.node_sound_stone_defaults,
is_ground_content = false,
})
@@ -209,7 +209,7 @@ minetest.register_node("cottages:reet", {
description = S("Reet for thatching"),
tiles = {"cottages_reet.png"},
groups = {snappy=3,choppy=3,oddly_breakable_by_hand=3,flammable=3},
- sounds = default.node_sound_wood_defaults(),
+ sounds = default.node_sound_wood_defaults,
is_ground_content = false,
})
diff --git a/cottages/nodes_straw.lua b/cottages/nodes_straw.lua
index a26b728..c19b869 100644
--- a/cottages/nodes_straw.lua
+++ b/cottages/nodes_straw.lua
@@ -32,7 +32,7 @@ minetest.register_node("cottages:straw_mat", {
paramtype2 = "facedir",
walkable = false,
groups = { snappy = 3 },
- sounds = default.node_sound_leaves_defaults(),
+ sounds = default.node_sound_leaves_defaults,
node_box = {
type = "fixed",
fixed = {
@@ -58,7 +58,7 @@ minetest.register_node("cottages:straw_bale", {
tiles = {"cottages_darkage_straw_bale.png"},
paramtype = "light",
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
- sounds = default.node_sound_wood_defaults(),
+ sounds = default.node_sound_wood_defaults,
-- the bale is slightly smaller than a full node
node_box = {
type = "fixed",
@@ -81,7 +81,7 @@ minetest.register_node("cottages:straw", {
description = S("straw"),
tiles = {"cottages_darkage_straw.png"},
groups = {snappy=3,choppy=3,oddly_breakable_by_hand=3,flammable=3},
- sounds = default.node_sound_wood_defaults(),
+ sounds = default.node_sound_wood_defaults,
-- the bale is slightly smaller than a full node
is_ground_content = false,
})
diff --git a/cottages/screenshot.jpg b/cottages/screenshot.jpg
new file mode 100644
index 0000000..62916da
--- /dev/null
+++ b/cottages/screenshot.jpg
Binary files differ
diff --git a/digistuff/init.lua b/digistuff/init.lua
index bcb7ce7..b35cb1b 100644
--- a/digistuff/init.lua
+++ b/digistuff/init.lua
@@ -928,3 +928,89 @@ minetest.register_craft({
{"homedecor:plastic_sheeting","homedecor:plastic_sheeting","homedecor:plastic_sheeting"},
}
})
+
+if minetest.get_modpath("mesecons_noteblock") then
+ minetest.register_node("digistuff:noteblock", {
+ description = "Digilines Noteblock",
+ groups = {cracky=3},
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec","field[channel;Channel;${channel}")
+ end,
+ on_destruct = function(pos)
+ local pos_hash = minetest.hash_node_position(pos)
+ if digistuff.sounds_playing[pos_hash] then
+ minetest.sound_stop(digistuff.sounds_playing[pos_hash])
+ digistuff.sounds_playing[pos_hash] = nil
+ end
+ end,
+ tiles = {
+ "mesecons_noteblock.png"
+ },
+ on_receive_fields = function(pos, formname, fields, sender)
+ local name = sender:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if fields.channel then meta:set_string("channel",fields.channel) end
+ end,
+ digiline =
+ {
+ receptor = {},
+ effector = {
+ action = function(pos,node,channel,msg)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ if channel ~= setchan then return end
+ local valid_sounds = {
+ csharp = "mesecons_noteblock_csharp",
+ d = "mesecons_noteblock_d",
+ dsharp = "mesecons_noteblock_dsharp",
+ e = "mesecons_noteblock_e",
+ f = "mesecons_noteblock_f",
+ fsharp = "mesecons_noteblock_fsharp",
+ g = "mesecons_noteblock_g",
+ gsharp = "mesecons_noteblock_gsharp",
+ a = "mesecons_noteblock_a",
+ asharp = "mesecons_noteblock_asharp",
+ b = "mesecons_noteblock_b",
+ c = "mesecons_noteblock_c",
+ csharp2 = "mesecons_noteblock_csharp2",
+ d2 = "mesecons_noteblock_d2",
+ dsharp2 = "mesecons_noteblock_dsharp2",
+ e2 = "mesecons_noteblock_e2",
+ f2 = "mesecons_noteblock_f2",
+ fsharp2 = "mesecons_noteblock_fsharp2",
+ g2 = "mesecons_noteblock_g2",
+ gsharp2 = "mesecons_noteblock_gsharp2",
+ a2 = "mesecons_noteblock_a2",
+ asharp2 = "mesecons_noteblock_asharp2",
+ b2 = "mesecons_noteblock_b2",
+ c2 = "mesecons_noteblock_c2",
+ hihat = "mesecons_noteblock_hihat",
+ kick = "mesecons_noteblock_kick",
+ snare = "mesecons_noteblock_snare",
+ crash = "mesecons_noteblock_crash",
+ litecrash = "mesecons_noteblock_litecrash",
+ fire = "fire_large",
+ explosion = "tnt_explode"
+ }
+ if type(msg) == "string" then
+ local sound = valid_sounds[msg]
+ if sound then minetest.sound_play(sound,{pos=pos}) end
+ elseif type(msg) == "table" then
+ if type(msg.sound) ~= "string" then return end
+ local sound = valid_sounds[msg.sound]
+ local volume = 1
+ if type(msg.volume) == "number" then
+ volume = math.max(0,math.min(1,msg.volume))
+ end
+ if sound then minetest.sound_play({name=sound,gain=volume},{pos=pos}) end
+ end
+ end
+ },
+ },
+ })
+end
diff --git a/gloopblocks/crafts.lua b/gloopblocks/crafts.lua
index 3906da1..95256bf 100644
--- a/gloopblocks/crafts.lua
+++ b/gloopblocks/crafts.lua
@@ -4,12 +4,12 @@ minetest.register_craft( {
type = "shapeless",
output = "gloopblocks:rainbow_block",
recipe = {
- "group:basecolor_red",
- "group:excolor_orange",
- "group:basecolor_yellow",
- "group:basecolor_green",
- "group:basecolor_blue",
- "group:excolor_violet",
+ "group:dye,color_red",
+ "group:dye,color_orange",
+ "group:dye,color_yellow",
+ "group:dye,color_green",
+ "group:dye,color_blue",
+ "group:dye,color_violet",
"default:stone",
"default:mese_crystal",
},
diff --git a/locks/init.lua b/locks/init.lua
index 2a35b02..0f2ba58 100644
--- a/locks/init.lua
+++ b/locks/init.lua
@@ -1,611 +1,615 @@
-
-
-
---[[
- Shared locked objects (Mod for MineTest)
- Allows to restrict usage of blocks to a certain player or a group of
- players.
- Copyright (C) 2013 Sokomine
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
---]]
-
--- Version 1.20
-
--- Changelog:
--- 08.05.2014 * Changed animation of shared locked furnace (removed pipeworks overlay on front, changed to new animation type)
--- 10.01.2013 * Added command to toggle for pipeworks output
--- * Added pipeworks support for chests and furnace.
--- 17.12.2013 * aborting input with ESC is possible again
--- 01.09.2013 * fixed bug in input sanitization
--- 31.08.2013 * changed receipe for key to avoid crafting conflickt with screwdriver
--- 10.07.2013 * removed a potential bug (now uses string:gmatch)
--- * added shared locked furnaces
-
-
-
-locks = {};
-
-minetest.register_privilege("openlocks", { description = "allows to open/use all locked objects", give_to_singleplayer = false});
-minetest.register_privilege("diglocks", { description = "allows to open/use and dig up all locked objects", give_to_singleplayer = false});
-
-
-locks.pipeworks_enabled = false;
-
-if( minetest.get_modpath("pipeworks") ~= nil ) then
- locks.pipeworks_enabled = true;
-end
-
--- initializes a lock (that is: prepare the metadata so that it can store data)
--- default_formspec is the formspec that will be used on right click; the input field for the commands has to exist
--- Call this in on_construct in register_node. Excample:
--- on_construct = function(pos)
--- locks:lock_init( pos, "" );
--- end;
-
-function locks:lock_init( pos, default_formspec )
-
- if( pos == nil ) then
- print( "Error: [locks] lock_init: pos is nil");
- return;
- end
-
- local meta = minetest.env:get_meta(pos);
- if( meta == nil ) then
- print( "Error: [locks] lock_init: unable to get meta data");
- return;
- end
-
- -- this will be changed after the node is placed
- meta:set_string("infotext", "Locked object");
- -- prepare the field for the owner
- meta:set_string("owner", "");
- -- this is the list of players/groups that may unlock the lock even if they are not the owner
- meta:set_string("allowed_users","");
- -- objects can be unlocked by passwords as well (if it is set)
- meta:set_string("password","");
- -- the last player who entered the right password (to save space this is not a list)
- meta:set_string("pw_user","");
- -- this formspec is presented on right-click for every user
- meta:set_string("formspec", default_formspec);
- -- by default, do not send output to pipework tubes
- meta:set_int( "allow_pipeworks", 0 );
-end
-
-
--- returns the information stored in the metadata strings (like owner etc.)
-function locks:get_lockdata( pos )
- if( pos == nil ) then
- return;
- end
-
- local meta = minetest.env:get_meta(pos);
- if( meta == nil) then
- return;
- end
-
- return{ infotext = (meta:get_string( "infotext" ) or ""),
- owner = (meta:get_string( "owner" ) or ""),
- allowed_users = (meta:get_string( "allowed_users" ) or ""),
- password = (meta:get_string( "password" ) or ""),
- pw_user = (meta:get_string( "w_user" ) or ""),
- formspec = (meta:get_string( "formspec" ) or "")
- };
-end
-
-
--- sets all the metadata the look needs (used e.g. in doors)
-function locks:set_lockdata( pos, data )
- if( pos == nil ) then
- return;
- end
-
- local meta = minetest.env:get_meta(pos);
- if( meta == nil) then
- return;
- end
-
- meta:set_string("infotext", (data.infotext or ""));
- meta:set_string("owner", (data.owner or ""));
- meta:set_string("allowed_users",(data.allowed_users or ""));
- meta:set_string("password", (data.password or ""));
- meta:set_string("pw_user", (data.pw_user or ""));
- meta:set_string("formspec", (data.formspec or ""));
-end
-
-
-
-
--- Set the owner of the locked object.
--- Call this in after_place_node in register_node. Example:
--- after_place_node = function(pos, placer)
--- locks:lock_set_owner( pos, placer, "Shared locked object" );
--- end,
-function locks:lock_set_owner( pos, player_or_name, description )
-
- if( pos == nil or player_or_name == nil ) then
- print( "Error: [locks] Missing/wrong parameters to lock_set_owner");
- return false;
- end
-
- local meta = minetest.env:get_meta(pos);
- if( meta == nil ) then
- print( "Error: [locks] lock_set_owner: unable to get meta data");
- return;
- end
-
- -- accepts a name or a player object
- if( type( player_or_name )~="string") then
- player_or_name = player_or_name:get_player_name();
- end
-
- meta:set_string("owner", player_or_name or "");
- -- add the name of the owner to the description
- meta:set_string("infotext", ( description or "Shared lockecd object" ).." (owned by "..meta:get_string("owner")..")");
-end
-
-
-
--- The locked object can only be digged by the owner OR by people with the diglocks priv
--- Call this in can_dig in register_node. Example:
--- can_dig = function(pos,player)
--- return locks:lock_allow_dig( pos, player );
--- end
-function locks:lock_allow_dig( pos, player )
-
- if( pos == nil or player == nil ) then
- print( "Error: [locks] Missing/wrong parameters to lock_allow_dig");
- return false;
- end
-
- local meta = minetest.env:get_meta(pos);
- local lock_owner = meta:get_string("owner");
-
- -- locks who lost their owner can be opened/digged by anyone
- if( meta == nil or lock_owner == nil or lock_owner == "") then
- return true;
- end
-
- -- the owner can dig up his own locked objects
- if( player:get_player_name() == meta:get_string("owner")) then
- return true;
- end
-
- -- players with diglocks priv can dig up locked objects as well
- if( minetest.check_player_privs(player:get_player_name(), {diglocks=true})) then
- return true;
- end
-
- return false; -- fallback
-end
-
-
--- The locked object can only be used (i.e. opened, stuff taken out, changed, ... - depends on object) if this
--- function returns true. Call it wherever appropriate (usually in on_punch in register_node). Example:
--- on_punch = function(pos,player)
--- if( !locks:lock_allow_use( pos, player ) then
--- print( "Sorry, you have no access here.");
--- else
--- do_what_this_object_is_good_for( pos, puncher );
--- end
--- end
-
-function locks:lock_allow_use( pos, player )
-
- if( pos == nil or player == nil ) then
- print( "Error: [locks] Missing/wrong parameters to lock_allow_use");
- return false;
- end
-
- local name = player:get_player_name();
- local meta = minetest.env:get_meta(pos);
-
- -- pipeworks sends a special username
- if( name == ':pipeworks' or (player.is_fake_player and player.is_fake_player==":pipeworks")) then
- if( meta:get_int( 'allow_pipeworks' ) == 1 ) then
- return true;
- else
- return false;
- end
- end
-
- -- the player has to have a key or a keychain to open his own shared locked objects
- if( name == meta:get_string("owner")) then
-
- if( not( player:get_inventory():contains_item("main","locks:keychain 1"))
- and not( player:get_inventory():contains_item("main","locks:key 1"))) then
- minetest.chat_send_player( name, "You do not have a key or a keychain. Without that you can't use your shared locked objects!");
- return false;
- end
-
- -- the player has to have a keychain to open shared locked objects of other players
- else
-
- if( not( player:get_inventory():contains_item("main","locks:keychain 1"))) then
- minetest.chat_send_player(name, "You do not have a keychain. Without that you can't open shared locked objects of other players!");
- return false;
- end
- end
-
- -- if the user would even be allowed to dig this node up, using the node is allowed as well
- if( locks:lock_allow_dig( pos, player )) then
- return true;
- end
-
-
- if( meta == nil ) then
- minetest.chat_send_player( name, "Error: Could not access metadata of this shared locked object.");
- return false;
- end
-
- -- players with openlocks priv can open locked objects
- if( minetest.check_player_privs(name, {openlocks=true})) then
- return true;
- end
-
- -- the player might be specificly allowed to use this object through allowed_users
- local liste = meta:get_string("allowed_users"):split( "," );
- for i in ipairs( liste ) do
-
- if( liste[i] == name ) then
- return true;
- end
-
- -- the player might member of a playergroup that is allowed to use this object
- if( liste[i]:sub(1,1) == ":"
- and playergroups ~= nil
- and playergroups:is_group_member( meta:get_string("owner"), liste[i]:sub(2), name )) then
- return true;
- end
-
- end
-
-
- -- the player may have entered the right password
- if( name == meta:get_string("pw_user")) then
- return true;
- end
-
- -- the lock may have a password set. If this is the case then ask the user for it
- if( meta:get_string( "password" ) and meta:get_string( "password" ) ~= "" ) then
- minetest.chat_send_player(name, "Access denied. Right-click and enter password first!");
- return false;
- end
-
- return false; -- fallback
-
-end
-
-
-
--- Method for the lock to get password and configuration data
--- Call in on_receive_fields in register_node. Example:
--- on_receive_fields = function(pos, formname, fields, sender)
--- locks:lock_handle_input( pos, formname, fields, sender );
--- end,
-function locks:lock_handle_input( pos, formname, fields, player )
-
- if( pos == nil or player == nil ) then
- print( "Error: [locks] Missing/wrong parameters to lock_handle_input");
- return false;
- end
-
- local meta = minetest.env:get_meta(pos);
- if( meta == nil ) then
- print( "Error: [locks] lock_handle_input: unable to get meta data");
- return;
- end
-
- -- is this input the lock is supposed to handle?
- if( ( not( fields.locks_sent_lock_command )
- or fields.locks_sent_lock_command == "" )
- and (fields.quit and (fields.quit==true or fields.quit=='true'))) then
--- or not( fields.locks_sent_input )
- return;
- end
-
- name = player:get_player_name();
-
- if( fields.locks_sent_lock_command == "/help" ) then
-
- if( name == meta:get_string( "owner" )) then
- minetest.chat_send_player(name, "The following commands are available to you, the owner of this object, only:\n"..
- " /help Shows this help text.\n"..
- " /add <name> Player <name> can now unlock this object with any key.\n"..
- " /del <name> Player <name> can no longer use this object.\n"..
- " /list Shows a list of players who can use this object.\n"..
- " /set <password> Sets a password. Everyone who types that in can use the object.\n"..
- " /pipeworks Toggles permission for pipeworks to take inventory out of the shared locked object.\n");
-
- else if( locks:lock_allow_use( pos, player )) then
- minetest.chat_send_player(name, "This locked object is owned by "..tostring( meta:get_string( "owner" ))..".\n"..
- "You do have access to it.\n");
-
- else if( meta:get_string( "password" ) ~= "" ) then
- minetest.chat_send_player(name, "This locked object is owned by "..tostring( meta:get_string( "owner" ))..".\n"..
- "Enter the correct password to gain access.\n");
-
- else
- minetest.chat_send_player(name, "This locked object is owned by "..tostring( meta:get_string( "owner" ))..".\n"..
- "There is no password set. You can only gain access if the owner grants it to you.");
-
- end end end -- lua is not the most intuitive language here....
- return;
- end -- of /help
-
- -- sanitize player input
- if( fields.locks_sent_lock_command:match("[^%a%d%s_%- /%:]")) then
- minetest.chat_send_player(name, "Input contains unsupported characters. Allowed: a-z, A-Z, 0-9, _, -, :.");
- return;
- end
-
- if( #fields.locks_sent_lock_command > 60) then
- minetest.chat_send_player(name, "Input too long. Only up to 80 characters supported.");
- return;
- end
-
-
- -- other players can only try to input the correct password
- if( name ~= meta:get_string( "owner" )) then
-
- -- no need to bother with trying other PWs if none is set...
- if( meta:get_string("password")=="" ) then
- minetest.chat_send_player(name, "There is no password set. Access denied.");
- return;
- end
-
- -- the player may have entered the right password already
- if( name == meta:get_string("pw_user")) then
- -- nothing to do - the player entered the right pw alredy
- minetest.chat_send_player(name, "You have entered the right password already. Access granted.");
- return;
- end
-
- if( fields.locks_sent_lock_command ~= meta:get_string("password")) then
- minetest.chat_send_player(name, "Wrong password. Access denied.");
- return;
- end
-
- -- store the last user (this one) who entered the right pw
- meta:set_string( "pw_user", name );
-
- minetest.chat_send_player(name, "Password confirmed. Access granted.");
- return;
- end
-
- local txt = "";
-
-
- if( fields.locks_sent_lock_command == "/list" ) then
-
- if( meta:get_string("allowed_users")=="" ) then
- txt = "No other users are allowed to use this object (except those with global privs like moderators/admins).";
- else
- txt = "You granted the following users/groups of users access to this object:\n";
- local liste = meta:get_string("allowed_users"):split( "," );
- for i in ipairs( liste ) do
- txt = txt.." "..tostring(liste[i]);
- end
- end
-
- if( meta:get_string( "password" ) == "" ) then
- txt = txt.."\nThere is no password set. That means no one can get access through a password.";
- else
- txt = txt.."\nThe password for this lock is: \""..tostring( meta:get_string( "password" ).."\"");
- end
-
- if( not( minetest.get_modpath("pipeworks") )) then
- txt = txt.."\nThe pipeworks mod is not installed. Install it if you wish support for tubes.";
- elseif( meta:get_int( "allow_pipeworks" ) == 1 ) then
- txt = txt.."\nTubes from pipeworks may be used to extract items out of/add items to this shared locked object.";
- else
- txt = txt.."\nInput from tubes is accepted, but output to them is denied (default).";
- end
-
- minetest.chat_send_player(name, txt );
- return;
- end -- of /list
-
-
- -- toggle tube output on/off
- if( fields.locks_sent_lock_command == "/pipeworks" ) then
-
- if( meta:get_int('allow_pipeworks') == 1 ) then
- meta:set_int('allow_pipeworks', 0 );
- minetest.chat_send_player( name, 'Output to pipework tubes is now DISABLED (input is still acceped).');
- return;
- else
- meta:set_int('allow_pipeworks', 1 );
- minetest.chat_send_player( name, 'Output to pipework tubes is now ENABLED. Connected tubes may insert and remove items.');
- return;
- end
- end
-
--- -- all other commands take exactly one parameter
- local help = fields.locks_sent_lock_command:split( " " );
-
- print( tostring( help[1] ));
- print( tostring( help[2] ));
-
-
- -- set/change a password
- if( help[1]=="/set" ) then
-
- -- if empty password then delete it
- if( help[2]==nil ) then
- help[2] = "";
- end
-
- minetest.chat_send_player(name, "Old password: \""..tostring( meta:get_string( "password" ))..
- "\"\n Changed to new password: \""..tostring( help[2]).."\".");
-
-
- meta:set_string( "password", help[2]);
- -- reset the list of users who typed the right password
- meta:set_string("pw_users","");
-
- if( help[2]=="") then
- minetest.chat_send_player(name, "The password is empty and thus will be disabled.");
- end
- return;
- end
-
- if( help[2]==nil or help[2]=="") then
- minetest.chat_send_player(name, "Error: Missing parameter (player name) for command \""..tostring( help[1] ).."\"." );
- return;
- end
-
- -- for add and del: check if the player is already in the list
-
- local found = false;
- local anz = 0;
- local liste = meta:get_string("allowed_users"):split( "," );
- for i in ipairs( liste ) do
-
- anz = anz + 1; -- count players
- if( tostring( liste[i] ) == help[2] ) then
- found = true;
- end
-
- end
-
- if( help[1]=="/add" and found==true ) then
- minetest.chat_send_player(name, "Player \""..tostring( help[2] ).."\" is already allowed to use this locked object. Nothing to do.");
- return;
- end
-
- if( help[1]=="/del" and found==false) then
- minetest.chat_send_player(name, "Player \""..tostring( help[2] ).."\" is not amongst the players allowed to use this locked object. Nothing to do.");
- return;
- end
-
-
- if( help[1]=="/add" ) then
-
- if( anz >= 6 ) then
- minetest.chat_send_player(name, "Sorry, no more players can be added. To save space, only up to 6 players can be added. For more players please use groups!");
- return;
- end
-
- if( name == help[2] ) then
- minetest.chat_send_player(name, "You are already owner of this object.");
- return;
- end
-
- -- the player might try to add a playergroup
- if( help[2]:sub(1,1) == ":" ) then
-
- if( not( playergroups )) then
- minetest.chat_send_player(name, "Sorry, this server does not support playergroups.");
- return;
- end
-
- if( #help[2]<2 ) then
- minetest.chat_send_player(name, "Please specify the name of the playergroup you want to add!");
- return;
- end
-
- if( not( playergroups:is_playergroup(meta:get_string("owner"), help[2]:sub(2) ))) then
- minetest.chat_send_player(name, "You do not have a playergroup named \""..tostring( help[2]:sub(2)).."\".");
- return;
- end
-
- else
-
- -- check if the player exists
- local privs = minetest.get_player_privs( help[2] );
- if( not( privs ) or not( privs.interact )) then
- minetest.chat_send_player(name, "Player \""..help[2].."\" not found or has no interact privs.");
- return;
- end
- end
-
- meta:set_string( "allowed_users", meta:get_string("allowed_users")..","..help[2] );
-
- if( help[2]:sub(1,1) == ":" ) then
- minetest.chat_send_player(name, "All members of your playergroup "..tostring(help[2]:sub(2)).." may now use/access this locked object.");
- else
- minetest.chat_send_player(name, help[2].." may now use/access this locked object.");
- end
- return;
- end
-
-
- if( help[1]=="/del" ) then
-
- userlist = meta:get_string("allowed_users"):split( ","..help[2] );
- meta:set_string( "allowed_users", ( userlist[1] or "" )..(userlist[2] or "" ));
-
- minetest.chat_send_player(name, "Access for player \""..tostring(help[2]).."\" has been revoked.");
- return;
- end
-
- minetest.chat_send_player(name, "Error: Command \""..tostring(help[1]).."\" not understood.");
-end
-
-
-
--- craftitem; that can be used to craft shared locked objects
-minetest.register_craftitem("locks:lock", {
- description = "Lock to lock and share objects",
- image = "locks_lock16.png",
-});
-
-
-minetest.register_craft({
- output = "locks:lock 2",
- recipe = {
- {'default:steel_ingot', 'default:steel_ingot','default:steel_ingot'},
- {'default:steel_ingot', '', 'default:steel_ingot'},
- {'', 'default:steel_ingot',''},
- }
- });
-
-
--- a key allowes to open your own shared locked objects
-minetest.register_craftitem("locks:key", {
- description = "Key to open your own shared locked objects",
- image = "locks_key32.png",
-});
-
-minetest.register_craft({
- output = "locks:key",
- recipe = {
- {'', 'default:stick', ''},
- {'', 'default:steel_ingot',''},
- }
- });
-
-
-
--- in order to open shared locked objects of other players, a keychain is needed (plus the owner has to admit it via /add playername or through /set password)
-minetest.register_craftitem("locks:keychain", {
- description = "Keychain to open shared locked objects of others",
- image = "locks_keychain32.png",
-});
-
-minetest.register_craft({
- output = "locks:keychain",
- recipe = {
- {'', 'default:steel_ingot', '' },
- {'locks:key', 'locks:key', 'locks:key'},
- }
- });
-
-dofile(minetest.get_modpath("locks").."/shared_locked_chest.lua");
-dofile(minetest.get_modpath("locks").."/shared_locked_sign_wall.lua");
-dofile(minetest.get_modpath("locks").."/shared_locked_xdoors2.lua");
-dofile(minetest.get_modpath("locks").."/shared_locked_furnace.lua");
-
-
+--[[
+ Shared locked objects (Mod for MineTest)
+ Allows to restrict usage of blocks to a certain player or a group of
+ players.
+ Copyright (C) 2013 Sokomine
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+--]]
+
+-- Version 2.00
+
+-- Changelog:
+-- 30.07.2018 * Front side of chest does not get pipeworks image anymore.
+-- 30.07.2018 * Fixed bug with pipeworks.
+-- * Repaired password.
+-- * Converted back to unix file format.
+-- 08.05.2014 * Changed animation of shared locked furnace (removed pipeworks overlay on front, changed to new animation type)
+-- 10.01.2013 * Added command to toggle for pipeworks output
+-- * Added pipeworks support for chests and furnace.
+-- 17.12.2013 * aborting input with ESC is possible again
+-- 01.09.2013 * fixed bug in input sanitization
+-- 31.08.2013 * changed receipe for key to avoid crafting conflickt with screwdriver
+-- 10.07.2013 * removed a potential bug (now uses string:gmatch)
+-- * added shared locked furnaces
+
+
+
+locks = {};
+
+minetest.register_privilege("openlocks", { description = "allows to open/use all locked objects", give_to_singleplayer = false});
+minetest.register_privilege("diglocks", { description = "allows to open/use and dig up all locked objects", give_to_singleplayer = false});
+
+
+locks.pipeworks_enabled = false;
+
+if( minetest.get_modpath("pipeworks") ~= nil ) then
+ locks.pipeworks_enabled = true;
+end
+
+-- initializes a lock (that is: prepare the metadata so that it can store data)
+-- default_formspec is the formspec that will be used on right click; the input field for the commands has to exist
+-- Call this in on_construct in register_node. Excample:
+-- on_construct = function(pos)
+-- locks:lock_init( pos, "" );
+-- end;
+
+function locks:lock_init( pos, default_formspec )
+
+ if( pos == nil ) then
+ print( "Error: [locks] lock_init: pos is nil");
+ return;
+ end
+
+ local meta = minetest.env:get_meta(pos);
+ if( meta == nil ) then
+ print( "Error: [locks] lock_init: unable to get meta data");
+ return;
+ end
+
+ -- this will be changed after the node is placed
+ meta:set_string("infotext", "Locked object");
+ -- prepare the field for the owner
+ meta:set_string("owner", "");
+ -- this is the list of players/groups that may unlock the lock even if they are not the owner
+ meta:set_string("allowed_users","");
+ -- objects can be unlocked by passwords as well (if it is set)
+ meta:set_string("password","");
+ -- the last player who entered the right password (to save space this is not a list)
+ meta:set_string("pw_user","");
+ -- this formspec is presented on right-click for every user
+ meta:set_string("formspec", default_formspec);
+ -- by default, do not send output to pipework tubes
+ meta:set_int( "allow_pipeworks", 0 );
+end
+
+
+-- returns the information stored in the metadata strings (like owner etc.)
+function locks:get_lockdata( pos )
+ if( pos == nil ) then
+ return;
+ end
+
+ local meta = minetest.env:get_meta(pos);
+ if( meta == nil) then
+ return;
+ end
+
+ return{ infotext = (meta:get_string( "infotext" ) or ""),
+ owner = (meta:get_string( "owner" ) or ""),
+ allowed_users = (meta:get_string( "allowed_users" ) or ""),
+ password = (meta:get_string( "password" ) or ""),
+ pw_user = (meta:get_string( "w_user" ) or ""),
+ formspec = (meta:get_string( "formspec" ) or "")
+ };
+end
+
+
+-- sets all the metadata the look needs (used e.g. in doors)
+function locks:set_lockdata( pos, data )
+ if( pos == nil ) then
+ return;
+ end
+
+ local meta = minetest.env:get_meta(pos);
+ if( meta == nil) then
+ return;
+ end
+
+ meta:set_string("infotext", (data.infotext or ""));
+ meta:set_string("owner", (data.owner or ""));
+ meta:set_string("allowed_users",(data.allowed_users or ""));
+ meta:set_string("password", (data.password or ""));
+ meta:set_string("pw_user", (data.pw_user or ""));
+ meta:set_string("formspec", (data.formspec or ""));
+end
+
+
+
+
+-- Set the owner of the locked object.
+-- Call this in after_place_node in register_node. Example:
+-- after_place_node = function(pos, placer)
+-- locks:lock_set_owner( pos, placer, "Shared locked object" );
+-- end,
+function locks:lock_set_owner( pos, player_or_name, description )
+
+ if( pos == nil or player_or_name == nil ) then
+ print( "Error: [locks] Missing/wrong parameters to lock_set_owner");
+ return false;
+ end
+
+ local meta = minetest.env:get_meta(pos);
+ if( meta == nil ) then
+ print( "Error: [locks] lock_set_owner: unable to get meta data");
+ return;
+ end
+
+ -- accepts a name or a player object
+ if( type( player_or_name )~="string") then
+ player_or_name = player_or_name:get_player_name();
+ end
+
+ meta:set_string("owner", player_or_name or "");
+ -- add the name of the owner to the description
+ meta:set_string("infotext", ( description or "Shared lockecd object" ).." (owned by "..meta:get_string("owner")..")");
+end
+
+
+
+-- The locked object can only be digged by the owner OR by people with the diglocks priv
+-- Call this in can_dig in register_node. Example:
+-- can_dig = function(pos,player)
+-- return locks:lock_allow_dig( pos, player );
+-- end
+function locks:lock_allow_dig( pos, player )
+
+ if( pos == nil or player == nil ) then
+ print( "Error: [locks] Missing/wrong parameters to lock_allow_dig");
+ return false;
+ end
+
+ local meta = minetest.env:get_meta(pos);
+ local lock_owner = meta:get_string("owner");
+
+ -- locks who lost their owner can be opened/digged by anyone
+ if( meta == nil or lock_owner == nil or lock_owner == "") then
+ return true;
+ end
+
+ -- the owner can dig up his own locked objects
+ if( player:get_player_name() == meta:get_string("owner")) then
+ return true;
+ end
+
+ -- players with diglocks priv can dig up locked objects as well
+ if( minetest.check_player_privs(player:get_player_name(), {diglocks=true})) then
+ return true;
+ end
+
+ return false; -- fallback
+end
+
+
+-- The locked object can only be used (i.e. opened, stuff taken out, changed, ... - depends on object) if this
+-- function returns true. Call it wherever appropriate (usually in on_punch in register_node). Example:
+-- on_punch = function(pos,player)
+-- if( !locks:lock_allow_use( pos, player ) then
+-- print( "Sorry, you have no access here.");
+-- else
+-- do_what_this_object_is_good_for( pos, puncher );
+-- end
+-- end
+
+function locks:lock_allow_use( pos, player )
+
+ if( pos == nil or player == nil ) then
+ print( "Error: [locks] Missing/wrong parameters to lock_allow_use");
+ return false;
+ end
+
+ local name = player:get_player_name();
+ local meta = minetest.env:get_meta(pos);
+
+ -- pipeworks sends a special username
+ if( player.is_fake_player) then
+ if( locks:lock_allow_dig( pos, player ) and meta:get_int( 'allow_pipeworks' ) == 1 ) then
+ return true;
+ else
+ return false;
+ end
+ end
+
+ -- the player has to have a key or a keychain to open his own shared locked objects
+ if( name == meta:get_string("owner")) then
+
+ if( not( player:get_inventory():contains_item("main","locks:keychain 1"))
+ and not( player:get_inventory():contains_item("main","locks:key 1"))) then
+ minetest.chat_send_player( name, "You do not have a key or a keychain. Without that you can't use your shared locked objects!");
+ return false;
+ end
+
+ -- the player has to have a keychain to open shared locked objects of other players
+ else
+
+ if( not( player:get_inventory():contains_item("main","locks:keychain 1"))) then
+ minetest.chat_send_player(name, "You do not have a keychain. Without that you can't open shared locked objects of other players!");
+ return false;
+ end
+ end
+
+ -- if the user would even be allowed to dig this node up, using the node is allowed as well
+ if( locks:lock_allow_dig( pos, player )) then
+ return true;
+ end
+
+
+ if( meta == nil ) then
+ minetest.chat_send_player( name, "Error: Could not access metadata of this shared locked object.");
+ return false;
+ end
+
+ -- players with openlocks priv can open locked objects
+ if( minetest.check_player_privs(name, {openlocks=true})) then
+ return true;
+ end
+
+ -- the player might be specificly allowed to use this object through allowed_users
+ local liste = meta:get_string("allowed_users"):split( "," );
+ for i in ipairs( liste ) do
+
+ if( liste[i] == name ) then
+ return true;
+ end
+
+ -- the player might member of a playergroup that is allowed to use this object
+ if( liste[i]:sub(1,1) == ":"
+ and playergroups ~= nil
+ and playergroups:is_group_member( meta:get_string("owner"), liste[i]:sub(2), name )) then
+ return true;
+ end
+
+ end
+
+
+ -- the player may have entered the right password
+ if( name == meta:get_string("pw_user")) then
+ return true;
+ end
+
+ -- the lock may have a password set. If this is the case then ask the user for it
+ if( meta:get_string( "password" ) and meta:get_string( "password" ) ~= "" ) then
+ minetest.chat_send_player(name, "Access denied. Right-click and enter password first!");
+ return false;
+ end
+
+ return false; -- fallback
+
+end
+
+
+
+-- Method for the lock to get password and configuration data
+-- Call in on_receive_fields in register_node. Example:
+-- on_receive_fields = function(pos, formname, fields, sender)
+-- locks:lock_handle_input( pos, formname, fields, sender );
+-- end,
+function locks:lock_handle_input( pos, formname, fields, player )
+
+ if( pos == nil or player == nil ) then
+ print( "Error: [locks] Missing/wrong parameters to lock_handle_input");
+ return false;
+ end
+
+ local meta = minetest.env:get_meta(pos);
+ if( meta == nil ) then
+ print( "Error: [locks] lock_handle_input: unable to get meta data");
+ return;
+ end
+
+ -- is this input the lock is supposed to handle?
+ if( ( not( fields.locks_sent_lock_command )
+ or fields.locks_sent_lock_command == "" )
+ and (fields.quit and (fields.quit==true or fields.quit=='true'))) then
+-- or not( fields.locks_sent_input )
+ return;
+ end
+
+ name = player:get_player_name();
+
+ if( fields.locks_sent_lock_command == "/help" ) then
+
+ if( name == meta:get_string( "owner" )) then
+ minetest.chat_send_player(name, "The following commands are available to you, the owner of this object, only:\n"..
+ " /help Shows this help text.\n"..
+ " /add <name> Player <name> can now unlock this object with any key.\n"..
+ " /del <name> Player <name> can no longer use this object.\n"..
+ " /list Shows a list of players who can use this object.\n"..
+ " /set <password> Sets a password. Everyone who types that in can use the object.\n"..
+ " /pipeworks Toggles permission for pipeworks to take inventory out of the shared locked object.\n");
+
+ else if( locks:lock_allow_use( pos, player )) then
+ minetest.chat_send_player(name, "This locked object is owned by "..tostring( meta:get_string( "owner" ))..".\n"..
+ "You do have access to it.\n");
+
+ else if( meta:get_string( "password" ) ~= "" ) then
+ minetest.chat_send_player(name, "This locked object is owned by "..tostring( meta:get_string( "owner" ))..".\n"..
+ "Enter the correct password to gain access.\n");
+
+ else
+ minetest.chat_send_player(name, "This locked object is owned by "..tostring( meta:get_string( "owner" ))..".\n"..
+ "There is no password set. You can only gain access if the owner grants it to you.");
+
+ end end end -- lua is not the most intuitive language here....
+ return;
+ end -- of /help
+
+ -- sanitize player input
+ if( fields.locks_sent_lock_command:match("[^%a%d%s_%- /%:]")) then
+ minetest.chat_send_player(name, "Input contains unsupported characters. Allowed: a-z, A-Z, 0-9, _, -, :.");
+ return;
+ end
+
+ if( #fields.locks_sent_lock_command > 60) then
+ minetest.chat_send_player(name, "Input too long. Only up to 80 characters supported.");
+ return;
+ end
+
+
+ local password = meta:get_string("password");
+ -- other players can only try to input the correct password
+ if( name ~= meta:get_string( "owner" )
+ or (password and password ~= "" and password==fields.locks_sent_lock_command)
+ or (name==meta:get_string("pw_user"))) then
+
+ -- no need to bother with trying other PWs if none is set...
+ if( meta:get_string("password")=="" ) then
+ minetest.chat_send_player(name, "There is no password set. Access denied.");
+ return;
+ end
+
+ -- the player may have entered the right password already
+ if( name == meta:get_string("pw_user")) then
+ -- nothing to do - the player entered the right pw alredy
+ minetest.chat_send_player(name, "You have entered the right password already. Access granted.");
+ return;
+ end
+
+ if( fields.locks_sent_lock_command ~= meta:get_string("password")) then
+ minetest.chat_send_player(name, "Wrong password. Access denied.");
+ return;
+ end
+
+ -- store the last user (this one) who entered the right pw
+ meta:set_string( "pw_user", name );
+
+ minetest.chat_send_player(name, "Password confirmed. Access granted.");
+ return;
+ end
+
+ local txt = "";
+
+
+ if( fields.locks_sent_lock_command == "/list" ) then
+
+ if( meta:get_string("allowed_users")=="" ) then
+ txt = "No other users are allowed to use this object (except those with global privs like moderators/admins).";
+ else
+ txt = "You granted the following users/groups of users access to this object:\n";
+ local liste = meta:get_string("allowed_users"):split( "," );
+ for i in ipairs( liste ) do
+ txt = txt.." "..tostring(liste[i]);
+ end
+ end
+
+ if( meta:get_string( "password" ) == "" ) then
+ txt = txt.."\nThere is no password set. That means no one can get access through a password.";
+ else
+ txt = txt.."\nThe password for this lock is: \""..tostring( meta:get_string( "password" ).."\"");
+ end
+
+ if( not( minetest.get_modpath("pipeworks") )) then
+ txt = txt.."\nThe pipeworks mod is not installed. Install it if you wish support for tubes.";
+ elseif( meta:get_int( "allow_pipeworks" ) == 1 ) then
+ txt = txt.."\nTubes from pipeworks may be used to extract items out of/add items to this shared locked object.";
+ else
+ txt = txt.."\nInput from tubes is accepted, but output to them is denied (default).";
+ end
+
+ minetest.chat_send_player(name, txt );
+ return;
+ end -- of /list
+
+
+ -- toggle tube output on/off
+ if( fields.locks_sent_lock_command == "/pipeworks" ) then
+
+ if( meta:get_int('allow_pipeworks') == 1 ) then
+ meta:set_int('allow_pipeworks', 0 );
+ minetest.chat_send_player( name, 'Output to pipework tubes is now DISABLED (input is still acceped).');
+ return;
+ else
+ meta:set_int('allow_pipeworks', 1 );
+ minetest.chat_send_player( name, 'Output to pipework tubes is now ENABLED. Connected tubes may insert and remove items.');
+ return;
+ end
+ end
+
+-- -- all other commands take exactly one parameter
+ local help = fields.locks_sent_lock_command:split( " " );
+
+ print( tostring( help[1] ));
+ print( tostring( help[2] ));
+
+
+ -- set/change a password
+ if( help[1]=="/set" ) then
+
+ -- if empty password then delete it
+ if( help[2]==nil ) then
+ help[2] = "";
+ end
+
+ minetest.chat_send_player(name, "Old password: \""..tostring( meta:get_string( "password" ))..
+ "\"\n Changed to new password: \""..tostring( help[2]).."\".");
+
+
+ meta:set_string( "password", help[2]);
+ -- reset the list of users who typed the right password
+ meta:set_string("pw_users","");
+
+ if( help[2]=="") then
+ minetest.chat_send_player(name, "The password is empty and thus will be disabled.");
+ end
+ return;
+ end
+
+ if( help[2]==nil or help[2]=="") then
+ minetest.chat_send_player(name, "Error: Missing parameter (player name) for command \""..tostring( help[1] ).."\"." );
+ return;
+ end
+
+ -- for add and del: check if the player is already in the list
+
+ local found = false;
+ local anz = 0;
+ local liste = meta:get_string("allowed_users"):split( "," );
+ for i in ipairs( liste ) do
+
+ anz = anz + 1; -- count players
+ if( tostring( liste[i] ) == help[2] ) then
+ found = true;
+ end
+
+ end
+
+ if( help[1]=="/add" and found==true ) then
+ minetest.chat_send_player(name, "Player \""..tostring( help[2] ).."\" is already allowed to use this locked object. Nothing to do.");
+ return;
+ end
+
+ if( help[1]=="/del" and found==false) then
+ minetest.chat_send_player(name, "Player \""..tostring( help[2] ).."\" is not amongst the players allowed to use this locked object. Nothing to do.");
+ return;
+ end
+
+
+ if( help[1]=="/add" ) then
+
+ if( anz >= 6 ) then
+ minetest.chat_send_player(name, "Sorry, no more players can be added. To save space, only up to 6 players can be added. For more players please use groups!");
+ return;
+ end
+
+ if( name == help[2] ) then
+ minetest.chat_send_player(name, "You are already owner of this object.");
+ return;
+ end
+
+ -- the player might try to add a playergroup
+ if( help[2]:sub(1,1) == ":" ) then
+
+ if( not( playergroups )) then
+ minetest.chat_send_player(name, "Sorry, this server does not support playergroups.");
+ return;
+ end
+
+ if( #help[2]<2 ) then
+ minetest.chat_send_player(name, "Please specify the name of the playergroup you want to add!");
+ return;
+ end
+
+ if( not( playergroups:is_playergroup(meta:get_string("owner"), help[2]:sub(2) ))) then
+ minetest.chat_send_player(name, "You do not have a playergroup named \""..tostring( help[2]:sub(2)).."\".");
+ return;
+ end
+
+ else
+
+ -- check if the player exists
+ local privs = minetest.get_player_privs( help[2] );
+ if( not( privs ) or not( privs.interact )) then
+ minetest.chat_send_player(name, "Player \""..help[2].."\" not found or has no interact privs.");
+ return;
+ end
+ end
+
+ meta:set_string( "allowed_users", meta:get_string("allowed_users")..","..help[2] );
+
+ if( help[2]:sub(1,1) == ":" ) then
+ minetest.chat_send_player(name, "All members of your playergroup "..tostring(help[2]:sub(2)).." may now use/access this locked object.");
+ else
+ minetest.chat_send_player(name, help[2].." may now use/access this locked object.");
+ end
+ return;
+ end
+
+
+ if( help[1]=="/del" ) then
+
+ userlist = meta:get_string("allowed_users"):split( ","..help[2] );
+ meta:set_string( "allowed_users", ( userlist[1] or "" )..(userlist[2] or "" ));
+
+ minetest.chat_send_player(name, "Access for player \""..tostring(help[2]).."\" has been revoked.");
+ return;
+ end
+
+ minetest.chat_send_player(name, "Error: Command \""..tostring(help[1]).."\" not understood.");
+end
+
+
+
+-- craftitem; that can be used to craft shared locked objects
+minetest.register_craftitem("locks:lock", {
+ description = "Lock to lock and share objects",
+ image = "locks_lock16.png",
+});
+
+
+minetest.register_craft({
+ output = "locks:lock 2",
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot','default:steel_ingot'},
+ {'default:steel_ingot', '', 'default:steel_ingot'},
+ {'', 'default:steel_ingot',''},
+ }
+ });
+
+
+-- a key allowes to open your own shared locked objects
+minetest.register_craftitem("locks:key", {
+ description = "Key to open your own shared locked objects",
+ image = "locks_key32.png",
+});
+
+minetest.register_craft({
+ output = "locks:key",
+ recipe = {
+ {'', 'default:stick', ''},
+ {'', 'default:steel_ingot',''},
+ }
+ });
+
+
+
+-- in order to open shared locked objects of other players, a keychain is needed (plus the owner has to admit it via /add playername or through /set password)
+minetest.register_craftitem("locks:keychain", {
+ description = "Keychain to open shared locked objects of others",
+ image = "locks_keychain32.png",
+});
+
+minetest.register_craft({
+ output = "locks:keychain",
+ recipe = {
+ {'', 'default:steel_ingot', '' },
+ {'locks:key', 'locks:key', 'locks:key'},
+ }
+ });
+
+dofile(minetest.get_modpath("locks").."/shared_locked_chest.lua");
+dofile(minetest.get_modpath("locks").."/shared_locked_sign_wall.lua");
+dofile(minetest.get_modpath("locks").."/shared_locked_xdoors2.lua");
+dofile(minetest.get_modpath("locks").."/shared_locked_furnace.lua");
+
+
diff --git a/locks/shared_locked_chest.lua b/locks/shared_locked_chest.lua
index 66496b1..f40bde8 100644
--- a/locks/shared_locked_chest.lua
+++ b/locks/shared_locked_chest.lua
@@ -1,137 +1,138 @@
--- 09.01.13 Added support for pipeworks.
-
-
-locks.chest_add = {};
-locks.chest_add.tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
- "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"};
-locks.chest_add.groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2};
-locks.chest_add.tube = {};
-
--- additional/changed definitions for pipeworks;
--- taken from pipeworks/compat.lua
-if( locks.pipeworks_enabled ) then
- locks.chest_add.tiles = {
- "default_chest_top.png^pipeworks_tube_connection_wooden.png",
- "default_chest_top.png^pipeworks_tube_connection_wooden.png",
- "default_chest_side.png^pipeworks_tube_connection_wooden.png",
- "default_chest_side.png^pipeworks_tube_connection_wooden.png",
- "default_chest_side.png^pipeworks_tube_connection_wooden.png"};
- locks.chest_add.groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,
- tubedevice = 1, tubedevice_receiver = 1 };
- locks.chest_add.tube = {
- insert_object = function(pos, node, stack, direction)
- local meta = minetest.env:get_meta(pos)
- local inv = meta:get_inventory()
- return inv:add_item("main", stack)
- end,
- can_insert = function(pos, node, stack, direction)
- local meta = minetest.env:get_meta(pos)
- local inv = meta:get_inventory()
- return inv:room_for_item("main", stack)
- end,
- input_inventory = "main",
- connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1}
- };
-end
-
-
-minetest.register_node("locks:shared_locked_chest", {
- description = "Shared locked chest",
- tiles = locks.chest_add.tiles,
- paramtype2 = "facedir",
- groups = locks.chest_add.groups,
- tube = locks.chest_add.tube,
- legacy_facedir_simple = true,
-
- on_construct = function(pos)
- local meta = minetest.env:get_meta(pos)
- -- prepare the lock of the chest
- locks:lock_init( pos,
- "size[8,10]"..
--- "field[0.5,0.2;8,1.0;locks_sent_lock_command;Locked chest. Type password, command or /help for help:;]"..
--- "button_exit[3,0.8;2,1.0;locks_sent_input;Proceed]"..
- "list[current_name;main;0,0;8,4;]"..
- "list[current_player;main;0,5;8,4;]"..
- "field[0.3,9.6;6,0.7;locks_sent_lock_command;Locked chest. Type /help for help:;]"..
- "background[-0.5,-0.65;9,11.2;bg_shared_locked_chest.jpg]"..
- "button_exit[6.3,9.2;1.7,0.7;locks_sent_input;Proceed]" );
--- "size[8,9]"..
--- "list[current_name;main;0,0;8,4;]"..
--- "list[current_player;main;0,5;8,4;]");
- local inv = meta:get_inventory()
- inv:set_size("main", 8*4)
- end,
-
- after_place_node = function(pos, placer)
-
- if( locks.pipeworks_enabled ) then
- pipeworks.scan_for_tube_objects( pos );
- end
-
- locks:lock_set_owner( pos, placer, "Shared locked chest" );
- end,
-
-
- can_dig = function(pos,player)
-
- if( not(locks:lock_allow_dig( pos, player ))) then
- return false;
- end
- local meta = minetest.env:get_meta(pos);
- local inv = meta:get_inventory()
- return inv:is_empty("main")
- end,
-
- on_receive_fields = function(pos, formname, fields, sender)
- locks:lock_handle_input( pos, formname, fields, sender );
- end,
-
-
-
- allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
- if( not( locks:lock_allow_use( pos, player ))) then
- return 0;
- end
- return count;
- end,
- allow_metadata_inventory_put = function(pos, listname, index, stack, player)
- if( not( locks:lock_allow_use( pos, player ))) then
- return 0;
- end
- return stack:get_count()
- end,
- allow_metadata_inventory_take = function(pos, listname, index, stack, player)
- if( not( locks:lock_allow_use( pos, player ))) then
- return 0;
- end
- return stack:get_count()
- end,
- on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
- minetest.log("action", player:get_player_name()..
- " moves stuff in locked shared chest at "..minetest.pos_to_string(pos))
- end,
- on_metadata_inventory_put = function(pos, listname, index, stack, player)
- minetest.log("action", player:get_player_name()..
- " moves stuff to locked shared chest at "..minetest.pos_to_string(pos))
- end,
- on_metadata_inventory_take = function(pos, listname, index, stack, player)
- minetest.log("action", player:get_player_name()..
- " takes stuff from locked shared chest at "..minetest.pos_to_string(pos))
- end,
-
-
- after_dig_node = function( pos )
- if( locks.pipeworks_enabled ) then
- pipeworks.scan_for_tube_objects(pos)
- end
- end
-})
-
-minetest.register_craft({
- output = 'locks:shared_locked_chest',
- recipe = {
- { 'default:chest', 'locks:lock', '' },
- },
-})
-
-print( "[Mod] locks: loading locks:shared_locked_chest");
+-- 09.01.13 Added support for pipeworks.
+
+
+locks.chest_add = {};
+locks.chest_add.tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
+ "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"};
+locks.chest_add.groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2};
+locks.chest_add.tube = {};
+
+-- additional/changed definitions for pipeworks;
+-- taken from pipeworks/compat.lua
+if( locks.pipeworks_enabled ) then
+ locks.chest_add.tiles = {
+ "default_chest_top.png^pipeworks_tube_connection_wooden.png",
+ "default_chest_top.png^pipeworks_tube_connection_wooden.png",
+ "default_chest_side.png^pipeworks_tube_connection_wooden.png",
+ "default_chest_side.png^pipeworks_tube_connection_wooden.png",
+ "default_chest_side.png^pipeworks_tube_connection_wooden.png",
+ "default_chest_front.png"};
+ locks.chest_add.groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,
+ tubedevice = 1, tubedevice_receiver = 1 };
+ locks.chest_add.tube = {
+ insert_object = function(pos, node, stack, direction)
+ local meta = minetest.env:get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:add_item("main", stack)
+ end,
+ can_insert = function(pos, node, stack, direction)
+ local meta = minetest.env:get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:room_for_item("main", stack)
+ end,
+ input_inventory = "main",
+ connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1}
+ };
+end
+
+
+minetest.register_node("locks:shared_locked_chest", {
+ description = "Shared locked chest",
+ tiles = locks.chest_add.tiles,
+ paramtype2 = "facedir",
+ groups = locks.chest_add.groups,
+ tube = locks.chest_add.tube,
+ legacy_facedir_simple = true,
+
+ on_construct = function(pos)
+ local meta = minetest.env:get_meta(pos)
+ -- prepare the lock of the chest
+ locks:lock_init( pos,
+ "size[8,10]"..
+-- "field[0.5,0.2;8,1.0;locks_sent_lock_command;Locked chest. Type password, command or /help for help:;]"..
+-- "button_exit[3,0.8;2,1.0;locks_sent_input;Proceed]"..
+ "list[current_name;main;0,0;8,4;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "field[0.3,9.6;6,0.7;locks_sent_lock_command;Locked chest. Type /help for help:;]"..
+ "background[-0.5,-0.65;9,11.2;bg_shared_locked_chest.jpg]"..
+ "button_exit[6.3,9.2;1.7,0.7;locks_sent_input;Proceed]" );
+-- "size[8,9]"..
+-- "list[current_name;main;0,0;8,4;]"..
+-- "list[current_player;main;0,5;8,4;]");
+ local inv = meta:get_inventory()
+ inv:set_size("main", 8*4)
+ end,
+
+ after_place_node = function(pos, placer)
+
+ if( locks.pipeworks_enabled ) then
+ pipeworks.scan_for_tube_objects( pos );
+ end
+
+ locks:lock_set_owner( pos, placer, "Shared locked chest" );
+ end,
+
+
+ can_dig = function(pos,player)
+
+ if( not(locks:lock_allow_dig( pos, player ))) then
+ return false;
+ end
+ local meta = minetest.env:get_meta(pos);
+ local inv = meta:get_inventory()
+ return inv:is_empty("main")
+ end,
+
+ on_receive_fields = function(pos, formname, fields, sender)
+ locks:lock_handle_input( pos, formname, fields, sender );
+ end,
+
+
+
+ allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
+ if( not( locks:lock_allow_use( pos, player ))) then
+ return 0;
+ end
+ return count;
+ end,
+ allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+ if( not( locks:lock_allow_use( pos, player ))) then
+ return 0;
+ end
+ return stack:get_count()
+ end,
+ allow_metadata_inventory_take = function(pos, listname, index, stack, player)
+ if( not( locks:lock_allow_use( pos, player ))) then
+ return 0;
+ end
+ return stack:get_count()
+ end,
+ on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
+ minetest.log("action", player:get_player_name()..
+ " moves stuff in locked shared chest at "..minetest.pos_to_string(pos))
+ end,
+ on_metadata_inventory_put = function(pos, listname, index, stack, player)
+ minetest.log("action", player:get_player_name()..
+ " moves stuff to locked shared chest at "..minetest.pos_to_string(pos))
+ end,
+ on_metadata_inventory_take = function(pos, listname, index, stack, player)
+ minetest.log("action", player:get_player_name()..
+ " takes stuff from locked shared chest at "..minetest.pos_to_string(pos))
+ end,
+
+
+ after_dig_node = function( pos )
+ if( locks.pipeworks_enabled ) then
+ pipeworks.scan_for_tube_objects(pos)
+ end
+ end
+})
+
+minetest.register_craft({
+ output = 'locks:shared_locked_chest',
+ recipe = {
+ { 'default:chest', 'locks:lock', '' },
+ },
+})
+
+print( "[Mod] locks: loading locks:shared_locked_chest");
diff --git a/maptools/default_nodes.lua b/maptools/default_nodes.lua
index b7a2a98..eb74b4c 100644
--- a/maptools/default_nodes.lua
+++ b/maptools/default_nodes.lua
@@ -17,6 +17,7 @@ minetest.register_node("maptools:stone", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:stonebrick", {
@@ -27,6 +28,7 @@ minetest.register_node("maptools:stonebrick", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:tree", {
@@ -37,7 +39,8 @@ minetest.register_node("maptools:tree", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_wood_defaults(),
- on_place = minetest.rotate_node
+ on_place = minetest.rotate_node,
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:jungletree", {
@@ -48,7 +51,8 @@ minetest.register_node("maptools:jungletree", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_wood_defaults(),
- on_place = minetest.rotate_node
+ on_place = minetest.rotate_node,
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:cactus", {
@@ -59,7 +63,8 @@ minetest.register_node("maptools:cactus", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_wood_defaults(),
- on_place = minetest.rotate_node
+ on_place = minetest.rotate_node,
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:papyrus", {
@@ -80,6 +85,7 @@ minetest.register_node("maptools:papyrus", {
},
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_leaves_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:dirt", {
@@ -90,6 +96,7 @@ minetest.register_node("maptools:dirt", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_dirt_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:wood", {
@@ -100,6 +107,7 @@ minetest.register_node("maptools:wood", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_wood_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:junglewood", {
@@ -110,6 +118,7 @@ minetest.register_node("maptools:junglewood", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_wood_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:glass", {
@@ -123,6 +132,7 @@ minetest.register_node("maptools:glass", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_glass_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:leaves", {
@@ -135,6 +145,7 @@ minetest.register_node("maptools:leaves", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_leaves_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:sand", {
@@ -145,6 +156,7 @@ minetest.register_node("maptools:sand", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_sand_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:gravel", {
@@ -158,6 +170,7 @@ minetest.register_node("maptools:gravel", {
footstep = {name="default_gravel_footstep", gain=0.35},
dug = {name="default_gravel_footstep", gain=0.6},
}),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:clay", {
@@ -168,6 +181,7 @@ minetest.register_node("maptools:clay", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_dirt_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:desert_sand", {
@@ -178,6 +192,7 @@ minetest.register_node("maptools:desert_sand", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_sand_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:sandstone", {
@@ -188,6 +203,7 @@ minetest.register_node("maptools:sandstone", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:sandstone_brick", {
@@ -198,6 +214,7 @@ minetest.register_node("maptools:sandstone_brick", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:desert_stone", {
@@ -208,6 +225,7 @@ minetest.register_node("maptools:desert_stone", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:desert_cobble", {
@@ -218,6 +236,7 @@ minetest.register_node("maptools:desert_cobble", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:desert_stonebrick", {
@@ -228,6 +247,7 @@ minetest.register_node("maptools:desert_stonebrick", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:grass", {
@@ -241,6 +261,7 @@ minetest.register_node("maptools:grass", {
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain = 0.4},
}),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:fullgrass", {
@@ -253,6 +274,7 @@ minetest.register_node("maptools:fullgrass", {
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.4},
}),
+ on_drop = maptools.drop_msg
})
for slab_num = 1,3,1 do
@@ -272,6 +294,7 @@ for slab_num = 1,3,1 do
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_dirt_defaults({footstep = {name="default_grass_footstep", gain = 0.4}}),
+ on_drop = maptools.drop_msg
})
end
@@ -283,6 +306,7 @@ minetest.register_node("maptools:cobble", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:mossycobble", {
@@ -293,6 +317,7 @@ minetest.register_node("maptools:mossycobble", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:brick", {
@@ -303,6 +328,7 @@ minetest.register_node("maptools:brick", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:coalblock", {
@@ -313,6 +339,7 @@ minetest.register_node("maptools:coalblock", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
@@ -324,6 +351,7 @@ minetest.register_node("maptools:steelblock", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:goldblock", {
@@ -334,6 +362,7 @@ minetest.register_node("maptools:goldblock", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:copperblock", {
@@ -344,6 +373,7 @@ minetest.register_node("maptools:copperblock", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:bronzeblock", {
@@ -354,6 +384,7 @@ minetest.register_node("maptools:bronzeblock", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:diamondblock", {
@@ -364,6 +395,7 @@ minetest.register_node("maptools:diamondblock", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
-- Farming:
@@ -376,6 +408,7 @@ minetest.register_node("maptools:soil_wet", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative, soil = 3, wet = 1, grassland = 1},
sounds = default.node_sound_dirt_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:desert_sand_soil_wet", {
@@ -386,4 +419,5 @@ minetest.register_node("maptools:desert_sand_soil_wet", {
tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"},
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative, soil = 3, wet = 1, desert = 1},
sounds = default.node_sound_sand_defaults(),
+ on_drop = maptools.drop_msg
})
diff --git a/maptools/init.lua b/maptools/init.lua
index 7b9afcd..17d5e37 100644
--- a/maptools/init.lua
+++ b/maptools/init.lua
@@ -20,6 +20,11 @@ maptools.intllib = S
local modpath = minetest.get_modpath("maptools")
+maptools.drop_msg = function(itemstack, player)
+ local name = player:get_player_name()
+ minetest.chat_send_player(name, S("[maptools] tools/nodes do not drop!"))
+end
+
dofile(modpath .. "/config.lua")
dofile(modpath .. "/aliases.lua")
dofile(modpath .. "/craftitems.lua")
diff --git a/maptools/nodes.lua b/maptools/nodes.lua
index b97f8d9..d8e4212 100644
--- a/maptools/nodes.lua
+++ b/maptools/nodes.lua
@@ -16,6 +16,7 @@ minetest.register_node(":default:cloud", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_defaults(),
+ on_drop = maptools.drop_msg
})
-- Nodes
@@ -30,6 +31,7 @@ minetest.register_node("maptools:black", {
post_effect_color = {a=255, r=0, g=0, b=0},
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:white", {
@@ -41,6 +43,7 @@ minetest.register_node("maptools:white", {
post_effect_color = {a=255, r=128, g=128, b=128},
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_stone_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:playerclip", {
@@ -54,6 +57,7 @@ minetest.register_node("maptools:playerclip", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:fake_walkable", {
@@ -74,6 +78,7 @@ minetest.register_node("maptools:fake_walkable", {
},
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:fullclip", {
@@ -86,6 +91,7 @@ minetest.register_node("maptools:fullclip", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:fake_walkable_pointable", {
@@ -105,6 +111,7 @@ minetest.register_node("maptools:fake_walkable_pointable", {
},
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:ignore_like", {
@@ -117,6 +124,7 @@ minetest.register_node("maptools:ignore_like", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:ignore_like_no_clip", {
@@ -130,6 +138,7 @@ minetest.register_node("maptools:ignore_like_no_clip", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
@@ -144,6 +153,7 @@ minetest.register_node("maptools:ignore_like_no_point", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:ignore_like_no_clip_no_point", {
@@ -158,6 +168,7 @@ minetest.register_node("maptools:ignore_like_no_clip_no_point", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:fullclip_face", {
@@ -176,6 +187,7 @@ minetest.register_node("maptools:fullclip_face", {
},
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative, fall_damage_add_percent=-100},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:playerclip_bottom", {
@@ -194,6 +206,7 @@ minetest.register_node("maptools:playerclip_bottom", {
},
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative, fall_damage_add_percent=-100},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:playerclip_top", {
@@ -212,6 +225,7 @@ minetest.register_node("maptools:playerclip_top", {
},
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative, fall_damage_add_percent=-100},
+ on_drop = maptools.drop_msg
})
for pusher_num=1,10,1 do
@@ -231,6 +245,7 @@ minetest.register_node("maptools:pusher_" .. pusher_num, {
},
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative, fall_damage_add_percent=-100, bouncy=pusher_num*100},
+ on_drop = maptools.drop_msg
})
end
@@ -247,6 +262,7 @@ minetest.register_node("maptools:lightbulb", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:nobuild", {
@@ -261,6 +277,7 @@ minetest.register_node("maptools:nobuild", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:nointeract", {
@@ -274,6 +291,7 @@ minetest.register_node("maptools:nointeract", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:climb", {
@@ -289,6 +307,7 @@ minetest.register_node("maptools:climb", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
for damage_num=1,5,1 do
@@ -305,6 +324,7 @@ minetest.register_node("maptools:damage_" .. damage_num, {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
end
@@ -321,6 +341,7 @@ minetest.register_node("maptools:kill", {
sunlight_propagates = true,
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:smoke", {
@@ -334,6 +355,7 @@ minetest.register_node("maptools:smoke", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
post_effect_color = {a=192, r=96, g=96, b=96},
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:ladder", {
@@ -354,6 +376,7 @@ minetest.register_node("maptools:ladder", {
drop = "",
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sounds = default.node_sound_wood_defaults(),
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:permanent_fire", {
@@ -373,6 +396,7 @@ minetest.register_node("maptools:permanent_fire", {
sunlight_propagates = true,
walkable = false,
damage_per_second = 4,
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:fake_fire", {
@@ -391,6 +415,7 @@ minetest.register_node("maptools:fake_fire", {
groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative},
sunlight_propagates = true,
walkable = false,
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:igniter", {
@@ -406,6 +431,7 @@ minetest.register_node("maptools:igniter", {
sunlight_propagates = true,
pointable = false,
walkable = false,
+ on_drop = maptools.drop_msg
})
minetest.register_node("maptools:superapple", {
@@ -426,4 +452,5 @@ minetest.register_node("maptools:superapple", {
groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory = maptools.creative},
on_use = minetest.item_eat(20),
sounds = default.node_sound_defaults(),
+ on_drop = maptools.drop_msg
})
diff --git a/maptools/tools.lua b/maptools/tools.lua
index e42d2f5..a5c5933 100644
--- a/maptools/tools.lua
+++ b/maptools/tools.lua
@@ -28,6 +28,7 @@ minetest.register_tool("maptools:pick_admin", {
},
damage_groups = {fleshy = 1000},
},
+ on_drop = maptools.drop_msg
})
minetest.register_tool("maptools:pick_admin_with_drops", {
@@ -49,6 +50,7 @@ minetest.register_tool("maptools:pick_admin_with_drops", {
},
damage_groups = {fleshy = 1000},
},
+ on_drop = maptools.drop_msg
})
minetest.register_on_punchnode(function(pos, node, puncher)
@@ -56,6 +58,6 @@ minetest.register_on_punchnode(function(pos, node, puncher)
and minetest.get_node(pos).name ~= "air" then
minetest.log("action", puncher:get_player_name() .. " digs " .. minetest.get_node(pos).name .. " at " .. minetest.pos_to_string(pos) .. " using an Admin Pickaxe.")
minetest.remove_node(pos) -- The node is removed directly, which means it even works on non-empty containers and group-less nodes.
- nodeupdate(pos) -- Run node update actions like falling nodes.
+ minetest.check_for_falling(pos) -- Run node update actions like falling nodes.
end
end)
diff --git a/mesecons/oldwires.lua b/mesecons/oldwires.lua
index 43bf302..8d6c6b1 100644
--- a/mesecons/oldwires.lua
+++ b/mesecons/oldwires.lua
@@ -30,7 +30,7 @@ minetest.register_node("mesecons:mesecon_on", {
},
groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1},
drop = "mesecons:mesecon_off 1",
- light_source = default.LIGHT_MAX-11,
+ light_source = minetest.LIGHT_MAX-11,
mesecons = {conductor={
state = mesecon.state.on,
offstate = "mesecons:mesecon_off"
diff --git a/mesecons_button/init.lua b/mesecons_button/init.lua
index 104fc5b..8764fbc 100644
--- a/mesecons_button/init.lua
+++ b/mesecons_button/init.lua
@@ -73,7 +73,7 @@ minetest.register_node("mesecons_button:button_on", {
legacy_wallmounted = true,
walkable = false,
on_rotate = false,
- light_source = default.LIGHT_MAX-7,
+ light_source = minetest.LIGHT_MAX-7,
sunlight_propagates = true,
selection_box = {
type = "fixed",
diff --git a/mesecons_delayer/init.lua b/mesecons_delayer/init.lua
index 0cbfd42..94450db 100644
--- a/mesecons_delayer/init.lua
+++ b/mesecons_delayer/init.lua
@@ -158,6 +158,7 @@ minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), {
end,
delayer_time = delaytime,
delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i),
+ sounds = default.node_sound_stone_defaults(),
mesecons = {
receptor =
{
diff --git a/mesecons_extrawires/corner.lua b/mesecons_extrawires/corner.lua
index 8dc9866..d0b01f9 100644
--- a/mesecons_extrawires/corner.lua
+++ b/mesecons_extrawires/corner.lua
@@ -42,6 +42,7 @@ minetest.register_node("mesecons_extrawires:corner_on", {
node_box = corner_nodebox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_extrawires:corner_off",
+ sounds = default.node_sound_defaults(),
mesecons = {conductor =
{
state = mesecon.state.on,
@@ -71,6 +72,7 @@ minetest.register_node("mesecons_extrawires:corner_off", {
selection_box = corner_selectionbox,
node_box = corner_nodebox,
groups = {dig_immediate = 3},
+ sounds = default.node_sound_defaults(),
mesecons = {conductor =
{
state = mesecon.state.off,
diff --git a/mesecons_extrawires/crossover.lua b/mesecons_extrawires/crossover.lua
index 4aefbbc..b8d66f7 100644
--- a/mesecons_extrawires/crossover.lua
+++ b/mesecons_extrawires/crossover.lua
@@ -34,6 +34,7 @@ minetest.register_node("mesecons_extrawires:crossover_off", {
stack_max = 99,
selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
groups = {dig_immediate=3, mesecon=3},
+ sounds = default.node_sound_defaults(),
mesecons = {
conductor = {
states = crossover_states,
@@ -60,6 +61,7 @@ minetest.register_node("mesecons_extrawires:crossover_01", {
stack_max = 99,
selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1},
+ sounds = default.node_sound_defaults(),
mesecons = {
conductor = {
states = crossover_states,
@@ -86,6 +88,7 @@ minetest.register_node("mesecons_extrawires:crossover_10", {
stack_max = 99,
selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1},
+ sounds = default.node_sound_defaults(),
mesecons = {
conductor = {
states = crossover_states,
@@ -112,6 +115,7 @@ minetest.register_node("mesecons_extrawires:crossover_on", {
stack_max = 99,
selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1},
+ sounds = default.node_sound_defaults(),
mesecons = {
conductor = {
states = crossover_states,
diff --git a/mesecons_extrawires/tjunction.lua b/mesecons_extrawires/tjunction.lua
index 53a69f6..e98b066 100644
--- a/mesecons_extrawires/tjunction.lua
+++ b/mesecons_extrawires/tjunction.lua
@@ -43,6 +43,7 @@ minetest.register_node("mesecons_extrawires:tjunction_on", {
node_box = tjunction_nodebox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_extrawires:tjunction_off",
+ sounds = default.node_sound_defaults(),
mesecons = {conductor =
{
state = mesecon.state.on,
@@ -72,6 +73,7 @@ minetest.register_node("mesecons_extrawires:tjunction_off", {
selection_box = tjunction_selectionbox,
node_box = tjunction_nodebox,
groups = {dig_immediate = 3},
+ sounds = default.node_sound_defaults(),
mesecons = {conductor =
{
state = mesecon.state.off,
diff --git a/mesecons_extrawires/vertical.lua b/mesecons_extrawires/vertical.lua
index 1cff013..1543194 100644
--- a/mesecons_extrawires/vertical.lua
+++ b/mesecons_extrawires/vertical.lua
@@ -88,7 +88,8 @@ mesecon.register_node("mesecons_extrawires:vertical", {
is_vertical_conductor = true,
drop = "mesecons_extrawires:vertical_off",
after_place_node = vertical_update,
- after_dig_node = vertical_update
+ after_dig_node = vertical_update,
+ sounds = default.node_sound_defaults(),
},{
tiles = {"mesecons_wire_off.png"},
groups = {dig_immediate=3},
@@ -121,7 +122,8 @@ mesecon.register_node("mesecons_extrawires:vertical_top", {
is_vertical_conductor = true,
drop = "mesecons_extrawires:vertical_off",
after_place_node = vertical_update,
- after_dig_node = vertical_update
+ after_dig_node = vertical_update,
+ sounds = default.node_sound_defaults(),
},{
tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = {
@@ -152,7 +154,8 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", {
is_vertical_conductor = true,
drop = "mesecons_extrawires:vertical_off",
after_place_node = vertical_update,
- after_dig_node = vertical_update
+ after_dig_node = vertical_update,
+ sounds = default.node_sound_defaults(),
},{
tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = {
diff --git a/mesecons_hydroturbine/init.lua b/mesecons_hydroturbine/init.lua
index 395b8f6..afa21e9 100644
--- a/mesecons_hydroturbine/init.lua
+++ b/mesecons_hydroturbine/init.lua
@@ -22,7 +22,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 },
},
- sounds = default.node_sound_stone_defaults(),
+ sounds = default.node_sound_metal_defaults(),
mesecons = {receptor = {
state = mesecon.state.off
}},
@@ -51,7 +51,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 },
},
- sounds = default.node_sound_stone_defaults(),
+ sounds = default.node_sound_metal_defaults(),
mesecons = {receptor = {
state = mesecon.state.on
}},
diff --git a/mesecons_insulated/init.lua b/mesecons_insulated/init.lua
index 92ff639..b917323 100644
--- a/mesecons_insulated/init.lua
+++ b/mesecons_insulated/init.lua
@@ -35,6 +35,7 @@ minetest.register_node("mesecons_insulated:insulated_on", {
},
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_insulated:insulated_off",
+ sounds = default.node_sound_defaults(),
mesecons = {conductor = {
state = mesecon.state.on,
offstate = "mesecons_insulated:insulated_off",
@@ -69,6 +70,7 @@ minetest.register_node("mesecons_insulated:insulated_off", {
fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }
},
groups = {dig_immediate = 3},
+ sounds = default.node_sound_defaults(),
mesecons = {conductor = {
state = mesecon.state.off,
onstate = "mesecons_insulated:insulated_on",
diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua
index 325e16f..0f8adbc 100644
--- a/mesecons_luacontroller/init.lua
+++ b/mesecons_luacontroller/init.lua
@@ -198,7 +198,11 @@ end
-------------------------
local function safe_print(param)
+ local string_meta = getmetatable("")
+ local sandbox = string_meta.__index
+ string_meta.__index = string -- Leave string sandbox temporarily
print(dump(param))
+ string_meta.__index = sandbox -- Restore string sandbox
end
local function safe_date()
@@ -718,7 +722,7 @@ local function on_receive_fields(pos, form_name, fields, sender)
local ok, err = set_program(pos, fields.code)
if not ok then
-- it's not an error from the server perspective
- minetest.log("action", "Lua controller programming error: " .. err)
+ minetest.log("action", "Lua controller programming error: " .. tostring(err))
end
end
diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua
index 46272b9..9b1bf3b 100644
--- a/mesecons_microcontroller/init.lua
+++ b/mesecons_microcontroller/init.lua
@@ -103,6 +103,12 @@ minetest.register_node(nodename, {
meta:set_string("eeprom", r)
end,
on_receive_fields = function(pos, formanme, fields, sender)
+ local player_name = sender:get_player_name()
+ if minetest.is_protected(pos, player_name) and
+ not minetest.check_player_privs(player_name, {protection_bypass=true}) then
+ minetest.record_protection_violation(pos, player_name)
+ return
+ end
local meta = minetest.get_meta(pos)
if fields.band then
fields.code = "sbi(C, A&B) :A and B are inputs, C is output"
@@ -272,7 +278,7 @@ yc.parsecode = function(code, pos)
end
yc.parse_get_command = function(code, starti)
- i = starti
+ local i = starti
local s
while s ~= "" do
s = string.sub(code, i, i)
@@ -298,7 +304,7 @@ yc.parse_get_command = function(code, starti)
end
yc.parse_get_params = function(code, starti)
- i = starti
+ local i = starti
local s
local params = {}
local is_string = false
@@ -321,7 +327,7 @@ yc.parse_get_params = function(code, starti)
end
yc.parse_get_eeprom_param = function(cond, starti)
- i = starti
+ local i = starti
local s
local addr
while s ~= "" do
@@ -488,7 +494,7 @@ end
--Condition parsing
yc.command_if_getcondition = function(code, starti)
- i = starti
+ local i = starti
local s
local brackets = 1 --1 Bracket to close
while s ~= "" do
diff --git a/mesecons_movestones/init.lua b/mesecons_movestones/init.lua
index 76fd3cd..7a2f7e8 100644
--- a/mesecons_movestones/init.lua
+++ b/mesecons_movestones/init.lua
@@ -60,14 +60,16 @@ function mesecon.register_movestone(name, def, is_sticky, is_vertical)
minetest.get_node_timer(frontpos):start(timer_interval)
-- ### Step 3: If sticky, pull stack behind ###
- if not is_sticky then
- return
- end
- local backpos = vector.subtract(pos, direction)
- success, stack, oldstack = mesecon.mvps_pull_all(backpos, direction, max_pull)
- if success then
- mesecon.mvps_move_objects(backpos, vector.multiply(direction, -1), oldstack, -1)
+ if is_sticky then
+ local backpos = vector.subtract(pos, direction)
+ success, stack, oldstack = mesecon.mvps_pull_all(backpos, direction, max_pull)
+ if success then
+ mesecon.mvps_move_objects(backpos, vector.multiply(direction, -1), oldstack, -1)
+ end
end
+
+ -- ### Step 4: Let things fall ###
+ minetest.check_for_falling(vector.add(pos, {x=0, y=1, z=0}))
end
def.is_ground_content = false
diff --git a/mesecons_pistons/init.lua b/mesecons_pistons/init.lua
index e10b604..386cffa 100644
--- a/mesecons_pistons/init.lua
+++ b/mesecons_pistons/init.lua
@@ -326,6 +326,7 @@ minetest.register_node("mesecons_pistons:piston_pusher_normal", {
node_box = piston_pusher_box,
on_rotate = piston_rotate_pusher,
drop = "",
+ sounds = default.node_sound_wood_defaults(),
})
-- Sticky ones
@@ -403,6 +404,7 @@ minetest.register_node("mesecons_pistons:piston_pusher_sticky", {
node_box = piston_pusher_box,
on_rotate = piston_rotate_pusher,
drop = "",
+ sounds = default.node_sound_wood_defaults(),
})
diff --git a/mesecons_powerplant/init.lua b/mesecons_powerplant/init.lua
index 28cad25..356fb12 100644
--- a/mesecons_powerplant/init.lua
+++ b/mesecons_powerplant/init.lua
@@ -10,7 +10,7 @@ minetest.register_node("mesecons_powerplant:power_plant", {
is_ground_content = false,
walkable = false,
groups = {dig_immediate=3, mesecon = 2},
- light_source = default.LIGHT_MAX-9,
+ light_source = minetest.LIGHT_MAX-9,
description="Power Plant",
selection_box = {
type = "fixed",
diff --git a/mesecons_pressureplates/init.lua b/mesecons_pressureplates/init.lua
index 6337941..1a503e9 100644
--- a/mesecons_pressureplates/init.lua
+++ b/mesecons_pressureplates/init.lua
@@ -42,8 +42,18 @@ end
-- tiles_on: textures of the pressure plate when active
-- image: inventory and wield image of the pressure plate
-- recipe: crafting recipe of the pressure plate
+-- groups: groups
+-- sounds: sound table
+
+function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe, groups, sounds)
+ local groups_off, groups_on
+ if not groups then
+ groups = {}
+ end
+ local groups_off = table.copy(groups)
+ local groups_on = table.copy(groups)
+ groups_on.not_in_creative_inventory = 1
-function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe)
mesecon.register_node(basename, {
drawtype = "nodebox",
inventory_image = image_i,
@@ -56,17 +66,18 @@ function mesecon.register_pressure_plate(basename, description, textures_off, te
on_construct = function(pos)
minetest.get_node_timer(pos):start(mesecon.setting("pplate_interval", 0.1))
end,
+ sounds = sounds,
},{
mesecons = {receptor = { state = mesecon.state.off, rules = mesecon.rules.pplate }},
node_box = pp_box_off,
selection_box = pp_box_off,
- groups = {snappy = 2, oddly_breakable_by_hand = 3},
+ groups = groups_off,
tiles = textures_off
},{
mesecons = {receptor = { state = mesecon.state.on, rules = mesecon.rules.pplate }},
node_box = pp_box_on,
selection_box = pp_box_on,
- groups = {snappy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1},
+ groups = groups_on,
tiles = textures_on
})
@@ -83,7 +94,9 @@ mesecon.register_pressure_plate(
{"jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on_edges.png"},
"jeija_pressure_plate_wood_wield.png",
"jeija_pressure_plate_wood_inv.png",
- {{"group:wood", "group:wood"}})
+ {{"group:wood", "group:wood"}},
+ { choppy = 3, oddly_breakable_by_hand = 3 },
+ default.node_sound_wood_defaults())
mesecon.register_pressure_plate(
"mesecons_pressureplates:pressure_plate_stone",
@@ -92,4 +105,6 @@ mesecon.register_pressure_plate(
{"jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on_edges.png"},
"jeija_pressure_plate_stone_wield.png",
"jeija_pressure_plate_stone_inv.png",
- {{"default:cobble", "default:cobble"}})
+ {{"default:cobble", "default:cobble"}},
+ { cracky = 3, oddly_breakable_by_hand = 3 },
+ default.node_sound_stone_defaults())
diff --git a/mesecons_receiver/init.lua b/mesecons_receiver/init.lua
index edf6622..476131d 100644
--- a/mesecons_receiver/init.lua
+++ b/mesecons_receiver/init.lua
@@ -56,6 +56,7 @@ mesecon.register_node("mesecons_receiver:receiver", {
},
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons:wire_00000000_off",
+ sounds = default.node_sound_defaults(),
}, {
tiles = {
"receiver_top_off.png",
@@ -104,6 +105,7 @@ mesecon.register_node("mesecons_receiver:receiver_up", {
},
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons:wire_00000000_off",
+ sounds = default.node_sound_defaults(),
}, {
tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = {
@@ -148,6 +150,7 @@ mesecon.register_node("mesecons_receiver:receiver_down", {
},
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons:wire_00000000_off",
+ sounds = default.node_sound_defaults(),
}, {
tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = {
@@ -206,7 +209,6 @@ function mesecon.receiver_place(rcpt_pos)
local param2 = minetest.dir_to_facedir(minetest.facedir_to_dir(node.param2))
if string.find(nn.name, "mesecons:wire_") ~= nil then
- minetest.dig_node(pos)
minetest.set_node(pos, {name = rcvtype, param2 = param2})
mesecon.on_placenode(pos, nn)
end
@@ -215,8 +217,7 @@ end
function mesecon.receiver_remove(rcpt_pos, dugnode)
local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, dugnode.param2)
local nn = minetest.get_node(pos)
- if string.find(nn.name, "mesecons_receiver:receiver_") ~=nil then
- minetest.dig_node(pos)
+ if string.find(nn.name, "mesecons_receiver:receiver_") ~= nil then
local node = {name = "mesecons:wire_00000000_off"}
minetest.set_node(pos, node)
mesecon.on_placenode(pos, node)
diff --git a/mesecons_torch/init.lua b/mesecons_torch/init.lua
index 5f1d25a..867c909 100644
--- a/mesecons_torch/init.lua
+++ b/mesecons_torch/init.lua
@@ -60,6 +60,7 @@ minetest.register_node("mesecons_torch:mesecon_torch_off", {
selection_box = torch_selectionbox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_torch:mesecon_torch_on",
+ sounds = default.node_sound_defaults(),
mesecons = {receptor = {
state = mesecon.state.off,
rules = torch_get_output_rules
@@ -79,8 +80,9 @@ minetest.register_node("mesecons_torch:mesecon_torch_on", {
paramtype2 = "wallmounted",
selection_box = torch_selectionbox,
groups = {dig_immediate=3},
- light_source = default.LIGHT_MAX-5,
+ light_source = minetest.LIGHT_MAX-5,
description="Mesecon Torch",
+ sounds = default.node_sound_defaults(),
mesecons = {receptor = {
state = mesecon.state.on,
rules = torch_get_output_rules
diff --git a/mesecons_wires/init.lua b/mesecons_wires/init.lua
index 1766a99..3ca9cbc 100644
--- a/mesecons_wires/init.lua
+++ b/mesecons_wires/init.lua
@@ -215,6 +215,7 @@ local function register_wires()
walkable = false,
drop = "mesecons:wire_00000000_off",
mesecon_wire = true,
+ sounds = default.node_sound_defaults(),
on_rotate = false,
}, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off},
{tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on})
diff --git a/moreblocks/redefinitions.lua b/moreblocks/redefinitions.lua
index 13b8f0b..437c2d3 100644
--- a/moreblocks/redefinitions.lua
+++ b/moreblocks/redefinitions.lua
@@ -25,6 +25,11 @@ minetest.register_craft({
}
})
+minetest.clear_craft({
+ recipe = {
+ {"default:papyrus", "default:papyrus", "default:papyrus"}
+ }
+})
minetest.register_craft({
output = "default:paper 4",
recipe = {
diff --git a/moreblocks/stairsplus/registrations.lua b/moreblocks/stairsplus/registrations.lua
index 1e86954..dc89234 100644
--- a/moreblocks/stairsplus/registrations.lua
+++ b/moreblocks/stairsplus/registrations.lua
@@ -71,6 +71,8 @@ for _, name in pairs(default_nodes) do
mod = "moreblocks"
stairsplus:register_all(mod, name, nodename, ndef)
minetest.register_alias_force("stairs:stair_" .. name, mod .. ":stair_" .. name)
+ minetest.register_alias_force("stairs:stair_outer_" .. name, mod .. ":stair_" .. name .. "_outer")
+ minetest.register_alias_force("stairs:stair_inner_" .. name, mod .. ":stair_" .. name .. "_inner")
minetest.register_alias_force("stairs:slab_" .. name, mod .. ":slab_" .. name)
end
@@ -86,6 +88,8 @@ if minetest.get_modpath("farming") then
mod = "moreblocks"
stairsplus:register_all(mod, name, nodename, ndef)
minetest.register_alias_force("stairs:stair_" .. name, mod .. ":stair_" .. name)
+ minetest.register_alias_force("stairs:stair_outer_" .. name, mod .. ":stair_" .. name .. "_outer")
+ minetest.register_alias_force("stairs:stair_inner_" .. name, mod .. ":stair_" .. name .. "_inner")
minetest.register_alias_force("stairs:slab_" .. name, mod .. ":slab_" .. name)
end
end
diff --git a/pipeworks/common.lua b/pipeworks/common.lua
index 5574bb2..0f8c34c 100644
--- a/pipeworks/common.lua
+++ b/pipeworks/common.lua
@@ -157,3 +157,134 @@ function pipeworks.load_position(pos)
local vm = minetest.get_voxel_manip()
vm:read_from_map(pos, pos)
end
+
+local function delay(...)
+ local args = {...}
+ return (function() return unpack(args) end)
+end
+
+local function get_set_wrap(name, is_dynamic)
+ return (function(self)
+ return self["_" .. name]
+ end), (function(self, value)
+ if is_dynamic then
+ self["_" .. name] = type(value) == "table"
+ and table.copy(value) or value
+ end
+ end)
+end
+
+function pipeworks.create_fake_player(def, is_dynamic)
+ local wielded_item = ItemStack("")
+ if def.inventory and def.wield_list then
+ wielded_item = def.inventory:get_stack(def.wield_list, def.wield_index or 1)
+ end
+ local p = {
+ get_player_name = delay(def.name),
+ is_player = delay(true),
+ is_fake_player = true,
+
+ _formspec = def.formspec or default.gui_survival_form,
+ _hp = def.hp or 20,
+ _breath = 11,
+ _pos = def.position and table.copy(def.position) or vector.new(),
+ _properties = def.properties or { eye_height = def.eye_height or 1.47 },
+ _inventory = def.inventory,
+ _wield_index = def.wield_index or 1,
+ _wielded_item = wielded_item,
+
+ -- Model and view
+ _eye_offset1 = vector.new(),
+ _eye_offset3 = vector.new(),
+ set_eye_offset = function(self, first, third)
+ self._eye_offset1 = table.copy(first)
+ self._eye_offset3 = table.copy(third)
+ end,
+ get_eye_offset = function(self)
+ return self._eye_offset1, self._eye_offset3
+ end,
+ get_look_dir = delay(def.look_dir or {x=0, y=0, z=1}),
+ get_look_pitch = delay(def.look_pitch or 0),
+ get_look_yaw = delay(def.look_yaw or 0),
+ get_look_horizontal = delay(def.look_yaw or 0),
+ get_look_vertical = delay(-(def.look_pitch or 0)),
+ set_animation = delay(),
+
+ -- Controls
+ get_player_control = delay({
+ jump=false, right=false, left=false, LMB=false, RMB=false,
+ sneak=def.sneak, aux1=false, down=false, up=false
+ }),
+ get_player_control_bits = delay(def.sneak and 64 or 0),
+
+ -- Inventory and ItemStacks
+ get_inventory = delay(def.inventory),
+ set_wielded_item = function(self, item)
+ if self._inventory and def.wield_list then
+ return self._inventory:set_stack(def.wield_list,
+ self._wield_index, item)
+ end
+ _wielded_item = ItemStack(item)
+ end,
+ get_wielded_item = function(self, item)
+ if self._inventory and def.wield_list then
+ return self._inventory:get_stack(def.wield_list,
+ self._wield_index)
+ end
+ return ItemStack(self._wielded_item)
+ end,
+ get_wield_list = delay(def.wield_list),
+
+ punch = delay(),
+ remove = delay(),
+ right_click = delay(),
+ set_attach = delay(),
+ set_detach = delay(),
+ set_bone_position = delay(),
+ hud_change = delay(),
+ }
+ local _trash
+ -- Getter & setter functions
+ p.get_inventory_formspec, p.set_inventory_formspec
+ = get_set_wrap("formspec", is_dynamic)
+ p.get_breath, p.set_breath = get_set_wrap("breath", is_dynamic)
+ p.get_hp, p.set_hp = get_set_wrap("hp", is_dynamic)
+ p.get_pos, p.set_pos = get_set_wrap("pos", is_dynamic)
+ _trash, p.move_to = get_set_wrap("pos", is_dynamic)
+ p.get_wield_index, p.set_wield_index = get_set_wrap("wield_index", true)
+ p.get_properties, p.set_properties = get_set_wrap("properties", false)
+
+ -- Backwards compatibilty
+ p.getpos = p.get_pos
+ p.setpos = p.set_pos
+ p.moveto = p.move_to
+
+ -- TODO "implement" all these
+ -- set_armor_groups
+ -- get_armor_groups
+ -- get_animation
+ -- get_bone_position
+ -- get_player_velocity
+ -- set_look_pitch
+ -- set_look_yaw
+ -- set_physics_override
+ -- get_physics_override
+ -- hud_add
+ -- hud_remove
+ -- hud_get
+ -- hud_set_flags
+ -- hud_get_flags
+ -- hud_set_hotbar_itemcount
+ -- hud_get_hotbar_itemcount
+ -- hud_set_hotbar_image
+ -- hud_get_hotbar_image
+ -- hud_set_hotbar_selected_image
+ -- hud_get_hotbar_selected_image
+ -- hud_replace_builtin
+ -- set_sky
+ -- get_sky
+ -- override_day_night_ratio
+ -- get_day_night_ratio
+ -- set_local_animation
+ return p
+end
diff --git a/pipeworks/filter-injector.lua b/pipeworks/filter-injector.lua
index 0f651fb..a8659ad 100644
--- a/pipeworks/filter-injector.lua
+++ b/pipeworks/filter-injector.lua
@@ -167,11 +167,9 @@ local function punch_filter(data, filtpos, filtnode, msg)
local filtmeta = minetest.get_meta(filtpos)
local filtinv = filtmeta:get_inventory()
local owner = filtmeta:get_string("owner")
- local fakePlayer = {
- get_player_name = delay(owner),
- is_fake_player = ":pipeworks",
- get_wielded_item = delay(ItemStack(nil))
- } -- TODO: use a mechanism as the wielder one
+ local fakePlayer = pipeworks.create_fake_player({
+ name = owner
+ })
local dir = pipeworks.facedir_to_right_dir(filtnode.param2)
local frompos = vector.subtract(filtpos, dir)
local fromnode = minetest.get_node(frompos)
diff --git a/pipeworks/item_transport.lua b/pipeworks/item_transport.lua
index 7219f7e..388e2e7 100644
--- a/pipeworks/item_transport.lua
+++ b/pipeworks/item_transport.lua
@@ -13,7 +13,7 @@ function pipeworks.tube_inject_item(pos, start_pos, velocity, item, owner)
local obj = luaentity.add_entity(pos, "pipeworks:tubed_item")
obj:set_item(stack:to_string())
obj.start_pos = vector.new(start_pos)
- obj:setvelocity(velocity)
+ obj:set_velocity(velocity)
obj.owner = owner
--obj:set_color("red") -- todo: this is test-only code
return obj
@@ -207,7 +207,7 @@ minetest.register_entity("pipeworks:tubed_item", {
textures = {stack:get_name()}
})
local def = stack:get_definition()
- self.object:setyaw((def and def.type == "node") and 0 or math.pi * 0.25)
+ self.object:set_yaw((def and def.type == "node") and 0 or math.pi * 0.25)
end,
get_staticdata = luaentity.get_staticdata,
@@ -220,7 +220,7 @@ minetest.register_entity("pipeworks:tubed_item", {
return
end
local item = minetest.deserialize(staticdata)
- pipeworks.tube_inject_item(self.object:getpos(), item.start_pos, item.velocity, item.itemstring)
+ pipeworks.tube_inject_item(self.object:get_pos(), item.start_pos, item.velocity, item.itemstring)
self.object:remove()
end,
})
@@ -293,15 +293,15 @@ luaentity.register_entity("pipeworks:tubed_item", {
end,
on_step = function(self, dtime)
- local pos = self:getpos()
+ local pos = self:get_pos()
if self.start_pos == nil then
self.start_pos = vector.round(pos)
- self:setpos(pos)
+ self:set_pos(pos)
end
local stack = ItemStack(self.itemstring)
- local velocity = self:getvelocity()
+ local velocity = self:get_velocity()
local moved = false
local speed = math.abs(velocity.x + velocity.y + velocity.z)
@@ -331,8 +331,8 @@ luaentity.register_entity("pipeworks:tubed_item", {
return
end
velocity = vector.multiply(velocity, -1)
- self:setpos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1)))
- self:setvelocity(velocity)
+ self:set_pos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1)))
+ self:set_velocity(velocity)
self:set_item(leftover:to_string())
return
end
@@ -350,13 +350,13 @@ luaentity.register_entity("pipeworks:tubed_item", {
-- compatible with Minetest 0.4.13.
-- Using item_drop here makes Minetest 0.4.13 crash.
local dropped_item = minetest.add_item(self.start_pos, stack)
- dropped_item:setvelocity(vector.multiply(velocity, 5))
+ dropped_item:set_velocity(vector.multiply(velocity, 5))
self:remove()
return
else
velocity = vector.multiply(velocity, -1)
- self:setpos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1)))
- self:setvelocity(velocity)
+ self:set_pos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1)))
+ self:set_velocity(velocity)
end
elseif is_multimode(multimode) then
-- create new stacks according to returned data.
@@ -371,8 +371,8 @@ luaentity.register_entity("pipeworks:tubed_item", {
if new_velocity and not vector.equals(velocity, new_velocity) then
local nvelr = math.abs(new_velocity.x + new_velocity.y + new_velocity.z)
- self:setpos(vector.add(self.start_pos, vector.multiply(new_velocity, (moved_by - 1) / nvelr)))
- self:setvelocity(new_velocity)
+ self:set_pos(vector.add(self.start_pos, vector.multiply(new_velocity, (moved_by - 1) / nvelr)))
+ self:set_velocity(new_velocity)
end
end
end
@@ -388,11 +388,11 @@ if minetest.get_modpath("mesecons_mvps") then
end
for id, entity in pairs(luaentity.entities) do
if entity.name == "pipeworks:tubed_item" then
- local pos = entity:getpos()
+ local pos = entity:get_pos()
local rpos = vector.round(pos)
local dir = moved[minetest.hash_node_position(rpos)]
if dir then
- entity:setpos(vector.add(pos, dir))
+ entity:set_pos(vector.add(pos, dir))
entity.start_pos = vector.add(entity.start_pos, dir)
end
end
diff --git a/pipeworks/legacy.lua b/pipeworks/legacy.lua
index b36cded..bb92a8f 100644
--- a/pipeworks/legacy.lua
+++ b/pipeworks/legacy.lua
@@ -36,7 +36,7 @@ if not minetest.get_modpath("auto_tree_tap") and
end,
after_place_node = function (pos, placer)
pipeworks.scan_for_tube_objects(pos, placer)
- local placer_pos = placer:getpos()
+ local placer_pos = placer:get_pos()
--correct for the player's height
if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end
diff --git a/pipeworks/luaentity.lua b/pipeworks/luaentity.lua
index 34b6665..c11c030 100644
--- a/pipeworks/luaentity.lua
+++ b/pipeworks/luaentity.lua
@@ -74,7 +74,7 @@ local move_entities_globalstep_part1 = function(dtime)
local active_block_range = tonumber(minetest.settings:get("active_block_range")) or 2
local new_active_blocks = {}
for _, player in ipairs(minetest.get_connected_players()) do
- local blockpos = get_blockpos(player:getpos())
+ local blockpos = get_blockpos(player:get_pos())
local minp = vector.subtract(blockpos, active_block_range)
local maxp = vector.add(blockpos, active_block_range)
@@ -114,9 +114,9 @@ local entitydef_default = {
if not def.entity then
return
end
- def.entity:setpos(vector.add(self._pos, def.offset))
- def.entity:setvelocity(self._velocity)
- def.entity:setacceleration(self._acceleration)
+ def.entity:set_pos(vector.add(self._pos, def.offset))
+ def.entity:set_velocity(self._velocity)
+ def.entity:set_acceleration(self._acceleration)
end,
_attach_all = function(self)
local master = self._attached_entities_master
@@ -186,43 +186,43 @@ local entitydef_default = {
self:_add_attached(id)
end
end,
- getid = function(self)
+ get_id = function(self)
return self._id
end,
- getpos = function(self)
+ get_pos = function(self)
return vector.new(self._pos)
end,
- setpos = function(self, pos)
+ set_pos = function(self, pos)
self._pos = vector.new(pos)
--for _, entity in pairs(self._attached_entities) do
-- if entity.entity then
- -- entity.entity:setpos(vector.add(self._pos, entity.offset))
+ -- entity.entity:set_pos(vector.add(self._pos, entity.offset))
-- end
--end
local master = self._attached_entities_master
if master then
local master_def = self._attached_entities[master]
- master_def.entity:setpos(vector.add(self._pos, master_def.offset))
+ master_def.entity:set_pos(vector.add(self._pos, master_def.offset))
end
end,
- getvelocity = function(self)
+ get_velocity = function(self)
return vector.new(self._velocity)
end,
- setvelocity = function(self, velocity)
+ set_velocity = function(self, velocity)
self._velocity = vector.new(velocity)
local master = self._attached_entities_master
if master then
- self._attached_entities[master].entity:setvelocity(self._velocity)
+ self._attached_entities[master].entity:set_velocity(self._velocity)
end
end,
- getacceleration = function(self)
+ get_acceleration = function(self)
return vector.new(self._acceleration)
end,
- setacceleration = function(self, acceleration)
+ set_acceleration = function(self, acceleration)
self._acceleration = vector.new(acceleration)
local master = self._attached_entities_master
if master then
- self._attached_entities[master].entity:setacceleration(self._acceleration)
+ self._attached_entities[master].entity:set_acceleration(self._acceleration)
end
end,
remove = function(self)
@@ -314,7 +314,7 @@ function luaentity.get_objects_inside_radius(pos, radius)
local objects = {}
local index = 1
for id, entity in pairs(luaentity.entities) do
- if vector.distance(pos, entity:getpos()) <= radius then
+ if vector.distance(pos, entity:get_pos()) <= radius then
objects[index] = entity
index = index + 1
end
@@ -329,11 +329,11 @@ local move_entities_globalstep_part2 = function(dtime)
local master = entity._attached_entities_master
local master_def = master and entity._attached_entities[master]
local master_entity = master_def and master_def.entity
- local master_entity_pos = master_entity and master_entity:getpos()
+ local master_entity_pos = master_entity and master_entity:get_pos()
if master_entity_pos then
entity._pos = vector.subtract(master_entity_pos, master_def.offset)
- entity._velocity = master_entity:getvelocity()
- entity._acceleration = master_entity:getacceleration()
+ entity._velocity = master_entity:get_velocity()
+ entity._acceleration = master_entity:get_acceleration()
else
entity._pos = vector.add(vector.add(
entity._pos,
diff --git a/pipeworks/vacuum_tubes.lua b/pipeworks/vacuum_tubes.lua
index 211c3ee..d616835 100644
--- a/pipeworks/vacuum_tubes.lua
+++ b/pipeworks/vacuum_tubes.lua
@@ -87,7 +87,7 @@ local function vacuum(pos, radius)
for _, object in pairs(minetest.get_objects_inside_radius(pos, math.sqrt(3) * radius)) do
local lua_entity = object:get_luaentity()
if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then
- local obj_pos = object:getpos()
+ local obj_pos = object:get_pos()
local minpos = vector.subtract(pos, radius)
local maxpos = vector.add(pos, radius)
if obj_pos.x >= minpos.x and obj_pos.x <= maxpos.x
diff --git a/pipeworks/wielder.lua b/pipeworks/wielder.lua
index eb7931f..98f1ef0 100644
--- a/pipeworks/wielder.lua
+++ b/pipeworks/wielder.lua
@@ -53,11 +53,10 @@ local function wielder_on(data, wielder_pos, wielder_node)
local wielder_meta = minetest.get_meta(wielder_pos)
local inv = wielder_meta:get_inventory()
local wield_inv_name = data.wield_inv_name
- local wieldindex, wieldstack
+ local wieldindex
for i, stack in ipairs(inv:get_list(wield_inv_name)) do
if not stack:is_empty() then
wieldindex = i
- wieldstack = stack
break
end
end
@@ -66,7 +65,6 @@ local function wielder_on(data, wielder_pos, wielder_node)
wield_inv_name = data.ghost_inv_name
inv:set_stack(wield_inv_name, 1, ItemStack(data.ghost_tool))
wieldindex = 1
- wieldstack = inv:get_stack(wield_inv_name, 1)
end
local dir = minetest.facedir_to_dir(wielder_node.param2)
-- under/above is currently intentionally left switched
@@ -98,73 +96,20 @@ local function wielder_on(data, wielder_pos, wielder_node)
yaw = 0
pitch = math.pi/2
end
- local virtplayer = {
- get_inventory_formspec = delay(wielder_meta:get_string("formspec")),
- get_look_dir = delay(vector.multiply(dir, -1)),
- get_look_pitch = delay(pitch),
- get_look_yaw = delay(yaw),
- get_look_horizontal = delay(yaw),
- get_look_vertical = delay(pitch),
- get_player_control = delay({ jump=false, right=false, left=false, LMB=false, RMB=false, sneak=data.sneak, aux1=false, down=false, up=false }),
- get_player_control_bits = delay(data.sneak and 64 or 0),
- get_player_name = delay(data.masquerade_as_owner and wielder_meta:get_string("owner") or ":pipeworks:"..minetest.pos_to_string(wielder_pos)),
- is_player = delay(true),
- is_fake_player = true,
- set_inventory_formspec = delay(),
- getpos = delay(vector.subtract(wielder_pos, assumed_eye_pos)),
- get_hp = delay(20),
- get_inventory = delay(inv),
- get_wielded_item = delay(wieldstack),
- get_wield_index = delay(wieldindex),
- get_wield_list = delay(wield_inv_name),
- moveto = delay(),
- punch = delay(),
- remove = delay(),
- right_click = delay(),
- setpos = delay(),
- set_hp = delay(),
- set_properties = delay(),
- set_wielded_item = function(self, item)
- wieldstack = item
- inv:set_stack(wield_inv_name, wieldindex, item)
- end,
- set_animation = delay(),
- set_attach = delay(),
- set_detach = delay(),
- set_bone_position = delay(),
- hud_change = delay(),
- get_breath = delay(11),
- -- TODO "implement" all these
- -- set_armor_groups
- -- get_armor_groups
- -- get_animation
- -- get_attach
- -- get_bone_position
- -- get_properties
- -- get_player_velocity
- -- set_look_pitch
- -- set_look_yaw
- -- set_breath
- -- set_physics_override
- -- get_physics_override
- -- hud_add
- -- hud_remove
- -- hud_get
- -- hud_set_flags
- -- hud_get_flags
- -- hud_set_hotbar_itemcount
- -- hud_get_hotbar_itemcount
- -- hud_set_hotbar_image
- -- hud_get_hotbar_image
- -- hud_set_hotbar_selected_image
- -- hud_get_hotbar_selected_image
- -- hud_replace_builtin
- -- set_sky
- -- get_sky
- -- override_day_night_ratio
- -- get_day_night_ratio
- -- set_local_animation
- }
+ local virtplayer = pipeworks.create_fake_player({
+ name = data.masquerade_as_owner and wielder_meta:get_string("owner")
+ or ":pipeworks:" .. minetest.pos_to_string(wielder_pos),
+ formspec = wielder_meta:get_string("formspec"),
+ look_dir = vector.multiply(dir, -1),
+ look_pitch = pitch,
+ look_yaw = yaw,
+ sneak = data.sneak,
+ position = vector.subtract(wielder_pos, assumed_eye_pos),
+ inventory = inv,
+ wield_index = wieldindex,
+ wield_list = wield_inv_name
+ })
+
local pointed_thing = { type="node", under=under_pos, above=above_pos }
data.act(virtplayer, pointed_thing)
if data.eject_drops then
@@ -258,7 +203,7 @@ local function register_wielder(data)
end,
after_place_node = function (pos, placer)
pipeworks.scan_for_tube_objects(pos)
- local placer_pos = placer:getpos()
+ local placer_pos = placer:get_pos()
if placer_pos and placer:is_player() then placer_pos = vector.add(placer_pos, assumed_eye_pos) end
if placer_pos then
local dir = vector.subtract(pos, placer_pos)
@@ -495,7 +440,9 @@ if pipeworks.enable_dispenser then
sneak = true,
act = function(virtplayer, pointed_thing)
local wieldstack = virtplayer:get_wielded_item()
- virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or {on_drop=minetest.item_drop}).on_drop(wieldstack, virtplayer, virtplayer:getpos()) or wieldstack)
+ virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or
+ {on_drop=minetest.item_drop}).on_drop(wieldstack, virtplayer, virtplayer:get_pos()) or
+ wieldstack)
end,
eject_drops = false,
})
diff --git a/player_textures/textures/player_cheapie.png b/player_textures/textures/player_cheapie.png
index 19c2eff..7139b65 100644
--- a/player_textures/textures/player_cheapie.png
+++ b/player_textures/textures/player_cheapie.png
Binary files differ
diff --git a/ropes/LICENSE.md b/ropes/LICENSE.md
index fb67788..368b332 100644
--- a/ropes/LICENSE.md
+++ b/ropes/LICENSE.md
@@ -1,4 +1,19 @@
-License
-=======
-- Code WTFPL
-- Texture CC
+## MIT License
+
+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
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/signs_lib/init.lua b/signs_lib/init.lua
index f5b39c7..bd16ecb 100644
--- a/signs_lib/init.lua
+++ b/signs_lib/init.lua
@@ -950,7 +950,7 @@ signs_text_on_activate = function(self)
local meta = minetest.get_meta(pos)
local text = meta:get_string("text")
local new = (meta:get_int("__signslib_new_format") ~= 0)
- if text then
+ if text and minetest.registered_nodes[minetest.get_node(pos).name] then
text = trim_input(text)
set_obj_text(self.object, text, new, pos)
end
diff --git a/technic/doc/api.md b/technic/doc/api.md
index 2e5b6d3..178ab0a 100644
--- a/technic/doc/api.md
+++ b/technic/doc/api.md
@@ -11,9 +11,12 @@ switching station handles the network activity.
Helper functions
----------------
+* `technic.EU_string(num)`
+ * Converts num to a human-readable string (see pretty_num)
+ and adds the `EU` unit
+ * Use this function when showing players energy values
* `technic.pretty_num(num)`
- * Converts the number `num` to a human-readable string.
- * Use this function when showing players power values.
+ * Converts the number `num` to a human-readable string with SI prefixes
* `technic.swap_node(pos, nodename)`
* Same as `mintest.swap_node` but it only changes the nodename.
* It uses `minetest.get_node` before swapping to ensure the new nodename
diff --git a/technic/helpers.lua b/technic/helpers.lua
index 5780f27..5963b68 100644
--- a/technic/helpers.lua
+++ b/technic/helpers.lua
@@ -1,23 +1,56 @@
-local digit_sep_esc
-do
- local sep = technic.config:get("digit_separator")
- sep = tonumber(sep) and string.char(sep) or sep or " "
- -- Escape for gsub
- for magic in ("().%+-*?[^$"):gmatch(".") do
- if sep == magic then
- sep = "%"..sep
+local constant_digit_count = technic.config:get("constant_digit_count")
+
+-- converts a number to a readable string with SI prefix, e.g. 10000 → "10 k",
+-- 15 → "15 ", 0.1501 → "150.1 m"
+-- a non-breaking space (U+a0) instead of a usual one is put after number
+-- The precision is 4 digits
+local prefixes = {[-8] = "y", [-7] = "z", [-6] = "a", [-5] = "f", [-4] = "p",
+ [-3] = "n", [-2] = "µ", [-1] = "m", [0] = "", [1] = "k", [2] = "M",
+ [3] = "G", [4] = "T", [5] = "P", [6] = "E", [7] = "Z", [8] = "Y"}
+function technic.pretty_num(num)
+ -- the small number added is due to floating point inaccuracy
+ local b = math.floor(math.log10(math.abs(num)) +0.000001)
+ local pref_i
+ if b ~= 0 then
+ -- b is decremented by 1 to avoid a single digit with many decimals,
+ -- e.g. instead of 1.021 MEU, 1021 kEU is shown
+ pref_i = math.floor((b - 1) / 3)
+ else
+ -- as special case, avoid showing e.g. 1100 mEU instead of 1.1 EU
+ pref_i = 0
+ end
+ if not prefixes[pref_i] then
+ -- This happens for 0, nan, inf, very big values, etc.
+ if num == 0 then
+ -- handle 0 explicilty to avoid showing "-0"
+ if not constant_digit_count then
+ return "0 "
+ end
+ -- gives 0.000
+ return string.format("%.3f ", 0)
end
+ return string.format("%.4g ", num)
end
- digit_sep_esc = sep
+
+ num = num * 10 ^ (-3 * pref_i)
+ if constant_digit_count then
+ local comma_digits_cnt = 3 - (b - 3 * pref_i)
+ return string.format("%." .. comma_digits_cnt .. "f %s",
+ num, prefixes[pref_i])
+ end
+ return string.format("%.4g %s", num, prefixes[pref_i])
end
+-- some unittests
+assert(technic.pretty_num(-0) == "0 ")
+assert(technic.pretty_num(0) == "0 ")
+assert(technic.pretty_num(1234) == "1234 ")
+assert(technic.pretty_num(123456789) == "123.5 M")
-function technic.pretty_num(num)
- local str, k = tostring(num), nil
- repeat
- str, k = str:gsub("^(-?%d+)(%d%d%d)", "%1"..digit_sep_esc.."%2")
- until k == 0
- return str
+
+-- used to display power values
+function technic.EU_string(num)
+ return technic.pretty_num(num) .. "EU"
end
diff --git a/technic/machines/LV/cnc.lua b/technic/machines/LV/cnc.lua
index 58ec6ba..fdfec99 100644
--- a/technic/machines/LV/cnc.lua
+++ b/technic/machines/LV/cnc.lua
@@ -48,7 +48,7 @@ local twosize_products = {
}
local cnc_formspec =
- "invsize[9,11;]"..
+ "size[9,11;]"..
"label[1,0;"..S("Choose Milling Program:").."]"..
"image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]"..
"image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]"..
diff --git a/technic/machines/LV/solar_panel.lua b/technic/machines/LV/solar_panel.lua
index a06ddb8..c072b13 100644
--- a/technic/machines/LV/solar_panel.lua
+++ b/technic/machines/LV/solar_panel.lua
@@ -35,7 +35,8 @@ local run = function(pos, node)
local charge_to_give = math.floor((light + pos1.y) * 3)
charge_to_give = math.max(charge_to_give, 0)
charge_to_give = math.min(charge_to_give, 200)
- meta:set_string("infotext", S("@1 Active (@2 EU)", machine_name, technic.pretty_num(charge_to_give)))
+ meta:set_string("infotext", S("@1 Active (@2)", machine_name,
+ technic.EU_string(charge_to_give)))
meta:set_int("LV_EU_supply", charge_to_give)
else
meta:set_string("infotext", S("%s Idle"):format(machine_name))
@@ -54,7 +55,7 @@ minetest.register_node("technic:solar_panel", {
active = false,
drawtype = "nodebox",
paramtype = "light",
- is_ground_content = true,
+ is_ground_content = true,
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
diff --git a/technic/machines/MV/tool_workshop.lua b/technic/machines/MV/tool_workshop.lua
index 6679d1d..a220ac0 100644
--- a/technic/machines/MV/tool_workshop.lua
+++ b/technic/machines/MV/tool_workshop.lua
@@ -19,7 +19,7 @@ minetest.register_craft({
local workshop_demand = {5000, 3500, 2000}
local workshop_formspec =
- "invsize[8,9;]"..
+ "size[8,9;]"..
"list[current_name;src;3,1;1,1;]"..
"label[0,0;"..S("%s Tool Workshop"):format("MV").."]"..
"list[current_name;upgrade1;1,3;1,1;]"..
diff --git a/technic/machines/MV/wind_mill.lua b/technic/machines/MV/wind_mill.lua
index 28a075d..9df12b9 100644
--- a/technic/machines/MV/wind_mill.lua
+++ b/technic/machines/MV/wind_mill.lua
@@ -60,7 +60,8 @@ local run = function(pos, node)
elseif check == true then
local power = math.min(pos.y * 100, 5000)
meta:set_int("MV_EU_supply", power)
- meta:set_string("infotext", S("@1 (@2 EU)", machine_name, technic.pretty_num(power)))
+ meta:set_string("infotext", S("@1 (@2)", machine_name,
+ technic.EU_string(power)))
end
-- check == nil: assume nothing has changed
end
diff --git a/technic/machines/other/constructor.lua b/technic/machines/other/constructor.lua
index 5847fdb..0a62a7c 100644
--- a/technic/machines/other/constructor.lua
+++ b/technic/machines/other/constructor.lua
@@ -99,7 +99,7 @@ local function make_on(mark, length)
if node.name == "technic:constructor_mk"..mark.."_off" then
technic.swap_node(pos, "technic:constructor_mk"..mark.."_on")
- nodeupdate(pos)
+ minetest.check_for_falling(pos)
for i = 1, length do
place_pos = vector.add(place_pos, dir)
local place_node = minetest.get_node(place_pos)
@@ -113,7 +113,7 @@ local function make_off(mark)
return function(pos, node)
if node.name == "technic:constructor_mk"..mark.."_on" then
technic.swap_node(pos,"technic:constructor_mk"..mark.."_off")
- nodeupdate(pos)
+ minetest.check_for_falling(pos)
end
end
end
diff --git a/technic/machines/other/injector.lua b/technic/machines/other/injector.lua
index b34dd79..4fe78b2 100644
--- a/technic/machines/other/injector.lua
+++ b/technic/machines/other/injector.lua
@@ -55,7 +55,7 @@ minetest.register_craft({
local function set_injector_formspec(meta)
local is_stack = meta:get_string("mode") == "whole stacks"
meta:set_string("formspec",
- "invsize[8,9;]"..
+ "size[8,9;]"..
"item_image[0,0;1,1;technic:injector]"..
"label[1,0;"..S("Self-Contained Injector").."]"..
(is_stack and
diff --git a/technic/machines/power_monitor.lua b/technic/machines/power_monitor.lua
index 4d722a2..7e8b850 100644
--- a/technic/machines/power_monitor.lua
+++ b/technic/machines/power_monitor.lua
@@ -55,7 +55,7 @@ minetest.register_abm({
local demand = sw_meta:get_int("demand")
meta:set_string("infotext",
S("Power Monitor. Supply: @1 Demand: @2",
- technic.pretty_num(supply), technic.pretty_num(demand)))
+ technic.EU_string(supply), technic.EU_string(demand)))
else
meta:set_string("infotext",S("Power Monitor Has No Network"))
end
diff --git a/technic/machines/register/battery_box.lua b/technic/machines/register/battery_box.lua
index 84e992c..7f25dfd 100644
--- a/technic/machines/register/battery_box.lua
+++ b/technic/machines/register/battery_box.lua
@@ -255,8 +255,9 @@ function technic.register_battery_box(data)
local charge_percent = math.floor(current_charge / max_charge * 100)
meta:set_string("formspec", formspec..add_on_off_buttons(meta, ltier, charge_percent))
- local infotext = S("@1 Battery Box: @2/@3", tier,
- technic.pretty_num(current_charge), technic.pretty_num(max_charge))
+ local infotext = S("@1 Battery Box: @2 / @3", tier,
+ technic.EU_string(current_charge),
+ technic.EU_string(max_charge))
if eu_input == 0 then
infotext = S("%s Idle"):format(infotext)
end
diff --git a/technic/machines/register/generator.lua b/technic/machines/register/generator.lua
index 7805bf0..87ef6e7 100644
--- a/technic/machines/register/generator.lua
+++ b/technic/machines/register/generator.lua
@@ -35,7 +35,7 @@ function technic.register_generator(data)
for k, v in pairs(groups) do active_groups[k] = v end
local generator_formspec =
- "invsize[8,9;]"..
+ "size[8,9;]"..
"label[0,0;"..S("Fuel-Fired %s Generator"):format(tier).."]"..
"list[current_name;src;3,1;1,1;]"..
"image[4,1;1,1;default_furnace_fire_bg.png]"..
diff --git a/technic/machines/register/machine_base.lua b/technic/machines/register/machine_base.lua
index 0c6a6b3..14cf998 100644
--- a/technic/machines/register/machine_base.lua
+++ b/technic/machines/register/machine_base.lua
@@ -44,7 +44,7 @@ function technic.register_base_machine(data)
for k, v in pairs(groups) do active_groups[k] = v end
local formspec =
- "invsize[8,9;]"..
+ "size[8,9;]"..
"list[current_name;src;"..(4-input_size)..",1;"..input_size..",1;]"..
"list[current_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]"..
diff --git a/technic/machines/register/solar_array.lua b/technic/machines/register/solar_array.lua
index 422bfcf..03f11d9 100644
--- a/technic/machines/register/solar_array.lua
+++ b/technic/machines/register/solar_array.lua
@@ -30,14 +30,15 @@ function technic.register_solar_array(data)
local charge_to_give = math.floor((light + pos.y) * data.power)
charge_to_give = math.max(charge_to_give, 0)
charge_to_give = math.min(charge_to_give, data.power * 50)
- meta:set_string("infotext", S("@1 Active (@2 EU)", machine_name, technic.pretty_num(charge_to_give)))
+ meta:set_string("infotext", S("@1 Active (@2)", machine_name,
+ technic.EU_string(charge_to_give)))
meta:set_int(tier.."_EU_supply", charge_to_give)
else
meta:set_string("infotext", S("%s Idle"):format(machine_name))
meta:set_int(tier.."_EU_supply", 0)
end
end
-
+
minetest.register_node("technic:solar_array_"..ltier, {
tiles = {"technic_"..ltier.."_solar_array_top.png", "technic_"..ltier.."_solar_array_bottom.png",
"technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png",
diff --git a/technic/machines/supply_converter.lua b/technic/machines/supply_converter.lua
index 8527bcf..9202c4a 100644
--- a/technic/machines/supply_converter.lua
+++ b/technic/machines/supply_converter.lua
@@ -149,7 +149,9 @@ local run = function(pos, node, run_stage)
meta:set_int(from.."_EU_supply", 0)
meta:set_int(to.."_EU_demand", 0)
meta:set_int(to.."_EU_supply", input * remain)
- meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name, technic.pretty_num(input), from, technic.pretty_num(input * remain), to))
+ meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name,
+ technic.EU_string(input), from,
+ technic.EU_string(input * remain), to))
else
meta:set_string("infotext", S("%s Has Bad Cabling"):format(machine_name))
if to then
diff --git a/technic/machines/switching_station.lua b/technic/machines/switching_station.lua
index 21d394b..d645847 100644
--- a/technic/machines/switching_station.lua
+++ b/technic/machines/switching_station.lua
@@ -361,9 +361,9 @@ minetest.register_abm({
end
--dprint("Total BA demand:"..BA_eu_demand)
- meta:set_string("infotext",
- S("@1. Supply: @2 Demand: @3",
- machine_name, technic.pretty_num(PR_eu_supply), technic.pretty_num(RE_eu_demand)))
+ meta:set_string("infotext", S("@1. Supply: @2 Demand: @3",
+ machine_name, technic.EU_string(PR_eu_supply),
+ technic.EU_string(RE_eu_demand)))
-- If mesecon signal and power supply or demand changed then
-- send them via digilines.
diff --git a/technic_chests/common.lua b/technic_chests/common.lua
index 9a5bc7a..6369b7a 100644
--- a/technic_chests/common.lua
+++ b/technic_chests/common.lua
@@ -28,7 +28,9 @@ technic.chests.can_dig = function(pos, player)
end
local function inv_change(pos, count, player)
- if not default.can_interact_with_node(player, pos) then
+ -- Skip check for pipeworks (fake player)
+ if minetest.is_player(player) and
+ not default.can_interact_with_node(player, pos) then
return 0
end
return count
diff --git a/technic_chests/init.lua b/technic_chests/init.lua
index 3565987..6b1a1b2 100644
--- a/technic_chests/init.lua
+++ b/technic_chests/init.lua
@@ -15,3 +15,11 @@ dofile(modpath.."/silver_chest.lua")
dofile(modpath.."/gold_chest.lua")
dofile(modpath.."/mithril_chest.lua")
+minetest.register_lbm({
+ name = "technic_chests:fix_wooden_chests",
+ nodenames = {"default:chest"},
+ action = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec", "")
+ end
+})
diff --git a/technic_worldgen/oregen.lua b/technic_worldgen/oregen.lua
index 8e7af91..16a3b8d 100644
--- a/technic_worldgen/oregen.lua
+++ b/technic_worldgen/oregen.lua
@@ -141,17 +141,20 @@ minetest.register_on_generated(function(minp, maxp, seed)
for y = minp.y + math.floor(grid_size / 2), maxp.y, grid_size do
for z = minp.z + math.floor(grid_size / 2), maxp.z, grid_size do
local c = data[a:index(x, y, z)]
- if (c == c_lava or c == c_lava_flowing) and sulfur_noise:get3d({x = x, y = z, z = z}) >= 0.4 then
- for xx = math.max(minp.x, x - grid_size), math.min(maxp.x, x + grid_size) do
- for yy = math.max(minp.y, y - grid_size), math.min(maxp.y, y + grid_size) do
- for zz = math.max(minp.z, z - grid_size), math.min(maxp.z, z + grid_size) do
- local i = a:index(xx, yy, zz)
+ if (c == c_lava or c == c_lava_flowing)
+ and sulfur_noise:get3d({x = x, y = z, z = z}) >= 0.4 then
+ for i in a:iter(
+ math.max(minp.x, x - grid_size),
+ math.max(minp.y, y - grid_size),
+ math.max(minp.z, z - grid_size),
+ math.min(maxp.x, x + grid_size),
+ math.min(maxp.y, y + grid_size),
+ math.min(maxp.z, z + grid_size)
+ ) do
if data[i] == c_stone and pr:next(1, 10) <= 7 then
data[i] = c_sulfur
end
end
- end
- end
end
end
end
diff --git a/unified_inventory/api.lua b/unified_inventory/api.lua
index 2b63922..f6afec5 100644
--- a/unified_inventory/api.lua
+++ b/unified_inventory/api.lua
@@ -1,5 +1,5 @@
local S = unified_inventory.gettext
-local F = unified_inventory.fgettext
+local F = minetest.formspec_escape
-- Create detached creative inventory after loading all mods
minetest.after(0.01, function()
@@ -233,7 +233,7 @@ end
unified_inventory.register_craft_type("normal", {
- description = F("Crafting"),
+ description = F(S("Crafting")),
icon = "ui_craftgrid_icon.png",
width = 3,
height = 3,
@@ -249,7 +249,7 @@ unified_inventory.register_craft_type("normal", {
unified_inventory.register_craft_type("shapeless", {
- description = F("Mixing"),
+ description = F(S("Mixing")),
icon = "ui_craftgrid_icon.png",
width = 3,
height = 3,
@@ -264,7 +264,7 @@ unified_inventory.register_craft_type("shapeless", {
unified_inventory.register_craft_type("cooking", {
- description = F("Cooking"),
+ description = F(S("Cooking")),
icon = "default_furnace_front.png",
width = 1,
height = 1,
@@ -272,7 +272,7 @@ unified_inventory.register_craft_type("cooking", {
unified_inventory.register_craft_type("digging", {
- description = F("Digging"),
+ description = F(S("Digging")),
icon = "default_tool_steelpick.png",
width = 1,
height = 1,
@@ -303,6 +303,6 @@ end
function unified_inventory.is_creative(playername)
return minetest.check_player_privs(playername, {creative=true})
- or minetest.setting_getbool("creative_mode")
+ or minetest.settings:get_bool("creative_mode")
end
diff --git a/unified_inventory/bags.lua b/unified_inventory/bags.lua
index e93a317..a946cb0 100644
--- a/unified_inventory/bags.lua
+++ b/unified_inventory/bags.lua
@@ -4,22 +4,22 @@
-- License: GPLv3
local S = unified_inventory.gettext
-local F = unified_inventory.fgettext
+local F = minetest.formspec_escape
unified_inventory.register_page("bags", {
get_formspec = function(player)
local player_name = player:get_player_name()
local formspec = "background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]"
- formspec = formspec.."label[0,0;"..F("Bags").."]"
- formspec = formspec.."button[0,2;2,0.5;bag1;"..F("Bag 1").."]"
- formspec = formspec.."button[2,2;2,0.5;bag2;"..F("Bag 2").."]"
- formspec = formspec.."button[4,2;2,0.5;bag3;"..F("Bag 3").."]"
- formspec = formspec.."button[6,2;2,0.5;bag4;"..F("Bag 4").."]"
+ formspec = formspec.."label[0,0;"..F(S("Bags")).."]"
+ formspec = formspec.."button[0,2;2,0.5;bag1;"..F(S("Bag @1", 1)).."]"
+ formspec = formspec.."button[2,2;2,0.5;bag2;"..F(S("Bag @1", 2)).."]"
+ formspec = formspec.."button[4,2;2,0.5;bag3;"..F(S("Bag @1", 3)).."]"
+ formspec = formspec.."button[6,2;2,0.5;bag4;"..F(S("Bag @1", 4)).."]"
formspec = formspec.."listcolors[#00000000;#00000000]"
- formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."_bags;bag1;0.5,1;1,1;]"
- formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."_bags;bag2;2.5,1;1,1;]"
- formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."_bags;bag3;4.5,1;1,1;]"
- formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."_bags;bag4;6.5,1;1,1;]"
+ formspec = formspec.."list[detached:"..F(player_name).."_bags;bag1;0.5,1;1,1;]"
+ formspec = formspec.."list[detached:"..F(player_name).."_bags;bag2;2.5,1;1,1;]"
+ formspec = formspec.."list[detached:"..F(player_name).."_bags;bag3;4.5,1;1,1;]"
+ formspec = formspec.."list[detached:"..F(player_name).."_bags;bag4;6.5,1;1,1;]"
return {formspec=formspec}
end,
})
@@ -45,7 +45,7 @@ for i = 1, 4 do
local stack = get_player_bag_stack(player, bi)
local image = stack:get_definition().inventory_image
local formspec = ("image[7,0;1,1;"..image.."]"
- .."label[0,0;"..F("Bag @1", bi).."]"
+ .."label[0,0;"..F(S("Bag @1", bi)).."]"
.."listcolors[#00000000;#00000000]"
.."list[current_player;bag"..bi.."contents;0,1;8,3;]"
.."listring[current_name;bag"..bi.."contents]"
@@ -78,7 +78,7 @@ for i = 1, 4 do
end
end
local img = def.inventory_image
- local label = F("Bag @1", i).."\n"..used.."/"..size
+ local label = F(S("Bag @1", i)).."\n"..used.."/"..size
button = "image_button["..(i+1)..",0;1,1;"..img..";bag"..i..";"..label.."]"
else
button = ""
diff --git a/unified_inventory/init.lua b/unified_inventory/init.lua
index 6929600..1c73fad 100644
--- a/unified_inventory/init.lua
+++ b/unified_inventory/init.lua
@@ -1,16 +1,10 @@
--- Unified Inventory for Minetest 0.4.8+
+-- Unified Inventory for Minetest >= 0.4.16
local modpath = minetest.get_modpath(minetest.get_current_modname())
local worldpath = minetest.get_worldpath()
-local mygettext
-if rawget(_G, "intllib") then
- mygettext = intllib.Getter()
-else
- function mygettext(s, ...)
- local t = { ... }
- return (s:gsub("@(%d+)", function(n) return t[tonumber(n)] end))
- end
-end
+
+-- Intllib
+local S, NS = dofile(modpath .. "/intllib.lua")
-- Data tables definitions
unified_inventory = {
@@ -40,14 +34,13 @@ unified_inventory = {
default = "craft",
-- intllib
- gettext = mygettext,
- fgettext = function(...) return minetest.formspec_escape(mygettext(...)) end,
+ gettext = S,
-- "Lite" mode
- lite_mode = minetest.setting_getbool("unified_inventory_lite"),
-
+ lite_mode = minetest.settings:get_bool("unified_inventory_lite"),
+
-- Trash enabled
- trash_enabled = (minetest.setting_getbool("unified_inventory_trash") ~= false),
+ trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false),
pagecols = 8,
pagerows = 10,
@@ -80,7 +73,7 @@ dofile(modpath.."/internal.lua")
dofile(modpath.."/callbacks.lua")
dofile(modpath.."/register.lua")
-if minetest.setting_getbool("unified_inventory_bags") ~= false then
+if minetest.settings:get_bool("unified_inventory_bags") ~= false then
dofile(modpath.."/bags.lua")
end
diff --git a/unified_inventory/internal.lua b/unified_inventory/internal.lua
index 4e78a89..06967d2 100644
--- a/unified_inventory/internal.lua
+++ b/unified_inventory/internal.lua
@@ -1,5 +1,5 @@
local S = unified_inventory.gettext
-local F = unified_inventory.fgettext
+local F = minetest.formspec_escape
-- This pair of encoding functions is used where variable text must go in
-- button names, where the text might contain formspec metacharacters.
@@ -94,7 +94,7 @@ function unified_inventory.get_formspec(player, page)
local filtered_inv_buttons = {}
for i, def in pairs(unified_inventory.buttons) do
- if not (draw_lite_mode and def.hide_lite) then
+ if not (draw_lite_mode and def.hide_lite) then
table.insert(filtered_inv_buttons, def)
end
end
@@ -111,16 +111,16 @@ function unified_inventory.get_formspec(player, page)
formspec[n] = "image_button["
formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4)
formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;"
- formspec[n+3] = minetest.formspec_escape(def.image)..";"
- formspec[n+4] = minetest.formspec_escape(def.name)..";]"
- formspec[n+5] = "tooltip["..minetest.formspec_escape(def.name)
+ formspec[n+3] = F(def.image)..";"
+ formspec[n+4] = F(def.name)..";]"
+ formspec[n+5] = "tooltip["..F(def.name)
formspec[n+6] = ";"..(def.tooltip or "").."]"
n = n+7
else
formspec[n] = "image["
formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4)
formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;"
- formspec[n+3] = minetest.formspec_escape(def.image).."^[colorize:#808080:alpha]"
+ formspec[n+3] = F(def.image).."^[colorize:#808080:alpha]"
n = n+4
end
@@ -145,39 +145,39 @@ function unified_inventory.get_formspec(player, page)
formspec[n] =
"image_button[" .. (start_x + 0.6 * 0)
.. ",9;.8,.8;ui_skip_backward_icon.png;start_list;]"
- .. "tooltip[start_list;" .. F("First page") .. "]"
+ .. "tooltip[start_list;" .. F(S("First page")) .. "]"
.. "image_button[" .. (start_x + 0.6 * 1)
.. ",9;.8,.8;ui_doubleleft_icon.png;rewind3;]"
- .. "tooltip[rewind3;" .. F("Back three pages") .. "]"
+ .. "tooltip[rewind3;" .. F(S("Back three pages")) .. "]"
.. "image_button[" .. (start_x + 0.6 * 2)
.. ",9;.8,.8;ui_left_icon.png;rewind1;]"
- .. "tooltip[rewind1;" .. F("Back one page") .. "]"
+ .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]"
.. "image_button[" .. (start_x + 0.6 * 3)
.. ",9;.8,.8;ui_right_icon.png;forward1;]"
- .. "tooltip[forward1;" .. F("Forward one page") .. "]"
+ .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]"
.. "image_button[" .. (start_x + 0.6 * 4)
.. ",9;.8,.8;ui_doubleright_icon.png;forward3;]"
- .. "tooltip[forward3;" .. F("Forward three pages") .. "]"
+ .. "tooltip[forward3;" .. F(S("Forward three pages")) .. "]"
.. "image_button[" .. (start_x + 0.6 * 5)
.. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]"
- .. "tooltip[end_list;" .. F("Last page") .. "]"
+ .. "tooltip[end_list;" .. F(S("Last page")) .. "]"
else
formspec[n] =
"image_button[" .. (8.2 + 0.65 * 0)
.. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]"
- .. "tooltip[start_list;" .. F("First page") .. "]"
+ .. "tooltip[start_list;" .. F(S("First page")) .. "]"
.. "image_button[" .. (8.2 + 0.65 * 1)
.. ",5.8;.8,.8;ui_left_icon.png;rewind1;]"
- .. "tooltip[rewind1;" .. F("Back one page") .. "]"
+ .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]"
.. "image_button[" .. (8.2 + 0.65 * 2)
.. ",5.8;.8,.8;ui_right_icon.png;forward1;]"
- .. "tooltip[forward1;" .. F("Forward one page") .. "]"
+ .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]"
.. "image_button[" .. (8.2 + 0.65 * 3)
.. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]"
- .. "tooltip[end_list;" .. F("Last page") .. "]"
+ .. "tooltip[end_list;" .. F(S("Last page")) .. "]"
end
n = n+1
@@ -187,26 +187,26 @@ function unified_inventory.get_formspec(player, page)
if not draw_lite_mode then
formspec[n] = "field[9.5,8.325;3,1;searchbox;;"
- .. minetest.formspec_escape(unified_inventory.current_searchbox[player_name]) .. "]"
+ .. F(unified_inventory.current_searchbox[player_name]) .. "]"
formspec[n+1] = "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]"
- .. "tooltip[searchbutton;" ..F("Search") .. "]"
+ .. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
formspec[n+2] = "image_button[12.9,8.1;.8,.8;ui_reset_icon.png;searchresetbutton;]"
- .. "tooltip[searchbutton;" ..F("Search") .. "]"
- .. "tooltip[searchresetbutton;" ..F("Reset search and display everything") .. "]"
+ .. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
+ .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]"
else
formspec[n] = "field[8.5,5.225;2.2,1;searchbox;;"
- .. minetest.formspec_escape(unified_inventory.current_searchbox[player_name]) .. "]"
+ .. F(unified_inventory.current_searchbox[player_name]) .. "]"
formspec[n+1] = "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]"
- .. "tooltip[searchbutton;" ..F("Search") .. "]"
+ .. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
formspec[n+2] = "image_button[11,5;.8,.8;ui_reset_icon.png;searchresetbutton;]"
- .. "tooltip[searchbutton;" ..F("Search") .. "]"
- .. "tooltip[searchresetbutton;" ..F("Reset search and display everything") .. "]"
+ .. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
+ .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]"
end
n = n+3
- local no_matches = "No matching items"
+ local no_matches = S("No matching items")
if draw_lite_mode then
- no_matches = "No matches."
+ no_matches = S("No matches.")
end
-- Items list
@@ -246,14 +246,14 @@ function unified_inventory.get_formspec(player, page)
end
end
end
- formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";"..F("Page") .. ": "
+ formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";"..F(S("Page")) .. ": "
.. S("%s of %s"):format(page,pagemax).."]"
end
n= n+1
if unified_inventory.activefilter[player_name] ~= "" then
- formspec[n] = "label[8.2,"..(ui_peruser.form_header_y + 0.4)..";" .. F("Filter") .. ":]"
- formspec[n+1] = "label[9.1,"..(ui_peruser.form_header_y + 0.4)..";"..minetest.formspec_escape(unified_inventory.activefilter[player_name]).."]"
+ formspec[n] = "label[8.2,"..(ui_peruser.form_header_y + 0.4)..";" .. F(S("Filter")) .. ":]"
+ formspec[n+1] = "label[9.1,"..(ui_peruser.form_header_y + 0.4)..";"..F(unified_inventory.activefilter[player_name]).."]"
end
return table.concat(formspec, "")
end
diff --git a/unified_inventory/intllib.lua b/unified_inventory/intllib.lua
new file mode 100644
index 0000000..6669d72
--- /dev/null
+++ b/unified_inventory/intllib.lua
@@ -0,0 +1,45 @@
+
+-- Fallback functions for when `intllib` is not installed.
+-- Code released under Unlicense <http://unlicense.org>.
+
+-- Get the latest version of this file at:
+-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
+
+local function format(str, ...)
+ local args = { ... }
+ local function repl(escape, open, num, close)
+ if escape == "" then
+ local replacement = tostring(args[tonumber(num)])
+ if open == "" then
+ replacement = replacement..close
+ end
+ return replacement
+ else
+ return "@"..open..num..close
+ end
+ end
+ return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
+end
+
+local gettext, ngettext
+if minetest.get_modpath("intllib") then
+ if intllib.make_gettext_pair then
+ -- New method using gettext.
+ gettext, ngettext = intllib.make_gettext_pair()
+ else
+ -- Old method using text files.
+ gettext = intllib.Getter()
+ end
+end
+
+-- Fill in missing functions.
+
+gettext = gettext or function(msgid, ...)
+ return format(msgid, ...)
+end
+
+ngettext = ngettext or function(msgid, msgid_plural, n, ...)
+ return format(n==1 and msgid or msgid_plural, ...)
+end
+
+return gettext, ngettext
diff --git a/unified_inventory/locale/de.po b/unified_inventory/locale/de.po
new file mode 100644
index 0000000..1231f1a
--- /dev/null
+++ b/unified_inventory/locale/de.po
@@ -0,0 +1,366 @@
+# German translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# Xanthin
+# CodeXP <codexp@gmx.net>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 13:41+0200\n"
+"PO-Revision-Date: \n"
+"Last-Translator: CodeXP <codexp@gmx.net>\n"
+"Language-Team: \n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: api.lua register.lua
+msgid "Crafting"
+msgstr "Fertigung"
+
+#: api.lua
+msgid "Mixing"
+msgstr "Mischen"
+
+#: api.lua
+msgid "Cooking"
+msgstr "Kochen"
+
+#: api.lua
+msgid "Digging"
+msgstr "Graben"
+
+#: bags.lua
+msgid "Bags"
+msgstr "Taschen"
+
+#: bags.lua
+msgid "Bag @1"
+msgstr "Tasche @1"
+
+#: bags.lua
+msgid "Small Bag"
+msgstr "Kleine Tasche"
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr "Mittelgroße Tasche"
+
+#: bags.lua
+msgid "Large Bag"
+msgstr "Große Tasche"
+
+#: group.lua
+msgid " and "
+msgstr " und "
+
+#: internal.lua
+msgid "First page"
+msgstr "Erste Seite"
+
+#: internal.lua
+msgid "Back three pages"
+msgstr "3 Seiten zurückblättern"
+
+#: internal.lua
+msgid "Back one page"
+msgstr "1 Seite zurückblättern"
+
+#: internal.lua
+msgid "Forward one page"
+msgstr "1 Seite vorblättern"
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr "3 Seiten vorblättern"
+
+#: internal.lua
+msgid "Last page"
+msgstr "Letzte Seite"
+
+#: internal.lua
+msgid "Search"
+msgstr "Suchen"
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr "Suche zurücksetzen und alles anzeigen"
+
+#: internal.lua
+msgid "No matching items"
+msgstr "Keine passenden Gegenstände"
+
+#: internal.lua
+msgid "No matches."
+msgstr "Keine Treffer"
+
+#: internal.lua
+msgid "Page"
+msgstr "Seite"
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr "%s von %s"
+
+#: internal.lua
+msgid "Filter"
+msgstr "Filter"
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr "Kann das Kreativinventar nutzen"
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr "Fertigungsraster"
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr "Fertigungsführer"
+
+#: register.lua
+msgid "Set home position"
+msgstr "Heimatposition setzen"
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr "Heimatposition nach: %s gesetzt"
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr "Du hast das \"home\"-Privileg nicht!"
+
+#: register.lua
+msgid "Go home"
+msgstr "Nach Hause gehen"
+
+#: register.lua
+msgid "Set time to day"
+msgstr "Zur Tageszeit wechseln"
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr "Tageszeit auf 6 Uhr gesetzt"
+
+#: register.lua
+msgid "You don't have the settime privilege!"
+msgstr "Du hast das \"settime\"-Privileg nicht!"
+
+#: register.lua
+msgid "Set time to night"
+msgstr "Zur Nachtzeit wechseln"
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr "Tageszeit auf 21 Uhr gesetzt"
+
+#: register.lua
+msgid "Clear inventory"
+msgstr "Inventar leeren"
+
+#: register.lua
+#, fuzzy
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr ""
+"Diese Funktion ist außerhalb des Kreativmodus deaktiviert, um ein "
+"versehentliches Löschen des ganzen Inventars zu verhindern.\n"
+"Nutze stattdessen das Müllfeld."
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr "Inventar geleert!"
+
+#: register.lua
+msgid "Trash:"
+msgstr "Müll:"
+
+#: register.lua
+msgid "Refill:"
+msgstr "Nachfüllen:"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr "Irgendein Gegenstand, der zur Gruppe %s gehört"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr "Irgendein Gegenstand, der zu den Gruppen %s gehört"
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr "Rezept %d von %d"
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr "Verwendung %d von %d"
+
+#: register.lua
+msgid "No recipes"
+msgstr "Keine Rezepte"
+
+#: register.lua
+msgid "No usages"
+msgstr "Keine Verwendungen"
+
+#: register.lua
+msgid "Result"
+msgstr "Ergebnis"
+
+#: register.lua
+msgid "Ingredient"
+msgstr "Zutat"
+
+#: register.lua
+msgid "Show next recipe"
+msgstr "Nächstes Rezept zeigen"
+
+#: register.lua
+msgid "Show next usage"
+msgstr "Nächste Verwendung zeigen"
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr "Vorheriges Rezept zeigen"
+
+#: register.lua
+msgid "Show previous usage"
+msgstr "Vorherige Verwendung zeigen"
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr ""
+
+#: register.lua
+msgid "Give me:"
+msgstr "Gib mir:"
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+"Dieses Rezept ist zu\n"
+"groß, um angezeigt\n"
+"zu werden."
+
+#: register.lua
+msgid "To craft grid:"
+msgstr "Ins Fertigungsraster:"
+
+#: register.lua
+msgid "All"
+msgstr "Alles"
+
+#: waypoints.lua
+msgid "White"
+msgstr "Weiß"
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr "Gelb"
+
+#: waypoints.lua
+msgid "Red"
+msgstr "Rot"
+
+#: waypoints.lua
+msgid "Green"
+msgstr "Grün"
+
+#: waypoints.lua
+msgid "Blue"
+msgstr "Blau"
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr "Wegpunkte"
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr "Wegpunkt Nr. %d auswählen"
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr "Wegpunkt Nr. %d"
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr "Setze Wegpunkt zur derzeitigen Position"
+
+#: waypoints.lua
+msgid "invisible"
+msgstr "unsichtbar"
+
+#: waypoints.lua
+msgid "visible"
+msgstr "sichtbar"
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr "Wegpunkt @1 machen"
+
+#: waypoints.lua
+msgid "Disable"
+msgstr "ausschalten"
+
+#: waypoints.lua
+msgid "Enable"
+msgstr "einschalten"
+
+#: waypoints.lua
+msgid "@1 display of waypoint coordinates"
+msgstr "Anzeige der Wegpunktkoordinaten @1"
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr "Farbe der Darstellung der Wegpunkte ändern"
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr "Name des Wegpunkts ändern"
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr "Wegpunkt aktiv"
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr "Wegpunkt inaktiv"
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr "Bearbeitung abschließen"
+
+#: waypoints.lua
+msgid "World position"
+msgstr "Weltposition"
+
+#: waypoints.lua
+msgid "Name"
+msgstr "Name"
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr "HUD-Textfarbe"
diff --git a/unified_inventory/locale/de.txt b/unified_inventory/locale/de.txt
deleted file mode 100644
index ad8009d..0000000
--- a/unified_inventory/locale/de.txt
+++ /dev/null
@@ -1,98 +0,0 @@
-# Translation mostly by Xanthin
-
-### api.lua ###
-Digging (by chance) = Graben (durch Zufall)
-
-### bags.lua ###
-Bags = Taschen
-Bag @1 = Tasche @1
-Small Bag = Kleine Tasche
-Medium Bag = Mittelgroße Tasche
-Large Bag = Große Tasche
-
-### inernal.lua ###
-First page = Erste Seite
-Back three pages = Drei Seiten zurueckblättern
-Back one page = Eine Seite zurueckblättern
-Forward one page = Eine Seite vorblättern
-Forward three pages = Drei Seiten vorblättern
-Last page = Letzte Seite
-No matching items = Keine passenden Gegenstände
-Page = Seite
-%s of %s = %s von %s
-Filter = Filter
-Search = Suchen
-Reset search and display everything = Suche zurücksetzen und alles anzeigen
-
-### register.lua ###
-Can use the creative inventory = Kann das Kreativinventar nutzen
-Home position set to: %s = Heimatposition nach: %s gesetzt
-Time of day set to 6am = Tageszeit auf 6 Uhr geändert
-You don't have the settime privilege! = Du hast nicht das „settime“-Privileg!
-Time of day set to 9pm = Tageszeit auf 21 Uhr geändert
-This button has been disabled outside of creative mode to prevent accidental inventory trashing. Use the trash slot instead. = Diese Funktion ist außerhalb des Kreativmodus deaktiviert, um ein versehentliches Löschen des ganzen Inventars zu verhindern.\nNutze stattdessen das Müllfeld.
-Inventory cleared! = Inventar geleert!
-Crafting = Fertigung
-Digging = Graben
-Cooking = Kochen
-Mixing = Mischen
-Trash: = Müll:
-Refill: = Nachfüllen:
-Crafting Guide = Fertigungsführer
-Method: = Methode:
-Result: %s = Ergebnis: %s
-crafting = Bauen
-shapeless crafting = Formlose Fertigung
-cooking = Kochen
-alloy cooking = Legierung Kochen
-Copy to craft grid: = Ins Fertigungsraster kopieren:
-All = Alles
-Alternate = Alternative
-Crafting Grid = Fertigungsraster
-Show next recipe = Nächstes Rezept zeigen
-Show next usage = Nächste Verwendung zeigen
-Show previous recipe = Vorheriges Rezept zeigen
-Show previous usage = Vorherige Verwendung zeigen
-This recipe is too\nlarge to be displayed. = Dieses Rezept ist zu\ngroß, um angezeigt\nzu werden.
-Any item belonging to the %s group = Irgendein Gegenstand, der zur Gruppe %s gehört
-Any item belonging to the groups %s = Irgendein Gegenstand, der zu den Gruppen %s gehört
-Recipe %d of %d = Rezept %d von %d
-Usage %d of %d = Verwendung %d von %d
-No recipes = Keine Rezepte
-No usages = Keine Verwendungen
-Result = Ergebnis
-Ingredient = Zutat
-Set time to day = Zur Tageszeit wechseln
-Set time to night = Zur Nachtzeit wechseln
-Set home position = Heimatposition setzen
-Go home = Nach Hause gehen
-Clear inventory = Inventar leeren
-Give me: = Gib mir:
-To craft grid: = Ins Fertigungsraster:
-
-### group.lua ###
-\sand\s=\sund\s
-
-### waypoints.lua ###
-White = Weiß
-Yellow = Gelb
-Red = Rot
-Green = Grün
-Blue = Blau
-Waypoints = Wegpunkte
-Waypoint %d = Wegpunkt Nr. %d
-Waypoint active = Wegpunkt aktiv
-Waypoint inactive = Wegpunkt inaktiv
-World position = Weltposition
-Name = Name
-HUD text color = HUD-Textfarbe
-Edit waypoint name = Name des Wegpunkts ändern
-Rename waypoint = Wegpunkt umbenennen
-Change color of waypoint display = Farbe der Darstellung der Wegpunkte ändern
-Set waypoint to current location = Setze Wegpunkt zur derzeitigen Position
-Make waypoint visible = Wegpunkt sichtbar machen
-Make waypoint invisible = Wegpunkt verstecken
-Disable display of waypoint coordinates = Anzeige der Wegpunktkoordinaten deaktivieren
-Enable display of waypoint coordinates = Anzeige der Wegpunktkoordinaten aktivieren
-Finish editing = Bearbeitung abschließen
-Select Waypoint #%d = Wegpunkt Nr. %d auswählen
diff --git a/unified_inventory/locale/es.po b/unified_inventory/locale/es.po
new file mode 100644
index 0000000..a49a76d
--- /dev/null
+++ b/unified_inventory/locale/es.po
@@ -0,0 +1,366 @@
+# Spanish translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# Diego Martínez <kaeza>
+# CodeXP <codexp@gmx.net>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 16:15+0200\n"
+"PO-Revision-Date: \n"
+"Last-Translator: CodeXP <codexp@gmx.net>\n"
+"Language-Team: \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: api.lua register.lua
+msgid "Crafting"
+msgstr "Elaboración"
+
+#: api.lua
+msgid "Mixing"
+msgstr ""
+
+#: api.lua
+#, fuzzy
+msgid "Cooking"
+msgstr "hornear"
+
+#: api.lua
+msgid "Digging"
+msgstr ""
+
+#: bags.lua
+msgid "Bags"
+msgstr "Bolsas"
+
+#: bags.lua
+msgid "Bag @1"
+msgstr "Bolsa @1"
+
+#: bags.lua
+msgid "Small Bag"
+msgstr "Bolsa Pequeña"
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr "Bolsa Mediana"
+
+#: bags.lua
+msgid "Large Bag"
+msgstr "Bolsa Grande"
+
+#: group.lua
+msgid " and "
+msgstr ""
+
+#: internal.lua
+msgid "First page"
+msgstr ""
+
+#: internal.lua
+msgid "Back three pages"
+msgstr ""
+
+#: internal.lua
+msgid "Back one page"
+msgstr ""
+
+#: internal.lua
+msgid "Forward one page"
+msgstr ""
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr ""
+
+#: internal.lua
+msgid "Last page"
+msgstr ""
+
+#: internal.lua
+msgid "Search"
+msgstr ""
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr ""
+
+#: internal.lua
+msgid "No matching items"
+msgstr ""
+
+#: internal.lua
+msgid "No matches."
+msgstr ""
+
+#: internal.lua
+msgid "Page"
+msgstr "Página"
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr "%s de %s"
+
+#: internal.lua
+msgid "Filter"
+msgstr "Filtro"
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr "Puede usar el inventario creativo"
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr "Guía de Elaboración"
+
+#: register.lua
+#, fuzzy
+msgid "Set home position"
+msgstr "Posición en el mundo"
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr "Posición de hogar cambiada a: %s"
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr "¡No tienes el privilegio \"home\"!"
+
+#: register.lua
+msgid "Go home"
+msgstr ""
+
+#: register.lua
+msgid "Set time to day"
+msgstr ""
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr "Hora del día cambiada a 6AM"
+
+#: register.lua
+msgid "You don't have the settime privilege!"
+msgstr "¡No tienes el privilegio \"settime\"!"
+
+#: register.lua
+msgid "Set time to night"
+msgstr ""
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr "Hora del día cambiada a 9PM"
+
+#: register.lua
+msgid "Clear inventory"
+msgstr ""
+
+#: register.lua
+#, fuzzy
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr ""
+"Éste botón ha sido deshabilitado para prevenir la destrucción accidental del "
+"inventario.\n"
+"Usa la ranura para basura en su lugar."
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr "¡Inventario limpio!"
+
+#: register.lua
+msgid "Trash:"
+msgstr "Basura:"
+
+#: register.lua
+msgid "Refill:"
+msgstr "Rellenar:"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr "Receta %d de %d"
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr ""
+
+#: register.lua
+msgid "No recipes"
+msgstr ""
+
+#: register.lua
+msgid "No usages"
+msgstr ""
+
+#: register.lua
+msgid "Result"
+msgstr "Resultado"
+
+#: register.lua
+msgid "Ingredient"
+msgstr ""
+
+#: register.lua
+msgid "Show next recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show next usage"
+msgstr ""
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show previous usage"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr ""
+
+#: register.lua
+msgid "Give me:"
+msgstr ""
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+
+#: register.lua
+#, fuzzy
+msgid "To craft grid:"
+msgstr "Copiar al cuadro de elaboración"
+
+#: register.lua
+msgid "All"
+msgstr "Todos"
+
+#: waypoints.lua
+msgid "White"
+msgstr "Blanco"
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr "Amarillo"
+
+#: waypoints.lua
+msgid "Red"
+msgstr "Rojo"
+
+#: waypoints.lua
+msgid "Green"
+msgstr "Verde"
+
+#: waypoints.lua
+msgid "Blue"
+msgstr "Azul"
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr "Puntos de paso"
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr ""
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr "Puntos de paso %d"
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr ""
+
+#: waypoints.lua
+msgid "invisible"
+msgstr ""
+
+#: waypoints.lua
+msgid "visible"
+msgstr ""
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr ""
+
+#: waypoints.lua
+msgid "Disable"
+msgstr ""
+
+#: waypoints.lua
+msgid "Enable"
+msgstr ""
+
+#: waypoints.lua
+msgid "@1 display of waypoint coordinates"
+msgstr ""
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr ""
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr ""
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr "Punto de paso activo"
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr "Punto de paso inactivo"
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr ""
+
+#: waypoints.lua
+msgid "World position"
+msgstr "Posición en el mundo"
+
+#: waypoints.lua
+msgid "Name"
+msgstr "Nombre"
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr "Color del HUD"
diff --git a/unified_inventory/locale/es.txt b/unified_inventory/locale/es.txt
deleted file mode 100644
index d8c0dd6..0000000
--- a/unified_inventory/locale/es.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-# Translation by Diego Martínez <kaeza>
-
-### api.lua ###
-Digging (by chance) = Excavado (por azar)
-
-# Template
-### bags.lua ###
-Bags = Bolsas
-Bag @1 = Bolsa @1
-Small Bag = Bolsa Pequeña
-Medium Bag = Bolsa Mediana
-Large Bag = Bolsa Grande
-
-### inernal.lua ###
-First page =
-Back three pages =
-Back one page =
-Forward one page =
-Forward three pages =
-Last page =
-No matching items =
-Page = Página
-%s of %s = %s de %s
-Filter = Filtro
-Search =
-
-### register.lua ###
-Can use the creative inventory = Puede usar el inventario creativo
-Home position set to: %s = Posición de hogar cambiada a: %s
-Time of day set to 6am = Hora del día cambiada a 6AM
-You don't have the settime priviledge! = ¡No tienes el privilegio `settime'!
-Time of day set to 9pm = Hora del día cambiada a 9PM
-This button has been disabled outside of creative mode to prevent accidental inventory trashing. Use the trash slot instead. = Éste botón ha sido deshabilitado para prevenir la destrucción accidental del inventario.\nUsa la ranura para basura en su lugar.
-Inventory cleared! = ¡Inventario limpio!
-Crafting = Elaboración
-Trash: = Basura:
-Refill: = Rellenar:
-Crafting Guide = Guía de Elaboración
-Method: = Método:
-Result: %s = Resultado: %s
-crafting = elaboración
-shapeless crafting = elaboración sin forma
-cooking = hornear
-alloy cooking = horneado de aleación
-Copy to craft grid: = Copiar al cuadro de elaboración
-All = Todos
-Recipe %s of %s = Receta %s de %s
-Alternate = Alternar
-Crafting Grid =
-
-### waypoints.lua ###
-White = Blanco
-Yellow = Amarillo
-Red = Rojo
-Green = Verde
-Blue = Azul
-Waypoints = Puntos de paso
-Waypoint active = Punto de paso activo
-Waypoint inactive = Punto de paso inactivo
-World position = Posición en el mundo
-Name = Nombre
-HUD text color = Color del HUD
-Edit waypoint name =
-Rename waypoint =
-Change color of waypoint display =
-Set waypoint to current location =
-Make waypoint visible =
-Make waypoint invisible =
-Disable display of waypoint coordinates =
-Enable display of waypoint coordinates =
-Finish editing =
-Select Waypoint #%d =
diff --git a/unified_inventory/locale/fr.po b/unified_inventory/locale/fr.po
new file mode 100644
index 0000000..f6af706
--- /dev/null
+++ b/unified_inventory/locale/fr.po
@@ -0,0 +1,364 @@
+# French translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# kilbith
+# CodeXP <codexp@gmx.net>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 16:15+0200\n"
+"PO-Revision-Date: \n"
+"Last-Translator: CodeXP <codexp@gmx.net>\n"
+"Language-Team: \n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: api.lua register.lua
+msgid "Crafting"
+msgstr "Création"
+
+#: api.lua
+msgid "Mixing"
+msgstr ""
+
+#: api.lua
+msgid "Cooking"
+msgstr "Cuisson"
+
+#: api.lua
+msgid "Digging"
+msgstr "Creuser"
+
+#: bags.lua
+msgid "Bags"
+msgstr "Sacs"
+
+#: bags.lua
+msgid "Bag @1"
+msgstr "Sac @1"
+
+#: bags.lua
+msgid "Small Bag"
+msgstr "Petit sac"
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr "Sac moyen"
+
+#: bags.lua
+msgid "Large Bag"
+msgstr "Grand sac"
+
+#: group.lua
+msgid " and "
+msgstr " et "
+
+#: internal.lua
+msgid "First page"
+msgstr "1ère page"
+
+#: internal.lua
+msgid "Back three pages"
+msgstr "3 pages en arrière"
+
+#: internal.lua
+msgid "Back one page"
+msgstr "Page précédente"
+
+#: internal.lua
+msgid "Forward one page"
+msgstr "Page suivante"
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr "3 pages en avant"
+
+#: internal.lua
+msgid "Last page"
+msgstr "Dernière page"
+
+#: internal.lua
+msgid "Search"
+msgstr "Rechercher"
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr ""
+
+#: internal.lua
+msgid "No matching items"
+msgstr "Aucun élément correspondant"
+
+#: internal.lua
+msgid "No matches."
+msgstr "Aucun match"
+
+#: internal.lua
+msgid "Page"
+msgstr "Page"
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr "%s de %s"
+
+#: internal.lua
+msgid "Filter"
+msgstr "Filtre"
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr "Vous pouvez utiliser l'inventaire créatif"
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr "Grille de création"
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr "Guide de création"
+
+#: register.lua
+#, fuzzy
+msgid "Set home position"
+msgstr "Position dans le monde"
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr "Position de votre base fixée à: %s"
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr "Vous n'avez pas le privilège \"home\"!"
+
+#: register.lua
+msgid "Go home"
+msgstr ""
+
+#: register.lua
+msgid "Set time to day"
+msgstr ""
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr "Heure fixée à 6h"
+
+#: register.lua
+msgid "You don't have the settime privilege!"
+msgstr "Vous n'avez pas le privilège \"settime\"!"
+
+#: register.lua
+msgid "Set time to night"
+msgstr ""
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr "Heure fixée à 21h"
+
+#: register.lua
+msgid "Clear inventory"
+msgstr ""
+
+#: register.lua
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr ""
+"Ce bouton a été désactivé en dehors du mode créatif pour éviter des saccages "
+"dans l'inventaire.\n"
+"Utilisez plutôt la case poubelle."
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr "Inventaire vidé !"
+
+#: register.lua
+msgid "Trash:"
+msgstr "Poubelle :"
+
+#: register.lua
+msgid "Refill:"
+msgstr "Remplir :"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr "Recette %d de %d"
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr ""
+
+#: register.lua
+msgid "No recipes"
+msgstr ""
+
+#: register.lua
+msgid "No usages"
+msgstr ""
+
+#: register.lua
+msgid "Result"
+msgstr "Résultat"
+
+#: register.lua
+msgid "Ingredient"
+msgstr ""
+
+#: register.lua
+msgid "Show next recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show next usage"
+msgstr ""
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show previous usage"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr ""
+
+#: register.lua
+msgid "Give me:"
+msgstr ""
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+
+#: register.lua
+msgid "To craft grid:"
+msgstr "Sur de création:"
+
+#: register.lua
+msgid "All"
+msgstr "Tout"
+
+#: waypoints.lua
+msgid "White"
+msgstr "Blanc"
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr "Jaune"
+
+#: waypoints.lua
+msgid "Red"
+msgstr "Rouge"
+
+#: waypoints.lua
+msgid "Green"
+msgstr "Vert"
+
+#: waypoints.lua
+msgid "Blue"
+msgstr "Bleu"
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr "Point de passage"
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr "Choisir un point de passage #%d"
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr "Point de passage %d"
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr "Marquer un point de passage à la position actuelle"
+
+#: waypoints.lua
+msgid "invisible"
+msgstr ""
+
+#: waypoints.lua
+msgid "visible"
+msgstr ""
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr "Rendre @1 le point de passage"
+
+#: waypoints.lua
+msgid "Disable"
+msgstr ""
+
+#: waypoints.lua
+msgid "Enable"
+msgstr ""
+
+#: waypoints.lua
+#, fuzzy
+msgid "@1 display of waypoint coordinates"
+msgstr "@1 montrer les coordonnées des points de passages"
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr "Changer la couleur du point de passage"
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr "Editer le nom du point de passage"
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr "Point de passage actif"
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr "Point de passage inactif"
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr "Terminer l'édition"
+
+#: waypoints.lua
+msgid "World position"
+msgstr "Position dans le monde"
+
+#: waypoints.lua
+msgid "Name"
+msgstr "Nom"
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr "Couleur de texte du HUD"
diff --git a/unified_inventory/locale/fr.txt b/unified_inventory/locale/fr.txt
deleted file mode 100644
index 43c52f0..0000000
--- a/unified_inventory/locale/fr.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-# Translation by kilbith
-
-# Template
-### bags.lua ###
-Bags = Sacs
-Bag @1 = Sac @1
-Small Bag = Petit sac
-Medium Bag = Sac moyen
-Large Bag = Grand sac
-
-### inernal.lua ###
-First page = 1ère page
-Back three pages = 3 pages en arrière
-Back one page = Page précédente
-Forward one page = Page suivante
-Forward three pages = 3 pages en avant
-Last page = Dernière page
-No matching items = Aucun élément correspondant
-Page = Page
-%s of %s = %s de %s
-Filter = Filtre
-Search = Rechercher
-
-### register.lua ###
-Can use the creative inventory = Vous pouvez utiliser l'inventaire créatif
-Home position set to: %s = Position de votre base fixée à : %s
-Time of day set to 6am = Heure fixée à 6h
-You don't have the settime priviledge! = Vous n'avez pas le privilège 'settime' !
-Time of day set to 9pm = Heure fixée à 21h
-This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = Ce bouton a été désactivé en dehors du mode créatif pour éviter des saccages dans l'inventaire.\nUtilisez plutôt la case poubelle.
-Inventory cleared! = Inventaire vidé !
-Crafting = Création
-Trash: = Poubelle :
-Refill: = Remplir :
-Crafting Guide = Guide de création
-Method: = Méthode :
-Result: %s = Résultat : %s
-crafting = fabrication
-shapeless crafting = fabrication sans forme
-cooking = cuisson
-alloy cooking = cuisson des métaux
-Copy to craft grid: = Copier sur la grille de création
-All = Tout
-Recipe %s of %s = Recette %s de %d
-Alternate = Alternative
-Crafting Grid = Grille de création
-
-### waypoints.lua ###
-White = Blanc
-Yellow = Jaune
-Red = Rouge
-Green = Vert
-Blue = Bleu
-Waypoints = Point de passage
-Waypoint active = Point de passage actif
-Waypoint inactive = Point de passage inactif
-World position = Position dans le monde
-Name = Nom
-HUD text color = Couleur de texte du HUD
-Edit waypoint name = Editer le nom du point de passage
-Rename waypoint = Renommer le point de passage
-Change color of waypoint display = Changer la couleur du point de passage
-Set waypoint to current location = Marquer un point de passage à la position actuelle
-Make waypoint visible = Rendre visible le point de passage
-Make waypoint invisible = Rendre invisible le point de passage
-Disable display of waypoint coordinates = Masquer les coordonnées des points de passages
-Enable display of waypoint coordinates = Montrer les coordonnées des points de passages
-Finish editing = Terminer l'édition
-Select Waypoint #%d = Choisir un point de passage #%d
diff --git a/unified_inventory/locale/ms.po b/unified_inventory/locale/ms.po
new file mode 100644
index 0000000..518fcb3
--- /dev/null
+++ b/unified_inventory/locale/ms.po
@@ -0,0 +1,369 @@
+# Malay translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# muhdnurhidayat <translation@mnh48.moe>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 03:34+0200\n"
+"PO-Revision-Date: 2018-07-17 20:14+0800\n"
+"Language-Team: muhdnurhidayat <translation@mnh48.moe>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.9\n"
+"Last-Translator: muhdnurhidayat <translation@mnh48.moe>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: ms\n"
+"X-Poedit-Flags-xgettext: --add-comments\n"
+
+#: api.lua register.lua
+msgid "Crafting"
+msgstr "Pertukangan"
+
+#: api.lua
+msgid "Mixing"
+msgstr "Pencampuran"
+
+#: api.lua
+msgid "Cooking"
+msgstr "Pemasakan"
+
+#: api.lua
+msgid "Digging"
+msgstr "Penggalian"
+
+#: bags.lua
+msgid "Bags"
+msgstr "Beg"
+
+#: bags.lua
+msgid "Bag @1"
+msgstr "Beg @1"
+
+#: bags.lua
+msgid "Small Bag"
+msgstr "Beg Kecil"
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr "Beg Sederhana"
+
+#: bags.lua
+msgid "Large Bag"
+msgstr "Beg Besar"
+
+#: group.lua
+msgid " and "
+msgstr " dan "
+
+#: internal.lua
+msgid "First page"
+msgstr "Halaman pertama"
+
+#: internal.lua
+msgid "Back three pages"
+msgstr "Tiga halaman sebelumnya"
+
+#: internal.lua
+msgid "Back one page"
+msgstr "Halaman sebelumnya"
+
+#: internal.lua
+msgid "Forward one page"
+msgstr "Halaman seterusnya"
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr "Tiga halaman seterusnya"
+
+#: internal.lua
+msgid "Last page"
+msgstr "Halaman terakhir"
+
+#: internal.lua
+msgid "Search"
+msgstr "Cari"
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr "Set semula carian dan tunjukkan semua benda"
+
+#: internal.lua
+msgid "No matching items"
+msgstr "Tiada item sepadan"
+
+#: internal.lua
+msgid "No matches."
+msgstr "Tiada padanan."
+
+#: internal.lua
+msgid "Page"
+msgstr "Halaman"
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr "%s drpd %s"
+
+#: internal.lua
+msgid "Filter"
+msgstr "Tapis"
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr "Boleh guna inventori kreatif"
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+"Memaksa Unified Inventory untuk dipaparkan dalam mod Full jika mod Lite "
+"ditetapkan secara global"
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr "Grid Pertukangan"
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr "Panduan Pertukangan"
+
+#: register.lua
+msgid "Set home position"
+msgstr "Tetapkan kedudukan rumah"
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr "Kedudukan rumah ditetapkan ke: %s"
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr "Anda tidak ada keistimewaan \"home\"!"
+
+#: register.lua
+msgid "Go home"
+msgstr "Balik rumah"
+
+#: register.lua
+msgid "Set time to day"
+msgstr "Tetapkan masa jadi siang"
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr "Masa ditetapkan ke 6 pagi"
+
+#: register.lua
+msgid "You don't have the settime privilege!"
+msgstr "Anda tidak ada keistimewaan settime!"
+
+#: register.lua
+msgid "Set time to night"
+msgstr "Tetapkan masa jadi malam"
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr "Masa ditetapkan ke 9 malam"
+
+#: register.lua
+msgid "Clear inventory"
+msgstr "Kosongkan inventori"
+
+#: register.lua
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr ""
+"Butang ini dilumpuhkan di luar mod kreatif untuk mengelakkan pengosongan "
+"inventori secara tidak sengaja.\n"
+"Sebaliknya, gunakan slot tong sampah."
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr "Inventori dikosongkan!"
+
+#: register.lua
+msgid "Trash:"
+msgstr "Buang:"
+
+#: register.lua
+msgid "Refill:"
+msgstr "Isi balik:"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr "Sebarang item dari kumpulan %s"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr "Sebarang item dari kumpulan %s"
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr "Resipi %d drpd %d"
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr "Kegunaan %d drpd %d"
+
+#: register.lua
+msgid "No recipes"
+msgstr "Tiada resipi"
+
+#: register.lua
+msgid "No usages"
+msgstr "Tiada kegunaan"
+
+#: register.lua
+msgid "Result"
+msgstr "Hasil"
+
+#: register.lua
+msgid "Ingredient"
+msgstr "Bahan"
+
+#: register.lua
+msgid "Show next recipe"
+msgstr "Tunjuk resipi seterusnya"
+
+#: register.lua
+msgid "Show next usage"
+msgstr "Tunjuk kegunaan seterusnya"
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr "Tunjuk resipi sebelumnya"
+
+#: register.lua
+msgid "Show previous usage"
+msgstr "Tunjuk kegunaan sebelumnya"
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: register.lua
+msgid "Give me:"
+msgstr "Beri saya:"
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+"Resipi ini terlalu\n"
+"besar untuk paparan."
+
+#: register.lua
+msgid "To craft grid:"
+msgstr "Ke grid pertukangan:"
+
+#: register.lua
+msgid "All"
+msgstr ""
+"SE\n"
+"MUA"
+
+#: waypoints.lua
+msgid "White"
+msgstr "Putih"
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr "Kuning"
+
+#: waypoints.lua
+msgid "Red"
+msgstr "Merah"
+
+#: waypoints.lua
+msgid "Green"
+msgstr "Hijau"
+
+#: waypoints.lua
+msgid "Blue"
+msgstr "Biru"
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr "Titik Arah"
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr "Pilih Titik Arah #%d"
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr "Titik Arah %d"
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr "Tetapkan titik arah ke lokasi semasa"
+
+#: waypoints.lua
+msgid "invisible"
+msgstr "Sembunyikan"
+
+#: waypoints.lua
+msgid "visible"
+msgstr "Paparkan"
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr "@1 titik arah"
+
+#: waypoints.lua
+msgid "Disable"
+msgstr "Sembunyikan"
+
+#: waypoints.lua
+msgid "Enable"
+msgstr "Paparkan"
+
+#: waypoints.lua
+msgid "@1 display of waypoint coordinates"
+msgstr "@1 koordinat untuk titik arah"
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr "Tukar warna paparan titik arah"
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr "Edit nama titik arah"
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr "Titik arah aktif"
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr "Titik arah tidak aktif"
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr "Selesai edit"
+
+#: waypoints.lua
+msgid "World position"
+msgstr "Kedudukan dunia"
+
+#: waypoints.lua
+msgid "Name"
+msgstr "Nama"
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr "Warna tulisan HUD"
diff --git a/unified_inventory/locale/pl.po b/unified_inventory/locale/pl.po
new file mode 100644
index 0000000..5a3f412
--- /dev/null
+++ b/unified_inventory/locale/pl.po
@@ -0,0 +1,359 @@
+# Polish translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# RealBadAngel
+# CodeXP <codexp@gmx.net>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 16:30+0200\n"
+"PO-Revision-Date: \n"
+"Last-Translator: CodeXP <codexp@gmx.net>\n"
+"Language-Team: \n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: api.lua register.lua
+msgid "Crafting"
+msgstr ""
+
+#: api.lua
+msgid "Mixing"
+msgstr ""
+
+#: api.lua
+msgid "Cooking"
+msgstr ""
+
+#: api.lua
+msgid "Digging"
+msgstr ""
+
+#: bags.lua
+msgid "Bags"
+msgstr "Plecaki"
+
+#: bags.lua
+msgid "Bag @1"
+msgstr "Plecak @1"
+
+#: bags.lua
+msgid "Small Bag"
+msgstr "Maly plecak"
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr "Sredni plecak"
+
+#: bags.lua
+msgid "Large Bag"
+msgstr "Duzy plecak"
+
+#: group.lua
+msgid " and "
+msgstr " i "
+
+#: internal.lua
+msgid "First page"
+msgstr "Pierwsza strona"
+
+#: internal.lua
+msgid "Back three pages"
+msgstr "3 strony w tyl"
+
+#: internal.lua
+msgid "Back one page"
+msgstr "1 strona w tyl"
+
+#: internal.lua
+msgid "Forward one page"
+msgstr "1 strona do przodu"
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr "3 strony do przodu"
+
+#: internal.lua
+msgid "Last page"
+msgstr "Ostatnia strona"
+
+#: internal.lua
+msgid "Search"
+msgstr "Szukaj"
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr ""
+
+#: internal.lua
+msgid "No matching items"
+msgstr "Brak pasujacych przedmiotow"
+
+#: internal.lua
+msgid "No matches."
+msgstr "Brak wyników"
+
+#: internal.lua
+msgid "Page"
+msgstr "Strona"
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr "%s z %s"
+
+#: internal.lua
+msgid "Filter"
+msgstr "Filtr"
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr ""
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr ""
+
+#: register.lua
+msgid "Set home position"
+msgstr "Ustaw pozycję wyjściową"
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr "Pozycja domowa ustawiona na: %s"
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr "Nie masz uprawnien do zmiany czasu \"home\"!"
+
+#: register.lua
+msgid "Go home"
+msgstr "Idź do domu"
+
+#: register.lua
+msgid "Set time to day"
+msgstr "Ustaw czas na dzień"
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr "Czas ustawiony na 6:00"
+
+#: register.lua
+msgid "You don't have the settime privilege!"
+msgstr "Nie masz uprawnien do zmiany czasu \"settime\"!"
+
+#: register.lua
+msgid "Set time to night"
+msgstr "Ustaw czas na noc"
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr "Czas ustawiony na 21:00"
+
+#: register.lua
+msgid "Clear inventory"
+msgstr "Wyczyść zapasy"
+
+#: register.lua
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr ""
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr "Zapasy zostały wyczyszczone!"
+
+#: register.lua
+msgid "Trash:"
+msgstr "Smietnik:"
+
+#: register.lua
+msgid "Refill:"
+msgstr "Uzupelnianie:"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr "Recepta %d z %d"
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr "Użycie %d z %d"
+
+#: register.lua
+msgid "No recipes"
+msgstr "Brak recepty"
+
+#: register.lua
+msgid "No usages"
+msgstr "Bez użycia"
+
+#: register.lua
+msgid "Result"
+msgstr "Wynik"
+
+#: register.lua
+msgid "Ingredient"
+msgstr "Składnik"
+
+#: register.lua
+msgid "Show next recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show next usage"
+msgstr ""
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show previous usage"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr ""
+
+#: register.lua
+msgid "Give me:"
+msgstr "Daj mi:"
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+
+#: register.lua
+msgid "To craft grid:"
+msgstr ""
+
+#: register.lua
+msgid "All"
+msgstr "Wszystko"
+
+#: waypoints.lua
+msgid "White"
+msgstr "Bialy"
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr "Zolty"
+
+#: waypoints.lua
+msgid "Red"
+msgstr "Czerwony"
+
+#: waypoints.lua
+msgid "Green"
+msgstr "Zielony"
+
+#: waypoints.lua
+msgid "Blue"
+msgstr "Niebieski"
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr "Punkty orientacyjne"
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr "Wybierz punkt #%d"
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr "Punkty orientacyjne %d"
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr "Ustaw punkt orientacyjny na biezacej pozycji"
+
+#: waypoints.lua
+msgid "invisible"
+msgstr "niewidzialny"
+
+#: waypoints.lua
+msgid "visible"
+msgstr "widomy"
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr "Robić punkt @1"
+
+#: waypoints.lua
+msgid "Disable"
+msgstr ""
+
+#: waypoints.lua
+msgid "Enable"
+msgstr ""
+
+#: waypoints.lua
+msgid "@1 display of waypoint coordinates"
+msgstr "@1 koordynatow punktu"
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr "Zmien kolor punktu"
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr "Edytuj nazwe punktu"
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr "Punkt wlaczony"
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr "Punkt wylaczony"
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr "Zakoncz edycje"
+
+#: waypoints.lua
+msgid "World position"
+msgstr "Pozycja"
+
+#: waypoints.lua
+msgid "Name"
+msgstr "Nazwa"
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr "Kolor tekstu HUD"
diff --git a/unified_inventory/locale/pl.txt b/unified_inventory/locale/pl.txt
deleted file mode 100644
index ef3e821..0000000
--- a/unified_inventory/locale/pl.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-# Translation by RealBadAngel
-
-### bags.lua ###
-Bags = Plecaki
-Bag @1 = Plecak @1
-Small Bag = Maly plecak
-Medium Bag = Sredni plecak
-Large Bag = Duzy plecak
-
-### inernal.lua ###
-First page = Pierwsza strona
-Back three pages = 3 strony w tyl
-Back one page = 1 strona w tyl
-Forward one page = 1 strona do przodu
-Forward three pages = 3 strony do przodu
-Last page = Ostatnia strona
-No matching items = Brak pasujacych przedmiotow
-Page = Strona
-%s of %s = %s z %s
-Filter = Filtr
-Search = Szukaj
-
-### register.lua ###
-Can use the creative inventory =
-Home position set to: %s = Pozycja domowa ustawiona na: %s
-Time of day set to 6am = Czas ustawiony na 6:00
-You don't have the settime priviledge! = Nie masz uprawnien do zmiany czasu (settime)!
-Time of day set to 9pm = Czas ustawiony na 21:00
-This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. =
-Inventory cleared! =
-Crafting =
-Trash: = Smietnik:
-Refill: = Uzupelnianie:
-Crafting Guide =
-Method: = Metoda:
-Result: %s = Wynik: %s
-crafting =
-shapeless crafting =
-cooking =
-alloy cooking =
-Copy to craft grid: =
-All = Wszystko
-Recipe %s of %s = Recepta %s z %s
-Alternate = Alternatywa
-Crafting Grid =
-
-### waypoints.lua ###
-White = Bialy
-Yellow = Zolty
-Red = Czerwony
-Green = Zielony
-Blue = Niebieski
-Waypoints = Punkty orientacyjne
-Waypoint active = Punkt wlaczony
-Waypoint inactive = Punkt wylaczony
-World position = Pozycja
-Name = Nazwa
-HUD text color = Kolor tekstu HUD
-Edit waypoint name = Edytuj nazwe punktu
-Rename waypoint = Zmien nazwe punktu
-Change color of waypoint display = Zmien kolor punktu
-Set waypoint to current location = Ustaw punkt orientacyjny na biezacej pozycji
-Make waypoint visible = Pokaz punkt
-Make waypoint invisible = Nie pokazuj punktu
-Disable display of waypoint coordinates = Pokazuj koordynaty punktu
-Enable display of waypoint coordinates = Nie pokazuj koordynatow punktu
-Finish editing = Zakoncz edycje
-Select Waypoint #%d = Wybierz punkt #%d
diff --git a/unified_inventory/locale/pt.po b/unified_inventory/locale/pt.po
new file mode 100644
index 0000000..ff9cc3a
--- /dev/null
+++ b/unified_inventory/locale/pt.po
@@ -0,0 +1,366 @@
+# Portuguese translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# Lunovox <lunovox@openmailbox.org>
+# CodeXP <codexp@gmx.net>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 16:48+0200\n"
+"PO-Revision-Date: \n"
+"Last-Translator: CodeXP <codexp@gmx.net>\n"
+"Language-Team: \n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: api.lua register.lua
+msgid "Crafting"
+msgstr "Artesanato"
+
+#: api.lua
+msgid "Mixing"
+msgstr "Muistura"
+
+#: api.lua
+msgid "Cooking"
+msgstr "Cozimento"
+
+#: api.lua
+msgid "Digging"
+msgstr "Escavação"
+
+#: bags.lua
+msgid "Bags"
+msgstr "Bolsas"
+
+#: bags.lua
+msgid "Bag @1"
+msgstr "Bolsa @1"
+
+#: bags.lua
+msgid "Small Bag"
+msgstr "Bolsa Pequena"
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr "Bolsa Média"
+
+#: bags.lua
+msgid "Large Bag"
+msgstr "Bolsa Grande"
+
+#: group.lua
+msgid " and "
+msgstr " e "
+
+#: internal.lua
+msgid "First page"
+msgstr "Primeira Página"
+
+#: internal.lua
+msgid "Back three pages"
+msgstr "Voltar 3 Páginas"
+
+#: internal.lua
+msgid "Back one page"
+msgstr "Voltar 1 Página"
+
+#: internal.lua
+msgid "Forward one page"
+msgstr "Avançar 1 Página"
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr "Avançar 3 Páginas"
+
+#: internal.lua
+msgid "Last page"
+msgstr "Ultima Página"
+
+#: internal.lua
+msgid "Search"
+msgstr "Pesquisar"
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr "Redefinir pesquisa e exibir tudo"
+
+#: internal.lua
+msgid "No matching items"
+msgstr "Nenhum item correspondente"
+
+#: internal.lua
+msgid "No matches."
+msgstr "Sem correspondências"
+
+#: internal.lua
+msgid "Page"
+msgstr "Página"
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr "%s de %s"
+
+#: internal.lua
+msgid "Filter"
+msgstr "Filtro"
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr "Pode usar o inventário do criativo"
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+"Força o Unified Inventory a ser exibido no modo Full se o modo Lite estiver "
+"configurado globalmente"
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr "Grade de Artesanato"
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr "Guia de Artesanato"
+
+#: register.lua
+msgid "Set home position"
+msgstr "Definir posição de casa"
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr "Posição inicial definida para: %s"
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr "Você não tem o privilégio de \"home\"!"
+
+#: register.lua
+msgid "Go home"
+msgstr "Transportar para Casa"
+
+#: register.lua
+msgid "Set time to day"
+msgstr "Definir turno para dia"
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr "Hora do dia definida para 06h"
+
+#: register.lua
+msgid "You don't have the settime privilege!"
+msgstr "Você não tem o privilégio de \"settime\"!"
+
+#: register.lua
+msgid "Set time to night"
+msgstr "Definir turno para noite"
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr "Hora do dia ajustada para 21h"
+
+#: register.lua
+msgid "Clear inventory"
+msgstr "Limpar Inventário"
+
+#: register.lua
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr ""
+"Este botão foi desativado fora do modo de criativo para evitar o descarte "
+"acidental de inventário. \n"
+"Use o slot de lixo em vez disso."
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr "Inventário Apagado!"
+
+#: register.lua
+msgid "Trash:"
+msgstr "Lixo:"
+
+#: register.lua
+msgid "Refill:"
+msgstr "Recarga:"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr "Qualquer item pertencente ao grupo '%s'."
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr "Qualquer item pertencente aos grupos '%s'."
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr "Receita %d de %d"
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr "Utilização %d de %d"
+
+#: register.lua
+msgid "No recipes"
+msgstr "Sem Receita"
+
+#: register.lua
+msgid "No usages"
+msgstr "Sem Utilização"
+
+#: register.lua
+msgid "Result"
+msgstr "Resultado"
+
+#: register.lua
+msgid "Ingredient"
+msgstr "Ingrediente"
+
+#: register.lua
+msgid "Show next recipe"
+msgstr "Exibir Próxima Receita"
+
+#: register.lua
+msgid "Show next usage"
+msgstr "Mostrar Próxima Utilização"
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr "Exibir Receita Anterior"
+
+#: register.lua
+msgid "Show previous usage"
+msgstr "Exibir Utilização Anterior"
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr ""
+
+#: register.lua
+msgid "Give me:"
+msgstr "Gerado:"
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+"Esta receita é grande \n"
+"demais para ser apresentada."
+
+#: register.lua
+msgid "To craft grid:"
+msgstr "Para Grade de Artesanato"
+
+#: register.lua
+msgid "All"
+msgstr "MAX"
+
+#: waypoints.lua
+msgid "White"
+msgstr "Branco"
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr "Amarelo"
+
+#: waypoints.lua
+msgid "Red"
+msgstr "Vermelho"
+
+#: waypoints.lua
+msgid "Green"
+msgstr "Verde"
+
+#: waypoints.lua
+msgid "Blue"
+msgstr "Azul"
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr "Apontador de Direção"
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr "Seleção de Apontador de Direção #%02d"
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr "Apontador de Direção %d"
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr "Configurar localização atual do Apontador de Direção"
+
+#: waypoints.lua
+msgid "invisible"
+msgstr "invisível"
+
+#: waypoints.lua
+msgid "visible"
+msgstr "visível"
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr "Fazer Apontador de Direção @1"
+
+#: waypoints.lua
+msgid "Disable"
+msgstr ""
+
+#: waypoints.lua
+msgid "Enable"
+msgstr ""
+
+#: waypoints.lua
+msgid "@1 display of waypoint coordinates"
+msgstr "@1 exibição de coordenadas de Fazer Apontador de Direção"
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr "Mudar cor exibida do Apontador de Direção"
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr "Editar Nome de Apontador de Direção"
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr "Apontador de Direção Ativo"
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr "Apontador de Direção Inativo"
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr "Edição Finalizada"
+
+#: waypoints.lua
+msgid "World position"
+msgstr "Posição Mundial"
+
+#: waypoints.lua
+msgid "Name"
+msgstr "Nome"
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr "Cor de HUD"
diff --git a/unified_inventory/locale/pt.txt b/unified_inventory/locale/pt.txt
deleted file mode 100644
index 28ff76d..0000000
--- a/unified_inventory/locale/pt.txt
+++ /dev/null
@@ -1,107 +0,0 @@
-# Translation by Lunovox <lunovox@openmailbox.org>
-
-### api.lua ###
-Digging (by chance) = Cavando (por acaso)
-
-# Template
-### bags.lua ###
-Bags = Bolsas
-Bag @1 = Bolsa @1
-Small Bag = Bolsa Pequena
-Medium Bag = Bolsa Média
-Large Bag = Bolsa Grande
-
-### inernal.lua ###
-First page = Primeira Página
-Back three pages = Voltar 3 Páginas
-Back one page = Voltar 1 Página
-Forward one page = Avançar 1 Página
-Forward three pages = Avançar 3 Páginas
-Last page = Ultima Página
-No matching items = Nenhum item correspondente
-Page = Página
-%s of %s = %s de %s
-Filter = Filtro
-Search = Pesquisar
-Reset search and display everything = Redefinir pesquisa e exibir tudo
-
-### register.lua ###
-Can use the creative inventory = Pode usar o inventário do criativo
-Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally = Força o Unified Inventory a ser exibido no modo Full se o modo Lite estiver configurado globalmente
-Home position set to: %s = Posição inicial definida para: %s
-Time of day set to 6am = Hora do dia definida para 06h
-You don't have the settime priviledge! = Você não tem o privilégio de 'settime'!
-Time of day set to 9pm = Hora do dia ajustada para 21h
-This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = Este botão foi desativado fora do modo de criativo para evitar o descarte acidental de inventário. \nUse o slot de lixo em vez disso.
-Inventory cleared! = Inventário Apagado!
-Crafting = Artesanato
-Digging = Escavação
-Cooking = Cozimento
-Mixing = Muistura
-Trash: = Lixo:
-Refill: = Recarga:
-Crafting Guide = Guia de Artesanato
-Method: = Método:
-Result: %s = Resultado: %s
-crafting = artesanato
-shapeless crafting = artesanato sem formato
-cooking = cozinhar
-alloy cooking = Cozinhar em liga
-Copy to craft grid: = Copiar para grade de artesanato:
-All = MAX
-Alternate = Alternar
-Crafting Grid = Grade de Artesanato
-Show next recipe = Exibir Próxima Receita
-Show next usage = Mostrar Próxima Utilização
-Show previous recipe = Exibir Receita Anterior
-Show previous usage = Exibir Utilização Anterior
-
-# Shown for huge crafting recipes; try to keep the line length short and use multiple line breaks as needed
-This recipe is too\nlarge to be displayed. = Esta receita é grande \ndemais para ser apresentada.
-
-# %s = group name (e.g. wool)
-Any item belonging to the %s group = Qualquer item pertencente ao grupo '%s'.
-
-# %s = List of “and”-concatenated group names
-Any item belonging to the groups %s = Qualquer item pertencente aos grupos '%s'.
-Recipe %d of %d = Receita %s de %s
-Usage %d of %d = Utilização %s de %s
-No recipes = Sem Receita
-No usages = Sem Utilização
-Result = Resultado
-Ingredient = Ingrediente
-Set time to day = Definir turno para dia
-Set time to night = Definir turno para noite
-Set home position = Definir posição de casa
-Go home = Transportar para Casa
-Clear inventory = Limpar Inventário
-Give me: = Gerado:
-To craft grid: = Para Grade de Artesanato
-
-### group.lua ###
-# Logical connective, example: “Any item belonging to the groups foo and bar”
-\sand\s =
-
-### waypoints.lua ###
-White = Branco
-Yellow = Amarelo
-Red = Vermelho
-Green = Verde
-Blue = Azul
-Waypoints = Apontador de Direção
-Waypoint %d = Apontador de Direção %002
-Waypoint active = Apontador de Direção Ativo
-Waypoint inactive = Apontador de Direção Inativo
-World position = Posição Mundial
-Name = Nome
-HUD text color = Cor de HUD
-Edit waypoint name = Editar Nome de Apontador de Direção
-Rename waypoint = Renomear Apontador de Direção
-Change color of waypoint display = Mudar cor exibida do Apontador de Direção
-Set waypoint to current location = Configurar localização atual do Apontador de Direção
-Make waypoint visible = Fazer Apontador de Direção Visível
-Make waypoint invisible = Fazer Apontador de Direção Invisível
-Disable display of waypoint coordinates = Desativar exibição de coordenadas de Fazer Apontador de Direção
-Enable display of waypoint coordinates = Ativar exibição de coordenadas de Fazer Apontador de Direção
-Finish editing = Edição Finalizada
-Select Waypoint #%d = Seleção de Apontador de Direção #%02d
diff --git a/unified_inventory/locale/ru.po b/unified_inventory/locale/ru.po
new file mode 100644
index 0000000..7cf6144
--- /dev/null
+++ b/unified_inventory/locale/ru.po
@@ -0,0 +1,366 @@
+# Russian translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# eternal_sorrow
+# CodeXP <codexp@gmx.net>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 03:34+0200\n"
+"PO-Revision-Date: \n"
+"Last-Translator: CodeXP <codexp@gmx.net>\n"
+"Language-Team: \n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: api.lua register.lua
+#, fuzzy
+msgid "Crafting"
+msgstr "Крафт"
+
+#: api.lua
+msgid "Mixing"
+msgstr "Мешать"
+
+#: api.lua
+msgid "Cooking"
+msgstr "Варить"
+
+#: api.lua
+msgid "Digging"
+msgstr "Копать"
+
+#: bags.lua
+msgid "Bags"
+msgstr "Сумки"
+
+#: bags.lua
+msgid "Bag @1"
+msgstr "Сумка @1"
+
+#: bags.lua
+msgid "Small Bag"
+msgstr "Малая сумка"
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr "Средняя сумка"
+
+#: bags.lua
+msgid "Large Bag"
+msgstr "Большая сумка"
+
+#: group.lua
+msgid " and "
+msgstr " и "
+
+#: internal.lua
+msgid "First page"
+msgstr "Первая страница"
+
+#: internal.lua
+msgid "Back three pages"
+msgstr "3 страницы назад"
+
+#: internal.lua
+msgid "Back one page"
+msgstr "1 страницу назад"
+
+#: internal.lua
+msgid "Forward one page"
+msgstr "1 страницу вперёд"
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr "3 страницы вперёд"
+
+#: internal.lua
+msgid "Last page"
+msgstr "Последняя страница"
+
+#: internal.lua
+msgid "Search"
+msgstr "Поиск"
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr "Сброс поиска, показать всё"
+
+#: internal.lua
+msgid "No matching items"
+msgstr "Нет подходящих элементов"
+
+#: internal.lua
+msgid "No matches."
+msgstr "Ничего не найдено"
+
+#: internal.lua
+msgid "Page"
+msgstr "Страница"
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr "%s из %s"
+
+#: internal.lua
+msgid "Filter"
+msgstr "Фильтр"
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr "Можно использовать инвентарь творческого режима"
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr "Решетка крафта"
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr "Книга рецептов"
+
+#: register.lua
+msgid "Set home position"
+msgstr "Установить позицию дома"
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr "Дом теперь расположен по коодинатам: %s"
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr "У вас нет привилегии \"home\"!"
+
+#: register.lua
+msgid "Go home"
+msgstr "Отправиться домой"
+
+#: register.lua
+msgid "Set time to day"
+msgstr "День"
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr "Установлено время 6 утра"
+
+#: register.lua
+#, fuzzy
+msgid "You don't have the settime privilege!"
+msgstr "Вам не разрешено устанавливать время! (нет привилегии \"settime\")"
+
+#: register.lua
+msgid "Set time to night"
+msgstr "Ночь"
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr "Установлено время 9 вечера"
+
+#: register.lua
+msgid "Clear inventory"
+msgstr "Очистить инвентарь"
+
+#: register.lua
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr ""
+"Эта кнопка отключена вне творческого режима, чтобы предотвратить случайное "
+"уничтожение предметов.\n"
+"Используйте слот корзины вместо нее."
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr "Инвентарь очищен!"
+
+#: register.lua
+msgid "Trash:"
+msgstr "Мусор:"
+
+#: register.lua
+msgid "Refill:"
+msgstr "Наполнить:"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr "Любой элемент из группы: %s"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr "Любой элемент из группы: %s"
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr "Рецепт %s из %s"
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr "Вариант %d of %d"
+
+#: register.lua
+msgid "No recipes"
+msgstr "Рецептов нет"
+
+#: register.lua
+msgid "No usages"
+msgstr "Не используется"
+
+#: register.lua
+msgid "Result"
+msgstr "Результат"
+
+#: register.lua
+msgid "Ingredient"
+msgstr "Состав"
+
+#: register.lua
+msgid "Show next recipe"
+msgstr "Следующий рецепт"
+
+#: register.lua
+msgid "Show next usage"
+msgstr "Следующее использование"
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr "Прошлый рецепт"
+
+#: register.lua
+msgid "Show previous usage"
+msgstr "Прошлая страница"
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr ""
+
+#: register.lua
+msgid "Give me:"
+msgstr "Дай мне:"
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+"Этот рецепт не\n"
+"помещается в решетку."
+
+#: register.lua
+msgid "To craft grid:"
+msgstr "На решeтку крафта:"
+
+#: register.lua
+msgid "All"
+msgstr "Все"
+
+#: waypoints.lua
+msgid "White"
+msgstr "Белый"
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr "Желтый"
+
+#: waypoints.lua
+msgid "Red"
+msgstr "Красный"
+
+#: waypoints.lua
+msgid "Green"
+msgstr "Зелёный"
+
+#: waypoints.lua
+msgid "Blue"
+msgstr "Синий"
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr "Путевые точки"
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr "Выбрать путевую точку №%d"
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr "Путевая точка %d"
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr "Установить путевую точку по текущей позиции"
+
+#: waypoints.lua
+msgid "invisible"
+msgstr "невидимой"
+
+#: waypoints.lua
+msgid "visible"
+msgstr "видимой"
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr "Сделать путевую точку @1"
+
+#: waypoints.lua
+msgid "Disable"
+msgstr "Выключить"
+
+#: waypoints.lua
+msgid "Enable"
+msgstr "Включить"
+
+#: waypoints.lua
+msgid "@1 display of waypoint coordinates"
+msgstr "@1 показ координат путевых точек"
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr "Поменять цвет путевой точки"
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr "Переименовать путевую точку"
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr "Путевая точка включена"
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr "Путевая точка выключена"
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr "Закончить редакцию"
+
+#: waypoints.lua
+msgid "World position"
+msgstr "Позиция мира"
+
+#: waypoints.lua
+msgid "Name"
+msgstr "Имя"
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr "Цвет текста HUDа"
diff --git a/unified_inventory/locale/ru.txt b/unified_inventory/locale/ru.txt
deleted file mode 100644
index a7bbe54..0000000
--- a/unified_inventory/locale/ru.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-# Translation by eternal_sorrow
-
-# Template
-### bags.lua ###
-Bags = Сумки
-Bag @1 = Сумка @1
-Small Bag = Малая сумка
-Medium Bag = Средняя сумка
-Large Bag = Большая сумка
-
-### inernal.lua ###
-First page = Первая страница
-Back three pages = Назад на три страницы
-Back one page = Назад на одну страницу
-Forward one page = Вперед на одну страницу
-Forward three pages = Вперед на три страницы
-Last page = Последняя страница
-No matching items = Совпадений нет
-Page = Страница
-%s of %s = %s из %s
-Filter = Фильтр
-Search = Поиск
-
-### register.lua ###
-Can use the creative inventory = Можно использовать инвентарь творческого режима
-Home position set to: %s = Дом теперь расположен по коодинатам: %s
-Time of day set to 6am = Установлено время 6 утра
-You don't have the settime priviledge! = Вам не разрешено устанавливать время!
-Time of day set to 9pm = Установлено время 9 вечера
-This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = Эта кнопка отключена вне творческого режима, чтобы предотвратить случайное уничтожение предметов.\nИспользуйте слот корзины вместо нее.
-Inventory cleared! = Инвентарь очищен!
-Crafting = Крафт
-Trash: = Корзина:
-Refill: = Размножить:
-Crafting Guide = Книга рецептов
-Method: = Способ:
-Result: %s = Результат: %s
-crafting = крафт
-shapeless crafting = бесформенный крафт
-cooking = жарка
-alloy cooking = приготовление сплавов
-Copy to craft grid: = В решетку крафта:
-All = Все
-Recipe %s of %s = Рецепт %s из %s
-Alternate = Следующий
-Crafting Grid = Решетка крафта
-Go home = Отправиться домой
-Set time to day = День
-Set time to night = Ночь
-Clear inventory = Очистить инвентарь
-
-### waypoints.lua ###
-White = Белый
-Yellow = Желтый
-Red = Красный
-Green = Зелёный
-Blue = Синий
-Waypoints = Путевые точки
-Waypoint active = Путевая точка активна
-Waypoint inactive = Путевая точка неактивна
-World position = Позиция
-Name = Имя
-HUD text color = Цвет текста
-Edit waypoint name = Редактировать имя путевой точки
-Rename waypoint = Переименовать путевую точку
-Change color of waypoint display = Изменить цвет путевой точки
-Set waypoint to current location = Установить путевую точку в текущем местоположении
-Make waypoint visible = Сделать путевую точку видимой
-Make waypoint invisible = Сделать путевую точку невидимой
-Disable display of waypoint coordinates = Отключить отображение координат путевой точки
-Enable display of waypoint coordinates = Включить отображение координат путевой точки
-Finish editing = Завершить редактирование
-Select Waypoint #%d = Выбрать путевую точку №%d
diff --git a/unified_inventory/locale/template.pot b/unified_inventory/locale/template.pot
new file mode 100644
index 0000000..105fd64
--- /dev/null
+++ b/unified_inventory/locale/template.pot
@@ -0,0 +1,358 @@
+# LANGUAGE translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 03:34+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: api.lua register.lua
+msgid "Crafting"
+msgstr ""
+
+#: api.lua
+msgid "Mixing"
+msgstr ""
+
+#: api.lua
+msgid "Cooking"
+msgstr ""
+
+#: api.lua
+msgid "Digging"
+msgstr ""
+
+#: bags.lua
+msgid "Bags"
+msgstr ""
+
+#: bags.lua
+msgid "Bag @1"
+msgstr ""
+
+#: bags.lua
+msgid "Small Bag"
+msgstr ""
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr ""
+
+#: bags.lua
+msgid "Large Bag"
+msgstr ""
+
+#: group.lua
+msgid " and "
+msgstr ""
+
+#: internal.lua
+msgid "First page"
+msgstr ""
+
+#: internal.lua
+msgid "Back three pages"
+msgstr ""
+
+#: internal.lua
+msgid "Back one page"
+msgstr ""
+
+#: internal.lua
+msgid "Forward one page"
+msgstr ""
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr ""
+
+#: internal.lua
+msgid "Last page"
+msgstr ""
+
+#: internal.lua
+msgid "Search"
+msgstr ""
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr ""
+
+#: internal.lua
+msgid "No matching items"
+msgstr ""
+
+#: internal.lua
+msgid "No matches."
+msgstr ""
+
+#: internal.lua
+msgid "Page"
+msgstr ""
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr ""
+
+#: internal.lua
+msgid "Filter"
+msgstr ""
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr ""
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr ""
+
+#: register.lua
+msgid "Set home position"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr ""
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr ""
+
+#: register.lua
+msgid "Go home"
+msgstr ""
+
+#: register.lua
+msgid "Set time to day"
+msgstr ""
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr ""
+
+#: register.lua
+msgid "You don't have the settime privilege!"
+msgstr ""
+
+#: register.lua
+msgid "Set time to night"
+msgstr ""
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr ""
+
+#: register.lua
+msgid "Clear inventory"
+msgstr ""
+
+#: register.lua
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr ""
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr ""
+
+#: register.lua
+msgid "Trash:"
+msgstr ""
+
+#: register.lua
+msgid "Refill:"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr ""
+
+#: register.lua
+msgid "No recipes"
+msgstr ""
+
+#: register.lua
+msgid "No usages"
+msgstr ""
+
+#: register.lua
+msgid "Result"
+msgstr ""
+
+#: register.lua
+msgid "Ingredient"
+msgstr ""
+
+#: register.lua
+msgid "Show next recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show next usage"
+msgstr ""
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show previous usage"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr ""
+
+#: register.lua
+msgid "Give me:"
+msgstr ""
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+
+#: register.lua
+msgid "To craft grid:"
+msgstr ""
+
+#: register.lua
+msgid "All"
+msgstr ""
+
+#: waypoints.lua
+msgid "White"
+msgstr ""
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr ""
+
+#: waypoints.lua
+msgid "Red"
+msgstr ""
+
+#: waypoints.lua
+msgid "Green"
+msgstr ""
+
+#: waypoints.lua
+msgid "Blue"
+msgstr ""
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr ""
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr ""
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr ""
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr ""
+
+#: waypoints.lua
+msgid "invisible"
+msgstr ""
+
+#: waypoints.lua
+msgid "visible"
+msgstr ""
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr ""
+
+#: waypoints.lua
+msgid "Disable"
+msgstr ""
+
+#: waypoints.lua
+msgid "Enable"
+msgstr ""
+
+#: waypoints.lua
+msgid "@1 display of waypoint coordinates"
+msgstr ""
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr ""
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr ""
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr ""
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr ""
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr ""
+
+#: waypoints.lua
+msgid "World position"
+msgstr ""
+
+#: waypoints.lua
+msgid "Name"
+msgstr ""
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr ""
diff --git a/unified_inventory/locale/template.txt b/unified_inventory/locale/template.txt
deleted file mode 100644
index 0ea805b..0000000
--- a/unified_inventory/locale/template.txt
+++ /dev/null
@@ -1,104 +0,0 @@
-# Translation by
-
-### api.lua ###
-Digging (by chance) =
-
-# Template
-### bags.lua ###
-Bags =
-Bag @1 =
-Small Bag =
-Medium Bag =
-Large Bag =
-
-### inernal.lua ###
-First page =
-Back three pages =
-Back one page =
-Forward one page =
-Forward three pages =
-Last page =
-No matching items =
-Page =
-%s of %s =
-Filter =
-Search =
-Reset search and display everything =
-
-### register.lua ###
-Can use the creative inventory =
-Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally =
-Home position set to: %s =
-Time of day set to 6am =
-You don't have the settime priviledge! =
-Time of day set to 9pm =
-This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. =
-Inventory cleared! =
-Crafting =
-Digging =
-Cooking =
-Mixing =
-Trash: =
-Refill: =
-Crafting Guide =
-Method: =
-Result: %s =
-crafting =
-shapeless crafting =
-cooking =
-alloy cooking =
-Copy to craft grid: =
-All =
-Alternate =
-Crafting Grid =
-Show next recipe =
-Show next usage =
-Show previous recipe =
-Show previous usage =
-# Shown for huge crafting recipes; try to keep the line length short and use multiple line breaks as needed
-This recipe is too\nlarge to be displayed. =
-# %s = group name (e.g. wool)
-Any item belonging to the %s group =
-# %s = List of “and”-concatenated group names
-Any item belonging to the groups %s =
-Recipe %d of %d =
-Usage %d of %d =
-No recipes =
-No usages =
-Result =
-Ingredient =
-Set time to day =
-Set time to night =
-Set home position =
-Go home =
-Clear inventory =
-Give me: =
-To craft grid: =
-
-### group.lua ###
-# Logical connective, example: “Any item belonging to the groups foo and bar”
-\sand\s =
-
-### waypoints.lua ###
-White =
-Yellow =
-Red =
-Green =
-Blue =
-Waypoints =
-Waypoint %d =
-Waypoint active =
-Waypoint inactive =
-World position =
-Name =
-HUD text color =
-Edit waypoint name =
-Rename waypoint =
-Change color of waypoint display =
-Set waypoint to current location =
-Make waypoint visible =
-Make waypoint invisible =
-Disable display of waypoint coordinates =
-Enable display of waypoint coordinates =
-Finish editing =
-Select Waypoint #%d =
diff --git a/unified_inventory/locale/tr.po b/unified_inventory/locale/tr.po
new file mode 100644
index 0000000..2b6211f
--- /dev/null
+++ b/unified_inventory/locale/tr.po
@@ -0,0 +1,360 @@
+# Turkish translation for the unified_inventory mod.
+# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel)
+# This file is distributed under the same license as the unified_inventory package.
+# Mahmutelmas06@hotmail.com
+# CodeXP <codexp@gmx.net>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: unified_inventory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-04-02 13:41+0200\n"
+"PO-Revision-Date: \n"
+"Last-Translator: CodeXP <codexp@gmx.net>\n"
+"Language-Team: \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: api.lua register.lua
+msgid "Crafting"
+msgstr "Üretim"
+
+#: api.lua
+msgid "Mixing"
+msgstr "Karıştırma"
+
+#: api.lua
+msgid "Cooking"
+msgstr "Pişirme"
+
+#: api.lua
+msgid "Digging"
+msgstr "Kazma"
+
+#: bags.lua
+msgid "Bags"
+msgstr "Çantalarım"
+
+#: bags.lua
+msgid "Bag @1"
+msgstr "@1. Çanta"
+
+#: bags.lua
+msgid "Small Bag"
+msgstr "Küçük Çanta"
+
+#: bags.lua
+msgid "Medium Bag"
+msgstr "Çanta"
+
+#: bags.lua
+msgid "Large Bag"
+msgstr "Büyük Çanta"
+
+#: group.lua
+msgid " and "
+msgstr " ve "
+
+#: internal.lua
+msgid "First page"
+msgstr "İlk Sayfa"
+
+#: internal.lua
+msgid "Back three pages"
+msgstr "3 Sayfa Gerile"
+
+#: internal.lua
+msgid "Back one page"
+msgstr "Geri"
+
+#: internal.lua
+msgid "Forward one page"
+msgstr "İleri"
+
+#: internal.lua
+msgid "Forward three pages"
+msgstr "3 Sayfa İlerile"
+
+#: internal.lua
+msgid "Last page"
+msgstr "Son Sayfa"
+
+#: internal.lua
+msgid "Search"
+msgstr "Ara"
+
+#: internal.lua
+msgid "Reset search and display everything"
+msgstr ""
+
+#: internal.lua
+msgid "No matching items"
+msgstr "Eşleşme yok"
+
+#: internal.lua
+msgid "No matches."
+msgstr "Eşleşme yok"
+
+#: internal.lua
+msgid "Page"
+msgstr "Sayfa"
+
+#: internal.lua
+#, lua-format
+msgid "%s of %s"
+msgstr "%s dan %s"
+
+#: internal.lua
+msgid "Filter"
+msgstr "Süzgeç"
+
+#: register.lua
+msgid "Can use the creative inventory"
+msgstr "Yaratıcı envanteri kullanabilir"
+
+#: register.lua
+msgid ""
+"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
+"configured globally"
+msgstr ""
+
+#: register.lua
+msgid "Crafting Grid"
+msgstr "Üretim tablosu"
+
+#: register.lua
+msgid "Crafting Guide"
+msgstr "Kılavuz"
+
+#: register.lua
+msgid "Set home position"
+msgstr "Set ev pozisyon"
+
+#: register.lua
+#, lua-format
+msgid "Home position set to: %s"
+msgstr "Yeni eviniz: %s"
+
+#: register.lua
+msgid "You don't have the \"home\" privilege!"
+msgstr "\"home\" yetkiniz yok!"
+
+#: register.lua
+msgid "Go home"
+msgstr "Eve git"
+
+#: register.lua
+msgid "Set time to day"
+msgstr "Güne zaman ayarla"
+
+#: register.lua
+msgid "Time of day set to 6am"
+msgstr "Saat 06:00 olarak ayarlandı"
+
+#: register.lua
+msgid "You don't have the settime privilege!"
+msgstr "\"settime\" yetkiniz yok!"
+
+#: register.lua
+msgid "Set time to night"
+msgstr "Geceye zaman ayarla"
+
+#: register.lua
+msgid "Time of day set to 9pm"
+msgstr "Saat 19:00 olarak ayarlandı"
+
+#: register.lua
+msgid "Clear inventory"
+msgstr ""
+
+#: register.lua
+msgid ""
+"This button has been disabled outside of creative mode to prevent accidental "
+"inventory trashing.\n"
+"Use the trash slot instead."
+msgstr "Yaratıcı modu dışında iken bu tuş kullanılamaz."
+
+#: register.lua
+msgid "Inventory cleared!"
+msgstr "Envanter temizlendi!"
+
+#: register.lua
+msgid "Trash:"
+msgstr "Çöp"
+
+#: register.lua
+msgid "Refill:"
+msgstr "Doldur"
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the %s group"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Any item belonging to the groups %s"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "Recipe %d of %d"
+msgstr "%d dan %d tarifi"
+
+#: register.lua
+#, lua-format
+msgid "Usage %d of %d"
+msgstr "Kullanım %d/%d"
+
+#: register.lua
+msgid "No recipes"
+msgstr "Tarifi yok"
+
+#: register.lua
+msgid "No usages"
+msgstr "Kullanım yok"
+
+#: register.lua
+msgid "Result"
+msgstr "Çıktı"
+
+#: register.lua
+msgid "Ingredient"
+msgstr "Bileşen"
+
+#: register.lua
+msgid "Show next recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show next usage"
+msgstr ""
+
+#: register.lua
+msgid "Show previous recipe"
+msgstr ""
+
+#: register.lua
+msgid "Show previous usage"
+msgstr ""
+
+#: register.lua
+#, lua-format
+msgid "%s (%s)"
+msgstr ""
+
+#: register.lua
+msgid "Give me:"
+msgstr "Ver bana:"
+
+#: register.lua
+msgid ""
+"This recipe is too\n"
+"large to be displayed."
+msgstr ""
+
+#: register.lua
+#, fuzzy
+msgid "To craft grid:"
+msgstr "Üretim tablosuna kopyala"
+
+#: register.lua
+msgid "All"
+msgstr "Tümü"
+
+#: waypoints.lua
+msgid "White"
+msgstr "Beyaz"
+
+#: waypoints.lua
+msgid "Yellow"
+msgstr "Sarı"
+
+#: waypoints.lua
+msgid "Red"
+msgstr "Kırmızı"
+
+#: waypoints.lua
+msgid "Green"
+msgstr "Yeşil"
+
+#: waypoints.lua
+msgid "Blue"
+msgstr "Mavi"
+
+#: waypoints.lua
+msgid "Waypoints"
+msgstr "Konum Noktaları"
+
+#: waypoints.lua
+#, lua-format
+msgid "Select Waypoint #%d"
+msgstr "#%d konum noktası seç"
+
+#: waypoints.lua
+#, lua-format
+msgid "Waypoint %d"
+msgstr "%d Konum Noktaları"
+
+#: waypoints.lua
+msgid "Set waypoint to current location"
+msgstr "Bulunduğun noktayı işaretle"
+
+#: waypoints.lua
+msgid "invisible"
+msgstr "görünmez"
+
+#: waypoints.lua
+msgid "visible"
+msgstr "görünür"
+
+#: waypoints.lua
+msgid "Make waypoint @1"
+msgstr "Yol noktası @1"
+
+#: waypoints.lua
+msgid "Disable"
+msgstr ""
+
+#: waypoints.lua
+msgid "Enable"
+msgstr ""
+
+#: waypoints.lua
+msgid "@1 display of waypoint coordinates"
+msgstr "Yol noktası koordinatlarının görüntülenmesini @1"
+
+#: waypoints.lua
+msgid "Change color of waypoint display"
+msgstr "Konum Gösterge Rengi"
+
+#: waypoints.lua
+msgid "Edit waypoint name"
+msgstr "Konum Noktasını Düzenle"
+
+#: waypoints.lua
+msgid "Waypoint active"
+msgstr "Konum Etkin"
+
+#: waypoints.lua
+msgid "Waypoint inactive"
+msgstr "Konum Devredışı"
+
+#: waypoints.lua
+msgid "Finish editing"
+msgstr "Düzenleme bitti"
+
+#: waypoints.lua
+msgid "World position"
+msgstr "Dünya konumu"
+
+#: waypoints.lua
+msgid "Name"
+msgstr "İsim"
+
+#: waypoints.lua
+msgid "HUD text color"
+msgstr "Metin rengi"
diff --git a/unified_inventory/locale/tr.txt b/unified_inventory/locale/tr.txt
deleted file mode 100644
index e171fd6..0000000
--- a/unified_inventory/locale/tr.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-# Translation by Mahmutelmas06@hotmail.com
-
-# Template
-### bags.lua ###
-Bags = Çantalarım
-Bag @1 = @1. Çanta
-Small Bag = Küçük Çanta
-Medium Bag = Çanta
-Large Bag = Büyük Çanta
-
-### inernal.lua ###
-First page = İlk Sayfa
-Back three pages = 3 Sayfa Gerile
-Back one page = Geri
-Forward one page = İleri
-Forward three pages = 3 Sayfa İlerile
-Last page = Son Sayfa
-No matching items = Eşleşme yok
-Page = Sayfa
-%s of %s = %s dan %s
-Filter = Süzgeç
-Search = Ara
-
-### register.lua ###
-Can use the creative inventory = Yaratıcı envanteri kullanabilir
-Home position set to: %s = Yeni eviniz: %s
-Time of day set to 6am = Saat 06:00 olarak ayarlandı
-You don't have the settime priviledge = Saati düzenleme yetkiniz yok!
-Time of day set to 9pm = Saat 19:00 olarak ayarlandı
-This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = Yaratıcı modu dışında iken bu tuş kullanılamaz.
-Inventory cleared! = Envanter temizlendi!
-Crafting = Üretim
-Trash: = Çöp
-Refill: = Doldur
-Crafting Guide = Kılavuz
-Method: = Yöntem
-Result: %s = Çıktı: %s
-crafting = üretim
-shapeless crafting = şekilsiz üretim
-cooking = pişirme
-alloy cooking = karıştırma
-Copy to craft grid: = Üretim tablosuna kopyala
-All = Tümü
-Recipe %s of %s = %s dan %s tarifi
-Alternate = Altarnatif
-Crafting Grid = Üretim tablosu
-
-### waypoints.lua ###
-White = Beyaz
-Yellow = Sarı
-Red = Kırmızı
-Green = Yeşil
-Blue = Mavi
-Waypoints = Konum Noktaları
-Waypoint active = Konum Etkin
-Waypoint inactive = Konum Devredışı
-World position = Dünya konumu
-Name = İsim
-HUD text color = Metin rengi
-Edit waypoint name = Konum Noktasını Düzenle
-Rename waypoint = Konum Noktasını Adlandır
-Change color of waypoint display = Konum Gösterge Rengi
-Set waypoint to current location = Bulunduğun noktayı işaretle
-Make waypoint visible = Konumlar görünür
-Make waypoint invisible = Konumlar gözükmez
-Disable display of waypoint coordinates = Koordinatları gizle
-Enable display of waypoint coordinates = Koordinatları göster
-Finish editing = Düzenleme bitti
-Select Waypoint #%d = #%d konum noktası seç
diff --git a/unified_inventory/register.lua b/unified_inventory/register.lua
index bd6a13b..dd2b3cc 100644
--- a/unified_inventory/register.lua
+++ b/unified_inventory/register.lua
@@ -1,5 +1,5 @@
local S = unified_inventory.gettext
-local F = unified_inventory.fgettext
+local F = minetest.formspec_escape
minetest.register_privilege("creative", {
description = S("Can use the creative inventory"),
@@ -171,20 +171,20 @@ unified_inventory.register_page("craft", {
local player_name = player:get_player_name()
local formspec = "background[2,"..formspecy..";6,3;ui_crafting_form.png]"
formspec = formspec.."background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]"
- formspec = formspec.."label[0,"..formheadery..";" ..F("Crafting").."]"
+ formspec = formspec.."label[0,"..formheadery..";" ..F(S("Crafting")).."]"
formspec = formspec.."listcolors[#00000000;#00000000]"
formspec = formspec.."list[current_player;craftpreview;6,"..formspecy..";1,1;]"
formspec = formspec.."list[current_player;craft;2,"..formspecy..";3,3;]"
if unified_inventory.trash_enabled or unified_inventory.is_creative(player_name) or minetest.get_player_privs(player_name).give then
- formspec = formspec.."label[7,"..(formspecy + 1.5)..";" .. F("Trash:") .. "]"
+ formspec = formspec.."label[7,"..(formspecy + 1.5)..";" .. F(S("Trash:")) .. "]"
formspec = formspec.."background[7,"..(formspecy + 2)..";1,1;ui_single_slot.png]"
formspec = formspec.."list[detached:trash;main;7,"..(formspecy + 2)..";1,1;]"
end
formspec = formspec.."listring[current_name;craft]"
formspec = formspec.."listring[current_player;main]"
if unified_inventory.is_creative(player_name) then
- formspec = formspec.."label[0,"..(formspecy + 1.5)..";" .. F("Refill:") .. "]"
- formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."refill;main;0,"..(formspecy +2)..";1,1;]"
+ formspec = formspec.."label[0,"..(formspecy + 1.5)..";" .. F(S("Refill:")) .. "]"
+ formspec = formspec.."list[detached:"..F(player_name).."refill;main;0,"..(formspecy +2)..";1,1;]"
end
return {formspec=formspec}
end,
@@ -211,10 +211,10 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
selectitem = group_item.sole and displayitem or name
end
local label = show_is_group and "G" or ""
- local buttonname = minetest.formspec_escape(buttonname_prefix..unified_inventory.mangle_for_formspec(selectitem))
+ local buttonname = F(buttonname_prefix..unified_inventory.mangle_for_formspec(selectitem))
local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",
x, y, w, h,
- minetest.formspec_escape(displayitem), buttonname, label)
+ F(displayitem), buttonname, label)
if show_is_group then
local groupstring, andcount = unified_inventory.extract_groupnames(name)
local grouptip
@@ -223,7 +223,7 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
elseif andcount > 1 then
grouptip = string.format(S("Any item belonging to the groups %s"), groupstring)
end
- grouptip = minetest.formspec_escape(grouptip)
+ grouptip = F(grouptip)
if andcount >= 1 then
button = button .. string.format("tooltip[%s;%s]", buttonname, grouptip)
end
@@ -232,24 +232,24 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
end
local recipe_text = {
- recipe = "Recipe %d of %d",
- usage = "Usage %d of %d",
+ recipe = S("Recipe %d of %d"),
+ usage = S("Usage %d of %d"),
}
local no_recipe_text = {
- recipe = "No recipes",
- usage = "No usages",
+ recipe = S("No recipes"),
+ usage = S("No usages"),
}
local role_text = {
- recipe = "Result",
- usage = "Ingredient",
+ recipe = S("Result"),
+ usage = S("Ingredient"),
}
local next_alt_text = {
- recipe = "Show next recipe",
- usage = "Show next usage",
+ recipe = S("Show next recipe"),
+ usage = S("Show next usage"),
}
local prev_alt_text = {
- recipe = "Show previous recipe",
- usage = "Show previous usage",
+ recipe = S("Show previous recipe"),
+ usage = S("Show previous usage"),
}
local other_dir = {
recipe = "usage",
@@ -268,7 +268,7 @@ unified_inventory.register_page("craftguide", {
local player_privs = minetest.get_player_privs(player_name)
local formspec = ""
formspec = formspec.."background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]"
- formspec = formspec.."label[0,"..formheadery..";" .. F("Crafting Guide") .. "]"
+ formspec = formspec.."label[0,"..formheadery..";" .. F(S("Crafting Guide")) .. "]"
formspec = formspec.."listcolors[#00000000;#00000000]"
local item_name = unified_inventory.current_item[player_name]
if not item_name then return {formspec=formspec} end
@@ -290,23 +290,25 @@ unified_inventory.register_page("craftguide", {
alternates = #crafts
craft = crafts[alternate]
end
+ local has_creative = player_privs.give or player_privs.creative or
+ minetest.settings:get_bool("creative_mode")
formspec = formspec.."background[0.5,"..(formspecy + 0.2)..";8,3;ui_craftguide_form.png]"
formspec = formspec.."textarea["..craftresultx..","..craftresulty
- ..";10,1;;"..minetest.formspec_escape(F(role_text[dir])..": "..item_name_shown)..";]"
+ ..";10,1;;"..F(role_text[dir])..": "..item_name_shown..";]"
formspec = formspec..stack_image_button(0, formspecy, 1.1, 1.1, "item_button_"
.. rdir .. "_", ItemStack(item_name))
if not craft then
formspec = formspec.."label[5.5,"..(formspecy + 2.35)..";"
- ..minetest.formspec_escape(F(no_recipe_text[dir])).."]"
+ ..F(no_recipe_text[dir]).."]"
local no_pos = dir == "recipe" and 4.5 or 6.5
local item_pos = dir == "recipe" and 6.5 or 4.5
formspec = formspec.."image["..no_pos..","..formspecy..";1.1,1.1;ui_no.png]"
formspec = formspec..stack_image_button(item_pos, formspecy, 1.1, 1.1, "item_button_"
..other_dir[dir].."_", ItemStack(item_name))
- if player_privs.give == true or player_privs.creative == true or minetest.setting_getbool("creative_mode") == true then
- formspec = formspec.."label[0,"..(formspecy + 2.10)..";" .. F("Give me:") .. "]"
+ if has_creative then
+ formspec = formspec.."label[0,"..(formspecy + 2.10)..";" .. F(S("Give me:")) .. "]"
.."button[0, "..(formspecy + 2.7)..";0.6,0.5;craftguide_giveme_1;1]"
.."button[0.6,"..(formspecy + 2.7)..";0.7,0.5;craftguide_giveme_10;10]"
.."button[1.3,"..(formspecy + 2.7)..";0.8,0.5;craftguide_giveme_99;99]"
@@ -319,7 +321,7 @@ unified_inventory.register_page("craftguide", {
if craft_type.icon then
formspec = formspec..string.format(" image[%f,%f;%f,%f;%s]",5.7,(formspecy + 0.05),0.5,0.5,craft_type.icon)
end
- formspec = formspec.."label[5.5,"..(formspecy + 1)..";" .. minetest.formspec_escape(craft_type.description).."]"
+ formspec = formspec.."label[5.5,"..(formspecy + 1)..";" .. F(craft_type.description).."]"
formspec = formspec..stack_image_button(6.5, formspecy, 1.1, 1.1, "item_button_usage_", ItemStack(craft.output))
local display_size = craft_type.dynamic_display_size and craft_type.dynamic_display_size(craft) or { width = craft_type.width, height = craft_type.height }
local craft_width = craft_type.get_shaped_craft_width and craft_type.get_shaped_craft_width(craft) or display_size.width
@@ -373,17 +375,17 @@ unified_inventory.register_page("craftguide", {
-- Error
formspec = formspec.."label["
..tostring(2)..","..tostring(formspecy)
- ..";"..minetest.formspec_escape(S("This recipe is too\nlarge to be displayed.")).."]"
+ ..";"..F(S("This recipe is too\nlarge to be displayed.")).."]"
end
if craft_type.uses_crafting_grid and display_size.width <= 3 then
- formspec = formspec.."label[0,"..(formspecy + 0.9)..";" .. F("To craft grid:") .. "]"
+ formspec = formspec.."label[0,"..(formspecy + 0.9)..";" .. F(S("To craft grid:")) .. "]"
.."button[0, "..(formspecy + 1.5)..";0.6,0.5;craftguide_craft_1;1]"
.."button[0.6,"..(formspecy + 1.5)..";0.7,0.5;craftguide_craft_10;10]"
- .."button[1.3,"..(formspecy + 1.5)..";0.8,0.5;craftguide_craft_max;" .. F("All") .. "]"
+ .."button[1.3,"..(formspecy + 1.5)..";0.8,0.5;craftguide_craft_max;" .. F(S("All")) .. "]"
end
- if player_privs.give == true or player_privs.creative == true or minetest.setting_getbool("creative_mode") == true then
- formspec = formspec.."label[0,"..(formspecy + 2.1)..";" .. F("Give me:") .. "]"
+ if has_creative then
+ formspec = formspec.."label[0,"..(formspecy + 2.1)..";" .. F(S("Give me:")) .. "]"
.."button[0, "..(formspecy + 2.7)..";0.6,0.5;craftguide_giveme_1;1]"
.."button[0.6,"..(formspecy + 2.7)..";0.7,0.5;craftguide_giveme_10;10]"
.."button[1.3,"..(formspecy + 2.7)..";0.8,0.5;craftguide_giveme_99;99]"
diff --git a/unified_inventory/waypoints.lua b/unified_inventory/waypoints.lua
index 3ab7eb7..3f9ee58 100644
--- a/unified_inventory/waypoints.lua
+++ b/unified_inventory/waypoints.lua
@@ -1,5 +1,5 @@
local S = unified_inventory.gettext
-local F = unified_inventory.fgettext
+local F = minetest.formspec_escape
local hud_colors = {
{"#FFFFFF", 0xFFFFFF, S("White")},
@@ -25,7 +25,7 @@ unified_inventory.register_page("waypoints", {
local waypoints = datastorage.get(player_name, "waypoints")
local formspec = "background[0,4.5;8,4;ui_main_inventory.png]" ..
"image[0,0;1,1;ui_waypoints_icon.png]" ..
- "label[1,0;" .. F("Waypoints") .. "]"
+ "label[1,0;" .. F(S("Waypoints")) .. "]"
-- Tabs buttons:
for i = 1, 5, 1 do
@@ -49,43 +49,43 @@ unified_inventory.register_page("waypoints", {
"ui_waypoint_set_icon.png;"..
"set_waypoint"..i..";]"..
"tooltip[set_waypoint" .. i .. ";"
- .. F("Set waypoint to current location").."]"
+ .. F(S("Set waypoint to current location")).."]"
formspec = formspec ..
"image_button[5.2,3.7;.8,.8;"..
(waypoint.active and "ui_on_icon.png" or "ui_off_icon.png")..";"..
"toggle_waypoint"..i..";]"..
"tooltip[toggle_waypoint" .. i .. ";"
- .. F("Make waypoint "
- ..(waypoint.active and "invisible" or "visible")).."]"
+ .. F(S("Make waypoint @1",
+ waypoint.active and S("invisible") or S("visible"))).."]"
formspec = formspec ..
"image_button[5.9,3.7;.8,.8;"..
(waypoint.display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png").."^ui_xyz_icon.png;"..
"toggle_display_pos" .. i .. ";]"..
"tooltip[toggle_display_pos" .. i .. ";"
- .. F((waypoint.display_pos and "Disable" or "Enable")
- .." display of waypoint coordinates").."]"
+ .. F(S("@1 display of waypoint coordinates",
+ waypoint.display_pos and S("Disable") or S("Enable"))) .."]"
formspec = formspec ..
"image_button[6.6,3.7;.8,.8;"..
"ui_circular_arrows_icon.png;"..
"toggle_color"..i..";]"..
"tooltip[toggle_color" .. i .. ";"
- .. F("Change color of waypoint display").."]"
+ .. F(S("Change color of waypoint display")).."]"
formspec = formspec ..
"image_button[7.3,3.7;.8,.8;"..
"ui_pencil_icon.png;"..
"rename_waypoint"..i..";]"..
"tooltip[rename_waypoint" .. i .. ";"
- .. F("Edit waypoint name").."]"
+ .. F(S("Edit waypoint name")).."]"
-- Waypoint's info:
if waypoint.active then
- formspec = formspec .. "label[1,0.8;"..F("Waypoint active").."]"
+ formspec = formspec .. "label[1,0.8;"..F(S("Waypoint active")).."]"
else
- formspec = formspec .. "label[1,0.8;"..F("Waypoint inactive").."]"
+ formspec = formspec .. "label[1,0.8;"..F(S("Waypoint inactive")).."]"
end
if temp.edit then
@@ -96,13 +96,13 @@ unified_inventory.register_page("waypoints", {
"ui_ok_icon.png;"..
"confirm_rename"..i.. ";]"..
"tooltip[confirm_rename" .. i .. ";"
- .. F("Finish editing").."]"
+ .. F(S("Finish editing")).."]"
end
- formspec = formspec .. "label[1,1.3;"..F("World position")..": " ..
+ formspec = formspec .. "label[1,1.3;"..F(S("World position"))..": " ..
minetest.pos_to_string(waypoint.world_pos or vector.new()) .. "]" ..
- "label[1,1.8;"..F("Name")..": ".. (waypoint.name or default_name) .. "]" ..
- "label[1,2.3;"..F("HUD text color")..": " ..
+ "label[1,1.8;"..F(S("Name"))..": ".. (waypoint.name or default_name) .. "]" ..
+ "label[1,2.3;"..F(S("HUD text color"))..": " ..
hud_colors[waypoint.color or 1][3] .. "]"
return {formspec=formspec}
diff --git a/unifieddyes/init.lua b/unifieddyes/init.lua
index 51cc671..2cf465b 100644
--- a/unifieddyes/init.lua
+++ b/unifieddyes/init.lua
@@ -564,7 +564,7 @@ function unifieddyes.on_use(itemstack, player, pointed_thing)
local stackname = itemstack:get_name()
local playername = player:get_player_name()
- if pointed_thing and pointed_thing.type == "node" then
+ if pointed_thing and pointed_thing.type == "node" and unifieddyes.select_node(pointed_thing) then
if minetest.is_protected(unifieddyes.select_node(pointed_thing), playername)
and not minetest.check_player_privs(playername, "protection_bypass") then
minetest.chat_send_player(playername, "Sorry, someone else owns that spot.")
diff --git a/xban2/init.lua b/xban2/init.lua
index dad13af..6f15f14 100644
--- a/xban2/init.lua
+++ b/xban2/init.lua
@@ -9,9 +9,9 @@ local tempbans = { }
local DEF_SAVE_INTERVAL = 300 -- 5 minutes
local DEF_DB_FILENAME = minetest.get_worldpath().."/xban.db"
-local DB_FILENAME = minetest.setting_get("xban.db_filename")
+local DB_FILENAME = minetest.settings:get("xban.db_filename")
local SAVE_INTERVAL = tonumber(
- minetest.setting_get("xban.db_save_interval")) or DEF_SAVE_INTERVAL
+ minetest.settings:get("xban.db_save_interval")) or DEF_SAVE_INTERVAL
if (not DB_FILENAME) or (DB_FILENAME == "") then
DB_FILENAME = DEF_DB_FILENAME