- Выберите загрузчик игры
- Прочие моды
увидел тему 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;
}
}