Исходник FreeLook Forge 1.16.5 Ready

Forge Api ;-;
Начинающий
Статус
Оффлайн
Регистрация
3 Май 2023
Сообщения
775
Реакции[?]
18
Поинты[?]
13K

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

FreeLook как в нурсултане впринципе просто позволяет от третьего лица осматриваться


FreeLookFunction.class:
// класс самой функции
    private boolean swap = false;

    private static float cameraYaw;
    private static float cameraPitch;
    private static float originalX;
    private static float originalY;
    private static float originalBodyY;
    private double lastMouseX;
    private double lastMouseY;

    BooleanSetting bypass = new BooleanSetting("Pitch bypass", false);

    FloatSetting sensitivity = new FloatSetting("Sensitivity", 10,20,12,1);

    public FreeLook() {
        super("Free Look", Category.Visuals, ";-;");
        addSettings(bypass, sensitivity);
    }

    @Override
    public void onEnable() {
        cameraYaw = mc.player.xRot;
        cameraPitch = mc.player.yRot;
        originalX = mc.player.xRot;
        originalY = mc.player.yRot;
        originalBodyY = mc.player.yBodyRot;
        lastMouseX = mc.mouseHandler.xpos();
        lastMouseY = mc.mouseHandler.ypos();
        togglePerspective();
        swap = true;
        super.onEnable();
    }

    @Override
    public void onDisable() {
        togglePerspective();
        super.onDisable();
    }

    @SubscribeEvent
    public void onRenderTick(TickEvent.RenderTickEvent event) {
        if (isEnabled() && !mc.options.getCameraType().isFirstPerson() && event.phase == TickEvent.Phase.START && mc.player != null && mc.level != null && mc.screen == null) {
            if (swap) {
                setCameraYaw(mc.player.yRot);
                setCameraPitch(1.0F);
                swap = false;
            }

            double currentMouseX = mc.mouseHandler.xpos();
            double currentMouseY = mc.mouseHandler.ypos();

            float sens = (float) (sensitivity.getValueFloat() / 100.0f);

            double deltaX = currentMouseX - lastMouseX;
            double deltaY = currentMouseY - lastMouseY;

            cameraYaw += (float) (deltaX * sens);
            cameraPitch -= (float) (deltaY * sens);

            if (!bypass.isEnabled()) {
                cameraPitch = MathHelper.clamp(cameraPitch, -90.0F, 90.0F);
            }
            lastMouseX = currentMouseX;
            lastMouseY = currentMouseY;

            if (mc.mouseHandler.isMouseGrabbed() && !mc.isPaused()) {
                mc.mouseHandler.grabMouse();
            }
        }
    }

    private void togglePerspective() {
        mc.options.setCameraType(isEnabled() ? PointOfView.FIRST_PERSON : PointOfView.THIRD_PERSON_BACK);
    }
// тут не будьте как я и юзайте ломбок)

    public static void setCameraYaw(float yaw) {
        cameraYaw = yaw;
    }

    public static void setCameraPitch(float pitch) {
        cameraPitch = pitch;
    }

    public static float getCameraYaw() {
        return cameraYaw;
    }

    public static float getCameraPitch() {
        return cameraPitch;
    }

    public static float getOriginalX() {
        return originalX;
    }

    public static float getOriginalY() {
        return originalY;
    }
Далее нам нужно создать 2 хука - GameRendererHook и ActiveRenderInfoHook
После создания гуляем в GameRendererHook, ищем метод render
и строку
shit api bruh:
this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
И вставляем вместо нее
sveji:
/*
* Думаю и так понятно, что isEnabled - проверка на то, включена функция или нет
*/

if (ModuleManager.isEnabled(FreeLook.class) && !this.minecraft.options.getCameraType().isFirstPerson()) {
    this.minecraft.player.yRot = FreeLook.getOriginalY();
    this.minecraft.player.xRot = FreeLook.getOriginalX();
    this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
} else {
    this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
}
Окей, переходим к ActiveRenderInfoHook, ищем метод setup и заменяем
ny eto pizdec da:
    public void setup(IBlockReader p_216772_1_, Entity p_216772_2_, boolean p_216772_3_, boolean p_216772_4_, float p_216772_5_) {
        this.initialized = true;
        this.level = p_216772_1_;
        this.entity = p_216772_2_;
        this.detached = p_216772_3_;
        this.mirror = p_216772_4_;

        float targetYaw, targetPitch;
        double targetZoom = 0.0;

        if (ModuleManager.isEnabled(FreeLook.class) && p_216772_3_) {
            targetYaw = FreeLook.getCameraYaw();
            targetPitch = FreeLook.getCameraPitch();
        } else {
            targetYaw = p_216772_2_.getViewYRot(p_216772_5_);
            targetPitch = p_216772_2_.getViewXRot(p_216772_5_);
        }

        this.setRotation(targetYaw, targetPitch);

        this.setPosition(MathHelper.lerp(p_216772_5_, p_216772_2_.xo, p_216772_2_.getX()),
                MathHelper.lerp(p_216772_5_, p_216772_2_.yo, p_216772_2_.getY()) + (double)MathHelper.lerp(p_216772_5_, this.eyeHeightOld, this.eyeHeight),
                MathHelper.lerp(p_216772_5_, p_216772_2_.zo, p_216772_2_.getZ()));

        if (p_216772_3_) {
            if (p_216772_4_) {
                this.setRotation(this.yRot + 180.0F, -this.xRot);
            }
            targetZoom = -this.getMaxZoom(4.0);
        } else if (p_216772_2_ instanceof LivingEntity && ((LivingEntity)p_216772_2_).isSleeping()) {
            Direction direction = ((LivingEntity)p_216772_2_).getBedOrientation();
            this.setRotation(direction != null ? direction.toYRot() - 180.0F : 0.0F, 0.0F);
            targetZoom = 0.3;
        }

        if (zoomAnimation == null) {
            zoomAnimation = new Animation(0, 0, 0.1f);
        }
        zoomAnimation.to = (float) targetZoom;
        double currentZoom = zoomAnimation.getAnim();
        this.move(currentZoom, 0.0, 0.0);
    }
Пока не обращаем внимание на ошибки связанные с анимацией
Так-же нам нужен крутой CameraHandler
Создаем новый класс и пастим

bolshoy:
public class CameraHandler {
    @SubscribeEvent
    public void onRenderWorld(RenderWorldLastEvent event) {
        Minecraft mc = Minecraft.getInstance();
        if (mc.player == null || mc.level == null) return;

        if (ModuleManager.isEnabled(FreeLook.class)) {
            GameRenderer gameRenderer = mc.gameRenderer;
            ActiveRenderInfo activeRenderInfo = gameRenderer.getMainCamera();

            float originalYaw = activeRenderInfo.getXRot();
            float originalPitch = activeRenderInfo.getYRot();

            activeRenderInfo.setAnglesInternal(FreeLook.getCameraYaw(), FreeLook.getCameraPitch());

            activeRenderInfo.setAnglesInternal(originalYaw, originalPitch);
        }
    }
}
Данный класс просто регаем в ините
init:
MinecraftForge.EVENT_BUS.register(new CameraHandler());
Далее для анимаций в ActiveRenderInfo компостируем себе
animation$:
public class Animation {
    long mc;
    float anim;
    public float to;
    public float speed;

    public Animation(float anim, float to, float speed) {
        this.anim = anim;
        this.to = to;
        this.speed = speed;
        this.mc = System.currentTimeMillis();
    }


    public float getAnim() {
        int count = (int) ((System.currentTimeMillis() - this.mc) / 5L);
        if (count > 0) {
            this.mc = System.currentTimeMillis();
        }
        for (int i = 0; i < count; ++i) {
            this.anim =  MathUtil.harp(anim, to, speed);
        }
        return MathUtil.roundToDecimal(anim, 10);
    }

    public void reset() {
        this.mc = System.currentTimeMillis();
    }

    public void setAnim(float anim) {
        this.anim = anim;
        this.mc = System.currentTimeMillis();
    }
}
По итогу мы имеем анимацию при переключении перспективы, а так-же классный фанкш.
Далее просто регаем наши хуки и все готово, улыбаемся и машем!
 
Забаненный
Статус
Оффлайн
Регистрация
10 Май 2023
Сообщения
827
Реакции[?]
9
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
+ rep :seemsgood:
 
Забаненный
Статус
Оффлайн
Регистрация
31 Авг 2023
Сообщения
699
Реакции[?]
6
Поинты[?]
5K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
говно код от чат гпт :sunglasses: :sunglasses:
 
Забаненный
Статус
Оффлайн
Регистрация
10 Май 2023
Сообщения
827
Реакции[?]
9
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
31 Авг 2023
Сообщения
699
Реакции[?]
6
Поинты[?]
5K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
чат гпт было лишнее и говно код тоже
Бляя забыл спросить у бест дивелопера IIuonerII (твой софт полное дерьмо которое скачает только маленькое дите которое ничего не понимает в читах)
 
Забаненный
Статус
Оффлайн
Регистрация
10 Май 2023
Сообщения
827
Реакции[?]
9
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Бляя забыл спросить у бест дивелопера IIuonerII (твой софт полное дерьмо которое скачает только маленькое дите которое ничего не понимает в читах)
ахвххахвхав, а ты то такой код сможешь написать? и почему ограничил доступ к своему профилю?)
 
Забаненный
Статус
Оффлайн
Регистрация
31 Авг 2023
Сообщения
699
Реакции[?]
6
Поинты[?]
5K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ахвххахвхав, а ты то такой код сможешь написать? и почему ограничил доступ к своему профилю?)
Бро,у тебя худ с югейма каждый пастер сможет написать свой худ,ограничил потому что дезз заебал меня,сам то писал,что твой софт 70-80 процентов паста,хотя ты ошибся весь твой чит это югейм у тебя не хватает мозгов поставить рект и вывысти на него текст тебе даже рендер утилки не надо писать у тебя все уже на блюдочке подано :NotLikeThis: :NotLikeThis: :NotLikeThis:
ахвххахвхав, а ты то такой код сможешь написать? и почему ограничил доступ к своему профилю?)
это полная залупа от чат гпт лол,название переменных просто огонь 🤙 🤙 🤙
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2024
Сообщения
73
Реакции[?]
1
Поинты[?]
1K
FreeLook как в нурсултане впринципе просто позволяет от третьего лица осматриваться


FreeLookFunction.class:
// класс самой функции
    private boolean swap = false;

    private static float cameraYaw;
    private static float cameraPitch;
    private static float originalX;
    private static float originalY;
    private static float originalBodyY;
    private double lastMouseX;
    private double lastMouseY;

    BooleanSetting bypass = new BooleanSetting("Pitch bypass", false);

    FloatSetting sensitivity = new FloatSetting("Sensitivity", 10,20,12,1);

    public FreeLook() {
        super("Free Look", Category.Visuals, ";-;");
        addSettings(bypass, sensitivity);
    }

    @Override
    public void onEnable() {
        cameraYaw = mc.player.xRot;
        cameraPitch = mc.player.yRot;
        originalX = mc.player.xRot;
        originalY = mc.player.yRot;
        originalBodyY = mc.player.yBodyRot;
        lastMouseX = mc.mouseHandler.xpos();
        lastMouseY = mc.mouseHandler.ypos();
        togglePerspective();
        swap = true;
        super.onEnable();
    }

    @Override
    public void onDisable() {
        togglePerspective();
        super.onDisable();
    }

    @SubscribeEvent
    public void onRenderTick(TickEvent.RenderTickEvent event) {
        if (isEnabled() && !mc.options.getCameraType().isFirstPerson() && event.phase == TickEvent.Phase.START && mc.player != null && mc.level != null && mc.screen == null) {
            if (swap) {
                setCameraYaw(mc.player.yRot);
                setCameraPitch(1.0F);
                swap = false;
            }

            double currentMouseX = mc.mouseHandler.xpos();
            double currentMouseY = mc.mouseHandler.ypos();

            float sens = (float) (sensitivity.getValueFloat() / 100.0f);

            double deltaX = currentMouseX - lastMouseX;
            double deltaY = currentMouseY - lastMouseY;

            cameraYaw += (float) (deltaX * sens);
            cameraPitch -= (float) (deltaY * sens);

            if (!bypass.isEnabled()) {
                cameraPitch = MathHelper.clamp(cameraPitch, -90.0F, 90.0F);
            }
            lastMouseX = currentMouseX;
            lastMouseY = currentMouseY;

            if (mc.mouseHandler.isMouseGrabbed() && !mc.isPaused()) {
                mc.mouseHandler.grabMouse();
            }
        }
    }

    private void togglePerspective() {
        mc.options.setCameraType(isEnabled() ? PointOfView.FIRST_PERSON : PointOfView.THIRD_PERSON_BACK);
    }
// тут не будьте как я и юзайте ломбок)

    public static void setCameraYaw(float yaw) {
        cameraYaw = yaw;
    }

    public static void setCameraPitch(float pitch) {
        cameraPitch = pitch;
    }

    public static float getCameraYaw() {
        return cameraYaw;
    }

    public static float getCameraPitch() {
        return cameraPitch;
    }

    public static float getOriginalX() {
        return originalX;
    }

    public static float getOriginalY() {
        return originalY;
    }
Далее нам нужно создать 2 хука - GameRendererHook и ActiveRenderInfoHook
После создания гуляем в GameRendererHook, ищем метод render
и строку
shit api bruh:
this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
И вставляем вместо нее
sveji:
/*
* Думаю и так понятно, что isEnabled - проверка на то, включена функция или нет
*/

if (ModuleManager.isEnabled(FreeLook.class) && !this.minecraft.options.getCameraType().isFirstPerson()) {
    this.minecraft.player.yRot = FreeLook.getOriginalY();
    this.minecraft.player.xRot = FreeLook.getOriginalX();
    this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
} else {
    this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
}
Окей, переходим к ActiveRenderInfoHook, ищем метод setup и заменяем
ny eto pizdec da:
    public void setup(IBlockReader p_216772_1_, Entity p_216772_2_, boolean p_216772_3_, boolean p_216772_4_, float p_216772_5_) {
        this.initialized = true;
        this.level = p_216772_1_;
        this.entity = p_216772_2_;
        this.detached = p_216772_3_;
        this.mirror = p_216772_4_;

        float targetYaw, targetPitch;
        double targetZoom = 0.0;

        if (ModuleManager.isEnabled(FreeLook.class) && p_216772_3_) {
            targetYaw = FreeLook.getCameraYaw();
            targetPitch = FreeLook.getCameraPitch();
        } else {
            targetYaw = p_216772_2_.getViewYRot(p_216772_5_);
            targetPitch = p_216772_2_.getViewXRot(p_216772_5_);
        }

        this.setRotation(targetYaw, targetPitch);

        this.setPosition(MathHelper.lerp(p_216772_5_, p_216772_2_.xo, p_216772_2_.getX()),
                MathHelper.lerp(p_216772_5_, p_216772_2_.yo, p_216772_2_.getY()) + (double)MathHelper.lerp(p_216772_5_, this.eyeHeightOld, this.eyeHeight),
                MathHelper.lerp(p_216772_5_, p_216772_2_.zo, p_216772_2_.getZ()));

        if (p_216772_3_) {
            if (p_216772_4_) {
                this.setRotation(this.yRot + 180.0F, -this.xRot);
            }
            targetZoom = -this.getMaxZoom(4.0);
        } else if (p_216772_2_ instanceof LivingEntity && ((LivingEntity)p_216772_2_).isSleeping()) {
            Direction direction = ((LivingEntity)p_216772_2_).getBedOrientation();
            this.setRotation(direction != null ? direction.toYRot() - 180.0F : 0.0F, 0.0F);
            targetZoom = 0.3;
        }

        if (zoomAnimation == null) {
            zoomAnimation = new Animation(0, 0, 0.1f);
        }
        zoomAnimation.to = (float) targetZoom;
        double currentZoom = zoomAnimation.getAnim();
        this.move(currentZoom, 0.0, 0.0);
    }
Пока не обращаем внимание на ошибки связанные с анимацией
Так-же нам нужен крутой CameraHandler
Создаем новый класс и пастим

bolshoy:
public class CameraHandler {
    @SubscribeEvent
    public void onRenderWorld(RenderWorldLastEvent event) {
        Minecraft mc = Minecraft.getInstance();
        if (mc.player == null || mc.level == null) return;

        if (ModuleManager.isEnabled(FreeLook.class)) {
            GameRenderer gameRenderer = mc.gameRenderer;
            ActiveRenderInfo activeRenderInfo = gameRenderer.getMainCamera();

            float originalYaw = activeRenderInfo.getXRot();
            float originalPitch = activeRenderInfo.getYRot();

            activeRenderInfo.setAnglesInternal(FreeLook.getCameraYaw(), FreeLook.getCameraPitch());

            activeRenderInfo.setAnglesInternal(originalYaw, originalPitch);
        }
    }
}
Данный класс просто регаем в ините
init:
MinecraftForge.EVENT_BUS.register(new CameraHandler());
Далее для анимаций в ActiveRenderInfo компостируем себе
animation$:
public class Animation {
    long mc;
    float anim;
    public float to;
    public float speed;

    public Animation(float anim, float to, float speed) {
        this.anim = anim;
        this.to = to;
        this.speed = speed;
        this.mc = System.currentTimeMillis();
    }


    public float getAnim() {
        int count = (int) ((System.currentTimeMillis() - this.mc) / 5L);
        if (count > 0) {
            this.mc = System.currentTimeMillis();
        }
        for (int i = 0; i < count; ++i) {
            this.anim =  MathUtil.harp(anim, to, speed);
        }
        return MathUtil.roundToDecimal(anim, 10);
    }

    public void reset() {
        this.mc = System.currentTimeMillis();
    }

    public void setAnim(float anim) {
        this.anim = anim;
        this.mc = System.currentTimeMillis();
    }
}
По итогу мы имеем анимацию при переключении перспективы, а так-же классный фанкш.
Далее просто регаем наши хуки и все готово, улыбаемся и машем!
можно было намного легче и короче сделать
 
Забаненный
Статус
Оффлайн
Регистрация
10 Май 2023
Сообщения
827
Реакции[?]
9
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Бро,у тебя худ с югейма каждый пастер сможет написать свой худ,ограничил потому что дезз заебал меня,сам то писал,что твой софт 70-80 процентов паста,хотя ты ошибся весь твой чит это югейм у тебя не хватает мозгов поставить рект и вывысти на него текст тебе даже рендер утилки не надо писать у тебя все уже на блюдочке подано :NotLikeThis: :NotLikeThis: :NotLikeThis:

это полная залупа от чат гпт лол,название переменных просто огонь 🤙 🤙 🤙
currentMouseX
deltaX
currentMouseXY
deltaY

Что с этими названиями не так? я не нашёл ничего подозрительного, та и даже если оно называется примерно: FREELOK_CHAT_GPT_SELFCODE, думаешь такого не сможет написать человек?
 
Забаненный
Статус
Оффлайн
Регистрация
31 Авг 2023
Сообщения
699
Реакции[?]
6
Поинты[?]
5K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
currentMouseX
deltaX
currentMouseXY
deltaY

Что с этими названиями не так? я не нашёл ничего подозрительного, та и даже если оно называется примерно: FREELOK_CHAT_GPT_SELFCODE, думаешь такого не сможет написать человек?
все переменные написаны слишком четко,кубоголовые дауны таких слов даже не знают
и еще код слишком хуевый и запутаный это все можно было сделать намного легче,гптшка постаралась
 
Forge Api ;-;
Начинающий
Статус
Оффлайн
Регистрация
3 Май 2023
Сообщения
775
Реакции[?]
18
Поинты[?]
13K
Забаненный
Статус
Оффлайн
Регистрация
31 Авг 2023
Сообщения
699
Реакции[?]
6
Поинты[?]
5K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
15 Сен 2024
Сообщения
60
Реакции[?]
0
Поинты[?]
0
FreeLook как в нурсултане впринципе просто позволяет от третьего лица осматриваться


FreeLookFunction.class:
// класс самой функции
    private boolean swap = false;

    private static float cameraYaw;
    private static float cameraPitch;
    private static float originalX;
    private static float originalY;
    private static float originalBodyY;
    private double lastMouseX;
    private double lastMouseY;

    BooleanSetting bypass = new BooleanSetting("Pitch bypass", false);

    FloatSetting sensitivity = new FloatSetting("Sensitivity", 10,20,12,1);

    public FreeLook() {
        super("Free Look", Category.Visuals, ";-;");
        addSettings(bypass, sensitivity);
    }

    @Override
    public void onEnable() {
        cameraYaw = mc.player.xRot;
        cameraPitch = mc.player.yRot;
        originalX = mc.player.xRot;
        originalY = mc.player.yRot;
        originalBodyY = mc.player.yBodyRot;
        lastMouseX = mc.mouseHandler.xpos();
        lastMouseY = mc.mouseHandler.ypos();
        togglePerspective();
        swap = true;
        super.onEnable();
    }

    @Override
    public void onDisable() {
        togglePerspective();
        super.onDisable();
    }

    @SubscribeEvent
    public void onRenderTick(TickEvent.RenderTickEvent event) {
        if (isEnabled() && !mc.options.getCameraType().isFirstPerson() && event.phase == TickEvent.Phase.START && mc.player != null && mc.level != null && mc.screen == null) {
            if (swap) {
                setCameraYaw(mc.player.yRot);
                setCameraPitch(1.0F);
                swap = false;
            }

            double currentMouseX = mc.mouseHandler.xpos();
            double currentMouseY = mc.mouseHandler.ypos();

            float sens = (float) (sensitivity.getValueFloat() / 100.0f);

            double deltaX = currentMouseX - lastMouseX;
            double deltaY = currentMouseY - lastMouseY;

            cameraYaw += (float) (deltaX * sens);
            cameraPitch -= (float) (deltaY * sens);

            if (!bypass.isEnabled()) {
                cameraPitch = MathHelper.clamp(cameraPitch, -90.0F, 90.0F);
            }
            lastMouseX = currentMouseX;
            lastMouseY = currentMouseY;

            if (mc.mouseHandler.isMouseGrabbed() && !mc.isPaused()) {
                mc.mouseHandler.grabMouse();
            }
        }
    }

    private void togglePerspective() {
        mc.options.setCameraType(isEnabled() ? PointOfView.FIRST_PERSON : PointOfView.THIRD_PERSON_BACK);
    }
// тут не будьте как я и юзайте ломбок)

    public static void setCameraYaw(float yaw) {
        cameraYaw = yaw;
    }

    public static void setCameraPitch(float pitch) {
        cameraPitch = pitch;
    }

    public static float getCameraYaw() {
        return cameraYaw;
    }

    public static float getCameraPitch() {
        return cameraPitch;
    }

    public static float getOriginalX() {
        return originalX;
    }

    public static float getOriginalY() {
        return originalY;
    }
Далее нам нужно создать 2 хука - GameRendererHook и ActiveRenderInfoHook
После создания гуляем в GameRendererHook, ищем метод render
и строку
shit api bruh:
this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
И вставляем вместо нее
sveji:
/*
* Думаю и так понятно, что isEnabled - проверка на то, включена функция или нет
*/

if (ModuleManager.isEnabled(FreeLook.class) && !this.minecraft.options.getCameraType().isFirstPerson()) {
    this.minecraft.player.yRot = FreeLook.getOriginalY();
    this.minecraft.player.xRot = FreeLook.getOriginalX();
    this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
} else {
    this.renderLevel(p_195458_1_, p_195458_2_, new MatrixStack());
}
Окей, переходим к ActiveRenderInfoHook, ищем метод setup и заменяем
ny eto pizdec da:
    public void setup(IBlockReader p_216772_1_, Entity p_216772_2_, boolean p_216772_3_, boolean p_216772_4_, float p_216772_5_) {
        this.initialized = true;
        this.level = p_216772_1_;
        this.entity = p_216772_2_;
        this.detached = p_216772_3_;
        this.mirror = p_216772_4_;

        float targetYaw, targetPitch;
        double targetZoom = 0.0;

        if (ModuleManager.isEnabled(FreeLook.class) && p_216772_3_) {
            targetYaw = FreeLook.getCameraYaw();
            targetPitch = FreeLook.getCameraPitch();
        } else {
            targetYaw = p_216772_2_.getViewYRot(p_216772_5_);
            targetPitch = p_216772_2_.getViewXRot(p_216772_5_);
        }

        this.setRotation(targetYaw, targetPitch);

        this.setPosition(MathHelper.lerp(p_216772_5_, p_216772_2_.xo, p_216772_2_.getX()),
                MathHelper.lerp(p_216772_5_, p_216772_2_.yo, p_216772_2_.getY()) + (double)MathHelper.lerp(p_216772_5_, this.eyeHeightOld, this.eyeHeight),
                MathHelper.lerp(p_216772_5_, p_216772_2_.zo, p_216772_2_.getZ()));

        if (p_216772_3_) {
            if (p_216772_4_) {
                this.setRotation(this.yRot + 180.0F, -this.xRot);
            }
            targetZoom = -this.getMaxZoom(4.0);
        } else if (p_216772_2_ instanceof LivingEntity && ((LivingEntity)p_216772_2_).isSleeping()) {
            Direction direction = ((LivingEntity)p_216772_2_).getBedOrientation();
            this.setRotation(direction != null ? direction.toYRot() - 180.0F : 0.0F, 0.0F);
            targetZoom = 0.3;
        }

        if (zoomAnimation == null) {
            zoomAnimation = new Animation(0, 0, 0.1f);
        }
        zoomAnimation.to = (float) targetZoom;
        double currentZoom = zoomAnimation.getAnim();
        this.move(currentZoom, 0.0, 0.0);
    }
Пока не обращаем внимание на ошибки связанные с анимацией
Так-же нам нужен крутой CameraHandler
Создаем новый класс и пастим

bolshoy:
public class CameraHandler {
    @SubscribeEvent
    public void onRenderWorld(RenderWorldLastEvent event) {
        Minecraft mc = Minecraft.getInstance();
        if (mc.player == null || mc.level == null) return;

        if (ModuleManager.isEnabled(FreeLook.class)) {
            GameRenderer gameRenderer = mc.gameRenderer;
            ActiveRenderInfo activeRenderInfo = gameRenderer.getMainCamera();

            float originalYaw = activeRenderInfo.getXRot();
            float originalPitch = activeRenderInfo.getYRot();

            activeRenderInfo.setAnglesInternal(FreeLook.getCameraYaw(), FreeLook.getCameraPitch());

            activeRenderInfo.setAnglesInternal(originalYaw, originalPitch);
        }
    }
}
Данный класс просто регаем в ините
init:
MinecraftForge.EVENT_BUS.register(new CameraHandler());
Далее для анимаций в ActiveRenderInfo компостируем себе
animation$:
public class Animation {
    long mc;
    float anim;
    public float to;
    public float speed;

    public Animation(float anim, float to, float speed) {
        this.anim = anim;
        this.to = to;
        this.speed = speed;
        this.mc = System.currentTimeMillis();
    }


    public float getAnim() {
        int count = (int) ((System.currentTimeMillis() - this.mc) / 5L);
        if (count > 0) {
            this.mc = System.currentTimeMillis();
        }
        for (int i = 0; i < count; ++i) {
            this.anim =  MathUtil.harp(anim, to, speed);
        }
        return MathUtil.roundToDecimal(anim, 10);
    }

    public void reset() {
        this.mc = System.currentTimeMillis();
    }

    public void setAnim(float anim) {
        this.anim = anim;
        this.mc = System.currentTimeMillis();
    }
}
По итогу мы имеем анимацию при переключении перспективы, а так-же классный фанкш.
Далее просто регаем наши хуки и все готово, улыбаемся и машем!
на 3.1 работает?
 
Сверху Снизу