Files
Viano-Core/docs/vehicle-nodes.md
T
Nico 4474714c00
GCC PCH / build (push) Canceled after 0s
clang PCH / build (push) Canceled after 0s
Support interactive object portals and document travel route recording
Bind directed portal_use edges to native GameObject spawns and spell destinations. Execute normal clicks and verify completed clientless teleports, with regression coverage. Document live portal tests, mage tower calibration, Badlands portals and transport recording workflows.
2026-10-26 14:01:42 +01:00

14 KiB
Raw Blame History

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:

.clientless transport services
.clientless transport services <spawnId>

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:

.clientless transport near 50
.clientless transport inspect <spawnId>

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:

.clientless node list_nearby 30

Beispiel für eine neue Schiffsverbindung mit frei gewählten Namen:

.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.

<spawnId> vor Ausführung durch die ermittelte Zahl ersetzen:

.clientless transport record start ship_hafen_a <spawnId>

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:

.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:

.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:

.clientless node add ship_hafen_b ship

Beim nächsten geeigneten Halt von B wieder auf dasselbe Fahrzeug gehen:

.clientless transport record start ship_hafen_b <spawnId>

Zum selben lokalen Deckplatz laufen und mit demselben Standnamen speichern:

.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:

.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:

.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:

.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:

.clientless route start stadt_knoten_a ship_hafen_a

Am Haltestellen-Node auf festem Boden stoppen:

.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.

.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:

.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:

.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:

.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:

.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:

.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:

.clientless transport stand list <entryId>
.clientless transport stand remove <entryId> <standName>

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:

.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:

clientless transport services
clientless transport services <spawnId>
clientless transport node ship_hafen_a
clientless transport inspect <spawnId> 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, Schiff Sturmwind–Rut’theran, Transport-Grid-Lifecycle.