init; updated fire-handling for use in newer luanti-versions

This commit is contained in:
Rainer 2026-02-12 13:31:10 +01:00
commit f389357776
34 changed files with 914 additions and 0 deletions

426
init.lua Normal file
View file

@ -0,0 +1,426 @@
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --
-- FAKE FIRE MOD - Version 1.0 --
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ --
fake_fire = {}; -- Global fake_fire namespace
local MODPATH = minetest.get_modpath("fake_fire")..DIR_DELIM
dofile(MODPATH.."functions.lua")
dofile(MODPATH.."abms.lua")
fake_fire_water = true;
local cold_nodes = {
["default:snowblock"]=true,
["default:ice"]=true,
["default:dirt_with_snow"]=true,
}
-- function for fire --
local function set_fake_fire(pointed_thing, itemstack, wear)
local u = minetest.get_node(pointed_thing.under)
local n = minetest.get_node(pointed_thing.above)
-- if the node is air then --
if cold_nodes[u.name] and n.name == "air" then
minetest.set_node(pointed_thing.above,
{name="fake_fire:fake_ice_fire"})
-- then play the sound --
minetest.sound_play("fake_fire_light", {
pos = pointed_thing.above,
max_hear_distance = 10,
gain = 10.0,
})
-- degrade the item --
itemstack:add_wear(wear)
--end
elseif n.name == "air" then
-- create fire above that node --
minetest.set_node(pointed_thing.above,
{name="fake_fire:fake_stable_fire"})
-- then play the sound --
minetest.sound_play("fake_fire_light", {
pos = pointed_thing.above,
max_hear_distance = 10,
gain = 10.0,
})
-- degrade the item --
itemstack:add_wear(wear)
end
end
-- abm for putting out fire --
if fake_fire_water == true then
minetest.register_abm({
nodenames = {"fake_fire:fake_fire"},
neighbors = {"group:puts_out_fire"},
interval = 3,
chance = 1,
catch_up = false,
action = function(p0, node, _, _)
minetest.remove_node(p0)
minetest.sound_play("fake_fire_extinguish",
{pos = p0, max_hear_distance = 10, gain = 0.25})
end,
})
end
local function check_area(pos,node1,node2)
if
-- 'If' the space directly south and a 14 nodes up from the flame or
-- chimney_top is free and clear,... ~LazyJ
--minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z-1}).name == "air" and
fake_fire.check_for_air({x=pos.x, y=pos.y, z=pos.z-1}, 14)
then
-- 'then' set the node that triggers the drifting-smoke ABM. ~ LazyJ
minetest.set_node(pos, {name = node1 })
else
-- 'else' set the node that triggers the non-drifing-smoke ABM. ~ LazyJ
minetest.set_node(pos, {name = node2 })
end
end
-- =========== --
-- other Nodes --
-- =========== --
-- embers --
minetest.register_node("fake_fire:embers", {
description = "Glowing Embers",
tiles = {
{name="embers_animated.png", animation={type="vertical_frames",
aspect_w=16, aspect_h=16, length=2}},
},
is_ground_content = false,
light_source = 9,
groups = {choppy=3, crumbly=3, oddly_breakable_by_hand=3},
})
-- invisable chimly --
minetest.register_node("fake_fire:chimney_invs_d", {
description = "Chimney Top - invisable",
tiles = {"chimney_invs.png"},
inventory_image = "black_smoke.png",
is_ground_content = true,
groups = {cracky=3, oddly_breakable_by_hand=1, smoky_d = 1},
paramtype = "light",
walkable = false,
drawtype = "glasslike",
})
-- =================== --
-- New CHIMNEY NODES --
-- =================== --
local function register_chimV(name, node, description)
minetest.register_node("fake_fire:chimney_" ..name.."_v", {
description = "Chimney Top - " .. description,
tiles = {"default_"..node..".png^chimney_top.png", "default_"..node..".png"},
is_ground_content = true,
groups = {cracky=3, oddly_breakable_by_hand=1, not_in_creative_inventory=1, smoky_v = 1},
paramtype = "light",
--sounds = default.node_sound_stone_defaults(),
drop = "fake_fire:chimney_"..node,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
on_rightclick = function (pos,node,puncher)
-- This swaps the smokeless version with the smoky version when punched.
-- ~ LazyJ
minetest.set_node(pos, {name = "fake_fire:chimney_"..name})
end
})
end
local function register_chimD(name, node, description)
minetest.register_node("fake_fire:chimney_" ..name.."_d", {
description = "Chimney Top - " .. description,
tiles = {"default_"..node..".png^chimney_top.png", "default_"..node..".png"},
is_ground_content = true,
groups = {cracky=3, oddly_breakable_by_hand=1, not_in_creative_inventory=1, smoky_d = 1},
paramtype = "light",
--sounds = default.node_sound_stone_defaults(),
drop = "fake_fire:chimney_" ..name,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
on_rightclick = function (pos,node,puncher)
-- This swaps the smokeless version with the smoky version when punched.
-- ~ LazyJ
minetest.set_node(pos, {name = "fake_fire:chimney_"..name})
end
})
end
local function register_chim(name, node, description)
minetest.register_node("fake_fire:chimney_" ..name, {
description = "Chimney Top - " .. description,
tiles = {"default_"..node..".png^chimney_top.png", "default_"..node..".png"},
is_ground_content = true,
groups = {cracky=3, oddly_breakable_by_hand=1},
paramtype = "light",
--sounds = default.node_sound_stone_defaults(),
drop = "fake_fire:chimney_" ..name,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
on_rightclick = function (pos,node,puncher)
-- Check if there is likely enough space for the smoke to drift without
-- passing through chimneys, walls, or other solids. ~ LazyJ, 2014_07_28
check_area(pos,"fake_fire:chimney_"..name.."_d", "fake_fire:chimney_"..name.."_v",puncher)
end
})
minetest.register_craft({
type = "shapeless",
output = 'fake_fire:chimney_'..name.. ' 2',
recipe = {
"default:torch",
"default:"..node,
}
})
-- minetest.register_alias("fake_fire:chimney_" ..name , "fake_fire:chimney_" ..name.. "D", "fake_fire:chimney_" ..name.. "V")
end
local nodes = {
-- RGB Prime Colours --
-- MonoChrome --
{name="stone", node="stone_block" , description="Stone"},
{name="sandstone", node="sandstone_block", description="SandStone"},
{name="desert_stone", node="desert_stone_block", description="Desert Stone"},
{name="desert_sandstone", node="desert_sandstone_block", description="Desert SandStone"},
{name="silver_sandstone", node="silver_sandstone_block", description="Silver SandStone"},
{name="brick", node="brick", description="Brick"},
}
for i,node in ipairs(nodes) do
register_chim(node.name, node.node, node.description)
register_chimD(node.name, node.node, node.description)
register_chimV(node.name, node.node, node.description)
-- register whatever here
end
-- =============== --
-- new Fake Fire --
-- =============== --
local function register_fireD(name, description)
minetest.register_node("fake_fire:fake_"..name.."_d", {
description = "fake_".. description,
tiles = {
{name="fake_"..name.."_animated.png",
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1.5}},
},
paramtype = "light",
is_ground_content = true,
inventory_image = "fake_"..name..".png",
drawtype = "firelike",
buildable_to = true,
light_source = 14,
drop = '', -- fire cannot be picked up
damage_per_second = 0, -- default 0 Recomended 2*0.5, --
groups = {dig_immediate=3,attached_node=1,not_in_creative_inventory=1,smoky_d = 1},
paramtype = "light",
walkable = false,
on_punch = fake_fire.extinguish,
on_rightclick = function (pos,node,puncher)
-- swap somke fire to normal fire --
minetest.set_node(pos, {name = "fake_fire:fake_"..name, })
end
})
end
local function register_fireV(name, description)
minetest.register_node("fake_fire:fake_"..name.."_v", {
description = "fake_".. description,
tiles = {
{name="fake_"..name.."_animated.png",
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1.5}},
},
paramtype = "light",
is_ground_content = true,
inventory_image = "fake_"..name..".png",
drawtype = "firelike",
buildable_to = true,
light_source = 14,
drop = '', -- fire cannot be picked up
damage_per_second = 0, -- default 0 Recomended 2*0.5, --
groups = {dig_immediate=3,attached_node=1,not_in_creative_inventory=1,smoky_v = 1},
paramtype = "light",
walkable = false,
on_punch = fake_fire.extinguish,
on_rightclick = function (pos,node,puncher)
-- swap somke fire to normal fire --
minetest.set_node(pos, {name = "fake_fire:fake_"..name, })
end
})
end
local function register_fire(name, description)
minetest.register_node("fake_fire:fake_"..name, {
description = "fake_".. description,
tiles = {
{name="fake_"..name.."_animated.png",
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1.5}},
},
paramtype = "light",
is_ground_content = true,
inventory_image = "fake_"..name..".png",
drawtype = "firelike",
buildable_to = true,
light_source = 14,
drop = '', -- fire cannot be picked up
damage_per_second = 0, -- default 0 Recomended 2*0.5, --
groups = {dig_immediate=3,attached_node=1},
paramtype = "light",
walkable = false,
on_punch = fake_fire.extinguish,
on_rightclick = function (pos,node,puncher)
check_area(pos,"fake_fire:fake_"..name.."_d", "fake_fire:fake_"..name.."_v")
end
})
-- minetest.register_alias("fake_fire:fake_" ..name , "fake_fire:fake_" ..name.. "D", "fake_fire:fake_" ..name.. "V")
end
local fires = {
-- RGB Prime Colours --
-- MonoChrome --
{name="stable_fire", description="Fire"},
{name="ice_fire", description="Ice Fire"},
}
for i,fire in ipairs(fires) do
register_fire(fire.name, fire.description)
register_fireD(fire.name, fire.description)
register_fireV(fire.name, fire.description)
-- register whatever here
end
-- ========== --
-- Fire Tools --
-- ========== --
-- Flint and Steel --
--list = { "default:snow" = true, "default:ice"=true, "default:dirt_with_snow" }
minetest.register_tool("fake_fire:flint_and_steel", {
description = "Fake Fire Lighter",
inventory_image = "flint_and_steel.png",
liquids_pointable = false,
stack_max = 1,
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=0,
groupcaps={
flamable = {uses=65, maxlevel=1},
}
},
on_use = function(itemstack, user, pointed_thing)
-- if item is pointing at a node then --
if pointed_thing.type == "node" then
-- set a value the degradeing --
wear = 65535/65
-- load function on line 6 --
set_fake_fire(pointed_thing,itemstack,wear)
return itemstack
end
end,
})
-- Old Flint and Steel --
--[[ Players cannot craft this item, they will need to spawn it via
"/give" or creative.
]]--
minetest.register_tool("fake_fire:old_flint_and_steel", {
description = "Never Ending Flint & Steel",
inventory_image = "flint_and_steel.png",
liquids_pointable = false,
stack_max = 1,
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=0,
groupcaps={
flamable = {uses=65, maxlevel=1},
}
},
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type == "node" then
-- this is so that it will never brake --
wear = 0
-- load function on line 6 --
set_fake_fire(pointed_thing, itemstack, wear)
return itemstack
end
end,
})
-- =========== --
-- Fire crafts --
-- =========== --
minetest.register_craft({
output = "fake_fire:flint_and_steel",
recipe = {
{"default:flint", ""},
{"", "default:gold_ingot"},
}
})
minetest.register_craft({
output = "fake_fire:flint_and_steel",
recipe = {
{"default:flint", "default:gold_ingot"},
}
})
minetest.register_craft({
type = "shapeless",
output = 'fake_fire:embers',
recipe = {
"default:torch",
"group:wood",
}
})
-- old support --
minetest.register_alias("fake_fire:smokeless_chimney_top_stone", "fake_fire:chimney_stone")
minetest.register_alias("fake_fire:chimney_top_stone_d", "fake_fire:chimney_stone_d")
minetest.register_alias("fake_fire:chimney_top_stone", "fake_fire:chimney_stone_v")
minetest.register_alias("fake_fire:smokeless_chimney_top_sandstone", "fake_fire:chimney_sandstone")
minetest.register_alias("fake_fire:chimney_top_sandstone_d", "fake_fire:chimney_sandstone_d")
minetest.register_alias("fake_fire:chimney_top_sandstone", "fake_fire:chimney_sandstone_v")
minetest.register_alias("fake_fire:fake_fire_h", "fake_fire:fake_fire_v")