Emudofus / BehaviorIsManaged

Program simulating behaviors
GNU General Public License v3.0
31 stars 31 forks source link

ID to Name converter #48

Open Jean22 opened 11 years ago

Jean22 commented 11 years ago

Bonsoir,

Tout d'abord je souhaite commencer par remercier les devs (particulièrement Timorem pour son immense travail) du projet. J'apprécie la qualité du travail accompli. J'ai passé les derniers jours à étudier le code avec l'aide de Shravan1804 (mon cousin) et j'ai maintenant une petite question. Je cherche à convertir certains ID d'objets en leurs équivalent String de sorte à ce que ça soit plus lisible lorsque je les manipule. J'ai vu qu'il existait des classes pour lire les archive D. mais je n'ai pas trouvé la classe (si elle existe) qui permettait une fois les données chargés en mémoire au lancement de BiM de faire cette conversion ID-String. D'où ma question: Cette conversion est elle déjà implémentée? Si ce n'est pas le cas, pouvez vous me donner une direction dans laquelle je dois chercher pour l' implémenter moi même?

Merci d'avance,

Jean22

Timorem commented 11 years ago

Je suppose que tu parles du nom ^^ Des fois tu peux voir un champ Name simplement, c'est le cas pour les Items, la classe ItemBase inclut une propriété Name, idem pour les Spells. De manière général il existe dans les objets d2o (les objets client) un champ nameId, il faut alors utiliser I18NDataManager.Instance.ReadText pour obtenir la chaîne correspondante à l'id.

Jean22 commented 11 years ago

Merci pour ta réponse :) Je parle en effet du nom. Dans les messages il arrive souvent que je reçoive l'id de certains items par exemple dans un hdv. Si je comprend bien le code, en fait il suffit que j'instancie un ItemBase avec l'id reçu et que j'utilise ensuite sa propriété Name pour récupérer le nom n'est ce pas?

Edit: Une autre question: Dans le cas de figure où j'ai une liste de messages à envoyer au server. Est ce que je dois rajouter manuellement un certain temps d'attente entre l'envoi de chaque message (via un sleep) ou c'est géré par BiM directement lors de l'envoi de message depuis le bot au server?

Timorem commented 11 years ago

Tu ne peux pas instancier un objet ItemBase car c'est une classe abstraite. Tu dois encapsuler les données reçu, càd si tu recois un objet d'inventaire (de ton inventaire) alors c'est géré automatiquement et tu auras des objet Item. Si par exemple tu reçois un item de l'dv alors il faut le gérer correctement, tu va créer une classe comme Item qui hérite ItemBase et qui prend en constructeur l'objet associé venant du message en question (pour l'inventaire c'est ObjectItem). Malheureusement les HdV ne sont pas encore géré mais il faudrait un objet de type AuctionHouse qui donnerait une liste d'objet par exemple AHItem qui hérite ItemBase. Je sais pas si je suis très clair mais l'idée c'est que tout est encapsuler avant d'être manipulé.

Après comme les AH ne sont pas implant. tu peux juste récupérer l'id du template de l'item, récupérer le template en appelant ObjectDataManager.Instance.Get(templateId); puis en récupérant le text à partir du champ nameId.

Comme le bot est toujours en développement tout n'est pas encore géré comme il le faudrait

Pour les send et même en général JAMAIS de Sleep. C'est à bannir absolument. Si tu veux une sorte de Sleep il faut passer par un timer de BiM en appelant par exemple Bot.CallDelayed. Il faut savoir qu'il y a un seul thread par bot, si tu met un sleep c'est tout le bot qui se bloque. Et sinon quand tu appelle Send ça envoie le message directement, tu peux aussi l'ajouter au dispatcher dans ce cas il sera Send quand tous les messages dans le dispatcher seront déjà proccessed.

Jean22 commented 11 years ago

Merci pour ta réponse détaillée. J'avais en effet lu un peu trop rapidement la classe ItemBase.. Merci aussi pour la fonction Bot.CallDelayed, je ne l'avais pas remarqué! Je pense que je devrai pouvoir me débrouiller avec les pistes que tu m'as donné :)

Bonne soirée,

Jean 22

Jean22 commented 11 years ago

Bonjour,

J'ai un peu de mal avec la traduction ItemID - ItemName. En fait j'ai l'impression de ne pas avoir à partir des messages que je reçoit les informations nécessaires qui me permettrait de résoudre le problème. J'ai voulu commencé par la version moins générale (donc plus simple) de ce que tu as proposé de faire :

...tu peux juste récupérer l'id du template de l'item, récupérer le template en appelant ObjectDataManager.Instance.Get(templateId); puis en récupérant le text à partir du champ nameId....

(je numérote les questions de sortes à ce qu'on ne s'embrouille pas) 1) Je voudrai juste vérifier si je comprend bien ce que sont les template déjà. L'exemple suivant illustre t'il les templates dans le cas présent? template1{id 1500 correspond à "Bonjour"} template2{id 1500 correspond à "Dormir est bon pour la santé."}

Voici une liste rapide des messages échangés: NpcGenericActionRequestMessage (5898) - Client //Demande l'ouverture de l'hdv ExchangeStartedBidBuyerMessage (5904) - Server //Contient les types d'objets présent dans l'hdv (pex 63, 69, 64 équivalent à viande, viande comestible, viande conservée)

2) Je bloque déjà ici. Je n'ai que des des nombres représentant des types d'objets. Comment est ce que je peux récuperer le template ici vu qu'il n'est pas envoyé dans le message et n'apparaît pas dans la classe c# comme attribut (sauf erreur de ma part).

ExchangeBidHouseTypeMessage (5803) - Client //Choix d'un des types (catégories) d'objets ExchangeTypesExchangerDescriptionForUserMessage (5765) - Server //Contient l'ensemble des id des objets en vente dans la catégorie choisie.

3) De nouveau je récupère des id mais pas de template ID.. Le objectUID n'est reçu que plus tard lorsque le server envoi le prix d'un objet selon la séquence suivante:

ExchangeBidHouseListMessage (5807) - Client //demande du prix d'un objet ExchangeTypesItemsExchangerDescriptionForUserMessage (5752) - Server //réponse du server contenant notamment le UID

4) En cherchant sur internet, j'ai compris que UID (unique identifier) était en fait un unique identifier pour chaque item mais par contre je ne vois pas ce que GID (group identifier) représente.

Merci d'avance,

Bonne journée,

Jean22

Timorem commented 11 years ago

1) Le template récupère l'objet Data.Item du fichiers d2o Items.d2o, il contient des tas d'informations sur un item (poids, effets, prix de vente ...) dont le nameId. A partir du nameid tu récupère le text avec I18NDataManager.Instance.ReadText

2) Je ne me suis pas encore intéressé aux AH, mais de toute évidence le GID n'est pas envoyé ici. Le GID correspond au templateId en fait alors que l'UID est bien le GUID, l'unique identifier.

Donc il faut trouver le GID

Jean22 commented 11 years ago

Ok je vais chercher ça. Merci pour ta réponse.