Server & Community

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_start und gmod_player_start
  • info_player_deathmatch
  • info_player_combine und info_player_rebel aus Half-Life 2: Deathmatch
  • info_player_terrorist und info_player_counterterrorist aus Counter-Strike: Source
  • info_player_teamspawn aus Team Fortress 2
  • weitere Klassen aus anderen Source-Spielen, etwa info_player_allies und info_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:

  1. Trägt mindestens ein Spawn das Flag „Master“ (Spawnflag 1), nimmt GMod immer den ersten Spawn mit diesem Flag und überspringt die Zufallsauswahl.
  2. 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.
  3. 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.
  4. 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_start zeigt, 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

SpielmodusSpawn-Entity in der MapZusätzlich nötigWenn es fehlt
Sandboxinfo_player_startnichtsin der Regel Spawn am Nullpunkt, bei zu wenigen Spawns Tode am Spawn
DarkRPinfo_player_startJail-Positionen, optional Job-Spawns, beides im Spiel gesetztohne Jail-Position keine Verhaftung
TTTinfo_player_deathmatchWaffen- und Munitions-EntitiesFehler 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 Beispiel cp. Die Befehle sind Admins vorbehalten.
  • /jailpos ersetzt alle Jail-Positionen durch deinen Standort, /addjailpos ergänzt eine weitere. Das darf ein Admin und, solange GM.Config.chiefjailpos aktiv 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

EntityZweckHinweis
lua_runführt Lua-Code aus (Keyvalue Code, Inputs RunCode und RunPassedCode)der Map Scanner meldet es als riskantes Entity
env_skypaintsteuert die Farben des Himmelssetzt in den Map Properties das Skybox-Material painted voraus
func_nav_blocker, func_nav_avoid, func_nav_prefersperrt Navmesh-Flächen oder gewichtet siebetrifft nur Bots, die das Navmesh nutzen, siehe Navmesh und AI-Nodes
trigger_catapultschleudert Spieler und PhysikobjekteGeschwindigkeit getrennt über playerSpeed und physicsSpeed
beam_spotlightScheinwerfer mit sichtbarem Strahlrein 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.CleanUpMap entfernt die meisten Entities und stellt nur die der Map wieder her. Per Lua erzeugte Spawns legst du deshalb im Hook PostCleanupMap neu 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.