local world = require("world") local player = require("player") local block_scanner = require("block_iterator") local creator = require("creator") local colors = { ["minecraft:purple_terracotta"] = { r = 43, g = 14, b = 0, a = 190 } } local iterator = nil local batch, hasMore = nil, false local renders = {} local function getPosKey(x, y, z) return x .. "," .. y .. "," .. z end registerClientTick(function() -- Создаём итератор один раз при первой инициализации if not iterator then local px, py, pz = player.entity.x, player.entity.y, player.entity.z iterator = block_scanner.new_iterator(math.floor(px), math.floor(py), math.floor(pz), 48) end -- Получаем пачку блоков batch, hasMore = iterator.next_batch(7000) -- ограничиваем размер пачки для стабильности -- Обрабатываем найденные блоки for i = 1, #batch do local entry = batch[i] local x, y, z = entry[1], entry[2], entry[3] local blockState = entry[4] -- Получаем имя блока (зависит от реализации LuaBlockState) local blockName = blockState.identifier -- или blockState:getUnlocalizedName(), уточните ваш API local color = colors[blockName] if color and not renders[getPosKey(x, y, z)] then renders[getPosKey(x, y, z)] = { x = x, y = y, z = z, r = color.r, g = color.g, b = color.b, a = color.a } end end -- Опционально: перезапуск итератора, если прошли все блоки if not hasMore then local px, py, pz = player.entity.x, player.entity.y, player.entity.z iterator = block_scanner.new_iterator(math.floor(px), math.floor(py), math.floor(pz), 48) end -- Здесь должен быть код отрисовки из таблицы renders -- renderHighlights(renders) end) registerWorldRenderer(function(ctx) for index, render in pairs(renders) do local box = creator.createBox(render.x, render.y, render.z, render.x + 1, render.y + 1, render.z + 1) ctx.renderFilled(box, render.r, render.g, render.b, render.a, true) ctx.renderOutline(box, render.r, render.g, render.b, render.a, 2, true) end end) registerBlockUpdate(function(info) if renders[getPosKey(info.position.x, info.position.y, info.position.z)] then renders[getPosKey(info.position.x, info.position.y, info.position.z)] = nil elseif info.new then local color = colors[info.new.name] if color then renders[getPosKey(info.position.x, info.position.y, info.position.z)] = { x = info.position.x, y = info.position.y, z = info.position.z, r = color.r, g = color.g, b = color.b, a = color.a } end end end)