# Fahrzeug-Haltestellen und Reiseverbindungen aufnehmen Anleitung für den Vcore-Testserver, Stand 26.10.2026. Für Schiffe, Zeppeline, Tiefenbahn und unterstützte Fahrstühle. Gemeint sind native Transportobjekte, keine NPC-Fahrzeuge, Reittiere oder Flugtaxen. Die Aufnahme erfolgt mit einem eingeloggten GM im Spiel. Alle Beispiele mit `.clientless` gehören in den Spielchat. Diagnose- und Testbefehle sind teilweise auch in der Worldserver-Konsole verfügbar; dort den führenden Punkt weglassen. Eine neue Verbindung benötigt keinen Build und normalerweise keinen Neustart. ## Grundprinzip Pro physischer Haltestelle gibt es **einen gemeinsamen Node für Ein- und Ausstieg**, auf festem Boden unmittelbar vor dem Übergang zum Fahrzeug. Auf dem Deck wird kein zusätzlicher TravelGraph-Node angelegt. Für eine Verbindung A ↔ B werden aufgenommen: 1. Haltestellen-Node A und dessen kurzer Weg vom Land zum Deck-Stehplatz. 2. Haltestellen-Node B und dessen kurzer Weg zum selben Deck-Stehplatz. 3. Eine Fahrtkante zwischen A und B. 4. Bei Bedarf separate Groundwege vom übrigen Reisenetz zu A und B. Die eigentliche Fahrt wird nicht aufgezeichnet. Der Bot fährt als Passenger mit dem normalen Fahrzeug. Zum Aussteigen läuft er die jeweilige Land-Deck-Aufnahme rückwärts ab. Deshalb müssen diese Wege in beiden Laufrichtungen begehbar sein. | Verkehrsmittel | Node- und Fahrtkantentyp | | --- | --- | | Schiff | `ship` | | Zeppelin | `zeppelin` | | Tiefenbahn | `tram` | | Fahrstuhl | `elevator` | ## 1. Fahrzeug und Halte bestimmen Für Schiffe und Zeppeline lassen sich die konfigurierten nativen Dienste ortsunabhängig auflisten: ```text .clientless transport services .clientless transport services ``` Die Detailausgabe nennt tatsächliche Halte, Karten und Haltezeiten. Historische Fahrzeugnamen können veraltete Zielorte enthalten. Die ausgegebene Dockposition ist der Fahrzeugursprung und **nicht** die Position für den Haltestellen-Node. `services` listet nicht sämtliche Fahrstühle oder Tiefenbahnwagen auf. Vor Ort das gewünschte Fahrzeug untersuchen: ```text .clientless transport near 50 .clientless transport inspect ``` Entscheidend sind: - `spawn`: das konkrete Fahrzeug bzw. der konkrete Wagen; diese ID für `record start` verwenden. - `entry`: Fahrzeugmodell/-vorlage; wird beispielsweise für `stand list` verwendet. - `stopped=1`: Fahrzeug steht laut serverseitiger Bewegung. - `remainingPause`: verbleibende Haltezeit in Millisekunden. **Spawn-ID und Entry-ID nicht verwechseln.** Beide Haltestellen einer Verbindung müssen dasselbe konkrete Fahrzeug verwenden. Bei der Tiefenbahn also auch denselben Wagen. Bei einem nativen Kartenwechsel bleibt die Spawn-ID gleich. Für reine Patrouillen ohne geeignete Halte keine reguläre Passagierverbindung anlegen. Vor Beginn mindestens einen Umlauf beobachten und beide Einstiege prüfen. Fahrstühle sind noch nicht als konkrete Verbindung live abgenommen; ihre Unterstützung muss je Objekt überprüft werden. ## 2. Haltestellen-Node A anlegen Auf festem Boden direkt vor Rampe, Steg oder Plattform stehen. Der Node muss auch bei abwesendem Fahrzeug sicher erreichbar sein. Vorher vorhandene Nodes prüfen, damit keine doppelte Haltestelle entsteht: ```text .clientless node list_nearby 30 ``` Beispiel für eine **neue** Schiffsverbindung mit frei gewählten Namen: ```text .clientless node add ship_hafen_a ship .clientless transport node ship_hafen_a ``` Die Beispielnamen `ship_hafen_a`, `ship_hafen_b` und `mein_schiff_deck` sind Platzhalter für deine neue Verbindung. Namen eindeutig wählen, ohne Leerzeichen, zum Beispiel mit Kleinbuchstaben, Ziffern und Unterstrichen. Für andere Verkehrsmittel Namen und Nodetyp entsprechend ändern. ## 3. An A den Weg Land → Deck aufnehmen Auf eine frische Ankunft warten. Zu Fuß am Node stehen, noch nicht Passenger. Der Start erlaubt höchstens **2 Yards Abstand zum Node**. Das Fahrzeug muss auf derselben Karte und in derselben Phase geladen sein und stillstehen. `` vor Ausführung durch die ermittelte Zahl ersetzen: ```text .clientless transport record start ship_hafen_a ``` Jetzt normal an Bord gehen und einen sicheren, ebenen Deckplatz aufsuchen. Einen kurzen Weg ohne Sprünge, Flug, Teleport oder Hindernisse wählen. Dann noch während **desselben Halts** speichern: ```text .clientless transport record stop mein_schiff_deck ``` `stop` speichert den Übergang und legt den benannten Deck-Stehplatz bei Bedarf an. Der Standname bezeichnet eine Position relativ zum Fahrzeugmodell. Diesen Platz an der Gegenhaltestelle wieder verwenden. Optionale Befehle während der Aufnahme: ```text .clientless transport record info .clientless transport record mark .clientless transport record cancel ``` `info` zeigt Punkte, Länge, Passenger-Status und Fehler. `mark` erzwingt einen zusätzlichen Punkt, beispielsweise an einer engen Kurve. Die automatische Aufnahme läuft alle 100 ms mit mindestens 0,75 Yards Punktabstand; der Übergang zum Passenger wird automatisch markiert. Die Aufnahme wird ungültig, wenn das Fahrzeug abfährt, der Recorder das Fahrzeug nach dem Einstieg wieder verlässt oder wechselt, ein Positionssprung über 8 Yards entsteht oder der Übergang länger als 60 Yards wird. Fehler mit `info` ansehen, danach mit `cancel` verwerfen und beim nächsten vollständigen Halt neu beginnen. Ein Logout oder Serverneustart verliert ungespeicherte Aufnahmen; jede Haltestelle zuerst erfolgreich speichern. ## 4. An B denselben Deckplatz aufnehmen Mit genau diesem Fahrzeug zur anderen Haltestelle fahren. Dort aussteigen und auf festem Boden unmittelbar vor dem Übergang Node B anlegen: ```text .clientless node add ship_hafen_b ship ``` Beim nächsten geeigneten Halt von B wieder auf dasselbe Fahrzeug gehen: ```text .clientless transport record start ship_hafen_b ``` Zum selben lokalen Deckplatz laufen und mit demselben Standnamen speichern: ```text .clientless transport record stop mein_schiff_deck .clientless transport stops ``` Ist der Stand bereits gespeichert, muss man beim Speichern höchstens 1,5 Yards davon entfernt stehen. Die beiden aufgezeichneten Deck-Endpunkte müssen außerdem innerhalb von 3 Yards liegen. Es wird kein unbekannter Weg quer über das Deck zwischen unterschiedlichen Standorten ergänzt. Optional kann der Deckplatz schon vor der ersten Aufnahme gespeichert werden, indem man an Bord am gewünschten Platz steht: ```text .clientless transport stand add mein_schiff_deck .clientless transport stand list ``` Das ist nicht erforderlich, wenn `record stop` den Stand bereits angelegt hat. Ein vorhandener Standname wird nicht überschrieben. ## 5. Fahrtkante erstellen Nach beiden erfolgreich gespeicherten Aufnahmen: ```text .clientless transport link ship_hafen_a ship_hafen_b ship 100 both ``` `both` erstellt eine bidirektionale Kante. Nur verwenden, wenn das Fahrzeug beide Richtungen tatsächlich bedient. Ohne `both` gilt ausschließlich A → B: ```text .clientless transport link ship_hafen_a ship_hafen_b ship 100 ``` `100` ist ein positiver **Graphkostenwert**, keine Fahrzeit in Sekunden. Er eignet sich als vorläufiger Wert für einen isolierten Funktionstest. Bei konkurrierenden Fernrouten die Kosten später passend abstimmen. Der Link prüft kompatible Aufnahmen, dieselbe Spawn-ID und denselben Entry, unterschiedliche Halte und passende Deck-Endpunkte. `tram`/`elevator` erwarten GameObject-Typ 11, `ship`/`zeppelin` Typ 15. Eine bereits gleichgerichtet vorhandene Kante wird nicht überschrieben. Erfolgreiches Speichern und Verknüpfen laden die betreffenden Daten automatisch neu. ## 6. Groundanschlüsse getrennt aufnehmen Der Transportlink verbindet die beiden Haltestellen miteinander, nicht zugleich mit dem übrigen Reisenetz. Für einen fehlenden Landanschluss beide Nodes vorher anlegen bzw. einen bestehenden Stadtnode verwenden. Beispiel: am bestehenden Node `stadt_knoten_a` anfangen und bis zur Haltestelle laufen: ```text .clientless route start stadt_knoten_a ship_hafen_a ``` Am Haltestellen-Node auf festem Boden stoppen: ```text .clientless route stop ``` Der Groundrecorder speichert bidirektional und lädt den Graph neu. Möglichst exakt an den Nodes beginnen und enden, damit die angehängten Endstücke keine Hindernisse schneiden. Diese Aufnahme endet **vor** dem Einstieg ins Fahrzeug; Land-Deck-Übergang und Fahrt werden separat wie oben erfasst. Auf Seite B entsprechend verfahren. Vollständig geprüfte MMAP-Anschlüsse können eine Groundaufnahme ersetzen, müssen aber für die konkrete Route funktionieren. ## 7. Botfahrt prüfen Mit einem online befindlichen, untätigen Clientless-Bot an A testen. Die Zahl `26` ist Arthorans Charakter-GUID und bei einem anderen Bot zu ersetzen. Sein Login-Lua darf nicht gleichzeitig andere Reisen starten. ```text .clientless transport travel 26 ship_hafen_b .clientless transport status 26 .clientless actioninfo 26 ``` `travel` stellt einen normalen Reiseauftrag in die Aktionswarteschlange; es unterbricht keine laufende Aktion. Nach Abschluss die Gegenrichtung testen: ```text .clientless transport travel 26 ship_hafen_a ``` Eine funktionierende Fahrt durchläuft `Waiting` → `Boarding` → `Riding` → `Leaving` → `Arrived`. Prüfen, dass der Bot wirklich Passenger wird, einen gegebenenfalls nötigen Kartenwechsel abschließt, am Ziel aussteigt und den Landnode erreicht. Anschließend auch eine Reise mit Groundanschluss testen. Ein gespeicherter Link allein bestätigt noch keine funktionierende Botfahrt. Abbruch einer bereits laufenden Transportfahrt: ```text .clientless transport cancel 26 ``` An Bord bleibt der Bot zunächst Passenger und versucht einen sicheren Ausstieg an einer aufgezeichneten Haltestelle. Das ist kein sofortiges Abspringen und kein allgemeines Leeren der Aktionswarteschlange. ## Aufnahmen korrigieren **Nur die gespeicherte Land-Deck-Aufnahme ersetzen:** ```text .clientless transport forget ship_hafen_a ``` Danach an A erneut `record start` und `record stop` ausführen. `forget` entfernt nur diese Übergangsaufnahme. Node, Groundkanten, Fahrtkante und benannte Deck-Stehplätze bleiben bestehen. Unvollständige Transportverbindungen werden währenddessen nicht geplant. Bleiben die Endpunkte kompatibel, muss die bestehende Fahrtkante nicht erneut angelegt werden. **Haltestellen-Node verschieben:** am neuen festen Boden stehen und ausführen: ```text .clientless node move ship_hafen_a ``` Danach die betroffene Transportaufnahme mit `forget` und neuer Aufnahme ersetzen. Angeschlossene Groundwege ebenfalls prüfen und gegebenenfalls neu aufnehmen; sie passen sich nicht automatisch an die neue Position an. **Falsche Fahrtkante entfernen:** ```text .clientless route remove ship_hafen_a ship_hafen_b ``` Dieser Befehl entfernt **alle Kanten zwischen diesen beiden Nodes in beiden Richtungen**, unabhängig vom Kantentyp. Daher nur verwenden, wenn genau diese Verbindungen entfernt werden sollen. Haltestellen-Aufnahmen und Nodes bleiben erhalten. Anschließend die gewünschte Fahrtkante mit `transport link` neu anlegen. **Deckplätze prüfen oder einen unbenutzten Stand entfernen:** ```text .clientless transport stand list .clientless transport stand remove ``` Ein von einer Haltestellen-Aufnahme verwendeter Stand kann nicht entfernt werden. Eine Änderung des gemeinsamen Deckplatzes erfordert passende neue Aufnahmen an beiden Haltestellen. ## Diagnose und häufige Fehler | Meldung oder Symptom | Nächster Schritt | | --- | --- | | Abstand zum Node zu groß | Auf festem Boden bis auf höchstens 2 Yards an den Node zurückgehen. | | Recorder bereits Passenger | Aussteigen; Aufnahme muss auf festem Boden beginnen. | | Spawn nicht geladen | Spawn-ID, Karte und Phase prüfen; Fahrzeug vor Ort aufsuchen. | | Fahrzeug bewegt sich / Aufnahme nach Abfahrt ungültig | `record cancel`, nächsten vollständigen Halt abwarten. | | Dock bereits aufgenommen | Bestehende Daten mit `stops` prüfen; nur für einen beabsichtigten Ersatz `forget` verwenden. | | Standname an anderer Deckposition vorhanden | Zum ursprünglichen Stand gehen; alternativ neuen Namen und kompatible Aufnahmen verwenden. | | Link abgelehnt | Zwei gespeicherte Halte, gleicher Spawn/Entry, kompatible Deck-Endpunkte und richtigen Kantentyp prüfen. | | Bot wartet dauerhaft | Richtigen Spawn, tatsächliche Halte, Dockposition und `status` prüfen. | | Fahrt klappt, Weiterreise nicht | Groundanschluss der Haltestelle separat prüfen bzw. aufnehmen. | Weitere Befehle: ```text .clientless transport stops .clientless transport node ship_hafen_a .clientless transport reload ``` `reload` lädt Transportdaten und TravelGraph neu. Laufende Fahrten behalten jedoch ihre beim Start erfassten Definitionen. Änderungen deshalb mit einem neuen Reiseauftrag testen. Konsolenbeispiele ohne Punkt; für räumliche Diagnose ist ein online befindlicher Bot als Beobachter auf der betreffenden Karte nötig: ```text clientless transport services clientless transport services clientless transport node ship_hafen_a clientless transport inspect 26 clientless transport near 50 26 clientless transport stops clientless transport status 26 ``` `remainingPause=4294967295` bezeichnet einen Halt ohne bekannte zeitliche Begrenzung. Zustandswechsel und Aufnahmefehler stehen in `adventurebot-navigation.log` im Arbeitsverzeichnis des Test-worldservers. ## Bestehende Beispiele Diese Namen und IDs gehören bereits erfassten Verbindungen; nicht als neue Haltestellen doppelt anlegen oder zum Üben überschreiben: | Verbindung | Haltestellen | Fahrzeug | | --- | --- | --- | | Sturmwind ↔ Rut’theran, The Bravery | `ship_sw_br` ↔ `ship_ruttheran_br` | Spawn 2, Entry 176310, Stand `bravery_center` | | Tiefenbahn | `tram_sw` ↔ `tram_if` | Im dokumentierten Fahrtest Wagen-Spawn 18803; bestehende Aufnahme mit `stops` prüfen. | Bei der Tiefenbahn gibt es mehrere Wagen mit verschiedenen Spawn-IDs; deren Aufnahmen nicht mischen. Die kurzen Haltefenster erfordern einen kurzen Einstiegsweg und zügiges Speichern. Weiterführend: [technische Transportdokumentation](../doc/clientless/transport-tools.md), [Schiff Sturmwind–Rut’theran](../doc/clientless/ship-stormwind-ruttheran.md), [Transport-Grid-Lifecycle](../doc/clientless/transport-grid-lifecycle.md).