Mods in singleplayer (-msco-singleplayer), 2.10.10
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+16
-6
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Harmony;
|
using Harmony;
|
||||||
@@ -33,6 +33,12 @@ namespace MSCO
|
|||||||
/// <summary>Ordner von MSCO.dll (<Spiel>\MSCO).</summary>
|
/// <summary>Ordner von MSCO.dll (<Spiel>\MSCO).</summary>
|
||||||
public static string Folder { get { return folder; } }
|
public static string Folder { get { return folder; } }
|
||||||
static bool patchedGame, patchedPlayMaker, started;
|
static bool patchedGame, patchedPlayMaker, started;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Singleplayer mit Mods (Launcher: SINGLEPLAYER, "-msco-singleplayer"): nur die eigenen Mods laden - kein
|
||||||
|
/// MSCO-Menü, kein Multiplayer, das Spiel bleibt sonst unverändert.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly bool Singleplayer = Array.IndexOf(Environment.GetCommandLineArgs(), "-msco-singleplayer") >= 0;
|
||||||
static StreamWriter log;
|
static StreamWriter log;
|
||||||
|
|
||||||
public static void Start()
|
public static void Start()
|
||||||
@@ -43,6 +49,7 @@ namespace MSCO
|
|||||||
log = new StreamWriter(Path.Combine(folder, "MSCO_Loader.txt"), false) { AutoFlush = true };
|
log = new StreamWriter(Path.Combine(folder, "MSCO_Loader.txt"), false) { AutoFlush = true };
|
||||||
Log("MSCO " + MSCO.ModVersion + " loader started (standalone, without MSCLoader)");
|
Log("MSCO " + MSCO.ModVersion + " loader started (standalone, without MSCLoader)");
|
||||||
Log("Command line: " + string.Join(" ", Environment.GetCommandLineArgs()));
|
Log("Command line: " + string.Join(" ", Environment.GetCommandLineArgs()));
|
||||||
|
if (Singleplayer) Log("Singleplayer mode: only mods, no multiplayer");
|
||||||
AppDomain.CurrentDomain.AssemblyResolve += Resolve;
|
AppDomain.CurrentDomain.AssemblyResolve += Resolve;
|
||||||
AppDomain.CurrentDomain.AssemblyLoad += (_, e) => OnAssemblyLoaded(e.LoadedAssembly);
|
AppDomain.CurrentDomain.AssemblyLoad += (_, e) => OnAssemblyLoaded(e.LoadedAssembly);
|
||||||
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) OnAssemblyLoaded(a);
|
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) OnAssemblyLoaded(a);
|
||||||
@@ -126,7 +133,7 @@ namespace MSCO
|
|||||||
{
|
{
|
||||||
host = this;
|
host = this;
|
||||||
MscoLog.Info("Welcome to MSCO by mbm.wtf");
|
MscoLog.Info("Welcome to MSCO by mbm.wtf");
|
||||||
MenuBranding.ApplyWindow();
|
if (!Bootstrap.Singleplayer) MenuBranding.ApplyWindow();
|
||||||
// Den Nachrichten-Bildschirm des Spiels ("Latest news ... press any key") überspringen - direkt ins Hauptmenü
|
// Den Nachrichten-Bildschirm des Spiels ("Latest news ... press any key") überspringen - direkt ins Hauptmenü
|
||||||
string scene = Application.loadedLevelName;
|
string scene = Application.loadedLevelName;
|
||||||
Bootstrap.Log("First scene: " + scene);
|
Bootstrap.Log("First scene: " + scene);
|
||||||
@@ -142,7 +149,7 @@ namespace MSCO
|
|||||||
AudioListener.volume = 0f;
|
AudioListener.volume = 0f;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
MultiplayerManager.Ensure();
|
if (!Bootstrap.Singleplayer) MultiplayerManager.Ensure();
|
||||||
SceneChanged(scene);
|
SceneChanged(scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,9 +227,12 @@ namespace MSCO
|
|||||||
loadingScreen = false;
|
loadingScreen = false;
|
||||||
if (previousVolume >= 0f) { AudioListener.volume = previousVolume; previousVolume = -1f; }
|
if (previousVolume >= 0f) { AudioListener.volume = previousVolume; previousVolume = -1f; }
|
||||||
Bootstrap.Log("Level loaded: " + Application.loadedLevelName);
|
Bootstrap.Log("Level loaded: " + Application.loadedLevelName);
|
||||||
MenuBranding.ApplyWindow();
|
if (!Bootstrap.Singleplayer)
|
||||||
if (Application.loadedLevelName == "MainMenu") StartCoroutine(BrandMenu());
|
{
|
||||||
MultiplayerManager.Ensure();
|
MenuBranding.ApplyWindow();
|
||||||
|
if (Application.loadedLevelName == "MainMenu") StartCoroutine(BrandMenu());
|
||||||
|
MultiplayerManager.Ensure();
|
||||||
|
}
|
||||||
SceneChanged(Application.loadedLevelName);
|
SceneChanged(Application.loadedLevelName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2.10.10
|
||||||
|
|
||||||
|
- **Mods im Singleplayer:** Startet der Launcher mit SINGLEPLAYER, lädt MSCO nur noch die eigenen Mods
|
||||||
|
(`Mods\*.dll`) – kein MSCO-Menü, kein Multiplayer, das Spiel und der eigene Spielstand bleiben sonst unverändert
|
||||||
|
- Für Mod-Entwickler: `IsSingleplayer` in `MscoMod`
|
||||||
|
|
||||||
## 2.10.9
|
## 2.10.9
|
||||||
|
|
||||||
- **Beta-Hinweis:** im MSCO-Menü steht „BETA“ neben dem Schriftzug und ein kurzer Hinweis, dass Fehler auftreten
|
- **Beta-Hinweis:** im MSCO-Menü steht „BETA“ neben dem Schriftzug und ein kurzer Hinweis, dass Fehler auftreten
|
||||||
|
|||||||
+10
-1
@@ -7,7 +7,7 @@ Klasse, die von `MSCO.MscoMod` erbt. MSCLoader-Mods laufen damit **nicht** (sie
|
|||||||
|
|
||||||
| Ordner | |
|
| Ordner | |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `<Spielordner>\MSCO\Mods\*.dll` | eigene Mods – immer aktiv, werden beim Spielstart geladen |
|
| `<Spielordner>\MSCO\Mods\*.dll` | eigene Mods – immer aktiv, werden beim Spielstart geladen (auch im Singleplayer, siehe unten) |
|
||||||
| `<Spielordner>\MSCO\Mods\*.dll.off` | ausgeschaltet (Launcher → *Mods*) |
|
| `<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 |
|
| `<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*) |
|
| Server: `data/mods/*.dll` | Mods, die der dedizierte Server an seine Spieler verteilt (Web-Panel → *Mods*) |
|
||||||
@@ -15,6 +15,14 @@ Klasse, die von `MSCO.MscoMod` erbt. MSCLoader-Mods laufen damit **nicht** (sie
|
|||||||
Im Spiel: Seite **Mods** im MSCO-Menü, Konsole (F7) `mods`. Im Launcher: Seite **Mods** (hinzufügen, aus-/einschalten,
|
Im Spiel: Seite **Mods** im MSCO-Menü, Konsole (F7) `mods`. Im Launcher: Seite **Mods** (hinzufügen, aus-/einschalten,
|
||||||
entfernen).
|
entfernen).
|
||||||
|
|
||||||
|
## Singleplayer
|
||||||
|
|
||||||
|
**SINGLEPLAYER** im Launcher lädt die eigenen Mods ebenfalls: MSCO startet dann im Singleplayer-Modus
|
||||||
|
(`-msco-singleplayer`) – nur die Mods, kein MSCO-Menü, kein Multiplayer, der eigene Spielstand. `OnMenuLoad`,
|
||||||
|
`OnGameLoad`, `Update`, `OnGUI` usw. laufen wie gewohnt; `IsSingleplayer` ist `true`, `IsInSession` `false` und
|
||||||
|
`Send` tut nichts. Ohne eingeschaltete Mods (oder mit *Mods im Singleplayer* aus) startet das normale Spiel ohne MSCO.
|
||||||
|
Die F7-Konsole gibt es dort nicht – Meldungen stehen in `output_log.txt`.
|
||||||
|
|
||||||
## Server-Mods
|
## Server-Mods
|
||||||
|
|
||||||
Liegen Mods in `data/mods` des Servers, bekommt jeder Spieler beim Beitreten die Liste (Name, Version, Größe, SHA-256).
|
Liegen Mods in `data/mods` des Servers, bekommt jeder Spieler beim Beitreten die Liste (Name, Version, Größe, SHA-256).
|
||||||
@@ -108,6 +116,7 @@ Name und Version, die Launcher und Server-Panel anzeigen, kommen aus den Assembl
|
|||||||
| `OnMessage(fromPlayerId, data)` | Daten, die dieselbe Mod (gleiche `ID`) bei einem anderen Spieler mit `Send` geschickt hat |
|
| `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) |
|
| `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) |
|
| `IsInSession`, `IsHost`, `LocalPlayerId`, `Players` | Sitzung, eigene ID, Spieler (ID → Name) |
|
||||||
|
| `IsSingleplayer` | im Singleplayer gestartet (nur Mods, kein Multiplayer) |
|
||||||
| `Log(text)`, `LogWarning(text)` | in die MSCO-Konsole (F7) und `output_log.txt` |
|
| `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.
|
Fehler in einer Mod fängt MSCO ab und schreibt sie ins Log. Wirft eine Mod ständig Fehler (50×), wird sie abgeschaltet.
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace MSCO
|
|||||||
/// Version der Mod. Kleine Updates: nur die dritte Stelle erhöhen (2.9.1, 2.9.2 ...) - sie bleiben mit
|
/// Version der Mod. Kleine Updates: nur die dritte Stelle erhöhen (2.9.1, 2.9.2 ...) - sie bleiben mit
|
||||||
/// Servern und Mitspielern derselben ersten zwei Stellen kompatibel.
|
/// Servern und Mitspielern derselben ersten zwei Stellen kompatibel.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string ModVersion = "2.10.9";
|
public const string ModVersion = "2.10.10";
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Netzwerk-Version (die ersten beiden Stellen). Nur erhöhen, wenn sich das Protokoll inkompatibel ändert - dann
|
/// Netzwerk-Version (die ersten beiden Stellen). Nur erhöhen, wenn sich das Protokoll inkompatibel ändert - dann
|
||||||
/// auch GameServer.ModVersion im Server.
|
/// auch GameServer.ModVersion im Server.
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ namespace MSCO
|
|||||||
protected void Log(string text) { MscoLog.Info("[" + Name + "] " + text); }
|
protected void Log(string text) { MscoLog.Info("[" + Name + "] " + text); }
|
||||||
protected void LogWarning(string text) { MscoLog.Warning("[" + 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>
|
/// <summary>In einer Sitzung (Server oder P2P)?</summary>
|
||||||
protected bool IsInSession { get { return MultiplayerManager.Instance != null && MultiplayerManager.Instance.IsInSession; } }
|
protected bool IsInSession { get { return MultiplayerManager.Instance != null && MultiplayerManager.Instance.IsInSession; } }
|
||||||
/// <summary>Selbst P2P-Host?</summary>
|
/// <summary>Selbst P2P-Host?</summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user