Contenido generado con IA — puede contener errores.

Sistemas

Compatibilidad

Qué tiene que ser el servidor, qué tiene que estar instalado al lado, dónde vive el dato y qué no hace este plugin a propósito.

Un bot es una entidad real en un hilo real del servidor, no una ilusión de paquetes. Eso decide casi todo lo que dice esta página: qué tiene que ser el servidor, qué tiene que cargar antes que él y dónde queda anotado el bot de un jugador.

Qué tiene que ser el servidor

RequisitoDetalle
Minecraft 1.21.9 o superiorCada bot es un org.bukkit.entity.Mannequin, un tipo de entidad que solo existe desde 1.21.9, y el jar se compila contra paper-api:1.21.9.
Paper, o un fork de PaperEl plugin se compila contra la API de Paper y usa superficies que solo existen ahí: el evento de knockback, los teletransportes asíncronos, la creación de perfiles para las skins y ocultar un mensaje de muerte. Spigot a secas no basta.
Java 21El jar se compila para release 21.
`api-version: '1.21'` es un suelo, no una promesa

plugin.yml declara 1.21 porque esa es la generación de la API a la que apunta el plugin. No es la versión en la que puedes correrlo: un servidor 1.21.4 carga el jar y luego no tiene ningún maniquí que invocar. El mínimo real es 1.21.9.

Folia

plugin.yml declara folia-supported: true, y en este plugin eso va de planificación, no de una insignia de compatibilidad.

Aquí nada corre en un bucle de tick global. El trabajo se programa donde vive aquello que toca:

  • El tick de un bot se programa en el bot, en el planificador de entidad del maniquí, una vez por tick.
  • Una invocación se programa en el destino, no en el jugador que la pidió. Invocar una entidad tiene que ocurrir en el hilo que posee la región donde aparece, y un duelo puede poner al bot en el extremo opuesto de la arena.
  • Una reaparición se programa en el dueño, porque es a quien hay que comprobar que sigue conectado y sigue en un mundo permitido.
  • La vida de un bot se republica cada tick en un campo que cualquiera puede leer, precisamente porque otro plugin que dibuje una barra de vida no puede tocar la entidad desde su propio hilo sin riesgo.

Una consecuencia que el dueño del servidor sí ve: un bot mantiene abierto su propio chunk mientras exista. Una entidad solo ejecuta su trabajo programado mientras su chunk está ticando, y un bot en un chunk que nadie tica se quedaría ahí desnudo y quieto. El ticket se libera en cuanto el bot desaparece.

Como la muerte de un bot ocurre en el hilo del propio bot, PracticeBotDeathEvent se dispara como asíncrono en un servidor multihilo, que es lo que realmente es. Cualquiera que lo escuche tiene que tratarlo así. Ver API.

Qué tiene que estar instalado

PluginPapel
packeteventsDependencia dura. depend: [packetevents] — el servidor no carga este plugin sin él. Nada del código propio de este plugin lo llama: PacketEvents es lo que usa ExyliaLib para efectos, displays, hologramas y NPCs. La dependencia dura es una garantía de orden de carga, no una señal de que este plugin hable con paquetes.
ExyliaLibDependencia blanda, a propósito. Todo de lo que está hecho el plugin viene de ella: configuración y migraciones, mensajes y tokens de color, menús, acciones, comandos, tareas, recargas, la base de datos y el propio contrato de la API del practice bot.
La dura no es la que más necesita

Se lee al revés, y el motivo está en el comentario del propio plugin.yml. ExyliaLib es la dependencia sin la que este plugin realmente no funciona, y justo por eso es blanda. Una dependencia dura impediría que el plugin cargara en un servidor que todavía no tiene la librería, y el loader que instala ExyliaLib es precisamente lo que tiene que cargar para que esa instalación ocurra.

El plugin también declara la misma lista de libraries en tiempo de ejecución que ExyliaLib — el framework de comandos, la caché, el pool de conexiones y todos los drivers de base de datos — en el mismo orden y las mismas versiones. El cargador de librerías del servidor busca cada una una sola vez y la comparte, así que nombrar un driver que el plugin nunca abre no cuesta nada, mientras que olvidar uno que ExyliaLib necesite después es un servidor que arranca y luego no puede escribir.

La base de datos

El bot de cada jugador es una fila en practicebot_players, escrita a través del módulo de base de datos de ExyliaLib:

Databases.of(plugin).repository(PlayerData.class)

Lo que significa que sigue al motor con el que esté configurada la librería. Este plugin no nombra ningún motor propio ni mantiene ninguna conexión propia. Los drivers de H2, MySQL, MariaDB, PostgreSQL y MongoDB están todos declarados en el bloque libraries para el cargador compartido; el que se usa de verdad es el que nombre la configuración de base de datos de ExyliaLib.

La fila se carga cuando un jugador entra, se guarda y se descarga cuando sale, y contiene todos los ajustes que un jugador puede cambiar: modo, dificultad, los dos interruptores, las cuatro piezas de armadura y sus encantamientos, las dos manos, knockback, fuerza, velocidad, resistencia al fuego y cada número que el menú avanzado puede mover.

Dos columnas se llaman como el campo contrario

Si lees la tabla directamente: la columna difficulty guarda el modo de combate, y la columna skill guarda la dificultad. Es el esquema 1.0 mantenido a propósito — la columna difficulty es lo que siempre guardó realmente el modo, y renombrarla le costaría el kit a cada fila existente. Las cuatro columnas de armadura y las de sus encantamientos conservan igualmente sus nombres de 1.0.

Los servidores que comparten base de datos comparten perfiles de bot, y /bot export e /bot import <archivo> los mueven: una exportación escribe un volcado en plugins/ExyliaPracticeBotV3/dumps/, y una importación lee un archivo de esa misma carpeta. Así se migra entre motores sin tocar SQL. Los dos son exyliapracticebot.admin. Ver Comandos.

Qué no hay aquí

  • Sin placeholders de PlaceholderAPI. El plugin no registra ninguno. Los nombres %...% de los archivos de menú son de ámbito de menú y los resuelve el propio plugin; ver Menús.
  • Sin generación de mundo y sin arenas. Un bot aparece donde estés de pie, en uno de los mundos listados en worlds — que viene con los cinco mundos sandbox de Exylia, no con una lista vacía — y nada más del mundo es asunto de este plugin.
  • Sin bots entre servidores. Una base de datos compartida comparte los ajustes con los que se construye un bot. El bot en sí es una entidad en un solo servidor.

¿Falta algo en esta página? Dínoslo en Discord