techage/iron_age/charcoalpile.lua
2022-01-03 21:40:31 +01:00

228 lines
6.2 KiB
Lua

--[[
TechAge
=======
Copyright (C) 2019 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
Charcoalpile to produce charcoal
]]--
local S = techage.S
local PILE_BURN_TIME = 1200
local COAL_BURN_TIME = 300
-- determine the number of wood nodes
local function num_wood(pos)
local pos1 = {x=pos.x-1, y=pos.y, z=pos.z-1}
local pos2 = {x=pos.x+1, y=pos.y+2, z=pos.z+1}
local nodes = minetest.find_nodes_in_area(pos1, pos2, "group:wood")
return #nodes
end
-- determine the number of dirt nodes (around wood)
local function num_dirt(pos)
local pos1 = {x=pos.x-2, y=pos.y-1, z=pos.z-2}
local pos2 = {x=pos.x+2, y=pos.y+3, z=pos.z+2}
local nodes = minetest.find_nodes_in_area(pos1, pos2, techage.aAnyKindOfDirtBlocks)
return #nodes
end
-- determine the number of ignore nodes
local function num_ignore(pos)
local pos1 = {x=pos.x-2, y=pos.y-1, z=pos.z-2}
local pos2 = {x=pos.x+2, y=pos.y+3, z=pos.z+2}
local nodes = minetest.find_nodes_in_area(pos1, pos2, "ignore")
return #nodes
end
-- replace pile top nodes
local function make_dirt_with_dry_grass(pos)
local pos1 = {x=pos.x-2, y=pos.y+3, z=pos.z-2}
local pos2 = {x=pos.x+2, y=pos.y+3, z=pos.z+2}
for _,p in ipairs(minetest.find_nodes_in_area(pos1, pos2, {
"default:dirt_with_grass",
"default:dirt_with_coniferous_litter",
"default:dirt_with_rainforest_litter",
})) do
minetest.swap_node(p, {name = "default:dirt_with_dry_grass"})
end
if minetest.global_exists("ethereal") then
for _,p in ipairs(minetest.find_nodes_in_area(pos1, pos2, techage.aEtherealDirts)) do
minetest.swap_node(p, {name = "default:dirt_with_dry_grass"})
end
end
end
-- replace pile bottom nodes
local function make_dirt_with_ash(pos)
local pos1 = {x=pos.x-1, y=pos.y-1, z=pos.z-1}
local pos2 = {x=pos.x+1, y=pos.y-1, z=pos.z+1}
for _,p in ipairs(minetest.find_nodes_in_area(pos1, pos2, "default:dirt")) do
minetest.swap_node(p, {name = "techage:dirt_with_ash"})
end
end
local function start_smoke(pos)
local meta = minetest.get_meta(pos)
pos = {x=pos.x, y=pos.y+3.6, z=pos.z}
local id = meta:get_int("smoke")
local above = minetest.get_node(pos).name
if id ~= 0 then
minetest.delete_particlespawner(id)
meta:set_int("smoke", 0)
end
if above == "air" then
id = minetest.add_particlespawner({
amount = 4, time = 0, collisiondetection = true,
minpos = {x=pos.x-0.25, y=pos.y+0.1, z=pos.z-0.25},
maxpos = {x=pos.x+0.25, y=pos.y+5, z=pos.z+0.25},
minvel = {x=-0.2, y=0.3, z=-0.2}, maxvel = {x=0.2, y=1, z=0.2},
minacc = {x=0,y=0,z=0}, maxacc = {x=0,y=0.5,z=0},
minexptime = 2, maxexptime = 4,
minsize = 6, maxsize = 12,
texture = "techage_smoke.png",
})
meta:set_int("smoke", id)
end
end
local function stop_smoke(pos)
local meta = minetest.get_meta(pos)
local id = meta:get_int("smoke")
if id ~= 0 then
minetest.delete_particlespawner(id)
end
meta:set_int("smoke", 0)
end
-- replace wood by burning coal
local function collapse_pile(pos)
local pos1 = {x=pos.x-1, y=pos.y, z=pos.z-1}
local pos2 = {x=pos.x+1, y=pos.y+2, z=pos.z+1}
techage.ironage_swap_nodes(pos1, pos2, "group:wood", "techage:charcoal_burn")
stop_smoke(pos)
make_dirt_with_ash(pos)
end
-- replace wood by coal
local function convert_to_coal(pos)
local pos1 = {x=pos.x-1, y=pos.y+1, z=pos.z-1}
local pos2 = {x=pos.x+1, y=pos.y+2, z=pos.z+1}
techage.ironage_swap_nodes(pos1, pos2, "group:wood", "air")
pos1 = {x=pos.x-1, y=pos.y+0, z=pos.z-1}
pos2 = {x=pos.x+1, y=pos.y+1, z=pos.z+1}
techage.ironage_swap_nodes(pos1, pos2, "group:wood", "techage:charcoal")
stop_smoke(pos)
minetest.swap_node(pos, {name = "techage:charcoal"})
make_dirt_with_ash(pos)
make_dirt_with_dry_grass(pos)
end
function techage.start_pile(pos)
local meta = minetest.get_meta(pos)
meta:set_int("ignite", minetest.get_gametime())
minetest.get_node_timer(pos):start(20)
end
-- node timer function
function techage.keep_running_pile(pos)
local meta = minetest.get_meta(pos)
if meta:get_int("running") == 0 then
if num_wood(pos) == 26 and num_dirt(pos) == 98 then
meta:set_int("running", 1)
start_smoke(pos)
elseif minetest.get_gametime() > (meta:get_int("ignite") + 10) then
collapse_pile(pos)
minetest.remove_node(pos)
return false
end
else
if num_ignore(pos) == 0 and (num_wood(pos) ~= 26 or num_dirt(pos) ~= 98) then
collapse_pile(pos)
minetest.remove_node(pos)
return false
elseif minetest.get_gametime() > (meta:get_int("ignite") + PILE_BURN_TIME) then
convert_to_coal(pos)
return false
end
end
return true
end
function techage.stop_pile(pos)
collapse_pile(pos)
end
minetest.register_node("techage:dirt_with_ash", {
description = S("Dirt with Ash"),
tiles = {
"techage_ash.png",
"default_dirt.png",
{name = "default_dirt.png^techage_ash_side.png",
tileable_vertical = false}},
groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, not_in_creative_inventory=1},
drop = 'default:dirt',
sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_grass_footstep", gain = 0.4},
}),
})
minetest.register_node("techage:charcoal_burn", {
tiles = {"techage_charcoal_burn.png"},
after_place_node = function(pos)
minetest.get_node_timer(pos):start(math.random(COAL_BURN_TIME, COAL_BURN_TIME*1.2))
end,
on_timer = function(pos)
minetest.remove_node(pos)
return false
end,
drop = "",
paramtype = "light",
light_source = 10,
is_ground_content = false,
groups = {crumbly = 2, falling_node = 1, not_in_creative_inventory=1},
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_node("techage:charcoal", {
description = S("TA1 Charcoal"),
tiles = {"techage_charcoal.png"},
on_ignite = function(pos, igniter)
minetest.after(2, minetest.swap_node, pos, {name = "techage:charcoal_burn"})
minetest.after(COAL_BURN_TIME/2, minetest.remove_node, pos)
end,
is_ground_content = false,
groups = {crumbly = 2, falling_node = 1},
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_craft({
type = "fuel",
recipe = "techage:charcoal",
burntime = 120,
})
minetest.register_lbm({
label = "[techage] Lighter update",
name = "techage:lighter_update",
nodenames = {"techage:lighter_burn"},
run_at_every_load = true,
action = function(pos, node)
local meta = minetest.get_meta(pos)
if meta:get_int("running") == 1 then
start_smoke(pos)
end
end
})