Un framework base moderno y robusto para el desarrollo de plugins de Minecraft (Spigot/BungeeCord) que implementa principios SOLID y patrones de diseño como Singleton. Diseñado para ser usado como dependencia en otros proyectos.
📁 ¿Buscas ejemplos? Revisa el módulo
examples/para ver implementaciones de referencia.
- Framework Puro: Solo APIs y utilidades, sin implementaciones forzadas
- Control Total: El desarrollador decide qué inicializar y registrar
- Arquitectura Modular: Separación clara entre common, spigot, bungeecord y examples
- Principios SOLID: Implementación de principios de diseño sólidos
- Patrón Singleton Thread-Safe: Factory pattern con sincronización adecuada
- API Moderna: Uso de Adventure API para mensajes modernos
- Configuración Avanzada: Sistema de configuración flexible y extensible
- Comandos Inteligentes: Sistema de comandos con autocompletado
- Soporte Multi-Plataforma: Compatible con Spigot y BungeeCord
- Ejemplos Incluidos: Módulo
examples/con implementaciones de referencia - Versiones Actualizadas: Todas las dependencias actualizadas a las últimas versiones
- Java 21 o superior
- Gradle 8.3+
- Spigot/Paper 1.21.4+ o BungeeCord 1.21+
Paso 1: Agregar repositorios en tu build.gradle:
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}Paso 2: Agregar dependencias según tu plataforma:
dependencies {
implementation 'com.github.murcisluis.BasePlugin:spigot:v2.3.1'
implementation 'com.github.murcisluis.BasePlugin:common:v2.3.1'
}dependencies {
implementation 'com.github.murcisluis.BasePlugin:bungeecord:v2.3.1'
implementation 'com.github.murcisluis.BasePlugin:common:v2.3.1'
}dependencies {
implementation 'com.github.murcisluis:BasePlugin:v2.3.1'
}✅ Sin configuración adicional - No necesitas tokens ni autenticación
📖 Instrucciones detalladas: Ver JITPACK.md para guía completa de configuración con JitPack.
Paso 1: Agregar repositorio JitPack:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>Paso 2: Agregar dependencias según tu plataforma:
<dependencies>
<dependency>
<groupId>com.github.murcisluis.BasePlugin</groupId>
<artifactId>spigot</artifactId>
<version>v2.3.1</version>
</dependency>
<dependency>
<groupId>com.github.murcisluis.BasePlugin</groupId>
<artifactId>common</artifactId>
<version>v2.3.1</version>
</dependency>
</dependencies><dependencies>
<dependency>
<groupId>com.github.murcisluis.BasePlugin</groupId>
<artifactId>bungeecord</artifactId>
<version>v2.3.1</version>
</dependency>
<dependency>
<groupId>com.github.murcisluis.BasePlugin</groupId>
<artifactId>common</artifactId>
<version>v2.3.1</version>
</dependency>
</dependencies>💡 Tip: Para ejemplos completos y detallados, consulta el módulo
examples/
package com.tudominio.tuplugin;
import com.gmail.murcisluis.base.common.api.BaseAPIFactory;
import com.gmail.murcisluis.base.spigot.api.BaseSpigotAPI;
import com.gmail.murcisluis.base.common.api.BasePlugin;
import org.bukkit.plugin.java.JavaPlugin;
public class TuPlugin extends JavaPlugin implements BasePlugin {
@Override
public void onLoad() {
// Inicializar la API de BasePlugin
// Inicializar el framework
BaseAPIFactory.initialize(new BaseSpigotAPI());
BaseAPIFactory.getAPI().onLoad(this);
}
@Override
public void onEnable() {
// Habilitar la API
BaseAPIFactory.getAPI().onEnable();
// Tu lógica de plugin aquí
getLogger().info("Plugin habilitado usando BasePlugin Framework!");
// Registrar comandos personalizados (opcional)
// registerCommand(new MiComandoPersonalizado());
}
@Override
public void onDisable() {
// Deshabilitar la API de forma segura
BaseAPIFactory.getAPI().onDisable();
}
// Implementar métodos requeridos de BasePlugin
// Ver examples/ para implementaciones completas
}package com.tudominio.tuplugin;
import com.gmail.murcisluis.base.common.api.BaseAPIFactory;
import com.gmail.murcisluis.base.bungeecord.api.BaseBungeeCordAPI;
import com.gmail.murcisluis.base.common.api.BasePlugin;
import net.md_5.bungee.api.plugin.Plugin;
public class TuPlugin extends Plugin implements BasePlugin {
@Override
public void onLoad() {
BaseAPIFactory.initialize(new BaseBungeeCordAPI());
BaseAPIFactory.getAPI().onLoad(this);
}
@Override
public void onEnable() {
BaseAPIFactory.getAPI().onEnable();
getLogger().info("Plugin BungeeCord habilitado!");
// Registrar comandos personalizados (opcional)
// registerCommand(new MiComandoBungee());
}
@Override
public void onDisable() {
BaseAPIFactory.getAPI().onDisable();
}
// Implementar métodos requeridos de BasePlugin
// Ver examples/ para implementaciones completas
}// Acceder a la configuración
FileConfig config = BaseAPIFactory.get().getFileConfig("config.yml");
String valor = config.getString("mi.configuracion", "valor_por_defecto");
// Recargar configuraciones
Settings.reload();
Lang.reload();// Enviar mensajes modernos
Audience audience = BaseAPIFactory.get().audienceSender(player);
audience.sendMessage(Component.text("¡Hola mundo!").color(NamedTextColor.GREEN));
// Usar MiniMessage
Component message = MiniMessage.miniMessage().deserialize(
"<gradient:blue:green>¡Mensaje con gradiente!</gradient>"
);
audience.sendMessage(message);📖 Ejemplos completos: Consulta
examples/src/main/java/.../commands/para ver implementaciones detalladas.
@CommandInfo(
permission = "miplugin.usar",
usage = "/micomando <args>",
description = "Mi comando personalizado",
aliases = {"mc", "cmd"}
)
public class MiComando extends AbstractCommandSpigot implements CommandBaseSpigot {
public MiComando() {
super("micomando");
}
@Override
public CommandHandlerSpigot getCommandHandler() {
return (sender, args) -> {
sender.sendMessage("¡Comando ejecutado!");
return true;
};
}
@Override
public TabCompleteHandlerSpigot getTabCompleteHandler() {
return (sender, args) -> Arrays.asList("opcion1", "opcion2", "opcion3");
}
}plugins {
id 'java'
id 'com.gradleup.shadow' version '8.3.6'
}
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
repositories {
mavenCentral()
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url 'https://maven.pkg.github.com/murcisluis/BasePlugin' }
}
dependencies {
implementation 'com.gmail.murcisluis:BasePlugin-spigot:2.3.0'
compileOnly 'org.spigotmc:spigot-api:1.21.4-R0.1-SNAPSHOT'
}
tasks {
shadowJar {
// Relocate BasePlugin para evitar conflictos
relocate 'com.gmail.murcisluis.base', 'com.tudominio.tuplugin.libs.base'
// Minimizar el JAR
minimize()
// Merge service files
mergeServiceFiles()
}
build {
dependsOn shadowJar
}
}initialize(BaseAPI api): Inicializa la APIgetAPI(): Obtiene la instancia de la APIget(): Obtiene la implementación BasegetPlugin(): Obtiene el plugin baseisInitialized(): Verifica si está inicializadoshutdown(): Cierra la API de forma segura
- Single Responsibility: Cada clase tiene una responsabilidad específica
- Open/Closed: Extensible sin modificar el código base
- Liskov Substitution: Las implementaciones son intercambiables
- Interface Segregation: Interfaces específicas y cohesivas
- Dependency Inversion: Dependencias de abstracciones, no concreciones
El proyecto incluye un módulo examples/ con implementaciones de referencia:
examples/
├── src/main/java/com/gmail/murcisluis/base/examples/
│ ├── bungeecord/
│ │ ├── ExampleBungeePlugin.java # Plugin BungeeCord de ejemplo
│ │ └── commands/
│ │ └── ExampleCommandBungee.java # Comando BungeeCord de ejemplo
│ └── spigot/
│ ├── ExampleSpigotPlugin.java # Plugin Spigot de ejemplo
│ └── commands/
│ └── ExampleCommandSpigot.java # Comando Spigot de ejemplo
└── README.md # Documentación detallada
- Consulta el README del módulo examples
- Copia las clases que necesites a tu proyecto
- Modifica según tus necesidades específicas
- Personaliza comandos, configuraciones y lógica
⚠️ Importante: Los ejemplos son para referencia educativa. No los uses directamente en producción sin adaptarlos.
- Framework Core: Solo APIs y utilidades
- Examples: Implementaciones completas y funcionales
- Tu Plugin: Adaptación personalizada de los ejemplos
- 🐛 Fix: Corregido error de compilación en
CommandManagerSpigot.java- Solucionado "incompatible types: invalid method reference" en línea 36
- Cambiado
CommandManagerSpigot::unregisterporthis::unregister
- 🔧 Mejoras: Actualizado
ReflectionUtilcon mejoras de LujoEmotes- Sistema de caché para campos con
ConcurrentHashMap - Nuevo método
getFieldValue()para obtener valores de campos - Anotaciones JetBrains
@NotNully@Nullable - Documentación JavaDoc completa
- Manejo mejorado de errores sin spam en logs
- Optimizaciones de rendimiento thread-safe
- Sistema de caché para campos con
- 🔧 CommandManagerSpigot Dinámico: El registro de comandos ahora usa el nombre del plugin dinámicamente en lugar de "BasePlugin" hardcoded
- 🏗️ Constructor Mejorado: CommandManagerSpigot ahora requiere una instancia de JavaPlugin en su constructor
- 📦 Métodos de Instancia: Los métodos
register()yunregister()ahora son de instancia en lugar de estáticos - 🎯 Mayor Flexibilidad: El framework puede ser usado por cualquier plugin sin modificaciones
- Java 21: Actualización de Java 17 a Java 21
- Gradle 8.3+: Actualización del sistema de build
- Shadow Plugin: Migración a
com.gradleup.shadow - API Thread-Safe: Implementación mejorada del singleton
- Dependencias Actualizadas: Todas las librerías a sus últimas versiones
- Actualizar Java a versión 21
- Actualizar Gradle a 8.3+
- Cambiar el plugin Shadow en build.gradle
- Actualizar las llamadas a la API si es necesario
- Recompilar el proyecto
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
- Issues: GitHub Issues
- Email: murcisluis@gmail.com
- Discord: Servidor de Discord
- Comunidad de Spigot/BungeeCord
- Desarrolladores de Adventure API
- Contribuidores del proyecto
¡Hecho con ❤️ para la comunidad de Minecraft!