From e845c9f5c7c0e5e14d1c43045e6deee9bd16f126 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Wed, 14 Jun 2017 19:52:34 +0200 Subject: [PATCH] new --- LICENSE.txt | 13 ++ README.md | 18 +++ depends.txt | 1 + description.txt | 1 + hammer.lua | 76 ++++++++++ init.lua | 257 ++++++++++++++++++++++++++++++++ textures/gravelsieve_gravel.png | Bin 0 -> 2336 bytes textures/gravelsieve_hammer.png | Bin 0 -> 1325 bytes textures/gravelsieve_sieve.png | Bin 0 -> 1986 bytes textures/gravelsieve_top.png | Bin 0 -> 934 bytes 10 files changed, 366 insertions(+) create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 depends.txt create mode 100644 description.txt create mode 100644 hammer.lua create mode 100644 init.lua create mode 100644 textures/gravelsieve_gravel.png create mode 100644 textures/gravelsieve_hammer.png create mode 100644 textures/gravelsieve_sieve.png create mode 100644 textures/gravelsieve_top.png diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..1592dbb --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,13 @@ +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e523a68 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Gravel Sieve Mod +This mod include two new tools: + - a hammer to produce gravel from cobble + - a sieve to sift gravel in order to find ores. + +Browse on: ![GitHub](https://github.com/joe7575/Minetest-Gravelsieve) + +Download: ![GitHub](https://github.com/joe7575/Minetest-Gravelsieve/archive/master.zip) + + +## Dependencies +default + +# License +Copyright (C) 2017 Joachim Stolberg +Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt +Textures: CC0 + diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/depends.txt @@ -0,0 +1 @@ +default diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..e20287d --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +This mod includes a hammer to produce gravel, and a sieve to sift gravel in order to find ores. diff --git a/hammer.lua b/hammer.lua new file mode 100644 index 0000000..f52bb65 --- /dev/null +++ b/hammer.lua @@ -0,0 +1,76 @@ +--[[ + + Gravel Sieve Mod + ================ + + v0.01 by JoSt + Derived from the work of RealBadAngel, Maciej Kasatkin (screwdriver) + + Copyright (C) 2017 Joachim Stolberg + Copyright (C) 2013-2016 RealBadAngel, Maciej Kasatkin + Copyright (C) 2013-2016 Various Minetest developers and contributors + + LGPLv2.1+ + See LICENSE.txt for more information + + History: + 2017-06-04 v0.01 first version + +]]-- + + +gravelsieve.disallow = function(pos, node, user, mode, new_param2) + return false +end + +-- Handles rotation +gravelsieve.handler = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return + end + + local node = minetest.get_node(pos) + if node.name == "default:cobble" then + node.name = "default:gravel" + minetest.swap_node(pos, node) + minetest.sound_play({ + name="default_dig_crumbly"},{ + gain=1, + max_hear_distance=20, + loop=false}) + end + + return itemstack +end + +-- hammer +minetest.register_tool("gravelsieve:hammer", { + description = "Hammer converts any kind of stone to gravel", + inventory_image = "gravelsieve_hammer.png", + on_use = function(itemstack, user, pointed_thing) + hammer.handler(itemstack, user, pointed_thing) + return itemstack + end, +-- on_place = function(itemstack, user, pointed_thing) +-- hammer.handler(itemstack, user, pointed_thing) +-- return itemstack +-- end, +}) + + +minetest.register_craft({ + output = "gravelsieve:hammer", + recipe = { + {"", "default:steel_ingot", ""}, + {"", "group:stick", "default:steel_ingot"}, + {"group:stick", "", ""}, + } +}) + diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..7b6af2d --- /dev/null +++ b/init.lua @@ -0,0 +1,257 @@ +--[[ + + Gravel Sieve Mod + ================ + + v0.01 by JoSt + Derived from the work of celeron55, Perttu Ahola (furnace) + + Copyright (C) 2017 Joachim Stolberg + Copyright (C) 2011-2016 celeron55, Perttu Ahola + Copyright (C) 2011-2016 Various Minetest developers and contributors + + LGPLv2.1+ + See LICENSE.txt for more information + + History: + 2017-06-04 v0.01 first version + +]]-- + +gravelsieve = { + rand = PseudoRandom(1234) +} + +dofile(minetest.get_modpath("gravelsieve") .. "/hammer.lua") + + +local sieve_table = { + iron_lump = 15, + copper_lump = 15, + tin_lump = 15, + gold_lump = 25, + mese_crystal = 25, + diamond = 50, +} + + +local sieve_formspec = + "size[8,8]".. + "list[context;src;1,1;1,1;]".. + "image[3,1;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[context;dst;4,0;4,3;]".. + "list[current_player;main;0,4;8,4;]" + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("dst") and inv:is_empty("src") + --return true +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function swap_node(pos, meta) + local node = minetest.get_node(pos) + + idx = meta:get_int("idx") + idx = (idx + 1) % 4 + meta:set_int("idx", idx) + node.name = "gravelsieve:sieve"..idx + minetest.swap_node(pos, node) + return idx == 3 +end + +local function random_ore(inv, src) + local num + local result = false + for ore, probability in pairs(sieve_table) do + if src:get_name() == "gravelsieve:gravel1" then + probability = probability * 2 + elseif src:get_name() == "gravelsieve:gravel2" then + probability = probability * 4 + elseif src:get_name() == "gravelsieve:gravel3" then + probability = probability * 8 + end + num = gravelsieve.rand:next(0, probability) + if num == probability then + item = ItemStack("default:"..ore) + if inv:room_for_item("dst", item) then + inv:add_item("dst", item) + return true + end + end + end + return result +end + +local function move_src2dst(meta, pos, inv, src, dst) + if inv:room_for_item("dst", dst) and inv:contains_item("src", src) then + local res = swap_node(pos, meta) + if res then + if not random_ore(inv, src) then + inv:add_item("dst", dst) + end + inv:remove_item("src", src) + end + return true + end + return false +end + + +local function sieve_node_timer(pos, elapsed) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local gravel = ItemStack("default:gravel") + local gravel1 = ItemStack("gravelsieve:gravel1") + local gravel2 = ItemStack("gravelsieve:gravel2") + local gravel3 = ItemStack("gravelsieve:gravel3") + + if move_src2dst(meta, pos, inv, gravel, gravel1) then + return true + elseif move_src2dst(meta, pos, inv, gravel1, gravel2) then + return true + elseif move_src2dst(meta, pos, inv, gravel2, gravel3) then + return true + else + minetest.get_node_timer(pos):stop() + return false + end +end + + +for idx = 0,4 do + local nodebox_data = { + { -8/16, -8/16, -8/16, 8/16, 4/16, -6/16 }, + { -8/16, -8/16, 6/16, 8/16, 4/16, 8/16 }, + { -8/16, -8/16, -8/16, -6/16, 4/16, 8/16 }, + { 6/16, -8/16, -8/16, 8/16, 4/16, 8/16 }, + { -6/16, -2/16, -6/16, 6/16, 8/16, 6/16 }, + } + nodebox_data[5][5] = (8 - 2*idx) / 16 + + local tiles_data = { + -- up, down, right, left, back, front + "gravelsieve_gravel.png", + "gravelsieve_gravel.png", + "gravelsieve_sieve.png", + "gravelsieve_sieve.png", + "gravelsieve_sieve.png", + "gravelsieve_sieve.png", + } + if idx == 3 then + tiles_data[1] = "gravelsieve_top.png" + end + + minetest.register_node("gravelsieve:sieve"..idx, { + description = "Gravel Sieve "..idx, + tiles = tiles_data, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodebox_data, + }, + + can_dig = can_dig, + on_timer = sieve_node_timer, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("idx", idx) + meta:set_string("formspec", sieve_formspec) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('dst', 12) + end, + + on_metadata_inventory_move = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + + on_metadata_inventory_take = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + + on_metadata_inventory_put = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3, stone=1, uber=1}, + }) +end + +minetest.register_node("gravelsieve:gravel1", { + description = "Gravel sifted 1", + tiles = {"default_gravel.png"}, + groups = {crumbly = 2, falling_node = 1}, + sounds = default.node_sound_gravel_defaults(), + drop = { + max_items = 1, + items = { + {items = {'default:flint'}, rarity = 16}, + {items = {'default:gravel'}} + } + } +}) + +minetest.register_node("gravelsieve:gravel2", { + description = "Gravel sifted 2", + tiles = {"default_gravel.png"}, + groups = {crumbly = 2, falling_node = 1}, + sounds = default.node_sound_gravel_defaults(), + drop = { + max_items = 1, + items = { + {items = {'default:flint'}, rarity = 16}, + {items = {'default:gravel'}} + } + } +}) + +minetest.register_node("gravelsieve:gravel3", { + description = "Gravel sifted 3", + tiles = {"default_gravel.png"}, + groups = {crumbly = 2, falling_node = 1}, + sounds = default.node_sound_gravel_defaults(), + drop = { + max_items = 1, + items = { + {items = {'default:flint'}, rarity = 16}, + {items = {'default:gravel'}} + } + } +}) diff --git a/textures/gravelsieve_gravel.png b/textures/gravelsieve_gravel.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1813a349d55bee7748f0e3e18440c6458c3062 GIT binary patch literal 2336 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 jHC^Yrc~711 zNZg~>e)xP4i$=+&lMIFk^HIF?5}DGLG$x@g+fTFeG8daXk;u_Xz@!2&iql;=ur(>$1AG#*x)!b|y#L z>XJ<-nM@`$b{q8jJqr08&e$cLj1vUV>kn|8F^R;~lF7s+6bj)^COG3U60mpB#4xl6 z0}SmkvJm7lX*5k^b|!-&%N(}axUNeg7NgVcAuBS9s?utAkQIfcb7gAVJ47N8Y{wxI zHaKV=F&f#ltq$|00z$|S2IviJ(y1hetroprA46AhJ&(y`LOd2B95x6WDniJZi8$Gm ziKeQI9Ea2MCFV*+X0s`}-7ev9h}rxMLRKK~Icl};1CZYS&6S|>o;sBAVT%x6?Q*TeIn>wu~%1n!uL2;)m( zM!kLXa2m0`b{jpMK-C0_s-oxOct!{{l3;OZk;c%8i?w$62_wH@)6%%KUSE zLdTKObq&ohNYCa78v%+c<9Qykwp)9{OemPi7`>w=LKc*lm#}+H-uvq|3-bn>w>Jm^ zAEAbcWpm6Irwu1!CW$6f_<={%G#OYH`SK!*MH7HhA&%8okz|E@CQ8(d(mp(*{LpDe z{T|U+43SB=coQ2%)zS57W8A4#0r=U^F9ML7HRJxEuOsc`ZWC?zR$&%USX$JWv5nU?eBl%(Wjn2UU&A=cLBJ4?IVP& zApC%kCb9PM3K0WTC5-&+qWnfOo8#(xb+U6Qp8Cm8!B^-s8#Fd|krj!ZwJKi7WQ>aE z^k6(9ZYGJFNd`wp+-$%jXA1PJHV4}^iVJ0SYE@c|`f*JZOog}JUq$sH8iQLaeRgXW z(wo12G1#os$mC*dZyr*uIXr%$h-qqURVvJ#JWyK4gsM)@Ff%Ezdlv0hlaMaxYxU)}cF3lGo-8x=-x*TSsI%Iy%NBZ+`e-uncHUMMKbIz3WD3b8`s12aiP zK~z}7#g{!y6LA>EpQG1rY|B^M3rJf83Pr+)Kq_LwWU4X7foL3z5)&g46IK_);^JTc z6Bk*GgHA3w7-J$)j7uB$_lI)!gzZjcHoTD!V2>vE#8vpc7JNe9IY zuB|Mh)L4%B=}BxvHo=c&3MH(yMv$s9NcQ50tS2Fp%McE&;)J#k;nhe^`307yGdSH~ z0v(IO>m!gEZ^w7Rka_^X+(Hb=BmrA%8&WJllJcDMC1;GPw#HKSMd?llqesJnjito7&-Vxj@(VL1Un>xb=Jp|%7|KU~<}C9q?=2dC4C z{l{*%A8UN8B?`VCG17aAvsh~|@%|$^9nEmES70_BoangUn_r%QuSdKbuyK6b42|nW zIr)Bkqb?w@DKXk_aDjjWnJ%Cl{rTrWK3$N-flL>CinZjI1NnAA z76%R+$@0p9%#lp&9?0TA=13;?OxRQH6O3eJdXusI-DCzXR{jBn6OHG2yWVaT_AcJ8 zrvTJi{;v0L`P*@wKrd?~+uBMBK%pxs6;wPm6@Y|HpGu=ufnlXb%4hc=7|9BhN+sGa zUqH330Zd9F`fix1Cvh|v4<_O<6sZ`*=oBKsfT+762Y|2l8#|;ZqWVy6kN^Mx07*qo IM6N<$f*)p^v;Y7A literal 0 HcmV?d00001