local player = require("player") local world = require("world") local threads = require("threads") local light_points = {} local radius = 8 -- Увеличил радиус для удобства local last_px, last_py, last_pz = 0, 0, 0 -- Функция получения реальной высоты верхней грани блока local getBlockHeight = function(x, y, z, block) if not block or block.is_air then return 0 end local boxes = world.getCollisionBoxes(x, y, z, block) local max_h = 0 if boxes and #boxes > 0 then for _, box in ipairs(boxes) do -- Получаем максимальную точку Y коллизии блока -- Обычно box.maxY - y, но если API возвращает размер, используем getYSize local h = box.getYSize() if h > max_h then max_h = h end end return max_h end -- Если коллизий нет, но это не воздух (например, ковер/цветок), -- можно возвращать 0 или маленькое значение return 0 end registerClientTick(function() local px = math.floor(player.entity.x) local py = math.floor(player.entity.y) local pz = math.floor(player.entity.z) if px == last_px and py == last_py and pz == last_pz then return end last_px, last_py, last_pz = px, py, pz local new_points = {} threads.startThread(function() for x = px - radius, px + radius do for y = py - radius, py + radius do for z = pz - radius, pz + radius do local current_block = world.getBlock(x, y, z) local down_block = world.getBlock(x, y - 1, z) -- Проверяем: стоим в воздухе/воде, а под нами что-то твердое if current_block and current_block.is_air and down_block and not down_block.is_air then local light = world.getLight(x, y, z) -- Цвета (строгое разделение) local r, g, b if light == 0 then r, g, b = 255, 0, 0 -- Красный (опасно) elseif light < 8 then r, g, b = 255, 255, 0 -- Желтый (средне) else r, g, b = 0, 255, 0 -- Зеленый (светло) end -- ВЫЧИСЛЯЕМ ВЫСОТУ: Координата пола (y-1) + высота блока под ногами local surface_y = (y - 1) + getBlockHeight(x, y - 1, z, down_block) table.insert(new_points, { x = x, y = surface_y, z = z, light = light, r = r, g = g, b = b }) end end end end light_points = new_points end) end) registerWorldRenderer(function(ctx) for _, pt in ipairs(light_points) do ctx.renderText( pt.x + 0.5, pt.y + 0.2, -- Минимальный отступ вверх, чтобы текст не "тонул" в текстуре pt.z + 0.5, tostring(pt.light), 0.75, -- Размер текста pt.r, pt.g, pt.b, false ) end end)