# Architecture ## Vue d'ensemble Le projet est un **plugin monolithique** Java déployé sur le serveur Hytale officiel. Le serveur gère le monde, le réseau et l'ECS ; le plugin ajoute la couche MMORPG (persistance, progression, systèmes futurs). ```mermaid flowchart TB subgraph server [Serveur Hytale] ECS[ECS / Mondes] Events[EventBus] Cmds[CommandRegistry] end subgraph mmorpg [Plugin com.disklexar:MMORPG] Plugin[MmorpgPlugin] Boot[Bootstrap] Registry[ServiceRegistry] PlayerSvc[PlayerSessionService] DB[(SQLite)] end Plugin --> Boot --> Registry Registry --> PlayerSvc PlayerSvc --> DB Plugin --> Events Plugin --> Cmds ``` ## Cycle de vie du plugin | Phase | Responsabilité | |-------|----------------| | `setup()` | Charge la config, initialise `Bootstrap`, enregistre commandes et événements | | `start()` | Démarre les services (`DatabaseManager`, `PlayerSessionService`, …) | | `shutdown()` | Sauvegarde les sessions, ferme SQLite | Le singleton `MmorpgPlugin.get()` est rafraîchi à chaque chargement pour rester compatible avec le hot-reload Hytale. ## Modules et dépendances | Package | Dépend de | Rôle | |---------|-----------|------| | `bootstrap` | `core`, `persistence`, `player` | Câblage des services | | `core` | — | Config, interface `Service` | | `persistence` | `core` | SQLite, repositories | | `player` | `persistence`, `core` | Profils et sessions en ligne | | `command` | `player`, `bootstrap` | Interface joueur | | `events` | `player`, `bootstrap` | Connexion / déconnexion | | `economy`, `quest`, `social` | — (stubs) | Extensions futures | **Règle** : les packages `economy`, `quest` et `social` ne doivent pas être importés par `core` ou `persistence` tant qu'ils ne sont pas implémentés. L'activation se fait via `Features.*` dans `config.json`. ## Persistance - Fichier : `{dataDirectory}/mmorpg.db` - Migrations : `src/main/resources/db/migrations/*.sql` - Table initiale : `player_profiles` (uuid, display_name, level, experience, timestamps) Les dépendances JDBC (SQLite) et JSON (Gson) sont **embarquées dans le JAR** via Shadow, car absentes du classpath serveur. ## Événements joueur - **Connexion prête** : `PlayerReadyEvent` → chargement ou création du profil - **Déconnexion** : `PlayerDisconnectEvent` → sauvegarde et retrait de la session mémoire ## Conventions - Identifiants joueur : `java.util.UUID` - Noms affichés : `PlayerRef.getUsername()` en priorité - Logs : `HytaleLogger` du plugin - Permissions futures : préfixe `com.disklexar.mmorpg.*`