arcadia-admin-panel-1.3.3
Curse Maven Snippet
What's new
## [1.3.3] - 2026-09-27 (latest)
The compatibility release. The panel now sees the whole of what a player carries on a modded
server: the Curios, Accessories and Aether slots, the cosmetic armour, what is inside a Sophisticated
backpack. It also stops fighting PlayerSync over who owns an inventory, and hands its sanctions to
ArcadiaBridge when that is installed, so a ban issued in game reaches Discord and every server.
### Fixed
- **Vanish no longer announces itself.** Toggling vanish printed a fake "left the game" / "joined
the game" line to every player, which told the whole server a staff member was around. It is now
off by default. The setting was renamed to `vanishFakeJoinLeaveMessage`, because every existing
config file carried the old `vanishFakeJoinLeave` key set to `true` and reusing it would have left
the line on for every server already running the mod.
- **Items handed back through the panel showed up only after a relog.** Restores and gives relied
on incremental slot sync, which only sends a slot when the server believes the client's copy
differs. A write landing while the player had another screen open, or while a staff click was
being processed, could leave that belief wrong, and the hotbar stayed empty on screen until the
next login resent everything. Every inventory write from the panel now pushes the full inventory.
- **A restore could share item instances with the stored backup.** The live inventory received the
backup's own stacks, so using the item afterwards rewrote the backup. Stacks are now copied.
- **The inventory editor could duplicate items.** A number-key swap moved a copy of the target's
item into the admin's own hotbar, and a drop key or a creative middle click did the same through
the floor or the cursor. Only plain pick-up and place are accepted now. Covered by an automated
test that fails against the previous code.
- **Armour sat in the middle of the item list.** The editor showed the worn armour in storage order,
boots first, with nothing telling it apart from the bag. It now has its own labelled row, helmet
to boots, with the off-hand set apart.
- **Some sanctions were never recorded.** The mute command and button, the warn command and chat
prompt, the kick button, and the ban button on the player sheet (which wrote the vanilla ban list
directly) bypassed the audit log, the player history, the cross-server ban sync and the Discord
webhook. They all go through the same path now.
- **Config keys added by an update were invisible.** The file was only written when missing, so an
operator upgrading never saw new keys. It is now rewritten after every load.
- **Unmuting threw an exception.** Arcadia Lib's `unmute` built its staff alert with a raw UUID,
which 1.21 refuses, so every unmute from the panel ended in an error after the mute was lifted.
Fixed at the source in Arcadia Lib 1.3.1; the panel also catches it, so it keeps working on a
server still running an older lib.
### Added
- **Inventory tabs: ender chest and extra slots.** The editor gained tabs for the ender chest and for
the slots added by Curios, Accessories (and therefore The Aether) and Cosmetic Armor Reworked,
cosmetic slots included, each group labelled. An extra slot refuses anything its mod would refuse.
Extra slots are available while the player is connected; their mods keep a disconnected player's
data in their own format.
- **The sheet's "View Inventory" button opens the panel's own viewer**, read-only without the edit
node, instead of running an external `/invsee` that may not exist. `invsee <player>` does the same.
- **Backups and death snapshots include the extra slots.** A full backup restore puts them back
where they were and empties the groups that were empty at capture time, so a ring that was in the
bag then and is worn now cannot come back twice. Anything that no longer fits (the slot type is
gone, the mod refuses it) is handed over as a normal item. Death snapshots hand accessories back as
items, like the rest of the inventory.
- **Backups include Sophisticated backpack contents.** A backpack item is only a key to storage kept
elsewhere; backups now record the contents and a full restore puts them back. The key is read from
the item itself, so backpacks nobody opened since the restart are covered too. Handing a single
backpack back is refused while a copy of it is still carried by a connected player.
- **PlayerSync support.** With PlayerSync installed the panel never writes a disconnected player's
stored file, since PlayerSync replaces it from its database at login. A backup restore for an
offline player is queued and applied in full at their next login, after PlayerSync has finished
loading them; the queue survives a restart. No backup is taken and nothing is restored while
PlayerSync is still loading a player, and PlayerSync is asked to save right after each change.
- **ArcadiaBridge integration.** When ArcadiaBridge is installed and its database is up, bans,
temp-bans, mutes and warns are also issued through its sanction service, and unbans and unmutes are
revoked there. The panel still applies each sanction locally. The player sheet shows the Discord
link and sanctions issued from Discord or another server; `/arcadia_adminpanel bridge` shows the
integration state. Resolved at runtime, not a dependency. The player is told once: when the
bridge takes a mute it notifies and enforces it (the panel falls back to Arcadia Lib if the
bridge fails to store it), and for a warn the panel keeps only its title and sound.
- **Automated test suite.** `./gradlew runGameTestServer` runs 26 GameTests covering the vanish
default, the config rewrite, inventory sync, the editor's layout, tabs, save path and duplication
guards, bans, and every integration above against the real mod jars.
- **Seven new config keys**: `vanishFakeJoinLeaveMessage`, `inventoryBackupExtraSlots`,
`inventoryBackupBackpackContents`, `playerSyncBlockOfflineWrites`, `arcadiaBridgeEnabled`,
`arcadiaBridgeSanctions`, `arcadiaBridgeReplacesWebhook`.
### Performance
- **Disguise sounds cost nothing when nobody is disguised.** The handler looked up every connected
player every tick; it now returns after one size check, walks the disguised set instead of the
player list, and prunes once a second instead of every tick.
### Correctifs
- **Le vanish ne s'annonce plus.** Basculer en vanish affichait à tous les joueurs une fausse ligne
« a quitté la partie » / « a rejoint la partie », ce qui signalait au serveur entier la présence
d'un membre du staff. C'est maintenant désactivé par défaut. Le réglage a été renommé en
`vanishFakeJoinLeaveMessage` : chaque fichier de config existant contenait l'ancienne clé
`vanishFakeJoinLeave` à `true`, et la réutiliser aurait laissé la ligne active partout.
- **Les objets rendus via le panel n'apparaissaient qu'après une reconnexion.** Les restaurations et
dons reposaient sur la synchronisation incrémentale, qui n'envoie un emplacement que si le serveur
pense que la copie du client diffère. Une écriture survenue pendant qu'un autre écran était ouvert,
ou pendant le traitement d'un clic du staff, pouvait fausser cette croyance, et la barre d'action
restait vide à l'écran jusqu'à la connexion suivante. Chaque écriture du panel renvoie désormais
l'inventaire complet.
- **Une restauration pouvait partager ses objets avec la sauvegarde.** L'inventaire recevait les
piles mêmes de la sauvegarde, et utiliser l'objet réécrivait la sauvegarde. Les piles sont copiées.
- **L'éditeur d'inventaire pouvait dupliquer des objets.** Une touche numérique copiait l'objet de la
cible dans la barre d'action de l'admin, et la touche de lâcher ou le clic molette en créatif
faisaient de même via le sol ou le curseur. Seuls prendre et poser sont acceptés. Couvert par un
test automatisé qui échoue sur l'ancien code.
- **L'armure était mélangée à la liste.** L'éditeur montrait l'armure portée dans l'ordre de
stockage, bottes d'abord, sans rien pour la distinguer du sac. Elle a sa propre ligne étiquetée, du
casque aux bottes, et la seconde main est mise à part.
- **Certaines sanctions n'étaient jamais enregistrées.** La commande et le bouton de mute, la
commande et la saisie d'avertissement, le bouton d'expulsion et le bouton de ban de la fiche (qui
écrivait directement la liste vanilla) contournaient le journal, l'historique, la synchro des bans
entre serveurs et le webhook Discord. Tout passe désormais par le même chemin.
- **Les clés de config ajoutées par une mise à jour restaient invisibles.** Le fichier n'était écrit
que s'il manquait. Il est maintenant réécrit après chaque chargement.
- **Démuter levait une exception.** Le `unmute` d'Arcadia Lib construisait son alerte staff avec un
UUID brut, refusé par la 1.21 : chaque démute depuis le panel se terminait en erreur après avoir
levé le mute. Corrigé à la source dans Arcadia Lib 1.3.1 ; le panel l'intercepte aussi, pour
continuer à fonctionner sur un serveur resté sur une ancienne lib.
### Ajouts
- **Onglets d'inventaire : coffre de l'Ender et emplacements supplémentaires.** L'éditeur a des
onglets pour le coffre de l'Ender et pour les emplacements de Curios, Accessories (donc The Aether)
et Cosmetic Armor Reworked, cosmétiques compris, chaque groupe étiqueté. Un emplacement refuse ce
que son mod refuserait. Disponibles quand le joueur est connecté ; ces mods stockent les données
d'un joueur déconnecté dans leur propre format.
- **Le bouton « Voir Inventaire » ouvre la visionneuse du panel**, en lecture seule sans le node
d'édition, au lieu d'un `/invsee` externe qui peut ne pas exister. `invsee <joueur>` fait de même.
- **Sauvegardes et instantanés de mort incluent les emplacements supplémentaires.** Une restauration
complète les remet en place et vide les groupes qui étaient vides à la capture, pour qu'un anneau
rangé dans le sac à ce moment et porté aujourd'hui ne revienne pas deux fois. Ce qui ne rentre plus
(type d'emplacement disparu, refus du mod) est rendu comme un objet normal. Les instantanés de mort
rendent les accessoires comme objets, comme le reste de l'inventaire.
- **Les sauvegardes incluent le contenu des sacs Sophisticated.** Un sac n'est qu'une clé vers un
stockage conservé ailleurs ; le contenu est maintenant enregistré et remis par une restauration
complète. La clé est lue sur l'objet lui-même, donc les sacs jamais ouverts depuis le redémarrage
sont couverts. Rendre un sac seul est refusé tant qu'une copie est portée par un joueur connecté.
- **Support de PlayerSync.** Avec PlayerSync, le panel n'écrit jamais le fichier d'un joueur
déconnecté, puisque PlayerSync le remplace depuis sa base à la connexion. Une restauration hors
ligne est mise en attente et appliquée en entier à la prochaine connexion, une fois PlayerSync
terminé ; la file survit à un redémarrage. Aucune sauvegarde ni restauration pendant que PlayerSync
charge un joueur, et PlayerSync est invité à sauvegarder après chaque modification.
- **Intégration ArcadiaBridge.** Quand ArcadiaBridge est installé et sa base disponible, bans, bans
temporaires, mutes et avertissements passent aussi par son service de sanctions, et débans et
démutes y sont révoqués. Le panel applique toujours la sanction localement. La fiche joueur affiche
la liaison Discord et les sanctions émises depuis Discord ou un autre serveur ;
`/arcadia_adminpanel bridge` affiche l'état de l'intégration. Résolu à l'exécution, sans dépendance.
Le joueur n'est prévenu qu'une fois : quand le bridge prend un mute, c'est lui qui notifie et
l'applique (le panel repasse par Arcadia Lib si le bridge échoue à l'enregistrer), et pour un
avertissement le panel ne garde que son titre et son son.
- **Suite de tests automatisés.** `./gradlew runGameTestServer` lance 26 GameTests : défaut du vanish,
réécriture de la config, synchro d'inventaire, disposition, onglets, sauvegarde et protections
anti-duplication de l'éditeur, bans, et chaque intégration ci-dessus avec les vrais jars des mods.
- **Sept nouvelles clés de config** : `vanishFakeJoinLeaveMessage`, `inventoryBackupExtraSlots`,
`inventoryBackupBackpackContents`, `playerSyncBlockOfflineWrites`, `arcadiaBridgeEnabled`,
`arcadiaBridgeSanctions`, `arcadiaBridgeReplacesWebhook`.
### Performance
- **Les sons de déguisement ne coûtent rien sans déguisement actif.** Le handler consultait chaque
joueur connecté à chaque tick ; il s'arrête désormais après une vérification de taille, parcourt
l'ensemble des déguisés plutôt que la liste des joueurs, et nettoie une fois par seconde au lieu
de chaque tick.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include

