- Выберите загрузчик игры
- Fabric
Позволяет поменять плавность и приближение камеры от 3 лица
CameraTweaks:
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:
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);
}
}