- Server relay:<Lobby> verbindet per WebSocket ueber eine lokale Bruecke (RelayClient) - Ticket mit Lobby, Anzeige 'Lobby von ...' - Nach Szenenwechsel Mitspieler-Modelle erst nach 3 s neu anlegen Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
89 lines
4.4 KiB
Markdown
89 lines
4.4 KiB
Markdown
# 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
|
||
- Lobby-Server (ohne Portfreigabe): [BSO-Relay](https://git.mbm.wtf/MrMaho/BSO-Relay)
|
||
- Launcher (installiert und aktualisiert die Mod): [BSO-Launcher](https://git.mbm.wtf/MrMaho/BSO-Launcher)
|
||
- Website, Konten, Freunde, Lobbys, Releases: [BSO-Website](https://git.mbm.wtf/MrMaho/BSO-Website)
|
||
|
||
**Stand:** Freunde spielen zusammen in einer Lobby – der Server läuft im BSO-Relay, die Mod verbindet sich per WebSocket,
|
||
niemand braucht eine Portfreigabe. Mitspieler erscheinen als Bus bzw. Spielfigur mit Namensschild 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) | – |
|
||
| `RemotePlayers.cs`, `Models.cs` | Mitspieler als Bus/Spielfigur in der Welt, Namensschild | `RemotePlayer.cs` |
|
||
| `Shared\*.cs` | Protokoll, `Connection`, `Ticket`, `RelayClient` (WebSocket-Brücke) – **gleiche Dateien wie in BSO-Relay** | `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, Namensschild~~
|
||
4. ~~Konten, Freunde, Lobby ohne Portfreigabe (BSO-Relay)~~
|
||
5. Direkt ins Spiel laden, Chat, Türen/Lichter
|