Stretch node above when terrain is lowered

master
SmallJoker 2016-10-30 12:21:34 +01:00
parent 7c7b01a694
commit 9556808b82
1 changed files with 28 additions and 9 deletions

View File

@ -1,6 +1,6 @@
-- peoplecantblur - Generate flat areas
local HEIGHT_CHECK = 20
local HEIGHT_CHECK = 30
local c_air = minetest.get_content_id("air")
@ -36,7 +36,7 @@ local function get_ground(data, area, pos, max_height, cache_c, get_contents)
local rel_surface -- Relative height of surface
-- Find the ground height (check downwards)
for y = 0, -max_height, -1 do
for y = 0, -max_height + 4, -1 do
local c_id = data[area:index(pos.x, pos.y + y, pos.z)]
local is_surface_content = check_surface_content(c_id, cache_c)
id_cache[y] = { c_id, is_surface_content }
@ -51,13 +51,15 @@ local function get_ground(data, area, pos, max_height, cache_c, get_contents)
if not rel_surface then
-- Check upper area
for y = 1, max_height do
for y = max_height - 1, 0, -1 do
local c_id = data[area:index(pos.x, pos.y + y, pos.z)]
local is_surface_content = check_surface_content(c_id, cache_c)
id_cache[y] = { c_id, is_surface_content }
if not is_surface_content and c_id ~= c_air then
rel_surface = y - 1
if is_surface_content then
if y ~= max_height - 1 then
rel_surface = y
end
break
end
end
@ -92,9 +94,21 @@ local function get_ground(data, area, pos, max_height, cache_c, get_contents)
end
end
-- Stretch the node above if it's air, a liquid, tree etc.
local c_above
local c_id = id_cache[rel_surface + 1][1]
local name = minetest.get_name_from_content_id(c_id)
local def = minetest.registered_nodes[name]
if def and (def.drawtype == "normal"
or def.drawtype == "airlike"
or def.drawtype == "liquid") then
c_above = c_id
end
return {
rel_surface = rel_surface,
c_contents = c_contents
c_contents = c_contents,
c_above = (c_above or c_air)
}
end
@ -149,6 +163,7 @@ local function flatten(ppos, radius)
local p_info = heightmap[z * 0x10000 + x]
local nodes = p_info.c_contents
local old_h = p_info.rel_surface
local above = p_info.c_above
if nodes and #nodes > 0 and old_h then
--[[
@ -179,7 +194,11 @@ local function flatten(ppos, radius)
for y = max_y, min_y, -1 do
local vi = area:index(x, ppos.y + y, z)
if y > h then
data[vi] = c_air
if h > old_h then
data[vi] = c_air
else
data[vi] = above
end
else
data[vi] = nodes[math.min(#nodes, i)]
i = i + 1
@ -207,8 +226,8 @@ minetest.register_chatcommand("flat", {
func = function(name, param)
local player = minetest.get_player_by_name(name)
local player_pos = vector.round(player:getpos())
-- Flatten an area of (2 * 6 + 1) ^ 2 m
flatten(player_pos, 6)
-- Flatten an area of (2 * 7 + 1) ^ 2 square meters
flatten(player_pos, 7)
return true, "OK."
end
})