Aller au contenu
Top-Metin2.org - Vous êtes à la recherche d'un serveur Metin 2 ? ×
×
×
  • Créer...

Fonctionnement de la colonne `skill_level`


Kameyu

Messages recommandés

  • Développeur

Bonjour/soir à toutes et à tous.

 

Beaucoup se sont certainement demandés à quoi sert exactement la colonne `skill_level` et même plus encore:

comment est-ce qu'elle fonctionne ? Je crée ce sujet pour vous l'expliquer. C'est parti !

 

 

Un BLOB ?    ¿Ma qué?

 

Commençons par la base: Un BLOB qu'est-ce que c'est ?

Ça signifie tout bêtement Binary Large OBject, c'est un type de donnée très maniable qui permet de stocker des données en brut

(hexadécimal, pour être précis), et ce, en permettant de changer de taille de manière totalement libre. Il existe 4 types de BLOBs:

  • tinyblob
  • blob
  • mediumblob
  • longblob

 

Contrairement aux données de texte (varchar, text, etc) , les BLOBs sont lus en tant que données binaires, et non de Texte, bien que

l'éditeur hexadécimal permette d'afficher le dump (on verra ça plus tard) ASCII de ces données.

 

 

Ok magique, mais comment on voit ces données ?

 

Vous avez deux solutions:

  • Exporter la donnée sous forme de fichier binaire pour la visualiser avec un éditeur Hexadécimal comme HexEdit
  • Lire la donnée directement depuis l'outil de Navicat (ou autre logiciel de gestion s'il le permet)

 

Dans notre cas, on va utiliser Navicat, c'est plus rapide, et plus pratique que d'exporter les données à chaque fois.

Surtout qu'en exportant la donnée, on ne pourra pas Copier-Coller les modifications. Alors comment se fait-ce ? (il a dit fesse lol)

Dans votre table `player`.`player`, il vous suffit de cliquer sur votre BLOB, puis sur le menu contextuel (la flèche )

à côté du bouton "Mémo" comme suit:

 

image.png.8840b0866b17d543a63c145122e0ef69.png

 

Puis sélectionner "Hex" comme sur l'image. Une fois fait, une petite fenêtre va apparaître avec tout un tas

de zéros incompréhensibles (alors que vous êtes plein de skills...). Et forcément, vous l'aurez compris,

le but du tutoriel c'est que vous sortiez d'ici en sachant expliquer comment ça marche !

 

Bon maintenant qu'on a notre beau panneau Hex et nos données affichées (enfin, avec plein de zéros, "données" hein...),

on va pouvoir comprendre comment ça marche; et pour ça je vous ai facilité la tâche, je me suis mis tous les skills en P.

J'ai bien dit TOUS les skills, même ceux qui ne sont pas de ma classe ! (je vous préviens, on pourra pas utiliser aura sur une shaman)

Du coup, voici à quoi ça ressemble maintenant:

 

image.png.569c3cbaf1d4c7a6198ba725f6ea2e05.png

 

 

Ooook mais j'ai toujours rien compris. Par contre y'a pas que des zéros là !

 

Bien vu l'aveugle (dit-il en se parlant à lui-même) ! Bon du coup, si vous ne comprenez rien à l'Hexadécimal, je ne vais

pas pouvoir vous aider plus que ça, je ne peux pas vous faire un cours d'Hexa donc si vous ne savez pas compter en Hexa...

Vous pouvez prendre la porte, sauf si vous estimez comprendre les choses assez vite, vous pourrez continuer le tutoriel.

Bon, du coup c'est bien beau tout ça mais ça ne nous fait pas plus comprendre comment ça marche... Eh bien à moi de vous

expliquer ça.

 

Un octet correspond à deux zéros: 00. Car en Hexa, on travaille sur 4 bits (base 16, donc forcément). Avoir deux zéros, ça

nous donne un octet car 4 bits collés à 4 bits nous donnent 8 bits (quel génie fais-je), et donc 8 bits équivalent à un octet.

Ce qu'il faut savoir, c'est que les 6 premiers octets (6 x 2 zéros = 12 premiers zéros) ne sont pas utilisés. D'ailleurs je n'ai

pour l'instant pas encore trouvé à quoi ils peuvent bien servir. Si quelqu'un sait, je le rajouterai dans le tutoriel.

 

 

Voilà, enfin un peu de lourd, on s'faisait chier avec ta théorie là !

 

Du calme, du calme, j'y viens :D ! Maintenant qu'on sait tout ça, on tombe sur notre premier code hexadécimal:

0328 0000

Pourquoi j'ai rajouté les 4 zéros ? Car ils concernent le premier skill. Comme c'est un condensé de données, il faut

pouvoir différencier les autres skills donc on les sépare avec 2 octets de données chacun. Et à votre avis, on voit combien de fois

ce code hexadécimal en tout sur les premières lignes ?

 

6 fois, comme pour 6 skills. Assez dingue non ? Je trouve aussi, la nature est bien faite, vous ne trouvez pas ?

Du coup, voilà pour la séparation des données: En rouge, les 4 octets de séparation:

image.png.7706500c1a6d4fb2e5f229f1419efc54.png

 

Maintenant qu'on sait comment les skills sont séparés, il faut savoir les différencier ! Eh bien là encore une fois

c'est pas plus compliqué, ils sont inscrits dans un ordre précis que vous connaissez peut-être déjà grâce à la SkillTable.txt:

Ils sont dans l'ordre ! Les 03 28 que vous voyez correspondent tous à un skill en P (je viendrai plus tard sur pourquoi 03 et 28).


Du coup maintenant on sait où sont nos skills, et là on a 3 lignes de skills, mais à quoi correspondent-ils ? En fait, ils sont comme

je le disais, dans l'ordre décimal croissant de votre SkillTable, mais aussi dans l'ordre des classes.

On aura donc à chaque ligne les sorts d'une classe différente, dans l'ordre qui suit:

 

  • Guerrier Corps-à-Corps
  • Guerrier Mental
  • Ninja Assassin
  • Ninja Archer
  • Sura Armes Magiques
  • Sura Magie Noire
  • Shaman Dragon
  • Shaman Soin

 

Là on connaît l'ordre, donc sur notre screenshot suivant, on voit les séparations en rouge, ainsi que la ligne du

Guerrier Corps-à-Corps en vert:

image.png.724d49fae72f01302acb7ba7277ba268.png

 

La deuxième ligne commence à partir de l'offset 0x060 et se termine à l'offset 0x07F,

la troisième ligne commence à partir de l'offset 0x0BA et se termine à l'offset 0x0D9.

 

/!\ ATTENTION ! Si vous n'avez que 5 skills en G Mental, l'offset ne se terminera pas à 0x07F mais 0x079 /!\

 

Vient ensuite la séparation des classes de skills. Elles sont toutes séparées par 58 octets ! Pourquoi ?

Je vous avoue que j'en ai aucune idée. Je planche encore dessus, je précise que je fais ce tutoriel à partir d'aucune source,

seulement des données hexadécimales ! Notre séparation de "classes de skills" ressemble donc à ça:

 image.png.354aff6b3ccf51dd23896b8157128db9.png

 

Du coup bingo, on connaît l'ordre des classes, on sait par combien d'octets ils sont séparés, on peut maintenant passer à la suite !

 

Yes ! J'attends toujours que tu m'expliques pourquoi 03 28, c'est le nouveau numéro de la sécu ?

 

Qu'est-ce qu'on se marre sur ce topic, j'vous jure :D ! En fait c'est très simple vous allez vite comprendre. 03 et 28 sont séparés pour

une bonne raison en fait. Les deux premiers octets correspondent au rang du skill, c'est à dire son grade. Il y a 4 possibilités:

 

  • 00 = Niveau 1 à 19
  • 01 = M1 à M10
  • 02 = G1 à G10
  • 03 = P

 

"Ah ouais malynx le lynx ! C'est pour ça que tous tes sorts P possèdent 03 en premier !", me direz-vous. Eh bien oui, c'est tout con.

 

Pour ce qui est du deuxième octet, ça correspond en fait au niveau réel du skill. Le niveau qu'on a quand on tape la

fameuse commande /setsk 1 40 pour avoir Triple Lacération en P. Bah en fait, si vous regardez bien, convertissez 40 en

Hexadécimal et on obtient... 28 ! D'où le 28, et pas niveau 28 ! Car si je le veux en M8, je convertis 27 en Hexadécimal... 1D !

 

/!\ ATTENTION ENCORE ! Si vous mettez 03 pour P et niveau 27 (1D en Hexa), le serveur ne comprendra pas les données que

vous avez, et vous répondra que vous n'avez pas appris le skill /!\

 

Du coup, si je veux un skill en M8, je vais devoir faire 01 pour rang M, et 1D pour le niveau 27 (M8). On n'aura donc pas 03 28

Mais 01 1D à la place :).

 

É-NO-RME ! Attends attends... Et pour les autres skills ? Commandement, Combo, etc... ??

 

Je savais que vous alliez poser la question (évidemment c'est moi qui les écris) ! Eh bien en fait ils se situent tout en bas !

Comme dit plus haut, on a Shaman Soin en dernier. On ajoute notre séparateur de 58 octets et on a notre premier skill à 0x2D7:

Le commandement ! Pourquoi commandement ? Parce que c'est le prochain skill après le dernier skill du Shaman Soin !

111	SHAMAN	Attaque renforcée
121	SUPPORT	Commandement

Faites attention par contre, certains skills comme la pêche ne possèdent pas de niveau, de ce fait il y aura des zéro à la place !

121	SUPPORT	Commandement			Aptitude à mener vos partenaires.
122	SUPPORT	Combo			Augmenter une attaque combo.
123	SUPPORT	Pêche			Capacité à pêcher du poisson.
124	SUPPORT	Extraction			Capacité à extraire du minerai.
125	SUPPORT	Création d objet			Créer un objet.
126	SUPPORT	Langue Shinsoo			Vous comprenez le Shinsoo.
127	SUPPORT	Langue Chunjo			Vous comprenez le Chunjo.
128	SUPPORT	Langue Jinno			Vous comprenez le Jinno.

Les skills comme la Pêche ne peuvent pas avoir de niveau. Si on a tout en P, on aura donc:

image.png.337f82559b6e81a453f8659c6719e4df.png

 

  1. Commandement
  2. Combo (ici en P, même si c'est inutile d'avoir plus de 2)
  3. (Pêche, pas utilisable donc 0)
  4. Extraction
  5. Création d'Objet
  6. Langue Shinsoo
  7. Langue Chunjo
  8. Langue Jinno
  9. Polymorphie
  10. Équitation
  11. Appel Cheval
  12. (spacer)
  13. (spacer)
  14. (spacer)
  15. (spacer)
  16. (spacer)
  17. Combat Équestre
  18. Charge à Cheval
  19. Vague de Pouvoir
  20. Grêle de Flèches

 

Et là vous avez tout... Ou presque ! On en fait quoi des skills 7 et 8 ? Eh bien je vais vous laisser mettre ça en pratique,

qu'est-ce que vous en dites ? Comme ça si vous avez pigé le tutoriel, vous pouvez modifier vos skills depuis la BDD.

Ça peut servir selon certains cas, tout comme ça peut ne pas servir. Mais au moins, vous savez comment ça fonctionne

et surtout à quoi ça correspond !

 

Si vous avez tenu jusqu'ici, c'est déjà un bel effort (je vous en parle pas à quel point c'était long d'écrire tout ça),

alors ne gâchez pas cet élan et profitez-en pour commencer le "mini TP".

 

Pour la petite partie TP, je vais juste vous donner l'adresse de départ des skills 7 et 8, et à vous d'essayer !

Les premiers skills 7 et 8 se trouvent à l'offset 0x52F et se terminent à l'offset 0x5B9. Trouvez les skills correspondants

et rajoutez vos propres skills 7 et 8 !

 

Voilà, c'est la fin de ce (très) long tutoriel, j'espère que vous aurez compris tout ça, parce que ça fait beaucoup à avaler,

comme dans un Bukkake. Mais l'important, c'est de piger des trucs que les gens ne comprennent pas ! Sur ce...

À vous de jouer !

 

Cordialement, Kameyu

Modifié par Kameyu
  • Love 5
Lien vers le commentaire
Partager sur d’autres sites

  • Robot

Je n'ai qu'un mot : Félicitation. Je n'ai pas grand chose de plus à dire que Gurgarath, le tutoriel est fluide, comme tous les tutoriels que j'ai lu de toi pour le moment. Merci !

 

Je me pose une autre question : Pourquoi ils ont choisis ce moyen ? Ce n'aurait pas été plus efficace d'utiliser par exemple une cellule normal et séparer les valeurs par un point virgule ? Par exemple :

14:15:54

(les nombres sont au hasard total !)

Modifié par FBot

french_banner.gif

Lien vers le commentaire
Partager sur d’autres sites

  • Funkiest
il y a 19 minutes, Rory a dit :

Je n'ai qu'un mot : Félicitation. Je n'ai pas grand chose de plus à dire que Gurgarath, le tutoriel est fluide, comme tous les tutoriels que j'ai lu de toi pour le moment. Merci !

 

Je me pose une autre question : Pourquoi ils ont choisis ce moyen ? Ce n'aurait pas été plus efficace d'utiliser par exemple une cellule normal et séparer les valeurs par un point virgule ? Par exemple :

14:15:54

(les nombres sont au hasard total !)

 

Le stockage de données "brutes" est toujours plus simple en hexa, puisque c'est toujours plus facile de lire des valeurs pour un programme que de lire des chiffres et des caractères spéciaux.

 

 

Merci pour ce tuto ! :P

Lien vers le commentaire
Partager sur d’autres sites

  • Développeur

C'est aussi question d'adressage mémoire. Si je ne dis pas de bêtises, la taille de la séparation correspond sûrement

à la taille max d'une valeur stockant les skills dans la BDD, et les zéros qui suivent doivent être remplis par un memset().

 

Enfin, ce serait la réponse la plus logique en tout cas.

  • Love 1
Lien vers le commentaire
Partager sur d’autres sites



  • brilliantdiscord_widget
  • Flux d'Activité

    1. 37
    2. 21

      Metin2 en 2020 peut-on en parler?

    3. 0

      METIN2Project

    4. 3

      Ressources - UnPack - Metin2 Client - Officiel

    5. 0

      Barre des tâches d'argent étendue

    6. 16

      Redémarrage automatique des channels

    7. 16

      Multi Logo GM / SGM / GA

  • En ligne récemment

    • Aucun utilisateur enregistré regarde cette page.

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.