# HOF-Verwaltung > Übersetzung der [englischen Originalseite](https://github.com/OmsiModsBR/OmsiLaunch/blob/63ccaf8cfc6c6d24a829d5e7a2a36ecc795e2744/docs/reference/hof-management.md) für OmsiLaunch 0.1.0-beta4. Maßgeblich ist die englische Seite: Bei Abweichungen gelten die englische Seite und der Code. OMSI liest die HOF-Dateien (`*.hof`: Ziele, Liniennummern und Haltestellenlisten, die das IBIS bzw. die Zielanzeige des Fahrzeugs anzeigt) aus dem Ordner jedes Fahrzeugs. Die HOF-Verwaltung kopiert HOF-Dateien **für die Dauer einer Sitzung** in Fahrzeugordner: Eine Karte oder ein Add-on kann die HOFs mitliefern, die ihre Linien benötigen, und ein Anwender kann die HOFs eines Fahrzeugs für andere Fahrzeuge wiederverwenden, ohne ein Fahrzeug dauerhaft zu verändern. Diese Seite ist die normative Referenz, wie sie durch `HofPlanner` in `src/OmsiLaunch.Core/HofPlanner.cs`, das Feld `HofManagement` der [LaunchSpec](https://omsilaunch.omsimods.com.br/de/docs/reference/launchspec/index.md), die [CLI](https://omsilaunch.omsimods.com.br/de/docs/reference/cli/index.md)-Flags `/hof-source`, `/hof-target`, `/hof-file` und `/hof-mode` sowie den `hofs`-Block der [Sitzungsprofile](https://omsilaunch.omsimods.com.br/de/docs/reference/session-profiles/index.md) implementiert wird. Stabilität: `STABLE_BETA` für Planung, Konfliktregeln, Eingrenzung und transaktionale Wiederherstellung (Offline-Gates `hof.plan-sources-and-modes`, `hof.plan-rejects-unsafe-input`, `hof.transaction-exact-restore`, `hof.recovery-after-crash`, `session-profiles.hofs`). Zur Laufzeit validiert: eine Spiegelungssitzung mit exakter Wiederherstellung und Absturz-Recovery über `/recover` (siehe [Status der Runtime-Validierung](https://omsilaunch.omsimods.com.br/de/docs/status/runtime-validation-status/index.md)). Die HOF-Verwaltung ist nicht dasselbe wie `PlayerVehicle.Hof` / `/hof:`; dieses wählt beim Start den HOF des Spielerfahrzeugs aus und ist in diesem Build `UNAVAILABLE`. ## Modell Eine Anfrage ist eine Liste von Operationen (`HofManagementSpec.Operations`). Jede `HofOperationSpec` hat: | Feld | Bedeutung | | --- | --- | | `SourceKind`, `Source` | Woher die HOF-Dateien stammen (Tabelle unten). | | `TargetVehicles` | Ein oder mehrere installierte Fahrzeuge: die Identität einer `.bus`- oder `.ovh`-Datei (`Vehicles\MAN_SD200\MAN_SD77.bus`) oder eines Fahrzeugordners (`Vehicles\MAN_SD200`), jeweils unterhalb von `Vehicles\`. Mehrere Identitäten in einem Ordner adressieren diesen Ordner nur einmal. | | `Mode` | `Add` (Standard): Die Quell-HOFs werden in jeden Zielordner kopiert; andere HOFs dort bleiben erhalten. `Mirror`: Die Quell-HOFs werden kopiert und jede andere `.hof`-Datei des Zielordners wird für die Sitzung entfernt, sodass die HOF-Menge des Ordners der Quellmenge entspricht. | | `Files` | Optionale Liste von Dateinamen, die aus der Quelle übernommen werden (ohne Beachtung der Groß-/Kleinschreibung). Fehlt sie: jede `*.hof`-Datei direkt in der Quelle. Ein aufgeführter Name, den die Quelle nicht enthält: `OL_E_HOF_SOURCE_NOT_FOUND`. | | `SourceKind` | `Source` | Wird aufgelöst zu | | --- | --- | --- | | `Collection` | ein einfacher Name, z. B. `berlin` | `\.omsilaunch\hof\\*.hof`: eine vom Anwender oder einem Werkzeug gepflegte Sammlung. | | `Directory` | ein installationsrelatives Verzeichnis, z. B. `maps\RMG Leste\hof` | `*.hof` in diesem Verzeichnis: HOFs, die neben Karten- oder Add-on-Inhalten ausgeliefert werden. | | `Vehicle` | eine Fahrzeugidentität oder ein Fahrzeugordner, wie bei Zielen | `*.hof` im Ordner dieses Fahrzeugs: Die HOFs eines Fahrzeugs werden für andere wiederverwendet. | | `File` | eine installationsrelative `.hof`-Datei | genau diese eine Datei. | Es werden nur Dateien verwendet, die direkt im Quellverzeichnis liegen (keine Rekursion). Symbolischen Links und Junctions wird niemals gefolgt (siehe [Eingrenzung](#confinement)). ## Was eine Sitzung tut 1. **Planung** (`PlanSessionAsync`, `/plan`). Jede Operation wird aufgelöst: Quellen werden gelesen, Ziele werden geprüft, Konflikte werden erkannt. Jede Datei, die sich ändern wird, erscheint in `SessionPlan.PlannedMutations` mit `SemanticKey` `hof.add` oder `hof.mirror`, `RequestedValue` = der Quellidentität und `Operation` `exact-file-overlay` (geschrieben) oder `session-deletion` (durch eine Spiegelung entfernt); die Pfade sind Teil von `TouchedFiles`. Ein Problem macht den Plan mit den unten aufgeführten Codes nicht ausführbar. 2. **Start**. Nachdem ein veraltetes Journal wiederhergestellt wurde, werden die Operationen erneut anhand der aktuellen Dateien aufgelöst und an die Sitzungstransaktion übergeben: Geschriebene Dateien sind Overlays, durch Spiegelung entfernte Dateien sind Sitzungslöschungen. Eine Zieldatei, deren Bytes bereits der Quelle entsprechen, bleibt unberührt und ist kein Transaktionseintrag. 3. **Sitzungsende, Fehler, Absturz.** Die Transaktion stellt jeden Zielordner exakt wieder her: Vorhandene Dateien erhalten ihre ursprünglichen Bytes, Zeitstempel und Attribute zurück; von der Sitzung erstellte Dateien werden entfernt; durch Spiegelung entfernte Dateien kehren zurück. Nach einem Absturz des Eigentümers läuft dieselbe Wiederherstellung beim nächsten Start oder über `/recover` (siehe [Transaktionen und Recovery](https://omsilaunch.omsimods.com.br/de/docs/concepts/transactions-and-recovery/index.md)). Außerhalb der Zielordner wird nichts geschrieben. Quelldateien werden nur gelesen. `.omsilaunch\hof\` wird von einer Sitzung niemals verändert. ## Konfliktregeln Operationen werden der Reihe nach angewendet und müssen übereinstimmen: - Zwei Operationen, die dieselbe Zieldatei mit denselben Bytes schreiben, werden zusammengeführt; bei unterschiedlichen Bytes: `OL_E_HOF_CONFLICT`. - Eine Spiegelung, die eine Datei entfernen würde, die eine frühere Operation schreibt, oder eine Operation, die eine Datei schreibt, die eine frühere Spiegelung entfernt: `OL_E_HOF_CONFLICT`. - Eine Spiegelung umfasst die HOF-Menge des Ordners für die Sitzung: die vorhandenen Dateien plus die Dateien, die frühere Operationen dort schreiben. - Ein HOF-Ziel, das auch von der Sitzungsdarstellung (Startbild oder Internettexturen) geschrieben wird: `OL_E_HOF_CONFLICT` (kann mit den aktuellen Darstellungspfaden, die außerhalb von `Vehicles\` liegen, nicht auftreten). - Wenn ein Ziel bereits eine Datei mit demselben Namen in anderer Groß-/Kleinschreibung enthält, wird die vorhandene Schreibweise beibehalten. ## Eingrenzung Jede Quelle und jedes Ziel muss innerhalb der Installation bleiben: Absolute Pfade, `..`-Segmente und Pfade, die das Stammverzeichnis verlassen, ergeben `OL_E_HOF_PATH_ESCAPE`; ebenso Ziele (und `Vehicle`-Quellen) außerhalb von `Vehicles\`, Sammlungsnamen, die kein einfacher Verzeichnisname sind, sowie jeder Quell- oder Zielordner, der über eine Junction oder einen symbolischen Link erreicht wird. `.hof`-Dateien, die selbst Reparse-Points sind, werden ignoriert. ## Grenzwerte | Grenzwert | Wert | Fehler | | --- | --- | --- | | Größe einer HOF-Datei | 8 MiB | `OL_E_HOF_INVALID` | | Dateien pro Operation | 256 | `OL_E_HOF_INVALID` | | Insgesamt geschriebene Bytes pro Sitzung | 256 MiB | `OL_E_HOF_INVALID` | | Ziele pro Operation | mindestens 1 | `OL_E_HOF_INVALID` | ## Fehlercodes | Code | Ursache | | --- | --- | | `OL_E_HOF_SOURCE_NOT_FOUND` | Die Sammlung, das Verzeichnis, das Fahrzeug oder die Datei existiert nicht, enthält keine `.hof`-Datei oder es fehlt eine in `Files` genannte Datei. | | `OL_E_HOF_TARGET_NOT_FOUND` | Eine Zielfahrzeugdatei oder ein Zielordner existiert nicht. | | `OL_E_HOF_PATH_ESCAPE` | Ein Pfad verlässt die Installation, ein Ziel liegt nicht unterhalb von `Vehicles\`, ein Sammlungsname ist kein einfacher Name, oder eine Junction bzw. ein symbolischer Link wird durchlaufen. | | `OL_E_HOF_CONFLICT` | Zwei Operationen widersprechen sich bezüglich einer Zieldatei (siehe [Konfliktregeln](#conflict-rules)). | | `OL_E_HOF_INVALID` | Keine Ziele, keine Quelle, eine `File`-Quelle, die keine `.hof`-Datei ist, ein Ziel, das eine andere Datei als `.bus`/`.ovh` ist, oder ein überschrittener [Grenzwert](#limits). | ## Verwendung Befehlszeile (eine Operation; mehrere Operationen erfordern `/spec` oder ein Sitzungsprofil): ```text OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /hof-source:collection:berlin /hof-target:Vehicles\MAN_SD200\MAN_SD77.bus /plan OmsiLaunch.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1 /hof-source:vehicle:Vehicles\MAN_SD200\MAN_SD77.bus /hof-target:Vehicles\MAN_SD202 /hof-mode:mirror ``` LaunchSpec (`/spec`-JSON, Enums als Ganzzahlen): ```json { "HofManagement": { "Operations": [ { "SourceKind": 1, "Source": "maps\\Grundorf\\hof", "TargetVehicles": [ "Vehicles\\MAN_SD200\\MAN_SD77.bus" ], "Mode": 0 }, { "SourceKind": 0, "Source": "berlin", "TargetVehicles": [ "Vehicles\\MAN_SD202" ], "Mode": 1, "Files": [ "Linie5.hof" ] } ] } } ``` Voreinstellung eines Sitzungsprofils (eine `package`-Quelle ist ein Verzeichnis innerhalb des Profilpakets): ```yaml hofs: - package: hof targets: - Vehicles\MAN_SD200\MAN_SD77.bus mode: mirror ``` API: Setzen Sie `LaunchSpec.HofManagement` und rufen Sie wie gewohnt `PlanSessionAsync` / `StartSessionAsync` auf; `/list:Hofs` (`ContentQueryKind.Hofs`) listet die installierten HOF-Dateien auf. Siehe auch: [LaunchSpec](https://omsilaunch.omsimods.com.br/de/docs/reference/launchspec/index.md), [Sitzungsprofile](https://omsilaunch.omsimods.com.br/de/docs/reference/session-profiles/index.md), [CLI](https://omsilaunch.omsimods.com.br/de/docs/reference/cli/index.md), [Fehler](https://omsilaunch.omsimods.com.br/de/docs/reference/errors/index.md), [Transaktionen und Recovery](https://omsilaunch.omsimods.com.br/de/docs/concepts/transactions-and-recovery/index.md).