Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
fr:toutcommenceparlereseau [2020/08/15 00:18] – aleajactaest | fr:toutcommenceparlereseau [2021/12/03 19:19] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 5: | Ligne 5: | ||
Je vais vous parler de la partie communication entre le serveur et le client. | Je vais vous parler de la partie communication entre le serveur et le client. | ||
- | Il s'agit d'une analyse de l' | ||
- | Quelle est la communication entre le serveur et les clients. | + | Il s'agit d'une analyse de l' |
- | Comment sont définis la position, les zones, comment fait-on pour changer | + | |
- | Pourquoi écrire ce document, premièrement | + | Quelle est la communication entre le serveur et les clients ? |
+ | Comment sont définis la position, les zones, comment fait-on pour changer de zone, la communication (chat), quel sont les états ? | ||
+ | |||
+ | Pourquoi écrire ce document | ||
Ligne 18: | Ligne 19: | ||
Quand on parle de communication, | Quand on parle de communication, | ||
- | Etape 1: connexion & authentification | + | * Étape |
- | + | * Étape | |
- | Etape 2: communication continue (bref, ici commence réellement le jeux) | + | |
- | + | ||
- | Pourquoi a-t-il deux étapes? | + | |
- | Tout simplement la première étape concernant la vérification de l’utilisateur et de son mot de passe, s'ils sont correct, vous pouvez vous enfin communiquer (en permanence) avec le serveur. | + | Pourquoi deux étapes? |
- | -- il envoie une clef/token afin de pouvoir s' | + | La première étape concerne la vérification de l’utilisateur et de son mot de passe, s'ils sont correct, vous pouvez vous enfin communiquer (en permanence) avec le serveur. Ce dernier |
Ligne 40: | Ligne 38: | ||
| Serveur | | | Serveur | | ||
| | | | ||
- | | | xxxxx | < | + | | | xxxxx | < |
| | | | ||
| | | | | | ||
Ligne 46: | Ligne 44: | ||
- | ===== Etape 0 : Enregistrer un nouveau compte ===== | + | ===== Étape |
- | Cette étape | + | Cette étape |
- | Dans les faits, on utilise le protocole https [TCP/ | + | Dans les faits, on utilise le protocole |
- | (ou http, oui s'est possible suivant la configuration du serveur, mais je ne conseille pas) | + | |
- | [url]/ | + | <WRAP center round help 60%> |
+ | Ce qui suit n'est pas clair. Je propose une reformulation, | ||
+ | |||
+ | --- // | ||
+ | </ | ||
+ | |||
+ | <WRAP center round help 60%> | ||
+ | Mise à jour afin de voir si cela convient | ||
+ | --- // | ||
+ | </ | ||
+ | |||
+ | On lance une requette WEB avec la forme suivante | ||
+ | |||
+ | Le lien dans l' | ||
+ | <WRAP prewrap 650px> | ||
+ | | ||
+ | </ | ||
Avec: | Avec: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | Exemple: | ||
- | * | + | https://khaganat.net/ |
- | * | + | |
- | * email : un email | + | |
- | * tac : toujours ' | + | |
Ligne 68: | Ligne 85: | ||
* [Status]: | * [Status]: | ||
- | si status est égale à 1, création | + | si '' |
- | ===== Etape 1 : Connexion & authentification ===== | + | ===== Étape |
- | Cette étape, permet de s' | + | Cette étape permet de s' |
- | On utilise le protocole https [TCP/IP] (ou http, même commentaire qu'au dessus, ne pas utiliser http) | + | |
+ | On utilise le protocole | ||
On envoie les informations suivantes : | On envoie les informations suivantes : | ||
- | *On peut remarquer qu'ici on communique directement avec l' | + | <WRAP center round info 60%> |
+ | On peut remarquer qu'ici on communique directement avec l' | ||
+ | </ | ||
+ | **1. Client -> Serveur** | ||
+ | Demande un mot clef pour permettre le salage du mot de passe.(( nous allons renvoyer le mot de passe via une fonction de hachage, à chaque fois le serveur va renvoyer un mot de clef différent, le hachage aura comme source le mot de passe et le mot clef du serveur, le client enverra donc un hachage différent. Avec cette méthode, on rend plus difficile la recherche du mot de passe --- // | ||
- | **Client -> Serveur** | + | URL formatée de la façon suivante : |
+ | [url]/ | ||
- | Demande le grain de sable (clef à utiliser pour l' | + | **2. Serveur -> Client** |
- | + | ||
- | [url]/ | + | |
- | + | ||
- | **Serveur -> Client** | + | |
Le serveur retourne une ligne: | Le serveur retourne une ligne: | ||
- | |||
* [Status]: | * [Status]: | ||
- | si status est égale | + | Si '' |
- | Une suite de chiffre utilisé | + | |
- | Si le status n'est pas égale à 1, le deuxième paramètre est un commentaire sur l' | + | Si le '' |
- | **Client -> Serveur** | + | **3. Client -> Serveur** |
- | Renvoie le compte & un clef permettant de vérifier que l' | + | Renvoie le compte & une clef permettant de vérifier que l' |
- | Cette clef est en réalité un calcul réalisé avec le sel et le mot de passe [sha512_crypt], cela évite d' | + | Cette clef est en réalité un calcul réalisé avec le sel et le mot de passe [sha512_crypt]. Cela évite d' |
- | Sachant que le serveur connait aussi le sel, il exécute aussi le même calcul afin de vérifier que vous connaissait le mot de passe. | + | |
- | Se connecter: | + | Sachant que le serveur connaît aussi le sel, il exécute aussi le même calcul afin de vérifier que vous connaissez le mot de passe. |
- | [url]/ | + | L'URL pour se connecter : |
+ | | ||
- | + | **4. Serveur -> Client** | |
- | **Serveur -> Client** | + | |
Le serveur retourne deux lignes: | Le serveur retourne deux lignes: | ||
Ligne 123: | Ligne 139: | ||
* cookie = user_addr|user_key|user_id | * cookie = user_addr|user_key|user_id | ||
+ | Ici, le serveur renvoie trois clefs à utiliser pour se connecter, ainsi que l' | ||
- | Ici, le serveur renvoie trois clef à utiliser pour se connecter, ainsi que l' | + | * '' |
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
- | * | + | Ces clefs seront utiles dans la première phase de communication avec le serveur. |
- | * | + | |
- | * | + | |
- | * | + | |
- | Ces clefs seront utile dans la première phase de communication avec le serveur. | ||
- | + | ===== Étape | |
- | ===== Etape 2 : Communication avec le jeux ===== | + | |
Ligne 141: | Ligne 156: | ||
Première chose, on remarque que le protocole est UDP. | Première chose, on remarque que le protocole est UDP. | ||
- | Il n'y a donc pas de synchronisation avec le serveur, on envoie les messages, ils arrivent dans n' | + | Il n'y a donc pas de synchronisation avec le serveur, on envoie les messages, ils arrivent dans n' |
- | L’intérêt est que la communication est plus rapide, et que sur le principe d' | + | L’intérêt est que la communication est plus rapide, et que sur le principe d' |
- | Si on souhaite trouver | + | Pour faire une analogie, il faut voir le réseau comme une multitude d' |
- | Suivant votre chauffeur, vous irez plus ou moins vite, avec des raccourcis plus au moins chanceux. (et parfois des accidents) | + | |
- | Au départ, on souhaite envoyer une message du point A vers le point B (serveur -> client ou client -> serveur) | + | Au départ, on souhaite envoyer une message du point A vers le point B (serveur -> client ou client -> serveur). |
- | {{: | + | {{: |
- | Les messages | + | Les messages |
{{: | {{: | ||
- | + | Arrivé au premier croisement (switch), | |
- | Arrivé au premier croisement (switch), | + | |
{{: | {{: | ||
{{: | {{: | ||
- | Arrivé au péage (firewall), le message est bloqué pour analyse, par contre d'autre poursuive | + | Arrivé au péage (firewall), le message est bloqué pour analyse, par contre d'autres poursuivent |
{{: | {{: | ||
Ligne 170: | Ligne 183: | ||
{{: | {{: | ||
- | mais des fois, nous perdons un paquet suite à un accident (collision avec un autre message). | + | Mais des fois, nous perdons un paquet suite à un accident (collision avec un autre message). |
{{: | {{: | ||
{{: | {{: | ||
- | Et enfin tous les messages | + | Et enfin tous les messages |
{{: | {{: | ||
- | Ce mode de fonctionnement implique une gestion de la couche réseau côté applicatif. (au niveau du serveur et du client) | + | Ce mode de fonctionnement implique une gestion de la couche réseau côté applicatif, au niveau du serveur et du client. |
==== La communication est en fonction de l' | ==== La communication est en fonction de l' | ||
Ligne 184: | Ligne 197: | ||
La communication s' | La communication s' | ||
- | * NotInitialised : Etat initiale | + | * '' |
- | * NotConnected : Etat non utilisé, réception du cookie | + | * '' |
- | * Authenticate : Etat non utilisé, authentification | + | * '' |
- | * Login : Etat login | + | * '' |
- | * Synchronize : Etat synchronisation | + | * '' |
- | * Connected : Etat connecté, ici, on est dans la phase communication du jeux, | + | * '' |
- | * Probe : Etat approbation, | + | * '' |
- | * Stalled : Etat bloqué | + | * '' |
- | * Disconnect : Etat déconnecté | + | * '' |
- | * Quit : Etat quitter | + | * Quit : État quitter |
- | * ForceSynchronize : Etat force la synchronisation (non existant côté serveur) | + | * ForceSynchronize : État forçant |
- | Dans le code, l' | + | Dans le code, l' |
- | ==== Paquet envoyé | + | ==== Paquets envoyés |
- | Maintenant, regardons un peu plus prêt chaque message envoyé par le serveur. | + | Maintenant, regardons |
=== Corps du message === | === Corps du message === | ||
Ligne 214: | Ligne 227: | ||
- | * CurrentSendNumber : un compteur qui s' | + | |
- | | + | * SystemMode : Informe que le type de message est dit " |
- | * SystemMode : Informe que le type de message est dit " | + | |
=== Message système === | === Message système === | ||
Ligne 227: | Ligne 239: | ||
| xxxxxxxxxxxxxxxx | | | xxxxxxxxxxxxxxxx | | ||
- | Suivant la valeur du message, nous avons des paramètres | + | Suivant la valeur du message, nous avons des paramètres |
- | | + | Notez qu'ici nous utilisons 8 bits. On aurait pu réduire la taille afin d' |
- | | + | À savoir |
== Message 1 : SYSTEM_SYNC_CODE == | == Message 1 : SYSTEM_SYNC_CODE == | ||
- | Message émis par le serveur. | + | Message émis par le serveur. |
- | Message | + | Message |
+-------------------+------------+---------+-------------+---------+------------+-------------------+------------------------+ | +-------------------+------------+---------+-------------+---------+------------+-------------------+------------------------+ | ||
Ligne 249: | Ligne 261: | ||
== Message 3 : SYSTEM_PROBE_CODE == | == Message 3 : SYSTEM_PROBE_CODE == | ||
- | Message émis par le serveur. | + | Message émis par le serveur. |
- | | + | |
+ | Message pour vérifier que le client reçoit bien les messages (le client va renvoyer un '' | ||
+-------------------+------------+---------+-------------+ | +-------------------+------------+---------+-------------+ | ||
Ligne 261: | Ligne 274: | ||
== Message 6 : SYSTEM_STALLED_CODE == | == Message 6 : SYSTEM_STALLED_CODE == | ||
- | Message émis par le serveur. | + | Message émis par le serveur. |
+-------------------+------------+---------+ | +-------------------+------------+---------+ | ||
Ligne 271: | Ligne 284: | ||
== Message 7 : SYSTEM_SERVER_DOWN_CODE == | == Message 7 : SYSTEM_SERVER_DOWN_CODE == | ||
- | Message émis par le serveur. | + | Message émis par le serveur. |
+-------------------+------------+---------+ | +-------------------+------------+---------+ | ||
Ligne 282: | Ligne 295: | ||
== Message 9 : SYSTEM_ACK_QUIT_CODE == | == Message 9 : SYSTEM_ACK_QUIT_CODE == | ||
- | Message émis par le serveur. | + | Message émis par le serveur. |
+-------------------+------------+---------+ | +-------------------+------------+---------+ | ||
Ligne 305: | Ligne 318: | ||
=== Factory === | === Factory === | ||
- | Ici nous avons tout un système de boite afin de savoir dans quel rayon on lit le message. | + | Ici nous avons tout un système de boîtes |
== A l' | == A l' | ||
- | On stocke les paquets suivant le paramètre CurrentSendNumber. | + | On stocke les paquets suivant le paramètre |
- | Mais pour chaque paquet, on doit d' | + | |
- | + | Les différents niveaux | |
- | Les différents niveaux: | + | |
+----------+ | +----------+ | ||
Ligne 332: | Ligne 343: | ||
+----------+ | +----------+ | ||
- | + | Si modulo | |
- | Suivant la valeur de CurrentSendNumber. | + | |
- | + | ||
- | Si modulo CurrentSendNumber 4 == 0 : | + | |
+---------+ | +---------+ | ||
Ligne 343: | Ligne 351: | ||
+---------+ | +---------+ | ||
- | Si modulo CurrentSendNumber 4 == 1 : | + | Si modulo |
+---------+ | +---------+ | ||
Ligne 351: | Ligne 359: | ||
+---------+ | +---------+ | ||
- | Si modulo CurrentSendNumber 4 == 2 : | + | Si modulo |
+---------+ | +---------+ | ||
Ligne 359: | Ligne 367: | ||
+---------+ | +---------+ | ||
- | Si modulo CurrentSendNumber 4 == 3 : | + | Si modulo |
+---------+ | +---------+ | ||
Ligne 367: | Ligne 375: | ||
+---------+ | +---------+ | ||
- | Pour le packet A: | + | Pour le '' |
- | + | ||
- | | + | |
+----------+ | +----------+ | ||
Ligne 378: | Ligne 384: | ||
- | Pour le packet B: | + | Pour le packet B : |
- | + | | |
- | Tant que next est égale | + | |
- | | + | |
+----------+ | +----------+ | ||
Ligne 391: | Ligne 396: | ||
Pour le packet C: | Pour le packet C: | ||
- | + | | |
- | Tant que next est egale à 1, on lit le paquet (Level C) | + | |
- | | + | |
+----------+ | +----------+ | ||
Ligne 401: | Ligne 405: | ||
+----------+ | +----------+ | ||
- | Exemple: | + | Exemple |
- | + | ||
- | ici CurrentSendNumber | + | |
+---------+ | +---------+ | ||
Ligne 417: | Ligne 419: | ||
== Et maintenant == | == Et maintenant == | ||
- | N' | + | N' |
- | On lit les trois paquets (A, B & C, ici tous nommé Z) | + | On lit les trois paquets (A, B & C, que j'ai converti/nommé Z), car je ne vois pas très bien l' |
Ligne 427: | Ligne 429: | ||
+---------+ | +---------+ | ||
- | puis pour chaque paquet on lit paquet (tant que next égale | + | Puis pour chaque paquet |
+----------+ | +----------+ | ||
- | | Packet Z | | next | ActionFactory | + | | Packet Z | | next | ActionFactory |
| X bits | --> | 1 bit | X bits | 1 bit | X bits | 1 bit | | | X bits | --> | 1 bit | X bits | 1 bit | X bits | 1 bit | | ||
+----------+ | +----------+ | ||
Ligne 436: | Ligne 438: | ||
== ActionFactory == | == ActionFactory == | ||
- | Dans chaque ActionFactory, | + | Dans chaque |
+-----------------+ | +-----------------+ | ||
Ligne 443: | Ligne 445: | ||
+-----------------+ | +-----------------+ | ||
- | On y découvre un code (qui identifié | + | On y découvre un code (qui identifie |
=== Code === | === Code === | ||
- | Ici, nous avons une petite structure pour définir ActionCode. | + | Ici, nous avons une petite structure pour définir |
- | Sachant que le plus souvent on aura a décoder | + | |
+------+ | +------+ | ||
Ligne 456: | Ligne 457: | ||
+------+ | +------+ | ||
- | === Action === | + | Voir la section Action pour ActionCode. |
+ | |||
+ | |||
+ | ==== Paquet envoyé par le client ==== | ||
+ | |||
+ | < | ||
+ | Il faut remarqué ici, que la taille d'un paquet envoyé par le client est limité, si on dépasse, le serveur ignore le message. | ||
+ | </ | ||
+ | |||
+ | === Corps du message === | ||
+ | |||
+ | +-------------------+------------+--- | ||
+ | | CurrentSendNumber | SystemMode | . . . | ||
+ | | 32 bits | 1 bit | | ||
+ | +-------------------+------------+--- | ||
+ | 1 -> system mode | ||
+ | 0 -> normal mode | ||
+ | |||
+ | |||
+ | |||
+ | * CurrentSendNumber : un compteur qui s' | ||
+ | * SystemMode : Informe que le type de message est dit " | ||
+ | |||
+ | |||
+ | === Message système === | ||
+ | |||
+ | |||
+ | +-------------------+------------+---------+--- | ||
+ | | CurrentSendNumber | SystemMode | Message | . . . | ||
+ | | 32 bits | 1 bit | 8 Bits | | ||
+ | +-------------------+------------+---------+--- | ||
+ | | xxxxxxxxxxxxxxxx | | ||
+ | |||
+ | Suivant la valeur du message, nous avons des paramètres spécifiques. | ||
+ | |||
+ | Notez qu'ici nous utilisons 8 bits, on aurait pu réduire la taille afin d' | ||
+ | |||
+ | À savoir qu'il y a 5 types de messages provenant du client & 5 types de messages provenant du serveur, soit une taille de 3 bits. | ||
+ | |||
+ | == Message 0 : SYSTEM_LOGIN_CODE == | ||
+ | Message émis par le client. | ||
+ | |||
+ | +-------------------+------------+---------+-----------+----------+----------+-------- / ---------+ | ||
+ | | CurrentSendNumber | SystemMode | Message | User Addr | User Key | User ID | Langue | ||
+ | | 32 bits | 1 bit | 8 Bits | 32 bits | 32 bits | 32 bits | String | ||
+ | | | ||
+ | +-------------------+------------+---------+-----------+----------+----------+-------- / ---------+ | ||
+ | | xxxxxxxxxxxxxxxx | | ||
+ | |||
+ | |||
+ | |||
+ | == Message 2 : SYSTEM_ACK_SYNC_CODE == | ||
+ | Message émis par le client. | ||
+ | Message utilisé pour acquitter d'une demande de synchronisation. | ||
+ | |||
+ | +-------------------+------------+---------+-----------+----------+-----------------+----------+ | ||
+ | | CurrentSendNumber | SystemMode | Message | frontack | ||
+ | | 32 bits | 1 bit | 8 Bits | 32 bits | 32 bits | 1024 bits | 32 bits | | ||
+ | | | ||
+ | +-------------------+------------+---------+-----------+----------+-----------------+----------+ | ||
+ | | xxxxxxxxxxxxxxxx | | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | == Message 4 : SYSTEM_ACK_PROBE_CODE == | ||
+ | Message émis par le client. | ||
+ | |||
+ | Acquitte des messages PROBE envoyés. | ||
+ | |||
+ | +-------------------+------------+---------+-------------+---------+---------+-- / --+---------+ | ||
+ | | CurrentSendNumber | SystemMode | Message | Taille : X | Probe 1 | Probe 2 | | Probe X | | ||
+ | | 32 bits | 1 bit | 8 Bits | 32 bits | 32 bits | 32 bits | | 32 bits | | ||
+ | | | ||
+ | +-------------------+------------+---------+-------------+---------+---------+-- / --+---------+ | ||
+ | | xxxxxxxxxxxxxxxx | | ||
+ | |||
+ | |||
+ | == Message 5 : SYSTEM_DISCONNECTION_CODE == | ||
+ | Message émis par le client. | ||
+ | |||
+ | +-------------------+------------+---------+ | ||
+ | | CurrentSendNumber | SystemMode | Message | | ||
+ | | 32 bits | 1 bit | 8 Bits | | ||
+ | | | ||
+ | +-------------------+------------+---------+ | ||
+ | | xxxxxxxxxxxxxxxx | | ||
+ | |||
+ | |||
+ | == Message 8 : SYSTEM_QUIT_CODE == | ||
+ | Message émis par le client. | ||
+ | |||
+ | +-------------------+------------+---------+---------+ | ||
+ | | CurrentSendNumber | SystemMode | Message | Quit Id | | ||
+ | | 32 bits | 1 bit | 8 Bits | 32 bits | | ||
+ | | | ||
+ | +-------------------+------------+---------+---------+ | ||
+ | | xxxxxxxxxxxxxxxx | | ||
+ | |||
+ | |||
+ | |||
+ | === Message normal === | ||
+ | |||
+ | |||
+ | +-------------------+------------+---- | ||
+ | | CurrentSendNumber | SystemMode | . . . | ||
+ | | 32 bits | 1 bit | | ||
+ | +-------------------+------------+---- | ||
+ | | xxxxxxxxxxxxxxxx | | ||
+ | |||
+ | À remplir. | ||
+ | |||
+ | ===== Les différents groupes de données ===== | ||
+ | |||
+ | ==== Action | ||
- | Nous avons différents type Action: | + | Nous avons différents type '' |
- | * ACTION_POSITION_CODE = 0 : Disponible en mode ShortCode = 1 ou 0 | + | * '' |
- | * ACTION_GENERIC_CODE = 1 : Disponible en mode ShortCode = 1 ou 0 | + | * '' |
- | * ACTION_GENERIC_MULTI_PART_CODE = 2 : Disponible en mode ShortCode = 1 ou 0 | + | * '' |
- | * ACTION_SINT64 = 3 : Disponible en mode ShortCode = 1 ou 0 | + | * '' |
- | * ACTION_SYNC_CODE = 10 : Disponible en mode ShortCode = 0 | + | * '' |
- | * ACTION_DISCONNECTION_CODE = 11 : Disponible en mode ShortCode = 0 | + | * '' |
- | * ACTION_ASSOCIATION_CODE = 12 : Disponible en mode ShortCode = 0 | + | * '' |
- | * ACTION_LOGIN_CODE = 13 : Disponible en mode ShortCode = 0 | + | * '' |
- | * ACTION_TARGET_SLOT_CODE = 40 : Disponible en mode ShortCode = 0 | + | * '' |
- | * ACTION_DUMMY_CODE = 99 : Disponible en mode ShortCode = 0 | + | * '' |
Ligne 490: | Ligne 608: | ||
== ACTION_GENERIC_CODE == | == ACTION_GENERIC_CODE == | ||
- | On récupère une chaîne contenant le code impulse. | + | On récupère une chaîne contenant le code '' |
+----------+------+------+-- / --+--------+ | +----------+------+------+-- / --+--------+ | ||
Ligne 498: | Ligne 616: | ||
+----------+------+------+-- / --+--------+ | +----------+------+------+-- / --+--------+ | ||
- | size : nombre de caractère | + | * '' |
- | char : les données | + | * '' |
- | impulse | + | '' |
== ACTION_GENERIC_MULTI_PART_CODE == | == ACTION_GENERIC_MULTI_PART_CODE == | ||
- | On récupère qu'une partie du code impulse, il faudra attendre de recevoir toutes les parties pour pouvoir décoder | + | On ne récupère qu'une partie du code '' |
+----------+----------+----------+----------+------+------+-- / --+--------+ | +----------+----------+----------+----------+------+------+-- / --+--------+ | ||
Ligne 514: | Ligne 632: | ||
+----------+----------+----------+----------+------+------+-- / --+--------+ | +----------+----------+----------+----------+------+------+-- / --+--------+ | ||
- | Number | + | * '' |
- | Part : position du bloc | + | * '' |
- | NbBlock : Nombre de bloc (total) | + | * '' |
- | size : nombre de caractère dans ce bloc | + | * '' |
- | char : les données | + | * '' |
- | Pour décoder, il faut recevoir pour le même "Number" | + | Pour décoder, il faut recevoir pour le même '' |
Exemple : | Exemple : | ||
- | Number : 1 | + | * Number : 1 |
- | NbBlock : 3 | + | |
+---------+---------+---------+ | +---------+---------+---------+ | ||
Ligne 535: | Ligne 653: | ||
== ACTION_SINT64 == | == ACTION_SINT64 == | ||
- | A voila un format/ | + | Voilà |
- | Bref, on sent la réutilisation d'un code pour faire autre chose, dommage car vue la capacité, pourquoi ne pas avoir ajouter d'autre format/type. | + | |
== ACTION_SYNC_CODE == | == ACTION_SYNC_CODE == | ||
- | Structure | + | Structure |
+----------+------------+ | +----------+------------+ | ||
Ligne 557: | Ligne 674: | ||
== ACTION_ASSOCIATION_CODE == | == ACTION_ASSOCIATION_CODE == | ||
- | Certainement pour s'associer une nouvelle zone. | + | Certainement pour associer une nouvelle zone. |
+----------+---------+ | +----------+---------+ | ||
Ligne 567: | Ligne 684: | ||
== ACTION_LOGIN_CODE == | == ACTION_LOGIN_CODE == | ||
- | Tient un code qui aurait du être utilisé pour l’authentification. Mais on ne l' | + | Un code qui aurait du être utilisé pour l’authentification. Mais on ne l' |
- | On utilise la commande système SYSTEM_LOGIN_CODE. | + | |
- | Bref les mystères de l' | + | |
+-----------+----------+----------+ | +-----------+----------+----------+ | ||
Ligne 589: | Ligne 704: | ||
== ACTION_DUMMY_CODE == | == ACTION_DUMMY_CODE == | ||
- | Un code de test | + | Un code de test. |
+-----------+----------+ | +-----------+----------+ | ||
Ligne 598: | Ligne 713: | ||
- | === Impulse === | + | ==== Impulse |
- | Ici, nous allons utilisé la structure msg.xml pour pouvoir décoder le message. | + | === Comment ça marche === |
- | Bon, le décodage demande d' | + | |
+ | Ici, nous allons utilisé la structure | ||
== Lecture du fichier msg.xml == | == Lecture du fichier msg.xml == | ||
- | le fichier xml a une structure du style: | + | Le fichier xml a une structure du style : |
- | | + | <code xml> |
<branch name=x1 param_a=y1 param_b=z1 position=0> | <branch name=x1 param_a=y1 param_b=z1 position=0> | ||
< | < | ||
Ligne 627: | Ligne 743: | ||
</ | </ | ||
</ | </ | ||
+ | </ | ||
+ | Pour '' | ||
- | pour msg.xml, la première | + | Ensuite nous avons deux types de clefs : '' |
+ | * La clef '' | ||
+ | * La clef '' | ||
- | puis ensuite, | + | Pour décoder |
- | la clef 'branch' | + | Par exemple, ici |
+ | - la branche racine s'appelle | ||
+ | - La branche x1 (en position 0), nous comptons une seule sous-branche/ | ||
+ | - La branche x3 (en position 1), nous comptons 2 sous-branches/ | ||
+ | - La branch | ||
+ | - La branche x7 (en position 0), nous comptons 3 sous-branches/ | ||
- | la clef 'leaf' que l'on traduit par feuille, indique qu' | + | Ce résultat nous permettra d'avoir le nombre |
- | pour décoder nous avons le code impulse, nous avons besoin dans chaque branche de compter le nombre de sous branch et sous feuille. | + | Exemple (ici je ne mets que les bits) : |
- | par exemple, ici la branch | + | * code: 010 |
- | chaque | + | * on compte le nombre de branche/ |
+ | * on décode les deux premier bit (ici 01, correspond à la position 1, qui équivaut à x3) | ||
+ | * puis dans la branche | ||
+ | * on décode un bit (ici 0) qui correspond à la position 0, qui équivaut à x4 | ||
+ | * en résumé : 010 => 01.0 => 01 -> x3, 0 -> x4 | ||
+ | * cela donne x3:x4 | ||
- | la branch x1 (en position | + | * code: 1000001 |
+ | * on compte le nombre de branche/ | ||
+ | * on décode les deux premier bit (ici 10, correspond à la position | ||
+ | * puis dans la branche x6, on compte le nombre de branche/sous branche, il y en à 5 (donc le code tient sur 3 bits). | ||
+ | * on décode un bit (ici 000) qui correspond à la position 0, qui équivaut à x7 | ||
+ | * puis dans la branche x7, on compte le nombre de branche/sous branche, il y en à 3 (donc le code tient sur 2 bits). | ||
+ | * en résumé : 1000001 => 10.000.01 => 10 -> x6, 000 -> x7, 01 -> x9 | ||
+ | * cela donne x6:x7:x9 | ||
- | la branch x3 (en position 1), nous comptons 2 sous-branches/ | ||
- | la branch x6 (en position 2), nous comptons 5 sous-branches/ | + | Maintenant, vous savez comment décoder l' |
- | la branch x7 (en position 0), nous comptons 3 sous-branches/ | ||
- | Ce résultat nous permettra d' | ||
- | On répète le calcul jusqu’à arriver à une feuille qui termine et donne la fonction complète. | ||
- | Exemple: (ici je ne mets que les bits) | + | == Lecture du fichier database.xml == |
- | code: 010 | + | En complément des messages provenant |
- | * on compte le nombre | + | Certainne commande Impulse |
- | * on décode les deux premier bit (ici 01, correspond à la position 1, qui équivaut à x3) | + | |
- | * puis dans la branche x3, on compte le nombre | + | |
- | * on décode un bit (ici 0) qui correspond à la position 0, qui équivaut à x4 | + | |
- | en résumé : 010 => 01.0 => 01 -> x3, 0 -> x4 | + | |
- | cela donne x3:x4 | + | |
- | code: 1000001 | + | Structure du fichier: |
- | * on compte le nombre de branche/ | + | |
- | * on décode les deux premier bit (ici 10, correspond à la position 2, qui équivaut à x6) | + | |
- | * puis dans la branche x6, on compte le nombre de branche/ | + | |
- | * on décode un bit (ici 000) qui correspond à la position 0, qui équivaut à x7 | + | |
- | * puis dans la branche x7, on compte le nombre de branche/ | + | |
- | en résumé : 1000001 => 10.000.01 => 10 -> x6, 000 -> x7, 01 -> x9 | + | |
- | cela donne x6:x7:x9 | + | |
+ | <code xml> | ||
+ | < | ||
+ | <!-- dans cette zone existe des informations non utilisés par le client --> | ||
+ | </ | ||
+ | <branch name=x1 bank=" | ||
+ | < | ||
+ | </ | ||
+ | <branch name=x3 bank=" | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | <branch name=x6 bank=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
- | Maintenant, vous savez comment décoder | + | Nous trouvons le mot de clef branch, que l'on va traduire par branche, et le mot de clef leaf que l'on traduit par feuille. |
- | Attention, le reste du codage dans msg.xml, ne sert pas pour le client (mais certainement pour la communication entre les différents services du serveur). | + | |
+ | Ici le premier niveau qui nous interrese est database_description, | ||
+ | Pour la partie branche, cet élément peut contenir d' | ||
- | == Décodage Impulse == | + | Si une branch contient le mot de clef " |
- | les messages impulses sont construit suivant | + | Ensuite, nous avons la possibilité d' |
- | * premier champs contenant le code impulse | + | L' |
- | * champs suivant | + | |
+ | Un petit exemple: | ||
- | Cela donne le schéma suivant : | + | <code xml> |
+ | < | ||
+ | | ||
+ | | ||
+ | <branch name=" | ||
+ | count=" | ||
+ | < | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | </ | ||
- | +--------------+---- | + | < |
- | | code msg.xml | paramètres | | + | bank=" |
- | | x bits | x bits | | + | atom=" |
- | | unsigned | + | <leaf name=" |
- | | + | type=" |
+ | < | ||
+ | | ||
+ | < | ||
+ | | ||
+ | </ | ||
+ | <branch name=" | ||
+ | count=" | ||
+ | <leaf name=" | ||
+ | type=" | ||
+ | </ | ||
+ | </branch> | ||
- | == STRING_MANAGER: | + | < |
+ | bank=" | ||
+ | <branch name="" | ||
+ | count=" | ||
+ | atom=" | ||
+ | <leaf name=" | ||
+ | type=" | ||
+ | <leaf name=" | ||
+ | type=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
- | Commande utilisé pour initialisé le tableau de message. | + | < |
- | Ici, on vérifie que notre tableau interne au client à la même date que le tableau du serveur. | + | * Entities |
- | Sinon, on efface le tableau interne du client, et à chaque nouveau message le client demandera à quoi il correspond. | + | * E0 |
+ | * P0 (type : I8) | ||
+ | * P1 (type : I8) | ||
+ | * P2 (type : I8) | ||
+ | * E1 | ||
+ | * P0 (type : I8) | ||
+ | * P1 (type : I8) | ||
+ | * P2 (type : I8) | ||
+ | * USER (Atom) | ||
+ | * SKILL_POINTS_0 | ||
+ | * VALUE (type : I32) | ||
+ | * SKILL_POINTS_1 | ||
+ | * VALUE (type : I32) | ||
+ | * SKILL_POINTS_2 | ||
+ | * VALUE (type : I32) | ||
+ | * SKILL_POINTS_3 | ||
+ | * VALUE (type : I32) | ||
+ | * FACTION_POINTS_0 | ||
+ | * VALUE (type : I32) | ||
+ | * FACTION_POINTS_1 | ||
+ | * VALUE (type : I32) | ||
+ | * FACTION_POINTS_2 | ||
+ | * VALUE (type : I32) | ||
+ | * FACTION_POINTS_3 | ||
+ | * VALUE (type : I32) | ||
+ | * FACTION_POINTS_4 | ||
+ | * VALUE (type : I32) | ||
+ | * FACTION_POINTS_5 | ||
+ | * VALUE (type : I32) | ||
+ | * FACTION_POINTS_6 | ||
+ | * VALUE (type : I32) | ||
+ | * GROUP | ||
+ | * 0 (Atom) | ||
+ | * PRESENT (Type : I1 == Booléen) | ||
+ | * UID (Type I20) | ||
+ | * 1 (Atom) | ||
+ | * PRESENT (Type : I1 == Booléen) | ||
+ | * UID (Type I20) | ||
+ | * 2 (Atom) | ||
+ | * PRESENT (Type : I1 == Booléen) | ||
+ | * UID (Type I20) | ||
+ | * 3 (Atom) | ||
+ | * PRESENT (Type : I1 == Booléen) | ||
+ | * UID (Type I20) | ||
+ | * 4 (Atom) | ||
+ | * PRESENT (Type : I1 == Booléen) | ||
+ | * UID (Type I20) | ||
+ | </ | ||
+ | Par exemple le message suivant : | ||
+ | 00.0.10.11111111 | ||
+ | * 00 : < | ||
+ | * 0 : <E0> le 2ème niveau, nous avons ici le choix entre E0 & E1, (1 bit suffit pour trouver l' | ||
+ | * 10 : <P1> le 3ème niveau, nous avons ici le choix entre P0, P1 & P2 (2 bits suffisent pour trouver l' | ||
+ | * 11111111 : <I8> le 4ème niveau, la valeur de la branche | ||
+ | * Résumé : | ||
+ | * Entities: | ||
+ | | ||
+ | 2ème exemple : | ||
+ | 01.0010100.11111111111111111111111111111111.01111111111111111111111111111111 | ||
- | Code actuel | + | * 01 : < |
+ | * 0010100 : < | ||
+ | * 11111111111111111111111111111111 : < | ||
+ | * 01111111111111111111111111111111 : < | ||
+ | * Résumé: | ||
+ | * USER.SKILL_POINTS_2 = 4294967295 | ||
+ | * USER.SKILL_POINTS_4 = 2147483647 | ||
- | (< | + | 3ème exemple |
+ | 10.010.0.1 | ||
- | +----------------+--------------+------------------+ | + | * 10 : < |
- | | STRING_MANAGER | RELOAD_CACHE | timestamp | + | * 010 : < |
- | | 6 bits | + | * 0 : < |
- | | 011011 | + | * 1 : VALUE = 1 |
- | | + | |
- | * timestamp (uint32) | + | |
+ | Les types : | ||
+ | | ||
+ | * Sxxx : Entier signé, ou xxx et le nombre de bit à récupèrer | ||
+ | * TEXT : Entier non-signé de 32 bit (dont le bit de poids fort est forcé à zero (jamais négatif - si signé) | ||
- | == STRING_MANAGER: | ||
- | Le serveur envoie un message (enfin le pointeur sur le message) | ||
- | Code actuel : STRING_MANAGER: | ||
- | (< | + | == Décodage Impulse == |
- | +----------------+--------------+------------------+------------------+ | + | Les messages impulses sont construits suivant le format suivant : |
- | | STRING_MANAGER | PHRASE_SEND | + | * premier champ contenant le code '' |
- | | 6 bits | 3 bits | uint32 | + | * champs suivants : les paramètres du code '' |
- | | 011011 | + | |
- | +----------------+--------------+------------------+------------------+ | + | |
- | * dyn_id (Uint32) | + | Cela donne le schéma suivant |
- | * string_id (Uint32) : le pointeur sur le message | + | |
+ | +--------------+---- / -----+ | ||
+ | | code msg.xml | paramètres | | ||
+ | | x bits | x bits | | ||
+ | | unsigned | ||
+ | +--------------+---- / -----+ | ||
- | == STRING_MANAGER: | + | === Commande impulse === |
- | Le client demande le message complet en fonction du pointeur. | + | == TARGET: |
- | Code actuel | + | == TARGET:INVENTORY == |
- | +----------------+--------------+------------------+ | + | == TARGET:FOLLOW |
- | | STRING_MANAGER | STRING_RQ | + | |
- | | 6 bits | 3 bits | uint32 | + | |
- | | 011011 | + | |
- | +----------------+--------------+------------------+ | + | |
- | + | ||
- | * string_id (Uint32) : le pointeur sur le message | + | |
- | + | ||
- | Le serveur va répondre à ce message par STRING_MANAGER: | + | |
- | + | ||
- | == STRING_MANAGER:STRING_RESP | + | |
- | + | ||
- | Le serveur renvoie le message complet. | + | |
- | + | ||
- | Code actuel : STRING_MANAGER: | + | |
- | + | ||
- | +----------------+--------------+------------------+--------------+ | + | |
- | | STRING_MANAGER | STRING_RESP | + | |
- | | 6 bits | 3 bits | uint32 | + | |
- | | 011011 | + | |
- | +----------------+--------------+------------------+--------------+ | + | |
- | + | ||
- | * string_id (Uint32) : le pointeur sur le message | + | |
- | * MessageUtf8 (String-UTF-8) : la chaîne de caractère en UTF-8. | + | |
- | + | ||
- | On remarque ici l' | + | |
- | + | ||
- | + | ||
- | == CONNECTION: | + | |
- | + | ||
- | Le client donne le nom et son ID (zone ?) et demande une vérification côté serveur. | + | |
- | + | ||
- | + | ||
- | + | ||
- | Code actuel : CONNECTION: | + | |
- | + | ||
- | (< | + | |
- | + | ||
- | +----------------+--------------+------------------+------------------+ | + | |
- | | CONNECTION | + | |
- | | 6 bits | 5 bits | X bits | Uint32 | + | |
- | | 000001 | + | |
- | +----------------+--------------+------------------+------------------+ | + | |
- | + | ||
- | + | ||
- | * Name (String-UTF-16) | + | |
- | * HomeSessionId (Uint32) | + | |
- | + | ||
- | Retour attendu : CONNECTION: | + | |
- | + | ||
- | + | ||
- | == CONNECTION: | + | |
- | + | ||
- | Le serveur répond à une requête CONNECTION: | + | |
- | + | ||
- | + | ||
- | Code actuel : CONNECTION: | + | |
- | + | ||
- | (< | + | |
- | + | ||
- | +----------------+--------------+-----------------+ | + | |
- | | CONNECTION | + | |
- | | 6 bits | 5 bits | 8 bits | | + | |
- | | 000001 | + | |
- | +----------------+--------------+-----------------+ | + | |
- | + | ||
- | + | ||
- | * valide (Uint8) : 1 => valide, sinon non valide | + | |
- | + | ||
- | + | ||
- | == CONNECTION: | + | |
- | + | ||
- | Le client selectionne un personnage. | + | |
- | + | ||
- | + | ||
- | Code actuel : CONNECTION: | + | |
- | + | ||
- | (< | + | |
- | + | ||
- | +----------------+--------------+-----------------+ | + | |
- | | CONNECTION | + | |
- | | 6 bits | 5 bits | 8 bits | | + | |
- | | 000001 | + | |
- | +----------------+--------------+-----------------+ | + | |
- | + | ||
- | + | ||
- | * SelectCharMsg (Uint8) : id du personnage (entre 0 et 4, actuellement on ne peut avoir que 5 personnages maximum) | + | |
- | + | ||
- | En retour de cette commande, le serveur va répondre CONNECTION: | + | |
+ | == TARGET: | ||
== CONNECTION: | == CONNECTION: | ||
Ligne 833: | Ligne 992: | ||
- | Code actuel : CONNECTION: | + | Code actuel : '' |
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Attention : dépend de la version que vous avez de msg.xml, susceptible de changer. | ||
+ | </ | ||
- | (< | ||
+----------------+--------------+------------------+------------------+------------------+------------------+--------+----------+--------------------------+--------------------+------------------+ | +----------------+--------------+------------------+------------------+------------------+------------------+--------+----------+--------------------------+--------------------+------------------+ | ||
Ligne 855: | Ligne 1017: | ||
- | == CONNECTION:READY == | + | == CONNECTION:NO_USER_CHAR |
- | Le serveur informe au client qu'il est prêt. | + | == CONNECTION: |
- | puis le client ensuite informe au serveur qu'il est prêt. | + | |
- | Code actuel : CONNECTION: | ||
- | |||
- | (< | ||
- | |||
- | |||
- | +------------+------------+--------------+ | ||
- | | CONNECTION | READY | LanguageCode | | ||
- | | 6 bits | 5 bits | String | ||
- | | 000001 | ||
- | +------------+------------+--------------+ | ||
- | |||
- | * LanguageCode (String) | ||
- | |||
- | |||
- | == CONNECTION: | ||
Liste tous les paramètres de l' | Liste tous les paramètres de l' | ||
- | Code actuel : CONNECTION: | + | Code actuel : '' |
- | (<u> | + | <WRAP center round important 60%> |
+ | Attention : dépend de la version que vous avez de msg.xml, susceptible de changer. | ||
+ | </ | ||
+------------+------------+--------------------+ | +------------+------------+--------------------+ | ||
Ligne 890: | Ligne 1038: | ||
* ServerPeopleActive (uint8) | * ServerPeopleActive (uint8) | ||
* ServerPeopleActive (uint8) | * ServerPeopleActive (uint8) | ||
- | * CharacterSummaries_Len (Uint32) - les paramètres | + | * CharacterSummaries_Len (Uint32) - les paramètres |
* Version (Uint8) | * Version (Uint8) | ||
* Mainland (Uint32) | * Mainland (Uint32) | ||
Ligne 921: | Ligne 1069: | ||
== CONNECTION: | == CONNECTION: | ||
- | Création d'un nouveau personnage | ||
- | Code actuel : CONNECTION: | + | Création d'un nouveau personnage. |
+ | |||
+ | Code actuel : '' | ||
- | (<u> | + | <WRAP center round important 60%> |
+ | Attention : dépend de la version que vous avez de msg.xml, susceptible de changer. | ||
+ | </ | ||
+------------+-------------+--------------------+ | +------------+-------------+--------------------+ | ||
Ligne 966: | Ligne 1117: | ||
* FeetColor (Sint8) | * FeetColor (Sint8) | ||
- | On remarquera ici que le type des différentes | + | On remarquera ici que le type des différentes |
- | == GUILD:USE_FEMALE_TITLES | + | == CONNECTION:SELECT_CHAR |
- | le serveur signale que la guilde (?) utilise le féminin dans les titres. | + | Le client sélectionne un personnage. |
- | Code actuel : GUILD:USE_FEMALE_TITLES | + | Code actuel : '' |
- | (<u> | + | <WRAP center round important 60%> |
+ | Attention: dépend de la version que vous avez de msg.xml, susceptible de changer. | ||
+ | </ | ||
- | +------------+-------------------+--------------------+ | ||
- | | GUILD | USE_FEMALE_TITLES | UseFemaleTitles | ||
- | | 6 bits | 5 bits | bool | | ||
- | | 011100 | ||
- | +------------+-------------------+--------------------+ | ||
- | | + | +----------------+--------------+-----------------+ |
+ | | CONNECTION | ||
+ | | 6 bits | 5 bits | 8 bits | | ||
+ | | 000001 | ||
+ | +----------------+--------------+-----------------+ | ||
+ | |||
+ | |||
+ | * SelectCharMsg | ||
+ | |||
+ | En retour de cette commande, le serveur va répondre '' | ||
+ | |||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | Le serveur informe au client qu'il est prêt, puis le client informe ensuite au serveur qu'il est prêt. | ||
+ | |||
+ | Code actuel : '' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Attention : dépend de la version que vous avez de msg.xml, susceptible de changer. | ||
+ | </ | ||
+ | |||
+ | |||
+ | +------------+------------+--------------+ | ||
+ | | CONNECTION | READY | LanguageCode | | ||
+ | | 6 bits | 5 bits | String | ||
+ | | 000001 | ||
+ | +------------+------------+--------------+ | ||
+ | |||
+ | * LanguageCode (String) | ||
+ | |||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | Le client donne le nom et son ID (zone ?) et demande une vérification côté serveur. | ||
+ | |||
+ | Code actuel : '' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Attention : dépend de la version que vous avez de msg.xml, suceptible de changer. | ||
+ | </ | ||
+ | |||
+ | +----------------+--------------+------------------+------------------+ | ||
+ | | CONNECTION | ||
+ | | 6 bits | 5 bits | X bits | Uint32 | ||
+ | | 000001 | ||
+ | +----------------+--------------+------------------+------------------+ | ||
+ | |||
+ | |||
+ | * Name (String-UTF-16) | ||
+ | * HomeSessionId (Uint32) | ||
+ | |||
+ | Retour attendu : '' | ||
+ | |||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | Le serveur répond à une requête '' | ||
+ | |||
+ | |||
+ | Code actuel : '' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Attention: dépend de la version que vous avez de msg.xml, susceptible de changer.</ | ||
+ | |||
+ | |||
+ | +----------------+--------------+-----------------+ | ||
+ | | CONNECTION | ||
+ | | 6 bits | 5 bits | 8 bits | | ||
+ | | 000001 | ||
+ | +----------------+--------------+-----------------+ | ||
+ | |||
+ | |||
+ | * valide (Uint8) : 1 => valide, sinon non valide | ||
+ | |||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == CONNECTION: | ||
+ | |||
+ | == DB_INIT:PLR == | ||
+ | |||
+ | == DB_INIT:INV == | ||
+ | |||
+ | == DB_GROUP: | ||
+ | |||
+ | == DB_GROUP: | ||
+ | |||
+ | == DB_GROUP: | ||
+ | |||
+ | == HARVEST: | ||
+ | |||
+ | == HARVEST: | ||
+ | |||
+ | == HARVEST: | ||
+ | |||
+ | == HARVEST: | ||
+ | |||
+ | == JOB: | ||
+ | |||
+ | == JOB: | ||
+ | |||
+ | == CASTING: | ||
+ | |||
+ | == CASTING: | ||
+ | |||
+ | == FABER:OPEN == | ||
+ | |||
+ | == FABER:CLOSE == | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == FABER: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == COMBAT: | ||
+ | |||
+ | == STRING:TELL == | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING:CHAT == | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STRING: | ||
+ | |||
+ | == STUN:STUN == | ||
+ | |||
+ | == STUN: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == SENTENCE: | ||
+ | |||
+ | == TEAM:JOIN == | ||
+ | |||
+ | == TEAM:LEAVE == | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM:KICK == | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == TEAM: | ||
+ | |||
+ | == ITEM:DROP == | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM:SWAP == | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM:GIVE == | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM:EQUIP == | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == ITEM: | ||
+ | |||
+ | == TP:RESPAWN == | ||
+ | |||
+ | == TP:BOT == | ||
+ | |||
+ | == TP:WANTED == | ||
+ | |||
+ | == TP:DEST == | ||
+ | |||
+ | == TP: | ||
+ | |||
+ | == TP:ACK == | ||
+ | |||
+ | == TP:CORRECT == | ||
+ | |||
+ | == DEATH: | ||
+ | |||
+ | == DEATH: | ||
+ | |||
+ | == DEATH: | ||
+ | |||
+ | == ANIMALS: | ||
+ | |||
+ | == ANIMALS: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == EXCHANGE: | ||
+ | |||
+ | == DEBUG:WHERE == | ||
+ | |||
+ | == DEBUG:WHO == | ||
+ | |||
+ | == DEBUG: | ||
+ | |||
+ | == DEBUG: | ||
+ | |||
+ | == DEBUG:CMD == | ||
+ | |||
+ | == DEBUG:PING == | ||
+ | |||
+ | == DEBUG: | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == COMMAND:SIT == | ||
+ | |||
+ | == COMMAND:AFK == | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == COMMAND: | ||
+ | |||
+ | == MP_EVAL: | ||
+ | |||
+ | == MP_EVAL: | ||
+ | |||
+ | == MP_EVAL: | ||
+ | |||
+ | == MP_EVAL: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT:BUY == | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
== BOTCHAT: | == BOTCHAT: | ||
+ | Le client informe de certains filtres. | ||
+ | |||
+ | <WRAP center round help 60%> | ||
+ | **À quoi servent-ils ?** | ||
+ | |||
+ | Il s'agit peut-être d' | ||
+ | |||
+ | Il pourrait aussi s'agir de filtres pour préciser sur quels canaux le message de chat est envoyé. | ||
+ | |||
+ | Bref, pour en savoir plus, il va falloir faire des tests ! S'il y a des exemples de filtres, demander à des joueuses de Ryzom (il y en a sur le canal XMPP Khaganat) si ça leur évoque quelque chose. S'il n'y a aucun exemple, donner la piste pour les trouver, et on demandera à quelqu' | ||
+ | --- // | ||
+ | </ | ||
+ | |||
+ | <WRAP center round tip 60%> | ||
+ | En fait, tout ce qui est ' | ||
+ | --- // | ||
+ | </ | ||
- | Le client informe de certain filtre (a quoi servent-ils ?) | ||
- | Code actuel : BOTCHAT: | + | Code actuel : '' |
- | (<u> | + | <WRAP center round important 60%> |
+ | Attention : dépend de la version que vous avez de msg.xml, susceptible de changer. | ||
+ | </ | ||
+------------+-------------------+------------------+ | +------------+-------------------+------------------+ | ||
Ligne 1010: | Ligne 1600: | ||
* itemType (Uint8) | * itemType (Uint8) | ||
- | === Visual Property === | + | |
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT:END == | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == BOTCHAT: | ||
+ | |||
+ | == JOURNAL: | ||
+ | |||
+ | == JOURNAL: | ||
+ | |||
+ | == JOURNAL: | ||
+ | |||
+ | == JOURNAL: | ||
+ | |||
+ | == JOURNAL: | ||
+ | |||
+ | == JOURNAL: | ||
+ | |||
+ | == JOURNAL: | ||
+ | |||
+ | == JOURNAL: | ||
+ | |||
+ | == STRING_MANAGER: | ||
+ | |||
+ | == STRING_MANAGER: | ||
+ | |||
+ | Le serveur envoie un message, plus précisément le pointeur sur le message. | ||
+ | |||
+ | Code actuel : '' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Attention : dépend de la version que vous avez de '' | ||
+ | </ | ||
+ | +----------------+--------------+------------------+------------------+ | ||
+ | | STRING_MANAGER | PHRASE_SEND | ||
+ | | 6 bits | 3 bits | uint32 | ||
+ | | 011011 | ||
+ | +----------------+--------------+------------------+------------------+ | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | == STRING_MANAGER: | ||
+ | |||
+ | Le client demande le message complet en fonction du pointeur. | ||
+ | |||
+ | Code actuel : '' | ||
+ | |||
+ | +----------------+--------------+------------------+ | ||
+ | | STRING_MANAGER | STRING_RQ | ||
+ | | 6 bits | 3 bits | uint32 | ||
+ | | 011011 | ||
+ | +----------------+--------------+------------------+ | ||
+ | |||
+ | * '' | ||
+ | |||
+ | Le serveur va répondre à ce message par '' | ||
+ | |||
+ | == STRING_MANAGER: | ||
+ | |||
+ | Le serveur renvoie le message complet. | ||
+ | |||
+ | Code actuel : '' | ||
+ | |||
+ | +----------------+--------------+------------------+--------------+ | ||
+ | | STRING_MANAGER | STRING_RESP | ||
+ | | 6 bits | 3 bits | uint32 | ||
+ | | 011011 | ||
+ | +----------------+--------------+------------------+--------------+ | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | On remarque ici l' | ||
+ | |||
+ | |||
+ | == STRING_MANAGER: | ||
+ | |||
+ | Commande utilisée pour initialiser le tableau de message. | ||
+ | |||
+ | Ici, on vérifie que notre tableau interne au client a la même date que le tableau du serveur. Sinon, on efface le tableau interne du client, et à chaque nouveau message le client demandera à quoi il correspond. | ||
+ | |||
+ | Code actuel : '' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Attention : dépend de la version que vous avez de '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | +----------------+--------------+------------------+ | ||
+ | | STRING_MANAGER | RELOAD_CACHE | timestamp | ||
+ | | 6 bits | 3 bits | uint32 | ||
+ | | 011011 | ||
+ | +----------------+--------------+------------------+ | ||
+ | |||
+ | * '' | ||
+ | |||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD:QUIT == | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | Le serveur signale que la guilde((Le MMORPG utilise un système de " | ||
+ | |||
+ | Code actuel : '' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Attention : dépend de la version que vous avez de msg.xml, susceptible de changer. | ||
+ | </ | ||
+ | |||
+ | +------------+-------------------+--------------------+ | ||
+ | | GUILD | USE_FEMALE_TITLES | UseFemaleTitles | ||
+ | | 6 bits | 5 bits | bool | | ||
+ | | 011100 | ||
+ | +------------+-------------------+--------------------+ | ||
+ | |||
+ | * UseFemaleTitles (bool) : 1 = Oui, 0 = Non | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == GUILD: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == OUTPOST: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE:BUY == | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == PHRASE: | ||
+ | |||
+ | == ITEM_INFO: | ||
+ | |||
+ | == ITEM_INFO: | ||
+ | |||
+ | == ITEM_INFO: | ||
+ | |||
+ | == MISSION_PREREQ: | ||
+ | |||
+ | == MISSION_PREREQ: | ||
+ | |||
+ | == MISSION: | ||
+ | |||
+ | == MISSION: | ||
+ | |||
+ | == MISSION: | ||
+ | |||
+ | == MISSION: | ||
+ | |||
+ | == MISSION: | ||
+ | |||
+ | == DUEL:ASK == | ||
+ | |||
+ | == DUEL:ACCEPT == | ||
+ | |||
+ | == DUEL:REFUSE == | ||
+ | |||
+ | == DUEL: | ||
+ | |||
+ | == DUEL: | ||
+ | |||
+ | == DUEL: | ||
+ | |||
+ | == PVP_CHALLENGE: | ||
+ | |||
+ | == PVP_CHALLENGE: | ||
+ | |||
+ | == PVP_CHALLENGE: | ||
+ | |||
+ | == PVP_CHALLENGE: | ||
+ | |||
+ | == PVP_CHALLENGE: | ||
+ | |||
+ | == PVP_CHALLENGE: | ||
+ | |||
+ | == PVP:PVP_TAG == | ||
+ | |||
+ | == PVP: | ||
+ | |||
+ | == PVP: | ||
+ | |||
+ | == PVP_FACTION: | ||
+ | |||
+ | == PVP_FACTION: | ||
+ | |||
+ | == PVP_FACTION: | ||
+ | |||
+ | == ENCYCLOPEDIA: | ||
+ | |||
+ | == ENCYCLOPEDIA: | ||
+ | |||
+ | == USER:BARS == | ||
+ | |||
+ | == USER:POPUP == | ||
+ | |||
+ | == EVENT: | ||
+ | |||
+ | == EVENT:DUMMY == | ||
+ | |||
+ | == TOTEM:BUILD == | ||
+ | |||
+ | == TOTEM:DUMMY == | ||
+ | |||
+ | == MODULE_GATEWAY: | ||
+ | |||
+ | == MODULE_GATEWAY: | ||
+ | |||
+ | == MODULE_GATEWAY: | ||
+ | |||
+ | == SEASON:SET == | ||
+ | |||
+ | == SEASON: | ||
+ | |||
+ | == DM_GIFT: | ||
+ | |||
+ | == DM_GIFT: | ||
+ | |||
+ | == RING_MISSION: | ||
+ | |||
+ | == RING_MISSION: | ||
+ | |||
+ | == NPC_ICON: | ||
+ | |||
+ | == NPC_ICON: | ||
+ | |||
+ | == NPC_ICON: | ||
+ | |||
+ | == NPC_ICON: | ||
+ | |||
+ | |||
+ | |||
+ | ==== Visual Property | ||
Et oui, nous avons encore une autre structure pour envoyer des informations du serveur vers le client. | Et oui, nous avons encore une autre structure pour envoyer des informations du serveur vers le client. | ||
- | Ici le codage/ | + | Ici le codage/ |
+ | Pourquoi cette structure? | ||
+ | * Peut-etre pour réduire la taille des info, mais on perd la modularité de msg.xml | ||
- | ==== Paquet envoyé par le client ==== | + | * l' |
- | === Corps du message === | + | Visiblement, |
- | +-------------------+------------+--- | + | Le début de la structure: |
- | | CurrentSendNumber | SystemMode | . . . | + | |
- | | 32 bits | 1 bit | | + | |
- | +-------------------+------------+--- | + | |
- | 1 -> system mode | + | |
- | 0 -> normal mode | + | |
+ | +----------+-----------------+------------------+----------------+------------------+ | ||
+ | | Slot | associationBits | timestampIsThere | timestampDelta | VisualProperties | | ||
+ | | 8 Bits | 2 bit | 1 bit | 4 bit | X bits | | ||
+ | | unsigned | | ||
+ | +----------+-----------------+------------------+----------------+------------------+ | ||
+ | | ||
+ | * slot : position/ | ||
+ | * associationBits : un indicateur (sorte de clef de hachage) pour savoir si on parle de la même donnée, sinon l' | ||
+ | * timestampIsThere : active le delta sur le timestamp (0: non, 1:oui) | ||
+ | * timestampDelta : permet d' | ||
+ | * VisualProperties : ici nous avons une nouvelle structure qui fonctionne par branche (et feuille pour les terminaison) | ||
+ | | ||
+ | === VisualProperties === | ||
- | * CurrentSendNumber : un compteur qui s'incrémente tout le temps (permet | + | Il s'agit d'une liste sans fin de VisualProperty |
- | Attention: quand le compteur aura atteint le maximum, le client va refuser tous les messages. | + | |
- | * SystemMode : Informe que le type de message est dit " | + | |
+ | +----------------+----------------+ | ||
+ | | VisualProperty | VisualProperty | . . . | ||
+ | +----------------+----------------+ | ||
- | === Message système | + | === VisualProperty |
+ | Il s'agit d'un arbre qui se sépare à chaque fois en deux branch VPA et VPB. | ||
- | +-------------------+------------+---------+--- | + | Pour chacune des branches (on commence par VPA, puis VPB), on lit un bit (0: pas de donnée, 1: des données), si un branch contient une autre branche, on refait de comme précédement (lecture VPA puis VPB). |
- | | CurrentSendNumber | SystemMode | Message | . . . | + | puis on continue jusqu' |
- | | 32 bits | 1 bit | 8 Bits | | + | |
- | +-------------------+------------+---------+--- | + | |
- | | xxxxxxxxxxxxxxxx | | + | |
- | | + | {{: |
- | Noter qu'ici nous utilisons 8 bits, on aurait pu réduire la taille | + | Dans les faits, ils utilisent ACTION_SINT64 pour toutes les valeurs, mais avec une taille |
- | A savoir 5 types de messages provenant du client & 5 types de messages provenant du serveur. (soit une taille de 3 bits) | + | === Les différents Property === |
- | == Message 0 : SYSTEM_LOGIN_CODE | + | == POSITION_CODE |
- | | + | |
- | +-------------------+------------+---------+-----------+----------+----------+-------- / ---------+ | + | +----------+----------+----------+ |
- | | CurrentSendNumber | + | | px | py | pz | |
- | | 32 bits | 1 bit | 8 Bits | 32 bits | 32 bits | 32 bits | String | + | | 16 Bits |
- | | + | | unsigned | unsigned | unsigned | |
- | +-------------------+------------+---------+-----------+----------+----------+-------- / ---------+ | + | +----------+----------+----------+ |
- | | xxxxxxxxxxxxxxxx | | + | |
+ | * px : position x | ||
+ | * py : position y | ||
+ | * pz : position z (isRelative: | ||
- | == Message 2 : SYSTEM_ACK_SYNC_CODE == | + | +-------------------------------+ |
- | Message émis par le client. | + | | pz | |
- | Message utiliser pour acquitter d'une demande de synchroniser. | + | | 14 bit | |
+ | | | | | | | | | | | | | | | | | | | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | + Interior | ||
+ | + IsRelative | ||
- | +-------------------+------------+---------+-----------+----------+-----------------+----------+ | + | == PROPERTY_ORIENTATION == |
- | | CurrentSendNumber | SystemMode | Message | frontack | + | |
- | | 32 bits | 1 bit | 8 Bits | 32 bits | 32 bits | 1024 bits | 32 bits | | + | |
- | | | + | |
- | +-------------------+------------+---------+-----------+----------+-----------------+----------+ | + | |
- | | xxxxxxxxxxxxxxxx | | + | |
- | | + | Indique la rotation |
- | | + | |
- | | + | |
- | | + | |
+ | +-------------+ | ||
+ | | Orientation | | ||
+ | | 32 Bits | | ||
+ | | float | | ||
+ | +-------------+ | ||
- | == Message 4 : SYSTEM_ACK_PROBE_CODE | + | == PROPERTY_BEHAVIOUR |
- | | + | |
- | | + | |
- | +-------------------+------------+---------+-------------+---------+---------+-- / --+---------+ | + | +-------------+ |
- | | CurrentSendNumber | SystemMode | Message | Taille : X | Probe 1 | Probe 2 | | Probe X | | + | | Behaviour |
- | | 32 bits | 1 bit | 8 Bits | 32 bits | + | | 48 Bits | |
- | | | | | signed | + | | Unsigned |
- | +-------------------+------------+---------+-------------+---------+---------+-- / --+---------+ | + | +-------------+ |
- | | xxxxxxxxxxxxxxxx | | + | |
+ | == PROPERTY_OWNER_PEOPLE == | ||
- | == Message 5 : SYSTEM_DISCONNECTION_CODE == | + | +--------------+ |
- | Message émis par le client. | + | | Owner People | |
+ | | 3 Bits | | ||
+ | | Unsigned | ||
+ | +--------------+ | ||
- | +-------------------+------------+---------+ | + | == PROPERTY_NAME_STRING_ID == |
- | | CurrentSendNumber | SystemMode | Message | | + | |
- | | 32 bits | 1 bit | 8 Bits | | + | |
- | | | + | |
- | +-------------------+------------+---------+ | + | |
- | | xxxxxxxxxxxxxxxx | | + | |
+ | +----------------+ | ||
+ | | Name String Id | | ||
+ | | 32 Bits | | ||
+ | | Unsigned | ||
+ | +----------------+ | ||
- | == Message 8 : SYSTEM_QUIT_CODE | + | == PROPERTY_CONTEXTUAL |
- | | + | |
- | +-------------------+------------+---------+---------+ | + | +------------+ |
- | | CurrentSendNumber | SystemMode | Message | Quit Id | | + | | Contextual |
- | | | + | | 16 Bits | |
- | | | | | signed | + | | Unsigned |
- | +-------------------+------------+---------+---------+ | + | +------------+ |
- | | xxxxxxxxxxxxxxxx | | + | |
+ | == PROPERTY_TARGET_LIST == | ||
- | + | +-------------+ | |
- | === Message normal === | + | | Target List | |
+ | | 32 Bits | | ||
+ | | Unsigned | ||
+ | +-------------+ | ||
+ | == PROPERTY_TARGET_ID == | ||
- | +-------------------+------------+---------+--- | + | +-----------+ |
- | | CurrentSendNumber | + | | Target ID | |
- | | | + | | 8 Bits | |
- | +-------------------+------------+---------+--- | + | |
- | | xxxxxxxxxxxxxxxx | | + | +-----------+ |
+ | == PROPERTY_MODE == | ||
+ | +-----------+ | ||
+ | | Mode | | ||
+ | | 44 Bits | | ||
+ | | Unsigned | ||
+ | +-----------+ | ||
+ | |||
+ | == PROPERTY_VPA == | ||
+ | |||
+ | +-----------+ | ||
+ | | VPA | | ||
+ | | 64 Bits | | ||
+ | | Unsigned | ||
+ | +-----------+ | ||
+ | |||
+ | == PROPERTY_BARS == | ||
+ | |||
+ | +-----------+ | ||
+ | | BARS | | ||
+ | | 32 Bits | | ||
+ | | Unsigned | ||
+ | +-----------+ | ||
+ | |||
+ | <WRAP center round help 60%> | ||
+ | Avec le petit commentaire du code source : please do not lower it (or tell Olivier: used for forage sources) | ||
+ | </ | ||
+ | |||
+ | == PROPERTY_VISUAL_FX == | ||
+ | |||
+ | +-----------+ | ||
+ | | VISUAL FX | | ||
+ | | 11 Bits | | ||
+ | | Unsigned | ||
+ | +-----------+ | ||
+ | |||
+ | <WRAP center round help 60%> | ||
+ | Avec le petit commentaire du code source : please do not lower it (or tell Olivier: used for forage sources) | ||
+ | </ | ||
+ | |||
+ | == PROPERTY_VPB == | ||
+ | |||
+ | +-----------+ | ||
+ | | VPB | | ||
+ | | 47 Bits | | ||
+ | | Unsigned | ||
+ | +-----------+ | ||
+ | |||
+ | == PROPERTY_VPC == | ||
+ | |||
+ | +-----------+ | ||
+ | | VPC | | ||
+ | | 58 Bits | | ||
+ | | Unsigned | ||
+ | +-----------+ | ||
+ | |||
+ | == PROPERTY_EVENT_FACTION_ID == | ||
+ | |||
+ | +------------------+ | ||
+ | | Event Faction ID | | ||
+ | | 32 Bits | | ||
+ | | Unsigned | ||
+ | +------------------+ | ||
+ | |||
+ | == PROPERTY_PVP_MODE == | ||
+ | |||
+ | +----------+ | ||
+ | | PvP Mode | | ||
+ | | 10 Bits | | ||
+ | | Unsigned | | ||
+ | +----------+ | ||
+ | |||
+ | == PROPERTY_PVP_CLAN == | ||
+ | |||
+ | +----------+ | ||
+ | | PvP Clan | | ||
+ | | 32 Bits | | ||
+ | | Unsigned | | ||
+ | +----------+ | ||
+ | |||
+ | == PROPERTY_ENTITY_MOUNTED_ID == | ||
+ | |||
+ | +-------------------+ | ||
+ | | Entity Mounted ID | | ||
+ | | 8 Bits | | ||
+ | | Unsigned | ||
+ | +-------------------+ | ||
+ | |||
+ | == PROPERTY_RIDER_ENTITY_ID == | ||
+ | |||
+ | +-----------------+ | ||
+ | | Rider Entity ID | | ||
+ | | 8 Bits | | ||
+ | | Unsigned | ||
+ | +-----------------+ | ||
+ | |||
+ | == PROPERTY_OUTPOST_INFOS == | ||
+ | |||
+ | +---------------+ | ||
+ | | Outpost Infos | | ||
+ | | 16 Bits | | ||
+ | | Unsigned | ||
+ | +---------------+ | ||
+ | |||
+ | == PROPERTY_GUILD_SYMBOL == | ||
+ | |||
+ | +--------------+ | ||
+ | | Guild Symbol | | ||
+ | | 60 Bits | | ||
+ | | Unsigned | ||
+ | +--------------+ | ||
+ | |||
+ | == PROPERTY_GUILD_NAME_ID == | ||
+ | |||
+ | +---------------+ | ||
+ | | Guild Name ID | | ||
+ | | 32 Bits | | ||
+ | | Unsigned | ||
+ | +---------------+ | ||
+ | |||
+ | === Exemple === | ||
+ | |||
+ | A faire ... | ||
===== Annexe : Format des messages ===== | ===== Annexe : Format des messages ===== | ||
Ligne 1130: | Ligne 2227: | ||
==== bool : 1 bit ==== | ==== bool : 1 bit ==== | ||
- | Juste un bit, vrai ou faux (true/ | + | Juste un bit, vrai ou faux (true [1]/ |
+-------+ | +-------+ | ||
Ligne 1144: | Ligne 2241: | ||
==== uint16 : Unsigned int 16 bits ==== | ==== uint16 : Unsigned int 16 bits ==== | ||
- | On écrit le chiffre en commençant par la partie la plus faible jusqu' | + | On écrit le chiffre en commençant par la partie la plus faible jusqu' |
- | Format little endian. | + | |
Ex. Valeur : 0x1234 | Ex. Valeur : 0x1234 | ||
Ligne 1158: | Ligne 2254: | ||
==== uint32 : Unsigned int 32 bits ==== | ==== uint32 : Unsigned int 32 bits ==== | ||
- | On écrit le chiffre en commençant par la partie la plus faible jusqu' | + | On écrit le chiffre en commençant par la partie la plus faible jusqu' |
- | Format little endian. | + | |
Ex. Valeur : 0x12345678 | Ex. Valeur : 0x12345678 | ||
Ligne 1171: | Ligne 2266: | ||
==== sint32 : int 32 bits ==== | ==== sint32 : int 32 bits ==== | ||
- | On écrit le chiffre en commençant par la partie la plus faible jusqu' | + | On écrit le chiffre en commençant par la partie la plus faible jusqu' |
- | Format little endian. | + | |
Ex. Valeur : 0x12345678 | Ex. Valeur : 0x12345678 | ||
Ligne 1185: | Ligne 2279: | ||
==== uint64 : Unsigned int 64 bits ==== | ==== uint64 : Unsigned int 64 bits ==== | ||
- | On écrit le chiffre en commençant par la partie la plus faible jusqu' | + | On écrit le chiffre en commençant par la partie la plus faible jusqu' |
- | Format little endian. | + | |
Ex. Valeur : 0x0123456789ABCDEF | Ex. Valeur : 0x0123456789ABCDEF | ||
Ligne 1199: | Ligne 2292: | ||
==== String : Chaîne de caractère ==== | ==== String : Chaîne de caractère ==== | ||
- | Une chaîne de caractère | + | Une chaîne de caractères |
+------------+---------+--------+------------+--------+ | +------------+---------+--------+------------+--------+ | ||
Ligne 1209: | Ligne 2302: | ||
==== String-UTF-8 : Chaîne de caractère ==== | ==== String-UTF-8 : Chaîne de caractère ==== | ||
- | Une chaîne de caractère | + | Une chaîne de caractères |
+------------+---------+--------+------------+--------+ | +------------+---------+--------+------------+--------+ | ||
Ligne 1220: | Ligne 2313: | ||
==== String-UTF-16 : chaîne de caractère au format UTF-16 ==== | ==== String-UTF-16 : chaîne de caractère au format UTF-16 ==== | ||
- | Une chaîne de caractère | + | Une chaîne de caractères |
- | Ce format est utilisé sous windows, nous préférons plus UTF-8, dans godot, mais une simple conversion suffit pour passer d'un format à l' | + | |
+ | Ce format est utilisé sous Windows, nous préférons plus UTF-8 dans Godot, mais une simple conversion suffit pour passer d'un format à l' | ||
Ligne 1228: | Ligne 2322: | ||
| uint32 | | uint32 | ||
+------------+-------------+-------------+------------+-------------+ | +------------+-------------+-------------+------------+-------------+ | ||
- | | + | |
+ | |||
+ | |||
+ | |||
+ | ===== Annexe : Exemple de communication ===== | ||
+ | |||
+ | ==== Exemple d' | ||
+ | |||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Source -> Dest. | Message | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | TEAM/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | PHRASE/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | GUILD/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | BOTCHAT/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | POSITION (X, Y, Z, Heading) | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | DEBUG/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DEATH/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | STRING/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | PHRASE/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | ENCYCLOPEDIA/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_INIT/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | NPC_ICON/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | STRING_MANAGER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | USER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | NPC_ICON/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | VisualProperty/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_INIT/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_GROUP/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_UPD_PLR | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | PVP_EFFECTS/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_UPD_PLR/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | |||
+ | |||
+ | ==== Exemple d' | ||
+ | |||
+ | Dans les faits, le serveur envoie des identifiant pour le message, si le client ne connais pas l' | ||
+ | |||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Source -> Dest. | Message | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | STRING_MANAGER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | STRING_MANAGER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | STRING_MANAGER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | |||
+ | Ex.: | ||
+ | Le serveur demande d' | ||
+ | 7705 : & | ||
+ | 7849 : Dispensaire | ||
+ | 7859 : Terres Contrôlées | ||
+ | |||
+ | Cela donne le message : & | ||
+ | |||
+ | |||
+ | |||
+ | ===== Annexe : Exemple de communication ===== | ||
+ | |||
+ | ==== Exemple d' | ||
+ | |||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Source -> Dest. | Type de message | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | CONNECTION/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | TEAM/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | PHRASE/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | GUILD/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | BOTCHAT/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | POSITION (X, Y, Z, Heading) | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | DEBUG/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DEATH/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | STRING/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | PHRASE/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | ENCYCLOPEDIA/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_INIT/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | NPC_ICON/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | STRING_MANAGER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | USER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | NPC_ICON/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | VisualProperty/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_INIT/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_GROUP/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_UPD_PLR | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | PVP_EFFECTS/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | DB_UPD_PLR/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | |||
+ | ==== Exemple d' | ||
+ | |||
+ | Dans les faits, le serveur envoie des identifiant pour le message, si le client ne connais pas l' | ||
+ | |||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Source -> Dest. | Type de message | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | STRING_MANAGER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Client -> Serveur | STRING_MANAGER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | | Serveur -> Client | STRING_MANAGER/ | ||
+ | +-------------------+--------------------------------+-------------- | ||
+ | |||
+ | Ex.: | ||
+ | Le serveur demande d' | ||
+ | 7705 : & | ||
+ | 7849 : Dispensaire | ||
+ | 7859 : Terres Contrôlées | ||
+ | |||
+ | Cela donne le message : & | ||
+ | |||
+ | |||
+ | ===== Annexe : Analyse des structures ===== | ||
+ | |||
+ | ==== Structure du personnage ==== | ||
+ | |||
+ | La structure du personnage est différente entre la création et l' | ||
+ | Il en résulte une contrainte sur les paramètres pour faire coincidé les deux structures. | ||
+ | Dans un premier cas, on retrouve toutes les propriétés sur un mutltiple de 8 bits, and le deuxième cas, on contracte les données en trois entier de 64 bits. (bref moins de place donc certain paramètres on pas la possibilité d' | ||
+ | De plus quand on recharge les personnages, | ||
+ | * * Liste à puce | ||
+ | === Structure création du personnage === | ||
+ | |||
+ | == Structure création du personnage == | ||
+ | |||
+ | Type de message : CONNECTION/ | ||
+ | |||
+ | * (Uint8) Slot | ||
+ | * (Uint32) SheetId | ||
+ | * (Uint32) CSessionId | ||
+ | * (Uint32) name:size | ||
+ | * (UString) name: | ||
+ | * (Uint8) People | ||
+ | * (Uint8) Sex | ||
+ | * (Uint8) NbPointFighter | ||
+ | * (Uint8) NbPointCaster | ||
+ | * (Uint8) NbPointCrafter | ||
+ | * (Uint8) NbPointHarvester | ||
+ | * (Sint32) StartPoint | ||
+ | * (Sint8) HairType | ||
+ | * (Sint8) HairColor | ||
+ | * (Sint8) GabaritHeight | ||
+ | * (Sint8) GabaritTorsoWidth | ||
+ | * (Sint8) GabaritArmsWidth | ||
+ | * (Sint8) GabaritLegsWidth | ||
+ | * (Sint8) GabaritBreastSize | ||
+ | * (Sint8) MorphTarget1 | ||
+ | * (Sint8) MorphTarget2 | ||
+ | * (Sint8) MorphTarget3 | ||
+ | * (Sint8) MorphTarget4 | ||
+ | * (Sint8) MorphTarget5 | ||
+ | * (Sint8) MorphTarget6 | ||
+ | * (Sint8) MorphTarget7 | ||
+ | * (Sint8) MorphTarget8 | ||
+ | * (Sint8) EyesColor | ||
+ | * (Sint8) Tattoo | ||
+ | * (Sint8) JacketColor | ||
+ | * (Sint8) TrousersColor | ||
+ | * (Sint8) HatColor | ||
+ | * (Sint8) ArmsColor | ||
+ | * (Sint8) HandsColor | ||
+ | * (Sint8) FeetColor | ||
+ | |||
+ | Source : | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | === Structure reception pour les autres joueurs === | ||
+ | |||
+ | Ils existent plusieurs messages qui receptionne les caractèristiques. | ||
+ | |||
+ | * Les messages du type CONNECTION/ | ||
+ | * Utilise la structure VPA, VPB & VPC | ||
+ | * Les messages du type VisualProperty (on réception les caractèristiques des différentes entités [personnages d' | ||
+ | * Utilise la structure VPA & VPC (pas la VPB - étrange) | ||
+ | |||
+ | == Structure VisualPropA == | ||
+ | |||
+ | VPA: VisualPropA est de type Uint64 (unsigned int 64 bits). | ||
+ | |||
+ | [Source: khanat-opennel-code/ | ||
+ | |||
+ | * Sex : 1 bit/ | ||
+ | * JacketModel : 8 bits (max: 255) | ||
+ | * JacketColor : 3 bits (max: 7) | ||
+ | * TrouserModel : 8 bits (max 255) | ||
+ | * TrouserColor : 3 bits (max: 7) | ||
+ | * WeaponRightHand : 10 bits (max: 1023) | ||
+ | * WeaponLeftHand : 8 bits (max: 255) | ||
+ | * ArmModel : 8 bits (max: 255) | ||
+ | * ArmColor : 3 bits (max: 7) | ||
+ | * HatModel : 9 bits (max: 511) | ||
+ | * HatColor : 3 bits (max: 7) | ||
+ | |||
+ | Remarque concernant le sexe : | ||
+ | On peut noter qu'il n'y a que 2 possibilités pour le sexe, mâle ou femelle. | ||
+ | (on peut dire adieu aux autres formes de reproduction (asexuée, clonnage, changement de sexe suivant l' | ||
+ | |||
+ | == Structure VisualPropB == | ||
+ | |||
+ | VPB: VisualPropB est de type Uint64 (unsigned int 64 bits). | ||
+ | |||
+ | [Source: khanat-opennel-code/ | ||
+ | |||
+ | * Name : 16 bits (max: 65535) -> ID qui permettrant de retrouver dans la liste des mots stockés | ||
+ | * HandsModel : 9 bits (max: 511) | ||
+ | * HandsColor : 3 bits (max: 7) | ||
+ | * FeetModel : 9 bits (max: 511) | ||
+ | * FeetColor : 3 bits (max: 7) | ||
+ | * RTrail : 4 bits (max: 15) | ||
+ | * LTrail : 3 bits (max: 7) | ||
+ | * Reste : 17 bits non utilisée | ||
+ | |||
+ | == Structure VisualPropC == | ||
+ | VPC: VisualPropC est de type Uint64 (unsigned int 64 bits). | ||
+ | [Source: khanat-opennel-code/ | ||
+ | * MorphTarget1 : 3 bits (max: 7) | ||
+ | * MorphTarget2 : 3 bits (max: 7) | ||
+ | * MorphTarget3 : 3 bits (max: 7) | ||
+ | * MorphTarget4 : 3 bits (max: 7) | ||
+ | * MorphTarget5 : 3 bits (max: 7) | ||
+ | * MorphTarget6 : 3 bits (max: 7) | ||
+ | * MorphTarget7 : 3 bits (max: 7) | ||
+ | * MorphTarget8 : 3 bits (max: 7) | ||
+ | * EyesColor : 3 bits (max: 7) | ||
+ | * Tattoo : 7 bits (max: 127) | ||
+ | * CharacterHeight : 4 bits (max: 15) | ||
+ | * TorsoWidth : 4 bits (max: 15) | ||
+ | * ArmsWidth : 4 bits (max: 15) | ||
+ | * LegsWidth : 4 bits (max: 15) | ||
+ | * BreastSize : 4 bits (max: 15) | ||
+ | * Reste : 10 bits non utilisée | ||
- | {{tag>reseau}} | + | {{tag>Théorie MMORPG Client Serveur Réseau ryzom_core}} |