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

Визуальная часть Grid Setting & Swing Animations | Excellent Omni

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
23 Сен 2024
Сообщения
348
Реакции
0
Выберите загрузчик игры
  1. Прочие моды
Всем привет! Сегодня сливаю вам довольно класную штуку для SwingAnimation, а именно сеттинг сетки!
SS: Прикрепил.
Присутствует ЛГБТ (ГПТ) Код, ну да ладна...

Вот сам сетинг:

Setting:
Expand Collapse Copy
package dev.folet.VesencePremium.client.impl.settings.impl;

import com.google.gson.JsonObject;
import lombok.Getter;
import lombok.Setter;
import net.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft;
import dev.folet.common.animation.Animation;
import dev.folet.common.animation.Easings;
import dev.folet.VesencePremium.client.impl.settings.Setting;
import dev.folet.VesencePremium.client.util.color.ColorUtil;
import dev.folet.VesencePremium.client.util.color.theme.Theme;
import dev.folet.VesencePremium.client.util.render.shape.Round;
import dev.folet.VesencePremium.client.util.render.shape.Shape;

import java.time.Duration;
import java.util.function.Supplier;

public class PositionSetting extends Setting<Float> {

    @Getter
    private float x;

    @Getter
    private float y;

    private final float minX;
    private final float maxX;
    private final float minY;
    private final float maxY;

    private final float defaultX;
    private final float defaultY;

    private boolean dragging = false;

    private final Animation animatedX = new Animation()
            .duration(Duration.ofMillis(100))
            .easing(Easings.CUBIC_OUT);

    private final Animation animatedY = new Animation()
            .duration(Duration.ofMillis(100))
            .easing(Easings.CUBIC_OUT);

    private final Animation hoverAnimation = new Animation()
            .duration(Duration.ofMillis(200))
            .easing(Easings.CUBIC_OUT);

    private final Animation dragAnimation = new Animation()
            .duration(Duration.ofMillis(150))
            .easing(Easings.CUBIC_OUT);

    private final Animation resetButtonHover = new Animation()
            .duration(Duration.ofMillis(150))
            .easing(Easings.CUBIC_OUT);

    public PositionSetting(String name, float defaultX, float defaultY) {
        this(name, defaultX, defaultY, -2.5F, 2.5F, -2.0F, 2.0F);
    }

    public PositionSetting(String name, float defaultX, float defaultY, float minX, float maxX, float minY, float maxY) {
        super(name, 0.0F);
        this.x = defaultX;
        this.y = defaultY;
        this.defaultX = defaultX;
        this.defaultY = defaultY;
        this.minX = minX;
        this.maxX = maxX;
        this.minY = minY;
        this.maxY = maxY;

        this.animatedX.set(defaultX);
        this.animatedY.set(defaultY);
    }

    public static PositionSetting of(String name, float defaultX, float defaultY) {
        return new PositionSetting(name, defaultX, defaultY);
    }

    public void setPosition(float x, float y) {
        this.x = clamp(x, minX, maxX);
        this.y = clamp(y, minY, maxY);

        this.animatedX.run(this.x);
        this.animatedY.run(this.y);

        if (onAction() != null) {
            onAction().run();
        }
    }

    public void reset() {
        setPosition(defaultX, defaultY);
    }

    @Override
    public PositionSetting visible(Supplier<Boolean> visible) {
        super.visible(visible);
        return this;
    }

    @Override
    public PositionSetting onAction(Runnable onAction) {
        super.onAction(onAction);
        return this;
    }

    @Override
    public void init() {
        super.init();
        hoverAnimation.run(0F);
        dragAnimation.run(0F);
        resetButtonHover.run(0F);
        animatedX.set(x);
        animatedY.set(y);
    }

    @Override
    public void render(MatrixStack matrix, int mouseX, int mouseY, float partialTicks) {
        super.render(matrix, mouseX, mouseY, partialTicks);
        if (!visible().get()) return;

        hoverAnimation.update();
        dragAnimation.update();
        resetButtonHover.update();
        animatedX.update();
        animatedY.update();

        float controlSize = 80F;
        float gridSize = 70F;
        float circleRadius = 6F;

        float startX = position().x + margin();
        float startY = position().y + padding();

        float nameWidth = font().getWidth(name(), fontSize());
        font().draw(matrix, name(), startX, startY + 2, Theme.DEFAULT.text(alpha()), fontSize());

        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = startY;

        Shape background = new Shape(matrix, controlX, controlY, controlSize, controlSize);
        int bgColor = ColorUtil.getColor(32, 0.5F * alpha());
        int outlineColor = ColorUtil.overCol(
                ColorUtil.getColor(64, 0.5F * alpha()),
                Theme.DEFAULT.accent(0.3F * alpha()),
                hoverAnimation.get()
        );

        background.round(bgColor, Round.of(4));
        background.outline(0.5F, outlineColor, Round.of(4));

        float gridStartX = controlX + (controlSize - gridSize) / 2F;
        float gridStartY = controlY + (controlSize - gridSize) / 2F;

        int gridColor = ColorUtil.getColor(64, 0.3F * alpha());

        for (int i = 0; i <= 4; i++) {
            float lineX = gridStartX + (gridSize / 4F) * i;
            new Shape(matrix, lineX, gridStartY, 0.5F, gridSize)
                    .round(gridColor, Round.zero());
        }

        for (int i = 0; i <= 4; i++) {
            float lineY = gridStartY + (gridSize / 4F) * i;
            new Shape(matrix, gridStartX, lineY, gridSize, 0.5F)
                    .round(gridColor, Round.zero());
        }

        float centerX = gridStartX + gridSize / 2F;
        float centerY = gridStartY + gridSize / 2F;

        new Shape(matrix, centerX - 3, centerY - 0.5F, 6, 1)
                .round(ColorUtil.getColor(200, 0.7F * alpha()), Round.of(0.5F));
        new Shape(matrix, centerX - 0.5F, centerY - 3, 1, 6)
                .round(ColorUtil.getColor(200, 0.7F * alpha()), Round.of(0.5F));

        font().draw(matrix, "0", centerX + 5, centerY - 2, ColorUtil.getColor(200, 0.6F * alpha()), 6F);

        float normalizedX = (animatedX.get() - minX) / (maxX - minX);
        float normalizedY = (animatedY.get() - minY) / (maxY - minY);

        float circleX = gridStartX + normalizedX * gridSize;
        float circleY = gridStartY + (1F - normalizedY) * gridSize;

        int lineColor = ColorUtil.getColor(96, 0.4F * alpha());
        new Shape(matrix, centerX, centerY, circleX - centerX, 0.5F)
                .round(lineColor, Round.zero());
        new Shape(matrix, circleX, centerY, 0.5F, circleY - centerY)
                .round(lineColor, Round.zero());

        float currentRadius = circleRadius + dragAnimation.get() * 2F;
        Shape circle = new Shape(matrix,
                circleX - currentRadius,
                circleY - currentRadius,
                currentRadius * 2,
                currentRadius * 2
        );

        int circleColor = ColorUtil.overCol(
                Theme.DEFAULT.accent(0.7F * alpha()),
                Theme.DEFAULT.accent(1.0F * alpha()),
                dragAnimation.get()
        );

        circle.round(circleColor, Round.of(currentRadius));
        circle.outline(1F, Theme.DEFAULT.accent(alpha()), Round.of(currentRadius - 0.5F));

        String valueText = String.format("X: %.2f Y: %.2f", x, y);
        float textWidth = font().getWidth(valueText, 6F);
        font().draw(matrix, valueText,
                controlX + (controlSize - textWidth) / 2F,
                controlY + controlSize + 4,
                Theme.DEFAULT.text(0.7F * alpha()),
                6F
        );

        height(padding() + controlSize + 12 + padding());
    }

    @Override
    public boolean mouseClicked(double mouseX, double mouseY, int button) {
        if (!visible().get()) return false;

        float controlSize = 80F;
        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        if (isHover(mouseX, mouseY, controlX, controlY, controlSize, controlSize)) {
            if (isLClick(button)) {
                dragging = true;
                dragAnimation.run(1F);
                updatePositionFromMouse(mouseX, mouseY);
                return true;
            }
        }

        return super.mouseClicked(mouseX, mouseY, button);
    }

    @Override
    public boolean mouseReleased(double mouseX, double mouseY, int button) {
        if (dragging && isLClick(button)) {
            dragging = false;
            dragAnimation.run(0F);
            return true;
        }
        return super.mouseReleased(mouseX, mouseY, button);
    }

    @Override
    public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) {
        if (dragging) {
            updatePositionFromMouse(mouseX, mouseY);
            return true;
        }
        return super.mouseDragged(mouseX, mouseY, button, dragX, dragY);
    }

    @Override
    public void mouseMoved(double mouseX, double mouseY) {
        super.mouseMoved(mouseX, mouseY);

        if (!visible().get()) return;

        float controlSize = 80F;
        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        boolean hover = isHover(mouseX, mouseY, controlX, controlY, controlSize, controlSize);
        hoverAnimation.run(hover ? 1F : 0F);
    }

    private void updatePositionFromMouse(double mouseX, double mouseY) {
        float controlSize = 80F;
        float gridSize = 70F;

        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        float gridStartX = controlX + (controlSize - gridSize) / 2F;
        float gridStartY = controlY + (controlSize - gridSize) / 2F;

        float relativeX = (float) (mouseX - gridStartX);
        float relativeY = (float) (mouseY - gridStartY);

        relativeX = clamp(relativeX, 0, gridSize);
        relativeY = clamp(relativeY, 0, gridSize);

        float normalizedX = relativeX / gridSize;
        float normalizedY = 1F - (relativeY / gridSize);
        float newX = minX + normalizedX * (maxX - minX);
        float newY = minY + normalizedY * (maxY - minY);

        setPosition(newX, newY);
    }

    private float clamp(float value, float min, float max) {
        return Math.max(min, Math.min(max, value));
    }

    @Override
    public void save(JsonObject object) {
        JsonObject positionObject = new JsonObject();
        positionObject.addProperty("x", x);
        positionObject.addProperty("y", y);
        object.add(name(), positionObject);
    }

    @Override
    public void load(JsonObject object) {
        if (object.has(name())) {
            JsonObject positionObject = object.getAsJsonObject(name());
            if (positionObject.has("x") && positionObject.has("y")) {
                this.x = positionObject.get("x").getAsFloat();
                this.y = positionObject.get("y").getAsFloat();
            }
        }
    }
}
А вот сам код Swing Animation:

Swings:
Expand Collapse Copy
package dev.folet.VesencePremium.client.impl.feature.impl.render;

import lombok.Getter;
import lombok.experimental.Accessors;
import net.blaze3d.matrix.MatrixStack;
import net.minecraft.util.HandSide;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Quaternion;
import net.minecraft.util.math.vector.Vector3f;
import dev.folet.common.animation.Animation;
import dev.folet.common.animation.Easings;
import dev.folet.common.animation.OldAnimation;
import dev.folet.common.events.orbit.EventHandler;
import dev.folet.VesencePremium.client.Client;
import dev.folet.VesencePremium.client.events.render.RenderItemEvent;
import dev.folet.VesencePremium.client.impl.feature.Category;
import dev.folet.VesencePremium.client.impl.feature.Feature;
import dev.folet.VesencePremium.client.impl.feature.FeatureInfo;
import dev.folet.VesencePremium.client.impl.feature.impl.combat.AttackAura;
import dev.folet.VesencePremium.client.impl.settings.impl.BooleanSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.ModeSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.SliderSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.PositionSetting;
import dev.folet.VesencePremium.client.util.math.StopWatch;
import dev.folet.VesencePremium.client.util.other.Instance;


@Getter
@Accessors(fluent = true)
@FeatureInfo(name = "SwingAnimations", description = "Изменяет-улучшает анимации и расположение ваших рук от первого лица", category = Category.RENDER)
public class SwingAnimations extends Feature {

    private final ModeSetting mode = new ModeSetting("Режим", "Стандарт", "Взмах", "Взмах 2", "Сдвиг", "Ломание", "Выпад", "Копьё", "Вниз", "Желе", "Тряска").set("Взмах");
    private final BooleanSetting translate = new BooleanSetting("Перемещение по экрану", false);
    private final BooleanSetting attackAuraOnly = new BooleanSetting("Только с киллкой", false);
    private final BooleanSetting attackAuraOffsetsOnly = new BooleanSetting("Оффсеты только с киллкой", false).visible(translate::get);

    private final PositionSetting rightHandPosition = new PositionSetting("Позиция правой руки", -45, 0.0F).visible(translate::get);
    private final SliderSetting rightOffsetZ = new SliderSetting("Правая рука Z", 0.0F, -1.5F, 0.0f, 0.05F).visible(translate::get);
    private final PositionSetting leftHandPosition = new PositionSetting("Позиция левой руки", 0.0F, 0.0F).visible(translate::get);
    private final SliderSetting leftOffsetZ = new SliderSetting("Левая рука Z", 0.0F, -1.5F, 0.0F, 0.05F).visible(translate::get);
    private final SliderSetting offsetX = new SliderSetting("Оффсет X", 0.0F, 0.0F, 1.25F, 0.05F).visible(() -> false);
    private final SliderSetting offsetY = new SliderSetting("Оффсет Y", 0.0F, -0.7F, 1.25F, 0.05F).visible(() -> false);
    private final SliderSetting offsetZ = new SliderSetting("Оффсет Z", 0.0F, -1.5F, 0.0F, 0.05F).visible(() -> false);

    private final SliderSetting turn = new SliderSetting("Поворот", 0.0F, -7.5f, 35F, 0.1F).visible(() -> !mode.is("Взмах") && !mode.is("Взмах 2") && !mode.is("Желе") && !mode.is("Тряска") && !mode.is("Вниз") && !mode.is("Копьё") && !mode.is("Выпад"));
    private final SliderSetting speed = new SliderSetting("Скорость", 7.0F, 1F, 10F, 0.5F).visible(() -> !mode.is("Тряска") && !mode.is("Стандарт"));
    private final BooleanSetting strengthInclineSetting = new BooleanSetting("Сила наклона", false).visible(() ->  !mode.is("Вниз"));
    private final SliderSetting strengthIncline = new SliderSetting("Сила наклона", 20.0F, 20.0F, 75.0F, 0.1F).visible(() -> strengthInclineSetting.get() && !mode.is("Вниз"));

    private final BooleanSetting item360 = new BooleanSetting("Айтем 360", false).visible(() -> !mode.is("Взмах"));

    @EventHandler
    public void onRenderItem(RenderItemEvent event) {
        if (event.getItemStack().isEmpty()) {
            return;
        }

        boolean rightHand = event.getHandSide().equals(HandSide.RIGHT);
        MatrixStack matrix = event.getMatrix();

        if (auraCheckOffsets()) {
            if (translate.get()) {
                if (rightHand) {
                    matrix.translate(
                            rightHandPosition.getX(),
                            rightHandPosition.getY(),
                            rightOffsetZ.get()
                    );
                } else {
                    matrix.translate(
                            leftHandPosition.getX(),
                            leftHandPosition.getY(),
                            leftOffsetZ.get()
                    );
                }
            }
        }

        if (item360.get()) {
            long currentTime = System.currentTimeMillis();
            float angle = (currentTime % 3600) / 10.0f;

            matrix.translate(0.0, 0.0, 0.0);
            matrix.rotate(Vector3f.YP.rotationDegrees(angle));
            matrix.translate(0, 0, 0);
        }
    }

    @EventHandler
    public void onArmSwingAnimation(ArmSwingAnimationEvent event) {
        float animationSpeed = this.speed.max() - this.speed.get() + this.speed.min();
        if (!mode.is("Тряска") && !mode.is("Стандарт")) {
            event.setAnimationSpeed(animationSpeed * 2F);
        } else {
            event.setAnimationSpeed(7);
        }
    }

    public void animationProcess(MatrixStack stack, int handOffset, float swingProgress, float partialTicks) {
        float anim = (float) Math.sin(swingProgress * (Math.PI / 2) * 2);

        if (translate.get() && auraCheckOffsets()) {
            boolean isRightHand = handOffset > 0;
            if (isRightHand) {
                stack.translate(rightHandPosition.getX(), rightHandPosition.getY(), rightOffsetZ.get());
            } else {
                stack.translate(-leftHandPosition.getX(), leftHandPosition.getY(), leftOffsetZ.get());
            }
        }

        if (mode.is("Взмах")) {
        } else if (mode.is("Взмах 2")) {
            stack.translate(0.55f, -0.5f, -(0.7F + (anim * 0.002)));
            stack.scale(1, 1, anim + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90 * anim * (strengthIncline.get() * .015F)));

        } else if (mode.is("Сдвиг")) {
            stack.translate(handOffset * 0.75f, -0.35f, -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 90));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * -60));
            stack.rotate(Vector3f.XP.rotationDegrees(-90 - strengthIncline.get() * anim + turn.get()));
        } else if (mode.is("Ломание")) {
            stack.translate(handOffset * 0.75f, -0.35f, -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 90));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * -30));
            stack.rotate(Vector3f.XP.rotationDegrees(-90 - strengthIncline.get() * anim + turn.get()));
        } else if (mode.is("Выпад")) {
            float f = MathHelper.sin(swingProgress * (MathHelper.PI / 2.0f) * 2.0f);
            float f2 = strengthIncline.get() * 2.5F;
            float f4 = f2 / 10.0f / 10.0f * 40.0f;
            stack.translate(handOffset * 1.35f, -0.55f, -1.3F);
            stack.translate(0, -0, 0);

            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 45.0f));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * f * -(f4 / 2.0f)));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * f * -(f4 / 2.0f)));
            stack.rotate(Vector3f.XP.rotationDegrees(handOffset * f * -f4));
            stack.translate((handOffset * -0.5f), 0.2f, -0.3);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 30));
            stack.rotate(Vector3f.XP.rotationDegrees(handOffset * -80));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 60));
        } else if (mode.is("Копьё")) {
            stack.translate(0.75f, -0.45f, -(1 + anim * 0.2));
            stack.scale(1, 1, (anim * (strengthIncline.get() * .03F)) + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90));
        } else if (mode.is("Вниз")) {
            stack.translate((handOffset * 0.75F - anim * 0.5F), -(0.35F - anim * 0.25F), -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 65));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset));
            stack.rotate(Vector3f.XP.rotationDegrees(-110 - 20 * 4 * anim));
        } else if (mode.is("Желе")) {
            stack.translate(0.75f, -0.45f, -(1 + anim * 0.2));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 35));
            stack.scale(1, 1, (anim * (swingProgress * .65F * (strengthIncline.get() * .0175F))) + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90));
        } else if (mode.is("Тряска")) {
            float fapAnim = (1.F - getFapUpdatedAnimation(mc.player.isSwingInProgress) / 75.F * strengthIncline.get() * 4);
            stack.translate(0.76f, -0.35f, -1);
            stack.rotate(new Quaternion(new Vector3f(0, 1, 0), 110 + fapAnim * 15F, true));
            stack.rotate(new Quaternion(new Vector3f(1, 0, 0), -110 , true));
            stack.rotate(new Quaternion(new Vector3f(0, 1, 0), 75, true));
            stack.rotate(new Quaternion(new Vector3f(1, 0, 0), 35 + fapAnim * 15F, true));
        }

        if (item360.get()) {
            long currentTime = System.currentTimeMillis();
            float angle = (currentTime % 3600) / 10.0f;
            stack.translate(0, 0, 0);
            stack.rotate(Vector3f.XN.rotationDegrees(angle));
            stack.translate(-0, -0, -0);
        }
    }

    public boolean auraCheck() {
        AttackAura aura = Client.inst().featureManager().attackAura;
        return !attackAuraOnly.get() || auraValid(aura);
    }

    public boolean auraCheckOffsets() {
        AttackAura aura = Client.inst().featureManager().attackAura;
        return !attackAuraOffsetsOnly.get() || auraValid(aura);
    }

    private boolean auraValid(AttackAura aura) {
        return aura.enabled() && aura.currentTarget() != null;
    }

    private OldAnimation fapAnim = new OldAnimation();
    private StopWatch timerSwinging = new StopWatch();

    public float getFapUpdatedAnimation(boolean swinging) {
        if (!swinging) timerSwinging.reset();
        fapAnim.update();
        int delayWave = 215;
        int point1 = timerSwinging.elapsedTime() % delayWave >= delayWave / 2.F ? 0 : 1;
        fapAnim.run(swinging ? point1 : 0.F, .2F);
        fapAnim.setEasing(Easings.QUINT_OUT);
        return fapAnim.get();
    }
}
Надеюсь вам зайдёт! Модеры одобрите паже
 

Вложения

  • 1769975164904.png
    1769975164904.png
    39.2 KB · Просмотры: 286
Всем привет! Сегодня сливаю вам довольно класную штуку для SwingAnimation, а именно сеттинг сетки!
SS: Прикрепил.
Присутствует ЛГБТ (ГПТ) Код, ну да ладна...

Вот сам сетинг:

Setting:
Expand Collapse Copy
package dev.folet.VesencePremium.client.impl.settings.impl;

import com.google.gson.JsonObject;
import lombok.Getter;
import lombok.Setter;
import net.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft;
import dev.folet.common.animation.Animation;
import dev.folet.common.animation.Easings;
import dev.folet.VesencePremium.client.impl.settings.Setting;
import dev.folet.VesencePremium.client.util.color.ColorUtil;
import dev.folet.VesencePremium.client.util.color.theme.Theme;
import dev.folet.VesencePremium.client.util.render.shape.Round;
import dev.folet.VesencePremium.client.util.render.shape.Shape;

import java.time.Duration;
import java.util.function.Supplier;

public class PositionSetting extends Setting<Float> {

    @Getter
    private float x;

    @Getter
    private float y;

    private final float minX;
    private final float maxX;
    private final float minY;
    private final float maxY;

    private final float defaultX;
    private final float defaultY;

    private boolean dragging = false;

    private final Animation animatedX = new Animation()
            .duration(Duration.ofMillis(100))
            .easing(Easings.CUBIC_OUT);

    private final Animation animatedY = new Animation()
            .duration(Duration.ofMillis(100))
            .easing(Easings.CUBIC_OUT);

    private final Animation hoverAnimation = new Animation()
            .duration(Duration.ofMillis(200))
            .easing(Easings.CUBIC_OUT);

    private final Animation dragAnimation = new Animation()
            .duration(Duration.ofMillis(150))
            .easing(Easings.CUBIC_OUT);

    private final Animation resetButtonHover = new Animation()
            .duration(Duration.ofMillis(150))
            .easing(Easings.CUBIC_OUT);

    public PositionSetting(String name, float defaultX, float defaultY) {
        this(name, defaultX, defaultY, -2.5F, 2.5F, -2.0F, 2.0F);
    }

    public PositionSetting(String name, float defaultX, float defaultY, float minX, float maxX, float minY, float maxY) {
        super(name, 0.0F);
        this.x = defaultX;
        this.y = defaultY;
        this.defaultX = defaultX;
        this.defaultY = defaultY;
        this.minX = minX;
        this.maxX = maxX;
        this.minY = minY;
        this.maxY = maxY;

        this.animatedX.set(defaultX);
        this.animatedY.set(defaultY);
    }

    public static PositionSetting of(String name, float defaultX, float defaultY) {
        return new PositionSetting(name, defaultX, defaultY);
    }

    public void setPosition(float x, float y) {
        this.x = clamp(x, minX, maxX);
        this.y = clamp(y, minY, maxY);

        this.animatedX.run(this.x);
        this.animatedY.run(this.y);

        if (onAction() != null) {
            onAction().run();
        }
    }

    public void reset() {
        setPosition(defaultX, defaultY);
    }

    @Override
    public PositionSetting visible(Supplier<Boolean> visible) {
        super.visible(visible);
        return this;
    }

    @Override
    public PositionSetting onAction(Runnable onAction) {
        super.onAction(onAction);
        return this;
    }

    @Override
    public void init() {
        super.init();
        hoverAnimation.run(0F);
        dragAnimation.run(0F);
        resetButtonHover.run(0F);
        animatedX.set(x);
        animatedY.set(y);
    }

    @Override
    public void render(MatrixStack matrix, int mouseX, int mouseY, float partialTicks) {
        super.render(matrix, mouseX, mouseY, partialTicks);
        if (!visible().get()) return;

        hoverAnimation.update();
        dragAnimation.update();
        resetButtonHover.update();
        animatedX.update();
        animatedY.update();

        float controlSize = 80F;
        float gridSize = 70F;
        float circleRadius = 6F;

        float startX = position().x + margin();
        float startY = position().y + padding();

        float nameWidth = font().getWidth(name(), fontSize());
        font().draw(matrix, name(), startX, startY + 2, Theme.DEFAULT.text(alpha()), fontSize());

        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = startY;

        Shape background = new Shape(matrix, controlX, controlY, controlSize, controlSize);
        int bgColor = ColorUtil.getColor(32, 0.5F * alpha());
        int outlineColor = ColorUtil.overCol(
                ColorUtil.getColor(64, 0.5F * alpha()),
                Theme.DEFAULT.accent(0.3F * alpha()),
                hoverAnimation.get()
        );

        background.round(bgColor, Round.of(4));
        background.outline(0.5F, outlineColor, Round.of(4));

        float gridStartX = controlX + (controlSize - gridSize) / 2F;
        float gridStartY = controlY + (controlSize - gridSize) / 2F;

        int gridColor = ColorUtil.getColor(64, 0.3F * alpha());

        for (int i = 0; i <= 4; i++) {
            float lineX = gridStartX + (gridSize / 4F) * i;
            new Shape(matrix, lineX, gridStartY, 0.5F, gridSize)
                    .round(gridColor, Round.zero());
        }

        for (int i = 0; i <= 4; i++) {
            float lineY = gridStartY + (gridSize / 4F) * i;
            new Shape(matrix, gridStartX, lineY, gridSize, 0.5F)
                    .round(gridColor, Round.zero());
        }

        float centerX = gridStartX + gridSize / 2F;
        float centerY = gridStartY + gridSize / 2F;

        new Shape(matrix, centerX - 3, centerY - 0.5F, 6, 1)
                .round(ColorUtil.getColor(200, 0.7F * alpha()), Round.of(0.5F));
        new Shape(matrix, centerX - 0.5F, centerY - 3, 1, 6)
                .round(ColorUtil.getColor(200, 0.7F * alpha()), Round.of(0.5F));

        font().draw(matrix, "0", centerX + 5, centerY - 2, ColorUtil.getColor(200, 0.6F * alpha()), 6F);

        float normalizedX = (animatedX.get() - minX) / (maxX - minX);
        float normalizedY = (animatedY.get() - minY) / (maxY - minY);

        float circleX = gridStartX + normalizedX * gridSize;
        float circleY = gridStartY + (1F - normalizedY) * gridSize;

        int lineColor = ColorUtil.getColor(96, 0.4F * alpha());
        new Shape(matrix, centerX, centerY, circleX - centerX, 0.5F)
                .round(lineColor, Round.zero());
        new Shape(matrix, circleX, centerY, 0.5F, circleY - centerY)
                .round(lineColor, Round.zero());

        float currentRadius = circleRadius + dragAnimation.get() * 2F;
        Shape circle = new Shape(matrix,
                circleX - currentRadius,
                circleY - currentRadius,
                currentRadius * 2,
                currentRadius * 2
        );

        int circleColor = ColorUtil.overCol(
                Theme.DEFAULT.accent(0.7F * alpha()),
                Theme.DEFAULT.accent(1.0F * alpha()),
                dragAnimation.get()
        );

        circle.round(circleColor, Round.of(currentRadius));
        circle.outline(1F, Theme.DEFAULT.accent(alpha()), Round.of(currentRadius - 0.5F));

        String valueText = String.format("X: %.2f Y: %.2f", x, y);
        float textWidth = font().getWidth(valueText, 6F);
        font().draw(matrix, valueText,
                controlX + (controlSize - textWidth) / 2F,
                controlY + controlSize + 4,
                Theme.DEFAULT.text(0.7F * alpha()),
                6F
        );

        height(padding() + controlSize + 12 + padding());
    }

    @Override
    public boolean mouseClicked(double mouseX, double mouseY, int button) {
        if (!visible().get()) return false;

        float controlSize = 80F;
        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        if (isHover(mouseX, mouseY, controlX, controlY, controlSize, controlSize)) {
            if (isLClick(button)) {
                dragging = true;
                dragAnimation.run(1F);
                updatePositionFromMouse(mouseX, mouseY);
                return true;
            }
        }

        return super.mouseClicked(mouseX, mouseY, button);
    }

    @Override
    public boolean mouseReleased(double mouseX, double mouseY, int button) {
        if (dragging && isLClick(button)) {
            dragging = false;
            dragAnimation.run(0F);
            return true;
        }
        return super.mouseReleased(mouseX, mouseY, button);
    }

    @Override
    public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) {
        if (dragging) {
            updatePositionFromMouse(mouseX, mouseY);
            return true;
        }
        return super.mouseDragged(mouseX, mouseY, button, dragX, dragY);
    }

    @Override
    public void mouseMoved(double mouseX, double mouseY) {
        super.mouseMoved(mouseX, mouseY);

        if (!visible().get()) return;

        float controlSize = 80F;
        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        boolean hover = isHover(mouseX, mouseY, controlX, controlY, controlSize, controlSize);
        hoverAnimation.run(hover ? 1F : 0F);
    }

    private void updatePositionFromMouse(double mouseX, double mouseY) {
        float controlSize = 80F;
        float gridSize = 70F;

        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        float gridStartX = controlX + (controlSize - gridSize) / 2F;
        float gridStartY = controlY + (controlSize - gridSize) / 2F;

        float relativeX = (float) (mouseX - gridStartX);
        float relativeY = (float) (mouseY - gridStartY);

        relativeX = clamp(relativeX, 0, gridSize);
        relativeY = clamp(relativeY, 0, gridSize);

        float normalizedX = relativeX / gridSize;
        float normalizedY = 1F - (relativeY / gridSize);
        float newX = minX + normalizedX * (maxX - minX);
        float newY = minY + normalizedY * (maxY - minY);

        setPosition(newX, newY);
    }

    private float clamp(float value, float min, float max) {
        return Math.max(min, Math.min(max, value));
    }

    @Override
    public void save(JsonObject object) {
        JsonObject positionObject = new JsonObject();
        positionObject.addProperty("x", x);
        positionObject.addProperty("y", y);
        object.add(name(), positionObject);
    }

    @Override
    public void load(JsonObject object) {
        if (object.has(name())) {
            JsonObject positionObject = object.getAsJsonObject(name());
            if (positionObject.has("x") && positionObject.has("y")) {
                this.x = positionObject.get("x").getAsFloat();
                this.y = positionObject.get("y").getAsFloat();
            }
        }
    }
}
А вот сам код Swing Animation:

Swings:
Expand Collapse Copy
package dev.folet.VesencePremium.client.impl.feature.impl.render;

import lombok.Getter;
import lombok.experimental.Accessors;
import net.blaze3d.matrix.MatrixStack;
import net.minecraft.util.HandSide;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Quaternion;
import net.minecraft.util.math.vector.Vector3f;
import dev.folet.common.animation.Animation;
import dev.folet.common.animation.Easings;
import dev.folet.common.animation.OldAnimation;
import dev.folet.common.events.orbit.EventHandler;
import dev.folet.VesencePremium.client.Client;
import dev.folet.VesencePremium.client.events.render.RenderItemEvent;
import dev.folet.VesencePremium.client.impl.feature.Category;
import dev.folet.VesencePremium.client.impl.feature.Feature;
import dev.folet.VesencePremium.client.impl.feature.FeatureInfo;
import dev.folet.VesencePremium.client.impl.feature.impl.combat.AttackAura;
import dev.folet.VesencePremium.client.impl.settings.impl.BooleanSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.ModeSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.SliderSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.PositionSetting;
import dev.folet.VesencePremium.client.util.math.StopWatch;
import dev.folet.VesencePremium.client.util.other.Instance;


@Getter
@Accessors(fluent = true)
@FeatureInfo(name = "SwingAnimations", description = "Изменяет-улучшает анимации и расположение ваших рук от первого лица", category = Category.RENDER)
public class SwingAnimations extends Feature {

    private final ModeSetting mode = new ModeSetting("Режим", "Стандарт", "Взмах", "Взмах 2", "Сдвиг", "Ломание", "Выпад", "Копьё", "Вниз", "Желе", "Тряска").set("Взмах");
    private final BooleanSetting translate = new BooleanSetting("Перемещение по экрану", false);
    private final BooleanSetting attackAuraOnly = new BooleanSetting("Только с киллкой", false);
    private final BooleanSetting attackAuraOffsetsOnly = new BooleanSetting("Оффсеты только с киллкой", false).visible(translate::get);

    private final PositionSetting rightHandPosition = new PositionSetting("Позиция правой руки", -45, 0.0F).visible(translate::get);
    private final SliderSetting rightOffsetZ = new SliderSetting("Правая рука Z", 0.0F, -1.5F, 0.0f, 0.05F).visible(translate::get);
    private final PositionSetting leftHandPosition = new PositionSetting("Позиция левой руки", 0.0F, 0.0F).visible(translate::get);
    private final SliderSetting leftOffsetZ = new SliderSetting("Левая рука Z", 0.0F, -1.5F, 0.0F, 0.05F).visible(translate::get);
    private final SliderSetting offsetX = new SliderSetting("Оффсет X", 0.0F, 0.0F, 1.25F, 0.05F).visible(() -> false);
    private final SliderSetting offsetY = new SliderSetting("Оффсет Y", 0.0F, -0.7F, 1.25F, 0.05F).visible(() -> false);
    private final SliderSetting offsetZ = new SliderSetting("Оффсет Z", 0.0F, -1.5F, 0.0F, 0.05F).visible(() -> false);

    private final SliderSetting turn = new SliderSetting("Поворот", 0.0F, -7.5f, 35F, 0.1F).visible(() -> !mode.is("Взмах") && !mode.is("Взмах 2") && !mode.is("Желе") && !mode.is("Тряска") && !mode.is("Вниз") && !mode.is("Копьё") && !mode.is("Выпад"));
    private final SliderSetting speed = new SliderSetting("Скорость", 7.0F, 1F, 10F, 0.5F).visible(() -> !mode.is("Тряска") && !mode.is("Стандарт"));
    private final BooleanSetting strengthInclineSetting = new BooleanSetting("Сила наклона", false).visible(() ->  !mode.is("Вниз"));
    private final SliderSetting strengthIncline = new SliderSetting("Сила наклона", 20.0F, 20.0F, 75.0F, 0.1F).visible(() -> strengthInclineSetting.get() && !mode.is("Вниз"));

    private final BooleanSetting item360 = new BooleanSetting("Айтем 360", false).visible(() -> !mode.is("Взмах"));

    @EventHandler
    public void onRenderItem(RenderItemEvent event) {
        if (event.getItemStack().isEmpty()) {
            return;
        }

        boolean rightHand = event.getHandSide().equals(HandSide.RIGHT);
        MatrixStack matrix = event.getMatrix();

        if (auraCheckOffsets()) {
            if (translate.get()) {
                if (rightHand) {
                    matrix.translate(
                            rightHandPosition.getX(),
                            rightHandPosition.getY(),
                            rightOffsetZ.get()
                    );
                } else {
                    matrix.translate(
                            leftHandPosition.getX(),
                            leftHandPosition.getY(),
                            leftOffsetZ.get()
                    );
                }
            }
        }

        if (item360.get()) {
            long currentTime = System.currentTimeMillis();
            float angle = (currentTime % 3600) / 10.0f;

            matrix.translate(0.0, 0.0, 0.0);
            matrix.rotate(Vector3f.YP.rotationDegrees(angle));
            matrix.translate(0, 0, 0);
        }
    }

    @EventHandler
    public void onArmSwingAnimation(ArmSwingAnimationEvent event) {
        float animationSpeed = this.speed.max() - this.speed.get() + this.speed.min();
        if (!mode.is("Тряска") && !mode.is("Стандарт")) {
            event.setAnimationSpeed(animationSpeed * 2F);
        } else {
            event.setAnimationSpeed(7);
        }
    }

    public void animationProcess(MatrixStack stack, int handOffset, float swingProgress, float partialTicks) {
        float anim = (float) Math.sin(swingProgress * (Math.PI / 2) * 2);

        if (translate.get() && auraCheckOffsets()) {
            boolean isRightHand = handOffset > 0;
            if (isRightHand) {
                stack.translate(rightHandPosition.getX(), rightHandPosition.getY(), rightOffsetZ.get());
            } else {
                stack.translate(-leftHandPosition.getX(), leftHandPosition.getY(), leftOffsetZ.get());
            }
        }

        if (mode.is("Взмах")) {
        } else if (mode.is("Взмах 2")) {
            stack.translate(0.55f, -0.5f, -(0.7F + (anim * 0.002)));
            stack.scale(1, 1, anim + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90 * anim * (strengthIncline.get() * .015F)));

        } else if (mode.is("Сдвиг")) {
            stack.translate(handOffset * 0.75f, -0.35f, -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 90));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * -60));
            stack.rotate(Vector3f.XP.rotationDegrees(-90 - strengthIncline.get() * anim + turn.get()));
        } else if (mode.is("Ломание")) {
            stack.translate(handOffset * 0.75f, -0.35f, -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 90));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * -30));
            stack.rotate(Vector3f.XP.rotationDegrees(-90 - strengthIncline.get() * anim + turn.get()));
        } else if (mode.is("Выпад")) {
            float f = MathHelper.sin(swingProgress * (MathHelper.PI / 2.0f) * 2.0f);
            float f2 = strengthIncline.get() * 2.5F;
            float f4 = f2 / 10.0f / 10.0f * 40.0f;
            stack.translate(handOffset * 1.35f, -0.55f, -1.3F);
            stack.translate(0, -0, 0);

            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 45.0f));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * f * -(f4 / 2.0f)));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * f * -(f4 / 2.0f)));
            stack.rotate(Vector3f.XP.rotationDegrees(handOffset * f * -f4));
            stack.translate((handOffset * -0.5f), 0.2f, -0.3);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 30));
            stack.rotate(Vector3f.XP.rotationDegrees(handOffset * -80));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 60));
        } else if (mode.is("Копьё")) {
            stack.translate(0.75f, -0.45f, -(1 + anim * 0.2));
            stack.scale(1, 1, (anim * (strengthIncline.get() * .03F)) + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90));
        } else if (mode.is("Вниз")) {
            stack.translate((handOffset * 0.75F - anim * 0.5F), -(0.35F - anim * 0.25F), -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 65));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset));
            stack.rotate(Vector3f.XP.rotationDegrees(-110 - 20 * 4 * anim));
        } else if (mode.is("Желе")) {
            stack.translate(0.75f, -0.45f, -(1 + anim * 0.2));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 35));
            stack.scale(1, 1, (anim * (swingProgress * .65F * (strengthIncline.get() * .0175F))) + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90));
        } else if (mode.is("Тряска")) {
            float fapAnim = (1.F - getFapUpdatedAnimation(mc.player.isSwingInProgress) / 75.F * strengthIncline.get() * 4);
            stack.translate(0.76f, -0.35f, -1);
            stack.rotate(new Quaternion(new Vector3f(0, 1, 0), 110 + fapAnim * 15F, true));
            stack.rotate(new Quaternion(new Vector3f(1, 0, 0), -110 , true));
            stack.rotate(new Quaternion(new Vector3f(0, 1, 0), 75, true));
            stack.rotate(new Quaternion(new Vector3f(1, 0, 0), 35 + fapAnim * 15F, true));
        }

        if (item360.get()) {
            long currentTime = System.currentTimeMillis();
            float angle = (currentTime % 3600) / 10.0f;
            stack.translate(0, 0, 0);
            stack.rotate(Vector3f.XN.rotationDegrees(angle));
            stack.translate(-0, -0, -0);
        }
    }

    public boolean auraCheck() {
        AttackAura aura = Client.inst().featureManager().attackAura;
        return !attackAuraOnly.get() || auraValid(aura);
    }

    public boolean auraCheckOffsets() {
        AttackAura aura = Client.inst().featureManager().attackAura;
        return !attackAuraOffsetsOnly.get() || auraValid(aura);
    }

    private boolean auraValid(AttackAura aura) {
        return aura.enabled() && aura.currentTarget() != null;
    }

    private OldAnimation fapAnim = new OldAnimation();
    private StopWatch timerSwinging = new StopWatch();

    public float getFapUpdatedAnimation(boolean swinging) {
        if (!swinging) timerSwinging.reset();
        fapAnim.update();
        int delayWave = 215;
        int point1 = timerSwinging.elapsedTime() % delayWave >= delayWave / 2.F ? 0 : 1;
        fapAnim.run(swinging ? point1 : 0.F, .2F);
        fapAnim.setEasing(Easings.QUINT_OUT);
        return fapAnim.get();
    }
}
Надеюсь вам зайдёт! Модеры одобрите паже
ну прикольна, мне нрав
 
Всем привет! Сегодня сливаю вам довольно класную штуку для SwingAnimation, а именно сеттинг сетки!
SS: Прикрепил.
Присутствует ЛГБТ (ГПТ) Код, ну да ладна...

Вот сам сетинг:

Setting:
Expand Collapse Copy
package dev.folet.VesencePremium.client.impl.settings.impl;

import com.google.gson.JsonObject;
import lombok.Getter;
import lombok.Setter;
import net.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft;
import dev.folet.common.animation.Animation;
import dev.folet.common.animation.Easings;
import dev.folet.VesencePremium.client.impl.settings.Setting;
import dev.folet.VesencePremium.client.util.color.ColorUtil;
import dev.folet.VesencePremium.client.util.color.theme.Theme;
import dev.folet.VesencePremium.client.util.render.shape.Round;
import dev.folet.VesencePremium.client.util.render.shape.Shape;

import java.time.Duration;
import java.util.function.Supplier;

public class PositionSetting extends Setting<Float> {

    @Getter
    private float x;

    @Getter
    private float y;

    private final float minX;
    private final float maxX;
    private final float minY;
    private final float maxY;

    private final float defaultX;
    private final float defaultY;

    private boolean dragging = false;

    private final Animation animatedX = new Animation()
            .duration(Duration.ofMillis(100))
            .easing(Easings.CUBIC_OUT);

    private final Animation animatedY = new Animation()
            .duration(Duration.ofMillis(100))
            .easing(Easings.CUBIC_OUT);

    private final Animation hoverAnimation = new Animation()
            .duration(Duration.ofMillis(200))
            .easing(Easings.CUBIC_OUT);

    private final Animation dragAnimation = new Animation()
            .duration(Duration.ofMillis(150))
            .easing(Easings.CUBIC_OUT);

    private final Animation resetButtonHover = new Animation()
            .duration(Duration.ofMillis(150))
            .easing(Easings.CUBIC_OUT);

    public PositionSetting(String name, float defaultX, float defaultY) {
        this(name, defaultX, defaultY, -2.5F, 2.5F, -2.0F, 2.0F);
    }

    public PositionSetting(String name, float defaultX, float defaultY, float minX, float maxX, float minY, float maxY) {
        super(name, 0.0F);
        this.x = defaultX;
        this.y = defaultY;
        this.defaultX = defaultX;
        this.defaultY = defaultY;
        this.minX = minX;
        this.maxX = maxX;
        this.minY = minY;
        this.maxY = maxY;

        this.animatedX.set(defaultX);
        this.animatedY.set(defaultY);
    }

    public static PositionSetting of(String name, float defaultX, float defaultY) {
        return new PositionSetting(name, defaultX, defaultY);
    }

    public void setPosition(float x, float y) {
        this.x = clamp(x, minX, maxX);
        this.y = clamp(y, minY, maxY);

        this.animatedX.run(this.x);
        this.animatedY.run(this.y);

        if (onAction() != null) {
            onAction().run();
        }
    }

    public void reset() {
        setPosition(defaultX, defaultY);
    }

    @Override
    public PositionSetting visible(Supplier<Boolean> visible) {
        super.visible(visible);
        return this;
    }

    @Override
    public PositionSetting onAction(Runnable onAction) {
        super.onAction(onAction);
        return this;
    }

    @Override
    public void init() {
        super.init();
        hoverAnimation.run(0F);
        dragAnimation.run(0F);
        resetButtonHover.run(0F);
        animatedX.set(x);
        animatedY.set(y);
    }

    @Override
    public void render(MatrixStack matrix, int mouseX, int mouseY, float partialTicks) {
        super.render(matrix, mouseX, mouseY, partialTicks);
        if (!visible().get()) return;

        hoverAnimation.update();
        dragAnimation.update();
        resetButtonHover.update();
        animatedX.update();
        animatedY.update();

        float controlSize = 80F;
        float gridSize = 70F;
        float circleRadius = 6F;

        float startX = position().x + margin();
        float startY = position().y + padding();

        float nameWidth = font().getWidth(name(), fontSize());
        font().draw(matrix, name(), startX, startY + 2, Theme.DEFAULT.text(alpha()), fontSize());

        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = startY;

        Shape background = new Shape(matrix, controlX, controlY, controlSize, controlSize);
        int bgColor = ColorUtil.getColor(32, 0.5F * alpha());
        int outlineColor = ColorUtil.overCol(
                ColorUtil.getColor(64, 0.5F * alpha()),
                Theme.DEFAULT.accent(0.3F * alpha()),
                hoverAnimation.get()
        );

        background.round(bgColor, Round.of(4));
        background.outline(0.5F, outlineColor, Round.of(4));

        float gridStartX = controlX + (controlSize - gridSize) / 2F;
        float gridStartY = controlY + (controlSize - gridSize) / 2F;

        int gridColor = ColorUtil.getColor(64, 0.3F * alpha());

        for (int i = 0; i <= 4; i++) {
            float lineX = gridStartX + (gridSize / 4F) * i;
            new Shape(matrix, lineX, gridStartY, 0.5F, gridSize)
                    .round(gridColor, Round.zero());
        }

        for (int i = 0; i <= 4; i++) {
            float lineY = gridStartY + (gridSize / 4F) * i;
            new Shape(matrix, gridStartX, lineY, gridSize, 0.5F)
                    .round(gridColor, Round.zero());
        }

        float centerX = gridStartX + gridSize / 2F;
        float centerY = gridStartY + gridSize / 2F;

        new Shape(matrix, centerX - 3, centerY - 0.5F, 6, 1)
                .round(ColorUtil.getColor(200, 0.7F * alpha()), Round.of(0.5F));
        new Shape(matrix, centerX - 0.5F, centerY - 3, 1, 6)
                .round(ColorUtil.getColor(200, 0.7F * alpha()), Round.of(0.5F));

        font().draw(matrix, "0", centerX + 5, centerY - 2, ColorUtil.getColor(200, 0.6F * alpha()), 6F);

        float normalizedX = (animatedX.get() - minX) / (maxX - minX);
        float normalizedY = (animatedY.get() - minY) / (maxY - minY);

        float circleX = gridStartX + normalizedX * gridSize;
        float circleY = gridStartY + (1F - normalizedY) * gridSize;

        int lineColor = ColorUtil.getColor(96, 0.4F * alpha());
        new Shape(matrix, centerX, centerY, circleX - centerX, 0.5F)
                .round(lineColor, Round.zero());
        new Shape(matrix, circleX, centerY, 0.5F, circleY - centerY)
                .round(lineColor, Round.zero());

        float currentRadius = circleRadius + dragAnimation.get() * 2F;
        Shape circle = new Shape(matrix,
                circleX - currentRadius,
                circleY - currentRadius,
                currentRadius * 2,
                currentRadius * 2
        );

        int circleColor = ColorUtil.overCol(
                Theme.DEFAULT.accent(0.7F * alpha()),
                Theme.DEFAULT.accent(1.0F * alpha()),
                dragAnimation.get()
        );

        circle.round(circleColor, Round.of(currentRadius));
        circle.outline(1F, Theme.DEFAULT.accent(alpha()), Round.of(currentRadius - 0.5F));

        String valueText = String.format("X: %.2f Y: %.2f", x, y);
        float textWidth = font().getWidth(valueText, 6F);
        font().draw(matrix, valueText,
                controlX + (controlSize - textWidth) / 2F,
                controlY + controlSize + 4,
                Theme.DEFAULT.text(0.7F * alpha()),
                6F
        );

        height(padding() + controlSize + 12 + padding());
    }

    @Override
    public boolean mouseClicked(double mouseX, double mouseY, int button) {
        if (!visible().get()) return false;

        float controlSize = 80F;
        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        if (isHover(mouseX, mouseY, controlX, controlY, controlSize, controlSize)) {
            if (isLClick(button)) {
                dragging = true;
                dragAnimation.run(1F);
                updatePositionFromMouse(mouseX, mouseY);
                return true;
            }
        }

        return super.mouseClicked(mouseX, mouseY, button);
    }

    @Override
    public boolean mouseReleased(double mouseX, double mouseY, int button) {
        if (dragging && isLClick(button)) {
            dragging = false;
            dragAnimation.run(0F);
            return true;
        }
        return super.mouseReleased(mouseX, mouseY, button);
    }

    @Override
    public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) {
        if (dragging) {
            updatePositionFromMouse(mouseX, mouseY);
            return true;
        }
        return super.mouseDragged(mouseX, mouseY, button, dragX, dragY);
    }

    @Override
    public void mouseMoved(double mouseX, double mouseY) {
        super.mouseMoved(mouseX, mouseY);

        if (!visible().get()) return;

        float controlSize = 80F;
        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        boolean hover = isHover(mouseX, mouseY, controlX, controlY, controlSize, controlSize);
        hoverAnimation.run(hover ? 1F : 0F);
    }

    private void updatePositionFromMouse(double mouseX, double mouseY) {
        float controlSize = 80F;
        float gridSize = 70F;

        float controlX = position().x + size().x - margin() - controlSize;
        float controlY = position().y + padding();

        float gridStartX = controlX + (controlSize - gridSize) / 2F;
        float gridStartY = controlY + (controlSize - gridSize) / 2F;

        float relativeX = (float) (mouseX - gridStartX);
        float relativeY = (float) (mouseY - gridStartY);

        relativeX = clamp(relativeX, 0, gridSize);
        relativeY = clamp(relativeY, 0, gridSize);

        float normalizedX = relativeX / gridSize;
        float normalizedY = 1F - (relativeY / gridSize);
        float newX = minX + normalizedX * (maxX - minX);
        float newY = minY + normalizedY * (maxY - minY);

        setPosition(newX, newY);
    }

    private float clamp(float value, float min, float max) {
        return Math.max(min, Math.min(max, value));
    }

    @Override
    public void save(JsonObject object) {
        JsonObject positionObject = new JsonObject();
        positionObject.addProperty("x", x);
        positionObject.addProperty("y", y);
        object.add(name(), positionObject);
    }

    @Override
    public void load(JsonObject object) {
        if (object.has(name())) {
            JsonObject positionObject = object.getAsJsonObject(name());
            if (positionObject.has("x") && positionObject.has("y")) {
                this.x = positionObject.get("x").getAsFloat();
                this.y = positionObject.get("y").getAsFloat();
            }
        }
    }
}
А вот сам код Swing Animation:

Swings:
Expand Collapse Copy
package dev.folet.VesencePremium.client.impl.feature.impl.render;

import lombok.Getter;
import lombok.experimental.Accessors;
import net.blaze3d.matrix.MatrixStack;
import net.minecraft.util.HandSide;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Quaternion;
import net.minecraft.util.math.vector.Vector3f;
import dev.folet.common.animation.Animation;
import dev.folet.common.animation.Easings;
import dev.folet.common.animation.OldAnimation;
import dev.folet.common.events.orbit.EventHandler;
import dev.folet.VesencePremium.client.Client;
import dev.folet.VesencePremium.client.events.render.RenderItemEvent;
import dev.folet.VesencePremium.client.impl.feature.Category;
import dev.folet.VesencePremium.client.impl.feature.Feature;
import dev.folet.VesencePremium.client.impl.feature.FeatureInfo;
import dev.folet.VesencePremium.client.impl.feature.impl.combat.AttackAura;
import dev.folet.VesencePremium.client.impl.settings.impl.BooleanSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.ModeSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.SliderSetting;
import dev.folet.VesencePremium.client.impl.settings.impl.PositionSetting;
import dev.folet.VesencePremium.client.util.math.StopWatch;
import dev.folet.VesencePremium.client.util.other.Instance;


@Getter
@Accessors(fluent = true)
@FeatureInfo(name = "SwingAnimations", description = "Изменяет-улучшает анимации и расположение ваших рук от первого лица", category = Category.RENDER)
public class SwingAnimations extends Feature {

    private final ModeSetting mode = new ModeSetting("Режим", "Стандарт", "Взмах", "Взмах 2", "Сдвиг", "Ломание", "Выпад", "Копьё", "Вниз", "Желе", "Тряска").set("Взмах");
    private final BooleanSetting translate = new BooleanSetting("Перемещение по экрану", false);
    private final BooleanSetting attackAuraOnly = new BooleanSetting("Только с киллкой", false);
    private final BooleanSetting attackAuraOffsetsOnly = new BooleanSetting("Оффсеты только с киллкой", false).visible(translate::get);

    private final PositionSetting rightHandPosition = new PositionSetting("Позиция правой руки", -45, 0.0F).visible(translate::get);
    private final SliderSetting rightOffsetZ = new SliderSetting("Правая рука Z", 0.0F, -1.5F, 0.0f, 0.05F).visible(translate::get);
    private final PositionSetting leftHandPosition = new PositionSetting("Позиция левой руки", 0.0F, 0.0F).visible(translate::get);
    private final SliderSetting leftOffsetZ = new SliderSetting("Левая рука Z", 0.0F, -1.5F, 0.0F, 0.05F).visible(translate::get);
    private final SliderSetting offsetX = new SliderSetting("Оффсет X", 0.0F, 0.0F, 1.25F, 0.05F).visible(() -> false);
    private final SliderSetting offsetY = new SliderSetting("Оффсет Y", 0.0F, -0.7F, 1.25F, 0.05F).visible(() -> false);
    private final SliderSetting offsetZ = new SliderSetting("Оффсет Z", 0.0F, -1.5F, 0.0F, 0.05F).visible(() -> false);

    private final SliderSetting turn = new SliderSetting("Поворот", 0.0F, -7.5f, 35F, 0.1F).visible(() -> !mode.is("Взмах") && !mode.is("Взмах 2") && !mode.is("Желе") && !mode.is("Тряска") && !mode.is("Вниз") && !mode.is("Копьё") && !mode.is("Выпад"));
    private final SliderSetting speed = new SliderSetting("Скорость", 7.0F, 1F, 10F, 0.5F).visible(() -> !mode.is("Тряска") && !mode.is("Стандарт"));
    private final BooleanSetting strengthInclineSetting = new BooleanSetting("Сила наклона", false).visible(() ->  !mode.is("Вниз"));
    private final SliderSetting strengthIncline = new SliderSetting("Сила наклона", 20.0F, 20.0F, 75.0F, 0.1F).visible(() -> strengthInclineSetting.get() && !mode.is("Вниз"));

    private final BooleanSetting item360 = new BooleanSetting("Айтем 360", false).visible(() -> !mode.is("Взмах"));

    @EventHandler
    public void onRenderItem(RenderItemEvent event) {
        if (event.getItemStack().isEmpty()) {
            return;
        }

        boolean rightHand = event.getHandSide().equals(HandSide.RIGHT);
        MatrixStack matrix = event.getMatrix();

        if (auraCheckOffsets()) {
            if (translate.get()) {
                if (rightHand) {
                    matrix.translate(
                            rightHandPosition.getX(),
                            rightHandPosition.getY(),
                            rightOffsetZ.get()
                    );
                } else {
                    matrix.translate(
                            leftHandPosition.getX(),
                            leftHandPosition.getY(),
                            leftOffsetZ.get()
                    );
                }
            }
        }

        if (item360.get()) {
            long currentTime = System.currentTimeMillis();
            float angle = (currentTime % 3600) / 10.0f;

            matrix.translate(0.0, 0.0, 0.0);
            matrix.rotate(Vector3f.YP.rotationDegrees(angle));
            matrix.translate(0, 0, 0);
        }
    }

    @EventHandler
    public void onArmSwingAnimation(ArmSwingAnimationEvent event) {
        float animationSpeed = this.speed.max() - this.speed.get() + this.speed.min();
        if (!mode.is("Тряска") && !mode.is("Стандарт")) {
            event.setAnimationSpeed(animationSpeed * 2F);
        } else {
            event.setAnimationSpeed(7);
        }
    }

    public void animationProcess(MatrixStack stack, int handOffset, float swingProgress, float partialTicks) {
        float anim = (float) Math.sin(swingProgress * (Math.PI / 2) * 2);

        if (translate.get() && auraCheckOffsets()) {
            boolean isRightHand = handOffset > 0;
            if (isRightHand) {
                stack.translate(rightHandPosition.getX(), rightHandPosition.getY(), rightOffsetZ.get());
            } else {
                stack.translate(-leftHandPosition.getX(), leftHandPosition.getY(), leftOffsetZ.get());
            }
        }

        if (mode.is("Взмах")) {
        } else if (mode.is("Взмах 2")) {
            stack.translate(0.55f, -0.5f, -(0.7F + (anim * 0.002)));
            stack.scale(1, 1, anim + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90 * anim * (strengthIncline.get() * .015F)));

        } else if (mode.is("Сдвиг")) {
            stack.translate(handOffset * 0.75f, -0.35f, -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 90));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * -60));
            stack.rotate(Vector3f.XP.rotationDegrees(-90 - strengthIncline.get() * anim + turn.get()));
        } else if (mode.is("Ломание")) {
            stack.translate(handOffset * 0.75f, -0.35f, -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 90));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * -30));
            stack.rotate(Vector3f.XP.rotationDegrees(-90 - strengthIncline.get() * anim + turn.get()));
        } else if (mode.is("Выпад")) {
            float f = MathHelper.sin(swingProgress * (MathHelper.PI / 2.0f) * 2.0f);
            float f2 = strengthIncline.get() * 2.5F;
            float f4 = f2 / 10.0f / 10.0f * 40.0f;
            stack.translate(handOffset * 1.35f, -0.55f, -1.3F);
            stack.translate(0, -0, 0);

            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 45.0f));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * f * -(f4 / 2.0f)));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset * f * -(f4 / 2.0f)));
            stack.rotate(Vector3f.XP.rotationDegrees(handOffset * f * -f4));
            stack.translate((handOffset * -0.5f), 0.2f, -0.3);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 30));
            stack.rotate(Vector3f.XP.rotationDegrees(handOffset * -80));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 60));
        } else if (mode.is("Копьё")) {
            stack.translate(0.75f, -0.45f, -(1 + anim * 0.2));
            stack.scale(1, 1, (anim * (strengthIncline.get() * .03F)) + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90));
        } else if (mode.is("Вниз")) {
            stack.translate((handOffset * 0.75F - anim * 0.5F), -(0.35F - anim * 0.25F), -1);
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 65));
            stack.rotate(Vector3f.ZP.rotationDegrees(handOffset));
            stack.rotate(Vector3f.XP.rotationDegrees(-110 - 20 * 4 * anim));
        } else if (mode.is("Желе")) {
            stack.translate(0.75f, -0.45f, -(1 + anim * 0.2));
            stack.rotate(Vector3f.YP.rotationDegrees(handOffset * 35));
            stack.scale(1, 1, (anim * (swingProgress * .65F * (strengthIncline.get() * .0175F))) + 1);
            stack.rotate(Vector3f.XP.rotationDegrees(-90));
        } else if (mode.is("Тряска")) {
            float fapAnim = (1.F - getFapUpdatedAnimation(mc.player.isSwingInProgress) / 75.F * strengthIncline.get() * 4);
            stack.translate(0.76f, -0.35f, -1);
            stack.rotate(new Quaternion(new Vector3f(0, 1, 0), 110 + fapAnim * 15F, true));
            stack.rotate(new Quaternion(new Vector3f(1, 0, 0), -110 , true));
            stack.rotate(new Quaternion(new Vector3f(0, 1, 0), 75, true));
            stack.rotate(new Quaternion(new Vector3f(1, 0, 0), 35 + fapAnim * 15F, true));
        }

        if (item360.get()) {
            long currentTime = System.currentTimeMillis();
            float angle = (currentTime % 3600) / 10.0f;
            stack.translate(0, 0, 0);
            stack.rotate(Vector3f.XN.rotationDegrees(angle));
            stack.translate(-0, -0, -0);
        }
    }

    public boolean auraCheck() {
        AttackAura aura = Client.inst().featureManager().attackAura;
        return !attackAuraOnly.get() || auraValid(aura);
    }

    public boolean auraCheckOffsets() {
        AttackAura aura = Client.inst().featureManager().attackAura;
        return !attackAuraOffsetsOnly.get() || auraValid(aura);
    }

    private boolean auraValid(AttackAura aura) {
        return aura.enabled() && aura.currentTarget() != null;
    }

    private OldAnimation fapAnim = new OldAnimation();
    private StopWatch timerSwinging = new StopWatch();

    public float getFapUpdatedAnimation(boolean swinging) {
        if (!swinging) timerSwinging.reset();
        fapAnim.update();
        int delayWave = 215;
        int point1 = timerSwinging.elapsedTime() % delayWave >= delayWave / 2.F ? 0 : 1;
        fapAnim.run(swinging ? point1 : 0.F, .2F);
        fapAnim.setEasing(Easings.QUINT_OUT);
        return fapAnim.get();
    }
}
Надеюсь вам зайдёт! Модеры одобрите паже
бля видел в 1 базе не помню какая но кста неплохо
 
Назад
Сверху Снизу