Aller au contenu

Installer le plugin

Installer le plugin Forgewatch sur un serveur Hytale et le lier au dashboard.

1. Construire le jar

Prérequis : un JDK 17 ou plus récent pour lancer Gradle. Le JDK 25 cible est téléchargé automatiquement (toolchain Gradle + foojay).

# 1. Copier l'API serveur Hytale (fournie avec le serveur dédié) :
cp /chemin/vers/hytale/server/HytaleServer.jar plugin/libs/HytaleServer.jar
# 2. Construire :
cd plugin && ./gradlew build
Jar produitContenuUsage
plugin/hytale/build/libs/forgewatch-0.1.0.jarcœur + adaptateur Hytale + manifest.jsonÀ déposer dans le dossier mods/ du serveur
plugin/core/build/libs/forgewatch-core-0.1.0.jarcœur + simulateur (aucune dépendance)Mode --simulate, tests

Sans libs/HytaleServer.jar, le module hytale est ignoré (avec un message explicite) : seul le jar cœur et simulateur est produit.

2. Lier le serveur

  1. Dans le dashboard, allez dans Onboarding (ou Vue d'ensemble → Ajouter un serveur), nommez le serveur, puis Générer le code. Le code est valable 10 minutes et ne sert qu'une fois.

  2. Déposez forgewatch-0.1.0.jar dans mods/, puis redémarrez le serveur.

  3. Dans la console du serveur, ou en jeu avec la permission forgewatch.admin, tapez :

    /fw link K7QP-3MZX
  4. Le serveur passe « en ligne » dans le dashboard, en général en quelques secondes et en moins de 60 s.

Commandes disponibles :

CommandeEffet
/fw link <code>Liaison du serveur, ou reliaison après une rotation de clé
/fw statusÉtat : lié, connecté, taille du tampon, nombre de bans, dernière erreur
/fw ban <joueur> [motif]Ban propagé à tout le réseau (plan Réseau) ou à ce serveur

3. Configuration (mods/Forgewatch/forgewatch.properties)

Le fichier est créé au premier démarrage et complété par /fw link.

# URL de l'API Forgewatch
api.url=https://api.forgewatch.io
# Clé du serveur (secrète, écrite par /fw link)
server.key=fw_…
server.id=…
# Sel de pseudonymisation des joueurs (écrit par /fw link)
account.salt=…
# Collecte du chat (désactivée par défaut ; pilotée aussi depuis le dashboard)
chat.enabled=false
# Transmettre les pseudos (les identifiants restent toujours hachés)
privacy.send_display_names=true
# Intervalle d'envoi des lots (secondes)
flush.interval.seconds=10
# Intervalle des relevés de santé TPS / mémoire / joueurs (secondes)
health.interval.seconds=30
# Taille maximale du tampon hors ligne (les plus anciens événements sont supprimés au-delà)
buffer.capacity=10000

4. Garanties de fonctionnement

  • Aucune I/O sur le fil du jeu. Les événements vont dans un tampon mémoire sans verrou ; un fil dédié (forgewatch-net) se charge du réseau et du disque.

  • API injoignable. Le jeu continue normalement. Jusqu'à 10 000 événements sont conservés (les plus anciens sont supprimés au-delà), avec reconnexion en backoff exponentiel (1 s → 60 s) et repli HTTPS si le WebSocket échoue.

  • Bans. Synchronisation complète au démarrage (GET /v1/bans), puis application en temps réel. Un joueur banni est expulsé à la connexion.

  • Pseudonymisation. L'UUID du joueur ne quitte jamais le serveur ; seul HMAC-SHA256(sel du compte, UUID) est envoyé.

  • Performance. Le test CapturePerformanceTest échoue si le surcoût de capture dépasse 1 ms par tick (mesure sur 10 000 événements).

5. Tester sans le jeu (mode simulation)

cd plugin
./gradlew :core:simulate --args="--api http://localhost:4000 --code K7QP-3MZX --players 40 --chat"
# ou, avec un Java 25 installé :
java -jar core/build/libs/forgewatch-core-0.1.0.jar --simulate --api http://localhost:4000 --code K7QP-3MZX

Options : --players N (taille du vivier), --interval S (envoi), --health S, --chat, --duration S, --data-dir DIR.

Le simulateur :

  • génère des connexions, déconnexions, messages de chat, commandes et creux de TPS ;

  • affiche chaque ban reçu (Ban reçu : …) et chaque expulsion.

6. Adaptateur Hytale : points à vérifier

L'API serveur de Hytale n'étant pas encore stabilisée publiquement, HytalePlatform est écrit d'après les exemples publics de plugins. Chaque appel incertain est marqué // TODO(hytale-api): vérifier ; la liste complète figure dans DECISIONS.md. Tout le reste du plugin (cœur, tests, simulateur) ne dépend que de l'interface GamePlatform.