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.
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() {