--[[ CampFire mod by Doc [modified by Napiophelios-rev014] Depends: default, fire, wool For Minetest 0.4.10 development build (commit d2219171 or later) ----------------------------------------------- Original CampFire mod by Doc License of code : WTFPL ----------------------------------------------- Node Swap ABM from NateS's More_fire mod (solves the glitchy formspec transition) More_fire mod Licensed : CC by SA ----------------------------------------------- The smoke particles from LazyJ's Fork of Semmett9's "Fake Fire" Mod code by: VanessaE and JP License: GPL v2 --]] campfire = {} ----------------- -- Formspecs ----------------- function campfire.campfire_active_formspec(pos) local formspec = "size[8,6]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. "label[1,0.5; < Add Fuel]".. "list[current_name;fuel;0,0.25;1,1;]".. "list[current_name;src;4,0.25;1,1;]".. "image[5,0.25;1,1;gui_furnace_arrow_bg.png^[transformR270]".. "list[current_name;dst;6,0.25;2,1;]".. "list[current_player;main;0,2;8,1;]".. "list[current_player;main;0,3;8,3;8]".. "listring[current_name;dst]".. "listring[current_player;main]".. "listring[current_name;src]".. "listring[current_player;main]".. default.get_hotbar_bg(0,2) return formspec end campfire.campfire_formspec = "size[8,6]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. "label[1,0.5; < Add Fuel]".. "list[current_name;fuel;0,0.25;1,1;]".. "list[current_name;src;4,0.25;1,1;]".. "image[5,0.25;1,1;gui_furnace_arrow_bg.png^[transformR270]".. "list[current_name;dst;6,0.25;2,1;]".. "list[current_player;main;0,2;8,1;]".. "list[current_player;main;0,3;8,3;8]".. "listring[current_name;dst]".. "listring[current_player;main]".. "listring[current_name;src]".. "listring[current_player;main]".. default.get_hotbar_bg(0,2) ----------------- --Nodes ----------------- minetest.register_node("campfire:campfire", { description = "Camp Fire", drawtype = 'mesh', mesh = 'contained_campfire.obj', tiles = { {name='campfire_invisible.png', animation={type='vertical_frames', aspect_w=16, aspect_h=16, length=1}}, {name='[combine:16x16:0,0=default_gravel.png:0,8=default_wood.png'}}, inventory_image = "[combine:16x16:0,0=fire_basic_flame.png:0,12=default_gravel.png", wield_image = "[combine:16x16:0,0=fire_basic_flame.png:0,12=default_gravel.png", walkable = false, buildable_to = true, paramtype = 'light', sunlight_propagates = true, light_source =1, paramtype2 = "facedir", selection_box = { type = "fixed", fixed = { -0.48, -0.5, -0.48, 0.48, -0.5, 0.48 } }, groups = {oddly_breakable_by_hand=2, dig_immediate=3, attached_node=1}, legacy_facedir_simple = true, sounds = default.node_sound_stone_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string('formspec', campfire.campfire_formspec) meta:set_string('infotext', 'Campfire'); local inv = meta:get_inventory() inv:set_size('fuel', 1) inv:set_size("src", 1) inv:set_size("dst", 2) end, can_dig = function(pos,player) local meta = minetest.get_meta(pos); local inv = meta:get_inventory() if not inv:is_empty("fuel") then return false elseif not inv:is_empty("dst") then return false elseif not inv:is_empty("src") then return false end return true end, }) minetest.register_node("campfire:campfire_active", { description = "Campfire Active", drawtype = 'mesh', mesh = 'contained_campfire.obj', tiles = { {name='fire_basic_flame_animated.png', animation={type='vertical_frames', aspect_w=16, aspect_h=16, length=4}}, {name='[combine:16x16:0,0=default_gravel.png:0,8=default_wood.png'}}, walkable = false, damage_per_second = 1, drop = "", paramtype = 'light', sunlight_propagates = true, light_source =12, paramtype2 = "facedir", legacy_facedir_simple = true, selection_box = { type = "fixed", fixed = { -0.48, -0.5, -0.48, 0.48, -0.5, 0.48 } }, groups = {oddly_breakable_by_hand=1, dig_immediate=2, hot=2, attached_node=1,not_in_creative_inventory =1}, sounds = default.node_sound_stone_defaults(), can_dig = function(pos,player) local meta = minetest.get_meta(pos); local inv = meta:get_inventory() if not inv:is_empty("fuel") then return false elseif not inv:is_empty("dst") then return false elseif not inv:is_empty("src") then return false end return true end, }) ----------------- --ABMs ----------------- --campfire minetest.register_abm({ nodenames = {'campfire:campfire','campfire:campfire_active'}, interval = 1.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local meta = minetest.get_meta(pos) local fuel_time = meta:get_float("fuel_time") or 0 local src_time = meta:get_float("src_time") or 0 local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 local inv = meta:get_inventory() local srclist = inv:get_list("src") local cooked = nil if srclist then cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) end local was_active = false if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then was_active = true meta:set_float("fuel_time", meta:get_float("fuel_time") + 0.25) meta:set_float("src_time", meta:get_float("src_time") + 0.25) if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then if inv:room_for_item("dst",cooked.item) then inv:add_item("dst", cooked.item) local srcstack = inv:get_stack("src", 1) srcstack:take_item() inv:set_stack("src", 1, srcstack) else print("Could not insert '"..cooked.item:to_string().."'") end meta:set_string("src_time", 0) end end if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then minetest.sound_play({name="campfire_small"},{pos=pos}, {max_hear_distance = 1},{loop=true},{gain=0.009}) local percent = math.floor(meta:get_float("fuel_time") / meta:get_float("fuel_totaltime") * 100) meta:set_string("infotext","Campfire active: "..percent.."%") minetest.swap_node(pos, {name = 'campfire:campfire_active'}) return end local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) local cookable = true if cooked.time == 0 then cookable = false end local item_state = '' local item_percent = 0 if cookable then item_percent = math.floor(src_time / cooked.time * 100) item_state = item_percent .. "%" end local fuel = nil local cooked = nil local fuellist = inv:get_list("fuel") local srclist = inv:get_list("src") if srclist then cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) end if fuellist then fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) end if fuel.time <= 0 then meta:set_string("infotext","The campfire is out.") minetest.swap_node(pos, {name = 'campfire:campfire'}) meta:set_string("formspec", campfire.campfire_active_formspec(item_percent)) return end meta:set_string("fuel_totaltime", fuel.time) meta:set_string("fuel_time", 0) local stack = inv:get_stack("fuel", 1) stack:take_item() inv:set_stack("fuel", 1, stack) meta:set_string("formspec", campfire.campfire_active_formspec(item_percent)) end, }) --smoke particles minetest.register_abm({ nodenames = { "campfire:campfire_active" }, interval = 1, chance = 2, catch_up = false, action = function(pos, node) if minetest.get_node({x=pos.x, y=pos.y+1.0, z=pos.z}).name == "air" and minetest.get_node({x=pos.x, y=pos.y+2.0, z=pos.z}).name == "air" then local image_number = math.random(4) minetest.add_particlespawner({ amount = 6, time = 1, minpos = {x=pos.x-0.25, y=pos.y+0.4, z=pos.z-0.25}, maxpos = {x=pos.x+0.25, y=pos.y+8, 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,z=0}, minexptime = 0.5, maxexptime = 3, minsize = 1, maxsize = 6, collisiondetection = false, texture = "smoke_particle_"..image_number..".png", }) end end }) ----------------- -- craft recipes ----------------- minetest.register_craft({ output = 'campfire:campfire', recipe = { {'', 'group:stone', ''}, {'group:stone','default:stick', 'group:stone'}, {'', 'group:stone', ''}, } }) local path = minetest.get_modpath("campfire") dofile(path.."/sleepingmat.lua")