using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("MapUnlocker")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: AssemblyInformationalVersion("1.2.0+c4443989dc70c211efe912ba1ee9a0eb51d54bf2")]
[assembly: AssemblyProduct("MapUnlocker")]
[assembly: AssemblyTitle("MapUnlocker")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace MapUnlocker
{
public class ConfigUI
{
private ManualLogSource Logger;
private ResetManager resetManager;
private MapUnlocker plugin;
public ConfigEntry<bool>? debugMode;
public ConfigEntry<bool>? resetDataAfterLeaving;
public ConfigEntry<bool>? hasQuill;
public ConfigEntry<bool>? unlockAllMapsAtStart;
public ConfigEntry<bool>? unlockAllMaps;
public ConfigEntry<bool>[]? mapConfigs;
public ConfigEntry<bool>? unlockAllPinsAtStart;
public ConfigEntry<bool>? unlockAllPins;
public ConfigEntry<bool>[]? pinConfigs;
public ConfigEntry<bool>? unlockAllMarkersAtStart;
public ConfigEntry<bool>? unlockAllMarkers;
public ConfigEntry<bool>[]? markerConfigs;
private static bool allowChangeAllMaps = true;
private static bool isChangingAllMaps = false;
private static bool allowChangeAllPins = true;
private static bool isChangingAllPins = false;
private static bool allowChangeAllMarkers = true;
private static bool isChangingAllMarkers = false;
private ConfigFile Config => ((BaseUnityPlugin)plugin).Config;
public ConfigUI(ManualLogSource logger, ResetManager resetManager, MapUnlocker plugin)
{
Logger = logger;
this.resetManager = resetManager;
this.plugin = plugin;
}
public void InitializeConfig()
{
debugMode = Config.Bind<bool>("Debug", "Debug mode", false, "Enables log messages for debugging purposes.");
resetDataAfterLeaving = Config.Bind<bool>("General", "Reset Maps after leaving", false, "Resets all maps to original state after leaving.");
hasQuill = Config.Bind<bool>("General", "Has Quill", false, "Enables the quill tool.");
unlockAllMapsAtStart = Config.Bind<bool>("Maps", "Unlock All Maps At Start", false, "Unlock All Maps At the Start");
mapConfigs = new ConfigEntry<bool>[29]
{
unlockAllMaps = Config.Bind<bool>("Maps", "Unlock All Maps Now", false, "Unlock All Maps"),
Config.Bind<bool>("Maps", "Unlock the Map for Moss Grotto", false, "Unlock Moss Grotto"),
Config.Bind<bool>("Maps", "Unlock the Map for Wilds", false, "Unlock Wilds"),
Config.Bind<bool>("Maps", "Unlock the Map for Bone forest", false, "Unlock Bone forest"),
Config.Bind<bool>("Maps", "Unlock the Map for Docks", false, "Unlock Docks"),
Config.Bind<bool>("Maps", "Unlock the Map for Greymoor", false, "Unlock Greymoor"),
Config.Bind<bool>("Maps", "Unlock the Map for Bellhart", false, "Unlock Bellhart"),
Config.Bind<bool>("Maps", "Unlock the Map for Shellwood", false, "Unlock Shellwood"),
Config.Bind<bool>("Maps", "Unlock the Map for Crawl", false, "Unlock Crawl"),
Config.Bind<bool>("Maps", "Unlock the Map for Hunters Nest", false, "Unlock Hunters Nest"),
Config.Bind<bool>("Maps", "Unlock the Map for Judge Steps", false, "Unlock Judge Steps"),
Config.Bind<bool>("Maps", "Unlock the Map for Dustpens", false, "Unlock Dustpens"),
Config.Bind<bool>("Maps", "Unlock the Map for Slab", false, "Unlock Slab"),
Config.Bind<bool>("Maps", "Unlock the Map for Peak", false, "Unlock Peak"),
Config.Bind<bool>("Maps", "Unlock the Map for Citadel Understore", false, "Unlock Citadel Understore"),
Config.Bind<bool>("Maps", "Unlock the Map for Coral", false, "Unlock Coral"),
Config.Bind<bool>("Maps", "Unlock the Map for Swamp", false, "Unlock Swamp"),
Config.Bind<bool>("Maps", "Unlock the Map for Clover", false, "Unlock Clover"),
Config.Bind<bool>("Maps", "Unlock the Map for Abyss", false, "Unlock Abyss"),
Config.Bind<bool>("Maps", "Unlock the Map for Hang", false, "Unlock Hang"),
Config.Bind<bool>("Maps", "Unlock the Map for SongGate", false, "Unlock SongGate"),
Config.Bind<bool>("Maps", "Unlock the Map for Halls", false, "Unlock Halls"),
Config.Bind<bool>("Maps", "Unlock the Map for Ward", false, "Unlock Ward"),
Config.Bind<bool>("Maps", "Unlock the Map for Cog", false, "Unlock Cog"),
Config.Bind<bool>("Maps", "Unlock the Map for Library", false, "Unlock Library"),
Config.Bind<bool>("Maps", "Unlock the Map for Cradle", false, "Unlock Cradle"),
Config.Bind<bool>("Maps", "Unlock the Map for Arborium", false, "Unlock Arborium"),
Config.Bind<bool>("Maps", "Unlock the Map for Aqueduct", false, "Unlock Aqueduct"),
Config.Bind<bool>("Maps", "Unlock the Map for Weavehome", false, "Unlock Weavehome")
};
unlockAllPinsAtStart = Config.Bind<bool>("Pins", "Unlock All Pins At Start", false, "Unlock All Pins At the Start");
unlockAllPins = Config.Bind<bool>("Pins", "Unlock All Pins Now", false, "Unlock All Pins");
pinConfigs = new ConfigEntry<bool>[12]
{
Config.Bind<bool>("Pins", "Unlock the Bench Pin", false, "Unlock Bench Pin"),
Config.Bind<bool>("Pins", "Unlock the Cocoon Pin", false, "Unlock Cocoon Pin"),
Config.Bind<bool>("Pins", "Unlock the Shop Pin forest", false, "Unlock Bone Shop Pin"),
Config.Bind<bool>("Pins", "Unlock the Spa Pin", false, "Unlock Spa Pin"),
Config.Bind<bool>("Pins", "Unlock the Stag Pin", false, "Unlock Stag Pin"),
Config.Bind<bool>("Pins", "Unlock the Tube Pin", false, "Unlock Tube Pin"),
Config.Bind<bool>("Pins", "Unlock the FleaMarrowlands Pin", false, "Unlock FleaMarrowlands Pin"),
Config.Bind<bool>("Pins", "Unlock the FleaMidlands Pin", false, "Unlock FleaMidlands Pin"),
Config.Bind<bool>("Pins", "Unlock the FleaBlastedlands Pin Nest", false, "Unlock Hunters FleaBlastedlands Pin"),
Config.Bind<bool>("Pins", "Unlock the FleaCitadel Pin Steps", false, "Unlock Judge FleaCitadel Pin"),
Config.Bind<bool>("Pins", "Unlock the FleaPeaklands Pin", false, "Unlock FleaPeaklands Pin"),
Config.Bind<bool>("Pins", "Unlock the FleaMucklands Pin", false, "Unlock FleaMucklands Pin")
};
unlockAllMarkersAtStart = Config.Bind<bool>("Markers", "Unlock All Markers At Start", false, "Unlock All Markers At the Start");
unlockAllMarkers = Config.Bind<bool>("Markers", "Unlock All Markers Now", false, "Unlock All Markers");
markerConfigs = new ConfigEntry<bool>[5]
{
Config.Bind<bool>("Markers", "Unlock the hasMarker_a", false, "Unlock hasMarker_a"),
Config.Bind<bool>("Markers", "Unlock the hasMarker_b", false, "Unlock hasMarker_b"),
Config.Bind<bool>("Markers", "Unlock the hasMarker_c", false, "Unlock hasMarker_c"),
Config.Bind<bool>("Markers", "Unlock the hasMarker_d", false, "Unlock hasMarker_d"),
Config.Bind<bool>("Markers", "Unlock the hasMarker_e", false, "Unlock hasMarker_e")
};
Config.Save();
resetDataAfterLeaving.SettingChanged += delegate
{
if (resetDataAfterLeaving.Value)
{
resetManager.StoreOriginalData();
}
};
hasQuill.SettingChanged += delegate
{
plugin.changeQuillBool(hasQuill.Value);
};
unlockAllMaps.SettingChanged += delegate
{
OnConfigChangeAll(unlockAllMaps.Value, MapUnlocker.MAPS);
};
unlockAllPins.SettingChanged += delegate
{
OnConfigChangeAll(unlockAllPins.Value, MapUnlocker.PINS);
};
unlockAllMarkers.SettingChanged += delegate
{
OnConfigChangeAll(unlockAllMarkers.Value, MapUnlocker.MARKERS);
};
for (int i = 1; i < mapConfigs.Length; i++)
{
int currentMap = i;
mapConfigs[currentMap].SettingChanged += delegate
{
OnConfigChange(MapUnlocker.playerDataFieldsBools[MapUnlocker.MAPS][currentMap], mapConfigs[currentMap].Value, ref allowChangeAllMaps, ref isChangingAllMaps, ref unlockAllMaps);
if (!mapConfigs[currentMap].Value)
{
plugin.SetPlayerDataBool(MapUnlocker.playerDataFieldsBools[MapUnlocker.MAPS][MapUnlocker.ALL_FIELDS], value: false);
}
};
}
for (int j = 0; j < pinConfigs.Length; j++)
{
int currentPin = j;
pinConfigs[currentPin].SettingChanged += delegate
{
OnConfigChange(MapUnlocker.playerDataFieldsBools[MapUnlocker.PINS][currentPin], pinConfigs[currentPin].Value, ref allowChangeAllPins, ref isChangingAllPins, ref unlockAllPins);
};
}
for (int k = 0; k < markerConfigs.Length; k++)
{
int currentMarker = k;
markerConfigs[currentMarker].SettingChanged += delegate
{
OnConfigChange(MapUnlocker.playerDataFieldsBools[MapUnlocker.MARKERS][currentMarker + 1], markerConfigs[currentMarker].Value, ref allowChangeAllMarkers, ref isChangingAllMarkers, ref unlockAllMarkers);
bool? playerDataBoolValue = MapUnlocker.GetPlayerDataBoolValue(MapUnlocker.playerDataFieldsBools[MapUnlocker.MARKERS][0]);
if (playerDataBoolValue.HasValue)
{
if (markerConfigs[currentMarker].Value && playerDataBoolValue == false)
{
plugin.SetPlayerDataBool(MapUnlocker.playerDataFieldsBools[MapUnlocker.MARKERS][0], value: true);
}
}
else
{
Logger.LogError((object)"hasMarkerField is null!");
}
};
}
if (debugMode.Value)
{
Logger.LogInfo((object)$"Configuration initialized with {mapConfigs.Length} map configs");
}
}
public void ChangeConfigData(ConfigEntry<bool>[] configBools, string[] dataFields)
{
if (PlayerData.instance != null)
{
for (int i = 0; i < dataFields.Length && i < configBools.Length; i++)
{
FieldInfo field = ((object)PlayerData.instance).GetType().GetField(dataFields[i], BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null && field.FieldType == typeof(bool))
{
bool value = (bool)field.GetValue(PlayerData.instance);
configBools[i].Value = value;
if (debugMode.Value)
{
Logger.LogInfo((object)$"{dataFields[i]}: {configBools[i].Value}");
}
}
}
}
else if (debugMode.Value)
{
Logger.LogInfo((object)"(PlayerData.instance is null");
}
}
public void ChangeConfigData(ConfigEntry<bool>[] configBools, FieldInfo[] dataFields)
{
if (PlayerData.instance != null)
{
for (int i = 0; i < dataFields.Length && i < configBools.Length; i++)
{
FieldInfo fieldInfo = dataFields[i];
if (fieldInfo != null && fieldInfo.FieldType == typeof(bool))
{
bool value = (bool)fieldInfo.GetValue(PlayerData.instance);
configBools[i].Value = value;
if (debugMode.Value)
{
Logger.LogInfo((object)$"{dataFields[i]}: {configBools[i].Value}");
}
}
}
}
else if (debugMode.Value)
{
Logger.LogInfo((object)"(PlayerData.instance is null");
}
}
public void OnConfigChangeAll(bool value, int choice)
{
switch (choice)
{
default:
OnConfigChangeAll(value, mapConfigs, ref allowChangeAllMaps, ref isChangingAllMaps);
break;
case 1:
OnConfigChangeAll(value, pinConfigs, ref allowChangeAllPins, ref isChangingAllPins);
break;
case 2:
OnConfigChangeAll(value, markerConfigs, ref allowChangeAllMarkers, ref isChangingAllMarkers);
break;
}
}
public void OnConfigChangeAll(bool value, ConfigEntry<bool>[] entries, ref bool allowChangeAll, ref bool isChangingAll)
{
if (debugMode.Value)
{
Logger.LogInfo((object)("allowChangeAll: " + allowChangeAll));
}
if (!allowChangeAll)
{
allowChangeAll = true;
return;
}
if (PlayerData.instance != null)
{
isChangingAll = true;
for (int i = 0; i < entries.Length; i++)
{
entries[i].Value = value;
}
}
else if (debugMode.Value)
{
Logger.LogInfo((object)"PlayerData could not be found");
}
isChangingAll = false;
}
private void OnConfigChange(string fieldName, bool value, ref bool allowChangeAll, ref bool isChangingAll, ref ConfigEntry<bool> unlockAllConfig)
{
string text = (value ? "Unlocked" : "Locked");
if (PlayerData.instance == null)
{
return;
}
if (plugin.SetPlayerDataBool(PlayerData.instance, fieldName, value))
{
if (!value)
{
if (debugMode.Value)
{
Logger.LogInfo((object)("before isChangingAll: " + isChangingAll));
}
if (!isChangingAll)
{
allowChangeAll = false;
}
if (debugMode.Value)
{
Logger.LogInfo((object)("after allowChangeAll: " + allowChangeAll));
}
unlockAllConfig.Value = value;
}
}
else if (debugMode.Value)
{
Logger.LogInfo((object)(fieldName + " could not be " + text + "!"));
}
}
private void OnConfigChange(FieldInfo fieldInfo, bool value, ref bool allowChangeAll, ref bool isChangingAll, ref ConfigEntry<bool> unlockAllConfig)
{
string text = (value ? "Unlocked" : "Locked");
if (PlayerData.instance != null && fieldInfo != null)
{
if (!(fieldInfo.FieldType == typeof(bool)))
{
return;
}
if (plugin.SetPlayerDataBool(fieldInfo, value))
{
if (!value)
{
if (debugMode.Value)
{
Logger.LogInfo((object)("before isChangingAll: " + isChangingAll));
}
if (!isChangingAll)
{
allowChangeAll = false;
}
if (debugMode.Value)
{
Logger.LogInfo((object)("after allowChangeAll: " + allowChangeAll));
}
unlockAllConfig.Value = value;
}
}
else if (debugMode.Value)
{
Logger.LogInfo((object)(fieldInfo.Name + " could not be " + text + "!"));
}
}
else if (debugMode.Value)
{
Logger.LogInfo((object)"FieldInfo is null or PlayerData.instance is null");
}
}
}
[BepInPlugin("MapUnlocker", "MapUnlocker", "1.2.0")]
public class MapUnlocker : BaseUnityPlugin
{
private Harmony harmony;
public static readonly int ALL_FIELDS = 0;
public static readonly int MAPS = 0;
public static readonly int PINS = 1;
public static readonly int MARKERS = 2;
public ResetManager resetManager;
public ConfigUI configUI;
private OnStartManager onStartManager;
public static readonly string[] mapFields = new string[29]
{
"mapAllRooms", "HasMossGrottoMap", "HasWildsMap", "HasBoneforestMap", "HasDocksMap", "HasGreymoorMap", "HasBellhartMap", "HasShellwoodMap", "HasCrawlMap", "HasHuntersNestMap",
"HasJudgeStepsMap", "HasDustpensMap", "HasSlabMap", "HasPeakMap", "HasCitadelUnderstoreMap", "HasCoralMap", "HasSwampMap", "HasCloverMap", "HasAbyssMap", "HasHangMap",
"HasSongGateMap", "HasHallsMap", "HasWardMap", "HasCogMap", "HasLibraryMap", "HasCradleMap", "HasArboriumMap", "HasAqueductMap", "HasWeavehomeMap"
};
public static readonly string[] pinFields = new string[12]
{
"hasPinBench", "hasPinCocoon", "hasPinShop", "hasPinSpa", "hasPinStag", "hasPinTube", "hasPinFleaMarrowlands", "hasPinFleaMidlands", "hasPinFleaBlastedlands", "hasPinFleaCitadel",
"hasPinFleaPeaklands", "hasPinFleaMucklands"
};
public static readonly string[] markerFields = new string[6] { "hasMarker", "hasMarker_a", "hasMarker_b", "hasMarker_c", "hasMarker_d", "hasMarker_e" };
public static readonly FieldInfo[][] playerDataFieldsBools = new FieldInfo[3][]
{
mapFields.Select((string fieldName) => typeof(PlayerData).GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)).ToArray(),
pinFields.Select((string fieldName) => typeof(PlayerData).GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)).ToArray(),
markerFields.Select((string fieldName) => typeof(PlayerData).GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)).ToArray()
};
public ManualLogSource Logger => ((BaseUnityPlugin)this).Logger;
public static MapUnlocker Instance { get; private set; } = null;
private void Awake()
{
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Expected O, but got Unknown
Logger.LogInfo((object)"Plugin MapUnlocker has loaded!");
Logger.LogInfo((object)"Plugin version: 1.2.0");
Instance = this;
resetManager = new ResetManager(Logger, this);
configUI = new ConfigUI(Logger, resetManager, this);
resetManager.SetConfigUI(configUI);
configUI.InitializeConfig();
harmony = new Harmony("MapUnlocker");
harmony.PatchAll();
Logger.LogInfo((object)"Harmony patches applied successfully!");
onStartManager = new OnStartManager(Logger, this);
Logger.LogInfo((object)"Map Unlocker mod initialization completed");
}
private void OnDestroy()
{
Harmony obj = harmony;
if (obj != null)
{
obj.UnpatchSelf();
}
}
public static bool GetPlayerDataBoolValue(int category, int index)
{
if (PlayerData.instance == null || category < 0 || category >= playerDataFieldsBools.Length || index < 0 || index >= playerDataFieldsBools[category].Length || playerDataFieldsBools[category][index] == null)
{
return false;
}
FieldInfo fieldInfo = playerDataFieldsBools[category][index];
if (fieldInfo.FieldType == typeof(bool))
{
return (bool)fieldInfo.GetValue(PlayerData.instance);
}
return false;
}
public static bool? GetPlayerDataBoolValue(FieldInfo fieldInfo)
{
if (PlayerData.instance != null && fieldInfo != null && fieldInfo.FieldType == typeof(bool))
{
return (bool)fieldInfo.GetValue(PlayerData.instance);
}
return null;
}
public bool SetPlayerDataBool(object playerData, string fieldName, bool value)
{
try
{
FieldInfo field = playerData.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null && field.FieldType == typeof(bool))
{
field.SetValue(playerData, value);
Logger.LogInfo((object)$"{fieldName}: {value}");
return true;
}
ConfigEntry<bool>? debugMode = configUI.debugMode;
if (debugMode != null && debugMode.Value)
{
Logger.LogWarning((object)("Field " + fieldName + " not found or not boolean"));
}
return false;
}
catch (Exception ex)
{
ConfigEntry<bool>? debugMode2 = configUI.debugMode;
if (debugMode2 != null && debugMode2.Value)
{
Logger.LogError((object)("Error setting " + fieldName + ": " + ex.Message));
}
return false;
}
}
public bool SetPlayerDataBool(FieldInfo fieldInfo, bool value)
{
if (PlayerData.instance != null && fieldInfo != null)
{
if (fieldInfo.FieldType == typeof(bool))
{
fieldInfo.SetValue(PlayerData.instance, value);
ConfigEntry<bool>? debugMode = configUI.debugMode;
if (debugMode != null && debugMode.Value)
{
Logger.LogInfo((object)$"{fieldInfo.Name}: {value}");
}
return true;
}
ConfigEntry<bool>? debugMode2 = configUI.debugMode;
if (debugMode2 != null && debugMode2.Value)
{
Logger.LogInfo((object)(fieldInfo.Name + " is not a boolean."));
}
}
return false;
}
public void changeQuillBool(bool value)
{
string text = (configUI.hasQuill.Value ? "Enabled" : "Disabled");
if (SetPlayerDataBool(PlayerData.instance, "hasQuill", configUI.hasQuill.Value))
{
Logger.LogInfo((object)(text + " Quill."));
}
}
public void DebugArrayContents(string arrayName, bool[] array)
{
Logger.LogInfo((object)("=== " + arrayName + " Contents ==="));
for (int i = 0; i < array.Length; i++)
{
Logger.LogInfo((object)$"{arrayName}[{i}] = {array[i]} ({mapFields[i]})");
}
Logger.LogInfo((object)("=== End " + arrayName + " ==="));
}
}
public class OnStartManager
{
[HarmonyPatch]
internal static class HeroController_Start_Patch
{
private static MethodBase TargetMethod()
{
Type type = AccessTools.TypeByName("HeroController");
if (type == null)
{
throw new Exception("Could not find type HeroController");
}
return AccessTools.Method(type, "Start", (Type[])null, (Type[])null);
}
private static void Postfix(object __instance)
{
MapUnlocker instance = MapUnlocker.Instance;
bool value = instance.configUI.debugMode.Value;
if ((Object)(object)instance != (Object)null)
{
ConfigEntry<bool>? resetDataAfterLeaving = instance.configUI.resetDataAfterLeaving;
if (resetDataAfterLeaving != null && resetDataAfterLeaving.Value)
{
instance.resetManager.StoreOriginalData();
if (value)
{
instance.Logger.LogInfo((object)"Stored original map data from HeroController_Start");
}
}
ConfigEntry<bool>? unlockAllMapsAtStart = instance.configUI.unlockAllMapsAtStart;
if (unlockAllMapsAtStart != null && unlockAllMapsAtStart.Value)
{
instance.configUI.unlockAllMaps.Value = true;
if (value)
{
instance.Logger.LogInfo((object)"UnlockAtStart unlockAllMaps finished.");
}
}
else
{
instance.configUI.ChangeConfigData(instance.configUI.mapConfigs, MapUnlocker.playerDataFieldsBools[MapUnlocker.MAPS]);
if (value)
{
instance.Logger.LogInfo((object)"Stored config data from HeroController_Start");
}
}
ConfigEntry<bool>? unlockAllPinsAtStart = instance.configUI.unlockAllPinsAtStart;
if (unlockAllPinsAtStart != null && unlockAllPinsAtStart.Value)
{
instance.configUI.unlockAllPins.Value = true;
if (value)
{
instance.Logger.LogInfo((object)"UnlockAtStart unlockAllPins finished.");
}
}
else
{
instance.configUI.ChangeConfigData(instance.configUI.pinConfigs, MapUnlocker.playerDataFieldsBools[MapUnlocker.PINS]);
if (value)
{
instance.Logger.LogInfo((object)"Stored config data from HeroController_Start");
}
}
ConfigEntry<bool>? unlockAllMarkersAtStart = instance.configUI.unlockAllMarkersAtStart;
if (unlockAllMarkersAtStart != null && unlockAllMarkersAtStart.Value)
{
instance.configUI.unlockAllMarkers.Value = true;
if (value)
{
instance.Logger.LogInfo((object)"UnlockAtStart unlockAllMarkers finished.");
}
}
else
{
instance.configUI.ChangeConfigData(instance.configUI.markerConfigs, MapUnlocker.playerDataFieldsBools[MapUnlocker.MARKERS]);
if (value)
{
instance.Logger.LogInfo((object)"Stored config data from HeroController_Start");
}
}
ConfigEntry<bool>? hasQuill = instance.configUI.hasQuill;
if (hasQuill != null && hasQuill.Value)
{
instance.changeQuillBool(value: true);
if (value)
{
instance.Logger.LogInfo((object)"enabled quill from HeroController_Start");
}
}
return;
}
throw new Exception("Could not find MapUnlocker mod.");
}
}
private ManualLogSource Logger;
private MapUnlocker plugin;
public OnStartManager(ManualLogSource logger, MapUnlocker plugin)
{
Logger = logger;
this.plugin = plugin;
}
}
public class ResetManager
{
[HarmonyPatch]
internal static class SaveGameData_Constructor_Patch
{
private static MethodBase TargetMethod()
{
Type type = AccessTools.TypeByName("SaveGameData");
if (type != null)
{
return AccessTools.Constructor(type, new Type[2]
{
AccessTools.TypeByName("PlayerData"),
AccessTools.TypeByName("SceneData")
}, false);
}
return null;
}
private static void Prefix(PlayerData playerData, SceneData sceneData)
{
MapUnlocker instance = MapUnlocker.Instance;
if (!((Object)(object)instance != (Object)null))
{
return;
}
ConfigEntry<bool>? resetDataAfterLeaving = instance.configUI.resetDataAfterLeaving;
if (resetDataAfterLeaving != null && resetDataAfterLeaving.Value)
{
instance.resetManager.StoreBoolData(moddedMapData, MapUnlocker.playerDataFieldsBools[MapUnlocker.MAPS]);
instance.resetManager.StoreBoolData(moddedPinData, MapUnlocker.playerDataFieldsBools[MapUnlocker.PINS]);
instance.resetManager.StoreBoolData(moddedMarkerData, MapUnlocker.playerDataFieldsBools[MapUnlocker.MARKERS]);
ConfigUI configUI = instance.configUI;
if (configUI != null && configUI.debugMode.Value)
{
instance.DebugArrayContents("originalMapData", originalMapData);
}
ConfigUI configUI2 = instance.configUI;
if (configUI2 != null && configUI2.debugMode.Value)
{
instance.DebugArrayContents("originalPinData", originalPinData);
}
ConfigUI configUI3 = instance.configUI;
if (configUI3 != null && configUI3.debugMode.Value)
{
instance.DebugArrayContents("originalMarkerData", originalMarkerData);
}
instance.resetManager.OverwriteBoolData(originalMapData, MapUnlocker.playerDataFieldsBools[MapUnlocker.MAPS]);
instance.resetManager.OverwriteBoolData(originalPinData, MapUnlocker.playerDataFieldsBools[MapUnlocker.PINS]);
instance.resetManager.OverwriteBoolData(originalMarkerData, MapUnlocker.playerDataFieldsBools[MapUnlocker.MARKERS]);
instance.Logger.LogInfo((object)"Restored original map states before SaveGameData constructor");
}
}
private static void Postfix(PlayerData playerData, SceneData sceneData)
{
MapUnlocker mapUnlocker = Object.FindAnyObjectByType<MapUnlocker>();
if ((Object)(object)mapUnlocker != (Object)null)
{
ConfigEntry<bool>? resetDataAfterLeaving = mapUnlocker.configUI.resetDataAfterLeaving;
if (resetDataAfterLeaving != null && resetDataAfterLeaving.Value)
{
mapUnlocker.resetManager.OverwriteBoolData(moddedMapData, MapUnlocker.playerDataFieldsBools[MapUnlocker.MAPS]);
mapUnlocker.resetManager.OverwriteBoolData(moddedPinData, MapUnlocker.playerDataFieldsBools[MapUnlocker.PINS]);
mapUnlocker.resetManager.OverwriteBoolData(moddedMarkerData, MapUnlocker.playerDataFieldsBools[MapUnlocker.MARKERS]);
mapUnlocker.Logger.LogInfo((object)"Re-applied mod states after SaveGameData constructor");
}
}
}
}
private ManualLogSource Logger;
private MapUnlocker plugin;
private ConfigUI configUI;
public static bool[] originalMapData = new bool[MapUnlocker.mapFields.Length];
public static bool[] moddedMapData = new bool[MapUnlocker.mapFields.Length];
public static bool[] originalPinData = new bool[MapUnlocker.pinFields.Length];
public static bool[] moddedPinData = new bool[MapUnlocker.pinFields.Length];
public static bool[] originalMarkerData = new bool[MapUnlocker.pinFields.Length];
public static bool[] moddedMarkerData = new bool[MapUnlocker.pinFields.Length];
public ResetManager(ManualLogSource logger, MapUnlocker plugin)
{
Logger = logger;
this.plugin = plugin;
}
public void SetConfigUI(ConfigUI configUI)
{
this.configUI = configUI;
}
public void StoreBoolData(bool[] boolData, string[] playerDataFields)
{
if (PlayerData.instance != null && boolData != null)
{
for (int i = 0; i < playerDataFields.Length && i < boolData.Length; i++)
{
FieldInfo field = ((object)PlayerData.instance).GetType().GetField(playerDataFields[i], BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null && field.FieldType == typeof(bool))
{
bool flag = (bool)field.GetValue(PlayerData.instance);
boolData[i] = flag;
ConfigEntry<bool>? debugMode = configUI.debugMode;
if (debugMode != null && debugMode.Value)
{
Logger.LogInfo((object)$"{playerDataFields[i]}: {boolData[i]}");
}
}
}
ConfigEntry<bool>? debugMode2 = configUI.debugMode;
if (debugMode2 != null && debugMode2.Value)
{
Logger.LogInfo((object)"Stored original data");
plugin.DebugArrayContents("originalBoolData", boolData);
}
}
else
{
Logger.LogInfo((object)"(PlayerData.instance is null or configUI not initialized");
}
}
public void StoreBoolData(bool[] boolData, FieldInfo[] playerDataFields)
{
if (PlayerData.instance != null && boolData != null)
{
for (int i = 0; i < playerDataFields.Length && i < boolData.Length; i++)
{
bool? playerDataBoolValue = MapUnlocker.GetPlayerDataBoolValue(playerDataFields[i]);
if (playerDataBoolValue.HasValue)
{
boolData[i] = playerDataBoolValue.Value;
ConfigEntry<bool>? debugMode = configUI.debugMode;
if (debugMode != null && debugMode.Value)
{
Logger.LogInfo((object)$"{playerDataFields[i]}: {boolData[i]}");
}
}
else
{
Logger.LogError((object)$"Could not get playerDataField value {i}!");
}
}
ConfigEntry<bool>? debugMode2 = configUI.debugMode;
if (debugMode2 != null && debugMode2.Value)
{
Logger.LogInfo((object)"Stored original data");
plugin.DebugArrayContents("originalBoolData", boolData);
}
}
else
{
Logger.LogInfo((object)"(PlayerData.instance is null or configUI not initialized");
}
}
public void OverwriteBoolData(bool[] boolData, string[] playerDataFields)
{
if (PlayerData.instance == null || boolData == null || configUI == null)
{
return;
}
ConfigEntry<bool>? debugMode = configUI.debugMode;
if (debugMode != null && debugMode.Value)
{
Logger.LogInfo((object)"OverwriteMapData Start --------------------------------");
}
for (int i = 0; i < playerDataFields.Length && i < boolData.Length; i++)
{
if (plugin.SetPlayerDataBool(PlayerData.instance, playerDataFields[i], boolData[i]))
{
ConfigEntry<bool>? debugMode2 = configUI.debugMode;
if (debugMode2 != null && debugMode2.Value)
{
Logger.LogInfo((object)$"{playerDataFields[i]} -> {boolData[i]}!");
}
}
}
ConfigEntry<bool>? debugMode3 = configUI.debugMode;
if (debugMode3 != null && debugMode3.Value)
{
Logger.LogInfo((object)"Restored pin states");
}
}
public void OverwriteBoolData(bool[] boolData, FieldInfo[] playerDataFields)
{
if (PlayerData.instance == null || boolData == null || configUI == null)
{
return;
}
ConfigEntry<bool>? debugMode = configUI.debugMode;
if (debugMode != null && debugMode.Value)
{
Logger.LogInfo((object)"OverwriteBoolData Start --------------------------------");
}
for (int i = 0; i < playerDataFields.Length && i < boolData.Length; i++)
{
if (plugin.SetPlayerDataBool(playerDataFields[i], boolData[i]))
{
ConfigEntry<bool>? debugMode2 = configUI.debugMode;
if (debugMode2 != null && debugMode2.Value)
{
Logger.LogInfo((object)$"playerDataFields: {playerDataFields[i]} -> {boolData[i]}!");
}
}
}
ConfigEntry<bool>? debugMode3 = configUI.debugMode;
if (debugMode3 != null && debugMode3.Value)
{
Logger.LogInfo((object)"Restored pin states");
}
}
public void StoreOriginalData()
{
if (PlayerData.instance != null && configUI != null)
{
StoreBoolData(originalMapData, MapUnlocker.playerDataFieldsBools[MapUnlocker.MAPS]);
StoreBoolData(originalPinData, MapUnlocker.playerDataFieldsBools[MapUnlocker.PINS]);
StoreBoolData(originalMarkerData, MapUnlocker.playerDataFieldsBools[MapUnlocker.MARKERS]);
}
else
{
Logger.LogInfo((object)"(PlayerData.instance is null or configUI not initialized");
}
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "MapUnlocker";
public const string PLUGIN_NAME = "MapUnlocker";
public const string PLUGIN_VERSION = "1.2.0";
}
}