@startuml team-config-class-diagram title CR-Core — Team config (class diagram, cascade per-team → global → default) skinparam classAttributeIconSize 0 hide empty members package "fr.luc.crcore.features.team.config" { class "TeamSetting" as TeamSetting <> { - key: String - type: Class - defaultValue: T - kind: Kind - parser: Function - serializer: Function -- + {static} ofBoolean(key, default): TeamSetting + {static} ofInt(key, default): TeamSetting + {static} ofString(key, default): TeamSetting + {static} ofEnum(key, default): TeamSetting -- + parse(raw): T + serialize(value): Object + getKey() / getType() / getDefaultValue() / getKind() } enum "TeamSetting.Kind" as Kind { BOOLEAN INTEGER STRING ENUM } TeamSetting +-- Kind class TeamSettings <> { + {static} FRIENDLY_FIRE: TeamSetting + {static} PVP_PROTECTION_SECONDS: TeamSetting + {static} MAX_SIZE: TeamSetting + {static} MIN_SIZE: TeamSetting + {static} RESPAWN_AT_TEAM_SPAWN: TeamSetting + {static} TEAM_CHAT_ENABLED: TeamSetting + {static} SHOW_TAG_ABOVE_HEAD: TeamSetting + {static} TEAM_COLOR_IN_NAME: TeamSetting -- + {static} register(setting): void + {static} get(key): Optional> + {static} all(): Collection> } TeamSettings ..> TeamSetting interface TeamConfigService { + get(team, setting): T + getGlobal(setting): T + setPerTeam(team, setting, value): void + resetPerTeam(team, setting): void + setGlobal(setting, value): void + reload(): void + hasPerTeamOverride(team, setting): boolean + getGlobalSnapshot(): Map, Object> + getGlobalFileName(): Optional } package "fr.luc.crcore.features.team.config.impl" { class YamlTeamConfigService { - plugin: JavaPlugin - teamRepository: TeamRepository - userFile: File - globalValues: Map -- - ensureUserFile(): void - rebuildGlobalValues(): void - persistGlobals(): void } YamlTeamConfigService ..|> TeamConfigService } TeamConfigService ..> TeamSetting : reads/writes } package "fr.luc.crcore.features.team" { class Team { - settings: Map + getSettings(): Map } } package "fr.luc.crcore.features.team.config.gui" { abstract class AbstractSettingsGui { - rebuild() : peint la grille # {abstract} getCurrentValue(setting): T # {abstract} onChange(setting, newValue): void # isOverride(setting): boolean # renderFooter(): void } class GlobalSettingsGui class TeamSettingsGui GlobalSettingsGui --|> AbstractSettingsGui TeamSettingsGui --|> AbstractSettingsGui AbstractSettingsGui --|> "fr.luc.crcore.util.gui.AbstractInventoryGui" GlobalSettingsGui --> TeamConfigService TeamSettingsGui --> TeamConfigService TeamSettingsGui --> Team } YamlTeamConfigService --> "fr.luc.crcore.features.team.TeamRepository" : persists per-team via save() TeamConfigService ..> Team : reads/writes settings map note bottom of YamlTeamConfigService Cascade de résolution : 1. team.getSettings().get(key) ← override per-team (SQLite) 2. globalValues.get(key) ← -team-config.yml 3. setting.getDefaultValue() ← constante Java Le YAML global est ré-écrit à chaque setGlobal() (persistant à crash). Les per-team sont écrits via teamRepository.save(team). end note @enduml