Leçon 1.5
Sommaire · 4 sections

Leçon 1.5 · 17 min

Utiliser l'IA intelligemment

1Ce que l'IA fait bien

Une IA est très utile pour expliquer. Colle-lui une erreur de la console avec ton code, et elle te dira en français ce que veut dire attempt to index a nil value. Demande-lui de détailler un bout de code ligne par ligne, et tu comprendras plus vite qu'en le fixant pendant dix minutes. Elle sait aussi très bien le Lua de base : les boucles, les tables, les chaînes de caractères.

2Ce qu'elle invente

Le piège le plus courant : un hook ou une fonction qui n'existe pas, mais dont le nom a l'air parfait. Tu demandes « empêche les joueurs de mourir dans la mine pendant l'événement », et tu reçois ceci :

SERVEURlua/autorun/server/sv_cosmos_treve.lua
local treveActive = truehook.Add("PlayerShouldDie", "cosmos_treve", function(ply)    if treveActive then        return false    endend)

Ligne fautive : 3.

Le code se charge sans erreur. Et pourtant, les joueurs continuent de mourir. PlayerShouldDie n'existe pas : le wiki n'a aucune page à ce nom. hook.Add accepte n'importe quel nom sans broncher, mais GMod ne déclenche jamais un événement qu'il ne connaît pas, donc ta fonction n'est jamais appelée.

Le vrai hook est sur le wiki : GM:PlayerShouldTakeDamage, appelé sur le serveur avant chaque dégât, avec la victime et l'attaquant. S'il renvoie false, le joueur ne prend pas le coup.

SERVEURlua/autorun/server/sv_cosmos_treve.lua
local treveActive = truehook.Add("PlayerShouldTakeDamage", "cosmos_treve", function(victime, attaquant)    if treveActive then        return false    endend)

Ligne 3, seuls le nom du hook et ses arguments changent, et ils viennent de la page du wiki, dans le même ordre. Ligne 5, return false bloque le dégât. Quand la trêve est finie, la fonction ne renvoie rien, et le jeu applique ses règles normales.

L'autre classique, c'est une fonction qui vient d'un gamemode et que l'IA présente comme du GMod de base. ply:GetMoney() n'existe pas dans GMod. Sur un serveur DarkRP, l'argent passe par les fonctions du gamemode :

SERVEURlua/autorun/server/sv_cosmos_boutique.lua
local function AcheterPioche(ply)    if not ply:canAfford(500) then        ply:ChatPrint("Il te faut 500 $ pour acheter une pioche.")        return    end    ply:addMoney(-500)end

Ligne 2, canAfford renvoie true si le joueur a au moins cette somme. Ligne 6, addMoney avec un nombre négatif retire l'argent. Ces deux fonctions sont écrites dans le code de DarkRP, pas dans GMod : sans DarkRP, la console affiche une erreur dès qu'un joueur essaie d'acheter. Pour lire l'argent d'un joueur, DarkRP fournit ply:getDarkRPVar("money").

3Vérifier chaque nom

La méthode est toujours la même. Avant de coller du code d'IA dans ton addon, liste chaque fonction et chaque hook qu'il utilise, et ouvre leur page sur le wiki. Pour chaque nom, vérifie trois choses : que la page existe, que le royaume correspond au fichier où tu l'appelles, et que les arguments sont dans le bon ordre. Si la page n'existe pas, cherche si un gamemode comme DarkRP la fournit. Sinon, c'est une invention.

4Bien poser ta question

Plus ta question est précise, moins l'IA a de place pour inventer. Donne-lui le gamemode de ton serveur (Sandbox, DarkRP, un autre), le chemin du fichier pour qu'elle sache si le code tourne côté serveur ou client, et l'erreur complète de la console, avec sa première ligne (fichier et numéro de ligne) et la pile en dessous. Demande-lui une explication, pas seulement du code : une explication fausse se repère plus vite qu'un code faux.

Exercice 1.5 · Trouve le bug

30 XP

La trêve de la mine

Pendant un événement, personne ne doit prendre de dégâts. Une IA a écrit ce fichier : il se charge sans erreur, mais les joueurs continuent d'être blessés.

Cherche sur le wiki le hook utilisé. S'il n'existe pas, trouve celui qui décide si un joueur prend des dégâts.

Corrige le fichier : pendant la trêve, un joueur attaqué par un autre ne doit pas perdre de vie.

SERVEURlua/autorun/server/sv_cosmos_treve.lua
local treveActive = truehook.Add("PlayerShouldDie", "cosmos_treve", function(ply)    if treveActive then        return false    endend)

Ce que les tests vérifient

  • Pendant la trêve, Kaze attaqué par Zorg_77 ne prend pas de dégâts
  • La fonction est abonnée à PlayerShouldTakeDamage sous l'identifiant cosmos_treve
  • Plus rien n'est abonné au hook inventé PlayerShouldDie
Ouvrir l'atelier

L'atelier se fait sur ordinateur : éditeur, console et tests côte à côte. Les indices et la solution commentée t'attendent dans l'atelier.