1
0
mirror of https://github.com/sys4-fr/server-nalc.git synced 2024-12-25 02:00:37 +01:00

Merge pull request #259 from LeMagnesium/mffgame-merge

Update MinetestForFunGame
This commit is contained in:
crabman77 2015-09-02 22:03:22 +02:00
commit 05bd77c9ea
31 changed files with 395 additions and 244 deletions

View File

@ -1,7 +1,9 @@
## Generic ignorable patterns and files ## Generic ignorable patterns and files
*~ *~
.*.swp .*.swp
*.bak* *bak*
tags tags
*.vim *.vim
## Files related to minetest development cycle
*.patch

View File

@ -1 +1 @@
name = MinetestForFun Game name = MinetestForFun Game

View File

@ -23,15 +23,57 @@ The bucket API allows registering new types of buckets for non-default liquids.
"bucket_lava.png", -- Bucket texture (for wielditem and inventory_image) "bucket_lava.png", -- Bucket texture (for wielditem and inventory_image)
"Lava Bucket" -- Bucket description "Lava Bucket" -- Bucket description
) )
Beds API
--------
beds.register_bed(
"beds:bed", -- Bed name
def: See [#Bed definition] -- Bed definition
)
beds.read_spawns() -- returns a table containing players respawn positions
beds.kick_players() -- forces all players to leave bed
beds.skip_night() -- sets world time to morning and saves respawn position of all players currently sleeping
#Bed definition
---------------
{
description = "Simple Bed",
inventory_image = "beds_bed.png",
wield_image = "beds_bed.png",
tiles = {
bottom = {[Tile definition],
^ the tiles of the bottom part of the bed
},
top = {[Tile definition],
^ the tiles of the bottom part of the bed
}
},
nodebox = {
bottom = regular nodebox, see [Node boxes], -- bottm part of bed
top = regular nodebox, see [Node boxes], -- top part of bed
},
selectionbox = regular nodebox, see [Node boxes], -- for both nodeboxes
recipe = { -- Craft recipe
{"group:wool", "group:wool", "group:wool"},
{"group:wood", "group:wood", "group:wood"}
}
}
Doors API Doors API
--------- ---------
The doors mod allows modders to register custom doors. The doors mod allows modders to register custom doors and trapdoors.
doors.register_door(name, def)
^ name: "Door name"
^ def: See [#Door definition]
-> Registers new door
doors.register_trapdoor(name, def)
^ name: "Trapdoor name"
^ def: See [#Trapdoor definition]
-> Registers new trapdoor
doors.register_door(name, def)
^ name: "Door name"
^ def: See [#Door definition]
#Door definition #Door definition
---------------- ----------------
{ {
@ -46,17 +88,34 @@ The doors mod allows modders to register custom doors.
node_box_top = regular nodebox, see [Node boxes], OPTIONAL, node_box_top = regular nodebox, see [Node boxes], OPTIONAL,
selection_box_bottom = regular nodebox, see [Node boxes], OPTIONAL, selection_box_bottom = regular nodebox, see [Node boxes], OPTIONAL,
selection_box_top = regular nodebox, see [Node boxes], OPTIONAL, selection_box_top = regular nodebox, see [Node boxes], OPTIONAL,
sound_open_door = sound play for open door, OPTIONAL,
sound_close_door = sound play for close door, OPTIONAL,
only_placer_can_open = true/false, only_placer_can_open = true/false,
^ If true, only placer can open the door (locked for others) ^ If true, only placer can open the door (locked for others)
} }
#Trapdoor definition
----------------
{
tile_front = "doors_trapdoor.png",
^ the texture for the front and back of the trapdoor
tile_side: "doors_trapdoor_side.png",
^ the tiles of the four side parts of the trapdoor
sound_open = sound to play when opening the trapdoor, OPTIONAL,
sound_close = sound to play when closing the trapdoor, OPTIONAL,
-> You can add any other node definition properties for minetest.register_node,
such as wield_image, inventory_image, sounds, groups, description, ...
Only node_box, selection_box, tiles, drop, drawtype, paramtype, paramtype2, on_rightclick
will be overwritten by the trapdoor registration function
}
Farming API Farming API
----------- -----------
The farming API allows you to easily register plants and hoes. The farming API allows you to easily register plants and hoes.
farming.register_hoe(name, hoe definition) farming.register_hoe(name, hoe definition)
-> Register a new hoe, see [#hoe definition] -> Register a new hoe, see [#hoe definition]
farming.register_plant(name, Plant definition) farming.register_plant(name, Plant definition)
-> Register a new growing plant, see [#Plant definition] -> Register a new growing plant, see [#Plant definition]
@ -66,7 +125,8 @@ farming.register_plant(name, Plant definition)
description = "", -- Description for tooltip description = "", -- Description for tooltip
inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image
max_uses = 30, -- Uses until destroyed max_uses = 30, -- Uses until destroyed
recipe = { -- Craft recipe material = "", -- Material for recipes
recipe = { -- Craft recipe, if material isn't used
{"air", "air", "air"}, {"air", "air", "air"},
{"", "group:stick"}, {"", "group:stick"},
{"", "group:stick"}, {"", "group:stick"},
@ -79,11 +139,26 @@ farming.register_plant(name, Plant definition)
description = "", -- Description of seed item description = "", -- Description of seed item
inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image
steps = 8, -- How many steps the plant has to grow, until it can be harvested steps = 8, -- How many steps the plant has to grow, until it can be harvested
^ Always provide a plant texture for ech step, format: modname_plantname_i.png (i = stepnumber) ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber)
minlight = 13, -- Minimum light to grow minlight = 13, -- Minimum light to grow
maxlight = default.LIGHT_MAX -- Maximum light to grow maxlight = default.LIGHT_MAX -- Maximum light to grow
} }
Screwdriver API
---------------
The screwdriver API allows you to control a node's behaviour when a screwdriver is used on it.
To use it, add the on_screwdriver function to the node definition.
on_rotate(pos, node, user, mode, new_param2)
^ pos: position of the node that the screwdriver is being used on
^ node: that node
^ user: the player who used the screwdriver
^ mode: screwdriver.ROTATE_FACE or screwdriver.ROTATE_AXIS
^ new_param2: the new value of param2 that would have been set if on_rotate wasn't there
^ return value: false to disallow rotation, nil to keep default behaviour, true to allow
it but to indicate that changed have already been made (so the screwdriver will wear out)
^ use on_rotate = screwdriver.disallow to always disallow rotation
^ use on_rotate = screwdriver.rotate_simple to allow only face rotation
Stairs API Stairs API
---------- ----------
The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those
@ -97,7 +172,7 @@ stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
-> images: see [Tile definition] -> images: see [Tile definition]
-> description: used for the description field in the stair's definition -> description: used for the description field in the stair's definition
-> sounds: see [#Default sounds] -> sounds: see [#Default sounds]
stairs.register_slab(subname, recipeitem, groups, images, description, sounds) stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
-> Registers a slabs -> Registers a slabs
-> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" -> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname"
@ -106,19 +181,19 @@ stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
-> images: see [Tile definition] -> images: see [Tile definition]
-> description: used for the description field in the stair's definition -> description: used for the description field in the stair's definition
-> sounds: see [#Default sounds] -> sounds: see [#Default sounds]
stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds) stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)
-> A wrapper for stairs.register_stair and stairs.register_slab -> A wrapper for stairs.register_stair and stairs.register_slab
-> Uses almost the same arguments as stairs.register_stair -> Uses almost the same arguments as stairs.register_stair
-> desc_stair: Description for stair node -> desc_stair: Description for stair node
-> desc_slab: Description for slab node -> desc_slab: Description for slab node
Xpanes API Xpanes API
---------- ----------
Creates panes that automatically connect to each other Creates panes that automatically connect to each other
xpanes.register_pane(subname, def) xpanes.register_pane(subname, def)
-> subname: used for nodename. Result: "xpanes:subname_{1..16}" -> subname: used for nodename. Result: "xpanes:subname" and "xpanes:subname_{2..15}"
-> def: See [#Pane definition] -> def: See [#Pane definition]
#Pane definition #Pane definition
@ -132,12 +207,26 @@ xpanes.register_pane(subname, def)
^ See [#Default sounds] ^ See [#Default sounds]
recipe = {{"","","","","","","","",""}}, recipe = {{"","","","","","","","",""}},
^ Recipe field only ^ Recipe field only
on_construct = function(pos)
update_pane(pos, "pane")
end,
^ Required to handle rotation correctly
} }
Raillike definitions
--------------------
The following nodes use the group `connect_to_raillike` and will only connect to
raillike nodes within this group and the same group value.
Use `minetest.raillike_group(<Name>)` to get the group value.
| Node type | Raillike group name
+-----------------------+----------------------------------
| default:rail | "rail"
| tnt:gunpowder | "gunpowder"
| tnt:gunpowder_burning | "gunpowder"
Example:
If you want to add a new rail type and want it to connect with default:rail,
add `connect_to_raillike=minetest.raillike_group("rail")` into the `groups` table
of your node.
Default sounds Default sounds
-------------- --------------
Sounds inside the default table can be used within the sounds field of node definitions. Sounds inside the default table can be used within the sounds field of node definitions.
@ -206,6 +295,7 @@ Model Definition
Leafdecay Leafdecay
--------- ---------
To enable leaf decay for a node, add it to the "leafdecay" group. To enable leaf decay for a node, add it to the "leafdecay" group.
The rating of the group determines how far from a node in the group "tree" The rating of the group determines how far from a node in the group "tree"
the node can be without decaying. the node can be without decaying.
@ -278,6 +368,7 @@ minetest.register_craft({
------------ ------------
dye.basecolors dye.basecolors
^ Array containing the names of available base colors ^ Array containing the names of available base colors
dye.excolors dye.excolors
^ Array containing the names of the available extended colors ^ Array containing the names of the available extended colors

View File

@ -21,4 +21,8 @@
#enable_tnt = <true in singleplayer, false in multiplayer> #enable_tnt = <true in singleplayer, false in multiplayer>
# The radius of a TNT explosion # The radius of a TNT explosion
#tnt_radius = 3 #tnt_radius = 3
# Enable the stairs mod ABM that replaces the old 'upside down'
# stair and slab nodes in old maps with the new param2 versions.
#enable_stairs_replace_abm = false

View File

@ -1,4 +1,3 @@
-- --
-- Helper functions -- Helper functions
-- --
@ -290,6 +289,7 @@ minetest.register_craft({
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "boats:boat", output = "boats:boat",
recipe = { recipe = {
@ -297,4 +297,3 @@ minetest.register_craft({
{"group:wood", "group:wood", "group:wood"}, {"group:wood", "group:wood", "group:wood"},
}, },
}) })

View File

@ -58,7 +58,6 @@ VanessaE (WTFPL):
default_nc_side.png default_nc_side.png
default_desert_sand.png default_desert_sand.png
default_desert_stone.png default_desert_stone.png
default_desert_stone_brick.png
default_sand.png default_sand.png
default_jungletree_top.png default_jungletree_top.png
@ -121,12 +120,13 @@ paramat (CC BY-SA 3.0):
default_junglewood.png, derived from a texture by BlockMen (CC BY-SA 3.0) default_junglewood.png, derived from a texture by BlockMen (CC BY-SA 3.0)
default_grass.png, derived from a texture by Philipbenr (CC BY-SA 3.0) default_grass.png, derived from a texture by Philipbenr (CC BY-SA 3.0)
default_grass_side.png, derived from a texture by Philipbenr (CC BY-SA 3.0) default_grass_side.png, derived from a texture by Philipbenr (CC BY-SA 3.0)
default_stone_brick.png, derived from a texture by Cisoun (WTFPL)
default_desert_stone_brick.png, derived from a texture by VanessaE (WTFPL)
brunob.santos (CC BY-SA 4.0): brunob.santos (CC BY-SA 4.0):
default_desert_cobble.png default_desert_cobble.png
BlockMen (CC BY-SA 3.0): BlockMen (CC BY-SA 3.0):
default_stone_brick.png
default_wood.png default_wood.png
default_clay_brick.png default_clay_brick.png
default_iron_ingot.png default_iron_ingot.png

View File

@ -905,7 +905,7 @@ function default.register_biomes()
--node_water_top = "", --node_water_top = "",
--depth_water_top = , --depth_water_top = ,
--node_water = "", --node_water = "",
y_min = 1, y_min = 5,
y_max = 31000, y_max = 31000,
heat_point = 95, heat_point = 95,
humidity_point = 10, humidity_point = 10,
@ -923,7 +923,7 @@ function default.register_biomes()
--depth_water_top = , --depth_water_top = ,
--node_water = "", --node_water = "",
y_min = -112, y_min = -112,
y_max = 0, y_max = 4,
heat_point = 95, heat_point = 95,
humidity_point = 10, humidity_point = 10,
}) })
@ -1292,7 +1292,7 @@ function default.register_decorations()
persist = 0.6 persist = 0.6
}, },
biomes = {"desert"}, biomes = {"desert"},
y_min = 2, y_min = 5,
y_max = 31000, y_max = 31000,
schematic = minetest.get_modpath("default").."/schematics/large_cactus.mts", schematic = minetest.get_modpath("default").."/schematics/large_cactus.mts",
flags = "place_center_x", flags = "place_center_x",
@ -1314,11 +1314,11 @@ function default.register_decorations()
persist = 0.6 persist = 0.6
}, },
biomes = {"desert"}, biomes = {"desert"},
y_min = 2, y_min = 5,
y_max = 31000, y_max = 31000,
decoration = "default:cactus", decoration = "default:cactus",
height = 2, height = 2,
height_max = 5, height_max = 5,
}) })
-- Papyrus -- Papyrus

File diff suppressed because it is too large Load Diff

BIN
minetestforfun_game/mods/default/schematics/papyrus.mts Executable file → Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -36,27 +36,27 @@ minetest.register_abm({
if node.name == "default:sapling" then if node.name == "default:sapling" then
minetest.log("action", "A sapling grows into a tree at ".. minetest.log("action", "A sapling grows into a tree at "..
minetest.pos_to_string(pos)) minetest.pos_to_string(pos))
-- if mapgen == "v6" then if mapgen == "v6" then
default.grow_tree(pos, random(1, 4) == 1) default.grow_tree(pos, random(1, 4) == 1)
-- else else
-- default.grow_new_apple_tree(pos) default.grow_new_apple_tree(pos)
-- end end
elseif node.name == "default:junglesapling" then elseif node.name == "default:junglesapling" then
minetest.log("action", "A jungle sapling grows into a tree at ".. minetest.log("action", "A jungle sapling grows into a tree at "..
minetest.pos_to_string(pos)) minetest.pos_to_string(pos))
-- if mapgen == "v6" then if mapgen == "v6" then
default.grow_jungle_tree(pos) default.grow_jungle_tree(pos)
-- else else
-- default.grow_new_jungle_tree(pos) default.grow_new_jungle_tree(pos)
-- end end
elseif node.name == "default:pine_sapling" then elseif node.name == "default:pine_sapling" then
minetest.log("action", "A pine sapling grows into a tree at ".. minetest.log("action", "A pine sapling grows into a tree at "..
minetest.pos_to_string(pos)) minetest.pos_to_string(pos))
-- if mapgen == "v6" then if mapgen == "v6" then
default.grow_pine_tree(pos) default.grow_pine_tree(pos)
-- else else
-- default.grow_new_pine_tree(pos) default.grow_new_pine_tree(pos)
-- end end
elseif node.name == "default:acacia_sapling" then elseif node.name == "default:acacia_sapling" then
minetest.log("action", "An acacia sapling grows into a tree at ".. minetest.log("action", "An acacia sapling grows into a tree at "..
minetest.pos_to_string(pos)) minetest.pos_to_string(pos))
@ -359,7 +359,7 @@ end
-- New apple tree -- New apple tree
function default.grow_new_apple_tree(pos) function default.grow_new_apple_tree(pos)
local path = minetest.get_modpath("default") .. "/schematics/apple_tree.mts" local path = minetest.get_modpath("default") .. "/schematics/apple_tree_from_sapling.mts"
minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2},
path, 0, nil, false) path, 0, nil, false)
end end
@ -368,8 +368,8 @@ end
-- New jungle tree -- New jungle tree
function default.grow_new_jungle_tree(pos) function default.grow_new_jungle_tree(pos)
local path = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts" local path = minetest.get_modpath("default") .. "/schematics/jungle_tree_from_sapling.mts"
minetest.place_schematic({x = pos.x - 2, y = pos.y, z = pos.z - 2}, minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2},
path, 0, nil, false) path, 0, nil, false)
end end
@ -377,7 +377,7 @@ end
-- New pine tree -- New pine tree
function default.grow_new_pine_tree(pos) function default.grow_new_pine_tree(pos)
local path = minetest.get_modpath("default") .. "/schematics/pine_tree.mts" local path = minetest.get_modpath("default") .. "/schematics/pine_tree_from_sapling.mts"
minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2},
path, 0, nil, false) path, 0, nil, false)
end end
@ -386,7 +386,7 @@ end
-- New acacia tree -- New acacia tree
function default.grow_new_acacia_tree(pos) function default.grow_new_acacia_tree(pos)
local path = minetest.get_modpath("default") .. "/schematics/acacia_tree.mts" local path = minetest.get_modpath("default") .. "/schematics/acacia_tree_from_sapling.mts"
minetest.place_schematic({x = pos.x - 4, y = pos.y - 1, z = pos.z - 4}, minetest.place_schematic({x = pos.x - 4, y = pos.y - 1, z = pos.z - 4},
path, random, nil, false) path, random, nil, false)
end end

View File

@ -172,4 +172,4 @@ minetest.register_node("farming:carrot_8", {
not_in_creative_inventory = 1 not_in_creative_inventory = 1
}, },
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
}) })

View File

@ -25,4 +25,4 @@ minetest.override_item("default:junglegrass", {
{items = {'default:junglegrass'}}, {items = {'default:junglegrass'}},
} }
}, },
}) })

View File

@ -1,17 +1,23 @@
-- minetest/fire/init.lua -- minetest/fire/init.lua
-- Global namespace for functions
fire = {} fire = {}
-- Register flame node
minetest.register_node("fire:basic_flame", { minetest.register_node("fire:basic_flame", {
description = "Fire", description = "Fire",
drawtype = "firelike", drawtype = "firelike",
tiles = {{ tiles = {{
name="fire_basic_flame_animated.png", name = "fire_basic_flame_animated.png",
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}, animation = {type = "vertical_frames",
aspect_w = 16, aspect_h = 16, length = 1},
}}, }},
inventory_image = "fire_basic_flame.png", inventory_image = "fire_basic_flame.png",
light_source = 14, light_source = 14,
groups = {igniter=2,dig_immediate=3,hot=3}, groups = {igniter = 2, dig_immediate = 3, hot = 3},
drop = '', drop = '',
walkable = false, walkable = false,
buildable_to = true, buildable_to = true,
@ -29,44 +35,55 @@ minetest.register_node("fire:basic_flame", {
on_blast = function() end, on_blast = function() end,
}) })
fire.D = 6
-- Fire sounds table
-- key: position hash of low corner of area -- key: position hash of low corner of area
-- value: {handle=sound handle, name=sound name} -- value: {handle=sound handle, name=sound name}
fire.sounds = {} fire.sounds = {}
-- Get sound area of position
-- size of sound areas
fire.D = 6
function fire.get_area_p0p1(pos) function fire.get_area_p0p1(pos)
local p0 = { local p0 = {
x=math.floor(pos.x/fire.D)*fire.D, x = math.floor(pos.x / fire.D) * fire.D,
y=math.floor(pos.y/fire.D)*fire.D, y = math.floor(pos.y / fire.D) * fire.D,
z=math.floor(pos.z/fire.D)*fire.D, z = math.floor(pos.z / fire.D) * fire.D,
} }
local p1 = { local p1 = {
x=p0.x+fire.D-1, x = p0.x + fire.D - 1,
y=p0.y+fire.D-1, y = p0.y + fire.D - 1,
z=p0.z+fire.D-1 z = p0.z + fire.D - 1
} }
return p0, p1 return p0, p1
end end
-- Update fire sounds in sound area of position
function fire.update_sounds_around(pos) function fire.update_sounds_around(pos)
local p0, p1 = fire.get_area_p0p1(pos) local p0, p1 = fire.get_area_p0p1(pos)
local cp = {x=(p0.x+p1.x)/2, y=(p0.y+p1.y)/2, z=(p0.z+p1.z)/2} local cp = {x = (p0.x + p1.x) / 2, y = (p0.y + p1.y) / 2, z = (p0.z + p1.z) / 2}
local flames_p = minetest.find_nodes_in_area(p0, p1, {"fire:basic_flame"}) local flames_p = minetest.find_nodes_in_area(p0, p1, {"fire:basic_flame"})
--print("number of flames at "..minetest.pos_to_string(p0).."/" --print("number of flames at "..minetest.pos_to_string(p0).."/"
-- ..minetest.pos_to_string(p1)..": "..#flames_p) -- ..minetest.pos_to_string(p1)..": "..#flames_p)
local should_have_sound = (#flames_p > 0) local should_have_sound = (#flames_p > 0)
local wanted_sound = nil local wanted_sound = nil
if #flames_p >= 9 then if #flames_p >= 9 then
wanted_sound = {name="fire_large", gain=1.5} wanted_sound = {name = "fire_large", gain = 1.5}
elseif #flames_p > 0 then elseif #flames_p > 0 then
wanted_sound = {name="fire_small", gain=1.5} wanted_sound = {name = "fire_small", gain = 1.5}
end end
local p0_hash = minetest.hash_node_position(p0) local p0_hash = minetest.hash_node_position(p0)
local sound = fire.sounds[p0_hash] local sound = fire.sounds[p0_hash]
if not sound then if not sound then
if should_have_sound then if should_have_sound then
fire.sounds[p0_hash] = { fire.sounds[p0_hash] = {
handle = minetest.sound_play(wanted_sound, {pos=cp, max_hear_distance = 16, loop=true}), handle = minetest.sound_play(wanted_sound,
{pos = cp, max_hear_distance = 16, loop = true}),
name = wanted_sound.name, name = wanted_sound.name,
} }
end end
@ -77,40 +94,53 @@ function fire.update_sounds_around(pos)
elseif sound.name ~= wanted_sound.name then elseif sound.name ~= wanted_sound.name then
minetest.sound_stop(sound.handle) minetest.sound_stop(sound.handle)
fire.sounds[p0_hash] = { fire.sounds[p0_hash] = {
handle = minetest.sound_play(wanted_sound, {pos=cp, max_hear_distance = 16, loop=true}), handle = minetest.sound_play(wanted_sound,
{pos = cp, max_hear_distance = 16, loop = true}),
name = wanted_sound.name, name = wanted_sound.name,
} }
end end
end end
end end
-- Update fire sounds on flame node construct or destruct
function fire.on_flame_add_at(pos) function fire.on_flame_add_at(pos)
fire.update_sounds_around(pos) fire.update_sounds_around(pos)
end end
function fire.on_flame_remove_at(pos) function fire.on_flame_remove_at(pos)
fire.update_sounds_around(pos) fire.update_sounds_around(pos)
end end
-- Return positions for flames around a burning node
function fire.find_pos_for_flame_around(pos) function fire.find_pos_for_flame_around(pos)
return minetest.find_node_near(pos, 1, {"air"}) return minetest.find_node_near(pos, 1, {"air"})
end end
-- Detect nearby extinguishing nodes
function fire.flame_should_extinguish(pos) function fire.flame_should_extinguish(pos)
if minetest.setting_getbool("disable_fire") then return true end if minetest.setting_getbool("disable_fire") then return true end
--return minetest.find_node_near(pos, 1, {"group:puts_out_fire"}) --return minetest.find_node_near(pos, 1, {"group:puts_out_fire"})
local p0 = {x=pos.x-2, y=pos.y, z=pos.z-2} local p0 = {x = pos.x - 1, y = pos.y, z = pos.z - 1}
local p1 = {x=pos.x+2, y=pos.y, z=pos.z+2} local p1 = {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}
local ps = minetest.find_nodes_in_area(p0, p1, {"group:puts_out_fire"}) local ps = minetest.find_nodes_in_area(p0, p1, {"group:puts_out_fire"})
return (#ps ~= 0) return (#ps ~= 0)
end end
--[[-- Ignite neighboring nodes
minetest.register_abm({ -- Ignite neighboring nodes
--[[minetest.register_abm({
nodenames = {"group:flammable"}, nodenames = {"group:flammable"},
neighbors = {"group:igniter"}, neighbors = {"group:igniter"},
interval = 5, interval = 7,
chance = 2, chance = 32,
action = function(p0, node, _, _) action = function(p0, node, _, _)
-- If there is water or stuff like that around flame, don't ignite -- If there is water or stuff like that around flame, don't ignite
if fire.flame_should_extinguish(p0) then if fire.flame_should_extinguish(p0) then
@ -118,12 +148,17 @@ minetest.register_abm({
end end
local p = fire.find_pos_for_flame_around(p0) local p = fire.find_pos_for_flame_around(p0)
if p then if p then
minetest.set_node(p, {name="fire:basic_flame"}) minetest.set_node(p, {name = "fire:basic_flame"})
end end
end, end,
}) })
-- Rarely ignite things from far -- Rarely ignite things from far
--[[ Currently disabled to reduce the chance of uncontrollable spreading
fires that disrupt servers. Also for less lua processing load.
minetest.register_abm({ minetest.register_abm({
nodenames = {"group:igniter"}, nodenames = {"group:igniter"},
neighbors = {"air"}, neighbors = {"air"},
@ -143,17 +178,18 @@ minetest.register_abm({
end end
local p2 = fire.find_pos_for_flame_around(p) local p2 = fire.find_pos_for_flame_around(p)
if p2 then if p2 then
minetest.set_node(p2, {name="fire:basic_flame"}) minetest.set_node(p2, {name = "fire:basic_flame"})
end end
end end
end, end,
})]] })]]
-- Remove flammable nodes and flame -- Remove flammable nodes and flame
minetest.register_abm({ minetest.register_abm({
nodenames = {"fire:basic_flame"}, nodenames = {"fire:basic_flame"},
interval = 3, interval = 5,
chance = 2, chance = 16,
action = function(p0, node, _, _) action = function(p0, node, _, _)
-- If there is water or stuff like that around flame, remove flame -- If there is water or stuff like that around flame, remove flame
if fire.flame_should_extinguish(p0) then if fire.flame_should_extinguish(p0) then
@ -161,7 +197,7 @@ minetest.register_abm({
return return
end end
-- Make the following things rarer -- Make the following things rarer
if math.random(1,3) == 1 then if math.random(1, 3) == 1 then
return return
end end
-- If there are no flammable nodes around flame, remove flame -- If there are no flammable nodes around flame, remove flame
@ -169,7 +205,7 @@ minetest.register_abm({
minetest.remove_node(p0) minetest.remove_node(p0)
return return
end end
if math.random(1,4) == 1 then if math.random(1, 4) == 1 then
-- remove a flammable node around flame -- remove a flammable node around flame
local p = minetest.find_node_near(p0, 1, {"group:flammable"}) local p = minetest.find_node_near(p0, 1, {"group:flammable"})
if p then if p then