Plugin para Paper 1.21+ que permite cambiar entre servidores de una red Velocity mediante GUIs interactivas, conteo de jugadores en tiempo real y cola de lobbies con enrutamiento inteligente.
- GUI configurable (tamaño, bordes, botón cerrar, info del jugador)
- Conteo de jugadores por servidor vía plugin messaging (
PlayerCountAll) - Ítem en hotbar (slot configurable) + comando
/servidores - Iconos por material o cabezas con textura (URL, hash, base64, jugador)
- Barra de progreso de ocupación en cada servidor
- GUI dedicada con estados visuales en tiempo real:
- DIAMOND_BLOCK → lobby disponible (cupo libre)
- RED_CONCRETE → lleno, offline o deshabilitado
- Refresco automático mientras el menú está abierto (sincronizado con Velocity)
- Modos de enrutamiento:
manual: solo entra al lobby elegido si tiene cuposmart: si está lleno, busca otro lobby (fallback-server+ cadena global)
- Ítem abridor en slot 8 (configurable) + comando
/lobbies - Documentación detallada:
docs/LOBBY_VELOCITY.md
- MiniMessage en mensajes, títulos y GUIs (
<green>,<bold>,<gradient:...>, etc.) - Compatibilidad con hex legacy (
#RRGGBB) y códigos&
- Protección anti-drop del ítem selector y del abridor de lobbies
- Títulos y sonidos al conectar
- Recarga en caliente con
/reload
| Componente | Versión |
|---|---|
| Java | 21+ |
| Servidor backend | Paper 1.21+ |
| Proxy | Velocity 3.0+ |
| Plugin en Velocity | Debe implementar el canal serverconnector:main (p. ej. plugin Core) |
Los nombres en server-name / fallback-server deben coincidir con [servers] en velocity.toml.
mvn clean package
# JAR: target/Selector-1.0.jar- Copia el JAR en
plugins/del servidor Paper (backend detrás de Velocity). - Reinicia o recarga el servidor.
- Edita
plugins/Selector/config.yml. - Asegura que el proxy responda a
PlayerCountAlly ejecuteConnecten el mismo canal.
[servers]
lobby1 = "127.0.0.1:25565"
lobby2 = "127.0.0.1:25566"
lobby3 = "127.0.0.1:25567"
vanilla = "127.0.0.1:25568"| Comando | Permiso | Descripción |
|---|---|---|
/servidores |
selector.use |
Abre el selector de servidores |
/lobbies |
selector.lobbies |
Abre la cola de lobbies |
/reload |
selector.reload |
Recarga config.yml |
| Slot (por defecto) | Ítem | Acción |
|---|---|---|
| 4 | Brújula (selector) | Click → GUI de servidores |
| 8 | Esmeralda (lobbies) | Click → GUI de cola de lobbies |
El archivo se divide en secciones independientes (no están duplicadas):
| Sección | Función |
|---|---|
gui |
Apariencia del selector de servidores |
servers |
Servidores del selector (slot, icono, server-name) |
lobby-routing |
Reglas globales: modo click, refresco, cadena smart |
lobby-gui |
Apariencia de la GUI de lobbies (materiales, lore) |
lobbies |
Definición de cada lobby (cupo, fallback, slot) |
lobby-opener-item |
Ítem del slot 8 |
selector-item |
Ítem del slot 4 |
messages / titles / sounds |
Textos y efectos |
lobby-routing:
click-mode: smart # manual | smart
refresh-interval-ticks: 20 # actualización en GUI abierta (~1 s)
auto-route-chain:
- lobby1
- lobby2
- lobby3
lobbies:
lobby1:
enabled: true
slot: 11
name: "<green><bold>Lobby #1"
description: "<gray>Lobby principal"
server-name: "lobby1" # nombre en velocity.toml
fallback-server: "lobby2" # respaldo Velocity (modo smart)
max-players: 100Ver flujos y estados en docs/LOBBY_VELOCITY.md.
Formato en icon |
Ejemplo |
|---|---|
| Material | GRASS_BLOCK |
| URL de textura | http://textures.minecraft.net/texture/... |
| Hash | texture:8a49aca3... |
| Base64 (session profile) | base64:eyJ0ZXh0dXJlcyI6... |
| Jugador | player:Notch |
messages:
welcome: "<gradient:#00ff00:#ffff00>¡Bienvenido!"
connecting: "<green>✈ Conectando a <white>{server}<green>..."
lobby-gui:
lobby-items:
full-status: "<red>✖ Lleno"
click-available: "<yellow><bold>▶ Click para entrar"| Variable | Uso |
|---|---|
{player} |
Nombre del jugador |
{server} |
Servidor actual o destino |
{ping} |
Ping del jugador |
{description} |
Descripción del servidor/lobby |
{players} |
Conteo actual/máximo |
{current} / {max} |
Jugadores actuales / límite |
{status} |
Texto de estado del lobby |
{action} |
Línea de acción (click) |
{lobby} |
Clave del lobby en config |
Canal: serverconnector:main
| Subcanal | Dirección | Descripción |
|---|---|---|
PlayerCountAll |
Paper → Velocity | Solicita todos los conteos |
PlayerCountAll |
Velocity → Paper | Lista serverName + count |
PlayerCount |
Velocity → Paper | Actualización de un servidor |
Connect |
Paper → Velocity | Envía al jugador a serverName |
src/main/java/cl/xgamers/selector/
├── Selector.java # Plugin principal, eventos, selector GUI
├── LobbyGUI.java # GUI de lobbies + refresco en tiempo real
├── lobby/
│ ├── LobbyRoutingService.java
│ ├── LobbyState.java
│ ├── LobbyDefinition.java
│ └── LobbyConnectResult.java
├── velocity/
│ └── VelocityBridge.java
└── utils/
├── Colorize.java # MiniMessage
├── Heads.java # Cabezas (PlayerProfile / base64)
└── Hex.java
docs/
└── LOBBY_VELOCITY.md # Lógica de cola y Velocity
mvn clean packagepaper-api1.21.10 (provided)- FastInv 3.1.1 (shaded)
- Mojang
authlib(provided, cabezas vía Paper API)
El GUI no abre o el conteo es 0
- Jugadores deben entrar por Velocity (no standalone).
- Plugin proxy con canal
serverconnector:maininstalado y activo. server-nameen config = clave envelocity.toml.
Lobbies siempre en concreto rojo (offline)
- El proxy no devuelve ese servidor en
PlayerCountAll. - Revisa logs al abrir la GUI (timeout 10 ticks usa caché vacía).
Error MiniMessage / colores raros
- Usa solo tags MiniMessage en config (
<gray>, no mezclar con§pegado a tags). - Tras cambiar config:
/reloado reinicio.
Click en lobby lleno no redirige
lobby-routing.click-modedebe sersmart.- Comprueba que otro lobby tenga cupo y esté en
auto-route-chaino comofallback-server.
MIT — ver LICENSE.
- AeroSama — desarrollo principal
- _aero98 — colaborador
- blancocl — documentación
Web: blancocl.vercel.app