Forge Mod

FilmCraft

Vytvoř mi Minecraft mod pro NeoForge 1.21.1, který bude sloužit jako lehký, ale komplexní nástroj pro filmové natáčení (machinima) v Minecraftu. Cílem je umožnit jednomu uživateli (režisérovi / kameramanovi) natáčet plynulé, profesionálně vypadající záběry bez nutnosti dalších hráčů nebo složitého nastavování. Mod musí splňovat následující požadavky: 1. KAMERA A POHYB - Freecam mód: Možnost odpojit kameru od postavy a volně létat scénou. - Smooth pohyb: Kamera se pohybuje plynule, bez trhání (vyhlazený pohyb jako v ReplayModu).

Read the full description

- Rychlost letu: Možnost plynule měnit rychlost letu (pomalé pro detailní záběry, rychlejší pro průlety). - Cinematic zoom: Plynulé přibližování a oddalování pomocí kolečka myši (s možností nastavit rychlost zoomu). 2. NAHRÁVÁNÍ A PŘEHRÁVÁNÍ - Nahrávání pohybu: Možnost nahrát pohyb kamery a postav (hráčů/NPC) do souboru. - Přehrávání: Možnost přehrát nahraný pohyb (např. pro opakování stejného záběru). - Časová osa: Jednoduchá časová osa s možností posouvat se v čase (vpřed / vzad). 3. NPC A HERCI - Jednoduché NPC: Možnost vytvořit NPC postavu s vybraným skinem a jménem. - Pohyb po trase: NPC se dá naprogramovat, aby chodilo po předem určené trase (waypoints). - Animace: NPC umí základní animace (stát, chodit, sedět, mávat). 4. UŽIVATELSKÉ ROZHRANÍ (GUI) A OVLÁDÁNÍ - Hlavní GUI: Otevírá se klávesou (výchozí např. 'M' nebo 'J'), ale klávesa musí jít změnit v nastavení. - Settings / Možnosti: Mod musí mít vlastní sekci v Minecraft nastavení (Options → Controls → FilmCraft), kde půjde: * Změnit klávesu pro otevření GUI. * Nastavit rychlost freecamu (pomalá / střední / rychlá). * Nastavit rychlost zoomu. * Zapnout/vypnout smooth pohyb. - Ovládací tlačítka v GUI: Nahrávání, přehrávání, freecam, zoom, vytvoření NPC, nastavení trasy. 5. STABILITA A VÝKON - Mod musí být stabilní na NeoForge 1.21.1 a nesmí způsobovat lagy. - Nahrávání a přehrávání musí být optimalizované, aby nezpomalovalo hru. 6. JEDNODUCHÉ POUŽITÍ - Mod musí být snadno použitelný i pro začátečníky (žádné složité příkazy, vše přes GUI nebo klávesy). - Stačí nainstalovat a používat bez dalšího nastavování. Mod pojmenuj "FilmCraft" a vytvoř ho jako jeden .jar soubor.

src/main/java/eu/codexe/filmcraft/client/camera/FreecamController.java
package eu.codexe.filmcraft.client.camera;

import net.minecraft.client.Minecraft;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;

@OnlyIn(Dist.CLIENT)
public class FreecamController {
    private boolean freecamEnabled = false;
    private Vec3 freecamPosition = new Vec3(0, 0, 0);
    private float freecamYaw = 0;
    private float freecamPitch = 0;
    private float currentSpeed = 0.1f;
    private float targetSpeed = 0.1f;
    private float zoom = 1.0f;
    private float targetZoom = 1.0f;
    private final Minecraft minecraft;

    public FreecamController(Minecraft minecraft) {
        this.minecraft = minecraft;
    }

    public void toggleFreecam() {
        if (freecamEnabled) {
            disableFreecam();
        } else {
            enableFreecam();
        }
    }

    public void enableFreecam() {
        if (minecraft.player == null) return;
        freecamEnabled = true;
        freecamPosition = minecraft.player.getEyePosition();
        freecamYaw = minecraft.player.getYRot();
        freecamPitch = minecraft.player.getXRot();
    }

    public void disableFreecam() {
        freecamEnabled = false;
    }

    public void updateFreecamPosition(double forward, double strafe, double vertical) {
        if (!freecamEnabled || minecraft.player == null) return;

        targetSpeed = Math.max(0.01f, Math.min(0.5f, targetSpeed));
        currentSpeed = currentSpeed + (targetSpeed - currentSpeed) * 0.1f;

        double yawRad = Math.toRadians(freecamYaw);
        double forwardX = Math.sin(yawRad) * forward;
        double forwardZ = Math.cos(yawRad) * forward;
        double strafeX = Math.sin(yawRad - Math.PI / 2) * strafe;
        double strafeZ = Math.cos(yawRad - Math.PI / 2) * strafe;

        Vec3 movement = new Vec3(
            (forwardX + strafeX) * currentSpeed,
            vertical * currentSpeed,
            (forwardZ + strafeZ) * currentSpeed
        );