Epic/mods/earthbuild/hearth.lua

249 lines
6.6 KiB
Lua

--------------------------------------------------
--HEARTH
------------------------------------------------
--Functions
----------
-- On construct
-- set form
local hearth_on_construct = function(pos)
local inv = minetest.get_meta(pos):get_inventory()
inv:set_size("fuel", 1)
local meta = minetest.get_meta(pos)
meta:set_string("formspec",
"size[8,5.3]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"list[current_name;fuel;3.5,0;1,1;]" ..
"list[current_player;main;0,1.15;8,1;]" ..
"list[current_player;main;0,2.38;8,3;8]" ..
"listring[current_name;main]" ..
"listring[current_player;main]" ..
default.get_hotbar_bg(0,1.15)
)
end
----------
--Digging only if no fuel
local hearth_can_dig = function(pos, player)
local inv = minetest.get_meta(pos):get_inventory()
return inv:is_empty("fuel")
end
-------------
-- Only fuel items allowed
local hearth_allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if listname == "fuel" then
if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then
return stack:get_count()
else
return 0
end
end
return 0
end
--------------
--Particle Effects
local function hearth_fire_on(pos, time)
local meta = minetest.get_meta(pos)
--flames
minetest.add_particlespawner({
amount = 4,
time = time,
minpos = {x = pos.x - 0.1, y = pos.y + 0.6, z = pos.z - 0.1},
maxpos = {x = pos.x + 0.1, y = pos.y + 1, z = pos.z + 0.1},
minvel = {x= 0, y= 0, z= 0},
maxvel = {x= 0.001, y= 0.001, z= 0.001},
minacc = {x= 0, y= 0, z= 0},
maxacc = {x= 0.001, y= 0.001, z= 0.001},
minexptime = 3,
maxexptime = 5,
minsize = 4,
maxsize = 8,
collisiondetection = false,
vertical = true,
texture = "fire_basic_flame_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
},
glow = 13,
})
--Smoke
minetest.add_particlespawner({
amount = 4,
time = time,
minpos = {x = pos.x - 0.1, y = pos.y + 0.8, z = pos.z - 0.1},
maxpos = {x = pos.x + 0.1, y = pos.y + 1, z = pos.z + 0.1},
minvel = {x= 0, y= 0, z= 0},
maxvel = {x= 0.01, y= 0.07, z= 0.01},
minacc = {x= 0, y= 0, z= 0},
maxacc = {x= 0.01, y= 0.2, z= 0.01},
minexptime = 5,
maxexptime = 20,
minsize = 1,
maxsize = 8,
collisiondetection = true,
vertical = true,
texture = "default_item_smoke.png",
--animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length = 0.7,},
})
end
----------
--Burn
--add flames and burn fuel
local hearth_burn = function(pos, elapsed)
local pos_above = {x=pos.x, y=pos.y+1, z=pos.z}
local node_above = minetest.get_node(pos_above)
local timer = minetest.get_node_timer(pos)
local inv = minetest.get_inventory({type="node", pos=pos})
local item = inv:get_stack("fuel", 1)
local fuel_burned = minetest.get_craft_result({method="fuel", width=1, items={item:peek_item(1)}}).time
--remove light...
-- so it doesn't stay on permanently
if inv:is_empty("fuel") and node_above.name == "earthbuild:hearth_air" then
minetest.set_node(pos_above, {name = "air"})
end
--burn item and add smoke and flames
if fuel_burned > 0 and (node_above.name == "air" or node_above.name == "earthbuild:hearth_air") then
--randomly remove an item of fuel based on it's burn time.
--this is so it can get through the fuel slowly, but..
-- still do frequent flames
--i.e. every X sec it will have a 1/X chance of burning
local burn_time = fuel_burned * 30
local burn_it = math.random(1, burn_time)
--it's luck was up, it got burnt away.
if burn_it == 1 then
item:set_count(item:get_count() - 1)
inv:set_stack("fuel", 1, item)
end
--if has no light
if node_above.name == "air" then
minetest.set_node(pos_above, {name = "earthbuild:hearth_air"})
end
--do fire effects and restart timer
timer:start(5)
hearth_fire_on(pos, 5)
minetest.sound_play("fire_small",{pos=pos, max_hear_distance = 15, loop=false, gain=0.2})
end
end
--Removed node..make sure to remove light
local no_hearth = function(pos, oldnode)
local pos_above = {x=pos.x, y=pos.y+1, z=pos.z}
local node_above = minetest.get_node(pos_above)
if node_above.name == "earthbuild:hearth_air" then
minetest.set_node(pos_above, {name = "air"})
end
end
-------------------------------------------------
--Node
-- adds hearth
minetest.register_node('earthbuild:hearth', {
description = 'Hearth',
drawtype = "normal",
tiles = {
"earthbuild_hearth_top.png",
"earthbuild_cob.png",
"earthbuild_hearth_side.png",
"earthbuild_hearth_side.png",
"earthbuild_hearth_side.png",
"earthbuild_hearth_side.png"
},
paramtype = "light",
drop = "earthbuild:hearth",
groups = {crumbly = 1, cracky = 1, oddly_breakable_by_hand = 2},
damage_per_second = 1,
sounds = default.node_sound_dirt_defaults(),
on_construct = hearth_on_construct,
can_dig = hearth_can_dig,
allow_metadata_inventory_put = hearth_allow_metadata_inventory_put,
on_metadata_inventory_put = hearth_burn,
on_timer = hearth_burn,
after_destruct = no_hearth,
})
-----------------------------------------
--Hearth Air
--this is to add a light source
-- an invisible glowing block added above the fire when burning
--this is needed because particles give no light
minetest.register_node("earthbuild:hearth_air", {
description = "Hearth Air",
tiles = {"earthbuild_hearth_top.png"},
drawtype = "airlike",
paramtype = "light",
sunlight_propagates = true,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
protected = true,
groups = {not_in_creative_inventory = 1},
light_source= 9,
on_blast = function(pos)
end,
})
----------------------------------------------
--Crafts
-- adds hearth recipes
minetest.register_craft({
output = 'earthbuild:hearth',
recipe = {
{'', 'group:tree', ''},
{'group:stick', 'group:stick', 'group:stick'},
{'', 'earthbuild:rammed_earth', ''},
}
})
minetest.register_craft({
output = 'earthbuild:hearth',
recipe = {
{'', 'group:tree', ''},
{'group:stick', 'group:stick', 'group:stick'},
{'', 'earthbuild:cob', ''},
}
})
minetest.register_craft({
output = 'earthbuild:hearth',
recipe = {
{'', 'group:tree', ''},
{'group:stick', 'group:stick', 'group:stick'},
{'default:dirt', 'default:dirt', 'default:dirt'},
}
})