Éditeur de code
Écrire, tester et corriger gamemodes et addons Lua sans quitter le jeu, avec rechargement à chaud.
Ouvrir un projet
- Créer → Code liste tes gamemodes et addons Lua (Modifier), et ceux du jeu ou du Workshop (Voir le code, en lecture seule).
- Nouveau gamemode : choisis un nom et le gamemode dont il dérive ; les fichiers de base sont créés (voir Structure).
- Nouvel addon Lua : crée un addon avec un script serveur (
lua/autorun/server/) et un script client (lua/autorun/client/). - Depuis Mods → Mes addons, le bouton Modifier ouvre aussi l'éditeur.
- En lecture seule, Dupliquer crée ta propre copie modifiable (par exemple pour partir du code de Sandbox).
L'interface
| Zone | Rôle |
|---|---|
| Arborescence (gauche) | Les fichiers du projet. + Fichier crée un fichier (un modèle d'entité est proposé dans entities/), Supprimer l'envoie à la corbeille, Dossier l'ouvre dans l'explorateur. |
| Code (centre) | Onglets, numéros de ligne, coloration Lua. Un point « • » signale un fichier non enregistré. |
| Aide (droite) | Signature, côté (serveur, client, partagé) et description de la fonction sous le curseur. |
| Console (bas) | Messages print et erreurs Lua, serveur et client. Une erreur est un lien : un clic ouvre le fichier à la ligne fautive (surlignée en rouge) ; sous le message, la pile d'appels liste les fonctions de tes fichiers qui y ont mené. En haut : Pause sur erreur, Retirer les points d'arrêt et Profileur (voir Débogueur). La ligne de saisie exécute du Lua dans la partie en cours (côté serveur ou client). |
Autocomplétion
Pendant la frappe, l'éditeur propose les fonctions de l'API PhysiCore : après hook., net., team.…, après ply: ou ent: (méthodes), après GM: (fonctions du gamemode) et ENT: (fonctions d'entité). Entrée ou Tab valide la suggestion.
Tester et recharger
- TESTER (F5) enregistre tout et lance une partie solo sur sb_naturebox avec ton gamemode (pour un addon : avec Sandbox, ton addon étant activé).
- En jeu, F2 rouvre l'éditeur par-dessus la partie, qui continue.
- Modifie le code et enregistre (Ctrl+S) : seul ce fichier est ré-exécuté, la partie continue (autorefresh).
- Pour tout relancer : RECHARGER (F5) : tous les scripts sont relus et relancés, côté serveur et chez les joueurs, sans quitter la partie.
GM:Initializeest rappelé, etPlayerSpawnpour chaque joueur. - Quitter la partie (Échap → Quitter la partie) ramène à l'éditeur.
Autorefresh
Comme dans Garry's Mod, l'hôte (ou le serveur) vérifie chaque seconde la date de modification des fichiers Lua chargés (gamemode et addons, serveur et client). Un fichier enregistré, depuis l'éditeur de code ou n'importe quel autre éditeur, est ré-exécuté seul :
- dans le royaume serveur, dans le client de l'hôte et chez chaque joueur connecté (selon le côté du fichier) ; la console affiche
Rechargé : <fichier>; - les globales, tables, joueurs, entités et props sont gardés : seul ce que le fichier redéfinit est remplacé ;
- un fichier de gamemode est ré-exécuté avec
GM= la table du gamemode en cours : ses méthodesGM:…sont remplacées ; - un fichier d'entité ou d'arme (
ENT,SWEP) met à jour la table de classe en place : les entités et armes déjà créées utilisent aussitôt les nouvelles fonctions ; - ensuite, le hook
OnReloadedest appelé dans les deux royaumes.
-- Garder l'état d'un rechargement à l'autre : ne pas écraser une table existante
MonAddon = MonAddon or { scores = {} }
hook.Add("OnReloaded", "MonAddon", function()
print("MonAddon rechargé, " .. table.Count(MonAddon.scores) .. " scores gardés")
end)
Les joueurs qui arrivent ensuite reçoivent directement la version à jour. RECHARGER / F5 fait toujours un redémarrage complet de tous les scripts.
include() ne sont pas surveillés eux-mêmes : ré-enregistre le fichier qui les inclut. Un nouveau fichier ajouté au projet demande un F5. hook.Add avec le même identifiant remplace l'ancienne fonction (sans identifiant, l'ancienne reste aussi) ; timer.Create avec le même nom remplace le timer.Débogueur
Points d'arrêt
- Un clic dans la marge de gauche d'un fichier
.luapose ou retire un point d'arrêt (rond rouge). Ils sont gardés pendant la session, suivent leurs lignes quand tu modifies le fichier et sont re-synchronisés avec le jeu à l'enregistrement. - Retirer les points d'arrêt (en haut de la console) les enlève tous.
- Pause sur erreur (case de la console) : une erreur Lua met le jeu en pause là où elle se produit, avant que la pile ne se défasse ; le message s'affiche en rouge.
L'écran de pause
Quand l'exécution atteint un point d'arrêt (ou une erreur, ou un pas à pas), tout le jeu s'arrête sur la ligne : l'appel Lua en cours ne peut pas rendre la main. Un écran s'affiche par-dessus, titré LUA EN PAUSE · serveur|client · raison (point d'arrêt, pas à pas, erreur).
| Commande | Touche | Effet |
|---|---|---|
| Continuer | F5 | Reprend jusqu'au prochain point d'arrêt. |
| Pas à pas principal | F10 | Ligne suivante de la même fonction (sans entrer dans les fonctions appelées). |
| Pas à pas détaillé | F11 | Prochaine ligne Lua exécutée, même dans une fonction appelée ou un autre appel du jeu. |
| Pas à pas sortant | Maj+F11 | Termine la fonction en cours et s'arrête dans l'appelant. |
| Zone | Rôle |
|---|---|
| Code (gauche) | Le fichier du niveau choisi, ligne courante surlignée ; un clic dans la marge pose ou retire un point d'arrêt ; molette pour défiler. |
| Pile d'appels | Les fonctions en cours (nom — fichier:ligne). Un clic choisit le niveau affiché. |
| Variables | Variables locales du niveau choisi, puis ses upvalues (en bleu) ; molette pour défiler. |
| ÉVALUER | Tape une expression ou une instruction Lua puis Entrée : elle s'exécute dans le niveau choisi et le résultat s'affiche. Les variables locales sont lisibles et modifiables (x = 5 change vraiment la locale x). |
- Seuls les fichiers des addons et gamemodes apparaissent et sont parcourus : le Lua interne du jeu est sauté.
- Pas à pas principal et sortant s'arrêtent au plus tard à la fin de l'appel du jeu en cours (hook, timer…) ; le pas à pas détaillé s'arrête à la prochaine ligne Lua, même dans un autre appel.
- Après un pas à pas sortant, on s'arrête à la ligne suivante de l'appelant (Lua ne signale pas une seconde fois la ligne de l'appel).
- Les deux royaumes de ta machine sont débogués (serveur de l'hôte et client). Pas sur un serveur dédié ni sans fenêtre : les points d'arrêt y sont ignorés.
- En multijoueur, la connexion des autres joueurs est entretenue pendant la pause (leurs messages attendent) ; pendant la pause, le jeu n'appelle aucun Lua (hooks, timers…).
Profileur
Le bouton Profileur de la console affiche un onglet qui mesure le temps passé dans chaque fonction Lua d'une partie en cours. Choisis le royaume (Serveur ou Client), puis Démarrer / Arrêter ; Réinitialiser remet les compteurs à zéro. La durée mesurée s'affiche à côté ; le tableau est rafraîchi chaque seconde et trié par temps propre.
| Colonne | Contenu |
|---|---|
| Fonction | hook Event « id », GM:Methode, classe:Methode (entités, armes), sinon le nom de la fonction ; « (moteur) » pour les fonctions du jeu. |
| Fichier | fichier:ligne de la définition. Double-clic sur une ligne : ouvre le fichier. |
| Appels | Nombre d'appels. |
| Total (ms) | Temps total, fonctions appelées comprises. |
| Propre (ms) | Temps sans les fonctions appelées. |
| ms / s | Temps propre par seconde mesurée. |
Raccourcis
| Touche | Action |
|---|---|
| Ctrl+S / Ctrl+Maj+S | Enregistrer le fichier / tout |
| Ctrl+F | Rechercher dans le fichier (Entrée : suivant, Échap : fermer) |
| F5 | Tester, ou recharger pendant une partie |
| F5 / F10 / F11 / Maj+F11 | Écran de pause du débogueur : continuer / pas à pas principal / détaillé / sortant |
| F2 | Pendant un test : passer du jeu à l'éditeur |