summaryrefslogtreecommitdiff
path: root/castle_lighting/brasier.lua
diff options
context:
space:
mode:
Diffstat (limited to 'castle_lighting/brasier.lua')
-rw-r--r--castle_lighting/brasier.lua267
1 files changed, 267 insertions, 0 deletions
diff --git a/castle_lighting/brasier.lua b/castle_lighting/brasier.lua
new file mode 100644
index 0000000..b461e52
--- /dev/null
+++ b/castle_lighting/brasier.lua
@@ -0,0 +1,267 @@
+if not minetest.get_modpath("fire") then return end
+
+-- internationalization boilerplate
+local MP = minetest.get_modpath(minetest.get_current_modname())
+local S, NS = dofile(MP.."/intllib.lua")
+
+local brasier_longdesc = S("A brasier for producing copious amounts of light and heat.")
+local brasier_usagehelp = S("To ignite the brasier place a flammable fuel in its inventory slot. A lump of coal will burn for about half an hour.")
+
+local brasier_nodebox = {
+ type = "fixed",
+ fixed = {
+ {-0.25, 0, -0.25, 0.25, 0.125, 0.25}, -- base
+ {-0.375, 0.125, -0.375, 0.375, 0.25, 0.375}, -- mid
+ {-0.5, 0.25, -0.5, 0.5, 0.375, 0.5}, -- plat
+ {-0.5, 0.375, 0.375, 0.5, 0.5, 0.5}, -- edge
+ {-0.5, 0.375, -0.5, 0.5, 0.5, -0.375}, -- edge
+ {0.375, 0.375, -0.375, 0.5, 0.5, 0.375}, -- edge
+ {-0.5, 0.375, -0.375, -0.375, 0.5, 0.375}, -- edge
+ {0.25, -0.5, -0.375, 0.375, 0.125, -0.25}, -- leg
+ {-0.375, -0.5, 0.25, -0.25, 0.125, 0.375}, -- leg
+ {0.25, -0.5, 0.25, 0.375, 0.125, 0.375}, -- leg
+ {-0.375, -0.5, -0.375, -0.25, 0.125, -0.25}, -- leg
+ {-0.125, -0.0625, -0.125, 0.125, 0, 0.125}, -- bottom_knob
+ }
+}
+local brasier_selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.375, -0.5, -0.375, 0.375, 0.25, 0.375}, -- mid
+ {-0.5, 0.25, -0.5, 0.5, 0.5, 0.5}, -- plat
+ }
+}
+
+local brasier_burn = function(pos)
+ 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)
+
+ if timer:is_started() and node_above.name == "fire:permanent_flame" then return end -- already burning, don't burn a new thing.
+
+ 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
+
+ if fuel_burned > 0 and (node_above.name == "air" or node_above.name == "fire:permanent_flame") then
+ item:set_count(item:get_count() - 1)
+ inv:set_stack("fuel", 1, item)
+
+ timer:start(fuel_burned * 60) -- one minute of flame per second of burn time, for balance.
+
+ if node_above.name == "air" then
+ minetest.set_node(pos_above, {name = "fire:permanent_flame"})
+ end
+ else
+ if node_above.name == "fire:permanent_flame" then
+ minetest.set_node(pos_above, {name = "air"})
+ end
+ end
+end
+
+local brasier_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
+
+local brasier_on_destruct = 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 == "fire:permanent_flame" then
+ minetest.set_node(pos_above, {name = "air"})
+ end
+end
+
+local brasier_can_dig = function(pos, player)
+ local inv = minetest.get_meta(pos):get_inventory()
+ return inv:is_empty("fuel")
+end
+
+-- Only allow fuel items to be placed in fuel
+local brasier_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
+
+minetest.register_node("castle_lighting:brasier_floor", {
+ description = S("Floor Brasier"),
+ _doc_items_longdesc = brasier_longdesc,
+ _doc_items_usagehelp = brasier_usagehelp,
+ tiles = {
+ "castle_steel.png^(castle_coal_bed.png^[mask:castle_brasier_bed_mask.png)",
+ "castle_steel.png",
+ "castle_steel.png",
+ "castle_steel.png",
+ "castle_steel.png",
+ "castle_steel.png",
+ },
+ drawtype = "nodebox",
+ groups = {cracky=2},
+ paramtype = "light",
+ node_box = brasier_nodebox,
+ selection_box = brasier_selection_box,
+
+ on_construct = brasier_on_construct,
+ on_destruct = brasier_on_destruct,
+ can_dig = brasier_can_dig,
+ allow_metadata_inventory_put = brasier_allow_metadata_inventory_put,
+ on_metadata_inventory_put = brasier_burn,
+ on_timer = brasier_burn,
+})
+
+
+minetest.register_craft({
+ output = "castle_lighting:brasier_floor",
+ recipe = {
+ {"default:steel_ingot", "default:torch", "default:steel_ingot"},
+ {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
+ }
+})
+
+if minetest.get_modpath("hopper") and hopper ~= nil and hopper.add_container ~= nil then
+ hopper:add_container({
+ {"top", "castle_lighting:brasier_floor", "fuel"},
+ {"bottom", "castle_lighting:brasier_floor", "fuel"},
+ {"side", "castle_lighting:brasier_floor", "fuel"},
+ })
+end
+
+------------------------------------------------------------------------------------------------------
+-- Masonry brasiers
+
+local materials
+if minetest.get_modpath("castle_masonry") then
+ materials = castle_masonry.materials
+else
+ materials = {{name="stonebrick", desc=S("Stonebrick"), tile="default_stone_brick.png", craft_material="default:stonebrick"}}
+end
+
+local get_material_properties = function(material)
+ local composition_def
+ local burn_time
+ if material.composition_material ~= nil then
+ composition_def = minetest.registered_nodes[material.composition_material]
+ burn_time = minetest.get_craft_result({method="fuel", width=1, items={ItemStack(material.composition_material)}}).time
+ else
+ composition_def = minetest.registered_nodes[material.craft_material]
+ burn_time = minetest.get_craft_result({method="fuel", width=1, items={ItemStack(material.craft_materia)}}).time
+ end
+
+ local tiles = material.tile
+ if tiles == nil then
+ tiles = composition_def.tile
+ elseif type(tiles) == "string" then
+ tiles = {tiles}
+ end
+
+ -- Apply bed of coals to the texture.
+ if table.getn(tiles) == 1 then
+ tiles = {tiles[1].."^(castle_coal_bed.png^[mask:castle_brasier_bed_mask.png)", tiles[1], tiles[1], tiles[1], tiles[1], tiles[1]}
+ else
+ tiles[1] = tiles[1].."^(castle_coal_bed.png^[mask:castle_brasier_bed_mask.png)"
+ end
+
+ local desc = material.desc
+ if desc == nil then
+ desc = composition_def.description
+ end
+
+ return composition_def, burn_time, tiles, desc
+end
+
+local pillar_brasier_nodebox = {
+ type = "fixed",
+ fixed = {
+ {-0.375, 0.125, -0.375, 0.375, 0.25, 0.375}, -- mid
+ {-0.5, 0.25, -0.5, 0.5, 0.375, 0.5}, -- plat
+ {-0.5, 0.375, 0.375, 0.5, 0.5, 0.5}, -- edge
+ {-0.5, 0.375, -0.5, 0.5, 0.5, -0.375}, -- edge
+ {0.375, 0.375, -0.375, 0.5, 0.5, 0.375}, -- edge
+ {-0.5, 0.375, -0.375, -0.375, 0.5, 0.375}, -- edge
+ {-0.25,-0.5,-0.25,0.25,0.125,0.25}, -- support
+ }
+}
+
+local pillar_brasier_selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.375, 0.125, -0.375, 0.375, 0.25, 0.375}, -- mid
+ {-0.5, 0.25, -0.5, 0.5, 0.5, 0.5}, -- plat
+ {-0.25,-0.5,-0.25,0.25,0.125,0.25}, -- support
+ }
+}
+
+castle_lighting.register_pillar_brasier = function(material)
+ local composition_def, burn_time, tile, desc = get_material_properties(material)
+ if burn_time > 0 or composition_def.groups.puts_out_fire then return end -- No wooden brasiers, snow brasiers, or ice brasiers, alas.
+
+ local crossbrace_connectable_groups = {}
+ for group, val in pairs(composition_def.groups) do
+ crossbrace_connectable_groups[group] = val
+ end
+ crossbrace_connectable_groups.crossbrace_connectable = 1
+
+ local mod_name = minetest.get_current_modname()
+
+ minetest.register_node(mod_name..":"..material.name.."_pillar_brasier", {
+ drawtype = "nodebox",
+ description = S("@1 Brasier", desc),
+ _doc_items_longdesc = brasier_longdesc,
+ _doc_items_usagehelp = brasier_usagehelp,
+ tiles = tile,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = crossbrace_connectable_groups,
+ sounds = composition_def.sounds,
+
+ node_box = pillar_brasier_nodebox,
+ selection_box = pillar_brasier_selection_box,
+
+ on_construct = brasier_on_construct,
+ on_destruct = brasier_on_destruct,
+ can_dig = brasier_can_dig,
+ allow_metadata_inventory_put = brasier_allow_metadata_inventory_put,
+ on_metadata_inventory_put = brasier_burn,
+ on_timer = brasier_burn,
+ })
+
+ minetest.register_craft({
+ output = mod_name..":"..material.name.."_pillar_brasier 5",
+ recipe = {
+ {material.craft_material,"default:torch",material.craft_material},
+ {material.craft_material,material.craft_material,material.craft_material},
+ },
+ })
+
+ if minetest.get_modpath("hopper") and hopper ~= nil and hopper.add_container ~= nil then
+ hopper:add_container({
+ {"top", mod_name..":"..material.name.."_pillar_brasier", "fuel"},
+ {"bottom", mod_name..":"..material.name.."_pillar_brasier", "fuel"},
+ {"side", mod_name..":"..material.name.."_pillar_brasier", "fuel"},
+ })
+ end
+end
+
+for _, material in pairs(materials) do
+ castle_lighting.register_pillar_brasier(material)
+end