@@ -120,7 +120,6 @@ minetest.register_node("default:dirt_with_snow", {
120
120
footstep = {name = " default_snow_footstep" , gain = 0.25 },
121
121
}),
122
122
})
123
- minetest .register_alias (" dirt_with_snow" , " default:dirt_with_snow" )
124
123
125
124
minetest .register_node (" default:dirt" , {
126
125
description = " Dirt" ,
@@ -130,6 +129,38 @@ minetest.register_node("default:dirt", {
130
129
sounds = default .node_sound_dirt_defaults (),
131
130
})
132
131
132
+ minetest .register_abm ({
133
+ nodenames = {" default:dirt" },
134
+ interval = 2 ,
135
+ chance = 200 ,
136
+ action = function (pos , node )
137
+ local above = {x = pos .x , y = pos .y + 1 , z = pos .z }
138
+ local name = minetest .get_node (above ).name
139
+ local nodedef = minetest .registered_nodes [name ]
140
+ if nodedef and nodedef .sunlight_propagates and nodedef .liquidtype == " none" and minetest .get_node_light (above ) >= 13 then
141
+ if name == " default:snow" or name == " default:snowblock" then
142
+ minetest .set_node (pos , {name = " default:dirt_with_snow" })
143
+ else
144
+ minetest .set_node (pos , {name = " default:dirt_with_grass" })
145
+ end
146
+ end
147
+ end
148
+ })
149
+
150
+ minetest .register_abm ({
151
+ nodenames = {" default:dirt_with_grass" },
152
+ interval = 2 ,
153
+ chance = 20 ,
154
+ action = function (pos , node )
155
+ local above = {x = pos .x , y = pos .y + 1 , z = pos .z }
156
+ local name = minetest .get_node (above ).name
157
+ local nodedef = minetest .registered_nodes [name ]
158
+ if name ~= " ignore" and nodedef and not (nodedef .sunlight_propagates and nodedef .liquidtype == " none" ) then
159
+ minetest .set_node (pos , {name = " default:dirt" })
160
+ end
161
+ end
162
+ })
163
+
133
164
minetest .register_node (" default:sand" , {
134
165
description = " Sand" ,
135
166
tiles = {" default_sand.png" },
@@ -251,9 +282,193 @@ minetest.register_node("default:junglesapling", {
251
282
groups = {snappy = 2 ,dig_immediate = 3 ,flammable = 2 ,attached_node = 1 },
252
283
sounds = default .node_sound_leaves_defaults (),
253
284
})
254
- -- aliases for tree growing abm in content_abm.cpp
255
- minetest .register_alias (" sapling" , " default:sapling" )
256
- minetest .register_alias (" junglesapling" , " default:junglesapling" )
285
+
286
+ local c_air = minetest .get_content_id (" air" )
287
+ local c_ignore = minetest .get_content_id (" ignore" )
288
+ local c_tree = minetest .get_content_id (" default:tree" )
289
+ local c_leaves = minetest .get_content_id (" default:leaves" )
290
+ local c_apple = minetest .get_content_id (" default:apple" )
291
+ function default .grow_tree (data , a , pos , is_apple_tree , seed )
292
+ --[[
293
+ NOTE: Tree-placing code is currently duplicated in the engine
294
+ and in games that have saplings; both are deprecated but not
295
+ replaced yet
296
+ ]] --
297
+ local pr = PseudoRandom (seed )
298
+ local th = pr :next (4 , 5 )
299
+ local x , y , z = pos .x , pos .y , pos .z
300
+ for yy = y , y + th - 1 do
301
+ local vi = a :index (x , yy , z )
302
+ if a :contains (x , yy , z ) and (data [vi ] == c_air or yy == y ) then
303
+ data [vi ] = c_tree
304
+ end
305
+ end
306
+ y = y + th - 1 -- (x, y, z) is now last piece of trunk
307
+ local leaves_a = VoxelArea :new {MinEdge = {x =- 2 , y =- 1 , z =- 2 }, MaxEdge = {x = 2 , y = 2 , z = 2 }}
308
+ local leaves_buffer = {}
309
+
310
+ -- Force leaves near the trunk
311
+ local d = 1
312
+ for xi = - d , d do
313
+ for yi = - d , d do
314
+ for zi = - d , d do
315
+ leaves_buffer [leaves_a :index (xi , yi , zi )] = true
316
+ end
317
+ end
318
+ end
319
+
320
+ -- Add leaves randomly
321
+ for iii = 1 , 8 do
322
+ local d = 1
323
+ local xx = pr :next (leaves_a .MinEdge .x , leaves_a .MaxEdge .x - d )
324
+ local yy = pr :next (leaves_a .MinEdge .y , leaves_a .MaxEdge .y - d )
325
+ local zz = pr :next (leaves_a .MinEdge .z , leaves_a .MaxEdge .z - d )
326
+
327
+ for xi = 0 , d do
328
+ for yi = 0 , d do
329
+ for zi = 0 , d do
330
+ leaves_buffer [leaves_a :index (xx + xi , yy + yi , zz + zi )] = true
331
+ end
332
+ end
333
+ end
334
+ end
335
+
336
+ -- Add the leaves
337
+ for xi = leaves_a .MinEdge .x , leaves_a .MaxEdge .x do
338
+ for yi = leaves_a .MinEdge .y , leaves_a .MaxEdge .y do
339
+ for zi = leaves_a .MinEdge .z , leaves_a .MaxEdge .z do
340
+ if a :contains (x + xi , y + yi , z + zi ) then
341
+ local vi = a :index (x + xi , y + yi , z + zi )
342
+ if data [vi ] == c_air or data [vi ] == c_ignore then
343
+ if leaves_buffer [leaves_a :index (xi , yi , zi )] then
344
+ if is_apple_tree and pr :next (1 , 100 ) <= 10 then
345
+ data [vi ] = c_apple
346
+ else
347
+ data [vi ] = c_leaves
348
+ end
349
+ end
350
+ end
351
+ end
352
+ end
353
+ end
354
+ end
355
+ end
356
+
357
+ minetest .register_abm ({
358
+ nodenames = {" default:sapling" },
359
+ interval = 10 ,
360
+ chance = 50 ,
361
+ action = function (pos , node )
362
+ local is_soil = minetest .registered_nodes [minetest .get_node ({x = pos .x , y = pos .y - 1 , z = pos .z }).name ].groups .soil
363
+ if is_soil == nil or is_soil == 0 then return end
364
+ print (" A sapling grows into a tree at " .. minetest .pos_to_string (pos ))
365
+ local vm = minetest .get_voxel_manip ()
366
+ local minp , maxp = vm :read_from_map ({x = pos .x - 16 , y = pos .y , z = pos .z - 16 }, {x = pos .x + 16 , y = pos .y + 16 , z = pos .z + 16 })
367
+ local a = VoxelArea :new {MinEdge = minp , MaxEdge = maxp }
368
+ local data = vm :get_data ()
369
+ default .grow_tree (data , a , pos , math.random (1 , 4 ) == 1 , math.random (1 ,100000 ))
370
+ vm :set_data (data )
371
+ vm :write_to_map (data )
372
+ vm :update_map ()
373
+ end
374
+ })
375
+
376
+ local c_jungletree = minetest .get_content_id (" default:jungletree" )
377
+ local c_jungleleaves = minetest .get_content_id (" default:jungleleaves" )
378
+ function default .grow_jungletree (data , a , pos , seed )
379
+ --[[
380
+ NOTE: Tree-placing code is currently duplicated in the engine
381
+ and in games that have saplings; both are deprecated but not
382
+ replaced yet
383
+ ]] --
384
+ local pr = PseudoRandom (seed )
385
+ local x , y , z = pos .x , pos .y , pos .z
386
+ for xi = - 1 , 1 do
387
+ for zi = - 1 , 1 do
388
+ if pr :next (1 , 3 ) >= 2 then
389
+ local vi1 = a :index (x + xi , y , z + zi )
390
+ local vi2 = a :index (x + xi , y - 1 , z + zi )
391
+ if a :contains (x + xi , y - 1 , z + zi ) and data [vi2 ] == c_air then
392
+ data [vi2 ] = c_jungletree
393
+ elseif a :contains (x + xi , y , z + zi ) and data [vi1 ] == c_air then
394
+ data [vi1 ] = c_jungletree
395
+ end
396
+ end
397
+ end
398
+ end
399
+
400
+ local th = pr :next (8 , 12 )
401
+ for yy = y , y + th - 1 do
402
+ local vi = a :index (x , yy , z )
403
+ if a :contains (x , yy , z ) and (data [vi ] == c_air or yy == y ) then
404
+ data [vi ] = c_jungletree
405
+ end
406
+ end
407
+ y = y + th - 1 -- (x, y, z) is now last piece of trunk
408
+ local leaves_a = VoxelArea :new {MinEdge = {x =- 3 , y =- 2 , z =- 3 }, MaxEdge = {x = 3 , y = 2 , z = 3 }}
409
+ local leaves_buffer = {}
410
+
411
+ -- Force leaves near the trunk
412
+ local d = 1
413
+ for xi = - d , d do
414
+ for yi = - d , d do
415
+ for zi = - d , d do
416
+ leaves_buffer [leaves_a :index (xi , yi , zi )] = true
417
+ end
418
+ end
419
+ end
420
+
421
+ -- Add leaves randomly
422
+ for iii = 1 , 30 do
423
+ local d = 1
424
+ local xx = pr :next (leaves_a .MinEdge .x , leaves_a .MaxEdge .x - d )
425
+ local yy = pr :next (leaves_a .MinEdge .y , leaves_a .MaxEdge .y - d )
426
+ local zz = pr :next (leaves_a .MinEdge .z , leaves_a .MaxEdge .z - d )
427
+
428
+ for xi = 0 , d do
429
+ for yi = 0 , d do
430
+ for zi = 0 , d do
431
+ leaves_buffer [leaves_a :index (xx + xi , yy + yi , zz + zi )] = true
432
+ end
433
+ end
434
+ end
435
+ end
436
+
437
+ -- Add the leaves
438
+ for xi = leaves_a .MinEdge .x , leaves_a .MaxEdge .x do
439
+ for yi = leaves_a .MinEdge .y , leaves_a .MaxEdge .y do
440
+ for zi = leaves_a .MinEdge .z , leaves_a .MaxEdge .z do
441
+ if a :contains (x + xi , y + yi , z + zi ) then
442
+ local vi = a :index (x + xi , y + yi , z + zi )
443
+ if data [vi ] == c_air or data [vi ] == c_ignore then
444
+ if leaves_buffer [leaves_a :index (xi , yi , zi )] then
445
+ data [vi ] = c_jungleleaves
446
+ end
447
+ end
448
+ end
449
+ end
450
+ end
451
+ end
452
+ end
453
+
454
+ minetest .register_abm ({
455
+ nodenames = {" default:junglesapling" },
456
+ interval = 1 ,
457
+ chance = 1 ,
458
+ action = function (pos , node )
459
+ local is_soil = minetest .registered_nodes [minetest .get_node ({x = pos .x , y = pos .y - 1 , z = pos .z }).name ].groups .soil
460
+ if is_soil == nil or is_soil == 0 then return end
461
+ print (" A jungle sapling grows into a tree at " .. minetest .pos_to_string (pos ))
462
+ local vm = minetest .get_voxel_manip ()
463
+ local minp , maxp = vm :read_from_map ({x = pos .x - 16 , y = pos .y - 1 , z = pos .z - 16 }, {x = pos .x + 16 , y = pos .y + 16 , z = pos .z + 16 })
464
+ local a = VoxelArea :new {MinEdge = minp , MaxEdge = maxp }
465
+ local data = vm :get_data ()
466
+ default .grow_jungletree (data , a , pos , math.random (1 ,100000 ))
467
+ vm :set_data (data )
468
+ vm :write_to_map (data )
469
+ vm :update_map ()
470
+ end
471
+ })
257
472
258
473
minetest .register_node (" default:junglegrass" , {
259
474
description = " Jungle Grass" ,
0 commit comments