From 2c901a7c6725b44f19ba81dd5e2b3d290db20e57 Mon Sep 17 00:00:00 2001 From: VanessaE Date: Sun, 12 Jul 2020 08:03:52 -0400 Subject: [PATCH] update bakedclay, basic_materials, bonemeal, currency, farming_redo, maptools, mesecons, moreblocks, moreores, new_campfire, cool_trees, pipeworks, staines_glass, technic, unified_inventory, and unifieddyes. --- bakedclay/README.md | 3 + bakedclay/init.lua | 39 ++ bakedclay/settingtypes.txt | 2 + basic_materials/.luacheckrc | 30 ++ basic_materials/init.lua | 1 + basic_materials/metals.lua | 16 +- basic_materials/plastics.lua | 1 + bonemeal/init.lua | 3 +- bonemeal/locale/bonemeal.es.tr | 6 + bonemeal/locale/bonemeal.fr.tr | 6 + bonemeal/locale/bonemeal.it.tr | 6 + bonemeal/locale/bonemeal.ru.tr | 6 + bonemeal/locale/es.txt | 7 + bonemeal/locale/it.txt | 7 + bonemeal/locale/template.tr | 6 + bonemeal/locale/template.txt | 10 +- bonemeal/mods.lua | 3 +- currency/locale/currency.de.tr | 2 +- currency/locale/currency.it.tr | 45 +++ farming/README.md | 3 +- farming/compatibility.lua | 12 +- farming/crops/barley.lua | 51 ++- farming/crops/beans.lua | 48 ++- farming/crops/beetroot.lua | 34 +- farming/crops/blueberry.lua | 30 +- farming/crops/cabbage.lua | 69 ++++ farming/crops/carrot.lua | 54 +-- farming/crops/chili.lua | 46 +-- farming/crops/cocoa.lua | 67 ++-- farming/crops/coffee.lua | 39 +- farming/crops/corn.lua | 56 +-- farming/crops/cotton.lua | 96 +++-- farming/crops/cucumber.lua | 24 +- farming/crops/garlic.lua | 44 ++- farming/crops/grapes.lua | 58 ++- farming/crops/hemp.lua | 70 ++-- farming/crops/melon.lua | 51 ++- farming/crops/mint.lua | 28 +- farming/crops/onion.lua | 28 +- farming/crops/peas.lua | 28 +- farming/crops/pepper.lua | 36 +- farming/crops/pineapple.lua | 61 +-- farming/crops/potato.lua | 38 +- farming/crops/pumpkin.lua | 85 ++--- farming/crops/raspberry.lua | 28 +- farming/crops/rhubarb.lua | 28 +- farming/crops/ryeoatrice.lua | 30 +- farming/crops/tomato.lua | 45 +-- farming/crops/wheat.lua | 80 ++-- farming/farming.conf_example | 1 + farming/food.lua | 172 ++++++++- farming/grass.lua | 18 +- farming/hoes.lua | 28 +- farming/init.lua | 18 +- farming/locale/it.txt | 194 ++++++++++ farming/locale/ru.txt | 257 +++++++------ farming/mapgen.lua | 32 +- farming/soil.lua | 2 +- farming/statistics.lua | 11 + farming/textures/farming_apple_pie.png | Bin 0 -> 200 bytes farming/textures/farming_bibimbap.png | Bin 0 -> 372 bytes farming/textures/farming_cabbage.png | Bin 0 -> 294 bytes farming/textures/farming_cabbage_1.png | Bin 0 -> 103 bytes farming/textures/farming_cabbage_2.png | Bin 0 -> 221 bytes farming/textures/farming_cabbage_3.png | Bin 0 -> 238 bytes farming/textures/farming_cabbage_4.png | Bin 0 -> 270 bytes farming/textures/farming_cabbage_5.png | Bin 0 -> 257 bytes farming/textures/farming_cabbage_6.png | Bin 0 -> 283 bytes farming/textures/farming_cactus_juice.png | Bin 0 -> 167 bytes farming/textures/farming_cotton_wild.png | Bin 0 -> 228 bytes farming/textures/farming_pasta.png | Bin 0 -> 143 bytes farming/textures/farming_spaghetti.png | Bin 0 -> 242 bytes farming/utensils.lua | 40 +- maptools/.luacheckrc | 8 +- maptools/CHANGELOG.md | 7 +- maptools/NODES_ITEMS.md | 1 + maptools/init.lua | 3 +- maptools/intllib.lua | 44 --- maptools/locale/es.txt | 39 -- maptools/locale/fr.txt | 47 --- maptools/locale/it.txt | 47 --- maptools/locale/maptools.es.tr | 38 ++ maptools/locale/maptools.fr.tr | 46 +++ maptools/locale/maptools.it.tr | 46 +++ maptools/locale/maptools.template.tr | 46 +++ maptools/mod.conf | 3 +- maptools/nodes.lua | 16 + mesecons/depends.txt | 1 - mesecons/mod.conf | 2 + mesecons_alias/depends.txt | 1 - mesecons_alias/mod.conf | 2 + mesecons_blinkyplant/depends.txt | 1 - mesecons_blinkyplant/mod.conf | 2 + mesecons_button/depends.txt | 2 - mesecons_button/mod.conf | 2 + mesecons_commandblock/depends.txt | 1 - mesecons_commandblock/mod.conf | 2 + mesecons_delayer/depends.txt | 1 - mesecons_delayer/mod.conf | 2 + mesecons_detector/depends.txt | 2 - mesecons_detector/mod.conf | 2 + mesecons_doors/depends.txt | 2 - mesecons_doors/mod.conf | 2 + mesecons_extrawires/corner.lua | 5 +- mesecons_extrawires/depends.txt | 3 - mesecons_extrawires/mod.conf | 3 + mesecons_extrawires/tjunction.lua | 1 - mesecons_fpga/depends.txt | 2 - mesecons_fpga/mod.conf | 3 + mesecons_fpga/sounds/mesecons_fpga_copy.ogg | Bin 0 -> 7249 bytes mesecons_fpga/sounds/mesecons_fpga_fail.ogg | Bin 0 -> 8633 bytes mesecons_fpga/sounds/mesecons_fpga_write.ogg | Bin 0 -> 5706 bytes mesecons_fpga/tool.lua | 4 + mesecons_gates/depends.txt | 6 - mesecons_gates/mod.conf | 2 + mesecons_hydroturbine/depends.txt | 1 - mesecons_hydroturbine/mod.conf | 2 + mesecons_insulated/depends.txt | 2 - mesecons_insulated/mod.conf | 3 + mesecons_lamp/depends.txt | 1 - mesecons_lamp/mod.conf | 2 + mesecons_lightstone/depends.txt | 2 - mesecons_lightstone/mod.conf | 2 + mesecons_luacontroller/depends.txt | 1 - mesecons_luacontroller/mod.conf | 2 + mesecons_materials/depends.txt | 1 - mesecons_materials/mod.conf | 2 + mesecons_microcontroller/depends.txt | 1 - mesecons_microcontroller/mod.conf | 2 + mesecons_movestones/depends.txt | 3 - mesecons_movestones/mod.conf | 2 + mesecons_mvps/depends.txt | 1 - mesecons_mvps/mod.conf | 2 + mesecons_noteblock/depends.txt | 1 - mesecons_noteblock/mod.conf | 2 + mesecons_pistons/depends.txt | 2 - mesecons_pistons/mod.conf | 2 + mesecons_powerplant/depends.txt | 1 - mesecons_powerplant/mod.conf | 2 + mesecons_pressureplates/depends.txt | 1 - mesecons_pressureplates/mod.conf | 2 + mesecons_random/depends.txt | 1 - mesecons_random/mod.conf | 2 + mesecons_receiver/depends.txt | 1 - mesecons_receiver/mod.conf | 2 + mesecons_solarpanel/depends.txt | 2 - .../doc/solarpanel/preview.png | Bin 55932 -> 55278 bytes mesecons_solarpanel/doc/solarpanel/recipe.png | Bin 3398 -> 3203 bytes mesecons_solarpanel/init.lua | 108 ++---- mesecons_solarpanel/mod.conf | 2 + .../textures/jeija_solar_panel.png | Bin 612 -> 0 bytes .../textures/mesecons_solarpanel.png | Bin 0 -> 607 bytes mesecons_stickyblocks/depends.txt | 2 - mesecons_stickyblocks/mod.conf | 2 + mesecons_switch/depends.txt | 1 - mesecons_switch/mod.conf | 2 + mesecons_torch/depends.txt | 1 - mesecons_torch/mod.conf | 2 + mesecons_walllever/depends.txt | 2 - mesecons_walllever/mod.conf | 2 + mesecons_wires/depends.txt | 1 - mesecons_wires/mod.conf | 2 + moreblocks/CHANGELOG.md | 4 + moreblocks/crafting.lua | 16 + moreblocks/locale/de.po | 4 + moreblocks/locale/es.po | 4 + moreblocks/locale/fr.po | 4 + moreblocks/locale/it.po | 4 + moreblocks/locale/pl.po | 4 + moreblocks/locale/ru.po | 4 + moreblocks/locale/template.pot | 4 + moreblocks/mod.conf | 1 + moreblocks/nodes.lua | 6 + .../moreblocks_desert_cobble_compressed.png | Bin 0 -> 2570 bytes moreores/mod.conf | 1 + new_campfire/README.md | 3 - new_campfire/description.txt | 1 - new_campfire/init.lua | 7 +- new_campfire/intllib.lua | 45 --- new_campfire/locale/new_campfire.fr.tr | 16 + new_campfire/locale/new_campfire.ru.tr | 16 + new_campfire/locale/new_campfire.ua.tr | 16 + new_campfire/locale/ru.po | 38 -- new_campfire/locale/template.pot | 38 -- new_campfire/locale/template.txt | 16 + new_campfire/locale/ua.po | 38 -- new_campfire/mod.conf | 1 + palm/mod.conf | 3 +- pipeworks/autoplace_tubes.lua | 19 +- pipeworks/item_transport.lua | 5 +- pipeworks/lua_tube.lua | 348 ++++++++++++++---- ropes/functions.lua | 4 +- stained_glass/depends.txt | 3 - stained_glass/mod.conf | 2 + technic/helpers.lua | 2 +- technic/machines/HV/nuclear_reactor.lua | 2 +- technic/machines/LV/geothermal.lua | 2 +- technic/machines/LV/music_player.lua | 1 - technic/machines/LV/solar_panel.lua | 2 +- technic/machines/LV/water_mill.lua | 4 +- technic/machines/MV/hydro_turbine.lua | 4 +- technic/machines/MV/lighting.lua | 29 +- technic/machines/MV/power_radiator.lua | 2 - technic/machines/MV/tool_workshop.lua | 5 +- technic/machines/other/coal_alloy_furnace.lua | 4 +- technic/machines/other/frames.lua | 24 +- technic/machines/other/injector.lua | 2 +- technic/machines/register/battery_box.lua | 4 +- technic/machines/register/common.lua | 6 +- technic/machines/register/generator.lua | 11 +- technic/machines/register/grindings.lua | 1 - technic/machines/register/machine_base.lua | 40 +- technic/machines/register/recipes.lua | 4 +- technic/machines/register/solar_array.lua | 1 - technic/machines/switching_station.lua | 6 +- technic/radiation.lua | 1 - technic/tools/flashlight.lua | 4 +- technic/tools/mining_drill.lua | 21 +- technic/tools/mining_lasers.lua | 2 +- technic/tools/vacuum.lua | 2 +- technic_chests/register.lua | 1 - technic_cnc/cnc.lua | 1 - technic_cnc/cnc_api.lua | 4 +- unified_inventory/.luacheckrc | 2 + unified_inventory/api.lua | 2 + unified_inventory/depends.txt | 5 - unified_inventory/description.txt | 1 - unified_inventory/item_names.lua | 16 +- unified_inventory/mod.conf | 5 +- unified_inventory/register.lua | 6 +- unifieddyes/init.lua | 2 +- 231 files changed, 2312 insertions(+), 1560 deletions(-) create mode 100644 bakedclay/settingtypes.txt create mode 100644 basic_materials/.luacheckrc create mode 100644 bonemeal/locale/bonemeal.es.tr create mode 100644 bonemeal/locale/bonemeal.fr.tr create mode 100644 bonemeal/locale/bonemeal.it.tr create mode 100644 bonemeal/locale/bonemeal.ru.tr create mode 100644 bonemeal/locale/es.txt create mode 100644 bonemeal/locale/it.txt create mode 100644 bonemeal/locale/template.tr create mode 100644 currency/locale/currency.it.tr create mode 100644 farming/crops/cabbage.lua create mode 100644 farming/locale/it.txt create mode 100644 farming/textures/farming_apple_pie.png create mode 100644 farming/textures/farming_bibimbap.png create mode 100644 farming/textures/farming_cabbage.png create mode 100644 farming/textures/farming_cabbage_1.png create mode 100644 farming/textures/farming_cabbage_2.png create mode 100644 farming/textures/farming_cabbage_3.png create mode 100644 farming/textures/farming_cabbage_4.png create mode 100644 farming/textures/farming_cabbage_5.png create mode 100644 farming/textures/farming_cabbage_6.png create mode 100644 farming/textures/farming_cactus_juice.png create mode 100644 farming/textures/farming_cotton_wild.png create mode 100644 farming/textures/farming_pasta.png create mode 100644 farming/textures/farming_spaghetti.png delete mode 100644 maptools/intllib.lua delete mode 100644 maptools/locale/es.txt delete mode 100644 maptools/locale/fr.txt delete mode 100644 maptools/locale/it.txt create mode 100644 maptools/locale/maptools.es.tr create mode 100644 maptools/locale/maptools.fr.tr create mode 100644 maptools/locale/maptools.it.tr create mode 100644 maptools/locale/maptools.template.tr delete mode 100644 mesecons/depends.txt create mode 100644 mesecons/mod.conf delete mode 100644 mesecons_alias/depends.txt create mode 100644 mesecons_alias/mod.conf delete mode 100644 mesecons_blinkyplant/depends.txt create mode 100644 mesecons_blinkyplant/mod.conf delete mode 100644 mesecons_button/depends.txt create mode 100644 mesecons_button/mod.conf delete mode 100644 mesecons_commandblock/depends.txt create mode 100644 mesecons_commandblock/mod.conf delete mode 100644 mesecons_delayer/depends.txt create mode 100644 mesecons_delayer/mod.conf delete mode 100644 mesecons_detector/depends.txt create mode 100644 mesecons_detector/mod.conf delete mode 100644 mesecons_doors/depends.txt create mode 100644 mesecons_doors/mod.conf delete mode 100644 mesecons_extrawires/depends.txt create mode 100644 mesecons_extrawires/mod.conf delete mode 100644 mesecons_fpga/depends.txt create mode 100644 mesecons_fpga/mod.conf create mode 100644 mesecons_fpga/sounds/mesecons_fpga_copy.ogg create mode 100644 mesecons_fpga/sounds/mesecons_fpga_fail.ogg create mode 100644 mesecons_fpga/sounds/mesecons_fpga_write.ogg delete mode 100644 mesecons_gates/depends.txt create mode 100644 mesecons_gates/mod.conf delete mode 100644 mesecons_hydroturbine/depends.txt create mode 100644 mesecons_hydroturbine/mod.conf delete mode 100644 mesecons_insulated/depends.txt create mode 100644 mesecons_insulated/mod.conf delete mode 100644 mesecons_lamp/depends.txt create mode 100644 mesecons_lamp/mod.conf delete mode 100644 mesecons_lightstone/depends.txt create mode 100644 mesecons_lightstone/mod.conf delete mode 100644 mesecons_luacontroller/depends.txt create mode 100644 mesecons_luacontroller/mod.conf delete mode 100644 mesecons_materials/depends.txt create mode 100644 mesecons_materials/mod.conf delete mode 100644 mesecons_microcontroller/depends.txt create mode 100644 mesecons_microcontroller/mod.conf delete mode 100644 mesecons_movestones/depends.txt create mode 100644 mesecons_movestones/mod.conf delete mode 100644 mesecons_mvps/depends.txt create mode 100644 mesecons_mvps/mod.conf delete mode 100644 mesecons_noteblock/depends.txt create mode 100644 mesecons_noteblock/mod.conf delete mode 100644 mesecons_pistons/depends.txt create mode 100644 mesecons_pistons/mod.conf delete mode 100644 mesecons_powerplant/depends.txt create mode 100644 mesecons_powerplant/mod.conf delete mode 100644 mesecons_pressureplates/depends.txt create mode 100644 mesecons_pressureplates/mod.conf delete mode 100644 mesecons_random/depends.txt create mode 100644 mesecons_random/mod.conf delete mode 100644 mesecons_receiver/depends.txt create mode 100644 mesecons_receiver/mod.conf delete mode 100644 mesecons_solarpanel/depends.txt create mode 100644 mesecons_solarpanel/mod.conf delete mode 100644 mesecons_solarpanel/textures/jeija_solar_panel.png create mode 100644 mesecons_solarpanel/textures/mesecons_solarpanel.png delete mode 100644 mesecons_stickyblocks/depends.txt create mode 100644 mesecons_stickyblocks/mod.conf delete mode 100644 mesecons_switch/depends.txt create mode 100644 mesecons_switch/mod.conf delete mode 100644 mesecons_torch/depends.txt create mode 100644 mesecons_torch/mod.conf delete mode 100644 mesecons_walllever/depends.txt create mode 100644 mesecons_walllever/mod.conf delete mode 100644 mesecons_wires/depends.txt create mode 100644 mesecons_wires/mod.conf create mode 100644 moreblocks/textures/moreblocks_desert_cobble_compressed.png delete mode 100644 new_campfire/description.txt delete mode 100644 new_campfire/intllib.lua create mode 100644 new_campfire/locale/new_campfire.fr.tr create mode 100644 new_campfire/locale/new_campfire.ru.tr create mode 100644 new_campfire/locale/new_campfire.ua.tr delete mode 100644 new_campfire/locale/ru.po delete mode 100644 new_campfire/locale/template.pot create mode 100644 new_campfire/locale/template.txt delete mode 100644 new_campfire/locale/ua.po delete mode 100644 stained_glass/depends.txt create mode 100644 stained_glass/mod.conf delete mode 100644 unified_inventory/depends.txt delete mode 100644 unified_inventory/description.txt diff --git a/bakedclay/README.md b/bakedclay/README.md index fd143dfc..e740e03b 100644 --- a/bakedclay/README.md +++ b/bakedclay/README.md @@ -18,3 +18,6 @@ Changelog: - 0.1 - Initial Release Lucky Blocks: 9 + + +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/bakedclay/init.lua b/bakedclay/init.lua index bf76c721..133d199e 100644 --- a/bakedclay/init.lua +++ b/bakedclay/init.lua @@ -300,4 +300,43 @@ lucky_block:add_blocks({ }) end + +-- colored clay compatibility +if minetest.settings:get_bool("colored_clay_compatibility") == true then + +local cc = { + {"black", "black"}, + {"blue", "blue"}, + {"bright", "natural"}, + {"brown", "brown"}, + {"cyan", "cyan"}, + {"dark_green", "dark_green"}, + {"dark_grey", "dark_grey"}, + {"green", "green"}, + {"grey", "grey"}, + {"hardened", "natural"}, + {"magenta", "magenta"}, + {"orange", "orange"}, + {"pink", "pink"}, + {"red", "red"}, + {"violet", "violet"}, + {"white", "white"}, + {"yellow", "yellow"} +} + +for n = 1, #cc do + + local nod1 = "colored_clay:" .. cc[n][1] + local nod2 = "bakedclay:" .. cc[n][2] + + minetest.register_alias(nod1, nod2) + + if stairsplus_mod then + stairsplus:register_alias_all("colored_clay", cc[n][1], "bakedclay", cc[n][2]) + end +end + +end + + print ("[MOD] Baked Clay loaded") diff --git a/bakedclay/settingtypes.txt b/bakedclay/settingtypes.txt new file mode 100644 index 00000000..bdd2a132 --- /dev/null +++ b/bakedclay/settingtypes.txt @@ -0,0 +1,2 @@ +# Registers compatibility aliases with the older colored_clay mod +colored_clay_compatibility (Colored Clay Compatibility) bool false diff --git a/basic_materials/.luacheckrc b/basic_materials/.luacheckrc new file mode 100644 index 00000000..55879b03 --- /dev/null +++ b/basic_materials/.luacheckrc @@ -0,0 +1,30 @@ +std = "lua51+minetest" +unused_args = false +allow_defined_top = true +max_line_length = 999 + +stds.minetest = { + read_globals = { + "DIR_DELIM", + "minetest", + "core", + "dump", + "vector", + "nodeupdate", + "VoxelManip", + "VoxelArea", + "PseudoRandom", + "ItemStack", + "default", + table = { + fields = { + "copy", + }, + }, + } +} + +read_globals = { + "default", + "moreores", +} diff --git a/basic_materials/init.lua b/basic_materials/init.lua index 32873a10..348c0598 100644 --- a/basic_materials/init.lua +++ b/basic_materials/init.lua @@ -7,6 +7,7 @@ local modpath = minetest.get_modpath("basic_materials") basic_materials = {} +basic_materials.mod = { author = "Vanessa Dannenberg" } dofile(modpath.."/metals.lua") dofile(modpath.."/plastics.lua") diff --git a/basic_materials/metals.lua b/basic_materials/metals.lua index 37685f8f..0a3243b0 100644 --- a/basic_materials/metals.lua +++ b/basic_materials/metals.lua @@ -5,31 +5,37 @@ local S = minetest.get_translator("basic_materials") minetest.register_craftitem("basic_materials:steel_wire", { description = S("Spool of steel wire"), + groups = { wire = 1 }, inventory_image = "basic_materials_steel_wire.png" }) minetest.register_craftitem("basic_materials:copper_wire", { description = S("Spool of copper wire"), + groups = { wire = 1 }, inventory_image = "basic_materials_copper_wire.png" }) minetest.register_craftitem("basic_materials:silver_wire", { description = S("Spool of silver wire"), + groups = { wire = 1 }, inventory_image = "basic_materials_silver_wire.png" }) minetest.register_craftitem("basic_materials:gold_wire", { description = S("Spool of gold wire"), + groups = { wire = 1 }, inventory_image = "basic_materials_gold_wire.png" }) minetest.register_craftitem("basic_materials:steel_strip", { description = S("Steel Strip"), + groups = { strip = 1 }, inventory_image = "basic_materials_steel_strip.png" }) minetest.register_craftitem("basic_materials:copper_strip", { description = S("Copper Strip"), + groups = { strip = 1 }, inventory_image = "basic_materials_copper_strip.png" }) @@ -40,11 +46,13 @@ minetest.register_craftitem("basic_materials:steel_bar", { minetest.register_craftitem("basic_materials:chainlink_brass", { description = S("Chainlinks (brass)"), + groups = { chainlinks = 1 }, inventory_image = "basic_materials_chainlink_brass.png" }) minetest.register_craftitem("basic_materials:chainlink_steel", { description = S("Chainlinks (steel)"), + groups = { chainlinks = 1 }, inventory_image = "basic_materials_chainlink_steel.png" }) @@ -70,14 +78,6 @@ local chains_sbox = { fixed = { -0.1, -0.5, -0.1, 0.1, 0.5, 0.1 } } -local topchains_sbox = { - type = "fixed", - fixed = { - { -0.25, 0.35, -0.25, 0.25, 0.5, 0.25 }, - { -0.1, -0.5, -0.1, 0.1, 0.4, 0.1 } - } -} - minetest.register_node("basic_materials:chain_steel", { description = S("Chain (steel, hanging)"), drawtype = "mesh", diff --git a/basic_materials/plastics.lua b/basic_materials/plastics.lua index 3ac0f982..e29af53e 100644 --- a/basic_materials/plastics.lua +++ b/basic_materials/plastics.lua @@ -10,6 +10,7 @@ minetest.register_craftitem("basic_materials:plastic_sheet", { minetest.register_craftitem("basic_materials:plastic_strip", { description = S("Plastic strips"), + groups = { strip = 1 }, inventory_image = "basic_materials_plastic_strip.png", }) diff --git a/bonemeal/init.lua b/bonemeal/init.lua index 0317856b..8525f95d 100644 --- a/bonemeal/init.lua +++ b/bonemeal/init.lua @@ -6,7 +6,8 @@ local min, max, random = math.min, math.max, math.random -- Load support for intllib. -local S, NS = dofile(path .. "/intllib.lua") +local S = minetest.get_translator and minetest.get_translator("bonemeal") or + dofile(path .. "/intllib.lua") -- creative check diff --git a/bonemeal/locale/bonemeal.es.tr b/bonemeal/locale/bonemeal.es.tr new file mode 100644 index 00000000..5bcdfead --- /dev/null +++ b/bonemeal/locale/bonemeal.es.tr @@ -0,0 +1,6 @@ +# textdomain: bonemeal +Mulch=Mantillo +Bone Meal=Comida de hueso +Fertiliser=Fertilizante +Bone=Hueso +[MOD] bonemeal loaded=[MOD] bonemeal cargado diff --git a/bonemeal/locale/bonemeal.fr.tr b/bonemeal/locale/bonemeal.fr.tr new file mode 100644 index 00000000..15be86de --- /dev/null +++ b/bonemeal/locale/bonemeal.fr.tr @@ -0,0 +1,6 @@ +# textdomain: beds +Mulch=Paillis +Bone Meal=Poudre d'os +Fertiliser=Engrais +Bone=Os +[MOD] bonemeal loaded=[MOD] bonemeal chargé diff --git a/bonemeal/locale/bonemeal.it.tr b/bonemeal/locale/bonemeal.it.tr new file mode 100644 index 00000000..575fb95a --- /dev/null +++ b/bonemeal/locale/bonemeal.it.tr @@ -0,0 +1,6 @@ +# textdomain: bonemeal +Mulch=Pacciame +Bone Meal=Pasto osseo +Fertiliser=Fertilizzante +Bone=Ossa +[MOD] bonemeal loaded=[MOD] bonemeal caricata diff --git a/bonemeal/locale/bonemeal.ru.tr b/bonemeal/locale/bonemeal.ru.tr new file mode 100644 index 00000000..4c65f9f8 --- /dev/null +++ b/bonemeal/locale/bonemeal.ru.tr @@ -0,0 +1,6 @@ +# textdomain: bonemeal +Mulch=Мульча +Bone Meal=Костная Мука +Fertiliser=Удобрение +Bone=Кость +[MOD] bonemeal loaded=[MOD] костная мука загружена diff --git a/bonemeal/locale/es.txt b/bonemeal/locale/es.txt new file mode 100644 index 00000000..3770d5ee --- /dev/null +++ b/bonemeal/locale/es.txt @@ -0,0 +1,7 @@ +# init.lua + +Mulch = Mantillo +Bone Meal = Comida de hueso +Fertiliser = Fertilizante +Bone = Hueso +[MOD] bonemeal loaded = [MOD] bonemeal cargado diff --git a/bonemeal/locale/it.txt b/bonemeal/locale/it.txt new file mode 100644 index 00000000..4626dd82 --- /dev/null +++ b/bonemeal/locale/it.txt @@ -0,0 +1,7 @@ +# init.lua + +Mulch = Pacciame +Bone Meal = Pasto osseo +Fertiliser = Fertilizzante +Bone = Ossa +[MOD] bonemeal loaded = [MOD] bonemeal caricata diff --git a/bonemeal/locale/template.tr b/bonemeal/locale/template.tr new file mode 100644 index 00000000..699982ff --- /dev/null +++ b/bonemeal/locale/template.tr @@ -0,0 +1,6 @@ +# textdomain: bonemeal +Mulch = +Bone Meal = +Fertiliser = +Bone = +[MOD] bonemeal loaded = diff --git a/bonemeal/locale/template.txt b/bonemeal/locale/template.txt index f4023ac3..c5cb8724 100644 --- a/bonemeal/locale/template.txt +++ b/bonemeal/locale/template.txt @@ -1,7 +1,7 @@ # init.lua -Mulch = -Bone Meal = -Fertiliser = -Bone = -[bonemeal] loaded = +Mulch = +Bone Meal = +Fertiliser = +Bone = +[MOD] bonemeal loaded = diff --git a/bonemeal/mods.lua b/bonemeal/mods.lua index ae9f1af2..ace943f2 100644 --- a/bonemeal/mods.lua +++ b/bonemeal/mods.lua @@ -39,7 +39,8 @@ if farming and farming.mod and farming.mod == "redo" then {"farming:rye_", 8}, {"farming:oat_", 8}, {"farming:rice_", 8}, - {"farming:mint_", 4} + {"farming:mint_", 4}, + {"farming:cabbage_", 6} }) end diff --git a/currency/locale/currency.de.tr b/currency/locale/currency.de.tr index 71991516..fc2976de 100644 --- a/currency/locale/currency.de.tr +++ b/currency/locale/currency.de.tr @@ -15,7 +15,7 @@ Exchange=Tausch ### craftitems.lua ### @1 Minegeld Note=@1 Minegeld Banknote -@1 Minegeld cent coin= +@1 Minegeld cent coin=@1 Cent MünzeM Bundle of random Minegeld notes=Bündel von verschiedenen Minegeld Banknoten ### safe.lua ### diff --git a/currency/locale/currency.it.tr b/currency/locale/currency.it.tr new file mode 100644 index 00000000..a4e197d7 --- /dev/null +++ b/currency/locale/currency.it.tr @@ -0,0 +1,45 @@ +# textdomain: currency +# Hamlet, 2020 + + +### barter.lua ### + +Barter Table=Tavolo di baratto +Cancel=Annulla +Confirm=Conferma +Start=Inizia + +### shop.lua ### + +Exchange=Scambia + +### craftitems.lua ### + +@1 Minegeld Note=@ biglietto Minegeld +@1 Minegeld cent coin=@ moneta di centesimo Minegeld +Bundle of random Minegeld notes=Pacchetto di biglietti Minegeld casuali + +### safe.lua ### + +Safe=Cassaforte +Safe (owned by @1)=Cassaforte (di proprietà di @1) + +### shop.lua ### + +Customer gets:=Il cliente ottiene: +Customer gives (pay here!)=Il cliente dà (paga qui!) +Customers gave:=I clienti hanno dato: +Exchange can not be done, check if you put all items!=Lo scambio non può essere fatto, controlla di avere messo tutti gli oggetti! +Exchange can not be done, contact the shop owner.=Lo scambio non può essere fatto, contatta il proprietario del negozio. +Exchange shop (owned by @1)=Negozio di scambio (di proprietà di @1) +Exchanged!=Scambiato! +In exchange, you give:=In cambio, tu dai: +Owner gives:=Il proprietario dà: +Owner wants:=Il proprietario vuole: + +Owner, Use (E)+Place (right mouse button) for customer interface=Proprietario, usa (E)+Posiziona (pulsante destro del mouse) per l'interfaccia cliente + +Shop=Negozio +This is your own shop, you can't exchange to yourself!=Questo è il tuo negozio, non puoi fare scambi con te stesso! +You want:=Tu vuoi: +Your stock:=La tua scorta: diff --git a/farming/README.md b/farming/README.md index 697f4a0b..353d6f93 100644 --- a/farming/README.md +++ b/farming/README.md @@ -13,7 +13,8 @@ This mod works by adding your new plant to the {growing=1} group and numbering t ### Changelog: -- 1.45 - Dirt and Hoes are more in line with default by using dry/wet/base options, onion soup added (thanks edcrypt) +- 1.45 - Dirt and Hoes are more in line with default by using dry/wet/base, added cactus juice, added pasta, spaghetti, cabbage, korean bibimbap, code tidy +options, onion soup added (thanks edcrypt), Added apple pie, added wild cotton to savanna - 1.44 - Added 'farming_stage_length' in mod settings for speed of crop growth, also thanks to TheDarkTiger for translation updates - 1.43 - Scythe works on use instead of right-click, added seed=1 groups to actual seeds and seed=2 group for plantable food items. - 1.42 - Soil needs water to be present within 3 blocks horizontally and 1 below to make wet soil, Jack 'o Lanterns now check protection, add chocolate block. diff --git a/farming/compatibility.lua b/farming/compatibility.lua index dc9aff60..9841f4c8 100644 --- a/farming/compatibility.lua +++ b/farming/compatibility.lua @@ -12,13 +12,13 @@ end minetest.override_item("default:apple", { groups = {food_apple = 1, fleshy = 3, dig_immediate = 3, flammable = 2, - leafdecay = 3, leafdecay_drop = 1}, + leafdecay = 3, leafdecay_drop = 1} }) if minetest.registered_nodes["flowers:mushroom_brown"] then minetest.override_item("flowers:mushroom_brown", { light_source = 1, - groups = {food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 2}, + groups = {food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 2} }) end @@ -45,7 +45,7 @@ else }, groups = {food_banana = 1, fleshy = 3, dig_immediate = 3, flammable = 2}, on_use = minetest.item_eat(2), - sounds = default.node_sound_leaves_defaults(), + sounds = default.node_sound_leaves_defaults() }) minetest.register_node(":ethereal:bananaleaves", { @@ -56,7 +56,7 @@ else paramtype = "light", waving = 1, groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, - sounds = default.node_sound_leaves_defaults(), + sounds = default.node_sound_leaves_defaults() }) alias("farming_plus:banana_sapling", "default:sapling") @@ -103,7 +103,7 @@ else }, groups = {food_orange = 1, fleshy = 3, dig_immediate = 3, flammable = 2}, on_use = minetest.item_eat(4), - sounds = default.node_sound_leaves_defaults(), + sounds = default.node_sound_leaves_defaults() }) alias("farming_plus:orange_item", "ethereal:orange") @@ -151,7 +151,7 @@ else inventory_image = "strawberry.png", wield_image = "strawberry.png", groups = {food_strawberry = 1, flammable = 2}, - on_use = minetest.item_eat(1), + on_use = minetest.item_eat(1) }) alias("farming_plus:strawberry_item", "ethereal:strawberry") diff --git a/farming/crops/barley.lua b/farming/crops/barley.lua index d8960317..69b30562 100644 --- a/farming/crops/barley.lua +++ b/farming/crops/barley.lua @@ -16,14 +16,14 @@ minetest.register_node("farming:seed_barley", { selection_box = farming.select, on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:barley_1") - end, + end }) -- harvested barley minetest.register_craftitem("farming:barley", { description = S("Barley"), inventory_image = "farming_barley.png", - groups = {food_barley = 1, flammable = 2}, + groups = {food_barley = 1, flammable = 2} }) -- flour @@ -34,11 +34,11 @@ minetest.register_craft({ "farming:barley", "farming:barley", "farming:barley", "farming:barley", "farming:mortar_pestle" }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}}, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} }) -- barley definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_barley_1.png"}, paramtype = "light", @@ -57,52 +57,52 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:barley_1", table.copy(crop_def)) +minetest.register_node("farming:barley_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_barley_2.png"} -minetest.register_node("farming:barley_2", table.copy(crop_def)) +def.tiles = {"farming_barley_2.png"} +minetest.register_node("farming:barley_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_barley_3.png"} -minetest.register_node("farming:barley_3", table.copy(crop_def)) +def.tiles = {"farming_barley_3.png"} +minetest.register_node("farming:barley_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_barley_4.png"} -minetest.register_node("farming:barley_4", table.copy(crop_def)) +def.tiles = {"farming_barley_4.png"} +minetest.register_node("farming:barley_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_barley_5.png"} -crop_def.drop = { +def.tiles = {"farming_barley_5.png"} +def.drop = { items = { {items = {"farming:barley"}, rarity = 2}, - {items = {"farming:seed_barley"}, rarity = 2}, + {items = {"farming:seed_barley"}, rarity = 2} } } -minetest.register_node("farming:barley_5", table.copy(crop_def)) +minetest.register_node("farming:barley_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_barley_6.png"} -crop_def.drop = { +def.tiles = {"farming_barley_6.png"} +def.drop = { items = { {items = {"farming:barley"}, rarity = 2}, - {items = {"farming:seed_barley"}, rarity = 1}, + {items = {"farming:seed_barley"}, rarity = 1} } } -minetest.register_node("farming:barley_6", table.copy(crop_def)) +minetest.register_node("farming:barley_6", table.copy(def)) -- stage 7 (final) -crop_def.tiles = {"farming_barley_7.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_barley_7.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:barley"}, rarity = 1}, {items = {"farming:barley"}, rarity = 3}, {items = {"farming:seed_barley"}, rarity = 1}, - {items = {"farming:seed_barley"}, rarity = 3}, + {items = {"farming:seed_barley"}, rarity = 3} } } -minetest.register_node("farming:barley_7", table.copy(crop_def)) +minetest.register_node("farming:barley_7", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:barley"] = { @@ -114,9 +114,8 @@ farming.registered_plants["farming:barley"] = { } -- Fuel - minetest.register_craft({ type = "fuel", recipe = "farming:barley", - burntime = 1, + burntime = 1 }) diff --git a/farming/crops/beans.lua b/farming/crops/beans.lua index c35b2cfb..b469d085 100644 --- a/farming/crops/beans.lua +++ b/farming/crops/beans.lua @@ -13,7 +13,6 @@ local function place_beans(itemstack, placer, pointed_thing, plantname) -- check if pointing at a node if not pt or pt.type ~= "node" then - return end @@ -74,17 +73,16 @@ minetest.register_craftitem("farming:beans", { inventory_image = "farming_beans.png", groups = {seed = 2, food_beans = 1, flammable = 2}, on_use = minetest.item_eat(1), - on_place = function(itemstack, placer, pointed_thing) return place_beans(itemstack, placer, pointed_thing, "farming:beanpole_1") - end, + end }) -- beans can be used for green dye minetest.register_craft({ output = "dye:green", recipe = { - {"farming:beans"}, + {"farming:beans"} } }) @@ -94,7 +92,7 @@ minetest.register_node("farming:beanpole", { drawtype = "plantlike", tiles = {"farming_beanpole.png"}, inventory_image = "farming_beanpole.png", - visual_scale = 1.90, -- 1.45, + visual_scale = 1.90, paramtype = "light", walkable = false, buildable_to = true, @@ -164,28 +162,28 @@ minetest.register_craft({ recipe = { {"", "", ""}, {"default:stick", "", "default:stick"}, - {"default:stick", "", "default:stick"}, + {"default:stick", "", "default:stick"} } }) minetest.register_craft({ type = "fuel", recipe = "farming:beanpole", - burntime = 10, + burntime = 10 }) -- green bean definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_beanpole_1.png"}, - visual_scale = 1.90, -- 1.45, + visual_scale = 1.90, paramtype = "light", walkable = false, buildable_to = true, sunlight_propagates = true, drop = { items = { - {items = {"farming:beanpole"}, rarity = 1}, + {items = {"farming:beanpole"}, rarity = 1} } }, selection_box = farming.select, @@ -197,32 +195,32 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:beanpole_1", table.copy(crop_def)) +minetest.register_node("farming:beanpole_1", table.copy(def)) -- stage2 -crop_def.tiles = {"farming_beanpole_2.png"} -minetest.register_node("farming:beanpole_2", table.copy(crop_def)) +def.tiles = {"farming_beanpole_2.png"} +minetest.register_node("farming:beanpole_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_beanpole_3.png"} -minetest.register_node("farming:beanpole_3", table.copy(crop_def)) +def.tiles = {"farming_beanpole_3.png"} +minetest.register_node("farming:beanpole_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_beanpole_4.png"} -minetest.register_node("farming:beanpole_4", table.copy(crop_def)) +def.tiles = {"farming_beanpole_4.png"} +minetest.register_node("farming:beanpole_4", table.copy(def)) -- stage 5 (final) -crop_def.tiles = {"farming_beanpole_5.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_beanpole_5.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:beanpole"}, rarity = 1}, {items = {"farming:beans 3"}, rarity = 1}, {items = {"farming:beans 2"}, rarity = 2}, - {items = {"farming:beans 2"}, rarity = 3}, + {items = {"farming:beans 2"}, rarity = 3} } } -minetest.register_node("farming:beanpole_5", table.copy(crop_def)) +minetest.register_node("farming:beanpole_5", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:beans"] = { @@ -246,13 +244,13 @@ minetest.register_node("farming:beanbush", { items = { {items = {"farming:beans 1"}, rarity = 1}, {items = {"farming:beans 1"}, rarity = 2}, - {items = {"farming:beans 1"}, rarity = 3}, + {items = {"farming:beans 1"}, rarity = 3} } }, selection_box = farming.select, groups = { snappy = 3, flammable = 2, plant = 1, attached_node = 1, - not_in_creative_inventory=1 + not_in_creative_inventory = 1 }, - sounds = default.node_sound_leaves_defaults(), + sounds = default.node_sound_leaves_defaults() }) diff --git a/farming/crops/beetroot.lua b/farming/crops/beetroot.lua index 0a20d883..f20cfead 100644 --- a/farming/crops/beetroot.lua +++ b/farming/crops/beetroot.lua @@ -9,7 +9,7 @@ minetest.register_craftitem("farming:beetroot", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:beetroot_1") end, - on_use = minetest.item_eat(1), + on_use = minetest.item_eat(1) }) -- beetroot soup @@ -17,7 +17,7 @@ minetest.register_craftitem("farming:beetroot_soup", { description = S("Beetroot Soup"), inventory_image = "farming_beetroot_soup.png", groups = {flammable = 2}, - on_use = minetest.item_eat(6, "farming:bowl"), + on_use = minetest.item_eat(6, "farming:bowl") }) minetest.register_craft({ @@ -34,15 +34,13 @@ minetest.register_craft({ minetest.register_craft({ type = "shapeless", output = "dye:red", - recipe = {"group:food_beetroot"}, + recipe = {"group:food_beetroot"} }) -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_beetroot_1.png"}, paramtype = "light", --- paramtype2 = "meshoptions", --- place_param2 = 3, sunlight_propagates = true, waving = 1, walkable = false, @@ -57,32 +55,32 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:beetroot_1", table.copy(crop_def)) +minetest.register_node("farming:beetroot_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_beetroot_2.png"} -minetest.register_node("farming:beetroot_2", table.copy(crop_def)) +def.tiles = {"farming_beetroot_2.png"} +minetest.register_node("farming:beetroot_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_beetroot_3.png"} -minetest.register_node("farming:beetroot_3", table.copy(crop_def)) +def.tiles = {"farming_beetroot_3.png"} +minetest.register_node("farming:beetroot_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_beetroot_4.png"} -minetest.register_node("farming:beetroot_4", table.copy(crop_def)) +def.tiles = {"farming_beetroot_4.png"} +minetest.register_node("farming:beetroot_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_beetroot_5.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_beetroot_5.png"} +def.groups.growing = nil +def.drop = { max_items = 4, items = { {items = {"farming:beetroot"}, rarity = 1}, {items = {"farming:beetroot"}, rarity = 2}, {items = {"farming:beetroot"}, rarity = 3}, - {items = {"farming:beetroot"}, rarity = 4}, + {items = {"farming:beetroot"}, rarity = 4} } } -minetest.register_node("farming:beetroot_5", table.copy(crop_def)) +minetest.register_node("farming:beetroot_5", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:beetroot"] = { diff --git a/farming/crops/blueberry.lua b/farming/crops/blueberry.lua index fec0c123..97beaedf 100644 --- a/farming/crops/blueberry.lua +++ b/farming/crops/blueberry.lua @@ -10,30 +10,28 @@ minetest.register_craftitem("farming:blueberries", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:blueberry_1") end, - on_use = minetest.item_eat(1), + on_use = minetest.item_eat(1) }) -- blueberry muffin (thanks to sosogirl123 @ deviantart.com for muffin image) - minetest.register_craftitem("farming:muffin_blueberry", { description = S("Blueberry Muffin"), inventory_image = "farming_blueberry_muffin.png", - on_use = minetest.item_eat(2), + on_use = minetest.item_eat(2) }) minetest.register_craft({ output = "farming:muffin_blueberry 2", recipe = { - {"group:food_blueberries", "group:food_bread", "group:food_blueberries"}, + {"group:food_blueberries", "group:food_bread", "group:food_blueberries"} } }) -- Blueberry Pie - minetest.register_craftitem("farming:blueberry_pie", { description = S("Blueberry Pie"), inventory_image = "farming_blueberry_pie.png", - on_use = minetest.item_eat(6), + on_use = minetest.item_eat(6) }) minetest.register_craft({ @@ -47,7 +45,7 @@ minetest.register_craft({ }) -- blueberry definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_blueberry_1.png"}, paramtype = "light", @@ -64,27 +62,27 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:blueberry_1", table.copy(crop_def)) +minetest.register_node("farming:blueberry_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_blueberry_2.png"} -minetest.register_node("farming:blueberry_2", table.copy(crop_def)) +def.tiles = {"farming_blueberry_2.png"} +minetest.register_node("farming:blueberry_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_blueberry_3.png"} -minetest.register_node("farming:blueberry_3", table.copy(crop_def)) +def.tiles = {"farming_blueberry_3.png"} +minetest.register_node("farming:blueberry_3", table.copy(def)) -- stage 4 (final) -crop_def.tiles = {"farming_blueberry_4.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_blueberry_4.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:blueberries 2"}, rarity = 1}, {items = {"farming:blueberries"}, rarity = 2}, {items = {"farming:blueberries"}, rarity = 3}, } } -minetest.register_node("farming:blueberry_4", table.copy(crop_def)) +minetest.register_node("farming:blueberry_4", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:blueberries"] = { diff --git a/farming/crops/cabbage.lua b/farming/crops/cabbage.lua new file mode 100644 index 00000000..dd66f258 --- /dev/null +++ b/farming/crops/cabbage.lua @@ -0,0 +1,69 @@ + +local S = farming.intllib + +-- cabbage +minetest.register_craftitem("farming:cabbage", { + description = S("Cabbage"), + inventory_image = "farming_cabbage.png", + groups = {seed = 2, food_cabbage = 1, flammable = 2}, + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:cabbage_1") + end, + on_use = minetest.item_eat(1) +}) + +local def = { + drawtype = "plantlike", + tiles = {"farming_cabbage_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults() +} + +-- stage 1 +minetest.register_node("farming:cabbage_1", table.copy(def)) + +-- stage 2 +def.tiles = {"farming_cabbage_2.png"} +minetest.register_node("farming:cabbage_2", table.copy(def)) + +-- stage 3 +def.tiles = {"farming_cabbage_3.png"} +minetest.register_node("farming:cabbage_3", table.copy(def)) + +-- stage 4 +def.tiles = {"farming_cabbage_4.png"} +minetest.register_node("farming:cabbage_4", table.copy(def)) + +-- stage 5 +def.tiles = {"farming_cabbage_5.png"} +minetest.register_node("farming:cabbage_5", table.copy(def)) + +-- stage 6 +def.tiles = {"farming_cabbage_6.png"} +def.groups.growing = nil +def.drop = { + max_items = 2, items = { + {items = {"farming:cabbage"}, rarity = 1}, + {items = {"farming:cabbage"}, rarity = 5} + } +} +minetest.register_node("farming:cabbage_6", table.copy(def)) + +-- add to registered_plants +farming.registered_plants["farming:cabbage"] = { + crop = "farming:cabbage", + seed = "farming:cabbage", + minlight = 13, + maxlight = 15, + steps = 6 +} diff --git a/farming/crops/carrot.lua b/farming/crops/carrot.lua index 7df88acb..f19338c8 100644 --- a/farming/crops/carrot.lua +++ b/farming/crops/carrot.lua @@ -14,7 +14,7 @@ minetest.register_craftitem("farming:carrot", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:carrot_1") end, - on_use = minetest.item_eat(4), + on_use = minetest.item_eat(4) }) -- carrot juice @@ -22,7 +22,7 @@ minetest.register_craftitem("farming:carrot_juice", { description = S("Carrot Juice"), inventory_image = "farming_carrot_juice.png", on_use = minetest.item_eat(4, "vessels:drinking_glass"), - groups = {vessel = 1}, + groups = {vessel = 1, drink = 1} }) minetest.register_craft({ @@ -32,15 +32,15 @@ minetest.register_craft({ "vessels:drinking_glass", "group:food_carrot", "farming:juicer" }, replacements = { - {"group:food_juicer", "farming:juicer"}, - }, + {"group:food_juicer", "farming:juicer"} + } }) -- golden carrot minetest.register_craftitem("farming:carrot_gold", { description = S("Golden Carrot"), inventory_image = "farming_carrot_gold.png", - on_use = minetest.item_eat(6), + on_use = minetest.item_eat(10) }) minetest.register_craft({ @@ -48,12 +48,12 @@ minetest.register_craft({ recipe = { {"", "default:gold_lump", ""}, {"default:gold_lump", "group:food_carrot", "default:gold_lump"}, - {"", "default:gold_lump", ""}, + {"", "default:gold_lump", ""} } }) -- carrot definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_carrot_1.png"}, paramtype = "light", @@ -71,48 +71,48 @@ local crop_def = { -- stage 1 -minetest.register_node("farming:carrot_1", table.copy(crop_def)) +minetest.register_node("farming:carrot_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_carrot_2.png"} -minetest.register_node("farming:carrot_2", table.copy(crop_def)) +def.tiles = {"farming_carrot_2.png"} +minetest.register_node("farming:carrot_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_carrot_3.png"} -minetest.register_node("farming:carrot_3", table.copy(crop_def)) +def.tiles = {"farming_carrot_3.png"} +minetest.register_node("farming:carrot_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_carrot_4.png"} -minetest.register_node("farming:carrot_4", table.copy(crop_def)) +def.tiles = {"farming_carrot_4.png"} +minetest.register_node("farming:carrot_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_carrot_5.png"} -minetest.register_node("farming:carrot_5", table.copy(crop_def)) +def.tiles = {"farming_carrot_5.png"} +minetest.register_node("farming:carrot_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_carrot_6.png"} -minetest.register_node("farming:carrot_6", table.copy(crop_def)) +def.tiles = {"farming_carrot_6.png"} +minetest.register_node("farming:carrot_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_carrot_7.png"} -crop_def.drop = { +def.tiles = {"farming_carrot_7.png"} +def.drop = { items = { {items = {"farming:carrot"}, rarity = 1}, - {items = {"farming:carrot 2"}, rarity = 3}, + {items = {"farming:carrot 2"}, rarity = 3} } } -minetest.register_node("farming:carrot_7", table.copy(crop_def)) +minetest.register_node("farming:carrot_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_carrot_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_carrot_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:carrot 2"}, rarity = 1}, - {items = {"farming:carrot 3"}, rarity = 2}, + {items = {"farming:carrot 3"}, rarity = 2} } } -minetest.register_node("farming:carrot_8", table.copy(crop_def)) +minetest.register_node("farming:carrot_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:carrot"] = { diff --git a/farming/crops/chili.lua b/farming/crops/chili.lua index cdcfa7e7..867c9455 100644 --- a/farming/crops/chili.lua +++ b/farming/crops/chili.lua @@ -9,14 +9,14 @@ minetest.register_craftitem("farming:chili_pepper", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:chili_1") end, - on_use = minetest.item_eat(2), + on_use = minetest.item_eat(2) }) -- bowl of chili minetest.register_craftitem("farming:chili_bowl", { description = S("Bowl of Chili"), inventory_image = "farming_chili_bowl.png", - on_use = minetest.item_eat(8, "farming:bowl"), + on_use = minetest.item_eat(8, "farming:bowl") }) minetest.register_craft({ @@ -25,19 +25,19 @@ minetest.register_craft({ recipe = { "group:food_chili_pepper", "group:food_barley", "group:food_tomato", "group:food_beans", "group:food_bowl" - }, + } }) -- chili can be used for red dye minetest.register_craft({ output = "dye:red", recipe = { - {"farming:chili_pepper"}, + {"farming:chili_pepper"} } }) -- chili definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_chili_1.png"}, paramtype = "light", @@ -54,42 +54,42 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:chili_1", table.copy(crop_def)) +minetest.register_node("farming:chili_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_chili_2.png"} -minetest.register_node("farming:chili_2", table.copy(crop_def)) +def.tiles = {"farming_chili_2.png"} +minetest.register_node("farming:chili_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_chili_3.png"} -minetest.register_node("farming:chili_3", table.copy(crop_def)) +def.tiles = {"farming_chili_3.png"} +minetest.register_node("farming:chili_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_chili_4.png"} -minetest.register_node("farming:chili_4", table.copy(crop_def)) +def.tiles = {"farming_chili_4.png"} +minetest.register_node("farming:chili_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_chili_5.png"} -minetest.register_node("farming:chili_5", table.copy(crop_def)) +def.tiles = {"farming_chili_5.png"} +minetest.register_node("farming:chili_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_chili_6.png"} -minetest.register_node("farming:chili_6", table.copy(crop_def)) +def.tiles = {"farming_chili_6.png"} +minetest.register_node("farming:chili_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_chili_7.png"} -minetest.register_node("farming:chili_7", table.copy(crop_def)) +def.tiles = {"farming_chili_7.png"} +minetest.register_node("farming:chili_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_chili_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_chili_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:chili_pepper 3"}, rarity = 1}, - {items = {"farming:chili_pepper 2"}, rarity = 2}, + {items = {"farming:chili_pepper 2"}, rarity = 2} } } -minetest.register_node("farming:chili_8", table.copy(crop_def)) +minetest.register_node("farming:chili_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:chili_pepper"] = { diff --git a/farming/crops/cocoa.lua b/farming/crops/cocoa.lua index 243814b0..9e8a4041 100644 --- a/farming/crops/cocoa.lua +++ b/farming/crops/cocoa.lua @@ -70,13 +70,13 @@ minetest.register_craftitem("farming:cocoa_beans", { groups = {seed = 2, food_cocoa = 1, flammable = 2}, on_place = function(itemstack, placer, pointed_thing) return place_cocoa(itemstack, placer, pointed_thing, "farming:cocoa_1") - end, + end }) minetest.register_craft( { output = "dye:brown 2", recipe = { - { "farming:cocoa_beans" }, + { "farming:cocoa_beans" } } }) @@ -84,13 +84,13 @@ minetest.register_craft( { minetest.register_craftitem("farming:cookie", { description = S("Cookie"), inventory_image = "farming_cookie.png", - on_use = minetest.item_eat(2), + on_use = minetest.item_eat(2) }) minetest.register_craft( { output = "farming:cookie 8", recipe = { - {"group:food_wheat", "group:food_cocoa", "group:food_wheat" }, + {"group:food_wheat", "group:food_cocoa", "group:food_wheat" } } }) @@ -98,13 +98,13 @@ minetest.register_craft( { minetest.register_craftitem("farming:chocolate_dark", { description = S("Bar of Dark Chocolate"), inventory_image = "farming_chocolate_dark.png", - on_use = minetest.item_eat(3), + on_use = minetest.item_eat(3) }) minetest.register_craft( { output = "farming:chocolate_dark", recipe = { - {"group:food_cocoa", "group:food_cocoa", "group:food_cocoa"}, + {"group:food_cocoa", "group:food_cocoa", "group:food_cocoa"} } }) @@ -114,7 +114,7 @@ minetest.register_node("farming:chocolate_block", { tiles = {"farming_chocolate_block.png"}, is_ground_content = false, groups = {cracky = 2, oddly_breakable_by_hand = 2}, - sounds = default.node_sound_stone_defaults(), + sounds = default.node_sound_stone_defaults() }) minetest.register_craft({ @@ -122,19 +122,19 @@ minetest.register_craft({ recipe = { {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, - {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, + {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"} } }) minetest.register_craft({ output = "farming:chocolate_dark 9", recipe = { - {"farming:chocolate_block"}, + {"farming:chocolate_block"} } }) -- cocoa definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_cocoa_1.png"}, paramtype = "light", @@ -150,7 +150,7 @@ local crop_def = { }, groups = { snappy = 3, flammable = 2, plant = 1, growing = 1, - not_in_creative_inventory=1, leafdecay = 1, leafdecay_drop = 1 + not_in_creative_inventory = 1, leafdecay = 1, leafdecay_drop = 1 }, sounds = default.node_sound_leaves_defaults(), growth_check = function(pos, node_name) @@ -158,37 +158,37 @@ local crop_def = { return false end return true - end, + end } -- stage 1 -minetest.register_node("farming:cocoa_1", table.copy(crop_def)) +minetest.register_node("farming:cocoa_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_cocoa_2.png"} -minetest.register_node("farming:cocoa_2", table.copy(crop_def)) +def.tiles = {"farming_cocoa_2.png"} +minetest.register_node("farming:cocoa_2", table.copy(def)) -- stage3 -crop_def.tiles = {"farming_cocoa_3.png"} -crop_def.drop = { +def.tiles = {"farming_cocoa_3.png"} +def.drop = { items = { - {items = {"farming:cocoa_beans 1"}, rarity = 1}, + {items = {"farming:cocoa_beans 1"}, rarity = 1} } } -minetest.register_node("farming:cocoa_3", table.copy(crop_def)) +minetest.register_node("farming:cocoa_3", table.copy(def)) -- stage 4 (final) -crop_def.tiles = {"farming_cocoa_4.png"} -crop_def.groups.growing = 0 -crop_def.growth_check = nil -crop_def.drop = { +def.tiles = {"farming_cocoa_4.png"} +def.groups.growing = nil +def.growth_check = nil +def.drop = { items = { {items = {"farming:cocoa_beans 2"}, rarity = 1}, {items = {"farming:cocoa_beans 1"}, rarity = 2}, - {items = {"farming:cocoa_beans 1"}, rarity = 4}, + {items = {"farming:cocoa_beans 1"}, rarity = 4} } } -minetest.register_node("farming:cocoa_4", table.copy(crop_def)) +minetest.register_node("farming:cocoa_4", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:cocoa_beans"] = { @@ -218,27 +218,22 @@ minetest.register_on_generated(function(minp, maxp) dir = math.random(1, 80) - if dir == 1 then - pos.x = pos.x + 1 - elseif dir == 2 then - pos.x = pos.x - 1 - elseif dir == 3 then - pos.z = pos.z + 1 - elseif dir == 4 then - pos.z = pos.z -1 + if dir == 1 then pos.x = pos.x + 1 + elseif dir == 2 then pos.x = pos.x - 1 + elseif dir == 3 then pos.z = pos.z + 1 + elseif dir == 4 then pos.z = pos.z -1 end if dir < 5 and minetest.get_node(pos).name == "air" and minetest.get_node_light(pos) > 12 then - --print ("Cocoa Pod added at " .. minetest.pos_to_string(pos)) +--print ("Cocoa Pod added at " .. minetest.pos_to_string(pos)) minetest.swap_node(pos, { - name = "farming:cocoa_" .. tostring(math.random(1, 4)) + name = "farming:cocoa_" .. tostring(math.random(4)) }) end - end end end) diff --git a/farming/crops/coffee.lua b/farming/crops/coffee.lua index 2e2ed73d..3fc49a2d 100644 --- a/farming/crops/coffee.lua +++ b/farming/crops/coffee.lua @@ -8,13 +8,13 @@ minetest.register_craftitem("farming:coffee_beans", { groups = {seed = 2, food_coffee = 1, flammable = 2}, on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:coffee_1") - end, + end }) -- cold cup of coffee minetest.register_node("farming:coffee_cup", { description = S("Cup of Coffee"), - drawtype = "torchlike", --"plantlike", + drawtype = "torchlike", tiles = {"farming_coffee_cup.png"}, inventory_image = "farming_coffee_cup.png", wield_image = "farming_coffee_cup.png", @@ -24,9 +24,9 @@ minetest.register_node("farming:coffee_cup", { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.25, 0.25} }, - groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, drink = 1}, on_use = minetest.item_eat(2, "vessels:drinking_glass"), - sounds = default.node_sound_glass_defaults(), + sounds = default.node_sound_glass_defaults() }) minetest.register_alias("farming:coffee_cup_hot", "farming:coffee_cup") @@ -35,16 +35,17 @@ minetest.register_alias("farming:drinking_cup", "vessels:drinking_glass") minetest.register_craft( { output = "farming:coffee_cup", type = "shapeless", - recipe = {"vessels:drinking_glass", "group:food_coffee", + recipe = { + "vessels:drinking_glass", "group:food_coffee", "bucket:bucket_water", "group:food_saucepan"}, replacements = { {"bucket:bucket_water", "bucket:bucket_empty"}, - {"group:food_saucepan", "farming:saucepan"}, + {"group:food_saucepan", "farming:saucepan"} } }) -- coffee definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_coffee_1.png"}, paramtype = "light", @@ -61,31 +62,31 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:coffee_1", table.copy(crop_def)) +minetest.register_node("farming:coffee_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_coffee_2.png"} -minetest.register_node("farming:coffee_2", table.copy(crop_def)) +def.tiles = {"farming_coffee_2.png"} +minetest.register_node("farming:coffee_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_coffee_3.png"} -minetest.register_node("farming:coffee_3", table.copy(crop_def)) +def.tiles = {"farming_coffee_3.png"} +minetest.register_node("farming:coffee_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_coffee_4.png"} -minetest.register_node("farming:coffee_4", table.copy(crop_def)) +def.tiles = {"farming_coffee_4.png"} +minetest.register_node("farming:coffee_4", table.copy(def)) -- stage 5 (final) -crop_def.tiles = {"farming_coffee_5.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_coffee_5.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:coffee_beans 2"}, rarity = 1}, {items = {"farming:coffee_beans 2"}, rarity = 2}, - {items = {"farming:coffee_beans 2"}, rarity = 3}, + {items = {"farming:coffee_beans 2"}, rarity = 3} } } -minetest.register_node("farming:coffee_5", table.copy(crop_def)) +minetest.register_node("farming:coffee_5", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:coffee"] = { diff --git a/farming/crops/corn.lua b/farming/crops/corn.lua index 8e39fb79..4835281e 100644 --- a/farming/crops/corn.lua +++ b/farming/crops/corn.lua @@ -14,7 +14,7 @@ minetest.register_craftitem("farming:corn", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:corn_1") end, - on_use = minetest.item_eat(3), + on_use = minetest.item_eat(3) }) -- corn on the cob (texture by TenPlus1) @@ -22,7 +22,7 @@ minetest.register_craftitem("farming:corn_cob", { description = S("Corn on the Cob"), inventory_image = "farming_corn_cob.png", groups = {food_corn_cooked = 1, flammable = 2}, - on_use = minetest.item_eat(5), + on_use = minetest.item_eat(5) }) minetest.register_craft({ @@ -36,7 +36,7 @@ minetest.register_craft({ minetest.register_craftitem("farming:cornstarch", { description = S("Cornstarch"), inventory_image = "farming_cornstarch.png", - groups = {food_cornstarch = 1, flammable = 2}, + groups = {food_cornstarch = 1, flammable = 2} }) minetest.register_craft({ @@ -66,7 +66,7 @@ minetest.register_node("farming:bottle_ethanol", { fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} }, groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, - sounds = default.node_sound_glass_defaults(), + sounds = default.node_sound_glass_defaults() }) minetest.register_craft( { @@ -74,19 +74,19 @@ minetest.register_craft( { recipe = { { "vessels:glass_bottle", "group:food_corn", "group:food_corn"}, { "group:food_corn", "group:food_corn", "group:food_corn"}, - { "group:food_corn", "group:food_corn", "group:food_corn"}, + { "group:food_corn", "group:food_corn", "group:food_corn"} } }) minetest.register_craft({ type = "fuel", recipe = "farming:bottle_ethanol", - burntime = 80, --240, + burntime = 80, replacements = {{ "farming:bottle_ethanol", "vessels:glass_bottle"}} }) -- corn definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_corn_1.png"}, paramtype = "light", @@ -103,51 +103,51 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:corn_1", table.copy(crop_def)) +minetest.register_node("farming:corn_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_corn_2.png"} -minetest.register_node("farming:corn_2", table.copy(crop_def)) +def.tiles = {"farming_corn_2.png"} +minetest.register_node("farming:corn_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_corn_3.png"} -minetest.register_node("farming:corn_3", table.copy(crop_def)) +def.tiles = {"farming_corn_3.png"} +minetest.register_node("farming:corn_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_corn_4.png"} -minetest.register_node("farming:corn_4", table.copy(crop_def)) +def.tiles = {"farming_corn_4.png"} +minetest.register_node("farming:corn_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_corn_5.png"} -minetest.register_node("farming:corn_5", table.copy(crop_def)) +def.tiles = {"farming_corn_5.png"} +minetest.register_node("farming:corn_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_corn_6.png"} -crop_def.visual_scale = 1.9 -- 1.45 -minetest.register_node("farming:corn_6", table.copy(crop_def)) +def.tiles = {"farming_corn_6.png"} +def.visual_scale = 1.9 +minetest.register_node("farming:corn_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_corn_7.png"} -crop_def.drop = { +def.tiles = {"farming_corn_7.png"} +def.drop = { items = { {items = {"farming:corn"}, rarity = 1}, {items = {"farming:corn"}, rarity = 2}, - {items = {"farming:corn"}, rarity = 3}, + {items = {"farming:corn"}, rarity = 3} } } -minetest.register_node("farming:corn_7", table.copy(crop_def)) +minetest.register_node("farming:corn_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_corn_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_corn_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:corn 2"}, rarity = 1}, {items = {"farming:corn 2"}, rarity = 2}, - {items = {"farming:corn 2"}, rarity = 2}, + {items = {"farming:corn 2"}, rarity = 2} } } -minetest.register_node("farming:corn_8", table.copy(crop_def)) +minetest.register_node("farming:corn_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:corn"] = { diff --git a/farming/crops/cotton.lua b/farming/crops/cotton.lua index 24dc7bbb..067b444b 100644 --- a/farming/crops/cotton.lua +++ b/farming/crops/cotton.lua @@ -1,6 +1,32 @@ local S = farming.intllib +-- wild cotton as a source of cotton seed and a chance of cotton itself +minetest.register_node("farming:cotton_wild", { + description = S("Wild Cotton"), + drawtype = "plantlike", + waving = 1, + tiles = {"farming_cotton_wild.png"}, + inventory_image = "farming_cotton_wild.png", + wield_image = "farming_cotton_wild.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 4}, + drop = { + items = { + {items = {"farming:cotton"}, rarity = 2}, + {items = {"farming:seed_cotton"}, rarity = 1} + } + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -8 / 16, -6 / 16, 6 / 16, 5 / 16, 6 / 16} + } +}) + -- cotton seeds minetest.register_node("farming:seed_cotton", { description = S("Cotton Seed"), @@ -16,21 +42,21 @@ minetest.register_node("farming:seed_cotton", { selection_box = farming.select, on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:cotton_1") - end, + end }) --- cotton / string - +-- cotton minetest.register_craftitem("farming:cotton", { description = S("Cotton"), inventory_image = "farming_cotton.png", - groups = {flammable = 4}, + groups = {flammable = 4} }) +-- string minetest.register_craftitem("farming:string", { description = S("String"), inventory_image = "farming_string.png", - groups = {flammable = 2}, + groups = {flammable = 2} }) -- cotton to wool @@ -38,7 +64,7 @@ minetest.register_craft({ output = "wool:white", recipe = { {"farming:cotton", "farming:cotton"}, - {"farming:cotton", "farming:cotton"}, + {"farming:cotton", "farming:cotton"} } }) @@ -47,7 +73,7 @@ minetest.register_craft({ output = "farming:string 2", recipe = { {"farming:cotton"}, - {"farming:cotton"}, + {"farming:cotton"} } }) @@ -55,17 +81,17 @@ minetest.register_craft({ minetest.register_craft({ type = "fuel", recipe = "farming:string", - burntime = 1, + burntime = 1 }) minetest.register_craft({ type = "fuel", recipe = "farming:cotton", - burntime = 1, + burntime = 1 }) -- cotton definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_cotton_1.png"}, paramtype = "light", @@ -82,65 +108,65 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:cotton_1", table.copy(crop_def)) +minetest.register_node("farming:cotton_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_cotton_2.png"} -minetest.register_node("farming:cotton_2", table.copy(crop_def)) +def.tiles = {"farming_cotton_2.png"} +minetest.register_node("farming:cotton_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_cotton_3.png"} -minetest.register_node("farming:cotton_3", table.copy(crop_def)) +def.tiles = {"farming_cotton_3.png"} +minetest.register_node("farming:cotton_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_cotton_4.png"} -minetest.register_node("farming:cotton_4", table.copy(crop_def)) +def.tiles = {"farming_cotton_4.png"} +minetest.register_node("farming:cotton_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_cotton_5.png"} -crop_def.drop = { +def.tiles = {"farming_cotton_5.png"} +def.drop = { items = { - {items = {"farming:seed_cotton"}, rarity = 1}, + {items = {"farming:seed_cotton"}, rarity = 1} } } -minetest.register_node("farming:cotton_5", table.copy(crop_def)) +minetest.register_node("farming:cotton_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_cotton_6.png"} -crop_def.drop = { +def.tiles = {"farming_cotton_6.png"} +def.drop = { items = { {items = {"farming:cotton"}, rarity = 1}, - {items = {"farming:cotton"}, rarity = 2}, + {items = {"farming:cotton"}, rarity = 2} } } -minetest.register_node("farming:cotton_6", table.copy(crop_def)) +minetest.register_node("farming:cotton_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_cotton_7.png"} -crop_def.drop = { +def.tiles = {"farming_cotton_7.png"} +def.drop = { items = { {items = {"farming:cotton"}, rarity = 1}, {items = {"farming:cotton"}, rarity = 2}, {items = {"farming:seed_cotton"}, rarity = 1}, - {items = {"farming:seed_cotton"}, rarity = 2}, + {items = {"farming:seed_cotton"}, rarity = 2} } } -minetest.register_node("farming:cotton_7", table.copy(crop_def)) +minetest.register_node("farming:cotton_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_cotton_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_cotton_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:cotton"}, rarity = 1}, {items = {"farming:cotton"}, rarity = 2}, {items = {"farming:cotton"}, rarity = 3}, {items = {"farming:seed_cotton"}, rarity = 1}, {items = {"farming:seed_cotton"}, rarity = 2}, - {items = {"farming:seed_cotton"}, rarity = 3}, + {items = {"farming:seed_cotton"}, rarity = 3} } } -minetest.register_node("farming:cotton_8", table.copy(crop_def)) +minetest.register_node("farming:cotton_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:cotton"] = { @@ -151,7 +177,7 @@ farming.registered_plants["farming:cotton"] = { steps = 8 } ---[[ Cotton (example, is already registered in cotton.lua) +--[[ Cotton using api farming.register_plant("farming:cotton", { description = "Cotton seed", inventory_image = "farming_cotton_seed.png", diff --git a/farming/crops/cucumber.lua b/farming/crops/cucumber.lua index 8bd679a0..fc15e479 100644 --- a/farming/crops/cucumber.lua +++ b/farming/crops/cucumber.lua @@ -14,11 +14,11 @@ minetest.register_craftitem("farming:cucumber", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:cucumber_1") end, - on_use = minetest.item_eat(4), + on_use = minetest.item_eat(4) }) -- cucumber definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_cucumber_1.png"}, paramtype = "light", @@ -34,26 +34,26 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:cucumber_1", table.copy(crop_def)) +minetest.register_node("farming:cucumber_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_cucumber_2.png"} -minetest.register_node("farming:cucumber_2", table.copy(crop_def)) +def.tiles = {"farming_cucumber_2.png"} +minetest.register_node("farming:cucumber_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_cucumber_3.png"} -minetest.register_node("farming:cucumber_3", table.copy(crop_def)) +def.tiles = {"farming_cucumber_3.png"} +minetest.register_node("farming:cucumber_3", table.copy(def)) -- stage 4 (final) -crop_def.tiles = {"farming_cucumber_4.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_cucumber_4.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:cucumber 2"}, rarity = 1}, - {items = {"farming:cucumber 2"}, rarity = 2}, + {items = {"farming:cucumber 2"}, rarity = 2} } } -minetest.register_node("farming:cucumber_4", table.copy(crop_def)) +minetest.register_node("farming:cucumber_4", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:cucumber"] = { diff --git a/farming/crops/garlic.lua b/farming/crops/garlic.lua index ee841e5e..7fe75655 100644 --- a/farming/crops/garlic.lua +++ b/farming/crops/garlic.lua @@ -14,7 +14,7 @@ minetest.register_craftitem("farming:garlic_clove", { groups = {seed = 2, food_garlic_clove = 1, flammable = 3}, on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:garlic_1") - end, + end }) -- garlic bulb @@ -22,13 +22,13 @@ minetest.register_craftitem("farming:garlic", { description = S("Garlic"), inventory_image = "crops_garlic.png", on_use = minetest.item_eat(1), - groups = {food_garlic = 1, flammable = 3}, + groups = {food_garlic = 1, flammable = 3} }) minetest.register_craft({ type = "shapeless", output = "farming:garlic_clove 8", - recipe = { "farming:garlic" } + recipe = {"farming:garlic"} }) minetest.register_craft({ @@ -58,8 +58,8 @@ minetest.register_node("farming:garlic_braid", { node_box = { type = "fixed", fixed = { - {-0.13, -0.45, 0.5, 0.13, 0.45, 0.24}, - }, + {-0.13, -0.45, 0.5, 0.13, 0.45, 0.24} + } } }) @@ -75,11 +75,11 @@ minetest.register_craft({ minetest.register_craft({ type = "shapeless", output = "farming:garlic 9", - recipe = { "farming:garlic_braid" } + recipe = {"farming:garlic_braid"} }) -- crop definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"crops_garlic_plant_1.png"}, paramtype = "light", @@ -99,33 +99,31 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:garlic_1", table.copy(crop_def)) +minetest.register_node("farming:garlic_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"crops_garlic_plant_2.png"} -minetest.register_node("farming:garlic_2", table.copy(crop_def)) +def.tiles = {"crops_garlic_plant_2.png"} +minetest.register_node("farming:garlic_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"crops_garlic_plant_3.png"} -minetest.register_node("farming:garlic_3", table.copy(crop_def)) +def.tiles = {"crops_garlic_plant_3.png"} +minetest.register_node("farming:garlic_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"crops_garlic_plant_4.png"} -minetest.register_node("farming:garlic_4", table.copy(crop_def)) +def.tiles = {"crops_garlic_plant_4.png"} +minetest.register_node("farming:garlic_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"crops_garlic_plant_5.png"} -crop_def.groups.growing = 0 -crop_def.drop = { - max_items = 5, items = { - {items = {"farming:garlic"}, rarity = 1}, - {items = {"farming:garlic"}, rarity = 1}, - {items = {"farming:garlic"}, rarity = 1}, +def.tiles = {"crops_garlic_plant_5.png"} +def.groups.growing = nil +def.drop = { + items = { + {items = {"farming:garlic 3"}, rarity = 1}, {items = {"farming:garlic"}, rarity = 2}, - {items = {"farming:garlic"}, rarity = 5}, + {items = {"farming:garlic"}, rarity = 5} } } -minetest.register_node("farming:garlic_5", table.copy(crop_def)) +minetest.register_node("farming:garlic_5", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:garlic"] = { diff --git a/farming/crops/grapes.lua b/farming/crops/grapes.lua index cc9d8aac..5d13dc65 100644 --- a/farming/crops/grapes.lua +++ b/farming/crops/grapes.lua @@ -8,7 +8,6 @@ local function place_grapes(itemstack, placer, pointed_thing, plantname) -- check if pointing at a node if not pt or pt.type ~= "node" then - return end @@ -69,17 +68,16 @@ minetest.register_craftitem("farming:grapes", { inventory_image = "farming_grapes.png", on_use = minetest.item_eat(2), groups = {seed = 2, food_grapes = 1, flammable = 3}, - on_place = function(itemstack, placer, pointed_thing) return place_grapes(itemstack, placer, pointed_thing, "farming:grapes_1") - end, + end }) -- grapes can be used for violet dye minetest.register_craft({ output = "dye:violet", recipe = { - {"farming:grapes"}, + {"farming:grapes"} } }) @@ -89,7 +87,7 @@ minetest.register_node("farming:trellis", { drawtype = "plantlike", tiles = {"farming_trellis.png"}, inventory_image = "farming_trellis.png", - visual_scale = 1.9, -- 1.45, + visual_scale = 1.9, paramtype = "light", walkable = false, buildable_to = true, @@ -159,21 +157,21 @@ minetest.register_craft({ recipe = { {"default:stick", "default:stick", "default:stick"}, {"default:stick", "default:stick", "default:stick"}, - {"default:stick", "default:stick", "default:stick"}, + {"default:stick", "default:stick", "default:stick"} } }) minetest.register_craft({ type = "fuel", recipe = "farming:trellis", - burntime = 15, + burntime = 15 }) -- grapes definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_grapes_1.png"}, - visual_scale = 1.9, -- 1.45, + visual_scale = 1.9, paramtype = "light", walkable = false, buildable_to = true, @@ -192,44 +190,44 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:grapes_1", table.copy(crop_def)) +minetest.register_node("farming:grapes_1", table.copy(def)) -- stage2 -crop_def.tiles = {"farming_grapes_2.png"} -minetest.register_node("farming:grapes_2", table.copy(crop_def)) +def.tiles = {"farming_grapes_2.png"} +minetest.register_node("farming:grapes_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_grapes_3.png"} -minetest.register_node("farming:grapes_3", table.copy(crop_def)) +def.tiles = {"farming_grapes_3.png"} +minetest.register_node("farming:grapes_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_grapes_4.png"} -minetest.register_node("farming:grapes_4", table.copy(crop_def)) +def.tiles = {"farming_grapes_4.png"} +minetest.register_node("farming:grapes_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_grapes_5.png"} -minetest.register_node("farming:grapes_5", table.copy(crop_def)) +def.tiles = {"farming_grapes_5.png"} +minetest.register_node("farming:grapes_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_grapes_6.png"} -minetest.register_node("farming:grapes_6", table.copy(crop_def)) +def.tiles = {"farming_grapes_6.png"} +minetest.register_node("farming:grapes_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_grapes_7.png"} -minetest.register_node("farming:grapes_7", table.copy(crop_def)) +def.tiles = {"farming_grapes_7.png"} +minetest.register_node("farming:grapes_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_grapes_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_grapes_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:trellis"}, rarity = 1}, {items = {"farming:grapes 3"}, rarity = 1}, {items = {"farming:grapes 1"}, rarity = 2}, - {items = {"farming:grapes 1"}, rarity = 3}, + {items = {"farming:grapes 1"}, rarity = 3} } } -minetest.register_node("farming:grapes_8", table.copy(crop_def)) +minetest.register_node("farming:grapes_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:grapes"] = { @@ -253,13 +251,13 @@ minetest.register_node("farming:grapebush", { items = { {items = {"farming:grapes 1"}, rarity = 1}, {items = {"farming:grapes 1"}, rarity = 2}, - {items = {"farming:grapes 1"}, rarity = 3}, + {items = {"farming:grapes 1"}, rarity = 3} } }, selection_box = farming.select, groups = { snappy = 3, flammable = 2, plant = 1, attached_node = 1, - not_in_creative_inventory=1 + not_in_creative_inventory = 1 }, - sounds = default.node_sound_leaves_defaults(), + sounds = default.node_sound_leaves_defaults() }) diff --git a/farming/crops/hemp.lua b/farming/crops/hemp.lua index e08384ce..08b54cd7 100644 --- a/farming/crops/hemp.lua +++ b/farming/crops/hemp.lua @@ -16,13 +16,13 @@ minetest.register_node("farming:seed_hemp", { selection_box = farming.select, on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:hemp_1") - end, + end }) -- harvested hemp minetest.register_craftitem("farming:hemp_leaf", { description = S("Hemp Leaf"), - inventory_image = "farming_hemp_leaf.png", + inventory_image = "farming_hemp_leaf.png" }) -- hemp oil @@ -40,7 +40,7 @@ minetest.register_node("farming:hemp_oil", { fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} }, groups = {food_oil = 1, vessel = 1, dig_immediate = 3, attached_node = 1}, - sounds = default.node_sound_glass_defaults(), + sounds = default.node_sound_glass_defaults() }) minetest.register_craft( { @@ -71,7 +71,7 @@ minetest.register_craft({ -- hemp fibre minetest.register_craftitem("farming:hemp_fibre", { description = S("Hemp Fibre"), - inventory_image = "farming_hemp_fibre.png", + inventory_image = "farming_hemp_fibre.png" }) minetest.register_craft( { @@ -108,7 +108,7 @@ minetest.register_craft( { {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} - }, + } }) -- check and register stairs @@ -134,19 +134,19 @@ end -- paper minetest.register_craft( { - output = "default:paper", + output = "default:paper 3", recipe = { - {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} } }) -- string minetest.register_craft( { - output = "farming:cotton", + output = "farming:cotton 3", recipe = { {"farming:hemp_fibre"}, {"farming:hemp_fibre"}, - {"farming:hemp_fibre"}, + {"farming:hemp_fibre"} } }) @@ -165,8 +165,8 @@ minetest.register_node("farming:hemp_rope", { sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", - fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, - }, + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7} + } }) -- string @@ -175,12 +175,12 @@ minetest.register_craft( { recipe = { {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, {"farming:cotton", "farming:cotton", "farming:cotton"}, - {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} } }) -- hemp definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_hemp_1.png"}, paramtype = "light", @@ -197,58 +197,58 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:hemp_1", table.copy(crop_def)) +minetest.register_node("farming:hemp_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_hemp_2.png"} -minetest.register_node("farming:hemp_2", table.copy(crop_def)) +def.tiles = {"farming_hemp_2.png"} +minetest.register_node("farming:hemp_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_hemp_3.png"} -minetest.register_node("farming:hemp_3", table.copy(crop_def)) +def.tiles = {"farming_hemp_3.png"} +minetest.register_node("farming:hemp_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_hemp_4.png"} -minetest.register_node("farming:hemp_4", table.copy(crop_def)) +def.tiles = {"farming_hemp_4.png"} +minetest.register_node("farming:hemp_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_hemp_5.png"} -minetest.register_node("farming:hemp_5", table.copy(crop_def)) +def.tiles = {"farming_hemp_5.png"} +minetest.register_node("farming:hemp_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_hemp_6.png"} -crop_def.drop = { +def.tiles = {"farming_hemp_6.png"} +def.drop = { items = { {items = {"farming:hemp_leaf"}, rarity = 2}, - {items = {"farming:seed_hemp"}, rarity = 1}, + {items = {"farming:seed_hemp"}, rarity = 1} } } -minetest.register_node("farming:hemp_6", table.copy(crop_def)) +minetest.register_node("farming:hemp_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_hemp_7.png"} -crop_def.drop = { +def.tiles = {"farming_hemp_7.png"} +def.drop = { items = { {items = {"farming:hemp_leaf"}, rarity = 1}, {items = {"farming:hemp_leaf"}, rarity = 3}, {items = {"farming:seed_hemp"}, rarity = 1}, - {items = {"farming:seed_hemp"}, rarity = 3}, + {items = {"farming:seed_hemp"}, rarity = 3} } } -minetest.register_node("farming:hemp_7", table.copy(crop_def)) +minetest.register_node("farming:hemp_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_hemp_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_hemp_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:hemp_leaf 2"}, rarity = 1}, {items = {"farming:hemp_leaf"}, rarity = 2}, {items = {"farming:seed_hemp"}, rarity = 1}, - {items = {"farming:seed_hemp"}, rarity = 2}, + {items = {"farming:seed_hemp"}, rarity = 2} } } -minetest.register_node("farming:hemp_8", table.copy(crop_def)) +minetest.register_node("farming:hemp_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:hemp"] = { diff --git a/farming/crops/melon.lua b/farming/crops/melon.lua index 88f4a1bf..6495a138 100644 --- a/farming/crops/melon.lua +++ b/farming/crops/melon.lua @@ -9,14 +9,14 @@ minetest.register_craftitem("farming:melon_slice", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:melon_1") end, - on_use = minetest.item_eat(2), + on_use = minetest.item_eat(2) }) minetest.register_craft({ output = "farming:melon_8", recipe = { {"farming:melon_slice", "farming:melon_slice"}, - {"farming:melon_slice", "farming:melon_slice"}, + {"farming:melon_slice", "farming:melon_slice"} } }) @@ -24,11 +24,11 @@ minetest.register_craft({ type = "shapeless", output = "farming:melon_slice 4", recipe = {"farming:melon_8", "farming:cutting_board"}, - replacements = {{"farming:cutting_board", "farming:cutting_board"}}, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} }) -- melon definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_melon_1.png"}, paramtype = "light", @@ -45,45 +45,44 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:melon_1", table.copy(crop_def)) +minetest.register_node("farming:melon_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_melon_2.png"} -minetest.register_node("farming:melon_2", table.copy(crop_def)) +def.tiles = {"farming_melon_2.png"} +minetest.register_node("farming:melon_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_melon_3.png"} -minetest.register_node("farming:melon_3", table.copy(crop_def)) +def.tiles = {"farming_melon_3.png"} +minetest.register_node("farming:melon_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_melon_4.png"} -minetest.register_node("farming:melon_4", table.copy(crop_def)) +def.tiles = {"farming_melon_4.png"} +minetest.register_node("farming:melon_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_melon_5.png"} -minetest.register_node("farming:melon_5", table.copy(crop_def)) +def.tiles = {"farming_melon_5.png"} +minetest.register_node("farming:melon_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_melon_6.png"} -minetest.register_node("farming:melon_6", table.copy(crop_def)) +def.tiles = {"farming_melon_6.png"} +minetest.register_node("farming:melon_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_melon_7.png"} -minetest.register_node("farming:melon_7", table.copy(crop_def)) +def.tiles = {"farming_melon_7.png"} +minetest.register_node("farming:melon_7", table.copy(def)) -- stage 8 (final) -crop_def.drawtype = "nodebox" -crop_def.description = S("Melon") -crop_def.tiles = {"farming_melon_top.png", "farming_melon_top.png", "farming_melon_side.png"} -crop_def.selection_box = {-.5, -.5, -.5, .5, .5, .5} -crop_def.walkable = true -crop_def.groups = { +def.drawtype = "nodebox" +def.description = S("Melon") +def.tiles = {"farming_melon_top.png", "farming_melon_top.png", "farming_melon_side.png"} +def.selection_box = {-.5, -.5, -.5, .5, .5, .5} +def.walkable = true +def.groups = { food_melon = 1, snappy = 2, oddly_breakable_by_hand = 1, flammable = 2, plant = 1 } ---crop_def.drop = "farming:melon_slice 9" -crop_def.drop = "farming:melon_8" -minetest.register_node("farming:melon_8", table.copy(crop_def)) +def.drop = "farming:melon_8" +minetest.register_node("farming:melon_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:melon"] = { diff --git a/farming/crops/mint.lua b/farming/crops/mint.lua index 96b2f46b..05af5de9 100644 --- a/farming/crops/mint.lua +++ b/farming/crops/mint.lua @@ -16,7 +16,7 @@ minetest.register_craftitem("farming:seed_mint", { minetest.register_craftitem("farming:mint_leaf", { description = S("Mint Leaf"), inventory_image = "farming_mint_leaf.png", - groups = {food_mint = 1, flammable = 4}, + groups = {food_mint = 1, flammable = 4} }) -- mint tea @@ -24,7 +24,7 @@ minetest.register_craftitem("farming:mint_tea", { description = S("Mint Tea"), inventory_image = "farming_mint_tea.png", on_use = minetest.item_eat(2, "vessels:drinking_glass"), - groups = {flammable = 4}, + groups = {flammable = 4} }) minetest.register_craft({ @@ -37,12 +37,12 @@ minetest.register_craft({ }, replacements = { {"group:food_juicer", "farming:juicer"}, - {"bucket:bucket_water", "bucket:bucket_empty"}, - }, + {"bucket:bucket_water", "bucket:bucket_empty"} + } }) -- mint definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_mint_1.png"}, paramtype = "light", @@ -58,20 +58,20 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:mint_1", table.copy(crop_def)) +minetest.register_node("farming:mint_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_mint_2.png"} -minetest.register_node("farming:mint_2", table.copy(crop_def)) +def.tiles = {"farming_mint_2.png"} +minetest.register_node("farming:mint_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_mint_3.png"} -minetest.register_node("farming:mint_3", table.copy(crop_def)) +def.tiles = {"farming_mint_3.png"} +minetest.register_node("farming:mint_3", table.copy(def)) -- stage 4 (final) -crop_def.tiles = {"farming_mint_4.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_mint_4.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:mint_leaf 2"}, rarity = 1}, {items = {"farming:mint_leaf 2"}, rarity = 2}, @@ -79,7 +79,7 @@ crop_def.drop = { {items = {"farming:seed_mint 2"}, rarity = 2}, } } -minetest.register_node("farming:mint_4", table.copy(crop_def)) +minetest.register_node("farming:mint_4", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:mint"] = { diff --git a/farming/crops/onion.lua b/farming/crops/onion.lua index ba8c301b..30c9bc37 100644 --- a/farming/crops/onion.lua +++ b/farming/crops/onion.lua @@ -15,7 +15,7 @@ minetest.register_craftitem("farming:onion", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:onion_1") end, - on_use = minetest.item_eat(1), + on_use = minetest.item_eat(1) }) -- onion soup @@ -23,7 +23,7 @@ minetest.register_craftitem("farming:onion_soup", { description = S("Onion Soup"), inventory_image = "farming_onion_soup.png", groups = {flammable = 2}, - on_use = minetest.item_eat(6, "farming:bowl"), + on_use = minetest.item_eat(6, "farming:bowl") }) minetest.register_craft({ @@ -38,7 +38,7 @@ minetest.register_craft({ }) -- crop definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"crops_onion_plant_1.png"}, paramtype = "light", @@ -58,24 +58,24 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:onion_1", table.copy(crop_def)) +minetest.register_node("farming:onion_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"crops_onion_plant_2.png"} -minetest.register_node("farming:onion_2", table.copy(crop_def)) +def.tiles = {"crops_onion_plant_2.png"} +minetest.register_node("farming:onion_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"crops_onion_plant_3.png"} -minetest.register_node("farming:onion_3", table.copy(crop_def)) +def.tiles = {"crops_onion_plant_3.png"} +minetest.register_node("farming:onion_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"crops_onion_plant_4.png"} -minetest.register_node("farming:onion_4", table.copy(crop_def)) +def.tiles = {"crops_onion_plant_4.png"} +minetest.register_node("farming:onion_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"crops_onion_plant_5.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"crops_onion_plant_5.png"} +def.groups.growing = nil +def.drop = { max_items = 5, items = { {items = {"farming:onion"}, rarity = 1}, {items = {"farming:onion"}, rarity = 1}, @@ -84,7 +84,7 @@ crop_def.drop = { {items = {"farming:onion"}, rarity = 5}, } } -minetest.register_node("farming:onion_5", table.copy(crop_def)) +minetest.register_node("farming:onion_5", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:onion"] = { diff --git a/farming/crops/peas.lua b/farming/crops/peas.lua index ffe21b3a..0c8e40c9 100644 --- a/farming/crops/peas.lua +++ b/farming/crops/peas.lua @@ -31,7 +31,7 @@ minetest.register_craftitem("farming:pea_soup", { description = S("Pea Soup"), inventory_image = "farming_pea_soup.png", groups = {flammable = 2}, - on_use = minetest.item_eat(4, "farming:bowl"), + on_use = minetest.item_eat(4, "farming:bowl") }) minetest.register_craft({ @@ -40,7 +40,7 @@ minetest.register_craft({ recipe = {"group:food_peas", "group:food_peas", "group:food_bowl"} }) -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_pea_1.png"}, paramtype = "light", @@ -60,32 +60,32 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:pea_1", table.copy(crop_def)) +minetest.register_node("farming:pea_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_pea_2.png"} -minetest.register_node("farming:pea_2", table.copy(crop_def)) +def.tiles = {"farming_pea_2.png"} +minetest.register_node("farming:pea_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_pea_3.png"} -minetest.register_node("farming:pea_3", table.copy(crop_def)) +def.tiles = {"farming_pea_3.png"} +minetest.register_node("farming:pea_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_pea_4.png"} -minetest.register_node("farming:pea_4", table.copy(crop_def)) +def.tiles = {"farming_pea_4.png"} +minetest.register_node("farming:pea_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_pea_5.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_pea_5.png"} +def.groups.growing = nil +def.drop = { max_items = 5, items = { {items = {"farming:pea_pod"}, rarity = 1}, {items = {"farming:pea_pod"}, rarity = 2}, {items = {"farming:pea_pod"}, rarity = 3}, - {items = {"farming:pea_pod"}, rarity = 5}, + {items = {"farming:pea_pod"}, rarity = 5} } } -minetest.register_node("farming:pea_5", table.copy(crop_def)) +minetest.register_node("farming:pea_5", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:pea_pod"] = { diff --git a/farming/crops/pepper.lua b/farming/crops/pepper.lua index ea07b4ea..4d5baf83 100644 --- a/farming/crops/pepper.lua +++ b/farming/crops/pepper.lua @@ -14,7 +14,7 @@ minetest.register_craftitem("farming:peppercorn", { groups = {seed = 1, food_peppercorn = 1, flammable = 3}, on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:pepper_1") - end, + end }) -- green pepper @@ -22,7 +22,7 @@ minetest.register_craftitem("farming:pepper", { description = S("Pepper"), inventory_image = "crops_pepper.png", on_use = minetest.item_eat(2), - groups = {food_pepper = 1, flammable = 3}, + groups = {food_pepper = 1, flammable = 3} }) minetest.register_craft({ @@ -48,18 +48,18 @@ minetest.register_node("farming:pepper_ground", { selection_box = { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, + } }) minetest.register_craft( { output = "farming:pepper_ground", type = "shapeless", recipe = {"group:food_peppercorn", "vessels:glass_bottle", "farming:mortar_pestle"}, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}}, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} }) -- crop definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"crops_pepper_plant_1.png"}, paramtype = "light", @@ -79,31 +79,31 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:pepper_1", table.copy(crop_def)) +minetest.register_node("farming:pepper_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"crops_pepper_plant_2.png"} -minetest.register_node("farming:pepper_2", table.copy(crop_def)) +def.tiles = {"crops_pepper_plant_2.png"} +minetest.register_node("farming:pepper_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"crops_pepper_plant_3.png"} -minetest.register_node("farming:pepper_3", table.copy(crop_def)) +def.tiles = {"crops_pepper_plant_3.png"} +minetest.register_node("farming:pepper_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"crops_pepper_plant_4.png"} -minetest.register_node("farming:pepper_4", table.copy(crop_def)) +def.tiles = {"crops_pepper_plant_4.png"} +minetest.register_node("farming:pepper_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"crops_pepper_plant_5.png"} -crop_def.groups.growing = 0 -crop_def.drop = { - max_items = 2, items = { +def.tiles = {"crops_pepper_plant_5.png"} +def.groups.growing = 0 +def.drop = { + items = { {items = {"farming:pepper 2"}, rarity = 1}, {items = {"farming:pepper"}, rarity = 2}, - {items = {"farming:pepper"}, rarity = 3}, + {items = {"farming:pepper"}, rarity = 3} } } -minetest.register_node("farming:pepper_5", table.copy(crop_def)) +minetest.register_node("farming:pepper_5", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:pepper"] = { diff --git a/farming/crops/pineapple.lua b/farming/crops/pineapple.lua index 5f3e0783..f57ccf0f 100644 --- a/farming/crops/pineapple.lua +++ b/farming/crops/pineapple.lua @@ -8,7 +8,7 @@ minetest.register_craftitem("farming:pineapple_top", { groups = {seed = 2, flammable = 2}, on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:pineapple_1") - end, + end }) -- pineapple @@ -25,7 +25,7 @@ minetest.register_node("farming:pineapple", { type = "fixed", fixed = {-0.27, -0.37, -0.27, 0.27, 0.44, 0.27} }, - groups = {food_pineapple = 1, fleshy = 3, dig_immediate = 3, flammable = 2}, + groups = {food_pineapple = 1, fleshy = 3, dig_immediate = 3, flammable = 2} }) -- pineapple @@ -33,7 +33,7 @@ minetest.register_craftitem("farming:pineapple_ring", { description = S("Pineapple Ring"), inventory_image = "farming_pineapple_ring.png", groups = {food_pineapple_ring = 1, flammable = 2}, - on_use = minetest.item_eat(1), + on_use = minetest.item_eat(1) }) minetest.register_craft( { @@ -48,18 +48,19 @@ minetest.register_craftitem("farming:pineapple_juice", { description = S("Pineapple Juice"), inventory_image = "farming_pineapple_juice.png", on_use = minetest.item_eat(4, "vessels:drinking_glass"), - groups = {vessel = 1}, + groups = {vessel = 1, drink = 1} }) minetest.register_craft({ output = "farming:pineapple_juice", type = "shapeless", - recipe = {"vessels:drinking_glass", "group:food_pineapple_ring", - "group:food_pineapple_ring", "group:food_pineapple_ring", - "farming:juicer"}, + recipe = { + "vessels:drinking_glass", "group:food_pineapple_ring", + "group:food_pineapple_ring", "group:food_pineapple_ring", + "farming:juicer"}, replacements = { - {"group:food_juicer", "farming:juicer"}, - }, + {"group:food_juicer", "farming:juicer"} + } }) minetest.register_craft({ @@ -70,12 +71,12 @@ minetest.register_craft({ "group:food_pineapple", "farming:juicer" }, replacements = { - {"group:food_juicer", "farming:juicer"}, - }, + {"group:food_juicer", "farming:juicer"} + } }) -- crop definition -local crop_def = { +local def = { drawtype = "plantlike", visual_scale = 1.5, tiles = {"farming_pineapple_1.png"}, @@ -93,42 +94,42 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:pineapple_1", table.copy(crop_def)) +minetest.register_node("farming:pineapple_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_pineapple_2.png"} -minetest.register_node("farming:pineapple_2", table.copy(crop_def)) +def.tiles = {"farming_pineapple_2.png"} +minetest.register_node("farming:pineapple_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_pineapple_3.png"} -minetest.register_node("farming:pineapple_3", table.copy(crop_def)) +def.tiles = {"farming_pineapple_3.png"} +minetest.register_node("farming:pineapple_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_pineapple_4.png"} -minetest.register_node("farming:pineapple_4", table.copy(crop_def)) +def.tiles = {"farming_pineapple_4.png"} +minetest.register_node("farming:pineapple_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_pineapple_5.png"} -minetest.register_node("farming:pineapple_5", table.copy(crop_def)) +def.tiles = {"farming_pineapple_5.png"} +minetest.register_node("farming:pineapple_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_pineapple_6.png"} -minetest.register_node("farming:pineapple_6", table.copy(crop_def)) +def.tiles = {"farming_pineapple_6.png"} +minetest.register_node("farming:pineapple_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_pineapple_7.png"} -minetest.register_node("farming:pineapple_7", table.copy(crop_def)) +def.tiles = {"farming_pineapple_7.png"} +minetest.register_node("farming:pineapple_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_pineapple_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_pineapple_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:pineapple"}, rarity = 1}, - {items = {"farming:pineapple"}, rarity = 15}, + {items = {"farming:pineapple"}, rarity = 10} } } -minetest.register_node("farming:pineapple_8", table.copy(crop_def)) +minetest.register_node("farming:pineapple_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:pineapple"] = { diff --git a/farming/crops/potato.lua b/farming/crops/potato.lua index d9f3e140..8c087d0c 100644 --- a/farming/crops/potato.lua +++ b/farming/crops/potato.lua @@ -14,23 +14,23 @@ minetest.register_craftitem("farming:potato", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:potato_1") end, --- on_use = minetest.item_eat(1), + -- 1 in 3 chance of being poisoned on_use = function(itemstack, user, pointed_thing) if user then - if math.random(1, 3) == 1 then + if math.random(3) == 1 then return minetest.do_item_eat(-1, nil, itemstack, user, pointed_thing) else return minetest.do_item_eat(1, nil, itemstack, user, pointed_thing) end end - end, + end }) -- baked potato minetest.register_craftitem("farming:baked_potato", { description = S("Baked Potato"), inventory_image = "farming_baked_potato.png", - on_use = minetest.item_eat(6), + on_use = minetest.item_eat(6) }) minetest.register_craft({ @@ -44,7 +44,7 @@ minetest.register_craft({ minetest.register_craftitem("farming:potato_salad", { description = S("Cucumber and Potato Salad"), inventory_image = "farming_potato_salad.png", - on_use = minetest.item_eat(10, "farming:bowl"), + on_use = minetest.item_eat(10, "farming:bowl") }) minetest.register_craft({ @@ -52,12 +52,12 @@ minetest.register_craft({ recipe = { {"group:food_cucumber"}, {"farming:baked_potato"}, - {"group:food_bowl"}, + {"group:food_bowl"} } }) -- potato definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_potato_1.png"}, paramtype = "light", @@ -75,32 +75,32 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:potato_1", table.copy(crop_def)) +minetest.register_node("farming:potato_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_potato_2.png"} -minetest.register_node("farming:potato_2", table.copy(crop_def)) +def.tiles = {"farming_potato_2.png"} +minetest.register_node("farming:potato_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_potato_3.png"} -crop_def.drop = { +def.tiles = {"farming_potato_3.png"} +def.drop = { items = { {items = {"farming:potato"}, rarity = 1}, - {items = {"farming:potato"}, rarity = 3}, + {items = {"farming:potato"}, rarity = 3} } } -minetest.register_node("farming:potato_3", table.copy(crop_def)) +minetest.register_node("farming:potato_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_potato_4.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_potato_4.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:potato 2"}, rarity = 1}, - {items = {"farming:potato 3"}, rarity = 2}, + {items = {"farming:potato 3"}, rarity = 2} } } -minetest.register_node("farming:potato_4", table.copy(crop_def)) +minetest.register_node("farming:potato_4", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:potato"] = { diff --git a/farming/crops/pumpkin.lua b/farming/crops/pumpkin.lua index 57f8a149..1b0b8c45 100644 --- a/farming/crops/pumpkin.lua +++ b/farming/crops/pumpkin.lua @@ -13,14 +13,14 @@ minetest.register_craftitem("farming:pumpkin_slice", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:pumpkin_1") end, - on_use = minetest.item_eat(2), + on_use = minetest.item_eat(2) }) minetest.register_craft({ output = "farming:pumpkin", recipe = { {"farming:pumpkin_slice", "farming:pumpkin_slice"}, - {"farming:pumpkin_slice", "farming:pumpkin_slice"}, + {"farming:pumpkin_slice", "farming:pumpkin_slice"} } }) @@ -28,19 +28,16 @@ minetest.register_craft({ type = "shapeless", output = "farming:pumpkin_slice 4", recipe = {"farming:pumpkin", "farming:cutting_board"}, - replacements = {{"farming:cutting_board", "farming:cutting_board"}}, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} }) -- jack 'o lantern minetest.register_node("farming:jackolantern", { description = S("Jack 'O Lantern (punch to turn on and off)"), tiles = { - "farming_pumpkin_top.png", - "farming_pumpkin_top.png", - "farming_pumpkin_side.png", - "farming_pumpkin_side.png", - "farming_pumpkin_side.png", - "farming_pumpkin_face_off.png" + "farming_pumpkin_top.png", "farming_pumpkin_top.png", + "farming_pumpkin_side.png", "farming_pumpkin_side.png", + "farming_pumpkin_side.png", "farming_pumpkin_face_off.png" }, paramtype2 = "facedir", groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2}, @@ -50,17 +47,14 @@ minetest.register_node("farming:jackolantern", { if minetest.is_protected(pos, name) then return end node.name = "farming:jackolantern_on" minetest.swap_node(pos, node) - end, + end }) minetest.register_node("farming:jackolantern_on", { tiles = { - "farming_pumpkin_top.png", - "farming_pumpkin_top.png", - "farming_pumpkin_side.png", - "farming_pumpkin_side.png", - "farming_pumpkin_side.png", - "farming_pumpkin_face_on.png" + "farming_pumpkin_top.png", "farming_pumpkin_top.png", + "farming_pumpkin_side.png", "farming_pumpkin_side.png", + "farming_pumpkin_side.png", "farming_pumpkin_face_on.png" }, light_source = default.LIGHT_MAX - 1, paramtype2 = "facedir", @@ -75,14 +69,14 @@ minetest.register_node("farming:jackolantern_on", { if minetest.is_protected(pos, name) then return end node.name = "farming:jackolantern" minetest.swap_node(pos, node) - end, + end }) minetest.register_craft({ output = "farming:jackolantern", recipe = { {"default:torch"}, - {"group:food_pumpkin"}, + {"group:food_pumpkin"} } }) @@ -99,17 +93,17 @@ minetest.register_node("farming:scarecrow_bottom", { fixed = { {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16}, {-12/16, 4/16, -1/16, 12/16, 2/16, 1/16}, - }, + } }, - groups = {snappy = 3, flammable = 2}, + groups = {snappy = 3, flammable = 2} }) minetest.register_craft({ output = "farming:scarecrow_bottom", recipe = { - {"", "group:stick", "",}, - {"group:stick", "group:stick", "group:stick",}, - {"", "group:stick", "",} + {"", "group:stick", ""}, + {"group:stick", "group:stick", "group:stick"}, + {"", "group:stick", ""} } }) @@ -118,12 +112,12 @@ minetest.register_craftitem("farming:pumpkin_bread", { description = S("Pumpkin Bread"), inventory_image = "farming_pumpkin_bread.png", on_use = minetest.item_eat(8), - groups = {food_bread = 1, flammable = 2}, + groups = {food_bread = 1, flammable = 2} }) minetest.register_craftitem("farming:pumpkin_dough", { description = S("Pumpkin Dough"), - inventory_image = "farming_pumpkin_dough.png", + inventory_image = "farming_pumpkin_dough.png" }) minetest.register_craft({ @@ -140,7 +134,7 @@ minetest.register_craft({ }) -- pumpkin definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_pumpkin_1.png"}, paramtype = "light", @@ -158,44 +152,33 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:pumpkin_1", table.copy(crop_def)) +minetest.register_node("farming:pumpkin_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_pumpkin_2.png"} -minetest.register_node("farming:pumpkin_2", table.copy(crop_def)) +def.tiles = {"farming_pumpkin_2.png"} +minetest.register_node("farming:pumpkin_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_pumpkin_3.png"} -minetest.register_node("farming:pumpkin_3", table.copy(crop_def)) +def.tiles = {"farming_pumpkin_3.png"} +minetest.register_node("farming:pumpkin_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_pumpkin_4.png"} -minetest.register_node("farming:pumpkin_4", table.copy(crop_def)) +def.tiles = {"farming_pumpkin_4.png"} +minetest.register_node("farming:pumpkin_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_pumpkin_5.png"} -minetest.register_node("farming:pumpkin_5", table.copy(crop_def)) +def.tiles = {"farming_pumpkin_5.png"} +minetest.register_node("farming:pumpkin_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_pumpkin_6.png"} -minetest.register_node("farming:pumpkin_6", table.copy(crop_def)) +def.tiles = {"farming_pumpkin_6.png"} +minetest.register_node("farming:pumpkin_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_pumpkin_7.png"} -minetest.register_node("farming:pumpkin_7", table.copy(crop_def)) +def.tiles = {"farming_pumpkin_7.png"} +minetest.register_node("farming:pumpkin_7", table.copy(def)) -- stage 8 (final) ---[[ -crop_def.tiles = {"farming_pumpkin_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { - items = { - {items = {"farming:pumpkin_slice 9"}, rarity = 1}, - } -} -minetest.register_node("farming:pumpkin_8", table.copy(crop_def)) -]] - minetest.register_node("farming:pumpkin_8", { description = S("Pumpkin"), tiles = { @@ -208,7 +191,7 @@ minetest.register_node("farming:pumpkin_8", { flammable = 2, plant = 1 }, drop = "farming:pumpkin_8", - sounds = default.node_sound_wood_defaults(), + sounds = default.node_sound_wood_defaults() }) minetest.register_alias("farming:pumpkin", "farming:pumpkin_8") diff --git a/farming/crops/raspberry.lua b/farming/crops/raspberry.lua index 8c909e4a..0914aa40 100644 --- a/farming/crops/raspberry.lua +++ b/farming/crops/raspberry.lua @@ -10,7 +10,7 @@ minetest.register_craftitem("farming:raspberries", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:raspberry_1") end, - on_use = minetest.item_eat(1), + on_use = minetest.item_eat(1) }) -- raspberry smoothie @@ -18,7 +18,7 @@ minetest.register_craftitem("farming:smoothie_raspberry", { description = S("Raspberry Smoothie"), inventory_image = "farming_raspberry_smoothie.png", on_use = minetest.item_eat(2, "vessels:drinking_glass"), - groups = {vessel = 1}, + groups = {vessel = 1, drink = 1} }) minetest.register_craft({ @@ -26,12 +26,12 @@ minetest.register_craft({ recipe = { {"default:snow"}, {"group:food_raspberries"}, - {"vessels:drinking_glass"}, + {"vessels:drinking_glass"} } }) -- raspberries definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_raspberry_1.png"}, paramtype = "light", @@ -48,27 +48,27 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:raspberry_1", table.copy(crop_def)) +minetest.register_node("farming:raspberry_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_raspberry_2.png"} -minetest.register_node("farming:raspberry_2", table.copy(crop_def)) +def.tiles = {"farming_raspberry_2.png"} +minetest.register_node("farming:raspberry_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_raspberry_3.png"} -minetest.register_node("farming:raspberry_3", table.copy(crop_def)) +def.tiles = {"farming_raspberry_3.png"} +minetest.register_node("farming:raspberry_3", table.copy(def)) -- stage 4 (final) -crop_def.tiles = {"farming_raspberry_4.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_raspberry_4.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:raspberries 2"}, rarity = 1}, {items = {"farming:raspberries"}, rarity = 2}, - {items = {"farming:raspberries"}, rarity = 3}, + {items = {"farming:raspberries"}, rarity = 3} } } -minetest.register_node("farming:raspberry_4", table.copy(crop_def)) +minetest.register_node("farming:raspberry_4", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:raspberries"] = { diff --git a/farming/crops/rhubarb.lua b/farming/crops/rhubarb.lua index dafb7e7b..bd44a713 100644 --- a/farming/crops/rhubarb.lua +++ b/farming/crops/rhubarb.lua @@ -9,14 +9,14 @@ minetest.register_craftitem("farming:rhubarb", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:rhubarb_1") end, - on_use = minetest.item_eat(1), + on_use = minetest.item_eat(1) }) -- rhubarb pie minetest.register_craftitem("farming:rhubarb_pie", { description = S("Rhubarb Pie"), inventory_image = "farming_rhubarb_pie.png", - on_use = minetest.item_eat(6), + on_use = minetest.item_eat(6) }) minetest.register_craft({ @@ -24,13 +24,13 @@ minetest.register_craft({ recipe = { {"farming:baking_tray", "group:food_sugar", ""}, {"group:food_rhubarb", "group:food_rhubarb", "group:food_rhubarb"}, - {"group:food_wheat", "group:food_wheat", "group:food_wheat"}, + {"group:food_wheat", "group:food_wheat", "group:food_wheat"} }, replacements = {{"group:food_baking_tray", "farming:baking_tray"}} }) -- rhubarb definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_rhubarb_1.png"}, paramtype = "light", @@ -43,27 +43,29 @@ local crop_def = { snappy = 3, flammable = 2, plant = 1, attached_node = 1, not_in_creative_inventory = 1, growing = 1 }, - sounds = default.node_sound_leaves_defaults() + sounds = default.node_sound_leaves_defaults(), + minlight = 10, + maxlight = 12, } -- stage 1 -minetest.register_node("farming:rhubarb_1", table.copy(crop_def)) +minetest.register_node("farming:rhubarb_1", table.copy(def)) -- stage2 -crop_def.tiles = {"farming_rhubarb_2.png"} -minetest.register_node("farming:rhubarb_2", table.copy(crop_def)) +def.tiles = {"farming_rhubarb_2.png"} +minetest.register_node("farming:rhubarb_2", table.copy(def)) -- stage 3 (final) -crop_def.tiles = {"farming_rhubarb_3.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_rhubarb_3.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:rhubarb 2"}, rarity = 1}, {items = {"farming:rhubarb"}, rarity = 2}, - {items = {"farming:rhubarb"}, rarity = 3}, + {items = {"farming:rhubarb"}, rarity = 3} } } -minetest.register_node("farming:rhubarb_3", table.copy(crop_def)) +minetest.register_node("farming:rhubarb_3", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:rhubarb"] = { diff --git a/farming/crops/ryeoatrice.lua b/farming/crops/ryeoatrice.lua index d362d09a..c565a65b 100644 --- a/farming/crops/ryeoatrice.lua +++ b/farming/crops/ryeoatrice.lua @@ -10,7 +10,7 @@ farming.register_plant("farming:rye", { paramtype2 = "meshoptions", inventory_image = "farming_rye_seed.png", steps = 8, - place_param2 = 3, + place_param2 = 3 }) minetest.override_item("farming:rye", { @@ -25,7 +25,7 @@ minetest.register_craft({ "farming:rye", "farming:rye", "farming:rye", "farming:rye", "farming:mortar_pestle" }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}}, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} }) -- Oats @@ -35,7 +35,7 @@ farming.register_plant("farming:oat", { paramtype2 = "meshoptions", inventory_image = "farming_oat_seed.png", steps = 8, - place_param2 = 3, + place_param2 = 3 }) minetest.override_item("farming:oat", { @@ -50,7 +50,7 @@ minetest.register_craft({ "farming:oat", "farming:oat", "farming:oat", "farming:oat", "farming:mortar_pestle" }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}}, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} }) -- Rice @@ -60,7 +60,7 @@ farming.register_plant("farming:rice", { paramtype2 = "meshoptions", inventory_image = "farming_rice_seed.png", steps = 8, - place_param2 = 3, + place_param2 = 3 }) minetest.override_item("farming:rice", { @@ -72,13 +72,13 @@ minetest.register_craftitem("farming:rice_bread", { description = S("Rice Bread"), inventory_image = "farming_rice_bread.png", on_use = minetest.item_eat(5), - groups = {food_rice_bread = 1, flammable = 2}, + groups = {food_rice_bread = 1, flammable = 2} }) minetest.register_craftitem("farming:rice_flour", { description = S("Rice Flour"), inventory_image = "farming_rice_flour.png", - groups = {food_rice_flour = 1, flammable = 1}, + groups = {food_rice_flour = 1, flammable = 1} }) minetest.register_craft({ @@ -88,7 +88,7 @@ minetest.register_craft({ "farming:rice", "farming:rice", "farming:rice", "farming:rice", "farming:mortar_pestle" }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}}, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} }) minetest.register_craft({ @@ -113,7 +113,7 @@ minetest.register_craft({ "farming:wheat", "farming:barley", "farming:oat", "farming:rye", "farming:mortar_pestle" }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}}, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} }) -- Multigrain bread @@ -122,7 +122,7 @@ minetest.register_craftitem("farming:bread_multigrain", { description = S("Multigrain Bread"), inventory_image = "farming_bread_multigrain.png", on_use = minetest.item_eat(7), - groups = {food_bread = 1, flammable = 2}, + groups = {food_bread = 1, flammable = 2} }) minetest.register_craft({ @@ -137,29 +137,29 @@ minetest.register_craft({ minetest.register_craft({ type = "fuel", recipe = "farming:rice_bread", - burntime = 1, + burntime = 1 }) minetest.register_craft({ type = "fuel", recipe = "farming:bread_multigrain", - burntime = 1, + burntime = 1 }) minetest.register_craft({ type = "fuel", recipe = "farming:rye", - burntime = 1, + burntime = 1 }) minetest.register_craft({ type = "fuel", recipe = "farming:oat", - burntime = 1, + burntime = 1 }) minetest.register_craft({ type = "fuel", recipe = "farming:rice", - burntime = 1, + burntime = 1 }) diff --git a/farming/crops/tomato.lua b/farming/crops/tomato.lua index c0823281..79058282 100644 --- a/farming/crops/tomato.lua +++ b/farming/crops/tomato.lua @@ -14,11 +14,11 @@ minetest.register_craftitem("farming:tomato", { on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:tomato_1") end, - on_use = minetest.item_eat(4), + on_use = minetest.item_eat(4) }) -- tomato definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_tomato_1.png"}, paramtype = "light", @@ -35,48 +35,49 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:tomato_1", table.copy(crop_def)) +minetest.register_node("farming:tomato_1", table.copy(def)) -- stage2 -crop_def.tiles = {"farming_tomato_2.png"} -minetest.register_node("farming:tomato_2", table.copy(crop_def)) +def.tiles = {"farming_tomato_2.png"} +minetest.register_node("farming:tomato_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_tomato_3.png"} -minetest.register_node("farming:tomato_3", table.copy(crop_def)) +def.tiles = {"farming_tomato_3.png"} +minetest.register_node("farming:tomato_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_tomato_4.png"} -minetest.register_node("farming:tomato_4", table.copy(crop_def)) +def.tiles = {"farming_tomato_4.png"} +minetest.register_node("farming:tomato_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_tomato_5.png"} -minetest.register_node("farming:tomato_5", table.copy(crop_def)) +def.tiles = {"farming_tomato_5.png"} +minetest.register_node("farming:tomato_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_tomato_6.png"} -minetest.register_node("farming:tomato_6", table.copy(crop_def)) +def.tiles = {"farming_tomato_6.png"} +minetest.register_node("farming:tomato_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_tomato_7.png"} -crop_def.drop = { +def.tiles = {"farming_tomato_7.png"} +def.drop = { items = { {items = {"farming:tomato"}, rarity = 1}, - {items = {"farming:tomato"}, rarity = 3}, + {items = {"farming:tomato"}, rarity = 3} } } -minetest.register_node("farming:tomato_7", table.copy(crop_def)) +minetest.register_node("farming:tomato_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_tomato_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_tomato_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:tomato 3"}, rarity = 1}, - {items = {"farming:tomato 3"}, rarity = 2}, + {items = {"farming:tomato 2"}, rarity = 2}, + {items = {"farming:tomato 1"}, rarity = 3} } } -minetest.register_node("farming:tomato_8", table.copy(crop_def)) +minetest.register_node("farming:tomato_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:tomato"] = { diff --git a/farming/crops/wheat.lua b/farming/crops/wheat.lua index b0475618..7a8f19b9 100644 --- a/farming/crops/wheat.lua +++ b/farming/crops/wheat.lua @@ -16,14 +16,14 @@ minetest.register_node("farming:seed_wheat", { selection_box = farming.select, on_place = function(itemstack, placer, pointed_thing) return farming.place_seed(itemstack, placer, pointed_thing, "farming:wheat_1") - end, + end }) -- harvested wheat minetest.register_craftitem("farming:wheat", { description = S("Wheat"), inventory_image = "farming_wheat.png", - groups = {food_wheat = 1, flammable = 4}, + groups = {food_wheat = 1, flammable = 4} }) -- straw @@ -32,7 +32,7 @@ minetest.register_node("farming:straw", { tiles = {"farming_straw.png"}, is_ground_content = false, groups = {snappy = 3, flammable = 4, fall_damage_add_percent = -30}, - sounds = default.node_sound_leaves_defaults(), + sounds = default.node_sound_leaves_defaults() }) minetest.register_craft({ @@ -40,14 +40,14 @@ minetest.register_craft({ recipe = { {"farming:wheat", "farming:wheat", "farming:wheat"}, {"farming:wheat", "farming:wheat", "farming:wheat"}, - {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"} } }) minetest.register_craft({ output = "farming:wheat 3", recipe = { - {"farming:straw"}, + {"farming:straw"} } }) @@ -76,7 +76,7 @@ end minetest.register_craftitem("farming:flour", { description = S("Flour"), inventory_image = "farming_flour.png", - groups = {food_flour = 1, flammable = 1}, + groups = {food_flour = 1, flammable = 1} }) minetest.register_craft({ @@ -86,7 +86,7 @@ minetest.register_craft({ "farming:wheat", "farming:wheat", "farming:wheat", "farming:wheat", "farming:mortar_pestle" }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}}, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} }) -- bread @@ -94,7 +94,7 @@ minetest.register_craftitem("farming:bread", { description = S("Bread"), inventory_image = "farming_bread.png", on_use = minetest.item_eat(5), - groups = {food_bread = 1, flammable = 2}, + groups = {food_bread = 1, flammable = 2} }) minetest.register_craft({ @@ -109,14 +109,14 @@ minetest.register_craftitem("farming:bread_slice", { description = S("Sliced Bread"), inventory_image = "farming_bread_slice.png", on_use = minetest.item_eat(1), - groups = {food_bread_slice = 1, flammable = 2}, + groups = {food_bread_slice = 1, flammable = 2} }) minetest.register_craft({ type = "shapeless", output = "farming:bread_slice 5", recipe = {"farming:bread", "group:food_cutting_board"}, - replacements = {{"group:food_cutting_board", "farming:cutting_board"}}, + replacements = {{"group:food_cutting_board", "farming:cutting_board"}} }) -- toast @@ -124,7 +124,7 @@ minetest.register_craftitem("farming:toast", { description = S("Toast"), inventory_image = "farming_toast.png", on_use = minetest.item_eat(1), - groups = {food_toast = 1, flammable = 2}, + groups = {food_toast = 1, flammable = 2} }) minetest.register_craft({ @@ -139,7 +139,7 @@ minetest.register_craftitem("farming:toast_sandwich", { description = S("Toast Sandwich"), inventory_image = "farming_toast_sandwich.png", on_use = minetest.item_eat(4), - groups = {flammable = 2}, + groups = {flammable = 2} }) minetest.register_craft({ @@ -147,12 +147,12 @@ minetest.register_craft({ recipe = { {"farming:bread_slice"}, {"farming:toast"}, - {"farming:bread_slice"}, + {"farming:bread_slice"} } }) -- wheat definition -local crop_def = { +local def = { drawtype = "plantlike", tiles = {"farming_wheat_1.png"}, paramtype = "light", @@ -171,64 +171,64 @@ local crop_def = { } -- stage 1 -minetest.register_node("farming:wheat_1", table.copy(crop_def)) +minetest.register_node("farming:wheat_1", table.copy(def)) -- stage 2 -crop_def.tiles = {"farming_wheat_2.png"} -minetest.register_node("farming:wheat_2", table.copy(crop_def)) +def.tiles = {"farming_wheat_2.png"} +minetest.register_node("farming:wheat_2", table.copy(def)) -- stage 3 -crop_def.tiles = {"farming_wheat_3.png"} -minetest.register_node("farming:wheat_3", table.copy(crop_def)) +def.tiles = {"farming_wheat_3.png"} +minetest.register_node("farming:wheat_3", table.copy(def)) -- stage 4 -crop_def.tiles = {"farming_wheat_4.png"} -minetest.register_node("farming:wheat_4", table.copy(crop_def)) +def.tiles = {"farming_wheat_4.png"} +minetest.register_node("farming:wheat_4", table.copy(def)) -- stage 5 -crop_def.tiles = {"farming_wheat_5.png"} -crop_def.drop = { +def.tiles = {"farming_wheat_5.png"} +def.drop = { items = { {items = {"farming:wheat"}, rarity = 2}, - {items = {"farming:seed_wheat"}, rarity = 2}, + {items = {"farming:seed_wheat"}, rarity = 2} } } -minetest.register_node("farming:wheat_5", table.copy(crop_def)) +minetest.register_node("farming:wheat_5", table.copy(def)) -- stage 6 -crop_def.tiles = {"farming_wheat_6.png"} -crop_def.drop = { +def.tiles = {"farming_wheat_6.png"} +def.drop = { items = { {items = {"farming:wheat"}, rarity = 2}, - {items = {"farming:seed_wheat"}, rarity = 1}, + {items = {"farming:seed_wheat"}, rarity = 1} } } -minetest.register_node("farming:wheat_6", table.copy(crop_def)) +minetest.register_node("farming:wheat_6", table.copy(def)) -- stage 7 -crop_def.tiles = {"farming_wheat_7.png"} -crop_def.drop = { +def.tiles = {"farming_wheat_7.png"} +def.drop = { items = { {items = {"farming:wheat"}, rarity = 1}, {items = {"farming:wheat"}, rarity = 3}, {items = {"farming:seed_wheat"}, rarity = 1}, - {items = {"farming:seed_wheat"}, rarity = 3}, + {items = {"farming:seed_wheat"}, rarity = 3} } } -minetest.register_node("farming:wheat_7", table.copy(crop_def)) +minetest.register_node("farming:wheat_7", table.copy(def)) -- stage 8 (final) -crop_def.tiles = {"farming_wheat_8.png"} -crop_def.groups.growing = 0 -crop_def.drop = { +def.tiles = {"farming_wheat_8.png"} +def.groups.growing = nil +def.drop = { items = { {items = {"farming:wheat"}, rarity = 1}, {items = {"farming:wheat"}, rarity = 3}, {items = {"farming:seed_wheat"}, rarity = 1}, - {items = {"farming:seed_wheat"}, rarity = 3}, + {items = {"farming:seed_wheat"}, rarity = 3} } } -minetest.register_node("farming:wheat_8", table.copy(crop_def)) +minetest.register_node("farming:wheat_8", table.copy(def)) -- add to registered_plants farming.registered_plants["farming:wheat"] = { @@ -243,11 +243,11 @@ farming.registered_plants["farming:wheat"] = { minetest.register_craft({ type = "fuel", recipe = "farming:straw", - burntime = 3, + burntime = 3 }) minetest.register_craft({ type = "fuel", recipe = "farming:wheat", - burntime = 1, + burntime = 1 }) diff --git a/farming/farming.conf_example b/farming/farming.conf_example index a1998f69..68a7bcbf 100644 --- a/farming/farming.conf_example +++ b/farming/farming.conf_example @@ -30,6 +30,7 @@ farming.pineapple = 0.001 farming.peas = 0.001 farming.beetroot = 0.001 farming.mint = 0.005 +farming.cabbage = 0.001 farming.grains = true -- true or false only -- default rarety of crops on map (higher number = more crops) diff --git a/farming/food.lua b/farming/food.lua index 33106f08..d15a8db9 100644 --- a/farming/food.lua +++ b/farming/food.lua @@ -6,14 +6,14 @@ local S = farming.intllib minetest.register_craftitem("farming:sugar", { description = S("Sugar"), inventory_image = "farming_sugar.png", - groups = {food_sugar = 1, flammable = 3}, + groups = {food_sugar = 1, flammable = 3} }) minetest.register_craft({ type = "cooking", cooktime = 3, output = "farming:sugar 2", - recipe = "default:papyrus", + recipe = "default:papyrus" }) @@ -33,7 +33,7 @@ minetest.register_node("farming:salt", { selection_box = { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, + } }) minetest.register_craft({ @@ -60,7 +60,7 @@ minetest.register_node("farming:rose_water", { selection_box = { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} - }, + } }) minetest.register_craft({ @@ -68,11 +68,11 @@ minetest.register_craft({ recipe = { {"flowers:rose", "flowers:rose", "flowers:rose"}, {"flowers:rose", "flowers:rose", "flowers:rose"}, - {"bucket:bucket_water", "group:food_pot", "vessels:glass_bottle"}, + {"bucket:bucket_water", "group:food_pot", "vessels:glass_bottle"} }, replacements = { {"bucket:bucket_water", "bucket:bucket_empty"}, - {"group:food_pot", "farming:pot"}, + {"group:food_pot", "farming:pot"} } }) @@ -82,7 +82,7 @@ minetest.register_craftitem("farming:turkish_delight", { description = S("Turkish Delight"), inventory_image = "farming_turkish_delight.png", groups = {flammable = 3}, - on_use = minetest.item_eat(2), + on_use = minetest.item_eat(2) }) minetest.register_craft({ @@ -90,12 +90,12 @@ minetest.register_craft({ recipe = { {"group:food_gelatin", "group:food_sugar", "group:food_gelatin"}, {"group:food_sugar", "group:food_rose_water", "group:food_sugar"}, - {"group:food_cornstarch", "group:food_sugar", "dye:pink"}, + {"group:food_cornstarch", "group:food_sugar", "dye:pink"} }, replacements = { {"group:food_cornstarch", "farming:bowl"}, - {"group:food_rose_water", "vessels:glass_bottle"}, - }, + {"group:food_rose_water", "vessels:glass_bottle"} + } }) --= Garlic Bread @@ -104,13 +104,13 @@ minetest.register_craftitem("farming:garlic_bread", { description = S("Garlic Bread"), inventory_image = "farming_garlic_bread.png", groups = {flammable = 3}, - on_use = minetest.item_eat(2), + on_use = minetest.item_eat(2) }) minetest.register_craft({ type = "shapeless", output = "farming:garlic_bread", - recipe = {"group:food_toast", "group:food_garlic_clove", "group:food_garlic_clove"}, + recipe = {"group:food_toast", "group:food_garlic_clove", "group:food_garlic_clove"} }) --= Donuts (thanks to Bockwurst for making the donut images) @@ -118,7 +118,7 @@ minetest.register_craft({ minetest.register_craftitem("farming:donut", { description = S("Donut"), inventory_image = "farming_donut.png", - on_use = minetest.item_eat(4), + on_use = minetest.item_eat(4) }) minetest.register_craft({ @@ -126,35 +126,35 @@ minetest.register_craft({ recipe = { {"", "group:food_wheat", ""}, {"group:food_wheat", "group:food_sugar", "group:food_wheat"}, - {"", "group:food_wheat", ""}, + {"", "group:food_wheat", ""} } }) minetest.register_craftitem("farming:donut_chocolate", { description = S("Chocolate Donut"), inventory_image = "farming_donut_chocolate.png", - on_use = minetest.item_eat(6), + on_use = minetest.item_eat(6) }) minetest.register_craft({ output = "farming:donut_chocolate", recipe = { {"group:food_cocoa"}, - {"farming:donut"}, + {"farming:donut"} } }) minetest.register_craftitem("farming:donut_apple", { description = S("Apple Donut"), inventory_image = "farming_donut_apple.png", - on_use = minetest.item_eat(6), + on_use = minetest.item_eat(6) }) minetest.register_craft({ output = "farming:donut_apple", recipe = { {"default:apple"}, - {"farming:donut"}, + {"farming:donut"} } }) @@ -163,7 +163,7 @@ minetest.register_craft({ minetest.register_craftitem("farming:porridge", { description = S("Porridge"), inventory_image = "farming_porridge.png", - on_use = minetest.item_eat(6, "farming:bowl"), + on_use = minetest.item_eat(6, "farming:bowl") }) minetest.after(0, function() @@ -202,7 +202,7 @@ end) minetest.register_craftitem("farming:jaffa_cake", { description = S("Jaffa Cake"), inventory_image = "farming_jaffa_cake.png", - on_use = minetest.item_eat(6), + on_use = minetest.item_eat(6) }) minetest.register_craft({ @@ -218,3 +218,135 @@ minetest.register_craft({ {"mobs:bucket_milk", "bucket:bucket_empty"} } }) + +-- Apple Pie + +minetest.register_craftitem("farming:apple_pie", { + description = S("Apple Pie"), + inventory_image = "farming_apple_pie.png", + on_use = minetest.item_eat(6) +}) + +minetest.register_craft({ + output = "farming:apple_pie", + type = "shapeless", + recipe = { + "group:food_flour", "group:food_sugar", + "group:food_apple", "group:food_baking_tray" + }, + replacements = {{"group:food_baking_tray", "farming:baking_tray"}} +}) + +-- Cactus Juice + +minetest.register_craftitem("farming:cactus_juice", { + description = S("Cactus Juice"), + inventory_image = "farming_cactus_juice.png", + groups = {vessel = 1, drink = 1}, + on_use = function(itemstack, user, pointed_thing) + if user then + if math.random(5) == 1 then + return minetest.do_item_eat(-1, "vessels:drinking_glass", + itemstack, user, pointed_thing) + else + return minetest.do_item_eat(2, "vessels:drinking_glass", + itemstack, user, pointed_thing) + end + end + end +}) + +minetest.register_craft({ + output = "farming:cactus_juice 2", + type = "shapeless", + recipe = { + "vessels:drinking_glass", "vessels:drinking_glass", + "default:cactus", "farming:juicer" + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- Pasta + +minetest.register_craftitem("farming:pasta", { + description = S("Pasta"), + inventory_image = "farming_pasta.png", + groups = {food_pasta = 1} +}) + +if minetest.get_modpath("mobs_animal") or minetest.get_modpath("xanadu")then +minetest.register_craft({ + output = "farming:pasta", + type = "shapeless", + recipe = { + "group:food_flour", "group:food_mixing_bowl", + "group:food_butter" + }, + replacements = {{"group:food_mixing_bowl", "farming:mixing_bowl"}} +}) +else +minetest.register_craft({ + output = "farming:pasta", + type = "shapeless", + recipe = { + "group:food_flour", "group:food_mixing_bowl", + "group:food_oil" + }, + replacements = { + {"group:food_mixing_bowl", "farming:mixing_bowl"}, + {"group:food_oil", "vessels:glass_bottle"} + } +}) +end + +-- Spaghetti + +minetest.register_craftitem("farming:spaghetti", { + description = S("Spaghetti"), + inventory_image = "farming_spaghetti.png", + on_use = minetest.item_eat(8) +}) + +minetest.register_craft({ + output = "farming:spaghetti", + type = "shapeless", + recipe = { + "group:food_pasta", "group:food_saucepan", + "group:food_tomato", "group:food_garlic_clove", "group:food_garlic_clove" + }, + replacements = {{"group:food_saucepan", "farming:saucepan"}} +}) + +-- Korean Bibimbap + +minetest.register_craftitem("farming:bibimbap", { + description = S("Bibimbap"), + inventory_image = "farming_bibimbap.png", + on_use = minetest.item_eat(8, "farming:bowl") +}) + +if minetest.get_modpath("mobs_animal") or minetest.get_modpath("xanadu")then +minetest.register_craft({ + output = "farming:bibimbap", + type = "shapeless", + recipe = { + "group:food_skillet", "group:food_bowl", "group:food_egg", "group:food_rice", + "group:food_chicken_raw", "group:food_cabbage", "group:food_carrot", + "group:food_chili_pepper" + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) +else +minetest.register_craft({ + output = "farming:bibimbap", + type = "shapeless", + recipe = { + "group:food_skillet", "group:food_bowl", "group:food_mushroom", + "group:food_rice", "group:food_cabbage", "group:food_carrot", + "group:food_mushroom", "group:food_chili_pepper" + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) +end diff --git a/farming/grass.lua b/farming/grass.lua index 6a9e94f0..86e7ac5b 100644 --- a/farming/grass.lua +++ b/farming/grass.lua @@ -1,7 +1,7 @@ for i = 4, 5 do - -- Override default grass and have it drop Wheat Seeds + -- Override default grass and have it drop Wheat and Oat Seeds minetest.override_item("default:grass_" .. i, { drop = { @@ -9,12 +9,12 @@ for i = 4, 5 do items = { {items = {"farming:seed_wheat"}, rarity = 5}, {items = {"farming:seed_oat"},rarity = 5}, - {items = {"default:grass_1"}}, + {items = {"default:grass_1"}} } - }, + } }) - -- Override default dry grass and have it drop Barley Seeds + -- Override default dry grass and have it drop Barley and Rye Seeds if minetest.registered_nodes["default:dry_grass_1"] then @@ -24,15 +24,15 @@ for i = 4, 5 do items = { {items = {"farming:seed_barley"}, rarity = 5}, {items = {"farming:seed_rye"},rarity = 5}, - {items = {"default:dry_grass_1"}}, + {items = {"default:dry_grass_1"}} } - }, + } }) end end --- Override default Jungle Grass and have it drop Cotton Seeds +-- Override default Jungle Grass and have it drop Cotton and Rice Seeds minetest.override_item("default:junglegrass", { drop = { @@ -40,7 +40,7 @@ minetest.override_item("default:junglegrass", { items = { {items = {"farming:seed_cotton"}, rarity = 8}, {items = {"farming:seed_rice"},rarity = 8}, - {items = {"default:junglegrass"}}, + {items = {"default:junglegrass"}} } - }, + } }) diff --git a/farming/hoes.lua b/farming/hoes.lua index f9af464e..21d435b2 100644 --- a/farming/hoes.lua +++ b/farming/hoes.lua @@ -36,7 +36,7 @@ farming.register_hoe = function(name, def) return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses) end, groups = def.groups, - sound = {breaks = "default_tool_breaks"}, + sound = {breaks = "default_tool_breaks"} }) -- Register its recipe @@ -149,7 +149,7 @@ farming.register_hoe(":farming:hoe_wood", { minetest.register_craft({ type = "fuel", recipe = "farming:hoe_wood", - burntime = 5, + burntime = 5 }) farming.register_hoe(":farming:hoe_stone", { @@ -170,7 +170,7 @@ farming.register_hoe(":farming:hoe_bronze", { description = S("Bronze Hoe"), inventory_image = "farming_tool_bronzehoe.png", max_uses = 500, - groups = {not_in_creative_inventory = 1}, + groups = {not_in_creative_inventory = 1} }) farming.register_hoe(":farming:hoe_mese", { @@ -184,7 +184,7 @@ farming.register_hoe(":farming:hoe_diamond", { description = S("Diamond Hoe"), inventory_image = "farming_tool_diamondhoe.png", max_uses = 500, - groups = {not_in_creative_inventory = 1}, + groups = {not_in_creative_inventory = 1} }) -- Toolranks support @@ -256,7 +256,7 @@ minetest.register_entity("farming:hoebomb_entity", { visual = "sprite", visual_size = {x = 1.0, y = 1.0}, textures = {"farming_hoe_bomb.png"}, - collisionbox = {0,0,0,0,0,0}, + collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1}, lastpos = {}, player = "", @@ -437,7 +437,7 @@ minetest.register_tool("farming:scythe_mithril", { obj:set_velocity({ x = math.random(-10, 10) / 9, y = 3, - z = math.random(-10, 10) / 9, + z = math.random(-10, 10) / 9 }) end end @@ -486,25 +486,29 @@ if minetest.get_modpath("moreores") then description = S("%s Hoe"):format(S("Silver")), inventory_image = "moreores_tool_silverhoe.png", max_uses = 300, - material = "moreores:silver_ingot", + material = "moreores:silver_ingot" }) farming.register_hoe(":moreores:hoe_mithril", { description = S("%s Hoe"):format(S("Mithril")), inventory_image = "moreores_tool_mithrilhoe.png", max_uses = 1000, - material = "moreores:mithril_ingot", + material = "moreores:mithril_ingot" }) -- Toolranks support if tr then + local desc = S("%s Hoe"):format(S("Silver")) + minetest.override_item("moreores:hoe_silver", { - original_description = S("%s Hoe"):format(S("Silver")), - description = toolranks.create_description("Silver Hoe")}) + original_description = desc, + description = toolranks.create_description(desc)}) + + desc = S("%s Hoe"):format(S("Mithril")) minetest.override_item("moreores:hoe_mithril", { - original_description = S("%s Hoe"):format(S("Mithril")), - description = toolranks.create_description("Mithril Hoe")}) + original_description = desc, + description = toolranks.create_description(desc)}) end end diff --git a/farming/init.lua b/farming/init.lua index 1ab7abdf..68d134cc 100644 --- a/farming/init.lua +++ b/farming/init.lua @@ -7,7 +7,7 @@ farming = { mod = "redo", - version = "20200527", + version = "20200702", path = minetest.get_modpath("farming"), select = { type = "fixed", @@ -80,7 +80,7 @@ end -- Growth Logic local STAGE_LENGTH_AVG = tonumber( - minetest.settings:get("farming_stage_length")) or 160 + minetest.settings:get("farming_stage_length")) or 200 -- 160 local STAGE_LENGTH_DEV = STAGE_LENGTH_AVG / 6 @@ -315,7 +315,7 @@ function farming.plant_growth_timer(pos, elapsed, node_name) -- otherwise check for wet soil beneath crop else - local under = minetest.get_node({ x = pos.x, y = pos.y - 1, z = pos.z }) + local under = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}) if minetest.get_item_group(under.name, "soil") < 3 then return true @@ -582,7 +582,7 @@ farming.register_plant = function(name, def) sounds = default.node_sound_leaves_defaults(), minlight = def.minlight, maxlight = def.maxlight, - next_plant = next_plant, + next_plant = next_plant }) end @@ -625,6 +625,7 @@ farming.pineapple = 0.001 farming.peas = 0.001 farming.beetroot = 0.001 farming.mint = 0.005 +farming.cabbage = 0.001 farming.grains = true farming.rarety = 0.002 @@ -690,8 +691,9 @@ ddoo("beetroot.lua", farming.beetroot) ddoo("chili.lua", farming.chili) ddoo("ryeoatrice.lua", farming.grains) ddoo("mint.lua", farming.mint) +ddoo("cabbage.lua", farming.cabbage) -dofile(farming.path.."/food.lua") -dofile(farming.path.."/mapgen.lua") -dofile(farming.path.."/compatibility.lua") -- Farming Plus compatibility -dofile(farming.path.."/lucky_block.lua") +dofile(farming.path .. "/food.lua") +dofile(farming.path .. "/mapgen.lua") +dofile(farming.path .. "/compatibility.lua") -- Farming Plus compatibility +dofile(farming.path .. "/lucky_block.lua") diff --git a/farming/locale/it.txt b/farming/locale/it.txt new file mode 100644 index 00000000..cbb6a2de --- /dev/null +++ b/farming/locale/it.txt @@ -0,0 +1,194 @@ +# Translation of the farming mod by TenPlus1 +# textdomain: farming +# author: (Hamlet) +# last update: 2020/Jun/02 + +###### folder . ###### + +### init.lua ### +Seed=Seme + +### compatibility.lua ### +Banana=Banana +Banana Leaves=Foglie di banano +Orange=Arancia +Strawberry=Fragola + +### food.lua ### +Sugar=Zucchero +Salt=Sale +Rose Water=Acqua di rose +Turkish Delight=Lokum +Garlic Bread=Pane all'aglio +Donut=Ciambella +Chocolate Donut=Ciambella al cioccolato +Apple Donut=Ciambella alla mela +Porridge=Porridge +Jaffa Cake=Torta di jaffa + +### hoes.lua ### +Hoe=Zappa +Wooden Hoe=Zappa di legno +Stone Hoe=Zappa di pietra +Steel Hoe=Zappa d'acciaio +Bronze Hoe=Zappa di bronzo +Mese Hoe=Zappa di mese +Diamond Hoe=Zappa di diamante +# Surcharge du mod [Toolranks] à faire # +Hoe Bomb (use or throw on grassy areas to hoe land)=Bomba zappa (usala o lanciala sulle aree erbose per zappare il terreno) +Mithril Scythe (Right-click to harvest and replant crops)=Falce di mithril (clicca col destro per raccogliere e ripiantare le prose) +# Surcharge du mod [Toolranks] à faire # + +### soil.lua ### +Soil=Terreno coltivabile +Wet Soil=Terreno coltivabile bagnato + +### utensils.lua ### +Wooden Bowl=Ciotola di legno +Saucepan=Casseruola +Cooking Pot=Pentola da cottura +Baking Tray=Teglia da forno +Skillet=Padella +Mortar and Pestle=Mortaio e pestello +Cutting Board=Tagliere +Juicer=Spremiagrumi +Glass Mixing Bowl=Terrina di vetro + + +###### folder ./crops ###### + +### barley.lua ### +Barley Seed=Seme d'orzo +Barley=Orzo + +### beans.lua ### +Green Beans=Fagiolini +Bean Pole (place on soil before planting beans)=Palina per fagiolini (mettila sul terreno coltivabile prima di piantare i fagiolini) + +### beetroot.lua ### +Beetroot=Barbabietola +Beetroot Soup=Zuppa di barbabietola + +### blueberry.lua ### +Blueberries=Mirtilli +Blueberry Muffin=Focaccina di mirtilli +Blueberry Pie=Tortino di mirtilli + +### carrot.lua ## +Carrot=Carota +Carrot Juice=Succo di carota +Golden Carrot=Carota d'oro + +### chili.lua ### +Chili Pepper=Peperoncino +Bowl of Chili=Ciotola di peperoncino + +### cocoa.lua ### +Cocoa Beans=Chicchi di cacao +Cookie=Biscotto +Bar of Dark Chocolate=Barra di cioccolato fondente +Chocolate Block=Blocco di cioccolato + +### coffee.lua ### +Coffee Beans=Chicchi di caffè +Cup of Coffee=Tazza di caffè + +### corn.lua ### +Corn=Mais +Corn on the Cob=Pannocchia arrostita +Cornstarch=Amido di mais +Bottle of Ethanol=Bottiglia di alcol etilico + +### cotton.lua ### +Cotton Seed=Seme di cotone +Cotton=Cotone +String=Filo + +### cucumber.lua ### +Cucumber=Cetriolo + +### garlic.lua ### +Garlic clove=Spicchio d'aglio +Garlic=Aglio +Garlic Braid=Treccia d'aglio + +### grapes.lua ### +Grapes=Chicchi d'uva +Trellis (place on soil before planting grapes)=Graticcio (mettilo sul terreno coltivabile prima di piantare i chicchi d'uva) + +### hemp.lua ### +Hemp Seed=Seme di canapa +Hemp Leaf=Foglia di canapa +Bottle of Hemp Oil=Bottiglia d'olio di canapa +Hemp Fibre=Fibra di canapa +Hemp Block=Blocco di canapa +Hemp Rope=Corda di canapa + +### melon.lua ### +Melon Slice=Fetta d'anguria +Melon=Anguria + +### onion.lua ### +Onion=Cipolla + +### peas.lua ### +Pea Pod=Baccello di piselli +Peas=Piselli +Pea Soup=Zuppa di piselli + +### pepper.lua ### +Peppercorn=Grano di pepe +Pepper=Pepe +Ground Pepper=Pepe macinato + +### pinapple.lua ### +Pineapple Top=Cima d'ananas +Pineapple=Ananas +Pineapple Ring=Anello d'ananas +Pineapple Juice=Succo d'ananas + +### potato.lua ### +Potato=Patata +Baked Potato=Patata arrostita +Cucumber and Potato Salad=Insalata di patate e cetrioli + +### pumpkin.lua ### +Pumpkin Slice=Fetta di zucca +Jack 'O Lantern (punch to turn on and off)=Jack Lanterna (colpirlo per accenderlo e spegnerlo) +Scarecrow Bottom=Fondo dello spaventapasseri +Pumpkin Bread=Pane alla zucca +Pumpkin Dough=Pasta di zucca +Pumpkin=Zucca + +### raspberry.lua ### +Raspberries=Lamponi +Raspberry Smoothie=Purea di lamponi + +### rhubarb.lua ### +Rhubarb=Rabarbaro +Rhubarb Pie=Tortino al rabarbaro + +### ryeoatrice.lua ### +Rye=Segale +Rye seed=Seme di segale +Oat=Avena +Oat seed=Seme d'avena +Rice=Riso +Rice grains=Chicchi di riso +Rice Bread=Pane di riso +Rice Flour=Farina di riso +Multigrain Flour=Farina multicereale +Multigrain Bread=Pane multicereale + +### tomato.lua ### +Tomato=Pomodoro + +### wheat.lua ### +Wheat Seed=Seme di grano +Wheat=Grano +Straw=Paglia +Flour=Farina +Bread=Pane +Sliced Bread=Pane a fette +Toast=Pane tostato +Toast Sandwich=Panino di pane tostato diff --git a/farming/locale/ru.txt b/farming/locale/ru.txt index 8235b3fd..8a181f54 100644 --- a/farming/locale/ru.txt +++ b/farming/locale/ru.txt @@ -2,194 +2,211 @@ # textdomain: farming # author: codexp # author: TheDarkTiger -# last update: 2020/Apr/26 +# author: YELLOW +# last update: 2020/Jun/20 ###### folder . ###### ### init.lua ### -Seed=семена +Seed=Семена ### compatibility.lua ### -Banana= -Banana Leaves= -Orange= -Strawberry= +Banana=Банан +Banana Leaves=Листья банана +Orange=Апельсин +Strawberry=Земляника ### food.lua ### -Sugar=сахар -Salt= -Rose Water= -Turkish Delight= -Garlic Bread= -Donut=пончик -Chocolate Donut=шоколадный пончик -Apple Donut=яблочный пончик -Porridge= -Jaffa Cake= +Sugar=Сахар +Salt=Соль +Rose Water=Розовая вода +Turkish Delight=Рахат-лукум +Garlic Bread=Чесночный хлеб +Donut=Пончик +Chocolate Donut=Шоколадный пончик +Apple Donut=Яблочный пончик +Porridge=Каша +Jaffa Cake=Яффский пирог +Apple Pie=Яблочный пирог +Cactus Juice=Кактусовый сок ### hoes.lua ### -Hoe=мотыга -Wooden Hoe=деревянная мотыга -Stone Hoe=каменная мотыга -Steel Hoe=стальная мотыга -Bronze Hoe=бронзовая мотыга -Mese Hoe=магическая мотыга -Diamond Hoe=алмазная мотыга +Hoe=Мотыга +Wooden Hoe=Деревянная мотыга +Stone Hoe=Каменная мотыга +Steel Hoe=Стальная мотыга +Bronze Hoe=Бронзовая мотыга +Mese Hoe=Магическая мотыга +Diamond Hoe=Алмазная мотыга # Surcharge du mod [Toolranks] à faire # -Hoe Bomb (use or throw on grassy areas to hoe land)= -Mithril Scythe (Right-click to harvest and replant crops)= +Hoe Bomb (use or throw on grassy areas to hoe land)=Мотыгобомба (используйте или бросьте на траву для ее обработки) +Mithril Scythe (Right-click to harvest and replant crops)=Мифриловая коса (Щелкните правой кнопкой мыши для сбора и пересадки растений) # Surcharge du mod [Toolranks] à faire # +%s Hoe=%s мотыга +Silver=Серебряная +Mithril=Мифриловая +Silver Hoe=Серебряная +Mithril Hoe=Мифриловая ### soil.lua ### -Soil=земля -Wet Soil=мокрая земля +Soil=Земля +Wet Soil=Увлажненная земля +Savanna Soil=Земля саванны +Wet Savanna Soil=Увлажненная земля саванны ### utensils.lua ### -Wooden Bowl= -Saucepan= -Cooking Pot= -Baking Tray= -Skillet= -Mortar and Pestle= -Cutting Board= -Juicer= -Glass Mixing Bowl= +Wooden Bowl=Деревянная миска +Saucepan=Кастрюля +Cooking Pot=Котел +Baking Tray=Противень +Skillet=Сковорода +Mortar and Pestle=Ступка и пестик +Cutting Board=Разделочная доска +Juicer=Соковыжималка +Glass Mixing Bowl=Стеклянная чаша ###### folder ./crops ###### ### barley.lua ### -Barley Seed=семена ячменя -Barley=ячмень +Barley Seed=Семена ячменя +Barley=Ячмень ### beans.lua ### -Green Beans=зеленая фасоль -Bean Pole (place on soil before planting beans)=жердь для бобовых (установите на почву перед посадкой бобовых) +Green Beans=Зеленая фасоль +Bean Pole (place on soil before planting beans)=Жердь для бобовых (установите на почву перед посадкой бобовых) ### beetroot.lua ### -Beetroot= -Beetroot Soup= +Beetroot=Свекла +Beetroot Soup=Борщ ### blueberry.lua ### -Blueberries=голубика -Blueberry Muffin=кекс из голубики -Blueberry Pie= +Blueberries=Голубика +Blueberry Muffin=Кекс с голубикой +Blueberry Pie=Пирог с голубикой ### carrot.lua ## -Carrot=морковь -Carrot Juice= -Golden Carrot=золотая морковь +Carrot=Морковь +Carrot Juice=Морковный сок +Golden Carrot=Золотая морковь ### chili.lua ### -Chili Pepper= -Bowl of Chili= +Chili Pepper=Перец чили +Bowl of Chili=Миска чили ### cocoa.lua ### -Cocoa Beans=бобы какао -Cookie=печенье -Bar of Dark Chocolate=плитка темного шоколада -Chocolate Block= +Cocoa Beans=Какао-бобы +Cookie=Печенье +Bar of Dark Chocolate=Плитка темного шоколада +Chocolate Block=Шоколадный блок ### coffee.lua ### -Coffee Beans=кофе в зернах -Cup of Coffee=чашка кофе +Coffee Beans=Кофейные зерна +Cup of Coffee=Чашка кофе ### corn.lua ### -Corn=кукуруза -Corn on the Cob=початок кукурузы -Cornstarch= -Bottle of Ethanol=бутылка этилового спирта +Corn=Кукуруза +Corn on the Cob=Початок кукурузы +Cornstarch=Кукурузный крахмал +Bottle of Ethanol=Бутылка спирта ### cotton.lua ### -Cotton Seed=семена хлопка -Cotton=хлопок -String= +Wild Cotton=Дикорастущий хлопок +Cotton Seed=Семена хлопка +Cotton=Хлопок +String=Нить ### cucumber.lua ### -Cucumber=огурец +Cucumber=Огурец ### garlic.lua ### -Garlic clove= -Garlic= -Garlic Braid= +Garlic clove=Зубчик чеснока +Garlic=Чеснок +Garlic Braid=Связка чеснока ### grapes.lua ### -Grapes=виноград -Trellis (place on soil before planting grapes)=решетка (поставьте на почву для посадки винограда) +Grapes=Виноград +Trellis (place on soil before planting grapes)=Решетка (поставьте на почву перед посадкой винограда) ### hemp.lua ### -Hemp Seed=семена конопли -Hemp Leaf=листья конопли -Bottle of Hemp Oil=бутылка конопляного масла -Hemp Fibre= -Hemp Block= -Hemp Rope=Пенька +Hemp Seed=Семена конопли +Hemp Leaf=Лист конопли +Bottle of Hemp Oil=Бутылка конопляного масла +Hemp Fibre=Конопляное волокно +Hemp Block=Блок конопли +Hemp Rope=Пеньковая веревка ### melon.lua ### -Melon Slice=ломтик арбуза -Melon=арбуз +Melon Slice=Долька арбуза +Melon=Арбуз + +### mint.lua ### +Mint Seeds=Семена мяты +Mint Leaf=Лист мяты +Mint Tea=Чай с мятой ### onion.lua ### -Onion= +Onion=Лук +Onion Soup=Луковый суп ### peas.lua ### -Pea Pod= -Peas= -Pea Soup= +Pea Pod=Стручок гороха +Peas=Горох +Pea Soup=Гороховый суп ### pepper.lua ### -Peppercorn= -Pepper= -Ground Pepper= +Peppercorn=Перчинка +Pepper=Перец +Ground Pepper=Молотый перец ### pinapple.lua ### -Pineapple Top= -Pineapple= -Pineapple Ring= -Pineapple Juice= +Pineapple Top=Верхушка ананаса +Pineapple=Ананас +Pineapple Ring=Кольцо ананаса +Pineapple Juice=Ананасовый сок ### potato.lua ### -Potato=картофель -Baked Potato=запеченный картофель -Cucumber and Potato Salad= +Potato=Картофель +Baked Potato=Печеный картофель +Cucumber and Potato Salad=Салат из огурцов и картофеля ### pumpkin.lua ### -Pumpkin Slice=ломтик тыквы -Jack 'O Lantern (punch to turn on and off)=светильник джека (удар для включения и отключения) -Scarecrow Bottom= -Pumpkin Bread=тыквенный хлеб -Pumpkin Dough=тыквенное тесто -Pumpkin=тыква +Pumpkin Slice=Ломтик тыквы +Jack 'O Lantern (punch to turn on and off)=Светильник джека (удар для включения и выключения) +Scarecrow Bottom=Основание пугала +Pumpkin Bread=Тыквенный хлеб +Pumpkin Dough=Тыквенное тесто +Pumpkin=Тыква ### raspberry.lua ### -Raspberries=малина -Raspberry Smoothie=малиновый коктейль +Raspberries=Малина +Raspberry Smoothie=Малиновый смузи ### rhubarb.lua ### -Rhubarb=ревень -Rhubarb Pie=пирог из ревеня +Rhubarb=Ревень +Rhubarb Pie=Пирог с ревенем ### ryeoatrice.lua ### -Rye= -Rye seed= -Oat= -Oat seed= -Rice= -Rice grains= -Rice Bread= -Rice Flour= -Multigrain Flour= -Multigrain Bread= +Rye=Рожь +Rye seed=Зёрна ржи +Oat=Овес +Oat seed=Семена овса +Rice grains=Зёрна риса +Rice=Рис +Rice Bread=Рисовый хлеб +Rice Flour=Рисовая мука +Multigrain Flour=Мультизерновая мука +Multigrain Bread=Мультизерновой хлеб ### tomato.lua ### -Tomato=помидор +Tomato=Помидор ### wheat.lua ### -Wheat Seed= -Wheat=семена пшеницы -Straw=солома -Flour=мука -Bread=хлеб -Sliced Bread= -Toast= -Toast Sandwich= +Wheat Seed=Зёрна пшеницы +Wheat=Пшеница +Straw=Солома +Flour=Мука +Bread=Хлеб +Sliced Bread=Нарезанный хлеб +Toast=Тост +Toast Sandwich=Сэндвич diff --git a/farming/mapgen.lua b/farming/mapgen.lua index 6ebbff5e..ca7048df 100644 --- a/farming/mapgen.lua +++ b/farming/mapgen.lua @@ -26,7 +26,7 @@ local function register_plant(name, min, max, spawnon, spawnby, num, rarety) y_max = max, decoration = "farming:" .. name, spawn_by = spawnby, - num_spawn_by = num, + num_spawn_by = num }) end @@ -47,8 +47,9 @@ register_plant("onion_5", 5, 22, nil, "", -1, farming.onion) register_plant("garlic_5", 3, 30, nil, "group:tree", 1, farming.garlic) register_plant("pea_5", 25, 50, nil, "", -1, farming.peas) register_plant("beetroot_5", 1, 15, nil, "", -1, farming.beetroot) -register_plant("mint_4", 1, 75, {"default:dirt_with_grass", +register_plant("mint_4", 1, 75, {"default:dirt_with_grass", "default:dirt_with_coniferous_litter"}, "group:water", 1, farming.mint) +register_plant("cabbage_6", 2, 10, nil, "", -1, farming.cabbage) if minetest.get_mapgen_setting("mg_name") == "v6" then @@ -83,7 +84,7 @@ minetest.register_decoration({ y_max = 45, decoration = "farming:hemp_7", spawn_by = "group:tree", - num_spawn_by = 1, + num_spawn_by = 1 }) end @@ -104,7 +105,7 @@ minetest.register_decoration({ y_max = 35, decoration = {"farming:chili_8"}, spawn_by = "group:tree", - num_spawn_by = 1, + num_spawn_by = 1 }) end @@ -125,7 +126,7 @@ minetest.register_decoration({ y_max = 35, decoration = {"farming:pepper_5"}, spawn_by = "group:tree", - num_spawn_by = 1, + num_spawn_by = 1 }) end @@ -144,6 +145,25 @@ minetest.register_decoration({ }, y_min = 18, y_max = 30, - decoration = {"farming:pineapple_8"}, + decoration = {"farming:pineapple_8"} }) end + +minetest.register_decoration({ + name = "farming:cotton_wild", + deco_type = "simple", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 50, y = 50, z = 50}, + seed = 4242, + octaves = 3, + persist = 0.7 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + decoration = "farming:cotton_wild" +}) diff --git a/farming/soil.lua b/farming/soil.lua index 4ecab299..ab8be15b 100644 --- a/farming/soil.lua +++ b/farming/soil.lua @@ -172,5 +172,5 @@ minetest.register_abm({ and minetest.get_item_group(nn, "plant") == 0 then minetest.set_node(pos, {name = ndef.soil.base}) end - end, + end }) diff --git a/farming/statistics.lua b/farming/statistics.lua index c8defa2f..b8928671 100644 --- a/farming/statistics.lua +++ b/farming/statistics.lua @@ -12,6 +12,7 @@ local B = 4.0 / math.pi local C = 2.0/(math.pi * A) local D = 1.0 / A + erf = function(x) if x == 0 then return 0; end @@ -23,6 +24,7 @@ erf = function(x) return (x > 0 and v) or -v end + erf_inv = function(x) if x == 0 then return 0; end @@ -36,13 +38,16 @@ erf_inv = function(x) return (x > 0 and v) or -v end + local function std_normal(u) return ROOT_2 * erf_inv(2.0 * u - 1.0) end + local poisson local cdf_table = {} + local function generate_cdf(lambda_index, lambda) local max = math.ceil(4 * lambda) @@ -59,10 +64,12 @@ local function generate_cdf(lambda_index, lambda) return t end + for li = 1, 100 do cdf_table[li] = generate_cdf(li, 0.25 * li) end + poisson = function(lambda, max) if max < 2 then @@ -107,6 +114,7 @@ poisson = function(lambda, max) end end + -- Error function. statistics.erf = erf @@ -131,6 +139,7 @@ statistics.std_normal = function() return std_normal(u) end + --- Standard normal distribution function (mean 0, standard deviation 1). -- -- @param mu @@ -153,6 +162,7 @@ statistics.normal = function(mu, sigma) return mu + sigma * std_normal(u) end + --- Poisson distribution function. -- -- @param lambda @@ -171,4 +181,5 @@ statistics.poisson = function(lambda, max) return poisson(lambda, max) end + return statistics diff --git a/farming/textures/farming_apple_pie.png b/farming/textures/farming_apple_pie.png new file mode 100644 index 0000000000000000000000000000000000000000..0e4fdf4efb93a5630fdae7e18151700243be4bae GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=5ZT47&O{>sCi41?om8 zBqgOJF6;`QK6BcIz0E?p3s`_E7)yfuf*Bm1-ADs+B0OCjLpZJ{Cmdk9ar!j(fs&_Z zW?pt&bL!+|_49N1L}qZZvGTl`?3m!i$jlv)u#1^_GIv12u5Kpg;1=)Ho!&E;n45#z tyS=l7PADwx+or<0;i8up7tap{2K8E*g*nAVhk$l4c)I$ztaD0e0sy?xKn4H+ literal 0 HcmV?d00001 diff --git a/farming/textures/farming_bibimbap.png b/farming/textures/farming_bibimbap.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a7dfe370c308b41d185e065a21b13c39d43bfb GIT binary patch literal 372 zcmV-)0gL{LP)QPWNTx*TSGv>;nzPpXNa>%#4H0ymYD#``$+v6>+wGQEes!?hTDFJsag?zhqJ(SW2~pU!)(mPzE?zzXxLR~KU|Y(h zVE?d9Gy{M^tq6bs?6V`vibAvAPydBUM+M-ZH%gEHbqv7y@eTmji}wwIIK8pFNkVctMQ;F* S?0t9u00000oneEP)W<84~0S!6I404anpi$&lCu1C9hU(Fu|sVWK36{~kpwEwB|r zvLL8w)Bf-4d;QbE7=u1zfS%*GfTGGwS|lGc2JJT}s?3}Y63f-1Q(P*E^*j%}4$>kq zm+R4t7{^#}0Kkp3*OeE*8FPY2geaASCVBxyB7`Qwb1VnYL{4CfIb$6M?Y+ULLz{cV zI7%g*lUhBZ4eg><8a#f)&_swt2msh_c1@9JrhR@6yj`%_YNauao4lMc7tP-M761UV sWMTlgPCVOfi@kt0$S3*=@IRmF4iheTCEdPXuK)l507*qoM6N<$g0I7O!2kdN literal 0 HcmV?d00001 diff --git a/farming/textures/farming_cabbage_1.png b/farming/textures/farming_cabbage_1.png new file mode 100644 index 0000000000000000000000000000000000000000..850b0da4c390c905fb9d1a6a589ea2345a8c3020 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`dY&$hAr_~T6C_v{Cx{5JMx~|v zIj(-b#s8Axp=b84+tjE05HMj_&n;*3)8T>;!}QyndhBn%EClLg@O1TaS?83{1OP8- B9;^TW literal 0 HcmV?d00001 diff --git a/farming/textures/farming_cabbage_2.png b/farming/textures/farming_cabbage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae079fbb24ae6e53644851d719d43d1feac4bc5 GIT binary patch literal 221 zcmV<303!d1P)eK^UMxp_l+uQC!D3f%petgR6p&CIk{J&s^?_ zm-k(A!QI)S0~@sm>;VABf8+MJqMA4mp7+=2XJzVUF;qpf+(1+i6|dVIfV$0HRMsPO z)(z9MGWDsqhyY*~gQ#E@hffQl!W3z?foj6}a^my;(#4)G_L#-t4(kzAlX0(#W)|TG X;{82bTGXru00000NkvXXu0mjfvp-zq literal 0 HcmV?d00001 diff --git a/farming/textures/farming_cabbage_3.png b/farming/textures/farming_cabbage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3050229ca0ae7b15d18571bc53ce3169186e630a GIT binary patch literal 238 zcmVr6oH_QF~0bs19XFjp%sMW zlhktM6*uRIYgCmfnK3c{f&T!&{IfWmb}AA9n9K1x_Gyu*a~)OQm>_`_ixsPNn*mU_ znOd0Sb#)QON-+D@LrS>>UQflBNU@ zIKs$D=I#4GS!ZT^GXuVyKj0?-!~SBuTL2)EQu+#jOcDT&+w*4wkrcpG8=K~%xVE6J z?N6Kc2D8pF07*qoM6N<$f@BJ6+5i9m literal 0 HcmV?d00001 diff --git a/farming/textures/farming_cabbage_5.png b/farming/textures/farming_cabbage_5.png new file mode 100644 index 0000000000000000000000000000000000000000..45dd7777133bbb880f5c6a35671e8b92df590e81 GIT binary patch literal 257 zcmV+c0sj7pP)i-gGsy(bIp%1=O#J~r0a%WW-D%?hL=06~0}x3F!1Z_!z9tYc0I0U4S?qnQ z9p~HLO(w{T#0}Hd*{V0Q9ya)s2_gxx+96_ilusJ9sJ0%a+L9NE`v|bwk!CSfS^FD^ z7#g)6JXSFN#$iv@_6;0Kh=}2^y#$j-tjgLqTkU-FP#fz7UglAwbUFTq00000NkvXX Hu0mjf3z=rU literal 0 HcmV?d00001 diff --git a/farming/textures/farming_cabbage_6.png b/farming/textures/farming_cabbage_6.png new file mode 100644 index 0000000000000000000000000000000000000000..253f8a7190f94603ed4f7c98ac50eed00c40da97 GIT binary patch literal 283 zcmV+$0p$LPP)$;DCWaS&3o6Ni{7GY@|w+pU?*w1fXeaZQ5G@4Va3Lm%TP^t+_Rb4D5bCS3zmq zoLfWF)@rhX+!_GBw_jAQL}XYPZ047#z?Bt#?C8YN5ZU002ovPDHLkV1hSqb$0*& literal 0 HcmV?d00001 diff --git a/farming/textures/farming_cactus_juice.png b/farming/textures/farming_cactus_juice.png new file mode 100644 index 0000000000000000000000000000000000000000..b4fb5b993f1426581c062b4b3ed3a742dd294794 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ%`eK$nPXqN(&ggi3%Bmv zeDdt^k6+(8<{kV4RKQpgbJxxta32j0G0tp7{nwl#m8@B9Px^!v7+a$9>HlRbQcXP+IE$86_n#JJh L>gTe~DWM4ffxkBQ literal 0 HcmV?d00001 diff --git a/farming/textures/farming_cotton_wild.png b/farming/textures/farming_cotton_wild.png new file mode 100644 index 0000000000000000000000000000000000000000..0107ad4a83c00f28ef9406b0ce198a67a38ec8ca GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=3bp79ln+1tB4kxn>a^ zZefcf*RNlH`SRu0uU|i1mY@k#!B`UH7tG-B>_!@pQ{w637{YPAwr3;nAp;TC^Y^zE zNJe^eyqm4ym?@R$}eg2{VVw2>u6PWR6EB`F)l3ffT^|a zcF|WS1WXobg&nm&8U6gZT6Nr`rT6oL7RnrvTN0^0>&vXPn^z0m&Kx^*rP}LU^J8wq XG~O7$3sXCR_A_|8`njxgN@xNA(STM% literal 0 HcmV?d00001 diff --git a/farming/textures/farming_pasta.png b/farming/textures/farming_pasta.png new file mode 100644 index 0000000000000000000000000000000000000000..af6a48c7599dc6b31fe4bf77f3777c0e90127f99 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9>rIZZgNvh=?_+Rk&!51aqPg8BL|KgNXR{SVD^Cr3?kx5GY%X# oc*$^BjFnB)n=LhsP0fs9PdfWFx!>idfJQKQy85}Sb4q9e0FbjQ?*IS* literal 0 HcmV?d00001 diff --git a/farming/textures/farming_spaghetti.png b/farming/textures/farming_spaghetti.png new file mode 100644 index 0000000000000000000000000000000000000000..a401281bd3de16321dc80dd3df7d46345cd6d7bf GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w=>VS)*F**eE_TM5#vCz0YG3>X zSZ0eXTr}_bVvBFzKUN%=vJ$9_u_VYZn8D%MjWi&q)zif>MB?(=E<>)v20X4)bz<-G zsU>SM?Q&4q9sR*_&y>ES98XN;vSfFAO;`~IW-0m}y!Cs;Q=uW`}$=~wTYud8v| z#i`qNx3oLgq}KO*HB)D*+=>z6Ii+*PkR>WHqx8|t=^eSO>!SpV&$. - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/maptools/locale/es.txt b/maptools/locale/es.txt deleted file mode 100644 index 1bc96f25..00000000 --- a/maptools/locale/es.txt +++ /dev/null @@ -1,39 +0,0 @@ -# Translation by kaeza - -[maptools] loaded. = [maptools] cargado. - -Cloud = Nube -Infinite Fuel = Combustible Infinito -Admin Pickaxe = Pico de Administrador -Copper Coin = Moneda de Cobre -Silver Coin = Moneda de Plata -Gold Coin = Moneda de Oro -Super Apple = Super Manzana -Fake Ladder = Escalera Falsa -Smoke Block = Bloque de Humo -Damaging Block: %s = Bloque Dañino: %s -Kill Block = Bloque Mortal -Build Prevention = Bloqueador de Construcción -Interact Prevention = Bloqueador de Interacción -Climb Block = Bloque Escalable -Light Block = Bloqueador de Luz -Light Bulb = Lamparilla -Player Clip = Bloqueo de Jugador -Full Clip = Bloqueo Total - -Unbreakable Stone = Piedra Irrompible -Unbreakable Sand = Arena Irrompible -Unbreakable Desert Stone = Piedra Desértica Irrompible -Unbreakable Desert Sand = Arena Desértica Irrompible -Unbreakable Gravel = Gravilla Irrompible -Unbreakable Dirt = Tierra Irrompible -Unbreakable Dirt with Grass = Hierba Irrompible -Unbreakable Full Grass= Bloque de Hierba Irrompible -Unbreakable Brick = Ladrillos Irrompibles -Unbreakable Wooden Planks = Planchas de Madera Irrompibles -Unbreakable Tree = Tronco de Árbol Irrompible -Unbreakable Glass = Cristal Irrompible -Unbreakable Sandstone = Arenisca Irrompible -Unbreakable Leaves = Foliaje Irrompible -Unbreakable Cobblestone = Guijarros Irrompibles -Unbreakable Mossy Cobblestone = Guijarros Enmohecidos Irrompibles diff --git a/maptools/locale/fr.txt b/maptools/locale/fr.txt deleted file mode 100644 index d1378712..00000000 --- a/maptools/locale/fr.txt +++ /dev/null @@ -1,47 +0,0 @@ -# Translation by Calinou - -[maptools] loaded. = [maptools] a été chargé. - -Cloud = Nuage -Infinite Fuel = Carburant infini -Admin Pickaxe = Pioche d'administrateur -Admin Pickaxe With Drops = Pioche d'administrateur qui donne des objets -Copper Coin = Pièce de cuivre -Silver Coin = Pièce d'argent -Gold Coin = Pièce d'or -Super Apple = Super pomme -Fake Ladder = Fausse échelle -Smoke Block = Bloc de fumée -Damaging Block: %s = Bloc de dégâts : %s -Kill Block = Bloc qui tue -Build Prevention = Prévention de construction -Interact Prevention = Prévention d'interaction -Climb Block = Bloc à grimper -Light Block = Bloqueur de lumière -Light Bulb = Bloc lumineux -Player Clip = Bloque-joueurs -Player Clip Bottom Face = Face inférieure de bloque-joueurs -Player Clip Top Face = Face supérieure de bloque-joueurs -Full Clip = Bloque-tout -Full Clip Face = Face de bloque-tout -Permanent Fire = Feu permanent -Fake Fire = Faux feu -Igniter = Incendieur -Pusher: %s = Pousseur : %s - -Unbreakable Stone = Pierre incassable -Unbreakable Sand = Sable incassable -Unbreakable Desert Stone = Pierre de désert incassable -Unbreakable Desert Sand = Sable de désert incassable -Unbreakable Gravel = Gravier incassable -Unbreakable Dirt = Terre incassable -Unbreakable Dirt with Grass = Herbe incassable -Unbreakable Full Grass= Bloc d'herbe incassable -Unbreakable Brick = Briques incassables -Unbreakable Wooden Planks = Planches de bois incassables -Unbreakable Tree = Tronc d'arbre incassable -Unbreakable Glass = Verre incassable -Unbreakable Sandstone = Grès incassable -Unbreakable Leaves = Feuillage incassable -Unbreakable Cobblestone = Pierre taillée incassable -Unbreakable Mossy Cobblestone = Pierre taillée mousseusse incassable diff --git a/maptools/locale/it.txt b/maptools/locale/it.txt deleted file mode 100644 index a1837fbf..00000000 --- a/maptools/locale/it.txt +++ /dev/null @@ -1,47 +0,0 @@ -# Translation by Emon - -[maptools] loaded. = [maptools] caricato. - -Cloud = Nuvola -Infinite Fuel = Combustibile infinito -Admin Pickaxe = Piccone della amministrazione -Admin Pickaxe With Drops = Piccone della amministrazione che lascia cadere a terra -Copper Coin = Moneta di rame -Silver Coin = Moneta di argento -Gold Coin = Moneta di oro -Super Apple = Super mela -Fake Ladder = Finta scala a pioli -Smoke Block = Blocco di fumo -Damaging Block: %s = Blocco che danneggia : %s -Kill Block = Blocco che uccide -Build Prevention = Impedimento alla costruzione -Interact Prevention = Impedimento alla interazione -Climb Block = Blocco su cui ci si può arrampicare -Light Block = Blocco di luce -Light Bulb = Lampadina -Player Clip = Blocca giocatori -Player Clip Bottom Face = Blocca giocatori - faccia inferiore -Player Clip Top Face = Glocca giocatori - faccia superiore -Full Clip = Blocca tutti -Full Clip Face = Faccia del blocca tutti -Permanent Fire = Fuoco eterno -Fake Fire = Fuoco finto -Igniter = Accendino -Pusher: %s = Che ha spinto : %s - -Unbreakable Stone = Pietra infrangibile -Unbreakable Sand = Sabbia infrangibile -Unbreakable Desert Stone = Pietra del deserto infrangibile -Unbreakable Desert Sand = Sabbia del deserto infrangibile -Unbreakable Gravel = Ghiaia infrangibile -Unbreakable Dirt = Terra infrangibile -Unbreakable Dirt with Grass = Erba infrangibile -Unbreakable Full Grass= Blocco d'erba infrangibile -Unbreakable Brick = Mattoni infrangibile -Unbreakable Wooden Planks = Assi in legno infrangibili -Unbreakable Tree = Albero infrangibile -Unbreakable Glass = Vetro infrangibile -Unbreakable Sandstone = Arenaria infrangibile -Unbreakable Leaves = Foglie infrangibili -Unbreakable Cobblestone = Ciottolo infrangibile -Unbreakable Mossy Cobblestone = Ciottolo muschioso infrangibile diff --git a/maptools/locale/maptools.es.tr b/maptools/locale/maptools.es.tr new file mode 100644 index 00000000..030f1467 --- /dev/null +++ b/maptools/locale/maptools.es.tr @@ -0,0 +1,38 @@ +# textdomain: maptools +[maptools] loaded.=[maptools] cargado. + +Cloud=Nube +Infinite Fuel=Combustible Infinito +Admin Pickaxe=Pico de Administrador +Copper Coin=Moneda de Cobre +Silver Coin=Moneda de Plata +Gold Coin=Moneda de Oro +Super Apple=Super Manzana +Fake Ladder=Escalera Falsa +Smoke Block=Bloque de Humo +Damaging Block: %s=Bloque Dañino: %s +Kill Block=Bloque Mortal +Build Prevention=Bloqueador de Construcción +Interact Prevention=Bloqueador de Interacción +Climb Block=Bloque Escalable +Light Block=Bloqueador de Luz +Light Bulb=Lamparilla +Player Clip=Bloqueo de Jugador +Full Clip=Bloqueo Total + +Unbreakable Stone=Piedra Irrompible +Unbreakable Sand=Arena Irrompible +Unbreakable Desert Stone=Piedra Desértica Irrompible +Unbreakable Desert Sand=Arena Desértica Irrompible +Unbreakable Gravel=Gravilla Irrompible +Unbreakable Dirt=Tierra Irrompible +Unbreakable Dirt with Grass=Hierba Irrompible +Unbreakable Full Grass=Bloque de Hierba Irrompible +Unbreakable Brick=Ladrillos Irrompibles +Unbreakable Wooden Planks=Planchas de Madera Irrompibles +Unbreakable Tree=Tronco de Árbol Irrompible +Unbreakable Glass=Cristal Irrompible +Unbreakable Sandstone=Arenisca Irrompible +Unbreakable Leaves=Foliaje Irrompible +Unbreakable Cobblestone=Guijarros Irrompibles +Unbreakable Mossy Cobblestone=Guijarros Enmohecidos Irrompibles diff --git a/maptools/locale/maptools.fr.tr b/maptools/locale/maptools.fr.tr new file mode 100644 index 00000000..818b5f5e --- /dev/null +++ b/maptools/locale/maptools.fr.tr @@ -0,0 +1,46 @@ +# textdomain: maptools +[maptools] loaded.=[maptools] a été chargé. + +Cloud=Nuage +Infinite Fuel=Carburant infini +Admin Pickaxe=Pioche d'administrateur +Admin Pickaxe With Drops=Pioche d'administrateur qui donne des objets +Copper Coin=Pièce de cuivre +Silver Coin=Pièce d'argent +Gold Coin=Pièce d'or +Super Apple=Super pomme +Fake Ladder=Fausse échelle +Smoke Block=Bloc de fumée +Damaging Block: %s=Bloc de dégâts : %s +Kill Block=Bloc qui tue +Build Prevention=Prévention de construction +Interact Prevention=Prévention d'interaction +Climb Block=Bloc à grimper +Light Block=Bloqueur de lumière +Light Bulb=Bloc lumineux +Player Clip=Bloque-joueurs +Player Clip Bottom Face=Face inférieure de bloque-joueurs +Player Clip Top Face=Face supérieure de bloque-joueurs +Full Clip=Bloque-tout +Full Clip Face=Face de bloque-tout +Permanent Fire=Feu permanent +Fake Fire=Faux feu +Igniter=Incendieur +Pusher: %s=Pousseur : %s + +Unbreakable Stone=Pierre incassable +Unbreakable Sand=Sable incassable +Unbreakable Desert Stone=Pierre de désert incassable +Unbreakable Desert Sand=Sable de désert incassable +Unbreakable Gravel=Gravier incassable +Unbreakable Dirt=Terre incassable +Unbreakable Dirt with Grass=Herbe incassable +Unbreakable Full Grass=Bloc d'herbe incassable +Unbreakable Brick=Briques incassables +Unbreakable Wooden Planks=Planches de bois incassables +Unbreakable Tree=Tronc d'arbre incassable +Unbreakable Glass=Verre incassable +Unbreakable Sandstone=Grès incassable +Unbreakable Leaves=Feuillage incassable +Unbreakable Cobblestone=Pierre taillée incassable +Unbreakable Mossy Cobblestone=Pierre taillée mousseusse incassable diff --git a/maptools/locale/maptools.it.tr b/maptools/locale/maptools.it.tr new file mode 100644 index 00000000..b8fbd0e1 --- /dev/null +++ b/maptools/locale/maptools.it.tr @@ -0,0 +1,46 @@ +# textdomain: maptools +[maptools] loaded.=[maptools] caricato. + +Cloud=Nuvola +Infinite Fuel=Combustibile infinito +Admin Pickaxe=Piccone della amministrazione +Admin Pickaxe With Drops=Piccone della amministrazione che lascia cadere a terra +Copper Coin=Moneta di rame +Silver Coin=Moneta di argento +Gold Coin=Moneta di oro +Super Apple=Super mela +Fake Ladder=Finta scala a pioli +Smoke Block=Blocco di fumo +Damaging Block: %s=Blocco che danneggia : %s +Kill Block=Blocco che uccide +Build Prevention=Impedimento alla costruzione +Interact Prevention=Impedimento alla interazione +Climb Block=Blocco su cui ci si può arrampicare +Light Block=Blocco di luce +Light Bulb=Lampadina +Player Clip=Blocca giocatori +Player Clip Bottom Face=Blocca giocatori - faccia inferiore +Player Clip Top Face=Glocca giocatori - faccia superiore +Full Clip=Blocca tutti +Full Clip Face=Faccia del blocca tutti +Permanent Fire=Fuoco eterno +Fake Fire=Fuoco finto +Igniter=Accendino +Pusher: %s=Che ha spinto : %s + +Unbreakable Stone=Pietra infrangibile +Unbreakable Sand=Sabbia infrangibile +Unbreakable Desert Stone=Pietra del deserto infrangibile +Unbreakable Desert Sand=Sabbia del deserto infrangibile +Unbreakable Gravel=Ghiaia infrangibile +Unbreakable Dirt=Terra infrangibile +Unbreakable Dirt with Grass=Erba infrangibile +Unbreakable Full Grass=Blocco d'erba infrangibile +Unbreakable Brick=Mattoni infrangibile +Unbreakable Wooden Planks=Assi in legno infrangibili +Unbreakable Tree=Albero infrangibile +Unbreakable Glass=Vetro infrangibile +Unbreakable Sandstone=Arenaria infrangibile +Unbreakable Leaves=Foglie infrangibili +Unbreakable Cobblestone=Ciottolo infrangibile +Unbreakable Mossy Cobblestone=Ciottolo muschioso infrangibile diff --git a/maptools/locale/maptools.template.tr b/maptools/locale/maptools.template.tr new file mode 100644 index 00000000..7280ca45 --- /dev/null +++ b/maptools/locale/maptools.template.tr @@ -0,0 +1,46 @@ +# textdomain: maptools +[maptools] loaded.= + +Cloud=Nuage +Infinite Fuel= +Admin Pickaxe= +Admin Pickaxe With Drops= +Copper Coin= +Silver Coin= +Gold Coin= +Super Apple= +Fake Ladder= +Smoke Block= +Damaging Block: %s= +Kill Block= +Build Prevention= +Interact Prevention= +Climb Block= +Light Block= +Light Bulb= +Player Clip= +Player Clip Bottom Face= +Player Clip Top Face= +Full Clip= +Full Clip Face= +Permanent Fire= +Fake Fire= +Igniter= +Pusher: %s= + +Unbreakable Stone= +Unbreakable Sand= +Unbreakable Desert Stone= +Unbreakable Desert Sand= +Unbreakable Gravel= +Unbreakable Dirt= +Unbreakable Dirt with Grass= +Unbreakable Full Grass= +Unbreakable Brick= +Unbreakable Wooden Planks= +Unbreakable Tree= +Unbreakable Glass= +Unbreakable Sandstone= +Unbreakable Leaves= +Unbreakable Cobblestone= +Unbreakable Mossy Cobblestone= diff --git a/maptools/mod.conf b/maptools/mod.conf index 697858ba..329484d0 100644 --- a/maptools/mod.conf +++ b/maptools/mod.conf @@ -1,4 +1,5 @@ name = maptools description = Adds various special versions of normal blocks, tools, and other map maintainer tools. depends = default -optional_depends = intllib, moreores +optional_depends = moreores +min_minetest_version = 5.0.0 diff --git a/maptools/nodes.lua b/maptools/nodes.lua index 2f9d809f..039f10e2 100644 --- a/maptools/nodes.lua +++ b/maptools/nodes.lua @@ -467,3 +467,19 @@ minetest.register_node("maptools:superapple", { sounds = default.node_sound_defaults(), on_drop = maptools.drop_msg }) + +minetest.register_node("maptools:drowning", { + description = S("Drownable Air"), + range = 12, + stack_max = 10000, + inventory_image = "default_steel_block.png^dye_black.png", + drawtype = "airlike", + paramtype = "light", + pointable = false, + walkable = false, + drowning = 1, + sunlight_propagates = true, + drop = "", + groups = {unbreakable = 1, not_in_creative_inventory = maptools.creative}, + on_drop = maptools.drop_msg +}) diff --git a/mesecons/depends.txt b/mesecons/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mesecons/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mesecons/mod.conf b/mesecons/mod.conf new file mode 100644 index 00000000..61b628ea --- /dev/null +++ b/mesecons/mod.conf @@ -0,0 +1,2 @@ +name = mesecons +depends = default diff --git a/mesecons_alias/depends.txt b/mesecons_alias/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_alias/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_alias/mod.conf b/mesecons_alias/mod.conf new file mode 100644 index 00000000..533d54c8 --- /dev/null +++ b/mesecons_alias/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_alias +depends = mesecons diff --git a/mesecons_blinkyplant/depends.txt b/mesecons_blinkyplant/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_blinkyplant/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_blinkyplant/mod.conf b/mesecons_blinkyplant/mod.conf new file mode 100644 index 00000000..04997b95 --- /dev/null +++ b/mesecons_blinkyplant/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_blinkyplant +depends = mesecons diff --git a/mesecons_button/depends.txt b/mesecons_button/depends.txt deleted file mode 100644 index 19c798c8..00000000 --- a/mesecons_button/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -mesecons_receiver diff --git a/mesecons_button/mod.conf b/mesecons_button/mod.conf new file mode 100644 index 00000000..b98afd13 --- /dev/null +++ b/mesecons_button/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_button +depends = mesecons, mesecons_receiver diff --git a/mesecons_commandblock/depends.txt b/mesecons_commandblock/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_commandblock/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_commandblock/mod.conf b/mesecons_commandblock/mod.conf new file mode 100644 index 00000000..750a6e71 --- /dev/null +++ b/mesecons_commandblock/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_commandblock +depends = mesecons diff --git a/mesecons_delayer/depends.txt b/mesecons_delayer/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_delayer/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_delayer/mod.conf b/mesecons_delayer/mod.conf new file mode 100644 index 00000000..b9b96d08 --- /dev/null +++ b/mesecons_delayer/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_delayer +depends = mesecons diff --git a/mesecons_detector/depends.txt b/mesecons_detector/depends.txt deleted file mode 100644 index bc7b0627..00000000 --- a/mesecons_detector/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -mesecons_materials diff --git a/mesecons_detector/mod.conf b/mesecons_detector/mod.conf new file mode 100644 index 00000000..75456b3e --- /dev/null +++ b/mesecons_detector/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_detector +depends = mesecons, mesecons_materials diff --git a/mesecons_doors/depends.txt b/mesecons_doors/depends.txt deleted file mode 100644 index ed2fcd8a..00000000 --- a/mesecons_doors/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -doors diff --git a/mesecons_doors/mod.conf b/mesecons_doors/mod.conf new file mode 100644 index 00000000..da12b38e --- /dev/null +++ b/mesecons_doors/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_doors +depends = mesecons, doors diff --git a/mesecons_extrawires/corner.lua b/mesecons_extrawires/corner.lua index d33447a7..1fc84105 100644 --- a/mesecons_extrawires/corner.lua +++ b/mesecons_extrawires/corner.lua @@ -87,8 +87,7 @@ minetest.register_node("mesecons_extrawires:corner_off", { minetest.register_craft({ output = "mesecons_extrawires:corner_off 3", recipe = { - {"", "", ""}, - {"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", ""}, - {"", "mesecons_insulated:insulated_off", ""}, + {"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"}, + {"", "mesecons_insulated:insulated_off"}, } }) diff --git a/mesecons_extrawires/depends.txt b/mesecons_extrawires/depends.txt deleted file mode 100644 index 369aeb77..00000000 --- a/mesecons_extrawires/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -mesecons -screwdriver? diff --git a/mesecons_extrawires/mod.conf b/mesecons_extrawires/mod.conf new file mode 100644 index 00000000..5632d87a --- /dev/null +++ b/mesecons_extrawires/mod.conf @@ -0,0 +1,3 @@ +name = mesecons_extrawires +depends = default, mesecons +optional_depends = screwdriver diff --git a/mesecons_extrawires/tjunction.lua b/mesecons_extrawires/tjunction.lua index 77c42906..8744a030 100644 --- a/mesecons_extrawires/tjunction.lua +++ b/mesecons_extrawires/tjunction.lua @@ -88,7 +88,6 @@ minetest.register_node("mesecons_extrawires:tjunction_off", { minetest.register_craft({ output = "mesecons_extrawires:tjunction_off 3", recipe = { - {"", "", ""}, {"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"}, {"", "mesecons_insulated:insulated_off", ""}, } diff --git a/mesecons_fpga/depends.txt b/mesecons_fpga/depends.txt deleted file mode 100644 index a0ba1efc..00000000 --- a/mesecons_fpga/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -screwdriver? diff --git a/mesecons_fpga/mod.conf b/mesecons_fpga/mod.conf new file mode 100644 index 00000000..707f7c73 --- /dev/null +++ b/mesecons_fpga/mod.conf @@ -0,0 +1,3 @@ +name = mesecons_fpga +depends = mesecons +optional_depends = screwdriver diff --git a/mesecons_fpga/sounds/mesecons_fpga_copy.ogg b/mesecons_fpga/sounds/mesecons_fpga_copy.ogg new file mode 100644 index 0000000000000000000000000000000000000000..259a1bd2d8a613b1ec964c7985c35b367523d2e9 GIT binary patch literal 7249 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 ObHMR^`)D`)dH)NuEdx&g literal 0 HcmV?d00001 diff --git a/mesecons_fpga/sounds/mesecons_fpga_write.ogg b/mesecons_fpga/sounds/mesecons_fpga_write.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e781bff9627b33fd25157500d7e6e40945857bee GIT binary patch literal 5706 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 literal 0 HcmV?d00001 diff --git a/mesecons_fpga/tool.lua b/mesecons_fpga/tool.lua index 22bfaeaa..9e57bde9 100644 --- a/mesecons_fpga/tool.lua +++ b/mesecons_fpga/tool.lua @@ -18,10 +18,12 @@ minetest.register_tool("mesecons_fpga:programmer", { local meta = minetest.get_meta(pos) if meta:get_string("instr") == "//////////////" then minetest.chat_send_player(placer:get_player_name(), "This FPGA is unprogrammed.") + minetest.sound_play("mesecons_fpga_fail", { pos = placer:get_pos(), gain = 0.1, max_hear_distance = 4 }) return itemstack end itemstack:set_metadata(meta:get_string("instr")) minetest.chat_send_player(placer:get_player_name(), "FPGA gate configuration was successfully copied!") + minetest.sound_play("mesecons_fpga_copy", { pos = placer:get_pos(), gain = 0.1, max_hear_distance = 4 }) return itemstack end, @@ -43,6 +45,7 @@ minetest.register_tool("mesecons_fpga:programmer", { local imeta = itemstack:get_metadata() if imeta == "" then minetest.chat_send_player(player_name, "Use shift+right-click to copy a gate configuration first.") + minetest.sound_play("mesecons_fpga_fail", { pos = user:get_pos(), gain = 0.1, max_hear_distance = 4 }) return itemstack end @@ -50,6 +53,7 @@ minetest.register_tool("mesecons_fpga:programmer", { meta:set_string("instr", imeta) plg.update_meta(pos, imeta) minetest.chat_send_player(player_name, "Gate configuration was successfully written to FPGA!") + minetest.sound_play("mesecons_fpga_write", { pos = user:get_pos(), gain = 0.1, max_hear_distance = 4 }) return itemstack end diff --git a/mesecons_gates/depends.txt b/mesecons_gates/depends.txt deleted file mode 100644 index f3e0392f..00000000 --- a/mesecons_gates/depends.txt +++ /dev/null @@ -1,6 +0,0 @@ -mesecons -mesecons_microcontroller -mesecons_delayer - -mesecons_torch -mesecons_materials diff --git a/mesecons_gates/mod.conf b/mesecons_gates/mod.conf new file mode 100644 index 00000000..c57336f8 --- /dev/null +++ b/mesecons_gates/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_gates +depends = mesecons, mesecons_microcontroller, mesecons_delayer, mesecons_torch, mesecons_materials diff --git a/mesecons_hydroturbine/depends.txt b/mesecons_hydroturbine/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_hydroturbine/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_hydroturbine/mod.conf b/mesecons_hydroturbine/mod.conf new file mode 100644 index 00000000..ce221eae --- /dev/null +++ b/mesecons_hydroturbine/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_hydroturbine +depends = mesecons diff --git a/mesecons_insulated/depends.txt b/mesecons_insulated/depends.txt deleted file mode 100644 index a0ba1efc..00000000 --- a/mesecons_insulated/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -screwdriver? diff --git a/mesecons_insulated/mod.conf b/mesecons_insulated/mod.conf new file mode 100644 index 00000000..d5965f0f --- /dev/null +++ b/mesecons_insulated/mod.conf @@ -0,0 +1,3 @@ +name = mesecons_insulated +depends = mesecons +optional_depends = screwdriver diff --git a/mesecons_lamp/depends.txt b/mesecons_lamp/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_lamp/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_lamp/mod.conf b/mesecons_lamp/mod.conf new file mode 100644 index 00000000..b469619f --- /dev/null +++ b/mesecons_lamp/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_lamp +depends = mesecons diff --git a/mesecons_lightstone/depends.txt b/mesecons_lightstone/depends.txt deleted file mode 100644 index f9705e0a..00000000 --- a/mesecons_lightstone/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -dye diff --git a/mesecons_lightstone/mod.conf b/mesecons_lightstone/mod.conf new file mode 100644 index 00000000..421f58d1 --- /dev/null +++ b/mesecons_lightstone/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_lightstone +depends = mesecons, dye diff --git a/mesecons_luacontroller/depends.txt b/mesecons_luacontroller/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_luacontroller/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_luacontroller/mod.conf b/mesecons_luacontroller/mod.conf new file mode 100644 index 00000000..0db7d72e --- /dev/null +++ b/mesecons_luacontroller/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_luacontroller +depends = mesecons diff --git a/mesecons_materials/depends.txt b/mesecons_materials/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_materials/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_materials/mod.conf b/mesecons_materials/mod.conf new file mode 100644 index 00000000..53d1e1d9 --- /dev/null +++ b/mesecons_materials/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_materials +depends = mesecons diff --git a/mesecons_microcontroller/depends.txt b/mesecons_microcontroller/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_microcontroller/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_microcontroller/mod.conf b/mesecons_microcontroller/mod.conf new file mode 100644 index 00000000..6a18b2cf --- /dev/null +++ b/mesecons_microcontroller/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_microcontroller +depends = mesecons diff --git a/mesecons_movestones/depends.txt b/mesecons_movestones/depends.txt deleted file mode 100644 index a596cf80..00000000 --- a/mesecons_movestones/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -mesecons -mesecons_materials -mesecons_mvps diff --git a/mesecons_movestones/mod.conf b/mesecons_movestones/mod.conf new file mode 100644 index 00000000..9e0cbc11 --- /dev/null +++ b/mesecons_movestones/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_movestones +depends = mesecons, mesecons_materials, mesecons_mvps diff --git a/mesecons_mvps/depends.txt b/mesecons_mvps/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_mvps/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_mvps/mod.conf b/mesecons_mvps/mod.conf new file mode 100644 index 00000000..3e347879 --- /dev/null +++ b/mesecons_mvps/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_mvps +depends = mesecons diff --git a/mesecons_noteblock/depends.txt b/mesecons_noteblock/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_noteblock/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_noteblock/mod.conf b/mesecons_noteblock/mod.conf new file mode 100644 index 00000000..1288ca36 --- /dev/null +++ b/mesecons_noteblock/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_noteblock +depends = mesecons diff --git a/mesecons_pistons/depends.txt b/mesecons_pistons/depends.txt deleted file mode 100644 index 01f085ba..00000000 --- a/mesecons_pistons/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -mesecons_mvps diff --git a/mesecons_pistons/mod.conf b/mesecons_pistons/mod.conf new file mode 100644 index 00000000..db118fe2 --- /dev/null +++ b/mesecons_pistons/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_pistons +depends = mesecons, mesecons_mvps diff --git a/mesecons_powerplant/depends.txt b/mesecons_powerplant/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_powerplant/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_powerplant/mod.conf b/mesecons_powerplant/mod.conf new file mode 100644 index 00000000..1f0024f9 --- /dev/null +++ b/mesecons_powerplant/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_powerplant +depends = mesecons diff --git a/mesecons_pressureplates/depends.txt b/mesecons_pressureplates/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_pressureplates/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_pressureplates/mod.conf b/mesecons_pressureplates/mod.conf new file mode 100644 index 00000000..21ed926b --- /dev/null +++ b/mesecons_pressureplates/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_pressureplates +depends = mesecons diff --git a/mesecons_random/depends.txt b/mesecons_random/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_random/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_random/mod.conf b/mesecons_random/mod.conf new file mode 100644 index 00000000..2d94c088 --- /dev/null +++ b/mesecons_random/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_random +depends = mesecons diff --git a/mesecons_receiver/depends.txt b/mesecons_receiver/depends.txt deleted file mode 100644 index acaa9241..00000000 --- a/mesecons_receiver/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mesecons diff --git a/mesecons_receiver/mod.conf b/mesecons_receiver/mod.conf new file mode 100644 index 00000000..c1200af6 --- /dev/null +++ b/mesecons_receiver/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_receiver +depends = mesecons diff --git a/mesecons_solarpanel/depends.txt b/mesecons_solarpanel/depends.txt deleted file mode 100644 index bc7b0627..00000000 --- a/mesecons_solarpanel/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -mesecons_materials diff --git a/mesecons_solarpanel/doc/solarpanel/preview.png b/mesecons_solarpanel/doc/solarpanel/preview.png index ed78e651687e89da999887a9263cf230de7f043d..5b3ec68fec89af7556d8c7c2da6703afde933f10 100644 GIT binary patch literal 55278 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 ({y^z4KnQN!}y1 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 12 then + if light >= 12 and node.name == "mesecons_solarpanel:solar_panel_off" then node.name = "mesecons_solarpanel:solar_panel_on" minetest.swap_node(pos, node) mesecon.receptor_on(pos, mesecon.rules.wallmounted_get(node)) - end - end, -}) - -minetest.register_abm( - {nodenames = {"mesecons_solarpanel:solar_panel_on"}, - interval = 1, - chance = 1, - action = function(pos, node) - local light = minetest.get_node_light(pos) - - if light < 12 then + elseif light < 12 and node.name == "mesecons_solarpanel:solar_panel_on" then node.name = "mesecons_solarpanel:solar_panel_off" minetest.swap_node(pos, node) mesecon.receptor_off(pos, mesecon.rules.wallmounted_get(node)) diff --git a/mesecons_solarpanel/mod.conf b/mesecons_solarpanel/mod.conf new file mode 100644 index 00000000..399d904f --- /dev/null +++ b/mesecons_solarpanel/mod.conf @@ -0,0 +1,2 @@ +name = mesecons_solarpanel +depends = mesecons, mesecons_materials diff --git a/mesecons_solarpanel/textures/jeija_solar_panel.png b/mesecons_solarpanel/textures/jeija_solar_panel.png deleted file mode 100644 index d2f80fe94bd00f5df29e3e038ebd1d77cdf463e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 612 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 z - -- Intllib: -- https://github.com/minetest-mods/intllib diff --git a/new_campfire/description.txt b/new_campfire/description.txt deleted file mode 100644 index 6171e758..00000000 --- a/new_campfire/description.txt +++ /dev/null @@ -1 +0,0 @@ -You can craft and use better campfire. \ No newline at end of file diff --git a/new_campfire/init.lua b/new_campfire/init.lua index 5b0b2720..5d59ce0d 100644 --- a/new_campfire/init.lua +++ b/new_campfire/init.lua @@ -1,3 +1,6 @@ +-- Translation support +local S = minetest.get_translator("new_campfire") + -- VARIABLES new_campfire = {} @@ -9,10 +12,6 @@ new_campfire.embers_ttl = 60 -- seconds until embers burn out completely leav new_campfire.flare_up = 2 -- seconds from adding a stick to embers before it flares into a fire again new_campfire.stick_time = new_campfire.flames_ttl/2; -- How long does the stick increase. In sec. --- Load support for intllib. - local MP = minetest.get_modpath(minetest.get_current_modname()) - local S, NS = dofile(MP.."/intllib.lua") - -- FUNCTIONS local function fire_particles_on(pos) -- 3 layers of fire local meta = minetest.get_meta(pos) diff --git a/new_campfire/intllib.lua b/new_campfire/intllib.lua deleted file mode 100644 index 6669d720..00000000 --- a/new_campfire/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/new_campfire/locale/new_campfire.fr.tr b/new_campfire/locale/new_campfire.fr.tr new file mode 100644 index 00000000..71b26044 --- /dev/null +++ b/new_campfire/locale/new_campfire.fr.tr @@ -0,0 +1,16 @@ +# textdomain: new_campfire + + +### init.lua ### + +Active campfire=Feu de camp allumé +Active campfire with grille=Feu de camp allumé avec une grille +Ash=Cendres +Campfire=Feu de camp +Campfire with grille=Feu de camp avec une grille +Cooking=Cuisson +Fireplace=Foyer +Fireplace with embers=Foyer avec des braises +Fireplace with embers and grille=Foyer avec des braises et une grille +Fireplace with grille=Foyer avec une grille +Metal Grille=Grille en métal diff --git a/new_campfire/locale/new_campfire.ru.tr b/new_campfire/locale/new_campfire.ru.tr new file mode 100644 index 00000000..f032c507 --- /dev/null +++ b/new_campfire/locale/new_campfire.ru.tr @@ -0,0 +1,16 @@ +# textdomain: new_campfire + + +### init.lua ### + +Active campfire=Горящий костер +Active campfire with grille= +Ash=Пепел +Campfire=Костер +Campfire with grille= +Cooking=Приготовление +Fireplace=Кострище +Fireplace with embers= +Fireplace with embers and grille= +Fireplace with grille= +Metal Grille= diff --git a/new_campfire/locale/new_campfire.ua.tr b/new_campfire/locale/new_campfire.ua.tr new file mode 100644 index 00000000..ec0c08f0 --- /dev/null +++ b/new_campfire/locale/new_campfire.ua.tr @@ -0,0 +1,16 @@ +# textdomain: new_campfire + + +### init.lua ### + +Active campfire=Палаюче багаття +Active campfire with grille= +Ash=Попіл +Campfire=Багаття +Campfire with grille= +Cooking=Готування +Fireplace=Місце від багаття +Fireplace with embers= +Fireplace with embers and grille= +Fireplace with grille= +Metal Grille= diff --git a/new_campfire/locale/ru.po b/new_campfire/locale/ru.po deleted file mode 100644 index 7f66f76d..00000000 --- a/new_campfire/locale/ru.po +++ /dev/null @@ -1,38 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-22 20:24+0300\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua:119 init.lua:260 -msgid "Active campfire" -msgstr "Горящий костер" - -#: init.lua:129 -msgid "Cooking" -msgstr "Приготовление" - -#: init.lua:193 init.lua:211 -msgid "Fireplace" -msgstr "Кострище" - -#: init.lua:216 init.lua:236 -msgid "Campfire" -msgstr "Костер" - -#: init.lua:382 -msgid "Ash" -msgstr "Пепел" diff --git a/new_campfire/locale/template.pot b/new_campfire/locale/template.pot deleted file mode 100644 index 13acc23f..00000000 --- a/new_campfire/locale/template.pot +++ /dev/null @@ -1,38 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-22 20:24+0300\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua:119 init.lua:260 -msgid "Active campfire" -msgstr "" - -#: init.lua:129 -msgid "Cooking" -msgstr "" - -#: init.lua:193 init.lua:211 -msgid "Fireplace" -msgstr "" - -#: init.lua:216 init.lua:236 -msgid "Campfire" -msgstr "" - -#: init.lua:382 -msgid "Ash" -msgstr "" diff --git a/new_campfire/locale/template.txt b/new_campfire/locale/template.txt new file mode 100644 index 00000000..b4f6fc68 --- /dev/null +++ b/new_campfire/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: new_campfire + + +### init.lua ### + +Active campfire= +Active campfire with grille= +Ash= +Campfire= +Campfire with grille= +Cooking= +Fireplace= +Fireplace with embers= +Fireplace with embers and grille= +Fireplace with grille= +Metal Grille= diff --git a/new_campfire/locale/ua.po b/new_campfire/locale/ua.po deleted file mode 100644 index ffcf5d03..00000000 --- a/new_campfire/locale/ua.po +++ /dev/null @@ -1,38 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-22 20:24+0300\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: init.lua:119 init.lua:260 -msgid "Active campfire" -msgstr "Палаюче багаття" - -#: init.lua:129 -msgid "Cooking" -msgstr "Готування" - -#: init.lua:193 init.lua:211 -msgid "Fireplace" -msgstr "Місце від багаття" - -#: init.lua:216 init.lua:236 -msgid "Campfire" -msgstr "Багаття" - -#: init.lua:382 -msgid "Ash" -msgstr "Попіл" diff --git a/new_campfire/mod.conf b/new_campfire/mod.conf index d6a1b29b..d997f8f2 100644 --- a/new_campfire/mod.conf +++ b/new_campfire/mod.conf @@ -1,4 +1,5 @@ name = new_campfire +description = You can craft and use better campfire. depends = default, fire, basic_materials optional_depends = campfire min_minetest_version = 5.2.0 diff --git a/palm/mod.conf b/palm/mod.conf index 5fec154c..e2aedcf7 100644 --- a/palm/mod.conf +++ b/palm/mod.conf @@ -1,3 +1,4 @@ name = palm description = Palm Tree for deserts -depends = default, doors, bonemeal +depends = default, doors +optional_depends = stairs, bonemeal diff --git a/pipeworks/autoplace_tubes.lua b/pipeworks/autoplace_tubes.lua index 40a041fe..51ee383c 100644 --- a/pipeworks/autoplace_tubes.lua +++ b/pipeworks/autoplace_tubes.lua @@ -53,27 +53,28 @@ local function tube_autoroute(pos) } -- xm = 1, xp = 2, ym = 3, yp = 4, zm = 5, zp = 6 - local positions = {} - local nodes = {} - for i, adj in ipairs(adjustments) do - positions[i] = vector.add(pos, adj) - nodes[i] = minetest.get_node(positions[i]) - end + local adjlist = {} -- this will be used in item_transport + + for i, adj in ipairs(adjustments) do + local position = vector.add(pos, adj) + local node = minetest.get_node(position) - for i, node in ipairs(nodes) do local idef = minetest.registered_nodes[node.name] -- handle the tubes themselves if is_tube(node.name) then active[i] = 1 + table.insert(adjlist, adj) -- handle new style connectors elseif idef and idef.tube and idef.tube.connect_sides then - local dir = adjustments[i] - if idef.tube.connect_sides[nodeside(node, vector.multiply(dir, -1))] then + if idef.tube.connect_sides[nodeside(node, vector.multiply(adj, -1))] then active[i] = 1 + table.insert(adjlist, adj) end end end + minetest.get_meta(pos):set_string("adjlist", minetest.serialize(adjlist)) + -- all sides checked, now figure which tube to use. local nodedef = minetest.registered_nodes[nctr.name] diff --git a/pipeworks/item_transport.lua b/pipeworks/item_transport.lua index 7f9e2416..f4067d80 100644 --- a/pipeworks/item_transport.lua +++ b/pipeworks/item_transport.lua @@ -25,7 +25,7 @@ end -- both optional w/ sensible defaults and fallback to normal allow_* function -- XXX: possibly change insert_object to insert_item -local adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} +local default_adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} function pipeworks.notvel(tbl, vel) local tbl2={} @@ -80,6 +80,9 @@ local function go_next_compat(pos, cnode, cmeta, cycledir, vel, stack, owner) if minetest.registered_nodes[cnode.name] and minetest.registered_nodes[cnode.name].tube and minetest.registered_nodes[cnode.name].tube.can_go then can_go = minetest.registered_nodes[cnode.name].tube.can_go(pos, cnode, vel, stack) else + local adjlist_string = minetest.get_meta(pos):get_string("adjlist") + local adjlist = minetest.deserialize(adjlist_string) or default_adjlist -- backward compat: if not found, use old behavior: all directions + can_go = pipeworks.notvel(adjlist, vel) end -- can_go() is expected to return an array-like table of candidate offsets. diff --git a/pipeworks/lua_tube.lua b/pipeworks/lua_tube.lua index 18d3047f..543c3884 100644 --- a/pipeworks/lua_tube.lua +++ b/pipeworks/lua_tube.lua @@ -13,8 +13,10 @@ -- newport = merge_port_states(state1, state2): just does result = state1 or state2 for every port -- set_port(pos, rule, state): activates/deactivates the mesecons according to the port states -- set_port_states(pos, ports): Applies new port states to a Luacontroller at pos --- run(pos): runs the code in the controller at pos --- reset_meta(pos, code, errmsg): performs a software-reset, installs new code and prints error messages +-- run_inner(pos, code, event): runs code on the controller at pos and event +-- reset_formspec(pos, code, errmsg): installs new code and prints error messages, without resetting LCID +-- reset_meta(pos, code, errmsg): performs a software-reset, installs new code and prints error message +-- run(pos, event): a wrapper for run_inner which gets code & handles errors via reset_meta -- resetn(pos): performs a hardware reset, turns off all ports -- -- The Sandbox @@ -77,7 +79,7 @@ local function update_real_port_states(pos, rule_name, new_state) if rule_name.x == nil then for _, rname in ipairs(rule_name) do local port = pos_to_side[rname.x + (2 * rname.y) + (3 * rname.z) + 4] - L[port] = (newstate == "on") and 1 or 0 + L[port] = (new_state == "on") and 1 or 0 end else local port = pos_to_side[rule_name.x + (2 * rule_name.y) + (3 * rule_name.z) + 4] @@ -168,7 +170,7 @@ local function set_port_states(pos, ports) -- Solution / Workaround: -- Remember which output was turned off and ignore next "off" event. local meta = minetest.get_meta(pos) - local ign = minetest.deserialize(meta:get_string("ignore_offevents")) or {} + local ign = minetest.deserialize(meta:get_string("ignore_offevents"), true) or {} if ports.red and not vports.red and not mesecon.is_powered(pos, rules.red) then ign.red = true end if ports.blue and not vports.blue and not mesecon.is_powered(pos, rules.blue) then ign.blue = true end if ports.yellow and not vports.yellow and not mesecon.is_powered(pos, rules.yellow) then ign.yellow = true end @@ -214,7 +216,7 @@ end local function ignore_event(event, meta) if event.type ~= "off" then return false end - local ignore_offevents = minetest.deserialize(meta:get_string("ignore_offevents")) or {} + local ignore_offevents = minetest.deserialize(meta:get_string("ignore_offevents"), true) or {} if ignore_offevents[event.pin.name] then ignore_offevents[event.pin.name] = nil meta:set_string("ignore_offevents", minetest.serialize(ignore_offevents)) @@ -227,7 +229,11 @@ end ------------------------- local function safe_print(param) + local string_meta = getmetatable("") + local sandbox = string_meta.__index + string_meta.__index = string -- Leave string sandbox temporarily print(dump(param)) + string_meta.__index = sandbox -- Restore string sandbox end local function safe_date() @@ -267,6 +273,7 @@ local function remove_functions(x) local seen = {} local function rfuncs(x) + if x == nil then return end if seen[x] then return end seen[x] = true if type(x) ~= "table" then return end @@ -290,49 +297,174 @@ local function remove_functions(x) return x end -local function get_interrupt(pos) - -- iid = interrupt id - local function interrupt(time, iid) - if type(time) ~= "number" then return end - local luac_id = minetest.get_meta(pos):get_int("luac_id") - mesecon.queue:add_action(pos, "pipeworks:lc_tube_interrupt", {luac_id, iid}, time, iid, 1) +-- The setting affects API so is not intended to be changeable at runtime +local get_interrupt +if mesecon.setting("luacontroller_lightweight_interrupts", false) then + -- use node timer + get_interrupt = function(pos, itbl, send_warning) + return (function(time, iid) + if type(time) ~= "number" then error("Delay must be a number") end + if iid ~= nil then send_warning("Interrupt IDs are disabled on this server") end + table.insert(itbl, function() minetest.get_node_timer(pos):start(time) end) + end) + end +else + -- use global action queue + -- itbl: Flat table of functions to run after sandbox cleanup, used to prevent various security hazards + get_interrupt = function(pos, itbl, send_warning) + -- iid = interrupt id + local function interrupt(time, iid) + -- NOTE: This runs within string metatable sandbox, so don't *rely* on anything of the form (""):y + -- Hence the values get moved out. Should take less time than original, so totally compatible + if type(time) ~= "number" then error("Delay must be a number") end + table.insert(itbl, function () + -- Outside string metatable sandbox, can safely run this now + local luac_id = minetest.get_meta(pos):get_int("luac_id") + -- Check if IID is dodgy, so you can't use interrupts to store an infinite amount of data. + -- Note that this is safe from alter-after-free because this code gets run after the sandbox has ended. + -- This runs outside of the timer and *shouldn't* harm perf. unless dodgy data is being sent in the first place + iid = remove_functions(iid) + local msg_ser = minetest.serialize(iid) + if #msg_ser <= mesecon.setting("luacontroller_interruptid_maxlen", 256) then + mesecon.queue:add_action(pos, "pipeworks:lc_tube_interrupt", {luac_id, iid}, time, iid, 1) + else + send_warning("An interrupt ID was too large!") + end + end) + end + return interrupt + end +end + +-- Given a message object passed to digiline_send, clean it up into a form +-- which is safe to transmit over the network and compute its "cost" (a very +-- rough estimate of its memory usage). +-- +-- The cleaning comprises the following: +-- 1. Functions (and userdata, though user scripts ought not to get hold of +-- those in the first place) are removed, because they break the model of +-- Digilines as a network that carries basic data, and they could exfiltrate +-- references to mutable objects from one Luacontroller to another, allowing +-- inappropriate high-bandwidth, no-wires communication. +-- 2. Tables are duplicated because, being mutable, they could otherwise be +-- modified after the send is complete in order to change what data arrives +-- at the recipient, perhaps in violation of the previous cleaning rule or +-- in violation of the message size limit. +-- +-- The cost indication is only approximate; it’s not a perfect measurement of +-- the number of bytes of memory used by the message object. +-- +-- Parameters: +-- msg -- the message to clean +-- back_references -- for internal use only; do not provide +-- +-- Returns: +-- 1. The cleaned object. +-- 2. The approximate cost of the object. +local function clean_and_weigh_digiline_message(msg, back_references) + local t = type(msg) + if t == "string" then + -- Strings are immutable so can be passed by reference, and cost their + -- length plus the size of the Lua object header (24 bytes on a 64-bit + -- platform) plus one byte for the NUL terminator. + return msg, #msg + 25 + elseif t == "number" then + -- Numbers are passed by value so need not be touched, and cost 8 bytes + -- as all numbers in Lua are doubles. + return msg, 8 + elseif t == "boolean" then + -- Booleans are passed by value so need not be touched, and cost 1 + -- byte. + return msg, 1 + elseif t == "table" then + -- Tables are duplicated. Check if this table has been seen before + -- (self-referential or shared table); if so, reuse the cleaned value + -- of the previous occurrence, maintaining table topology and avoiding + -- infinite recursion, and charge zero bytes for this as the object has + -- already been counted. + back_references = back_references or {} + local bref = back_references[msg] + if bref then + return bref, 0 + end + -- Construct a new table by cleaning all the keys and values and adding + -- up their costs, plus 8 bytes as a rough estimate of table overhead. + local cost = 8 + local ret = {} + back_references[msg] = ret + for k, v in pairs(msg) do + local k_cost, v_cost + k, k_cost = clean_and_weigh_digiline_message(k, back_references) + v, v_cost = clean_and_weigh_digiline_message(v, back_references) + if k ~= nil and v ~= nil then + -- Only include an element if its key and value are of legal + -- types. + ret[k] = v + end + -- If we only counted the cost of a table element when we actually + -- used it, we would be vulnerable to the following attack: + -- 1. Construct a huge table (too large to pass the cost limit). + -- 2. Insert it somewhere in a table, with a function as a key. + -- 3. Insert it somewhere in another table, with a number as a key. + -- 4. The first occurrence doesn’t pay the cost because functions + -- are stripped and therefore the element is dropped. + -- 5. The second occurrence doesn’t pay the cost because it’s in + -- back_references. + -- By counting the costs regardless of whether the objects will be + -- included, we avoid this attack; it may overestimate the cost of + -- some messages, but only those that won’t be delivered intact + -- anyway because they contain illegal object types. + cost = cost + k_cost + v_cost + end + return ret, cost + else + return nil, 0 end - return interrupt end -local function get_digiline_send(pos) - if not digiline then return end +-- itbl: Flat table of functions to run after sandbox cleanup, used to prevent various security hazards +local function get_digiline_send(pos, itbl, send_warning) + if not minetest.global_exists("digilines") then return end + local chan_maxlen = mesecon.setting("luacontroller_digiline_channel_maxlen", 256) + local maxlen = mesecon.setting("luacontroller_digiline_maxlen", 50000) return function(channel, msg) + -- NOTE: This runs within string metatable sandbox, so don't *rely* on anything of the form (""):y + -- or via anything that could. -- Make sure channel is string, number or boolean - if (type(channel) ~= "string" and type(channel) ~= "number" and type(channel) ~= "boolean") then + if type(channel) == "string" then + if #channel > chan_maxlen then + send_warning("Channel string too long.") + return false + end + elseif (type(channel) ~= "string" and type(channel) ~= "number" and type(channel) ~= "boolean") then + send_warning("Channel must be string, number or boolean.") return false end - -- It is technically possible to send functions over the wire since - -- the high performance impact of stripping those from the data has - -- been decided to not be worth the added realism. - -- Make sure serialized version of the data is not insanely long to - -- prevent DoS-like attacks - local msg_ser = minetest.serialize(msg) - if #msg_ser > mesecon.setting("luacontroller_digiline_maxlen", 50000) then + local msg_cost + msg, msg_cost = clean_and_weigh_digiline_message(msg) + if msg == nil or msg_cost > maxlen then + send_warning("Message was too complex, or contained invalid data.") return false end - minetest.after(0, function() - digilines.receptor_send(pos, digiline_rules_luatube, channel, msg) + table.insert(itbl, function () + -- Runs outside of string metatable sandbox + local luac_id = minetest.get_meta(pos):get_int("luac_id") + mesecon.queue:add_action(pos, "pipeworks:lt_digiline_relay", {channel, luac_id, msg}) end) return true end end - local safe_globals = { + -- Don't add pcall/xpcall unless willing to deal with the consequences (unless very careful, incredibly likely to allow killing server indirectly) "assert", "error", "ipairs", "next", "pairs", "select", "tonumber", "tostring", "type", "unpack", "_VERSION" } -local function create_environment(pos, mem, event) +local function create_environment(pos, mem, event, itbl, send_warning) -- Make sure the tube hasn't broken. local vports = minetest.registered_nodes[minetest.get_node(pos).name].virtual_portstates if not vports then return {} end @@ -352,8 +484,8 @@ local function create_environment(pos, mem, event) heat = mesecon.get_heat(pos), heat_max = mesecon.setting("overheat_max", 20), print = safe_print, - interrupt = get_interrupt(pos), - digiline_send = get_digiline_send(pos), + interrupt = get_interrupt(pos, itbl, send_warning), + digiline_send = get_digiline_send(pos, itbl, send_warning), string = { byte = string.byte, char = string.char, @@ -441,10 +573,11 @@ local function create_sandbox(code, env) jit.off(f, true) end + local maxevents = mesecon.setting("luacontroller_maxevents", 10000) return function(...) + -- NOTE: This runs within string metatable sandbox, so the setting's been moved out for safety -- Use instruction counter to stop execution -- after luacontroller_maxevents - local maxevents = mesecon.setting("luacontroller_maxevents", 10000) debug.sethook(timeout, "", maxevents) local ok, ret = pcall(f, ...) debug.sethook() -- Clear hook @@ -455,7 +588,7 @@ end local function load_memory(meta) - return minetest.deserialize(meta:get_string("lc_memory")) or {} + return minetest.deserialize(meta:get_string("lc_memory"), true) or {} end @@ -465,6 +598,7 @@ local function save_memory(pos, meta, mem) if (#memstring <= memsize_max) then meta:set_string("lc_memory", memstring) + meta:mark_as_private("lc_memory") else print("Error: lua_tube memory overflow. "..memsize_max.." bytes available, " ..#memstring.." required. Controller overheats.") @@ -472,26 +606,42 @@ local function save_memory(pos, meta, mem) end end - -local function run(pos, event) +-- Returns success (boolean), errmsg (string), retval(any, return value of the user supplied code) +-- run (as opposed to run_inner) is responsible for setting up meta according to this output +local function run_inner(pos, code, event) local meta = minetest.get_meta(pos) - if overheat(pos) then return end - if ignore_event(event, meta) then return end + -- Note: These return success, presumably to avoid changing LC ID. + if overheat(pos) then return true, "", nil end + if ignore_event(event, meta) then return true, "", nil end -- Load code & mem from meta local mem = load_memory(meta) local code = meta:get_string("code") + -- 'Last warning' label. + local warning = "" + local function send_warning(str) + warning = "Warning: " .. str + end + -- Create environment - local env = create_environment(pos, mem, event) + local itbl = {} + local env = create_environment(pos, mem, event, itbl, send_warning) -- Create the sandbox and execute code local f, msg = create_sandbox(code, env) - if not f then return false, msg end - local succ, msg = pcall(f) - if not succ then return false, msg end + if not f then return false, msg, nil end + -- Start string true sandboxing + local onetruestring = getmetatable("") + -- If a string sandbox is already up yet inconsistent, something is very wrong + assert(onetruestring.__index == string) + onetruestring.__index = env.string + local success, msg = pcall(f) + onetruestring.__index = string + -- End string true sandboxing + if not success then return false, msg, nil end if type(env.port) ~= "table" then - return false, "Ports set are invalid." + return false, "Ports set are invalid.", nil end -- Actually set the ports @@ -500,35 +650,81 @@ local function run(pos, event) -- Save memory. This may burn the luacontroller if a memory overflow occurs. save_memory(pos, meta, env.mem) - return succ, msg + -- Execute deferred tasks + for _, v in ipairs(itbl) do + local failure = v() + if failure then + return false, failure, nil + end + end + return true, warning, msg end -mesecon.queue:add_function("pipeworks:lc_tube_interrupt", function (pos, luac_id, iid) - -- There is no lua_tube anymore / it has been reprogrammed / replaced / burnt - if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end - if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end - run(pos, {type = "interrupt", iid = iid}) -end) +local function reset_formspec(meta, code, errmsg) + meta:set_string("code", code) + meta:mark_as_private("code") + code = minetest.formspec_escape(code or "") + errmsg = minetest.formspec_escape(tostring(errmsg or "")) + meta:set_string("formspec", "size[12,10]" + .."background[-0.2,-0.25;12.4,10.75;jeija_luac_background.png]" + .."label[0.1,8.3;"..errmsg.."]" + .."textarea[0.2,0.2;12.2,9.5;code;;"..code.."]" + .."image_button[4.75,8.75;2.5,1;jeija_luac_runbutton.png;program;]" + .."image_button_exit[11.72,-0.25;0.425,0.4;jeija_close_window.png;exit;]" + ) +end local function reset_meta(pos, code, errmsg) local meta = minetest.get_meta(pos) - meta:set_string("code", code) - code = minetest.formspec_escape(code or "") - errmsg = minetest.formspec_escape(tostring(errmsg or "")) - meta:set_string("formspec", "size[12,10]".. - "background[-0.2,-0.25;12.4,10.75;jeija_luac_background.png]".. - "textarea[0.2,0.2;12.2,9.5;code;;"..code.."]".. - "image_button[4.75,8.75;2.5,1;jeija_luac_runbutton.png;program;]".. - "image_button_exit[11.72,-0.25;0.425,0.4;jeija_close_window.png;exit;]".. - "label[0.1,9;"..errmsg.."]") + reset_formspec(meta, code, errmsg) meta:set_int("luac_id", math.random(1, 65535)) end +-- Wraps run_inner with LC-reset-on-error +local function run(pos, event) + local meta = minetest.get_meta(pos) + local code = meta:get_string("code") + local ok, errmsg, retval = run_inner(pos, code, event) + if not ok then + reset_meta(pos, code, errmsg) + else + reset_formspec(meta, code, errmsg) + end + return ok, errmsg, retval +end + local function reset(pos) set_port_states(pos, {red = false, blue = false, yellow = false, green = false, black = false, white = false}) end +local function node_timer(pos) + if minetest.registered_nodes[minetest.get_node(pos).name].is_burnt then + return false + end + run(pos, {type="interrupt"}) + return false +end + +----------------------- +-- A.Queue callbacks -- +----------------------- + +mesecon.queue:add_function("pipeworks:lc_tube_interrupt", function (pos, luac_id, iid) + -- There is no lua_tube anymore / it has been reprogrammed / replaced / burnt + if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end + if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end + run(pos, {type="interrupt", iid = iid}) +end) + +mesecon.queue:add_function("pipeworks:lt_digiline_relay", function (pos, channel, luac_id, msg) + if not digiline then return end + -- This check is only really necessary because in case of server crash, old actions can be thrown into the future + if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end + if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end + -- The actual work + digiline:receptor_send(pos, digiline_rules_luatube, channel, msg) +end) ----------------------- -- Node Registration -- @@ -558,6 +754,7 @@ local digiline = { receptor = {}, effector = { action = function(pos, node, channel, msg) + msg = clean_and_weigh_digiline_message(msg) run(pos, {type = "digiline", channel = channel, msg = msg}) end }, @@ -565,6 +762,18 @@ local digiline = { rules = pipeworks.digilines_rules }, } + +local function get_program(pos) + local meta = minetest.get_meta(pos) + return meta:get_string("code") +end + +local function set_program(pos, code) + reset(pos) + reset_meta(pos, code) + return run(pos, {type="program"}) +end + local function on_receive_fields(pos, form_name, fields, sender) if not fields.program then return @@ -574,12 +783,10 @@ local function on_receive_fields(pos, form_name, fields, sender) minetest.record_protection_violation(pos, name) return end - reset(pos) - reset_meta(pos, fields.code) - local succ, err = run(pos, {type="program"}) - if not succ then - print(err) - reset_meta(pos, fields.code, err) + local ok, err = set_program(pos, fields.code) + if not ok then + -- it's not an error from the server perspective + minetest.log("action", "Lua controller programming error: " .. tostring(err)) end end @@ -715,7 +922,11 @@ for white = 0, 1 do receptor = { state = mesecon.state.on, rules = output_rules[cid] - } + }, + luacontroller = { + get_program = get_program, + set_program = set_program, + }, } minetest.register_node(node_name, { @@ -723,6 +934,7 @@ for white = 0, 1 do drawtype = "nodebox", tiles = tiles, paramtype = "light", + is_ground_content = false, groups = groups, drop = BASENAME.."000000", sunlight_propagates = true, @@ -749,6 +961,7 @@ for white = 0, 1 do pipeworks.after_dig(pos, node) end, is_luacontroller = true, + on_timer = node_timer, tubelike = 1, tube = { connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1}, @@ -762,7 +975,7 @@ for white = 0, 1 do break end end - local succ, msg = run(pos, { + local succ, _, msg = run(pos, { type = "item", pin = src, itemstring = stack:to_string(), @@ -785,14 +998,6 @@ for white = 0, 1 do minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"}) pipeworks.scan_for_tube_objects(pos) end, - on_blast = function(pos, intensity) - if not intensity or intensity > 1 + 3^0.5 then - minetest.remove_node(pos) - return {string.format("%s_%s", name, dropname)} - end - minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"}) - pipeworks.scan_for_tube_objects(pos) - end, }) end end @@ -836,6 +1041,7 @@ minetest.register_node(BASENAME .. "_burnt", { tiles = tiles_burnt, is_burnt = true, paramtype = "light", + is_ground_content = false, groups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory=1}, drop = BASENAME.."000000", sunlight_propagates = true, diff --git a/ropes/functions.lua b/ropes/functions.lua index 0415ee6d..a4bd53d6 100644 --- a/ropes/functions.lua +++ b/ropes/functions.lua @@ -51,7 +51,9 @@ ropes.destroy_rope = function(pos, nodes) local finished = false local ids_to_destroy = {} for _, node in pairs(nodes) do - ids_to_destroy[minetest.get_content_id(node)] = true + if minetest.registered_nodes[node] then + ids_to_destroy[minetest.get_content_id(node)] = true + end end while not finished do diff --git a/stained_glass/depends.txt b/stained_glass/depends.txt deleted file mode 100644 index d3cd4e15..00000000 --- a/stained_glass/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -moreblocks -unifieddyes diff --git a/stained_glass/mod.conf b/stained_glass/mod.conf new file mode 100644 index 00000000..67ac73f0 --- /dev/null +++ b/stained_glass/mod.conf @@ -0,0 +1,2 @@ +name = stained_glass +depends = default, moreblocks, unifieddyes \ No newline at end of file diff --git a/technic/helpers.lua b/technic/helpers.lua index b89b180d..5361fa38 100644 --- a/technic/helpers.lua +++ b/technic/helpers.lua @@ -83,7 +83,7 @@ function technic.get_or_load_node(pos) local node = minetest.get_node_or_nil(pos) if node then return node end local vm = VoxelManip() - local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local _, _ = vm:read_from_map(pos, pos) return nil end diff --git a/technic/machines/HV/nuclear_reactor.lua b/technic/machines/HV/nuclear_reactor.lua index 231b6b36..c6ed4df7 100644 --- a/technic/machines/HV/nuclear_reactor.lua +++ b/technic/machines/HV/nuclear_reactor.lua @@ -455,7 +455,7 @@ minetest.register_node("technic:hv_nuclear_reactor_core_active", { technic_run = run, technic_on_disable = function(pos, node) local timer = minetest.get_node_timer(pos) - timer:start(1) + timer:start(1) end, on_timer = function(pos, node) local meta = minetest.get_meta(pos) diff --git a/technic/machines/LV/geothermal.lua b/technic/machines/LV/geothermal.lua index c66547ec..abe6951d 100644 --- a/technic/machines/LV/geothermal.lua +++ b/technic/machines/LV/geothermal.lua @@ -27,7 +27,7 @@ minetest.register_craftitem("technic:geothermal", { local check_node_around = function(pos) local node = minetest.get_node(pos) if node.name == "default:water_source" or node.name == "default:water_flowing" then return 1 end - if node.name == "default:lava_source" or node.name == "default:lava_flowing" then return 2 end + if node.name == "default:lava_source" or node.name == "default:lava_flowing" then return 2 end return 0 end diff --git a/technic/machines/LV/music_player.lua b/technic/machines/LV/music_player.lua index 262fe5f8..3bbb4412 100644 --- a/technic/machines/LV/music_player.lua +++ b/technic/machines/LV/music_player.lua @@ -24,7 +24,6 @@ local run = function(pos, node) local meta = minetest.get_meta(pos) local eu_input = meta:get_int("LV_EU_input") local machine_name = S("%s Music Player"):format("LV") - local machine_node = "technic:music_player" local demand = 150 local current_track = meta:get_int("current_track") diff --git a/technic/machines/LV/solar_panel.lua b/technic/machines/LV/solar_panel.lua index 6143fa9f..b3daedc3 100644 --- a/technic/machines/LV/solar_panel.lua +++ b/technic/machines/LV/solar_panel.lua @@ -51,7 +51,7 @@ minetest.register_node("technic:solar_panel", { technic_machine=1, technic_lv=1}, connect_sides = {"bottom"}, sounds = default.node_sound_wood_defaults(), - description = S("Small Solar %s Generator"):format("LV"), + description = S("Small Solar %s Generator"):format("LV"), active = false, drawtype = "nodebox", paramtype = "light", diff --git a/technic/machines/LV/water_mill.lua b/technic/machines/LV/water_mill.lua index ed3c1e10..e26224e9 100644 --- a/technic/machines/LV/water_mill.lua +++ b/technic/machines/LV/water_mill.lua @@ -29,8 +29,8 @@ end local run = function(pos, node) local meta = minetest.get_meta(pos) local water_flow = 0 - local production_level = 0 - local eu_supply = 0 + local production_level + local eu_supply local max_output = 4 * 45 -- keeping it around 180, little more than previous 150 :) local positions = { diff --git a/technic/machines/MV/hydro_turbine.lua b/technic/machines/MV/hydro_turbine.lua index 19dfebbe..0d4904c1 100644 --- a/technic/machines/MV/hydro_turbine.lua +++ b/technic/machines/MV/hydro_turbine.lua @@ -30,8 +30,8 @@ end local run = function(pos, node) local meta = minetest.get_meta(pos) local water_flow = 0 - local production_level = 0 - local eu_supply = 0 + local production_level + local eu_supply local max_output = 40 * 45 -- Generates 1800EU/s local positions = { diff --git a/technic/machines/MV/lighting.lua b/technic/machines/MV/lighting.lua index 8ff2702d..f7c91240 100644 --- a/technic/machines/MV/lighting.lua +++ b/technic/machines/MV/lighting.lua @@ -14,20 +14,7 @@ end function technic_homedecor_node_is_owned(pos, placer) local ownername = false - if type(IsPlayerNodeOwner) == "function" then -- node_ownership mod - if HasOwner(pos, placer) then - if not IsPlayerNodeOwner(pos, placer:get_player_name()) then - if type(getLastOwner) == "function" then -- ...is an old version - ownername = getLastOwner(pos) - elseif type(GetNodeOwnerName) == "function" then -- ...is a recent version - ownername = GetNodeOwnerName(pos) - else - ownername = S("someone") - end - end - end - - elseif type(isprotect) == "function" then -- glomie's protection mod + if type(isprotect) == "function" then -- glomie's protection mod if not isprotect(5, pos, placer) then ownername = S("someone") end @@ -45,7 +32,6 @@ function technic_homedecor_node_is_owned(pos, placer) end end -local dirs1 = {20, 23, 22, 21} local dirs2 = {9, 18, 7, 12} local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_thing) @@ -58,7 +44,6 @@ local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_t local under = pointed_thing.under local pitch = placer:get_look_pitch() local pname = minetest.get_node(under).name - local node = minetest.get_node(above) local fdir = minetest.dir_to_facedir(placer:get_look_dir()) local wield_name = itemstack:get_name() @@ -159,7 +144,7 @@ minetest.register_node('technic:homedecor_glowlight_half_yellow_active', { paramtype = "light", paramtype2 = "facedir", walkable = true, - light_source = LIGHT_MAX, + light_source = minetest.LIGHT_MAX, sounds = default.node_sound_wood_defaults(), groups = { snappy = 3, not_in_creative_inventory=1}, @@ -240,7 +225,7 @@ minetest.register_node('technic:homedecor_glowlight_quarter_yellow_active', { paramtype = "light", paramtype2 = "facedir", walkable = true, - light_source = LIGHT_MAX-1, + light_source = minetest.LIGHT_MAX-1, sounds = default.node_sound_wood_defaults(), groups = { snappy = 3, not_in_creative_inventory=1}, @@ -322,7 +307,7 @@ minetest.register_node('technic:homedecor_glowlight_half_white_active', { paramtype = "light", paramtype2 = "facedir", walkable = true, - light_source = LIGHT_MAX, + light_source = minetest.LIGHT_MAX, sounds = default.node_sound_wood_defaults(), groups = { snappy = 3, not_in_creative_inventory=1}, @@ -403,7 +388,7 @@ minetest.register_node('technic:homedecor_glowlight_quarter_white_active', { paramtype = "light", paramtype2 = "facedir", walkable = true, - light_source = LIGHT_MAX-1, + light_source = minetest.LIGHT_MAX-1, sounds = default.node_sound_wood_defaults(), groups = { snappy = 3, not_in_creative_inventory=1}, @@ -484,7 +469,7 @@ minetest.register_node('technic:homedecor_glowlight_small_cube_yellow_active', { paramtype = "light", paramtype2 = "facedir", walkable = true, - light_source = LIGHT_MAX-1, + light_source = minetest.LIGHT_MAX-1, sounds = default.node_sound_wood_defaults(), groups = { snappy = 3, not_in_creative_inventory=1}, @@ -565,7 +550,7 @@ minetest.register_node('technic:homedecor_glowlight_small_cube_white_active', { paramtype = "light", paramtype2 = "facedir", walkable = true, - light_source = LIGHT_MAX-1, + light_source = minetest.LIGHT_MAX-1, sounds = default.node_sound_wood_defaults(), groups = { snappy = 3, not_in_creative_inventory=1}, diff --git a/technic/machines/MV/power_radiator.lua b/technic/machines/MV/power_radiator.lua index 623af348..a5d2ed6a 100644 --- a/technic/machines/MV/power_radiator.lua +++ b/technic/machines/MV/power_radiator.lua @@ -177,8 +177,6 @@ minetest.register_abm({ -- The supply radius local rad = power_radius - local meta1 = nil - local pos1 = {} local used_charge = 0 -- Index all nodes within supply range diff --git a/technic/machines/MV/tool_workshop.lua b/technic/machines/MV/tool_workshop.lua index a220ac0e..678a1fd0 100644 --- a/technic/machines/MV/tool_workshop.lua +++ b/technic/machines/MV/tool_workshop.lua @@ -39,7 +39,6 @@ local run = function(pos, node) local inv = meta:get_inventory() local eu_input = meta:get_int("MV_EU_input") local machine_name = S("%s Tool Workshop"):format("MV") - local machine_node = "technic:tool_workshop" -- Setup meta data if it does not exist. if not eu_input then @@ -71,7 +70,7 @@ local run = function(pos, node) meta:set_int("MV_EU_demand", 0) return end - + if eu_input < workshop_demand[EU_upgrade+1] then meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) elseif eu_input >= workshop_demand[EU_upgrade+1] then @@ -105,7 +104,7 @@ minetest.register_node("technic:tool_workshop", { inv:set_size("src", 1) inv:set_size("upgrade1", 1) inv:set_size("upgrade2", 1) - end, + end, can_dig = technic.machine_can_dig, allow_metadata_inventory_put = technic.machine_inventory_put, allow_metadata_inventory_take = technic.machine_inventory_take, diff --git a/technic/machines/other/coal_alloy_furnace.lua b/technic/machines/other/coal_alloy_furnace.lua index 30db8ed3..c2de1511 100644 --- a/technic/machines/other/coal_alloy_furnace.lua +++ b/technic/machines/other/coal_alloy_furnace.lua @@ -77,14 +77,12 @@ minetest.register_abm({ action = function(pos, node, active_object_count, active_object_count_wider) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - + if inv:get_size("src") == 1 then -- Old furnace -> convert it inv:set_size("src", 2) inv:set_stack("src", 2, inv:get_stack("src2", 1)) inv:set_size("src2", 0) end - - local recipe = nil for i, name in pairs({ "fuel_totaltime", diff --git a/technic/machines/other/frames.lua b/technic/machines/other/frames.lua index b74d8062..e65902c7 100644 --- a/technic/machines/other/frames.lua +++ b/technic/machines/other/frames.lua @@ -1,7 +1,5 @@ local S = technic.getter -frames = {} - local infinite_stacks = minetest.settings:get_bool("creative_mode") and minetest.get_modpath("unified_inventory") == nil @@ -100,7 +98,7 @@ end local function add_table(table, toadd) local i = 1 while true do - o = table[i] + local o = table[i] if o == toadd then return end if o == nil then break end i = i + 1 @@ -261,8 +259,8 @@ for zp = 0, 1 do sunlight_propagates = true, frame_connect_all = function(nodename) - l2 = {} - l1 = { + local l2 = {} + local l1 = { { x = -1, y = 0, z = 0 }, { x = 1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 }, { x = 0, y = 1, z = 0 }, { x = 0, y = 0, z = -1 }, { x = 0, y = 0, z = 1 } @@ -311,7 +309,7 @@ for zp = 0, 1 do local node = minetest.get_node(pos) if node.name ~= "air" then if is_supported_node(node.name) then - obj = minetest.add_entity(pos, "technic:frame_entity") + local obj = minetest.add_entity(pos, "technic:frame_entity") obj:get_luaentity():set_node({ name = itemstack:get_name() }) end else @@ -349,8 +347,8 @@ for zp = 0, 1 do end -- Run script hook - local _, callback - for _, callback in ipairs(minetest.registered_on_placenodes) do + local callback = nil + for _, _ in ipairs(minetest.registered_on_placenodes) do -- Copy pos and node because callback can modify them local pos_copy = { x = pos.x, y = pos.y, z = pos.z } local newnode_copy = { name = def.name, param1 = 0, param2 = 0 } @@ -364,7 +362,7 @@ for zp = 0, 1 do itemstack:take_item() end - obj = minetest.add_entity(pos, "technic:frame_entity") + local obj = minetest.add_entity(pos, "technic:frame_entity") obj:get_luaentity():set_node({ name = node.name }) return itemstack @@ -414,7 +412,7 @@ minetest.register_entity("technic:frame_entity", { item_texture = minetest.registered_items[itemname].inventory_image item_type = minetest.registered_items[itemname].type end - prop = { + local prop = { is_visible = true, textures = { node.name }, } @@ -589,7 +587,7 @@ local function connected(pos, c, adj) end local function get_connected_nodes(pos) - c = { pos } + local c = { pos } local nodename = minetest.get_node(pos).name if frames_pos[pos_to_string(pos)] then nodename = frames_pos[pos_to_string(pos)] @@ -695,7 +693,7 @@ local function swap_template(pos, new) local saved_node = meta:get_string("saved_node") meta:set_string("saved_node", "") technic.swap_node(pos, new) - local meta = minetest.get_meta(pos) + meta = minetest.get_meta(pos) meta:set_string("saved_node", saved_node) end @@ -857,7 +855,7 @@ minetest.register_node("technic:template_disabled", { on_destruct = template_on_destruct, after_dig_node = template_drops, on_punch = function(pos, node, puncher) - local meta = minetest.get_meta(pos) + local _ = minetest.get_meta(pos) swap_template(pos, "technic:template_connector") end }) diff --git a/technic/machines/other/injector.lua b/technic/machines/other/injector.lua index c1926142..2bf85b63 100644 --- a/technic/machines/other/injector.lua +++ b/technic/machines/other/injector.lua @@ -40,7 +40,7 @@ local function inject_items (pos) end end end - + end minetest.register_craft({ diff --git a/technic/machines/register/battery_box.lua b/technic/machines/register/battery_box.lua index bf4d96a5..af8fd60d 100644 --- a/technic/machines/register/battery_box.lua +++ b/technic/machines/register/battery_box.lua @@ -312,7 +312,6 @@ function technic.register_battery_box(data) local charge = meta:get_int("internal_EU_charge") local cpercent = math.floor(charge / max_charge * 100) local inv = meta:get_inventory() - local node = minetest.get_node(pos) meta:set_string("infotext", S("%s Battery Box"):format(tier)) meta:set_string("formspec", formspec..add_on_off_buttons(meta, ltier, cpercent)) meta:set_string("channel", ltier.."_battery_box"..minetest.pos_to_string(pos)) @@ -335,7 +334,6 @@ function technic.register_battery_box(data) after_dig_node = technic.machine_after_dig_node, on_receive_fields = function(pos, formname, fields, sender) local meta = minetest.get_meta(pos) - local nodename = minetest.get_node(pos).name if fields.edit_channel then minetest.show_formspec(sender:get_player_name(), "technic:battery_box_edit_channel"..minetest.pos_to_string(pos), @@ -344,7 +342,7 @@ function technic.register_battery_box(data) or fields["fs_helpers_cycling:0:split_dst_stacks"] or fields["fs_helpers_cycling:1:split_src_stacks"] or fields["fs_helpers_cycling:1:split_dst_stacks"] then - local meta = minetest.get_meta(pos) + meta = minetest.get_meta(pos) if not pipeworks.may_configure(pos, sender) then return end fs_helpers.on_receive_fields(pos, fields) local EU_upgrade, tube_upgrade = 0, 0 diff --git a/technic/machines/register/common.lua b/technic/machines/register/common.lua index 9d88702a..0e7658be 100644 --- a/technic/machines/register/common.lua +++ b/technic/machines/register/common.lua @@ -65,7 +65,7 @@ function technic.send_items(pos, x_velocity, z_velocity, output_name) if output_name == nil then output_name = "dst" end - + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local i = 0 @@ -84,7 +84,6 @@ function technic.send_items(pos, x_velocity, z_velocity, output_name) end end - function technic.smelt_item(meta, result, speed) local inv = meta:get_inventory() meta:set_int("cook_time", meta:get_int("cook_time") + 1) @@ -109,10 +108,9 @@ function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function) if send_function == nil then send_function = technic.send_items end - + local node = minetest.get_node(pos) local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() local pos1 = vector.new(pos) local x_velocity = 0 local z_velocity = 0 diff --git a/technic/machines/register/generator.lua b/technic/machines/register/generator.lua index f8d7e6a6..9120e29a 100644 --- a/technic/machines/register/generator.lua +++ b/technic/machines/register/generator.lua @@ -41,9 +41,9 @@ function technic.register_generator(data) "image[4,1;1,1;default_furnace_fire_bg.png]".. "list[current_player;main;0,5;8,4;]".. "listring[]" - + local desc = S("Fuel-Fired %s Generator"):format(tier) - + local run = function(pos, node) local meta = minetest.get_meta(pos) local burn_time = meta:get_int("burn_time") @@ -162,7 +162,6 @@ function technic.register_generator(data) fs_helpers.on_receive_fields(pos, fields) local meta = minetest.get_meta(pos) local node = minetest.get_node(pos) - local form = generator_formspec local form_buttons = "" if not string.find(node.name, ":lv_") then form_buttons = fs_helpers.cycling_button( @@ -204,15 +203,15 @@ function technic.register_generator(data) technic_run = run, technic_on_disable = function(pos, node) local timer = minetest.get_node_timer(pos) - timer:start(1) - end, + timer:start(1) + end, on_timer = function(pos, node) local meta = minetest.get_meta(pos) local node = minetest.get_node(pos) -- Connected back? if meta:get_int(tier.."_EU_timeout") > 0 then return false end - + local burn_time = meta:get_int("burn_time") or 0 if burn_time <= 0 then diff --git a/technic/machines/register/grindings.lua b/technic/machines/register/grindings.lua index 9231166c..32387259 100644 --- a/technic/machines/register/grindings.lua +++ b/technic/machines/register/grindings.lua @@ -1,6 +1,5 @@ local S = technic.getter local moretrees = minetest.get_modpath("moretrees") -local mesecons_materials = minetest.get_modpath("mesecons_materials") local dye = minetest.get_modpath("dye") -- sawdust, the finest wood/tree grinding diff --git a/technic/machines/register/machine_base.lua b/technic/machines/register/machine_base.lua index 2965ba50..ea3faa99 100644 --- a/technic/machines/register/machine_base.lua +++ b/technic/machines/register/machine_base.lua @@ -38,6 +38,8 @@ function technic.register_base_machine(data) local machine_desc = data.machine_desc local tier = data.tier local ltier = string.lower(tier) + + data.modname = data.modname or minetest.get_current_modname() local groups = {cracky = 2, technic_machine = 1, ["technic_"..ltier] = 1} if data.tube then @@ -82,7 +84,7 @@ function technic.register_base_machine(data) local eu_input = meta:get_int(tier.."_EU_input") local machine_desc_tier = machine_desc:format(tier) - local machine_node = "technic:"..ltier.."_"..machine_name + local machine_node = data.modname..":"..ltier.."_"..machine_name local machine_demand = data.demand -- Setup meta data if it does not exist. @@ -157,15 +159,15 @@ function technic.register_base_machine(data) tentry = "" end - minetest.register_node("technic:"..ltier.."_"..machine_name, { + minetest.register_node(data.modname..":"..ltier.."_"..machine_name, { description = machine_desc:format(tier), tiles = { - "technic_"..ltier.."_"..machine_name.."_top.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_bottom.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_side.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_side.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_side.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_front.png" + data.modname.."_"..ltier.."_"..machine_name.."_top.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_bottom.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_front.png" }, paramtype2 = "facedir", groups = groups, @@ -227,18 +229,18 @@ function technic.register_base_machine(data) end, }) - minetest.register_node("technic:"..ltier.."_"..machine_name.."_active",{ + minetest.register_node(data.modname..":"..ltier.."_"..machine_name.."_active",{ description = machine_desc:format(tier), tiles = { - "technic_"..ltier.."_"..machine_name.."_top.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_bottom.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_side.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_side.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_side.png"..tentry, - "technic_"..ltier.."_"..machine_name.."_front_active.png" + data.modname.."_"..ltier.."_"..machine_name.."_top.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_bottom.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_front_active.png" }, paramtype2 = "facedir", - drop = "technic:"..ltier.."_"..machine_name, + drop = data.modname..":"..ltier.."_"..machine_name, groups = active_groups, connect_sides = data.connect_sides or connect_default, legacy_facedir_simple = true, @@ -249,7 +251,7 @@ function technic.register_base_machine(data) allow_metadata_inventory_take = technic.machine_inventory_take, allow_metadata_inventory_move = technic.machine_inventory_move, technic_run = run, - technic_disabled_machine_name = "technic:"..ltier.."_"..machine_name, + technic_disabled_machine_name = data.modname..":"..ltier.."_"..machine_name, on_receive_fields = function(pos, formname, fields, sender) local node = minetest.get_node(pos) if not pipeworks.may_configure(pos, sender) then return end @@ -271,8 +273,8 @@ function technic.register_base_machine(data) end, }) - technic.register_machine(tier, "technic:"..ltier.."_"..machine_name, technic.receiver) - technic.register_machine(tier, "technic:"..ltier.."_"..machine_name.."_active", technic.receiver) + technic.register_machine(tier, data.modname..":"..ltier.."_"..machine_name, technic.receiver) + technic.register_machine(tier, data.modname..":"..ltier.."_"..machine_name.."_active", technic.receiver) end -- End registration diff --git a/technic/machines/register/recipes.lua b/technic/machines/register/recipes.lua index f9e24587..921d1c8f 100644 --- a/technic/machines/register/recipes.lua +++ b/technic/machines/register/recipes.lua @@ -39,7 +39,7 @@ local function register_recipe(typename, data) else data.output = ItemStack(data.output):to_string() end - + local recipe = {time = data.time, input = {}, output = data.output} local index = get_recipe_index(data.input) if not index then @@ -49,7 +49,7 @@ local function register_recipe(typename, data) for _, stack in ipairs(data.input) do recipe.input[ItemStack(stack):get_name()] = ItemStack(stack):get_count() end - + technic.recipes[typename].recipes[index] = recipe if have_ui and technic.recipes[typename].output_size == 1 then unified_inventory.register_craft({ diff --git a/technic/machines/register/solar_array.lua b/technic/machines/register/solar_array.lua index 03f11d92..443ac909 100644 --- a/technic/machines/register/solar_array.lua +++ b/technic/machines/register/solar_array.lua @@ -56,7 +56,6 @@ function technic.register_solar_array(data) }, on_construct = function(pos) local meta = minetest.get_meta(pos) - local name = minetest.get_node(pos).name meta:set_int(tier.."_EU_supply", 0) end, technic_run = run, diff --git a/technic/machines/switching_station.lua b/technic/machines/switching_station.lua index 7f3a0b9f..56a0db03 100644 --- a/technic/machines/switching_station.lua +++ b/technic/machines/switching_station.lua @@ -249,12 +249,8 @@ minetest.register_abm({ action = function(pos, node, active_object_count, active_object_count_wider) if not technic.powerctrl_state then return end local meta = minetest.get_meta(pos) - local meta1 = nil + local meta1 local pos1 = {} - local PR_EU = 0 -- EUs from PR nodes - local BA_PR_EU = 0 -- EUs from BA nodes (discharching) - local BA_RE_EU = 0 -- EUs to BA nodes (charging) - local RE_EU = 0 -- EUs to RE nodes local tier = "" local PR_nodes diff --git a/technic/radiation.lua b/technic/radiation.lua index e4ed5c5a..4f511abb 100644 --- a/technic/radiation.lua +++ b/technic/radiation.lua @@ -244,7 +244,6 @@ to be safe, and limits the range at which source/player interactions need to be considered. --]] local abdomen_offset = 1 -local cache_scaled_shielding = {} local rad_dmg_cutoff = 0.2 local radiated_players = {} diff --git a/technic/tools/flashlight.lua b/technic/tools/flashlight.lua index a4ac608f..84decbb4 100644 --- a/technic/tools/flashlight.lua +++ b/technic/tools/flashlight.lua @@ -99,7 +99,7 @@ minetest.register_globalstep(function(dtime) if node and node.name == "air" then minetest.set_node(rounded_pos, {name="technic:light"}) end - local node = minetest.get_node_or_nil(old_pos) + node = minetest.get_node_or_nil(old_pos) if node and node.name == "technic:light" then minetest.remove_node(old_pos) end @@ -118,6 +118,6 @@ minetest.register_node("technic:light", { walkable = false, buildable_to = true, sunlight_propagates = true, - light_source = LIGHT_MAX, + light_source = minetest.LIGHT_MAX, pointable = false, }) diff --git a/technic/tools/mining_drill.lua b/technic/tools/mining_drill.lua index cb16914d..09ebdf9f 100644 --- a/technic/tools/mining_drill.lua +++ b/technic/tools/mining_drill.lua @@ -51,13 +51,15 @@ local function drill_dig_it0 (pos,player) minetest.record_protection_violation(pos, player:get_player_name()) return end - local node=minetest.get_node(pos) + local node = minetest.get_node(pos) if node.name == "air" or node.name == "ignore" then return end if node.name == "default:lava_source" then return end if node.name == "default:lava_flowing" then return end if node.name == "default:water_source" then minetest.remove_node(pos) return end if node.name == "default:water_flowing" then minetest.remove_node(pos) return end - minetest.node_dig(pos,node,player) + local def = minetest.registered_nodes[node.name] + if not def then return end + def.on_dig(pos, node, player) end local function drill_dig_it1 (player) @@ -154,9 +156,9 @@ local function drill_dig_it(pos, player, mode) if mode == 1 then drill_dig_it0(pos, player) end - + if mode == 2 then -- 3 deep - dir = drill_dig_it1(player) + local dir = drill_dig_it1(player) if dir == 0 then -- x+ drill_dig_it0(pos, player) pos.x = pos.x + 1 @@ -186,9 +188,9 @@ local function drill_dig_it(pos, player, mode) drill_dig_it0 (pos,player) end end - + if mode==3 then -- 3 wide - dir=drill_dig_it1(player) + local dir = drill_dig_it1(player) if dir==0 or dir==1 then -- x drill_dig_it0 (pos,player) pos.z=pos.z+1 @@ -204,7 +206,7 @@ local function drill_dig_it(pos, player, mode) drill_dig_it0 (pos,player) end end - + if mode==4 then -- 3 tall, selected in the middle drill_dig_it0 (pos,player) pos.y=pos.y-1 @@ -227,7 +229,7 @@ local function drill_dig_it(pos, player, mode) drill_dig_it4(pos,player) end end - + minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,}) end @@ -240,6 +242,7 @@ end local function mining_drill_mk2_setmode(user,itemstack) local player_name=user:get_player_name() local item=itemstack:to_table() + local mode = nil local meta=minetest.deserialize(item["metadata"]) if meta==nil then meta={} @@ -286,7 +289,6 @@ end local function mining_drill_mk2_handler(itemstack, user, pointed_thing) local keys = user:get_player_control() - local player_name = user:get_player_name() local meta = minetest.deserialize(itemstack:get_metadata()) if not meta or not meta.mode or keys.sneak then return mining_drill_mk2_setmode(user, itemstack) @@ -309,7 +311,6 @@ end local function mining_drill_mk3_handler(itemstack, user, pointed_thing) local keys = user:get_player_control() - local player_name = user:get_player_name() local meta = minetest.deserialize(itemstack:get_metadata()) if not meta or not meta.mode or keys.sneak then return mining_drill_mk3_setmode(user, itemstack) diff --git a/technic/tools/mining_lasers.lua b/technic/tools/mining_lasers.lua index 208b7197..e4dd178a 100644 --- a/technic/tools/mining_lasers.lua +++ b/technic/tools/mining_lasers.lua @@ -46,7 +46,7 @@ local function laser_node(pos, node, player) }) return end - minetest.node_dig(pos, node, player) + def.on_dig(pos, node, player) end local keep_node = {air = true} diff --git a/technic/tools/vacuum.lua b/technic/tools/vacuum.lua index 86e6b644..7b01af88 100644 --- a/technic/tools/vacuum.lua +++ b/technic/tools/vacuum.lua @@ -44,7 +44,7 @@ minetest.register_tool("technic:vacuum", { end end end - + technic.set_RE_wear(itemstack, meta.charge, vacuum_max_charge) itemstack:set_metadata(minetest.serialize(meta)) return itemstack diff --git a/technic_chests/register.lua b/technic_chests/register.lua index 9f63617b..f8b108ba 100644 --- a/technic_chests/register.lua +++ b/technic_chests/register.lua @@ -84,7 +84,6 @@ end local function set_formspec(pos, data, page) local meta = minetest.get_meta(pos) - local node = minetest.get_node(pos) local formspec = data.base_formspec formspec = formspec..fs_helpers.cycling_button( meta, diff --git a/technic_cnc/cnc.lua b/technic_cnc/cnc.lua index 1116aee8..cb81bd48 100644 --- a/technic_cnc/cnc.lua +++ b/technic_cnc/cnc.lua @@ -72,7 +72,6 @@ else end end -local shape = {} local onesize_products = { slope = 2, slope_edge = 1, diff --git a/technic_cnc/cnc_api.lua b/technic_cnc/cnc_api.lua index c33ef49a..3026b474 100644 --- a/technic_cnc/cnc_api.lua +++ b/technic_cnc/cnc_api.lua @@ -237,7 +237,7 @@ technic_cnc.programs = { type = "fixed", fixed = { { 4/16, -8/16, 4/16, 8/16, 8/16, 8/16 }, - { 0, -8/16, 0, 4/16, 8/16, 8/16 }, + { 0, -8/16, 0, 4/16, 8/16, 8/16 }, { -4/16, -8/16, -4/16, 0, 8/16, 8/16 }, { -8/16, -8/16, -8/16, -4/16, 8/16, 8/16 } } @@ -257,7 +257,7 @@ technic_cnc.programs = { } } }, - + } -- Allow disabling certain programs for some node. Default is allowing all types for all nodes diff --git a/unified_inventory/.luacheckrc b/unified_inventory/.luacheckrc index 709c485e..9fb6a7c1 100644 --- a/unified_inventory/.luacheckrc +++ b/unified_inventory/.luacheckrc @@ -12,6 +12,8 @@ read_globals = { "minetest", "vector", "ItemStack", "datastorage", + + "hb", } files["callbacks.lua"].ignore = { "player", "draw_lite_mode" } diff --git a/unified_inventory/api.lua b/unified_inventory/api.lua index d24135b2..81dd8f35 100644 --- a/unified_inventory/api.lua +++ b/unified_inventory/api.lua @@ -188,7 +188,9 @@ function unified_inventory.go_home(player) local pos = unified_inventory.home_pos[player:get_player_name()] if pos then player:set_pos(pos) + return true end + return false end -- register_craft diff --git a/unified_inventory/depends.txt b/unified_inventory/depends.txt deleted file mode 100644 index cb3d2b4f..00000000 --- a/unified_inventory/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default -creative? -sfinv? -datastorage? -farming? diff --git a/unified_inventory/description.txt b/unified_inventory/description.txt deleted file mode 100644 index b541fdf2..00000000 --- a/unified_inventory/description.txt +++ /dev/null @@ -1 +0,0 @@ -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/unified_inventory/item_names.lua b/unified_inventory/item_names.lua index 111c9ee6..a1368f88 100644 --- a/unified_inventory/item_names.lua +++ b/unified_inventory/item_names.lua @@ -2,24 +2,24 @@ local item_names = {} -- [player_name] = { hud, dtime, itemname } local dlimit = 3 -- HUD element will be hidden after this many seconds -local air_hud_mod = minetest.get_modpath("4air") -local hud_mod = minetest.get_modpath("hud") local hudbars_mod = minetest.get_modpath("hudbars") local function set_hud(player) local player_name = player:get_player_name() - local off = {x=0, y=-70} - if air_hud_mod or hud_mod then - off.y = off.y - 20 - elseif hudbars_mod then - off.y = off.y + 13 + local off = {x=0, y=-65} + if hudbars_mod then + -- Assume no alignment (2 per line) + off.y = off.y - math.ceil(hb.hudbars_count / 2) * 25 + else + off.y = off.y - 25 end + item_names[player_name] = { hud = player:hud_add({ hud_elem_type = "text", position = {x=0.5, y=1}, offset = off, - alignment = {x=0, y=0}, + alignment = {x=0, y=-1}, number = 0xFFFFFF, text = "", }), diff --git a/unified_inventory/mod.conf b/unified_inventory/mod.conf index 4fe3375f..bca70ca6 100644 --- a/unified_inventory/mod.conf +++ b/unified_inventory/mod.conf @@ -1,4 +1,7 @@ name = unified_inventory depends = default optional_depends = 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. +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/unified_inventory/register.lua b/unified_inventory/register.lua index f958a6d4..017e4afd 100644 --- a/unified_inventory/register.lua +++ b/unified_inventory/register.lua @@ -76,9 +76,9 @@ unified_inventory.register_button("home_gui_go", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {home=true}) then - minetest.sound_play("teleport", - {to_player=player:get_player_name(), gain = 1.0}) - unified_inventory.go_home(player) + if unified_inventory.go_home(player) then + minetest.sound_play("teleport", {to_player = player_name}) + end else minetest.chat_send_player(player_name, S("You don't have the \"home\" privilege!")) diff --git a/unifieddyes/init.lua b/unifieddyes/init.lua index 8924294e..c9107e30 100644 --- a/unifieddyes/init.lua +++ b/unifieddyes/init.lua @@ -193,7 +193,7 @@ minetest.register_on_placenode( -- The complementary function: strip-off the color if the node being dug is still white/neutral local function move_item(item, pos, inv, digger) - if not digger then return end + if not (digger and digger:is_player()) then return end local creative = creative_mode or minetest.check_player_privs(digger, "creative") if inv:room_for_item("main", item) and (not creative or not inv:contains_item("main", item, true)) then