From 017141f5ee94bab741cbbafc645568595d91d72a Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sat, 17 Jun 2017 16:19:36 +0200 Subject: [PATCH] V0.04 Reworked for Automatic and (standard) Gravel sieves --- init.lua | 297 +++++++++++++++++++++++++---------------------- settingtypes.txt | 8 +- 2 files changed, 166 insertions(+), 139 deletions(-) diff --git a/init.lua b/init.lua index 83c8056..7e20602 100644 --- a/init.lua +++ b/init.lua @@ -3,7 +3,7 @@ Gravel Sieve Mod ================ - v0.03 by JoSt + v0.04 by JoSt Derived from the work of celeron55, Perttu Ahola (furnace) Copyright (C) 2017 Joachim Stolberg @@ -16,39 +16,37 @@ History: 2017-06-14 v0.01 First version 2017-06-15 v0.02 Manually use of the sieve added - 2017-06-17 v0.03 * Settings bug fixed - * Drop bug fixed - * Compressed Gravel block added (Inspired by Modern Hippie) - * Recipes for Compressed Gravel added + 2017-06-17 v0.03 * Settings bug fixed + * Drop bug fixed + * Compressed Gravel block added (Inspired by Modern Hippie) + * Recipes for Compressed Gravel added + 2017-06-17 v0.04 * Support for manual and automatic gravel sieve + * Rarity now configurable + * Output is 50% gravel and 50% sieved gravel ]]-- gravelsieve = { - rand = PseudoRandom(1234) } dofile(minetest.get_modpath("gravelsieve") .. "/hammer.lua") -gravelsieve.manually = minetest.settings:get("gravelsieve_enable_manual_mode") == "true" +gravelsieve.ore_rarity = tonumber(minetest.setting_get("gravelsieve_ore_rarity")) or 1.0 -- Ore probability table (1/n) local ore_probability = { - iron_lump = 15, - copper_lump = 15, - --tin_lump = 15, not available in V0.4.15 - gold_lump = 25, - mese_crystal = 25, - diamond = 50, + iron_lump = 35, + copper_lump = 60, + tin_lump = 80, + gold_lump = 175, + mese_crystal = 275, + diamond = 340, } --- gravel probability factor -local probability_factor = { - ["default:gravel"] = 1, - ["gravelsieve:gravel1"] = 2, - ["gravelsieve:gravel2"] = 4, - ["gravelsieve:gravel3"] = 8, - -} +-- check if tin is available +if ItemStack("default:tin_lump") == nil then + ore_probability[tin_lump] = nil -- not available +end local sieve_formspec = "size[8,8]".. @@ -88,16 +86,16 @@ end -- handle the sieve animation local function swap_node(pos, meta, start) local node = minetest.get_node(pos) - local idx = meta:get_int("idx") - if start then - if idx == 3 then - idx = 0 - end - else - idx = (idx + 1) % 4 - end + local idx = meta:get_int("idx") + if start then + if idx == 3 then + idx = 0 + end + else + idx = (idx + 1) % 4 + end meta:set_int("idx", idx) - node.name = "gravelsieve:sieve"..idx + node.name = meta:get_string("node_name")..idx minetest.swap_node(pos, node) return idx == 3 end @@ -106,34 +104,52 @@ end local function random_ore(inv, src) local num for ore, probability in pairs(ore_probability) do - probability = probability * probability_factor[src:get_name()] - if probability ~= nil then - 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 -- ore placed - end - end + -- calculate the probability based on user configuration + probability = probability * gravelsieve.ore_rarity + if probability ~= nil then + if math.random(probability) == 1 then + local item = ItemStack("default:"..ore) + if inv:room_for_item("dst", item) then + inv:add_item("dst", item) + return true -- ore placed + end + end end end return false -- gravel has to be moved end + +local function add_gravel_to_dst(meta, inv) + -- maintain a counter for gravel kind selection + local gravel_cnt = meta:get_int("gravel_cnt") + 1 + meta:set_int("gravel_cnt", gravel_cnt) + + if (gravel_cnt % 2) == 0 then -- gravel or sieved gravel? + inv:add_item("dst", ItemStack("default:gravel")) -- add to dest + else + inv:add_item("dst", ItemStack("gravelsieve:sieved_gravel")) -- add to dest + end +end + + -- move gravel and ores to dst 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, false) - if res then - if not random_ore(inv, src) then - inv:add_item("dst", dst) + if res then -- time to move one item? + if src:get_name() == "default:gravel" then -- will we find ore? + if not random_ore(inv, src) then -- no ore found? + add_gravel_to_dst(meta, inv) + end + else + inv:add_item("dst", ItemStack("gravelsieve:sieved_gravel")) -- add to dest end inv:remove_item("src", src) end - return true + return true -- process finished end - return false + return false -- process still running end -- timer callback, alternatively called by on_punch @@ -141,27 +157,19 @@ 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") + local gravel_sieved = ItemStack("gravelsieve:sieved_gravel") - if move_src2dst(meta, pos, inv, gravel, gravel1) then + if move_src2dst(meta, pos, inv, gravel) 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 - elseif move_src2dst(meta, pos, inv, gravel3, gravel3) then + elseif move_src2dst(meta, pos, inv, gravel_sieved) then return true else - if not gravelsieve.manually then - minetest.get_node_timer(pos):stop() + minetest.get_node_timer(pos):stop() return false - end end end - +for automatic = 0,1 do for idx = 0,4 do local nodebox_data = { { -8/16, -8/16, -8/16, 8/16, 4/16, -6/16 }, @@ -172,40 +180,63 @@ for idx = 0,4 do } 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", - } + local node_name + local description + local tiles_data + if automatic == 0 then + node_name = "gravelsieve:sieve" + description = "Gravel Sieve" + 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", + } + else + node_name = "gravelsieve:auto_sieve" + description = "Automatic Gravel Sieve" + tiles_data = { + -- up, down, right, left, back, front + "gravelsieve_gravel.png", + "gravelsieve_gravel.png", + "gravelsieve_auto_sieve.png", + "gravelsieve_auto_sieve.png", + "gravelsieve_auto_sieve.png", + "gravelsieve_auto_sieve.png", + } + end + if idx == 3 then tiles_data[1] = "gravelsieve_top.png" not_in_creative_inventory = 0 else not_in_creative_inventory = 1 end - - minetest.register_node("gravelsieve:sieve"..idx, { - description = "Gravel Sieve", + + + minetest.register_node(node_name..idx, { + description = description, tiles = tiles_data, drawtype = "nodebox", node_box = { type = "fixed", fixed = nodebox_data, }, - selection_box = { - type = "fixed", - fixed = { -8/16, -8/16, -8/16, 8/16, 4/16, 8/16 }, - }, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, 4/16, 8/16 }, + }, on_timer = sieve_node_timer, on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_int("idx", idx) + meta:set_int("idx", idx) -- for the 4 sieve phases + meta:set_int("gravel_cnt", 0) -- counter to switch between gravel and sieved gravel + meta:set_string("node_name", node_name) meta:set_string("formspec", sieve_formspec) local inv = meta:get_inventory() inv:set_size('src', 1) @@ -213,55 +244,55 @@ for idx = 0,4 do end, on_metadata_inventory_move = function(pos) - if gravelsieve.manually then - local meta = minetest.get_meta(pos) - swap_node(pos, meta, true) - else - minetest.get_node_timer(pos):start(1.0) - end + if automatic == 0 then + local meta = minetest.get_meta(pos) + swap_node(pos, meta, true) + else + minetest.get_node_timer(pos):start(1.0) + end end, on_metadata_inventory_take = function(pos) - if gravelsieve.manually then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if inv:is_empty("src") then - -- sieve should be empty - meta:set_int("idx", 2) - swap_node(pos, meta, false) - end - else - minetest.get_node_timer(pos):start(1.0) - end + if automatic == 0 then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("src") then + -- sieve should be empty + meta:set_int("idx", 2) + swap_node(pos, meta, false) + meta:set_int("gravel_cnt", 0) + end + else + minetest.get_node_timer(pos):start(1.0) + end end, on_metadata_inventory_put = function(pos) - if gravelsieve.manually then - local meta = minetest.get_meta(pos) - swap_node(pos, meta, true) - else - minetest.get_node_timer(pos):start(1.0) - end + if automatic == 0 then + local meta = minetest.get_meta(pos) + swap_node(pos, meta, true) + else + minetest.get_node_timer(pos):start(1.0) + end end, - on_punch = function(pos, node, puncher, pointed_thing) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if inv:is_empty("dst") and inv:is_empty("src") then - minetest.node_punch(pos, node, puncher, pointed_thing) - else - -- punching the sieve speeds up the process - sieve_node_timer(pos, 0) - end - end, + on_punch = function(pos, node, puncher, pointed_thing) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_punch(pos, node, puncher, pointed_thing) + else + sieve_node_timer(pos, 0) + end + end, - on_dig = function(pos, node, puncher, pointed_thing) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if inv:is_empty("dst") and inv:is_empty("src") then - minetest.node_dig(pos, node, puncher, pointed_thing) - end - end, + on_dig = function(pos, node, puncher, pointed_thing) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_dig(pos, node, puncher, pointed_thing) + end + end, allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, @@ -273,31 +304,18 @@ for idx = 0,4 do groups = {choppy=2, cracky=1, not_in_creative_inventory=not_in_creative_inventory}, }) end +end -minetest.register_node("gravelsieve:gravel1", { - description = "Gravel sifted 1", +minetest.register_node("gravelsieve:sieved_gravel", { + description = "Sieved Gravel", tiles = {"default_gravel.png"}, - groups = {crumbly = 2, falling_node = 1, not_in_creative_inventory=1, gravel = 1}, - sounds = default.node_sound_gravel_defaults(), -}) - -minetest.register_node("gravelsieve:gravel2", { - description = "Gravel sifted 2", - tiles = {"default_gravel.png"}, - groups = {crumbly = 2, falling_node = 1, not_in_creative_inventory=1, gravel = 1}, - sounds = default.node_sound_gravel_defaults(), -}) - -minetest.register_node("gravelsieve:gravel3", { - description = "Gravel sifted 3", - tiles = {"default_gravel.png"}, - groups = {crumbly = 2, falling_node = 1, not_in_creative_inventory=1, gravel = 1}, + groups = {crumbly=2, falling_node=1, not_in_creative_inventory=1}, sounds = default.node_sound_gravel_defaults(), }) minetest.register_node("gravelsieve:compressed_gravel", { description = "Compressed Gravel", - tiles = {"gravelsieve_compressed_gravel.png"}, + tiles = {"gravelsieve_compressed_gravel.png"}, groups = {crumbly = 2, cracky = 2}, sounds = default.node_sound_gravel_defaults(), }) @@ -311,11 +329,18 @@ minetest.register_craft({ }, }) +minetest.register_craft({ + output = "gravelsieve:auto_sieve", + recipe = { + {"gravelsieve:sieve", "default:mese_crystal", "default:mese_crystal"}, + }, +}) + minetest.register_craft({ output = "gravelsieve:compressed_gravel", recipe = { - {"group:gravel", "group:gravel"}, - {"group:gravel", "group:gravel"}, + {"gravelsieve:sieved_gravel", "gravelsieve:sieved_gravel"}, + {"gravelsieve:sieved_gravel", "gravelsieve:sieved_gravel"}, }, }) @@ -326,6 +351,6 @@ minetest.register_craft({ cooktime = 10, }) - minetest.register_alias("gravelsieve:sieve", "gravelsieve:sieve3") +minetest.register_alias("gravelsieve:auto_sieve", "gravelsieve:auto_sieve3") diff --git a/settingtypes.txt b/settingtypes.txt index b549e45..968a161 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,3 +1,5 @@ -# If enabled, you have to punch the sieve to operate. -# If disabled, the sieve will operate automatically. -gravelsieve_enable_manual_mode (Enable manual mode) bool false \ No newline at end of file +# Rarity factor to find ores when sieving with the Gravel Sieve +# 1.0 is according to the mapgen generator +# 2.0 means half as many ores as result +# 0.5 means twice as many ores as result +gravelsieve_ore_rarity (Rarity factor to find ores) float 1.0 \ No newline at end of file