local world = require("world") local player = require("player") local block_scanner = require("block_iterator") local creator = require("creator") local colors = { ["block.minecraft.ancient_debris"] = { r = 43, g = 14, b = 0, a = 190 }, ["block.minecraft.emerald_ore"] = { r = 50, g = 168, b = 68, a = 180 }, ["block.minecraft.deepslate_emerald_ore"] = { r = 50, g = 168, b = 68, a = 180 }, ["block.minecraft.diamond_ore"] = { r = 50, g = 141, b = 168, a = 180 }, ["block.minecraft.deepslate_diamond_ore"] = { r = 50, g = 141, b = 168, a = 180 }, ["block.minecraft.gold_ore"] = { r = 162, g = 168, b = 50, a = 180 }, ["block.minecraft.deepslate_gold_ore"] = { r = 162, g = 168, b = 50, a = 180 }, ["block.minecraft.redstone_ore"] = { r = 219, g = 93, b = 68, a = 180 }, ["block.minecraft.deepslate_redstone_ore"] = { r = 219, g = 93, b = 68, a = 180 }, ["block.minecraft.iron_ore"] = { r = 153, g = 153, b = 148, a = 180 }, ["block.minecraft.deepslate_iron_ore"] = { r = 153, g = 153, b = 148, a = 180 }, ["block.minecraft.lapis_ore"] = { r = 19, g = 42, b = 173, a = 180 }, ["block.minecraft.deepslate_lapis_ore"] = { r = 19, g = 42, b = 173, a = 180 }, ["block.minecraft.coal_ore"] = { r = 43, g = 43, b = 43, a = 180 }, ["block.minecraft.deepslate_coal_ore"] = { r = 43, g = 43, b = 43, a = 180 }, } 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.translation_id 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.translation_id] 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)