201 lines
5.5 KiB
Lua
201 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)
|
|
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") |