HomeJavaModsKRCore
KRCore
[​IMG]

Características

Instalación
  1. Descarga KSCore-1.0-SNAPSHOT.jar.
  2. Coloca el JAR en plugins/ de tu servidor Paper.
  3. Arranca. KSCore genera plugins/KSCore/config.yml.
KSCore no expone comandos de usuario final. Su presencia habilita el resto de plugins del ecosistema.

Requisitos
Requisito Versión mínima
Servidor Paper 1.21+ (api-version 26.2) — Folia compatible
Java 21
Comandos
Todos requieren permiso kscore.admin o superior.

Comando Descripción
/core recargar Recarga la configuración interna del núcleo
/core debug Alterna el modo debug (logs verbosos de cada módulo)
/core info Métricas del núcleo (módulos activos, tareas en cola, entidades cacheadas)
/core comandos Lista de todos los comandos registrados y su plugin de origen
Permisos
Permiso Default Descripción
kscore.admin op Nodo padre
kscore.admin.recargar op /core recargar
kscore.admin.debug op /core debug
kscore.admin.info op /core info
Configuración
config.yml
Code (YAML):
[/B]debug : false                 # Traza verbosa de cada módulo
datos
:
  dialecto
: sqlite           # sqlite | mariadb
  # Sólo para MariaDB:
  host
: "localhost"
  puerto
: 3306
  base
: "ks"
  usuario
: ""
  password
: ""
  pool_max
: 10
mensajes
:
  idioma
: es
  archivo
: mensajes.yml     # Ruta relativa al datafolder del plugin anfitrión[B]

Uso para desarrolladores
Añadir dependencia
En paper-plugin.yml:

Code (YAML):
[/B]dependencies:
  server
:
    KSCore
:
      load
: BEFORE
      required
: true
En build.gradle.kts
:

compileOnly ( "studio.kuraky:ks-core:1.0-SNAPSHOT" ) [B ]


Plugin main mínimo

Code (Java):
[ /B ] public final class MiPlugin extends JavaPlugin { [ /B ]
[B ]
    private Nucleo nucleo ;
    @Override
    public void onEnable ( ) {
        this. nucleo = new Nucleo ( this, "com.midominio.miplugin" ) ;
        this. nucleo. iniciar ( ) ;
    }
    @Override
    public void onDisable ( ) {
        if (nucleo != null ) nucleo. detener ( ) ;
    }
}


El Nucleo escanea el paquete indicado y encuentra automáticamente todo lo anotado.

Config

Code (Java):
[ /B ]@Archivo (ruta = "config.yml" )
public final class ConfigMiPlugin extends ArchivoYaml {
    @Seccion ( "general" )
    public General general = new General ( ) ;
    public static final class General {
        @Comentario ( "Mensaje mostrado al arrancar." )
        public String saludo = "Hola" ;
        public int limite = 100 ;
    }
}

// En cualquier sitio:
ConfigMiPlugin cfg = Archivos. obtener (ConfigMiPlugin. class ) ;
cfg. recargar ( ). join ( ) ;

[SIZE = 4 ] [B ]Comando [ /B ] [ /SIZE ]

[B ] [code ]@Comando (nombre = "miplugin", alias = { "mp" },
         permiso = "miplugin.usar",
         descripcion = "Comando principal." )
public final class ComandoMiPlugin {
    @ Principal
    public void raiz (Contexto ctx ) {
        ctx. enviar ( "&aHola &f" + ctx. emisor ( ). getName ( ) ) ;
    }
    @Sub (nombre = "dar", permiso = "miplugin.admin",
         uso = "<jugador> <cantidad>" )
    public void dar (Contexto ctx,
                    @Arg ( "jugador" ) Player destino,
                    @Arg ( "cantidad" ) int cantidad ) {
        // ...
    }
}


Base de datos

Code (Text):
@Tabla(nombre = "miplugin_usuarios", cacheMinutos = 15, cacheMaximo = 2000)
public final class Usuario {
    @Id                              public UUID id;
    @Columna(indice = true)          public String nombre = "";
    @Columna                         public int puntos;
    @Columna                         public Instant registrado = Instant.EPOCH;
}
Repositorio<Usuario, UUID> repo = Datos.repositorio(Usuario.class);
repo.obtener(uuid).enHiloPrincipal(opt -> {
    Usuario u = opt.orElseGet(() -> nuevoUsuario(uuid));
    u.puntos += 10;
    repo.guardar(u);
});


Evento programático

Code (Java):
[ /B ]Suscripcion s = Eventos. escuchar (BlockBreakEvent. class,
        Prioridad. ALTA, true, e -> {
    if (e. getBlock ( ). getType ( ) == Material. DIAMOND_ORE ) {
        e. getPlayer ( ). sendMessage ( "¡Diamante!" ) ;
    }
} ) ;
// Al detener:
s. cancelar ( ) ; [B ]


Tareas
Code (Java):
[ /B ]

// Async con retorno síncrono:
nucleo. tareas ( ). asyncLuegoSync (
    ( ) -> repo. obtener (uuid ). futuro ( ). join ( ),
    resultado -> jugador. sendMessage ( "Cargado" )
) ;
// Repetitivo:
TareaCancelable t = nucleo. tareas ( ). repetir (20L, ( ) -> tick ( ) ) ;
t. cancelar ( ) ;
// Folia-safe (usa GlobalRegionScheduler internamente):
nucleo. tareas ( ). sync ( ( ) -> jugador. teleport (... ) ) ; [B ]


Módulos internos
KSCore expone estos módulos, cada uno accesible desde Nucleo:

  • ModuloConfiguracion — @Archivo + Archivos.obtener(...)
  • ModuloComandos — @CoMaNdO + registro Brigadier
  • ModuloEventos — @Escuchador + Eventos.escuchar(...)
  • ModuloDatos — @Tabla + Datos.repositorio(...)
  • ModuloMensajes — Mensajes.enviar(...)
  • ModuloItems — @Item (builders reutilizables)
  • ModuloGuis — @Menu + Gui base
  • ModuloEfectos — @Efecto (partículas, sonidos declarativos)
  • ModuloChat — hooks de chat con formato y filtros
Convertidores de tipos en comandos
Registrados por defecto:

  • Primitivos: int, long, double, float, boolean, String
  • Bukkit: Player, OfflinePlayer, World, Material
  • Utilidad: UUID, Duration, enums (cualquiera automáticamente)
  • Especial: String[] (varargs) para capturar el resto de argumentos
Registrar convertidor propio:

Code (Java):
[ /B ]Convertidores. registrar (MiTipo. class, new Convertidor <MiTipo > ( ) {
    @Override public MiTipo convertir (Contexto ctx, String texto ) {
        return MiTipo. parsear (texto ) ;
    }
    @Override public List <String > sugerencias (Contexto ctx, String parcial ) {
        return List. of ( "opcion1", "opcion2" ) ;
    }
} ) ; [B ]

Compatibilidad con Folia
KSCore detecta Folia al arrancar (via Class.forName("io.papermc.paper.threadedregions.RegionizedServer")) y enruta:

  • tareas.sync(...) → GlobalRegionScheduler
  • tareas.enEntidad(entidad, ...) → entidad.getScheduler()
  • tareas.enRegion(location, ...) → RegionScheduler
Los plugins que dependan de KSCore no necesitan comprobar Folia — el framework lo hace por ellos.
Quick facts

Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.

KRCore is a free Minecraft Java mod. Compatible with Minecraft 26.2. Downloaded 4 times (via Spigot). Download it and open it directly in the game.

Explore more