123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- --------------------------------------------------
- --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'},
- }
- })
|