DU CODE
DANS LE JEU.
Donner aux coachs des outils pour gérer leur équipe.
Pendant mon stage chez Rubik’s Network, j’ai ajouté des outils à un gamemode de football existant sur Garry’s Mod : interface coach, partage des compositions, pauses tactiques et aide aux remplacements. Voici ces fonctionnalités en jeu.
Mon intervention
J’adaptais les fonctionnalités aux demandes et aux contraintes du projet, en tenant compte des suggestions des joueurs reçues via le support. Je participais aussi au débogage et à la gestion des fichiers d’hébergement et de la base de données. Git et GitHub servaient au suivi du code.
J’ai relié les interfaces côté joueur aux règles côté serveur : une pause tactique dure 160 secondes, avec deux pauses au maximum par match ; un remplacement immobilise la balle pendant 15 secondes. Les captures ci-dessous montrent mes ajouts au gamemode existant.
En parler ensemble
CE N’EST PAS UNE CAPTURE DU SERVICE.
CAPTURES EN JEU / RUBIK’S NETWORK
Mes ajouts.
En action.
Trois démonstrations de mes ajouts au gamemode, avec des extraits du code qui les fait fonctionner.
La lecture n’a pas démarré. Ouvrir la vidéo directement.
La composition, du coach aux joueurs
00:57Depuis l’interface coach, je place les joueurs sur le terrain et partage la composition aux destinataires choisis. Ils peuvent ensuite la conserver sur le côté de leur écran ou fermer l’interface.
LUA / SERVEURVérifier les positions
Je vérifie le type des coordonnées reçues, puis je les ramène entre 0 et 1 avec math.Clamp. Les positions restent ainsi dans les limites du terrain avant leur partage aux joueurs.
local cleanPos = {}
for steamid, pos in pairs(positions) do
if isstring(steamid) and istable(pos) and isnumber(pos.x) and isnumber(pos.y) then
cleanPos[steamid] = {
x = math.Clamp(pos.x, 0, 1),
y = math.Clamp(pos.y, 0, 1),
}
end
end
Données reçues → vérification → coordonnées normalisées
La lecture n’a pas démarré. Ouvrir la vidéo directement.
La pause tactique
00:14Le coach déclenche une pause de 160 secondes. Une notification et un décompte préviennent les joueurs pendant que la balle est immobilisée. Le match est limité à deux pauses tactiques.
LUA / SERVEURReprendre après la pause tactique
Ce temporisateur s’exécute une seule fois, après 160 secondes. Je vérifie que le match existe encore, puis je libère la balle, relance le chronomètre mémorisé et avertis les joueurs de la fin de la pause.
timer.Create("Coach_Timeout_" .. matchId, 160, 1, function()
local m = GetMatchByID(matchId)
if not m then return end
m._timeoutActive = false
CoachUnfreezeBall(m)
CoachResumeTimer(matchId, timerName, left)
netstream.Start(m:GetAllPlayers(), "Coach:TimeoutEnd")
end)
160 secondes → reprise du match → notification des joueurs
La lecture n’a pas démarré. Ouvrir la vidéo directement.
Le remplacement
00:14Une notification annonce le remplacement. La balle est immobilisée pendant 15 secondes, avec un décompte visible pour les joueurs. Cette pause facilite l’entrée d’un remplaçant.
LUA / SERVEUREncadrer les 15 secondes de remplacement
À la demande du coach, le serveur récupère un match autorisé avec GetCoachMatch, immobilise la balle et prévient les participants. Après 15 secondes, il libère la balle et termine la notification. Ce passage crée une pause pour le changement ; il n’échange pas automatiquement les joueurs.
netstream.Hook("Coach:Substitution", function(ply)
local match = GetCoachMatch(ply)
if not match then return end
match._timeoutActive = true
local matchId = match.id
CoachFreezeBall(match)
netstream.Start(match:GetAllPlayers(), "Coach:SubstitutionStart")
timer.Create("Coach_Sub_" .. matchId, 15, 1, function()
local m = GetMatchByID(matchId)
if not m then return end
m._timeoutActive = false
CoachUnfreezeBall(m)
netstream.Start(m:GetAllPlayers(), "Coach:TimeoutEnd")
end)
end)
Demande du coach → pause de 15 secondes → balle libérée
DÉMONSTRATIONS SANS SON · CAPTURES DE SEPTEMBRE 2026 · EXTRAITS LUA DU MODULE COACH


