V0.04 Reworked for Automatic and (standard) Gravel sieves

This commit is contained in:
Joachim Stolberg 2017-06-17 16:19:36 +02:00
parent 3aea9fe194
commit 017141f5ee
2 changed files with 166 additions and 139 deletions

297
init.lua
View File

@ -3,7 +3,7 @@
Gravel Sieve Mod Gravel Sieve Mod
================ ================
v0.03 by JoSt v0.04 by JoSt
Derived from the work of celeron55, Perttu Ahola (furnace) Derived from the work of celeron55, Perttu Ahola (furnace)
Copyright (C) 2017 Joachim Stolberg Copyright (C) 2017 Joachim Stolberg
@ -16,39 +16,37 @@
History: History:
2017-06-14 v0.01 First version 2017-06-14 v0.01 First version
2017-06-15 v0.02 Manually use of the sieve added 2017-06-15 v0.02 Manually use of the sieve added
2017-06-17 v0.03 * Settings bug fixed 2017-06-17 v0.03 * Settings bug fixed
* Drop bug fixed * Drop bug fixed
* Compressed Gravel block added (Inspired by Modern Hippie) * Compressed Gravel block added (Inspired by Modern Hippie)
* Recipes for Compressed Gravel added * 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 = { gravelsieve = {
rand = PseudoRandom(1234)
} }
dofile(minetest.get_modpath("gravelsieve") .. "/hammer.lua") 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) -- Ore probability table (1/n)
local ore_probability = { local ore_probability = {
iron_lump = 15, iron_lump = 35,
copper_lump = 15, copper_lump = 60,
--tin_lump = 15, not available in V0.4.15 tin_lump = 80,
gold_lump = 25, gold_lump = 175,
mese_crystal = 25, mese_crystal = 275,
diamond = 50, diamond = 340,
} }
-- gravel probability factor -- check if tin is available
local probability_factor = { if ItemStack("default:tin_lump") == nil then
["default:gravel"] = 1, ore_probability[tin_lump] = nil -- not available
["gravelsieve:gravel1"] = 2, end
["gravelsieve:gravel2"] = 4,
["gravelsieve:gravel3"] = 8,
}
local sieve_formspec = local sieve_formspec =
"size[8,8]".. "size[8,8]"..
@ -88,16 +86,16 @@ end
-- handle the sieve animation -- handle the sieve animation
local function swap_node(pos, meta, start) local function swap_node(pos, meta, start)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local idx = meta:get_int("idx") local idx = meta:get_int("idx")
if start then if start then
if idx == 3 then if idx == 3 then
idx = 0 idx = 0
end end
else else
idx = (idx + 1) % 4 idx = (idx + 1) % 4
end end
meta:set_int("idx", idx) meta:set_int("idx", idx)
node.name = "gravelsieve:sieve"..idx node.name = meta:get_string("node_name")..idx
minetest.swap_node(pos, node) minetest.swap_node(pos, node)
return idx == 3 return idx == 3
end end
@ -106,34 +104,52 @@ end
local function random_ore(inv, src) local function random_ore(inv, src)
local num local num
for ore, probability in pairs(ore_probability) do for ore, probability in pairs(ore_probability) do
probability = probability * probability_factor[src:get_name()] -- calculate the probability based on user configuration
if probability ~= nil then probability = probability * gravelsieve.ore_rarity
num = gravelsieve.rand:next(0, probability) if probability ~= nil then
if num == probability then if math.random(probability) == 1 then
item = ItemStack("default:"..ore) local item = ItemStack("default:"..ore)
if inv:room_for_item("dst", item) then if inv:room_for_item("dst", item) then
inv:add_item("dst", item) inv:add_item("dst", item)
return true -- ore placed return true -- ore placed
end end
end end
end end
end end
return false -- gravel has to be moved return false -- gravel has to be moved
end 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 -- move gravel and ores to dst
local function move_src2dst(meta, pos, inv, src, dst) local function move_src2dst(meta, pos, inv, src, dst)
if inv:room_for_item("dst", dst) and inv:contains_item("src", src) then if inv:room_for_item("dst", dst) and inv:contains_item("src", src) then
local res = swap_node(pos, meta, false) local res = swap_node(pos, meta, false)
if res then if res then -- time to move one item?
if not random_ore(inv, src) then if src:get_name() == "default:gravel" then -- will we find ore?
inv:add_item("dst", dst) 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 end
inv:remove_item("src", src) inv:remove_item("src", src)
end end
return true return true -- process finished
end end
return false return false -- process still running
end end
-- timer callback, alternatively called by on_punch -- 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 meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local gravel = ItemStack("default:gravel") local gravel = ItemStack("default:gravel")
local gravel1 = ItemStack("gravelsieve:gravel1") local gravel_sieved = ItemStack("gravelsieve:sieved_gravel")
local gravel2 = ItemStack("gravelsieve:gravel2")
local gravel3 = ItemStack("gravelsieve:gravel3")
if move_src2dst(meta, pos, inv, gravel, gravel1) then if move_src2dst(meta, pos, inv, gravel) then
return true return true
elseif move_src2dst(meta, pos, inv, gravel1, gravel2) then elseif move_src2dst(meta, pos, inv, gravel_sieved) then
return true
elseif move_src2dst(meta, pos, inv, gravel2, gravel3) then
return true
elseif move_src2dst(meta, pos, inv, gravel3, gravel3) then
return true return true
else else
if not gravelsieve.manually then minetest.get_node_timer(pos):stop()
minetest.get_node_timer(pos):stop()
return false return false
end
end end
end end
for automatic = 0,1 do
for idx = 0,4 do for idx = 0,4 do
local nodebox_data = { local nodebox_data = {
{ -8/16, -8/16, -8/16, 8/16, 4/16, -6/16 }, { -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 nodebox_data[5][5] = (8 - 2*idx) / 16
local tiles_data = { local node_name
-- up, down, right, left, back, front local description
"gravelsieve_gravel.png", local tiles_data
"gravelsieve_gravel.png", if automatic == 0 then
"gravelsieve_sieve.png", node_name = "gravelsieve:sieve"
"gravelsieve_sieve.png", description = "Gravel Sieve"
"gravelsieve_sieve.png", tiles_data = {
"gravelsieve_sieve.png", -- 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 if idx == 3 then
tiles_data[1] = "gravelsieve_top.png" tiles_data[1] = "gravelsieve_top.png"
not_in_creative_inventory = 0 not_in_creative_inventory = 0
else else
not_in_creative_inventory = 1 not_in_creative_inventory = 1
end end
minetest.register_node("gravelsieve:sieve"..idx, {
description = "Gravel Sieve", minetest.register_node(node_name..idx, {
description = description,
tiles = tiles_data, tiles = tiles_data,
drawtype = "nodebox", drawtype = "nodebox",
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = nodebox_data, fixed = nodebox_data,
}, },
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = { -8/16, -8/16, -8/16, 8/16, 4/16, 8/16 }, fixed = { -8/16, -8/16, -8/16, 8/16, 4/16, 8/16 },
}, },
on_timer = sieve_node_timer, on_timer = sieve_node_timer,
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(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) meta:set_string("formspec", sieve_formspec)
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size('src', 1) inv:set_size('src', 1)
@ -213,55 +244,55 @@ for idx = 0,4 do
end, end,
on_metadata_inventory_move = function(pos) on_metadata_inventory_move = function(pos)
if gravelsieve.manually then if automatic == 0 then
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
swap_node(pos, meta, true) swap_node(pos, meta, true)
else else
minetest.get_node_timer(pos):start(1.0) minetest.get_node_timer(pos):start(1.0)
end end
end, end,
on_metadata_inventory_take = function(pos) on_metadata_inventory_take = function(pos)
if gravelsieve.manually then if automatic == 0 then
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if inv:is_empty("src") then if inv:is_empty("src") then
-- sieve should be empty -- sieve should be empty
meta:set_int("idx", 2) meta:set_int("idx", 2)
swap_node(pos, meta, false) swap_node(pos, meta, false)
end meta:set_int("gravel_cnt", 0)
else end
minetest.get_node_timer(pos):start(1.0) else
end minetest.get_node_timer(pos):start(1.0)
end
end, end,
on_metadata_inventory_put = function(pos) on_metadata_inventory_put = function(pos)
if gravelsieve.manually then if automatic == 0 then
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
swap_node(pos, meta, true) swap_node(pos, meta, true)
else else
minetest.get_node_timer(pos):start(1.0) minetest.get_node_timer(pos):start(1.0)
end end
end, end,
on_punch = function(pos, node, puncher, pointed_thing) on_punch = function(pos, node, puncher, pointed_thing)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if inv:is_empty("dst") and inv:is_empty("src") then if inv:is_empty("dst") and inv:is_empty("src") then
minetest.node_punch(pos, node, puncher, pointed_thing) minetest.node_punch(pos, node, puncher, pointed_thing)
else else
-- punching the sieve speeds up the process sieve_node_timer(pos, 0)
sieve_node_timer(pos, 0) end
end end,
end,
on_dig = function(pos, node, puncher, pointed_thing) on_dig = function(pos, node, puncher, pointed_thing)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if inv:is_empty("dst") and inv:is_empty("src") then if inv:is_empty("dst") and inv:is_empty("src") then
minetest.node_dig(pos, node, puncher, pointed_thing) minetest.node_dig(pos, node, puncher, pointed_thing)
end end
end, end,
allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_put = allow_metadata_inventory_put,
allow_metadata_inventory_move = allow_metadata_inventory_move, 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}, groups = {choppy=2, cracky=1, not_in_creative_inventory=not_in_creative_inventory},
}) })
end end
end
minetest.register_node("gravelsieve:gravel1", { minetest.register_node("gravelsieve:sieved_gravel", {
description = "Gravel sifted 1", description = "Sieved Gravel",
tiles = {"default_gravel.png"}, 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: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},
sounds = default.node_sound_gravel_defaults(), sounds = default.node_sound_gravel_defaults(),
}) })
minetest.register_node("gravelsieve:compressed_gravel", { minetest.register_node("gravelsieve:compressed_gravel", {
description = "Compressed Gravel", description = "Compressed Gravel",
tiles = {"gravelsieve_compressed_gravel.png"}, tiles = {"gravelsieve_compressed_gravel.png"},
groups = {crumbly = 2, cracky = 2}, groups = {crumbly = 2, cracky = 2},
sounds = default.node_sound_gravel_defaults(), 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({ minetest.register_craft({
output = "gravelsieve:compressed_gravel", output = "gravelsieve:compressed_gravel",
recipe = { recipe = {
{"group:gravel", "group:gravel"}, {"gravelsieve:sieved_gravel", "gravelsieve:sieved_gravel"},
{"group:gravel", "group:gravel"}, {"gravelsieve:sieved_gravel", "gravelsieve:sieved_gravel"},
}, },
}) })
@ -326,6 +351,6 @@ minetest.register_craft({
cooktime = 10, cooktime = 10,
}) })
minetest.register_alias("gravelsieve:sieve", "gravelsieve:sieve3") minetest.register_alias("gravelsieve:sieve", "gravelsieve:sieve3")
minetest.register_alias("gravelsieve:auto_sieve", "gravelsieve:auto_sieve3")

View File

@ -1,3 +1,5 @@
# If enabled, you have to punch the sieve to operate. # Rarity factor to find ores when sieving with the Gravel Sieve
# If disabled, the sieve will operate automatically. # 1.0 is according to the mapgen generator
gravelsieve_enable_manual_mode (Enable manual mode) bool false # 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