Arcadia Admin Pannel

**Arcadia Admin Panel** is a powerful server administration tool designed to simplify player management through an intuitive and modern GUI. Stop typing long commands! Manage your server efficiently with just a few clicks.

File Details

arcadia-admin-panel-1.2.6

  • R
  • Jun 9, 2026
  • 227.07 KB
  • 112
  • 1.21.1
  • NeoForge

File Name

arcadia-admin-panel-1.2.6.jar

Supported Versions

  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:arcadia-admin-pannel-1427236:8221598"
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

## [1.2.6] - 2026-06-08 (latest)

### Security

- **GUI privilege escalation via forged slot-click packets (TELEPORT)** — The admin panel's two-layer permission model (hide the button if the viewer lacks the node, AND re-check the node in the click handler so a crafted packet can't trigger an unrendered action) had holes on every teleport path that didn't go through a numbered slot case. A staff member granted `arcadia.adminpanel.open` but **not** `arcadia.adminpanel.teleport` could craft a click packet and teleport anyway via: the player-detail **homes** grid (slots 9–35) and **teleport-history** row (slots 36–44), and the **team-detail** member right-click (TP to last-seen). None re-checked `TELEPORT` before executing. All now re-check `arcadia.adminpanel.teleport` in the handler, and the home/history buttons are also hidden at build time when the viewer lacks it.
- **Team browser reachable without `arcadia.adminpanel.teams`** — The Teams button on the main menu and the team-list/team-detail menus gated only on FTB Teams being installed, never on the `TEAMS` node, so any panel user could browse every team's roster and members. The whole Teams chain (main button → team list → team detail) now requires `arcadia.adminpanel.teams` at both the visibility and action layers.
- **Warn deletion only required `warn.view`** — The delete-on-click handler in the warn list gated on "is staff" (panel access) rather than `arcadia.adminpanel.warn.edit`, so a moderator with view-only warn permission could delete warns through the GUI. Deletion now re-checks `WARN_EDIT`, and the delete hint is hidden from view-only viewers.
- **Player info sheet had no permission node** — The info book (ban/whitelist status, login history, last-seen) rendered and opened for anyone who could open the panel, with no node of its own. New node `arcadia.adminpanel.info` now gates both its visibility and its action.

### Fixed

- **Jail auto-release could fire instantly on extreme durations** — `jailInternal` cast `durationMs / 50` straight to `int`; a duration above ~107 billion ms overflowed to a negative tick delay and released the player immediately. Now clamped with `Math.max(1, …)` and bounded to `Integer.MAX_VALUE`, matching the startup and unjail schedulers.
- **Command failures were swallowed to `System.err`** — Eight command handlers caught exceptions with `printStackTrace()`. They now log through the mod's SLF4J logger so failures land in the server log with context instead of raw stderr spam.

### Added

- **Name-tag system — hide-behind-walls + colours & effects** — A full server-authoritative name-tag suite under `/arcadia_adminpanel nametag …`. **Hide behind walls** (ON by default): a player's floating name is suppressed client-side whenever a solid block sits on the line of sight between the observer's camera and that player, so you can't read who's hiding behind a wall (transparent blocks like glass/leaves don't occlude unless `nameTagOccludeTransparent` is enabled; per-player `exempt` keeps a name always visible). **Name styling**: `color <player> <named>` (16 vanilla colours), `rgb <player> <#hex>` (true 24-bit colour), `gradient <player> <#hex> <#hex> [#hex] [#hex]` (static multi-stop gradient), `effect <player> <effect>` with ten effects — **solid, gradient, rainbow, breathing, chase, wave, blink, fade, typewriter, random** — `style <player> <flag> <on|off>` (bold/italic/underline/strikethrough/obfuscated), `speed <player> <1-10>`, plus `reset`/`show`. Two new permission nodes: `arcadia.adminpanel.nametag` (edit) and `arcadia.adminpanel.nametag.hide` (global switch + exemptions). State persists to `config/arcadia/arcadiaadminpanel/nametags.json` and is synced to clients on join via new S2C packets; animated effects render smoothly off a client tick clock. All mutation is permission-checked server-side — there is no client→server name-tag packet, so a crafted packet can't restyle anyone.
- **`/arcadia_adminpanel loginqueue [on|off]`** — The login-throttle queue was config-file-only and its reserved permission node `arcadia.adminpanel.loginqueue` was never enforced. A runtime toggle command now shows or flips `loginQueueEnabled` (persisted to `config.json`), gated on that node — the node is no longer dead.
- **Granular mute node on the command path** — `/arcadia_adminpanel mute` / `unmute` now require `arcadia.adminpanel.mute` in addition to the `MOD` staff grade, matching the GUI's dual gate so one role config governs both. `checkwarn` is now gated on `arcadia.adminpanel.open` for auditability (it remains a read-only self-view).

### Changed

- **Arcadia Lib 1.2.9 → 1.2.14** — Picks up the lib's fail-closed permission backend (`PermissionBackend.DENY` is the dedicated-server default, so a missing/uninitialized LuckPerms no longer implicitly grants every node), the UUID-based debug-mode hardening, and the safe-command allow-list. 1.2.14 adds the **lazy LuckPerms backend binding** fix (a late provider registration no longer pins the whole session to fail-closed `DENY`, which had locked every `arcadia.*` node — the panel's permission checks included — until restart), a synchronous user-cache fallback so a permission probe on the join tick resolves correctly, and `DashboardScreen` / `ArcadiaHubScreen` per-frame allocation cuts. No API changes affect the admin panel.

### Performance

- **Player detail menu reads FTB data at most once per session** — `readPlayerData` (a file read + NBT/JSON parse on the server thread) was re-run on every home/history/TP click and the info sheet after already being read on menu build. A per-instance cache, reset on each rebuild, collapses these to a single read.
- **Jail proximity sweep no longer allocates a dimension string per tick** — The per-second anti-escape sweep called `…dimension().location().toString()` for every jailed player. The jail dimension is now parsed to a `ResourceLocation` once and compared by object, removing the per-iteration string allocation.
- **Client search no longer recompiles its regex per frame** — The player-list search stripped colour codes with an inline `replaceAll` pattern on up to 45 heads every render frame; the pattern is now compiled once as a static field.

### Sécurité

- **Élévation de privilèges via paquets de clic forgés (TELEPORT)** — Le modèle de permission à deux couches du panneau (cacher le bouton si le joueur n'a pas le nœud, ET re-vérifier le nœud dans le gestionnaire de clic pour qu'un paquet forgé ne puisse pas déclencher une action non rendue) avait des trous sur toutes les téléportations passant par une grille de slots plutôt qu'un case numéroté. Un staff ayant `arcadia.adminpanel.open` mais **pas** `arcadia.adminpanel.teleport` pouvait quand même téléporter via : la grille **homes** (slots 9–35), l'historique de **téléportation** (slots 36–44) et le clic droit sur un **membre d'équipe** (TP dernière position). Aucun ne re-vérifiait `TELEPORT` avant d'agir. Tous re-vérifient désormais `arcadia.adminpanel.teleport`, et les boutons homes/historique sont aussi masqués à la construction.
- **Navigateur d'équipes accessible sans `arcadia.adminpanel.teams`** — Le bouton Équipes et les menus liste/détail d'équipe ne dépendaient que de la présence de FTB Teams, jamais du nœud `TEAMS` ; n'importe quel utilisateur du panneau pouvait parcourir les rosters. Toute la chaîne Équipes exige maintenant `arcadia.adminpanel.teams` aux deux couches (visibilité + action).
- **La suppression d'avertissement n'exigeait que `warn.view`** — Le gestionnaire de suppression au clic se basait sur « est staff » (accès panneau) plutôt que sur `arcadia.adminpanel.warn.edit` ; un modérateur en lecture seule pouvait supprimer des avertissements via le GUI. La suppression re-vérifie désormais `WARN_EDIT`, et l'astuce de suppression est masquée aux lecteurs sans ce nœud.
- **La fiche d'info joueur n'avait aucun nœud de permission** — Le livre d'info (statut ban/whitelist, historique de connexion, dernière position) s'affichait et s'ouvrait pour quiconque pouvait ouvrir le panneau, sans nœud propre. Le nouveau nœud `arcadia.adminpanel.info` gère désormais sa visibilité et son action.

### Correctifs

- **La libération automatique de prison pouvait se déclencher immédiatement sur des durées extrêmes** — `jailInternal` convertissait `durationMs / 50` directement en `int` ; une durée au-delà de ~107 milliards de ms débordait en délai de ticks négatif et libérait le joueur aussitôt. Désormais borné avec `Math.max(1, …)` et plafonné à `Integer.MAX_VALUE`, comme les planificateurs de démarrage et de libération.
- **Les échecs de commande étaient avalés vers `System.err`** — Huit gestionnaires de commande capturaient les exceptions avec `printStackTrace()`. Ils passent maintenant par le logger SLF4J du mod pour que les échecs arrivent dans le log serveur avec contexte au lieu du stderr brut.

### Ajouts

- **Système de pseudos — masquage derrière les murs + couleurs & effets** — Une suite complète de gestion des pseudos, autoritaire côté serveur, sous `/arcadia_adminpanel nametag …`. **Masquage derrière les murs** (activé par défaut) : le pseudo flottant d'un joueur est supprimé côté client dès qu'un bloc plein se trouve sur la ligne de vue entre la caméra de l'observateur et ce joueur — impossible de lire qui se cache derrière un mur (les blocs transparents comme le verre/les feuilles ne masquent pas, sauf si `nameTagOccludeTransparent` est activé ; `exempt` rend le pseudo d'un joueur toujours visible). **Stylisation** : `color <joueur> <nom>` (16 couleurs vanilla), `rgb <joueur> <#hex>` (vraie couleur 24 bits), `gradient <joueur> <#hex> <#hex> [#hex] [#hex]` (dégradé multi-couleurs figé), `effect <joueur> <effet>` avec dix effets — **solid, gradient, rainbow, breathing, chase, wave, blink, fade, typewriter, random** — `style <joueur> <option> <on|off>` (gras/italique/souligné/barré/obfusqué), `speed <joueur> <1-10>`, plus `reset`/`show`. Deux nouveaux nœuds de permission : `arcadia.adminpanel.nametag` (édition) et `arcadia.adminpanel.nametag.hide` (interrupteur global + exemptions). L'état persiste dans `config/arcadia/arcadiaadminpanel/nametags.json` et est synchronisé aux clients à la connexion via de nouveaux paquets S2C ; les effets animés sont rendus de façon fluide via une horloge de tick client. Toute modification est vérifiée par permission côté serveur — il n'existe aucun paquet client→serveur de pseudo, donc un paquet forgé ne peut restyler personne.
- **`/arcadia_adminpanel loginqueue [on|off]`** — La file d'attente de connexion n'était configurable que par fichier et son nœud réservé `arcadia.adminpanel.loginqueue` n'était jamais appliqué. Une commande de bascule runtime affiche ou inverse `loginQueueEnabled` (persisté dans `config.json`), gérée par ce nœud — le nœud n'est plus mort.
- **Nœud de mute granulaire côté commande** — `/arcadia_adminpanel mute` / `unmute` exigent désormais `arcadia.adminpanel.mute` en plus du grade staff `MOD`, comme le double verrou du GUI, pour qu'une seule config de rôle régisse les deux. `checkwarn` est désormais gérée par `arcadia.adminpanel.open` pour l'auditabilité (elle reste une auto-consultation en lecture seule).

### Modifications

- **Arcadia Lib 1.2.9 → 1.2.14** — Récupère le backend de permission fail-closed de la lib (`PermissionBackend.DENY` est le défaut sur serveur dédié, donc un LuckPerms manquant/non initialisé n'accorde plus implicitement tous les nœuds), le durcissement du mode debug basé UUID et la liste blanche de commandes sûres. 1.2.14 ajoute le correctif de **liaison paresseuse du backend LuckPerms** (un enregistrement tardif du provider ne fige plus toute la session en `DENY` fail-closed, ce qui verrouillait tous les nœuds `arcadia.*` — y compris les vérifications de permission du panneau — jusqu'au redémarrage), un repli synchrone sur le cache utilisateur pour qu'une sonde de permission au tick de connexion se résolve correctement, et des réductions d'allocations par frame dans `DashboardScreen` / `ArcadiaHubScreen`. Aucun changement d'API n'affecte le panneau.

### Performance

- **Le menu détail joueur lit les données FTB une seule fois par session** — `readPlayerData` (lecture fichier + parsing NBT/JSON sur le thread serveur) était relancé à chaque clic home/historique/TP et sur la fiche d'info, après l'avoir déjà lu à la construction. Un cache par instance, réinitialisé à chaque reconstruction, réduit cela à une seule lecture.
- **La surveillance de proximité de prison n'alloue plus de chaîne de dimension par tick** — La sweep anti-évasion (chaque seconde) appelait `…dimension().location().toString()` pour chaque joueur emprisonné. La dimension de la prison est désormais parsée en `ResourceLocation` une fois et comparée par objet, supprimant l'allocation de chaîne par itération.
- **La recherche client ne recompile plus sa regex à chaque frame** — La recherche de la liste de joueurs retirait les codes couleur avec un motif `replaceAll` inline sur jusqu'à 45 têtes à chaque frame de rendu ; le motif est désormais compilé une fois en champ statique.