diff options
Diffstat (limited to 'castle_lighting/brasier.lua')
| -rw-r--r-- | castle_lighting/brasier.lua | 267 | 
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  | 
