Вопрос AnchientXray Expensive 3.1

Начинающий
Статус
Оффлайн
Регистрация
14 Янв 2025
Сообщения
40
Реакции[?]
0
Поинты[?]
0

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Кароче такая проблема бывает что рендерит ещё и фейковые там 1-2 шт, я фиг знает как пофиксить помогите буду благодарен.


AnchientXray:
package nig.neverclose.functions.impl.player;

import com.google.common.eventbus.Subscribe;
import net.minecraft.util.math.RayTraceContext;
import nig.neverclose.events.WorldEvent;
import nig.neverclose.functions.api.Category;
import nig.neverclose.functions.api.Function;
import nig.neverclose.functions.api.FunctionRegister;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.BlockPos;
import net.optifine.render.RenderUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;

import java.awt.*;
import java.util.HashMap;
import java.util.Map;

@FunctionRegister(name = "AnchientXray", type = Category.Player)
public class AnchientXray extends Function {

    private final Map<TileEntityType<?>, Integer> tiles = new HashMap<>();
    private final Map<BlockState, Integer> blocks = new HashMap<>();
    private int lastAncientDebrisCount = 0;
    private boolean isInArea = false;

    private final Minecraft mc = Minecraft.getInstance();

    public AnchientXray() {
        addBlock(Blocks.ANCIENT_DEBRIS.getDefaultState(), new Color(199, 137, 3).getRGB());
    }

    private void addBlock(BlockState blockState, int color) {
        blocks.put(blockState, color);
    }

    [USER=1474073]@Subscribe[/USER]
    private void onRender(WorldEvent e) {
        int ancientDebrisCount = 0;
        boolean wasInArea = isInArea;

        isInArea = isPlayerInSearchArea();

        if (!wasInArea && isInArea) {
            lastAncientDebrisCount = 0;
        }

        for (TileEntity tile : mc.world.loadedTileEntityList) {
            TileEntityType<?> type = tile.getType();
            if (tiles.containsKey(type)) {
                BlockPos pos = tile.getPos();
                if (isBlockVisible(pos) && isBlockInRange(pos)) {
                    RenderUtils.drawBlockBox(pos, tiles.get(type));
                }
            }
        }

        boolean foundAncientDebris = false;

        for (BlockPos pos : BlockPos.getAllInBoxMutable(mc.player.getPosition().add(-16, -16, -16),
                mc.player.getPosition().add(16, 16, 16))) {
            BlockState state = mc.world.getBlockState(pos);
            if (blocks.containsKey(state)) {
                if (isNearbyNetherOre(pos)) {
                    continue;
                }

                if (isBlockBehindAncientDebris(pos)) {
                    continue;
                }

                if (isBlockNearBedrock(pos)) {
                    continue;
                }

                if (isTooManyAncientDebrisAtPos(pos)) {
                    continue;
                }
                if (isBlockVisible(pos) && isBlockInRange(pos)) {
                    RenderUtils.drawBlockBox(pos, blocks.get(state));
                    ancientDebrisCount++;
                    foundAncientDebris = true;
                }
            }
        }

        if (!foundAncientDebris) {
            lastAncientDebrisCount = 0;
        }

        if (ancientDebrisCount > lastAncientDebrisCount) {
            this.print("Найдено обломков: " + ancientDebrisCount);
            lastAncientDebrisCount = ancientDebrisCount;
        }
    }

    private boolean isPlayerInSearchArea() {
        return BlockPos.getAllInBoxMutable(mc.player.getPosition().add(-16, -16, -16),
                mc.player.getPosition().add(16, 16, 16)).iterator().hasNext();
    }

    private boolean isBlockVisible(BlockPos pos) {
        Vector3d playerPosition = mc.player.getEyePosition(1.0F);

        return isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(1, 0, 0)) ||  // Right
                isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(-1, 0, 0)) || // Left
                isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(0, 1, 0)) ||  // Up
                isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(0, -1, 0)) || // Down
                isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(0, 0, 1)) ||  // Front
                isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(0, 0, -1));   // Back
    }

    private boolean isBlockVisibleFromDirection(Vector3d playerPosition, BlockPos pos, Vector3d direction) {
        Vector3d blockPosition = new Vector3d(pos.getX(), pos.getY(), pos.getZ()).add(direction);

        RayTraceResult rayTraceResult = mc.world.rayTraceBlocks(new RayTraceContext(playerPosition, blockPosition,
                RayTraceContext.BlockMode.OUTLINE, RayTraceContext.FluidMode.NONE, mc.player));

        return rayTraceResult.getType() == RayTraceResult.Type.MISS;
    }

    private boolean isBlockInRange(BlockPos pos) {
        double distance = mc.player.getDistanceSq(pos.getX(), pos.getY(), pos.getZ());
        return distance <= 256;
    }

    private boolean isNearbyNetherOre(BlockPos pos) {
        for (BlockPos neighborPos : BlockPos.getAllInBoxMutable(pos.add(-1, -1, -1), pos.add(1, 1, 1))) {
            BlockState neighborState = mc.world.getBlockState(neighborPos);
            if (isNetherOreBlock(neighborState)) {
                return true;
            }
        }
        return false;
    }

    private boolean isNetherOreBlock(BlockState state) {
        return state.getBlock() == Blocks.NETHER_QUARTZ_ORE || state.getBlock() == Blocks.NETHER_GOLD_ORE ||
                state.getBlock() == Blocks.LODESTONE || state.getBlock() == Blocks.BLACKSTONE;
    }

    private boolean isBlockBehindAncientDebris(BlockPos pos) {
        BlockState state = mc.world.getBlockState(pos);
        return state.getBlock() == Blocks.STONE || state.getBlock() == Blocks.DIRT;
    }

    private boolean isBlockNearBedrock(BlockPos pos) {
        return pos.getY() <= 5;
    }

    private boolean isTooManyAncientDebrisAtPos(BlockPos pos) {
        int debrisCount = 0;


        for (int y = pos.getY(); y <= pos.getY() + 2; y++) {
            BlockPos newPos = new BlockPos(pos.getX(), y, pos.getZ());
            BlockState state = mc.world.getBlockState(newPos);
            if (state.getBlock() == Blocks.ANCIENT_DEBRIS) {
                debrisCount++;
            }
        }


        return debrisCount > 3;
    }
}
 
Сверху Снизу