- Выберите загрузчик игры
- Прочие моды
 
увидел тему https://yougame.biz/threads/328582/ (noad) и решил переделать,очень сильно хавало производительность,потому что сам xray перебирал около 10 миллионов блоков,я добавил настройки(теперь можно выбирать какие руды будут подсвечены),изменение радиуса и плотности,ss ниже,не бейте палками если увидите говнокод,его было много в той теме.
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
		
		
	
	
		 
	
				
			
			
				выфвфвыф:
			
		
		
		package im.expensive.functions.impl.render;
import com.google.common.eventbus.Subscribe;
import im.expensive.events.WorldEvent;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.functions.settings.impl.ModeListSetting;
import im.expensive.functions.settings.impl.SliderSetting;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.util.math.BlockPos;
import net.optifine.render.RenderUtils;
import java.awt.*;
import java.util.*;
import java.util.List;
@FunctionRegister(name = "Xray", type = Category.Render)
public class Xray extends Function {
    private final SliderSetting radius = new SliderSetting("Радиус", 32f, 16f, 100f, 1f);
    private final SliderSetting density = new SliderSetting("Плотность", 1f, 1f, 4f, 1f);
    private final List<BooleanSetting> oreSettings = Arrays.asList(
            new BooleanSetting("Уголь", true),
            new BooleanSetting("Железо", true),
            new BooleanSetting("Золото", false),
            new BooleanSetting("Алмазы", false),
            new BooleanSetting("Изумруды", false),
            new BooleanSetting("Редстоун", true),
            new BooleanSetting("Лазурит", true),
            new BooleanSetting("Обломки", false),
            new BooleanSetting("Кварц", false)
    );
    final ModeListSetting orts = new ModeListSetting("Руды", oreSettings.toArray(new BooleanSetting[0]));
    private final Map<Block, Integer> ores = new HashMap<>();
    private final Map<Block, String> blockToNameMap = new HashMap<>();
    public Xray() {
        addSettings(orts, radius, density);
        initOreColors();
        initBlockMappings();
    }
    private void initOreColors() {
        ores.put(Blocks.COAL_ORE, new Color(0, 0, 0).getRGB());
        ores.put(Blocks.IRON_ORE, new Color(200, 200, 200).getRGB());
        ores.put(Blocks.GOLD_ORE, new Color(255, 215, 0).getRGB());
        ores.put(Blocks.DIAMOND_ORE, new Color(0, 191, 255).getRGB());
        ores.put(Blocks.EMERALD_ORE, new Color(0, 255, 0).getRGB());
        ores.put(Blocks.REDSTONE_ORE, new Color(255, 0, 0).getRGB());
        ores.put(Blocks.LAPIS_ORE, new Color(0, 0, 255).getRGB());
        ores.put(Blocks.ANCIENT_DEBRIS, new Color(68, 33, 18).getRGB());
        ores.put(Blocks.NETHER_QUARTZ_ORE, new Color(255, 255, 255).getRGB());
    }
    private void initBlockMappings() {
        blockToNameMap.put(Blocks.COAL_ORE, "Уголь");
        blockToNameMap.put(Blocks.IRON_ORE, "Железо");
        blockToNameMap.put(Blocks.GOLD_ORE, "Золото");
        blockToNameMap.put(Blocks.DIAMOND_ORE, "Алмазы");
        blockToNameMap.put(Blocks.EMERALD_ORE, "Изумруды");
        blockToNameMap.put(Blocks.REDSTONE_ORE, "Редстоун");
        blockToNameMap.put(Blocks.LAPIS_ORE, "Лазурит");
        blockToNameMap.put(Blocks.ANCIENT_DEBRIS, "Обломки");
        blockToNameMap.put(Blocks.NETHER_QUARTZ_ORE, "Кварц");
    }
    [USER=1474073]@Subscribe[/USER]
    private void onRender(WorldEvent e) {
        ClientWorld world = mc.world;
        if (world == null) return;
        int radiusValue = radius.get("").intValue();
        int step = density.get("").intValue();
        BlockPos playerPos = mc.player.getPosition();
        int minX = playerPos.getX() - radiusValue;
        int maxX = playerPos.getX() + radiusValue;
        int minZ = playerPos.getZ() - radiusValue;
        int maxZ = playerPos.getZ() + radiusValue;
        int minY = Math.max(0, playerPos.getY() - radiusValue);
        int maxY = Math.min(world.getHeight(), playerPos.getY() + radiusValue);
        double radiusSq = radiusValue * radiusValue;
        for (int x = minX; x <= maxX; x += step) {
            for (int z = minZ; z <= maxZ; z += step) {
                double distX = x - playerPos.getX();
                double distZ = z - playerPos.getZ();
                double distSq = distX * distX + distZ * distZ;
                if (distSq > radiusSq) continue;
                for (int y = minY; y <= maxY; y++) {
                    BlockPos pos = new BlockPos(x, y, z);
                    Block block = world.getBlockState(pos).getBlock();
                    if (shouldRenderBlock(block)) {
                        double distY = y - playerPos.getY();
                        if (distX * distX + distY * distY + distZ * distZ > radiusSq) continue;
                        RenderUtils.drawBlockBox(pos, ores.get(block));
                    }
                }
            }
        }
    }
    private boolean shouldRenderBlock(Block block) {
        if (!ores.containsKey(block)) return false;
        String settingName = blockToNameMap.get(block);
        if (settingName == null) return false;
        for (BooleanSetting setting : oreSettings) {
            if (setting.getName().equals(settingName)) {
                Boolean value = setting.get("");
                return value != null && value;
            }
        }
        return false;
    }
} 
				 
	 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		