MMO synchronisation inventaire.

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
mica2727
Messages : 13
Inscription : 23 Avr 2018 12:16

MMO synchronisation inventaire.

Message par mica2727 » 21 Jan 2021 09:18

Bonjour à tous !

J'espère ne pas faire de roman cette fois, sinon je vais perdre des lecteurs et la réponse à ma question :hehe:

Je développe un MMO avec comme serveur central SmartFoxServer, et comme serveur map Forge Alloy.
Jusque là pas de soucis...

(Petite histoire)
J'ai fais un burn-out au mois de décembre, après avoir travailler toute l'année entière sans aucune vacance ou quasiment pas, et j'étais partie dans l'idée de tout faire et tout scripter, voyant que ce n'était pas possible et que mon idée était farfelue, j'ai donc retiré des choses pour incomporter des scripts tout fait, j'ai aussi développer "DS" un serveur pour charger et effectué des choses sur le personnage (sauvegarde, chargement, inventaire et j'en passe). Tout ce mois si je n'ai donc pas travailler, mais j'ai lue pas mal de chose, et je me suis dit qu'en fait "DS" c'est du surplus de travail, quand tout peu être fait directement dans SmartFoxServer... :pascontent2:

Mon burn-out a était fait suite au animation (ce qui n'est vraiment, mais alors vraiment pas mon truc, avant de découvrir mixamo :cote: )

(Jeu)
Le jeu était tout au début basé sur Dragonica, puis avec le temps et les idées il commence à devenir un jeu à part entière, totalement différant de celui ci, disons juste qu'il reprends des conceptes de mes jeux que j'ai joué auparavant (Dragonica, Skyforge, et pas mal d'autre).

(Questions)
La question se porte sur le coté inventaire, je me demande comment faire pour charger l'inventaire du personnage, comme vous avez lue au dessus mon idée actuel fonctionne, c'est à dire que je lance DS, puis SFS (qui vérifie que DS existe), puis ensuite le client se connecte à SFS (qui envoie un ID à DS pour l'authentification, et envoie celui ci au client aussi), ensuite je vous passe les mécanismes de login, et enfin DS fournit toutes les données à charger sur le personnage, stats, compétence, inventaire et j'en passe.

Mais je me suis dit que cette idée n'était pas bonne, en fait je ne sais pas comment synchronisé les données et surtout quoi faire passer comme donner, je veux dire les armes ont des attributs aléatoires avec des valeurs aléatoires donc obligé de tout charger via SFS ? Ou alors est-ce que le Server Map doit charger l'inventaire du personnage, puis lui passer une fois prêt, pour ensuite synchronisé directement les deux, et à la fermeture du personnage, le serveur map sauvegarde l'état du joueur dans la bdd ?

(Architecture en ce moment :)
Client <> Server Map
Client <> SFS
Client <> DS
SFS <> DS
DS > SFS

Ensuite, la première map a des monstres (obligé d'être synchronisé vu que c'est un mmo et pour empêcher les piratages, et la triche) du coup SFS lance un serveur pour ce joueur pour la map de tutoriel, puis ensuite quand il passe le portail de fin de tutoriel, il s'en va vers la map "Ville" avec du monde. Ce seront des mini map, et un jeu de plateforme 3D (inspirer de Dragonica pour le coup).

Merci d'avoir lue le pavé, j'avais dit de pas faire un roman :rouge: .
Dans l'attente d'avoir une réponse, ou un éclaircissement si j'ai dit des choses qui ne sont pas compréhensible, faite le moi savoir!. Merci d'avance.

PS: Malgré mon burn-out, je me suis arrêter à temps, et le jeu n'est pas abandonné du tout !

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: MMO synchronisation inventaire.

Message par youtpout » 21 Jan 2021 16:51

Hello,

je pense que tu dois gérer ce genre de chose dans smartfox, je suis pas un grand connaisseur de cette solution, je l'avais trouvé par harsard quand je voulais faire un MMO, mais le faite que ça soit en Java m'avait repoussé :lol:

Dans la doc il y a peut être une solution
http://docs2x.smartfoxserver.com/_docum ... ation.html
Sinon tu peux étendre les fonctionnalité je pense pour faire communiqué ton server et smartfox
http://docs2x.smartfoxserver.com/ExtensionsJava/recipes

Je me demande si tu peux pas gérer tous dans smartfox, je trouve que leur site est mal foutu, il faut trifouiller pour comprendre toutes les possibilités du produit, le but étant que le client ne communique qu'avec Smartfox je pense.

mica2727
Messages : 13
Inscription : 23 Avr 2018 12:16

Re: MMO synchronisation inventaire.

Message par mica2727 » 21 Jan 2021 19:20

Merci, effectivement c'est l'idée du poste, sa revient un peu ce que j'avais dit aussi sur mon revirement de situation, mais je voulais aussi comprendre comment envoyer les données mais je pense avoir ma réponse avec les classes de sérialisation de SmartFoxServer directement, comme tu la aussi indiquer dans les liens.

Et oui SFS c'est un peu le bazar à comprendre au début, mais pour la documentation surtout elle n'est plus à jour, car y'a encore du Flash, alors que flash a été retirée tout cours, y'a encore ActionScript 3 alors que ça n'existe plus, je ne sais pas si le développeur compte tout remettre à jour, on verra bien après tout x)

Oui c'est vrai que Java c'est pas l'idéal, mais je me rends compte que sur les grandes lignes sa ressemblent beaucoup à CSharp. Ensuite y'en a pas 50 des serveurs qui sont orienté vers les MMO, et faire un master serveur tout seul, ça serait de la folie, je parle pas des heures passées dessus, je parle aussi des soucis technique à régler, des failles de sécurité que je ne connaitrais pas forcément, et j'en passe, pas question de me faire un serveur aussi technique que ça.

D'ailleurs "DS" utilisait la sécurité de SmartFoxServer, mais l'idée de rajouter un serveur par dessus un autre serveur qui peut déjà le faire, c'est du surplus pour rien. Je vais avoir du boulot en février 8|

En tout cas je te remercie pour ta réponse x)

Ma question porté aussi sur le chargement et l'importation des données de l'inventaire, si le player Y demande au player X pour voir son inventaire, je pense que les serveurs maps chargent aussi les données de l'inventaire du personnage, et que oui les données de l'inventaire passe par SFS, mais plutôt dans ce sens : Client <> Server Map <> SFS, en plus du client directement connecté à SFS aussi (pour recevoir les notifications).

Comme ça en cas de transfert d'objet sa se fait automatiquement et rapidement via le Server Map, et quand le joueur se déconnecte, le server map envoie les modifications à SFS...

Mais peut être un peu trop bordélique comme idée, j'ai tendance à être perfectionniste, ce qui me rends pas toujours service :triste1:

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: MMO synchronisation inventaire.

Message par youtpout » 21 Jan 2021 19:57

C'est quoi server map ?
Après je connais pas SmartFox, mais je crois il y a des méthodes pour récupérer les joueurs autour, à voir s'il y a moyen de récupérer l'inventaire de l'autre joueur, même si j'aurais pas fais comme ça.

C'est un système d'échange ?

mica2727
Messages : 13
Inscription : 23 Avr 2018 12:16

Re: MMO synchronisation inventaire.

Message par mica2727 » 22 Jan 2021 05:54

Le serveur map, c'est celui qui synchronise l'état des ennemies, les compétences, et tout ce qui y'a à synchronisé entre le joueur et d'autre joueur potentiel, c'est aussi une instance Unity lié au client, pour faire les synchronisations entre deux scènes. La map du début étant un tutoriel, il n'y a pas d'autre joueur, cependant vu que les monstres doivent être synchronisé quand même, ça ouvre un serveur temporaire (SFS le fait tout seul) pour créer un salon et y placer le joueur. Puis quand celui ci passe le tutoriel, le serveur map "tutorial" est détruit, et il passe dans le serveur map "ville" et dans cette room comportera les autres joueurs nouvellement arrivé, comme pour les donjons, et autre activité multijoueurs. Sauf pour des donjons lancer en solo qui demande une nouvelle fois un serveur map uniquement pour cette personne. Car je ne pense pas qu'on puisse faire plusieurs map dans une seule instance unity, surtout quand on développe tout seul, ça peut devenir vite un gros bazar, et je m'y retrouverais plus.

Pour revenir à ta question, les joueurs peuvent interargir, c'est un mmo après tout, ils peuvent se voir échanger des objets entre eux, donc les joueurs doivent avoir leur inventaire synchronisé. Mais c'était qu'une idée comme ça, je pense plutôt qu'il y aura un marché premium, et un marché normal (les interfaces existent déjà, tout est codé, me manque la partie multi et synchronisation avec le serveur) d'ou le fait que je viens poster ici pour partir sur une base saine.

Pour le moment comme j'ai expliqué tout se passe via DS. Je pensais migrer tout vers SFS, je voulais une confirmation et tu me la donné, je pense que SFS doit être le pilier centrale.

Donc mon soucis c'est surtout que l'inventaire à une classe "Item" de base, ensuite tu fais hérité d'autre classe comme "ItemPotion" et ainsi de suite, tout est enregistrer dans la base de donnée. Tu as aussi Weapon, et Equipment. Ses deux là comporte des attributs, des élements attacher, et pas mal d'autre chose, pour simplifier et pour éviter au max la bande passante de saturer lors du chargement de l'inventaire, je pense que le mieux était d'appeler ça par des identifiants et des ints.

Par exemple au lieu de mettre des noms comme Attribut1, autant mettre 0 avec la valeur 15. C'est bien plus rapide à envoyer et bien plus optimiser.

Donc pour conclure, et finir sur une question, je me demandais si valait mieux que ce soit le serveur map qui charge l'inventaire, et le passe au client. Ou si le serveur map doit charger l'inventaire, et le client aussi de sont coté (un peu le bazar à mettre en place selon moi, car il faut attendre que les deux soit bien chargé). Et ensuite ben je passe directement via le serveur map.

Et tu peux donner ton avis, sur comment tu aurais fait toi, je suis un peu là pour ça, des fois je me prends vraiment trop la tête, et c'est pas un plus.

J'avais oublié de répondre à ta question aussi, oui il y a PROXIMITY_CHECK_UPDATE (un truc comme ça) qui renvoie des events selon les objets MMOItem trouvé, ou les joueurs à proximité, selon la MMORoom. Ce qui permet de créer des objets directement via SFS. Mais même si les objets sont créer il ne sont pas visible, il faut les ajouter sur le client selon les objets trouvé pour qu'il puisse apparaitre.

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: MMO synchronisation inventaire.

Message par youtpout » 22 Jan 2021 10:53

Bein tu dois seulement synchronisé l'inventaire du joueur en faite, quand tu veux faire un système d'échange tu ouvres normalement une nouvelle fenetre où toi et l'autre joueur vous placez vos items à échanger mais en aucun cas tu dois récupérer l'inventaire de l'autre joueur, quand au magasin tu payes avec ta cb ils ont pas accès à tout ce qu'il y a sur ton compte...
Après je ne sais pas comment mettre ça en place avec sfs, DS c'est ton serveur que t'avais crée au départ, je pense qu'à terme il faudra tout intégré dans sfs.
Pour ce qu'il faut charger dans le client tu dois charger les éléments seulement nécessaire à son bon fonctionnement, pour l'inventaire perso je charge l'inventaire au total mais je passe seulement des données brut entre mon serveur et mon client, une classe sérialisé en json même avec 50 attributs ça demande pas forcément une énorme bande passante, juste à veiller de n'avoir pas des noms trop long.
Pour ton histoire d'attribut c'est la bonne voie, renseigne toi sur les enums, et enum set, sinon travail avec des int flag
https://www.baeldung.com/java-enumset
Perso en C# j'utilise ça pour mes attributs de sort et d'item, en C# t'as l'enum flags derrière c'est un int qui est traité, ça permet le cumul de propriétés.

Exemple je veux qu'un sort soit magique et feu en même temps,
int magic=1;
int physic=2;
int feu=4;
int eau=8;
Spell toto=new Spell();
toto.spelltype=(feu+magic);

Bon l'exemple n'est pas forcément la bonne façon d'écrire mais ça exprime schématiquement comment ça fonctionne.

mica2727
Messages : 13
Inscription : 23 Avr 2018 12:16

Re: MMO synchronisation inventaire.

Message par mica2727 » 22 Jan 2021 16:24

Bein tu dois seulement synchronisé l'inventaire du joueur en faite, quand tu veux faire un système d'échange tu ouvres normalement une nouvelle fenetre où toi et l'autre joueur vous placez vos items à échanger mais en aucun cas tu dois récupérer l'inventaire de l'autre joueur, quand au magasin tu payes avec ta cb ils ont pas accès à tout ce qu'il y a sur ton compte...
Oui je comprends ce que tu veux dire, mais je parlais des données des deux inventaires, justement pour l'échange, quand tu places l'objet X et l'autre l'objet Y, faut bien vérifier si les deux le possède, et ensuite tu fais un échange, je dois surement trop me compliquer la tache x.x
Pour ce qu'il faut charger dans le client tu dois charger les éléments seulement nécessaire à son bon fonctionnement, pour l'inventaire perso je charge l'inventaire au total mais je passe seulement des données brut entre mon serveur et mon client, une classe sérialisé en json même avec 50 attributs ça demande pas forcément une énorme bande passante, juste à veiller de n'avoir pas des noms trop long.
C'est ce que fait déjà DS. D'ailleurs la bdd c'est MongoDB, sa facilite le partage entre les données du client à mettre directement dedans.
Pour ton histoire d'attribut c'est la bonne voie, renseigne toi sur les enums, et enum set, sinon travail avec des int flag
https://www.baeldung.com/java-enumset
Perso en C# j'utilise ça pour mes attributs de sort et d'item, en C# t'as l'enum flags derrière c'est un int qui est traité, ça permet le cumul de propriétés.

Exemple je veux qu'un sort soit magique et feu en même temps,
int magic=1;
int physic=2;
int feu=4;
int eau=8;
Spell toto=new Spell();
toto.spelltype=(feu+magic);
Bon l'exemple n'est pas forcément la bonne façon d'écrire mais ça exprime schématiquement comment ça fonctionne.
Oui j'avais compris aussi pour les enums d'ailleurs c'est faissable en CSharp pour certaine propriété, de les additionner ou même dans les programmes Unity pour certain composant (je ne sais plus exactement lesquels). Mais quand tu fais feu + magic je sais que sa devient un "5" mais après pour pouvoir récupérer "feu & magic" je me demande bien comment tu fais. faudrait je me renseigne comment faire et cumuler les enum.

Tant fait pas j'ai des bonnes connaissances déjà de base, je suis venu ici pour être sur que ce soit une bonne idée, et que peut être d'autre personne en avait des meilleurs que moi. Mais l'idée des enum à combiner, je t'avoue que celle ci je l'avais oublié. Merci du coup. :super:

Je pense que c'est une bonne idée effectivement, ça me semble pas mal, et mon idée doit être la bonne, je ferais ça du coup.

Ah tu as une idée pour les compétences ? je ne sais pas si tu connais Skyforge, mais avant y'avait un grand arbre dont tout est relié ensemble. Genre y'avait des centaines de noeuds à débloquer, je voulais faire un peu le même genre, je veux que mon jeu soit personnalisable à souhait, du coup je cherche pas mal de chose assez sympa à mettre, pour le rendre attrayant, mais le problème d'un grand arbre, c'est pour charger aussi, quand ta une seul direction c'est simple, mais plusieurs ça se complique, m'enfin je suppose que y'a pas de solution magique non plus, faut surement charger les identifiants de toutes les compétences débloquer, du moins j'aurais fait comme ça ^^

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: MMO synchronisation inventaire.

Message par youtpout » 22 Jan 2021 17:29

Pour l'enum flags j'ai fais une petite appli console que tu peux tester :
► Afficher le texte
dispo sur mon github
https://github.com/youtpout/EnumFlags

Pour ton histoire d'arbre de compétence, heuresement que j'implémente pas ce genre de truc sur mon jeu :hehe:
Le truc bien chiant, perso je serais partie sur le modèle Parent/Enfant :
Après ta classe ne dois pas forcément avoir les attributs parent et enfant défini, sachant que si le parentId n'est pas défini c'est la compétence la plus haute

Code : Tout sélectionner

  public class Competence
    {
        public int Id { get; set; }
        public int ParentId { get; set; }
        public string Nom { get; set; }
        public bool Debloque { get; set; }
        public List<Competence> CompetencesEnfants { get; set; }
        public Competence CompetenceParent { get; set; }

    }
Dans une base de donnée ça se traduit par une notion de parentId qui est une clé étrangère qui pointe sur l'id de la même table.
Une astuce est d'utiliser le mot cle with pour récupérer tout l'arbre, bon avec MongoDb pas besoin de faire ça je pense.

mica2727
Messages : 13
Inscription : 23 Avr 2018 12:16

Re: MMO synchronisation inventaire.

Message par mica2727 » 22 Jan 2021 19:05

Je suis pas fan de tous les "if"', je sais que c'est bien utile, mais j'essai de les virer le plus possible, ça fait code à rallonge, et quand tu dois rajouter des attributs, c'est souvent dans ce code là qu'on se plante suffit d'une ligne oublié, ou qu'on rajoute pas et on cherche des heures, pour pas grand chose ^^

Les if je les utilise pour vérifier les syntaxes, et que les choses sont bien dans l'ordre que je veux, après tout les if c'est pour des conditions, pour vérifier des choses, mais pas spécialement pour faire des conditions à rallonge, c'est mon avis personnel.

Ben je sais que je vais galéré sur l'arbre de compétence, j'ai implementé pas mal de truc, en même temps j'y suis depuis longtemps et je sais développer, c'est juste que c'est toujours mieux de partager on peut pas penser à tout, et à force d'être plonger dedans je trouve ça bien d'avoir des avis extérieur c'est toujours du plus.

Le problème c'est que y'aura pas que des compétences, en fait c'est un arbre comme Skyforge (donc sa débloque des classes, des métiers, des stats de personnage et j'en passe) et sa part un peu dans tous les sens, du coup même avec un système de parenté ça va être vraiment très complexe à faire, je peux pas simplement me dire tien celui là il est dans la pile donc c'est bon, car si y'a une bifurcation dans l'arbre, et que le joueur selectionne un seul nodule sur les deux de la bifurcation si je prends le parent, sa manquera un nodule car il l'aura pas spécialement débloqué, après y'en a qui force à ce que tu le débloques mais c'est pas encore le but de mon jeu. Donc ouais je pense que l'arbre se sera surement ce qui prendra le plus de donnée pour le charger.

Comme ça par exemple (les ronds représente les nodules à débloquer)

Code : Tout sélectionner

    O
    |
    O
   / \
  O   O
   \ /
    O 
L'avantage c'est que les nodules ne se débloque qu'une fois.

Un système d'identifiant par rapport à des assets semble la meilleure façon de faire les nodules je pense, créer la GUI, puis ensuite les scripts, et assigner les assets au script, après je voulais mettre des valeurs aléatoire dans les nodules, mais au final je vais laisser tomber l'idée, sa reviendrait à stocker tous les nodules dans la base de donnée de tous les joueurs, pas spécialement une bonne idée. Du coup ce sera des valeurs fixes, bien sur c'est un mmo donc au tout début je vais à l'essentiel pour que le jeu soit jouable, et ensuite je rajouterais et je complèterais au fur et à mesure du temps, et j'aurais aussi les idées plus claire sur la suite, le début étant le plus chiant si j'ose dire.

Pour MongoDB en fait, d'après ce que j'avais vu il fait les liaisons automatiquement car il est prévue pour relier plusieurs données, tu peux aussi imbriquer des listes à l'intérieur, et ça prends en charge des choses vraiment sympa, pourtant mon choix au début était porter sur CockrochDB, mais trop peu d'interface GUI, et bien trop compliquer à mettre en place, je me voyais pas gérer une base de donnée en plus de tout le reste, faut que sa reste simple, car déjà en soit un MMO c'est super complexe à développer mais je suis motivé.

Pour les identifiants dont tu parles je le savais déjà, je faisais déjà ça à l'époque ou je pensais faire un site web php, d'ailleurs j'ai développer pendant 10 ans, j'avais l'idée de faire un jeu depuis que je suis petit mais par manque de connaissance, je m'étais dit non, et finalement, je suis revenu la dessus, j'ai bouquiné sur C#, sur plein de livre qui y font référence, sur Unity aussi beaucoup, je me suis fait la main dessus, pour avoir vraiment un lot de connaissance très large, donc je connais pas mal de chose. Mais la partie qui me manquait et me faisait peur c'était la partie multijoueur, mais désormais ça commence à immerger dans ma tête, et je suis bien content.

Je te remercie de tes messages en tout cas. Y'a des choses que je sais déjà forcément, mais des choses que j'avais pas spécialement penser sur le moment, en tout cas, la route que j'avais prévue pour le jeu, c'est ce que tu me dis aussi, alors je suppose que j'ai plus qu'à foncer et que mes idées sont bonne. J'ai posté surtout pour ça, pour savoir si je me plante ou non.

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: MMO synchronisation inventaire.

Message par youtpout » 22 Jan 2021 19:52

Si t'aime pas les if tu peux utiliser un switch pour les enums :
https://stackoverflow.com/questions/104 ... -combinati
de base on utilise un switch avec un enum classique, j'ai utilisé un if parce que plus simple avec l'enum flags, après l'interet du switch c'est qu'il se crée tout seul avec l'autocomplétion de visual studio

pour ton histoire de compétence je partirai sur une liste de condition dépendant d'autre compétence

Code : Tout sélectionner

 public class Competence
    {
        public int Id { get; set; }
        public string Nom { get; set; }
        public bool Debloque { get; set; }
        public int LevelMax { get; set; }
        public int Level { get; set; }
        public List<Condition> Conditions { get; set; }

        public bool Deblocable
        {
            get
            {
                if (Conditions?.Count > 0)
                {
                    return Conditions.All(c => Deblocable);
                }
                return true;
            }
        }
    }

    public class Condition
    {
        public int Id { get; set; }
        public int CompetenceId { get; set; }
        public int LevelMin { get; set; }
        public Competence Competence { get; set; }
        public bool Deblocable
        {
            get
            {
                if (Competence != null)
                {
                    return Competence.Level >= LevelMin;
                }
                return false;
            }
        }
    }
Je pense que tu vises trop haut pour ton mmorpg tu devrais faire par étape.

Pas grave si au départ tu n'as pas de système d'échange, de ventes ... (en plus ça implique de la sécurité)

L'arbre de compétence as-tu besoin d'en faire un si compliqué dès le départ.

Tu te mets trop de bâton dans les roues pour sortir un truc dans un délai raisonnable.

Et je sais pas depuis combien de temps tu fais du Php mais à ta place je serais partis sur ça pour la techno serveur, certes c'est pas le langage le plus efficient possible mais je pense qu'il doit avoir des frameworks fait pour la perf avec php.

Répondre

Revenir vers « Unity le logiciel »