# BSO – Bus Simulator Online Multiplayer-Mod für **Bus-Simulator 2012** (European Bus Simulator 2012, TML-Studios), aufgebaut wie MSCO: eigenständiger Loader im Spielordner, die Mod selbst in C# (.NET 10). - Mod: dieses Repository - Dedizierter Server: [BSO-Server](https://git.mbm.wtf/MrMaho/BSO-Server) - Launcher (installiert und aktualisiert die Mod): [BSO-Launcher](https://git.mbm.wtf/MrMaho/BSO-Launcher) - Website, Konten und Releases: [BSO-Website](https://git.mbm.wtf/MrMaho/BSO-Website) **Stand:** Spieler verbinden sich per IP mit einem Server und sehen die anderen als Liste (Name, zu Fuß/Bus, Entfernung, Tempo). Als Nächstes kommen sichtbare Busse der Mitspieler in der Welt. ## Wie es funktioniert | Teil | Was | MSCO-Gegenstück | |---|---|---| | `Loader\dinput8.cpp` | Proxy-DLL `dinput8.dll` im Spielordner: reicht alles an die echte DirectInput-DLL weiter, startet .NET und ruft die Mod jedes Bild auf | Unity Doorstop (`winhttp.dll`) | | `Bootstrap.cs` | Einstieg (`Start`, `OnFrame`), Protokoll | `Bootstrap.cs` | | `Vision.cs` | Aufrufe in die Havok Vision Engine (`Vision90.dll` exportiert ihre Funktionen mit Namen) | UnityEngine-Referenz | | `Rtti.cs`, `Entities.cs` | Spielobjekte und ihre Klassennamen (`CarVehicle`, `KeyControlledCharacter` …) finden | – | | `LocalPlayer.cs` | eigene Figur und eigener Bus, daraus der `PlayerState` | – | | `Multiplayer.cs` | Verbindung zum Server, Mitspieler | `MultiplayerManager.cs` | | `Config.cs` | `BSO.json` (Name, Server, AutoConnect) | – | | `PositionHud.cs` | Anzeige im Spiel | `Overlays.cs` | | `BorderlessWindow.cs` | Vollbild im Fenster (F11) | – | | `Shared\*.cs` | Protokoll, `PacketReader`, `Connection`/`FrameParser` – **gleiche Dateien wie in BSO-Server** | `NetSession.cs` | - **Bild-Takt:** Das Spiel fragt die Tastatur mehrmals pro Bild über DirectInput ab. Der Loader hängt sich dort ein und ruft `Bootstrap.OnFrame` im Hauptthread auf. Gerechnet wird, wenn die Engine-Uhr weiterläuft; Text wird bei jedem Aufruf ausgegeben (sonst flackert er). Spielcode wird nicht verändert. - **Speicher lesen:** `Mem` prüft jede Adresse vorher, denn ein falscher Zeiger würde das Spiel abstürzen lassen. - **Netzwerk** wie MSCO: `[int Länge][byte Typ][Daten]` über TCP, Lesen per `Poll()` im Hauptthread, Senden über eigenen Thread. Jeder Spieler schickt 10× pro Sekunde seinen Zustand, der Server verteilt ihn. - Nur die **64-Bit-Version** (`Bin_High_Win64`). Steam startet sie auf 64-Bit-Windows automatisch. - Die Engine rechnet in **cm**. Der eigene Bus ist ein `CarVehicle` (Ursprung ~5 m hinter dem Fahrersitz). Solange man im Bus sitzt, ist die Spielfigur (`KeyControlledCharacter`) aus der Szene verschwunden. ## Installation **Mit dem Launcher (empfohlen):** [BSO-Launcher](https://git.mbm.wtf/MrMaho/BSO-Launcher) installiert und aktualisiert BSO und startet das Spiel. **Von Hand:** `dinput8.dll` nach `\Bin_High_Win64`, `BSO.dll`, `BSO.runtimeconfig.json` und `BSO.deps.json` nach `Bin_High_Win64\BSO`. Braucht die **.NET 10 Runtime (x64)**. ## Bauen Voraussetzungen: Visual Studio mit C++, .NET 10 SDK. ```powershell .\build.ps1 # -> dist\dinput8.dll, dist\BSO\, dist\BSO-Mod.zip .\install.ps1 # -> F:\SteamLibrary\steamapps\common\Bus-Simulator 2012\Bin_High_Win64 .\install.ps1 -Uninstall .\release.ps1 -Product mod -Version 0.2.0 -File dist\BSO-Mod.zip -Changelog "..." ``` Test ohne Spiel: `Loader\ProxyTest.cpp` lädt die Proxy-DLL wie das Spiel (Bauen siehe Kopf der Datei). ## Im Spiel | Taste | | |---|---| | **F8** | mit dem Server verbinden / trennen | | **F9** | Anzeige ein/aus | | **F10** | alle Objekte der Szene nach `Bin_High_Win64\BSO\entities.txt` (Diagnose) | | **F11** | Vollbild im Fenster ↔ normales Fenster (nur wenn im Spiel „Vollbild“ aus ist) | Einstellungen in `Bin_High_Win64\BSO\BSO.json` (der Launcher schreibt Name und Server hinein): ```json { "Name": "MrMaho", "Server": "127.0.0.1:7777", "AutoConnect": false } ``` Protokoll: `Bin_High_Win64\BSO\BSO_Loader.txt` ## Nächste Schritte 1. ~~Mod lädt, Busposition anzeigen~~ 2. ~~Netzwerk: Server + Positionen austauschen, Mitspieler als Text~~ 3. Mitspieler-Busse in der Welt (`VisGame_cl::CreateEntity`), Namensschild mit `VisMessage_cl::DrawMessage3D` 4. Chat, Konsole, Steam-P2P, Serverliste