Aller au contenu

Événements & Touches du Clavier

Apprenez à exécuter votre code en continu et à détecter les touches pressées par le joueur.


Exécuter du code à chaque image

Thread.Create()

Un thread est la façon dont un mod exécute du code en continu. C'est le cœur de votre script, et le loader le reprend à chaque image, environ 60 fois par seconde. C'est ici que vous vérifiez les touches du joueur, dessinez du texte à l'écran ou mettez à jour votre mod :

Thread.Create(function()
    while true do
        -- Ce code s'exécute en continu pendant que vous jouez
        Thread.Wait(0) -- rend la main jusqu'à l'image suivante
    end
end)

onUnload()

Appelée quand votre mod s'arrête ou se recharge. Utilisez-la pour faire du nettoyage (supprimer les véhicules créés, sauvegarder un fichier, etc.) :

function onUnload()
    Log.Print("Le mod s'est arrêté proprement !")
end

Attendre entre deux tours de boucle

Quand vous n'avez pas besoin de tourner à chaque image, attendez plus longtemps. Thread.Wait(ms) suspend le thread et le reprend plus tard, sans bloquer le jeu ni les autres threads.

Thread.Create(function()
    while true do
        SetCharHealth(GetPlayerChar(GetPlayerId()), 200)
        Thread.Wait(1000) -- une fois par seconde
    end
end)

C'est le motif auquel les mods ScriptHookDotNet sont écrits : un script porté garde sa structure.

Fonction Effet
Thread.Create(fn, ...) Démarre un thread et rend un identifiant. Les arguments qui suivent sont transmis à fn.
Thread.Wait(ms) Suspend le thread courant. Thread.Wait(0) reprend à l'image suivante.
Thread.Stop(id) Arrête un thread, rend true s'il était encore vivant.
Thread.Count() Nombre de threads vivants.

Deux points à retenir :

  • Une erreur dans un thread ne tue que ce thread. Elle est journalisée, le thread est retiré, et les autres continuent.
  • Thread.Wait() compte du temps réel, pas du temps de jeu. Une partie en pause ne réveille rien, et tous les délais échus se déclenchent d'un coup à la reprise.

Wait() tout court n'existe pas

GTA IV possède un natif nommé WAIT, donc le global Wait appartient au jeu et non à l'ordonnanceur. Écrivez toujours Thread.Wait(ms). Le natif reste joignable par Native.Call("WAIT", ...).


Détecter une Touche du Clavier (Input.IsKeyDown)

Pour savoir si le joueur appuie sur une touche, utilisez Input.IsKeyDown(code_touche).

Thread.Create(function()
    while true do
        if Input.IsKeyDown(0x73) then -- Touche F4
            Log.Print("La touche F4 a été pressée !")
        end
        Thread.Wait(0)
    end
end)

Tableau des Codes de Touches Principales

Voici les codes Windows (Virtual-Key) les plus fréquents à copier-coller dans vos scripts :

Touche Code Hexadécimal Code Décimal Description
F1 0x70 112 Touche F1
F2 0x71 113 Touche F2
F3 0x72 114 Touche F3
F4 0x73 115 Touche F4 (Standard pour les menus trainers)
F5 0x74 116 Touche F5
F6 0x75 117 Réservé (Éditeur de code en jeu intégré)
F7 0x76 118 Touche F7
F8 0x77 119 Touche F8
F9 0x78 120 Touche F9
Shift 0x10 16 Touche Maj / Shift
Ctrl 0x11 17 Touche Contrôle / Ctrl
Alt 0x12 18 Touche Alt
Espace 0x20 32 Barre d'espace
Entrée 0x0D 13 Touche Entrée
Échap 0x1B 27 Touche Échap / Escape
Tab 0x09 9 Touche Tabulation
Flèche Haut 0x26 38 Flèche directionnelle Haut
Flèche Bas 0x28 40 Flèche directionnelle Bas
Flèche Gauche 0x25 37 Flèche directionnelle Gauche
Flèche Droite 0x27 39 Flèche directionnelle Droite
Touche E 0x45 69 Lettre E (Interaction)
Touche T 0x54 84 Lettre T (Chat / Texte)
Touche X 0x58 88 Lettre X
Touche Z 0x5A 90 Lettre Z
0 à 9 0x30 à 0x39 48 à 57 Chiffres au-dessus des lettres
Pavé Numérique 0x60 à 0x69 96 à 105 Chiffres du pavé numérique (Numpad)