Skip to content

Commit 69614dc

Browse files
paramatPilzAdam
authored andcommittedDec 12, 2014
Pinetree (by sfan5, from mg mapgen) lua generation and sapling ABM. Add checks for ignore to other trees
1 parent 75dfcdb commit 69614dc

File tree

2 files changed

+182
-21
lines changed

2 files changed

+182
-21
lines changed
 

Diff for: ‎mods/default/nodes.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ minetest.register_node("default:dirt_with_snow", {
114114
description = "Dirt with Snow",
115115
tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"},
116116
is_ground_content = true,
117-
groups = {crumbly=3},
117+
groups = {crumbly=3,soil=1},
118118
drop = 'default:dirt',
119119
sounds = default.node_sound_dirt_defaults({
120120
footstep = {name="default_snow_footstep", gain=0.25},

Diff for: ‎mods/default/trees.lua

+181-20
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ local function can_grow(pos)
1717
return true
1818
end
1919

20+
-- Sapling ABMs
21+
2022
minetest.register_abm({
2123
nodenames = {"default:sapling"},
2224
interval = 10,
@@ -26,14 +28,15 @@ minetest.register_abm({
2628
return
2729
end
2830

29-
minetest.log("action", "A sapling grows into a tree at "..minetest.pos_to_string(pos))
31+
minetest.log("action", "A sapling grows into a tree at "..
32+
minetest.pos_to_string(pos))
3033
default.grow_tree(pos, random(1, 4) == 1)
3134
end
3235
})
3336

3437
minetest.register_abm({
3538
nodenames = {"default:junglesapling"},
36-
interval = 10,
39+
interval = 11,
3740
chance = 50,
3841
action = function(pos, node)
3942
if not can_grow(pos) then
@@ -46,18 +49,36 @@ minetest.register_abm({
4649
end
4750
})
4851

52+
minetest.register_abm({
53+
nodenames = {"default:pine_sapling"},
54+
interval = 12,
55+
chance = 50,
56+
action = function(pos, node)
57+
if not can_grow(pos) then
58+
return
59+
end
60+
61+
minetest.log("action", "A pine sapling grows into a tree at "..
62+
minetest.pos_to_string(pos))
63+
default.grow_pinetree(pos)
64+
end
65+
})
4966

50-
local c_air = minetest.get_content_id("air")
51-
local c_apple = minetest.get_content_id("default:apple")
67+
-- Appletree, jungletree function
5268

5369
local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid,
5470
height, size, iters, is_apple_tree)
5571
local x, y, z = pos.x, pos.y, pos.z
72+
local c_air = minetest.get_content_id("air")
73+
local c_ignore = minetest.get_content_id("ignore")
74+
local c_apple = minetest.get_content_id("default:apple")
5675

5776
-- Trunk
5877
for y_dist = 0, height - 1 do
5978
local vi = a:index(x, y + y_dist, z)
60-
if y_dist == 0 or data[vi] == c_air or data[vi] == leaves_cid then
79+
local node_id = data[vi]
80+
if y_dist == 0 or node_id == c_air or node_id == c_ignore
81+
or node_id == leaves_cid then
6182
data[vi] = tree_cid
6283
end
6384
end
@@ -67,7 +88,7 @@ local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid,
6788
for y_dist = -size, 1 do
6889
local vi = a:index(x - 1, y + height + y_dist, z + z_dist)
6990
for x_dist = -1, 1 do
70-
if data[vi] == c_air then
91+
if data[vi] == c_air or data[vi] == c_ignore then
7192
if is_apple_tree and random(1, 8) == 1 then
7293
data[vi] = c_apple
7394
else
@@ -89,7 +110,7 @@ local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid,
89110
for yi = 0, 1 do
90111
for zi = 0, 1 do
91112
local vi = a:index(clust_x + xi, clust_y + yi, clust_z + zi)
92-
if data[vi] == c_air then
113+
if data[vi] == c_air or data[vi] == c_ignore then
93114
if is_apple_tree and random(1, 8) == 1 then
94115
data[vi] = c_apple
95116
else
@@ -102,9 +123,7 @@ local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid,
102123
end
103124
end
104125

105-
106-
local c_tree = minetest.get_content_id("default:tree")
107-
local c_leaves = minetest.get_content_id("default:leaves")
126+
-- Appletree
108127

109128
function default.grow_tree(pos, is_apple_tree, bad)
110129
--[[
@@ -118,11 +137,13 @@ function default.grow_tree(pos, is_apple_tree, bad)
118137

119138
local x, y, z = pos.x, pos.y, pos.z
120139
local height = random(4, 5)
140+
local c_tree = minetest.get_content_id("default:tree")
141+
local c_leaves = minetest.get_content_id("default:leaves")
121142

122143
local vm = minetest.get_voxel_manip()
123144
local minp, maxp = vm:read_from_map(
124-
{x = pos.x - 2, y = pos.y, z = pos.z - 2},
125-
{x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2}
145+
{x = pos.x - 2, y = pos.y, z = pos.z - 2},
146+
{x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2}
126147
)
127148
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
128149
local data = vm:get_data()
@@ -134,12 +155,11 @@ function default.grow_tree(pos, is_apple_tree, bad)
134155
vm:update_map()
135156
end
136157

137-
local c_jungletree = minetest.get_content_id("default:jungletree")
138-
local c_jungleleaves = minetest.get_content_id("default:jungleleaves")
158+
-- Jungletree
139159

140160
function default.grow_jungletree(pos, bad)
141161
--[[
142-
NOTE: Tree-placing code is currently duplicated in the engine
162+
NOTE: Jungletree-placing code is currently duplicated in the engine
143163
and in games that have saplings; both are deprecated but not
144164
replaced yet
145165
--]]
@@ -149,11 +169,16 @@ function default.grow_jungletree(pos, bad)
149169

150170
local x, y, z = pos.x, pos.y, pos.z
151171
local height = random(8, 12)
172+
local c_air = minetest.get_content_id("air")
173+
local c_ignore = minetest.get_content_id("ignore")
174+
local c_jungletree = minetest.get_content_id("default:jungletree")
175+
local c_jungleleaves = minetest.get_content_id("default:jungleleaves")
152176

153177
local vm = minetest.get_voxel_manip()
154178
local minp, maxp = vm:read_from_map(
155-
{x = pos.x - 3, y = pos.y - 1, z = pos.z - 3},
156-
{x = pos.x + 3, y = pos.y + height + 1, z = pos.z + 3})
179+
{x = pos.x - 3, y = pos.y - 1, z = pos.z - 3},
180+
{x = pos.x + 3, y = pos.y + height + 1, z = pos.z + 3}
181+
)
157182
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
158183
local data = vm:get_data()
159184

@@ -162,12 +187,12 @@ function default.grow_jungletree(pos, bad)
162187
-- Roots
163188
for z_dist = -1, 1 do
164189
local vi_1 = a:index(x - 1, y - 1, z + z_dist)
165-
local vi_2 = a:index(x - 1, y, z + z_dist)
190+
local vi_2 = a:index(x - 1, y, z + z_dist)
166191
for x_dist = -1, 1 do
167192
if random(1, 3) >= 2 then
168-
if data[vi_1] == c_air then
193+
if data[vi_1] == c_air or data[vi_1] == c_ignore then
169194
data[vi_1] = c_jungletree
170-
elseif data[vi_2] == c_air then
195+
elseif data[vi_2] == c_air or data[vi_2] == c_ignore then
171196
data[vi_2] = c_jungletree
172197
end
173198
end
@@ -181,3 +206,139 @@ function default.grow_jungletree(pos, bad)
181206
vm:update_map()
182207
end
183208

209+
-- Pinetree from mg mapgen mod, design by sfan5, pointy top added by paramat
210+
211+
local function add_pine_needles(data, vi, c_air, c_ignore, c_snow, c_pine_needles)
212+
if data[vi] == c_air or data[vi] == c_ignore or data[vi] == c_snow then
213+
data[vi] = c_pine_needles
214+
end
215+
end
216+
217+
local function add_snow(data, vi, c_air, c_ignore, c_snow)
218+
if data[vi] == c_air or data[vi] == c_ignore then
219+
data[vi] = c_snow
220+
end
221+
end
222+
223+
function default.grow_pinetree(pos)
224+
local x, y, z = pos.x, pos.y, pos.z
225+
local maxy = y + random(9, 13) -- Trunk top
226+
227+
local c_air = minetest.get_content_id("air")
228+
local c_ignore = minetest.get_content_id("ignore")
229+
local c_pinetree = minetest.get_content_id("default:pinetree")
230+
local c_pine_needles = minetest.get_content_id("default:pine_needles")
231+
local c_snow = minetest.get_content_id("default:snow")
232+
local c_snowblock = minetest.get_content_id("default:snowblock")
233+
local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow")
234+
235+
local vm = minetest.get_voxel_manip()
236+
local minp, maxp = vm:read_from_map(
237+
{x = x - 3, y = y - 1, z = z - 3},
238+
{x = x + 3, y = maxy + 3, z = z + 3}
239+
)
240+
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
241+
local data = vm:get_data()
242+
243+
-- Scan for snow nodes near sapling
244+
local snow = false
245+
for yy = y - 1, y + 1 do
246+
for zz = z - 1, z + 1 do
247+
local vi = a:index(x - 1, yy, zz)
248+
for xx = x - 1, x + 1 do
249+
local nodid = data[vi]
250+
if nodid == c_snow
251+
or nodid == c_snowblock
252+
or nodid == c_dirtsnow then
253+
snow = true
254+
end
255+
vi = vi + 1
256+
end
257+
end
258+
end
259+
260+
-- Upper branches layer
261+
local dev = 3
262+
for yy = maxy - 1, maxy + 1 do
263+
for zz = z - dev, z + dev do
264+
local vi = a:index(x - dev, yy, zz)
265+
local via = a:index(x - dev, yy + 1, zz)
266+
for xx = x - dev, x + dev do
267+
if random() < 0.95 - dev * 0.05 then
268+
add_pine_needles(data, vi, c_air, c_ignore, c_snow,
269+
c_pine_needles)
270+
if snow then
271+
add_snow(data, via, c_air, c_ignore, c_snow)
272+
end
273+
end
274+
vi = vi + 1
275+
via = via + 1
276+
end
277+
end
278+
dev = dev - 1
279+
end
280+
281+
-- Centre top nodes
282+
add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore, c_snow,
283+
c_pine_needles)
284+
add_pine_needles(data, a:index(x, maxy + 2, z), c_air, c_ignore, c_snow,
285+
c_pine_needles) -- Paramat added a pointy top node
286+
if snow then
287+
add_snow(data, a:index(x, maxy + 3, z), c_air, c_ignore, c_snow)
288+
end
289+
290+
-- Lower branches layer
291+
local my = 0
292+
for i = 1, 20 do -- Random 2x2 squares of needles
293+
local xi = x + random(-3, 2)
294+
local yy = maxy + random(-6, -5)
295+
local zi = z + random(-3, 2)
296+
if yy > my then
297+
my = yy
298+
end
299+
for zz = zi, zi+1 do
300+
local vi = a:index(xi, yy, zz)
301+
local via = a:index(xi, yy + 1, zz)
302+
for xx = xi, xi + 1 do
303+
add_pine_needles(data, vi, c_air, c_ignore, c_snow,
304+
c_pine_needles)
305+
if snow then
306+
add_snow(data, via, c_air, c_ignore, c_snow)
307+
end
308+
vi = vi + 1
309+
via = via + 1
310+
end
311+
end
312+
end
313+
314+
local dev = 2
315+
for yy = my + 1, my + 2 do
316+
for zz = z - dev, z + dev do
317+
local vi = a:index(x - dev, yy, zz)
318+
local via = a:index(x - dev, yy + 1, zz)
319+
for xx = x - dev, x + dev do
320+
if random() < 0.95 - dev * 0.05 then
321+
add_pine_needles(data, vi, c_air, c_ignore, c_snow,
322+
c_pine_needles)
323+
if snow then
324+
add_snow(data, via, c_air, c_ignore, c_snow)
325+
end
326+
end
327+
vi = vi + 1
328+
via = via + 1
329+
end
330+
end
331+
dev = dev - 1
332+
end
333+
334+
-- Trunk
335+
for yy = y, maxy do
336+
local vi = a:index(x, yy, z)
337+
data[vi] = c_pinetree
338+
end
339+
340+
vm:set_data(data)
341+
vm:write_to_map()
342+
vm:update_map()
343+
end
344+

0 commit comments

Comments
 (0)
Please sign in to comment.