Начинающий
- Статус
- Оффлайн
- Регистрация
- 9 Мар 2025
- Сообщения
- 164
- Реакции
- 11
- Выберите загрузчик игры
- Fabric
Намешано много говнокода, но в принципе функция прикольная, да и, может, кто-то возьмёт.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Код:
package trollhack.dev.module.impl.misc;
import com.google.common.eventbus.Subscribe;
import trollhack.dev.event.api.EventType;
import trollhack.dev.event.impl.game.EventPlayerTick;
import trollhack.dev.event.impl.player.RotationUpdateEvent;
import trollhack.dev.module.api.Category;
import trollhack.dev.module.api.Function;
import trollhack.dev.module.api.ModuleInfo;
import trollhack.dev.module.impl.combat.furry.Angle;
import trollhack.dev.module.impl.combat.furry.AngleUtil;
import trollhack.dev.module.impl.combat.furry.RotationConfig;
import trollhack.dev.module.impl.combat.furry.RotationController;
import trollhack.dev.module.setting.impl.BooleanSetting;
import trollhack.dev.module.setting.impl.NumberSetting;
import trollhack.dev.util.Script.TaskPriority;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.FireworkRocketItem;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.Vec3d;
import static ficality.dev.util.wrapper.Wrapper.mc;
@ModuleInfo(name = "SpearTarget", category = Category.MISC, desc = "Автоматически использует фейерверки для полета за целью с копьем/Capio")
public class SpearTarget extends Function {
private final NumberSetting range = new NumberSetting("Дальность цели", this, 50.0, 10.0, 100.0, 5.0);
private final NumberSetting fireworkDelay = new NumberSetting("Задержка фейерверка", this, 5, 1, 20, 1);
private final BooleanSetting requireSpear = new BooleanSetting("Требовать копье", this, true);
private final BooleanSetting autoTarget = new BooleanSetting("Авто-цель", this, true);
private final BooleanSetting onlyPlayers = new BooleanSetting("Только игроки", this, false);
private final BooleanSetting useFireworks = new BooleanSetting("Использовать фейерверки", this, true);
private final BooleanSetting silentRotation = new BooleanSetting("Тихое вращение", this, true);
private final BooleanSetting autoLaunch = new BooleanSetting("Авто-взлёт", this, true);
private final BooleanSetting capioCharge = new BooleanSetting("Заряд Capio (ПКМ)", this, true);
private static final RotationConfig SILENT_CONFIG = new RotationConfig(false, false);
private LivingEntity target = null;
private int fireworkTimer = 0;
private boolean elytraFlying = false;
private int flyingTicks = 0;
public SpearTarget() {
addSettings(range, fireworkDelay, requireSpear, autoTarget,
onlyPlayers, useFireworks, silentRotation, autoLaunch, capioCharge);
}
@Subscribe
public void onRotationUpdate(RotationUpdateEvent event) {
if (event.getType() != EventType.PRE) return;
if (!silentRotation.getValue()) return;
if (mc.player == null || target == null || !isValidTarget(target)) return;
if (!elytraFlying) return;
Angle targetAngle = AngleUtil.calculateAngle(target.getEyePos());
RotationController.INSTANCE.rotateTo(targetAngle, 1, SILENT_CONFIG, TaskPriority.STANDARD, this);
}
@Subscribe
public void onTick(EventPlayerTick event) {
if (mc.player == null || mc.world == null) return;
if (fireworkTimer > 0) fireworkTimer--;
if (autoTarget.getValue()) findTarget();
boolean hasElytra = hasElytraEquipped();
boolean onGround = mc.player.isOnGround();
Vec3d vel = mc.player.getVelocity();
double horizSpeedSq = vel.x * vel.x + vel.z * vel.z;
if (hasElytra && !onGround) {
flyingTicks++;
elytraFlying = (elytraFlying && flyingTicks > 0) || horizSpeedSq > 0.01;
} else {
elytraFlying = false;
flyingTicks = 0;
}
boolean holdingWeapon = isHoldingSpear();
if (autoLaunch.getValue() && holdingWeapon && hasElytra && !onGround && !elytraFlying) {
if (tryLaunchElytra()) {
elytraFlying = true;
flyingTicks = 1;
}
}
if (capioCharge.getValue() && elytraFlying && isCapioInMainHand()) {
mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND);
}
if (useFireworks.getValue() && elytraFlying && target != null
&& isValidTarget(target) && fireworkTimer <= 0) {
if (requireSpear.getValue() && !holdingWeapon) return;
useFirework();
}
}
private void useFirework() {
if (mc.player.getOffHandStack().getItem() instanceof FireworkRocketItem) {
mc.interactionManager.interactItem(mc.player, Hand.OFF_HAND);
fireworkTimer = fireworkDelay.getValue().intValue();
return;
}
int weaponSlot = mc.player.getInventory().selectedSlot;
int fwSlot = findFireworksSlotExcluding(weaponSlot);
if (fwSlot == -1) return;
mc.player.getInventory().selectedSlot = fwSlot;
mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND);
mc.player.getInventory().selectedSlot = weaponSlot;
fireworkTimer = fireworkDelay.getValue().intValue();
}
private boolean tryLaunchElytra() {
if (mc.player.getOffHandStack().getItem() instanceof FireworkRocketItem) {
mc.interactionManager.interactItem(mc.player, Hand.OFF_HAND);
fireworkTimer = fireworkDelay.getValue().intValue();
return true;
}
int weaponSlot = mc.player.getInventory().selectedSlot;
int fwSlot = findFireworksSlotExcluding(weaponSlot);
if (fwSlot == -1) return false;
mc.player.getInventory().selectedSlot = fwSlot;
mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND);
mc.player.getInventory().selectedSlot = weaponSlot;
fireworkTimer = fireworkDelay.getValue().intValue();
return true;
}
private boolean hasElytraEquipped() {
if (mc.player == null) return false;
return mc.player.getEquippedStack(EquipmentSlot.CHEST).getItem() == Items.ELYTRA;
}
private void findTarget() {
if (mc.player == null || mc.world == null) return;
LivingEntity best = null;
double bestDist = range.getValue();
for (Entity entity : mc.world.getEntities()) {
if (!(entity instanceof LivingEntity living)) continue;
if (entity == mc.player) continue;
if (!isValidTarget(living)) continue;
double d = mc.player.distanceTo(entity);
if (d < bestDist) { bestDist = d; best = living; }
}
target = best;
}
private boolean isValidTarget(LivingEntity entity) {
if (entity == null || entity == mc.player) return false;
if (!entity.isAlive()) return false;
if (entity.distanceTo(mc.player) > range.getValue()) return false;
if (onlyPlayers.getValue() && !(entity instanceof PlayerEntity)) return false;
if (!mc.player.canSee(entity)) return false;
return true;
}
private boolean isHoldingSpear() {
if (mc.player == null) return false;
return isSpearItem(mc.player.getMainHandStack())
|| isSpearItem(mc.player.getOffHandStack());
}
private boolean isCapioInMainHand() {
if (mc.player == null) return false;
return isCapioItem(mc.player.getMainHandStack());
}
private boolean isSpearItem(ItemStack stack) {
if (stack == null || stack.isEmpty()) return false;
if (stack.getItem() == Items.TRIDENT) return true;
return isCapioItem(stack);
}
private boolean isCapioItem(ItemStack stack) {
if (stack == null || stack.isEmpty()) return false;
String name = stack.getItem().toString().toLowerCase();
return name.contains("netherite_spear") || name.contains("netherite_spear");
}
private int findFireworksSlotExcluding(int excludeSlot) {
if (mc.player == null) return -1;
for (int i = 0; i < 9; i++) {
if (i == excludeSlot) continue;
if (mc.player.getInventory().getStack(i).getItem() instanceof FireworkRocketItem)
return i;
}
return -1;
}
public LivingEntity getTarget() { return target; }
@Override
public void onEnable() {
super.onEnable();
target = null;
fireworkTimer = 0;
elytraFlying = false;
flyingTicks = 0;
}
@Override
public void onDisable() {
super.onDisable();
target = null;
fireworkTimer = 0;
elytraFlying = false;
flyingTicks = 0;
RotationController.INSTANCE.clear();
}
}
