Points de spawn dans les maps GMod : entités pour Sandbox, DarkRP et TTT
Quels points de spawn il faut à une map GMod pour Sandbox, DarkRP et TTT, comment GMod choisit un spawn et ce qui arrive s’il en manque ou s’il y en a trop peu.
Pour Sandbox et DarkRP, une map a besoin de plusieurs entités info_player_start, pour TTT de info_player_deathmatch, dans chaque cas au moins autant que de joueurs pouvant spawner en même temps. Les spawns des jobs et les positions de jail de DarkRP ne font pas partie de la map. Les admins les définissent en jeu et le serveur les enregistre dans sa base de données. S’il n’y a aucune entité de spawn, les joueurs se retrouvent en général à l’origine de la map. S’il y en a trop peu, la logique de spawn tue les joueurs qui se tiennent sur un spawn.
Comment GMod choisit un point de spawn
La sélection est écrite en Lua, dans la fonction GM:PlayerSelectSpawn du mode de jeu de base (gamemodes/base/gamemode/player.lua). Sandbox l’utilise telle quelle, DarkRP l’appelle et la complète, TTT la remplace par la sienne. Au premier spawn, la fonction rassemble toutes les entités de ces classes :
info_player_startetgmod_player_startinfo_player_deathmatchinfo_player_combineetinfo_player_rebelde Half-Life 2: Deathmatchinfo_player_terroristetinfo_player_counterterroristde Counter-Strike: Sourceinfo_player_teamspawnde Team Fortress 2- d’autres classes issues d’autres jeux Source, comme
info_player_alliesetinfo_player_axis
Dans un mode de jeu sans équipes, elles se valent toutes. C’est pourquoi les spawns des maps d’autres jeux fonctionnent dans Sandbox sans modification. Dans Hammer, le FGD propre à GMod ne connaît que info_player_start. info_player_deathmatch est fourni par le ttt.fgd du dossier gamemodes/terrortown.
Ensuite, la sélection se déroule ainsi :
- Si au moins un spawn porte le flag « Master » (spawnflag 1), GMod prend toujours le premier spawn portant ce flag et saute le tirage au sort.
- Sinon, la fonction tire un spawn au hasard, autant de fois qu’il y a de spawns. Un spawn situé hors du monde est ignoré. Il en va de même pour le spawn utilisé en dernier et pour celui que ce joueur a utilisé en dernier, tant que la map a plus d’un spawn.
- Pour chaque candidat,
GM:IsSpawnpointSuitablevérifie si un joueur vivant se tient dans une boîte de 32 × 32 × 64 unités au niveau du spawn. Si la boîte est libre, le joueur spawne là. - La dernière tentative est forcée. Chaque joueur qui se tient dans la boîte est tué.
Le joueur reprend la direction du regard à partir des angles de l’entité.
Combien de spawns il faut à une map
Les règles pour les mappeurs en découlent :
- Au moins autant de spawns que de slots, de préférence plus. La fonction tire avec remise et n’essaie pas chaque spawn exactement une fois. Plus il y a de spawns libres, moins elle arrive souvent à la dernière tentative forcée.
- Un spawn unique est le pire des cas. La première tentative est alors aussi la dernière. Celui qui se tient sur le spawn meurt dès qu’un autre joueur spawne.
- Garde de la distance. La boîte de vérification fait 32 unités de large. Si deux spawns sont plus rapprochés, un joueur sur l’un d’eux bloque aussi l’autre.
- Pas de flag Master sur les maps multijoueur. Le flag est prévu pour les maps solo. S’il est activé, tout le monde spawne à ce point, et celui qui s’y tient est tué à chaque fois.
- Place-le dans un espace dégagé. Le modèle que Hammer affiche pour
info_player_starta à peu près la taille d’un joueur, tu vois donc si un joueur y tient.
Si la dernière tentative tombe sur le spawn utilisé le plus récemment, la vérification est sautée et la fonction le renvoie quand même. Si un joueur s’y tient encore, les deux se retrouvent l’un dans l’autre.
S’il n’y a aucune entité de spawn, le mode de jeu de base écrit [PlayerSelectSpawn] Error! No spawn points! dans la console et ne renvoie aucun spawn. D’après le wiki de la Valve Developer Community, les jeux Source placent alors en général le joueur à l’origine de la map (0 0 0). Pour un BSP, le Map Scanner vérifie la présence d’un spawnpoint.
Sandbox, DarkRP et TTT comparés
| Mode de jeu | Entité de spawn dans la map | Également requis | Si cela manque |
|---|---|---|---|
| Sandbox | info_player_start | rien | en général un spawn à l’origine, des morts au spawn s’il y en a trop peu |
| DarkRP | info_player_start | positions de jail, éventuellement spawns des jobs, les deux définis en jeu | aucune arrestation sans position de jail |
| TTT | info_player_deathmatch | entités d’armes et de munitions | erreur No spawn entity found!, spawns de fortune s’il y en a trop peu |
DarkRP est basé sur Sandbox et appelle d’abord la sélection du mode de jeu de base. La map a donc besoin d’entités de spawn ordinaires. Ensuite, DarkRP ne remplace que la position :
/setspawn <job>remplace tous les spawns d’un job par ta position,/addspawn <job>en ajoute un,/removespawn <job>les supprime.<job>est le nom de commande du job, par exemplecp. Ces commandes sont réservées aux admins./jailposremplace toutes les positions de jail par ta position,/addjailposen ajoute une autre. Un admin peut le faire, de même que le chef de la police tant queGM.Config.chiefjailposest activé.
DarkRP enregistre ces positions dans la base de données du serveur sous le nom de la map. Si le BSP reçoit un nouveau nom de fichier, DarkRP ne les retrouve plus. Sans position de jail, DarkRP refuse les arrestations avec You cannot arrest people since there are no jail positions set!. Avant de placer le joueur, DarkRP cherche un endroit libre autour de la cible, jusqu’à 600 unités de distance. La logique de mise à mort du mode de jeu de base s’exécute quand même avant, car l’entité de spawn est choisie en premier. Une map DarkRP a donc elle aussi besoin de suffisamment d’entités info_player_start. Ce qu’elle devrait offrir d’autre est expliqué dans choisir une map DarkRP et dans le tour d’horizon des types de maps roleplay.
TTT rassemble les info_player_deathmatch et les spawns d’équipe d’autres jeux. Il n’utilise info_player_start que s’il n’existe rien d’autre, et la documentation de TTT le déconseille. Si les spawns ne suffisent pas, TTT crée des spawns de fortune à 36 unités à côté de spawns existants et signale TTT WARNING: Map has too few spawn points. Laisse de la place autour de chaque spawn : TTT vérifie seulement que l’endroit se trouve à l’intérieur du monde et qu’aucun joueur ne s’y tient. Au-dessus d’un vide, le joueur spawne en l’air. Les armes arrivent dans la map via ttt_random_weapon, ttt_random_ammo ou des classes d’armes fixes. Tout le reste se trouve dans créer des maps TTT.
Des entités de garrysmod.fgd souvent négligées
| Entité | Rôle | Remarque |
|---|---|---|
lua_run | exécute du code Lua (keyvalue Code, inputs RunCode et RunPassedCode) | le Map Scanner la signale comme entité à risque |
env_skypaint | contrôle les couleurs du ciel | nécessite le matériau de skybox painted dans les Map Properties |
func_nav_blocker, func_nav_avoid, func_nav_prefer | bloque des zones du navmesh ou les pondère | n’affecte que les bots qui utilisent le navmesh, voir navmesh et AI nodes |
trigger_catapult | propulse les joueurs et les objets physiques | vitesse réglée séparément via playerSpeed et physicsSpeed |
beam_spotlight | projecteur avec un faisceau visible | entièrement côté client, non synchronisé entre les clients |
Ce que les propriétaires de serveur peuvent changer sans recompilation
Si une map que tu as achetée manque de spawns, cela peut se régler sur le serveur. Dans DarkRP, les commandes de chat ci-dessus suffisent. TTT charge un script de rearm maps/<mapname>_ttt.txt qui remplace les armes et, avec le réglage replacespawns, aussi les spawns, tant que ttt_use_weapon_spawn_scripts est activé. Pour tous les autres cas, tu crées des entités de spawn supplémentaires en Lua. Relève les coordonnées en jeu avec getpos. La commande indique la position de tes yeux, donc pour un joueur debout, soustrais 64 unités à la valeur Z. Le fichier se place dans lua/autorun/server/ :
hook.Add( "InitPostEntity", "extra_spawns", function()
local spawn = ents.Create( "info_player_start" )
if ( not IsValid( spawn ) ) then return end
spawn:SetPos( Vector( 512, -128, 64 ) )
spawn:SetAngles( Angle( 0, 90, 0 ) )
spawn:Spawn()
end )
Les limites de cette approche :
- Le mode de jeu de base mémorise la liste des spawns après le premier spawn. Les nouvelles entités doivent exister avant, d’où
InitPostEntity. game.CleanUpMapsupprime la plupart des entités et ne restaure que celles de la map. Tu recrées donc les spawns Lua dans le hookPostCleanupMap.- Les coordonnées valent pour exactement une version de la map. Après une mise à jour, tu vérifies chaque position.
- Lua ne modifie pas la géométrie. Une salle de spawn étroite reste étroite.
Questions fréquentes
Une map peut-elle utiliser les mêmes spawns pour Sandbox, DarkRP et TTT ?
Oui, avec info_player_deathmatch. Le mode de jeu de base accepte cette classe tout comme info_player_start, et la documentation de TTT la cite comme l’entité de spawn habituelle. Si tu mélanges les deux classes, Sandbox et DarkRP utilisent tous les spawns, TTT seulement les info_player_deathmatch.
Pourquoi des joueurs meurent-ils au spawn sans que personne ne tire ?
C’est la dernière tentative forcée de la sélection de spawn : GMod tue le joueur qui gêne. Davantage de spawns, plus espacés, règlent le problème.
Les spawns DarkRP restent-ils valables après une mise à jour de la map ?
Seulement si le nom de fichier reste le même, car les positions sont liées au nom de la map. Même dans ce cas, tu dois les vérifier, car des pièces ont pu être déplacées.