Erste Version

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-28 17:26:23 +01:00
co-authored by Claude Opus 5.5
commit 35f2d1330d
23 changed files with 1981 additions and 0 deletions
+86
View File
@@ -0,0 +1,86 @@
# 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 `<Spielordner>\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