Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 1 addition & 7 deletions Source/Client/EarlyInit.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using HarmonyLib;
using Multiplayer.Client.Patches;
Expand All @@ -12,7 +11,6 @@ namespace Multiplayer.Client;
public static class EarlyInit
{
public const string RestartConnectVariable = "MultiplayerRestartConnect";
public const string RestartConfigsVariable = "MultiplayerRestartConfigs";

internal static void ProcessEnvironment()
{
Expand All @@ -22,11 +20,7 @@ internal static void ProcessEnvironment()
Environment.SetEnvironmentVariable(RestartConnectVariable, ""); // Effectively unsets it
}

if (!Environment.GetEnvironmentVariable(RestartConfigsVariable).NullOrEmpty())
{
Multiplayer.restartConfigs = Environment.GetEnvironmentVariable(RestartConfigsVariable) == "true";
Environment.SetEnvironmentVariable(RestartConfigsVariable, "");
}
SyncConfigs.Init();
}

internal static void EarlyPatches(Harmony harmony)
Expand Down
72 changes: 0 additions & 72 deletions Source/Client/EarlyPatches/SettingsPatches.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using HarmonyLib;
using Multiplayer.Client.Patches;
Expand Down Expand Up @@ -104,74 +102,4 @@ static IEnumerable<MethodBase> TargetMethods()

static bool Prefix() => !TickPatch.Simulating;
}

// Affects both reading and writing
[EarlyPatch]
[HarmonyPatch(typeof(LoadedModManager), nameof(LoadedModManager.GetSettingsFilename))]
static class OverrideConfigsPatch
{
private static Dictionary<(string, string), ModContentPack> modCache = new();

static void Postfix(string modIdentifier, string modHandleName, ref string __result)
{
if (!Multiplayer.restartConfigs)
return;

if (!modCache.TryGetValue((modIdentifier, modHandleName), out var mod))
{
mod = modCache[(modIdentifier, modHandleName)] =
LoadedModManager.RunningModsListForReading.FirstOrDefault(m =>
m.FolderName == modIdentifier
&& m.assemblies.loadedAssemblies.Any(a => a.GetTypes().Any(t => t.Name == modHandleName))
);
}

if (mod == null)
return;

if (JoinData.ignoredConfigsModIds.Contains(mod.ModMetaData.PackageIdNonUnique))
return;

// Example: MultiplayerTempConfigs/rwmt.multiplayer-Multiplayer
var newPath = Path.Combine(
GenFilePaths.FolderUnderSaveData(JoinData.TempConfigsDir),
GenText.SanitizeFilename(mod.PackageIdPlayerFacing.ToLowerInvariant() + "-" + modHandleName)
);

__result = newPath;
}
}

[EarlyPatch]
[HarmonyPatch]
static class HugsLib_OverrideConfigsPatch
{
public static string HugsLibConfigOverridenPath;

private static MethodInfo MethodToPatch = AccessTools.Method("HugsLib.Core.PersistentDataManager:GetSettingsFilePath");

static bool Prepare() => MethodToPatch != null;

static MethodInfo TargetMethod() => MethodToPatch;

static void Prefix(object __instance)
{
if (!Multiplayer.restartConfigs)
return;

if (__instance.GetType().Name != "ModSettingsManager")
return;

var newPath = Path.Combine(
GenFilePaths.FolderUnderSaveData(JoinData.TempConfigsDir),
GenText.SanitizeFilename($"{JoinData.HugsLibId}-{JoinData.HugsLibSettingsFile}")
);

if (File.Exists(newPath))
{
__instance.SetPropertyOrField("OverrideFilePath", newPath);
HugsLibConfigOverridenPath = newPath;
}
}
}
}
1 change: 0 additions & 1 deletion Source/Client/Multiplayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ public static class Multiplayer
public static Stopwatch harmonyWatch = new();

public static string restartConnect;
public static bool restartConfigs;

public static ModContentPack modContentPack;

Expand Down
88 changes: 3 additions & 85 deletions Source/Client/Networking/JoinData.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using HarmonyLib;
using Ionic.Zlib;
using Multiplayer.Client.EarlyPatches;
using Multiplayer.Client.Util;
using Multiplayer.Common;
using RimWorld;
using Steamworks;
Expand Down Expand Up @@ -49,7 +47,7 @@ public static byte[] WriteServerData(bool writeConfigs)
data.WriteBool(writeConfigs);
if (writeConfigs)
{
var configs = GetSyncableConfigContents(
var configs = SyncConfigs.GetSyncableConfigContents(
activeModsSnapshot.Select(m => m.PackageIdNonUnique).ToList()
);

Expand Down Expand Up @@ -126,93 +124,13 @@ public static ModMetaData GetInstalledMod(string id)
return ModLister.GetModWithIdentifier(id);
}

[SuppressMessage("ReSharper", "StringLiteralTypo")]
public static string[] ignoredConfigsModIds =
{
// todo unhardcode it
"rwmt.multiplayer",
"hodlhodl.twitchtoolkit", // contains username
"dubwise.dubsmintmenus",
"dubwise.dubsmintminimap",
"arandomkiwi.rimthemes",
"brrainz.cameraplus",
"giantspacehamster.moody",
"fluffy.modmanager",
"jelly.modswitch",
"betterscenes.rimconnect", // contains secret key for streamer
"jaxe.rimhud",
"telefonmast.graphicssettings",
"derekbickley.ltocolonygroupsfinal",
"dra.multiplayercustomtickrates", // syncs its own settings
"merthsoft.designatorshapes", // settings for UI and stuff meaningless for MP
//"zetrith.prepatcher",
};

public const string TempConfigsDir = "MultiplayerTempConfigs";
public const string HugsLibId = "unlimitedhugs.hugslib";
public const string HugsLibSettingsFile = "ModSettings";

public static List<ModConfig> GetSyncableConfigContents(List<string> modIds)
{
var list = new List<ModConfig>();

foreach (var modId in modIds)
{
if (ignoredConfigsModIds.Contains(modId)) continue;

var mod = LoadedModManager.RunningModsListForReading.FirstOrDefault(m => m.PackageIdPlayerFacing.ToLowerInvariant() == modId);
if (mod == null) continue;

foreach (var modInstance in LoadedModManager.runningModClasses.Values)
{
if (modInstance.modSettings == null) continue;
if (!mod.assemblies.loadedAssemblies.Contains(modInstance.GetType().Assembly)) continue;

var instanceName = modInstance.GetType().Name;

// This path may point to configs downloaded from the server
var file = LoadedModManager.GetSettingsFilename(mod.FolderName, instanceName);

if (File.Exists(file))
list.Add(GetConfigCatchError(file, modId, instanceName));
}
}

// Special case for HugsLib
if (modIds.Contains(HugsLibId) && GetInstalledMod(HugsLibId) is { Active: true })
{
var hugsConfig =
HugsLib_OverrideConfigsPatch.HugsLibConfigOverridenPath ??
Path.Combine(GenFilePaths.SaveDataFolderPath, "HugsLib", "ModSettings.xml");

if (File.Exists(hugsConfig))
list.Add(GetConfigCatchError(hugsConfig, HugsLibId, HugsLibSettingsFile));
}

return list;

ModConfig GetConfigCatchError(string path, string id, string file)
{
try
{
var configContents = File.ReadAllText(path);
return new ModConfig(id, file, configContents);
}
catch (Exception e)
{
Log.Error($"Exception getting config contents {file}: {e}");
return new ModConfig(id, "ERROR", "");
}
}
}

public static bool CompareToLocal(RemoteData remote)
{
return
remote.remoteRwVersion == VersionControl.CurrentVersionString &&
remote.CompareMods(activeModsSnapshot) == ModListDiff.None &&
remote.remoteFiles.DictsEqual(modFilesSnapshot) &&
(!remote.hasConfigs || remote.remoteModConfigs.EqualAsSets(GetSyncableConfigContents(remote.RemoteModIds.ToList())));
(!remote.hasConfigs || remote.remoteModConfigs.EqualAsSets(SyncConfigs.GetSyncableConfigContents(remote.RemoteModIds.ToList())));
}

internal static void TakeModDataSnapshot()
Expand Down
Loading
Loading