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

Часть функционала CameraTweaks - Настройки камеры от 3 лица 1.21.4

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
18 Мар 2026
Сообщения
10
Реакции
0
Выберите загрузчик игры
  1. Fabric
Позволяет поменять плавность и приближение камеры от 3 лица

CameraTweaks:
Expand Collapse Copy
package Atheryx.client.module.impl.player;

import Atheryx.client.module.Category;
import Atheryx.client.module.Module;
import Atheryx.client.module.ModuleInfo;
import Atheryx.client.module.setting.impl.SliderSetting;

@ModuleInfo(name = "CameraTweaks",
category = Category.PLAYER)
public class CameraTweaks extends Module {
    public static CameraTweaks INSTANCE;
    public static final SliderSetting focus = new SliderSetting("Приближение", 1f, 0.1f, 2f, 0.1f);
    public static final SliderSetting speed = new SliderSetting("Скорость преследования", 1f, 0.1f, 1f, 0.01f);

    public CameraTweaks() {
        INSTANCE = this;
        addSetting(focus, speed);
    }
}


CameraMixin:
Expand Collapse Copy
package Atheryx.client.mixin.render;

import Atheryx.client.module.impl.player.CameraTweaks;
import Atheryx.client.module.impl.player.FreeCam;
import Atheryx.client.util.math.Easings;
import net.minecraft.client.render.Camera;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.BlockView;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(Camera.class)
public abstract class CameraMixin {

    @Shadow protected abstract void setRotation(float yaw, float pitch);
    @Shadow protected abstract void setPos(double x, double y, double z);
    @Shadow protected abstract void moveBy(float f, float g, float h);
    @Shadow protected abstract float clipToSpace(float f);
    @Shadow public abstract Vec3d getPos();

    @Unique
    private Vec3d smoothPos = null;

    @Redirect(
            method = "update",
            at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;moveBy(FFF)V")
    )
    private void redirectMoveBy(Camera instance, float f, float g, float h) {
        if (!instance.isThirdPerson()) {
            this.moveBy(f, g, h);
            return;
        }
        if (!CameraTweaks.INSTANCE.isEnabled()) {
            this.moveBy(f, g, h);
            return;
        }

        this.moveBy(-this.clipToSpace(4.0f * CameraTweaks.focus.getFloat()), 0.0f, 0.0f);
    }

    @Redirect(
            method = "update",
            at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;setPos(DDD)V")
    )
    private void redirectSetPos(Camera instance, double x, double y, double z) {
        if (!instance.isThirdPerson()) {
            this.setPos(x, y, z);
            smoothPos = null;
            return;
        }
        if (!CameraTweaks.INSTANCE.isEnabled()) {
            this.setPos(x, y, z);
            smoothPos = null;
            return;
        }

        float smooth = CameraTweaks.speed.getFloat();

        if (smoothPos == null) {
            smoothPos = new Vec3d(x, y, z);
        }

        smoothPos = new Vec3d(
                MathHelper.lerp(Easings.EASE_IN_OUT_SINE.apply(smooth), smoothPos.x, x),
                MathHelper.lerp(Easings.EASE_IN_OUT_SINE.apply(smooth), smoothPos.y, y),
                MathHelper.lerp(Easings.EASE_IN_OUT_SINE.apply(smooth), smoothPos.z, z)
        );

        this.setPos(smoothPos.x, smoothPos.y, smoothPos.z);
    }
}
 
Назад
Сверху Снизу