Files
MSCO/ModApi.cs
T
MrMahoandClaude Opus 5.5 4c1366b5d9 MSCO 2.10.0: mod support, ESC no longer quits from the main menu
- 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>
2026-10-03 01:00:16 +02:00

70 lines
3.5 KiB
C#

using System.Collections.Generic;
namespace MSCO
{
/// <summary>
/// Basis für MSCO-Mods. Eine Mod ist eine .NET-3.5-DLL in &lt;Spiel&gt;\MSCO\Mods mit (mindestens) einer Klasse, die
/// von MscoMod erbt. MSCO lädt sie beim Spielstart; Mods eines Servers bekommen Spieler beim Beitreten (nach
/// Zustimmung) und sie sind nur auf diesem Server aktiv. Anleitung: MODDING.md im MSCO-Repository.
/// </summary>
public abstract class MscoMod
{
/// <summary>Eindeutige ID (Buchstaben, Ziffern, . - _). Mods mit derselben ID reden über Send/OnMessage miteinander.</summary>
public abstract string ID { get; }
public abstract string Name { get; }
public virtual string Version { get { return "1.0.0"; } }
public virtual string Author { get { return ""; } }
// ---------------------------------------------------------------- Lebenszyklus (überschreiben nach Bedarf)
/// <summary>Einmal nach dem Laden der Mod (Hauptmenü oder - bei Server-Mods - beim Beitreten).</summary>
public virtual void OnLoad() { }
/// <summary>Hauptmenü wurde geladen.</summary>
public virtual void OnMenuLoad() { }
/// <summary>Das Spiel (Szene GAME) wurde geladen.</summary>
public virtual void OnGameLoad() { }
public virtual void Update() { }
public virtual void FixedUpdate() { }
public virtual void OnGUI() { }
/// <summary>Mit einem Server/Host verbunden (bzw. selbst P2P-Host geworden).</summary>
public virtual void OnSessionStart() { }
/// <summary>Sitzung beendet (getrennt, gekickt, Host weg ...).</summary>
public virtual void OnSessionEnd() { }
public virtual void OnPlayerJoined(int playerId, string name) { }
public virtual void OnPlayerLeft(int playerId, string name) { }
/// <summary>Daten, die dieselbe Mod bei einem anderen Spieler mit Send() geschickt hat.</summary>
public virtual void OnMessage(int fromPlayerId, byte[] data) { }
// ---------------------------------------------------------------- Helfer
/// <summary>Daten an dieselbe Mod bei allen anderen Spielern schicken (max. 60 KB, nur in einer Sitzung).</summary>
protected bool Send(byte[] data)
{
MultiplayerManager mp = MultiplayerManager.Instance;
return mp != null && mp.SendModMessage(ID, data);
}
protected void Log(string text) { MscoLog.Info("[" + Name + "] " + text); }
protected void LogWarning(string text) { MscoLog.Warning("[" + Name + "] " + text); }
/// <summary>In einer Sitzung (Server oder P2P)?</summary>
protected bool IsInSession { get { return MultiplayerManager.Instance != null && MultiplayerManager.Instance.IsInSession; } }
/// <summary>Selbst P2P-Host?</summary>
protected bool IsHost { get { return MultiplayerManager.Instance != null && MultiplayerManager.Instance.IsHost; } }
/// <summary>Eigene Spieler-ID in der Sitzung.</summary>
protected int LocalPlayerId { get { return MultiplayerManager.Instance != null ? MultiplayerManager.Instance.LocalId : -1; } }
/// <summary>Spieler der Sitzung: ID -&gt; Name.</summary>
protected Dictionary<int, string> Players
{
get
{
var result = new Dictionary<int, string>();
MultiplayerManager mp = MultiplayerManager.Instance;
if (mp != null) foreach (PlayerInfo p in mp.Players) result[p.Id] = p.Name;
return result;
}
}
}
}