Skip to content
Permalink
Browse files
Fire mod: Code cleanup, compress textures
  • Loading branch information
MoNTE48 committed Apr 6, 2020
1 parent 720b24e commit 03c9aed2212099c764912e4c7b1c86679237f00d
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 112 deletions.
@@ -1,15 +1,12 @@
-- fire/init.lua

-- Global namespace for functions

fire = {}

-- Load support for MT game translation.
local S = minetest.get_translator("fire")


-- 'Enable fire' setting

local fire_enabled = minetest.settings:get_bool("enable_fire")
if fire_enabled == nil then
-- enable_fire setting not specified, check for disable_fire
@@ -27,12 +24,9 @@ end
--

-- Flood flame function

local function flood_flame(pos, oldnode, newnode)
local function flood_flame(pos, _, newnode)
-- Play flame extinguish sound if liquid is not an 'igniter'
local nodedef = minetest.registered_items[newnode.name]
if not (nodedef and nodedef.groups and
nodedef.groups.igniter and nodedef.groups.igniter > 0) then
if minetest.get_item_group(newnode.name, "igniter") == 0 then
minetest.sound_play("fire_extinguish_flame",
{pos = pos, max_hear_distance = 16, gain = 0.15}, true)
end
@@ -41,19 +35,16 @@ local function flood_flame(pos, oldnode, newnode)
end

-- Flame nodes

minetest.register_node("fire:basic_flame", {
local fire_node = {
drawtype = "firelike",
tiles = {
{
name = "fire_basic_flame_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
},
},
tiles = {{
name = "fire_basic_flame_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
}}
},
inventory_image = "fire_basic_flame.png",
paramtype = "light",
@@ -63,73 +54,44 @@ minetest.register_node("fire:basic_flame", {
sunlight_propagates = true,
floodable = true,
damage_per_second = 4,
groups = {igniter = 2, dig_immediate = 3, not_in_creative_inventory = 1},
drop = "",

on_timer = function(pos)
local f = minetest.find_node_near(pos, 1, {"group:flammable"})
if not fire_enabled or not f then
minetest.remove_node(pos)
return
end
-- Restart timer
return true
end,

on_construct = function(pos)
if not fire_enabled then
minetest.remove_node(pos)
else
minetest.get_node_timer(pos):start(math.random(30, 60))
end
end,

on_flood = flood_flame,
})

minetest.register_node("fire:permanent_flame", {
description = S("Permanent Flame"),
drawtype = "firelike",
tiles = {
{
name = "fire_basic_flame_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
},
},
},
inventory_image = "fire_basic_flame.png",
paramtype = "light",
light_source = 13,
walkable = false,
buildable_to = true,
sunlight_propagates = true,
floodable = true,
damage_per_second = 4,
groups = {igniter = 2, dig_immediate = 3},
groups = {igniter = 2, dig_immediate = 3, fire = 1},
drop = "",
on_flood = flood_flame
}

-- Basic flame node
local flame_fire_node = table.copy(fire_node)
flame_fire_node.groups.not_in_creative_inventory = 1
flame_fire_node.on_timer = function(pos)
if not minetest.find_node_near(pos, 1, {"group:flammable"}) then
minetest.remove_node(pos)
return
end
-- Restart timer
return true
end
flame_fire_node.on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(30, 60))
end

on_flood = flood_flame,
})
minetest.register_node("fire:basic_flame", flame_fire_node)

-- Permanent flame node
local permanent_fire_node = table.copy(fire_node)
permanent_fire_node.description = S("Permanent Flame")

-- Flint and steel
minetest.register_node("fire:permanent_flame", permanent_fire_node)

-- Flint and Steel
minetest.register_tool("fire:flint_and_steel", {
description = S("Flint and Steel"),
inventory_image = "fire_flint_steel.png",
sound = {breaks = "default_tool_breaks"},

on_use = function(itemstack, user, pointed_thing)
local sound_pos = pointed_thing.above or user:get_pos()
minetest.sound_play(
"fire_flint_and_steel",
{pos = sound_pos, gain = 0.5, max_hear_distance = 8},
true
)
minetest.sound_play("fire_flint_and_steel",
{pos = sound_pos, gain = 0.5, max_hear_distance = 8}, true)
local player_name = user:get_player_name()
if pointed_thing.type == "node" then
local node_under = minetest.get_node(pointed_thing.under).name
@@ -153,10 +115,11 @@ minetest.register_tool("fire:flint_and_steel", {
-- Wear tool
local wdef = itemstack:get_definition()
itemstack:add_wear(1000)

-- Tool break sound
if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
minetest.sound_play(wdef.sound.breaks, {pos = sound_pos,
gain = 0.5}, true)
minetest.sound_play(wdef.sound.breaks,
{pos = sound_pos, gain = 0.5}, true)
end
return itemstack
end
@@ -170,48 +133,40 @@ minetest.register_craft({
}
})


-- Override coalblock to enable permanent flame above
-- Coalblock is non-flammable to avoid unwanted basic_flame nodes

minetest.override_item("default:coalblock", {
after_destruct = function(pos, oldnode)
after_destruct = function(pos)
pos.y = pos.y + 1
if minetest.get_node(pos).name == "fire:permanent_flame" then
minetest.remove_node(pos)
end
end,
on_ignite = function(pos, igniter)
on_ignite = function(pos)
local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z}
if minetest.get_node(flame_pos).name == "air" then
minetest.set_node(flame_pos, {name = "fire:permanent_flame"})
end
end,
end
})


--
-- Sound
--

local flame_sound = minetest.settings:get_bool("flame_sound")
if flame_sound == nil then
-- Enable if no setting present
flame_sound = true
end
-- Enable if no setting present
local flame_sound = minetest.settings:get_bool("flame_sound", true)

if flame_sound then

local handles = {}
local timer = 0

-- Parameters

local radius = 8 -- Flame node search radius around player
local cycle = 3 -- Cycle time for sound updates

-- Update sound for player

function fire.update_player_sound(player)
local player_name = player:get_player_name()
-- Search for flame nodes in radius around player
@@ -263,16 +218,13 @@ if flame_sound then
fposmid = vector.divide(vector.add(fposmin, fposmax), 2)
end
-- Play sound
local handle = minetest.sound_play(
"fire_fire",
{
pos = fposmid,
to_player = player_name,
gain = math.min(0.06 * (1 + flames * 0.125), 0.18),
max_hear_distance = 32,
loop = true, -- In case of lag
}
)
local handle = minetest.sound_play("fire_fire", {
pos = fposmid,
to_player = player_name,
gain = math.min(0.06 * (1 + flames * 0.125), 0.18),
max_hear_distance = 32,
loop = true -- In case of lag
})
-- Store sound handle for this player
if handle then
handles[player_name] = handle
@@ -281,7 +233,6 @@ if flame_sound then
end

-- Cycle for updating players sounds

minetest.register_globalstep(function(dtime)
timer = timer + dtime
if timer < cycle then
@@ -296,7 +247,6 @@ if flame_sound then
end)

-- Stop sound and clear handle on player leave

minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name()
if handles[player_name] then
@@ -308,19 +258,14 @@ end


-- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it

function fire.update_sounds_around(pos)
end

function fire.update_sounds_around() end

--
-- ABMs
--

if fire_enabled then

-- Ignite neighboring nodes, add basic flames

minetest.register_abm({
label = "Ignite flame",
nodenames = {"group:flammable"},
@@ -333,11 +278,10 @@ if fire_enabled then
if p then
minetest.set_node(p, {name = "fire:basic_flame"})
end
end,
end
})

-- Remove flammable nodes around basic flame

minetest.register_abm({
label = "Remove flammable nodes",
nodenames = {"fire:basic_flame"},
@@ -358,7 +302,6 @@ if fire_enabled then
minetest.remove_node(p)
minetest.check_for_falling(p)
end
end,
end
})

end
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 03c9aed

Please sign in to comment.