Skip to content

2.3.0

Choose a tag to compare

@Loutreee Loutreee released this 06 Mar 16:09
· 21 commits to master since this release
f7dcf57

1. Configuration et Intégration de l'API REST

  • Endpoints REST supplémentaires
    • Création d’un ScoreController avec :
      • /api/score/:playerName pour obtenir le score total d’un joueur.
      • /api/score/history/:playerName pour obtenir l’historique complet (tous les snapshots avec timestamp et score total) d’un joueur.
      • /api/scores pour récupérer l’historique des scores de tous les snapshots.

2. Gestion des Statistiques en Jeu et Calcul du Score

  • Gestion des événements du jeu :

    • Bloc miné : Événement BlockBreakEvent incrémente le compteur de blocs minés et ajoute des points selon la config.
    • Item crafté : Passage de PrepareItemCraftEvent à CraftItemEvent pour 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 EntityDeathEvent incrémente le compteur de mobs tués par un joueur et ajoute des points selon la config.
  • Calcul du score par catégorie :

    • Ajout dans la classe PlayerStats de champs pour chaque sous-score :
      • blockScore, craftScore, mobScore, et timeScore
    • Le totalScore est la somme de tous ces sous-scores.
    • Un point est attribué par minute de jeu (calculé via Statistic.PLAY_ONE_MINUTE).
  • 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.

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 le totalScore.
      • Un timestamp (format ISO) pour tracer l’évolution dans le temps.
  • 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.
  • 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 le totalScore.
    • Ceci assure une continuité des données et évite de repartir de zéro après un redémarrage ou une déconnexion.

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> avec dot={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é.
  • 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).

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.
  • 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.