rubiksjunior
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 ...
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).
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.
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 :)