- MscoMod API (ModApi.cs) and ModLoader: own mods from MSCO\Mods, hooks for menu/game/update/GUI, session and player events, Send/OnMessage between players (MsgType.ModMessage) - Server mods: ModList before Welcome, consent prompt (INSTALL & JOIN), download with SHA-256 check into MSCO\Mods\Servers, active only on that server; game start waits for the download - Mods page in the MSCO menu, console command "mods" - Server browser: MODS pill, VANILLA/MODDED filters, mod list in the server profile - PlayMaker ApplicationQuit is ignored in the main menu (ESC used to close the game) - MODDING.md and examples/HelloMod Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
86 lines
3.9 KiB
Markdown
86 lines
3.9 KiB
Markdown
# MSCO-Mods schreiben
|
||
|
||
MSCO läuft ohne MSCLoader und hat eine eigene, kleine Mod-Schnittstelle. Eine MSCO-Mod ist eine .NET-3.5-DLL mit einer
|
||
Klasse, die von `MSCO.MscoMod` erbt. MSCLoader-Mods laufen damit **nicht** (sie brauchen MSCLoader).
|
||
|
||
## Wo liegen Mods?
|
||
|
||
| Ordner | |
|
||
|---|---|
|
||
| `<Spielordner>\MSCO\Mods\*.dll` | eigene Mods – immer aktiv, werden beim Spielstart geladen |
|
||
| `<Spielordner>\MSCO\Mods\*.dll.off` | ausgeschaltet (Launcher → *Mods*) |
|
||
| `<Spielordner>\MSCO\Mods\Servers\*.dll` | Mods von Servern – nur aktiv, solange man auf einem Server ist, der sie verlangt |
|
||
| Server: `data/mods/*.dll` | Mods, die der dedizierte Server an seine Spieler verteilt (Web-Panel → *Mods*) |
|
||
|
||
Im Spiel: Seite **Mods** im MSCO-Menü, Konsole (F7) `mods`. Im Launcher: Seite **Mods** (hinzufügen, aus-/einschalten,
|
||
entfernen).
|
||
|
||
## Server-Mods
|
||
|
||
Liegen Mods in `data/mods` des Servers, bekommt jeder Spieler beim Beitreten die Liste (Name, Version, Größe, SHA-256).
|
||
Fehlt ihm eine Mod, fragt das Spiel: **INSTALL & JOIN** lädt sie direkt vom Server (Prüfsumme wird kontrolliert),
|
||
**CANCEL** verlässt den Server. Danach geht es ins Spiel. Hat der Spieler dieselbe Datei schon (gleiche Prüfsumme), wird
|
||
nichts geladen.
|
||
|
||
Server mit Mods bekommen in der Serverliste automatisch den Tag **MODDED**; im Server-Browser (Spiel, Launcher, Website)
|
||
steht, welche Mods sie nutzen, und es gibt Filter *VANILLA* / *MODDED*.
|
||
|
||
> Mods sind Programme und laufen mit vollen Rechten auf dem PC der Spieler. Serverbetreiber: nur Mods anbieten, denen ihr
|
||
> vertraut. Spieler: nur auf Servern zustimmen, denen ihr vertraut.
|
||
|
||
## Eine Mod bauen
|
||
|
||
Vorlage: [`examples/HelloMod`](examples/HelloMod) – Projekt (.NET Framework 3.5) mit Verweisen auf `UnityEngine.dll`
|
||
(aus `mysummercar_Data\Managed`) und `MSCO.dll` (aus `<Spielordner>\MSCO`, *Copy Local* aus).
|
||
|
||
```
|
||
msbuild examples/HelloMod/HelloMod.csproj -p:Configuration=Release -p:GamePath="C:\...\My Summer Car"
|
||
```
|
||
|
||
```csharp
|
||
using MSCO;
|
||
using UnityEngine;
|
||
|
||
public class HelloMod : MscoMod
|
||
{
|
||
public override string ID { get { return "hellomod"; } } // eindeutig: Buchstaben, Ziffern, . - _
|
||
public override string Name { get { return "Hello Mod"; } }
|
||
public override string Version { get { return "1.0.0"; } }
|
||
public override string Author { get { return "Ich"; } }
|
||
|
||
public override void OnGameLoad() { Log("Im Spiel!"); }
|
||
|
||
public override void Update()
|
||
{
|
||
if (Input.GetKeyDown(KeyCode.H)) Send(System.Text.Encoding.UTF8.GetBytes("wave"));
|
||
}
|
||
|
||
public override void OnMessage(int fromPlayerId, byte[] data)
|
||
{
|
||
string name;
|
||
Log((Players.TryGetValue(fromPlayerId, out name) ? name : "?") + " winkt");
|
||
}
|
||
}
|
||
```
|
||
|
||
Name und Version, die Launcher und Server-Panel anzeigen, kommen aus den Assembly-Attributen
|
||
(`AssemblyProduct`, `AssemblyInformationalVersion`).
|
||
|
||
## Schnittstelle
|
||
|
||
| Mitglied | |
|
||
|---|---|
|
||
| `ID`, `Name`, `Version`, `Author` | Angaben zur Mod (`ID` und `Name` müssen überschrieben werden) |
|
||
| `OnLoad()` | einmal nach dem Laden |
|
||
| `OnMenuLoad()`, `OnGameLoad()` | Hauptmenü bzw. Spiel (Szene `GAME`) geladen |
|
||
| `Update()`, `FixedUpdate()`, `OnGUI()` | jeden Frame (wie bei Unity) |
|
||
| `OnSessionStart()`, `OnSessionEnd()` | mit Server/Host verbunden bzw. getrennt |
|
||
| `OnPlayerJoined(id, name)`, `OnPlayerLeft(id, name)` | Mitspieler kommt/geht |
|
||
| `OnMessage(fromPlayerId, data)` | Daten, die dieselbe Mod (gleiche `ID`) bei einem anderen Spieler mit `Send` geschickt hat |
|
||
| `Send(byte[] data)` | an dieselbe Mod bei allen anderen Spielern (bis 60 KB; P2P und dedizierter Server) |
|
||
| `IsInSession`, `IsHost`, `LocalPlayerId`, `Players` | Sitzung, eigene ID, Spieler (ID → Name) |
|
||
| `Log(text)`, `LogWarning(text)` | in die MSCO-Konsole (F7) und `output_log.txt` |
|
||
|
||
Fehler in einer Mod fängt MSCO ab und schreibt sie ins Log. Wirft eine Mod ständig Fehler (50×), wird sie abgeschaltet.
|
||
Harmony 1.2 (`0Harmony.dll`) liegt neben `MSCO.dll` und kann von Mods mitbenutzt werden.
|