@startuml bootstrap-sequence title CR-Core — Bootstrap from a game plugin (onEnable) participant "MyGamePlugin\nextends JavaPlugin" as Plugin participant "CRCore" as Core participant "Database" as DB participant "SqliteTeamRepository" as TeamRepo participant "SqlitePlayerProfileRepository" as PlayerRepo participant "BukkitEventFiringTeamServiceImpl" as TeamSvc participant "BukkitEventFiringPlayerProfileServiceImpl" as PlayerSvc participant "CoreCommand\n(/core)" as Cmd participant "Bukkit" as Bukkit Plugin -> Core : new CRCore(this) activate Core Plugin -> Core : enable() Core -> DB : new Database(/crcore.db) activate DB DB -> DB : ensure parent dir + PRAGMA foreign_keys DB --> Core deactivate DB Core -> TeamRepo : new SqliteTeamRepository(db) activate TeamRepo TeamRepo -> DB : ensureSchema() — crcore_teams + crcore_team_members + crcore_team_scores TeamRepo -> DB : loadAll() — SELECT pour ré-hydrater le cache mémoire TeamRepo --> Core deactivate TeamRepo Core -> PlayerRepo : new SqlitePlayerProfileRepository(db) activate PlayerRepo PlayerRepo -> DB : ensureSchema() — crcore_player_profiles + crcore_player_scores PlayerRepo -> DB : loadAll() PlayerRepo --> Core deactivate PlayerRepo Core -> TeamSvc : buildTeamService(teamRepo) Core -> PlayerSvc : buildPlayerProfileService(playerRepo) Core -> Cmd : new CoreCommand(teamSvc, playerSvc) activate Cmd Cmd -> Cmd : registerDefaults() — TeamGroupSubCommand avec 13 leaf sub-cmds Cmd --> Core deactivate Cmd Core -> Bukkit : plugin.getCommand("core").setExecutor(cmd) Core -> Bukkit : .setTabCompleter(cmd) Core --> Plugin : this (chainable) deactivate Core note over Plugin À ce stade : - /core team create/delete/add/... fonctionnel - SQLite persiste team + player + leurs scores - Évènements Bukkit sont tirés sur chaque opération - Le plugin de jeu peut listen avec @EventHandler end note @enduml