Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Как оптимизировать XRay

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
8 Авг 2025
Сообщения
34
Реакции
0
Как оптимизировать xray? вроде я уже с ИИ отпимизировал типо обновления раз в секунду но на 100 блоках просто пиздец происходит, помогите плис

Код:
Expand Collapse Copy
package ru.levin.modules.misc;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import ru.levin.modules.setting.BooleanSetting;
import ru.levin.modules.setting.SliderSetting;
import ru.levin.events.Event;
import ru.levin.events.impl.render.EventRender3D;
import ru.levin.modules.Function;
import ru.levin.modules.FunctionAnnotation;
import ru.levin.modules.Type;
import ru.levin.util.render.RenderUtil;

import java.awt.*;
import java.util.*;
import java.util.List;

@FunctionAnnotation(name = "Xray", desc = "Xray", type = Type.Misc)
public class Xray extends Function {
public static SliderSetting radius = new SliderSetting("Радиус", 20f, 1f, 100f, 1f);
public static BooleanSetting ancient = new BooleanSetting("Незерит", true);
public static BooleanSetting diamond = new BooleanSetting("Алмазы", true);
public static BooleanSetting emerald = new BooleanSetting("Изумруды", true);
public static BooleanSetting gold = new BooleanSetting("Золото", true);
public static BooleanSetting iron = new BooleanSetting("Железо", true);
public static BooleanSetting coal = new BooleanSetting("Уголь", true);
public static BooleanSetting redstone = new BooleanSetting("Редстоун", true);
public static BooleanSetting lapise = new BooleanSetting("Лазурит", true);

// Кэш найденных руд
    private final Map<BlockPos, Block> oreCache = new HashMap<>();
private BlockPos lastPlayerPos = null;
private int updateTicks = 0;
private static final int UPDATE_INTERVAL = 20; // Обновлять каждые 20 тиков (1 сек)

    // Маппинг блоков на цвета
    private final Map<Block, Color> oreColors = new HashMap<>();

public Xray() {
addSettings(radius, ancient, diamond, emerald, gold, iron, coal, redstone, lapise);

// Инициализация цветов
        oreColors.put(Blocks.ANCIENT_DEBRIS, new Color(255, 203, 0, 103));
oreColors.put(Blocks.DIAMOND_ORE, new Color(0, 255, 255, 80));
oreColors.put(Blocks.DEEPSLATE_DIAMOND_ORE, new Color(0, 255, 255, 80));
oreColors.put(Blocks.EMERALD_ORE, new Color(0, 255, 0, 80));
oreColors.put(Blocks.DEEPSLATE_EMERALD_ORE, new Color(0, 255, 0, 80));
oreColors.put(Blocks.GOLD_ORE, new Color(255, 215, 0, 80));
oreColors.put(Blocks.DEEPSLATE_GOLD_ORE, new Color(255, 215, 0, 80));
oreColors.put(Blocks.IRON_ORE, new Color(192, 192, 192, 80));
oreColors.put(Blocks.DEEPSLATE_IRON_ORE, new Color(192, 192, 192, 80));
oreColors.put(Blocks.COAL_ORE, new Color(64, 64, 64, 80));
oreColors.put(Blocks.DEEPSLATE_COAL_ORE, new Color(64, 64, 64, 80));
oreColors.put(Blocks.REDSTONE_ORE, new Color(255, 0, 0, 80));
oreColors.put(Blocks.DEEPSLATE_REDSTONE_ORE, new Color(255, 0, 0, 80));
oreColors.put(Blocks.LAPIS_ORE, new Color(0, 0, 255, 80));
oreColors.put(Blocks.DEEPSLATE_LAPIS_ORE, new Color(0, 0, 255, 80));
    }

@Override
    public void onEvent(Event event) {
if (event instanceof EventRender3D e) {
updateTicks++;

// Обновляем кэш только раз в секунду или при смене позиции
            BlockPos currentPos = mc.player.getBlockPos();
if (lastPlayerPos == null ||
!lastPlayerPos.equals(currentPos) ||
updateTicks >= UPDATE_INTERVAL) {

                updateOreCache();
lastPlayerPos = currentPos;
updateTicks = 0;
            }

// Рендерим только закэшированные руды
            for (Map.Entry<BlockPos, Block> entry : oreCache.entrySet()) {
                BlockPos pos = entry.getKey();
                Block block = entry.getValue();

Color color = oreColors.get(block);
if (color != null) {
Box box = new Box(pos).contract(0.01);
RenderUtil.render3D.drawHoleOutline(box, color.getRGB(), 2);
                }
            }
        }
    }

private void updateOreCache() {
oreCache.clear();

if (mc.player == null || mc.world == null) return;

int r = radius.get().intValue();
BlockPos playerPos = mc.player.getBlockPos();

// Проходим только по радиусу, а не по фиксированным -30/+30
        for (int x = -r; x <= r; x++) {
for (int y = -r; y <= r; y++) {
for (int z = -r; z <= r; z++) {
// Проверка сферической дистанции для оптимизации
                    if (x * x + y * y + z * z > r * r) continue;

                    BlockPos pos = playerPos.add(x, y, z);
BlockState state = mc.world.getBlockState(pos);
                    Block block = state.getBlock();

// Проверяем только если блок нужен
                    if (shouldRenderOre(block)) {
oreCache.put(pos, block);
                    }
                }
            }
        }
    }

private boolean shouldRenderOre(Block block) {
if (ancient.get() && block == Blocks.ANCIENT_DEBRIS) return true;

if (diamond.get() && (block == Blocks.DIAMOND_ORE || block == Blocks.DEEPSLATE_DIAMOND_ORE)) return true;

if (emerald.get() && (block == Blocks.EMERALD_ORE || block == Blocks.DEEPSLATE_EMERALD_ORE)) return true;

if (gold.get() && (block == Blocks.GOLD_ORE || block == Blocks.DEEPSLATE_GOLD_ORE)) return true;

if (iron.get() && (block == Blocks.IRON_ORE || block == Blocks.DEEPSLATE_IRON_ORE)) return true;

if (coal.get() && (block == Blocks.COAL_ORE || block == Blocks.DEEPSLATE_COAL_ORE)) return true;

if (redstone.get() && (block == Blocks.REDSTONE_ORE || block == Blocks.DEEPSLATE_REDSTONE_ORE)) return true;

if (lapise.get() && (block == Blocks.LAPIS_ORE || block == Blocks.DEEPSLATE_LAPIS_ORE)) return true;

return false;
    }

@Override
    public void onDisable() {
oreCache.clear();
lastPlayerPos = null;
updateTicks = 0;
super.onDisable();
    }
}
 
Назад
Сверху Снизу