Aller au contenu

Écrire un script Lua

Un trajet est un fichier .lua. Voici un exemple complet : il combat des groupes de trois monstres maximum sur deux cartes, puis s'arrête sur la troisième. Adapte les numéros de carte et les sorties à ton parcours, et prépare les sorts du personnage dans le panel.

route = {
    followLeader = true,
    lostMember = "wait",
}

function shouldEngage(monstres)
    return monstres:size() <= 3
end

function move()
    if map:currentMapId() == "6733" then
        return "done"
    end
    return {
        { map = "4604", fight = true, changeMap = "top" },
        { map = "4605", fight = true, changeMap = "right" },
    }
end
  • route règle le groupe : les mules suivent le meneur et le groupe attend un membre perdu.
  • shouldEngage(monstres) choisit les groupes de monstres à attaquer.
  • move() indique quoi faire sur la carte actuelle ; "done" termine le trajet.

Pour jouer seul, tu peux garder ces réglages. Pour que plusieurs personnages jouent chacun leur trajet, utilise followLeader = false.

Définir les étapes

Champ Effet Exemple
map Numéro de la carte map = "4604"
fight Attaquer les groupes autorisés fight = true
changeMap Prendre une direction ou une case de sortie "top", "bottom", "left", "right" ou "363"
custom Appeler une fonction du fichier custom = parlerAuGardien

Le bot choisit la ligne de sa carte actuelle, pas la ligne suivante de la liste. Garde une seule étape par carte.

Il joue la fonction custom, les combats autorisés, puis la sortie. Sans groupe autorisé, il part directement. Sans sortie, il reste sur place : utile dans une salle de donjon qui change de carte après le combat.

Écris custom = parlerAuGardien, sans guillemets ni parenthèses. Tu trouveras le numéro de carte dans Live, ou avec Map au survol dans l'éditeur.

Les options du trajet

followLeader est obligatoire ; les autres réglages sont facultatifs.

Option Utilisation
followLeader = true Les mules suivent le meneur
lostMember = "wait" Attendre un membre perdu ; "continue" permet de repartir sans lui et s'applique si l'option est absente
dungeon = { "123", "456" } Cartes où le bot ne doit jamais partir en banque ou utiliser un rappel
lockFight = true Fermer le combat aux autres joueurs
roles = { "invocateur" } Exiger un rôle, attribué aux personnages dans le panel
exchange = { with = "Nom", fn = "donnerObjets", map = "123" } Organiser les échanges avec un autre bot ; la carte est facultative

Le seuil de pods, les soins, les sorts et l'activation de la capture se règlent dans la fiche du personnage.

Choisir les monstres

monstres désigne le groupe que le bot examine. Tu peux lui poser ces questions :

Appel Réponse
monstres:size() Nombre de monstres
monstres:maxLevel() Niveau du monstre le plus fort
monstres:mapId() Numéro de carte
monstres:has(47, 254) Présence d'au moins un des monstres indiqués
monstres:count(47, 254) Nombre de ces monstres dans le groupe
monstres:monsters() Liste des numéros, un par monstre

Les monstres se désignent par leur numéro. Utilise toujours :, comme dans monstres:size().

shouldEngage renvoie true pour attaquer, false ou rien pour ignorer. Sans cette fonction, tous les groupes sont autorisés.

shouldCapture choisit les captures : true accepte une pierre vide disponible, un numéro choisit une pierre précise, une liste donne des choix par ordre de préférence. Sans cette fonction, rien n'est capturé. Voir l'exemple de capture.

Les autres fonctions

Fonction Appelée…
bank() Pour le retour banque, à cause des pods ou d'une demande du trajet
phenix() Quand le personnage doit rejoindre un phénix
deferBank() Pour décider de reporter la banque déclenchée par les pods
onLevelUp(niveau) Au lancement et après un passage de niveau
onLost() Si la carte actuelle manque dans le trajet, hors donjon
onFightEnd(resultat) Après un combat
onBeforeFightReady(monstres) Pour préparer toi-même l'équipement avant « Prêt »

Les fonctions de choix (shouldEngage, shouldCapture, deferBank) répondent sans déplacer le personnage ni attendre. Mets les actions dans les autres fonctions, jamais directement au début du fichier.

Si tu écris onBeforeFightReady, ta fonction doit aussi préparer la pierre de capture : elle remplace sa préparation automatique. Certaines fonctions, comme character:equipWeapon, s'utilisent uniquement dans les fonctions de combat ; le catalogue Doc API Lua précise où les appeler.

Terminer une action ou la banque

Dans move(), return "done" termine le trajet ; return false l'abandonne et met le bot en pause. Sans valeur de retour, move() sera rappelée.

Une fonction custom termine seulement son action : son retour "done" ou false n'arrête pas tout le trajet. Elle peut être rejouée après une pause ou un rechargement ; vérifie si l'action est déjà faite avant de la recommencer.

Pour la banque, les retours sont différents :

Retour Dans bank() Dans son action custom
"done" Banque terminée Banque terminée
true Banque terminée Action terminée ; banque toujours en cours
false Abandon et pause Abandon et pause
Une table d'étapes Joue l'étape de la carte actuelle Ne choisit pas d'autres étapes
Rien ou "continue" Rappelle bank() Action terminée, puis sortie éventuelle

Préfère "done" pour finir la banque. Si les pods restent au-dessus du seuil, le bot se met en pause plutôt que de recommencer sans déposer.

Sans bank(), le bot utilise le fichier de banque configuré, puis la banque de Bonta. Si tu définis aussi bankStep(), elle passe avant bank().

deferBank() renvoyant true reporte seulement la banque due aux pods. global:requestBank() peut demander un passage malgré ce report ; aucun passage n'est autorisé dans les cartes de route.dungeon. En Multi, le meneur organise le retour et une mule ne part pas seule.

Charger et modifier le fichier

Dans Trajet, importe le .lua et démarre le bot. Le Journal confirme son chargement. Ouvrir le dossier te permet de retrouver le fichier.

Une modification valide est chargée hors combat. Une modification, une reprise après pause ou un redémarrage du bot remet les variables du script à zéro. Le bot repart de sa carte actuelle ; une banque déjà engagée se poursuit.

Les fonctions du trajet et celles du combat ne partagent pas les variables modifiées pendant leur exécution. Pour un réglage commun, déclare une constante au début du fichier.

Vérifie les retours des appels : par exemple, map:changeMap() renvoie une table et sa réussite se lit avec resultat.ok. if resultat then ne suffit pas. Pour un retrait bancaire, teste la quantité avec > 0 : en Lua, zéro compte comme vrai.

➡️ Exemples complets : capture, banque et donjon