UltimatePerms
UltimatePerms
An ultimate Permission Management plugin for PocketMine-MP
Tabla de Contenidos
-
Características
-
Instalación
-
Configuración
-
Comandos
-
Sistema de Permisos
-
Grupos y Rangos
-
Almacenamiento
-
API Pública
-
Wiki Completa
Características
✅ Sistema de Permisos Contextual — Permisos que varían según el mundo o gamemode
✅ Grupos con Jerarquía — Herencia lineal con detección de ciclos
✅ Rangos Temporales — Expiración automática de permisos y rangos
✅ Múltiples Rangos por Jugador — Combinación de varios grupos
✅ Chat Formatter Personalizado — Prefijos, sufijos y colores dinámicos
✅ 4 Backends de Almacenamiento — YAML, JSON, SQLite, MySQL
✅ Eventos de Expiración — RankExpireEvent, PermissionExpireEvent, GroupPermExpireEvent
✅ Wildcard Support — Permisos con comodines (essentials.*) y negación específica
✅ Metadata Personalizada — Key-value libre para extensibilidad
✅ API Pública — Integración fácil con otros plugins
Instalación
Requisitos
PocketMine-MP 5.0.0 o superior
- PHP 8.1+
Pasos
-
Copiar la carpeta del plugin a plugins/
-
Iniciar el servidor — el plugin creará config.yml automáticamente
-
Verificar instalación ejecutando /uperms
Configuración
config.yml
── Chat & Display ────────────────────────────────────────────────────
Placeholders: {prefix} {suffix} {name} {displayname}
{message} {group} {group_display} {chat_color}
chat: enabled: true format: "{prefix}{name}{suffix}§r: {chat_color}{message}"
nametag: enabled: true format: "{prefix}{name}{suffix}"
displayName: enabled: true
locale: en_US
── Storage ──────────────────────────────────────────────────────────
storage:
Opciones: yaml | json | sqlite | mysql
type: json
Solo necesario si type: mysql
mysql: host: 127.0.0.1 port: 3306 user: root password: "" database: ultimateperms
Elegir Backend de Almacenamiento
JSON (por defecto)
storage: type: json
MySQL (recomendado para servidores grandes)
storage: type: mysql mysql: host: tu-servidor.com port: 3306 user: ultimateperms password: tu-contraseña database: ultimateperms
Comandos
Comando Principal: /uperms · alias: /up, /perms
Usuarios (ultimateperms.command.user)
Información del jugador
/uperms user
Gestión de rangos
/uperms user
Permisos personales (overrides)
/uperms user
Auditoría de permisos resueltos
/uperms user
Prefix / Suffix personal
/uperms user
Metadata
/uperms user
Grupos (ultimateperms.command.group)
Listar todos los grupos (ordenados por weight)
/uperms group list
Crear / info / eliminar / clonar
/uperms group
Permisos del grupo
/uperms group
Herencia (un solo padre por grupo)
/uperms group
Display
/uperms group
Metadata
/uperms group
Diagnóstico
Verificar origen de un permiso con trazabilidad
/uperms check
Simular permiso con contexto personalizado (sin aplicar)
/uperms simulate
alias: /uperms sim
Listar permisos registrados por un plugin
/uperms inspect
Recargar config.yml y recalcular permisos de todos los jugadores online
/uperms reload
Abrir interfaz gráfica (experimental)
/uperms ui
Formato de Duración
Sufijo Unidad Ejemplo
Y Años 1Y
M Meses 2M
w Semanas 3w
d Días 7d
h Horas 24h
m Minutos 30m
s Segundos 3600s
Se pueden combinar: 1d12h = 36 horas. Omitir duración = permanente.
Ejemplos Prácticos
Crear rango YouTuber
/uperms group youtuber create "§c§lYouTuber" 65
Establecer herencia
/uperms group youtuber parent set vip
Agregar permisos
/uperms group youtuber perm set essentials.fly true
Prohibir fly solo en PvP
/uperms group youtuber perm set essentials.fly false world=pvp
Asignar a jugador permanente (reemplaza rangos anteriores)
/uperms user John group set youtuber
Asignar temporalmente 7 días (sin reemplazar)
/uperms user John group add youtuber 7d
Verificar origen de un permiso
/uperms check John essentials.fly
Simular en otro contexto
/uperms simulate John essentials.fly world=pvp
Sistema de Permisos
Algoritmo de Resolución
El plugin resuelve permisos en este orden de prioridad:
Overrides Personales (máxima prioridad) — permisos asignados directamente al jugador; las negaciones explícitas siempre prevalecen
Grupos del Jugador (ordenados por weight DESC) — se procesan del más pesado al menos pesado
Herencia de Grupos — cada grupo puede heredar de un único padre
Wildcard Support — essentials.* cubre essentials.fly, essentials.nick, etc.
Default: Denegado — si un permiso no está definido en ningún nivel, se deniega
Contextos
Los permisos pueden condicionarse a contextos. Los contextos disponibles son world y gamemode, calculados automáticamente cuando el jugador cambia de mundo o modo de juego.
Permiso global (sin contexto = siempre aplica)
/uperms group vip perm set essentials.fly true
Solo en mundo específico
/uperms group vip perm set essentials.fly true world=creative
Solo en gamemode específico
/uperms group vip perm set essentials.nick true gamemode=survival
Negación en contexto (sobreescribe herencia)
/uperms group vip perm set essentials.fly false world=pvp
Múltiples contextos en un mismo nodo
/uperms user John perm set mycommand.use true world=spawn gamemode=survival
Wildcards
Otorgar todos los permisos bajo essentials
/uperms group admin perm set essentials.* true
Negar uno específico dentro del wildcard
/uperms group admin perm set essentials.ban false
Resultado: tiene todo de essentials EXCEPTO essentials.ban
Grupos y Rangos
Crear Grupo
/uperms group youtuber create "§c§lYouTuber" 65
Parámetros:
youtuber — ID único e inmutable del grupo (lowercase)
"§c§lYouTuber" — Nombre mostrado (soporta códigos de color §)
65 — Weight: mayor = más prioritario en resolución y para el prefijo visible
Jerarquía
Cada grupo puede tener un único padre. La herencia es lineal y el plugin detecta y bloquea ciclos automáticamente:
default (weight=0) ↑ vip (weight=30) ↑ youtuber (weight=65) ↑ admin (weight=100)
Establecer padre
/uperms group youtuber parent set vip
Quitar herencia
/uperms group youtuber parent unset
Protecciones automáticas:
-
Ciclos de herencia (A→B→C→A) — bloqueados
-
Auto-herencia — bloqueada
-
Padres inexistentes — bloqueados; al cargar, el padre se ignora con una advertencia en log
Multi-Rango
Un jugador puede tener varios rangos simultáneamente:
/uperms user John group set vip # Asigna vip, elimina otros rangos /uperms user John group add helper 7d # Agrega helper temporal, mantiene vip
Permisos = unión de todos los grupos + overrides personales
Prefijo = del grupo con mayor weight
Display
/uperms group youtuber setprefix "§7[§c§lYT§7] §f" /uperms group youtuber setsuffix " §c♦"
Override personal para un jugador específico
/uperms user John prefix set "§b[CUSTOM] " /uperms user John suffix set " §b⭐"
Volver al prefijo del grupo
/uperms user John prefix unset
Chat formatter — Placeholders
Placeholder Valor
{prefix} Prefijo resuelto (personal > grupo primario > herencia)
{suffix} Sufijo resuelto (misma lógica)
{name} Nombre del jugador
{displayname} Display name actual (nametag)
{message} Mensaje del chat
{group} ID del grupo primario
{group_display} DisplayName del grupo primario
{chat_color} Meta chat-color (personal > grupo)
Almacenamiento
Tipos Disponibles
Tipo Descripción Recomendado para
json Un archivo JSON por jugador, grupos en un archivo separado Inicio, desarrollo
yaml Equivalente en formato YAML Desarrollo
sqlite Base de datos SQLite local Servidores medianos
mysql Base de datos MySQL remota Servidores grandes
Setup MySQL:
CREATE DATABASE ultimateperms; CREATE USER 'ultimateperms'@'localhost' IDENTIFIED BY 'contraseña'; GRANT ALL PRIVILEGES ON ultimateperms.* TO 'ultimateperms'@'localhost'; FLUSH PRIVILEGES;
API Pública
Otros plugins pueden acceder a UltimatePerms declarando la dependencia en plugin.yml:
depend:
- UltimatePerms
Obtener Instancias
use appgallery\uperms\Loader;
sessionManager = groupManager = storage = $loader->getStorage();
Consultar Sesión de Jugador
Nota: Los métodos de sesión solo funcionan con jugadores online.
// Por nombre de jugador sessionManager->getByName("PlayerName");
// Por XUID sessionManager->get($player->getXuid());
if (session !== null) { // Verificar permiso (usa el caché resuelto) session->hasPermission("essentials.fly");
// Obtener rangos: [groupId => expiresAt|null] session->getGroups();
// Rango primario (mayor weight) sessionManager->getPrimaryGroup($session); // Group|null
// Prefix / suffix actuales session->getPrefix(); session->getSuffix();
// Metadata session->getMeta("max-homes");
// Contexto actual session->getContext(); // ["world" => "...", "gamemode" => "..."]
// Todos los permisos resueltos session->getResolvedPermissions(); // [permission => bool] }
Gestión de Rangos (vía SessionManager)
// Asignar rango — elimina todos los rangos anteriores excepto el default player, "vip");
// Asignar temporal sessionManager->setGroup(expiresAt);
// Agregar rango sin reemplazar otros player, "event-bonus", $expiresAt);
// Quitar rango (si el jugador se queda sin rangos, se asigna el grupo default) player, "event-bonus");
Gestión de Permisos Personales
use appgallery\uperms\permission\node\Node;
// Permiso permanente sessionManager->addNode(node);
// Permiso temporal con contexto sessionManager->addNode(node);
// Quitar override personal player, "essentials.fly");
Consultar Grupos
groupManager->get("youtuber"); // Group|null
if (group !== null) { group->getId(); // "youtuber" group->getWeight(); // 65 group->getPrefix(); // "§7[§c§lYT§7] §f" group->getMetaValue("max-homes"); // string|null $group->getNodes(); // Node[] }
// Grupo por defecto groupManager->getDefault(); // siempre existe
Eventos de Expiración
Clase Cuándo se dispara
appgallery\uperms\event\GroupExpireEvent Un rango temporal de un jugador expira
appgallery\uperms\event\PermissionExpireEvent Un nodo personal temporal de un jugador expira
appgallery\uperms\event\GroupPermExpireEvent Un nodo temporal de un grupo expira
use appgallery\uperms\event\GroupExpireEvent; use appgallery\uperms\event\PermissionExpireEvent; use appgallery\uperms\event\GroupPermExpireEvent; use pocketmine\event\Listener;
class MyListener implements Listener {
// Cuando expira el rango de un jugador public function onGroupExpire(GroupExpireEvent event): void { player = groupId = player->sendMessage("§cTu rango $groupId ha expirado."); }
// Cuando expira un permiso personal de un jugador public function onPermExpire(PermissionExpireEvent event): void { player = node = permission = $event->getPermission(); // string }
// Cuando expira un nodo temporal en un grupo public function onGroupPermExpire(GroupPermExpireEvent event): void { group = node = permission = $event->getPermission(); // string } }
Permisos de Plugin
Todos los permisos tienen default: op.
Nodo Descripción
ultimateperms.admin Acceso total al plugin
ultimateperms.notify.expire Recibir notificaciones cuando expiran permisos o rangos
ultimateperms.command Acceso a la ayuda general
ultimateperms.command.check Verificar permisos de jugadores
ultimateperms.command.inspect Inspeccionar permisos de plugins
ultimateperms.command.reload Recargar configuración
ultimateperms.command.simulate Simular permisos con contexto
ultimateperms.command.ui Interfaz gráfica (experimental)
ultimateperms.command.group Comandos de gestión de grupos
ultimateperms.command.group.create Crear grupos
ultimateperms.command.group.delete Eliminar grupos
ultimateperms.command.group.info Ver información de grupos
ultimateperms.command.group.edit Editar grupos
ultimateperms.command.user Comandos de gestión de usuarios
ultimateperms.command.user.audit Ver auditoría de permisos
ultimateperms.command.user.info Ver información de jugadores
ultimateperms.command.user.perm Gestionar overrides personales
ultimateperms.command.user.meta Gestionar metadata de jugadores
ultimateperms.command.user.group Asignar/quitar rangos a jugadores
Desarrollado por AppGallery