Загрузка данных


==================================================
FILE: FreeOrbitCameraClient.java
PATH: src/main/java/com/example/freeorbitcamera/FreeOrbitCameraClient.java
==================================================

package com.example.freeorbitcamera;

import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import org.lwjgl.glfw.GLFW;

public class FreeOrbitCameraClient implements ClientModInitializer {

    public static boolean enabled = false;
    public static float cameraYaw;
    public static float cameraPitch = 10.0F;

    private KeyBinding toggleKey;

    @Override
    public void onInitializeClient() {
        toggleKey = KeyBindingHelper.registerKeyBinding(
            new KeyBinding(
                "key.freeorbitcamera.toggle",
                InputUtil.Type.KEYSYM,
                GLFW.GLFW_KEY_LEFT_ALT,
                KeyBinding.Category.MISC
            )
        );

        ClientTickEvents.END_CLIENT_TICK.register(client -> {
            while (toggleKey.wasPressed()) {
                enabled = !enabled;

                if (enabled && client.player != null) {
                    cameraYaw = client.player.getYaw();
                    cameraPitch = client.player.getPitch();
                }
            }
        });
    }

    public static void rotateCamera(double deltaX, double deltaY) {
        cameraYaw += (float) deltaX * 0.15F;
        cameraPitch += (float) deltaY * 0.15F;
        cameraPitch = Math.max(-89.0F, Math.min(89.0F, cameraPitch));
    }
}


==================================================
FILE: MouseMixin.java
PATH: src/main/java/com/example/freeorbitcamera/mixin/MouseMixin.java
==================================================

package com.example.freeorbitcamera.mixin;

import com.example.freeorbitcamera.FreeOrbitCameraClient;
import net.minecraft.client.Mouse;
import net.minecraft.client.network.ClientPlayerEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

@Mixin(Mouse.class)
public abstract class MouseMixin {

    @Redirect(
        method = "updateMouse",
        at = @At(
            value = "INVOKE",
            target = "Lnet/minecraft/client/network/ClientPlayerEntity;changeLookDirection(DD)V"
        )
    )
    private void freeorbitcamera$mouseLook(
        ClientPlayerEntity player,
        double deltaX,
        double deltaY
    ) {
        if (FreeOrbitCameraClient.enabled) {
            FreeOrbitCameraClient.rotateCamera(deltaX, deltaY);
        } else {
            player.changeLookDirection(deltaX, deltaY);
        }
    }
}


==================================================
FILE: CameraMixin.java
PATH: src/main/java/com/example/freeorbitcamera/mixin/CameraMixin.java
==================================================

package com.example.freeorbitcamera.mixin;

import com.example.freeorbitcamera.FreeOrbitCameraClient;
import net.minecraft.client.render.Camera;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

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

    @Redirect(
        method = "update",
        at = @At(
            value = "INVOKE",
            target = "Lnet/minecraft/client/render/Camera;setRotation(FF)V"
        )
    )
    private void freeorbitcamera$orbitCamera(
        Camera camera,
        float yaw,
        float pitch
    ) {
        if (FreeOrbitCameraClient.enabled) {
            camera.setRotation(
                FreeOrbitCameraClient.cameraYaw,
                FreeOrbitCameraClient.cameraPitch
            );
        } else {
            camera.setRotation(yaw, pitch);
        }
    }
}


==================================================
FILE: fabric.mod.json
PATH: src/main/resources/fabric.mod.json
==================================================

{
  "schemaVersion": 1,
  "id": "freeorbitcamera",
  "version": "1.0.0",
  "name": "Free Orbit Camera",
  "description": "Free camera rotation around the player",
  "environment": "client",
  "entrypoints": {
    "client": [
      "com.example.freeorbitcamera.FreeOrbitCameraClient"
    ]
  },
  "mixins": [
    "freeorbitcamera.mixins.json"
  ],
  "depends": {
    "fabricloader": ">=0.16.0",
    "minecraft": "1.21.4",
    "java": ">=21",
    "fabric-api": "*"
  }
}


==================================================
FILE: freeorbitcamera.mixins.json
PATH: src/main/resources/freeorbitcamera.mixins.json
==================================================

{
  "required": true,
  "package": "com.example.freeorbitcamera.mixin",
  "compatibilityLevel": "JAVA_21",
  "client": [
    "MouseMixin",
    "CameraMixin"
  ],
  "injectors": {
    "defaultRequire": 1
  }
}