Repository navigation
2.3.0
1. Configuration et Intégration de l'API REST
- Endpoints REST supplémentaires
- Création d’un ScoreController avec :
/api/score/:playerNamepour obtenir le score total d’un joueur./api/score/history/:playerNamepour obtenir l’historique complet (tous les snapshots avec timestamp et score total) d’un joueur./api/scorespour récupérer l’historique des scores de tous les snapshots.
- Création d’un ScoreController avec :
2. Gestion des Statistiques en Jeu et Calcul du Score
-
Gestion des événements du jeu :
- Bloc miné : Événement
BlockBreakEventincrémente le compteur de blocs minés et ajoute des points selon la config. - Item crafté : Passage de
PrepareItemCraftEventàCraftItemEventpour n’incrémenter le compteur qu’une fois l’item réellement crafté.- Gestion particulière du shift-click pour multiplier la quantité (ex. pour les sticks qui produisent 4 unités).
- Mob tué : Événement
EntityDeathEventincrémente le compteur de mobs tués par un joueur et ajoute des points selon la config.
- Bloc miné : Événement
-
Calcul du score par catégorie :
- Ajout dans la classe
PlayerStatsde champs pour chaque sous-score :blockScore,craftScore,mobScore, ettimeScore
- Le
totalScoreest la somme de tous ces sous-scores. - Un point est attribué par minute de jeu (calculé via
Statistic.PLAY_ONE_MINUTE).
- Ajout dans la classe
-
Mise à jour des compteurs et scores :
- À chaque action, en plus d'incrémenter le compteur (dans des maps pour blocs, items et mobs), le score correspondant est ajouté via des méthodes telles que
addBlockScore(amount). - Les scores sont définis selon les valeurs présentes dans le fichier de config, accessibles via le
ScoreService.
- À chaque action, en plus d'incrémenter le compteur (dans des maps pour blocs, items et mobs), le score correspondant est ajouté via des méthodes telles que
3. Snapshots et Persistance des Données
-
Insertion régulière de snapshots :
- Une tâche planifiée (toutes les 30 secondes / 600 ticks) parcourt tous les joueurs connectés et insère un snapshot dans la collection
"playerStatsSnapshots". - Chaque snapshot contient :
- Les compteurs détaillés (maps de blocs minés, items craftés, mobs tués).
- Le temps de jeu actuel.
- Les sous-scores (
blockScore,craftScore,mobScore,timeScore) et letotalScore. - Un timestamp (format ISO) pour tracer l’évolution dans le temps.
- Une tâche planifiée (toutes les 30 secondes / 600 ticks) parcourt tous les joueurs connectés et insère un snapshot dans la collection
-
Insertion lors de la déconnexion :
- Lors du
PlayerQuitEvent, un snapshot est inséré immédiatement pour garantir que l’état final du joueur est sauvegardé. - Les données en mémoire pour le joueur sont ensuite supprimées pour libérer des ressources.
- Lors du
-
Restauration des statistiques depuis le dernier snapshot :
- Lorsqu’un joueur se connecte, la méthode
StatsManager.initializePlayerStats(Player)récupère le snapshot le plus récent (trié par timestamp) et restaure :- Les maps de statistiques (blocs, items, mobs).
- Les sous-scores (
blockScore,craftScore,mobScore,timeScore) et letotalScore.
- Ceci assure une continuité des données et évite de repartir de zéro après un redémarrage ou une déconnexion.
- Lorsqu’un joueur se connecte, la méthode
4. Visualisation et API pour l’Historique
-
Leaderboard et graphique :
- Un composant React LeaderboardChart récupère les snapshots via l’API REST.
- Fusion et tri chronologique des snapshots :
- Les snapshots sont fusionnés par timestamp (utilisation de la valeur ISO) et triés pour afficher des lignes continues.
- Une imputation des valeurs manquantes est réalisée pour assurer une courbe continue, reliant chaque point dans le temps.
-
Modification du graphique :
- Utilisation de
<LineChart>avecdot={false}pour tracer des lignes continues reliant tous les points. - Correction pour que les données soient affichées dans l’ordre chronologique, en imputant la dernière valeur connue pour les joueurs absents dans un snapshot donné.
- Utilisation de
-
Routes API supplémentaires pour les scores :
- Ajout d’un endpoint pour obtenir l’historique complet des scores d’un joueur (
/api/score/history/:playerName).
- Ajout d’un endpoint pour obtenir l’historique complet des scores d’un joueur (
5. Développement et Intégration Front-End
-
Intégration de l’application React :
- L’application React est buildée et servie par Javalin à partir du dossier
/web. - En développement, un proxy est configuré (ou CORS est géré proprement) pour que l’application React puisse accéder à l’API REST qui tourne dans le plugin.
- Le composant PlayersList et PlayerStats ont été adaptés pour utiliser les endpoints API plutôt que des données statiques.
- L’application React est buildée et servie par Javalin à partir du dossier
-
Exemple d’appel API dans PlayerStats :
- Le composant récupère via
fetch("/api/stats/{player}/latest")le snapshot le plus récent et affiche les informations clés (timestamp, temps de jeu, scores par catégorie et score total). - Un nouveau composant LeaderboardChart affiche l’évolution des scores dans un graphique linéaire continu.
- Le composant récupère via