]> git.lizzy.rs Git - elidragon_v2.git/blob - mods/elidragon_plotmg/init.lua
Proper indentation in the plotmg; remove void layer and fix dependency problem
[elidragon_v2.git] / mods / elidragon_plotmg / init.lua
1 local plot, schems = elidragon.plot, elidragon.schems
2
3 local plotmg = {}
4
5 minetest.register_on_generated(function(minp, maxp)
6         collectgarbage()
7
8         local config = assert(plot.config)
9         local mgconfig = assert(plotmg.config)
10
11         local min_y, max_y = mgconfig.min_y, mgconfig.max_y
12
13         if maxp.y < min_y or minp.y > max_y then
14                 return
15         end
16
17         local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
18         local data = vm:get_data()
19         local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
20
21         local function do_multiples(low, high, base, add, func)
22                 for p = math.ceil(low / base), math.floor(high / base) do
23                         func(p * base + add)
24                 end
25         end
26
27         local function do_borders(low, high, base, road, func)
28                 do_multiples(low - road, high - road, base,  road, func)
29                 do_multiples(low + road, high + road, base, -road, func)
30         end
31
32         min_y, max_y = math.max(minp.y, min_y), math.min(maxp.y, max_y)
33
34         local gap, road_width = config.gap, config.road_width
35         local road_width_half = road_width / 2
36
37         do_borders(minp.x, maxp.x, gap, road_width_half, function(x)
38                 do_multiples(minp.z - gap + road_width_half, maxp.z - road_width_half, gap, road_width_half, function(start_z)
39                         for idx in area:iter(x, min_y, math.max(minp.z, start_z), x, max_y, math.min(maxp.z, start_z + gap - road_width)) do
40                                 data[idx] = mgconfig.c_border
41                         end
42                 end)
43         end)
44
45         do_borders(minp.z, maxp.z, gap, road_width_half, function(z)
46                 do_multiples(minp.x - gap + road_width_half, maxp.x - road_width_half, gap, road_width_half, function(start_x)
47                         for idx in area:iter(math.max(minp.x, start_x), min_y, z, math.min(maxp.x, start_x + gap - road_width), max_y, z) do
48                                 data[idx] = mgconfig.c_border
49                         end
50                 end)
51         end)
52
53         vm:set_data(data)
54         vm:calc_lighting()
55         vm:update_liquids()
56         vm:write_to_map()
57
58         local road_schem = mgconfig.road_schem
59
60         if road_schem and min_y == mgconfig.min_y then
61                 do_multiples(minp.x, maxp.x, gap, 0, function(x)
62                         do_multiples(minp.z, maxp.z, gap, 0, function(z)
63                                 schems.add(vector.new(x + road_width_half, min_y + mgconfig.road_schem_offset, z - road_width_half + 1), road_schem)
64                                 schems.add(vector.new(x - road_width_half + 1, min_y + mgconfig.road_schem_offset, z + road_width_half), road_schem .. "_flipped")
65                         end)
66                 end)
67         end
68 end)
69
70 elidragon.plotmg = plotmg