Skip to content

Commit 9fdbc1f

Browse files
committedNov 6, 2013
Fix tree growing and jungle sapling growth rate
1 parent 1d4eb43 commit 9fdbc1f

File tree

4 files changed

+194
-187
lines changed

4 files changed

+194
-187
lines changed
 

Diff for: ‎mods/default/functions.lua

+43
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,49 @@ function on_punchnode(p, node)
126126
end
127127
minetest.register_on_punchnode(on_punchnode)
128128

129+
130+
--
131+
-- Grow trees
132+
--
133+
134+
minetest.register_abm({
135+
nodenames = {"default:sapling"},
136+
interval = 10,
137+
chance = 50,
138+
action = function(pos, node)
139+
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
140+
if is_soil == nil or is_soil == 0 then return end
141+
print("A sapling grows into a tree at "..minetest.pos_to_string(pos))
142+
local vm = minetest.get_voxel_manip()
143+
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})
144+
local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
145+
local data = vm:get_data()
146+
default.grow_tree(data, a, pos, math.random(1, 4) == 1, math.random(1,100000))
147+
vm:set_data(data)
148+
vm:write_to_map(data)
149+
vm:update_map()
150+
end
151+
})
152+
153+
minetest.register_abm({
154+
nodenames = {"default:junglesapling"},
155+
interval = 10,
156+
chance = 50,
157+
action = function(pos, node)
158+
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
159+
if is_soil == nil or is_soil == 0 then return end
160+
print("A jungle sapling grows into a tree at "..minetest.pos_to_string(pos))
161+
local vm = minetest.get_voxel_manip()
162+
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})
163+
local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
164+
local data = vm:get_data()
165+
default.grow_jungletree(data, a, pos, math.random(1,100000))
166+
vm:set_data(data)
167+
vm:write_to_map(data)
168+
vm:update_map()
169+
end
170+
})
171+
129172
--
130173
-- Lavacooling
131174
--

Diff for: ‎mods/default/init.lua

+1
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ dofile(minetest.get_modpath("default").."/craftitems.lua")
1919
dofile(minetest.get_modpath("default").."/crafting.lua")
2020
dofile(minetest.get_modpath("default").."/mapgen.lua")
2121
dofile(minetest.get_modpath("default").."/player.lua")
22+
dofile(minetest.get_modpath("default").."/trees.lua")

Diff for: ‎mods/default/nodes.lua

-187
Original file line numberDiff line numberDiff line change
@@ -287,193 +287,6 @@ minetest.register_node("default:junglesapling", {
287287
sounds = default.node_sound_leaves_defaults(),
288288
})
289289

290-
local c_air = minetest.get_content_id("air")
291-
local c_ignore = minetest.get_content_id("ignore")
292-
local c_tree = minetest.get_content_id("default:tree")
293-
local c_leaves = minetest.get_content_id("default:leaves")
294-
local c_apple = minetest.get_content_id("default:apple")
295-
function default.grow_tree(data, a, pos, is_apple_tree, seed)
296-
--[[
297-
NOTE: Tree-placing code is currently duplicated in the engine
298-
and in games that have saplings; both are deprecated but not
299-
replaced yet
300-
]]--
301-
local pr = PseudoRandom(seed)
302-
local th = pr:next(4, 5)
303-
local x, y, z = pos.x, pos.y, pos.z
304-
for yy = y, y+th-1 do
305-
local vi = a:index(x, yy, z)
306-
if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then
307-
data[vi] = c_tree
308-
end
309-
end
310-
y = y+th-1 -- (x, y, z) is now last piece of trunk
311-
local leaves_a = VoxelArea:new{MinEdge={x=-2, y=-1, z=-2}, MaxEdge={x=2, y=2, z=2}}
312-
local leaves_buffer = {}
313-
314-
-- Force leaves near the trunk
315-
local d = 1
316-
for xi = -d, d do
317-
for yi = -d, d do
318-
for zi = -d, d do
319-
leaves_buffer[leaves_a:index(xi, yi, zi)] = true
320-
end
321-
end
322-
end
323-
324-
-- Add leaves randomly
325-
for iii = 1, 8 do
326-
local d = 1
327-
local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d)
328-
local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d)
329-
local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d)
330-
331-
for xi = 0, d do
332-
for yi = 0, d do
333-
for zi = 0, d do
334-
leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true
335-
end
336-
end
337-
end
338-
end
339-
340-
-- Add the leaves
341-
for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do
342-
for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do
343-
for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do
344-
if a:contains(x+xi, y+yi, z+zi) then
345-
local vi = a:index(x+xi, y+yi, z+zi)
346-
if data[vi] == c_air or data[vi] == c_ignore then
347-
if leaves_buffer[leaves_a:index(xi, yi, zi)] then
348-
if is_apple_tree and pr:next(1, 100) <= 10 then
349-
data[vi] = c_apple
350-
else
351-
data[vi] = c_leaves
352-
end
353-
end
354-
end
355-
end
356-
end
357-
end
358-
end
359-
end
360-
361-
minetest.register_abm({
362-
nodenames = {"default:sapling"},
363-
interval = 10,
364-
chance = 50,
365-
action = function(pos, node)
366-
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
367-
if is_soil == nil or is_soil == 0 then return end
368-
print("A sapling grows into a tree at "..minetest.pos_to_string(pos))
369-
local vm = minetest.get_voxel_manip()
370-
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})
371-
local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
372-
local data = vm:get_data()
373-
default.grow_tree(data, a, pos, math.random(1, 4) == 1, math.random(1,100000))
374-
vm:set_data(data)
375-
vm:write_to_map(data)
376-
vm:update_map()
377-
end
378-
})
379-
380-
local c_jungletree = minetest.get_content_id("default:jungletree")
381-
local c_jungleleaves = minetest.get_content_id("default:jungleleaves")
382-
function default.grow_jungletree(data, a, pos, seed)
383-
--[[
384-
NOTE: Tree-placing code is currently duplicated in the engine
385-
and in games that have saplings; both are deprecated but not
386-
replaced yet
387-
]]--
388-
local pr = PseudoRandom(seed)
389-
local x, y, z = pos.x, pos.y, pos.z
390-
for xi = -1, 1 do
391-
for zi = -1, 1 do
392-
if pr:next(1, 3) >= 2 then
393-
local vi1 = a:index(x+xi, y, z+zi)
394-
local vi2 = a:index(x+xi, y-1, z+zi)
395-
if a:contains(x+xi, y-1, z+zi) and data[vi2] == c_air then
396-
data[vi2] = c_jungletree
397-
elseif a:contains(x+xi, y, z+zi) and data[vi1] == c_air then
398-
data[vi1] = c_jungletree
399-
end
400-
end
401-
end
402-
end
403-
404-
local th = pr:next(8, 12)
405-
for yy = y, y+th-1 do
406-
local vi = a:index(x, yy, z)
407-
if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then
408-
data[vi] = c_jungletree
409-
end
410-
end
411-
y = y+th-1 -- (x, y, z) is now last piece of trunk
412-
local leaves_a = VoxelArea:new{MinEdge={x=-3, y=-2, z=-3}, MaxEdge={x=3, y=2, z=3}}
413-
local leaves_buffer = {}
414-
415-
-- Force leaves near the trunk
416-
local d = 1
417-
for xi = -d, d do
418-
for yi = -d, d do
419-
for zi = -d, d do
420-
leaves_buffer[leaves_a:index(xi, yi, zi)] = true
421-
end
422-
end
423-
end
424-
425-
-- Add leaves randomly
426-
for iii = 1, 30 do
427-
local d = 1
428-
local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d)
429-
local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d)
430-
local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d)
431-
432-
for xi = 0, d do
433-
for yi = 0, d do
434-
for zi = 0, d do
435-
leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true
436-
end
437-
end
438-
end
439-
end
440-
441-
-- Add the leaves
442-
for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do
443-
for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do
444-
for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do
445-
if a:contains(x+xi, y+yi, z+zi) then
446-
local vi = a:index(x+xi, y+yi, z+zi)
447-
if data[vi] == c_air or data[vi] == c_ignore then
448-
if leaves_buffer[leaves_a:index(xi, yi, zi)] then
449-
data[vi] = c_jungleleaves
450-
end
451-
end
452-
end
453-
end
454-
end
455-
end
456-
end
457-
458-
minetest.register_abm({
459-
nodenames = {"default:junglesapling"},
460-
interval = 1,
461-
chance = 1,
462-
action = function(pos, node)
463-
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
464-
if is_soil == nil or is_soil == 0 then return end
465-
print("A jungle sapling grows into a tree at "..minetest.pos_to_string(pos))
466-
local vm = minetest.get_voxel_manip()
467-
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})
468-
local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
469-
local data = vm:get_data()
470-
default.grow_jungletree(data, a, pos, math.random(1,100000))
471-
vm:set_data(data)
472-
vm:write_to_map(data)
473-
vm:update_map()
474-
end
475-
})
476-
477290
minetest.register_node("default:junglegrass", {
478291
description = "Jungle Grass",
479292
drawtype = "plantlike",

Diff for: ‎mods/default/trees.lua

+150
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
local c_air = minetest.get_content_id("air")
2+
local c_ignore = minetest.get_content_id("ignore")
3+
local c_tree = minetest.get_content_id("default:tree")
4+
local c_leaves = minetest.get_content_id("default:leaves")
5+
local c_apple = minetest.get_content_id("default:apple")
6+
7+
function default.grow_tree(data, a, pos, is_apple_tree, seed)
8+
--[[
9+
NOTE: Tree-placing code is currently duplicated in the engine
10+
and in games that have saplings; both are deprecated but not
11+
replaced yet
12+
]]--
13+
local pr = PseudoRandom(seed)
14+
local th = pr:next(4, 5)
15+
local x, y, z = pos.x, pos.y, pos.z
16+
for yy = y, y+th-1 do
17+
local vi = a:index(x, yy, z)
18+
if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then
19+
data[vi] = c_tree
20+
end
21+
end
22+
y = y+th-1 -- (x, y, z) is now last piece of trunk
23+
local leaves_a = VoxelArea:new{MinEdge={x=-2, y=-1, z=-2}, MaxEdge={x=2, y=2, z=2}}
24+
local leaves_buffer = {}
25+
26+
-- Force leaves near the trunk
27+
local d = 1
28+
for xi = -d, d do
29+
for yi = -d, d do
30+
for zi = -d, d do
31+
leaves_buffer[leaves_a:index(xi, yi, zi)] = true
32+
end
33+
end
34+
end
35+
36+
-- Add leaves randomly
37+
for iii = 1, 8 do
38+
local d = 1
39+
local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d)
40+
local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d)
41+
local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d)
42+
43+
for xi = 0, d do
44+
for yi = 0, d do
45+
for zi = 0, d do
46+
leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true
47+
end
48+
end
49+
end
50+
end
51+
52+
-- Add the leaves
53+
for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do
54+
for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do
55+
for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do
56+
if a:contains(x+xi, y+yi, z+zi) then
57+
local vi = a:index(x+xi, y+yi, z+zi)
58+
if data[vi] == c_air or data[vi] == c_ignore then
59+
if leaves_buffer[leaves_a:index(xi, yi, zi)] then
60+
if is_apple_tree and pr:next(1, 100) <= 10 then
61+
data[vi] = c_apple
62+
else
63+
data[vi] = c_leaves
64+
end
65+
end
66+
end
67+
end
68+
end
69+
end
70+
end
71+
end
72+
73+
local c_jungletree = minetest.get_content_id("default:jungletree")
74+
local c_jungleleaves = minetest.get_content_id("default:jungleleaves")
75+
76+
function default.grow_jungletree(data, a, pos, seed)
77+
--[[
78+
NOTE: Tree-placing code is currently duplicated in the engine
79+
and in games that have saplings; both are deprecated but not
80+
replaced yet
81+
]]--
82+
local pr = PseudoRandom(seed)
83+
local x, y, z = pos.x, pos.y, pos.z
84+
for xi = -1, 1 do
85+
for zi = -1, 1 do
86+
if pr:next(1, 3) >= 2 then
87+
local vi1 = a:index(x+xi, y, z+zi)
88+
local vi2 = a:index(x+xi, y-1, z+zi)
89+
if a:contains(x+xi, y-1, z+zi) and data[vi2] == c_air then
90+
data[vi2] = c_jungletree
91+
elseif a:contains(x+xi, y, z+zi) and data[vi1] == c_air then
92+
data[vi1] = c_jungletree
93+
end
94+
end
95+
end
96+
end
97+
98+
local th = pr:next(8, 12)
99+
for yy = y, y+th-1 do
100+
local vi = a:index(x, yy, z)
101+
if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then
102+
data[vi] = c_jungletree
103+
end
104+
end
105+
y = y+th-1 -- (x, y, z) is now last piece of trunk
106+
local leaves_a = VoxelArea:new{MinEdge={x=-3, y=-2, z=-3}, MaxEdge={x=3, y=2, z=3}}
107+
local leaves_buffer = {}
108+
109+
-- Force leaves near the trunk
110+
local d = 1
111+
for xi = -d, d do
112+
for yi = -d, d do
113+
for zi = -d, d do
114+
leaves_buffer[leaves_a:index(xi, yi, zi)] = true
115+
end
116+
end
117+
end
118+
119+
-- Add leaves randomly
120+
for iii = 1, 30 do
121+
local d = 1
122+
local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d)
123+
local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d)
124+
local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d)
125+
126+
for xi = 0, d do
127+
for yi = 0, d do
128+
for zi = 0, d do
129+
leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true
130+
end
131+
end
132+
end
133+
end
134+
135+
-- Add the leaves
136+
for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do
137+
for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do
138+
for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do
139+
if a:contains(x+xi, y+yi, z+zi) then
140+
local vi = a:index(x+xi, y+yi, z+zi)
141+
if data[vi] == c_air or data[vi] == c_ignore then
142+
if leaves_buffer[leaves_a:index(xi, yi, zi)] then
143+
data[vi] = c_jungleleaves
144+
end
145+
end
146+
end
147+
end
148+
end
149+
end
150+
end

0 commit comments

Comments
 (0)
Please sign in to comment.