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¶
Quelle boutique ? PNJ vendeur, marchand joueur ou la siennemerchant.openNpcShopmerchant.openmerchant.npcShopItems / npcShopFindItem / npcShopItemCountmerchant.buyItem / npcShopBuymerchant.sellItem / npcShopSellmerchant.leave / npcShopClosemerchant.openShopmerchant.shopItems / shopFindItem / shopItemPrice / shopItemCountmerchant.inspectMountExemple — jets des objets d'un marchandmerchant.shopBuyItemmerchant.closeShopmerchant.openMyShop / addToMyShop / removeFromMyShop / closeMyShopmerchant.requestMerchantMode / confirmMerchantMode / enterMerchantModemerchant.existItem / quantityItem / priceItem / sellPrice
Référence¶
Quelle boutique ? PNJ vendeur, marchand joueur ou la sienne¶
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¶
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¶
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¶
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¶
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¶
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¶
returns boolean
Ferme la boutique ou l'échange ouvert (paquet EV), PNJ comme joueur. Ne ferme pas un dialogue PNJ : npc.leaveDialog().
merchant.openShop¶
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¶
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¶
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¶
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¶
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).