using System.Collections.Generic; namespace MSCO { /// /// Basis für MSCO-Mods. Eine Mod ist eine .NET-3.5-DLL in <Spiel>\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. /// public abstract class MscoMod { /// Eindeutige ID (Buchstaben, Ziffern, . - _). Mods mit derselben ID reden über Send/OnMessage miteinander. 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) /// Einmal nach dem Laden der Mod (Hauptmenü oder - bei Server-Mods - beim Beitreten). public virtual void OnLoad() { } /// Hauptmenü wurde geladen. public virtual void OnMenuLoad() { } /// Das Spiel (Szene GAME) wurde geladen. public virtual void OnGameLoad() { } public virtual void Update() { } public virtual void FixedUpdate() { } public virtual void OnGUI() { } /// Mit einem Server/Host verbunden (bzw. selbst P2P-Host geworden). public virtual void OnSessionStart() { } /// Sitzung beendet (getrennt, gekickt, Host weg ...). public virtual void OnSessionEnd() { } public virtual void OnPlayerJoined(int playerId, string name) { } public virtual void OnPlayerLeft(int playerId, string name) { } /// Daten, die dieselbe Mod bei einem anderen Spieler mit Send() geschickt hat. public virtual void OnMessage(int fromPlayerId, byte[] data) { } // ---------------------------------------------------------------- Helfer /// Daten an dieselbe Mod bei allen anderen Spielern schicken (max. 60 KB, nur in einer Sitzung). 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); } /// Singleplayer mit Mods (Launcher: SINGLEPLAYER) - kein MSCO-Menü, kein Multiplayer, Send() geht nicht. protected bool IsSingleplayer { get { return Bootstrap.Singleplayer; } } /// In einer Sitzung (Server oder P2P)? protected bool IsInSession { get { return MultiplayerManager.Instance != null && MultiplayerManager.Instance.IsInSession; } } /// Selbst P2P-Host? protected bool IsHost { get { return MultiplayerManager.Instance != null && MultiplayerManager.Instance.IsHost; } } /// Eigene Spieler-ID in der Sitzung. protected int LocalPlayerId { get { return MultiplayerManager.Instance != null ? MultiplayerManager.Instance.LocalId : -1; } } /// Spieler der Sitzung: ID -> Name. protected Dictionary Players { get { var result = new Dictionary(); MultiplayerManager mp = MultiplayerManager.Instance; if (mp != null) foreach (PlayerInfo p in mp.Players) result[p.Id] = p.Name; return result; } } } }