From 709c185915feae2e56d6d406173273b9296a5186 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 24 Jul 2021 12:22:10 +0200 Subject: [PATCH] update --- mods/3d_armor/3d_armor/api.lua | 10 +- mods/3d_armor/3d_armor/init.lua | 2 +- .../worldedit_gui/functionality.lua | 30 ++ mods/advtrains/advtrains/couple.lua | 452 ++++++++++++----- mods/advtrains/advtrains/init.lua | 16 +- mods/advtrains/advtrains/path.lua | 39 ++ mods/advtrains/advtrains/settingtypes.txt | 5 + mods/advtrains/advtrains/trainlogic.lua | 428 +++++++---------- mods/advtrains/advtrains/wagons.lua | 64 --- mods/ambience/init.lua | 3 +- mods/ambience/soundsets.lua | 10 +- mods/bakedclay/README.md | 4 +- mods/bakedclay/init.lua | 165 +++++-- mods/bakedclay/license.txt | 4 + .../textures/baked_clay_terracotta_black.png | Bin 0 -> 328 bytes .../textures/baked_clay_terracotta_blue.png | Bin 0 -> 257 bytes .../textures/baked_clay_terracotta_brown.png | Bin 0 -> 718 bytes .../textures/baked_clay_terracotta_cyan.png | Bin 0 -> 661 bytes .../baked_clay_terracotta_dark_green.png | Bin 0 -> 714 bytes .../baked_clay_terracotta_dark_grey.png | Bin 0 -> 328 bytes .../textures/baked_clay_terracotta_green.png | Bin 0 -> 575 bytes .../textures/baked_clay_terracotta_grey.png | Bin 0 -> 659 bytes .../baked_clay_terracotta_light_blue.png | Bin 0 -> 589 bytes .../baked_clay_terracotta_magenta.png | Bin 0 -> 275 bytes .../textures/baked_clay_terracotta_orange.png | Bin 0 -> 606 bytes .../textures/baked_clay_terracotta_pink.png | Bin 0 -> 409 bytes .../textures/baked_clay_terracotta_red.png | Bin 0 -> 292 bytes .../textures/baked_clay_terracotta_violet.png | Bin 0 -> 619 bytes .../textures/baked_clay_terracotta_white.png | Bin 0 -> 512 bytes .../textures/baked_clay_terracotta_yellow.png | Bin 0 -> 676 bytes mods/bridger/.luacheckrc | 15 + mods/bridger/README.md | 7 + mods/bridger/alias.lua | 3 +- mods/bridger/crafts.lua | 135 +++--- mods/bridger/description.txt | 2 +- mods/bridger/nodes.lua | 454 ++++++++++-------- mods/builtin_item/init.lua | 5 +- mods/carts/cart_entity.lua | 3 +- mods/farming/crops/cocoa.lua | 6 +- mods/farming/crops/ryeoatrice.lua | 12 + mods/farming/food.lua | 28 ++ mods/farming/license.txt | 3 + mods/farming/locale/farming.de.tr | 6 +- mods/farming/locale/farming.zh_CN.tr | 4 +- mods/farming/locale/farming.zh_TW.tr | 4 +- mods/farming/lucky_block.lua | 2 + mods/farming/textures/farming_water_glass.png | Bin 0 -> 167 bytes mods/flowerpot/init.lua | 2 +- mods/mobs_redo/api.lua | 28 +- mods/mobs_redo/api.txt | 2 + mods/mobs_redo/crafts.lua | 10 +- mods/mobs_redo/depends.txt | 3 +- mods/mobs_redo/mod.conf | 4 +- mods/mobs_redo/readme.MD | 2 +- mods/mobs_redo/settingtypes.txt | 3 + mods/moreblocks/CHANGELOG.md | 5 +- mods/moreores/CHANGELOG.md | 5 +- mods/plantlife_modpack/bushes/init.lua | 4 +- .../plantlife_modpack/bushes_classic/init.lua | 2 +- mods/plantlife_modpack/cavestuff/mapgen.lua | 4 +- mods/plantlife_modpack/dryplants/juncus.lua | 4 +- .../dryplants/meadowvariation.lua | 2 +- .../plantlife_modpack/dryplants/moregrass.lua | 2 +- mods/plantlife_modpack/dryplants/reedmace.lua | 8 +- mods/plantlife_modpack/ferns/fern.lua | 8 +- .../plantlife_modpack/ferns/gianttreefern.lua | 4 +- mods/plantlife_modpack/ferns/horsetail.lua | 6 +- mods/plantlife_modpack/ferns/treefern.lua | 4 +- mods/plantlife_modpack/flowers_plus/init.lua | 35 +- mods/plantlife_modpack/molehills/init.lua | 2 +- mods/plantlife_modpack/poisonivy/init.lua | 6 +- mods/plantlife_modpack/trunks/generating.lua | 12 +- mods/plantlife_modpack/trunks/nodes.lua | 2 + mods/plantlife_modpack/vines/init.lua | 2 +- .../woodsoils/generating.lua | 4 +- mods/plantlife_modpack/youngtrees/init.lua | 2 +- mods/playerplus/init.lua | 8 +- mods/protector/admin.lua | 2 +- mods/protector/doors_chest.lua | 27 +- mods/protector/init.lua | 12 +- mods/protector/textures/license.txt | 4 + .../textures/protector_down_icon.png | Bin 0 -> 481 bytes mods/protector/textures/protector_up_icon.png | Bin 0 -> 478 bytes mods/signs_lib/api.lua | 2 +- mods/skinsdb/api.lua | 2 +- mods/skinsdb/meta/character_2076.txt | 3 + mods/skinsdb/meta/character_2077.txt | 3 + mods/skinsdb/meta/character_2078.txt | 3 + mods/skinsdb/meta/character_2079.txt | 3 + mods/skinsdb/meta/character_2080.txt | 3 + mods/skinsdb/meta/character_2081.txt | 3 + mods/skinsdb/meta/character_2082.txt | 3 + mods/skinsdb/meta/character_2083.txt | 3 + mods/skinsdb/meta/character_2084.txt | 3 + mods/skinsdb/meta/character_2085.txt | 3 + mods/skinsdb/meta/character_2086.txt | 3 + mods/skinsdb/meta/character_2087.txt | 3 + mods/skinsdb/meta/character_2088.txt | 3 + mods/skinsdb/meta/character_2089.txt | 3 + mods/skinsdb/meta/character_2090.txt | 3 + mods/skinsdb/meta/character_2091.txt | 3 + mods/skinsdb/textures/character_2076.png | Bin 0 -> 2082 bytes mods/skinsdb/textures/character_2077.png | Bin 0 -> 1765 bytes mods/skinsdb/textures/character_2078.png | Bin 0 -> 8325 bytes mods/skinsdb/textures/character_2079.png | Bin 0 -> 8325 bytes mods/skinsdb/textures/character_2080.png | Bin 0 -> 8325 bytes mods/skinsdb/textures/character_2081.png | Bin 0 -> 8325 bytes mods/skinsdb/textures/character_2082.png | Bin 0 -> 8325 bytes mods/skinsdb/textures/character_2083.png | Bin 0 -> 8325 bytes mods/skinsdb/textures/character_2084.png | Bin 0 -> 8325 bytes mods/skinsdb/textures/character_2085.png | Bin 0 -> 8325 bytes mods/skinsdb/textures/character_2086.png | Bin 0 -> 12701 bytes mods/skinsdb/textures/character_2087.png | Bin 0 -> 1780 bytes mods/skinsdb/textures/character_2088.png | Bin 0 -> 3380 bytes mods/skinsdb/textures/character_2089.png | Bin 0 -> 1911 bytes mods/skinsdb/textures/character_2090.png | Bin 0 -> 3089 bytes mods/skinsdb/textures/character_2091.png | Bin 0 -> 2283 bytes mods/stairs/stairs.lua | 19 + mods/stamina/init.lua | 12 +- mods/techpack/gravelsieve/init.lua | 4 + .../techpack_warehouse/box_copper.lua | 4 +- mods/techpack/techpack_warehouse/box_gold.lua | 4 +- .../techpack/techpack_warehouse/box_steel.lua | 4 +- mods/techpack/tubelib/distributor.lua | 4 +- mods/techpack/tubelib_addons1/grinder.lua | 95 +++- mods/techpack/tubelib_addons1/harvester.lua | 4 +- mods/techpack/tubelib_addons3/distributor.lua | 4 +- mods/unified_inventory/README.md | 7 +- mods/unified_inventory/category.lua | 11 +- mods/unified_inventory/init.lua | 7 +- mods/unified_inventory/internal.lua | 2 + ...ied_inventory.template.tr => template.txt} | 126 +++-- .../locale/unified_inventory.de.tr | 41 +- .../locale/unified_inventory.es.tr | 134 +++--- .../locale/unified_inventory.fr.tr | 47 +- .../locale/unified_inventory.it.tr | 41 +- .../locale/unified_inventory.ms.tr | 40 +- .../locale/unified_inventory.pl.tr | 47 +- .../locale/unified_inventory.pt.tr | 36 +- .../locale/unified_inventory.ru.tr | 40 +- .../locale/unified_inventory.tr.tr | 44 +- .../locale/unified_inventory.zh_CN.tr | 49 +- .../locale/unified_inventory.zh_TW.tr | 49 +- mods/unified_inventory/mod.conf | 4 +- mods/unified_inventory/waypoints.lua | 223 ++++++--- mods/xdecor/src/workbench.lua | 12 + 146 files changed, 2111 insertions(+), 1206 deletions(-) create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_black.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_blue.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_brown.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_cyan.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_dark_green.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_dark_grey.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_green.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_grey.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_light_blue.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_magenta.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_orange.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_pink.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_red.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_violet.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_white.png create mode 100644 mods/bakedclay/textures/baked_clay_terracotta_yellow.png create mode 100644 mods/bridger/.luacheckrc create mode 100644 mods/bridger/README.md create mode 100644 mods/farming/textures/farming_water_glass.png create mode 100644 mods/protector/textures/protector_down_icon.png create mode 100644 mods/protector/textures/protector_up_icon.png create mode 100644 mods/skinsdb/meta/character_2076.txt create mode 100644 mods/skinsdb/meta/character_2077.txt create mode 100644 mods/skinsdb/meta/character_2078.txt create mode 100644 mods/skinsdb/meta/character_2079.txt create mode 100644 mods/skinsdb/meta/character_2080.txt create mode 100644 mods/skinsdb/meta/character_2081.txt create mode 100644 mods/skinsdb/meta/character_2082.txt create mode 100644 mods/skinsdb/meta/character_2083.txt create mode 100644 mods/skinsdb/meta/character_2084.txt create mode 100644 mods/skinsdb/meta/character_2085.txt create mode 100644 mods/skinsdb/meta/character_2086.txt create mode 100644 mods/skinsdb/meta/character_2087.txt create mode 100644 mods/skinsdb/meta/character_2088.txt create mode 100644 mods/skinsdb/meta/character_2089.txt create mode 100644 mods/skinsdb/meta/character_2090.txt create mode 100644 mods/skinsdb/meta/character_2091.txt create mode 100644 mods/skinsdb/textures/character_2076.png create mode 100644 mods/skinsdb/textures/character_2077.png create mode 100644 mods/skinsdb/textures/character_2078.png create mode 100644 mods/skinsdb/textures/character_2079.png create mode 100644 mods/skinsdb/textures/character_2080.png create mode 100644 mods/skinsdb/textures/character_2081.png create mode 100644 mods/skinsdb/textures/character_2082.png create mode 100644 mods/skinsdb/textures/character_2083.png create mode 100644 mods/skinsdb/textures/character_2084.png create mode 100644 mods/skinsdb/textures/character_2085.png create mode 100644 mods/skinsdb/textures/character_2086.png create mode 100644 mods/skinsdb/textures/character_2087.png create mode 100644 mods/skinsdb/textures/character_2088.png create mode 100644 mods/skinsdb/textures/character_2089.png create mode 100644 mods/skinsdb/textures/character_2090.png create mode 100644 mods/skinsdb/textures/character_2091.png rename mods/unified_inventory/locale/{unified_inventory.template.tr => template.txt} (73%) diff --git a/mods/3d_armor/3d_armor/api.lua b/mods/3d_armor/3d_armor/api.lua index 2051c28f..3cbfa185 100644 --- a/mods/3d_armor/3d_armor/api.lua +++ b/mods/3d_armor/3d_armor/api.lua @@ -529,12 +529,14 @@ armor.remove_all = function(self, player) self:save_armor_inventory(player) end +local skin_mod + armor.get_player_skin = function(self, name) - if (self.skin_mod == "skins" or self.skin_mod == "simple_skins") and skins.skins[name] then + if (skin_mod == "skins" or skin_mod == "simple_skins") and skins.skins[name] then return skins.skins[name]..".png" - elseif self.skin_mod == "u_skins" and u_skins.u_skins[name] then + elseif skin_mod == "u_skins" and u_skins.u_skins[name] then return u_skins.u_skins[name]..".png" - elseif self.skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then + elseif skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then return wardrobe.playerSkins[name] end return armor.default_skin..".png" @@ -678,5 +680,5 @@ end -- -- Useful for skin mod forks that do not use the same name. armor.set_skin_mod = function(mod) - armor.skin_mod = mod + skin_mod = mod end diff --git a/mods/3d_armor/3d_armor/init.lua b/mods/3d_armor/3d_armor/init.lua index bb84364a..7e990f3f 100644 --- a/mods/3d_armor/3d_armor/init.lua +++ b/mods/3d_armor/3d_armor/init.lua @@ -96,7 +96,7 @@ for _, mod in pairs(skin_mods) do armor:add_preview(fn) end end - armor.skin_mod = mod + armor.set_skin_mod(mod) end end if not minetest.get_modpath("moreores") then diff --git a/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua b/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua index 2efbf9ae..6279d8a8 100644 --- a/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua +++ b/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua @@ -11,6 +11,7 @@ local gui_count2 = {} --mapping of player names to a quantity (arbitrary strings local gui_count3 = {} --mapping of player names to a quantity (arbitrary strings may also appear as values) local gui_angle = {} --mapping of player names to an angle (one of 90, 180, 270, representing the angle in degrees clockwise) local gui_filename = {} --mapping of player names to file names +local gui_param2 = {} --mapping of player names to param2 values --set default values setmetatable(gui_nodename1, {__index = function() return "Cobblestone" end}) @@ -25,6 +26,7 @@ setmetatable(gui_count2, {__index = function() return "6" end}) setmetatable(gui_count3, {__index = function() return "4" end}) setmetatable(gui_angle, {__index = function() return 90 end}) setmetatable(gui_filename, {__index = function() return "building" end}) +setmetatable(gui_param2, {__index = function() return "0" end}) local axis_indices = {["X axis"]=1, ["Y axis"]=2, ["Z axis"]=3, ["Look direction"]=4} local axis_values = {"x", "y", "z", "?"} @@ -904,3 +906,31 @@ worldedit.register_gui_function("worldedit_gui_clearobjects", { execute_worldedit_command("clearobjects", name, "") end, }) + +worldedit.register_gui_function("worldedit_gui_param2", { + name = "Set Param2", + privs = we_privs("param2"), + get_formspec = function(name) + local value = gui_param2[name] or "0" + return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_param2") .. + "textarea[0.5,1;5,2;;;Some values may break the node!]".. + string.format("field[0.5,2.5;2,0.8;worldedit_gui_param2_value;New Param2;%s]", minetest.formspec_escape(value)) .. + "field_close_on_enter[worldedit_gui_param2_value;false]" .. + "button_exit[3.5,2.5;3,0.8;worldedit_gui_param2_submit;Set Param2]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_param2", function(name, fields) + local cg = { + worldedit_gui_param2_value = gui_param2, + } + local ret = handle_changes(name, "worldedit_gui_param2", fields, cg) + if fields.worldedit_gui_param2_submit then + copy_changes(name, fields, cg) + worldedit.show_page(name, "worldedit_gui_param2") + + execute_worldedit_command("param2", name, gui_param2[name]) + return true + end + return ret +end) diff --git a/mods/advtrains/advtrains/couple.lua b/mods/advtrains/advtrains/couple.lua index 3dc336fa..336a6d42 100644 --- a/mods/advtrains/advtrains/couple.lua +++ b/mods/advtrains/advtrains/couple.lua @@ -1,14 +1,290 @@ --couple.lua ---defines couple entities. +--Handles coupling and discoupling of trains, and defines the coupling entities +--Rework June 2021 - some functions from trainlogic.lua have been moved here ---advtrains:discouple ---set into existing trains to split them when punched. ---they are attached to the wagons. ---[[fields -wagon +-- COUPLING -- +-- During coupling rework, the behavior of coupling was changed to make automation easier. It is now as follows: +-- Coupling is only ever initiated when a train is standing somewhere (not moving) and another train drives onto one of its ends +-- with a speed greater than 0 +-- "stationary" train is the one standing there - in old code called "train2" +-- "initiating" train is the one that approached it and bumped into it - typically an engine - in old code called "train1" +-- When the initiating train has autocouple set, trains are immediately coupled +-- When not, a couple entity is spawned and coupling commences on click +-- Coupling MUST preserve the train ID of the initiating train, so it is done like this: + -- initiating train is reversed + -- stationary train is reversed if required, so that it points towards the initiating train + -- do_connect_trains(initiating, stationary) +-- As a result, the coupled train is reversed in direction. Alternative way of doing things (might be considered later): + -- stationary train is reversed if required, so that it points away from the initiating train + -- index of initiating train is set so that it matches the front pos of stationary train + -- wagons of stationary train are inserted at the beginning of initiating train + -- remove stationary train -wagons keep their couple entity minetest-internal id inside the field discouple_id. if it refers to nowhere, they will spawn a new one if player is near -]] +-- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information +-- These objectRefs will delete themselves once the couples no longer match (see below) +local function create_couple_entity(pos, train1, t1_is_front, train2, t2_is_front) + local id1 = train1.id + local id2 = train2.id + + -- delete previous couple entities + if t1_is_front then + if train1.cpl_front then train1.cpl_front:remove() end + else + if train1.cpl_back then train1.cpl_back:remove() end + end + if t2_is_front then + if train2.cpl_front then train2.cpl_front:remove() end + else + if train2.cpl_back then train2.cpl_back:remove() end + end + + local obj=minetest.add_entity(pos, "advtrains:couple") + if not obj then error("Failed creating couple object!") return end + local le=obj:get_luaentity() + le.train_id_1=id1 + le.t1_is_front=t1_is_front + le.train_id_2=id2 + le.t2_is_front=t2_is_front + --atdebug("created couple between",train1.id,train2.id,t2_is_front) + + if t1_is_front then + train1.cpl_front = obj + else + train2.cpl_back = obj + end + if t2_is_front then + train2.cpl_front = obj + else + train2.cpl_back = obj + end +end + +-- Old static couple checking. Never used for autocouple, only used for standing trains if train did not approach +local CPL_CHK_DST = -1 +local CPL_ZONE = 2 +function advtrains.train_check_couples(train) + --atdebug("rechecking couples") + if train.cpl_front then + if not train.cpl_front:get_yaw() then + -- objectref is no longer valid. reset. + train.cpl_front = nil + end + end + if not train.cpl_front then + -- recheck front couple + local front_trains, pos = advtrains.occ.get_occupations(train, atround(train.index) + CPL_CHK_DST) + if advtrains.is_node_loaded(pos) then -- if the position is loaded... + for tid, idx in pairs(front_trains) do + local other_train = advtrains.trains[tid] + if not advtrains.train_ensure_init(tid, other_train) then + atwarn("Train",tid,"is not initialized! Couldn't check couples!") + return + end + --atdebug(train.id,"front: ",idx,"on",tid,atround(other_train.index),atround(other_train.end_index)) + if other_train.velocity == 0 then + if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then + create_couple_entity(pos, train, true, other_train, true) + break + end + if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then + create_couple_entity(pos, train, true, other_train, false) + break + end + end + end + end + end + if train.cpl_back then + if not train.cpl_back:get_yaw() then + -- objectref is no longer valid. reset. + train.cpl_back = nil + end + end + if not train.cpl_back then + -- recheck back couple + local back_trains, pos = advtrains.occ.get_occupations(train, atround(train.end_index) - CPL_CHK_DST) + if advtrains.is_node_loaded(pos) then -- if the position is loaded... + for tid, idx in pairs(back_trains) do + local other_train = advtrains.trains[tid] + if not advtrains.train_ensure_init(tid, other_train) then + atwarn("Train",tid,"is not initialized! Couldn't check couples!") + return + end + --atdebug(train.id,"back: ",idx,"on",tid,atround(other_train.index),atround(other_train.end_index)) + if other_train.velocity == 0 then + if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then + create_couple_entity(pos, train, false, other_train, true) + break + end + if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then + create_couple_entity(pos, train, false, other_train, false) + break + end + end + end + end + end +end + +-- Deletes couple entities from the train +function advtrains.couple_invalidate(train) + if train.cpl_back then + train.cpl_back:remove() + train.cpl_back = nil + end + if train.cpl_front then + train.cpl_front:remove() + train.cpl_front = nil + end + train.couples_up_to_date = nil +end + +-- Called from train_step_b() when the current train (init_train) just stopped at one of the end indices of another train (stat_train) +-- Depending on autocouple, either couples immediately or spawns a couple entity +function advtrains.couple_initiate_with(init_train, stat_train, stat_is_front) + --atdebug("Initiating couplign between init=",init_train.id,"stat=",stat_train.id,"backside=",stat_is_backside) + if init_train.autocouple then + advtrains.couple_trains(init_train, true, stat_train, stat_is_front) + else + local pos = advtrains.path_get_interpolated(init_train, init_train.index) + create_couple_entity(pos, init_train, true, stat_train, stat_is_front) + end + +end + +-- check if the player has permission for the first/last wagon of the train +local function check_twagon_owner(train, b_first, pname) + local wtp = b_first and 1 or #train.trainparts + local wid = train.trainparts[wtp] + local wdata = advtrains.wagons[wid] + if wdata then + return advtrains.check_driving_couple_protection(pname, wdata.owner, wdata.whitelist) + end + return false +end + +-- Perform coupling, but check if the player is authorized to couple +function advtrains.safe_couple_trains(train1, t1_is_front, train2, t2_is_front, pname) + + if pname and not minetest.check_player_privs(pname, "train_operator") then + minetest.chat_send_player(pname, "Missing train_operator privilege") + return false + end + + local wck_t1, wck_t2 + if pname then + wck_t1 = check_twagon_owner(train1, t1_is_front, pname) + wck_t2 = check_twagon_owner(train2, t2_is_front, pname) + end + if (wck_t1 or wck_t2) or not pname then + advtrains.couple_trains(train1, t1_is_front, train2, t2_is_front) + end +end + +-- Actually performs the train coupling. Always retains train ID of train1 +function advtrains.couple_trains(train1, t1_is_front, train2, t2_is_front) + --atdebug("Couple trains init=",init_train.id,"stat=",stat_train.id,"statreverse=",stat_must_reverse) + -- see comment on top of file + if t1_is_front then + advtrains.invert_train(train1.id) + end + if not t2_is_front then + advtrains.invert_train(train2.id) + end + + advtrains.do_connect_trains(train1, train2) +end + +-- Adds the wagons of first to second and deletes second_id afterwards +-- Assumes that second_id stands right behind first_id and both trains point to the same direction +function advtrains.do_connect_trains(first, second) + + if not advtrains.train_ensure_init(first.id, first) then + atwarn("Coupling: first train",first.id,"is not initialized! Operation aborted!") + return + end + if not advtrains.train_ensure_init(second.id, second) then + atwarn("Coupling: second train",second.id,"is not initialized! Operation aborted!") + return + end + + local first_wagoncnt=#first.trainparts + local second_wagoncnt=#second.trainparts + + for _,v in ipairs(second.trainparts) do + table.insert(first.trainparts, v) + end + + advtrains.remove_train(second.id) + + first.velocity = 0 + + advtrains.update_trainpart_properties(first.id) + advtrains.couple_invalidate(first) + return true +end + + + +-- DECOUPLING -- +function advtrains.split_train_at_fc(train, count_empty, length_limit) + -- splits train at first different current FC by convention, + -- locomotives have empty FC so are ignored + -- count_empty is used to split off locomotives + -- length_limit limits the length of the first train to length_limit wagons + local train_id = train.id + local fc = false + local ind = 0 + for i = 1, #train.trainparts do + local w_id = train.trainparts[i] + local data = advtrains.wagons[w_id] + if length_limit and i > length_limit then + ind = i + break + end + if data then + local wfc = advtrains.get_cur_fc(data) + if wfc ~= "" or count_empty then + if fc then + if fc ~= wfc then + ind = i + break + end + else + fc = wfc + end + end + end + end + if ind > 0 then + return advtrains.split_train_at_index(train, ind), fc + end + if fc then + return nil, fc + end +end + +function advtrains.train_step_fc(train) + for i=1,#train.trainparts do + local w_id = train.trainparts[i] + local data = advtrains.wagons[w_id] + if data then + advtrains.step_fc(data) + end + end +end + + +-- split_train_at_index() is in trainlogic.lua because it needs access to two local functions + +function advtrains.split_train_at_wagon(wagon_id) + --get train + local data = advtrains.wagons[wagon_id] + advtrains.split_train_at_index(advtrains.trains[data.train_id], data.pos_in_trainparts) +end + + +-- COUPLE ENTITIES -- local couple_max_dist=3 @@ -36,8 +312,6 @@ minetest.register_entity("advtrains:discouple", { if pname and pname~="" and self.wagon then if advtrains.safe_decouple_wagon(self.wagon.id, pname) then self.object:remove() - else - minetest.add_entity(self.object:getpos(), "advtrains:lockmarker") end end end, @@ -60,10 +334,6 @@ minetest.register_entity("advtrains:discouple", { -- advtrains:couple -- Couple entity -local function lockmarker(obj) - minetest.add_entity(obj:get_pos(), "advtrains:lockmarker") - obj:remove() -end minetest.register_entity("advtrains:couple", { visual="sprite", @@ -75,107 +345,71 @@ minetest.register_entity("advtrains:couple", { is_couple=true, static_save = false, on_activate=function(self, staticdata) - if staticdata=="COUPLE" then - --couple entities have no right to exist further... - atprint("Couple loaded from staticdata, destroying") - self.object:remove() - return - end - self.object:set_armor_groups({immmortal=1}) + if staticdata=="COUPLE" then + --couple entities have no right to exist further... + --atdebug("Couple loaded from staticdata, destroying") + self.object:remove() + return + end + self.object:set_armor_groups({immmortal=1}) end, get_staticdata=function(self) return "COUPLE" end, on_rightclick=function(self, clicker) - if not self.train_id_1 or not self.train_id_2 then return end - - local pname=clicker - if type(clicker)~="string" then pname=clicker:get_player_name() end - - if advtrains.safe_couple_trains(self.train_id_1, self.train_id_2, self.t1_is_front, self.t2_is_front, pname) then - self.object:remove() - else - lockmarker(self.object) - end - end, - on_step=function(self, dtime) - if advtrains.wagon_outside_range(self.object:getpos()) then - self.object:remove() - return - end + if not self.train_id_1 or not self.train_id_2 then return end - if not self.train_id_1 or not self.train_id_2 then atprint("Couple: train ids not set!") self.object:remove() return end - local train1=advtrains.trains[self.train_id_1] - local train2=advtrains.trains[self.train_id_2] - if not train1 or not train2 then - atprint("Couple: trains missing, destroying") - self.object:remove() - return - end - - --shh, silence here, this is an on-step callback! - if not advtrains.train_ensure_init(self.train_id_1, train1) then - --atwarn("Train",self.train_id_1,"is not initialized! Operation aborted!") - return - end - if not advtrains.train_ensure_init(self.train_id_2, train2) then - --atwarn("Train",self.train_id_2,"is not initialized! Operation aborted!") - return - end - - if train1.velocity>0 or train2.velocity>0 then - if not self.position_set then --ensures that train stands a single time before check fires. Using flag below - return - end - atprint("Couple: train is moving, destroying") - self.object:remove() - return - end - - if not self.position_set then - local tp1 - if self.t1_is_front then - tp1=advtrains.path_get_interpolated(train1, train1.index) - else - tp1=advtrains.path_get_interpolated(train1, train1.end_index) - end - local tp2 - if self.t2_is_front then - tp2=advtrains.path_get_interpolated(train2, train2.index) - else - tp2=advtrains.path_get_interpolated(train2, train2.end_index) - end - local pos_median=advtrains.pos_median(tp1, tp2) - if not vector.equals(pos_median, self.object:getpos()) then - self.object:set_pos(pos_median) - end - self.position_set=true - end - advtrains.atprint_context_tid=nil + local pname=clicker + if type(clicker)~="string" then pname=clicker:get_player_name() end + + local train1=advtrains.trains[self.train_id_1] + local train2=advtrains.trains[self.train_id_2] + + advtrains.safe_couple_trains(train1, self.t1_is_front, train2, self.t2_is_front, pname) + self.object:remove() end, -}) -minetest.register_entity("advtrains:lockmarker", { - visual="sprite", - textures = {"advtrains_cpl_lock.png"}, - collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3}, - visual_size = {x=0.7, y=0.7}, - initial_sprite_basepos = {x=0, y=0}, - - is_lockmarker=true, - static_save = false, - on_activate=function(self, staticdata) - if staticdata=="COUPLE" then - --couple entities have no right to exist further... - atprint("Couple loaded from staticdata, destroying") - self.object:remove() - return - end - self.object:set_armor_groups({immmortal=1}) - self.life=5 - end, - get_staticdata=function(self) return "COUPLE" end, on_step=function(self, dtime) - self.life=(self.life or 5)-dtime - if self.life<0 then + if advtrains.wagon_outside_range(self.object:getpos()) then + --atdebug("Couple Removing outside range") self.object:remove() + return + end + + if not self.train_id_1 or not self.train_id_2 then + --atdebug("Couple Removing ids missing") + self.object:remove() + return + end + local train1=advtrains.trains[self.train_id_1] + local train2=advtrains.trains[self.train_id_2] + if not train1 or not train2 then + --atdebug("Couple Removing trains missing") + self.object:remove() + return + end + + if self.position_set and train1.velocity>0 or train2.velocity>0 then + --atdebug("Couple: train is moving, destroying") + self.object:remove() + return + end + + if not self.position_set then + local tp1 + if self.t1_is_front then + tp1=advtrains.path_get_interpolated(train1, train1.index) + else + tp1=advtrains.path_get_interpolated(train1, train1.end_index) + end + local tp2 + if self.t2_is_front then + tp2=advtrains.path_get_interpolated(train2, train2.index) + else + tp2=advtrains.path_get_interpolated(train2, train2.end_index) + end + local pos_median=advtrains.pos_median(tp1, tp2) + if not vector.equals(pos_median, self.object:getpos()) then + self.object:set_pos(pos_median) + end + self.position_set=true end end, -}) +}) diff --git a/mods/advtrains/advtrains/init.lua b/mods/advtrains/advtrains/init.lua index 96352df7..083281e4 100644 --- a/mods/advtrains/advtrains/init.lua +++ b/mods/advtrains/advtrains/init.lua @@ -569,11 +569,13 @@ advtrains.mainloop_runcnt=0 advtrains.global_slowdown = 1 local t = 0 +local within_mainstep = false minetest.register_globalstep(function(dtime_mt) if no_action then -- the advtrains globalstep is skipped by command. Return immediately return end + within_mainstep = true advtrains.mainloop_runcnt=advtrains.mainloop_runcnt+1 --atprint("Running the main loop, runcnt",advtrains.mainloop_runcnt) @@ -586,6 +588,7 @@ minetest.register_globalstep(function(dtime_mt) if GENERATE_ATRICIFIAL_LAG then dtime = HOW_MANY_LAG if os.clock() 1) then + if back_off_track and (not sit_v_cap or sit_v_cap > 1) then --atprint("in train_step_b: applying back_off_track") sit_v_cap = 1 elseif front_off_track then @@ -587,12 +588,76 @@ function advtrains.train_step_b(id, train, dtime) else --atprint("in train_step_b: movement calculation reusing from LZB newindex=",new_index_curr_tv) end - + -- if the zeroappr mechanism has hit, go no further than zeroappr index if lzb_next_zero_barrier and new_index_curr_tv > lzb_next_zero_barrier then --atprint("in train_step_b: Zero barrier hit, clipping to newidx_tv=",new_index_curr_tv, "zb_idx=",lzb_next_zero_barrier) new_index_curr_tv = lzb_next_zero_barrier end + + -- New same-track collision system - check for any other trains within the range we're going to move + -- do the checks if we either are moving or about to start moving + if new_index_curr_tv > train.index or accelerating then -- only if train is actually advancing + -- Note: duplicate code from path_project() because of subtle differences: no frac processing and scanning all occupations + --[[train.debug = "" + local atdebug = function(t, ...) + local text=advtrains.print_concat_table({t, ...}) + train.debug = train.debug..text.."\n" + end]] + local base_idx = atfloor(new_index_curr_tv + 1) + local base_pos = advtrains.path_get(train, base_idx) + local base_cn = train.path_cn[base_idx] + --atdebug(id,"Begin Checking for on-track collisions new_idx=",new_index_curr_tv,"base_idx=",base_idx,"base_pos=",base_pos,"base_cn=",base_cn) + -- query occupation + local occ = advtrains.occ.get_trains_over(base_pos) + -- iterate other trains + for otid, ob_idx in pairs(occ) do + if otid ~= id then + --atdebug(id,"Found other train",otid," with matching index ",ob_idx) + -- Phase 1 - determine if trains are facing and which is the relefant stpo index + local otrn = advtrains.trains[otid] + + -- retrieve other train's cn and cp + local ocn = otrn.path_cn[ob_idx] + local ocp = otrn.path_cp[ob_idx] + + local target_is_inside, ref_index, facing + + if base_cn == ocn then + -- same direction + ref_index = otrn.end_index + same_dir = true + target_is_inside = (ob_idx >= ref_index) + --atdebug("Same direction: ref_index",ref_index,"inside=",target_is_inside) + elseif base_cn == ocp then + -- facing trains - subtract index frac + ref_index = otrn.index + same_dir = false + target_is_inside = (ob_idx <= ref_index) + --atdebug("Facing direction: ref_index",ref_index,"inside=",target_is_inside) + end + + -- Phase 2 - project ref_index back onto our path and check again (necessary because there might be a turnout on the way and we are driving into the flank + if target_is_inside then + local our_index = advtrains.path_project(otrn, ref_index, id) + --atdebug("Backprojected our_index",our_index) + if our_index and our_index <= new_index_curr_tv then + -- ON_TRACK COLLISION IS HAPPENING + -- the actual collision is handled in train_step_c, so set appropriate signal variables + train.ontrack_collision_info = { + otid = otid, + same_dir = same_dir, + } + -- clip newindex + --atdebug("-- Collision detected!") + new_index_curr_tv = our_index + end + end + end + end + end + + -- ## Movement happens here ## train.index = new_index_curr_tv recalc_end_index(train) @@ -638,21 +703,42 @@ function advtrains.train_step_c(id, train, dtime) advtrains.spawn_wagons(id) train.check_trainpartload=2 end - - --- 8. check for collisions with other trains and damage players --- - + local train_moves=(train.velocity~=0) - - --- Check whether this train can be coupled to another, and set couple entities accordingly - if not train.was_standing and not train_moves then - advtrains.train_check_couples(train) + local very_short_train = train.trainlen < 3 + + --- On-track collision handling - detected in train_step_b, but handled here so all other train movements have already happened. + if train.ontrack_collision_info then + train.velocity = 0 + train.acceleration = 0 + advtrains.atc.train_reset_command(train) + + local otrn = advtrains.trains[train.ontrack_collision_info.otid] + + if otrn.velocity == 0 then -- other train must be standing, else don't initiate coupling + advtrains.couple_initiate_with(train, otrn, not train.ontrack_collision_info.same_dir) + end + + train.ontrack_collision_info = nil + train.couples_up_to_date = true end - train.was_standing = not train_moves - + + -- handle couples if on_track collision handling did not fire if train_moves then - + train.couples_up_to_date = nil + elseif not train.couples_up_to_date then + if not very_short_train then -- old coupling system is buggy for short trains + advtrains.train_check_couples(train) -- no guarantee for train order here + end + train.couples_up_to_date = true + end + + --- 8. check for collisions with other trains and damage players --- + if train_moves then + -- Note: this code handles collisions with trains that are not on the same path as the current train + -- The same-track collisions and coupling handling is found in couple.lua and handled from train_step_b() and code 2 blocks above. local collided = false - local coll_grace=1 + local coll_grace=2 local collindex = advtrains.path_get_index_by_offset(train, train.index, -coll_grace) local collpos = advtrains.path_get(train, atround(collindex)) if collpos then @@ -663,13 +749,14 @@ function advtrains.train_step_c(id, train, dtime) local testpos=vector.add(rcollpos, {x=x, y=0, z=z}) --- 8a Check collision --- if not collided then - - local col_tr = advtrains.occ.check_collision(testpos, id) - if col_tr then - advtrains.train_check_couples(train) - train.velocity = 0 - advtrains.atc.train_reset_command(train) - collided = true + if not very_short_train then -- position collision system is buggy for short trains + local col_tr = advtrains.occ.check_collision(testpos, id) + if col_tr then + train.velocity = 0 + train.acceleration = 0 + advtrains.atc.train_reset_command(train) + collided = true + end end --- 8b damage players --- @@ -703,7 +790,7 @@ function advtrains.train_step_c(id, train, dtime) local objs = minetest.get_objects_inside_radius(rcollpos, 2) for _,obj in ipairs(objs) do if not obj:is_player() and obj:get_armor_groups().fleshy and obj:get_armor_groups().fleshy > 0 - and obj:get_luaentity() and obj:get_luaentity().name~="signs:text" then + and obj:get_luaentity() and obj:get_luaentity().name~="signs_lib:text" then obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil) end end @@ -899,7 +986,7 @@ function advtrains.remove_train(id) run_callbacks_remove(id, train) - advtrains.path_invalidate(train) + advtrains.path_invalidate(train, true) advtrains.couple_invalidate(train) local tp = train.trainparts @@ -1019,53 +1106,6 @@ function advtrains.spawn_wagons(train_id) end end -function advtrains.split_train_at_fc(train, count_empty, length_limit) - -- splits train at first different current FC by convention, - -- locomotives have empty FC so are ignored - -- count_empty is used to split off locomotives - -- length_limit limits the length of the first train to length_limit wagons - local train_id = train.id - local fc = false - local ind = 0 - for i = 1, #train.trainparts do - local w_id = train.trainparts[i] - local data = advtrains.wagons[w_id] - if length_limit and i > length_limit then - ind = i - break - end - if data then - local wfc = advtrains.get_cur_fc(data) - if wfc ~= "" or count_empty then - if fc then - if fc ~= wfc then - ind = i - break - end - else - fc = wfc - end - end - end - end - if ind > 0 then - return advtrains.split_train_at_index(train, ind), fc - end - if fc then - return nil, fc - end -end - -function advtrains.train_step_fc(train) - for i=1,#train.trainparts do - local w_id = train.trainparts[i] - local data = advtrains.wagons[w_id] - if data then - advtrains.step_fc(data) - end - end -end - function advtrains.split_train_at_index(train, index) -- this function splits a train at index, creating a new train from the back part of the train. @@ -1121,167 +1161,6 @@ function advtrains.split_train_at_index(train, index) end -function advtrains.split_train_at_wagon(wagon_id) - --get train - local data = advtrains.wagons[wagon_id] - advtrains.split_train_at_index(advtrains.trains[data.train_id], data.pos_in_trainparts) -end - --- coupling -local CPL_CHK_DST = -1 -local CPL_ZONE = 2 - --- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information --- These objectRefs will delete themselves once the couples no longer match -local function createcouple(pos, train1, t1_is_front, train2, t2_is_front) - local id1 = train1.id - local id2 = train2.id - if train1.autocouple or train2.autocouple then - -- couple trains - train1.autocouple = nil - train2.autocouple = nil - minetest.after(0, advtrains.safe_couple_trains, id1, id2, t1_is_front, t2_is_front, false, false, train1.velocity, train2.velocity) - return - end - - local obj=minetest.add_entity(pos, "advtrains:couple") - if not obj then error("Failed creating couple object!") return end - local le=obj:get_luaentity() - le.train_id_1=id1 - le.train_id_2=id2 - le.t1_is_front=t1_is_front - le.t2_is_front=t2_is_front - --atdebug("created couple between",train1.id,t1_is_front,train2.id,t2_is_front) - if t1_is_front then - train1.cpl_front = obj - else - train1.cpl_back = obj - end - if t2_is_front then - train2.cpl_front = obj - else - train2.cpl_back = obj - end - -end - -function advtrains.train_check_couples(train) - --atdebug("rechecking couples") - if train.cpl_front then - if not train.cpl_front:get_yaw() then - -- objectref is no longer valid. reset. - train.cpl_front = nil - end - end - if not train.cpl_front then - -- recheck front couple - local front_trains, pos = advtrains.occ.get_occupations(train, atround(train.index) + CPL_CHK_DST) - if advtrains.is_node_loaded(pos) then -- if the position is loaded... - for tid, idx in pairs(front_trains) do - local other_train = advtrains.trains[tid] - if not advtrains.train_ensure_init(tid, other_train) then - atwarn("Train",tid,"is not initialized! Couldn't check couples!") - return - end - --atdebug(train.id,"front: ",idx,"on",tid,atround(other_train.index),atround(other_train.end_index)) - if other_train.velocity == 0 then - if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then - createcouple(pos, train, true, other_train, true) - break - end - if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then - createcouple(pos, train, true, other_train, false) - break - end - end - end - end - end - if train.cpl_back then - if not train.cpl_back:get_yaw() then - -- objectref is no longer valid. reset. - train.cpl_back = nil - end - end - if not train.cpl_back then - -- recheck back couple - local back_trains, pos = advtrains.occ.get_occupations(train, atround(train.end_index) - CPL_CHK_DST) - if advtrains.is_node_loaded(pos) then -- if the position is loaded... - for tid, idx in pairs(back_trains) do - local other_train = advtrains.trains[tid] - if not advtrains.train_ensure_init(tid, other_train) then - atwarn("Train",tid,"is not initialized! Couldn't check couples!") - return - end - if other_train.velocity == 0 then - if idx>=other_train.index and idx<=other_train.index + CPL_ZONE then - createcouple(pos, train, false, other_train, true) - break - end - if idx<=other_train.end_index and idx>=other_train.end_index - CPL_ZONE then - createcouple(pos, train, false, other_train, false) - break - end - end - end - end - end -end - -function advtrains.couple_invalidate(train) - if train.cpl_back then - train.cpl_back:remove() - train.cpl_back = nil - end - if train.cpl_front then - train.cpl_front:remove() - train.cpl_front = nil - end - train.was_standing = nil -end - --- relevant code for this comment is in couple.lua - ---there are 4 cases: ---1/2. F<->R F<->R regular, put second train behind first ---->frontpos of first train will match backpos of second ---3. F<->R R<->F flip one of these trains, take the other as new train ---->backpos's will match ---4. R<->F F<->R flip one of these trains and take it as new parent ---->frontpos's will match - - -function advtrains.do_connect_trains(first_id, second_id, vel) - local first, second=advtrains.trains[first_id], advtrains.trains[second_id] - - if not advtrains.train_ensure_init(first_id, first) then - atwarn("Train",first_id,"is not initialized! Operation aborted!") - return - end - if not advtrains.train_ensure_init(second_id, second) then - atwarn("Train",second_id,"is not initialized! Operation aborted!") - return - end - - local first_wagoncnt=#first.trainparts - local second_wagoncnt=#second.trainparts - - for _,v in ipairs(second.trainparts) do - table.insert(first.trainparts, v) - end - - advtrains.remove_train(second_id) - if vel < 0 then - advtrains.invert_train(first_id) - vel = -vel - end - first.velocity= vel or 0 - - advtrains.update_trainpart_properties(first_id) - advtrains.couple_invalidate(first) - return true -end - function advtrains.invert_train(train_id) local train=advtrains.trains[train_id] @@ -1368,44 +1247,61 @@ function advtrains.invalidate_path(id) end --not blocking trains group -function advtrains.train_collides(node) - if node and minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].walkable then + +if minetest.settings:get_bool("advtrains_forgiving_collision") then + function advtrains.train_collides(node) + if node and minetest.registered_nodes[node.name] then + local ndef = minetest.registered_nodes[node.name] + -- if the node is drawtype normal (that is a full cube) then it does collide + if ndef.drawtype == "normal" then + -- except if it is not_blocking_trains + if ndef.groups.not_blocking_trains and ndef.groups.not_blocking_trains ~= 0 then + return false + end + return true + end + end + return false + end +else + function advtrains.train_collides(node) + if node and minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].walkable then if not minetest.registered_nodes[node.name].groups.not_blocking_trains then return true end - end - return false -end - -local nonblocknodes={ - "default:fence_wood", - "default:fence_acacia_wood", - "default:fence_aspen_wood", - "default:fence_pine_wood", - "default:fence_junglewood", - "default:torch", - "bones:bones", - - "default:sign_wall", - "signs:sign_wall", - "signs:sign_wall_blue", - "signs:sign_wall_brown", - "signs:sign_wall_orange", - "signs:sign_wall_green", - "signs:sign_yard", - "signs:sign_wall_white_black", - "signs:sign_wall_red", - "signs:sign_wall_white_red", - "signs:sign_wall_yellow", - "signs:sign_post", - "signs:sign_hanging", - - -} -minetest.after(0, function() - for _,name in ipairs(nonblocknodes) do - if minetest.registered_nodes[name] then - minetest.registered_nodes[name].groups.not_blocking_trains=1 end + return false end -end) + + local nonblocknodes={ + "default:fence_wood", + "default:fence_acacia_wood", + "default:fence_aspen_wood", + "default:fence_pine_wood", + "default:fence_junglewood", + "default:torch", + "bones:bones", + + "default:sign_wall", + "signs:sign_wall", + "signs:sign_wall_blue", + "signs:sign_wall_brown", + "signs:sign_wall_orange", + "signs:sign_wall_green", + "signs:sign_yard", + "signs:sign_wall_white_black", + "signs:sign_wall_red", + "signs:sign_wall_white_red", + "signs:sign_wall_yellow", + "signs:sign_post", + "signs:sign_hanging", + + } + minetest.after(0, function() + for _,name in ipairs(nonblocknodes) do + if minetest.registered_nodes[name] then + minetest.registered_nodes[name].groups.not_blocking_trains=1 + end + end + end) +end diff --git a/mods/advtrains/advtrains/wagons.lua b/mods/advtrains/advtrains/wagons.lua index e9b6d7a1..4093f065 100644 --- a/mods/advtrains/advtrains/wagons.lua +++ b/mods/advtrains/advtrains/wagons.lua @@ -1240,70 +1240,6 @@ function wagon:reattach_all() end end -local function check_twagon_owner(train, b_first, pname) - local wtp = b_first and 1 or #train.trainparts - local wid = train.trainparts[wtp] - local wdata = advtrains.wagons[wid] - if wdata then - return advtrains.check_driving_couple_protection(pname, wdata.owner, wdata.whitelist) - end - return false -end - -function advtrains.safe_couple_trains(id1, id2, t1f, t2f, pname, try_run,v1,v2) - - if pname and not minetest.check_player_privs(pname, "train_operator") then - minetest.chat_send_player(pname, "Missing train_operator privilege") - return false - end - - local train1=advtrains.trains[id1] - local train2=advtrains.trains[id2] - - if not advtrains.train_ensure_init(id1, train1) - or not advtrains.train_ensure_init(id2, train2) then - return false - end - local wck_t1, wck_t2 - if pname then - wck_t1 = check_twagon_owner(train1, t1f, pname) - wck_t2 = check_twagon_owner(train2, t2f, pname) - end - if (wck_t1 or wck_t2) or not pname then - if not v1 then - v1 = 0 - end - if not v2 then - v2 = 0 - end - if try_run then - return true - end - if t1f then - if t2f then - v1 = -v1 - advtrains.invert_train(id1) - advtrains.do_connect_trains(id1, id2, v1+v2) - else - advtrains.do_connect_trains(id2, id1, v1+v2) - end - else - if t2f then - advtrains.do_connect_trains(id1, id2, v1+v2) - else - v2 = -v2 - advtrains.invert_train(id2) - advtrains.do_connect_trains(id1, id2, v1+v2) - end - end - return true - else - minetest.chat_send_player(pname, "You must be authorized for at least one wagon.") - return false - end -end - - function advtrains.safe_decouple_wagon(w_id, pname, try_run) if not minetest.check_player_privs(pname, "train_operator") then minetest.chat_send_player(pname, "Missing train_operator privilege") diff --git a/mods/ambience/init.lua b/mods/ambience/init.lua index 43f7be00..b9d424cf 100644 --- a/mods/ambience/init.lua +++ b/mods/ambience/init.lua @@ -104,7 +104,8 @@ end) local get_ambience = function(player, tod, name) -- play server or local music if music enabled and music not already playing - if play_music and MUSICVOLUME > 0 and playing[name].music < 0 then + if play_music and MUSICVOLUME > 0 + and playing[name] and playing[name].music < 0 then -- count backwards playing[name].music = playing[name].music -1 diff --git a/mods/ambience/soundsets.lua b/mods/ambience/soundsets.lua index 3adcd761..9dc5d3e4 100644 --- a/mods/ambience/soundsets.lua +++ b/mods/ambience/soundsets.lua @@ -139,7 +139,7 @@ ambience.add_set("lava", { }) else - print ("[Ambience] found env_sounds, flowing water sounds disabled.") + print ("[Ambience] found env_sounds, flowing water and lava sounds disabled.") end -- Only add fire sounds set if flame_sound is disabled or fire redo active @@ -238,7 +238,7 @@ ambience.add_set("ice", { frequency = 250, sounds = { - {name = "icecrack", length = 23}, + {name = "icecrack", length = 23, gain = 0.7}, {name = "desertwind", length = 8}, {name = "wind", length = 9} }, @@ -280,7 +280,7 @@ ambience.add_set("desert", { end }) --- Cave sounds play when below player position Y -25 +-- Cave sounds play when below player position Y -25 and water nearby ambience.add_set("cave", { @@ -293,7 +293,9 @@ ambience.add_set("cave", { sound_check = function(def) - if def.pos.y < -25 then + local c = (def.totals["default:water_source"] or 0) + + if c > 0 and def.pos.y < -25 then return "cave" end end diff --git a/mods/bakedclay/README.md b/mods/bakedclay/README.md index e740e03b..d699179c 100644 --- a/mods/bakedclay/README.md +++ b/mods/bakedclay/README.md @@ -2,11 +2,13 @@ Baked Clay This mod lets the player bake clay into hardened blocks and colour them with dye (8x baked clay and 1x dye in centre), stairs and slabs are also available. +Cooking baked clay turns it into glazed terracotta blocks. https://forum.minetest.net/viewtopic.php?id=8890 Changelog: +- 1.0 - Added glazed terracotta blocks when you cook baked clay in furnace (thanks D3monPixel) - 0.9 - Baked clay now works in the technic cnc machine - 0.8 - Cooking clay block in furnace gives natural baked clay which you can dye - 0.7 - Added support for stairsplus so that stairs are registered properly @@ -17,7 +19,7 @@ Changelog: - 0.2 - Any colour of baked clay can be re-dyed into another colour - 0.1 - Initial Release -Lucky Blocks: 9 +Lucky Blocks: 10 Note: Under settings you will find 'colored_clay_compatibility' switch that when enabled will register aliases for the older colored clay mod and it's stairplus stairs. diff --git a/mods/bakedclay/init.lua b/mods/bakedclay/init.lua index 133d199e..61fc73bf 100644 --- a/mods/bakedclay/init.lua +++ b/mods/bakedclay/init.lua @@ -17,7 +17,7 @@ local clay = { {"brown", "Brown"}, {"pink", "Pink"}, {"dark_grey", "Dark Grey"}, - {"dark_green", "Dark Green"}, + {"dark_green", "Dark Green"} } local techcnc_mod = minetest.get_modpath("technic_cnc") @@ -27,42 +27,50 @@ local stairsplus_mod = minetest.get_modpath("moreblocks") for _, clay in pairs(clay) do - -- node definition + -- node minetest.register_node("bakedclay:" .. clay[1], { description = clay[2] .. " Baked Clay", tiles = {"baked_clay_" .. clay[1] ..".png"}, groups = {cracky = 3, bakedclay = 1}, - sounds = default.node_sound_stone_defaults(), + sounds = default.node_sound_stone_defaults() }) - -- craft from dye and any baked clay + -- craft recipe + if clay[1] ~= "natural" then + minetest.register_craft({ output = "bakedclay:" .. clay[1] .. " 8", recipe = { {"group:bakedclay", "group:bakedclay", "group:bakedclay"}, {"group:bakedclay", "dye:" .. clay[1], "group:bakedclay"}, {"group:bakedclay", "group:bakedclay", "group:bakedclay"} - }, + } }) end - -- register stairsplus stairs if found + -- stairs plus if stairsplus_mod then - stairsplus:register_all("bakedclay", "baked_clay_" .. clay[1], "bakedclay:" .. clay[1], { + stairsplus:register_all("bakedclay", "baked_clay_" .. clay[1], + "bakedclay:" .. clay[1], { description = clay[2] .. " Baked Clay", tiles = {"baked_clay_" .. clay[1] .. ".png"}, groups = {cracky = 3}, - sounds = default.node_sound_stone_defaults(), + sounds = default.node_sound_stone_defaults() }) - stairsplus:register_alias_all("bakedclay", clay[1], "bakedclay", "baked_clay_" .. clay[1]) - minetest.register_alias("stairs:slab_bakedclay_".. clay[1], "bakedclay:slab_baked_clay_" .. clay[1]) - minetest.register_alias("stairs:stair_bakedclay_".. clay[1], "bakedclay:stair_baked_clay_" .. clay[1]) + stairsplus:register_alias_all("bakedclay", clay[1], + "bakedclay", "baked_clay_" .. clay[1]) - -- register all stair types for stairs redo + minetest.register_alias("stairs:slab_bakedclay_".. clay[1], + "bakedclay:slab_baked_clay_" .. clay[1]) + + minetest.register_alias("stairs:stair_bakedclay_".. clay[1], + "bakedclay:stair_baked_clay_" .. clay[1]) + + -- stairs redo elseif stairs_mod and stairs.mod then stairs.register_all("bakedclay_" .. clay[1], "bakedclay:" .. clay[1], @@ -71,7 +79,7 @@ for _, clay in pairs(clay) do clay[2] .. " Baked Clay", default.node_sound_stone_defaults()) - -- register stair and slab using default stairs + -- default stairs elseif stairs_mod then stairs.register_stair_and_slab("bakedclay_".. clay[1], "bakedclay:".. clay[1], @@ -92,6 +100,56 @@ for _, clay in pairs(clay) do end end +-- Terracotta blocks (textures by D3monPixel, thanks for use :) +for _, clay in pairs(clay) do + + if clay[1] ~= "natural" then + + local texture = "baked_clay_terracotta_" .. clay[1] ..".png" + + minetest.register_node("bakedclay:terracotta_" .. clay[1], { + description = clay[2] .. " Glazed Terracotta", + tiles = { + texture .. "", + texture .. "", + texture .. "^[transformR180", + texture .. "", + texture .. "^[transformR270", + texture .. "^[transformR90", + }, + paramtype2 = "facedir", + groups = {cracky = 3, terracotta = 1}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node + }) + + minetest.register_craft({ + type = "cooking", + output = "bakedclay:terracotta_" .. clay[1], + recipe = "bakedclay:" .. clay[1] + }) + end +end + +-- special light blue glazed terracotta block +local texture = "baked_clay_terracotta_light_blue.png" + +minetest.register_node("bakedclay:terracotta_light_blue", { + description = "Light Blue Glazed Terracotta", + tiles = { + texture .. "", + texture .. "", + texture .. "^[transformR180", + texture .. "", + texture .. "^[transformR270", + texture .. "^[transformR90", + }, + paramtype2 = "facedir", + groups = {cracky = 3, terracotta = 1}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node +}) + -- cook clay block into white baked clay minetest.register_craft({ @@ -108,34 +166,29 @@ minetest.register_craft( { recipe = {"dye:black", "dye:black", "dye:white"} }) --- only add light grey recipe if unifieddye mod isnt present (conflict) -if not minetest.get_modpath("unifieddyes") then -minetest.register_craft( { - type = "shapeless", - output = "dye:grey 3", - recipe = {"dye:black", "dye:white", "dye:white"} -}) -end - minetest.register_craft( { type = "shapeless", output = "dye:green 4", recipe = {"default:cactus"} }) -minetest.register_craft( { - type = "shapeless", - output = "dye:black 4", - recipe = {"default:coal_lump"} -}) - minetest.register_craft( { type = "shapeless", output = "dye:brown 4", recipe = {"default:dry_shrub"} }) --- 2x2 red bakedclay makes 16x clay brick +-- only add light grey recipe if unifieddye mod isnt present (conflict) +if not minetest.get_modpath("unifieddyes") then + + minetest.register_craft( { + type = "shapeless", + output = "dye:grey 3", + recipe = {"dye:black", "dye:white", "dye:white"} + }) +end + +-- 2x2 red baked clay makes 16x clay brick minetest.register_craft( { output = "default:clay_brick 16", recipe = { @@ -176,10 +229,17 @@ local function add_simple_flower(name, desc, box, f_groups) end local flowers = { - {"delphinium", "Blue Delphinium", {-0.15, -0.5, -0.15, 0.15, 0.3, 0.15}, {color_cyan = 1}}, - {"thistle", "Thistle", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_magenta = 1}}, - {"lazarus", "Lazarus Bell", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_pink = 1}}, - {"mannagrass", "Reed Mannagrass", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_dark_green = 1}}, + {"delphinium", "Blue Delphinium", + {-0.15, -0.5, -0.15, 0.15, 0.3, 0.15}, {color_cyan = 1}}, + + {"thistle", "Thistle", + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_magenta = 1}}, + + {"lazarus", "Lazarus Bell", + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_pink = 1}}, + + {"mannagrass", "Reed Mannagrass", + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_dark_green = 1}} } for _,item in pairs(flowers) do @@ -202,7 +262,7 @@ minetest.register_decoration({ }, y_min = 10, y_max = 90, - decoration = "bakedclay:delphinium", + decoration = "bakedclay:delphinium" }) minetest.register_decoration({ @@ -219,7 +279,7 @@ minetest.register_decoration({ }, y_min = 15, y_max = 90, - decoration = "bakedclay:thistle", + decoration = "bakedclay:thistle" }) minetest.register_decoration({ @@ -238,7 +298,7 @@ minetest.register_decoration({ y_max = 90, decoration = "bakedclay:lazarus", spawn_by = "default:jungletree", - num_spawn_by = 1, + num_spawn_by = 1 }) minetest.register_decoration({ @@ -257,13 +317,15 @@ minetest.register_decoration({ y_max = 15, decoration = "bakedclay:mannagrass", spawn_by = "group:water", - num_spawn_by = 1, + num_spawn_by = 1 }) --- add lucky blocks +-- lucky blocks if minetest.get_modpath("lucky_block") then + local p = "bakedclay:" + lucky_block:add_blocks({ {"dro", {"bakedclay:"}, 10, true}, {"fal", {p.."black", p.."blue", p.."brown", p.."cyan", p.."dark_green", @@ -295,13 +357,36 @@ lucky_block:add_blocks({ {name = p.."red", max = 30}, {name = p.."violet", max = 30}, {name = p.."white", max = 30}, - {name = p.."yellow", max = 30}, + {name = p.."yellow", max = 30} }}, }) + +p = "bakedclay:terracotta_" + +lucky_block:add_blocks({ + {"nod", "default:chest", 0, { + {name = p.."light_blue", max = 20}, + {name = p.."black", max = 20}, + {name = p.."blue", max = 20}, + {name = p.."brown", max = 20}, + {name = p.."cyan", max = 20}, + {name = p.."dark_green", max = 20}, + {name = p.."dark_grey", max = 20}, + {name = p.."green", max = 20}, + {name = p.."grey", max = 20}, + {name = p.."magenta", max = 20}, + {name = p.."orange", max = 20}, + {name = p.."pink", max = 20}, + {name = p.."red", max = 20}, + {name = p.."violet", max = 20}, + {name = p.."white", max = 20}, + {name = p.."yellow", max = 20} + }} +}) end - -- colored clay compatibility + if minetest.settings:get_bool("colored_clay_compatibility") == true then local cc = { diff --git a/mods/bakedclay/license.txt b/mods/bakedclay/license.txt index fec6f6aa..da710ed8 100644 --- a/mods/bakedclay/license.txt +++ b/mods/bakedclay/license.txt @@ -19,3 +19,7 @@ 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. + + +Textures by D3monPixel (https://mcpedl.com/better-glazed-terracotta-pack) + baked_clay_terracotta*.png diff --git a/mods/bakedclay/textures/baked_clay_terracotta_black.png b/mods/bakedclay/textures/baked_clay_terracotta_black.png new file mode 100644 index 0000000000000000000000000000000000000000..1011a685dd43380fc51baacbb801ddbdcd70a041 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPt3y+98N8)NP7NF2oPZ!4!jq|mECj}21a2%1Gw}TV*a_16Bvd%A7+6r#ABQE5B9Te0Twqw56zMWxr5r0-{WQS|sPQ+?T&_-`y8adUEi T2;bTQ^dN($tDnm{r-UW|JkNW+ literal 0 HcmV?d00001 diff --git a/mods/bakedclay/textures/baked_clay_terracotta_blue.png b/mods/bakedclay/textures/baked_clay_terracotta_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..8ced312b4021f97f50475b7ed16f7af7e7cbfd9a GIT binary patch literal 257 zcmV+c0sj7pP)B zcIV`TPkbKKA+xjpD+ocuI7bTRwF?LiwUQr=lgn*t?Ts_xtq;*O2XE3|D6)ATdzoM z(B&N%c>sLE212H)4zQk2MYaBUb*A-$#8Z4M1Ti7!E2P6W=Y;!te$N)=00000NkvXX Hu0mjf`iE{q literal 0 HcmV?d00001 diff --git a/mods/bakedclay/textures/baked_clay_terracotta_brown.png b/mods/bakedclay/textures/baked_clay_terracotta_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1163b8a05ca7220597dc966719d650d925774f GIT binary patch literal 718 zcmV;<0x|uGP)+0;cBjl>VoMU!ruE?m2CVZTKe z)sVPk)t!lHY;8@XiWyqkNkXL;et{M>wgGmpO~ zDaXoZ>hswb`OW-J<(d+1DZ99mTelq-0C%qrM}+CAL^>`1O9EiJrR*Xl8~`%Tw^`cI zyQ8B)*L5A&Z8S8S>WY-no9C)#ZXXqAm6^Gj^wz;X$GjP1_Uz(enZ*~s|FEE;8HQ!A zZshL%0T2xjhj<@=(rNWXtxr!S!V#fatFx-o^;Y517zqrnvZt<%zJ zm2e&aj@u7Mgb)wL-&Zvjk8XY42OtU|0OZ4)*OQ4pBN83k5FXgH?7J6nRH2h_+R5*dH5u+0TKJR?Hy6HxJeb2(v)KYd4!0JZM zu%f3qZ@Iob9-5gzsNv0gMC&yOuK{3IIBmGZGlI9kbeA|43T9{>OV07*qoM6N<$f`cPJ AO8@`> literal 0 HcmV?d00001 diff --git a/mods/bakedclay/textures/baked_clay_terracotta_cyan.png b/mods/bakedclay/textures/baked_clay_terracotta_cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..13ebba71aa5a42f77de75f978e49ee45332595d4 GIT binary patch literal 661 zcmV;G0&4wQK_gnx;eTz=;G9+i%zai zb#wC%a1tjA4hAZv3Wd-#X_}->NzT3ZoZ}Emi@x*cg$JHT%CA-dSuC|aeFj*0M;w#M z%=CUY-o6Kl3pGIByo%Q8mv!BqoWP7KP<{TaIbHi-t3pIJ5BT9w-@2wSBLHyyes!k~ z{Hp=*NrExH*OSWH8sL96WU++zDvFvPKAz}6V=Z_BjZJ-Q6vnhRcG_C)ZFjwML92z< z#f4g@Iz7@sf(H*^Q^1>%@|%0*)B((zLTx$Bg16iSZx=8gPgG&Q@Kir8%`U zHx3$vp@>wTJOKFq)r2|)f&iP2HK2B9uk6lWFQ+b2p-U1`3X$^T`{SR;y3=~*!s z#2Zsc4h9oNR$l9IL8$-|c=6ta*6sgl4U|}XvD;OJNES=3->*_{f;ui=P-+;4lh)#29rpd^-grBer^}k-%UGM~cG_EYfH$i^<6G0TlzuB4TUv_D*HCPqWVp$0$h=iDWA;!R6pTpPik-YK3L@|*olcolO zT$IKVz%G=6(%miH?(EEXG4))Xlk+>t_nmXdyZ0LaxI+MRf7}A7z9^V{yRiwN7d9y; zLEom#s+MaO0Qc!K0GX&%+REDu|Krn#?*~V_0Cb1yJ8w zH^Zfh&p4$VloJ3^sN1JsWulmA*B0D^qutpuI%jRltlXThG?`!ar2qi`CZQZrsMl6q zS}f&;{Yn4gis!~T`;ig4|Lu~cBdt(ebhLus4*+O|`TJE`S(&v9sruG>5D7!?eQw1Q zm5j4b>X{_g*Qfr~FDJZ7`vW$(8nES;_W*Rgj-kJNY?dlMfQ#dN6wvEae{kZY($?dR zB%5baB-5S9MCIoEz0WOE4o)0E{`IExQe9C_rO*Iqv6LH}jWYI)l5u(_iog{vySXtYRO~&caD~O4f0!wwZ@&=`fU#j?n6Nhmc1q#6BVM@em zyRpdt7|~LoxaeeT>-W#wp;x#I1>?xu3`i&^qaZOD>xE6jiAV!5bUab+7Rly`6ba>I zJd%mflmo!jw21V0B>juf(9d>=6qa#09?A0-qfDA3vb#Ty(!D6ul!J1_6See8Nnrsv zYq3#~XiW%Fgpi?E=-6$GGRs|jo0%a}fTsz7RBB3#Sd}XN12-sD{8ZX{y|Y1?#il<< w9$@ z&1%A65Jl&m1R)DSD4`%&+dwxKiVK%+>_QiPjx4gsyY}djYX}{NWWF!=&d;6H>#kci zD|{G+aU2Q0PG@|vY(Dni1joxSn837P^l!MoB zH_;MS>$cs#dnB-II5&dHUN&#s+6*x_#sp3!vr?TRI58kECCGPro)uYacf1>X8Vk+( zI2kKw0|mg)O#&dGQQ}5OSJrhZo@&5gxMGl{W;((#y?e|U*;NH6$HuIKMF7(KA5=QA zf#~Q|?#GF#@Els7Y45(=2~gE5antR{aTq5dw{kyPGKYJyh$>;Up2a_8ou<#N+i-VN aG{GPJU<)3H_kW@Q0000jEvm? literal 0 HcmV?d00001 diff --git a/mods/bakedclay/textures/baked_clay_terracotta_green.png b/mods/bakedclay/textures/baked_clay_terracotta_green.png new file mode 100644 index 0000000000000000000000000000000000000000..20a10e361d9f3a4e5fd94cdcab58d0c204b2307b GIT binary patch literal 575 zcmV-F0>J%=P)xD;fB~y?(}!katT0v{~fAeadSx>0F9vv-oAbVKyp*X z2|u5l`MxPTj5q*V7HiP=8wYUc9ecett)uz6$SRt*EEcMOB#9O;b-pRIXsG_E6V2BE zX4C9Z^#Z{2{ht7$DDO(g8}wD2tk|{q_c?#mnN2e~1~9+Eie3K)@XeYaO%n$dV_w0Cf{oU6$jwy@P~?% z$GQ$g#Yuyvomvt_MpmZfGFreJ91)bHH)RM)esObI=31J3HqGvPFHPRE*xl_mRDmFy zDa(_K)2?&?kco{FsxZ6_q9_+#>1+!9;r-XPZIGdoo6+Km&~$g5X_W6;t{_DHF?Fuu zgvw}i7g?YbH!ct+16tfC!0dIZG)hD`1^B16;RkO-Tibs`2&3r^Vp3yWi0>z N002ovPDHLkV1kG-`~Cm` literal 0 HcmV?d00001 diff --git a/mods/bakedclay/textures/baked_clay_terracotta_grey.png b/mods/bakedclay/textures/baked_clay_terracotta_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..a51e1daf2628e89a4d8ae79c4ac22955fa2f9ee3 GIT binary patch literal 659 zcmV;E0&M+>P)1cW4Xm6ke0Bw&VkM;G1u6|y?@>tSr$bR0M~U5!{D5c$74c>`Yk;_ zKLfCB+cZr8zV91`K`9kNL{X#`=A7g2`;(wTX0w^f@qOR6Z7F3KhUz5cS+CdS!YZXq zl7unl`~GAyQ40h?FdPm6FviyF_1)baA%rXziztfr`#k{1aWqYH948Dz&+`D(YPHd5 zq}^^mJUraq-hO|76GAqdO|4d|R;!PXkMsHb{{CLmG{vpaXzcg0=QnUKR-W%!9YrB+jghZQCGRHtGFEw2hwV_&gZj~GS71Wnx@^{+`PZPyRMsM znGnLVEWBE+YdEdT&1;7Opl?EVdBPzW=8UQQVRMCf>sC065P5_+#X!-O*D#HciE&%}G z5^4iWpHvB8lZy0V>)K~x-g@&h3}1USRtLoe12F6nU~Jp+c!?tbxJH%4JgWg3nlpO* zlo9vw1xD_MvDSyDPPaFn#WbG9MwR$`Z0-5HAnpS&G9Sh|N&=@pBIa#UK|$APH7eEPdKy7#VV?aRtAh%<&gIR>$h?V?`}ZF*+mNCpcy&DmV6(3cUhaFM(*M)YCKau}cAhr3 be>Hyqv~&McxagY400000NkvXXu0mjfo)r1o literal 0 HcmV?d00001 diff --git a/mods/bakedclay/textures/baked_clay_terracotta_magenta.png b/mods/bakedclay/textures/baked_clay_terracotta_magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6eb3a54b2b0bc75eac286518b5e28d583dc399 GIT binary patch literal 275 zcmV+u0qp*XP)GN~#1 zgm+f5uovd?q%h_W`74 zAne5+0=3p{qepLj3iBI9CH1)ww0MPQdZ41*5gZUMkABV-ODRxYNkxv6o&z0%c zRfNtt0A@0rj*m}jK+=k!z|`lCMI%6HOXM84REwqT1ou|RSS&kITe$Gl$fqMPqQL+> zSf{Yc<8AqH4T#WgU1^<;05J4;kxbhOraqa44ZQ*OcV#@W*~bv34d`aB-IB|Ww4Z#? zoL*OHT(7Gd0nPqGL74XONzG2s>#7S+g@b1Hpt89oHMG}Nn_Duq5ESnpMJWrbO#P@C z`Qn{e&(A+TixRfH({q)wX!a4|&&ud^QJdB&wUg{Y1@O;~!tcLcep0~w>!d7s6J)KjEdLZ$^)_)QWoA{#xpbr*el$PYW)^O=r8{$4`>gmc9{4$E2NjA_tI#$ sR5SLnQgg}!#xvT(%ZQp2ThgEHKiK2cp%j!?R{#J207*qoM6N<$g0VLjS^xk5 literal 0 HcmV?d00001 diff --git a/mods/bakedclay/textures/baked_clay_terracotta_pink.png b/mods/bakedclay/textures/baked_clay_terracotta_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..8f010ac7ec859b5c13d706e9cae8f3f5b681ff4e GIT binary patch literal 409 zcmV;K0cQS*P)#BO}2LJ%}xfLZl9_ak=EVQU>!}8%% z1t6xA)Bu?1w~x@Y@?y&(NsTi1w=r$Yf(Za&PK9hosR3ZiLj6e#${c%mLmirSK}Ulr zHOO}2C-2^0J5AnY-bq%Tbe$^ne3kC1+Li@x8Tx@XNod)X9{Yhkyy!NGD4arzHST0f z^A4GJIy)Z3^G_0Pa-Unx7m;_@kF}XCy_0up%EK+q!6-H4-HPVksegJA!|MMDO?x_B zVtV-cR$WyK%C@emMO@JU6xSLL9{WMWeQqcE^TMaUp#I!`MwZH(00000NkvXXu0mjf DLJ+Es literal 0 HcmV?d00001 diff --git a/mods/bakedclay/textures/baked_clay_terracotta_red.png b/mods/bakedclay/textures/baked_clay_terracotta_red.png new file mode 100644 index 0000000000000000000000000000000000000000..ee46623b0ebb33b977eea6b0aa1443a5a1824d44 GIT binary patch literal 292 zcmV+<0o(qGP)e) zI|>3p5JcxD$|4#Fnj4CliIJ!A27+Md4GayvgD7|-pS-1P6?&KcR839Sw8LlJaHjx1Y+*1rMbx!pjx&L?sjpR=4nkfWdugmAtHB)0sgFF_8`>cEz9 zTQ0mFc}65HEB+9OYyu5HuOOQ9D6#{$qI3<=v7x_G(CnJk;h@Rr$AcE99e@yIAC4Y` z)2LODQ=chK16Z$+Tg8w{h|3>a9akMX?i~fox2^Z%E}T5GeAUvS1pFq*sc$Sg?s>Mz qMq&2_b9-C=IiMA+XyOH@1}3PZ$5q<^0000>tpz;Mr5@ zkf~e8`UiON&_Ic53(2dcOPK?|qMbJejCmtJR(HYzP3r zpfdt6o(<2fJ^(*nd2&L(&aFNNkjiAe42TgH$E} z4xOVgSR6V>zcqNf> zl3RUxP^&v(u%KZ`1JP&3g)WR~IF-l%uvbrdgU*Ol6_P%G|L|PCaZOtn27qZeE%6Fn zaW_M)?ocZlnre30ZvZdZTZO3{qG36yOxR^_Nhp98?|O1V4T~!p{5{e0C}>!YC{Wk5 z0U++)??W=Sa#P}!G`~${A_~jMlQZ+ei$E6B`A+_!Rb^!W;(nIoU`bSq)B&`u=8xzn z1qDD*mR@w{Ab@B4Q-!PhJXKlwuD2W4w27vT0N}}qi@q+5tD9?usav^eTTO~Ql?esB&r@9(5=%i(g=mS4Ly+hP z{1Iu8$XeD5+H(j|&}n|FFtr#|7YXD9ZhVE1#-s_j%Q1YSgcvo#T|y3E3yjF} zihaKb@881U)weTatyjY^003aE1>l^+zp~c0ZEKA2-k;BBrId3n10baoLVS;DVXb8vfYy4m*#LOGUMXH#mg6`UMX@Xk z01y!odGDubqOY2!>3BR2!$3s*^xhMZU@szizuzgkbFS+;DP>ufsj0ONA!KYMg!pv? z+O`F-+wC5Y2Y(6Y3?Xz~moZcn#dq$is^)o)F(z&2T;KP`nBM`VlrbiRz}bUFdZc=P|Ge`o+r z)AW6xIp?m|Yg#kkiPoB(6CFZel`PRkQSe#1s~BUVyRI|FR8_SiqV$Kdb~@&M(=-6? z_xtDbIUEkFVHm#CCmKMW=j-+QcDwN&_xt_x`TPN$ObDF$Bu#Mu0000AEma{9DddI>p+hDEP65|0+0+arLm_c0w|6-lyA%hB zWQ$8nhuSVyQYVMDlu}LzAr-U*HD~<~k@LLk@E?};pWgr8_ul*7dmr)4ecLpZtN{Ql z1pw}lcXTCd_~SYN5-(Y;GT%D&JO==oy-o-;@93_x2+0rRJzac*DuC501F+IX$|A%c z*ZvEyZQjv^N7gjkG(C4QNfwDeuGw8fRQ1Po5-GcFi9SbdY>uldG4ID2xSo}7B3Vb?*(I6t+Lpr=gt98 zD&7D6K0bMM@8=o0Z77r?y0g1hl-)IaXX-i&^`LRn`*0_u#QHA)OgB$fOHTTqo=2}M zl!e9p1A$Nlp%j3d?{Dt@cnN@SodQq?Rkm94NwSz2UD&26Yg%v+DR!GU6jK7QA3h_1 zd{u!IrT{35j1q?cAZ27tlQqqErb5h=MVJ&`ExCMEVN!UydGZHKQ6Az`)`oci0000< KMNUMnLSTYUG#?}Y literal 0 HcmV?d00001 diff --git a/mods/bridger/.luacheckrc b/mods/bridger/.luacheckrc new file mode 100644 index 00000000..8bfd380b --- /dev/null +++ b/mods/bridger/.luacheckrc @@ -0,0 +1,15 @@ + +globals = { + "minetest", +} + +read_globals = { + -- Builtin + "vector", + + -- Mod Deps + "default", + "stairsplus", + "stairs", + "mesecon", +} diff --git a/mods/bridger/README.md b/mods/bridger/README.md new file mode 100644 index 00000000..e1e19fee --- /dev/null +++ b/mods/bridger/README.md @@ -0,0 +1,7 @@ +# Bridger [bridger] + +[![luacheck](https://github.com/v-rob/bridger/workflows/luacheck/badge.svg)](https://github.com/v-rob/bridger/actions) + +Adds a large number of advanced nodes conducive to building large, industrial bridges to [Minetest](https://www.minetest.net). Also see the [forum post](https://forum.minetest.net/viewtopic.php?t=18243). + +![](screenshot.png?raw=true) diff --git a/mods/bridger/alias.lua b/mods/bridger/alias.lua index e63e1f3d..f9ea4634 100644 --- a/mods/bridger/alias.lua +++ b/mods/bridger/alias.lua @@ -61,7 +61,8 @@ for _, color in pairs(bridger_colors) do minetest.register_alias("bridges:" .. prefix .. oldname, "bridger:" .. prefix .. "_" .. newname) end - minetest.register_alias("bridges:truss_superstructure_simple_end" .. oldname, "bridger:truss_superstructure_simple_end_left_" .. newname) + minetest.register_alias("bridges:truss_superstructure_simple_end" .. oldname, + "bridger:truss_superstructure_simple_end_left_" .. newname) minetest.register_alias("bridges:girder_left_end" .. oldname, "bridger:girder_left_" .. newname) end diff --git a/mods/bridger/crafts.lua b/mods/bridger/crafts.lua index 0224136e..458cde6d 100644 --- a/mods/bridger/crafts.lua +++ b/mods/bridger/crafts.lua @@ -28,7 +28,7 @@ minetest.register_craft({ } }) -if minetest.settings:get_bool("bridger_enable_trusses") then +if minetest.settings:get_bool("bridger_enable_trusses", true) then minetest.register_craftitem("bridger:bridges_steel_rod", { description = "Steel Rod", inventory_image = "bridges_steel_rod.png", @@ -174,7 +174,11 @@ if minetest.settings:get_bool("bridger_enable_trusses") then minetest.register_craft({ output = "bridger:corrugated_steel_ceiling_" .. bridge_color .. " 3", recipe = { - {"bridger:corrugated_steel" .. bridge_color, "bridger:corrugated_steel" .. bridge_color, "bridger:corrugated_steel" .. bridge_color}, + { + "bridger:corrugated_steel" .. bridge_color, + "bridger:corrugated_steel" .. bridge_color, + "bridger:corrugated_steel" .. bridge_color + }, } }) @@ -204,7 +208,11 @@ if minetest.settings:get_bool("bridger_enable_trusses") then minetest.register_craft({ output = "bridger:corrugated_steel_ceiling_" .. bridge_color .. " 3", recipe = { - {"bridger:corrugated_steel" .. bridge_color, "bridger:corrugated_steel" .. bridge_color, "bridger:corrugated_steel" .. bridge_color}, + { + "bridger:corrugated_steel" .. bridge_color, + "bridger:corrugated_steel" .. bridge_color, + "bridger:corrugated_steel" .. bridge_color + }, } }) @@ -324,13 +332,19 @@ if minetest.settings:get_bool("bridger_enable_trusses") then minetest.register_craft({ output = "bridger:truss_superstructure_mid_" .. bridge_color, type = "shapeless", - recipe = {"bridger:truss_superstructure_left_slant_" .. bridge_color, "bridger:truss_superstructure_right_slant_" .. bridge_color}, + recipe = { + "bridger:truss_superstructure_left_slant_" .. bridge_color, + "bridger:truss_superstructure_right_slant_" .. bridge_color + }, }) minetest.register_craft({ output = "bridger:truss_superstructure_tall_mid_" .. bridge_color, type = "shapeless", - recipe = {"bridger:truss_superstructure_tall_left_slant_" .. bridge_color, "bridger:truss_superstructure_tall_right_slant_" .. bridge_color}, + recipe = { + "bridger:truss_superstructure_tall_left_slant_" .. bridge_color, + "bridger:truss_superstructure_tall_right_slant_" .. bridge_color + }, }) minetest.register_craft({ @@ -405,7 +419,10 @@ if minetest.settings:get_bool("bridger_enable_trusses") then minetest.register_craft({ output = "bridger:truss_substructure_mid_" .. bridge_color, type = "shapeless", - recipe = {"bridger:truss_substructure_left_slant_" .. bridge_color, "bridger:truss_substructure_right_slant_" .. bridge_color}, + recipe = { + "bridger:truss_substructure_left_slant_" .. bridge_color, + "bridger:truss_substructure_right_slant_" .. bridge_color + }, }) minetest.register_craft({ @@ -684,161 +701,161 @@ if minetest.settings:get_bool("bridger_enable_trusses") then } for c in ipairs(bridge_nodes) do - local bridge_nodes = bridge_nodes[c] + local bridge_node = bridge_nodes[c] minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "white", + output = "bridger:" .. bridge_node .. "white", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:white"}, + recipe = {"bridger:" .. bridge_node .. "yellow", "dye:white"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "white", + output = "bridger:" .. bridge_node .. "white", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "steel", "dye:white"}, + recipe = {"bridger:" .. bridge_node .. "steel", "dye:white"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "white", + output = "bridger:" .. bridge_node .. "white", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "green", "dye:white"}, + recipe = {"bridger:" .. bridge_node .. "green", "dye:white"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "white", + output = "bridger:" .. bridge_node .. "white", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "red", "dye:white"}, + recipe = {"bridger:" .. bridge_node .. "red", "dye:white"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "red", + output = "bridger:" .. bridge_node .. "red", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "white", "dye:red"}, + recipe = {"bridger:" .. bridge_node .. "white", "dye:red"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "red", + output = "bridger:" .. bridge_node .. "red", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "steel", "dye:red"}, + recipe = {"bridger:" .. bridge_node .. "steel", "dye:red"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "red", + output = "bridger:" .. bridge_node .. "red", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "green", "dye:red"}, + recipe = {"bridger:" .. bridge_node .. "green", "dye:red"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "red", + output = "bridger:" .. bridge_node .. "red", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:red"}, + recipe = {"bridger:" .. bridge_node .. "yellow", "dye:red"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "green", + output = "bridger:" .. bridge_node .. "green", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "white", "dye:green"}, + recipe = {"bridger:" .. bridge_node .. "white", "dye:green"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "green", + output = "bridger:" .. bridge_node .. "green", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "steel", "dye:green"}, + recipe = {"bridger:" .. bridge_node .. "steel", "dye:green"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "green", + output = "bridger:" .. bridge_node .. "green", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:green"}, + recipe = {"bridger:" .. bridge_node .. "yellow", "dye:green"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "green", + output = "bridger:" .. bridge_node .. "green", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "red", "dye:green"}, + recipe = {"bridger:" .. bridge_node .. "red", "dye:green"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "steel", + output = "bridger:" .. bridge_node .. "steel", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "white", "dye:black"}, + recipe = {"bridger:" .. bridge_node .. "white", "dye:black"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "steel", + output = "bridger:" .. bridge_node .. "steel", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:black"}, + recipe = {"bridger:" .. bridge_node .. "yellow", "dye:black"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "steel", + output = "bridger:" .. bridge_node .. "steel", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "green", "dye:black"}, + recipe = {"bridger:" .. bridge_node .. "green", "dye:black"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "steel", + output = "bridger:" .. bridge_node .. "steel", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "red", "dye:black"}, + recipe = {"bridger:" .. bridge_node .. "red", "dye:black"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "steel", + output = "bridger:" .. bridge_node .. "steel", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "white", "dye:dark_grey"}, + recipe = {"bridger:" .. bridge_node .. "white", "dye:dark_grey"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "steel", + output = "bridger:" .. bridge_node .. "steel", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:dark_grey"}, + recipe = {"bridger:" .. bridge_node .. "yellow", "dye:dark_grey"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "steel", + output = "bridger:" .. bridge_node .. "steel", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "green", "dye:dark_grey"}, + recipe = {"bridger:" .. bridge_node .. "green", "dye:dark_grey"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "steel", + output = "bridger:" .. bridge_node .. "steel", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "red", "dye:dark_grey"}, + recipe = {"bridger:" .. bridge_node .. "red", "dye:dark_grey"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "yellow", + output = "bridger:" .. bridge_node .. "yellow", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "white", "dye:yellow"}, + recipe = {"bridger:" .. bridge_node .. "white", "dye:yellow"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "yellow", + output = "bridger:" .. bridge_node .. "yellow", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "steel", "dye:yellow"}, + recipe = {"bridger:" .. bridge_node .. "steel", "dye:yellow"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "yellow", + output = "bridger:" .. bridge_node .. "yellow", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "green", "dye:yellow"}, + recipe = {"bridger:" .. bridge_node .. "green", "dye:yellow"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "yellow", + output = "bridger:" .. bridge_node .. "yellow", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "red", "dye:yellow"}, + recipe = {"bridger:" .. bridge_node .. "red", "dye:yellow"}, }) minetest.register_craft({ - output = "bridger:" .. bridge_nodes .. "red", + output = "bridger:" .. bridge_node .. "red", type = "shapeless", - recipe = {"bridger:" .. bridge_nodes .. "yellow", "dye:red"}, + recipe = {"bridger:" .. bridge_node .. "yellow", "dye:red"}, }) end end -if minetest.settings:get_bool("bridger_enable_trestles") then +if minetest.settings:get_bool("bridger_enable_trestles", true) then minetest.register_craft({ output = "bridger:trestle_support_small", recipe = { @@ -908,7 +925,7 @@ if minetest.settings:get_bool("bridger_enable_trestles") then }) end -if minetest.settings:get_bool("bridger_enable_wooden_bridges") then +if minetest.settings:get_bool("bridger_enable_wooden_bridges", true) then minetest.register_craft({ output = "bridger:small_beam", recipe = { diff --git a/mods/bridger/description.txt b/mods/bridger/description.txt index 4b827bae..8f7b41cd 100644 --- a/mods/bridger/description.txt +++ b/mods/bridger/description.txt @@ -1 +1 @@ -A mod that adds various bridge nodes to Minetest. \ No newline at end of file +Adds a large number of advanced nodes conducive to building large, industrial bridges. diff --git a/mods/bridger/nodes.lua b/mods/bridger/nodes.lua index 88fc6008..37f3842f 100644 --- a/mods/bridger/nodes.lua +++ b/mods/bridger/nodes.lua @@ -23,7 +23,7 @@ local function rotate_and_place(itemstack, placer, pointed_thing) return minetest.item_place(itemstack, placer, pointed_thing, param2) end -if not minetest.settings:get_bool("bridger_disable_trusses") then +if minetest.settings:get_bool("bridger_enable_trusses", true) then local bridge_colors = { {"Green", "green"}, {"Red", "red"}, @@ -34,7 +34,7 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then for _, row in ipairs(bridge_colors) do local bridge_desc = row[1] - local bridge_colors = row[2] + local bridge_color = row[2] minetest.register_node("bridger:foundation", { description = "Bridge Foundation", @@ -61,39 +61,39 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_stone_defaults(), }) - minetest.register_node("bridger:block_" .. bridge_colors, { + minetest.register_node("bridger:block_" .. bridge_color, { description = bridge_desc .. " Block", drawtype = "normal", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", groups = {cracky=3}, sounds = default.node_sound_metal_defaults(), }) if minetest.get_modpath("moreblocks") then - stairsplus:register_all("bridger", "block_" .. bridge_colors, "bridger:block_" .. bridge_colors, { + stairsplus:register_all("bridger", "block_" .. bridge_color, "bridger:block_" .. bridge_color, { description = bridge_desc, - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, groups = {cracky=3}, sounds = default.node_sound_metal_defaults(), }) - minetest.register_alias("bridger:step_" .. bridge_colors, "bridger:panel_block_" .. bridge_colors) + minetest.register_alias("bridger:step_" .. bridge_color, "bridger:panel_block_" .. bridge_color) elseif minetest.get_modpath("stairs") then stairs.register_stair_and_slab( - "block_" .. bridge_colors, - "bridger:block_" .. bridge_colors, + "block_" .. bridge_color, + "bridger:block_" .. bridge_color, {cracky=3}, - {"bridges_" .. bridge_colors .. ".png"}, + {"bridges_" .. bridge_color .. ".png"}, bridge_desc .. " Stair", bridge_desc .. " Slab", default.node_sound_metal_defaults() ) - minetest.register_node("bridger:step_" .. bridge_colors, { + minetest.register_node("bridger:step_" .. bridge_color, { description = bridge_desc .. " Step", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", paramtype2 = "facedir", node_box = { @@ -113,10 +113,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then }) end - minetest.register_node("bridger:suspension_top_" .. bridge_colors, { + minetest.register_node("bridger:suspension_top_" .. bridge_color, { description = bridge_desc .. " Cable Top", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", paramtype2 = "facedir", node_box = { @@ -136,10 +136,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then end, }) - minetest.register_node("bridger:suspension_cable_" .. bridge_colors, { + minetest.register_node("bridger:suspension_cable_" .. bridge_color, { description = bridge_desc .. " Cable", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", node_box = { type = "fixed", @@ -151,10 +151,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:deck_" .. bridge_colors, { + minetest.register_node("bridger:deck_" .. bridge_color, { description = bridge_desc .. " Deck", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", sunlight_propagates = true, node_box = { @@ -173,10 +173,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:deck_edge_" .. bridge_colors, { + minetest.register_node("bridger:deck_edge_" .. bridge_color, { description = bridge_desc .. " Deck Edge", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -197,10 +197,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:train_deck_" .. bridge_colors, { + minetest.register_node("bridger:train_deck_" .. bridge_color, { description = bridge_desc .. " Train Deck", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", sunlight_propagates = true, node_box = { @@ -247,10 +247,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:girder_mid_" .. bridge_colors, { + minetest.register_node("bridger:girder_mid_" .. bridge_color, { description = bridge_desc .. " Girder Middle", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -275,10 +275,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:girder_right_" .. bridge_colors, { + minetest.register_node("bridger:girder_right_" .. bridge_color, { description = bridge_desc .. " Girder Right End", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -315,10 +315,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:girder_left_" .. bridge_colors, { + minetest.register_node("bridger:girder_left_" .. bridge_color, { description = bridge_desc .. " Girder Left End", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, + tiles = {"bridges_" .. bridge_color .. ".png"}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -355,12 +355,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_right_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_right_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Right Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -420,12 +422,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_left_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_left_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Left Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -485,12 +489,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_end_right_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_end_right_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure End Right Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -548,12 +554,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_end_left_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_end_left_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure End Left Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -611,12 +619,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_mid_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_mid_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Middle", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_mid.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_mid.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_mid.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_mid.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -707,12 +717,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_tall_right_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_tall_right_slant_" .. bridge_color, { description = bridge_desc .. " Tall Truss Superstructure Right Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -770,12 +782,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_tall_left_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_tall_left_slant_" .. bridge_color, { description = bridge_desc .. " Tall Truss Superstructure Left Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -833,12 +847,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_tall_mid_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_tall_mid_" .. bridge_color, { description = bridge_desc .. " Tall Truss Superstructure Middle", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -925,12 +941,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_tall_simple_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_tall_simple_" .. bridge_color, { description = bridge_desc .. " Tall Truss Superstructure Middle Simple", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1016,12 +1034,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_tall_simple_end_left_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_tall_simple_end_left_" .. bridge_color, { description = bridge_desc .. " Tall Truss Superstructure Simple Left End", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1035,12 +1055,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_tall_simple_end_right_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_tall_simple_end_right_" .. bridge_color, { description = bridge_desc .. " Tall Truss Superstructure Simple Right End", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1054,12 +1076,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_simple_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_simple_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Middle Simple", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_simple.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_simple.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1150,12 +1174,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_simple_end_left_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_simple_end_left_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Simple Left End", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1169,12 +1195,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_simple_end_right_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_simple_end_right_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Simple Right End", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1188,12 +1216,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_up_right_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_up_right_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Up Right Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1268,12 +1298,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_up_left_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_up_left_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Up Left Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1346,12 +1378,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_up_mid_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_up_mid_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Up Middle", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1455,12 +1489,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_up_simple_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_up_simple_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Up Simple", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1562,12 +1598,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_down_right_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_down_right_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Down Right Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1640,12 +1678,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_down_left_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_down_left_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Down Left Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1720,12 +1760,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_down_mid_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_down_mid_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Down Middle", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1829,12 +1871,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_down_simple_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_down_simple_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Down Simple", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1936,12 +1980,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_substructure_end_right_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_substructure_end_right_slant_" .. bridge_color, { description = bridge_desc .. " Truss Substructure End Right Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -1998,12 +2044,14 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_substructure_end_left_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_substructure_end_left_slant_" .. bridge_color, { description = bridge_desc .. " Truss Substructure End Left Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. + ".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. + ".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2060,12 +2108,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_substructure_right_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_substructure_right_slant_" .. bridge_color, { description = bridge_desc .. " Truss Substructure Right Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_right_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_right_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_right_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2123,12 +2171,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_substructure_left_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_substructure_left_slant_" .. bridge_color, { description = bridge_desc .. " Truss Substructure Left Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_left_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_left_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_left_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2187,12 +2235,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_substructure_simple_" .. bridge_colors, { + minetest.register_node("bridger:truss_substructure_simple_" .. bridge_color, { description = bridge_desc .. " Truss Substructure Simple", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_simple.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_simple.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_simple.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_simple.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2275,12 +2323,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_substructure_mid_" .. bridge_colors, { + minetest.register_node("bridger:truss_substructure_mid_" .. bridge_color, { description = bridge_desc .. " Truss Substructure Middle", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_mid.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_substructure_mid.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_mid.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_substructure_mid.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2365,12 +2413,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:small_upper_chord_" .. bridge_colors, { + minetest.register_node("bridger:small_upper_chord_" .. bridge_color, { description = bridge_desc .. " Small Upper Chord", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_small_upper_chord.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_small_upper_chord.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_small_upper_chord.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_small_upper_chord.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2418,12 +2466,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:small_upper_chord_slanted_" .. bridge_colors, { + minetest.register_node("bridger:small_upper_chord_slanted_" .. bridge_color, { description = bridge_desc .. " Small Slanted Upper Chord", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2522,12 +2570,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:medium_upper_chord_" .. bridge_colors, { + minetest.register_node("bridger:medium_upper_chord_" .. bridge_color, { description = bridge_desc .. " Medium Upper Chord", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_upper_chord.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_upper_chord.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_medium_upper_chord.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_medium_upper_chord.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2607,12 +2655,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:medium_upper_chord_slanted_" .. bridge_colors, { + minetest.register_node("bridger:medium_upper_chord_slanted_" .. bridge_color, { description = bridge_desc .. " Medium Slanted Upper Chord", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2723,12 +2771,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:large_upper_chord_" .. bridge_colors, { + minetest.register_node("bridger:large_upper_chord_" .. bridge_color, { description = bridge_desc .. " Large Upper Chord", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_large_upper_chord.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_large_upper_chord.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_large_upper_chord.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_large_upper_chord.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2804,12 +2852,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:large_upper_chord_slanted_" .. bridge_colors, { + minetest.register_node("bridger:large_upper_chord_slanted_" .. bridge_color, { description = bridge_desc .. " Large Slanted Upper Chord", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -2920,12 +2968,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:small_support_" .. bridge_colors, { + minetest.register_node("bridger:small_support_" .. bridge_color, { description = bridge_desc .. " Small Support", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_small_support.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_small_support.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_small_support.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_small_support.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3032,12 +3080,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:small_support_top_" .. bridge_colors, { + minetest.register_node("bridger:small_support_top_" .. bridge_color, { description = bridge_desc .. " Small Support Top", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_small_support_top.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_small_support_top.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_small_support_top.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_small_support_top.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3228,12 +3276,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:medium_support_" .. bridge_colors, { + minetest.register_node("bridger:medium_support_" .. bridge_color, { description = bridge_desc .. " Medium Support", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_support.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_support.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_medium_support.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_medium_support.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3339,12 +3387,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:medium_support_bot_" .. bridge_colors, { + minetest.register_node("bridger:medium_support_bot_" .. bridge_color, { description = bridge_desc .. " Bottom Medium Support", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_support_bot.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_medium_support_bot.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_medium_support_bot.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_medium_support_bot.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3365,12 +3413,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:large_support_" .. bridge_colors, { + minetest.register_node("bridger:large_support_" .. bridge_color, { description = bridge_desc .. " Large Support", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_large_support.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_large_support.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_large_support.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_large_support.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3483,12 +3531,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:large_support_bot_" .. bridge_colors, { + minetest.register_node("bridger:large_support_bot_" .. bridge_color, { description = bridge_desc .. " Bottom Large Support", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_large_support_bot.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_large_support_bot.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_large_support_bot.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_large_support_bot.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3509,12 +3557,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_right_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_right_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Right Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3574,12 +3622,12 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:truss_superstructure_left_slant_" .. bridge_colors, { + minetest.register_node("bridger:truss_superstructure_left_slant_" .. bridge_color, { description = bridge_desc .. " Truss Superstructure Left Slant", drawtype = "nodebox", - tiles = {"bridges_" .. bridge_colors .. ".png"}, - inventory_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", - wield_image = "bridges_" .. bridge_colors .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", + tiles = {"bridges_" .. bridge_color .. ".png"}, + inventory_image = "bridges_" .. bridge_color .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_" .. bridge_color .. ".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3639,10 +3687,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:corrugated_steel_" .. bridge_colors, { + minetest.register_node("bridger:corrugated_steel_" .. bridge_color, { description = bridge_desc .. " Corrugated Steel", drawtype = "nodebox", - tiles = {"bridges_corrugated_steel_" .. bridge_colors .. ".png"}, + tiles = {"bridges_corrugated_steel_" .. bridge_color .. ".png"}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3662,10 +3710,10 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then sounds = default.node_sound_metal_defaults(), }) - minetest.register_node("bridger:corrugated_steel_ceiling_" .. bridge_colors, { + minetest.register_node("bridger:corrugated_steel_ceiling_" .. bridge_color, { description = bridge_desc .. " Corrugated Steel Deck", drawtype = "nodebox", - tiles = {"bridges_corrugated_steel_" .. bridge_colors .. ".png^[transformR90"}, + tiles = {"bridges_corrugated_steel_" .. bridge_color .. ".png^[transformR90"}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -3681,7 +3729,7 @@ if not minetest.settings:get_bool("bridger_disable_trusses") then end end -if not minetest.settings:get_bool("bridger_disable_trestles") then +if minetest.settings:get_bool("bridger_enable_trestles", true) then minetest.register_node("bridger:trestle_support", { description = "Trestle Support", drawtype = "nodebox", @@ -4092,7 +4140,7 @@ if not minetest.settings:get_bool("bridger_disable_trestles") then }) end -if not minetest.settings:get_bool("bridger_disable_wooden_bridges") then +if minetest.settings:get_bool("bridger_enable_wooden_bridges", true) then minetest.register_node("bridger:small_beam", { description = "Small Wooden Beam Bridge", drawtype = "nodebox", @@ -4453,7 +4501,7 @@ if not minetest.settings:get_bool("bridger_disable_wooden_bridges") then local mesecon_on_blastnode = nil if minetest.get_modpath("mesecons") then - mesecons_on_blastnode = mesecon.on_blastnode + mesecon_on_blastnode = mesecon.on_blastnode end minetest.register_node("bridger:large_beam_swivel_normal", { diff --git a/mods/builtin_item/init.lua b/mods/builtin_item/init.lua index 8b3bc312..0688c633 100644 --- a/mods/builtin_item/init.lua +++ b/mods/builtin_item/init.lua @@ -441,7 +441,10 @@ core.register_entity(":__builtin:item", { step_gravity = function(self) - if self.falling_state then + local vel = self.object:get_velocity() + + -- apply gravity if falling or Y velocity not 0 (just incase) + if self.falling_state or (vel and vel.y ~= 0) then self.accel.y = self.accel.y - gravity end end, diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index c5742736..a72ab72f 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -138,7 +138,8 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, end local punch_interval = 1 - if tool_capabilities and tool_capabilities.full_punch_interval then + -- Faulty tool registrations may cause the interval to be set to 0 ! + if tool_capabilities and (tool_capabilities.full_punch_interval or 0) > 0 then punch_interval = tool_capabilities.full_punch_interval end time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval) diff --git a/mods/farming/crops/cocoa.lua b/mods/farming/crops/cocoa.lua index 1fc78757..1fb3194d 100644 --- a/mods/farming/crops/cocoa.lua +++ b/mods/farming/crops/cocoa.lua @@ -135,15 +135,11 @@ local def = { tiles = {"farming_cocoa_1.png"}, paramtype = "light", walkable = false, - drop = { - items = { - {items = {"farming:cocoa_beans 1"}, rarity = 2}, - } - }, selection_box = { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} }, + drop = {}, groups = { snappy = 3, flammable = 2, plant = 1, growing = 1, not_in_creative_inventory = 1, leafdecay = 1, leafdecay_drop = 1 diff --git a/mods/farming/crops/ryeoatrice.lua b/mods/farming/crops/ryeoatrice.lua index e1f6a727..090cd74b 100644 --- a/mods/farming/crops/ryeoatrice.lua +++ b/mods/farming/crops/ryeoatrice.lua @@ -18,6 +18,10 @@ minetest.override_item("farming:rye", { groups = {food_rye = 1, flammable = 4} }) +minetest.override_item("farming:rye_1", {drop = {}}) +minetest.override_item("farming:rye_2", {drop = {}}) +minetest.override_item("farming:rye_3", {drop = {}}) + minetest.register_craft({ output = "farming:flour", recipe = { @@ -42,6 +46,10 @@ minetest.override_item("farming:oat", { groups = {food_oats = 1, flammable = 4} }) +minetest.override_item("farming:oat_1", {drop = {}}) +minetest.override_item("farming:oat_2", {drop = {}}) +minetest.override_item("farming:oat_3", {drop = {}}) + minetest.register_craft({ output = "farming:flour", recipe = { @@ -66,6 +74,10 @@ minetest.override_item("farming:rice", { groups = {food_rice = 1, flammable = 4} }) +minetest.override_item("farming:rice_1", {drop = {}}) +minetest.override_item("farming:rice_2", {drop = {}}) +minetest.override_item("farming:rice_3", {drop = {}}) + minetest.register_craftitem("farming:rice_bread", { description = S("Rice Bread"), inventory_image = "farming_rice_bread.png", diff --git a/mods/farming/food.lua b/mods/farming/food.lua index a7f5af15..3be519e8 100644 --- a/mods/farming/food.lua +++ b/mods/farming/food.lua @@ -1,6 +1,34 @@ local S = farming.intllib +--= filter sea water into river water +minetest.register_craft({ + output = "bucket:bucket_river_water", + recipe = { + {"farming:hemp_fibre"}, + {"farming:hemp_fibre"}, + {"bucket:bucket_water"} + } +}) + +--= glass of water + +minetest.register_craftitem("farming:glass_water", { + description = S("Glass of Water"), + inventory_image = "farming_water_glass.png", + groups = {food_water_glass = 1, flammable = 3, vessel = 1} +}) + +minetest.register_craft({ + output = "farming:glass_water 4", + recipe = { + {"vessels:drinking_glass", "vessels:drinking_glass"}, + {"vessels:drinking_glass", "vessels:drinking_glass"}, + {"bucket:bucket_river_water", ""} + }, + replacements = {{"bucket:bucket_river_water", "bucket:bucket_empty"}} +}) + --= Sugar minetest.register_craftitem("farming:sugar", { diff --git a/mods/farming/license.txt b/mods/farming/license.txt index d05b1bd5..e7126bfd 100644 --- a/mods/farming/license.txt +++ b/mods/farming/license.txt @@ -176,3 +176,6 @@ Created by sirrobzeroone (CC0) Created by TechM8 (https://www.deviantart.com/techm8) farming_popcorn.png + +Created by RZR0 (CC-BY-NC-SA) + farming_blueberry_pie.png diff --git a/mods/farming/locale/farming.de.tr b/mods/farming/locale/farming.de.tr index a9183263..175990ec 100644 --- a/mods/farming/locale/farming.de.tr +++ b/mods/farming/locale/farming.de.tr @@ -21,7 +21,7 @@ Bottle of Hemp Oil=Flasche mit Hanföl Bowl of Chili=Chili Schale Bread=Brot Bronze Hoe=Bronzehacke -Cabbage=Salat +Cabbage=Weißkohl Cactus Juice=Kaktussaft Carrot=Möhre Carrot Juice=Möhrensaft @@ -61,7 +61,7 @@ Hemp Seed=Hanfsamen Hoe=Hacke Hoe Bomb (use or throw on grassy areas to hoe land)=Hackbombe (Auf Grasland werfen oder benutzen) Jack 'O Lantern (punch to turn on and off)=Kürbislaterne (Punch zum Ein- und Ausschalten) -Jaffa Cake=Jaffa-Torte +Jaffa Cake=Jaffakeks Juicer=Entsafter Melon=Melone Melon Slice=Melonenscheibe @@ -88,7 +88,7 @@ Pineapple=Ananas Pineapple Juice=Ananassaft Pineapple Ring=Ananasscheibe Pineapple Top=Ananasdeckel -Porridge=Brei +Porridge=Haferbrei Potato=Kartoffel Pumpkin=Kürbis Pumpkin Bread=Kürbisbrot diff --git a/mods/farming/locale/farming.zh_CN.tr b/mods/farming/locale/farming.zh_CN.tr index 3e9c2f94..88207055 100644 --- a/mods/farming/locale/farming.zh_CN.tr +++ b/mods/farming/locale/farming.zh_CN.tr @@ -60,7 +60,7 @@ Hemp Rope=麻绳 Hemp Seed=大麻籽 Hoe=锄头 Hoe Bomb (use or throw on grassy areas to hoe land)=锄弹(在草地上使用或扔在锄地上) -Jack 'O Lantern (punch to turn on and off)=杰克灯(按一下开关) +Jack 'O Lantern (punch to turn on and off)=南瓜灯(按一下开关) Jaffa Cake=佳发饼 Juicer=榨汁机 Melon=甜瓜 @@ -118,7 +118,7 @@ Steel Hoe=钢锄头 Stone Hoe=石锄 Straw=稻草 Strawberry=草莓 -String=字符串 +String=线 Sugar=糖 Toast=烤面包片 Toast Sandwich=三明治面包 diff --git a/mods/farming/locale/farming.zh_TW.tr b/mods/farming/locale/farming.zh_TW.tr index 5a8449b5..a72f7397 100644 --- a/mods/farming/locale/farming.zh_TW.tr +++ b/mods/farming/locale/farming.zh_TW.tr @@ -60,7 +60,7 @@ Hemp Rope=麻繩 Hemp Seed=大麻籽 Hoe=鋤頭 Hoe Bomb (use or throw on grassy areas to hoe land)=鋤彈(在草地上使用或扔在鋤地上) -Jack 'O Lantern (punch to turn on and off)=傑克燈(按一下開關) +Jack 'O Lantern (punch to turn on and off)=南瓜燈(按一下開關) Jaffa Cake=佳發餅 Juicer=榨汁機 Melon=甜瓜 @@ -118,7 +118,7 @@ Steel Hoe=鋼鋤頭 Stone Hoe=石鋤 Straw=稻草 Strawberry=草莓 -String=字符串 +String=線 Sugar=糖 Toast=烤麵包片 Toast Sandwich=三明治麵包 diff --git a/mods/farming/lucky_block.lua b/mods/farming/lucky_block.lua index 5a69a683..c6a2000d 100644 --- a/mods/farming/lucky_block.lua +++ b/mods/farming/lucky_block.lua @@ -72,6 +72,8 @@ if minetest.get_modpath("lucky_block") then {name = "farming:seed_rice", max = 15}, {name = "farming:seed_oat", max = 15}, {name = "farming:soil_wet", max = 10}, + {name = "farming:cotton_wild", max = 5}, + {name = "farming:grapebush", max = 5}, }}, }) end diff --git a/mods/farming/textures/farming_water_glass.png b/mods/farming/textures/farming_water_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..081f8d6e38845c5c09b4ada1682c936875ebac2a GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ%`eKGJoWUlOY`r?E&Kn08?L4Lsu4$p3+0XYtyE{-7_*OLgqC{VK~_=+0)d-l+Y$5Adq07uBo|FvSG`vrAwDKyiGDIWCJ>+dN+4W+j1U0pjix_ Lu6{1-oD!M 0 then + print("-- path length:" .. tonumber(#self.path.way)) + for _,pos in pairs(self.path.way) do minetest.add_particle({ pos = pos, @@ -3956,8 +3966,10 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter return end - -- mobs cannot spawn in protected areas when enabled - if not spawn_protected + -- check if mob can spawn inside protected areas + if (spawn_protected == false + or (spawn_monster_protected == false + and minetest.registered_entities[name].type == "monster")) and minetest.is_protected(pos, "") then --print("--- inside protected area", name) return diff --git a/mods/mobs_redo/api.txt b/mods/mobs_redo/api.txt index 25e27a9c..5a4f7cb5 100644 --- a/mods/mobs_redo/api.txt +++ b/mods/mobs_redo/api.txt @@ -699,6 +699,8 @@ External Settings for "minetest.conf" is false) 'mobs_spawn_protected' if set to false then mobs will not spawn in protected areas (default is true) + 'mobs_spawn_monster_protected' if set to false then monsters will not spawn in + protected areas (default is true) 'remove_far_mobs' if true then untamed mobs that are outside players visual range will be removed (default is true) 'mobname' can change specific mob chance rate (0 to disable) and diff --git a/mods/mobs_redo/crafts.lua b/mods/mobs_redo/crafts.lua index de452102..a28af9bf 100644 --- a/mods/mobs_redo/crafts.lua +++ b/mods/mobs_redo/crafts.lua @@ -10,7 +10,6 @@ minetest.register_craftitem("mobs:nametag", { if minetest.get_modpath("dye") and minetest.get_modpath("farming") then minetest.register_craft({ --- type = "shapeless", output = "mobs:nametag", recipe = {{"default:paper", "dye:black", "farming:string"}} }) @@ -149,7 +148,7 @@ minetest.register_craft({ -- make sure we can register fences -if default.register_fence then +if minetest.get_modpath("default") and default.register_fence then -- mob fence (looks like normal fence but collision is 2 high) default.register_fence("mobs:fence_wood", { @@ -165,6 +164,7 @@ default.register_fence("mobs:fence_wood", { } } }) +end -- mob fence top (has enlarged collisionbox to stop mobs getting over) minetest.register_node("mobs:fence_top", { @@ -197,8 +197,6 @@ minetest.register_craft({ } }) -end - -- items that can be used as fuel minetest.register_craft({ @@ -361,9 +359,9 @@ minetest.register_node("mobs:meatblock", { tiles = {"mobs_meat_top.png", "mobs_meat_bottom.png", "mobs_meat_side.png"}, paramtype2 = "facedir", groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = default.node_sound_leaves_defaults(), + sounds = default and default.node_sound_leaves_defaults(), on_place = minetest.rotate_node, - on_use = minetest.item_eat(20), + on_use = minetest.item_eat(20) }) minetest.register_craft({ diff --git a/mods/mobs_redo/depends.txt b/mods/mobs_redo/depends.txt index 2f208027..0c580bd4 100644 --- a/mods/mobs_redo/depends.txt +++ b/mods/mobs_redo/depends.txt @@ -1,4 +1,4 @@ -default +default? tnt? dye? farming? @@ -7,3 +7,4 @@ intllib? lucky_block? cmi? toolranks? +pathfinder? diff --git a/mods/mobs_redo/mod.conf b/mods/mobs_redo/mod.conf index 31a27edf..1760bd4f 100644 --- a/mods/mobs_redo/mod.conf +++ b/mods/mobs_redo/mod.conf @@ -1,4 +1,4 @@ name = mobs -depends = default -optional_depends = tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks +depends = +optional_depends = default, tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks, pathfinder description = Adds a mob api for mods to add animals or monsters etc. diff --git a/mods/mobs_redo/readme.MD b/mods/mobs_redo/readme.MD index d6469849..a2bfba7e 100644 --- a/mods/mobs_redo/readme.MD +++ b/mods/mobs_redo/readme.MD @@ -23,7 +23,7 @@ Lucky Blocks: 9 Changelog: -- 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence) +- 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence), add support for MarkBu's pathfinder mod, remove need for default mod - 1.54 - Simplified animal breeding function, added editable settings (thanks Wuzzy), Child mobs now take 20 mins to grow up, reverted to simple mob spawning with setting to use area checks, on_flop added, air_damage added. - 1.53 - Added 'on_map_load' settings to mobs:spawn so that mobs will only spawn when new areas of map are loaded. - 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game, diff --git a/mods/mobs_redo/settingtypes.txt b/mods/mobs_redo/settingtypes.txt index f97203e2..dae580da 100644 --- a/mods/mobs_redo/settingtypes.txt +++ b/mods/mobs_redo/settingtypes.txt @@ -13,6 +13,9 @@ mobs_griefing (Griefing Mobs) bool true # If false then Mobs no longer spawn inside player protected areas mobs_spawn_protected (Spawn Mobs in protected areas) bool true +# If false then Monsters no longer spawn inside player protected areas +mobs_spawn_monster_protected (Spawn Monsters in protected areas) bool true + # If true Mobs will be removed once a map chunk is out of view remove_far_mobs (Remove far Mobs) bool true diff --git a/mods/moreblocks/CHANGELOG.md b/mods/moreblocks/CHANGELOG.md index 1fe879ca..a441fdbd 100644 --- a/mods/moreblocks/CHANGELOG.md +++ b/mods/moreblocks/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [2.2.0] - 2021-06-28 + ### Changed - Refactored recipe override mechanism to avoid re-coding recipes @@ -131,7 +133,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Initial versioned release. -[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.1.0...HEAD +[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.2.0...HEAD +[2.2.0]: https://github.com/minetest-mods/moreblocks/compare/v2.1.0...v2.2.0 [2.1.0]: https://github.com/minetest-mods/moreblocks/compare/v2.0.0...v2.1.0 [2.0.0]: https://github.com/minetest-mods/moreblocks/compare/v1.3.0...v2.0.0 [1.3.0]: https://github.com/minetest-mods/moreblocks/compare/v1.2.0...v1.3.0 diff --git a/mods/moreores/CHANGELOG.md b/mods/moreores/CHANGELOG.md index ee88f2df..d57c03a0 100644 --- a/mods/moreores/CHANGELOG.md +++ b/mods/moreores/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [2.1.0] - 2021-06-28 + ### Added - More Ores tools now have [`toolranks`](https://github.com/lisacvuk/minetest-toolranks) support. @@ -61,6 +63,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Initial versioned release. -[Unreleased]: https://github.com/minetest-mods/moreores/compare/v2.0.0...HEAD +[Unreleased]: https://github.com/minetest-mods/moreores/compare/v2.1.0...HEAD +[2.1.0]: https://github.com/minetest-mods/moreores/compare/v2.0.0...v2.1.0 [2.0.0]: https://github.com/minetest-mods/moreores/compare/v1.1.0...v2.0.0 [1.1.0]: https://github.com/minetest-mods/moreores/compare/v1.0.0...v1.1.0 diff --git a/mods/plantlife_modpack/bushes/init.lua b/mods/plantlife_modpack/bushes/init.lua index 64a9adf0..a610667c 100644 --- a/mods/plantlife_modpack/bushes/init.lua +++ b/mods/plantlife_modpack/bushes/init.lua @@ -199,7 +199,7 @@ abstract_bushes.grow_bush_node = function(pos,dir, leaf_type) end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", "stoneage:grass_with_silex", @@ -244,7 +244,7 @@ abstract_bushes.grow_youngtree_node2 = function(pos, height) end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", "stoneage:grass_with_silex", diff --git a/mods/plantlife_modpack/bushes_classic/init.lua b/mods/plantlife_modpack/bushes_classic/init.lua index 353bdc76..a470a8f3 100644 --- a/mods/plantlife_modpack/bushes_classic/init.lua +++ b/mods/plantlife_modpack/bushes_classic/init.lua @@ -30,7 +30,7 @@ local modpath = minetest.get_modpath('bushes_classic') dofile(modpath..'/cooking.lua') dofile(modpath..'/nodes.lua') -biome_lib:spawn_on_surfaces({ +biome_lib.register_active_spawner({ spawn_delay = 3600, spawn_plants = bushes_classic.spawn_list, avoid_radius = 10, diff --git a/mods/plantlife_modpack/cavestuff/mapgen.lua b/mods/plantlife_modpack/cavestuff/mapgen.lua index 5c8aae39..92989bc1 100644 --- a/mods/plantlife_modpack/cavestuff/mapgen.lua +++ b/mods/plantlife_modpack/cavestuff/mapgen.lua @@ -1,6 +1,6 @@ --Map Generation Stuff -biome_lib:register_generate_plant( +biome_lib.register_on_generate( { surface = { "default:dirt_with_grass", @@ -20,7 +20,7 @@ biome_lib:register_generate_plant( } ) -biome_lib:register_generate_plant( +biome_lib.register_on_generate( { surface = { "default:desert_sand", diff --git a/mods/plantlife_modpack/dryplants/juncus.lua b/mods/plantlife_modpack/dryplants/juncus.lua index c945dcfc..0bfd635b 100644 --- a/mods/plantlife_modpack/dryplants/juncus.lua +++ b/mods/plantlife_modpack/dryplants/juncus.lua @@ -92,7 +92,7 @@ minetest.register_node("dryplants:juncus_02", { -- GENERATE SMALL JUNCUS ----------------------------------------------------------------------------------------------- -- near water or swamp -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", --"default:desert_sand", @@ -113,7 +113,7 @@ biome_lib:register_generate_plant({ abstract_dryplants.grow_juncus ) -- at dunes/beach -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { --"default:dirt_with_grass", --"default:desert_sand", diff --git a/mods/plantlife_modpack/dryplants/meadowvariation.lua b/mods/plantlife_modpack/dryplants/meadowvariation.lua index 9a3c3bc0..d11d7da9 100644 --- a/mods/plantlife_modpack/dryplants/meadowvariation.lua +++ b/mods/plantlife_modpack/dryplants/meadowvariation.lua @@ -12,7 +12,7 @@ abstract_dryplants.grow_grass_variation = function(pos) minetest.swap_node(right_here, {name="dryplants:grass_short"}) end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", }, diff --git a/mods/plantlife_modpack/dryplants/moregrass.lua b/mods/plantlife_modpack/dryplants/moregrass.lua index 46768e7c..e953c270 100644 --- a/mods/plantlife_modpack/dryplants/moregrass.lua +++ b/mods/plantlife_modpack/dryplants/moregrass.lua @@ -7,7 +7,7 @@ -- Looked at code from: default ----------------------------------------------------------------------------------------------- -biome_lib:register_generate_plant( +biome_lib.register_on_generate( { surface = { "default:dirt_with_grass", diff --git a/mods/plantlife_modpack/dryplants/reedmace.lua b/mods/plantlife_modpack/dryplants/reedmace.lua index 49a10224..0ab5a905 100644 --- a/mods/plantlife_modpack/dryplants/reedmace.lua +++ b/mods/plantlife_modpack/dryplants/reedmace.lua @@ -327,7 +327,7 @@ minetest.register_entity("dryplants:reedmace_water_entity",{ ----------------------------------------------------------------------------------------------- -- SPAWN REEDMACE ----------------------------------------------------------------------------------------------- ---[[biome_lib:spawn_on_surfaces({ +--[[biome_lib.register_active_spawner({ spawn_delay = 1200, spawn_plants = {"dryplants:reedmace_sapling"}, spawn_chance = 400, @@ -348,7 +348,7 @@ minetest.register_entity("dryplants:reedmace_water_entity",{ -- GENERATE REEDMACE ----------------------------------------------------------------------------------------------- -- near water or swamp -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", "default:desert_sand", @@ -369,7 +369,7 @@ biome_lib:register_generate_plant({ abstract_dryplants.grow_reedmace ) -- in water -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:dirt", "default:dirt_with_grass", @@ -392,7 +392,7 @@ biome_lib:register_generate_plant({ abstract_dryplants.grow_reedmace_water ) -- for oases & tropical beaches & tropical swamps -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:sand", "sumpf:sumpf" diff --git a/mods/plantlife_modpack/ferns/fern.lua b/mods/plantlife_modpack/ferns/fern.lua index 2c5278f4..f29e459d 100644 --- a/mods/plantlife_modpack/ferns/fern.lua +++ b/mods/plantlife_modpack/ferns/fern.lua @@ -87,7 +87,7 @@ end ----------------------------------------------------------------------------------------------- if abstract_ferns.config.lady_ferns_near_tree == true then - biome_lib:register_generate_plant({ -- near trees (woodlands) + biome_lib.register_on_generate({ -- near trees (woodlands) surface = { "default:dirt_with_grass", "default:mossycobble", @@ -116,7 +116,7 @@ if abstract_ferns.config.lady_ferns_near_tree == true then end if abstract_ferns.config.lady_ferns_near_rock == true then - biome_lib:register_generate_plant({ -- near stone (mountains) + biome_lib.register_on_generate({ -- near stone (mountains) surface = { "default:dirt_with_grass", "default:mossycobble", @@ -143,7 +143,7 @@ if abstract_ferns.config.lady_ferns_near_rock == true then end if abstract_ferns.config.lady_ferns_near_ores == true then -- this one causes a huge fps drop - biome_lib:register_generate_plant({ -- near ores (potential mining sites) + biome_lib.register_on_generate({ -- near ores (potential mining sites) surface = { "default:dirt_with_grass", "default:mossycobble", @@ -183,7 +183,7 @@ if abstract_ferns.config.lady_ferns_near_ores == true then -- this one causes a end if abstract_ferns.config.lady_ferns_in_groups == true then -- this one is meant as a replacement of Ferns_near_Ores - biome_lib:register_generate_plant({ + biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", "default:mossycobble", diff --git a/mods/plantlife_modpack/ferns/gianttreefern.lua b/mods/plantlife_modpack/ferns/gianttreefern.lua index 28feb6a8..ec155df2 100644 --- a/mods/plantlife_modpack/ferns/gianttreefern.lua +++ b/mods/plantlife_modpack/ferns/gianttreefern.lua @@ -295,7 +295,7 @@ minetest.register_abm({ -- in jungles if abstract_ferns.config.enable_giant_treeferns_in_jungle == true then - biome_lib:register_generate_plant({ + biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", "default:dirt_with_rainforest_litter", -- minetest >= 0.4.16 @@ -321,7 +321,7 @@ end -- for oases & tropical beaches if abstract_ferns.config.enable_giant_treeferns_in_oases == true then - biome_lib:register_generate_plant({ + biome_lib.register_on_generate({ surface = { "default:sand"--, --"default:desert_sand" diff --git a/mods/plantlife_modpack/ferns/horsetail.lua b/mods/plantlife_modpack/ferns/horsetail.lua index b41f811d..3fefb045 100644 --- a/mods/plantlife_modpack/ferns/horsetail.lua +++ b/mods/plantlife_modpack/ferns/horsetail.lua @@ -75,7 +75,7 @@ create_nodes() -- Spawning ----------------------------------------------------------------------------------------------- if abstract_ferns.config.enable_horsetails_spawning == true then - biome_lib:spawn_on_surfaces({ + biome_lib.register_active_spawner({ spawn_delay = 1200, spawn_plants = node_names, spawn_chance = 400, @@ -104,7 +104,7 @@ end ----------------------------------------------------------------------------------------------- if abstract_ferns.config.enable_horsetails_on_grass == true then - biome_lib:register_generate_plant({ + biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", "default:dirt_with_coniferous_litter", -- minetest >= 0.5 @@ -137,7 +137,7 @@ if abstract_ferns.config.enable_horsetails_on_grass == true then end if abstract_ferns.config.enable_horsetails_on_stones == true then - biome_lib:register_generate_plant({ + biome_lib.register_on_generate({ surface = { "default:gravel", -- roots go deep "default:mossycobble", diff --git a/mods/plantlife_modpack/ferns/treefern.lua b/mods/plantlife_modpack/ferns/treefern.lua index 7b5aafcf..361417c1 100644 --- a/mods/plantlife_modpack/ferns/treefern.lua +++ b/mods/plantlife_modpack/ferns/treefern.lua @@ -181,7 +181,7 @@ minetest.register_abm({ -- in jungles if abstract_ferns.config.enable_treeferns_in_jungle == true then - biome_lib:register_generate_plant({ + biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", "default:dirt_with_rainforest_litter", -- minetest >= 0.4.16 @@ -210,7 +210,7 @@ end -- for oases & tropical beaches if abstract_ferns.config.enable_treeferns_in_oases == true then - biome_lib:register_generate_plant({ + biome_lib.register_on_generate({ surface = { "default:sand"--, --"default:desert_sand" diff --git a/mods/plantlife_modpack/flowers_plus/init.lua b/mods/plantlife_modpack/flowers_plus/init.lua index 11393ef1..f1ad1d61 100644 --- a/mods/plantlife_modpack/flowers_plus/init.lua +++ b/mods/plantlife_modpack/flowers_plus/init.lua @@ -78,16 +78,16 @@ for i in ipairs(lilies_list) do local above_node = minetest.get_node(pt.above) local top_node = minetest.get_node(top_pos) - if biome_lib:get_nodedef_field(under_node.name, "buildable_to") then + if biome_lib.get_nodedef_field(under_node.name, "buildable_to") then if under_node.name ~= "default:water_source" then place_pos = pt.under elseif top_node.name ~= "default:water_source" - and biome_lib:get_nodedef_field(top_node.name, "buildable_to") then + and biome_lib.get_nodedef_field(top_node.name, "buildable_to") then place_pos = top_pos else return end - elseif biome_lib:get_nodedef_field(above_node.name, "buildable_to") then + elseif biome_lib.get_nodedef_field(above_node.name, "buildable_to") then place_pos = pt.above end @@ -178,18 +178,19 @@ for i in ipairs(algae_list) do local above_node = minetest.get_node(pt.above) local top_node = minetest.get_node(top_pos) - if biome_lib:get_nodedef_field(under_node.name, "buildable_to") then + if biome_lib.get_nodedef_field(under_node.name, "buildable_to") then if under_node.name ~= "default:water_source" then place_pos = pt.under elseif top_node.name ~= "default:water_source" - and biome_lib:get_nodedef_field(top_node.name, "buildable_to") then + and biome_lib.get_nodedef_field(top_node.name, "buildable_to") then place_pos = top_pos else return end - elseif biome_lib:get_nodedef_field(above_node.name, "buildable_to") then + elseif biome_lib.get_nodedef_field(above_node.name, "buildable_to") then place_pos = pt.above end + if not place_pos then return end -- something went wrong :P if not minetest.is_protected(place_pos, placer:get_player_name()) then @@ -243,7 +244,7 @@ minetest.register_node(":flowers:sunflower", { walkable = false, buildable_to = true, is_ground_content = true, - groups = { dig_immediate=3, flora=1, flammable=3 }, + groups = { dig_immediate=3, flora=1, flammable=3, attached_node=1 }, sounds = default.node_sound_leaves_defaults(), selection_box = box, collision_box = box, @@ -299,7 +300,7 @@ flowers_plus.grow_waterlily = function(pos) end end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:water_source"}, max_count = lilies_max_count, rarity = lilies_rarity, @@ -321,7 +322,7 @@ flowers_plus.grow_seaweed = function(pos) minetest.swap_node(right_here, {name="along_shore:seaweed_"..math.random(1,4), param2=math.random(1,3)}) end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:water_source"}, max_count = seaweed_max_count, rarity = seaweed_rarity, @@ -338,7 +339,7 @@ biome_lib:register_generate_plant({ -- seaweed at beaches -- MM: not satisfied with it, but IMHO some beaches should have some algae -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:water_source"}, max_count = seaweed_max_count, rarity = seaweed_rarity, @@ -354,7 +355,7 @@ biome_lib:register_generate_plant({ }, flowers_plus.grow_seaweed ) -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:sand"}, max_count = seaweed_max_count*2, rarity = seaweed_rarity/2, @@ -371,7 +372,7 @@ biome_lib:register_generate_plant({ flowers_plus.grow_seaweed ) -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:dirt_with_grass"}, avoid_nodes = { "flowers:sunflower" }, max_count = sunflowers_max_count, @@ -386,7 +387,7 @@ biome_lib:register_generate_plant({ -- spawn ABM registrations -biome_lib:spawn_on_surfaces({ +biome_lib.register_active_spawner({ spawn_delay = SPAWN_DELAY/2, spawn_plants = { "flowers:waterlily", @@ -408,7 +409,7 @@ biome_lib:spawn_on_surfaces({ random_facedir = {0,3} }) -biome_lib:spawn_on_surfaces({ +biome_lib.register_active_spawner({ spawn_delay = SPAWN_DELAY*2, spawn_plants = {"flowers:seaweed"}, spawn_chance = SPAWN_CHANCE*2, @@ -421,7 +422,7 @@ biome_lib:spawn_on_surfaces({ facedir = 1 }) -biome_lib:spawn_on_surfaces({ +biome_lib.register_active_spawner({ spawn_delay = SPAWN_DELAY*2, spawn_plants = {"flowers:seaweed"}, spawn_chance = SPAWN_CHANCE*2, @@ -435,7 +436,7 @@ biome_lib:spawn_on_surfaces({ facedir = 1 }) -biome_lib:spawn_on_surfaces({ +biome_lib.register_active_spawner({ spawn_delay = SPAWN_DELAY*2, spawn_plants = {"flowers:seaweed"}, spawn_chance = SPAWN_CHANCE*2, @@ -449,7 +450,7 @@ biome_lib:spawn_on_surfaces({ facedir = 1 }) -biome_lib:spawn_on_surfaces({ +biome_lib.register_active_spawner({ spawn_delay = SPAWN_DELAY*2, spawn_plants = {"flowers:sunflower"}, spawn_chance = SPAWN_CHANCE*2, diff --git a/mods/plantlife_modpack/molehills/init.lua b/mods/plantlife_modpack/molehills/init.lua index 2f53f40f..481c866c 100644 --- a/mods/plantlife_modpack/molehills/init.lua +++ b/mods/plantlife_modpack/molehills/init.lua @@ -62,7 +62,7 @@ abstract_molehills.place_molehill = function(pos) end end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:dirt_with_grass"}, max_count = Molehills_Max_Count, rarity = Molehills_Rarity, diff --git a/mods/plantlife_modpack/poisonivy/init.lua b/mods/plantlife_modpack/poisonivy/init.lua index ae302a5a..0c914fa0 100644 --- a/mods/plantlife_modpack/poisonivy/init.lua +++ b/mods/plantlife_modpack/poisonivy/init.lua @@ -70,7 +70,7 @@ minetest.register_node('poisonivy:climbing', { buildable_to = true, }) -biome_lib:spawn_on_surfaces({ +biome_lib.register_active_spawner({ spawn_delay = SPAWN_DELAY, spawn_plants = {"poisonivy:seedling"}, avoid_radius = 10, @@ -83,7 +83,7 @@ biome_lib:spawn_on_surfaces({ verticals_list = walls_list }) -biome_lib:grow_plants({ +biome_lib.update_plant({ grow_delay = SPAWN_DELAY, grow_chance = GROW_CHANCE, grow_plant = "poisonivy:seedling", @@ -91,7 +91,7 @@ biome_lib:grow_plants({ grow_nodes = {"default:dirt_with_grass"} }) -biome_lib:grow_plants({ +biome_lib.update_plant({ grow_delay = GROW_DELAY, grow_chance = GROW_CHANCE*2, grow_plant = "poisonivy:climbing", diff --git a/mods/plantlife_modpack/trunks/generating.lua b/mods/plantlife_modpack/trunks/generating.lua index f693df6c..5decb7ca 100644 --- a/mods/plantlife_modpack/trunks/generating.lua +++ b/mods/plantlife_modpack/trunks/generating.lua @@ -169,7 +169,7 @@ abstract_trunks.place_twig = function(pos) end if Twigs_on_ground == true then -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:dirt_with_grass"}, max_count = Twigs_on_ground_Max_Count, rarity = Twigs_on_ground_Rarity, @@ -186,7 +186,7 @@ biome_lib:register_generate_plant({ end if Twigs_on_water == true then -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:water_source"}, max_count = Twigs_on_water_Max_Count, rarity = Twigs_on_water_Rarity, @@ -348,7 +348,7 @@ abstract_trunks.place_trunk = function(pos) end end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:dirt_with_grass"}, max_count = Trunks_Max_Count, -- 320, rarity = Trunks_Rarity, -- 99, @@ -382,7 +382,7 @@ abstract_trunks.grow_moss_on_ground = function(pos) end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"default:dirt_with_grass"}, max_count = Moss_on_ground_Max_Count, rarity = Moss_on_ground_Rarity, @@ -471,7 +471,7 @@ abstract_trunks.grow_moss_on_trunk = function(pos) --end end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:tree", "default:jungletree", @@ -548,7 +548,7 @@ abstract_trunks.grow_roots = function(pos) end end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = {"group:tree"}, max_count = 1000, rarity = 1, diff --git a/mods/plantlife_modpack/trunks/nodes.lua b/mods/plantlife_modpack/trunks/nodes.lua index 04d124fc..10c1c6eb 100644 --- a/mods/plantlife_modpack/trunks/nodes.lua +++ b/mods/plantlife_modpack/trunks/nodes.lua @@ -95,6 +95,7 @@ for r = 0, 3 do sunlight_propagates = true, walkable = false, node_box = cbox, + buildable_to = true, groups = {snappy = 3, flammable = 3, attached_node=1, not_in_creative_inventory = r}, sounds = default.node_sound_leaves_defaults(), drop = "trunks:moss_plain_0", @@ -114,6 +115,7 @@ for r = 0, 3 do sunlight_propagates = true, walkable = false, node_box = cbox, + buildable_to = true, groups = {snappy = 3, flammable = 3, attached_node=1, not_in_creative_inventory = r}, sounds = default.node_sound_leaves_defaults(), drop = "trunks:moss_with_fungus_0", diff --git a/mods/plantlife_modpack/vines/init.lua b/mods/plantlife_modpack/vines/init.lua index cfb9833a..38c3901d 100644 --- a/mods/plantlife_modpack/vines/init.lua +++ b/mods/plantlife_modpack/vines/init.lua @@ -133,7 +133,7 @@ vines.register_vine = function( name, defs, biome ) end, }) - biome_lib:spawn_on_surfaces(biome) + biome_lib.register_active_spawner(biome) end -- ALIASES diff --git a/mods/plantlife_modpack/woodsoils/generating.lua b/mods/plantlife_modpack/woodsoils/generating.lua index a044a9b2..c250f2ac 100644 --- a/mods/plantlife_modpack/woodsoils/generating.lua +++ b/mods/plantlife_modpack/woodsoils/generating.lua @@ -73,7 +73,7 @@ abstract_woodsoils.place_soil = function(pos) end end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "group:tree", "ferns:fern_03", @@ -94,7 +94,7 @@ biome_lib:register_generate_plant({ "abstract_woodsoils.place_soil" ) -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "moretrees:apple_tree_sapling_ongen", "moretrees:beech_sapling_ongen", diff --git a/mods/plantlife_modpack/youngtrees/init.lua b/mods/plantlife_modpack/youngtrees/init.lua index ca74de17..61c285f4 100644 --- a/mods/plantlife_modpack/youngtrees/init.lua +++ b/mods/plantlife_modpack/youngtrees/init.lua @@ -133,7 +133,7 @@ abstract_youngtrees.grow_youngtree_node = function(pos, height) end -biome_lib:register_generate_plant({ +biome_lib.register_on_generate({ surface = { "default:dirt_with_grass", "stoneage:grass_with_silex", diff --git a/mods/playerplus/init.lua b/mods/playerplus/init.lua index 779b1121..43eef596 100644 --- a/mods/playerplus/init.lua +++ b/mods/playerplus/init.lua @@ -291,13 +291,15 @@ local punchy = function( end -- END tool damage --- print ("---", player:get_player_name(), damage) + local kb = math.min(32, damage * 2) + +-- print ("---", player:get_player_name(), damage, kb) -- knock back player player:add_velocity({ - x = dir.x * (damage * 2), + x = dir.x * kb, y = -1, - z = dir.z * (damage * 2) + z = dir.z * kb }) end diff --git a/mods/protector/admin.lua b/mods/protector/admin.lua index ad1afce2..2a4f1a53 100644 --- a/mods/protector/admin.lua +++ b/mods/protector/admin.lua @@ -69,7 +69,7 @@ minetest.register_chatcommand("protector_replace", { minetest.register_abm({ nodenames = {"protector:protect", "protector:protect2", "protector:protect_hidden"}, - interval = 8, + interval = 6, chance = 1, catch_up = false, action = function(pos, node) diff --git a/mods/protector/doors_chest.lua b/mods/protector/doors_chest.lua index f5a2dead..1d7819e2 100644 --- a/mods/protector/doors_chest.lua +++ b/mods/protector/doors_chest.lua @@ -625,14 +625,17 @@ minetest.register_node("protector:chest", { local spos = pos.x .. "," .. pos.y .. "," ..pos.z local formspec = "size[8,9]" --- .. default.gui_bg --- .. default.gui_bg_img --- .. default.gui_slots .. "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]" - .. "button[0,4.5;2,0.25;toup;" .. F(S("To Chest")) .. "]" - .. "field[2.3,4.8;4,0.25;chestname;;" + + .. "image_button[-0.01,4.26;1.05,0.8;protector_up_icon.png;protect_up;]" + .. "image_button[0.98,4.26;1.05,0.8;protector_down_icon.png;protect_down;]" + .. "tooltip[protect_up;" .. S("To Chest") .. "]" + .. "tooltip[protect_down;" .. S("To Inventory") .. "]" + + .. "field[2.3,4.8;4,0.25;protect_name;;" .. meta:get_string("name") .. "]" - .. "button[6,4.5;2,0.25;todn;" .. F(S("To Inventory")) .. "]" + .. "button[5.99,4.5;2.05,0.25;protect_rename;" .. S("Rename") .. "]" + .. "list[current_player;main;0,5;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. "listring[nodemeta:" .. spos .. ";main]" @@ -691,22 +694,22 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local player_inv = player:get_inventory() -- copy contents of player inventory to chest - if fields.toup then + if fields.protect_up then to_from(player_inv, chest_inv) -- copy contents of chest to player inventory - elseif fields.todn then + elseif fields.protect_down then to_from(chest_inv, player_inv) - elseif fields.chestname then + elseif fields.protect_name or fields.protect_rename then -- change chest infotext to display name - if fields.chestname ~= "" then + if fields.protect_name ~= "" then - meta:set_string("name", fields.chestname) - meta:set_string("infotext", fields.chestname) + meta:set_string("name", fields.protect_name) + meta:set_string("infotext", fields.protect_name) else meta:set_string("name", S("Protected Chest")) meta:set_string("infotext", S("Protected Chest")) diff --git a/mods/protector/init.lua b/mods/protector/init.lua index f12b424b..7044b740 100644 --- a/mods/protector/init.lua +++ b/mods/protector/init.lua @@ -5,7 +5,7 @@ default = default or { node_sound_wood_defaults = function(table) end, gui_bg = "", gui_bg_img = "", - gui_slots = "", + gui_slots = "" } -- Load support for intllib. @@ -374,9 +374,9 @@ function minetest.is_protected(pos, digger) if protector_hurt > 0 and player:get_hp() > 0 then -- This delay fixes item duplication bug (thanks luk3yx) - minetest.after(0.1, function() + minetest.after(0.1, function(player) player:set_hp(player:get_hp() - protector_hurt) - end) + end, player) end -- flip player when protection violated @@ -651,15 +651,13 @@ minetest.register_node("protector:protect2", { -- recipes to switch between protectors minetest.register_craft({ - type = "shapeless", output = "protector:protect", - recipe = {"protector:protect2"} + recipe = {{"protector:protect2"}} }) minetest.register_craft({ - type = "shapeless", output = "protector:protect2", - recipe = {"protector:protect"} + recipe = {{"protector:protect"}} }) diff --git a/mods/protector/textures/license.txt b/mods/protector/textures/license.txt index 8798df4c..acf64235 100644 --- a/mods/protector/textures/license.txt +++ b/mods/protector/textures/license.txt @@ -28,3 +28,7 @@ following textures by TenPlus1 (CC BY-SA 3.0): protector_logo.png protector_display.png protector_overlay.png + +following textures by Kilbith (CC BY-SA 3.0): + protector_up_icon.png + protector_down_icon.png (both rotated) diff --git a/mods/protector/textures/protector_down_icon.png b/mods/protector/textures/protector_down_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f1161a2f99189c1f05b69b04b34966823c2b4e0c GIT binary patch literal 481 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 literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2077.png b/mods/skinsdb/textures/character_2077.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd22308158aff1cf8cf9b2c51aa02b83dc86566 GIT binary patch literal 1765 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 literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2079.png b/mods/skinsdb/textures/character_2079.png new file mode 100644 index 0000000000000000000000000000000000000000..c489a64ca70fb51c589bccafac957bafe4a7e633 GIT binary patch literal 8325 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 U0q<1yCE)hDr>mdKI;Vst0PWq_%m4rY literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2081.png b/mods/skinsdb/textures/character_2081.png new file mode 100644 index 0000000000000000000000000000000000000000..fe44d0bb26341f34c1d3e9ec17817219bab388d9 GIT binary patch literal 8325 zcmdT~eQ1?c7=PY--}m0_Zuj0PV@qc_X__>lMTxOYtmbqHl3|h&C`cgsk0cQ&C`o~0 z^hc;gAy|JIQ4$iUfsmE`(IiaM`B9rG&5g}{-FxT#c<=4`opuPR$;GWOt zIp_SI=Q+ zPz^IsOVjh~wisG%ZF{@MOavhy(GMMipVFDE53dP5l_)M3Id^w0PO| z0bG(lkP%)X>(e3F$+fz3ZD9?gVM=qVX&QO>SL)X(X?Z+($fOj!QjJTIG*BhGTffwajdC49_!S|caON)ADz^Dg2Mx_Z~y`j42xn) z0ZC=jRK|C#uuo%^c&RrMCo{uaLkCZahEpudiZN3uOF&8GJpxULCz9knLe?iE*LAN> zi3FS5V*!9WKoRi-jy<*{E8@VmjpR3cR9X_E;piZn-9vqM{-J%xPf~O^K}mKI-K!B~ zg%WUNni~0hUf~hN+#@CfJm&PI*sbBxepZB7Jl6pP*7x}g+Ou&3rIQ-<_C=_(yO-KK zySbjG{-HtI($pw;zzZ3ZWibZEvX0D@xI$whSbi$rBdlXkGkJl$Shi%6U3t@UPtf)i zOQ?)37~l)f>RlhvtD8Qhl4OGBR##Eex({jd;S&_9oGp033mM3YF?cNEF+o%P9$^PT z%CNh#m3%%Qz4ml1%?wu1VDcVSmIkT%p*f`cE9k_TGXm7QRZHpi-`DA{u3jqf8x%51 z=(4+=IZP6p447P#c(P{C5dGzdKwPePl)YIQj zeUT*9R9BLZt@+j2R%)q#QYhg2%NOXSr42L~O;RKh6CXmA6&2+5m(kBxJLuPI?ZTrF zUvMg@_Xv|g%X`FBP=NmW;spW}004BxjEkdA_xUNKC3(+x*?afoh4bV!tb-#mY*L)J zM277LUV|@6Cd)oEuZ9}yW>K0?1B?fPBEP+OU6hgF9?`t8Rw!=gE$2s+&Gdi@S?;&K zr4{karr+D&u*)d4wY6o*I2c-6GjH$O>}Zme1MeRpI(Sf4bLU5o79RiDu?*GKS+X~7 z(AH1(QRhIEW`)Z{e*CxVh2>qdI_?3kzHwLaE-+yv!D9loJkAM=`WPDL*b^_t9-vwu zUU0uOAs#TH-v$i&|FFDNl-98DEwSfg@h(2|tEp<{Q?gIw-FMHE>_dav9~r()=hi5n zy;$6`WyBGY-u><~npYj7_Ab6TGVNLYrpW2$O)Hn_+_^*nJZz58$mmRJ|d;OMw1`&QB$&Vc10Y?5T zj?q-*MXMYG<=BYwB@f!}lk6=3>yL{txk}Q4+$OA!&uG=c1^CrrghF89YF?KrgElz_ zl;QR$#~@=@{(BG{8XBDiTR@UrB9Fq({^BMD2DH{n_>hg#-9g z2vf&Zs!VrU<&ku~qn2IC=>Y(#0xcLLR4`D6N-8kK29U}l%L4;epPH(&YCD&E2BUTh zzz@Vm9xd$F;tM%Fzz%N8I5I|L^#$1+suCar>w^GH0=HU5Qwbg|-~lf{%k6?Xj{|VF zg-4}DNmYc}CEF`QW8Vve0wg$fkfO^7Qj*lNY;)(icqC{yud6N`d!0` zYEBPuGv1eir1jl{#NFI`gDvx^O14)F;w#J9+RI4NppS)bPyCtihOBA}kzJ=(tD zly!7MrfOz6o!&;&_yON4-(iK}riZgV5~1dgIY!UVo)azD=TLz344Lz*EWbwaU$F4Z zT?FMk1&WZ%$&zoYAaFMBy(VO!Fp$dIe27T!>}TK%zWMWV3%ua866pytz@b$w%YNcV t7~&Ufee3NP@!?&M{{@h5^wv;$)Bcse?D&CxL>Qr#6>FNld12Gue*wIq-!%XL literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2082.png b/mods/skinsdb/textures/character_2082.png new file mode 100644 index 0000000000000000000000000000000000000000..57a1784aacb55c57f055ce37c4c2d6e6705a8ee3 GIT binary patch literal 8325 zcmds7Uu+ab82_$Z+vAR2p|%&UC3>lCw7rK@_8nL~5E=UI>W~5KBv{i7EJ}7L6@O4n$k%c?Ih^-`st3vwORTV4Y2p1{k| z8T6Jg1E{aPZ}YZnM<8(SoP!xDOP9|VQyB~vEmEoBgOQMB8_EFxu`=u5#^2legb0DO zo)^jtC7f3MDp{l+Ve}`^7cc$B!x3*4I}`Ml3BXRS$j&zG>-hESLQddOfOJveEkc*c zgykb(1|C7FbeRlV?%SMZ06N^^^~!$m{nV6(#}TJluuw)H0n9l88nhRS)t2h!eRBEU+r@7{^xvtM1$knriVFyDjLgMFvsmfQ-6;}_uC`WJbOoMUhC`c{e0U9lYA-_oIK zBcpYW2LsFaR=4NC9^TQGr+34itxv*TYfCwwo4*{OdNbV9IS3~!2f1v`nN@Il`znCp z&tPWq0+)SzVhna4{1D_gTw!rL`t$E;eFU<69v9$61?kSipAswTv0e251%7^UT4>?~ z`sm~6W9wWr_IlmT;`v6%m$w+UJ-^SeO&sC1#Y>?wcNU^UKky4_l+ozx9WfThq@quR zo+rC>)Q;AmKNg;jujKD-e^&HCey!ni{=j29g${}1A9wKefrRpF@0rebxtL}ICL?_1 zPmvU&u}=4Ck*@(VZ~{a%CBhrLn?$^x8u^CTGH{InV<-`Nxy+|~4M<&pnh(bybV~Gb zf7us;Mxwp@yHp?90{vO(8hB2YLfgIX#Ca*U#(`}sVCStejKsyzfLdv+6*bT|to+QiW>%Fngk z1Iq-IxwNM~J1xxj$jfchX;dDbKykioGAG&ziD%Z#x_z`ktEy>8K7;<%sn5FBI)&@{ zzfH z6`n-RKG>>s`qs@8fE}=UXX~RezAxAajZGeKz*hjJ?CgMLECjJv9)bS8Y4|lRN#4!c zFq0=d5xmiH+zxmQWt;$cx>|HZKVAD^9|tPHV=F8X2p)^x-cFL`StT!oJn#+PQWGG9 zzk#4leXlaWY^ujk(;`CCNI#niCj~DEn(F#QlYIOWZYqOE0rEyO0Cjd|fzxnt5>pq$ znG{Nt5h!$F(_YL1q^$}8wz8A-W{&}y%ryxPL9%|s%0ih{(wa4(yl93S`#o8(vStbNe;MBf|9H{n9vgw`ff<3v*2vZ*VJ^3B zC(2yTU;2ZCMxb;Cs4mOneaGAI=oLWT8M!2{Z~h_@j3o8fA14 i{|lf<1P{UzfzQd2=-#U(%U&x(S^fIv+MfGcU;hVIfSu0( literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2083.png b/mods/skinsdb/textures/character_2083.png new file mode 100644 index 0000000000000000000000000000000000000000..ac18b25c56148418afdcf894b5f2b574636005bd GIT binary patch literal 8325 zcmdT~X>8O*6o0$f(gWy04}sR&Dqyf_6(T830TD}V`B2eR34(wo6@-EWl;A}G`5@>A zpnw>J01}aS0Us0s7&)49BoIr~P{2avDh1nu6iQ{+`MupYo&SITZ5N`gzGQaZH8bzM zd2{{S#iI+K?jF@Uiio-wfx%SMRZZW8`sWTq^ii7`D14jMIS(Mt;~o{Rti** z_hiwOFjrbyRh3IA`BK$Sb>Js8wVJ9al~hHlqT2MiRJ^2!R=ly0${O}5CQ)w8Fe>?I z9<7=46*V;;CSToI=G%WVRe68u;+&i^X1LSV}@ilFmiG#Us_7|iKq@1WQ4uUAcdGH_$70|a7 zw6TvBYCr$9o;zyz#};Eu!*=GZU3p_OEzj=BRC(zjRiijV_Tcpv0i2dGq_!w@FyXe32LokhhE3k3 z#gmi$4ufIhi3u@U$Bx)#rt@~)&Z0R3WN`b8jOwq2{*DbuT z*p`6Q)Hi6Ey>C0M6+0Mly*ui*Z{hBE`fmCpDtzG%%{rSvC&ztBaS4lQZMRGci(Q~i zDr-8*cy9PW%{$ybg7IdkodQ4+-B|A3 zze4MoNL=zvYUo{0(9`#bKmcPd#8Tb)rJWiek9*K0HVzJyXUR54R5c}<#;?AnE>QPT zS?%|xPox8pSU`0925nNh=?yJyb1Eu`1E_*`JwBG`stSMtojC{^WSL5K-qLl46M7GT z!MSR9J(J@q$df;xyf>~;#k6T`Sk}swTnkN`j+47<0=+nHKJ)Q|e%wQcX<8#)x@wew z8=2K2=yVF&`q3G{ z3 zob8)C^%QW+dHw5wU6gcdI2RZVV+G(SXc!K?`kLR^DbWER&WPin#Yxm~9svemJhVrV zK+8CtQ3plez9gtAa1RLYM!sto$#-IBP#e>5b?#f1lqnPZR-b-?TIz^XmF?aO)a{e| zUw*8aA~$cNLtDpC_UJ8ywt&06SG1f0hAF-#b^e>6oCmm~dzsvO#>H5(11Fv-cfylW zhO+ZcvQT-}Q=pwz$bj}>*HgFJR2jL)e|3h#k_q?Xe4B&Zh0rkrT;b6zU10XH3}h*^ zNZQ4);Yn#%`5qK5pWDw%;2xUlCPBxbmV}7NW5`s;riT+lHds^E9*%&Sr_1JdmN_=T z9^l!!hGpH4*YkVB9iPVZU!#j@#(*%!)l0U`Ja0OP1gw;r~xL< zi~yf;$ivm;$Q~pSsyZntj zTm{!9E0%DLuhBtZT(yH_cgb+WAr6A71z)yuKA{MJF9ke44sC%EUDUe|RS=x5z0$x1 zICyq|vnxvGFk1ovLOUOjS=t%S<1JynC+xJPT`L4{f^d#!Rn6>YUw=Y9disw$1c7C? z#%3^VA|{aqxJviyo5BS+c&$O{gqK)^AOtyYILxoeKqr#^PJOl|v+Mg$0p++HaerL8 zNGJ#b3bMm2=s;+DXQ1URV7?;+7nxH#Gu0(4v>t+B1Og74Gq3dm2xOrK!EN8fX1?Xm z00d#e%PIrZ<;N`ctge$$@r)P;}7F zBj-D(dSF+F<0c?GWGSFV5CFn6b%7(@fBxl+h27Q?pzy9b^`#MiMhg%}*G*(>;42$A z7+&>c$By4x7O+g61PEMvf4>U82+5_#sKrrsTrC&S%)@Em0GMq!obgB+7vODW!1Oh% zxfe-&>;pI2_ zPXv5r0#86Txcc~NW?}Zt_Xn~-0+SirgS^krU_Ib)Os>AtpS|Y2!BtebKnXJNzW}P{ ceZj71qYI}-pFdL&wgc>fk%f8RjF`0WZ_O+vx&QzG literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2084.png b/mods/skinsdb/textures/character_2084.png new file mode 100644 index 0000000000000000000000000000000000000000..c0d080705911087771503ae7a547f76b978ee068 GIT binary patch literal 8325 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 literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2085.png b/mods/skinsdb/textures/character_2085.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7ab32db7ffba57d01c9912361ade022b3abc1c GIT binary patch literal 8325 zcmeHNO=uHA6rN48Z5l|`Q?QEmAmku;@}T%bsuf!gMWq*S;zdCbe~^0eARhby#i|Dn zUOY>Wf}kj<2p$CW6fdGkB_}P#&>Gt~-)z6l?CfMWEip-{1Dlz7fAhXKZ{AMQUOPCl zKbz^x2qCh=LxYE9Uyx6Kx=VgOd~oTC?0U`&9XT&V?<+jcz0JMrq<|P692h;}I{p2h zKRZ$=vb}jVR-Kutgk;ibSAgzzB||)&uygl~*fn(dR*w^{Ua-^FTXFzwSuAv&H8|;*FU}m=AAlObOzXV-2@M?Hd-eJVbK8~2)+fPfJX6Xr`>&Q z0OscBLq0MK*oOp`5y8QG-t-q0UI%BZ_~etP&pC!&+Cm_ciG-SSJ;-g}d9AJYgajPK z0|)ip#+W=ftY3KGICy9TtLxLA5|AI1BSJ`2jKxS*0>p zse|LdKtO&2gd_?e3%*FVVv%kkL*o9__XO`NJkei^>tn&W4T_WeQ6`$Up}7~#bQyJUKq#e2iyo`K!CGCCjSGl zLN>ZCOvid=i%C(PofpoQz;UZ<#AKjuLg~c{2Ee%C38@`9UR|0ov{}`f<)P)a;LE zGUC46edsr$3-CH%Js3Kj_7~GjA0jgV%s`%J_OBM@CqLC1be@5*Ele4c#~^@CKsGQs z_{!soI5oOT1&?|*9doUyd0YTeVE}U?lMkNNuuRmF-reE;X-|gWG1I}?ECBr7M^pZ_ z+a}X&n$uJ0RTfh8+Y#4+7ZCgntP*?g%*UrgY#fK)><* zA5}T7@ppnaIq+>kh|_~kHtQ8-T&B>>xoN}T*Amtgl=He70Pyv|1$gq_fX14D8u91r ztVrhEKrLaNQNorFU0-Lf{)j(+FTG7pPFe#{tyT-dk(a)D8PMpGsr6lc5!H1NgwzIk zrCezB0D^7?hq6%J@O>>!_`Ux1*C%QN#ozjC>XW2x#{UAyKI*HoJOTwoY2y9cXA`&I QU4W_KeItVtdyZcI3;(&~%>V!Z literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2086.png b/mods/skinsdb/textures/character_2086.png new file mode 100644 index 0000000000000000000000000000000000000000..750c87c93d1608847621468ac321e69ecc4a0fe7 GIT binary patch literal 12701 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 literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2087.png b/mods/skinsdb/textures/character_2087.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a4b653d97d2ceac440e284d5683497ed2eb324 GIT binary patch literal 1780 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 literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2091.png b/mods/skinsdb/textures/character_2091.png new file mode 100644 index 0000000000000000000000000000000000000000..bf723751b3311fa7f21f9c4a64672d36dcd82653 GIT binary patch literal 2283 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ^aY;l$RCwCdnO|&E*B!?{$LHQ_8^?}=kwYnI48){TtCBj27?GwFP+_!HRjE?R zkk}OMZEK}<+Vfr}O?}v(=WY`ZYt=?*QpHP^iP5O($|4pasN^7GlXxy*V!}*u636%7 z*@Lm`7$<=?RmxAY?!D)nd+zV|{rx>Zi|7ZeNpD^It=hF~7l}lIU@*v~OP7d7qbw~g z(bd&OE|)_oMK+tIx3`ytg#|QCBb&_J#5>y4FJosh(sb>ym%4AFvw&wNGaK}WeY7WEnK{Kk?%Wc>n&JZT%@nB zk5Z|G$K%1WEF8xn6bdmiGQ#1*hdFZO2&K>eic@gmhKD5~c;dj%cpPY53kU=P%+JqL zC=@t$>=?;p62ITi<;#~japD9|EM3Ku`3zSn3|+%2#V%Btn0G zKjCngPe1(>uh)yu=fm$S;VOmSr{lVcQrSY29(-N{rQF9KfWg5*(&;p3&z|M=*I%bt zECR4^-#%>HM$Q#*EgS##z4(1zOv}c!ECe8g=ka#|l^$buc9#A7_w&gopVUAJ1Ol|o zO=4&op_VNeM#Tc8^bqj-Fm0QK#nSg405LT+rEJ^g?Af!t@x~jRK7E=*B0(e)VRCYk zqkFsnOx|swSS%8Y#mHnb9PFs%>si^!^z=0Q_wQ$HY>by)dWre@dA4oahOX&Rg#sNN9h^IN4%0L#6bhu%X)av2Py-^FOfoby#Cz|( zM`vdz;c$5KU0~n7eROnm(9_ey)YKHAP>AK_Wp?b?LAhL}P$=;HE5iWna{fzScmaUt zUm2!QD3Hlyn4Fws>(;H9rb!}^VCT-A7=}T6dpl1)`6T&#o&yIC@WKl(aOTVzjvqfx zB9Y*^=bqbq00MykUw-)|sZntrT5e|n@N|DRu7#|-;DMe3D4}QNN%d*fkZS%9h zsZ*!$`Fymtw&M5u35Ua^QYj7}KFrOVH`ybu^VF+vv$f?nXi~DYTxM&F!Jb#&MjQJZ zGI5Afsl@W~GV}BE6pKYVJ3C1xleD$9v3>h?u3fvv(W6J1o13Gpt&I;q{E%2IMlP4z z{2(|zJ*{rsxIue+J4z|0rltr6gFNfMjr2%_M^H8`bWH+KE?amF9n-cE2(Fk>ip3(` z-QC>0d6Q%^$!o8@hG7_tj*fEo?p+QYI>gM(43S8L-rin5{`g}C2M5XJa`g80ZfXz| zr%s(xeSLjsnnr7DE9G*TmRlEaUBzsqt zGc%(~r4ofg0e}wk8jj;)=o+SNBV|SN*1h=^FY2MniO_KzG%1;HeHKmA@cDcghCx1` z=kn#t9PO&4QPFjfiHQla*(@)<_#)vumuft0Dgf1ffLa963gWGHC4@jJg~#JT)3jQ! zl2S7Iho6f^5PmoEIRGCGz6-yMDuDlt{JyeAlQ^zR-|=5R9K(N_Th%4HgN#Qt7(@j1a zeD^^?Py~Elocq<`Mo{zvuzvBi@Vc%O4EQM<8oHFYuKM<80i_f|2wb;vkg2~qj>Ev> zuj-lwt8Z-E4ok}>9*?L6(2bya;VsMJ&eUi4cJ*`n%D>pza}ctB`F3Z4`j(Us0!`Df zENg`&JPd_ewxEAq`yvoVM@<8iGuw{G1M>$*U>T&@K(O=`r^ZBmS`xP1hS@0c~wyPM$o;%P+sY>YBzYuwv}?#NW|%?f(CcE=#2{ zhOT|>s*C@_@wTFCveLP-ir7X7O-fwl(sJmhYXb290RZ!doKnj)X}$me002ovPDHLk FV1lrUUOWH* literal 0 HcmV?d00001 diff --git a/mods/stairs/stairs.lua b/mods/stairs/stairs.lua index 82097e4c..6be63e7c 100644 --- a/mods/stairs/stairs.lua +++ b/mods/stairs/stairs.lua @@ -508,8 +508,27 @@ stairs.register_all("compressed_dirt", "xanadu:compressed_dirt", {"compressed_dirt.png"}, "Compressed Dirt", stairs.stone) + +stairs.register_slope("steelblock1", "xanadu:steelblock1", + {cracky = 1, level = 2}, + {"steel_block1.png"}, + "Decorative Steelblock 1", + stairs.steel) + +stairs.register_slab("steelblock3", "xanadu:steelblock3", + {cracky = 1, level = 2}, + {"steel_block3.png"}, + "Decorative Steelblock 3", + stairs.steel) + +stairs.register_slope("steelblock5", "xanadu:steelblock5", + {cracky = 1, level = 2}, + {"steel_block5.png"}, + "Decorative Steelblock 5", + stairs.steel) end + --= Castle Mod if minetest.get_modpath("castle") then diff --git a/mods/stamina/init.lua b/mods/stamina/init.lua index 40e9680c..ee39c090 100644 --- a/mods/stamina/init.lua +++ b/mods/stamina/init.lua @@ -8,17 +8,18 @@ STAMINA_HEALTH_TICK = 4 -- time in seconds after player gets healed/damaged STAMINA_MOVE_TICK = 0.5 -- time in seconds after the movement is checked STAMINA_POISON_TICK = 1.25 -- time in seconds after player is poisoned -STAMINA_EXHAUST_DIG = 3 -- exhaustion increased this value after digged node +STAMINA_EXHAUST_DIG = 2 -- exhaustion increased this value after digged node STAMINA_EXHAUST_PLACE = 1 -- .. after digging node STAMINA_EXHAUST_MOVE = 1.5 -- .. if player movement detected STAMINA_EXHAUST_JUMP = 5 -- .. if jumping -STAMINA_EXHAUST_CRAFT = 20 -- .. if player crafts +STAMINA_EXHAUST_CRAFT = 2 -- .. if player crafts STAMINA_EXHAUST_PUNCH = 40 -- .. if player punches another player STAMINA_EXHAUST_LVL = 160 -- at what exhaustion player saturation gets lowered STAMINA_HEAL = 1 -- number of HP player gets healed after STAMINA_HEALTH_TICK STAMINA_HEAL_LVL = 5 -- lower level of saturation needed to get healed -STAMINA_STARVE = 1 -- number of HP player gets damaged by stamina after STAMINA_HEALTH_TICK +STAMINA_STARVE = 1 -- number of HP player gets damaged by stamina after + -- STAMINA_HEALTH_TICK STAMINA_STARVE_LVL = 3 -- level of staturation that causes starving STAMINA_VISUAL_MAX = 20 -- hud bar extends only to 20 @@ -572,8 +573,9 @@ function stamina.eat(hp_change, replace_with_item, itemstack, user, pointed_thin if inv:room_for_item("main", {name = replace_with_item}) then inv:add_item("main", replace_with_item) else - pos.y = math.floor(pos.y - 1.0) - core.add_item(pos, replace_with_item) + local pos = user:get_pos() + + if pos then core.add_item(pos, replace_with_item) end end end end diff --git a/mods/techpack/gravelsieve/init.lua b/mods/techpack/gravelsieve/init.lua index 732b2a67..dd530a22 100644 --- a/mods/techpack/gravelsieve/init.lua +++ b/mods/techpack/gravelsieve/init.lua @@ -627,6 +627,10 @@ if minetest.global_exists("tubelib") then end end, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + paramtype = "light", sounds = default.node_sound_wood_defaults(), paramtype2 = "facedir", diff --git a/mods/techpack/techpack_warehouse/box_copper.lua b/mods/techpack/techpack_warehouse/box_copper.lua index d2f3e567..83f8077e 100644 --- a/mods/techpack/techpack_warehouse/box_copper.lua +++ b/mods/techpack/techpack_warehouse/box_copper.lua @@ -111,8 +111,8 @@ minetest.register_node(NODE_NAME.."_defect", { can_dig = function(pos) return wh.can_dig(Box, pos) end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - wh.after_dig_node(Box, pos, oldnode, oldmetadata, digger) + on_dig = function(pos, node, player) + wh.on_dig_node(Box, pos, node, player) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) diff --git a/mods/techpack/techpack_warehouse/box_gold.lua b/mods/techpack/techpack_warehouse/box_gold.lua index 7d206b8d..742acce7 100644 --- a/mods/techpack/techpack_warehouse/box_gold.lua +++ b/mods/techpack/techpack_warehouse/box_gold.lua @@ -111,8 +111,8 @@ minetest.register_node(NODE_NAME.."_defect", { can_dig = function(pos) return wh.can_dig(Box, pos) end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - wh.after_dig_node(Box, pos, oldnode, oldmetadata, digger) + on_dig = function(pos, node, player) + wh.on_dig_node(Box, pos, node, player) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) diff --git a/mods/techpack/techpack_warehouse/box_steel.lua b/mods/techpack/techpack_warehouse/box_steel.lua index 83655c69..c64fda8d 100644 --- a/mods/techpack/techpack_warehouse/box_steel.lua +++ b/mods/techpack/techpack_warehouse/box_steel.lua @@ -111,8 +111,8 @@ minetest.register_node(NODE_NAME.."_defect", { can_dig = function(pos) return wh.can_dig(Box, pos) end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - wh.after_dig_node(Box, pos, oldnode, oldmetadata, digger) + on_dig = function(pos, node, player) + wh.on_dig_node(Box, pos, node, player) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) diff --git a/mods/techpack/tubelib/distributor.lua b/mods/techpack/tubelib/distributor.lua index 21ffefc3..de6223fb 100644 --- a/mods/techpack/tubelib/distributor.lua +++ b/mods/techpack/tubelib/distributor.lua @@ -316,7 +316,7 @@ local function on_receive_fields(pos, formname, fields, player) return end local meta = M(pos) - local filter = minetest.deserialize(meta:get_string("filter")) + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} if fields.filter1 ~= nil then filter[1] = fields.filter1 == "true" elseif fields.filter2 ~= nil then @@ -341,7 +341,7 @@ end local function change_filter_settings(pos, slot, val) local slots = {["red"] = 1, ["green"] = 2, ["blue"] = 3, ["yellow"] = 4} local meta = M(pos) - local filter = minetest.deserialize(meta:get_string("filter")) + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} local num = slots[slot] or 1 if num >= 1 and num <= 4 then filter[num] = val == "on" diff --git a/mods/techpack/tubelib_addons1/grinder.lua b/mods/techpack/tubelib_addons1/grinder.lua index 2de9eea7..8e1ce3d0 100644 --- a/mods/techpack/tubelib_addons1/grinder.lua +++ b/mods/techpack/tubelib_addons1/grinder.lua @@ -317,26 +317,42 @@ function tubelib.add_grinder_recipe(recipe) end end - -tubelib.add_grinder_recipe({input="default:cobble", output="default:gravel"}) -tubelib.add_grinder_recipe({input="default:desert_cobble", output="default:gravel"}) -tubelib.add_grinder_recipe({input="default:mossycobble", output="default:gravel"}) -tubelib.add_grinder_recipe({input="default:gravel", output="default:sand"}) -tubelib.add_grinder_recipe({input="gravelsieve:sieved_gravel", output="default:sand"}) -tubelib.add_grinder_recipe({input="default:coral_skeleton", output="default:silver_sand"}) -tubelib.add_grinder_recipe({input="tubelib:basalt_stone", output="default:silver_sand"}) +for k,v in pairs({ + ["default:cobble"] = "default:gravel", + ["default:desert_cobble"] = "default:gravel", + ["default:mossycobble"] = "default:gravel", + ["default:gravel"] = "default:sand", + ["gravelsieve:sieved_gravel"] = "default:sand", + ["default:coral_skeleton"] = "default:silver_sand", + ["tubelib:basalt_stone"] = "default:silver_sand", + ["default:sandstone"] = "default:sand 4", + ["default:desert_sandstone"] = "default:desert_sand 4", + ["default:silver_sandstone"] = "default:silver_sand 4", + ["default:tree"] = "default:leaves 8", + ["default:jungletree"] = "default:jungleleaves 8", + ["default:pine_tree"] = "default:pine_needles 8", + ["default:acacia_tree"] = "default:acacia_leaves 8", + ["default:aspen_tree"] = "default:aspen_leaves 8"} +) do + tubelib.add_grinder_recipe({input=k, output=v}) +end if minetest.global_exists("skytest") then - tubelib.add_grinder_recipe({input="default:desert_sand", output="skytest:dust"}) - tubelib.add_grinder_recipe({input="default:silver_sand", output="skytest:dust"}) - tubelib.add_grinder_recipe({input="default:sand", output="skytest:dust"}) - tubelib.add_grinder_recipe({input="skytest:dust 12", output="skytest:powder"}) + temprec = { +["default:desert_sand"] = "skytest:dust", +["default:silver_sand"] = "skytest:dust", +["default:sand"] = "skytest:dust", +["skytest:dust 12"] = "skytest:powder"} else - tubelib.add_grinder_recipe({input="default:desert_sand", output="default:clay"}) - tubelib.add_grinder_recipe({input="default:silver_sand", output="default:clay"}) - tubelib.add_grinder_recipe({input="default:sand", output="default:clay"}) + temprec = { +["default:desert_sand"] = "default:clay", +["default:silver_sand"] = "default:clay", +["default:sand"] = "default:clay"} end +for k,v in pairs(temprec) do tubelib.add_grinder_recipe({input=k, output=v}) end +temprec = nil + if minetest.get_modpath("underch") then for regnodename,v in pairs(minetest.registered_nodes) do if string.find(regnodename, "underch:") then @@ -348,12 +364,45 @@ if minetest.get_modpath("underch") then end end -tubelib.add_grinder_recipe({input="default:sandstone", output="default:sand 4"}) -tubelib.add_grinder_recipe({input="default:desert_sandstone", output="default:desert_sand 4"}) -tubelib.add_grinder_recipe({input="default:silver_sandstone", output="default:silver_sand 4"}) +--Ethereal trees +if minetest.get_modpath("ethereal") then + for k,v in pairs({ + ["ethereal:sakura_trunk"] = "ethereal:sakura_leaves 8", + ["ethereal:willow_trunk"] = "ethereal:willow_twig 8", + ["ethereal:redwood_trunk"] = "ethereal:redwood_leaves 8", + ["ethereal:frost_tree"] = "ethereal:frost_leaves 8", + ["ethereal:yellow_trunk"] = "ethereal:yellowleaves 8", + ["ethereal:palm_trunk"] = "ethereal:palmleaves 8", + ["ethereal:banana_trunk"] = "ethereal:bananaleaves 8", + ["ethereal:birch_trunk"] = "ethereal:birch_leaves 8", + ["ethereal:bamboo"] = "ethereal:bamboo_leaves 8", + ["ethereal:olive_trunk"] = "ethereal:olive_leaves 8"} + ) do tubelib.add_grinder_recipe({input=k, output=v}) end +end + +-- Cool Trees +for _,v in pairs({ + "baldcypress", + "bamboo", + "birch", + "cherrytree", + "chestnuttree", + "clementinetree", + "ebony", + "hollytree", + "larch", + "lemontree", + "mahogany", + "maple", + "oak", + "palm", + "plumtree", + "pomegranate", + "willow" + }) do + if minetest.get_modpath(v) then tubelib.add_grinder_recipe({input=v .. ":trunk", output=v .. ":leaves 8"}) end +end + +if minetest.get_modpath("jacaranda") then tubelib.add_grinder_recipe({input="jacaranda:trunk", output = "jacaranda:blossom_leaves 8"}) end + -tubelib.add_grinder_recipe({input="default:tree", output="default:leaves 8"}) -tubelib.add_grinder_recipe({input="default:jungletree", output="default:jungleleaves 8"}) -tubelib.add_grinder_recipe({input="default:pine_tree", output="default:pine_needles 8"}) -tubelib.add_grinder_recipe({input="default:acacia_tree", output="default:acacia_leaves 8"}) -tubelib.add_grinder_recipe({input="default:aspen_tree", output="default:aspen_leaves 8"}) diff --git a/mods/techpack/tubelib_addons1/harvester.lua b/mods/techpack/tubelib_addons1/harvester.lua index 4c98b9d3..e853576e 100644 --- a/mods/techpack/tubelib_addons1/harvester.lua +++ b/mods/techpack/tubelib_addons1/harvester.lua @@ -350,7 +350,7 @@ minetest.register_node("tubelib_addons1:harvester_base", { return false end local inv = M(pos):get_inventory() - return inv:is_empty("main") + return inv:is_empty("main") and inv:is_empty("fuel") end, on_dig = function(pos, node, player) @@ -410,7 +410,7 @@ minetest.register_node("tubelib_addons1:harvester_defect", { return false end local inv = M(pos):get_inventory() - return inv:is_empty("main") + return inv:is_empty("main") and inv:is_empty("fuel") end, after_dig_node = function(pos, oldnode, oldmetadata, digger) diff --git a/mods/techpack/tubelib_addons3/distributor.lua b/mods/techpack/tubelib_addons3/distributor.lua index ecf6ed75..c5af2a43 100644 --- a/mods/techpack/tubelib_addons3/distributor.lua +++ b/mods/techpack/tubelib_addons3/distributor.lua @@ -285,7 +285,7 @@ local function on_receive_fields(pos, formname, fields, player) return end local meta = M(pos) - local filter = minetest.deserialize(meta:get_string("filter")) + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} if fields.filter1 ~= nil then filter[1] = fields.filter1 == "true" elseif fields.filter2 ~= nil then @@ -310,7 +310,7 @@ end local function change_filter_settings(pos, slot, val) local slots = {["red"] = 1, ["green"] = 2, ["blue"] = 3, ["yellow"] = 4} local meta = M(pos) - local filter = minetest.deserialize(meta:get_string("filter")) + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} local num = slots[slot] or 1 if num >= 1 and num <= 4 then filter[num] = val == "on" diff --git a/mods/unified_inventory/README.md b/mods/unified_inventory/README.md index d159c025..5d23f79e 100644 --- a/mods/unified_inventory/README.md +++ b/mods/unified_inventory/README.md @@ -15,7 +15,8 @@ Unified Inventory replaces the default survival and creative inventory. * Recipe search function by ingredients * Up to four bags with up to 24 slots each * Home function to teleport - * Trash slot + * Trash slot and refill slot for creative + * Waypoints to keep track of important locations * Lite mode: reduces the item browser width * `minetest.conf` setting `unified_inventory_lite = true` * Mod API for modders: see [mod_api.txt](doc/mod_api.txt) @@ -25,6 +26,10 @@ Unified Inventory replaces the default survival and creative inventory. ## Requirements * Minetest 5.4.0+ + * Mod `default` for category filters (contained in Minetest Game) + * Mod `farming` for craftable bags (contained in Minetest Game) + * For waypoint migration: `datastorage` + # Licenses diff --git a/mods/unified_inventory/category.lua b/mods/unified_inventory/category.lua index 72e40382..d0fee5e6 100644 --- a/mods/unified_inventory/category.lua +++ b/mods/unified_inventory/category.lua @@ -70,7 +70,7 @@ end local function ensure_category_exists(category_name) if not unified_inventory.registered_categories[category_name] then unified_inventory.registered_categories[category_name] = { - symbol = "default:stick", + symbol = "unknown_item.png", label = category_name } end @@ -81,16 +81,17 @@ end function unified_inventory.register_category(category_name, config) ensure_category_exists(category_name) - if config and config.symbol then + config = config or {} + if config.symbol then unified_inventory.set_category_symbol(category_name, config.symbol) end - if config and config.label then + if config.label then unified_inventory.set_category_label(category_name, config.label) end - if config and config.index then + if config.index then unified_inventory.set_category_index(category_name, config.index) end - if config and config.items then + if config.items then unified_inventory.add_category_items(category_name, config.items) end update_category_list() diff --git a/mods/unified_inventory/init.lua b/mods/unified_inventory/init.lua index 391eb3cc..00a3fc54 100644 --- a/mods/unified_inventory/init.lua +++ b/mods/unified_inventory/init.lua @@ -1,4 +1,4 @@ --- Unified Inventory for Minetest >= 0.4.16 +-- Unified Inventory local modpath = minetest.get_modpath(minetest.get_current_modname()) local worldpath = minetest.get_worldpath() @@ -166,7 +166,4 @@ if minetest.settings:get_bool("unified_inventory_bags") ~= false then end dofile(modpath.."/item_names.lua") - -if minetest.get_modpath("datastorage") then - dofile(modpath.."/waypoints.lua") -end +dofile(modpath.."/waypoints.lua") diff --git a/mods/unified_inventory/internal.lua b/mods/unified_inventory/internal.lua index f4d8b442..cdf71edb 100644 --- a/mods/unified_inventory/internal.lua +++ b/mods/unified_inventory/internal.lua @@ -29,6 +29,8 @@ local function formspec_button(ui_peruser, name, image, offset, pos, scale, labe local element = 'image_button' if minetest.registered_items[image] then element = 'item_image_button' + elseif image:find(":", 1, true) then + image = "unknown_item.png" end local spc = (1-scale)*ui_peruser.btn_size/2 local size = ui_peruser.btn_size*scale diff --git a/mods/unified_inventory/locale/unified_inventory.template.tr b/mods/unified_inventory/locale/template.txt similarity index 73% rename from mods/unified_inventory/locale/unified_inventory.template.tr rename to mods/unified_inventory/locale/template.txt index 2ea4fcaf..fd931d88 100644 --- a/mods/unified_inventory/locale/unified_inventory.template.tr +++ b/mods/unified_inventory/locale/template.txt @@ -1,54 +1,52 @@ # textdomain: unified_inventory - -# waypoints.lua - -White= -Yellow= -Red= -Green= -Blue= -Waypoints= -Select Waypoint #@1= -Waypoint @1= -Set waypoint to current location= -Make waypoint @1= -invisible= -visible= -@1 display of waypoint coordinates= -Disable= -Enable= -Change color of waypoint display= -Edit waypoint name= -Waypoint active= -Waypoint inactive= -Finish editing= -World position= -Name= -HUD text color= - -# group.lua - +Mixing= +Cooking= +Digging= +Bags= +Bag @1= +Small Bag= +Medium Bag= +Large Bag= +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = - -# register.lua - +Scroll categories left= +Scroll categories right= +Search= +Reset search and display everything= +First page= +Back three pages= +Back one page= +Forward one page= +Forward three pages= +Last page= +No matching items= +No matches.= +Page= +@1 of @2= +Filter= Can use the creative inventory= Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid= Crafting Guide= Set home position= Home position set to: @1= -You don't have the \"home\" privilege!= +You don't have the "home" privilege!= Go home= Set time to day= -Set time to night= Time of day set to 6am= -Time of day set to 9pm= You don't have the settime privilege!= +Set time to night= +Time of day set to 9pm= Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!= -This button has been disabled outside= -Crafting= Trash:= Refill:= Any item belonging to the @1 group= @@ -65,36 +63,28 @@ Show previous recipe= Show previous usage= @1 (@2)= Give me:= -This recipe is too@nlarge to be displayed.= +This recipe is too@@large to be displayed.= To craft grid:= All= - -# api.lua - -Mixing= -Cooking= -Digging= - -# internal.lua - -First page= -Back three pages= -Back one page= -Forward one page= -Forward three pages= -Last page= -Search= -Reset search and display everything= -No matching items= -No matches.= -Page= -@1 of @2= -Filter= - -# bags.lua - -Bags= -Bag @1= -Small Bag= -Medium Bag= -Large Bag= +Crafting= +White= +Yellow= +Red= +Green= +Blue= +Waypoints= +Select Waypoint #@1= +Waypoint @1= +Set waypoint to current location= +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display= +Edit waypoint name= +Waypoint active= +Waypoint inactive= +Finish editing= +World position= +Name= +HUD text color= diff --git a/mods/unified_inventory/locale/unified_inventory.de.tr b/mods/unified_inventory/locale/unified_inventory.de.tr index e2a05be1..474049c0 100644 --- a/mods/unified_inventory/locale/unified_inventory.de.tr +++ b/mods/unified_inventory/locale/unified_inventory.de.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Fertigung Mixing=Mischen Cooking=Kochen Digging=Graben @@ -8,21 +7,32 @@ Bag @1=Tasche @1 Small Bag=Kleine Tasche Medium Bag=Mittelgroße Tasche Large Bag=Große Tasche +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = und +Scroll categories left= +Scroll categories right= +Search=Suchen +Reset search and display everything=Suche zurücksetzen und alles anzeigen First page=Erste Seite Back three pages=3 Seiten zurückblättern Back one page=1 Seite zurückblättern Forward one page=1 Seite vorblättern Forward three pages=3 Seiten vorblättern Last page=Letzte Seite -Search=Suchen -Reset search and display everything=Suche zurücksetzen und alles anzeigen No matching items=Keine passenden Gegenstände No matches.=Keine Treffer Page=Seite @1 of @2=@1 von @2 Filter=Filter Can use the creative inventory=Kann das Kreativinventar nutzen +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Zwingt Unified Inventory, im Vollmodus angezeigt zu werden, wenn der Minimalmodus global eingestellt ist Crafting Grid=Fertigungsraster Crafting Guide=Fertigungsführer Set home position=Heimatposition setzen @@ -35,6 +45,7 @@ You don't have the settime privilege!=Du hast das „settime“-Privileg nicht! Set time to night=Zur Nachtzeit wechseln Time of day set to 9pm=Tageszeit auf 21 Uhr gesetzt Clear inventory=Inventar leeren +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventar geleert! Trash:=Müll: Refill:=Nachfüllen: @@ -50,9 +61,12 @@ 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 +@1 (@2)= Give me:=Gib mir: +This recipe is too@@large to be displayed.= To craft grid:=Ins Fertigungsraster: All=Alles +Crafting=Fertigung White=Weiß Yellow=Gelb Red=Rot @@ -62,12 +76,10 @@ Waypoints=Wegpunkte Select Waypoint #@1=Wegpunkt Nr. @1 auswählen Waypoint @1=Wegpunkt Nr. @1 Set waypoint to current location=Setze Wegpunkt zur derzeitigen Position -invisible=unsichtbar -visible=sichtbar -Make waypoint @1=Wegpunkt @1 machen -Disable=ausschalten -Enable=einschalten -@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Farbe der Darstellung der Wegpunkte ändern Edit waypoint name=Name des Wegpunkts ändern Waypoint active=Wegpunkt aktiv @@ -76,4 +88,13 @@ Finish editing=Bearbeitung abschließen World position=Weltposition Name=Name HUD text color=HUD-Textfarbe -Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Zwingt Unified Inventory, im Vollmodus angezeigt zu werden, wenn der Minimalmodus global eingestellt ist + + +##### not used anymore ##### + +invisible=unsichtbar +visible=sichtbar +Make waypoint @1=Wegpunkt @1 machen +Disable=ausschalten +Enable=einschalten +@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1 diff --git a/mods/unified_inventory/locale/unified_inventory.es.tr b/mods/unified_inventory/locale/unified_inventory.es.tr index 18b6c772..85a794ee 100644 --- a/mods/unified_inventory/locale/unified_inventory.es.tr +++ b/mods/unified_inventory/locale/unified_inventory.es.tr @@ -1,54 +1,57 @@ # textdomain: unified_inventory - -# waypoints.lua - -White=Blanco -Yellow=Amarillo -Red=Rojo -Green=Verde -Blue=Azul -Waypoints=Puntos -Select Waypoint #@1=Seleccionar Punto #@1 -Waypoint @1=Punto @1 -Set waypoint to current location=Establecer el punto a la ubicación actual -Make waypoint @1=Hacer punto @1 -invisible=invisible -visible=visible -@1 display of waypoint coordinates=Visualizar coordenadas del punto @1 -Disable=Deshabilitado -Enable=Habilitado -Change color of waypoint display=Cambiar el color del punto -Edit waypoint name=Editar nombre del punto -Waypoint active=Punto activo -Waypoint inactive=Punto inactivo -Finish editing=Terminar edición -World position=Posición en el mundo -Name=Nombre -HUD text color=Color del texto de la Interfaz - +# api.lua +Mixing=Mezclar +Cooking=Hornear +Digging=Recoger +# bags.lua +Bags=Bolsos +Bag @1=Bolso @1 +Small Bag=Bolso Pequeño +Medium Bag=Bolso Mediano +Large Bag=Bolso Grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= # group.lua - and = y - +Scroll categories left= +Scroll categories right= +Search=Buscar +Reset search and display everything=Limpiar la busqueda y mostrar todo +# internal.lua +First page=Primera página +Back three pages=Volver tres páginas +Back one page=Volver una página +Forward one page=Avanzar una página +Forward three pages=Avanzar tres páginas +Last page=Ultima Pagina +No matching items=No se encontraron elementos +No matches.=No hay resultados. +Page=Página +@1 of @2=@1 de @2 +Filter=Filtro # register.lua - Can use the creative inventory=Puede usar el inventario creativo Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Obliga al Inventario Unificado a mostrarse en modo Completo si el modo Simple está configurado globalmente Crafting Grid=Cuadricula de Elaboración Crafting Guide=Guía de Elaboración Set home position=Establecer posición de la casa Home position set to: @1=Posición de la casa cambiada a: @1 -You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"! +You don't have the "home" privilege!= Go home=Ir a casa Set time to day=Cambiar a dia -Set time to night=Cambiar a noche Time of day set to 6am=Hora del día cambiada a 6 AM -Time of day set to 9pm=Hora del día cambiada a 9 PM You don't have the settime privilege!=¡No tienes el privilegio "settime"! +Set time to night=Cambiar a noche +Time of day set to 9pm=Hora del día cambiada a 9 PM Clear inventory=Limpiar inventario +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=¡Inventario limpio! -This button has been disabled outside=Este botón ha sido deshabilitado -Crafting=Elaboración Trash:=Basura: Refill:=Rellenar: Any item belonging to the @1 group=Cualquier elemento que pertenezca al grupo @1 @@ -65,36 +68,41 @@ Show previous recipe=Mostrar la receta anterior Show previous usage=Mostrar el uso anterior @1 (@2)=@1 (@2) Give me:=Dame: -This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada. +This recipe is too@@large to be displayed.= To craft grid:=Construir: All=Todos +Crafting=Elaboración +White=Blanco +Yellow=Amarillo +Red=Rojo +Green=Verde +Blue=Azul +Waypoints=Puntos +Select Waypoint #@1=Seleccionar Punto #@1 +Waypoint @1=Punto @1 +Set waypoint to current location=Establecer el punto a la ubicación actual +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Cambiar el color del punto +Edit waypoint name=Editar nombre del punto +Waypoint active=Punto activo +Waypoint inactive=Punto inactivo +Finish editing=Terminar edición +World position=Posición en el mundo +Name=Nombre +HUD text color=Color del texto de la Interfaz -# api.lua -Mixing=Mezclar -Cooking=Hornear -Digging=Recoger +##### not used anymore ##### -# internal.lua - -First page=Primera página -Back three pages=Volver tres páginas -Back one page=Volver una página -Forward one page=Avanzar una página -Forward three pages=Avanzar tres páginas -Last page=Ultima Pagina -Search=Buscar -Reset search and display everything=Limpiar la busqueda y mostrar todo -No matching items=No se encontraron elementos -No matches.=No hay resultados. -Page=Página -@1 of @2=@1 de @2 -Filter=Filtro - -# bags.lua - -Bags=Bolsos -Bag @1=Bolso @1 -Small Bag=Bolso Pequeño -Medium Bag=Bolso Mediano -Large Bag=Bolso Grande +Make waypoint @1=Hacer punto @1 +invisible=invisible +visible=visible +@1 display of waypoint coordinates=Visualizar coordenadas del punto @1 +Disable=Deshabilitado +Enable=Habilitado +You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"! +This button has been disabled outside=Este botón ha sido deshabilitado +This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada. diff --git a/mods/unified_inventory/locale/unified_inventory.fr.tr b/mods/unified_inventory/locale/unified_inventory.fr.tr index 5367ddb0..96d8c3f5 100644 --- a/mods/unified_inventory/locale/unified_inventory.fr.tr +++ b/mods/unified_inventory/locale/unified_inventory.fr.tr @@ -1,5 +1,5 @@ # textdomain: unified_inventory -Crafting=Création +Mixing= Cooking=Cuisson Digging=Creuser Bags=Sacs @@ -7,35 +7,66 @@ Bag @1=Sac @1 Small Bag=Petit sac Medium Bag=Sac moyen Large Bag=Grand sac +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = et +Scroll categories left= +Scroll categories right= +Search=Rechercher +Reset search and display everything= 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 -Search=Rechercher No matching items=Aucun élément correspondant No matches.=Aucun match Page=Page @1 of @2=@1 de @2 Filter=Filtre Can use the creative inventory=Vous pouvez utiliser l'inventaire créatif +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Grille de création Crafting Guide=Guide de création Set home position=Position dans le monde Home position set to: @1=Position de votre base fixée à: @1 You don't have the "home" privilege!=Vous n'avez pas le privilège "home"! +Go home= +Set time to day= Time of day set to 6am=Heure fixée à 6h You don't have the settime privilege!=Vous n'avez pas le privilège "settime"! +Set time to night= Time of day set to 9pm=Heure fixée à 21h +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventaire vidé ! Trash:=Poubelle : Refill:=Remplir : +Any item belonging to the @1 group= +Any item belonging to the groups @1= Recipe @1 of @2=Recette @1 de @2 +Usage @1 of @2= +No recipes= +No usages= Result=Résultat +Ingredient= +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:= +This recipe is too@@large to be displayed.= To craft grid:=Sur de création: All=Tout +Crafting=Création White=Blanc Yellow=Jaune Red=Rouge @@ -45,8 +76,10 @@ Waypoints=Point de passage Select Waypoint #@1=Choisir un point de passage #@1 Waypoint @1=Point de passage @1 Set waypoint to current location=Marquer un point de passage à la position actuelle -Make waypoint @1=Rendre @1 le point de passage -@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Changer la couleur du point de passage Edit waypoint name=Editer le nom du point de passage Waypoint active=Point de passage actif @@ -55,3 +88,9 @@ Finish editing=Terminer l'édition World position=Position dans le monde Name=Nom HUD text color=Couleur de texte du HUD + + +##### not used anymore ##### + +Make waypoint @1=Rendre @1 le point de passage +@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages diff --git a/mods/unified_inventory/locale/unified_inventory.it.tr b/mods/unified_inventory/locale/unified_inventory.it.tr index 1bf76601..c30d9e08 100644 --- a/mods/unified_inventory/locale/unified_inventory.it.tr +++ b/mods/unified_inventory/locale/unified_inventory.it.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Assemblaggio Mixing=Unione Cooking=Cottura Digging=Scavo @@ -8,21 +7,32 @@ Bag @1=Borsa @1 Small Bag=Borsa piccola Medium Bag=Borsa media Large Bag=Borsa grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = e +Scroll categories left= +Scroll categories right= +Search=Cerca +Reset search and display everything=Azzera la ricerca e mostra tutto First page=Prima pagina Back three pages=Indietro di tre pagine Back one page=Indietro di una pagina Forward one page=Avanti di una pagina Forward three pages=Avanti di tre pagine Last page=Ultima pagina -Search=Cerca -Reset search and display everything=Azzera la ricerca e mostra tutto No matching items=Nessun oggetto corrispondente No matches.=Nessuna corrispondenza. Page=Pagina @1 of @2=@1 di @2 Filter=Filtro Can use the creative inventory=Può usare l'inventario creativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Forza la visualizzazione di Unified Inventory in modalità completa se è configurata globalmente la visualizzazione semplice Crafting Grid=Griglia di assemblaggio Crafting Guide=Guida di assemblaggio Set home position=Imposta la residenza @@ -35,6 +45,7 @@ You don't have the settime privilege!=Non hai il privilegio "time"! Set time to night=Imposta l'orario sulla notte Time of day set to 9pm=Orario impostato sulle 9am Clear inventory=Ripulisci l'inventario +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventario ripulito! Trash:=Butta: Refill:=Riempi: @@ -50,9 +61,12 @@ Show next recipe=Mostra la prossima ricetta Show next usage=Mostra il prossimo utilizzo Show previous recipe=Mostra la ricetta precedente Show previous usage=Mostra l'utilizzo precedente +@1 (@2)= Give me:=Dammi: +This recipe is too@@large to be displayed.= To craft grid:=Alla griglia di assemblaggio: All=Tutto +Crafting=Assemblaggio White=Bianco Yellow=Giallo Red=Rosso @@ -62,12 +76,10 @@ Waypoints=Tappe Select Waypoint #@1=Seleziona tappa n°@1 Waypoint @1=Tappa @1 Set waypoint to current location=Imposta tappa alla posizione attuale -invisible=invisibile -visible=visibile -Make waypoint @1=Crea tappa @1 -Disable=Disabilita -Enable=Abilita -@1 display of waypoint coordinates=@1 la visualizzazione delle coordinate della tappa +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Modifica il colore della visualizzazione della tappa Edit waypoint name=Modifica il nome della tappa Waypoint active=Tappa attiva @@ -76,4 +88,13 @@ Finish editing=Termina la modifica World position=Posizione del mondo Name=Nome HUD text color=Colore del testo del visore -Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Forza la visualizzazione di Unified Inventory in modalità completa se è configurata globalmente la visualizzazione semplice + + +##### not used anymore ##### + +invisible=invisibile +visible=visibile +Make waypoint @1=Crea tappa @1 +Disable=Disabilita +Enable=Abilita +@1 display of waypoint coordinates=@1 la visualizzazione delle coordinate della tappa diff --git a/mods/unified_inventory/locale/unified_inventory.ms.tr b/mods/unified_inventory/locale/unified_inventory.ms.tr index 25fc853f..be4eb5e3 100644 --- a/mods/unified_inventory/locale/unified_inventory.ms.tr +++ b/mods/unified_inventory/locale/unified_inventory.ms.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Pertukangan Mixing=Pencampuran Cooking=Pemasakan Digging=Penggalian @@ -8,21 +7,32 @@ Bag @1=Beg @1 Small Bag=Beg Kecil Medium Bag=Beg Sederhana Large Bag=Beg Besar +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = dan +Scroll categories left= +Scroll categories right= +Search=Cari +Reset search and display everything=Set semula carian dan tunjukkan semua benda First page=Halaman pertama Back three pages=Tiga halaman sebelumnya Back one page=Halaman sebelumnya Forward one page=Halaman seterusnya Forward three pages=Tiga halaman seterusnya Last page=Halaman terakhir -Search=Cari -Reset search and display everything=Set semula carian dan tunjukkan semua benda No matching items=Tiada item sepadan No matches.=Tiada padanan. Page=Halaman @1 of @2=@1 drpd @2 Filter=Tapis Can use the creative inventory=Boleh guna inventori kreatif +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Grid Pertukangan Crafting Guide=Panduan Pertukangan Set home position=Tetapkan kedudukan rumah @@ -35,6 +45,7 @@ You don't have the settime privilege!=Anda tidak ada keistimewaan settime! Set time to night=Tetapkan masa jadi malam Time of day set to 9pm=Masa ditetapkan ke 9 malam Clear inventory=Kosongkan inventori +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventori dikosongkan! Trash:=Buang: Refill:=Isi balik: @@ -52,7 +63,10 @@ Show previous recipe=Tunjuk resipi sebelumnya Show previous usage=Tunjuk kegunaan sebelumnya @1 (@2)=@1 (@2) Give me:=Beri saya: +This recipe is too@@large to be displayed.= To craft grid:=Ke grid pertukangan: +All= +Crafting=Pertukangan White=Putih Yellow=Kuning Red=Merah @@ -62,12 +76,10 @@ Waypoints=Titik Arah Select Waypoint #@1=Pilih Titik Arah #@1 Waypoint @1=Titik Arah @1 Set waypoint to current location=Tetapkan titik arah ke lokasi semasa -invisible=Sembunyikan -visible=Paparkan -Make waypoint @1=@1 titik arah -Disable=Sembunyikan -Enable=Paparkan -@1 display of waypoint coordinates=@1 koordinat untuk titik arah +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Tukar warna paparan titik arah Edit waypoint name=Edit nama titik arah Waypoint active=Titik arah aktif @@ -76,3 +88,13 @@ Finish editing=Selesai edit World position=Kedudukan dunia Name=Nama HUD text color=Warna tulisan HUD + + +##### not used anymore ##### + +invisible=Sembunyikan +visible=Paparkan +Make waypoint @1=@1 titik arah +Disable=Sembunyikan +Enable=Paparkan +@1 display of waypoint coordinates=@1 koordinat untuk titik arah diff --git a/mods/unified_inventory/locale/unified_inventory.pl.tr b/mods/unified_inventory/locale/unified_inventory.pl.tr index 19121d8d..69d39e37 100644 --- a/mods/unified_inventory/locale/unified_inventory.pl.tr +++ b/mods/unified_inventory/locale/unified_inventory.pl.tr @@ -1,22 +1,40 @@ # textdomain: unified_inventory +Mixing= +Cooking= +Digging= Bags=Plecaki Bag @1=Plecak @1 Small Bag=Maly plecak Medium Bag=Sredni plecak Large Bag=Duzy plecak +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = i +Scroll categories left= +Scroll categories right= +Search=Szukaj +Reset search and display everything= 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 -Search=Szukaj No matching items=Brak pasujacych przedmiotow No matches.=Brak wyników Page=Strona @1 of @2=@1 z @2 Filter=Filtr +Can use the creative inventory= +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid= +Crafting Guide= Set home position=Ustaw pozycję wyjściową Home position set to: @1=Pozycja domowa ustawiona na: @1 You don't have the "home" privilege!=Nie masz uprawnien do zmiany czasu "home"! @@ -27,17 +45,28 @@ You don't have the settime privilege!=Nie masz uprawnien do zmiany czasu "settim Set time to night=Ustaw czas na noc Time of day set to 9pm=Czas ustawiony na 21:00 Clear inventory=Wyczyść zapasy +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Zapasy zostały wyczyszczone! Trash:=Smietnik: Refill:=Uzupelnianie: +Any item belonging to the @1 group= +Any item belonging to the groups @1= Recipe @1 of @2=Recepta @1 z @2 Usage @1 of @2=Użycie @1 z @2 No recipes=Brak recepty No usages=Bez użycia Result=Wynik Ingredient=Składnik +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= Give me:=Daj mi: +This recipe is too@@large to be displayed.= +To craft grid:= All=Wszystko +Crafting= White=Bialy Yellow=Zolty Red=Czerwony @@ -47,10 +76,10 @@ Waypoints=Punkty orientacyjne Select Waypoint #@1=Wybierz punkt #@1 Waypoint @1=Punkty orientacyjne @1 Set waypoint to current location=Ustaw punkt orientacyjny na biezacej pozycji -invisible=niewidzialny -visible=widomy -Make waypoint @1=Robić punkt @1 -@1 display of waypoint coordinates=@1 koordynatow punktu +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Zmien kolor punktu Edit waypoint name=Edytuj nazwe punktu Waypoint active=Punkt wlaczony @@ -59,3 +88,11 @@ Finish editing=Zakoncz edycje World position=Pozycja Name=Nazwa HUD text color=Kolor tekstu HUD + + +##### not used anymore ##### + +invisible=niewidzialny +visible=widomy +Make waypoint @1=Robić punkt @1 +@1 display of waypoint coordinates=@1 koordynatow punktu diff --git a/mods/unified_inventory/locale/unified_inventory.pt.tr b/mods/unified_inventory/locale/unified_inventory.pt.tr index 3b0b902f..5fedbc05 100644 --- a/mods/unified_inventory/locale/unified_inventory.pt.tr +++ b/mods/unified_inventory/locale/unified_inventory.pt.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Artesanato Mixing=Muistura Cooking=Cozimento Digging=Escavação @@ -8,21 +7,32 @@ Bag @1=Bolsa @1 Small Bag=Bolsa Pequena Medium Bag=Bolsa Média Large Bag=Bolsa Grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = e +Scroll categories left= +Scroll categories right= +Search=Pesquisar +Reset search and display everything=Redefinir pesquisa e exibir tudo 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 -Search=Pesquisar -Reset search and display everything=Redefinir pesquisa e exibir tudo No matching items=Nenhum item correspondente No matches.=Sem correspondências Page=Página @1 of @2=@1 de @2 Filter=Filtro 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= Crafting Grid=Grade de Artesanato Crafting Guide=Guia de Artesanato Set home position=Definir posição de casa @@ -35,6 +45,7 @@ You don't have the settime privilege!=Você não tem o privilégio de "settime"! Set time to night=Definir turno para noite Time of day set to 9pm=Hora do dia ajustada para 21h Clear inventory=Limpar Inventário +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventário Apagado! Trash:=Lixo: Refill:=Recarga: @@ -50,9 +61,12 @@ 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 +@1 (@2)= Give me:=Gerado: +This recipe is too@@large to be displayed.= To craft grid:=Para Grade de Artesanato All=MAX +Crafting=Artesanato White=Branco Yellow=Amarelo Red=Vermelho @@ -62,10 +76,10 @@ Waypoints=Apontador de Direção Select Waypoint #@1=Seleção de Apontador de Direção #@1 Waypoint @1=Apontador de Direção @1 Set waypoint to current location=Configurar localização atual do Apontador de Direção -invisible=invisível -visible=visível -Make waypoint @1=Fazer Apontador de Direção @1 -@1 display of waypoint coordinates=@1 exibição de coordenadas de Fazer Apontador de Direção +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Mudar cor exibida do Apontador de Direção Edit waypoint name=Editar Nome de Apontador de Direção Waypoint active=Apontador de Direção Ativo @@ -74,3 +88,11 @@ Finish editing=Edição Finalizada World position=Posição Mundial Name=Nome HUD text color=Cor de HUD + + +##### not used anymore ##### + +invisible=invisível +visible=visível +Make waypoint @1=Fazer Apontador de Direção @1 +@1 display of waypoint coordinates=@1 exibição de coordenadas de Fazer Apontador de Direção diff --git a/mods/unified_inventory/locale/unified_inventory.ru.tr b/mods/unified_inventory/locale/unified_inventory.ru.tr index f2a23007..2e3489c2 100644 --- a/mods/unified_inventory/locale/unified_inventory.ru.tr +++ b/mods/unified_inventory/locale/unified_inventory.ru.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Крафт Mixing=Мешать Cooking=Варить Digging=Копать @@ -8,21 +7,32 @@ Bag @1=Сумка @1 Small Bag=Малая сумка Medium Bag=Средняя сумка Large Bag=Большая сумка +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = и +Scroll categories left= +Scroll categories right= +Search=Поиск +Reset search and display everything=Сброс поиска, показать всё First page=Первая страница Back three pages=3 страницы назад Back one page=1 страницу назад Forward one page=1 страницу вперёд Forward three pages=3 страницы вперёд Last page=Последняя страница -Search=Поиск -Reset search and display everything=Сброс поиска, показать всё No matching items=Нет подходящих элементов No matches.=Ничего не найдено Page=Страница @1 of @2=@1 из @2 Filter=Фильтр Can use the creative inventory=Можно использовать инвентарь творческого режима +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Решетка крафта Crafting Guide=Книга рецептов Set home position=Установить позицию дома @@ -35,6 +45,7 @@ You don't have the settime privilege!=Вам не разрешено устан Set time to night=Ночь Time of day set to 9pm=Установлено время 9 вечера Clear inventory=Очистить инвентарь +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Инвентарь очищен! Trash:=Мусор: Refill:=Наполнить: @@ -50,9 +61,12 @@ Show next recipe=Следующий рецепт Show next usage=Следующее использование Show previous recipe=Прошлый рецепт Show previous usage=Прошлая страница +@1 (@2)= Give me:=Дай мне: +This recipe is too@@large to be displayed.= To craft grid:=На решeтку крафта: All=Все +Crafting=Крафт White=Белый Yellow=Желтый Red=Красный @@ -62,12 +76,10 @@ Waypoints=Путевые точки Select Waypoint #@1=Выбрать путевую точку №@1 Waypoint @1=Путевая точка @1 Set waypoint to current location=Установить путевую точку по текущей позиции -invisible=невидимой -visible=видимой -Make waypoint @1=Сделать путевую точку @1 -Disable=Выключить -Enable=Включить -@1 display of waypoint coordinates=@1 показ координат путевых точек +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Поменять цвет путевой точки Edit waypoint name=Переименовать путевую точку Waypoint active=Путевая точка включена @@ -76,3 +88,13 @@ Finish editing=Закончить редакцию World position=Позиция мира Name=Имя HUD text color=Цвет текста HUDа + + +##### not used anymore ##### + +invisible=невидимой +visible=видимой +Make waypoint @1=Сделать путевую точку @1 +Disable=Выключить +Enable=Включить +@1 display of waypoint coordinates=@1 показ координат путевых точек diff --git a/mods/unified_inventory/locale/unified_inventory.tr.tr b/mods/unified_inventory/locale/unified_inventory.tr.tr index 93246cc1..b4e15b8a 100644 --- a/mods/unified_inventory/locale/unified_inventory.tr.tr +++ b/mods/unified_inventory/locale/unified_inventory.tr.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Üretim Mixing=Karıştırma Cooking=Pişirme Digging=Kazma @@ -8,20 +7,32 @@ Bag @1=@1. Çanta Small Bag=Küçük Çanta Medium Bag=Çanta Large Bag=Büyük Çanta +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = ve +Scroll categories left= +Scroll categories right= +Search=Ara +Reset search and display everything= 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 -Search=Ara No matching items=Eşleşme yok No matches.=Eşleşme yok Page=Sayfa @1 of @2=@1 dan @2 Filter=Süzgeç Can use the creative inventory=Yaratıcı envanteri kullanabilir +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Üretim tablosu Crafting Guide=Kılavuz Set home position=Set ev pozisyon @@ -33,19 +44,29 @@ Time of day set to 6am=Saat 06:00 olarak ayarlandı You don't have the settime privilege!="settime" yetkiniz yok! Set time to night=Geceye zaman ayarla Time of day set to 9pm=Saat 19:00 olarak ayarlandı -msgid ""=Yaratıcı modu dışında iken bu tuş kullanılamaz. +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Envanter temizlendi! Trash:=Çöp Refill:=Doldur +Any item belonging to the @1 group= +Any item belonging to the groups @1= Recipe @1 of @2=@1 dan @2 tarifi Usage @1 of @2=Kullanım @1/@2 No recipes=Tarifi yok No usages=Kullanım yok Result=Çıktı Ingredient=Bileşen +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= Give me:=Ver bana: +This recipe is too@@large to be displayed.= To craft grid:=Üretim tablosuna kopyala All=Tümü +Crafting=Üretim White=Beyaz Yellow=Sarı Red=Kırmızı @@ -55,10 +76,10 @@ Waypoints=Konum Noktaları Select Waypoint #@1=#@1 konum noktası seç Waypoint @1=@1 Konum Noktaları Set waypoint to current location=Bulunduğun noktayı işaretle -invisible=görünmez -visible=görünür -Make waypoint @1=Yol noktası @1 -@1 display of waypoint coordinates=Yol noktası koordinatlarının görüntülenmesini @1 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Konum Gösterge Rengi Edit waypoint name=Konum Noktasını Düzenle Waypoint active=Konum Etkin @@ -67,3 +88,12 @@ Finish editing=Düzenleme bitti World position=Dünya konumu Name=İsim HUD text color=Metin rengi + + +##### not used anymore ##### + +msgid ""=Yaratıcı modu dışında iken bu tuş kullanılamaz. +invisible=görünmez +visible=görünür +Make waypoint @1=Yol noktası @1 +@1 display of waypoint coordinates=Yol noktası koordinatlarının görüntülenmesini @1 diff --git a/mods/unified_inventory/locale/unified_inventory.zh_CN.tr b/mods/unified_inventory/locale/unified_inventory.zh_CN.tr index 30e15e37..595a492d 100644 --- a/mods/unified_inventory/locale/unified_inventory.zh_CN.tr +++ b/mods/unified_inventory/locale/unified_inventory.zh_CN.tr @@ -1,8 +1,4 @@ # textdomain: unified_inventory -# traslation by: IFRFSX(BingFengFSX) -#Email: IFRFSX@Protonmail.com - -Crafting=合成 Mixing=混合 Cooking=烹饪 Digging=挖出 @@ -11,20 +7,32 @@ Bag @1=背包@1 Small Bag=小背包 Medium Bag=中背包 Large Bag=大背包 +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = 和 +Scroll categories left= +Scroll categories right= +Search=搜索 +Reset search and display everything=重置搜索并显示所有物品 First page=第一页 Back three pages=后退三页 Back one page=后退一页 Forward one page=前进一页 Forward three pages=前进三页 Last page=最后一页 -Search=搜索 No matching items=没有匹配物品 No matches.=没有匹配 Page=页面 @1 of @2=第@1页,共@2页 Filter=过滤器 Can use the creative inventory=可以使用创造背包 +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=合成表 Crafting Guide=合成指南 Set home position=设置家的位置 @@ -36,21 +44,29 @@ Time of day set to 6am=时间设置到早晨6点 You don't have the settime privilege!=你没有“settime”权限! Set time to night=设置时间到晚上 Time of day set to 9pm=时间设置到晚上9点 - -Inventory cleared!=清空背包 Clear inventory=清空背包 - +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=清空背包 Trash:=丢弃: Refill:=填满: +Any item belonging to the @1 group=属于@1组的任何项目 +Any item belonging to the groups @1=属于组@1的任何项目 Recipe @1 of @2=第@1配方,共@2个 Usage @1 of @2=第@1用法,共@2个 No recipes=没有配方 No usages=没有用法 Result=结果 Ingredient=原料 +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= Give me:=给予: +This recipe is too@@large to be displayed.= To craft grid:=填充物品到合成表 All=全部 +Crafting=合成 White=白 Yellow=黄 Red=红 @@ -60,10 +76,10 @@ Waypoints=航路点 Select Waypoint #@1=查询航路点 #@1 Waypoint @1=航路点 @1 Set waypoint to current location=将航路点设置到当前位置 -invisible=不可见的 -visible=可见的 -Make waypoint @1=设置航路点 @1 -@1 display of waypoint coordinates=显示航路点@1坐标 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=改变航路点显示的颜色 Edit waypoint name=编辑航路点名称 Waypoint active=航路点已激活 @@ -73,7 +89,10 @@ World position=世界位置 Name=名称 HUD text color=HUD文本颜色 -Reset search and display everything=重置搜索并显示所有物品 -Any item belonging to the @1 group=属于@1组的任何项目 -Any item belonging to the groups @1=属于组@1的任何项目 +##### not used anymore ##### + +invisible=不可见的 +visible=可见的 +Make waypoint @1=设置航路点 @1 +@1 display of waypoint coordinates=显示航路点@1坐标 diff --git a/mods/unified_inventory/locale/unified_inventory.zh_TW.tr b/mods/unified_inventory/locale/unified_inventory.zh_TW.tr index 3e8d1a17..f41190ce 100644 --- a/mods/unified_inventory/locale/unified_inventory.zh_TW.tr +++ b/mods/unified_inventory/locale/unified_inventory.zh_TW.tr @@ -1,8 +1,4 @@ # textdomain: unified_inventory -# traslation by: IFRFSX(BingFengFSX) -#Email: IFRFSX@Protonmail.com - -Crafting=合成 Mixing=混合 Cooking=烹飪 Digging=挖出 @@ -11,20 +7,32 @@ Bag @1=揹包@1 Small Bag=小揹包 Medium Bag=中揹包 Large Bag=大揹包 +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = 和 +Scroll categories left= +Scroll categories right= +Search=搜索 +Reset search and display everything=重置搜索並顯示所有物品 First page=第一頁 Back three pages=後退三頁 Back one page=後退一頁 Forward one page=前進一頁 Forward three pages=前進三頁 Last page=最後一頁 -Search=搜索 No matching items=沒有匹配物品 No matches.=沒有匹配 Page=頁面 @1 of @2=第@1頁,共@2頁 Filter=過濾器 Can use the creative inventory=可以使用創造揹包 +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=合成表 Crafting Guide=合成指南 Set home position=設置家的位置 @@ -36,21 +44,29 @@ Time of day set to 6am=時間設置到早晨6點 You don't have the settime privilege!=你沒有“settime”權限! Set time to night=設置時間到晚上 Time of day set to 9pm=時間設置到晚上9點 - -Inventory cleared!=清空揹包 Clear inventory=清空揹包 - +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=清空揹包 Trash:=丟棄: Refill:=填滿: +Any item belonging to the @1 group=屬於@1組的任何項目 +Any item belonging to the groups @1=屬於組@1的任何項目 Recipe @1 of @2=第@1配方,共@2個 Usage @1 of @2=第@1用法,共@2個 No recipes=沒有配方 No usages=沒有用法 Result=結果 Ingredient=原料 +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= Give me:=給予: +This recipe is too@@large to be displayed.= To craft grid:=填充物品到合成表 All=全部 +Crafting=合成 White=白 Yellow=黃 Red=紅 @@ -60,10 +76,10 @@ Waypoints=航路點 Select Waypoint #@1=查詢航路點 #@1 Waypoint @1=航路點 @1 Set waypoint to current location=將航路點設置到當前位置 -invisible=不可見的 -visible=可見的 -Make waypoint @1=設置航路點 @1 -@1 display of waypoint coordinates=顯示航路點@1座標 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=改變航路點顯示的顏色 Edit waypoint name=編輯航路點名稱 Waypoint active=航路點已激活 @@ -73,7 +89,10 @@ World position=世界位置 Name=名稱 HUD text color=HUD文本顏色 -Reset search and display everything=重置搜索並顯示所有物品 -Any item belonging to the @1 group=屬於@1組的任何項目 -Any item belonging to the groups @1=屬於組@1的任何項目 +##### not used anymore ##### + +invisible=不可見的 +visible=可見的 +Make waypoint @1=設置航路點 @1 +@1 display of waypoint coordinates=顯示航路點@1座標 diff --git a/mods/unified_inventory/mod.conf b/mods/unified_inventory/mod.conf index 89be5287..3d27d299 100644 --- a/mods/unified_inventory/mod.conf +++ b/mods/unified_inventory/mod.conf @@ -1,6 +1,6 @@ name = unified_inventory -depends = default -optional_depends = creative, sfinv, datastorage, farming + +optional_depends = default, creative, sfinv, datastorage, farming description = """ Unified Inventory replaces the default survival and creative inventory. It adds a nicer interface and a number of features, such as a crafting guide. diff --git a/mods/unified_inventory/waypoints.lua b/mods/unified_inventory/waypoints.lua index 2a8ead43..08fce388 100644 --- a/mods/unified_inventory/waypoints.lua +++ b/mods/unified_inventory/waypoints.lua @@ -1,6 +1,7 @@ local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape local ui = unified_inventory +local COUNT = 5 local hud_colors = { {"#FFFFFF", 0xFFFFFF, S("White")}, @@ -10,11 +11,97 @@ local hud_colors = { {"#2c4df1", 0x2c4df1, S("Blue")}, } -local hud_colors_max = #hud_colors +-- Storage compatibility code --- Stores temporary player data (persists until player leaves) +--[[ +Stores temporary player data (persists until player leaves) + [player_name] = { + [] = { + edit = , + hud = , + }, + [] = { ... }, + ... + } +]] local waypoints_temp = {} +--[[ +Datastorage format (per-player): + { + selected = , + [] = { + name = + world_pos = , + color = <"hud_colors" index>, + active = , + display_pos = , + }, + [] = { ... }, + ... + } +Player metadata format: + { + selected = , + -- Cannot mix integer/string keys in JSON + data = { + [] = { same as above }, + ... + } + } +]] + +local function set_waypoint_data(player, waypoints) + local meta = player:get_meta() + if not next(waypoints.data or {}) then + -- Empty data. Do not save anything, or delete + meta:set_string("ui_waypoints", "") + else + meta:set_string("ui_waypoints", minetest.write_json(waypoints)) + end +end + +local function migrate_datastorage(player, waypoints) + -- Copy values from old table + local new_data = { + selected = waypoints.selected, + data = {} + } + for i = 1, COUNT do + new_data.data[i] = waypoints[i] + end + + set_waypoint_data(player, new_data) + + -- Delete values, but keep one entry so that it's saved by datastorage + for k, _ in pairs(waypoints) do + waypoints[k] = nil + end + waypoints[1] = 1 +end + +local have_datastorage = minetest.get_modpath("datastorage") ~= nil +local function get_waypoint_data(player) + local player_name = player:get_player_name() + + -- Migration step + if have_datastorage then + local waypoints = datastorage.get(player_name, "waypoints") + if waypoints.selected then + migrate_datastorage(player, waypoints) + minetest.log("action", "[unified_inventory] " .. + "Migrated waypoints of player: " .. player_name) + end + end + + -- Get directly from metadata + local waypoints = player:get_meta():get("ui_waypoints") + waypoints = waypoints and minetest.parse_json(waypoints) or {} + waypoints.data = waypoints.data or {} + + return waypoints +end + ui.register_page("waypoints", { get_formspec = function(player) local player_name = player:get_player_name() @@ -24,73 +111,83 @@ ui.register_page("waypoints", { local wp_buttons_rj = ui.style_full.std_inv_x + 10.1 - ui.style_full.btn_spc local wp_edit_w = ui.style_full.btn_spc * 4 - 0.1 - -- build a "fake" temp entry if the server took too long - -- during sign-on and returned an empty entry - if not waypoints_temp[player_name] then waypoints_temp[player_name] = {hud = 1} end + local waypoints = get_waypoint_data(player) + local sel = waypoints.selected or 1 - local waypoints = datastorage.get(player_name, "waypoints") - local formspec = { ui.style_full.standard_inv_bg, + local formspec = { + ui.style_full.standard_inv_bg, string.format("label[%f,%f;%s]", - ui.style_full.form_header_x, ui.style_full.form_header_y, - F(S("Waypoints"))), + ui.style_full.form_header_x, ui.style_full.form_header_y, F(S("Waypoints"))), "image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" } local n=4 -- Tabs buttons: - for i = 1, 5 do + for i = 1, COUNT do local sw="select_waypoint"..i formspec[n] = string.format("image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;]", ui.style_full.main_button_x, wp_bottom_row - (5-i) * ui.style_full.btn_spc, ui.style_full.btn_size, ui.style_full.btn_size, - (i == waypoints.selected) and "ui_blue_icon_background.png^" or "", + (i == sel) and "ui_blue_icon_background.png^" or "", i, sw) formspec[n+1] = "tooltip["..sw..";"..S("Select Waypoint #@1", i).."]" n = n + 2 end - local i = waypoints.selected or 1 - local waypoint = waypoints[i] or {} - local temp = waypoints_temp[player_name][i] or {} - local default_name = S("Waypoint @1", i) + local waypoint = waypoints.data[sel] or {} + local temp = waypoints_temp[player_name][sel] or {} + local default_name = S("Waypoint @1", sel) -- Main buttons: local btnlist = { - { "ui_waypoint_set_icon.png", "set_waypoint", S("Set waypoint to current location") }, - { waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", "toggle_waypoint", S("Make waypoint @1", waypoint.active and "invisible" or "visible") }, - { waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or "ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)", "toggle_display_pos", S("@1 display of waypoint coordinates", waypoint.display_pos and "Disable" or "Enable") }, - { "ui_circular_arrows_icon.png", "toggle_color", S("Change color of waypoint display") }, - { "ui_pencil_icon.png", "rename_waypoint", S("Edit waypoint name") } + set_waypoint = { + "ui_waypoint_set_icon.png", + S("Set waypoint to current location") + }, + toggle_waypoint = { + waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", + waypoint.active and S("Hide waypoint") or S("Show waypoint") + }, + toggle_display_pos = { + waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or "ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)", + waypoint.display_pos and S("Hide coordinates") or S("Show coordinates") + }, + toggle_color = { + "ui_circular_arrows_icon.png", + S("Change color of waypoint display") + }, + rename_waypoint = { + "ui_pencil_icon.png", + S("Edit waypoint name") + } } local x = 4 - for _, b in pairs(btnlist) do + for name, def in pairs(btnlist) do formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]", wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row, ui.style_full.btn_size, ui.style_full.btn_size, - b[1], b[2], i) - formspec[n+1] = "tooltip["..b[2]..i..";"..F(b[3]).."]" + def[1], name, sel) + formspec[n+1] = "tooltip["..name..sel..";"..F(def[2]).."]" x = x - 1 n = n + 2 end -- Waypoint's info: - formspec[n] = "label["..wp_info_x..","..(wp_info_y+1.1)..";" - if waypoint.active then - formspec[n+1] = F(S("Waypoint active")).."]" - else - formspec[n+1] = F(S("Waypoint inactive")).."]" - end - n = n + 2 + formspec[n] = ("label[%f,%f;%s]"):format( + wp_info_x, wp_info_y + 1.1, + F(waypoint.active and S("Waypoint active") or S("Waypoint inactive")) + ) + n = n + 1 if temp.edit then formspec[n] = string.format("field[%f,%f;%f,%f;rename_box%i;;%s]", wp_buttons_rj - wp_edit_w - 0.1, wp_bottom_row - ui.style_full.btn_spc, - wp_edit_w, ui.style_full.btn_size, i, (waypoint.name or default_name)) + wp_edit_w, ui.style_full.btn_size, sel, (waypoint.name or default_name)) formspec[n+1] = string.format("image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;]", wp_buttons_rj, wp_bottom_row - ui.style_full.btn_spc, - ui.style_full.btn_size, ui.style_full.btn_size, i) - formspec[n+2] = "tooltip[confirm_rename"..i..";"..F(S("Finish editing")).."]" + ui.style_full.btn_size, ui.style_full.btn_size, sel) + formspec[n+2] = "tooltip[confirm_rename"..sel..";"..F(S("Finish editing")).."]" n = n + 3 end @@ -114,10 +211,12 @@ ui.register_button("waypoints", { }) local function update_hud(player, waypoints, temp, i) - local waypoint = waypoints[i] + local waypoint = waypoints.data[i] if not waypoint then return end + temp[i] = temp[i] or {} temp = temp[i] + local pos = waypoint.world_pos or vector.new() local name if waypoint.display_pos then @@ -126,10 +225,13 @@ local function update_hud(player, waypoints, temp, i) name = name..", "..waypoint.name end else - name = waypoint.name or "Waypoint "..i + name = waypoint.name or S("Waypoint @1", i) end + + -- Perform HUD updates if temp.hud then player:hud_remove(temp.hud) + temp.hud = nil end if waypoint.active then temp.hud = player:hud_add({ @@ -139,8 +241,6 @@ local function update_hud(player, waypoints, temp, i) text = "m", world_pos = pos }) - else - temp.hud = nil end end @@ -152,9 +252,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local need_update_hud = false local hit = false - local waypoints = datastorage.get(player_name, "waypoints") + local waypoints = get_waypoint_data(player) local temp = waypoints_temp[player_name] - for i = 1, 5, 1 do + for i = 1, COUNT do + local waypoint = waypoints.data[i] or {} + if fields["select_waypoint"..i] then hit = true waypoints.selected = i @@ -163,20 +265,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields["toggle_waypoint"..i] then hit = true - waypoints[i] = waypoints[i] or {} - waypoints[i].active = not (waypoints[i].active) + waypoint.active = not (waypoint.active) need_update_hud = true update_formspec = true end if fields["set_waypoint"..i] then hit = true - local pos = player:get_pos() - pos.x = math.floor(pos.x) - pos.y = math.floor(pos.y) - pos.z = math.floor(pos.z) - waypoints[i] = waypoints[i] or {} - waypoints[i].world_pos = pos + local pos = vector.round(player:get_pos()) + waypoint.world_pos = pos need_update_hud = true update_formspec = true end @@ -190,39 +287,45 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields["toggle_display_pos"..i] then hit = true - waypoints[i] = waypoints[i] or {} - waypoints[i].display_pos = not waypoints[i].display_pos + waypoint.display_pos = not waypoint.display_pos need_update_hud = true update_formspec = true end if fields["toggle_color"..i] then hit = true - waypoints[i] = waypoints[i] or {} - local color = waypoints[i].color or 1 + local color = waypoint.color or 0 color = color + 1 - if color > hud_colors_max then + if color > #hud_colors then color = 1 end - waypoints[i].color = color + waypoint.color = color need_update_hud = true update_formspec = true end if fields["confirm_rename"..i] then hit = true - waypoints[i] = waypoints[i] or {} + temp[i] = temp[i] or {} temp[i].edit = false - waypoints[i].name = fields["rename_box"..i] + waypoint.name = fields["rename_box"..i] need_update_hud = true update_formspec = true end + + if hit then + -- Save first + waypoints.data[i] = waypoint + set_waypoint_data(player, waypoints) + end + -- Update after if need_update_hud then update_hud(player, waypoints, temp, i) end if update_formspec then ui.set_inventory_formspec(player, "waypoints") end + if hit then return end end end) @@ -230,11 +333,11 @@ end) minetest.register_on_joinplayer(function(player) local player_name = player:get_player_name() - local waypoints = datastorage.get(player_name, "waypoints") - local temp = {} - waypoints_temp[player_name] = temp - for i = 1, 5 do - update_hud(player, waypoints, temp, i) + local waypoints = get_waypoint_data(player) + + waypoints_temp[player_name] = {} + for i = 1, COUNT do + update_hud(player, waypoints, waypoints_temp[player_name], i) end end) diff --git a/mods/xdecor/src/workbench.lua b/mods/xdecor/src/workbench.lua index 66567f19..b2252dd5 100644 --- a/mods/xdecor/src/workbench.lua +++ b/mods/xdecor/src/workbench.lua @@ -36,8 +36,15 @@ workbench.defs = { local repairable_tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"} +local custom_repairable = {} +function xdecor:register_repairable(item) + custom_repairable[item] = true +end + -- Tools allowed to be repaired function workbench:repairable(stack) + if custom_repairable[stack] then return true end + for _, t in ipairs(repairable_tools) do if stack:find(t) then return true @@ -45,6 +52,11 @@ function workbench:repairable(stack) end end +-- method to allow other mods to check if an item is repairable +function xdecor:is_repairable(stack) + return workbench:repairable(stack) +end + function workbench:get_output(inv, input, name) local output = {} for i = 1, #self.defs do