Script Lua : Dépannage
Cette page couvre les problèmes courants que vous pouvez rencontrer lors de l'écriture ou du débogage de pouvoirs Lua, ainsi que des conseils de migration pour les auteurs venant d'EliteScript. Pour des exemples fonctionnels, consultez Exemples et modèles. Pour débuter, consultez Premiers pas.
Problèmes courants
1. Le pouvoir ne se charge pas du tout
Vérifiez la console du serveur pour les erreurs au démarrage. La cause la plus courante est une erreur de syntaxe Lua (manque de end, parenthèses non correspondantes, etc.). Vérifiez aussi que le fichier se termine par .lua et est placé dans le bon répertoire powers.
2. Le hook ne se déclenche jamais
Vérifiez que le nom du hook est écrit exactement comme dans la liste des hooks. Erreurs courantes : on_boss_hit (incorrect) vs. on_boss_damaged_by_player (correct), ou on_tick (incorrect) vs. on_game_tick (correct).
3. context.player est nil
Tous les hooks ne fournissent pas un joueur. on_spawn, on_game_tick, on_enter_combat et on_exit_combat n'ont pas de joueur. Ajoutez toujours une garde nil avant d'utiliser context.player.
4. Timeout / budget d'exécution dépassé
Si un hook ou callback prend trop de temps, le pouvoir est automatiquement désactivé. Le message console ressemble à :
[Lua] -> Your script took 73ms in 'on_tick' (limit: 50ms) — power disabled to prevent lag.
5. Le callback du planificateur utilise des données obsolètes
Vous utilisez probablement le context externe au lieu du paramètre du callback. Changez function() ... context.boss ... end en function(tick_context) ... tick_context.boss ... end.
6. La requête de zone ne retourne aucune entité
Vérifiez la définition de zone. Pour les zones natives, kind doit être en minuscules ("sphere", pas "SPHERE"). Pour les utilitaires de script, shape doit être en majuscules ("CONE", pas "cone").
7. Les particules n'apparaissent pas
Vérifiez que le nom de particule est un enum Particle Bukkit valide en UPPER_CASE. Erreur courante : "flame" (incorrect) vs. "FLAME" (correct).
8. Le cooldown ne semble pas fonctionner
Assurez-vous d'utiliser check_local(key, duration) (qui vérifie ET définit en un seul appel), pas local_ready(key) suivi d'un set_local(duration, key) séparé.
9. Le boss continue d'exécuter le pouvoir après sa mort
Ajoutez une logique de nettoyage dans on_exit_combat et/ou on_death pour annuler les tâches du planificateur.
Lecture des messages d'erreur
Quand quelque chose ne va pas dans un pouvoir Lua, la console affiche un bloc d'erreur amical préfixé par [Lua]. Ces messages vous disent exactement quel fichier, quelle ligne, quel hook et ce qui a mal tourné -- en langage clair.
[Lua] Error in 'push_zone.lua' at line 35 during 'on_boss_damaged_by_player':
[Lua] -> You tried to call a method or function that doesn't exist.
[Lua] -> Check the method name for typos, or make sure you're using ':' (colon) for method calls, not '.' (dot).
[Lua] -> Power has been disabled for this boss to prevent further errors.
| Erreur Lua brute | Ce que la console vous dit |
|---|---|
attempt to call nil | Vous avez essayé d'appeler une méthode ou fonction qui n'existe pas. |
index expected, got nil | Vous avez essayé d'accéder à un champ sur quelque chose qui est nil. |
attempt to index | Vous avez essayé d'accéder à une propriété d'une valeur nil ou invalide. |
bad argument | Affiche les détails spécifiques de l'incompatibilité d'arguments. |
| Timeout | Votre script a pris Xms dans 'hook_name' (limite : 50ms) -- pouvoir désactivé. |
Quand vous voyez une erreur [Lua] dans la console, lisez le message complet avant de plonger dans le code -- il vous indique généralement directement la solution.
N'assumez pas que des alias non documentes existent
L'API Lua expose un ensemble specifique de noms de methodes. Si vous ecrivez des pouvoirs a la main ou avec l'aide d'une IA, n'assumez pas que des raccourcis ou des noms alternatifs existent. Les noms suivants n'existent pas et causeront des erreurs :
show_temporary_boss_bar()-- utilisezplayer:show_boss_bar(title, color, style, duration).run_command_as_player()-- utilisezplayer:run_command(command).em.location(...)-- il n'y a pas de globalem. Utilisezcontext.boss:get_location(),context.player.current_location, ou les methodescontext.world.em.vector(...)-- il n'y a pas de globalem. Utilisezcontext.vectors.get_vector_between_locations(loc1, loc2)ou des tables simples{x=0, y=1, z=0}.em.zone.sphere(...)-- il n'y a pas de globalem. Utilisez une table de definition de zone comme{kind = "sphere", radius = 5, origin = location}.entity:teleport_to(...)-- utilisezentity:teleport_to_location(location).entity:set_velocity(...)-- utilisezentity:set_velocity_vector(vector).entity:set_facing(...)-- utilisezentity:face_direction_or_location(direction_or_location).
En cas de doute, consultez les pages de Reference API (Boss et entites, Monde et environnement, Zones et ciblage). Si ce n'est pas documente, ca n'existe pas.
Conseils de migration pour les auteurs EliteScript
Si vous ecrivez deja de bons EliteScripts, la facon la plus simple d'apprendre les pouvoirs Lua est :
-
Continuez a penser en termes d'evenements, cibles, zones, vecteurs relatifs et particules. Les concepts sont les memes -- seule la syntaxe change. Les evenements EliteScript deviennent des noms de hooks comme
on_spawnouon_boss_damaged_by_player. Les cibles et zones sont passees en tant que tables acontext.scripten utilisant les memes noms de champs documentes dans les pages Zones EliteScript et Cibles EliteScript. -
Deplacez votre flux de controle vers Lua. Tirages aleatoires, fonctions auxiliaires partagees, boucles, etat persistant (
context.state) et planification de taches (context.scheduler) sont les choses que Lua ajoute et qu'EliteScript pur ne peut pas faire facilement. Commencez par convertir un pouvoir conditionnel ou a embranchements en Lua tout en gardant le reste identique. -
Utilisez
context.scriptpour le ciblage et la geometrie de zone. Les utilitaires de script acceptent les memes noms de champs qu'EliteScript (targetType,shape,Target,Target2,range,offset,coverage), vous pouvez donc continuer a utiliser la documentation existante d'EliteScript comme reference pour ces specifications. Cela vous permet d'exploiter des patterns familiers tout en gagnant la flexibilite de Lua pour la couche logique.
Chemin de progression pour débutants
- Écrivez un fichier avec seulement
api_version = 1eton_spawn. - Faites envoyer un message ou jouer un son au boss.
- Ajoutez un cooldown avec
context.cooldowns. - Ajoutez un hook déclenché par le joueur comme
on_boss_damaged_by_player. - Ajoutez une action différée avec
context.scheduler:run_after(...). - Ajoutez une requête de zone Lua native simple ou un
context.script:target(...)simple. - Seulement ensuite passez aux attaques rotatives, machines à états et mécaniques multi-étapes.
Prochaines étapes
- Premiers pas -- structure de fichiers, hooks, premier pouvoir, modèles à copier-coller
- Exemples et modèles -- pouvoirs fonctionnels complets à étudier et adapter
