Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Часть функционала Creeper Farm | Expensive | 3.1 | Baritone

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
11 Май 2025
Сообщения
17
Реакции
0
Выберите загрузчик игры
  1. Прочие моды
Всем привет, югейм, впервые что то заливаю на этот форум.
Не видел ни какой функции на этом форуме связанной с баритоном, поэтому решил сделать криперфарм как в нурике(noad) омг:roflanEbalo:

Пожалуйста, авторизуйтесь для просмотра ссылки.


Работает он через команду + функцию, гпт код присутствует
можно доработать, ведь есть 2 главные проблемы
1. Иногда пытается пройти через полублоки, секунды 2-3
2. Время от времени флагает и тепает назад на секунд 5:roflanPominki:


!!Важно!!
- Это не гайд по установке баритона


CreeperFarm.java:
Expand Collapse Copy
package im.expensive.functions.impl.misc;

import com.google.common.eventbus.Subscribe;
import im.expensive.events.EventUpdate;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.main.baritone.api.BaritoneAPI;
import im.expensive.main.baritone.api.IBaritone;
import im.expensive.main.baritone.api.Settings;
import im.expensive.main.baritone.api.pathing.goals.GoalBlock;
import im.expensive.main.baritone.api.pathing.goals.GoalXZ;
import im.expensive.utils.math.StopWatch;
import net.minecraft.block.TrapDoorBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.CreeperEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;

import java.util.List;

@FunctionRegister(
        name = "Auto Creeper Farm",
        description = "Автоматически фармит криперов и собирает порох/опыт",
        type = Category.Misc
)
public class CreeperFarm extends Function {

    private static BlockPos pos1;
    private static BlockPos pos2;

    public static void setPos1(BlockPos pos) { pos1 = pos; }
    public static void setPos2(BlockPos pos) { pos2 = pos; }
    public static void clearPositions() {
        pos1 = null;
        pos2 = null;
    }

    private static final double ATTACK_DISTANCE = 3.5;
    private static final double RETREAT_DISTANCE = 15;
    private static final double SAFE_Loot_RADIUS = 4.0;
    private static final long ATTACK_COOLDOWN = 500;

    private enum State {
        SEARCH, APPROACH, ATTACK, RETREAT, PATROL, LOOTING
    }

    private State state = State.SEARCH;
    private final StopWatch attackTimer = new StopWatch();
    private BlockPos[] patrolPoints;
    private int patrolIndex = 0;

    @Override
    public boolean onEnable() {
        if (mc.player == null || mc.world == null) return false;

        Settings s = BaritoneAPI.getSettings();
        s.allowPlace.value = false;
        s.allowBreak.value = false;
        s.legitMine.value = true;

        buildPatrolPoints();
        patrolIndex = 0;
        state = State.SEARCH;
        attackTimer.reset();

        return super.onEnable();
    }

    @Subscribe
    public void onUpdate(EventUpdate e) {
        if (mc.player == null || mc.world == null || pos1 == null || pos2 == null) return;

        IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone();
        handleTrapdoorJump();

        CreeperEntity exploding = findExplodingCreeper();
        if (exploding != null) {
            Vector3d dir = mc.player.getPositionVec().subtract(exploding.getPositionVec()).normalize();
            Vector3d retreat = mc.player.getPositionVec().add(dir.scale(RETREAT_DISTANCE));
            state = State.RETREAT;
            move(baritone, retreat);
            lookWaypoint(retreat);
            return;
        }

        ItemEntity loot = findSafeLoot();
        if (loot != null) {
            state = State.LOOTING;
            Vector3d pos = loot.getPositionVec();
            move(baritone, pos);
            lookWaypoint(pos);
            return;
        }

        CreeperEntity creeper = findClosestCreeper();
        if (creeper != null) {
            double dist = mc.player.getDistance(creeper);
            if (dist <= ATTACK_DISTANCE) {
                state = State.ATTACK;
                baritone.getPathingBehavior().cancelEverything();
                if (attackTimer.isReached(ATTACK_COOLDOWN)) {
                    mc.playerController.attackEntity(mc.player, creeper);
                    mc.player.swingArm(Hand.MAIN_HAND);
                    attackTimer.reset();
                }
            } else {
                state = State.APPROACH;
                Vector3d pos = creeper.getPositionVec();
                move(baritone, pos);
                lookWaypoint(pos);
            }
            return;
        }

        patrol(baritone);
    }

    private ItemEntity findSafeLoot() {
        ItemEntity item = findClosestItem(Items.GUNPOWDER);
        if (item == null) item = findClosestItem(Items.EXPERIENCE_BOTTLE);

        if (item != null) {
            List<CreeperEntity> nearbyCreepers = mc.world.getEntitiesWithinAABB(
                    CreeperEntity.class,
                    item.getBoundingBox().grow(SAFE_Loot_RADIUS)
            );

            if (nearbyCreepers.isEmpty()) {
                return item;
            }
        }
        return null;
    }

    private void patrol(IBaritone baritone) {
        if (patrolPoints == null || patrolPoints.length == 0) return;
        BlockPos target = patrolPoints[patrolIndex];
        double distSq = mc.player.getDistanceSq(target.getX() + 0.5, target.getY(), target.getZ() + 0.5);

        if (distSq < 2.0) {
            patrolIndex = (patrolIndex + 1) % patrolPoints.length;
            target = patrolPoints[patrolIndex];
        }

        state = State.PATROL;
        baritone.getCustomGoalProcess().setGoalAndPath(new GoalBlock(target));
        lookWaypoint(new Vector3d(target.getX() + 0.5, target.getY(), target.getZ() + 0.5));
    }

    private void buildPatrolPoints() {
        if (pos1 == null || pos2 == null) return;
        int minX = Math.min(pos1.getX(), pos2.getX());
        int maxX = Math.max(pos1.getX(), pos2.getX());
        int minZ = Math.min(pos1.getZ(), pos2.getZ());
        int maxZ = Math.max(pos1.getZ(), pos2.getZ());
        int y = (int) mc.player.getPosY();

        patrolPoints = new BlockPos[]{
                new BlockPos(minX, y, minZ),
                new BlockPos(maxX, y, minZ),
                new BlockPos(maxX, y, maxZ),
                new BlockPos(minX, y, maxZ)
        };
    }

    private void move(IBaritone baritone, Vector3d pos) {
        baritone.getCustomGoalProcess().setGoalAndPath(new GoalXZ((int) pos.x, (int) pos.z));
    }

    private void lookWaypoint(Vector3d target) {
        if (target == null) return;
        double dx = target.x - mc.player.getPosX();
        double dz = target.z - mc.player.getPosZ();
        float yaw = (Math.abs(dx) > Math.abs(dz)) ? (dx > 0 ? -90f : 90f) : (dz > 0 ? 0f : 180f);
        float finalYaw = yaw + (float) ((Math.random() * 4.0) - 2.0);
        mc.player.rotationYaw = finalYaw;
        mc.player.prevRotationYaw = finalYaw;
        mc.player.rotationPitch = (float) ((Math.random() * 1.0) - 0.5);
    }

    private void handleTrapdoorJump() {
        BlockPos head = new BlockPos(mc.player.getPosX(), mc.player.getPosY() + mc.player.getEyeHeight(), mc.player.getPosZ());
        if ((mc.world.getBlockState(head).getBlock() instanceof TrapDoorBlock || mc.world.getBlockState(head.up()).getBlock() instanceof TrapDoorBlock) && mc.player.isOnGround()) {
            mc.player.jump();
        }
    }

    private CreeperEntity findExplodingCreeper() {
        List<CreeperEntity> list = mc.world.getEntitiesWithinAABB(CreeperEntity.class, mc.player.getBoundingBox().grow(RETREAT_DISTANCE));
        for (CreeperEntity c : list) {
            if (c.isAlive() && c.getCreeperState() > 0) return c;
        }
        return null;
    }

    private CreeperEntity findClosestCreeper() {
        AxisAlignedBB box = new AxisAlignedBB(pos1, pos2).grow(1);
        List<CreeperEntity> list = mc.world.getEntitiesWithinAABB(CreeperEntity.class, box);
        CreeperEntity best = null;
        double bestDist = Double.MAX_VALUE;
        for (CreeperEntity c : list) {
            if (!c.isAlive()) continue;
            double d = mc.player.getDistance(c);
            if (d < bestDist) {
                bestDist = d;
                best = c;
            }
        }
        return best;
    }

    private ItemEntity findClosestItem(net.minecraft.item.Item item) {
        AxisAlignedBB box = new AxisAlignedBB(pos1, pos2).grow(1);
        List<ItemEntity> list = mc.world.getEntitiesWithinAABB(ItemEntity.class, box);
        ItemEntity best = null;
        double bestDist = Double.MAX_VALUE;
        for (ItemEntity it : list) {
            if (it.isAlive() && it.getItem().getItem() == item) {
                double d = mc.player.getDistance(it);
                if (d < bestDist) {
                    bestDist = d;
                    best = it;
                }
            }
        }
        return best;
    }

    @Override
    public boolean onDisable() {
        BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything();
        Settings s = BaritoneAPI.getSettings();
        s.allowPlace.value = true;
        s.allowBreak.value = true;
        s.legitMine.value = false;
        return super.onDisable();
    }
}



CreeperFarmCommand.java:
Expand Collapse Copy
package im.expensive.command.impl.feature;

import im.expensive.Expensive;
import im.expensive.command.*;
import im.expensive.command.impl.CommandException;
import im.expensive.functions.impl.misc.CreeperFarm;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;

import java.util.List;

import static im.expensive.utils.client.IMinecraft.mc;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class CreeperFarmCommand implements Command, CommandWithAdvice {

    final Prefix prefix;
    final Logger logger;

    @Override
    public void execute(Parameters parameters) {
        String commandType = parameters.asString(0).orElse("");

        switch (commandType.toLowerCase()) {
            case "pos1" -> setPosition1(parameters, logger);
            case "pos2" -> setPosition2(parameters, logger);
            case "clear" -> clearPositions(logger);
            default -> showUsage(logger);
        }
    }

    private void setPosition1(Parameters parameters, Logger logger) {
        if (mc.player == null) {
            logger.log(TextFormatting.RED + "Вы должны быть в игре!");
            return;
        }

        BlockPos pos = mc.player.getPosition();
        CreeperFarm.setPos1(pos);
        logger.log(TextFormatting.GREEN + "Pos1 установлен: " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ());
    }

    private void setPosition2(Parameters parameters, Logger logger) {
        if (mc.player == null) {
            logger.log(TextFormatting.RED + "Вы должны быть в игре!");
            return;
        }

        BlockPos pos = mc.player.getPosition();
        CreeperFarm.setPos2(pos);
        logger.log(TextFormatting.GREEN + "Pos2 установлен: " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ());
    }

    private void clearPositions(Logger logger) {
        CreeperFarm.clearPositions();
        logger.log(TextFormatting.YELLOW + "Координаты Creeper Farm очищены");
    }

    private void showUsage(Logger logger) {
        logger.log(TextFormatting.GRAY + "Использование:");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper pos1" + TextFormatting.WHITE + " - установить первую позицию");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper pos2" + TextFormatting.WHITE + " - установить вторую позицию");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper clear" + TextFormatting.WHITE + " - очистить позиции");
    }

    @Override
    public String name() {
        return "creeper";
    }

    @Override
    public String description() {
        return "Управление координатами для Creeper Farm";
    }

    @Override
    public List<String> adviceMessage() {
        return List.of();
    }
}


которенький гайд.

1. создаете файлик
CreeperFarm.java в misc

2. регаете ее в FunctionRegistry (Надеюсь вопросов не будет:roflanPominki:)

3. идете по пути im.expensive.command.imp.feature и создаете файлик CreeperFarmCommand.java

4. Заходите в Expensive.java и в войде initCommands вставляете

Код:
Expand Collapse Copy
commands.add(new CreeperFarmCommand(prefix, logger));


Модеры одобрите пж:roflanPominki:
 
не актуально как будто
согласен, но для тех кто сидит все еще на 3.1 сойдет
давай гайд на баритон
так там же все очень легко :roflanPominki:

могу дать коротенький


качаешь отсюда базу, перекидываешь основые папки, (baritone, com).
фиксишь ошибки если есть

теперь тыкаешь на net.minecraft, ctrl + shift + f, пишешь Baritone, и переносишь все классы которые остались
 
Всем привет, югейм, впервые что то заливаю на этот форум.
Не видел ни какой функции на этом форуме связанной с баритоном, поэтому решил сделать криперфарм как в нурике(noad) омг:roflanEbalo:

Пожалуйста, авторизуйтесь для просмотра ссылки.


Работает он через команду + функцию, гпт код присутствует
можно доработать, ведь есть 2 главные проблемы
1. Иногда пытается пройти через полублоки, секунды 2-3
2. Время от времени флагает и тепает назад на секунд 5:roflanPominki:


!!Важно!!
- Это не гайд по установке баритона


CreeperFarm.java:
Expand Collapse Copy
package im.expensive.functions.impl.misc;

import com.google.common.eventbus.Subscribe;
import im.expensive.events.EventUpdate;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.main.baritone.api.BaritoneAPI;
import im.expensive.main.baritone.api.IBaritone;
import im.expensive.main.baritone.api.Settings;
import im.expensive.main.baritone.api.pathing.goals.GoalBlock;
import im.expensive.main.baritone.api.pathing.goals.GoalXZ;
import im.expensive.utils.math.StopWatch;
import net.minecraft.block.TrapDoorBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.CreeperEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;

import java.util.List;

@FunctionRegister(
        name = "Auto Creeper Farm",
        description = "Автоматически фармит криперов и собирает порох/опыт",
        type = Category.Misc
)
public class CreeperFarm extends Function {

    private static BlockPos pos1;
    private static BlockPos pos2;

    public static void setPos1(BlockPos pos) { pos1 = pos; }
    public static void setPos2(BlockPos pos) { pos2 = pos; }
    public static void clearPositions() {
        pos1 = null;
        pos2 = null;
    }

    private static final double ATTACK_DISTANCE = 3.5;
    private static final double RETREAT_DISTANCE = 15;
    private static final double SAFE_Loot_RADIUS = 4.0;
    private static final long ATTACK_COOLDOWN = 500;

    private enum State {
        SEARCH, APPROACH, ATTACK, RETREAT, PATROL, LOOTING
    }

    private State state = State.SEARCH;
    private final StopWatch attackTimer = new StopWatch();
    private BlockPos[] patrolPoints;
    private int patrolIndex = 0;

    @Override
    public boolean onEnable() {
        if (mc.player == null || mc.world == null) return false;

        Settings s = BaritoneAPI.getSettings();
        s.allowPlace.value = false;
        s.allowBreak.value = false;
        s.legitMine.value = true;

        buildPatrolPoints();
        patrolIndex = 0;
        state = State.SEARCH;
        attackTimer.reset();

        return super.onEnable();
    }

    @Subscribe
    public void onUpdate(EventUpdate e) {
        if (mc.player == null || mc.world == null || pos1 == null || pos2 == null) return;

        IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone();
        handleTrapdoorJump();

        CreeperEntity exploding = findExplodingCreeper();
        if (exploding != null) {
            Vector3d dir = mc.player.getPositionVec().subtract(exploding.getPositionVec()).normalize();
            Vector3d retreat = mc.player.getPositionVec().add(dir.scale(RETREAT_DISTANCE));
            state = State.RETREAT;
            move(baritone, retreat);
            lookWaypoint(retreat);
            return;
        }

        ItemEntity loot = findSafeLoot();
        if (loot != null) {
            state = State.LOOTING;
            Vector3d pos = loot.getPositionVec();
            move(baritone, pos);
            lookWaypoint(pos);
            return;
        }

        CreeperEntity creeper = findClosestCreeper();
        if (creeper != null) {
            double dist = mc.player.getDistance(creeper);
            if (dist <= ATTACK_DISTANCE) {
                state = State.ATTACK;
                baritone.getPathingBehavior().cancelEverything();
                if (attackTimer.isReached(ATTACK_COOLDOWN)) {
                    mc.playerController.attackEntity(mc.player, creeper);
                    mc.player.swingArm(Hand.MAIN_HAND);
                    attackTimer.reset();
                }
            } else {
                state = State.APPROACH;
                Vector3d pos = creeper.getPositionVec();
                move(baritone, pos);
                lookWaypoint(pos);
            }
            return;
        }

        patrol(baritone);
    }

    private ItemEntity findSafeLoot() {
        ItemEntity item = findClosestItem(Items.GUNPOWDER);
        if (item == null) item = findClosestItem(Items.EXPERIENCE_BOTTLE);

        if (item != null) {
            List<CreeperEntity> nearbyCreepers = mc.world.getEntitiesWithinAABB(
                    CreeperEntity.class,
                    item.getBoundingBox().grow(SAFE_Loot_RADIUS)
            );

            if (nearbyCreepers.isEmpty()) {
                return item;
            }
        }
        return null;
    }

    private void patrol(IBaritone baritone) {
        if (patrolPoints == null || patrolPoints.length == 0) return;
        BlockPos target = patrolPoints[patrolIndex];
        double distSq = mc.player.getDistanceSq(target.getX() + 0.5, target.getY(), target.getZ() + 0.5);

        if (distSq < 2.0) {
            patrolIndex = (patrolIndex + 1) % patrolPoints.length;
            target = patrolPoints[patrolIndex];
        }

        state = State.PATROL;
        baritone.getCustomGoalProcess().setGoalAndPath(new GoalBlock(target));
        lookWaypoint(new Vector3d(target.getX() + 0.5, target.getY(), target.getZ() + 0.5));
    }

    private void buildPatrolPoints() {
        if (pos1 == null || pos2 == null) return;
        int minX = Math.min(pos1.getX(), pos2.getX());
        int maxX = Math.max(pos1.getX(), pos2.getX());
        int minZ = Math.min(pos1.getZ(), pos2.getZ());
        int maxZ = Math.max(pos1.getZ(), pos2.getZ());
        int y = (int) mc.player.getPosY();

        patrolPoints = new BlockPos[]{
                new BlockPos(minX, y, minZ),
                new BlockPos(maxX, y, minZ),
                new BlockPos(maxX, y, maxZ),
                new BlockPos(minX, y, maxZ)
        };
    }

    private void move(IBaritone baritone, Vector3d pos) {
        baritone.getCustomGoalProcess().setGoalAndPath(new GoalXZ((int) pos.x, (int) pos.z));
    }

    private void lookWaypoint(Vector3d target) {
        if (target == null) return;
        double dx = target.x - mc.player.getPosX();
        double dz = target.z - mc.player.getPosZ();
        float yaw = (Math.abs(dx) > Math.abs(dz)) ? (dx > 0 ? -90f : 90f) : (dz > 0 ? 0f : 180f);
        float finalYaw = yaw + (float) ((Math.random() * 4.0) - 2.0);
        mc.player.rotationYaw = finalYaw;
        mc.player.prevRotationYaw = finalYaw;
        mc.player.rotationPitch = (float) ((Math.random() * 1.0) - 0.5);
    }

    private void handleTrapdoorJump() {
        BlockPos head = new BlockPos(mc.player.getPosX(), mc.player.getPosY() + mc.player.getEyeHeight(), mc.player.getPosZ());
        if ((mc.world.getBlockState(head).getBlock() instanceof TrapDoorBlock || mc.world.getBlockState(head.up()).getBlock() instanceof TrapDoorBlock) && mc.player.isOnGround()) {
            mc.player.jump();
        }
    }

    private CreeperEntity findExplodingCreeper() {
        List<CreeperEntity> list = mc.world.getEntitiesWithinAABB(CreeperEntity.class, mc.player.getBoundingBox().grow(RETREAT_DISTANCE));
        for (CreeperEntity c : list) {
            if (c.isAlive() && c.getCreeperState() > 0) return c;
        }
        return null;
    }

    private CreeperEntity findClosestCreeper() {
        AxisAlignedBB box = new AxisAlignedBB(pos1, pos2).grow(1);
        List<CreeperEntity> list = mc.world.getEntitiesWithinAABB(CreeperEntity.class, box);
        CreeperEntity best = null;
        double bestDist = Double.MAX_VALUE;
        for (CreeperEntity c : list) {
            if (!c.isAlive()) continue;
            double d = mc.player.getDistance(c);
            if (d < bestDist) {
                bestDist = d;
                best = c;
            }
        }
        return best;
    }

    private ItemEntity findClosestItem(net.minecraft.item.Item item) {
        AxisAlignedBB box = new AxisAlignedBB(pos1, pos2).grow(1);
        List<ItemEntity> list = mc.world.getEntitiesWithinAABB(ItemEntity.class, box);
        ItemEntity best = null;
        double bestDist = Double.MAX_VALUE;
        for (ItemEntity it : list) {
            if (it.isAlive() && it.getItem().getItem() == item) {
                double d = mc.player.getDistance(it);
                if (d < bestDist) {
                    bestDist = d;
                    best = it;
                }
            }
        }
        return best;
    }

    @Override
    public boolean onDisable() {
        BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything();
        Settings s = BaritoneAPI.getSettings();
        s.allowPlace.value = true;
        s.allowBreak.value = true;
        s.legitMine.value = false;
        return super.onDisable();
    }
}



CreeperFarmCommand.java:
Expand Collapse Copy
package im.expensive.command.impl.feature;

import im.expensive.Expensive;
import im.expensive.command.*;
import im.expensive.command.impl.CommandException;
import im.expensive.functions.impl.misc.CreeperFarm;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;

import java.util.List;

import static im.expensive.utils.client.IMinecraft.mc;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class CreeperFarmCommand implements Command, CommandWithAdvice {

    final Prefix prefix;
    final Logger logger;

    @Override
    public void execute(Parameters parameters) {
        String commandType = parameters.asString(0).orElse("");

        switch (commandType.toLowerCase()) {
            case "pos1" -> setPosition1(parameters, logger);
            case "pos2" -> setPosition2(parameters, logger);
            case "clear" -> clearPositions(logger);
            default -> showUsage(logger);
        }
    }

    private void setPosition1(Parameters parameters, Logger logger) {
        if (mc.player == null) {
            logger.log(TextFormatting.RED + "Вы должны быть в игре!");
            return;
        }

        BlockPos pos = mc.player.getPosition();
        CreeperFarm.setPos1(pos);
        logger.log(TextFormatting.GREEN + "Pos1 установлен: " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ());
    }

    private void setPosition2(Parameters parameters, Logger logger) {
        if (mc.player == null) {
            logger.log(TextFormatting.RED + "Вы должны быть в игре!");
            return;
        }

        BlockPos pos = mc.player.getPosition();
        CreeperFarm.setPos2(pos);
        logger.log(TextFormatting.GREEN + "Pos2 установлен: " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ());
    }

    private void clearPositions(Logger logger) {
        CreeperFarm.clearPositions();
        logger.log(TextFormatting.YELLOW + "Координаты Creeper Farm очищены");
    }

    private void showUsage(Logger logger) {
        logger.log(TextFormatting.GRAY + "Использование:");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper pos1" + TextFormatting.WHITE + " - установить первую позицию");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper pos2" + TextFormatting.WHITE + " - установить вторую позицию");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper clear" + TextFormatting.WHITE + " - очистить позиции");
    }

    @Override
    public String name() {
        return "creeper";
    }

    @Override
    public String description() {
        return "Управление координатами для Creeper Farm";
    }

    @Override
    public List<String> adviceMessage() {
        return List.of();
    }
}


которенький гайд.

1. создаете файлик
CreeperFarm.java в misc

2. регаете ее в FunctionRegistry (Надеюсь вопросов не будет:roflanPominki:)

3. идете по пути im.expensive.command.imp.feature и создаете файлик CreeperFarmCommand.java

4. Заходите в Expensive.java и в войде initCommands вставляете

Код:
Expand Collapse Copy
commands.add(new CreeperFarmCommand(prefix, logger));


Модеры одобрите пж:roflanPominki:
не знаю, уже вроде не актуально + много сливали
 
так перенести раз плюнуть
1769710022349.png

ни одной темы не видел, поэтому слил
 
Всем привет, югейм, впервые что то заливаю на этот форум.
Не видел ни какой функции на этом форуме связанной с баритоном, поэтому решил сделать криперфарм как в нурике(noad) омг:roflanEbalo:

Пожалуйста, авторизуйтесь для просмотра ссылки.


Работает он через команду + функцию, гпт код присутствует
можно доработать, ведь есть 2 главные проблемы
1. Иногда пытается пройти через полублоки, секунды 2-3
2. Время от времени флагает и тепает назад на секунд 5:roflanPominki:


!!Важно!!
- Это не гайд по установке баритона


CreeperFarm.java:
Expand Collapse Copy
package im.expensive.functions.impl.misc;

import com.google.common.eventbus.Subscribe;
import im.expensive.events.EventUpdate;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.main.baritone.api.BaritoneAPI;
import im.expensive.main.baritone.api.IBaritone;
import im.expensive.main.baritone.api.Settings;
import im.expensive.main.baritone.api.pathing.goals.GoalBlock;
import im.expensive.main.baritone.api.pathing.goals.GoalXZ;
import im.expensive.utils.math.StopWatch;
import net.minecraft.block.TrapDoorBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.CreeperEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;

import java.util.List;

@FunctionRegister(
        name = "Auto Creeper Farm",
        description = "Автоматически фармит криперов и собирает порох/опыт",
        type = Category.Misc
)
public class CreeperFarm extends Function {

    private static BlockPos pos1;
    private static BlockPos pos2;

    public static void setPos1(BlockPos pos) { pos1 = pos; }
    public static void setPos2(BlockPos pos) { pos2 = pos; }
    public static void clearPositions() {
        pos1 = null;
        pos2 = null;
    }

    private static final double ATTACK_DISTANCE = 3.5;
    private static final double RETREAT_DISTANCE = 15;
    private static final double SAFE_Loot_RADIUS = 4.0;
    private static final long ATTACK_COOLDOWN = 500;

    private enum State {
        SEARCH, APPROACH, ATTACK, RETREAT, PATROL, LOOTING
    }

    private State state = State.SEARCH;
    private final StopWatch attackTimer = new StopWatch();
    private BlockPos[] patrolPoints;
    private int patrolIndex = 0;

    @Override
    public boolean onEnable() {
        if (mc.player == null || mc.world == null) return false;

        Settings s = BaritoneAPI.getSettings();
        s.allowPlace.value = false;
        s.allowBreak.value = false;
        s.legitMine.value = true;

        buildPatrolPoints();
        patrolIndex = 0;
        state = State.SEARCH;
        attackTimer.reset();

        return super.onEnable();
    }

    @Subscribe
    public void onUpdate(EventUpdate e) {
        if (mc.player == null || mc.world == null || pos1 == null || pos2 == null) return;

        IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone();
        handleTrapdoorJump();

        CreeperEntity exploding = findExplodingCreeper();
        if (exploding != null) {
            Vector3d dir = mc.player.getPositionVec().subtract(exploding.getPositionVec()).normalize();
            Vector3d retreat = mc.player.getPositionVec().add(dir.scale(RETREAT_DISTANCE));
            state = State.RETREAT;
            move(baritone, retreat);
            lookWaypoint(retreat);
            return;
        }

        ItemEntity loot = findSafeLoot();
        if (loot != null) {
            state = State.LOOTING;
            Vector3d pos = loot.getPositionVec();
            move(baritone, pos);
            lookWaypoint(pos);
            return;
        }

        CreeperEntity creeper = findClosestCreeper();
        if (creeper != null) {
            double dist = mc.player.getDistance(creeper);
            if (dist <= ATTACK_DISTANCE) {
                state = State.ATTACK;
                baritone.getPathingBehavior().cancelEverything();
                if (attackTimer.isReached(ATTACK_COOLDOWN)) {
                    mc.playerController.attackEntity(mc.player, creeper);
                    mc.player.swingArm(Hand.MAIN_HAND);
                    attackTimer.reset();
                }
            } else {
                state = State.APPROACH;
                Vector3d pos = creeper.getPositionVec();
                move(baritone, pos);
                lookWaypoint(pos);
            }
            return;
        }

        patrol(baritone);
    }

    private ItemEntity findSafeLoot() {
        ItemEntity item = findClosestItem(Items.GUNPOWDER);
        if (item == null) item = findClosestItem(Items.EXPERIENCE_BOTTLE);

        if (item != null) {
            List<CreeperEntity> nearbyCreepers = mc.world.getEntitiesWithinAABB(
                    CreeperEntity.class,
                    item.getBoundingBox().grow(SAFE_Loot_RADIUS)
            );

            if (nearbyCreepers.isEmpty()) {
                return item;
            }
        }
        return null;
    }

    private void patrol(IBaritone baritone) {
        if (patrolPoints == null || patrolPoints.length == 0) return;
        BlockPos target = patrolPoints[patrolIndex];
        double distSq = mc.player.getDistanceSq(target.getX() + 0.5, target.getY(), target.getZ() + 0.5);

        if (distSq < 2.0) {
            patrolIndex = (patrolIndex + 1) % patrolPoints.length;
            target = patrolPoints[patrolIndex];
        }

        state = State.PATROL;
        baritone.getCustomGoalProcess().setGoalAndPath(new GoalBlock(target));
        lookWaypoint(new Vector3d(target.getX() + 0.5, target.getY(), target.getZ() + 0.5));
    }

    private void buildPatrolPoints() {
        if (pos1 == null || pos2 == null) return;
        int minX = Math.min(pos1.getX(), pos2.getX());
        int maxX = Math.max(pos1.getX(), pos2.getX());
        int minZ = Math.min(pos1.getZ(), pos2.getZ());
        int maxZ = Math.max(pos1.getZ(), pos2.getZ());
        int y = (int) mc.player.getPosY();

        patrolPoints = new BlockPos[]{
                new BlockPos(minX, y, minZ),
                new BlockPos(maxX, y, minZ),
                new BlockPos(maxX, y, maxZ),
                new BlockPos(minX, y, maxZ)
        };
    }

    private void move(IBaritone baritone, Vector3d pos) {
        baritone.getCustomGoalProcess().setGoalAndPath(new GoalXZ((int) pos.x, (int) pos.z));
    }

    private void lookWaypoint(Vector3d target) {
        if (target == null) return;
        double dx = target.x - mc.player.getPosX();
        double dz = target.z - mc.player.getPosZ();
        float yaw = (Math.abs(dx) > Math.abs(dz)) ? (dx > 0 ? -90f : 90f) : (dz > 0 ? 0f : 180f);
        float finalYaw = yaw + (float) ((Math.random() * 4.0) - 2.0);
        mc.player.rotationYaw = finalYaw;
        mc.player.prevRotationYaw = finalYaw;
        mc.player.rotationPitch = (float) ((Math.random() * 1.0) - 0.5);
    }

    private void handleTrapdoorJump() {
        BlockPos head = new BlockPos(mc.player.getPosX(), mc.player.getPosY() + mc.player.getEyeHeight(), mc.player.getPosZ());
        if ((mc.world.getBlockState(head).getBlock() instanceof TrapDoorBlock || mc.world.getBlockState(head.up()).getBlock() instanceof TrapDoorBlock) && mc.player.isOnGround()) {
            mc.player.jump();
        }
    }

    private CreeperEntity findExplodingCreeper() {
        List<CreeperEntity> list = mc.world.getEntitiesWithinAABB(CreeperEntity.class, mc.player.getBoundingBox().grow(RETREAT_DISTANCE));
        for (CreeperEntity c : list) {
            if (c.isAlive() && c.getCreeperState() > 0) return c;
        }
        return null;
    }

    private CreeperEntity findClosestCreeper() {
        AxisAlignedBB box = new AxisAlignedBB(pos1, pos2).grow(1);
        List<CreeperEntity> list = mc.world.getEntitiesWithinAABB(CreeperEntity.class, box);
        CreeperEntity best = null;
        double bestDist = Double.MAX_VALUE;
        for (CreeperEntity c : list) {
            if (!c.isAlive()) continue;
            double d = mc.player.getDistance(c);
            if (d < bestDist) {
                bestDist = d;
                best = c;
            }
        }
        return best;
    }

    private ItemEntity findClosestItem(net.minecraft.item.Item item) {
        AxisAlignedBB box = new AxisAlignedBB(pos1, pos2).grow(1);
        List<ItemEntity> list = mc.world.getEntitiesWithinAABB(ItemEntity.class, box);
        ItemEntity best = null;
        double bestDist = Double.MAX_VALUE;
        for (ItemEntity it : list) {
            if (it.isAlive() && it.getItem().getItem() == item) {
                double d = mc.player.getDistance(it);
                if (d < bestDist) {
                    bestDist = d;
                    best = it;
                }
            }
        }
        return best;
    }

    @Override
    public boolean onDisable() {
        BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().cancelEverything();
        Settings s = BaritoneAPI.getSettings();
        s.allowPlace.value = true;
        s.allowBreak.value = true;
        s.legitMine.value = false;
        return super.onDisable();
    }
}



CreeperFarmCommand.java:
Expand Collapse Copy
package im.expensive.command.impl.feature;

import im.expensive.Expensive;
import im.expensive.command.*;
import im.expensive.command.impl.CommandException;
import im.expensive.functions.impl.misc.CreeperFarm;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;

import java.util.List;

import static im.expensive.utils.client.IMinecraft.mc;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class CreeperFarmCommand implements Command, CommandWithAdvice {

    final Prefix prefix;
    final Logger logger;

    @Override
    public void execute(Parameters parameters) {
        String commandType = parameters.asString(0).orElse("");

        switch (commandType.toLowerCase()) {
            case "pos1" -> setPosition1(parameters, logger);
            case "pos2" -> setPosition2(parameters, logger);
            case "clear" -> clearPositions(logger);
            default -> showUsage(logger);
        }
    }

    private void setPosition1(Parameters parameters, Logger logger) {
        if (mc.player == null) {
            logger.log(TextFormatting.RED + "Вы должны быть в игре!");
            return;
        }

        BlockPos pos = mc.player.getPosition();
        CreeperFarm.setPos1(pos);
        logger.log(TextFormatting.GREEN + "Pos1 установлен: " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ());
    }

    private void setPosition2(Parameters parameters, Logger logger) {
        if (mc.player == null) {
            logger.log(TextFormatting.RED + "Вы должны быть в игре!");
            return;
        }

        BlockPos pos = mc.player.getPosition();
        CreeperFarm.setPos2(pos);
        logger.log(TextFormatting.GREEN + "Pos2 установлен: " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ());
    }

    private void clearPositions(Logger logger) {
        CreeperFarm.clearPositions();
        logger.log(TextFormatting.YELLOW + "Координаты Creeper Farm очищены");
    }

    private void showUsage(Logger logger) {
        logger.log(TextFormatting.GRAY + "Использование:");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper pos1" + TextFormatting.WHITE + " - установить первую позицию");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper pos2" + TextFormatting.WHITE + " - установить вторую позицию");
        logger.log(TextFormatting.GRAY + prefix.get() + "creeper clear" + TextFormatting.WHITE + " - очистить позиции");
    }

    @Override
    public String name() {
        return "creeper";
    }

    @Override
    public String description() {
        return "Управление координатами для Creeper Farm";
    }

    @Override
    public List<String> adviceMessage() {
        return List.of();
    }
}


которенький гайд.

1. создаете файлик
CreeperFarm.java в misc

2. регаете ее в FunctionRegistry (Надеюсь вопросов не будет:roflanPominki:)

3. идете по пути im.expensive.command.imp.feature и создаете файлик CreeperFarmCommand.java

4. Заходите в Expensive.java и в войде initCommands вставляете

Код:
Expand Collapse Copy
commands.add(new CreeperFarmCommand(prefix, logger));


Модеры одобрите пж:roflanPominki:
/up это годно типы которые пишут что не актуально во первых ни разу не видел адекватных тем с нормальным крипер фармом я находил темы с криперфармом который баниться и флагает пока что это самая адекватная тема с крипер фармом)
 

Похожие темы

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