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

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

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
11 Май 2025
Сообщения
12
Реакции
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, и переносишь все классы которые остались
 
Назад
Сверху Снизу