be3dae46bb
Added RitualObligationTriggers analyzer category, Fixed defs from other mods with broken market value breaking fish's storage patches, Fixed storage caches not updating for quality, rotting and similar changes to stored things, Fixed storage caches not updating capacity when reinstalling storage, Fixed prison labor compatibility, Improved multiplayer compatibility, Fixed ideology style dominance and altar sharing patches throwing errors instead of defaulting to disabled when not having ideology, Fixed compatibility with RIMMSqol's world pawn GC patch by disabling that patch, Fixed rare threading issues throwing errors on startup
138 lines
4.5 KiB
C#
138 lines
4.5 KiB
C#
// Copyright (c) 2023 bradson
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
namespace PerformanceFish.ModCompatibility;
|
|
|
|
public static class ActiveMods
|
|
{
|
|
public static readonly bool
|
|
Fishery = Contains(PackageIDs.FISHERY),
|
|
// GradientHair = Contains(PackageIDs.GRADIENT_HAIR),
|
|
GraphicsSetter = Contains(PackageIDs.GRAPHICS_SETTINGS),
|
|
Harmony = Contains(PackageIDs.HARMONY),
|
|
HumanResources = Contains(PackageIDs.HUMAN_RESOURCES),
|
|
Multiplayer = Contains(PackageIDs.MULTIPLAYER),
|
|
PerformanceOptimizer = Contains(PackageIDs.PERFORMANCE_OPTIMIZER),
|
|
Prepatcher = Contains(PackageIDs.PREPATCHER),
|
|
PrisonLabor = Contains(PackageIDs.PRISON_LABOR),
|
|
RIMMSqol = Contains(PackageIDs.RIMMSQOL),
|
|
UseBestMaterials = Contains(PackageIDs.USE_BEST_MATERIALS),
|
|
VanillaExpandedFramework = Contains(PackageIDs.VANILLA_EXPANDED_FRAMEWORK);
|
|
|
|
// ModsConfig.IsActive does not ignore _steam postfixes, causing it to fail when local copies were made
|
|
public static bool Contains(string packageID) => TryGetModMetaData(packageID) != null;
|
|
|
|
public static bool ContainsAnyOf<T>(T packageIDs) where T : IEnumerable<string>
|
|
{
|
|
foreach (var id in packageIDs)
|
|
{
|
|
if (Contains(id))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool ContainsAllOf<T>(T packageIDs) where T : IEnumerable<string>
|
|
{
|
|
foreach (var id in packageIDs)
|
|
{
|
|
if (!Contains(id))
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static ModMetaData? TryGetModMetaData(string packageID)
|
|
=> ModLister.GetActiveModWithIdentifier(packageID, true);
|
|
|
|
public static ModContentPack? TryGetModContentPack(string packageID)
|
|
{
|
|
var allMods = LoadedModManager.RunningModsListForReading;
|
|
var count = allMods.Count;
|
|
for (var i = 0; i < count; i++)
|
|
{
|
|
if (allMods[i].PackageIdPlayerFacing.Equals(packageID, StringComparison.OrdinalIgnoreCase))
|
|
return allMods[i];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static Assembly? TryGetAssembly(this ModContentPack modContentPack, string name)
|
|
{
|
|
var assemblies = modContentPack.assemblies.loadedAssemblies;
|
|
|
|
for (var i = 0; i < assemblies.Count; i++)
|
|
{
|
|
if (assemblies[i].GetName().Name.Equals(name, StringComparison.OrdinalIgnoreCase))
|
|
return assemblies[i];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static void CheckRequirements()
|
|
{
|
|
if (!Fishery)
|
|
ThrowForMissingModDependency(nameof(Fishery));
|
|
|
|
if (!Harmony)
|
|
WarnForMissingModDependency(nameof(Harmony));
|
|
|
|
VerifyLoadOrder(nameof(Fishery), PackageIDs.FISHERY, PackageIDs.PERFORMANCE_FISH, PackageIDs.BETTER_LOG);
|
|
VerifyLoadOrder(nameof(Harmony), PackageIDs.HARMONY, PackageIDs.PERFORMANCE_FISH);
|
|
|
|
CheckHarmonyVersion();
|
|
CheckFisheryVersion();
|
|
}
|
|
|
|
private static void VerifyLoadOrder(string dependencyName, string dependencyID, params string[] dependingModIDs)
|
|
{
|
|
var activeModsInLoadOrder = (List<ModMetaData>)ModsConfig.ActiveModsInLoadOrder;
|
|
if (activeModsInLoadOrder.FindIndex(mod => mod.PackageId == dependencyID)
|
|
> activeModsInLoadOrder.FindIndex(mod => dependingModIDs.Contains(mod.PackageId)))
|
|
{
|
|
ErrorForIncorrectLoadOrder(dependencyName);
|
|
}
|
|
}
|
|
|
|
private static void CheckFisheryVersion()
|
|
{
|
|
if (FisheryLib.FisheryLib.VERSION > FisheryLib.FisheryLib.CurrentlyLoadedVersion)
|
|
ErrorForOutdatedModDependency(nameof(Fishery));
|
|
}
|
|
|
|
private static void CheckHarmonyVersion()
|
|
=> CheckDependencyVersion(nameof(Harmony), typeof(Harmony), "0Harmony");
|
|
|
|
private static void CheckDependencyVersion(string dependencyName, Type dependencyType,
|
|
string dependencyAssemblyName)
|
|
{
|
|
if (typeof(PerformanceFishMod).Assembly.GetReferencedAssemblyVersion(dependencyAssemblyName)
|
|
> dependencyType.Assembly.GetLoadedVersion())
|
|
{
|
|
ErrorForOutdatedModDependency(dependencyName);
|
|
}
|
|
}
|
|
|
|
private static void ErrorForIncorrectLoadOrder(string dependencyName)
|
|
=> Log.Error($"Incorrect load order detected. {dependencyName} must be loaded before any mod depending on it.");
|
|
|
|
private static void ErrorForOutdatedModDependency(string modName)
|
|
=> Log.Error($"Outdated {modName} mod detected. {
|
|
modName} must be updated for Performance Fish to work correctly");
|
|
|
|
private static void ThrowForMissingModDependency(string modName)
|
|
{
|
|
Log.Error($"{modName} mod is missing. Performance Fish requires this mod in order to function.");
|
|
ThrowHelper.ThrowOperationCanceledException();
|
|
}
|
|
|
|
private static void WarnForMissingModDependency(string modName)
|
|
=> Log.Warning(
|
|
$"{modName} mod is missing. Performance Fish may not work correctly without this dependency.");
|
|
} |