1.29 [FM] Le paquet EMKO ??

Inscrit
20 Octobre 2021
Messages
50
Reactions
42
#1
Salut à tous j'essaye d'analyser le FM sur Rétro, je vois un paquet qui m'intrigue beaucoup le paquet EMKO,
Je vois le paquet EMKO qui est étrange ... Au début j'ai des valeurs quand je calcul le poids des runes + le résultat j'obtiens 140.

Après pas mal de FM et de test ... J'obtiens par exemple 70 avec 1 sagesse 3 force 9vita (3 + 3 + 9 = 15 = 70 + 15 = 85).
Il y à même 2 paquets EMKO.

J'ai l'impression qu'un désigne le puit disponible et qu'un désigne le puit sur l'objet.
On peut savoir lequel correspond à lequel car il y à un paquet OQ qui désignerait si j'ai bon le poids disponible.

Exemple de ce que j'ai pu avoir:

Code:
OQXXXXXXXXX|134
EMKO+XXXXXXXXX|134
EMKO+YYYYYYYYY|1
Vous avez une idée ? Je ne trouves pas de sujet sur ça ...

Est-ce un % de chance que ça passe ?
Un "niveau" de difficulté ? Je n'ai pas encore tester sur les autres items ...
 
Inscrit
25 Septembre 2019
Messages
7
Reactions
5
#2
Hello,

Si je ne dis pas de bêtise le paquet EMKO signifie juste que tu ajoutes/retires un objet dans l'interface de forgemagie, il se décompose de cette manière :

EMKO[+ ou -]ID|QUANTITE
+ : tu ajoutes l'objet
- : tu retires l'objet
ID : l'ID de l'objet dans ton inventaire
QUANTITE : quantité de l'objet

Et si je me souviens bien, lorsque tu fusionnes une rune le serveur envoie les infos suivantes :
- Suppression dans l'inventaire de l'item qui se trouve dans l'interface de FM (donc celui qui a l'ID en question)
- Création d'un nouvel item dans l'inventaire (avec un nouvel ID) qui correspond à l'item avec le nouveau jet
- Suppression dans l'inventaire de la rune qui se trouve dans l'interface de FM (si la quantité = 0) sinon décrément de la quantité

Le OQ je crois que c'est justement le paquet qui permet à ton inventaire de s'actualiser avec la nouvelle quantité de runes après fusion.

Toujours d'après mes souvenirs : le serveur n'envoie pas d'infos concernant le % de réussite au client. De toute façon ça serait inutile pour le client d'avoir cette infos puisque "le dé est jeté par le serveur", il ne fait que renvoyer au client le résultat du "lancé".

Si quelqu'un qui a mis le nez plus récemment que moi dans la FM rétro passe par là il pourra peut-être te confirmer tout ça (ou pas) !

Bon courage avec tes devs !
 
Inscrit
20 Octobre 2021
Messages
50
Reactions
42
#3
Hello,

Si je ne dis pas de bêtise le paquet EMKO signifie juste que tu ajoutes/retires un objet dans l'interface de forgemagie, il se décompose de cette manière :

EMKO[+ ou -]ID|QUANTITE
+ : tu ajoutes l'objet
- : tu retires l'objet
ID : l'ID de l'objet dans ton inventaire
QUANTITE : quantité de l'objet

Et si je me souviens bien, lorsque tu fusionnes une rune le serveur envoie les infos suivantes :
- Suppression dans l'inventaire de l'item qui se trouve dans l'interface de FM (donc celui qui a l'ID en question)
- Création d'un nouvel item dans l'inventaire (avec un nouvel ID) qui correspond à l'item avec le nouveau jet
- Suppression dans l'inventaire de la rune qui se trouve dans l'interface de FM (si la quantité = 0) sinon décrément de la quantité

Le OQ je crois que c'est justement le paquet qui permet à ton inventaire de s'actualiser avec la nouvelle quantité de runes après fusion.

Toujours d'après mes souvenirs : le serveur n'envoie pas d'infos concernant le % de réussite au client. De toute façon ça serait inutile pour le client d'avoir cette infos puisque "le dé est jeté par le serveur", il ne fait que renvoyer au client le résultat du "lancé".

Si quelqu'un qui a mis le nez plus récemment que moi dans la FM rétro passe par là il pourra peut-être te confirmer tout ça (ou pas) !

Bon courage avec tes devs !

Salut ! Merci pour la réponse en effet je me suis enflammé un peu vite ...

EMKO+UID|QTY

En effet ... L'ID Item non pas celui de l'ID en lui même mais l'ID unique.
Ensuite il y à bien OQ qui actualise sur l'ID en question


EMKO-UID = Retire l'objet
EMKO+UID|QTY = Ajoute l'objet en X quantité
(Ajouter par exemple 51 items ça fait EMKO-UID|51 et si on en retire 1 ça fait EMKO-UID|50 là où tout retirer n'envoie pas de quantité).
Il y à un deuxième paquet EmKO qui actualise lui je penses l'affichage de l'item:
EmKO+UID|QTY|IDI|JET

Il resterait:
OAKOUID~IDHEX~QTY~JET

OwNBR|ID qui augmente +1 à chaque fm peut être ?

IO???|+ID = réussite
IO???|-ID = échec (critique ou non)

J'ai aussi un EcK;ID en cas de réussite et EcEF qui le remplace en cas d'échec (critique ou non)

Je vais aller essayer d'étudier le code source pour comprendre comment il gère le FM, ce qu'il lis et ce qu'il fait ...

Et le % de réussite aurait été intéressant via un bot, car il y à différentes difficultés qui évolue selon les jets de l'item, selon le niveau de l'équipement à FM et selon le poids de la rune ça aurait était cheat de l'avoir ^^

Je vais aller lire les sources je ferais un sujet peut être dessus pour D1 encore merci !
 
Inscrit
25 Septembre 2019
Messages
7
Reactions
5
#4
Hello,

Si ça peut compléter tes recherches :

http://files.naio.fr/archive/src/easyfm_src_1.4.5.8.zip

C'est un très vieux tool en AutoIt qui permet d'avoir une estimation du % de chance qu'une rune a de passer sur un item
La formule exacte de calcul du % n'étant pas connue c'est une "approximation" de la réalité, mais il me semble qu'il s'appuie sur les critères dont on sait qu'ils ont une influence en FM (niveau de l'objet, jet d'une caractéristique par rapport à son max, poids de la rune, puit, etc)

J'ai jamais mis le nez dans les sources du client pour la partie FM, mais il y a peut-être des infos intéressantes à ce niveau là aussi.

Bonne chance !
 
Inscrit
20 Octobre 2021
Messages
50
Reactions
42
#5
Hello,

Si ça peut compléter tes recherches :

http://files.naio.fr/archive/src/easyfm_src_1.4.5.8.zip

C'est un très vieux tool en AutoIt qui permet d'avoir une estimation du % de chance qu'une rune a de passer sur un item
La formule exacte de calcul du % n'étant pas connue c'est une "approximation" de la réalité, mais il me semble qu'il s'appuie sur les critères dont on sait qu'ils ont une influence en FM (niveau de l'objet, jet d'une caractéristique par rapport à son max, poids de la rune, puit, etc)

J'ai jamais mis le nez dans les sources du client pour la partie FM, mais il y a peut-être des infos intéressantes à ce niveau là aussi.

Bonne chance !
L'idée est de faire un tool complet d'aide au FM à ajouter à mon logiciel que j'ai déjà fais.
Je travail actuellement sur la décompilation de rétro, la nouvelle compilation est bien protéger mais il y à un truc qui cloche je vais faire quelques essais ...

Merci pour les sources j'irais jeter un oeil au script ! :)

Edit: L'outil est vraiment pas exceptionnel, j'ai testé avec les caracs d'une amu piou ça me dit "0%" en tous, j'ai testé des runes fifou monté à 16% de dom ... Bref, je ne vais pas me baser dessus ...

Pour le "Ow" par exemple je penses avoir trouvé mais le "w" aucune trace ...

Code:
function onStorageMovement(bSuccess, sExtraData)
   {
      var _loc4_ = sExtraData.charAt(0);
      var _loc5_ = this.api.datacenter.Temporary.Storage;
      switch(_loc4_)
      {
         case "O":
            var _loc6_ = sExtraData.charAt(1) == "+";
            var _loc7_ = sExtraData.substr(2).split("|");
            var _loc8_ = Number(_loc7_[0]);
            var _loc9_ = Number(_loc7_[1]);
            var _loc10_ = Number(_loc7_[2]);
            var _loc11_ = _loc7_[3];
            var _loc12_ = _loc5_.inventory.findFirstItem("ID",_loc8_);
            if(_loc6_)
            {
               var _loc13_ = new dofus.datacenter.Item(_loc8_,_loc10_,_loc9_,-1,_loc11_);
               if(_loc12_.index != -1)
               {
                  _loc5_.inventory.updateItem(_loc12_.index,_loc13_);
               }
               else
               {
                  _loc5_.inventory.push(_loc13_);
               }
               break;
            }
            if(_loc12_.index != -1)
            {
               _loc5_.inventory.removeItems(_loc12_.index,1);
            }
            else
            {
               ank.utils.Logger.err("[onStorageMovement] cet objet n\'existe pas id=" + _loc8_);
            }
            break;
         case "G":
            var _loc14_ = Number(sExtraData.substr(1));
            _loc5_.Kama = _loc14_;
      }
   }
Pour la partie EcK / EcEF : (il faut considéré que le packet commence après EcK ou après EcE donc soit à partir des datas soit à partir de F).

Code:
function onCraft(bSuccess, sExtraData)
   {
      if(this.api.datacenter.Basics.aks_exchange_isForgemagus || !this.api.datacenter.Basics.isCraftLooping)
      {
         this.api.datacenter.Exchange.clearLocalGarbage();
      }
      var _loc4_ = this.api.datacenter.Basics.aks_exchange_echangeType;
      if(_loc4_ == 12 || _loc4_ == 13)
      {
         var _loc5_ = this.api.datacenter.Exchange;
         _loc5_.clearDistantGarbage();
         _loc5_.clearPayGarbage();
         _loc5_.clearPayIfSuccessGarbage();
         _loc5_.payKama = 0;
         _loc5_.payIfSuccessKama = 0;
         this.api.ui.getUIComponent("SecureCraft").updateInventory();
      }
      var _loc6_ = !this.api.datacenter.Basics.aks_exchange_isForgemagus;
      switch(sExtraData.substr(0,1))
      {
         case "I":
            if(!bSuccess)
            {
               this.api.kernel.showMessage(this.api.lang.getText("CRAFT"),this.api.lang.getText("NO_CRAFT_RESULT"),"ERROR_BOX",{name:"Impossible"});
            }
            break;
         case "F":
            if(!bSuccess && _loc6_)
            {
               this.api.kernel.showMessage(this.api.lang.getText("CRAFT"),this.api.lang.getText("CRAFT_FAILED"),"ERROR_BOX",{name:"CraftFailed"});
            }
            this.api.kernel.SpeakingItemsManager.triggerEvent(dofus.managers.SpeakingItemsManager.SPEAK_TRIGGER_CRAFT_KO);
            break;
         case ";":
            if(bSuccess)
            {
               var _loc7_ = sExtraData.substr(1).split(";");
               if(_loc7_.length == 1)
               {
                  var _loc8_ = new dofus.datacenter.Item(0,Number(_loc7_[0]),undefined,undefined,undefined);
                  this.api.kernel.showMessage(undefined,this.api.lang.getText("CRAFT_SUCCESS_SELF",[_loc8_.name]),"INFO_CHAT");
                  this.api.kernel.SpeakingItemsManager.triggerEvent(dofus.managers.SpeakingItemsManager.SPEAK_TRIGGER_CRAFT_KO);
                  break;
               }
               var _loc9_ = _loc7_[1].substr(0,1);
               var _loc10_ = _loc7_[1].substr(1);
               var _loc11_ = Number(_loc7_[0]);
               var _loc12_ = _loc7_[2];
               var _loc13_ = new Array();
               _loc13_.push(_loc11_);
               _loc13_.push(_loc12_);
               switch(_loc9_)
               {
                  case "T":
                     this.api.kernel.showMessage(undefined,this.api.kernel.ChatManager.parseInlineItems(this.api.lang.getText("CRAFT_SUCCESS_TARGET",[_loc10_]),_loc13_),"INFO_CHAT");
                     break;
                  case "B":
                     this.api.kernel.showMessage(undefined,this.api.kernel.ChatManager.parseInlineItems(this.api.lang.getText("CRAFT_SUCCESS_OTHER",[_loc10_]),_loc13_),"INFO_CHAT");
               }
               break;
            }
      }
      if(!bSuccess)
      {
         this.api.datacenter.Exchange.clearCoopGarbage();
      }
   }
Cela définie donc EcXF ou EcX; (X = K ou E qui à priori n'est pas utilisé ...) comme une réussite ou un échec de craft.
Qu'il soit critique ou non ... Je vais chercher car si on à la phrase côté client c'est qu'on doit avoir le code pour savoir ..

Edit fin: Bon j'ai trouvé ce que je chercher à la base ...

Savoir si c'est réussi, échec ou échec critique.

Réussite = pas de message d'où le faite que je trouves pas de comparaison, la réussite est un "craft réussi" donc pas plus.

Les 2 autres donnent droit à un message envoyé par le packet "Im" bypassant le message d'origine de succès.

Code:
case "I":
            switch(sAction)
            {
               case "M":
                  this.aks.Infos.onInfoMaps(sData.substr(2));
                  break;
               case "C":
                  this.aks.Infos.onInfoCompass(sData.substr(2));
                  break;
               case "H":
                  this.aks.Infos.onInfoCoordinatespHighlight(sData.substr(2));
                  break;
               case "m":
                  this.aks.Infos.onMessage(sData.substr(2));
Appel de onMessage dont il me manque une partie je penses j'ai rien compris car ça rentre pas dans la boucle une variable est vide ...
Bref dans tous les cas

Réussite = pas de message (on le voit au paquet EcK qu'il est réussi)
"Malgré vos talents, la magie n'opère pas et vous sentez l'échec de la transformation, ainsi que la diminution de la puissance de l'objet." = Im0117 (paquet qui affichera le message dans le tchat, comme l'item est réactualisé le serveur à pas vraiment besoin de dire plus).

"La magie n'a pas parfaitement fonctionné, une des caractéristiques de l'objet a baissé en puissance." = Im0183


C'est tout ce que j'avais besoin merci quand même je vais continuer à travailler sur l'option FM dans le week end :)
 
Dernière édition:
Haut Bas