Spigot Plugin

FragmentoPlugin

Contexto del Proyecto y Lore: Estoy desarrollando un mod de terror psicológico y ciencia ficción titulado «The Echoes of the Void» para Minecraft 1.21.1 (Forge). La Historia: El mundo de Minecraft no es natural, sino una simulación descartada ubicada en la capa Y:-50. El sistema está colapsando. Entity_0 es un residuo de datos corrupto que toma la forma de un reflejo exacto del jugador, con los ojos completamente negros y la cabeza inclinada hacia la derecha; su único objetivo es absorber los datos del jugador para reemplazarlo y escapar de la simulación.

Read the full description

Necesito que programes el mod paso a paso, asegurándote de que la compilación sea completamente válida (sin errores en el archivo mods.toml o de carga en Forge). Nada de texto de terror explicativo en el chat común (salvo los mensajes falsos de auxilio del Día 6). Todo debe ser visual, ambiental y atmosférico. Requisitos, Cronología y Mecánicas Clave a Programar: Gestión de Libros e Ítems: El Diario Dañado (Inicio): El jugador inicia con este libro. No puede estar en blanco. Debe contener: Página 1: «REGISTRO 00: El núcleo no está muerto. Está corrupto. La oscuridad aprende de quien la mira.» Página 2: «ADVERTENCIA: No duermas. La cama no es refugio. Si Entity_0 te encuentra, no lo sigas.» Página 3: «Si despiertas a medianoche, busca la pista que deje atrás. No confíes en tu reflejo.» Gema/Fragmento Corrupto: Textura de esquirla alargada con degradado de púrpura oscuro a azul cian brillante en el centro (núcleo del colapso). Cronología de Eventos (Días 1 al 7): Día 1: Al intentar dormir, el tiempo se ralentiza y el jugador se despierta a medianoche. Entity_0 (mob con skin del jugador, ojos negros y cabeza inclinada) aparece a lo lejos. Si el jugador se acerca, se desvanece y el día vuelve a la normalidad. Día 2: Al usar la cama, el jugador sufre parálisis total del sueño (inmovilidad absoluta en controles y cámara) mientras Entity_0 aparece estática frente a su rostro. Día 3: Corrupción estructural con bloques de carne estática e invertidos apareciendo proceduralmente. Día 4: Corrupción de la fauna (animales pacíficos estáticos mirando al jugador con murmullos humanos). Día 5 (Niebla Ciega): Cielo blanco ceniciento perpetuo, distancia de render bloqueada a 3-4 chunks y parches negros en el suelo. Día 6 (El Archivo Borrado): Descenso a una estructura subterránea en Y:-50 con bloques de datos inestables y un chat alterado con mensajes falsos de auxilio. Día 7 (El Juicio Final): Confrontación directa con la entidad en el altar y elección de uno de los tres finales posibles. Comandos y Crafteos: Implementar comandos de administrador/depuración específicos del mod para testear eventos o invocar los objetos de terror. Añadir las recetas de crafteo personalizadas para los elementos clave (como la combinación de fragmentos para armar la gema o los libros de notas). El Final del Mod (Los Tres Finales - Día 7): Al llegar al altar en Y:-50 con la gema corrupta, el jugador debe tomar una decisión crítica que desencadene uno de los tres finales programados (destrucción de la simulación, asimilación por parte de Entity_0, o escape al vacío), cerrando con pantallas de código, glitches y estática.

src/main/java/eu/codexe/echoesvoid/EchoesVoidPlugin.java
package eu.codexe.echoesvoid;

import eu.codexe.echoesvoid.commands.VoidCommand;
import eu.codexe.echoesvoid.listeners.FinaleListener;
import eu.codexe.echoesvoid.listeners.SleepListener;
import eu.codexe.echoesvoid.listeners.StoryListener;
import eu.codexe.echoesvoid.managers.EntityManager;
import eu.codexe.echoesvoid.managers.FinaleManager;
import eu.codexe.echoesvoid.managers.ItemManager;
import eu.codexe.echoesvoid.managers.MessageManager;
import eu.codexe.echoesvoid.managers.PluginConfig;
import eu.codexe.echoesvoid.managers.StorageManager;
import eu.codexe.echoesvoid.managers.StoryManager;
import eu.codexe.echoesvoid.storage.StorageProvider;
import org.bukkit.Bukkit;
import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.java.JavaPlugin;

public final class EchoesVoidPlugin extends JavaPlugin {
    private PluginConfig pluginConfig;
    private MessageManager messages;
    private StorageManager storage;
    private StoryManager storyManager;
    private ItemManager itemManager;
    private EntityManager entityManager;
    private FinaleManager finaleManager;

    @Override
    public void onEnable() {
        saveDefaultConfig();
        saveResource("messages.yml", false);
        saveResource("recipes.yml", false);

        pluginConfig = new PluginConfig(this);
        messages = new MessageManager(this);
        storage = StorageProvider.create(this, pluginConfig.storageType());
        itemManager = new ItemManager(this);
        entityManager = new EntityManager(this);
        storyManager = new StoryManager(this, storage, itemManager, entityManager);
        finaleManager = new FinaleManager(this, storage, itemManager);

        VoidCommand command = new VoidCommand(this);
        PluginCommand pluginCommand = getCommand("echoes");
        if (pluginCommand == null) {
            getLogger().severe("El comando echoes no está declarado en plugin.yml.");
            getServer().getPluginManager().disablePlugin(this);
            return;
        }
        pluginCommand.setExecutor(command);
        pluginCommand.setTabCompleter(command);

        getServer().getPluginManager().registerEvents(new SleepListener(this), this);
        getServer().getPluginManager().registerEvents(new StoryListener(this), this);
        getServer().getPluginManager().registerEvents(new FinaleListener(this), this);
        storyManager.start();
        getLogger().info("The Echoes of the Void está activo.");
    }

    @Override
    public void onDisable() {