Aller au contenu
Gang Fights

SDK de script · Luau

Créez vos propres modes de jeu.

Les serveurs Gang Fights exécutent des ressources écrites en Luau (s’ouvre dans un nouvel onglet) — du Lua avec des types optionnels. D’une commande de lancer de dés à une ville de roleplay complète : si ça se passe sur un serveur, vous pouvez le scripter.

État : alpha précoce. L’API de script ne fait que s’enrichir au sein d’une version majeure, donc les ressources que vous écrivez aujourd’hui continueront de fonctionner. Modèles, textures et sons personnalisés arrivent ensuite.

Ressources

Une ressource est un dossier placé dans le dossier recursos/ du serveur : un manifeste resource.toml et ses scripts. Les scripts serveur tournent sur le serveur ; les scripts client sont envoyés à chaque joueur et tournent sur son PC. Chaque mode de jeu fourni avec le serveur n’est qu’une ressource — copiez-en une, renommez-la et changez ce que vous voulez.

arborescence
recursos/
  hello/
    resource.toml
    server/main.luau
    client/hud.luau        -- optional: runs on each player's PC
resource.toml
name = "hello"
version = "1.0.0"
description = "Says hello"
author = "You"
server_scripts = ["server/main.luau"]
client_scripts = []   # sent to each player and run on their PC
dependencies = []     # resources that must be running first
gamemode = false      # true: this resource runs the rounds
autostart = true

Votre première ressource

Saluez les joueurs à leur arrivée et ajoutez une commande /dice. Démarrez le serveur et la ressource s’exécute ; après modification, tapez restart hello dans la console du serveur et elle se recharge aussitôt.

hello/server/main.luau
on("playerJoin", function(player: number)
  players.message(player, "Hello, " .. (players.name(player) or "?") .. "!")
end)

registerCommand("dice", function(player: number)
  chat.broadcast((players.name(player) or "?") .. " rolls " .. math.random(1, 6))
end)
console du serveur
> resources            # list what's running
> restart hello        # reload after editing — no server restart
> players
> say Round starts in 1 minute
> ban 7 60 spamming    # by player number, for 60 minutes

Ce que couvre l’API

L’API serveur est organisée en petites bibliothèques ciblées. Chaque joueur est identifié par un numéro — celui que tout le monde voit à côté de son pseudo dans la liste des joueurs.

  • Événements

    Arrivées, départs, coups, K.-O., objets, manches, graffitis, choix dans les menus — et vos propres événements entre ressources.

  • Chat et commandes

    Chat en couleur, /commandes avec arguments, suggestions et messages par joueur.

  • Minuteurs

    setTimeout, setInterval et clearTimer pour tout ce qui s’exécute plus tard ou se répète.

  • Joueurs

    Pseudos, couleurs et tags de nom, admins, kicks, bans temporaires et identifiants stables.

  • Combattants

    Santé, équipes, points d’apparition, téléportations, personnages, gel, invulnérabilité et réapparitions.

  • Flics

    Faites de n’importe quel combattant un flic, menottez et libérez, distribuez les clés des menottes.

  • Bandes et ordres

    Lisez et donnez les six ordres de bande, et travaillez avec les bandes du jeu et leurs membres.

  • Objets

    Donnez, retirez et lâchez armes et objets, listez ce qui traîne au sol, ajustez leur poids.

  • PNJ

    Placez des personnages qui restent sur place, avec nom, icône et animation d’attente — commerçants, recruteurs, donneurs de quêtes.

  • Dimensions

    Faites tourner plusieurs cartes à la fois, déplacez les combattants entre elles et alternez les cartes entre les matchs.

  • Marqueurs et portes

    Des marqueurs flottants qui indiquent où il se passe quelque chose, et le contrôle des portes de chaque carte.

  • Objets de carte

    Placez, déplacez et supprimez des objets de carte par script ou avec l’éditeur en jeu (jusqu’à 5 000 par serveur).

  • Graffitis

    Créez des murs à bomber, verrouillez-les, réinitialisez-les et réagissez à chaque couche terminée.

  • Manches et modes

    Lancez, terminez et arrêtez des manches — ou passez-vous-en pour le mode libre, le deathmatch et le roleplay.

  • Interface à l’écran

    Textes, panneaux, barres, images, grandes annonces, menus numérotés et champs de saisie.

  • Fenêtres et clics

    Dessins cliquables, étiquettes, images d’objets et curseur libre pour vos propres fenêtres.

  • Icônes et zones

    Icônes et zones colorées sur la carte de chaque joueur.

  • Données sauvegardées

    Un stockage clé-valeur par ressource qui survit aux redémarrages du serveur.

  • Mots de passe et bans

    Hachage salé et volontairement lent des mots de passe des comptes serveur, et bans par identifiant et IP avec durée optionnelle.

Scripts client

Les scripts client servent à ce qui appartient à chaque joueur : un HUD, des menus, des raccourcis clavier, des commandes de chat locales, la caméra et les sons. Chaque ressource tourne dans son propre bac à sable sur le PC du joueur.

Ils peuvent lire le combat mais jamais le modifier — sinon chaque PC verrait quelque chose de différent et tricher deviendrait trivial. Pour changer quelque chose, un script client le demande au serveur, et c’est le serveur qui décide.

player-hud/client/hud.luau
-- client/hud.luau
setInterval(function()
  local me = fighters.get(localPlayer.fighter() or -1)
  if me then
    ui.text("hp", "Health " .. math.floor(me.health), { position = "bottom-right" })
  end
end, 200)

on("keyDown", function(key)
  if key == "F3" then
    emitServer("askStats")   -- handled on the server with onClient("askStats", ...)
  end
end)

Bac à sable et limites

  • Aucun accès extérieur

    Les scripts ne peuvent toucher ni aux fichiers, ni au réseau, ni au système d’exploitation, ni remplacer les fonctions de l’API.

  • 250 ms par exécution

    Un script qui tourne trop longtemps d’une traite est arrêté — une boucle infinie ne peut pas figer le serveur.

  • 64 Mo par ressource

    Chaque ressource dispose de son propre budget mémoire.

  • Erreurs confinées

    Les erreurs vont dans le journal du serveur avec le nom de la ressource ; la ressource continue de tourner.

Prise en charge dans l’éditeur : le SDK fournit les définitions de types des API serveur et client. Ajoutez-les à luau-lsp (s’ouvre dans un nouvel onglet) (par exemple via une extension Luau pour VS Code) pour bénéficier de l’autocomplétion et de la vérification des types.

Modèles inclus

Chaque serveur est livré avec ces ressources. Rien en elles n’est propre au jeu — vos propres ressources peuvent en faire autant, et plus.

welcome
Salue les joueurs et compte leurs visites grâce aux données sauvegardées.
basic-commands
/players et une astuce périodique dans le chat.
player-hud
Scripts client : un HUD, F2 pour le masquer, F3 pour demander vos statistiques au serveur.
scoreboard
Un tableau des K.-O., la manche en grandes lettres et un menu /stats.
fight-basics
Annonce les K.-O. et les vainqueurs de manche, plus /heal et /where.
deathmatch
Un mode sans manches : réapparitions, fil des éliminations, le premier à 10 gagne.
roleplay
Comptes, personnages, positions sauvegardées, un hôpital et un métro entre les quartiers.
roleplay-chat
Chat local, /me, /do, /shout, /ooc et compagnie.
mapvote
Un vote pour la prochaine carte à la fin de chaque match.
mapping
Les objets de carte et l’éditeur de placement en jeu.
admin
Des outils d’admin, comme voler librement au-dessus de la carte.

Faire tourner un serveur

Hébergez depuis le menu du jeu pour des parties rapides, ou générez un paquet de serveur dédié avec CreateServer.bat dans le dossier du jeu. Il demande le système cible (Windows ou Linux) et les cartes, puis crée un dossier avec le programme serveur, ses données, vos ressources, un servidor.cfg et la documentation du SDK.

  • Linux : Ubuntu 24.04+ ou Debian 12+, 64 bits, avec les bibliothèques ALSA et udev installées.
  • Ports : UDP 27015 pour le jeu et UDP 27016 pour la recherche de serveurs (ou le port configuré et le suivant).
  • Mises à jour : le serveur vous prévient au démarrage quand une nouvelle version est sortie. Mettez le jeu à jour, régénérez le paquet et remplacez le programme et les données — votre configuration et vos ressources restent.
  • Données privées : le dossier data/ du paquet est généré à partir de votre propre copie du jeu original. Ne le partagez jamais publiquement.

En savoir plus sur l’hébergement

Référence complète

La référence complète de l’API — chaque fonction, événement et option — est fournie avec chaque paquet serveur dans sdk/README.md, avec les définitions de types pour l’éditeur dans sdk/types/. Elle correspond toujours à la version que vous utilisez.