local player = require("player") local world = require("world") local creator = require("creator") local ids = { 'minecraft:chest' } local ORE_BLOCKS = { ["minecraft:chest"] = true, } -- Таблица для хранения уже нажатых блоков local clickedHistory = {} local function getBlocksInArea(playerPos, hDist, vDist) local blocks = {} local startX, endX = math.floor(playerPos.x - hDist), math.floor(playerPos.x + hDist) local startY, endY = math.floor(playerPos.y - vDist), math.floor(playerPos.y + vDist) local startZ, endZ = math.floor(playerPos.z - hDist), math.floor(playerPos.z + hDist) for x = startX, endX do for y = startY, endY do for z = startZ, endZ do -- Создаем уникальный ключ для блока local posKey = x .. "," .. y .. "," .. z -- Проверяем, не нажимали ли мы на него уже if not clickedHistory[posKey] then local block = world.getBlock(x, y, z) if block and ORE_BLOCKS[block.identifier] then local dist = math.sqrt( (x + 0.5 - playerPos.x) ^ 2 + (y + 0.5 - playerPos.y) ^ 2 + (z + 0.5 - playerPos.z) ^ 2 ) table.insert(blocks, { pos = { x = x, y = y, z = z }, dist = dist, key = posKey }) end end end end end return blocks end local blockClicked = {} registerClientTick(function() if #clickedHistory >= 10 then clickedHistory = {} end local location = player.getLocation() -- Очистка истории при выходе из Crystal Hollows (чтобы не копилось вечно) if location ~= 'CRYSTAL_HOLLOWS' then clickedHistory = {} return end local pos = player.getPos() local blocks = getBlocksInArea(pos, 7, 7) for _, block in ipairs(blocks) do if block.dist <= 4.5 then local blockRot = world.getRotation(block.pos.x + 0.5, block.pos.y + 0.5, block.pos.z + 0.5) player.setSilentRotation(blockRot.yaw, blockRot.pitch, true, true) local rayResult = player.raycastToBlocksFromIdentifier(4.5, ids) -- Дистанцию рейкаста лучше сопоставить с дистанцией проверки if rayResult and rayResult.type == "block" then -- Сохраняем позицию, чтобы не кликать снова clickedHistory[block.key] = true blockClicked = rayResult.blockpos player.input.interactBlock(rayResult) -- world.setBlock(block.pos.x, block.pos.y, block.pos.z, 0) break -- Выходим из цикла после одного успешного нажатия за тик end end end end) registerWorldRenderer(function(ctx) if blockClicked.x then ctx.renderFilled( creator.createBox(blockClicked.x, blockClicked.y, blockClicked.z, blockClicked.x + 1.0, blockClicked.y + 1.0, blockClicked.z + 1.0), 255, 0, 0, 1, true) end end)