Визуальная часть HitCircle // 3.1 ready

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
10 Янв 2025
Сообщения
42
Реакции
0
Выберите загрузчик игры
  1. Forge
  2. OptiFine
  3. ForgeOptiFine

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

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

Спасибо!

Более лучшая версия чем у нюкера ссылка на его пост <тык>(в плане визуализации)
ss
Пожалуйста, авторизуйтесь для просмотра ссылки.

код:
Код:
Expand Collapse Copy
@FunctionRegister(name = "HitCircle", type = Category.Render)
public class HitCircle extends Function {
    private final Minecraft mc = Minecraft.getInstance();

    private final SliderSetting circleRadius = new SliderSetting("Радиус круга", 0.3f, 0.1f, 1.0f, 0.01f);
    private final SliderSetting lineThickness = new SliderSetting("Толщина линии", 2.0f, 0.5f, 5.0f, 0.1f);
    private final SliderSetting crossSize = new SliderSetting("Размер перекрестия", 0.5f, 0.1f, 1.0f, 0.05f);
    private final SliderSetting spreadAngle = new SliderSetting("Угол разлета", 9.5f, 8.5f, 10f, 0.1f);

    public HitCircle() {
        this.addSettings(circleRadius, lineThickness, crossSize, spreadAngle);
    }

    @Subscribe
    public void onRenderWorld(WorldEvent event) {
        if (mc.player == null || mc.world == null) return;

        PlayerEntity player = mc.player;
        ItemStack held = player.getHeldItemMainhand();
        Item item = held.getItem();

        if (!(item instanceof BowItem || item instanceof CrossbowItem || item instanceof TridentItem)) return;

        float power = calculatePower(item, player);
        boolean isCrossbow = item instanceof CrossbowItem;

        if (isCrossbow && CrossbowItem.isCharged(held)) {
            for (int i = -1; i <= 1; i++) {
                Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
                Vector3d lookVec = getSpreadLookVec(player, i * spreadAngle.get());

                Vector3d motion = lookVec.scale(power);
                Vector3d pos = eyePos;

                for (int j = 0; j < 300; j++) {
                    Vector3d next = pos.add(motion);

                    RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                            RayTraceContext.FluidMode.NONE, player);
                    RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                    EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                    if (entityResult != null) {
                        drawCircle(entityResult.getHitVec(), Direction.UP, i, true);
                        break;
                    } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                        BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                        drawCircle(hit.getHitVec(), hit.getFace(), i, false);
                        break;
                    }

                    pos = next;
                    motion = motion.scale(0.99).subtract(0, 0.05, 0);
                }
            }
        } else {
            Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
            Vector3d lookVec = player.getLookVec();

            Vector3d motion = lookVec.scale(power);
            Vector3d pos = eyePos;

            for (int i = 0; i < 300; i++) {
                Vector3d next = pos.add(motion);

                RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                        RayTraceContext.FluidMode.NONE, player);
                RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                if (entityResult != null) {
                    drawCircle(entityResult.getHitVec(), Direction.UP, 0, true);
                    break;
                } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                    BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                    drawCircle(hit.getHitVec(), hit.getFace(), 0, false);
                    break;
                }

                pos = next;
                motion = motion.scale(0.99).subtract(0, 0.05, 0);
            }
        }
    }

    private Vector3d getSpreadLookVec(PlayerEntity player, float angleDegrees) {
        float angle = (float)Math.toRadians(angleDegrees);
        Vector3d look = player.getLookVec();
      
        double x = look.x * Math.cos(angle) - look.z * Math.sin(angle);
        double z = look.x * Math.sin(angle) + look.z * Math.cos(angle);

        return new Vector3d(x, look.y, z);
    }

    private float calculatePower(Item item, PlayerEntity player) {
        if (item instanceof BowItem) {
            int useTicks = player.getItemInUseCount();
            float draw = Math.min((useTicks / 20f * (useTicks / 20f + useTicks * 2f)) / 3f, 1f);
            return draw * 3f;
        } else if (item instanceof CrossbowItem) {
            return 3.15f;
        } else if (item instanceof TridentItem) {
            return 2.5f;
        }
        return 0f;
    }

    private EntityRayTraceResult rayTraceEntities(Vector3d start, Vector3d end, PlayerEntity player) {
        return ProjectileHelper.rayTraceEntities(
                mc.world,
                player,
                start,
                end,
                new AxisAlignedBB(start, end),
                e -> !e.isSpectator() && e.canBeCollidedWith()
        );
    }

    private void drawCircle(Vector3d hitVec, Direction face, int lineIndex, boolean isEntity) {
        Vector3d cam = mc.getRenderManager().info.getProjectedView();

        double x = hitVec.x - cam.x;
        double y = hitVec.y - cam.y + 0.01;
        double z = hitVec.z - cam.z;

        int segments = 40;
        double radius = this.circleRadius.get();
        float thickness = this.lineThickness.get();
        float crossLength = (float) (radius * crossSize.get());

        GL11.glPushMatrix();
        GL11.glTranslated(x, y, z);
        alignToFace(face);
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glLineWidth(thickness);
      
        if (isEntity) {
            GL11.glColor4f(1f, 0.2f, 0.2f, 0.8f);
        } else {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        }
      
        GL11.glBegin(GL11.GL_LINE_LOOP);
        for (int i = 0; i < segments; i++) {
            double angle = 2 * Math.PI * i / segments;
            GL11.glVertex3d(Math.cos(angle) * radius, 0, Math.sin(angle) * radius);
        }
        GL11.glEnd();
      
        GL11.glBegin(GL11.GL_LINES);
        GL11.glVertex3d(-crossLength, 0, 0);
        GL11.glVertex3d(crossLength, 0, 0);
        GL11.glVertex3d(0, 0, -crossLength);
        GL11.glVertex3d(0, 0, crossLength);
        GL11.glEnd();

        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glPopMatrix();
    }

    private void alignToFace(Direction face) {
        switch (face) {
            case UP:
                break;
            case DOWN:
                GL11.glRotated(180, 1, 0, 0);
                break;
            case EAST:
                GL11.glRotated(90, 0, 0, 1);
                break;
            case WEST:
                GL11.glRotated(-90, 0, 0, 1);
                break;
            case SOUTH:
                GL11.glRotated(-90, 1, 0, 0);
                break;
            case NORTH:
                GL11.glRotated(90, 1, 0, 0);
                break;
        }
    }
}
 
Последнее редактирование:
ура одобрили
 
Более лучшая версия чем у нюкера ссылка на его пост <тык>(в плане визуализации)
ss
Пожалуйста, авторизуйтесь для просмотра ссылки.

код:
Код:
Expand Collapse Copy
@FunctionRegister(name = "HitCircle", type = Category.Render)
public class HitCircle extends Function {
    private final Minecraft mc = Minecraft.getInstance();

    private final SliderSetting circleRadius = new SliderSetting("Радиус круга", 0.3f, 0.1f, 1.0f, 0.01f);
    private final SliderSetting lineThickness = new SliderSetting("Толщина линии", 2.0f, 0.5f, 5.0f, 0.1f);
    private final SliderSetting crossSize = new SliderSetting("Размер перекрестия", 0.5f, 0.1f, 1.0f, 0.05f);
    private final SliderSetting spreadAngle = new SliderSetting("Угол разлета", 9.5f, 8.5f, 10f, 0.1f);

    public HitCircle() {
        this.addSettings(circleRadius, lineThickness, crossSize, spreadAngle);
    }

    @Subscribe
    public void onRenderWorld(WorldEvent event) {
        if (mc.player == null || mc.world == null) return;

        PlayerEntity player = mc.player;
        ItemStack held = player.getHeldItemMainhand();
        Item item = held.getItem();

        if (!(item instanceof BowItem || item instanceof CrossbowItem || item instanceof TridentItem)) return;

        float power = calculatePower(item, player);
        boolean isCrossbow = item instanceof CrossbowItem;

        if (isCrossbow && CrossbowItem.isCharged(held)) {
            for (int i = -1; i <= 1; i++) {
                Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
                Vector3d lookVec = getSpreadLookVec(player, i * spreadAngle.get());

                Vector3d motion = lookVec.scale(power);
                Vector3d pos = eyePos;

                for (int j = 0; j < 300; j++) {
                    Vector3d next = pos.add(motion);

                    RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                            RayTraceContext.FluidMode.NONE, player);
                    RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                    EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                    if (entityResult != null) {
                        drawCircle(entityResult.getHitVec(), Direction.UP, i);
                        break;
                    } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                        BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                        drawCircle(hit.getHitVec(), hit.getFace(), i);
                        break;
                    }

                    pos = next;
                    motion = motion.scale(0.99).subtract(0, 0.05, 0);
                }
            }
        } else {

            Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
            Vector3d lookVec = player.getLookVec();

            Vector3d motion = lookVec.scale(power);
            Vector3d pos = eyePos;

            for (int i = 0; i < 300; i++) {
                Vector3d next = pos.add(motion);

                RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                        RayTraceContext.FluidMode.NONE, player);
                RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                if (entityResult != null) {
                    drawCircle(entityResult.getHitVec(), Direction.UP, 0);
                    break;
                } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                    BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                    drawCircle(hit.getHitVec(), hit.getFace(), 0);
                    break;
                }

                pos = next;
                motion = motion.scale(0.99).subtract(0, 0.05, 0);
            }
        }
    }

    private Vector3d getSpreadLookVec(PlayerEntity player, float angleDegrees) {
        float angle = (float)Math.toRadians(angleDegrees);
        Vector3d look = player.getLookVec();

     
        double x = look.x * Math.cos(angle) - look.z * Math.sin(angle);
        double z = look.x * Math.sin(angle) + look.z * Math.cos(angle);

        return new Vector3d(x, look.y, z);
    }

    private float calculatePower(Item item, PlayerEntity player) {
        if (item instanceof BowItem) {
            int useTicks = player.getItemInUseCount();
            float draw = Math.min((useTicks / 20f * (useTicks / 20f + useTicks * 2f)) / 3f, 1f);
            return draw * 3f;
        } else if (item instanceof CrossbowItem) {
            return 3.15f;
        } else if (item instanceof TridentItem) {
            return 2.5f;
        }
        return 0f;
    }

    private EntityRayTraceResult rayTraceEntities(Vector3d start, Vector3d end, PlayerEntity player) {
        return ProjectileHelper.rayTraceEntities(
                mc.world,
                player,
                start,
                end,
                new AxisAlignedBB(start, end),
                e -> !e.isSpectator() && e.canBeCollidedWith()
        );
    }

    private void drawCircle(Vector3d hitVec, Direction face, int lineIndex) {
        Vector3d cam = mc.getRenderManager().info.getProjectedView();

        double x = hitVec.x - cam.x;
        double y = hitVec.y - cam.y + 0.01;
        double z = hitVec.z - cam.z;

        int segments = 40;
        double radius = this.circleRadius.get();
        float thickness = this.lineThickness.get();
        float crossLength = (float) (radius * crossSize.get());

        GL11.glPushMatrix();
        GL11.glTranslated(x, y, z);
        alignToFace(face);
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glLineWidth(thickness);
     
        if (lineIndex == -1) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        } else if (lineIndex == 0) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        } else if (lineIndex == 1) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        }
     
        GL11.glBegin(GL11.GL_LINE_LOOP);
        for (int i = 0; i < segments; i++) {
            double angle = 2 * Math.PI * i / segments;
            GL11.glVertex3d(Math.cos(angle) * radius, 0, Math.sin(angle) * radius);
        }
        GL11.glEnd();
     
        GL11.glBegin(GL11.GL_LINES);

        GL11.glVertex3d(-crossLength, 0, 0);
        GL11.glVertex3d(crossLength, 0, 0);
 
        GL11.glVertex3d(0, 0, -crossLength);
        GL11.glVertex3d(0, 0, crossLength);
        GL11.glEnd();

        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glPopMatrix();
    }

    private void alignToFace(Direction face) {
        switch (face) {
            case UP:
                break;
            case DOWN:
                GL11.glRotated(180, 1, 0, 0);
                break;
            case EAST:
                GL11.glRotated(90, 0, 0, 1);
                break;
            case WEST:
                GL11.glRotated(-90, 0, 0, 1);
                break;
            case SOUTH:
                GL11.glRotated(-90, 1, 0, 0);
                break;
            case NORTH:
                GL11.glRotated(90, 1, 0, 0);
                break;
        }
    }
}
дрисня ебаная переделывай
 
Более лучшая версия чем у нюкера ссылка на его пост <тык>(в плане визуализации)
ss
Пожалуйста, авторизуйтесь для просмотра ссылки.

код:
Код:
Expand Collapse Copy
@FunctionRegister(name = "HitCircle", type = Category.Render)
public class HitCircle extends Function {
    private final Minecraft mc = Minecraft.getInstance();

    private final SliderSetting circleRadius = new SliderSetting("Радиус круга", 0.3f, 0.1f, 1.0f, 0.01f);
    private final SliderSetting lineThickness = new SliderSetting("Толщина линии", 2.0f, 0.5f, 5.0f, 0.1f);
    private final SliderSetting crossSize = new SliderSetting("Размер перекрестия", 0.5f, 0.1f, 1.0f, 0.05f);
    private final SliderSetting spreadAngle = new SliderSetting("Угол разлета", 9.5f, 8.5f, 10f, 0.1f);

    public HitCircle() {
        this.addSettings(circleRadius, lineThickness, crossSize, spreadAngle);
    }

    @Subscribe
    public void onRenderWorld(WorldEvent event) {
        if (mc.player == null || mc.world == null) return;

        PlayerEntity player = mc.player;
        ItemStack held = player.getHeldItemMainhand();
        Item item = held.getItem();

        if (!(item instanceof BowItem || item instanceof CrossbowItem || item instanceof TridentItem)) return;

        float power = calculatePower(item, player);
        boolean isCrossbow = item instanceof CrossbowItem;

        if (isCrossbow && CrossbowItem.isCharged(held)) {
            for (int i = -1; i <= 1; i++) {
                Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
                Vector3d lookVec = getSpreadLookVec(player, i * spreadAngle.get());

                Vector3d motion = lookVec.scale(power);
                Vector3d pos = eyePos;

                for (int j = 0; j < 300; j++) {
                    Vector3d next = pos.add(motion);

                    RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                            RayTraceContext.FluidMode.NONE, player);
                    RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                    EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                    if (entityResult != null) {
                        drawCircle(entityResult.getHitVec(), Direction.UP, i);
                        break;
                    } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                        BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                        drawCircle(hit.getHitVec(), hit.getFace(), i);
                        break;
                    }

                    pos = next;
                    motion = motion.scale(0.99).subtract(0, 0.05, 0);
                }
            }
        } else {

            Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
            Vector3d lookVec = player.getLookVec();

            Vector3d motion = lookVec.scale(power);
            Vector3d pos = eyePos;

            for (int i = 0; i < 300; i++) {
                Vector3d next = pos.add(motion);

                RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                        RayTraceContext.FluidMode.NONE, player);
                RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                if (entityResult != null) {
                    drawCircle(entityResult.getHitVec(), Direction.UP, 0);
                    break;
                } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                    BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                    drawCircle(hit.getHitVec(), hit.getFace(), 0);
                    break;
                }

                pos = next;
                motion = motion.scale(0.99).subtract(0, 0.05, 0);
            }
        }
    }

    private Vector3d getSpreadLookVec(PlayerEntity player, float angleDegrees) {
        float angle = (float)Math.toRadians(angleDegrees);
        Vector3d look = player.getLookVec();

     
        double x = look.x * Math.cos(angle) - look.z * Math.sin(angle);
        double z = look.x * Math.sin(angle) + look.z * Math.cos(angle);

        return new Vector3d(x, look.y, z);
    }

    private float calculatePower(Item item, PlayerEntity player) {
        if (item instanceof BowItem) {
            int useTicks = player.getItemInUseCount();
            float draw = Math.min((useTicks / 20f * (useTicks / 20f + useTicks * 2f)) / 3f, 1f);
            return draw * 3f;
        } else if (item instanceof CrossbowItem) {
            return 3.15f;
        } else if (item instanceof TridentItem) {
            return 2.5f;
        }
        return 0f;
    }

    private EntityRayTraceResult rayTraceEntities(Vector3d start, Vector3d end, PlayerEntity player) {
        return ProjectileHelper.rayTraceEntities(
                mc.world,
                player,
                start,
                end,
                new AxisAlignedBB(start, end),
                e -> !e.isSpectator() && e.canBeCollidedWith()
        );
    }

    private void drawCircle(Vector3d hitVec, Direction face, int lineIndex) {
        Vector3d cam = mc.getRenderManager().info.getProjectedView();

        double x = hitVec.x - cam.x;
        double y = hitVec.y - cam.y + 0.01;
        double z = hitVec.z - cam.z;

        int segments = 40;
        double radius = this.circleRadius.get();
        float thickness = this.lineThickness.get();
        float crossLength = (float) (radius * crossSize.get());

        GL11.glPushMatrix();
        GL11.glTranslated(x, y, z);
        alignToFace(face);
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glLineWidth(thickness);
     
        if (lineIndex == -1) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        } else if (lineIndex == 0) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        } else if (lineIndex == 1) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        }
     
        GL11.glBegin(GL11.GL_LINE_LOOP);
        for (int i = 0; i < segments; i++) {
            double angle = 2 * Math.PI * i / segments;
            GL11.glVertex3d(Math.cos(angle) * radius, 0, Math.sin(angle) * radius);
        }
        GL11.glEnd();
     
        GL11.glBegin(GL11.GL_LINES);

        GL11.glVertex3d(-crossLength, 0, 0);
        GL11.glVertex3d(crossLength, 0, 0);
 
        GL11.glVertex3d(0, 0, -crossLength);
        GL11.glVertex3d(0, 0, crossLength);
        GL11.glEnd();

        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glPopMatrix();
    }

    private void alignToFace(Direction face) {
        switch (face) {
            case UP:
                break;
            case DOWN:
                GL11.glRotated(180, 1, 0, 0);
                break;
            case EAST:
                GL11.glRotated(90, 0, 0, 1);
                break;
            case WEST:
                GL11.glRotated(-90, 0, 0, 1);
                break;
            case SOUTH:
                GL11.glRotated(-90, 1, 0, 0);
                break;
            case NORTH:
                GL11.glRotated(90, 1, 0, 0);
                break;
        }
    }
}
фу нахуй
 
Более лучшая версия чем у нюкера ссылка на его пост <тык>(в плане визуализации)
ss
Пожалуйста, авторизуйтесь для просмотра ссылки.

код:
Код:
Expand Collapse Copy
@FunctionRegister(name = "HitCircle", type = Category.Render)
public class HitCircle extends Function {
    private final Minecraft mc = Minecraft.getInstance();

    private final SliderSetting circleRadius = new SliderSetting("Радиус круга", 0.3f, 0.1f, 1.0f, 0.01f);
    private final SliderSetting lineThickness = new SliderSetting("Толщина линии", 2.0f, 0.5f, 5.0f, 0.1f);
    private final SliderSetting crossSize = new SliderSetting("Размер перекрестия", 0.5f, 0.1f, 1.0f, 0.05f);
    private final SliderSetting spreadAngle = new SliderSetting("Угол разлета", 9.5f, 8.5f, 10f, 0.1f);

    public HitCircle() {
        this.addSettings(circleRadius, lineThickness, crossSize, spreadAngle);
    }

    @Subscribe
    public void onRenderWorld(WorldEvent event) {
        if (mc.player == null || mc.world == null) return;

        PlayerEntity player = mc.player;
        ItemStack held = player.getHeldItemMainhand();
        Item item = held.getItem();

        if (!(item instanceof BowItem || item instanceof CrossbowItem || item instanceof TridentItem)) return;

        float power = calculatePower(item, player);
        boolean isCrossbow = item instanceof CrossbowItem;

        if (isCrossbow && CrossbowItem.isCharged(held)) {
            for (int i = -1; i <= 1; i++) {
                Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
                Vector3d lookVec = getSpreadLookVec(player, i * spreadAngle.get());

                Vector3d motion = lookVec.scale(power);
                Vector3d pos = eyePos;

                for (int j = 0; j < 300; j++) {
                    Vector3d next = pos.add(motion);

                    RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                            RayTraceContext.FluidMode.NONE, player);
                    RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                    EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                    if (entityResult != null) {
                        drawCircle(entityResult.getHitVec(), Direction.UP, i);
                        break;
                    } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                        BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                        drawCircle(hit.getHitVec(), hit.getFace(), i);
                        break;
                    }

                    pos = next;
                    motion = motion.scale(0.99).subtract(0, 0.05, 0);
                }
            }
        } else {

            Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
            Vector3d lookVec = player.getLookVec();

            Vector3d motion = lookVec.scale(power);
            Vector3d pos = eyePos;

            for (int i = 0; i < 300; i++) {
                Vector3d next = pos.add(motion);

                RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                        RayTraceContext.FluidMode.NONE, player);
                RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                if (entityResult != null) {
                    drawCircle(entityResult.getHitVec(), Direction.UP, 0);
                    break;
                } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                    BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                    drawCircle(hit.getHitVec(), hit.getFace(), 0);
                    break;
                }

                pos = next;
                motion = motion.scale(0.99).subtract(0, 0.05, 0);
            }
        }
    }

    private Vector3d getSpreadLookVec(PlayerEntity player, float angleDegrees) {
        float angle = (float)Math.toRadians(angleDegrees);
        Vector3d look = player.getLookVec();

     
        double x = look.x * Math.cos(angle) - look.z * Math.sin(angle);
        double z = look.x * Math.sin(angle) + look.z * Math.cos(angle);

        return new Vector3d(x, look.y, z);
    }

    private float calculatePower(Item item, PlayerEntity player) {
        if (item instanceof BowItem) {
            int useTicks = player.getItemInUseCount();
            float draw = Math.min((useTicks / 20f * (useTicks / 20f + useTicks * 2f)) / 3f, 1f);
            return draw * 3f;
        } else if (item instanceof CrossbowItem) {
            return 3.15f;
        } else if (item instanceof TridentItem) {
            return 2.5f;
        }
        return 0f;
    }

    private EntityRayTraceResult rayTraceEntities(Vector3d start, Vector3d end, PlayerEntity player) {
        return ProjectileHelper.rayTraceEntities(
                mc.world,
                player,
                start,
                end,
                new AxisAlignedBB(start, end),
                e -> !e.isSpectator() && e.canBeCollidedWith()
        );
    }

    private void drawCircle(Vector3d hitVec, Direction face, int lineIndex) {
        Vector3d cam = mc.getRenderManager().info.getProjectedView();

        double x = hitVec.x - cam.x;
        double y = hitVec.y - cam.y + 0.01;
        double z = hitVec.z - cam.z;

        int segments = 40;
        double radius = this.circleRadius.get();
        float thickness = this.lineThickness.get();
        float crossLength = (float) (radius * crossSize.get());

        GL11.glPushMatrix();
        GL11.glTranslated(x, y, z);
        alignToFace(face);
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glLineWidth(thickness);
     
        if (lineIndex == -1) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        } else if (lineIndex == 0) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        } else if (lineIndex == 1) {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        }
     
        GL11.glBegin(GL11.GL_LINE_LOOP);
        for (int i = 0; i < segments; i++) {
            double angle = 2 * Math.PI * i / segments;
            GL11.glVertex3d(Math.cos(angle) * radius, 0, Math.sin(angle) * radius);
        }
        GL11.glEnd();
     
        GL11.glBegin(GL11.GL_LINES);

        GL11.glVertex3d(-crossLength, 0, 0);
        GL11.glVertex3d(crossLength, 0, 0);
 
        GL11.glVertex3d(0, 0, -crossLength);
        GL11.glVertex3d(0, 0, crossLength);
        GL11.glEnd();

        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glPopMatrix();
    }

    private void alignToFace(Direction face) {
        switch (face) {
            case UP:
                break;
            case DOWN:
                GL11.glRotated(180, 1, 0, 0);
                break;
            case EAST:
                GL11.glRotated(90, 0, 0, 1);
                break;
            case WEST:
                GL11.glRotated(-90, 0, 0, 1);
                break;
            case SOUTH:
                GL11.glRotated(-90, 1, 0, 0);
                break;
            case NORTH:
                GL11.glRotated(90, 1, 0, 0);
                break;
        }
    }
}
Ну кстати,хорошо,мне нравится,была бы возможность ентити детект цвета,то ваще красота
 
понял,но если взять эти и доделать то думаю будет ваще хорошо
хорошая идея мб сделаю и перезалью
Более лучшая версия чем у нюкера ссылка на его пост <тык>(в плане визуализации)
ss
Пожалуйста, авторизуйтесь для просмотра ссылки.

код:
Код:
Expand Collapse Copy
@FunctionRegister(name = "HitCircle", type = Category.Render)
public class HitCircle extends Function {
    private final Minecraft mc = Minecraft.getInstance();

    private final SliderSetting circleRadius = new SliderSetting("Радиус круга", 0.3f, 0.1f, 1.0f, 0.01f);
    private final SliderSetting lineThickness = new SliderSetting("Толщина линии", 2.0f, 0.5f, 5.0f, 0.1f);
    private final SliderSetting crossSize = new SliderSetting("Размер перекрестия", 0.5f, 0.1f, 1.0f, 0.05f);
    private final SliderSetting spreadAngle = new SliderSetting("Угол разлета", 9.5f, 8.5f, 10f, 0.1f);

    public HitCircle() {
        this.addSettings(circleRadius, lineThickness, crossSize, spreadAngle);
    }

    @Subscribe
    public void onRenderWorld(WorldEvent event) {
        if (mc.player == null || mc.world == null) return;

        PlayerEntity player = mc.player;
        ItemStack held = player.getHeldItemMainhand();
        Item item = held.getItem();

        if (!(item instanceof BowItem || item instanceof CrossbowItem || item instanceof TridentItem)) return;

        float power = calculatePower(item, player);
        boolean isCrossbow = item instanceof CrossbowItem;

        if (isCrossbow && CrossbowItem.isCharged(held)) {
            for (int i = -1; i <= 1; i++) {
                Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
                Vector3d lookVec = getSpreadLookVec(player, i * spreadAngle.get());

                Vector3d motion = lookVec.scale(power);
                Vector3d pos = eyePos;

                for (int j = 0; j < 300; j++) {
                    Vector3d next = pos.add(motion);

                    RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                            RayTraceContext.FluidMode.NONE, player);
                    RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                    EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                    if (entityResult != null) {
                        drawCircle(entityResult.getHitVec(), Direction.UP, i, true);
                        break;
                    } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                        BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                        drawCircle(hit.getHitVec(), hit.getFace(), i, false);
                        break;
                    }

                    pos = next;
                    motion = motion.scale(0.99).subtract(0, 0.05, 0);
                }
            }
        } else {
            Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
            Vector3d lookVec = player.getLookVec();

            Vector3d motion = lookVec.scale(power);
            Vector3d pos = eyePos;

            for (int i = 0; i < 300; i++) {
                Vector3d next = pos.add(motion);

                RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
                        RayTraceContext.FluidMode.NONE, player);
                RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
                EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);

                if (entityResult != null) {
                    drawCircle(entityResult.getHitVec(), Direction.UP, 0, true);
                    break;
                } else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
                    BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
                    drawCircle(hit.getHitVec(), hit.getFace(), 0, false);
                    break;
                }

                pos = next;
                motion = motion.scale(0.99).subtract(0, 0.05, 0);
            }
        }
    }

    private Vector3d getSpreadLookVec(PlayerEntity player, float angleDegrees) {
        float angle = (float)Math.toRadians(angleDegrees);
        Vector3d look = player.getLookVec();
     
        double x = look.x * Math.cos(angle) - look.z * Math.sin(angle);
        double z = look.x * Math.sin(angle) + look.z * Math.cos(angle);

        return new Vector3d(x, look.y, z);
    }

    private float calculatePower(Item item, PlayerEntity player) {
        if (item instanceof BowItem) {
            int useTicks = player.getItemInUseCount();
            float draw = Math.min((useTicks / 20f * (useTicks / 20f + useTicks * 2f)) / 3f, 1f);
            return draw * 3f;
        } else if (item instanceof CrossbowItem) {
            return 3.15f;
        } else if (item instanceof TridentItem) {
            return 2.5f;
        }
        return 0f;
    }

    private EntityRayTraceResult rayTraceEntities(Vector3d start, Vector3d end, PlayerEntity player) {
        return ProjectileHelper.rayTraceEntities(
                mc.world,
                player,
                start,
                end,
                new AxisAlignedBB(start, end),
                e -> !e.isSpectator() && e.canBeCollidedWith()
        );
    }

    private void drawCircle(Vector3d hitVec, Direction face, int lineIndex, boolean isEntity) {
        Vector3d cam = mc.getRenderManager().info.getProjectedView();

        double x = hitVec.x - cam.x;
        double y = hitVec.y - cam.y + 0.01;
        double z = hitVec.z - cam.z;

        int segments = 40;
        double radius = this.circleRadius.get();
        float thickness = this.lineThickness.get();
        float crossLength = (float) (radius * crossSize.get());

        GL11.glPushMatrix();
        GL11.glTranslated(x, y, z);
        alignToFace(face);
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glLineWidth(thickness);
     
        if (isEntity) {
            GL11.glColor4f(1f, 0.2f, 0.2f, 0.8f);
        } else {
            GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
        }
     
        GL11.glBegin(GL11.GL_LINE_LOOP);
        for (int i = 0; i < segments; i++) {
            double angle = 2 * Math.PI * i / segments;
            GL11.glVertex3d(Math.cos(angle) * radius, 0, Math.sin(angle) * radius);
        }
        GL11.glEnd();
     
        GL11.glBegin(GL11.GL_LINES);
        GL11.glVertex3d(-crossLength, 0, 0);
        GL11.glVertex3d(crossLength, 0, 0);
        GL11.glVertex3d(0, 0, -crossLength);
        GL11.glVertex3d(0, 0, crossLength);
        GL11.glEnd();

        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glPopMatrix();
    }

    private void alignToFace(Direction face) {
        switch (face) {
            case UP:
                break;
            case DOWN:
                GL11.glRotated(180, 1, 0, 0);
                break;
            case EAST:
                GL11.glRotated(90, 0, 0, 1);
                break;
            case WEST:
                GL11.glRotated(-90, 0, 0, 1);
                break;
            case SOUTH:
                GL11.glRotated(-90, 1, 0, 0);
                break;
            case NORTH:
                GL11.glRotated(90, 1, 0, 0);
                break;
        }
    }
}
все перезалил теперь при наводке на энтити круги красные
 
Последнее редактирование:

Похожие темы

Назад
Сверху Снизу