forked from Reload/techage_modpack
213 lines
5.9 KiB
Lua
213 lines
5.9 KiB
Lua
--[[
|
|
|
|
TechAge
|
|
=======
|
|
|
|
Copyright (C) 2019 Joachim Stolberg
|
|
|
|
AGPL v3
|
|
See LICENSE.txt for more information
|
|
|
|
Gravel Sieve, sieving gravel to find ores
|
|
|
|
]]--
|
|
|
|
-- for lazy programmers
|
|
local P = minetest.string_to_pos
|
|
local M = minetest.get_meta
|
|
local S = techage.S
|
|
|
|
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 = techage.get_node_lvm(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 = techage.get_node_lvm(pos1)
|
|
minetest.add_item({x=pos.x, y=pos.y-0.4, z=pos.z}, items)
|
|
end
|
|
|
|
local function minecart_hopper_takeitem(pos, num)
|
|
for _, obj in pairs(minetest.get_objects_inside_radius({x=pos.x, y=pos.y-0.4, z=pos.z}, 0.2)) do
|
|
local entity = obj:get_luaentity()
|
|
if not obj:is_player() and entity and entity.name == "__builtin:item" then
|
|
obj:remove()
|
|
return ItemStack(entity.itemstring or "air")
|
|
end
|
|
end
|
|
end
|
|
|
|
local function minecart_hopper_untakeitem(pos, in_dir, stack)
|
|
push_items(pos, stack)
|
|
end
|
|
|
|
local function keep_running(pos, elapsed)
|
|
if swap_node(pos) then
|
|
local inv = M(pos):get_inventory()
|
|
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")
|
|
elseif not inv:is_empty("src") then
|
|
src = inv:get_stack("src", 1):take_item(1)
|
|
dst = src
|
|
else
|
|
return false
|
|
end
|
|
push_items(pos, dst)
|
|
inv:remove_item("src", src)
|
|
end
|
|
local inv = M(pos):get_inventory()
|
|
return not inv:is_empty("src")
|
|
end
|
|
|
|
local function on_construct(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("infotext", S("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.5)
|
|
local w = puncher:get_wielded_item()
|
|
if not minetest.is_creative_enabled(puncher:get_player_name()) 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 = S("TA1 Gravel Sieve"),
|
|
tiles = table.copy(tiles_data),
|
|
drawtype = "nodebox",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = table.copy(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,
|
|
|
|
minecart_hopper_takeitem = minecart_hopper_takeitem,
|
|
minecart_hopper_untakeitem = minecart_hopper_untakeitem,
|
|
|
|
paramtype = "light",
|
|
use_texture_alpha = techage.CLIP,
|
|
sounds = default.node_sound_wood_defaults(),
|
|
paramtype2 = "facedir",
|
|
sunlight_propagates = true,
|
|
is_ground_content = false,
|
|
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, not_in_creative_inventory = (idx == 3) and 0 or 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.5)
|
|
return true
|
|
end
|
|
return false
|
|
end,
|
|
})
|
|
|
|
minetest.register_node("techage:sieved_gravel", {
|
|
description = S("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 = S("Compressed Gravel"),
|
|
tiles = {"techage_compressed_gravel.png"},
|
|
groups = {cracky=2, crumbly = 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")
|