local function build_hut(data, area, node, pos, turf) local door = {x = ({2,7})[math.random(2)], z = ({2,7})[math.random(2)]} if math.random(2) == 1 then door.x = nil else door.z = nil end for z = 1, 8 do for x = 1, 8 do local ivm = area:index(pos.x + x - 1, pos.y, pos.z + z - 1) if x > 1 and x < 8 and z > 1 and z < 8 then data[ivm] = node['default:dirt'] ivm = ivm + area.ystride for y = 2, 4 do if x == 2 or x == 7 or z == 2 or z == 7 then if y <= 3 and ((z == 4 and x == door.x) or (x == 4 and z == door.z)) then data[ivm] = node['air'] elseif y == 3 and ((z % 3 == 0 and (x == 2 or x == 7)) or (x % 3 == 0 and (z == 2 or z == 7))) then data[ivm] = node['air'] else data[ivm] = node['default:wood'] end else data[ivm] = node['air'] end ivm = ivm + area.ystride end data[ivm] = node['fun_caves:dry_fiber'] else data[ivm] = node[turf] ivm = ivm + area.ystride for y = 2, 5 do data[ivm] = node['air'] ivm = ivm + area.ystride end end end end end fun_caves.village = function(minp, maxp, data, p2data, area, node, biome, heightmap) if not biome or math.random(10) ~= 1 then return end local turf if biome:find('grass') or biome:find('forest') then turf = 'default:dirt_with_grass' elseif biome:find('taiga') or biome:find('tundra') then turf = 'default:dirt_with_snow' elseif biome:find('savanna') then turf = 'default:dirt_with_dry_grass' else return end local height_avg = 0 local height_max = -31000 local height_min = 31000 for i = 1, #heightmap do height_avg = height_avg + heightmap[i] if heightmap[i] > height_max then height_max = heightmap[i] end if heightmap[i] < height_min then height_min = heightmap[i] end end height_avg = height_avg / #heightmap if height_max - height_min > 20 or height_avg < 1 or height_max > maxp.y - 10 or height_min < minp.y + 10 or height_avg < minp.y or height_avg > maxp.y then return end local write = true local plots = {} for z = 1, 10 do plots[z] = {} for x = 1, 10 do if x == 1 or x == 10 or z == 1 or z == 10 then -- nop --elseif (x == 5 or x == 6) and (z == 5 or z == 6) then -- plots[z][x] = 0 elseif math.random(5) == 1 and x > 2 and x < 9 and z > 2 and z < 9 then plots[z][x] = 2 elseif math.random(2) == 1 then plots[z][x] = 1 else plots[z][x] = 0 end end end local index = 0 for z = minp.z, maxp.z do local dz = z - minp.z local pz = math.ceil(dz / 8) for x = minp.x, maxp.x do local dx = x - minp.x local px = math.ceil(dx / 8) index = index + 1 local radius = math.max(math.abs(40 - dx), math.abs(40 - dz)) / 40 heightmap[index] = math.floor(heightmap[index] * radius ^ 2 + height_avg * (1 - radius ^ 2) + 0.5) if radius <= 0.8 + math.random(10) / 100 then local irrigate if plots[pz][px] == 1 then if (dz % 8 == 3 or dz % 8 == 6) and (dx % 8 == 3 or dx % 8 == 6) then irrigate = true end end local ivm = area:index(x, minp.y, z) for y = minp.y, maxp.y do local dy = y - minp.y if y > heightmap[index] and y < 1 then data[ivm] = node['default:water_source'] elseif y == heightmap[index] + 1 and plots[pz][px] == 1 and not irrigate then if turf == 'default:dirt_with_snow' then if math.random(10) == 1 then data[ivm] = node['default:dry_shrub'] end else data[ivm] = node['farming:wheat_'..math.random(7)] end elseif y > heightmap[index] then data[ivm] = node['air'] elseif y == heightmap[index] and plots[pz][px] == 1 and irrigate then if turf == 'default:dirt_with_snow' then data[ivm] = node['default:ice'] else data[ivm] = node['default:water_source'] end elseif y == heightmap[index] and plots[pz][px] == 1 then if turf == 'default:dirt_with_snow' then data[ivm] = node[turf] else data[ivm] = node['farming:soil_wet'] end elseif y == heightmap[index] then data[ivm] = node[turf] elseif y > heightmap[index] - 4 then data[ivm] = node['default:dirt'] elseif y > heightmap[index] - 10 then data[ivm] = node['default:stone'] end ivm = ivm + area.ystride end end end end for z = 1, 10 do for x = 1, 10 do if plots[z][x] == 2 then local pos = { x = (x - 1) * 8 + 1, z = (z - 1) * 8 + 1, } local avg = 0 for hz = pos.z, pos.z + 7 do for hx = pos.x, pos.x + 7 do avg = avg + heightmap[(hz - 1) * 80 + hx] end end pos.y = math.floor(avg / 64 + 0.5) pos.x = pos.x + minp.x pos.z = pos.z + minp.z build_hut(data, area, node, pos, turf) end end end -- -702, -466 return write end