Начинающий
- Статус
- Оффлайн
- Регистрация
- 15 Июн 2025
- Сообщения
- 196
- Реакции
- 1
- Выберите загрузчик игры
- Fabric
простая заготовка под ауру на 1.21.4 фабрик
думаю для новичков на фабрике как раз подойдёт
ss не нужен
думаю для новичков на фабрике как раз подойдёт
паста:
public class Aura extends Function {
private final SliderSetting attackRange = new SliderSetting("Дистанция атаки", 3f, 3f, 6.5f, 0.1f);
private final ModeSetting rotationMode = new ModeSetting("Ротация", "Snap", "Snap");
private final ModeListSetting attack = new ModeListSetting("Атака",
new BooleanSetting("Сброс спринта", true),
new BooleanSetting("Только криты", true),
new BooleanSetting("Бить через блоки", false)
);
@Getter private static LivingEntity target;
private Vector2f headVector = new Vector2f(0f, 0f);
private final StopWatch stopWatch = new StopWatch();
private boolean isRotated = false;
private boolean readyToRotate = false;
private float ticks = 0;
public Aura() {
addSettings(attackRange, rotationMode, attack);
}
@Override
public void onEnable() {
target = null;
if (mc.player != null)
headVector.set(mc.player.getPitch(), mc.player.getYaw());
stopWatch.setLastMS(0);
}
@Override
public void onDisable() {
target = null;
if (mc.player != null)
headVector.set(mc.player.getPitch(), mc.player.getYaw());
stopWatch.setLastMS(0);
}
@EventHandler
public void onUpdate(EventUpdate event) {
if (mc.player == null || mc.world == null) return;
updateTarget();
if (target == null) {
reset();
return;
}
isRotated = false;
if (stopWatch.hasTimeElapsed()) {
readyToRotate = true;
ticks = 2.0f;
stopWatch.reset();
}
if (rotationMode.is("Snap") && ticks > 0) {
rotationSnap();
ticks--;
} else {
reset();
}
updateAttack();
}
private void updateTarget() {
target = mc.world.getEntitiesByClass(LivingEntity.class, mc.player.getBoundingBox().expand(attackRange.get()), e -> isValid(e))
.stream().min(Comparator.comparingDouble(e -> mc.player.distanceTo(e))).orElse(null);
}
private boolean isValid(LivingEntity e) {
if (e == mc.player || !e.isAlive() || e.isInvulnerable() || e.age < 3) return false;
double d = mc.player.distanceTo(e);
if (d > attackRange.get()) return false;
if (e instanceof PlayerEntity || e instanceof Monster || e instanceof HostileEntity) {
if (e instanceof PlayerEntity && !attack.getByName("Бить через блоки").get() && !canSee(e)) return false;
return true;
}
return false;
}
private boolean canSee(Entity e) {
return mc.world.raycast(new RaycastContext(mc.player.getEyePos(), e.getEyePos(),
RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, mc.player))
.getType() == BlockHitResult.Type.MISS;
}
private void rotationSnap() {
if (target == null) return;
isRotated = true;
Vec3d vec = target.getEyePos().subtract(mc.player.getEyePos());
float yaw = (float)(Math.toDegrees(Math.atan2(vec.z, vec.x)) - 90f);
float pitch = (float)(-Math.toDegrees(Math.atan2(vec.y, Math.sqrt(vec.x * vec.x + vec.z * vec.z))));
headVector.set(MathHelper.clamp(pitch, -89.5f, 89.5f), MathHelper.wrapDegrees(yaw));
mc.player.setPitch(headVector.x);
mc.player.setYaw(headVector.y);
}
private void updateAttack() {
if (target == null) return;
if (mc.player.getAttackCooldownProgress(0f) < 0.95f) return;
double dist = mc.player.distanceTo(target);
if (dist > attackRange.get()) return;
if (attack.getByName("Только криты").get() && !isFalling) return;
if (attack.getByName("Сброс спринта").get())
mc.player.setSprinting(false);
mc.interactionManager.attackEntity(mc.player, target);
mc.player.swingHand(Hand.MAIN_HAND);
stopWatch.setLastMS(500);
}
private boolean isFalling() {
return mc.player.velocity.y < 0;
}
private void reset() {
if (mc.player != null)
headVector.set(mc.player.getPitch(), mc.player.getYaw());
}
}
ss не нужен