techage/iron_age/gravelsieve.lua
2019-05-01 12:01:24 +02:00

202 lines
5.5 KiB
Lua

--[[
TechAge
=======
Copyright (C) 2019 Joachim Stolberg
LGPLv2.1+
See LICENSE.txt for more information
Gravel Sieve, sieving gravel to find ores
]]--
-- for lazy programmers
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local P = minetest.string_to_pos
local M = minetest.get_meta
-- Load support for intllib.
local MP = minetest.get_modpath("techage")
local I,_ = dofile(MP.."/intllib.lua")
local get_random_gravel_ore = techage.gravelsieve_get_random_gravel_ore
local get_random_basalt_ore = techage.gravelsieve_get_random_basalt_ore
-- handle the sieve animation
local function swap_node(pos)
local node = minetest.get_node(pos)
local idx = string.byte(node.name, -1) - 48
idx = (idx + 1) % 4
minetest.swap_node(pos, {name = "techage:sieve"..idx, param2 = node.param2})
return idx == 3 -- true if done
end
local function push_items(pos, items)
local pos1 = {x=pos.x, y=pos.y-1, z=pos.z}
local node = minetest.get_node(pos1)
minetest.add_item({x=pos.x, y=pos.y-0.4, z=pos.z}, items)
end
local function keep_running(pos, elapsed)
local inv = M(pos):get_inventory()
if swap_node(pos) then
local src, dst
if inv:contains_item("src", ItemStack("techage:basalt_gravel")) then
dst, src = get_random_basalt_ore(), ItemStack("techage:basalt_gravel")
elseif inv:contains_item("src", ItemStack("default:gravel")) then
dst, src = get_random_gravel_ore(), ItemStack("default:gravel")
else
return false
end
push_items(pos, dst)
inv:remove_item("src", src)
end
return not inv:is_empty("src")
end
local function on_construct(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", I("TA1 Gravel Sieve"))
local inv = meta:get_inventory()
inv:set_size('src', 1)
end
local function on_punch(pos, node, puncher, pointed_thing)
local wielded_item = puncher:get_wielded_item():get_name()
if wielded_item == "default:gravel" or wielded_item == "techage:basalt_gravel" then
local inv = M(pos):get_inventory()
local stack = ItemStack(wielded_item)
if inv:room_for_item("src", stack) then
inv:add_item("src", stack)
minetest.swap_node(pos, {name = "techage:sieve0"})
minetest.get_node_timer(pos):start(1)
local w = puncher:get_wielded_item()
if not(minetest.setting_getbool("creative_mode")) then
w:take_item(1)
puncher:set_wielded_item(w)
end
end
end
end
local tiles_data = {
-- up, down, right, left, back, front
"techage_sieve_gravel_ta1.png",
"techage_sieve_gravel_ta1.png",
"techage_sieve_sieve_ta1.png",
"techage_sieve_sieve_ta1.png",
"techage_sieve_sieve_ta1.png",
"techage_sieve_sieve_ta1.png",
}
local nodebox_data = {
{ -8/16, -3/16, -8/16, 8/16, 4/16, -6/16 },
{ -8/16, -3/16, 6/16, 8/16, 4/16, 8/16 },
{ -8/16, -3/16, -8/16, -6/16, 4/16, 8/16 },
{ 6/16, -3/16, -8/16, 8/16, 4/16, 8/16 },
{ -8/16, -8/16, -8/16, -6/16, -3/16, -6/16 },
{ 6/16, -8/16, -8/16, 8/16, -3/16, -6/16 },
{ -8/16, -8/16, 6/16, -6/16, -3/16, 8/16 },
{ 6/16, -8/16, 6/16, 8/16, -3/16, 8/16 },
{ -6/16, -2/16, -6/16, 6/16, 8/16, 6/16 },
}
for idx = 0,3 do
nodebox_data[9][5] = (8 - 2*idx) / 16
if idx == 3 then
tiles_data[1] = "techage_sieve_top_ta1.png"
end
minetest.register_node("techage:sieve"..idx, {
description = I("TA1 Gravel Sieve"),
tiles = tiles_data,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = nodebox_data,
},
selection_box = {
type = "fixed",
fixed = { -8/16, -3/16, -8/16, 8/16, 4/16, 8/16 },
},
on_construct = idx == 3 and on_construct or nil,
on_punch = idx == 3 and on_punch or nil,
on_timer = keep_running,
paramtype = "light",
sounds = default.node_sound_wood_defaults(),
paramtype2 = "facedir",
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy = 2, cracky = 1},
drop = "techage:sieve3",
})
end
techage.register_node("techage:sieve0", {"techage:sieve1", "techage:sieve2", "techage:sieve3"}, {
on_push_item = function(pos, in_dir, stack)
print("on_push_item")
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if inv:room_for_item("src", stack) then
inv:add_item("src", stack)
minetest.get_node_timer(pos):start(1)
return true
end
return false
end,
})
minetest.register_node("techage:sieved_gravel", {
description = I("Sieved Gravel"),
tiles = {"default_gravel.png"},
groups = {crumbly=2, falling_node=1, not_in_creative_inventory=1},
sounds = default.node_sound_gravel_defaults(),
})
minetest.register_node("techage:compressed_gravel", {
description = I("Compressed Gravel"),
tiles = {"techage_compressed_gravel.png"},
groups = {cracky=2, crumbly = 2, cracky = 2},
sounds = default.node_sound_gravel_defaults(),
})
minetest.register_craft({
output = "techage:sieve",
recipe = {
{"group:wood", "", "group:wood"},
{"group:wood", "techage:iron_ingot", "group:wood"},
{"group:wood", "", "group:wood"},
},
})
minetest.register_craft({
output = "techage:compressed_gravel",
recipe = {
{"techage:sieved_gravel", "techage:sieved_gravel"},
{"techage:sieved_gravel", "techage:sieved_gravel"},
},
})
minetest.register_craft({
type = "cooking",
output = "default:cobble",
recipe = "techage:compressed_gravel",
cooktime = 10,
})
minetest.register_alias("techage:sieve", "techage:sieve3")
minetest.register_alias("techage:auto_sieve", "techage:auto_sieve3")
techage.register_help_page("TA1 Gravel Sieve", [[To sieve Gravel and Basalt Gravel
to get ores.
The sieve can be automated by means
of the TA1 Funnel.
Gravel can be found in caves or
generated by means of a TA1 Hammer.]], "techage:sieve3")