Target perl в 6 раз лучше

  • Автор темы Автор темы Sprizen
  • Дата начала Дата начала
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как и обещал . В серьёз не воспринимать... Хотя мб норм
Код:
Expand Collapse Copy
package ru.test.functions.impl.combat;

import com.google.common.eventbus.Subscribe;
import ru.test.events.WorldEvent;
import ru.test.functions.api.Category;
import ru.test.functions.api.Function;
import ru.wery.functions.api.FunctionRegister;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EnderPearlEntity;
import net.minecraft.item.Items;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.Hand;
import net.minecraft.network.play.client.CPlayerTryUseItemPacket;

import java.util.List;
import java.util.stream.Collectors;

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

    private long lastPearlThrowTime = 0;
    private static final int PEARL_THROW_DELAY = 350; // Задержка броска перла в миллисекундах

    @Subscribe
    public void onRender(WorldEvent event) {
        if (System.currentTimeMillis() - lastPearlThrowTime < PEARL_THROW_DELAY) {
            return; // Если задержка ещё не прошла, выходим из метода
        }

        List<EnderPearlEntity> enderPearls = mc.world.getAllEntities().stream()
                .filter(entity -> entity instanceof EnderPearlEntity)
                .map(entity -> (EnderPearlEntity) entity)
                .filter(pearl -> !isOwnEnderPearl(pearl))
                .collect(Collectors.toList());

        for (EnderPearlEntity pearl : enderPearls) {
            Vector3d targetPos = predictPearlLanding(pearl);

            if (targetPos != null) {
                aimAtPosition(targetPos);
                throwPearl();
                lastPearlThrowTime = System.currentTimeMillis();
                break; // Бросаем только один перл за цикл
            }
        }
    }

    private void aimAtPosition(Vector3d targetPos) {
        Vector3d playerPos = mc.player.getPositionVec().add(0, mc.player.getEyeHeight(), 0);
        Vector3d direction = targetPos.subtract(playerPos).normalize();

        float pitch = (float) -Math.toDegrees(Math.asin(direction.y));
        float yaw = (float) Math.toDegrees(Math.atan2(direction.z, direction.x)) - 90;

        mc.player.rotationPitch = pitch;
        mc.player.rotationYaw = yaw;
    }

    private void throwPearl() {
        if (mc.player.getCooldownTracker().hasCooldown(Items.ENDER_PEARL)) {
            return; // Если перл на перезарядке, не бросаем
        }

        if (mc.player.getHeldItemMainhand().getItem() != Items.ENDER_PEARL) {
            // Если в основной руке нет перла, пытаемся найти его в инвентаре
            int pearlSlot = findItemInHotbar(Items.ENDER_PEARL);
            if (pearlSlot != -1) {
                mc.player.inventory.currentItem = pearlSlot;
            } else {
                return; // Если перлов нет, выходим из метода
            }
        }

        mc.player.connection.sendPacket(new CPlayerTryUseItemPacket(Hand.MAIN_HAND));
        mc.player.swingArm(Hand.MAIN_HAND);
    }

    private int findItemInHotbar(Item item) {
        for (int i = 0; i < 9; i++) {
            if (mc.player.inventory.getStackInSlot(i).getItem() == item) {
                return i;
            }
        }
        return -1; // Предмет не найден
    }

    private Vector3d predictPearlLanding(EnderPearlEntity pearl) {
        Vector3d position = pearl.getPositionVec();
        Vector3d motion = pearl.getMotion();
        RayTraceContext context = new RayTraceContext(
                position,
                position.add(motion.scale(50)), // Прогнозируем на расстояние 50 блоков
                RayTraceContext.BlockMode.COLLIDER,
                RayTraceContext.FluidMode.NONE,
                pearl
        );

        BlockRayTraceResult result = mc.world.rayTraceBlocks(context);
        if (result.getType() == RayTraceResult.Type.BLOCK) {
            return result.getHitVec(); // Возвращаем точку столкновения с блоком
        }
        return null; // Если столкновения нет, возвращаем null
    }

    private boolean isOwnEnderPearl(EnderPearlEntity pearl) {
        return pearl.getThrowerId() != null && pearl.getThrowerId().equals(mc.player.getUniqueID());
    }
}
гпт сделал в 6 раз лучше
 
Последнее редактирование:
Назад
Сверху Снизу