Начинающий
- Статус
- Оффлайн
- Регистрация
- 8 Авг 2025
- Сообщения
- 34
- Реакции
- 0
Как оптимизировать xray? вроде я уже с ИИ отпимизировал типо обновления раз в секунду но на 100 блоках просто пиздец происходит, помогите плис
Код:
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();
}
}