JeuWeb - Crée ton jeu par navigateur
Implémenter un système de serveur et d'objet lié - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Implémenter un système de serveur et d'objet lié (/showthread.php?tid=7492)



Implémenter un système de serveur et d'objet lié - Kerikou - 05-11-2015

Bien le bonjour,

J'essaye d'implémenter un système de compte et de serveur sur mon jeu et je suis confronté à un soucis au moment de la conception. J'aimerais donc vos avis sur la méthode que vous utiliseriez et les avantages.

J'utilise symfony2 comme framework. L'objectif est de permettre l'ouverture de plusieurs serveurs ayant des paramètres de jeu différents. Il y a 3 entités : Account, User, Server.
- User = Compte de base avec couple pseudo/pass pour se connecter. (1 par joueur)
- Server = Environnement de jeu définnissant les différents paramètres de jeu (exemple : or de départ, vitesse de jeu, équipement disponible). Il n'y a pas de limite aux nombre de serveurs.
- Account = 1 par couple (User/Server). Représente un compte sur un environnement précis. Un User peut avoir plusieurs Accounts sur différents Server.

Jusque là pas de soucis. Les difficultés viennent quand je veux permettre à la création du serveur de définir la liste des objets utilisables ou non (exemple : Epee en bois sera utilisable sur le serveur 1 mais pas sur le serveur 2).

Solution 1 :
Pour chaque table (equipment, skills, team, etc...) ajouter un champ server, permettant de définir si l'objet est disponible.
Inconvénients : Duplication des lignes et code plus compliqué lors des opérations en base de données.
Id   Server     Name
_______________________
1    1            Epee en bois    
1    3            Epee en bois


Solution 2 :
Pour chaque table (equipment, skills, team, etc...) ajouter une table (equipment_disponibility, ..) permettant de définir si l'objet est disponible.
Inconvénients: Multiplication des tables et obligation de jointures pour savoir si l'objet est dispo (perte de perfs ?)
Exemple Table Item :
Id    Name
__________
1     Epee en bois

Table Item_disponibility
Id_item     Id_server
__________________
1             1
1             3


Solution 3 :
Avoir une table base_item regroupant les caractéristiques d'un objet et préfixer chacune des tables par le numéro du serveur. Cette table préfixé serait une duplication de la table base avec uniquement les objets disponibles pour le serveur. L'ajout du préfixe a l'ensemble des tables peut être géré de manière automatique par Symfony via les Evenements Doctrine. Ainsi, il faut que chacune des tables soit préfixé par le numéro du serveur (imaginons que le jeu doit fonctionné à partir de 50 tables, la création d'un serveur créera automatiquament 50 nouvelles tables avec le préfixe du serveur).
Inconvénients : Il faut créer une nouvelle table pour chaque élément (srv1_equipment, srv1_team, srv1_skills) par serveur. chaque table est une duplication de la table de base. L'avantage est de ne posséder que les élements qui nous intéressent (facilité de dev et rapidité).
exemple Base_Item
Id      Name            Strength
_______________________
1       Epee en bois   10

exemple srv1_Item
Id       Name           Strength  
__________________________
1       Epee en bois  10


Solution 4 : ???


Voilà voilà je ne sais pas si j'ai été clair, mais je me pose pas mal de questions sur la meilleure solution.
Si vous avez des avis ou de meilleures solutions n'hésitez pas Smile

Merci d'avance,


RE: Implémenter un système de serveur et d'objet lié - rachids - 06-11-2015

Salut !

Pourquoi pas une table item avec un champ listant les serveurs sur lesquels l'objet en question serait utilisable ?

Exemple, l'épée est dispo sur les serveurs 1,3,4,5

Code :
items

Id       Name           Strength           Servers    
________________________________________________________
1       Epee en bois     10                ENUM(1,3,4,5)



RE: Implémenter un système de serveur et d'objet lié - Ter Rowan - 07-11-2015

c'est plus compliqué de créer une requête avec un seul champ qui portent tous les serveurs pour déterminer les objets disponibles pour un serveur


restons sur une modélisation classique :


table objet:

id / nom / carac 1 / carac 2 (si pas trop de carac, sinon faire une autre table


table objet serveur

id serveur / id objet


select * from table_objet_serveur, table_objet
where
      table_objet_serveur.id_serveur = "Mon Serveur"                                             <= quel serveur m'intéresse ?
and
      table_objet_serveur.id_objet = table_objet.id                        <= je ne vois que les objets concernés par mon serveur



RE: Implémenter un système de serveur et d'objet lié - CaptainJS - 07-11-2015

Est-ce que tu parle de tables destinées à l'instanciation du serveur ou de tables en cours de jeu ? parce que ça ressemble furieusement à du paramétrage de ton monde (serveur), et dans ce cas il vaut mieux je pense avoir des tables séparées pour définir les associations objets / serveurs sachant qu'elles n'interviendront pas dans la vue du serveur.


RE: Implémenter un système de serveur et d'objet lié - Akira777 - 08-11-2015

Pour ma part, je gère ça via des tables différentes.

Global :
core_accounts
core_servers

Serveur 1 :
s1_players
s1_items

Serveur 2 :
s2_players
s2_items

Chaque entity qui est multi-serveur charge un préfix de table différent.
J'ai pas trouvé plus simple.
Evidement, en fonction de l'instance ça charge un fichier de config yaml différent (stocké dans APC). Et je me suis fait un cli pour gérer les serveurs.