From dfb4dbd496e8814b5bc84da085ad7d467c777102 Mon Sep 17 00:00:00 2001 From: runs Date: Sun, 27 Mar 2022 22:02:06 +0200 Subject: [PATCH] pre-alpha 2 --- mods/LICENSE.md | 21 + mods/bedz/api.lua | 6 + mods/bedz/locale/bedz.es.tr | 1 + mods/bedz/sounds/bedz_yawn.ogg | Bin 0 -> 28896 bytes mods/bucket/init.lua | 9 +- mods/bucket/locale/bucket.es.tr | 2 + mods/eat/init.lua | 1 + mods/eat/sounds/eat_chewing.ogg | Bin 0 -> 11695 bytes mods/farmz/api.lua | 53 +- mods/farmz/food.lua | 20 + mods/farmz/grasses.lua | 9 + mods/farmz/hoes.lua | 5 +- mods/farmz/init.lua | 1 + mods/farmz/locale/farmz.es.tr | 3 + mods/farmz/plants.lua | 9 +- mods/farmz/textures/farmz_bread.png | Bin 0 -> 642 bytes mods/farmz/textures/farmz_flour.png | Bin 0 -> 573 bytes mods/farmz/textures/farmz_hoe_steel.png | Bin 0 -> 594 bytes mods/farmz/textures/farmz_wheat.png | Bin 0 -> 634 bytes mods/flowers/flowers.lua | 2 +- mods/flowers/textures/flowers_dahlia.png | Bin 669 -> 572 bytes mods/mapgen/init.lua | 48 + mods/minetest_schemedit-1.5.0-82afdd8/LICENSE | 16 + .../README.md | 39 + .../minetest_schemedit-1.5.0-82afdd8/USAGE.md | 44 + .../minetest_schemedit-1.5.0-82afdd8/init.lua | 1429 +++++++++++++++++ .../locale/schemedit.de.tr | 82 + .../locale/template.txt | 82 + .../make_readme.lua | 69 + .../minetest_schemedit-1.5.0-82afdd8/mod.conf | 4 + .../screenshot.png | Bin 0 -> 49064 bytes .../settingtypes.txt | 3 + .../textures/schemedit_border.png | Bin 0 -> 102 bytes .../textures/schemedit_creator.png | Bin 0 -> 97 bytes .../textures/schemedit_creator_bottom.png | Bin 0 -> 123 bytes .../textures/schemedit_creator_sides.png | Bin 0 -> 89 bytes .../textures/schemedit_creator_top.png | Bin 0 -> 128 bytes .../textures/schemedit_probtool.png | Bin 0 -> 159 bytes .../textures/schemedit_void.png | Bin 0 -> 116 bytes mods/nodez/dirt.lua | 1 - mods/nodez/locale/nodez.es.tr | 1 + mods/nodez/stone.lua | 18 + mods/nodez/textures/nodez_silex.png | Bin 0 -> 629 bytes mods/nodez/water.lua | 4 + mods/playerz/hunger.lua | 12 + mods/sound/init.lua | 14 + mods/tools/axes.lua | 27 + mods/tools/hand.lua | 45 + mods/tools/init.lua | 371 +---- mods/tools/locale/tools.es.tr | 11 + mods/tools/pickaxes.lua | 34 + mods/tools/shears.lua | 16 + mods/tools/shovels.lua | 20 + mods/tools/swords.lua | 49 + mods/tools/textures/tools_ironaxe.png | Bin 0 -> 577 bytes ...s_steeldagger.png => tools_irondagger.png} | Bin mods/tools/textures/tools_ironpick.png | Bin 0 -> 645 bytes ...s_steelshears.png => tools_ironshears.png} | Bin mods/tools/textures/tools_ironshovel.png | Bin 0 -> 648 bytes ...ols_steelsword.png => tools_ironsword.png} | Bin mods/tools/textures/tools_steelaxe.png | Bin 131 -> 0 bytes mods/tools/textures/tools_steelpick.png | Bin 629 -> 0 bytes mods/tools/textures/tools_steelpick_l1.png | Bin 190 -> 0 bytes mods/tools/textures/tools_steelpick_l2.png | Bin 177 -> 0 bytes mods/tools/textures/tools_steelshovel.png | Bin 140 -> 0 bytes mods/tools/textures/tools_stoneaxe.png | Bin 130 -> 695 bytes mods/tools/textures/tools_stoneshears.png | Bin 224 -> 0 bytes mods/tools/textures/tools_stoneshovel.png | Bin 134 -> 0 bytes mods/tools/textures/tools_stonesword.png | Bin 159 -> 0 bytes mods/tools/textures/tools_woodaxe.png | Bin 121 -> 0 bytes mods/tools/textures/tools_woodpick.png | Bin 149 -> 0 bytes mods/tools/textures/tools_woodshears.png | Bin 212 -> 0 bytes mods/tools/textures/tools_woodshovel.png | Bin 133 -> 0 bytes mods/tools/textures/tools_woodsword.png | Bin 139 -> 0 bytes mods/treez/api.lua | 31 +- mods/treez/locale/treez.es.tr | 5 +- mods/treez/schematics/chestnut_tree.mts | Bin 0 -> 204 bytes mods/treez/textures/treez_apple_inv.png | Bin 634 -> 639 bytes .../textures/treez_apple_tree_sapling.png | Bin 7156 -> 662 bytes mods/treez/textures/treez_cherries_inv.png | Bin 6977 -> 6967 bytes mods/treez/textures/treez_chestnut.png | Bin 0 -> 622 bytes mods/treez/textures/treez_chestnut_burr.png | Bin 0 -> 605 bytes .../textures/treez_chestnut_burr_inv.png | Bin 0 -> 609 bytes .../textures/treez_chestnut_tree_leaves.png | Bin 0 -> 610 bytes .../textures/treez_chestnut_tree_sapling.png | Bin 0 -> 665 bytes .../textures/treez_chestnut_tree_trunk.png | Bin 0 -> 633 bytes .../treez_chestnut_tree_trunk_top.png | Bin 0 -> 591 bytes .../textures/treez_chestnut_tree_wood.png | Bin 0 -> 619 bytes mods/treez/trees.lua | 37 +- 89 files changed, 2275 insertions(+), 379 deletions(-) create mode 100644 mods/LICENSE.md create mode 100644 mods/bedz/sounds/bedz_yawn.ogg create mode 100644 mods/bucket/locale/bucket.es.tr create mode 100644 mods/eat/sounds/eat_chewing.ogg create mode 100644 mods/farmz/food.lua create mode 100644 mods/farmz/textures/farmz_bread.png create mode 100644 mods/farmz/textures/farmz_flour.png create mode 100644 mods/farmz/textures/farmz_hoe_steel.png create mode 100644 mods/farmz/textures/farmz_wheat.png create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/LICENSE create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/README.md create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/USAGE.md create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/init.lua create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/locale/schemedit.de.tr create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/locale/template.txt create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/make_readme.lua create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/mod.conf create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/screenshot.png create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/settingtypes.txt create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_border.png create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator.png create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_bottom.png create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_sides.png create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_top.png create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_probtool.png create mode 100644 mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_void.png create mode 100644 mods/nodez/textures/nodez_silex.png create mode 100644 mods/tools/axes.lua create mode 100644 mods/tools/hand.lua create mode 100644 mods/tools/locale/tools.es.tr create mode 100644 mods/tools/pickaxes.lua create mode 100644 mods/tools/shears.lua create mode 100644 mods/tools/shovels.lua create mode 100644 mods/tools/swords.lua create mode 100644 mods/tools/textures/tools_ironaxe.png rename mods/tools/textures/{tools_steeldagger.png => tools_irondagger.png} (100%) create mode 100644 mods/tools/textures/tools_ironpick.png rename mods/tools/textures/{tools_steelshears.png => tools_ironshears.png} (100%) create mode 100644 mods/tools/textures/tools_ironshovel.png rename mods/tools/textures/{tools_steelsword.png => tools_ironsword.png} (100%) delete mode 100644 mods/tools/textures/tools_steelaxe.png delete mode 100644 mods/tools/textures/tools_steelpick.png delete mode 100644 mods/tools/textures/tools_steelpick_l1.png delete mode 100644 mods/tools/textures/tools_steelpick_l2.png delete mode 100644 mods/tools/textures/tools_steelshovel.png delete mode 100644 mods/tools/textures/tools_stoneshears.png delete mode 100644 mods/tools/textures/tools_stoneshovel.png delete mode 100644 mods/tools/textures/tools_stonesword.png delete mode 100644 mods/tools/textures/tools_woodaxe.png delete mode 100644 mods/tools/textures/tools_woodpick.png delete mode 100644 mods/tools/textures/tools_woodshears.png delete mode 100644 mods/tools/textures/tools_woodshovel.png delete mode 100644 mods/tools/textures/tools_woodsword.png create mode 100644 mods/treez/schematics/chestnut_tree.mts create mode 100644 mods/treez/textures/treez_chestnut.png create mode 100644 mods/treez/textures/treez_chestnut_burr.png create mode 100644 mods/treez/textures/treez_chestnut_burr_inv.png create mode 100644 mods/treez/textures/treez_chestnut_tree_leaves.png create mode 100644 mods/treez/textures/treez_chestnut_tree_sapling.png create mode 100644 mods/treez/textures/treez_chestnut_tree_trunk.png create mode 100644 mods/treez/textures/treez_chestnut_tree_trunk_top.png create mode 100644 mods/treez/textures/treez_chestnut_tree_wood.png diff --git a/mods/LICENSE.md b/mods/LICENSE.md new file mode 100644 index 0000000..c155b76 --- /dev/null +++ b/mods/LICENSE.md @@ -0,0 +1,21 @@ +# Minetest + +- The engine to use with this game is Minetest. +- Site: http://www.minetest.net + +# Images + +- Author: Juanchi +- License: CC BY 4.0 (Attribution 4.0 International) + +# Sounds + +## bedz_yawn.ogg +- Author: ArrowheadProductions +- License: This work is licensed under the Creative Commons 0 License. +- Site: https://freesound.org/people/ArrowheadProductions/sounds/564231/ + +## eat_chewing.ogg +- Author: InspectorJ +- License: This work is licensed under the Attribution License. +- Site: https://freesound.org/people/InspectorJ/sounds/412068/ diff --git a/mods/bedz/api.lua b/mods/bedz/api.lua index 8d9762c..4c1880d 100644 --- a/mods/bedz/api.lua +++ b/mods/bedz/api.lua @@ -118,6 +118,7 @@ local function awake(player, rest_hours) if rest_hours then rest_player(player, rest_hours) playerz.change_hunger(player, -(rest_hours*(playerz.max_hunger/playerz.starving_hours))) --decrease hunger + sound.play("player", player, "bedz_yawn") end return true else @@ -231,6 +232,11 @@ local function use_bed(pos, player) end end + --Check if player is hungry + if playerz.is_starving(player) then + return false, "You are hungry" + end + if bedside == player_name then return false, S("You are already in bed") elseif not(bedside == "") then diff --git a/mods/bedz/locale/bedz.es.tr b/mods/bedz/locale/bedz.es.tr index 3de7038..f68fe64 100644 --- a/mods/bedz/locale/bedz.es.tr +++ b/mods/bedz/locale/bedz.es.tr @@ -7,4 +7,5 @@ hours=horas Leave Bed=Abandonar cama This bed is already occupied=Esta cama ya está ocupada You are already in bed=Ya estás en cama +You are hungry=Estás hambriento You have slept=Has dormido diff --git a/mods/bedz/sounds/bedz_yawn.ogg b/mods/bedz/sounds/bedz_yawn.ogg new file mode 100644 index 0000000000000000000000000000000000000000..84e47dad630f9c527b4f731b04395e84cc3c375c GIT binary patch literal 28896 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 F{{a=+m@@zX literal 0 HcmV?d00001 diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index ff58b06..0bc023e 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -1,8 +1,13 @@ +bucket = {} + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local S = minetest.get_translator(modname) + -- Bucket: Punch liquid source or flowing liquid to collect it minetest.register_tool("bucket:bucket", { - description = "Bucket".."\n".. - "Picks up liquid nodes", + description = S("Bucket"), inventory_image = "bucket.png", stack_max = 1, liquids_pointable = true, diff --git a/mods/bucket/locale/bucket.es.tr b/mods/bucket/locale/bucket.es.tr new file mode 100644 index 0000000..93079cb --- /dev/null +++ b/mods/bucket/locale/bucket.es.tr @@ -0,0 +1,2 @@ +# textdomain: bucket +Bucket=Cubo diff --git a/mods/eat/init.lua b/mods/eat/init.lua index e4348a3..79128c3 100644 --- a/mods/eat/init.lua +++ b/mods/eat/init.lua @@ -28,6 +28,7 @@ function eat.item_eat(itemstack, user, item_name, hp, hunger) playerz.change_hp(user, hp or 1, "eat") eat_particlespawner(user, item_name, itemstack) playerz.change_hunger(user, hunger or 1) + sound.play("player", user, "eat_chewing") end itemstack:take_item() return itemstack diff --git a/mods/eat/sounds/eat_chewing.ogg b/mods/eat/sounds/eat_chewing.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0af8104997be9881343ac9add3f19f7558261539 GIT binary patch literal 11695 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 LNkvXXu0mjfhOYms literal 0 HcmV?d00001 diff --git a/mods/farmz/textures/farmz_hoe_steel.png b/mods/farmz/textures/farmz_hoe_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1d14dbc39243674ba7e6506503f82b1064c162 GIT binary patch literal 594 zcmV-Y0&ALg1WV7rhNU#-bECdVD z##iA#&{nWj5ClaKvGND_YDCsMNgyI-mf8DpX3k~i4EUp2Bj+{@L(VEVvFV7mkXY23 zUI@@j3!RMUhHFpG&PJ&_KJW0UdOM_g)!+B;Xj?H|1ANWGV}|V%geQcfYXw{JmTw;9#}Igg3#;bOOHSh-qHou<&;fL8z}aO@ zOYXw?CiFbmx}%q+fJ}cX1+S;jo`9|!XkDsgRbA)g9^&irMAxvl4+FBlWBCX0nrH** zI&bL!000SaNLh0L04^f{04^f|c%?sf0001qNkl%lXYX$)pVl*=dNQ2qf0+Nwf%^mAbGLjUH#AwE80I`~}8bFF>328SuyRdckRkK*228$yhWrpIQht zJrkgtX8LH=bjO-ZB;wQ^AGi2ay%|=$>hG<9*w+2Vb-Bm~Po6;R)gRYROW(Dcq^& zv}NG~;UQZND152(w8u}1vmU=Gwr7)5;8#6E**~2A!+Opx2oDN}3;DACdmeR@pkdC< zNbQl?i$jtaQ9`6CvqGK{!%|JjthO)mM>2$%%JJ)UtFnq-I1nrz^AizXWX9EKZnBMe(;s1;3|8H)|F)-ZxL8J?Sn&CEYv<2G?G6Y$kk)YFo8s9Lg zF^KrSVtBJz3@j$1_K1N|V>csleuvupdQ&p8%|dv?0HzpB`w1{yU&_t!`qNiPKsGS2 z0r5M$wq9Ej0k#o~%^XBIdslrpre+)fs}~H7c^Gy#aDkmoj3F3-Mt(9KFwFxB0Emoo UYmWud$^ZZW07*qoM6N<$g5K{O{{R30 literal 0 HcmV?d00001 diff --git a/mods/flowers/flowers.lua b/mods/flowers/flowers.lua index 90065e0..d296879 100644 --- a/mods/flowers/flowers.lua +++ b/mods/flowers/flowers.lua @@ -23,7 +23,7 @@ flowers.list = { name = "rose", def = { desc = S("Rose"), - box = {-2/16, -0.5, -2/16, 2/16, 5/16, 2/16}, + box = {-2/16, -0.5, -2/16, 2/16, 4/16, 2/16}, groups = {color_red = 1, flammable = 1}, inv_img = false, deco = { diff --git a/mods/flowers/textures/flowers_dahlia.png b/mods/flowers/textures/flowers_dahlia.png index 50af282c01cbbc11a28c1878c78620090946fdd4..2817a5da0b0418d0726cb5c6cc60f0dec710b026 100644 GIT binary patch delta 532 zcmV+v0_**q1-t~1GJm~GLQxpTe`;ZrAyh+DgM)>GK@>z|+2A4}W{}mQ*RQ~j%e_iS zYtYglG(;_Z4gCkT2CW4_Py`W8{Q-R~A-DIWV1%B_x$lqXoag17=YTzw)ADA=1mp`P zBN7aFmSZa(=PM3|>BGl#Tr>5#a5zNU@pX?))w^-ktNp%~qkkuvGBvPu2~TUfQ4*dN z4sDcl#XG_SS~i{(J`(mDazNp0r6=nAqBv9M55-0_G7omu)06qbi9f7mjl8f=*qhIl zwZ?hWOvmC^0UzAepuHP5k;6D2hjuzfJ{192v6W^^01T zt|_T$(Npr}sDG&3|L19@rzY#&T>cvtM#lJ>zqD7bW@(_2KEnN zO!m9iegHu3Xeb!w&!7MR010qNS#tmY4`BcR4`BhQKa;Nk1%Go%L_t(I%VS^|1%nvW zG3fnArf~sAT$-h&{=)fBpD{BuFyhS(<>|0fg%7{I&M z5Uv4a03r2E=mP3`-%t#J8Hz53GYpDWtAiEZyu^iKXkX|}Mxp}|*${l1NeT~K005w) WHcuYDVgUdE00{s|MNUMnLSTZnh4yU# delta 629 zcmV-*0*d{-1f2ztGJiWu13?spza)yH(G*&UD5OxaP!I*N)L7UA2~ojUlU;X{KsGMB z8$@gc8wK28LkeYdf{Q+c0A!x z;pB>EE8Y}t)pMC8;RE45M-C`_sdO#iC&k%--xNF3>2V0Fp7HE2)_$>`b1dOr;V!FC z(tpmQZW1+$GgDIAWp?0_W`YE9G)m+t;7KldijrA%-@vzTl4bGe^0!&V5l5Dsc>6>x zNmoOvDY_wFfqzw%``_930)G=by2xAK{2s3^HZL*a^1oLABZIiWZ-!I5L>QhvW5($fCTyCur3Aq2mmgT+-oX_POt`{e+lK!P z4^QzkTz&Qdr)u-Dx&Q<~nm_>LbmRcVW(d|mM0YMOaiS6vAvG9Y@UAt4Yr2>y!9cPB z>U!VchVaPzgByx$Fy3@fv|1gk@a82h6hr$$Z!!{P0J"), "schems"}, DIR_DELIM) + +local text_color = "#D79E9E" +local text_color_number = 0xD79E9E + +local can_import = minetest.read_schematic ~= nil + +schemedit.markers = {} + +-- [local function] Renumber table +local function renumber(t) + local res = {} + for _, i in pairs(t) do + res[#res + 1] = i + end + return res +end + +local NEEDED_PRIV = "server" +local function check_priv(player_name, quit) + local privs = minetest.get_player_privs(player_name) + if privs[NEEDED_PRIV] then + return true + else + if not quit then + minetest.chat_send_player(player_name, minetest.colorize("red", + S("Insufficient privileges! You need the “@1” privilege to use this.", NEEDED_PRIV))) + end + return false + end +end + +-- Lua export +local export_schematic_to_lua +if can_import then + export_schematic_to_lua = function(schematic, filepath, options) + if not options then options = {} end + local str = minetest.serialize_schematic(schematic, "lua", options) + local file = io.open(filepath, "w") + if file and str then + file:write(str) + file:flush() + file:close() + return true + else + return false + end + end +end + +--- +--- Formspec API +--- + +local contexts = {} +local form_data = {} +local tabs = {} +local forms = {} +local displayed_waypoints = {} + +-- Sadly, the probabilities presented in Lua (0-255) are not identical to the REAL probabilities in the +-- schematic file (0-127). There are two converter functions to convert from one probability type to another. +-- This mod tries to retain the “Lua probability” as long as possible and only switches to “schematic probability” +-- on an actual export to a schematic. + +function schemedit.lua_prob_to_schematic_prob(lua_prob) + return math.floor(lua_prob / 2) +end + +function schemedit.schematic_prob_to_lua_prob(schematic_prob) + return schematic_prob * 2 + +end + +-- [function] Add form +function schemedit.add_form(name, def) + def.name = name + forms[name] = def + + if def.tab then + tabs[#tabs + 1] = name + end +end + +-- [function] Generate tabs +function schemedit.generate_tabs(current) + local retval = "tabheader[0,0;tabs;" + for _, t in pairs(tabs) do + local f = forms[t] + if f.tab ~= false and f.caption then + retval = retval..f.caption.."," + + if type(current) ~= "number" and current == f.name then + current = _ + end + end + end + retval = retval:sub(1, -2) -- Strip last comma + retval = retval..";"..current.."]" -- Close tabheader + return retval +end + +-- [function] Handle tabs +function schemedit.handle_tabs(pos, name, fields) + local tab = tonumber(fields.tabs) + if tab and tabs[tab] and forms[tabs[tab]] then + schemedit.show_formspec(pos, name, forms[tabs[tab]].name) + return true + end +end + +-- [function] Show formspec +function schemedit.show_formspec(pos, player, tab, show, ...) + if forms[tab] then + if type(player) == "string" then + player = minetest.get_player_by_name(player) + end + local name = player:get_player_name() + + if show ~= false then + if not form_data[name] then + form_data[name] = {} + end + + local form = forms[tab].get(form_data[name], pos, name, ...) + if forms[tab].tab then + form = form..schemedit.generate_tabs(tab) + end + + minetest.show_formspec(name, "schemedit:"..tab, form) + contexts[name] = pos + + -- Update player attribute + if forms[tab].cache_name ~= false then + local pmeta = player:get_meta() + pmeta:set_string("schemedit:tab", tab) + end + else + minetest.close_formspec(pname, "schemedit:"..tab) + end + end +end + +-- [event] On receive fields +minetest.register_on_player_receive_fields(function(player, formname, fields) + local formname = formname:split(":") + + if formname[1] == "schemedit" and forms[formname[2]] then + local handle = forms[formname[2]].handle + local name = player:get_player_name() + if contexts[name] then + if not form_data[name] then + form_data[name] = {} + end + + if not schemedit.handle_tabs(contexts[name], name, fields) and handle then + handle(form_data[name], contexts[name], name, fields) + end + end + end +end) + +-- Helper function. Scans probabilities of all nodes in the given area and returns a prob_list +schemedit.scan_metadata = function(pos1, pos2) + local prob_list = {} + + for x=pos1.x, pos2.x do + for y=pos1.y, pos2.y do + for z=pos1.z, pos2.z do + local scanpos = {x=x, y=y, z=z} + local node = minetest.get_node_or_nil(scanpos) + + local prob, force_place + if node == nil or node.name == "schemedit:void" then + prob = 0 + force_place = false + else + local meta = minetest.get_meta(scanpos) + + prob = tonumber(meta:get_string("schemedit_prob")) or 255 + local fp = meta:get_string("schemedit_force_place") + if fp == "true" then + force_place = true + else + force_place = false + end + end + + local hashpos = minetest.hash_node_position(scanpos) + prob_list[hashpos] = { + pos = scanpos, + prob = prob, + force_place = force_place, + } + end + end + end + + return prob_list +end + +-- Sets probability and force_place metadata of an item. +-- Also updates item description. +-- The itemstack is updated in-place. +local function set_item_metadata(itemstack, prob, force_place) + local smeta = itemstack:get_meta() + local prob_desc = "\n"..S("Probability: @1", prob or + smeta:get_string("schemedit_prob") or S("Not Set")) + -- Update probability + if prob and prob >= 0 and prob < 255 then + smeta:set_string("schemedit_prob", tostring(prob)) + elseif prob and prob == 255 then + -- Clear prob metadata for default probability + prob_desc = "" + smeta:set_string("schemedit_prob", nil) + else + prob_desc = "\n"..S("Probability: @1", smeta:get_string("schemedit_prob") or + S("Not Set")) + end + + -- Update force place + if force_place == true then + smeta:set_string("schemedit_force_place", "true") + elseif force_place == false then + smeta:set_string("schemedit_force_place", nil) + end + + -- Update description + local desc = minetest.registered_items[itemstack:get_name()].description + local meta_desc = smeta:get_string("description") + if meta_desc and meta_desc ~= "" then + desc = meta_desc + end + + local original_desc = smeta:get_string("original_description") + if original_desc and original_desc ~= "" then + desc = original_desc + else + smeta:set_string("original_description", desc) + end + + local force_desc = "" + if smeta:get_string("schemedit_force_place") == "true" then + force_desc = "\n"..S("Force placement") + end + + desc = desc..minetest.colorize(text_color, prob_desc..force_desc) + + smeta:set_string("description", desc) + + return itemstack +end + +--- +--- Formspec Tabs +--- +local import_btn = "" +if can_import then + import_btn = "button[0.5,2.5;6,1;import;"..F(S("Import schematic")).."]" +end +schemedit.add_form("main", { + tab = true, + caption = S("Main"), + get = function(self, pos, name) + local meta = minetest.get_meta(pos):to_table().fields + local strpos = minetest.pos_to_string(pos) + local hashpos = minetest.hash_node_position(pos) + + local border_button + if meta.schem_border == "true" and schemedit.markers[hashpos] then + border_button = "button[3.5,7.5;3,1;border;"..F(S("Hide border")).."]" + else + border_button = "button[3.5,7.5;3,1;border;"..F(S("Show border")).."]" + end + + local xs, ys, zs = meta.x_size or 1, meta.y_size or 1, meta.z_size or 1 + local size = {x=xs, y=ys, z=zs} + local schem_name = meta.schem_name or "" + + local form = [[ + size[7,8] + label[0.5,-0.1;]]..F(S("Position: @1", strpos))..[[] + label[3,-0.1;]]..F(S("Owner: @1", name))..[[] + label[0.5,0.4;]]..F(S("Schematic name: @1", F(schem_name)))..[[] + label[0.5,0.9;]]..F(S("Size: @1", minetest.pos_to_string(size)))..[[] + + field[0.8,2;5,1;name;]]..F(S("Schematic name:"))..[[;]]..F(schem_name or "")..[[] + button[5.3,1.69;1.2,1;save_name;]]..F(S("OK"))..[[] + tooltip[save_name;]]..F(S("Save schematic name"))..[[] + field_close_on_enter[name;false] + + button[0.5,3.5;6,1;export;]]..F(S("Export schematic")).."]".. + import_btn..[[ + textarea[0.8,4.5;6.2,1;;]]..F(S("Export/import path:\n@1", + export_path_trunc .. DIR_DELIM .. F(S(""))..".mts"))..[[;] + button[0.5,5.5;3,1;air2void;]]..F(S("Air to voids"))..[[] + button[3.5,5.5;3,1;void2air;]]..F(S("Voids to air"))..[[] + tooltip[air2void;]]..F(S("Turn all air nodes into schematic void nodes"))..[[] + tooltip[void2air;]]..F(S("Turn all schematic void nodes into air nodes"))..[[] + field[0.8,7;2,1;x;]]..F(S("X size:"))..[[;]]..xs..[[] + field[2.8,7;2,1;y;]]..F(S("Y size:"))..[[;]]..ys..[[] + field[4.8,7;2,1;z;]]..F(S("Z size:"))..[[;]]..zs..[[] + field_close_on_enter[x;false] + field_close_on_enter[y;false] + field_close_on_enter[z;false] + button[0.5,7.5;3,1;save;]]..F(S("Save size"))..[[] + ]].. + border_button + if minetest.get_modpath("doc") then + form = form .. "image_button[6.4,-0.2;0.8,0.8;doc_button_icon_lores.png;doc;]" .. + "tooltip[doc;"..F(S("Help")).."]" + end + return form + end, + handle = function(self, pos, name, fields) + if fields.doc then + doc.show_entry(name, "nodes", "schemedit:creator", true) + return + end + + if not check_priv(name, fields.quit) then + return + end + + local realmeta = minetest.get_meta(pos) + local meta = realmeta:to_table().fields + local hashpos = minetest.hash_node_position(pos) + + -- Save size vector values + if (fields.x and fields.x ~= "") then + local x = tonumber(fields.x) + if x then + meta.x_size = math.max(x, 1) + end + end + if (fields.y and fields.y ~= "") then + local y = tonumber(fields.y) + if y then + meta.y_size = math.max(y, 1) + end + end + if (fields.z and fields.z ~= "") then + local z = tonumber(fields.z) + if z then + meta.z_size = math.max(z, 1) + end + end + + -- Save schematic name + if fields.name then + meta.schem_name = fields.name + end + + -- Node conversion + if (fields.air2void) then + local pos1, pos2 = schemedit.size(pos) + pos1, pos2 = schemedit.sort_pos(pos1, pos2) + local nodes = minetest.find_nodes_in_area(pos1, pos2, {"air"}) + minetest.bulk_set_node(nodes, {name="schemedit:void"}) + return + elseif (fields.void2air) then + local pos1, pos2 = schemedit.size(pos) + pos1, pos2 = schemedit.sort_pos(pos1, pos2) + local nodes = minetest.find_nodes_in_area(pos1, pos2, {"schemedit:void"}) + minetest.bulk_set_node(nodes, {name="air"}) + return + end + + -- Toggle border + if fields.border then + if meta.schem_border == "true" and schemedit.markers[hashpos] then + schemedit.unmark(pos) + meta.schem_border = "false" + else + schemedit.mark(pos) + meta.schem_border = "true" + end + end + + -- Export schematic + if fields.export and meta.schem_name and meta.schem_name ~= "" then + local pos1, pos2 = schemedit.size(pos) + pos1, pos2 = schemedit.sort_pos(pos1, pos2) + local path = export_path_full .. DIR_DELIM + minetest.mkdir(path) + + local plist = schemedit.scan_metadata(pos1, pos2) + local probability_list = {} + for hash, i in pairs(plist) do + local prob = schemedit.lua_prob_to_schematic_prob(i.prob) + if i.force_place == true then + prob = prob + 128 + end + + table.insert(probability_list, { + pos = minetest.get_position_from_hash(hash), + prob = prob, + }) + end + + local slist = minetest.deserialize(meta.slices) + local slice_list = {} + for _, i in pairs(slist) do + slice_list[#slice_list + 1] = { + ypos = pos.y + i.ypos, + prob = schemedit.lua_prob_to_schematic_prob(i.prob), + } + end + + local filepath = path..meta.schem_name..".mts" + local res = minetest.create_schematic(pos1, pos2, probability_list, filepath, slice_list) + + if res then + minetest.chat_send_player(name, minetest.colorize("#00ff00", + S("Exported schematic to @1", filepath))) + -- Additional export to Lua file if MTS export was successful + local schematic = minetest.read_schematic(filepath, {}) + if schematic and minetest.settings:get_bool("schemedit_export_lua") then + local filepath_lua = path..meta.schem_name..".lua" + res = export_schematic_to_lua(schematic, filepath_lua) + if res then + minetest.chat_send_player(name, minetest.colorize("#00ff00", + S("Exported schematic to @1", filepath_lua))) + end + end + else + minetest.chat_send_player(name, minetest.colorize("red", + S("Failed to export schematic to @1", filepath))) + end + end + + -- Import schematic + if fields.import and meta.schem_name and meta.schem_name ~= "" then + if not can_import then + return + end + local pos1 + local node = minetest.get_node(pos) + local path = export_path_full .. DIR_DELIM + + local filepath = path..meta.schem_name..".mts" + local schematic = minetest.read_schematic(filepath, {write_yslice_prob="low"}) + local success = false + + if schematic then + meta.x_size = schematic.size.x + meta.y_size = schematic.size.y + meta.z_size = schematic.size.z + meta.slices = minetest.serialize(renumber(schematic.yslice_prob)) + local special_x_size = meta.x_size + local special_y_size = meta.y_size + local special_z_size = meta.z_size + + if node.param2 == 1 then + pos1 = vector.add(pos, {x=1,y=0,z=-meta.z_size+1}) + meta.x_size, meta.z_size = meta.z_size, meta.x_size + elseif node.param2 == 2 then + pos1 = vector.add(pos, {x=-meta.x_size+1,y=0,z=-meta.z_size}) + elseif node.param2 == 3 then + pos1 = vector.add(pos, {x=-meta.x_size,y=0,z=0}) + meta.x_size, meta.z_size = meta.z_size, meta.x_size + else + pos1 = vector.add(pos, {x=0,y=0,z=1}) + end + + local schematic_for_meta = table.copy(schematic) + -- Strip probability data for placement + schematic.yslice_prob = {} + for d=1, #schematic.data do + schematic.data[d].prob = nil + end + + -- Place schematic + success = minetest.place_schematic(pos1, schematic, "0", nil, true) + + -- Add special schematic data to nodes + if success then + local d = 1 + for z=0, special_z_size-1 do + for y=0, special_y_size-1 do + for x=0, special_x_size-1 do + local data = schematic_for_meta.data[d] + local pp = {x=pos1.x+x, y=pos1.y+y, z=pos1.z+z} + if data.prob == 0 then + minetest.set_node(pp, {name="schemedit:void"}) + else + local meta = minetest.get_meta(pp) + if data.prob and data.prob ~= 255 and data.prob ~= 254 then + meta:set_string("schemedit_prob", tostring(data.prob)) + else + meta:set_string("schemedit_prob", "") + end + if data.force_place then + meta:set_string("schemedit_force_place", "true") + else + meta:set_string("schemedit_force_place", "") + end + end + d = d + 1 + end + end + end + end + end + if success then + minetest.chat_send_player(name, minetest.colorize("#00ff00", + S("Imported schematic from @1", filepath))) + else + minetest.chat_send_player(name, minetest.colorize("red", + S("Failed to import schematic from @1", filepath))) + end + end + + + + -- Save meta before updating visuals + local inv = realmeta:get_inventory():get_lists() + realmeta:from_table({fields = meta, inventory = inv}) + + -- Update border + if not fields.border and meta.schem_border == "true" then + schemedit.mark(pos) + end + + -- Update formspec + if not fields.quit then + schemedit.show_formspec(pos, minetest.get_player_by_name(name), "main") + end + end, +}) + +schemedit.add_form("slice", { + caption = S("Y Slices"), + tab = true, + get = function(self, pos, name, visible_panel) + local meta = minetest.get_meta(pos):to_table().fields + + self.selected = self.selected or 1 + local selected = tostring(self.selected) + local slice_list = minetest.deserialize(meta.slices) + local slices = "" + for _, i in pairs(slice_list) do + local insert = F(S("Y = @1; Probability = @2", tostring(i.ypos), tostring(i.prob))) + slices = slices..insert.."," + end + slices = slices:sub(1, -2) -- Remove final comma + + local form = [[ + size[7,8] + table[0,0;6.8,6;slices;]]..slices..[[;]]..selected..[[] + ]] + + -- Close edit panel if no slices + if self.panel_edit and slices == "" then + self.panel_edit = nil + end + + if self.panel_add or self.panel_edit then + local ypos_default, prob_default = "", "" + local done_button = "button[5,7.18;2,1;done_add;"..F(S("Add")).."]" + if self.panel_edit then + done_button = "button[5,7.18;2,1;done_edit;"..F(S("Apply")).."]" + if slice_list[self.selected] then + ypos_default = slice_list[self.selected].ypos + prob_default = slice_list[self.selected].prob + end + end + + local field_ypos = "" + if self.panel_add then + field_ypos = "field[0.3,7.5;2.5,1;ypos;"..F(S("Y position (max. @1):", (meta.y_size - 1)))..";"..ypos_default.."]" + end + + form = form..[[ + ]]..field_ypos..[[ + field[2.8,7.5;2.5,1;prob;]]..F(S("Probability (0-255):"))..[[;]]..prob_default..[[] + field_close_on_enter[ypos;false] + field_close_on_enter[prob;false] + ]]..done_button + end + + if not self.panel_edit then + if self.panel_add then + form = form.."button[0,6;2.4,1;add;"..F(S("Cancel")).."]" + else + form = form.."button[0,6;2.4,1;add;"..F(S("Add slice")).."]" + end + end + + if slices ~= "" and self.selected and not self.panel_add then + if not self.panel_edit then + form = form..[[ + button[2.4,6;2.4,1;remove;]]..F(S("Remove slice"))..[[] + button[4.8,6;2.4,1;edit;]]..F(S("Edit slice"))..[[] + ]] + else + form = form..[[ + button[4.8,6;2.4,1;edit;]]..F(S("Back"))..[[] + ]] + end + end + + return form + end, + handle = function(self, pos, name, fields) + if not check_priv(name, fields.quit) then + return + end + + local meta = minetest.get_meta(pos) + local player = minetest.get_player_by_name(name) + + if fields.slices then + local slices = fields.slices:split(":") + self.selected = tonumber(slices[2]) + end + + if fields.add then + if not self.panel_add then + self.panel_add = true + schemedit.show_formspec(pos, player, "slice") + else + self.panel_add = nil + schemedit.show_formspec(pos, player, "slice") + end + end + + local ypos, prob = tonumber(fields.ypos), tonumber(fields.prob) + if fields.done_edit then + ypos = 0 + end + if (fields.done_add or fields.done_edit) and ypos and prob and + ypos <= (meta:get_int("y_size") - 1) and prob >= 0 and prob <= 255 then + local slice_list = minetest.deserialize(meta:get_string("slices")) + local index = #slice_list + 1 + if fields.done_edit then + index = self.selected + end + + local dupe = false + if fields.done_add then + for k,v in pairs(slice_list) do + if v.ypos == ypos then + v.prob = prob + dupe = true + end + end + end + if fields.done_edit and slice_list[index] then + ypos = slice_list[index].ypos + end + if not dupe then + slice_list[index] = {ypos = ypos, prob = prob} + end + + meta:set_string("slices", minetest.serialize(slice_list)) + + -- Update and show formspec + self.panel_add = nil + schemedit.show_formspec(pos, player, "slice") + end + + if fields.remove and self.selected then + local slice_list = minetest.deserialize(meta:get_string("slices")) + slice_list[self.selected] = nil + meta:set_string("slices", minetest.serialize(renumber(slice_list))) + + -- Update formspec + self.selected = math.max(1, self.selected-1) + self.panel_edit = nil + schemedit.show_formspec(pos, player, "slice") + end + + if fields.edit then + if not self.panel_edit then + self.panel_edit = true + schemedit.show_formspec(pos, player, "slice") + else + self.panel_edit = nil + schemedit.show_formspec(pos, player, "slice") + end + end + end, +}) + +schemedit.add_form("probtool", { + cache_name = false, + caption = S("Schematic Node Probability Tool"), + get = function(self, pos, name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + local probtool = player:get_wielded_item() + if probtool:get_name() ~= "schemedit:probtool" then + return + end + + local meta = probtool:get_meta() + local prob = tonumber(meta:get_string("schemedit_prob")) + local force_place = meta:get_string("schemedit_force_place") + + if not prob then + prob = 255 + end + if force_place == nil or force_place == "" then + force_place = "false" + end + local form = "size[5,4]".. + "label[0,0;"..F(S("Schematic Node Probability Tool")).."]".. + "field[0.75,1;4,1;prob;"..F(S("Probability (0-255)"))..";"..prob.."]".. + "checkbox[0.60,1.5;force_place;"..F(S("Force placement"))..";" .. force_place .. "]" .. + "button_exit[0.25,3;2,1;cancel;"..F(S("Cancel")).."]".. + "button_exit[2.75,3;2,1;submit;"..F(S("Apply")).."]".. + "tooltip[prob;"..F(S("Probability that the node will be placed")).."]".. + "tooltip[force_place;"..F(S("If enabled, the node will replace nodes other than air and ignore")).."]".. + "field_close_on_enter[prob;false]" + return form + end, + handle = function(self, pos, name, fields) + if not check_priv(name, fields.quit) then + return + end + + if fields.submit then + local prob = tonumber(fields.prob) + if prob then + local player = minetest.get_player_by_name(name) + if not player then + return + end + local probtool = player:get_wielded_item() + if probtool:get_name() ~= "schemedit:probtool" then + return + end + + local force_place = self.force_place == true + + set_item_metadata(probtool, prob, force_place) + + -- Repurpose the tool's wear bar to display the set probability + probtool:set_wear(math.floor(((255-prob)/255)*65535)) + + player:set_wielded_item(probtool) + end + end + if fields.force_place == "true" then + self.force_place = true + elseif fields.force_place == "false" then + self.force_place = false + end + end, +}) + +--- +--- API +--- + +--- Copies and modifies positions `pos1` and `pos2` so that each component of +-- `pos1` is less than or equal to the corresponding component of `pos2`. +-- Returns the new positions. +function schemedit.sort_pos(pos1, pos2) + if not pos1 or not pos2 then + return + end + + pos1, pos2 = table.copy(pos1), table.copy(pos2) + if pos1.x > pos2.x then + pos2.x, pos1.x = pos1.x, pos2.x + end + if pos1.y > pos2.y then + pos2.y, pos1.y = pos1.y, pos2.y + end + if pos1.z > pos2.z then + pos2.z, pos1.z = pos1.z, pos2.z + end + return pos1, pos2 +end + +-- [function] Prepare size +function schemedit.size(pos) + local pos1 = vector.new(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + local param2 = node.param2 + local size = { + x = meta:get_int("x_size"), + y = math.max(meta:get_int("y_size") - 1, 0), + z = meta:get_int("z_size"), + } + + if param2 == 1 then + local new_pos = vector.add({x = size.z, y = size.y, z = -size.x}, pos) + pos1.x = pos1.x + 1 + new_pos.z = new_pos.z + 1 + return pos1, new_pos + elseif param2 == 2 then + local new_pos = vector.add({x = -size.x, y = size.y, z = -size.z}, pos) + pos1.z = pos1.z - 1 + new_pos.x = new_pos.x + 1 + return pos1, new_pos + elseif param2 == 3 then + local new_pos = vector.add({x = -size.z, y = size.y, z = size.x}, pos) + pos1.x = pos1.x - 1 + new_pos.z = new_pos.z - 1 + return pos1, new_pos + else + local new_pos = vector.add(size, pos) + pos1.z = pos1.z + 1 + new_pos.x = new_pos.x - 1 + return pos1, new_pos + end +end + +-- [function] Mark region +function schemedit.mark(pos) + schemedit.unmark(pos) + + local id = minetest.hash_node_position(pos) + local owner = minetest.get_meta(pos):get_string("owner") + local pos1, pos2 = schemedit.size(pos) + pos1, pos2 = schemedit.sort_pos(pos1, pos2) + + local thickness = 0.2 + local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2 + local m = {} + local low = true + local offset + + -- XY plane markers + for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do + if low then + offset = -0.01 + else + offset = 0.01 + end + local marker = minetest.add_entity({x = pos1.x + sizex - 0.5, y = pos1.y + sizey - 0.5, z = z + offset}, "schemedit:display") + if marker ~= nil then + marker:set_properties({ + visual_size={x=(sizex+0.01) * 2, y=(sizey+0.01) * 2}, + }) + marker:get_luaentity().id = id + marker:get_luaentity().owner = owner + table.insert(m, marker) + end + low = false + end + + low = true + -- YZ plane markers + for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do + if low then + offset = -0.01 + else + offset = 0.01 + end + + local marker = minetest.add_entity({x = x + offset, y = pos1.y + sizey - 0.5, z = pos1.z + sizez - 0.5}, "schemedit:display") + if marker ~= nil then + marker:set_properties({ + visual_size={x=(sizez+0.01) * 2, y=(sizey+0.01) * 2}, + }) + marker:set_rotation({x=0, y=math.pi / 2, z=0}) + marker:get_luaentity().id = id + marker:get_luaentity().owner = owner + table.insert(m, marker) + end + low = false + end + + low = true + -- XZ plane markers + for _, y in ipairs({pos1.y - 0.5, pos2.y + 0.5}) do + if low then + offset = -0.01 + else + offset = 0.01 + end + + local marker = minetest.add_entity({x = pos1.x + sizex - 0.5, y = y + offset, z = pos1.z + sizez - 0.5}, "schemedit:display") + if marker ~= nil then + marker:set_properties({ + visual_size={x=(sizex+0.01) * 2, y=(sizez+0.01) * 2}, + }) + marker:set_rotation({x=math.pi/2, y=0, z=0}) + marker:get_luaentity().id = id + marker:get_luaentity().owner = owner + table.insert(m, marker) + end + low = false + end + + + + schemedit.markers[id] = m + return true +end + +-- [function] Unmark region +function schemedit.unmark(pos) + local id = minetest.hash_node_position(pos) + if schemedit.markers[id] then + local retval + for _, entity in ipairs(schemedit.markers[id]) do + entity:remove() + retval = true + end + return retval + end +end + +--- +--- Mark node probability values near player +--- + +-- Show probability and force_place status of a particular position for player in HUD. +-- Probability is shown as a number followed by “[F]” if the node is force-placed. +function schemedit.display_node_prob(player, pos, prob, force_place) + local wpstring + if prob and force_place == true then + wpstring = string.format("%s [F]", prob) + elseif prob and type(tonumber(prob)) == "number" then + wpstring = prob + elseif force_place == true then + wpstring = "[F]" + end + if wpstring then + return player:hud_add({ + hud_elem_type = "waypoint", + name = wpstring, + precision = 0, + text = "m", -- For the distance artifact [legacy] + number = text_color_number, + world_pos = pos, + z_index = -300, + }) + end +end + +-- Display the node probabilities and force_place status of the nodes in a region. +-- By default, this is done for nodes near the player (distance: 5). +-- But the boundaries can optionally be set explicitly with pos1 and pos2. +function schemedit.display_node_probs_region(player, pos1, pos2) + local playername = player:get_player_name() + local pos = vector.round(player:get_pos()) + + local dist = 5 + -- Default: 5 nodes away from player in any direction + if not pos1 then + pos1 = vector.subtract(pos, dist) + end + if not pos2 then + pos2 = vector.add(pos, dist) + end + for x=pos1.x, pos2.x do + for y=pos1.y, pos2.y do + for z=pos1.z, pos2.z do + local checkpos = {x=x, y=y, z=z} + local nodehash = minetest.hash_node_position(checkpos) + + -- If node is already displayed, remove it so it can re replaced later + if displayed_waypoints[playername][nodehash] then + player:hud_remove(displayed_waypoints[playername][nodehash]) + displayed_waypoints[playername][nodehash] = nil + end + + local prob, force_place + local meta = minetest.get_meta(checkpos) + prob = meta:get_string("schemedit_prob") + force_place = meta:get_string("schemedit_force_place") == "true" + local hud_id = schemedit.display_node_prob(player, checkpos, prob, force_place) + if hud_id then + displayed_waypoints[playername][nodehash] = hud_id + displayed_waypoints[playername].display_active = true + end + end + end + end +end + +-- Remove all active displayed node statuses. +function schemedit.clear_displayed_node_probs(player) + local playername = player:get_player_name() + for nodehash, hud_id in pairs(displayed_waypoints[playername]) do + if nodehash ~= "display_active" then + player:hud_remove(hud_id) + displayed_waypoints[playername][nodehash] = nil + displayed_waypoints[playername].display_active = false + end + end +end + +minetest.register_on_joinplayer(function(player) + displayed_waypoints[player:get_player_name()] = { + display_active = false -- If true, there *might* be at least one active node prob HUD display + -- If false, no node probabilities are displayed for sure. + } +end) + +minetest.register_on_leaveplayer(function(player) + displayed_waypoints[player:get_player_name()] = nil +end) + +-- Regularily clear the displayed node probabilities and force_place +-- for all players who do not wield the probtool. +-- This makes sure the screen is not spammed with information when it +-- isn't needed. +local cleartimer = 0 +minetest.register_globalstep(function(dtime) + cleartimer = cleartimer + dtime + if cleartimer > 2 then + local players = minetest.get_connected_players() + for p = 1, #players do + local player = players[p] + local pname = player:get_player_name() + if displayed_waypoints[pname].display_active then + local item = player:get_wielded_item() + if item:get_name() ~= "schemedit:probtool" then + schemedit.clear_displayed_node_probs(player) + end + end + end + cleartimer = 0 + end +end) + +--- +--- Registrations +--- + +-- [priv] schematic_override +minetest.register_privilege("schematic_override", { + description = S("Allows you to access schemedit nodes not owned by you"), + give_to_singleplayer = false, +}) + +local help_import = "" +if can_import then + help_import = S("Importing a schematic will load a schematic from the world directory, place it in front of the schematic creator and sets probability and force-place data accordingly.").."\n" +end + +-- [node] Schematic creator +minetest.register_node("schemedit:creator", { + description = S("Schematic Creator"), + _doc_items_longdesc = S("The schematic creator is used to save a region of the world into a schematic file (.mts)."), + _doc_items_usagehelp = S("To get started, place the block facing directly in front of any bottom left corner of the structure you want to save. This block can only be accessed by the placer or by anyone with the “schematic_override” privilege.").."\n".. +S("To save a region, use the block, enter the size and a schematic name and hit “Export schematic”. The file will always be saved in the world directory. Note you can use this name in the /placeschem command to place the schematic again.").."\n\n".. +help_import.. +S("The other features of the schematic creator are optional and are used to allow to add randomness and fine-tuning.").."\n\n".. +S("Y slices are used to remove entire slices based on chance. For each slice of the schematic region along the Y axis, you can specify that it occurs only with a certain chance. In the Y slice tab, you have to specify the Y slice height (0 = bottom) and a probability from 0 to 255 (255 is for 100%). By default, all Y slices occur always.").."\n\n".. +S("With a schematic node probability tool, you can set a probability for each node and enable them to overwrite all nodes when placed as schematic. This tool must be used prior to the file export."), + tiles = {"schemedit_creator_top.png", "schemedit_creator_bottom.png", + "schemedit_creator_sides.png"}, + groups = { dig_immediate = 2}, + paramtype2 = "facedir", + is_ground_content = false, + + after_place_node = function(pos, player) + local name = player:get_player_name() + local meta = minetest.get_meta(pos) + + meta:set_string("owner", name) + meta:set_string("infotext", S("Schematic Creator").."\n"..S("(owned by @1)", name)) + meta:set_string("prob_list", minetest.serialize({})) + meta:set_string("slices", minetest.serialize({})) + + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + + meta:set_int("x_size", 1) + meta:set_int("y_size", 1) + meta:set_int("z_size", 1) + + -- Don't take item from itemstack + return true + end, + can_dig = function(pos, player) + local name = player:get_player_name() + local meta = minetest.get_meta(pos) + if meta:get_string("owner") == name or + minetest.check_player_privs(player, "schematic_override") == true then + return true + end + + return false + end, + on_rightclick = function(pos, node, player) + local meta = minetest.get_meta(pos) + local name = player:get_player_name() + if meta:get_string("owner") == name or + minetest.check_player_privs(player, "schematic_override") == true then + -- Get player attribute + local pmeta = player:get_meta() + local tab = pmeta:get_string("schemedit:tab") + if not forms[tab] or not tab then + tab = "main" + end + + schemedit.show_formspec(pos, player, tab, true) + end + end, + after_destruct = function(pos) + schemedit.unmark(pos) + end, + + -- No support for Minetest Game's screwdriver + on_rotate = false, +}) + +minetest.register_tool("schemedit:probtool", { + description = S("Schematic Node Probability Tool"), + _doc_items_longdesc = +S("This is an advanced tool which only makes sense when used together with a schematic creator. It is used to finetune the way how nodes from a schematic are placed.").."\n".. +S("It allows you to set two things:").."\n".. +S("1) Set probability: Chance for any particular node to be actually placed (default: always placed)").."\n".. +S("2) Enable force placement: These nodes replace node other than air and ignore when placed in a schematic (default: off)"), + _doc_items_usagehelp = "\n".. +S("BASIC USAGE:").."\n".. +S("Punch to configure the tool. Select a probability (0-255; 255 is for 100%) and enable or disable force placement. Now place the tool on any node to apply these values to the node. This information is preserved in the node until it is destroyed or changed by the tool again. This tool has no effect on schematic voids.").."\n".. +S("Now you can use a schematic creator to save a region as usual, the nodes will now be saved with the special node settings applied.").."\n\n".. +S("NODE HUD:").."\n".. +S("To help you remember the node values, the nodes with special values are labelled in the HUD. The first line shows probability and force placement (with “[F]”). The second line is the current distance to the node. Nodes with default settings and schematic voids are not labelled.").."\n".. +S("To disable the node HUD, unselect the tool or hit “place” while not pointing anything.").."\n\n".. +S("UPDATING THE NODE HUD:").."\n".. +S("The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simultaneously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big."), + wield_image = "schemedit_probtool.png", + inventory_image = "schemedit_probtool.png", + liquids_pointable = true, + groups = { disable_repair = 1 }, + on_use = function(itemstack, user, pointed_thing) + local uname = user:get_player_name() + if uname and not check_priv(uname) then + return + end + + local ctrl = user:get_player_control() + -- Simple use + if not ctrl.sneak then + -- Open dialog to change the probability to apply to nodes + schemedit.show_formspec(user:get_pos(), user, "probtool", true) + + -- Use + sneak + else + -- Display the probability and force_place values for nodes. + + -- If a schematic creator was punched, only enable display for all nodes + -- within the creator's region. + local use_creator_region = false + if pointed_thing and pointed_thing.type == "node" and pointed_thing.under then + local punchpos = pointed_thing.under + local node = minetest.get_node(punchpos) + if node.name == "schemedit:creator" then + local pos1, pos2 = schemedit.size(punchpos) + pos1, pos2 = schemedit.sort_pos(pos1, pos2) + schemedit.display_node_probs_region(user, pos1, pos2) + return + end + end + + -- Otherwise, just display the region close to the player + schemedit.display_node_probs_region(user) + end + end, + on_secondary_use = function(itemstack, user, pointed_thing) + local uname = user:get_player_name() + if uname and not check_priv(uname) then + return + end + + schemedit.clear_displayed_node_probs(user) + end, + -- Set note probability and force_place and enable node probability display + on_place = function(itemstack, placer, pointed_thing) + local pname = placer:get_player_name() + if pname and not check_priv(pname) then + return + end + + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if placer and not placer:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack + end + end + + -- This sets the node probability of pointed node to the + -- currently used probability stored in the tool. + local pos = pointed_thing.under + local node = minetest.get_node(pos) + -- Schematic void are ignored, they always have probability 0 + if node.name == "schemedit:void" then + return itemstack + end + local nmeta = minetest.get_meta(pos) + local imeta = itemstack:get_meta() + local prob = tonumber(imeta:get_string("schemedit_prob")) + local force_place = imeta:get_string("schemedit_force_place") + + if not prob or prob == 255 then + nmeta:set_string("schemedit_prob", nil) + else + nmeta:set_string("schemedit_prob", prob) + end + if force_place == "true" then + nmeta:set_string("schemedit_force_place", "true") + else + nmeta:set_string("schemedit_force_place", nil) + end + + -- Enable node probablity display + schemedit.display_node_probs_region(placer) + + return itemstack + end, +}) + +local use_texture_alpha_void +if minetest.features.use_texture_alpha_string_modes then + use_texture_alpha_void = "clip" +else + use_texture_alpha_void = true +end + +minetest.register_node("schemedit:void", { + description = S("Schematic Void"), + _doc_items_longdesc = S("This is an utility block used in the creation of schematic files. It should be used together with a schematic creator. When saving a schematic, all nodes with a schematic void will be left unchanged when the schematic is placed again. Technically, this is equivalent to a block with the node probability set to 0."), + _doc_items_usagehelp = S("Just place the schematic void like any other block and use the schematic creator to save a portion of the world."), + tiles = { "schemedit_void.png" }, + use_texture_alpha = use_texture_alpha_void, + drawtype = "nodebox", + is_ground_content = false, + paramtype = "light", + walkable = false, + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 }, + }, + }, + groups = { dig_immediate = 3}, +}) + +-- [entity] Visible schematic border +minetest.register_entity("schemedit:display", { + visual = "upright_sprite", + textures = {"schemedit_border.png"}, + visual_size = {x=10, y=10}, + pointable = false, + physical = false, + static_save = false, + glow = minetest.LIGHT_MAX, + + on_step = function(self, dtime) + if not self.id then + self.object:remove() + elseif not schemedit.markers[self.id] then + self.object:remove() + end + end, + on_activate = function(self) + self.object:set_armor_groups({immortal = 1}) + end, +}) + +minetest.register_lbm({ + label = "Reset schematic creator border entities", + name = "schemedit:reset_border", + nodenames = "schemedit:creator", + run_at_every_load = true, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("schem_border", "false") + end, +}) + +local function add_suffix(schem) + -- Automatically add file name suffix if omitted + local schem_full, schem_lua + if string.sub(schem, string.len(schem)-3, string.len(schem)) == ".mts" then + schem_full = schem + schem_lua = string.sub(schem, 1, -5) .. ".lua" + else + schem_full = schem .. ".mts" + schem_lua = schem .. ".lua" + end + return schem_full, schem_lua +end + +-- [chatcommand] Place schematic +minetest.register_chatcommand("placeschem", { + description = S("Place schematic at the position specified or the current player position (loaded from @1). “-c” will clear the area first", export_path_trunc), + privs = {server = true}, + params = S("[.mts] [-c] [ ]"), + func = function(name, param) + local schem, clear, p = string.match(param, "^([^ ]+) +(%-c) *(.*)$") + if not schem then + schem, p = string.match(param, "^([^ ]+) *(.*)$") + end + clear = clear == "-c" + + local pos = minetest.string_to_pos(p) + + if not schem then + return false, S("No schematic file specified.") + end + + if not pos then + pos = minetest.get_player_by_name(name):get_pos() + end + + local schem_full, schem_lua = add_suffix(schem) + local success = false + local schem_path = export_path_full .. DIR_DELIM .. schem_full + if minetest.read_schematic then + -- We don't call minetest.place_schematic with the path name directly because + -- this would trigger the caching and we wouldn't get any updates to the schematic + -- files when we reload. minetest.read_schematic circumvents that. + local schematic = minetest.read_schematic(schem_path, {}) + if schematic then + if clear then + -- Clear same size for X and Z because + -- because schematic is randomly rotated + local max_xz = math.max(schematic.size.x, schematic.size.z) + local posses = {} + for z=pos.z, pos.z+max_xz-1 do + for y=pos.y, pos.y+schematic.size.y-1 do + for x=pos.x, pos.x+max_xz-1 do + table.insert(posses, {x=x,y=y,z=z}) + end + end + end + minetest.bulk_set_node(posses, {name="air"}) + end + success = minetest.place_schematic(pos, schematic, "random", nil, false) + end + else + -- Legacy support for Minetest versions that do not have minetest.read_schematic. + -- Note: "-c" is ignored here. + success = minetest.place_schematic(schem_path, schematic, "random", nil, false) + end + + if success == nil then + return false, S("Schematic file could not be loaded!") + else + return true + end + end, +}) + +minetest.register_chatcommand("listschems", { + description = S("List schematic files in world path"), + privs = {server = true}, + params = "", + func = function(name, param) + local files = minetest.get_dir_list(minetest.get_worldpath()..DIR_DELIM.."schems", false) + if not files then + return false + end + local out_files = {} + -- Only show files with “.mts” suffix + for f=#files, 1, -1 do + if string.sub(string.lower(files[f]), -4, -1) == ".mts" then + table.insert(out_files, files[f]) + end + end + table.sort(out_files) + local str = table.concat(out_files, ", ") + if str == "" then + return true, S("No schematic files.") + end + return true, str + end, +}) + +if can_import then +-- [chatcommand] Convert MTS schematic file to .lua file +minetest.register_chatcommand("mts2lua", { + description = S("Convert .mts schematic file to .lua file (loaded from @1)", export_path_trunc), + privs = {server = true}, + params = S("[.mts] [comments]"), + func = function(name, param) + local schem, comments_str = string.match(param, "^([^ ]+) *(.*)$") + + if not schem then + return false, S("No schematic file specified.") + end + + local comments = comments_str == "comments" + + -- Automatically add file name suffix if omitted + local schem_full, schem_lua = add_suffix(schem) + local schem_path = export_path_full .. DIR_DELIM .. schem_full + local schematic = minetest.read_schematic(schem_path, {}) + + if schematic then + local str = minetest.serialize_schematic(schematic, "lua", {lua_use_comments=comments}) + local lua_path = export_path_full .. DIR_DELIM .. schem_lua + local file = io.open(lua_path, "w") + if file and str then + file:write(str) + file:flush() + file:close() + return true, S("Exported schematic to @1", lua_path) + else + return false, S("Failed!") + end + end + end, +}) +end + +if MAKE_README then + dofile(minetest.get_modpath("schemedit")..DIR_DELIM.."make_readme.lua") +end diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/locale/schemedit.de.tr b/mods/minetest_schemedit-1.5.0-82afdd8/locale/schemedit.de.tr new file mode 100644 index 0000000..efcea34 --- /dev/null +++ b/mods/minetest_schemedit-1.5.0-82afdd8/locale/schemedit.de.tr @@ -0,0 +1,82 @@ +# textdomain: schemedit += +Insufficient privileges! You need the “@1” privilege to use this.=Unzureichende Privilegien! Sie benötigen das „@1“-Privileg, um dies benutzen zu können. +Probability: @1=Wahrscheinlichkeit: @1 +Not Set=Nicht gesetzt +Force placement=Platzierung erzwingen +Import schematic=Schematic importieren +Main=Grundeinstellungen +Hide border=Rand verbergen +Show border=Rand anzeigen +Position: @1=Position: @1 +Owner: @1=Eigentümer: @1 +Schematic name: @1=Schematic-Name: @1 +Size: @1=Größe: @1 +Schematic name:=Schematic-Name: +OK=OK +Save schematic name=Schematic-Name speichern +Export schematic=Schematic exportieren +Export/import path:@n@1=Export-/Importpfad:@n@1 += +Air to voids=Luft zu Lücken +Voids to air=Lücken zu Luft +Turn all air nodes into schematic void nodes=Alle Luft-Nodes zu Schematic-Lücken umwandeln +Turn all schematic void nodes into air nodes=Alle Schematic-Lücken zu Luft-Nodes umwandeln +X size:=X-Größe: +Y size:=Y-Größe: +Z size:=Z-Größe: +Save size=Größe speichern +Help=Hilfe +Exported schematic to @1=Schematic nach @1 exportiert +Failed to export schematic to @1=Schematic konnte nicht nach @1 exportiert werden +Imported schematic from @1=Schematic von @1 importiert +Failed to import schematic from @1=Schematic konnte nicht von @1 importiert werden +Y Slices=Y-Scheiben +Y @= @1; Probability @= @2=Y @= @1; Wahrscheinlichkeit @= @2 +Add=Hinzufügen +Apply=Anwenden +Y position (max. @1):=Y-Position (max. @1): +Probability (0-255):=Wahrscheinlichkeit (0-255): +Cancel=Abbrechen +Add slice=Neue Scheibe +Remove slice=Scheibe entfernen +Edit slice=Scheibe anpassen +Back=Zurück +Schematic Node Probability Tool=Schematic-Node-Wahrscheinlichkeitswerkzeug +Probability (0-255)=Wahrscheinlichkeit +Probability that the node will be placed=Wahrscheinlichkeit, dass der Node platizert wird +If enabled, the node will replace nodes other than air and ignore=Wenn aktiviert, wird der Node alle Nodes außer Luft und Ignorieren ersetzen +Allows you to access schemedit nodes not owned by you=Damit können Sie auf Schemedit-Nodes, die ihnen nicht gehören, zugreifen +Importing a schematic will load a schematic from the world directory, place it in front of the schematic creator and sets probability and force-place data accordingly.=Das Importieren eines Schematics wird eine Schematicdatei aus dem Weltverzeichnis laden, sie vor dem Schematic-Macher platzieren und die Wahrscheinlichkeits- und Zwangsplatzierungsdaten entsprechend setzen. +Schematic Creator=Schematic-Macher +The schematic creator is used to save a region of the world into a schematic file (.mts).=Der Schematic-Macher wird benutzt, um eine Region der Welt in eine Schematic-Datei (.mts) zu speichern. +To get started, place the block facing directly in front of any bottom left corner of the structure you want to save. This block can only be accessed by the placer or by anyone with the “schematic_override” privilege.=Um anzufangen, platzieren Sie den Block direkt vor einer beliebigen unteren linken Ecke des Gebäudes, das Sie speichern möchten. Dieser Block kann nur vom Platzierer oder von Spielern mit dem „schematic_override“-Privileg benutzt werden. +To save a region, use the block, enter the size and a schematic name and hit “Export schematic”. The file will always be saved in the world directory. Note you can use this name in the /placeschem command to place the schematic again.=Um eine Region zu speichern, benutzen Sie den Block, geben Sie die Größe und einen Schematic-Namen ein und klicken Sie auf „Schematic exportieren“. Die Datei wird immer im Weltverzeichnis gespeichert. Beachten Sie, dass Sie diesen Namen im „/placeschem“-Befehl benutzen können, um das Schematic erneut zu platzieren. +The other features of the schematic creator are optional and are used to allow to add randomness and fine-tuning.=Die anderen Funktionen des Schematic-Machers sind optional und werden für Zufälligkeit und Feinjustierungen benutzt. +Y slices are used to remove entire slices based on chance. For each slice of the schematic region along the Y axis, you can specify that it occurs only with a certain chance. In the Y slice tab, you have to specify the Y slice height (0 @= bottom) and a probability from 0 to 255 (255 is for 100%). By default, all Y slices occur always.=Y-Scheiben werden benutzt, um ganze Scheiben mit einer gewissen Wahrscheinlichkeit auszulassen. Für jede Scheibe der Schematic-Region entlang der Y-Achse können Sie festlegen, dass sie nur mit einer gewissen Wahrscheinlichkeit auftritt. In der Registerkarte „Y-Scheiben“ müssen Sie die Höhe der Y-Scheibe festlegen (0 @= Boden) sowie eine Wahrscheinlichkeit zwischen 0 und 255 (255 steht für 100%). Standardmäßig treten alle Y-Scheiben immer auf. +With a schematic node probability tool, you can set a probability for each node and enable them to overwrite all nodes when placed as schematic. This tool must be used prior to the file export.=Mit einem Schematic-Node-Wahrscheinlichkeitswerkzeug können Sie die Wahrscheinlichkeit für jeden Node setzen und sie dazu aktivieren, alle Nodes zu ersetzen, wenn sie als Schematic platziert werden. Dieses Werkzeug muss vor dem Dateiexport benutzt werden. +(owned by @1)=(Eigentümer: @1) +This is an advanced tool which only makes sense when used together with a schematic creator. It is used to finetune the way how nodes from a schematic are placed.=Dies ist ein fortgeschrittenes Werkzeug, der nur sinnvoll in Verwendung mit einem Schematic-Macher benutzt werden kann. Er wird benutzt, um die Art und Weise, wie Nodes aus einem Schematic platziert werden, feinzujustieren. +It allows you to set two things:=Damit können Sie zwei Dinge setzen: +1) Set probability: Chance for any particular node to be actually placed (default: always placed)=1) Wahrscheinlichkeit setzen: Wahrscheinlichkeit für einen bestimmten Node, dass er tatsächlich platziert wird (Standard: immer platziert) +2) Enable force placement: These nodes replace node other than air and ignore when placed in a schematic (default: off)=2) Zwangsplatzierung aktivieren: Diese Nodes ersetzen alle Nodes außer Luft und Ignorieren, wenn Sie in einem Schematic platziert werden (Standard: aus) +BASIC USAGE:=GRUNDLEGENDE BENUTZUNG: +Punch to configure the tool. Select a probability (0-255; 255 is for 100%) and enable or disable force placement. Now place the tool on any node to apply these values to the node. This information is preserved in the node until it is destroyed or changed by the tool again. This tool has no effect on schematic voids.=Schlagen Sie zu, um das Werkzeug zu konfigurieren. Wählen Sie eine Wahrscheinlichkeit (0-255; 255 steht für 100%) und aktivieren oder deaktivieren Sie die erzwungene Platzierung. Platzieren Sie nun das Werkzeug auf einen beliebigen Node, um diese Werte auf dem Node anzuwenden. Diese Information bleibt im Node erhalten, bis er zerstört oder erneut vom Werkzeug geändert wird. Dieses Werkzeug hat keine Auswirkung auf Schematic-Lücken. +Now you can use a schematic creator to save a region as usual, the nodes will now be saved with the special node settings applied.=Anschließend können Sie einen Schematic-Macher benutzen, um eine Region wie gewöhnlich zu speichern, die Nodes werden nun mit den besonderen Node-Einstellungen gespeichert. +NODE HUD:=NODE-HUD: +To help you remember the node values, the nodes with special values are labelled in the HUD. The first line shows probability and force placement (with “[F]”). The second line is the current distance to the node. Nodes with default settings and schematic voids are not labelled.=Um Ihnen dabei zu helfen, sich die Node-Werte zu merken, werden die Nodes mit besonderen Werten in der Benutzeroberfläche gekennzeichnet. Die erste Zeile zeigt die Wahrscheinlichkeit und die Zwangsplatzierung (mit „[F]“) an. Die zweite Zeile zeigt die momentane Entfernung zum Node an. Nodes mit den Standardeinstellungen und Schematic-Lücken werden nicht gekennzeichnet. +To disable the node HUD, unselect the tool or hit “place” while not pointing anything.=Um die Node-HUD zu deaktivieren, wählen Sie das Werkzeug ab oder drücken Sie die Platzierentaste, während Sie auf nichts zeigen. +UPDATING THE NODE HUD:=NODE-HUD AKTUALISIEREN: +The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simultaneously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big.=Die Node-HUD wird nicht automatisch aktualisiert und kann veraltet sein. Die Node-HUD wird nur die HUD für Nodes in Ihrer Nähe aktualisieren oder wenn Sie das Werkzeug benutzen oder gleichzeitig die Schlag- und Schleichtaste drücken. Wenn Sie auf einen Schematic-Macher schleichschlagen, wird die Node-HUD für alle Nodes innerhalb der Region des Schematic-Machers aktualisiert, selbst, wenn diese Region sehr groß ist. +Schematic Void=Schematic-Lücke +This is an utility block used in the creation of schematic files. It should be used together with a schematic creator. When saving a schematic, all nodes with a schematic void will be left unchanged when the schematic is placed again. Technically, this is equivalent to a block with the node probability set to 0.=Dies ist ein Hilfsblock, der bei der Erstellung von Schematic-Dateien benutzt wird. Er sollte zusammen mit einem Schematic-Macher benutzt werden. Wenn ein Schematic gespeichert wird, werden alle Nodes mit einer Schematic-Lücke unverändert gelassen, wenn das Schematic erneut platziert wird. Technisch gesehen ist dieses Verhalten identisch mit einem Block, der eine Node-Wahrscheinlichkeit von 0 hat. +Just place the schematic void like any other block and use the schematic creator to save a portion of the world.=Platzieren Sie einfach die Schematic-Lücke wie jeden anderen Block und benutzen Sie den Schematic-Macher, um einen Teil der Welt zu speichern. +Place schematic at the position specified or the current player position (loaded from @1). “-c” will clear the area first=Schematic an der angegebenen Position oder der aktuellen Spielerposition platzieren (geladen von @1). Mit „-c“ wird das Gebiet zuerst geleert +[.mts] [-c] [ ]=[.mts] [-c] [ ] +No schematic file specified.=Keinen Schematic-Namen angegeben. +Schematic file could not be loaded!=Schematic-Datei konnte nicht geladen werden! +List schematic files in world path=Schematic-Dateien im Weltpfad auflisten +No schematic files.=Keine Schematic-Dateien. +Convert .mts schematic file to .lua file (loaded from @1)=„.mts“-Schematicdatei zu „.lua“-Datei konvertieren (geladen von @1) +[.mts] [comments]=[.mts] [comments] +Failed!=Fehlgeschlagen! diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/locale/template.txt b/mods/minetest_schemedit-1.5.0-82afdd8/locale/template.txt new file mode 100644 index 0000000..7212eb3 --- /dev/null +++ b/mods/minetest_schemedit-1.5.0-82afdd8/locale/template.txt @@ -0,0 +1,82 @@ +# textdomain: schemedit += +Insufficient privileges! You need the “@1” privilege to use this.= +Probability: @1= +Not Set= +Force placement= +Import schematic= +Main= +Hide border= +Show border= +Position: @1= +Owner: @1= +Schematic name: @1= +Size: @1= +Schematic name:= +OK= +Save schematic name= +Export schematic= +Export/import path:@n@1= += +Air to voids= +Voids to air= +Turn all air nodes into schematic void nodes= +Turn all schematic void nodes into air nodes= +X size:= +Y size:= +Z size:= +Save size= +Help= +Exported schematic to @1= +Failed to export schematic to @1= +Imported schematic from @1= +Failed to import schematic from @1= +Y Slices= +Y @= @1; Probability @= @2= +Add= +Apply= +Y position (max. @1):= +Probability (0-255):= +Cancel= +Add slice= +Remove slice= +Edit slice= +Back= +Schematic Node Probability Tool= +Probability (0-255)= +Probability that the node will be placed= +If enabled, the node will replace nodes other than air and ignore= +Allows you to access schemedit nodes not owned by you= +Importing a schematic will load a schematic from the world directory, place it in front of the schematic creator and sets probability and force-place data accordingly.= +Schematic Creator= +The schematic creator is used to save a region of the world into a schematic file (.mts).= +To get started, place the block facing directly in front of any bottom left corner of the structure you want to save. This block can only be accessed by the placer or by anyone with the “schematic_override” privilege.= +To save a region, use the block, enter the size and a schematic name and hit “Export schematic”. The file will always be saved in the world directory. Note you can use this name in the /placeschem command to place the schematic again.= +The other features of the schematic creator are optional and are used to allow to add randomness and fine-tuning.= +Y slices are used to remove entire slices based on chance. For each slice of the schematic region along the Y axis, you can specify that it occurs only with a certain chance. In the Y slice tab, you have to specify the Y slice height (0 @= bottom) and a probability from 0 to 255 (255 is for 100%). By default, all Y slices occur always.= +With a schematic node probability tool, you can set a probability for each node and enable them to overwrite all nodes when placed as schematic. This tool must be used prior to the file export.= +(owned by @1)= +This is an advanced tool which only makes sense when used together with a schematic creator. It is used to finetune the way how nodes from a schematic are placed.= +It allows you to set two things:= +1) Set probability: Chance for any particular node to be actually placed (default: always placed)= +2) Enable force placement: These nodes replace node other than air and ignore when placed in a schematic (default: off)= +BASIC USAGE:= +Punch to configure the tool. Select a probability (0-255; 255 is for 100%) and enable or disable force placement. Now place the tool on any node to apply these values to the node. This information is preserved in the node until it is destroyed or changed by the tool again. This tool has no effect on schematic voids.= +Now you can use a schematic creator to save a region as usual, the nodes will now be saved with the special node settings applied.= +NODE HUD:= +To help you remember the node values, the nodes with special values are labelled in the HUD. The first line shows probability and force placement (with “[F]”). The second line is the current distance to the node. Nodes with default settings and schematic voids are not labelled.= +To disable the node HUD, unselect the tool or hit “place” while not pointing anything.= +UPDATING THE NODE HUD:= +The node HUD is not updated automatically and may be outdated. The node HUD only updates the HUD for nodes close to you whenever you place the tool or press the punch and sneak keys simultaneously. If you sneak-punch a schematic creator, then the node HUD is updated for all nodes within the schematic creator's region, even if this region is very big.= +Schematic Void= +This is an utility block used in the creation of schematic files. It should be used together with a schematic creator. When saving a schematic, all nodes with a schematic void will be left unchanged when the schematic is placed again. Technically, this is equivalent to a block with the node probability set to 0.= +Just place the schematic void like any other block and use the schematic creator to save a portion of the world.= +Place schematic at the position specified or the current player position (loaded from @1). “-c” will clear the area first= +[.mts] [-c] [ ]= +No schematic file specified.= +Schematic file could not be loaded!= +List schematic files in world path= +No schematic files.= +Convert .mts schematic file to .lua file (loaded from @1)= +[.mts] [comments]= +Failed!= diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/make_readme.lua b/mods/minetest_schemedit-1.5.0-82afdd8/make_readme.lua new file mode 100644 index 0000000..4137bcf --- /dev/null +++ b/mods/minetest_schemedit-1.5.0-82afdd8/make_readme.lua @@ -0,0 +1,69 @@ +-- This file adds a command for generating the schemedit usage help readme +-- file, in Markdown format. The text is extracted from the metadata of +-- the items. This is only used for development purposes, after the +-- help text of any of the items was changed. + +-- How to use: Temporarily set MAKE_README to true in init.lua, then +-- start the game as admin and run “/make_schemedit_readme”. Copy the +-- generated file back to the mod directory (USAGE.md). + +-- Everything here is intentionally NOT translated because it is for text +-- files only. + + +-- Extract text from item definition +local get_text = function(item, field) + local text = minetest.registered_items[item][field] + + -- Remove translation escapes + text = string.gsub(text, "\x1BE", "") + text = string.gsub(text, "\x1B%(T@schemedit%)", "") + + -- Fix Markdown syntax error + text = string.gsub(text, "schematic_override", "`schematic_override`") + return text +end + + +-- Schemedit items to generate the readme from +local items = { "creator", "probtool", "void" } + +minetest.register_chatcommand("make_schemedit_readme", { + description = "Generate the schemedit usage help readme file", + privs = {server=true}, + func = function(name, param) + + local readme = "## Usage help".."\n" + readme = readme .. "In this section you'll learn how to use the items of this mod.".."\n" + readme = readme .. "Note: If you have the `doc` and `doc_items` mods installed, you can also access the same help texts in-game (possibly translated).".."\n\n" + + local entries = {} + for i=1, #items do + local item = items[i] + local desc = get_text("schemedit:"..item, "description") + local longdesc = get_text("schemedit:"..item, "_doc_items_longdesc") + local usagehelp = get_text("schemedit:"..item, "_doc_items_usagehelp") + + readme = readme .. "### "..desc.."\n" + readme = readme .. longdesc .."\n\n" + readme = readme .. "#### Usage\n" + readme = readme .. usagehelp + if i < #items then + readme = readme .. "\n\n\n" + end + end + + local path = minetest.get_worldpath().."/schemedit_readme.md" + local file = io.open(path, "w") + if not file then + return false, "Failed to open file!" + end + local ok = file:write(readme) + file:close() + if ok then + return true, "File written to: "..path + else + return false, "Failed to write file!" + end + end +}) diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/mod.conf b/mods/minetest_schemedit-1.5.0-82afdd8/mod.conf new file mode 100644 index 0000000..626faaf --- /dev/null +++ b/mods/minetest_schemedit-1.5.0-82afdd8/mod.conf @@ -0,0 +1,4 @@ +name = schemedit +optional_depends = doc +description = Advanced tool for modders and advanced users to create and edit schematics. +min_minetest_version = 5.0 diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/screenshot.png b/mods/minetest_schemedit-1.5.0-82afdd8/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..86433d1f0a00419fd7b654a607cced2d10b32b8e GIT binary patch literal 49064 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 wDx}HZgPtr3n>N2a!*%3mvv4FO#sk47eD|2 literal 0 HcmV?d00001 diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator.png b/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6ea34b84042aa20adce03237936239d673963d GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|8lEnWAr*|t7nB7jtbSNqWaQ|= u%gboNu+>z-I{8A@f^dzC+RHNMM={Ra!W&SZ(;)%W!{F)a=d#Wzp$Py3BN;OQ literal 0 HcmV?d00001 diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_bottom.png b/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..f0dc0a681f755a25a5a9f386a283be3e42743b33 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|PM$7~Ar*|t7nqyBpFHWnlKwzY zC6;-DtB_JG^QO0q77SwQf>#*aBTOEMI$CsYVC(RjWIExE$|4)zq79eKmu1e6Vzexb V5GcMD#|$)$!PC{xWt~$(697;UBQF2| literal 0 HcmV?d00001 diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_sides.png b/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_sides.png new file mode 100644 index 0000000000000000000000000000000000000000..6d3c6e4b9b940450a1039130e04f6c054e055645 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|3Z5>GAr*|t7nB7jtbSNqWaQ|= l%Ui&wZRgQu&X%Q~loCIAm06a)YO literal 0 HcmV?d00001 diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_top.png b/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_creator_top.png new file mode 100644 index 0000000000000000000000000000000000000000..5c26991a5d9f885170dd902613dee23fbd391175 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|?w&4=Ar*|t7nB7PE`G4HlbkGbeX!mT!)ZvBXjRplYfH#_?c a7#RM_pG_`Za`P9^NCr<=KbLh*2~7Z)Y$&Aw literal 0 HcmV?d00001 diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_probtool.png b/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_probtool.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd6b2a426c6aa7846d6cfc14716d80fa28e7ed8 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0Z;Ia&kaGfS!!`cOZwc zB*-tA!Qt7BG$6;t)5S5Qf>HN)BkKVNp09)qW=pUXO@geCyc C6ff2Q literal 0 HcmV?d00001 diff --git a/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_void.png b/mods/minetest_schemedit-1.5.0-82afdd8/textures/schemedit_void.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae57f9cbbe1b566fd9ff3b66c661f0b3c127f66 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X7xwE{-7; zjL8yt3JmNAmN#xtSa#?4lN1Z3FymB*>;QFw9-4xA!)0cNs{tr>mdK II;Vst0D?UpC;$Ke literal 0 HcmV?d00001 diff --git a/mods/nodez/dirt.lua b/mods/nodez/dirt.lua index bc65856..f93c1fb 100644 --- a/mods/nodez/dirt.lua +++ b/mods/nodez/dirt.lua @@ -110,7 +110,6 @@ minetest.register_node("nodez:clay_bricks", { sounds = sound.dirt(), }) - minetest.register_craft({ output = "nodez:clay_bricks 1", type = "shapeless", diff --git a/mods/nodez/locale/nodez.es.tr b/mods/nodez/locale/nodez.es.tr index 24e54eb..9b8b9f9 100644 --- a/mods/nodez/locale/nodez.es.tr +++ b/mods/nodez/locale/nodez.es.tr @@ -26,5 +26,6 @@ Ruby=Rubí Ruby Ore=Mineral de rubí Sand=Arena Sandstone=Piedra arenisca +Silex=Silex Stone=Piedra Water Source=Fuente de agua diff --git a/mods/nodez/stone.lua b/mods/nodez/stone.lua index 1d587bf..00d4dcd 100644 --- a/mods/nodez/stone.lua +++ b/mods/nodez/stone.lua @@ -28,5 +28,23 @@ minetest.register_node("nodez:gravel", { tiles ={"nodez_gravel.png"}, groups = {crumbly=2}, sounds = sound.gravel(), + drop = { + max_items = 1, + items = { + { + rarity = 10, + items = {"nodez:silex"}, + }, + { + items = {"nodez:gravel"}, + }, + } + } }) +--Silex + +minetest.register_craftitem("nodez:silex", { + description = S("Silex"), + inventory_image = "nodez_silex.png" +}) diff --git a/mods/nodez/textures/nodez_silex.png b/mods/nodez/textures/nodez_silex.png new file mode 100644 index 0000000000000000000000000000000000000000..e4110b403e0e3a89f3807fde4def8d126e81223c GIT binary patch literal 629 zcmV-*0*d{KP)|6LkkxX%UN!LJa<3B78niS74N*&9 zL;pdoL2E$}6hTB&e?VVL$n8BUC{gEf?)&38=Xp8jIpB`v^@80IhC;Dy#b={|rQ~v; z>lF`!^x!3;>9#pNKOf`Y@pX?&)w_`D_5Z#t$2%ws60m z)6&96!a++8D15E-RD)j>XB+&X*h<7_z^!@)vTdAdV?AdTgvW%33;BxPJde7G&nPY~ zNF9_pgiV}Tq6A1$VU0XxLQ;#8+26i!-8V-`Ji7c%s#xO4k`r%G)QWU9q-I1n`U?h000SaNLh0L01sgR01sgSs6VG^00022Nkl_b`&=0+?oN4M)n7+C1e}V>pYzJw6!+V^d z?KoY4uKDKaA21r;P)|6LkkxX%UN!LJa<3B78niS74N*&9 zL;pdoL2E$}6hTB&e?VVL$n8BUC{gEf?)&38=Xp8jIpB`v^@80IhC;Dy#b={|rQ~v; z>lF`!^x!3;>9#pNKOf`Y@pX?&)w_`D_5Z#t$2%ws60m z)6&96!a++8D15E-RD)j>XB+&X*h<7_z^!@)vTdAdV?AdTgvW%33;BxPJde7G&nPY~ zNF9_pgiV}Tq6A1$VU0XxLQ;#8+26i!-8V-`Ji7c%s#xO4k`r%G)QWU9q-I1n`U?h000SaNLh0L01sgR01sgSs6VG^0001ZNkl P00000NkvXXu0mjf2!;kP literal 0 HcmV?d00001 diff --git a/mods/tools/textures/tools_steeldagger.png b/mods/tools/textures/tools_irondagger.png similarity index 100% rename from mods/tools/textures/tools_steeldagger.png rename to mods/tools/textures/tools_irondagger.png diff --git a/mods/tools/textures/tools_ironpick.png b/mods/tools/textures/tools_ironpick.png new file mode 100644 index 0000000000000000000000000000000000000000..01e229760df790ca97854b6ee1d3cf73a7a24d2d GIT binary patch literal 645 zcmV;00($+4P)|6LkkxX%UN!LJa<3B78niS74N*&9 zL;pdoL2E$}6hTB&e?VVL$n8BUC{gEf?)&38=Xp8jIpB`v^@80IhC;Dy#b={|rQ~v; z>lF`!^x!3;>9#pNKOf`Y@pX?&)w_`D_5Z#t$2%ws60m z)6&96!a++8D15E-RD)j>XB+&X*h<7_z^!@)vTdAdV?AdTgvW%33;BxPJde7G&nPY~ zNF9_pgiV}Tq6A1$VU0XxLQ;#8+26i!-8V-`Ji7c%s#xO4k`r%G)QWU9q-I1n`U?h000SaNLh0L01sgR01sgSs6VG^0002INklYI8g>n zojUbDjQ!@#8x%f45M-(GKh0Y9Ke8rdHWMMuB1~TygxLS11fa6AGTaa*LYhIKW8V{$ z!1nO)z#oXnnr9t-j5Ve}t^ffRbP14u85r|6LkkxX%UN!LJa<3B78niS74N*&9 zL;pdoL2E$}6hTB&e?VVL$n8BUC{gEf?)&38=Xp8jIpB`v^@80IhC;Dy#b={|rQ~v; z>lF`!^x!3;>9#pNKOf`Y@pX?&)w_`D_5Z#t$2%ws60m z)6&96!a++8D15E-RD)j>XB+&X*h<7_z^!@)vTdAdV?AdTgvW%33;BxPJde7G&nPY~ zNF9_pgiV}Tq6A1$VU0XxLQ;#8+26i!-8V-`Ji7c%s#xO4k`r%G)QWU9q-I1n`U?h000SaNLh0L01sgR01sgSs6VG^0002LNkloH5Ka&ylTS4 X@IBwOF+60_8<1I^u6{1-oD!MaTScjr4myZ9WT@iMLRAn)twWb0rB<-&lB7*5Bxy)eq__$$4h09% z#jnBtKv%(4K@b!{#K}LvuSH5cX$mdU-p9-RadOY)z54)vN|iOMCk|-3ZDx`QVKuiV z^u5D}Ab2L<^!UqVGn-ii{BBR7*v3*D%Oz7IPm&{=T9KRQac>eT=qt<2 zqugV#kUgPgP52YgMpDXia1dQ zOr1LQKaBn6%^MUxK?7`UZU67uu^t`KwqUoc&j zEwam4d^(SIcw*tx2o& zS8e?@>9>tQp{hvDhpqXH#@S68g4c>mx>FFVdQ&MBb@0EeMQ@c;k- diff --git a/mods/tools/textures/tools_steelpick_l2.png b/mods/tools/textures/tools_steelpick_l2.png deleted file mode 100644 index 011df458460115f5b804abbfdb5c3fdb37c16604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X5|9E{-7; zjJ!gIGHW`BRKyy3P&_BmVP Wq-pLGd8F@wZ1!~Zb6Mw<&;$U7h(Tij diff --git a/mods/tools/textures/tools_steelshovel.png b/mods/tools/textures/tools_steelshovel.png deleted file mode 100644 index 8cab60784030675ea94d6efd9c89b369c208c3e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X7NkE{-7; zjL8d(UbHbLh00qLJh;2Noc%xp%hdp07RDG&7j?#~8@Fi*loniVF}2VvWRhI6f{j^f hm0V~qgTmD%3=I37950lnnKgq9^>p=fS?83{1OTuSC13ym diff --git a/mods/tools/textures/tools_stoneaxe.png b/mods/tools/textures/tools_stoneaxe.png index a374c547d7570d417f66b234b1b14811f9c9eb32..534930831ec215b5252a340623aa2143a4266821 100644 GIT binary patch delta 682 zcmV;b0#*Hj0k;K^8Gi-<001BJ|6u?C0dHwTLr`gBV*mgsk#&*1OF~f?#(!#2q~TCQ zM1w;`gMt)DW7*Im5oVCpa=l(P@Z)l?64Dy9Gz1M%OJ76(L9Ib+K@b!{L{oo2UrWgC zJt`qk*O5a-i!K4}XL7;3cBzwmCgNALHNg zb&pHcyO8Sj|GqzmH*MHDxVnWSx@nb#r-WncWmECCaKE0@(!xi=K}!xOe693UgI^S9 z8~mZzO2lWtt$GHsZJcUjJ!ch!$ApIq`HJ2=kGhG^C@wBY9h5nQO`KVx1V~X~jXY&S zQj3z=-@b6&H-AS-Ji7c%s#xO4k`r%G)QWU9q-I1n#N?ZRU^UJ!c8Ik!+gfxHU`o*ATDGSEf01H0N zxHJ(o09o_X=byp!*9RZ48i3aeFwG#qtsnr#Sy@^Ck;4VA0q0h~fMXDN_39OasHiA7 zJYa@k^?$<6(?5XtHpAQl&EODEcBuUiGDOCniNR1`nQ$1uG=e}ykU7J#Q+S=K#d?aKFwIY0MkrJBO}&?1l7zyHUN186z`+}09zqn_-)~z Q3jhEB07*qoM6N<$f?V}MfB*mh delta 112 zcmdna+Qc|PGLwmcfnmbL3^O3bRubeF45Wb|ZyEbUAZ709;uuoFm@Hv&;o?QdS+D;5 zsZsFUl4YRa$RD72vPwuu=s{J-C4ubKkCq(ayyDiBr6aU>RVE7qlcjP+<*m&QAfr58 L{an^LB{Ts5Xz3)b diff --git a/mods/tools/textures/tools_stoneshears.png b/mods/tools/textures/tools_stoneshears.png deleted file mode 100644 index 0b4bd3b748ea593cacf41fee29e53f94ea595823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn;`TPHJRxaujg=&K<_o zBvR`%;{~%>g8<7nW~P>e`r4xDrw!7i4^4b`yZFX)QO&3NcLK6Yw_Ll@q$|3>=2*ZX zhDbJz@Anv=?rgRYIDO|a1Aiw+fzjf`2YS}5&z4&LOn*>x%V&qHQNgFz+d@wriR&!V zN?4zq`ntvFe{r)+UFY-F8Z92r_VL-se-_|VcacBvzPe`446cU5h3i!`AFsN2xaI-3 YYU{bX+m9}C1Ui|))78&qol`;+03(N5%m4rY diff --git a/mods/tools/textures/tools_stoneshovel.png b/mods/tools/textures/tools_stoneshovel.png deleted file mode 100644 index 3c1bb48cb58e1a8f3f75ac8aa05ad0a6d7377d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X9+XE{-7; zjL8d(I$9Z%LZ>SL31t%jmJ_RX@7~RMGhsDTAbYrPMDt`J^$Ct$Sq2Lhz6!j`!4TvN Yv`1;D4ww9KRbh~Ep00i_>zopr0GYZW*8l(j diff --git a/mods/tools/textures/tools_stonesword.png b/mods/tools/textures/tools_stonesword.png deleted file mode 100644 index 6f3e94cda2f7dc43247258e43ebb8e0558701343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X3ZME{-7; zjL8c)KQu5VgK|E0A_l;*7ObDe%)!;ykz$ z$Y(4G@(X5gcy=QV$T9bHaSW-rm3!hKCxZhIlcVY1?=_V&O_ORll>5@0kN$R6^PTy# sW5Ffs$!wzcLfDS~Tgh|lT-jT8tEUX{oiANWfkrTRy85}Sb4q9e00WXNGynhq diff --git a/mods/tools/textures/tools_woodshears.png b/mods/tools/textures/tools_woodshears.png deleted file mode 100644 index 4ff92fd7cb24dd214e08b6a6dd34d9e85bc5be8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VWox&y^WFeX7Ba`PXnddE$ z=PhNaB9QAPk?$jy>m{1&C6?nXBkq10`lF2<4|zhDN3XE)M-oCr@B$B+uf zWCzBcCMJQl37jnlB_18)Nb8)Y?$IF8V|-d7+L7mADyP#kg|-r=#YK`HY0}J(XR;VH z2Y!=cj&Q4zj&SHHESI{mh5KfvK=RH@3(S_OF4)Duz-`9Ak@2}$1<(!#Pgg&ebxsLQ E0P9gca{vGU diff --git a/mods/tools/textures/tools_woodshovel.png b/mods/tools/textures/tools_woodshovel.png deleted file mode 100644 index 6cc52f8a1607e0ed86566e19301d168eb0dada77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X5O>E{-7; zjL8d(3W6TBC?tg*zqRUs;Ko&gQXEVvS6S<%SV9h8b@W)&)Ba1QB>v?;oRX>c z;qs67OO9}wHN>1PU~Ze5*1{&B7X7(?h1w+3#Wy_s?UR{iq$%{ik-cPc{MIT3X{JLi lma^+4J$owj5B#+TS|IZ$bvJL;O>>~>44$rjF6*2UngEbEFBkv- diff --git a/mods/treez/api.lua b/mods/treez/api.lua index 6682b61..d1d7884 100644 --- a/mods/treez/api.lua +++ b/mods/treez/api.lua @@ -8,18 +8,25 @@ function treez.register_tree(name, def) --Fruit if def.fruit then local fruit_name = "treez:"..def.fruit.name + local inventory_image + if def.fruit.inv_img then + inventory_image = "treez_"..def.fruit.name.."_inv.png" + else + inventory_image = "treez_"..def.fruit.name..".png" + end + minetest.register_node(fruit_name, { description = S(def.fruit.description), drawtype = "plantlike", tiles = {"treez_"..def.fruit.name..".png"}, - inventory_image = "treez_"..def.fruit.name.."_inv.png", + inventory_image = inventory_image, paramtype = "light", sunlight_propagates = true, walkable = false, is_ground_content = false, selection_box = { type = "fixed", - fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} + fixed = def.fruit.selection_box }, groups = {fleshy = 3, dig_immediate = 3, flammable = 2, leafdecay = 3, leafdecay_drop = 1}, @@ -52,6 +59,26 @@ function treez.register_tree(name, def) end end, }) + + if def.fruit.craft then + local craft_fruit_name = "treez:"..def.fruit.craft.name + + minetest.register_craftitem(craft_fruit_name, { + description = S(def.fruit.craft.description), + inventory_image = "treez_"..def.fruit.craft.name..".png", + groups = {fleshy = 3, flammable = 2, food = 1}, + on_use = function(itemstack, user, pointed_thing) + eat.item_eat(itemstack, user, craft_fruit_name, def.fruit.craft.hp, def.fruit.craft.hunger) + return itemstack + end, + }) + + minetest.register_craft({ + output = craft_fruit_name, + type = "shapeless", + recipe = {fruit_name}, + }) + end end --Sapling diff --git a/mods/treez/locale/treez.es.tr b/mods/treez/locale/treez.es.tr index 8123845..1f5890f 100644 --- a/mods/treez/locale/treez.es.tr +++ b/mods/treez/locale/treez.es.tr @@ -7,4 +7,7 @@ Apple=Manzana Apple Tree=de manzano Cherries=Cerezas Cherry Tree=de cerezo -Stick=Palo de madera +Chestnut=Castaña +Chestnut Burr=Erizo de castaña +Chestnut Tree=de castaño +Stick=Palo diff --git a/mods/treez/schematics/chestnut_tree.mts b/mods/treez/schematics/chestnut_tree.mts new file mode 100644 index 0000000000000000000000000000000000000000..deda8c3d3775cbf0bae461611a54bfe36c43fb9e GIT binary patch literal 204 zcmeYb3HD`RVPIw8WMHj_0iXbLVrCJ8a7j^WYL!)TMrv_MUTH~uQfW~UgA|$|h#Q}i znpl=v%pi$PuB50mFS}yS+zEkv2NXD*C2h~~?Od%tYmKqA)7F0i!Ev5vRb-#l_^w;K z^oYB1rBA^!mrQ|WZVWFI*k&}EB-j1CcUJUks?L|1zol&T3sWBVi9J|ps_C6qy3Bw7 TT|U2~+iF}B_cH$2k#`FKsTNZY literal 0 HcmV?d00001 diff --git a/mods/treez/textures/treez_apple_inv.png b/mods/treez/textures/treez_apple_inv.png index a270ba773cbac9b2e070675b583ba02faf937d57..243db2470c1ecfa4b301ed3fe04464a8088a7ca2 100644 GIT binary patch delta 492 zcmV!g|LIB#6#3dq2+1 zxy+n_P$FmK-P#!B3!amlh--863tIgPVWPA$M0?6`?Xjt;1b_dI&pT>Vy&X`!{@?fK zXiA%|0W}T6!-nm6!lS~8RnJzuB^))fskHE+aK9r56uwfr9`Li`Ou+Aootfk~gj7#0 zQ^k4}8(AkW+$Y?f&lQdGdDKms&BE-o)J~aQxFne%j)qQ=Wpa27NG(WafBRxTzDZWZ zW60lT4M!XqvVY?37quu|O{tdXrhGZpRPMj?bgiMmpnG#1>YjZ6tq1CNptSA#Uq`-Q zI)?BgTofw)70GGjL-g&6)_nkx4LG~3X!j z_7ScLhH<$J!+@Rh?_+g7E^lE3;=@z?B*hXF1BC!dM*)kT=>32L<^!UqVGn-ii{BBR7 z*v3*D%Oz7IPm&{=T9KRQac>eT=qt<2qugV#kUNUstJ$0P= z86W8dxYk?#GUqh+O}*CABF8{@2e`axY0?33wF`_q8=@&TqyV>HQGkyNU@!*^-2=gO zZ&uC!IDZ1N+kB!s;P42TV10Pw50x-y*`LIuvj6}936r1!6alc4wE=Hc3@@Zj7Xs6> zGT&in0vU)d#zbsj;_?=T3qUrL0+<*m1XyDMm-Dg30t+#=pa&dI7vOURdi3Em09%5> cl?tf>03%;VhJHg2-T(jq07*qoM6N<$f`~lXZvX%Q diff --git a/mods/treez/textures/treez_apple_tree_sapling.png b/mods/treez/textures/treez_apple_tree_sapling.png index 3a18523ec7b911fc071a4ff7b325c1bc4cb5a97c..0d791521b6d217484fac6bdaa7b18e056c8bfc53 100644 GIT binary patch delta 623 zcmV-#0+9XmHAb%~#_X9Rn?RTW$ z9!>r_B@A(-NPmlWT-2g;O-N0Oo{%p?N#*`OPcu0+S?lidL;H(meT+cI9#qPf^>bob zl~Zs$!&R>C&r41-U!s@mn)e9Y+i-DR*W&wdxdZ)Add!GbC5KFVG70bJ&>e-IJLp`k zW%akt*&{@@5Srvbc;0R%vr(Vb2d2(r}pAH<;dpXhWz4j^oRQ1k!*002ov JPDHLkV1mypCBpy! literal 7156 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 U_AH&o82|tP07*qoM6N<$f}Uz6>Hq)$ delta 639 zcmV-_0)YLuHo-QKIe#~5Bq|D8h*+dhu}}~NvD8?k2@+xiUrn-Z5+PZa-2@4?f{jJM zLbUN!_z$!dY!w7S5k#!~0lpfM^^O}zkYtwG`*CK@W#$ZMk*uC`8b={#=IvNG6kJ$b z3i@BsXePh_oeABsrlZjab;s8|4XWOas9yE=)f}y>hNDA6i+}KhZrOR^DdEUQ-cr0H z+^uI4tHMXZ!?qky_*&^nk6#q0J^oN^$73^~sh+`f6(_4$&)7NPA>sa9wxE~Kqi)h> znDcW|du8_F5F<>8AV~_WktNTFR8umm?Hm2`&9W{YUH%qDY;mN?h<8}jf^;>crbIX7 z%TiRi|IgD&jb)E{-P=OY^z6Ft1K{6W91j7 z)Mw$fm}L30oB`7WlaB`m0Sc4v1{jm92Md!{2PKmS2U(Ml2MLp!2OX1U1`h=`W;SCA zlX?b37cw$4F$yy6wSl9%SsNk!~ZgvwPiOcQ=5nI8=La-2R zd=>r!Z3SBeK~Mw{D}R8mM#6f>4J3%pGJ8MH%(={*flwl6Vy&X`!{@?fKXiA%|0W}T6!-nm6!lS~8RnJzuB^))f zskHE+aK9r56uwfr9`Li`Ou+Aootfk~gj7#0Q^k4}8(AkW+$Y?f&lQdGdDKms&BE-o z)J~aQxFne%j)qQ=Wpa27NG(WafBRxTzDZWZW60lT4M!Xqvf}L*wJ2Rpsg~%bd^y%s z?!WVNt)ao7dvhG>o_znU2kLjAwC(#}N4{S=hVUa?6e|7|$!X+6^zDk)eE^XSIJ>N9 z`YxPrLdS!ha#BB1SZ2tw;Pn(*=ArEd8W)4C%Ilom!_2xo(KYPtL$BV*yPX+V#1>NKQ7H65X7MOAEyCO%>)6mAxzjbt0n0&a0SU=)hxsC z7R3-IY>J+Icu#aJuwWDXw(beh1~5^Y4(M;d69!@235ifNB5Pj9aETGa1-Ozc2yi(u zVra&fl>cMX2m&4Zo-h)XnLvj8utqrW+hrMsC7+HnGEf@;06fnu>}f?kP5=M^07*qo IM6N<$f<4p}dH?_b literal 0 HcmV?d00001 diff --git a/mods/treez/textures/treez_chestnut_burr.png b/mods/treez/textures/treez_chestnut_burr.png new file mode 100644 index 0000000000000000000000000000000000000000..74374372e5b40354d312b5cc5706cbb567c1e00d GIT binary patch literal 605 zcmV-j0;2tiP)&ALg1WV7rhNU#-bECdVD z##iA#&{nWj5ClaKvGND_YDCsMNgyI-mf8DpX3k~i4EUp2Bj+{@L(VEVvFV7mkXY23 zUI@@j3!RMUhHFpG&PJ&_KJW0UdOM_g)!+B;Xj?H|1ANWGV}|V%geQcfYXw{JmTw;9#}Igg3#;bOOHSh-qHou<&;fL8z}aO@ zOYXw?CiFbmx}%q+fJ}cX1+S;jo`9|!XkDsgRbA)g9^&irMAxvl4+FBlWBCX0nrH** zI&bL!000SaNLh0L04^f{04^f|c%?sf0001#NklIfPuN&o)eBnkQa~x2b*_bhJw@~#{^NafDCZP0=g@( r`5oPMyvY~j8W<)vS(B9)h5-NoKABfkwY!VB00000NkvXXu0mjf<$Vh+ literal 0 HcmV?d00001 diff --git a/mods/treez/textures/treez_chestnut_burr_inv.png b/mods/treez/textures/treez_chestnut_burr_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..315149669d74c784abbabe471637645335c2c383 GIT binary patch literal 609 zcmV-n0-pVeP)6wSl9%SsNk!~ZgvwPiOcQ=5nI8=La-2R zd=>r!Z3SBeK~Mw{D}R8mM#6f>4J3%pGJ8MH%(={*flwl6Vy&X`!{@?fKXiA%|0W}T6!-nm6!lS~8RnJzuB^))f zskHE+aK9r56uwfr9`Li`Ou+Aootfk~gj7#0Q^k4}8(AkW+$Y?f&lQdGdDKms&BE-o z)J~aQxFne%j)qQ=Wpa27NG(WafBRxTzDZWZW60lT4M!Xqvf}L*wJ2Rpsg~%bd^y%s z?!WVNt)ao7dvhG>o_znU2kLjAwC(#}N4{S=hVUa?6e|7|$!X+6^zDk)eE^XSIJ>N9 z`YxPrLdS!ha#BB1SZ2tw;Pn(*=ArEd8W)4C%Ilom!_2xo(KYPtL$B(3O>~1o?tv#iJ2zX?aBp zyyK^rPQnBdx@}I+&BbUsejaI2^B`k4d$clGV)S`4vOEpAK%a^01 za{r&FZH$M#?p+aRdv)EAskf@k$& zeV57r000SaNLh0L01sgR01sgSs6VG^0001)Nkl2fj`v3p{07*qoM6N<$f{3{a`2YX_ literal 0 HcmV?d00001 diff --git a/mods/treez/textures/treez_chestnut_tree_sapling.png b/mods/treez/textures/treez_chestnut_tree_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..061fac2092ade0c5ee13cce4d2356e8077b2857e GIT binary patch literal 665 zcmV;K0%rY*P)%bIOI$mR-0INRTW$9!>r_B@A(-NQ-w|)S`4vNKJ~KkS{|? z<^DfUGdVR`>+bSH`-^3Lj6la8RLYk1b7EPQQ*b=PRj%&OOHMOiqL=HM_XynEaB*GN z;`?y91N~2W%!pMbhfI4i3Ge679fh7d=v=L3^|#L1BSg03iEiQG5JqLcd+it0d1v-i z%5tXw000SaNLh0L01sgR01sgSs6VG^0002cNklLv*0nzSHUxP7B?9s#j42n)h|M41tY{;q~>;zqh z5(e)-ege~B96!ODVYDDSLjJ?qJB&D8fGi2p45L9BVTKcxkU&7dSmi&=5Rfa-ZN?i0 zFxLpN|Hp6{(FPC;@EY*$CnIGBfB?)JH1h%g8q{HuVP}Vn00000NkvXXu0mjf`!XaK literal 0 HcmV?d00001 diff --git a/mods/treez/textures/treez_chestnut_tree_trunk.png b/mods/treez/textures/treez_chestnut_tree_trunk.png new file mode 100644 index 0000000000000000000000000000000000000000..d5585fee91da53c80d856c12417ac9b98a2e486d GIT binary patch literal 633 zcmV-<0*3vGP)3O>~1o?tv#iJ2zX?aBp zyyK^rPQnBdx@}I+&BbUsejaI2^B`k4d$clGV)S`4vOEpAK%a^01 za{r&FZH$M#?p+aRdv)EAskf@k$& zeV57r000SaNLh0L01sgR01sgSs6VG^00026Nkl=_CjTMU+vWL;`Oh%Mz#r?Yc;t3O>~1o?tv#iJ2zX?aBp zyyK^rPQnBdx@}I+&BbUsejaI2^B`k4d$clGV)S`4vOEpAK%a^01 za{r&FZH$M#?p+aRdv)EAskf@k$& zeV57r000SaNLh0L01sgR01sgSs6VG^0001nNkl8G!6;vJw)p&c3O>~1o?tv#iJ2zX?aBp zyyK^rPQnBdx@}I+&BbUsejaI2^B`k4d$clGV)S`4vOEpAK%a^01 za{r&FZH$M#?p+aRdv)EAskf@k$& zeV57r000SaNLh0L01sgR01sgSs6VG^0001@NklV^_D!-e#8fG0eNGXP8cV@(Ihe#4e8(9-}20027XNcT6l_~HNn002ovPDHLk FV1lA7488yW literal 0 HcmV?d00001 diff --git a/mods/treez/trees.lua b/mods/treez/trees.lua index acbdfd7..d923e13 100644 --- a/mods/treez/trees.lua +++ b/mods/treez/trees.lua @@ -5,7 +5,9 @@ treez.register_tree("apple_tree", { name = "apple", description = "Apple", hp = 2, - hunger = 1.5 + hunger = 1.5, + inv_img = true, + selection_box = {-3/16, -6/16, -3/16, 3/16, 8/16, 3/16} }, deco = { biomes = {"forest"}, @@ -29,6 +31,8 @@ treez.register_tree("cherry_tree", { description = "Cherries", hp = 1.5, hunger = 1, + inv_img = true, + selection_box = {-3/16, -1/16, -3/16, 3/16, 8/16, 3/16} }, deco = { biomes = {"forest"}, @@ -43,3 +47,34 @@ treez.register_tree("cherry_tree", { }, } }) + +--Oak Tree +treez.register_tree("chestnut_tree", { + description = "Chestnut Tree", + fruit = { + name = "chestnut_burr", + description = "Chestnut Burr", + hp = -2, + hunger = 0, + inv_img = true, + selection_box = {-3/16, -3/16, -3/16, 3/16, 8/16, 3/16}, + craft = { + name= "chestnut", + description = "Chestnut", + hp = 2, + hunger = 3 + } + }, + deco = { + biomes = {"forest"}, + place_on = "nodez:dirt_with_grass", + noise_params = { + offset = -0.005, + scale = 0.008, + spread = {x = 250, y = 250, z = 250}, + seed = 6702, + octaves = 3, + persist = 0.66 + }, + } +})