@startuml /' export PLANTUML_LIMIT_SIZE=9000 plantuml -gui '/ Title Architecture eclaté client/server MMO caption Tout est séparé A savoir que chaque élément ne gére qu'une action (ou type d'action) Avantage: * On peut répartir la charge sur plusieurs élements * Certain fonction critique peuvent etre optimisé * Monté en charge plus facile * Le déplacement est à part donc il doit y avoir des connexions avec certain élément (Action -> Position) - mais pas la peine de garder une position d'un personnage qui s'est déconnecté (pas de retour depuis plus de 5min - quel est le délais maixmum avant une deconnexion ?) Inconvenient: * Complexifie la gestion du serveur/des process * Répartition de la charge des process du serveur peut etre complexe * Client doit faire plusieurs connexion (possibilité d'avoir un proxy avec une latence augmenté) Stockage de donnée : Pensé que les données ne doivent pas être modifié en permanence. end caption footer Il s'agit d'une reflexion Node CLient { agent "Client A" as ClientA agent "Client B" as ClientB agent "Client C" as ClientC } Node Base { collections "Gateway" as Gateway collections "Authentification" as Authentification } Node "Monde/Zone/Canal" as Monde { Node "Monde A (pour X joueurs)" as MondeA { collections "Positions 3D" as Positions3D collections "Gestion des Positions" as GestionPositions collections "Nom des Joueurs/Perso" as NomPerso collections "Personnage/Créature" as PersoCreature collections "Actions" as Actions collections "Inventaires" as Inventaires collections "Compétences/Caractéristiques" as Carac collections "Quetes" as Quetes collections "Discusion" as Tchat collections "Décors/Objet amovible/culture [blé/...]" as DecorsAmovible collections "Persitance donnée longue" as Database collections "Persitance donnée courte (quelques heures)" as DatabaseMedium collections "Persitance donnée éphémère (quelques minutes)" as DatabaseShort map "[Éphémère] Donnée Position3D" as DataPosition3D { Temps => tick [format court, pas plus de 10min] PersonnageID => Identifiant du personnage Position => x, y , z Angle Tete => tau, phi Angle Corps => tau, phi } map "[Longue] Donnée Nom Personnage" as DataNomPerso { PersonnageID => Identifiant du personnage PersonnageIDCible => Identifiant du personnage cible Nom => Nom donnée ou affiché } map "[Longue] Donnée Personnage/Créature" as DataPersoCreature { PersonnageCreatureID => Identifiant du personnage cible ou de la creature cible PartieDuCorps => Indentifiant de la partie du corps (Tete/Cou/Poitrine/Bras Gauche/Bras Droit/Pied X/Main X/Jambe X Enveloppe => Identifiant Enveloppe/Habillage } map "[Longue] Donnée Inventaires" as DataInventaires { PersonnageID => Identifiant du personnage Temps => Temps dernière modification Localisation => Sac, Corps, Main [Bracellet], Doigts [Bague], Cou [collier] Position => x, y, z (position dans le sac) Type => Type [Objet, Décor, Culture, Arbre, ...] ID => Identifiant Objet } map "[Courte] Donnée Actions" as DataActions { ActionID => Identifiant de l'action (unique) Temps => Temps dernière modification Position => x, y, z (si zone) Type => Type [Zone ou Joueur] ID => Identifiant Action Etat => pourcentage de l'action } map "[Longue] Donnée Compétences/Caractèristiques" as DataCarac { PersonnageID => Identifiant du personnage Type => Type [Compétence, Caractèristique, Charme,...] ID => Identifiant Temps => Temps dernière modification (utile pour les paramêtres temporaires) Durée => Entier/Flottant (temps de "vie" de ce param) Valeur/Bonus => Entier/Flottant (à étudier) } map "[Longue] Donnée Quêtes" as DataQuetes { QuetesID => Identifiant de la quêtes Type => Type Param1 => Parametre 1 de la quetes (en fonction du type) Param2 => Parametre 2 de la quetes (en fonction du type) Param3 => Parametre 3 de la quetes (en fonction du type) ParamX => Parametre X de la quetes (en fonction du type) Condition => [Attente autre quetes/ attente position dans une zone/ ...] Etat => [En attente/Commencé/Terminé/...] TempsCree => Temps creation de la quetes TempsModifie => Temps dernière modification (utile pour les paramêtres temporaires) Durée => Entier/Flottant (maximum) PersonnageID => Identifiant du personnage Bonus => Gain en cas de réussite Malus => Perte en cas de Non réussite } map "[Longue] Donnée Décors/Objet" as DataDecorsAmovible { DecorsObjetID => Identifiant du Décors/Objet Type => Décors ou Objet ... Position => x, y , z Angle => tau, phi Param1 => Parametre 1 de la quetes (en fonction du type) Param2 => Parametre 2 de la quetes (en fonction du type) Param3 => Parametre 3 de la quetes (en fonction du type) ParamX => Parametre X de la quetes (en fonction du type) Etat => 100% .. cassé TempsCree => Temps creation de la quetes TempsModifie => Temps dernière modification Durée => Entier/Flottant (maximum) PersonnageID => Identifiant du personnage (si propriétaire) } } Node "Monde B" as MondeB { } Node "Monde C" as MondeC { } } Base -left[hidden]-> CLient MondeA -left[hidden]-> MondeB MondeB -left[hidden]-> MondeC Positions3D -right[hidden]-> Actions Positions3D --> GestionPositions GestionPositions --> Actions GestionPositions <-> GestionPositions Actions -right[hidden]-> Inventaires Inventaires -right[hidden]-> DecorsAmovible DecorsAmovible -right[hidden]-> Carac Carac -right[hidden]-> Actions Actions -right[hidden]-> DecorsAmovible DecorsAmovible -right[hidden]-> Quetes Quetes -right[hidden]-> Tchat Tchat -right[hidden]-> PersoCreature Actions -> GestionPositions Inventaires -down-> DataInventaires DataInventaires -down-> Database Carac -down-> DataCarac DataCarac -down-> Database DecorsAmovible -down-> DataDecorsAmovible DataDecorsAmovible -down-> Database Quetes -down-> DataQuetes DataQuetes -down-> Database Actions -down-> DataActions DataActions -down-> DatabaseMedium Positions3D -down-> DataPosition3D DataPosition3D -down-> DatabaseShort NomPerso -down-> DataNomPerso DataNomPerso -down-> Database PersoCreature -down-> DataPersoCreature DataPersoCreature -down-> Database ClientA --> Gateway ClientB --> Gateway ClientC --> Gateway Gateway -> Authentification Authentification -> MondeA Authentification -> MondeB Authentification -> MondeC ClientA --> Positions3D ClientA --> Inventaires ClientA --> Carac ClientA --> Actions ClientA --> DecorsAmovible ClientA --> Tchat ClientA --> Quetes ClientA --> PersoCreature ClientA --> NomPerso ClientB --> MondeA ClientC --> MondeA ClientA .-> MondeB ClientA .-> MondeC ClientB .-> MondeB ClientB .-> MondeC ClientC .-> MondeB ClientC .-> MondeC @enduml