72 lines
3.8 KiB
C#
72 lines
3.8 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace MSCO
|
|
{
|
|
/// <summary>
|
|
/// 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.
|
|
/// </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>Singleplayer mit Mods (Launcher: SINGLEPLAYER) - kein MSCO-Menü, kein Multiplayer, Send() geht nicht.</summary>
|
|
protected bool IsSingleplayer { get { return Bootstrap.Singleplayer; } }
|
|
/// <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 -> 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;
|
|
}
|
|
}
|
|
}
|
|
}
|