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;
}
}
}
}