Aller au contenu

merchant — Boutiques PNJ et marchands joueurs

API boutiques MoonBot Lua : acheter/vendre à un PNJ vendeur (openNpcShop), acheter à un joueur en mode marchand (openShop), gérer sa propre boutique.

16 fonctions dans ce namespace.

Index


Référence

Quelle boutique ? PNJ vendeur, marchand joueur ou la sienne

merchant.openNpcShop(npcId) / merchant.openShop(actorId, cellId) / merchant.openMyShop()

Trois boutiques distinctes, chacune avec ses fonctions et sa liste d'objets. 1) PNJ vendeur (tavernier, marchand d'outils, de parchemins… : « Acheter/Vendre ») : openNpcShop, npcShopItems/npcShopFindItem, buyItem, sellItem. 2) Personnage JOUEUR en mode marchand posé sur la carte : openShop, shopItems/shopFindItem, shopBuyItem. 3) Son propre personnage à passer en mode marchand : openMyShop, addToMyShop, enterMerchantMode. merchant.open n'ouvre aucune de ces boutiques : il lance le dialogue « Parler ».


merchant.openNpcShop

merchant.openNpcShop(npcId: number)

blocking · returns boolean

Ouvre la boutique d'un PNJ vendeur, comme « Acheter/Vendre » en jeu (paquet ER0). npcId = id acteur négatif de map.npcs(), pas le templateId. Attend l'ouverture puis la liste des objets ; erreur si rien en 5 s (appeler avec pcall).


merchant.open

merchant.open(npcId: number)

blocking · returns boolean

N'ouvre PAS la boutique (dialogue « Parler », paquet DC) : pour acheter/vendre, merchant.openNpcShop. Renvoie true dès que le dialogue s'affiche, npcShopItems() reste vide ; le fermer avec npc.leaveDialog().


merchant.npcShopItems / npcShopFindItem / npcShopItemCount

merchant.npcShopItems() / merchant.npcShopFindItem(templateId) / merchant.npcShopItemCount()

returns table of {template_id, name, effects, price} / table | nil / number

Contenu de la boutique PNJ ouverte. Le PNJ vend-il l'objet ? merchant.npcShopFindItem(templateId) ~= nil. price = prix affiché par la boutique, sinon prix de base de l'objet. Liste vide hors boutique PNJ (vidée à la fermeture).


merchant.buyItem / npcShopBuy

merchant.buyItem(templateId, qty) / merchant.npcShopBuy(templateId, qty)

returns boolean

Achète qty exemplaires au PNJ par template ID (paquet EB) ; les deux noms font la même chose. true = demande envoyée, pas achat confirmé : comparer inventory.countItem(templateId) avant/après (kamas ou pods insuffisants = rien).


merchant.sellItem / npcShopSell

merchant.sellItem(uid, qty) / merchant.npcShopSell(uid, qty)

returns boolean

Vend au PNJ par UID d'inventaire (inventory.findByTemplate(templateId).uid), pas par template ID (paquet ES) ; les deux noms font la même chose. true = demande envoyée : vérifier avec inventory.countItem.


merchant.leave / npcShopClose

merchant.leave() / merchant.npcShopClose()

returns boolean

Ferme la boutique ou l'échange ouvert (paquet EV), PNJ comme joueur. Ne ferme pas un dialogue PNJ : npc.leaveDialog().


merchant.openShop

merchant.openShop(actorId: number, cellId: number)

blocking · returns boolean

Ouvre la boutique d'un personnage JOUEUR en mode marchand sur la carte (paquet ER4), pas d'un PNJ. actorId et cellId : champs id et cellId d'un acteur de map.getActors() avec type == 'merchant'. Attend la fenetre ET sa liste d'objets : merchant.shopItems() est alors complete. false si la boutique ne s'ouvre pas en 5 s.


merchant.shopItems / shopFindItem / shopItemPrice / shopItemCount

merchant.shopItems() / merchant.shopFindItem(templateId) / merchant.shopItemPrice(uid) / merchant.shopItemCount()

returns table of {uid, template_id, templateId, quantity, price, name, effects, jets, ...} / table | nil / number / number

Contenu de la boutique ouverte, d'un autre joueur (openShop) ou la sienne (openMyShop) ; distinct de npcShopItems. uid = id de la ligne dans CETTE boutique, à passer à shopBuyItem ; quantity = stock du vendeur ; price = prix fixé par le joueur (par unité). JETS : effects = chaîne brute du jeu, jets = {{id, value, max, text}, ...} au même format que inventory.list() et hdv.offers() (id décimal : 125 vitalité, 111 PA…). Pierre d'âme pleine : soulStone = true, total, monsters = {{id, name, count}}. Certificat de dragodinde : mountCertificate (voir hdv.offers) et fiche complète avec merchant.inspectMount(uid). La liste suit la boutique : un achat (le vôtre ou celui d'un autre joueur) la met à jour.


merchant.inspectMount

merchant.inspectMount(uid: number, timeoutMs?: number)

blocking · returns table | nil

Fiche complète de la dragodinde d'un certificat en vente dans la boutique ouverte (paquet Rd, comme dans le client officiel), au format de mount.getMountData. nil si la boutique est fermée, si la ligne n'est pas un certificat ou sans réponse en timeoutMs (5000 par défaut).


Exemple — jets des objets d'un marchand

for _, a in ipairs(map.getActors()) do
  if a.type == "merchant" and merchant.openShop(a.id, a.cellId) then
    for _, o in ipairs(merchant.shopItems()) do
      local lignes = {}
      for _, jet in ipairs(o.jets) do table.insert(lignes, jet.text) end
      print(o.name .. " x" .. o.quantity .. " : " .. o.price .. " k | " .. table.concat(lignes, ", "))
    end
    merchant.closeShop()
    global.delay(global.random(1500, 3000))
  end
end

Ouvre chaque marchand de la carte et affiche ses objets avec leurs jets. Pour acheter un jet précis : tester jet.id / jet.value puis merchant.shopBuyItem(o.uid, o.quantity) avant closeShop(). Dans le MapViewer : clic droit sur un marchand → Acheter, puis un clic sur une ligne affiche ses jets.


merchant.shopBuyItem

merchant.shopBuyItem(uid, qty)

returns boolean

Achète au marchand joueur par uid de ligne (merchant.shopFindItem(templateId).uid), pas par template ID (paquet EB). true = demande envoyée : vérifier avec inventory.countItem.


merchant.closeShop

merchant.closeShop()

returns boolean

Ferme la boutique du joueur (paquet EV, comme merchant.leave).


merchant.openMyShop / addToMyShop / removeFromMyShop / closeMyShop

merchant.openMyShop() / merchant.addToMyShop(uid, qty, price) / merchant.removeFromMyShop(uid, qty) / merchant.closeMyShop()

returns boolean

Prépare sa propre boutique avant de passer en mode marchand (paquets ER6 et EMO) : uid = objet de son inventaire, price = prix de vente. openMyShop attend la fenêtre et sa liste (false si rien en 5 s) ; merchant.shopItems() liste alors sa boutique avec les jets de chaque objet et suit les ajouts et retraits. addToMyShop/removeFromMyShop renvoient true à l'envoi, sans confirmation du serveur.


merchant.requestMerchantMode / confirmMerchantMode / enterMerchantMode

merchant.requestMerchantMode() / merchant.confirmMerchantMode() / merchant.enterMerchantMode()

Passe son propre personnage en mode marchand sur la carte : requestMerchantMode (Eq, affiche la taxe) puis confirmMerchantMode (EQ) ; enterMerchantMode enchaîne les deux. Attention : déconnecte le personnage !


merchant.existItem / quantityItem / priceItem / sellPrice

merchant.existItem(templateId) / merchant.quantityItem(templateId) / merchant.priceItem(templateId) / merchant.sellPrice(templateId)

returns boolean / number / number / number

Ne lisent PAS la boutique : banque/coffre ouvert. Chez un PNJ : npcShopFindItem ; chez un joueur : shopFindItem. existItem/quantityItem = présence/quantité dans la banque ou le coffre ouvert. priceItem = prix de base de l'objet (données du jeu) ; sellPrice = rachat PNJ estimé (prix de base ÷ 10).