1
1
-- fire/init.lua
2
2
3
3
-- Global namespace for functions
4
-
5
4
fire = {}
6
5
7
6
-- Load support for MT game translation.
8
7
local S = minetest .get_translator (" fire" )
9
8
10
-
11
9
-- 'Enable fire' setting
12
-
13
10
local fire_enabled = minetest .settings :get_bool (" enable_fire" )
14
11
if fire_enabled == nil then
15
12
-- enable_fire setting not specified, check for disable_fire
27
24
--
28
25
29
26
-- Flood flame function
30
-
31
- local function flood_flame (pos , oldnode , newnode )
27
+ local function flood_flame (pos , _ , newnode )
32
28
-- Play flame extinguish sound if liquid is not an 'igniter'
33
- local nodedef = minetest .registered_items [newnode .name ]
34
- if not (nodedef and nodedef .groups and
35
- nodedef .groups .igniter and nodedef .groups .igniter > 0 ) then
29
+ if minetest .get_item_group (newnode .name , " igniter" ) == 0 then
36
30
minetest .sound_play (" fire_extinguish_flame" ,
37
31
{pos = pos , max_hear_distance = 16 , gain = 0.15 }, true )
38
32
end
@@ -41,19 +35,16 @@ local function flood_flame(pos, oldnode, newnode)
41
35
end
42
36
43
37
-- Flame nodes
44
-
45
- minetest .register_node (" fire:basic_flame" , {
38
+ local fire_node = {
46
39
drawtype = " firelike" ,
47
- tiles = {
48
- {
49
- name = " fire_basic_flame_animated.png" ,
50
- animation = {
51
- type = " vertical_frames" ,
52
- aspect_w = 16 ,
53
- aspect_h = 16 ,
54
- length = 1
55
- },
56
- },
40
+ tiles = {{
41
+ name = " fire_basic_flame_animated.png" ,
42
+ animation = {
43
+ type = " vertical_frames" ,
44
+ aspect_w = 16 ,
45
+ aspect_h = 16 ,
46
+ length = 1
47
+ }}
57
48
},
58
49
inventory_image = " fire_basic_flame.png" ,
59
50
paramtype = " light" ,
@@ -63,73 +54,44 @@ minetest.register_node("fire:basic_flame", {
63
54
sunlight_propagates = true ,
64
55
floodable = true ,
65
56
damage_per_second = 4 ,
66
- groups = {igniter = 2 , dig_immediate = 3 , not_in_creative_inventory = 1 },
67
- drop = " " ,
68
-
69
- on_timer = function (pos )
70
- local f = minetest .find_node_near (pos , 1 , {" group:flammable" })
71
- if not fire_enabled or not f then
72
- minetest .remove_node (pos )
73
- return
74
- end
75
- -- Restart timer
76
- return true
77
- end ,
78
-
79
- on_construct = function (pos )
80
- if not fire_enabled then
81
- minetest .remove_node (pos )
82
- else
83
- minetest .get_node_timer (pos ):start (math.random (30 , 60 ))
84
- end
85
- end ,
86
-
87
- on_flood = flood_flame ,
88
- })
89
-
90
- minetest .register_node (" fire:permanent_flame" , {
91
- description = S (" Permanent Flame" ),
92
- drawtype = " firelike" ,
93
- tiles = {
94
- {
95
- name = " fire_basic_flame_animated.png" ,
96
- animation = {
97
- type = " vertical_frames" ,
98
- aspect_w = 16 ,
99
- aspect_h = 16 ,
100
- length = 1
101
- },
102
- },
103
- },
104
- inventory_image = " fire_basic_flame.png" ,
105
- paramtype = " light" ,
106
- light_source = 13 ,
107
- walkable = false ,
108
- buildable_to = true ,
109
- sunlight_propagates = true ,
110
- floodable = true ,
111
- damage_per_second = 4 ,
112
- groups = {igniter = 2 , dig_immediate = 3 },
57
+ groups = {igniter = 2 , dig_immediate = 3 , fire = 1 },
113
58
drop = " " ,
59
+ on_flood = flood_flame
60
+ }
61
+
62
+ -- Basic flame node
63
+ local flame_fire_node = table .copy (fire_node )
64
+ flame_fire_node .groups .not_in_creative_inventory = 1
65
+ flame_fire_node .on_timer = function (pos )
66
+ if not minetest .find_node_near (pos , 1 , {" group:flammable" }) then
67
+ minetest .remove_node (pos )
68
+ return
69
+ end
70
+ -- Restart timer
71
+ return true
72
+ end
73
+ flame_fire_node .on_construct = function (pos )
74
+ minetest .get_node_timer (pos ):start (math.random (30 , 60 ))
75
+ end
114
76
115
- on_flood = flood_flame ,
116
- })
77
+ minetest .register_node (" fire:basic_flame" , flame_fire_node )
117
78
79
+ -- Permanent flame node
80
+ local permanent_fire_node = table .copy (fire_node )
81
+ permanent_fire_node .description = S (" Permanent Flame" )
118
82
119
- -- Flint and steel
83
+ minetest . register_node ( " fire:permanent_flame " , permanent_fire_node )
120
84
85
+ -- Flint and Steel
121
86
minetest .register_tool (" fire:flint_and_steel" , {
122
87
description = S (" Flint and Steel" ),
123
88
inventory_image = " fire_flint_steel.png" ,
124
89
sound = {breaks = " default_tool_breaks" },
125
90
126
91
on_use = function (itemstack , user , pointed_thing )
127
92
local sound_pos = pointed_thing .above or user :get_pos ()
128
- minetest .sound_play (
129
- " fire_flint_and_steel" ,
130
- {pos = sound_pos , gain = 0.5 , max_hear_distance = 8 },
131
- true
132
- )
93
+ minetest .sound_play (" fire_flint_and_steel" ,
94
+ {pos = sound_pos , gain = 0.5 , max_hear_distance = 8 }, true )
133
95
local player_name = user :get_player_name ()
134
96
if pointed_thing .type == " node" then
135
97
local node_under = minetest .get_node (pointed_thing .under ).name
@@ -153,10 +115,11 @@ minetest.register_tool("fire:flint_and_steel", {
153
115
-- Wear tool
154
116
local wdef = itemstack :get_definition ()
155
117
itemstack :add_wear (1000 )
118
+
156
119
-- Tool break sound
157
120
if itemstack :get_count () == 0 and wdef .sound and wdef .sound .breaks then
158
- minetest .sound_play (wdef .sound .breaks , { pos = sound_pos ,
159
- gain = 0.5 }, true )
121
+ minetest .sound_play (wdef .sound .breaks ,
122
+ { pos = sound_pos , gain = 0.5 }, true )
160
123
end
161
124
return itemstack
162
125
end
@@ -170,48 +133,40 @@ minetest.register_craft({
170
133
}
171
134
})
172
135
173
-
174
136
-- Override coalblock to enable permanent flame above
175
137
-- Coalblock is non-flammable to avoid unwanted basic_flame nodes
176
-
177
138
minetest .override_item (" default:coalblock" , {
178
- after_destruct = function (pos , oldnode )
139
+ after_destruct = function (pos )
179
140
pos .y = pos .y + 1
180
141
if minetest .get_node (pos ).name == " fire:permanent_flame" then
181
142
minetest .remove_node (pos )
182
143
end
183
144
end ,
184
- on_ignite = function (pos , igniter )
145
+ on_ignite = function (pos )
185
146
local flame_pos = {x = pos .x , y = pos .y + 1 , z = pos .z }
186
147
if minetest .get_node (flame_pos ).name == " air" then
187
148
minetest .set_node (flame_pos , {name = " fire:permanent_flame" })
188
149
end
189
- end ,
150
+ end
190
151
})
191
152
192
153
193
154
--
194
155
-- Sound
195
156
--
196
157
197
- local flame_sound = minetest .settings :get_bool (" flame_sound" )
198
- if flame_sound == nil then
199
- -- Enable if no setting present
200
- flame_sound = true
201
- end
158
+ -- Enable if no setting present
159
+ local flame_sound = minetest .settings :get_bool (" flame_sound" , true )
202
160
203
161
if flame_sound then
204
-
205
162
local handles = {}
206
163
local timer = 0
207
164
208
165
-- Parameters
209
-
210
166
local radius = 8 -- Flame node search radius around player
211
167
local cycle = 3 -- Cycle time for sound updates
212
168
213
169
-- Update sound for player
214
-
215
170
function fire .update_player_sound (player )
216
171
local player_name = player :get_player_name ()
217
172
-- Search for flame nodes in radius around player
@@ -263,16 +218,13 @@ if flame_sound then
263
218
fposmid = vector .divide (vector .add (fposmin , fposmax ), 2 )
264
219
end
265
220
-- Play sound
266
- local handle = minetest .sound_play (
267
- " fire_fire" ,
268
- {
269
- pos = fposmid ,
270
- to_player = player_name ,
271
- gain = math.min (0.06 * (1 + flames * 0.125 ), 0.18 ),
272
- max_hear_distance = 32 ,
273
- loop = true , -- In case of lag
274
- }
275
- )
221
+ local handle = minetest .sound_play (" fire_fire" , {
222
+ pos = fposmid ,
223
+ to_player = player_name ,
224
+ gain = math.min (0.06 * (1 + flames * 0.125 ), 0.18 ),
225
+ max_hear_distance = 32 ,
226
+ loop = true -- In case of lag
227
+ })
276
228
-- Store sound handle for this player
277
229
if handle then
278
230
handles [player_name ] = handle
@@ -281,7 +233,6 @@ if flame_sound then
281
233
end
282
234
283
235
-- Cycle for updating players sounds
284
-
285
236
minetest .register_globalstep (function (dtime )
286
237
timer = timer + dtime
287
238
if timer < cycle then
@@ -296,7 +247,6 @@ if flame_sound then
296
247
end )
297
248
298
249
-- Stop sound and clear handle on player leave
299
-
300
250
minetest .register_on_leaveplayer (function (player )
301
251
local player_name = player :get_player_name ()
302
252
if handles [player_name ] then
@@ -308,19 +258,14 @@ end
308
258
309
259
310
260
-- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it
311
-
312
- function fire .update_sounds_around (pos )
313
- end
314
-
261
+ function fire .update_sounds_around () end
315
262
316
263
--
317
264
-- ABMs
318
265
--
319
266
320
267
if fire_enabled then
321
-
322
268
-- Ignite neighboring nodes, add basic flames
323
-
324
269
minetest .register_abm ({
325
270
label = " Ignite flame" ,
326
271
nodenames = {" group:flammable" },
@@ -333,11 +278,10 @@ if fire_enabled then
333
278
if p then
334
279
minetest .set_node (p , {name = " fire:basic_flame" })
335
280
end
336
- end ,
281
+ end
337
282
})
338
283
339
284
-- Remove flammable nodes around basic flame
340
-
341
285
minetest .register_abm ({
342
286
label = " Remove flammable nodes" ,
343
287
nodenames = {" fire:basic_flame" },
@@ -358,7 +302,6 @@ if fire_enabled then
358
302
minetest .remove_node (p )
359
303
minetest .check_for_falling (p )
360
304
end
361
- end ,
305
+ end
362
306
})
363
-
364
307
end
0 commit comments