Spawnpunkte in GMod-Maps: Entities für Sandbox, DarkRP und TTT
Welche Spawnpunkte eine GMod-Map für Sandbox, DarkRP und TTT braucht, wie GMod den Spawn auswählt und was passiert, wenn Spawns fehlen oder zu wenige sind.
Für Sandbox und DarkRP braucht eine Map mehrere info_player_start, für TTT info_player_deathmatch, jeweils mindestens so viele, wie Spieler gleichzeitig spawnen können. Job-Spawns und Jail-Positionen von DarkRP stehen nicht in der Map. Admins setzen sie im Spiel, und der Server speichert sie in seiner Datenbank. Fehlen Spawn-Entities ganz, landen Spieler in der Regel am Nullpunkt der Map. Sind es zu wenige, tötet die Spawn-Logik Spieler, die auf einem Spawn stehen.
Wie GMod einen Spawnpunkt auswählt
Die Auswahl steckt in Lua, in der Funktion GM:PlayerSelectSpawn des Base-Gamemodes (gamemodes/base/gamemode/player.lua). Sandbox übernimmt sie unverändert, DarkRP ruft sie auf und ergänzt sie, TTT ersetzt sie durch eine eigene. Beim ersten Spawn sammelt die Funktion alle Entities dieser Klassen:
info_player_startundgmod_player_startinfo_player_deathmatchinfo_player_combineundinfo_player_rebelaus Half-Life 2: Deathmatchinfo_player_terroristundinfo_player_counterterroristaus Counter-Strike: Sourceinfo_player_teamspawnaus Team Fortress 2- weitere Klassen aus anderen Source-Spielen, etwa
info_player_alliesundinfo_player_axis
In einem Spielmodus ohne Teams sind alle gleichwertig. Deshalb funktionieren die Spawns von Maps aus anderen Spielen in Sandbox ohne Umbau. In Hammer kennt GMods eigene FGD nur info_player_start. info_player_deathmatch liefert die ttt.fgd aus dem Ordner gamemodes/terrortown.
Danach läuft die Auswahl so ab:
- Trägt mindestens ein Spawn das Flag „Master“ (Spawnflag 1), nimmt GMod immer den ersten Spawn mit diesem Flag und überspringt die Zufallsauswahl.
- Sonst zieht die Funktion zufällig einen Spawn, und zwar so oft, wie es Spawns gibt. Ein Spawn außerhalb der Welt wird übersprungen. Dasselbe gilt für den zuletzt benutzten Spawn und für den, an dem dieser Spieler zuletzt gespawnt ist, solange die Map mehr als einen Spawn hat.
- Für jeden Kandidaten prüft
GM:IsSpawnpointSuitable, ob in einer Box von 32 × 32 × 64 Units am Spawn ein lebender Spieler steht. Ist die Box frei, spawnt der Spieler dort. - Der letzte Versuch wird erzwungen. Jeder Spieler, der in der Box steht, wird getötet.
Die Blickrichtung übernimmt der Spieler aus den Angles des Entities.
Wie viele Spawns eine Map braucht
Daraus folgen die Regeln für Mapper:
- Mindestens so viele Spawns wie Slots, besser mehr. Die Funktion zieht mit Wiederholung und probiert nicht jeden Spawn genau einmal. Je mehr freie Spawns es gibt, desto seltener kommt es zum erzwungenen letzten Versuch.
- Ein einzelner Spawn ist der schlechteste Fall. Der erste Versuch ist dann zugleich der letzte. Wer auf dem Spawn steht, stirbt, sobald ein anderer Spieler spawnt.
- Abstand halten. Die Prüfbox ist 32 Units breit. Stehen zwei Spawns enger beieinander, blockiert ein Spieler auf dem einen auch den anderen.
- Kein Master-Flag auf Mehrspieler-Maps. Das Flag ist für Einzelspieler-Maps gedacht. Ist es gesetzt, spawnen alle an diesem Punkt, und wer dort steht, wird jedes Mal getötet.
- Frei im Raum platzieren. Das Modell, das Hammer für
info_player_startzeigt, ist ungefähr so groß wie ein Spieler. Du siehst also, ob ein Spieler dort Platz hat.
Trifft der letzte Versuch den zuletzt benutzten Spawn, entfällt die Prüfung, und die Funktion gibt ihn trotzdem zurück. Steht dort noch ein Spieler, stecken beide ineinander.
Gibt es gar kein Spawn-Entity, schreibt der Base-Gamemode [PlayerSelectSpawn] Error! No spawn points! in die Konsole und gibt keinen Spawn zurück. Laut dem Wiki der Valve Developer Community setzen Source-Spiele den Spieler dann in der Regel an den Nullpunkt der Map (0 0 0). Der Map Scanner prüft bei einer BSP, ob ein Spawnpoint vorhanden ist.
Sandbox, DarkRP und TTT im Vergleich
| Spielmodus | Spawn-Entity in der Map | Zusätzlich nötig | Wenn es fehlt |
|---|---|---|---|
| Sandbox | info_player_start | nichts | in der Regel Spawn am Nullpunkt, bei zu wenigen Spawns Tode am Spawn |
| DarkRP | info_player_start | Jail-Positionen, optional Job-Spawns, beides im Spiel gesetzt | ohne Jail-Position keine Verhaftung |
| TTT | info_player_deathmatch | Waffen- und Munitions-Entities | Fehler No spawn entity found!, bei zu wenigen Spawns provisorische Spawns |
DarkRP basiert auf Sandbox und ruft zuerst die Auswahl des Base-Gamemodes auf. Die Map braucht also normale Spawn-Entities. Danach ersetzt DarkRP nur die Position:
/setspawn <Job>ersetzt alle Spawns eines Jobs durch deinen Standort,/addspawn <Job>fügt einen hinzu,/removespawn <Job>löscht sie.<Job>ist der Befehlsname des Jobs, zum Beispielcp. Die Befehle sind Admins vorbehalten./jailposersetzt alle Jail-Positionen durch deinen Standort,/addjailposergänzt eine weitere. Das darf ein Admin und, solangeGM.Config.chiefjailposaktiv ist, der Police Chief.
DarkRP speichert diese Positionen in der Server-Datenbank unter dem Namen der Map. Bekommt die BSP einen neuen Dateinamen, findet DarkRP sie nicht mehr. Ohne Jail-Position verweigert DarkRP Verhaftungen mit You cannot arrest people since there are no jail positions set!. Vor dem Absetzen sucht DarkRP rund um das Ziel eine freie Stelle, bis zu 600 Units entfernt. Die Tötungslogik des Base-Gamemodes läuft trotzdem vorher, denn das Spawn-Entity wird zuerst gewählt. Auch eine DarkRP-Map braucht deshalb genug info_player_start. Was sie darüber hinaus mitbringen sollte, steht in DarkRP-Map auswählen und im Überblick über RP-Map-Typen.
TTT sammelt info_player_deathmatch und die Team-Spawns anderer Spiele. info_player_start nutzt es nur, wenn nichts anderes vorhanden ist, und die TTT-Dokumentation rät davon ab. Reichen die Spawns nicht, erzeugt TTT provisorische Spawns 36 Units neben vorhandenen und meldet TTT WARNING: Map has too few spawn points. Lass deshalb um jeden Spawn Platz: TTT prüft nur, ob die Stelle innerhalb der Welt liegt und ob dort kein Spieler steht. Über einem Abgrund spawnt der Spieler in der Luft. Waffen kommen über ttt_random_weapon, ttt_random_ammo oder feste Waffenklassen in die Map. Alles Weitere steht in TTT-Maps bauen.
Entities aus garrysmod.fgd, die oft übersehen werden
| Entity | Zweck | Hinweis |
|---|---|---|
lua_run | führt Lua-Code aus (Keyvalue Code, Inputs RunCode und RunPassedCode) | der Map Scanner meldet es als riskantes Entity |
env_skypaint | steuert die Farben des Himmels | setzt in den Map Properties das Skybox-Material painted voraus |
func_nav_blocker, func_nav_avoid, func_nav_prefer | sperrt Navmesh-Flächen oder gewichtet sie | betrifft nur Bots, die das Navmesh nutzen, siehe Navmesh und AI-Nodes |
trigger_catapult | schleudert Spieler und Physikobjekte | Geschwindigkeit getrennt über playerSpeed und physicsSpeed |
beam_spotlight | Scheinwerfer mit sichtbarem Strahl | rein clientseitig, nicht zwischen Clients synchronisiert |
Was Serverbetreiber ohne Recompile ändern können
Fehlen einer gekauften Map Spawns, lässt sich das auf dem Server lösen. In DarkRP genügen die Chat-Befehle oben. TTT lädt ein Rearm-Skript maps/<mapname>_ttt.txt, das Waffen und mit der Einstellung replacespawns auch die Spawns ersetzt, solange ttt_use_weapon_spawn_scripts aktiv ist. Für alle anderen Fälle erzeugst du per Lua zusätzliche Spawn-Entities. Die Koordinaten liest du im Spiel mit getpos ab. Der Befehl gibt die Position der Augen aus, zieh bei einem stehenden Spieler also 64 Units vom Z-Wert ab. Die Datei gehört nach 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 )
Die Grenzen dieses Wegs:
- Der Base-Gamemode merkt sich die Spawn-Liste nach dem ersten Spawn. Neue Entities müssen vorher existieren, daher
InitPostEntity. game.CleanUpMapentfernt die meisten Entities und stellt nur die der Map wieder her. Per Lua erzeugte Spawns legst du deshalb im HookPostCleanupMapneu an.- Die Koordinaten gelten für genau eine Version der Map. Nach einem Update prüfst du jede Position.
- Geometrie ändert Lua nicht. Ein zu enger Spawn-Raum bleibt eng.
Häufige Fragen
Kann eine Map für Sandbox, DarkRP und TTT dieselben Spawns nutzen?
Ja, mit info_player_deathmatch. Der Base-Gamemode akzeptiert die Klasse ebenso wie info_player_start, und die TTT-Dokumentation nennt sie als übliches Spawn-Entity. Mischst du beide Klassen, nutzen Sandbox und DarkRP alle Spawns, TTT nur die info_player_deathmatch.
Warum sterben Spieler am Spawn, ohne dass jemand schießt?
Das ist der erzwungene letzte Versuch der Spawn-Auswahl: GMod tötet den Spieler, der im Weg steht. Mehr Spawns mit mehr Abstand beheben das.
Gelten DarkRP-Spawns nach einem Map-Update weiter?
Nur wenn der Dateiname gleich bleibt, denn die Positionen hängen am Namen der Map. Auch dann musst du sie prüfen, weil sich Räume verschoben haben können.