Decompiled source of SilksongPrepatcher v1.2.0
patchers/SilksongPrepatcher.dll
Decompiled 2 days agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Cecil.Rocks; using Mono.Collections.Generic; using MonoMod.Cil; using MonoMod.Utils; using SilksongPrepatcher.Patchers; using SilksongPrepatcher.Patchers.PlayerDataPatcher; using SilksongPrepatcher.Utils; [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("SilksongPrepatcher")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.2.0.0")] [assembly: AssemblyInformationalVersion("1.2.0+0efb6ea7b664d77239a108824e9677bf4c291a99")] [assembly: AssemblyProduct("SilksongPrepatcher")] [assembly: AssemblyTitle("SilksongPrepatcher")] [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 SilksongPrepatcher { public static class AssemblyNames { public const string Assembly_CSharp = "Assembly-CSharp.dll"; public const string PlayMaker = "PlayMaker.dll"; public const string TeamCherry_NestedFadeGroup = "TeamCherry.NestedFadeGroup.dll"; public const string TeamCherry_SharedUtils = "TeamCherry.SharedUtils.dll"; public const string Newtonsoft_Json_UnityConverters = "Newtonsoft.Json.UnityConverters.dll"; } public abstract class BasePrepatcher { protected ManualLogSource Log { get; private set; } public string Name { get; private set; } public BasePrepatcher() : this(null) { } public BasePrepatcher(string? name) { if (name == null) { name = GetType().Name; } Name = name; Log = Logger.CreateLogSource(name); } public abstract void PatchAssembly(AssemblyDefinition asm); } public static class SilksongPrepatcher { private static readonly List<(string assemblyName, BasePrepatcher patcher)> patcherData = GetPatcherData(); private static ManualLogSource Log { get; } = Logger.CreateLogSource("SilksongPrepatcher"); internal static string PatchCacheDir { get { string text = Path.Combine(Paths.CachePath, "SilksongPrepatcher"); Directory.CreateDirectory(text); return text; } } public static IEnumerable<string> TargetDLLs => patcherData.Select<(string, BasePrepatcher), string>(((string assemblyName, BasePrepatcher patcher) pair) => pair.assemblyName).Distinct(); private static List<(string assemblyName, BasePrepatcher patcher)> GetPatcherData() { BasePrepatcher item = new MethodReplacer((MethodReference mr) => ((MemberReference)((MemberReference)mr).DeclaringType).Name == "Assembly" && ((MemberReference)mr).Name == "GetTypes", typeof(AssemblyExtensions).GetMethod("GetTypesSafelyIgnoreMMHOOK", new Type[1] { typeof(Assembly) })); BasePrepatcher item2 = new MethodReplacer((MethodReference mr) => ((MemberReference)((MemberReference)mr).DeclaringType).Name == "Assembly" && ((MemberReference)mr).Name == "GetTypes", typeof(AssemblyExtensions).GetMethod("GetTypesSafelyIgnoreModded", new Type[1] { typeof(Assembly) })); BasePrepatcher item3 = new MethodReplacer((MethodReference mr) => ((MemberReference)((MemberReference)mr).DeclaringType).Name == "Type" && ((MemberReference)mr).Name == "IsAssignableFrom", typeof(AssemblyExtensions).GetMethod("TypeAssignableFromSafe", new Type[2] { typeof(Type), typeof(Type) })); return new List<(string, BasePrepatcher)> { ("TeamCherry.NestedFadeGroup.dll", item2), ("PlayMaker.dll", item), ("PlayMaker.dll", new ReflectionUtilsPatcher()), ("Assembly-CSharp.dll", new PlayerDataPatcher()), ("TeamCherry.SharedUtils.dll", new VariableExtensionsPatcher()), ("Newtonsoft.Json.UnityConverters.dll", item3) }; } public static void Patch(AssemblyDefinition assembly) { string assemblyName = ((AssemblyNameReference)assembly.Name).Name + ".dll"; List<BasePrepatcher> list = (from pair in patcherData where pair.assemblyName == assemblyName select pair.patcher).ToList(); Log.LogInfo((object)("Patching " + assemblyName + ": " + string.Join(", ", list.Select((BasePrepatcher x) => x.Name)))); foreach (BasePrepatcher item in list) { item.PatchAssembly(assembly); } } } } namespace SilksongPrepatcher.Utils { public static class AssemblyExtensions { public static Type[] GetTypesSafely(this Assembly asm) { try { return asm.GetTypes(); } catch (ReflectionTypeLoadException ex) { return ex.Types.Where((Type x) => (object)x != null).ToArray(); } } public static Type[] GetTypesSafelyIgnoreModded(Assembly asm) { if (ShouldSkip(asm, skipModdedAssemblies: true)) { return Array.Empty<Type>(); } return asm.GetTypesSafely(); } public static Type[] GetTypesSafelyIgnoreMMHOOK(Assembly asm) { if (ShouldSkip(asm, skipModdedAssemblies: false)) { return Array.Empty<Type>(); } return asm.GetTypesSafely(); } private static bool ShouldSkip(Assembly asm, bool skipModdedAssemblies) { string name = asm.GetName().Name; if (name.StartsWith("TeamCherry") || name == "PlayMaker" || name.StartsWith("Assembly-CSharp")) { return false; } if (name.StartsWith("System.") || name == "mscorlib") { return true; } if (name.StartsWith("MMHOOK")) { return true; } if (asm.GetType("MonoDetour.HookGen.MonoDetourTargetsAttribute") != null) { return true; } if (skipModdedAssemblies) { string text; try { text = asm.Location; } catch (NotSupportedException) { text = string.Empty; } if (text.Contains("BepInEx")) { return true; } } return false; } public static bool TypeAssignableFromSafe(Type self, Type other) { try { return self.IsAssignableFrom(other); } catch { return false; } } } public static class CecilUtils { [CompilerGenerated] private sealed class <GetMethodDefinitions>d__2 : IEnumerable<MethodDefinition>, IEnumerable, IEnumerator<MethodDefinition>, IEnumerator, IDisposable { private int <>1__state; private MethodDefinition <>2__current; private int <>l__initialThreadId; private ModuleDefinition mod; public ModuleDefinition <>3__mod; private IEnumerator<TypeDefinition> <>7__wrap1; private Enumerator<MethodDefinition> <>7__wrap2; MethodDefinition IEnumerator<MethodDefinition>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetMethodDefinitions>d__2(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; if ((uint)(num - -4) <= 1u || num == 1) { try { if (num == -4 || num == 1) { try { } finally { <>m__Finally2(); } } } finally { <>m__Finally1(); } } <>7__wrap1 = null; <>7__wrap2 = default(Enumerator<MethodDefinition>); <>1__state = -2; } private bool MoveNext() { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -4; goto IL_0089; } <>1__state = -1; <>7__wrap1 = GetTypeDefinitions(mod).GetEnumerator(); <>1__state = -3; goto IL_00a8; IL_0089: if (<>7__wrap2.MoveNext()) { MethodDefinition current = <>7__wrap2.Current; <>2__current = current; <>1__state = 1; return true; } <>m__Finally2(); <>7__wrap2 = default(Enumerator<MethodDefinition>); goto IL_00a8; IL_00a8: if (<>7__wrap1.MoveNext()) { TypeDefinition current2 = <>7__wrap1.Current; <>7__wrap2 = current2.Methods.GetEnumerator(); <>1__state = -4; goto IL_0089; } <>m__Finally1(); <>7__wrap1 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap1 != null) { <>7__wrap1.Dispose(); } } private void <>m__Finally2() { <>1__state = -3; ((IDisposable)<>7__wrap2).Dispose(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<MethodDefinition> IEnumerable<MethodDefinition>.GetEnumerator() { <GetMethodDefinitions>d__2 <GetMethodDefinitions>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetMethodDefinitions>d__ = this; } else { <GetMethodDefinitions>d__ = new <GetMethodDefinitions>d__2(0); } <GetMethodDefinitions>d__.mod = <>3__mod; return <GetMethodDefinitions>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<MethodDefinition>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetTypeDefinitions>d__1 : IEnumerable<TypeDefinition>, IEnumerable, IEnumerator<TypeDefinition>, IEnumerator, IDisposable { private int <>1__state; private TypeDefinition <>2__current; private int <>l__initialThreadId; private ModuleDefinition mod; public ModuleDefinition <>3__mod; private Enumerator<TypeDefinition> <>7__wrap1; private IEnumerator<TypeDefinition> <>7__wrap2; TypeDefinition IEnumerator<TypeDefinition>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetTypeDefinitions>d__1(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; if ((uint)(num - -4) <= 1u || num == 1) { try { if (num == -4 || num == 1) { try { } finally { <>m__Finally2(); } } } finally { <>m__Finally1(); } } <>7__wrap1 = default(Enumerator<TypeDefinition>); <>7__wrap2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -4; goto IL_008a; } <>1__state = -1; <>7__wrap1 = mod.Types.GetEnumerator(); <>1__state = -3; goto IL_00a4; IL_008a: if (<>7__wrap2.MoveNext()) { TypeDefinition current = <>7__wrap2.Current; <>2__current = current; <>1__state = 1; return true; } <>m__Finally2(); <>7__wrap2 = null; goto IL_00a4; IL_00a4: if (<>7__wrap1.MoveNext()) { TypeDefinition current2 = <>7__wrap1.Current; <>7__wrap2 = GetTypesRecursive(current2).GetEnumerator(); <>1__state = -4; goto IL_008a; } <>m__Finally1(); <>7__wrap1 = default(Enumerator<TypeDefinition>); return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>7__wrap1).Dispose(); } private void <>m__Finally2() { <>1__state = -3; if (<>7__wrap2 != null) { <>7__wrap2.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<TypeDefinition> IEnumerable<TypeDefinition>.GetEnumerator() { <GetTypeDefinitions>d__1 <GetTypeDefinitions>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetTypeDefinitions>d__ = this; } else { <GetTypeDefinitions>d__ = new <GetTypeDefinitions>d__1(0); } <GetTypeDefinitions>d__.mod = <>3__mod; return <GetTypeDefinitions>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<TypeDefinition>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetTypesRecursive>d__0 : IEnumerable<TypeDefinition>, IEnumerable, IEnumerator<TypeDefinition>, IEnumerator, IDisposable { private int <>1__state; private TypeDefinition <>2__current; private int <>l__initialThreadId; private bool includeSelf; public bool <>3__includeSelf; private TypeDefinition type; public TypeDefinition <>3__type; private Enumerator<TypeDefinition> <>7__wrap1; private IEnumerator<TypeDefinition> <>7__wrap2; TypeDefinition IEnumerator<TypeDefinition>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetTypesRecursive>d__0(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; if ((uint)(num - -4) <= 1u || num == 2) { try { if (num == -4 || num == 2) { try { } finally { <>m__Finally2(); } } } finally { <>m__Finally1(); } } <>7__wrap1 = default(Enumerator<TypeDefinition>); <>7__wrap2 = null; <>1__state = -2; } private bool MoveNext() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; if (includeSelf) { <>2__current = type; <>1__state = 1; return true; } goto IL_0050; case 1: <>1__state = -1; goto IL_0050; case 2: { <>1__state = -4; goto IL_00be; } IL_0050: <>7__wrap1 = type.NestedTypes.GetEnumerator(); <>1__state = -3; goto IL_00d8; IL_00d8: if (<>7__wrap1.MoveNext()) { TypeDefinition current = <>7__wrap1.Current; <>7__wrap2 = GetTypesRecursive(current).GetEnumerator(); <>1__state = -4; goto IL_00be; } <>m__Finally1(); <>7__wrap1 = default(Enumerator<TypeDefinition>); return false; IL_00be: if (<>7__wrap2.MoveNext()) { TypeDefinition current2 = <>7__wrap2.Current; <>2__current = current2; <>1__state = 2; return true; } <>m__Finally2(); <>7__wrap2 = null; goto IL_00d8; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>7__wrap1).Dispose(); } private void <>m__Finally2() { <>1__state = -3; if (<>7__wrap2 != null) { <>7__wrap2.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<TypeDefinition> IEnumerable<TypeDefinition>.GetEnumerator() { <GetTypesRecursive>d__0 <GetTypesRecursive>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetTypesRecursive>d__ = this; } else { <GetTypesRecursive>d__ = new <GetTypesRecursive>d__0(0); } <GetTypesRecursive>d__.type = <>3__type; <GetTypesRecursive>d__.includeSelf = <>3__includeSelf; return <GetTypesRecursive>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<TypeDefinition>)this).GetEnumerator(); } } [IteratorStateMachine(typeof(<GetTypesRecursive>d__0))] public static IEnumerable<TypeDefinition> GetTypesRecursive(TypeDefinition type, bool includeSelf = true) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetTypesRecursive>d__0(-2) { <>3__type = type, <>3__includeSelf = includeSelf }; } [IteratorStateMachine(typeof(<GetTypeDefinitions>d__1))] public static IEnumerable<TypeDefinition> GetTypeDefinitions(ModuleDefinition mod) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetTypeDefinitions>d__1(-2) { <>3__mod = mod }; } [IteratorStateMachine(typeof(<GetMethodDefinitions>d__2))] public static IEnumerable<MethodDefinition> GetMethodDefinitions(ModuleDefinition mod) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetMethodDefinitions>d__2(-2) { <>3__mod = mod }; } } } namespace SilksongPrepatcher.Patchers { public class MethodReplacer : BasePrepatcher { [CompilerGenerated] private Func<MethodReference, bool> <predicate>P; [CompilerGenerated] private MethodInfo <newMethodInfo>P; public MethodReplacer(Func<MethodReference, bool> predicate, MethodInfo newMethodInfo) { <predicate>P = predicate; <newMethodInfo>P = newMethodInfo; base..ctor("MethodReplacer -> " + <newMethodInfo>P.Name); } public override void PatchAssembly(AssemblyDefinition asm) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_00ae: Unknown result type (might be due to invalid IL or missing references) MethodReference operand = asm.MainModule.ImportReference((MethodBase)<newMethodInfo>P); foreach (TypeDefinition typeDefinition in CecilUtils.GetTypeDefinitions(asm.MainModule)) { foreach (MethodDefinition item in ((IEnumerable<MethodDefinition>)typeDefinition.Methods).Where((MethodDefinition m) => m.HasBody)) { ILContext val = new ILContext(item); try { ILCursor val2 = new ILCursor(val); while (val2.TryGotoNext(new Func<Instruction, bool>[1] { delegate(Instruction i) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) if (i.OpCode == OpCodes.Call || i.OpCode == OpCodes.Callvirt) { object operand2 = i.Operand; MethodReference val3 = (MethodReference)((operand2 is MethodReference) ? operand2 : null); if (val3 != null) { return <predicate>P(val3); } } return false; } })) { base.Log.LogInfo((object)("Patching " + ((MemberReference)typeDefinition).FullName + " : " + ((MemberReference)item).FullName)); val2.Next.OpCode = OpCodes.Call; val2.Next.Operand = operand; } } finally { ((IDisposable)val)?.Dispose(); } } } } } public class ReflectionUtilsPatcher : BasePrepatcher { public override void PatchAssembly(AssemblyDefinition assembly) { TypeDefinition val = ((IEnumerable<TypeDefinition>)assembly.MainModule.Types).FirstOrDefault((Func<TypeDefinition, bool>)((TypeDefinition t) => ((MemberReference)t).Name == "ReflectionUtils")); if (val == null) { base.Log.LogInfo((object)("Could not find type ReflectionUtils in " + ((AssemblyNameReference)assembly.Name).Name)); return; } MethodDefinition val2 = ((IEnumerable<MethodDefinition>)val.Methods).FirstOrDefault((Func<MethodDefinition, bool>)((MethodDefinition m) => m.IsStatic && m.IsConstructor && m.IsSpecialName)); if (val2 == null) { base.Log.LogInfo((object)"Could not find static constructor"); return; } InjectTypeLookup(assembly.MainModule, val, val2); MethodDefinition val3 = ((IEnumerable<MethodDefinition>)val.Methods).FirstOrDefault((Func<MethodDefinition, bool>)((MethodDefinition m) => ((MemberReference)m).Name == "GetGlobalType")); if (val3 == null) { base.Log.LogInfo((object)"Could not find GetGlobalType"); } else { PatchGetGlobalType(assembly.MainModule, val, val3); } } private void PatchGetGlobalType(ModuleDefinition mainModule, TypeDefinition typeDef, MethodDefinition getGlobalType) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) ILProcessor iLProcessor = getGlobalType.Body.GetILProcessor(); Instruction val = ((IEnumerable<Instruction>)getGlobalType.Body.Instructions).First(); Instruction val2 = iLProcessor.Create(OpCodes.Ldarg_0); Instruction val3 = iLProcessor.Create(OpCodes.Ldstr, "HutongGames.PlayMaker.Actions."); MethodReference val4 = mainModule.ImportReference((MethodBase)typeof(string).GetMethod("op_Equality", new Type[2] { typeof(string), typeof(string) })); Instruction val5 = iLProcessor.Create(OpCodes.Call, val4); Instruction val6 = iLProcessor.Create(OpCodes.Brfalse, val); Instruction val7 = iLProcessor.Create(OpCodes.Ldnull); Instruction val8 = iLProcessor.Create(OpCodes.Ret); iLProcessor.InsertBefore(val, val2); iLProcessor.InsertBefore(val, val3); iLProcessor.InsertBefore(val, val5); iLProcessor.InsertBefore(val, val6); iLProcessor.InsertBefore(val, val7); iLProcessor.InsertBefore(val, val8); MethodBodyRocks.OptimizeMacros(getGlobalType.Body); } private void InjectTypeLookup(ModuleDefinition module, TypeDefinition typeDef, MethodDefinition cctor) { //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) FieldDefinition val = ((IEnumerable<FieldDefinition>)typeDef.Fields).FirstOrDefault((Func<FieldDefinition, bool>)((FieldDefinition f) => ((MemberReference)f).Name == "typeLookup" && f.IsStatic)); if (val == null) { return; } MethodReference val2 = module.ImportReference((MethodBase)typeof(Type).GetMethod("GetType", new Type[1] { typeof(string) })); MethodInfo method = typeof(Dictionary<, >).MakeGenericType(typeof(string), typeof(Type)).GetMethod("set_Item"); MethodReference val3 = module.ImportReference((MethodBase)method); ILProcessor iLProcessor = cctor.Body.GetILProcessor(); Instruction val4 = ((IEnumerable<Instruction>)cctor.Body.Instructions).Last(); if (val4.OpCode != OpCodes.Ret) { val4 = ((IEnumerable<Instruction>)cctor.Body.Instructions).Reverse().FirstOrDefault((Func<Instruction, bool>)((Instruction i) => i.OpCode == OpCodes.Ret)); if (val4 == null) { return; } } iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Ldsfld, (FieldReference)(object)val)); iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Ldstr, "TMProOldOld.TextAlignmentOptions")); iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Ldstr, "TMProOld.TextAlignmentOptions, Assembly-CSharp")); iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Call, val2)); iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Callvirt, val3)); MethodBodyRocks.OptimizeMacros(cctor.Body); base.Log.LogInfo((object)"Patch successfully applied"); } } } namespace SilksongPrepatcher.Patchers.PlayerDataPatcher { public class PatchedMethodCache { private static readonly ManualLogSource Log = Logger.CreateLogSource("PatchedMethodCache"); public Dictionary<string, List<string>> PatchedMethods { get; set; } = new Dictionary<string, List<string>>(); public void Add(string typeName, string methodName) { if (!PatchedMethods.TryGetValue(typeName, out List<string> value)) { List<string> list2 = (PatchedMethods[typeName] = new List<string>()); value = list2; } value.Add(methodName); } public static string GetMetadataString() { string arg = typeof(PatchedMethodCache).Assembly.GetName().Version.ToString(); DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(Path.Combine(Paths.ManagedPath, "Assembly-CSharp.dll")); return $"{arg} // {lastWriteTimeUtc}"; } public void Serialize(string filePath) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("X " + GetMetadataString()); foreach (var (text2, list2) in PatchedMethods) { stringBuilder.AppendLine("T " + text2); foreach (string item in list2) { stringBuilder.AppendLine("M " + item); } stringBuilder.AppendLine("E "); } File.WriteAllText(filePath, stringBuilder.ToString()); } public static PatchedMethodCache? Deserialize(string filePath) { if (!File.Exists(filePath)) { Log.LogDebug((object)"Failed to deserialize: no method cache found in cache dir."); return null; } bool flag = false; PatchedMethodCache patchedMethodCache = new PatchedMethodCache(); try { string[] array = File.ReadAllLines(filePath); string text = null; List<string> list = new List<string>(); string[] array2 = array; foreach (string text2 in array2) { if (text2.StartsWith("X ")) { if (!(text2.Substring(2) == GetMetadataString())) { Log.LogDebug((object)"Failed to deserialize: metadata mismatch."); return null; } flag = true; } else if (text2.StartsWith("T ")) { text = text2.Substring(2); } else if (text2.StartsWith("M ")) { list.Add(text2.Substring(2)); } else if (text2.StartsWith("E ")) { if (text == null) { throw new Exception("Key null on write"); } patchedMethodCache.PatchedMethods[text] = list; text = null; list = new List<string>(); } } } catch (Exception ex) { Log.LogError((object)("Failed to deserialize:\n" + ex)); return null; } if (!flag) { Log.LogInfo((object)"Failed to deserialize: no metadata found."); return null; } return patchedMethodCache; } } internal class PatchingContext { public enum AccessMethodType { Default, Generic } public static readonly HashSet<string> DefaultAccessMethods = new HashSet<string> { "Bool", "String", "Float", "Int", "Vector3" }; public ModuleDefinition MainModule { get; } public TypeDefinition PDType { get; } public MethodDefinition GenericGetMethod { get; } public MethodDefinition GenericSetMethod { get; } public Dictionary<TypeReference, MethodDefinition> DefaultGetMethods { get; } public Dictionary<TypeReference, MethodDefinition> DefaultSetMethods { get; } public PatchingContext(AssemblyDefinition asm) { MainModule = asm.MainModule; PDType = ((IEnumerable<TypeDefinition>)MainModule.Types).First((TypeDefinition t) => ((MemberReference)t).Name == "PlayerData"); DefaultGetMethods = ((IEnumerable<MethodDefinition>)PDType.Methods).Where((MethodDefinition m) => ((MemberReference)m).Name.StartsWith("Get") && DefaultAccessMethods.Contains(((MemberReference)m).Name.Substring(3))).ToDictionary((MethodDefinition m) => ((MethodReference)m).ReturnType); DefaultSetMethods = ((IEnumerable<MethodDefinition>)PDType.Methods).Where((MethodDefinition m) => ((MemberReference)m).Name.StartsWith("Set") && DefaultAccessMethods.Contains(((MemberReference)m).Name.Substring(3)) && ((MethodReference)m).Parameters.Count == 2).ToDictionary((MethodDefinition m) => ((ParameterReference)((MethodReference)m).Parameters[1]).ParameterType); TypeDefinition type = AssemblyDefinition.ReadAssembly(Path.Combine(Paths.ManagedPath, "TeamCherry.SharedUtils.dll")).MainModule.GetType("TeamCherry.SharedUtils.VariableExtensions"); GenericGetMethod = TypeDefinitionRocks.GetMethods(type).First((MethodDefinition x) => ((MemberReference)x).Name == "GetVariable" && ((MemberReference)x).ContainsGenericParameter && ((MethodReference)x).Parameters.Count == 2); GenericSetMethod = TypeDefinitionRocks.GetMethods(type).First((MethodDefinition x) => ((MemberReference)x).Name == "SetVariable" && ((MemberReference)x).ContainsGenericParameter && ((MethodReference)x).Parameters.Count == 3); } public MethodReference CreateGenericGetMethod(TypeReference fieldType) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown GenericInstanceMethod val = new GenericInstanceMethod(MainModule.ImportReference((MethodReference)(object)GenericGetMethod)); val.GenericArguments.Add(fieldType); return (MethodReference)val; } public void GetGetMethod(TypeReference fieldType, out MethodReference accessMethod, out AccessMethodType accessType) { if (DefaultGetMethods.TryGetValue(fieldType, out MethodDefinition value)) { accessMethod = MainModule.ImportReference((MethodReference)(object)value); accessType = AccessMethodType.Default; } else { accessMethod = CreateGenericGetMethod(fieldType); accessType = AccessMethodType.Generic; } } public MethodReference CreateGenericSetMethod(TypeReference fieldType) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown GenericInstanceMethod val = new GenericInstanceMethod(MainModule.ImportReference((MethodReference)(object)GenericSetMethod)); val.GenericArguments.Add(fieldType); return (MethodReference)val; } public void GetSetMethod(TypeReference fieldType, out MethodReference accessMethod, out AccessMethodType accessType) { if (DefaultSetMethods.TryGetValue(fieldType, out MethodDefinition value)) { accessMethod = MainModule.ImportReference((MethodReference)(object)value); accessType = AccessMethodType.Default; } else { accessMethod = CreateGenericSetMethod(fieldType); accessType = AccessMethodType.Generic; } } } public class PlayerDataPatcher : BasePrepatcher { private static readonly List<(string methodName, int numArgs)> methodsToReplace = new List<(string, int)>(3) { ("IntAdd", 3), ("IncrementInt", 2), ("DecrementInt", 2) }; private static string CacheFilePath => Path.Combine(SilksongPrepatcher.PatchCacheDir, "PlayerDataPatcher_cache.txt"); public override void PatchAssembly(AssemblyDefinition asm) { PatchingContext ctx = new PatchingContext(asm); ReplaceMethods(ctx); PatchedMethodCache patchedMethodCache = PatchedMethodCache.Deserialize(CacheFilePath); if (patchedMethodCache == null) { ReplaceFieldAccesses(ctx); } else { ReplaceFieldAccessesFromCache(ctx, patchedMethodCache); } } private static string? GetPrepatcherPluginAssembly() { string text = Path.Combine(Paths.PluginPath, "silksong_modding-SilksongPrepatcher", "PrepatcherPlugin.dll"); if (File.Exists(text)) { return text; } string[] files = Directory.GetFiles(Paths.PluginPath, "PrepatcherPlugin.dll", SearchOption.AllDirectories); if (files.Length != 0) { return files[0]; } return null; } private void ReplaceMethods(PatchingContext ctx) { string prepatcherPluginAssembly = GetPrepatcherPluginAssembly(); if (string.IsNullOrEmpty(prepatcherPluginAssembly)) { base.Log.LogWarning((object)"Not replacing access methods: No plugin found"); return; } AssemblyDefinition val = AssemblyDefinition.ReadAssembly(prepatcherPluginAssembly); try { TypeDefinition replacerType = ((IEnumerable<TypeDefinition>)val.MainModule.Types).First((TypeDefinition x) => ((MemberReference)x).Name == "PlayerDataInternal"); foreach (var (methodName, numArgs) in methodsToReplace) { ReplaceMethod(ctx, replacerType, methodName, numArgs); } } finally { ((IDisposable)val)?.Dispose(); } } private void ReplaceMethod(PatchingContext ctx, TypeDefinition replacerType, string methodName, int numArgs) { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) string methodName2 = methodName; MethodDefinition val = ((IEnumerable<MethodDefinition>)ctx.PDType.Methods).First((MethodDefinition m) => ((MemberReference)m).Name == methodName2); MethodDefinition val2 = ((IEnumerable<MethodDefinition>)replacerType.Methods).First((MethodDefinition m) => ((MemberReference)m).Name == methodName2); val.Body.ExceptionHandlers.Clear(); val.Body.Variables.Clear(); ILProcessor iLProcessor = val.Body.GetILProcessor(); foreach (Instruction item in ((IEnumerable<Instruction>)val.Body.Instructions).ToList()) { iLProcessor.Remove(item); } for (int i = 0; i < numArgs; i++) { iLProcessor.Append(iLProcessor.Create(OpCodes.Ldarg, i)); } iLProcessor.Append(iLProcessor.Create(OpCodes.Call, ctx.MainModule.ImportReference((MethodReference)(object)val2))); iLProcessor.Append(iLProcessor.Create(OpCodes.Ret)); MethodBodyRocks.OptimizeMacros(val.Body); } private void ReplaceFieldAccessesFromCache(PatchingContext ctx, PatchedMethodCache cache) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) int num = 0; int num2 = 0; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); foreach (KeyValuePair<string, List<string>> patchedMethod in cache.PatchedMethods) { patchedMethod.Deconstruct(out var key, out var value); string text = key; List<string> list = value; TypeDefinition type = ctx.MainModule.GetType(text); new HashSet<string>(list); Enumerator<MethodDefinition> enumerator2 = type.Methods.GetEnumerator(); try { while (enumerator2.MoveNext()) { MethodDefinition current = enumerator2.Current; if (list.Contains(((MemberReference)current).FullName)) { if (!PatchMethod(current, ctx, out var replaced, out var missed)) { throw new Exception("Failed to patch " + text + " " + ((MemberReference)current).FullName); } num += replaced; num2 += missed; } } } finally { ((IDisposable)enumerator2).Dispose(); } } stopwatch.Stop(); base.Log.LogInfo((object)$"Patched {num} accesses from cache in {stopwatch.ElapsedMilliseconds} ms"); } private void ReplaceFieldAccesses(PatchingContext ctx) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) int num = 0; int num2 = 0; PatchedMethodCache patchedMethodCache = new PatchedMethodCache(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); foreach (TypeDefinition typeDefinition in CecilUtils.GetTypeDefinitions(ctx.MainModule)) { Enumerator<MethodDefinition> enumerator2 = typeDefinition.Methods.GetEnumerator(); try { while (enumerator2.MoveNext()) { MethodDefinition current2 = enumerator2.Current; if (current2.HasBody && (current2.DeclaringType != ctx.PDType || (!(((MemberReference)current2).Name == "SetupNewPlayerData") && !(((MemberReference)current2).Name == "SetupExistingPlayerData") && !(((MemberReference)current2).Name == "OnUpdatedVariable") && !((MemberReference)current2).Name.Contains(".ctor")))) { if (PatchMethod(current2, ctx, out var replaced, out var missed)) { patchedMethodCache.Add(((MemberReference)typeDefinition).FullName, ((MemberReference)current2).FullName); } num += replaced; num2 += missed; } } } finally { ((IDisposable)enumerator2).Dispose(); } } stopwatch.Stop(); base.Log.LogInfo((object)$"Patched {num} accesses in {stopwatch.ElapsedMilliseconds} ms"); base.Log.LogInfo((object)$"Missed {num2} accesses"); patchedMethodCache.Serialize(CacheFilePath); } private bool PatchMethod(MethodDefinition method, PatchingContext ctx, out int replaced, out int missed) { //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) PatchingContext ctx2 = ctx; MethodDefinition method2 = method; Dictionary<TypeReference, VariableReference> addedVariables = new Dictionary<TypeReference, VariableReference>(); replaced = 0; missed = 0; MethodBodyRocks.SimplifyMacros(method2.Body); ILProcessor iLProcessor = method2.Body.GetILProcessor(); for (int num = iLProcessor.Body.Instructions.Count - 1; num >= 0; num--) { Instruction val = iLProcessor.Body.Instructions[num]; object operand = val.Operand; FieldReference val2 = (FieldReference)((operand is FieldReference) ? operand : null); if (val2 != null && !(((MemberReference)((MemberReference)val2).DeclaringType).FullName != ((MemberReference)ctx2.PDType).FullName) && !val2.Resolve().IsPrivate && !((IEnumerable<CustomAttribute>)val2.Resolve().CustomAttributes).Any((CustomAttribute ca) => ((MemberReference)ca.AttributeType).FullName == "System.NonSerializedAttribute")) { if (val.OpCode == OpCodes.Ldfld) { ctx2.GetGetMethod(val2.FieldType, out MethodReference accessMethod, out PatchingContext.AccessMethodType accessType); OpCode val3 = ((accessType == PatchingContext.AccessMethodType.Default) ? OpCodes.Callvirt : OpCodes.Call); Instruction[] array = (Instruction[])(object)new Instruction[2] { iLProcessor.Create(OpCodes.Ldstr, ((MemberReference)val2).Name), iLProcessor.Create(val3, accessMethod) }; val.OpCode = array[0].OpCode; val.Operand = array[0].Operand; iLProcessor.InsertAfter(val, array[1]); replaced++; } else if (val.OpCode == OpCodes.Stfld) { ctx2.GetSetMethod(val2.FieldType, out MethodReference accessMethod2, out PatchingContext.AccessMethodType accessType2); OpCode val4 = ((accessType2 == PatchingContext.AccessMethodType.Default) ? OpCodes.Callvirt : OpCodes.Call); VariableReference val5 = GetOrAddLocal(val2.FieldType); Instruction[] array2 = (Instruction[])(object)new Instruction[4] { Extensions.Create(iLProcessor, OpCodes.Stloc, (object)val5), iLProcessor.Create(OpCodes.Ldstr, ((MemberReference)val2).Name), Extensions.Create(iLProcessor, OpCodes.Ldloc, (object)val5), iLProcessor.Create(val4, accessMethod2) }; val.OpCode = array2[0].OpCode; val.Operand = array2[0].Operand; iLProcessor.InsertAfter(val, array2[1]); iLProcessor.InsertAfter(array2[1], array2[2]); iLProcessor.InsertAfter(array2[2], array2[3]); replaced++; } else if (val.OpCode == OpCodes.Ldflda) { if (TryPatchRefAccess(iLProcessor, val, method2, ctx2, GetOrAddLocal)) { replaced++; } else { missed++; } } } } MethodBodyRocks.OptimizeMacros(method2.Body); return replaced > 0; VariableReference GetOrAddLocal(TypeReference td) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown TypeReference val6 = ctx2.MainModule.ImportReference(td); if (!addedVariables.ContainsKey(val6)) { VariableDefinition val7 = new VariableDefinition(val6); method2.Body.Variables.Add(val7); addedVariables.Add(val6, (VariableReference)(object)val7); } return addedVariables[val6]; } } private bool TryPatchRefAccess(ILProcessor il, Instruction instr, MethodDefinition method, PatchingContext ctx, Func<TypeReference, VariableReference> getOrAddLocal) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) Instruction next = instr.Next; if (next.OpCode == OpCodes.Call) { object operand = next.Operand; MethodReference val = (MethodReference)((operand is MethodReference) ? operand : null); if (val != null && ((MemberReference)val.ReturnType).FullName == "System.Void" && val.Parameters.Count == 1) { object operand2 = instr.Operand; FieldReference val2 = (FieldReference)((operand2 is FieldReference) ? operand2 : null); if (val2 != null) { VariableReference val3 = getOrAddLocal(val2.FieldType); ctx.GetGetMethod(val2.FieldType, out MethodReference accessMethod, out PatchingContext.AccessMethodType accessType); OpCode val4 = ((accessType == PatchingContext.AccessMethodType.Default) ? OpCodes.Callvirt : OpCodes.Call); ctx.GetSetMethod(val2.FieldType, out MethodReference accessMethod2, out PatchingContext.AccessMethodType accessType2); OpCode val5 = ((accessType2 == PatchingContext.AccessMethodType.Default) ? OpCodes.Callvirt : OpCodes.Call); Instruction[] array = (Instruction[])(object)new Instruction[9] { il.Create(OpCodes.Dup), il.Create(OpCodes.Ldstr, ((MemberReference)val2).Name), il.Create(val4, accessMethod), Extensions.Create(il, OpCodes.Stloc, (object)val3), Extensions.Create(il, OpCodes.Ldloca, (object)val3), next, il.Create(OpCodes.Ldstr, ((MemberReference)val2).Name), Extensions.Create(il, OpCodes.Ldloc, (object)val3), il.Create(val5, accessMethod2) }; il.InsertBefore(instr, array[0]); instr.OpCode = array[1].OpCode; instr.Operand = array[1].Operand; il.InsertAfter(instr, array[2]); il.InsertAfter(array[2], array[3]); il.InsertAfter(array[3], array[4]); il.InsertAfter(next, array[6]); il.InsertAfter(array[6], array[7]); il.InsertAfter(array[7], array[8]); return true; } } } return false; } } public class VariableExtensionsPatcher : BasePrepatcher { public override void PatchAssembly(AssemblyDefinition asm) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) ModuleDefinition mainModule = asm.MainModule; string text = "TeamCherry.SharedUtils.VariableExtensions"; TypeDefinition type = mainModule.GetType(text); MethodDefinition val = null; Enumerator<MethodDefinition> enumerator = type.Methods.GetEnumerator(); try { while (enumerator.MoveNext()) { MethodDefinition current = enumerator.Current; if (!(((MemberReference)current).Name != "GetVariables")) { TypeReference parameterType = ((ParameterReference)((MethodReference)current).Parameters[1]).ParameterType; GenericInstanceType val2 = (GenericInstanceType)(object)((parameterType is GenericInstanceType) ? parameterType : null); if (val2 != null && !(((MemberReference)val2).Name != "Func`2") && !(((MemberReference)((TypeReference)val2).Resolve()).FullName != "System.Func`2")) { val = current; break; } } } } finally { ((IDisposable)enumerator).Dispose(); } MethodDefinition val3 = null; enumerator = type.Methods.GetEnumerator(); try { while (enumerator.MoveNext()) { MethodDefinition current2 = enumerator.Current; if (!(((MemberReference)current2).Name != "GetVariable") && ((MethodReference)current2).Parameters.Count == 2 && ((MemberReference)current2).ContainsGenericParameter) { val3 = current2; break; } } } finally { ((IDisposable)enumerator).Dispose(); } if (val != null && val3 != null) { PatchGetVariablesMethod(val, val3, mainModule); } } private void PatchGetVariablesMethod(MethodDefinition method, MethodDefinition getVariableMethod, ModuleDefinition mod) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) base.Log.LogInfo((object)("Found method " + ((MemberReference)method).FullName)); GenericParameter val = ((MethodReference)method).GenericParameters[0]; GenericInstanceMethod val2 = new GenericInstanceMethod((MethodReference)(object)getVariableMethod); val2.GenericArguments.Add((TypeReference)(object)val); MethodBodyRocks.SimplifyMacros(method.Body); method.Body.GetILProcessor(); Instruction val3 = null; Enumerator<Instruction> enumerator = method.Body.Instructions.GetEnumerator(); try { while (enumerator.MoveNext()) { Instruction current = enumerator.Current; if (current.OpCode == OpCodes.Callvirt) { object operand = current.Operand; MethodReference val4 = (MethodReference)((operand is MethodReference) ? operand : null); if (val4 != null && ((MemberReference)val4).Name == "GetValue" && ((MemberReference)((MemberReference)val4).DeclaringType).FullName == "System.Reflection.FieldInfo") { val3 = current; break; } } } } finally { ((IDisposable)enumerator).Dispose(); } if (val3 == null) { throw new Exception("Could not find call to FieldInfo::GetValue."); } Instruction[] array = (Instruction[])(object)new Instruction[4] { val3.Previous.Previous, val3.Previous, val3, val3.Next }; OpCode opCode = array[0].OpCode; if (!((OpCode)(ref opCode)).Name.ToLower().StartsWith("ldloc")) { throw new Exception("First instruction not Ldloc"); } opCode = array[1].OpCode; if (!((OpCode)(ref opCode)).Name.ToLower().StartsWith("ldarg")) { throw new Exception("Second instruction not Ldarg"); } opCode = array[3].OpCode; if (!((OpCode)(ref opCode)).Name.ToLower().StartsWith("unbox")) { throw new Exception("Fourth instruction not unbox"); } OpCode opCode2 = array[1].OpCode; object operand2 = array[1].Operand; array[1].OpCode = array[0].OpCode; array[1].Operand = array[0].Operand; array[0].OpCode = opCode2; array[0].Operand = operand2; MethodInfo getMethod = typeof(FieldInfo).GetProperty("Name").GetGetMethod(); MethodReference operand3 = mod.ImportReference((MethodBase)getMethod); array[2].OpCode = OpCodes.Callvirt; array[2].Operand = operand3; array[3].OpCode = OpCodes.Call; array[3].Operand = val2; MethodBodyRocks.OptimizeMacros(method.Body); } } }
plugins/PrepatcherPlugin.dll
Decompiled 2 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; 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.Logging; using GlobalEnums; using Microsoft.CodeAnalysis; using MonoMod.RuntimeDetour; using TeamCherry.SharedUtils; 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("PrepatcherPlugin")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.2.0.0")] [assembly: AssemblyInformationalVersion("1.2.0+0efb6ea7b664d77239a108824e9677bf4c291a99")] [assembly: AssemblyProduct("PrepatcherPlugin")] [assembly: AssemblyTitle("PrepatcherPlugin")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/silksong-modding/Silksong.Prepatcher")] [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 BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace PrepatcherPlugin { internal static class Extensions { public static MethodInfo GetMethodOrThrow(this Type type, string name) { MethodInfo? method = type.GetMethod(name); if (method == null) { throw new MissingMemberException(type.FullName, name); } return method; } } internal static class Hooks { private static List<Hook>? hooks = null; private static readonly Dictionary<Type, Func<PlayerData, string, object, object>> GenericGetMethodCache = new Dictionary<Type, Func<PlayerData, string, object, object>>(); private static readonly Dictionary<Type, Func<PlayerData, string, object, object>> GenericSetMethodCache = new Dictionary<Type, Func<PlayerData, string, object, object>>(); internal static void EnsureHooked() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Expected O, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Expected O, but got Unknown //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Expected O, but got Unknown //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Expected O, but got Unknown //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Expected O, but got Unknown //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Expected O, but got Unknown //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Expected O, but got Unknown //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Expected O, but got Unknown //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_0305: Expected O, but got Unknown if (hooks == null) { hooks = new List<Hook>(12) { new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetBool"), (Delegate)new Func<Func<PlayerData, string, bool>, PlayerData, string, bool>(ModifyGetBool)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetBool"), (Delegate)new Action<Action<PlayerData, string, bool>, PlayerData, string, bool>(ModifySetBool)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetInt"), (Delegate)new Func<Func<PlayerData, string, int>, PlayerData, string, int>(ModifyGetInt)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetInt"), (Delegate)new Action<Action<PlayerData, string, int>, PlayerData, string, int>(ModifySetInt)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetString"), (Delegate)new Func<Func<PlayerData, string, string>, PlayerData, string, string>(ModifyGetString)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetString"), (Delegate)new Action<Action<PlayerData, string, string>, PlayerData, string, string>(ModifySetString)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetFloat"), (Delegate)new Func<Func<PlayerData, string, float>, PlayerData, string, float>(ModifyGetFloat)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetFloat"), (Delegate)new Action<Action<PlayerData, string, float>, PlayerData, string, float>(ModifySetFloat)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetVector3"), (Delegate)new Func<Func<PlayerData, string, Vector3>, PlayerData, string, Vector3>(ModifyGetVector3)), new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetVector3"), (Delegate)new Action<Action<PlayerData, string, Vector3>, PlayerData, string, Vector3>(ModifySetVector3)), new Hook((MethodBase)typeof(VariableExtensions).GetMethods().First((MethodInfo m) => m.Name == "GetVariable" && !m.IsGenericMethod), (Delegate)new Func<Func<IIncludeVariableExtensions, string, Type, object>, IIncludeVariableExtensions, string, Type, object>(ModifyGetVariable)), new Hook((MethodBase)typeof(VariableExtensions).GetMethods().First((MethodInfo m) => m.Name == "SetVariable" && !m.IsGenericMethod), (Delegate)new Action<Action<IIncludeVariableExtensions, string, object, Type>, IIncludeVariableExtensions, string, object, Type>(ModifySetVariable)) }; } } private static bool ModifyGetBool(Func<PlayerData, string, bool> orig, PlayerData self, string boolName) { bool current = orig(self, boolName); return PlayerDataVariableEvents<bool>.ModifyGetVariable(self, boolName, current); } private static void ModifySetBool(Action<PlayerData, string, bool> orig, PlayerData self, string boolName, bool value) { bool arg = PlayerDataVariableEvents<bool>.ModifySetVariable(self, boolName, value); orig(self, boolName, arg); } private static int ModifyGetInt(Func<PlayerData, string, int> orig, PlayerData self, string intName) { int current = orig(self, intName); return PlayerDataVariableEvents<int>.ModifyGetVariable(self, intName, current); } private static void ModifySetInt(Action<PlayerData, string, int> orig, PlayerData self, string intName, int value) { int arg = PlayerDataVariableEvents<int>.ModifySetVariable(self, intName, value); orig(self, intName, arg); } private static string ModifyGetString(Func<PlayerData, string, string> orig, PlayerData self, string stringName) { string current = orig(self, stringName); return PlayerDataVariableEvents<string>.ModifyGetVariable(self, stringName, current); } private static void ModifySetString(Action<PlayerData, string, string> orig, PlayerData self, string stringName, string value) { string arg = PlayerDataVariableEvents<string>.ModifySetVariable(self, stringName, value); orig(self, stringName, arg); } private static float ModifyGetFloat(Func<PlayerData, string, float> orig, PlayerData self, string floatName) { float current = orig(self, floatName); return PlayerDataVariableEvents<float>.ModifyGetVariable(self, floatName, current); } private static void ModifySetFloat(Action<PlayerData, string, float> orig, PlayerData self, string floatName, float value) { float arg = PlayerDataVariableEvents<float>.ModifySetVariable(self, floatName, value); orig(self, floatName, arg); } private static Vector3 ModifyGetVector3(Func<PlayerData, string, Vector3> orig, PlayerData self, string vector3Name) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) Vector3 current = orig(self, vector3Name); return PlayerDataVariableEvents<Vector3>.ModifyGetVariable(self, vector3Name, current); } private static void ModifySetVector3(Action<PlayerData, string, Vector3> orig, PlayerData self, string vector3Name, Vector3 value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) Vector3 arg = PlayerDataVariableEvents<Vector3>.ModifySetVariable(self, vector3Name, value); orig(self, vector3Name, arg); } private static object ModifyGetVariable(Func<IIncludeVariableExtensions, string, Type, object> orig, IIncludeVariableExtensions obj, string fieldName, Type type) { object obj2 = orig(obj, fieldName, type); PlayerData val = (PlayerData)(object)((obj is PlayerData) ? obj : null); if (val == null) { return obj2; } if (!GenericGetMethodCache.TryGetValue(type, out Func<PlayerData, string, object, object> value)) { MethodInfo method = typeof(PlayerDataVariableEvents<>).MakeGenericType(type).GetMethod("ModifyGetVariableNonGeneric", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); value = (Func<PlayerData, string, object, object>)Delegate.CreateDelegate(typeof(Func<PlayerData, string, object, object>), method); GenericGetMethodCache[type] = value; } return value(val, fieldName, obj2); } private static void ModifySetVariable(Action<IIncludeVariableExtensions, string, object, Type> orig, IIncludeVariableExtensions obj, string fieldName, object value, Type type) { PlayerData val = (PlayerData)(object)((obj is PlayerData) ? obj : null); if (val == null) { orig(obj, fieldName, value, type); return; } if (!GenericSetMethodCache.TryGetValue(type, out Func<PlayerData, string, object, object> value2)) { MethodInfo method = typeof(PlayerDataVariableEvents<>).MakeGenericType(type).GetMethod("ModifySetVariableNonGeneric", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); value2 = (Func<PlayerData, string, object, object>)Delegate.CreateDelegate(typeof(Func<PlayerData, string, object, object>), method); GenericSetMethodCache[type] = value2; } object arg = value2(val, fieldName, value); orig(obj, fieldName, arg, type); } } public static class PlayerDataAccess { public static string LastSetFieldName { get { return PlayerData.instance.GetString("LastSetFieldName"); } set { PlayerData.instance.SetString("LastSetFieldName", value); } } public static string version { get { return PlayerData.instance.GetString("version"); } set { PlayerData.instance.SetString("version", value); } } public static int RevisionBreak { get { return PlayerData.instance.GetInt("RevisionBreak"); } set { PlayerData.instance.SetInt("RevisionBreak", value); } } public static string date { get { return PlayerData.instance.GetString("date"); } set { PlayerData.instance.SetString("date", value); } } public static int profileID { get { return PlayerData.instance.GetInt("profileID"); } set { PlayerData.instance.SetInt("profileID", value); } } public static float playTime { get { return PlayerData.instance.GetFloat("playTime"); } set { PlayerData.instance.SetFloat("playTime", value); } } public static bool openingCreditsPlayed { get { return PlayerData.instance.GetBool("openingCreditsPlayed"); } set { PlayerData.instance.SetBool("openingCreditsPlayed", value); } } public static PermadeathModes permadeathMode { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<PermadeathModes>((IIncludeVariableExtensions)(object)PlayerData.instance, "permadeathMode"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<PermadeathModes>((IIncludeVariableExtensions)(object)PlayerData.instance, "permadeathMode", value); } } public static bool CollectedDockDemoKey { get { return PlayerData.instance.GetBool("CollectedDockDemoKey"); } set { PlayerData.instance.SetBool("CollectedDockDemoKey", value); } } public static HeroItemsState PreMemoryState { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<HeroItemsState>((IIncludeVariableExtensions)(object)PlayerData.instance, "PreMemoryState"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<HeroItemsState>((IIncludeVariableExtensions)(object)PlayerData.instance, "PreMemoryState", value); } } public static bool HasStoredMemoryState { get { return PlayerData.instance.GetBool("HasStoredMemoryState"); } set { PlayerData.instance.SetBool("HasStoredMemoryState", value); } } public static int health { get { return PlayerData.instance.GetInt("health"); } set { PlayerData.instance.SetInt("health", value); } } public static int maxHealth { get { return PlayerData.instance.GetInt("maxHealth"); } set { PlayerData.instance.SetInt("maxHealth", value); } } public static int maxHealthBase { get { return PlayerData.instance.GetInt("maxHealthBase"); } set { PlayerData.instance.SetInt("maxHealthBase", value); } } public static int healthBlue { get { return PlayerData.instance.GetInt("healthBlue"); } set { PlayerData.instance.SetInt("healthBlue", value); } } public static bool damagedBlue { get { return PlayerData.instance.GetBool("damagedBlue"); } set { PlayerData.instance.SetBool("damagedBlue", value); } } public static bool damagedPurple { get { return PlayerData.instance.GetBool("damagedPurple"); } set { PlayerData.instance.SetBool("damagedPurple", value); } } public static int prevHealth { get { return PlayerData.instance.GetInt("prevHealth"); } set { PlayerData.instance.SetInt("prevHealth", value); } } public static int heartPieces { get { return PlayerData.instance.GetInt("heartPieces"); } set { PlayerData.instance.SetInt("heartPieces", value); } } public static bool SeenBindPrompt { get { return PlayerData.instance.GetBool("SeenBindPrompt"); } set { PlayerData.instance.SetBool("SeenBindPrompt", value); } } public static int geo { get { return PlayerData.instance.GetInt("geo"); } set { PlayerData.instance.SetInt("geo", value); } } public static int silk { get { return PlayerData.instance.GetInt("silk"); } set { PlayerData.instance.SetInt("silk", value); } } public static int silkMax { get { return PlayerData.instance.GetInt("silkMax"); } set { PlayerData.instance.SetInt("silkMax", value); } } public static int silkRegenMax { get { return PlayerData.instance.GetInt("silkRegenMax"); } set { PlayerData.instance.SetInt("silkRegenMax", value); } } public static int silkParts { get { return PlayerData.instance.GetInt("silkParts"); } set { PlayerData.instance.SetInt("silkParts", value); } } public static bool IsSilkSpoolBroken { get { return PlayerData.instance.GetBool("IsSilkSpoolBroken"); } set { PlayerData.instance.SetBool("IsSilkSpoolBroken", value); } } public static bool UnlockSilkFinalCutscene { get { return PlayerData.instance.GetBool("UnlockSilkFinalCutscene"); } set { PlayerData.instance.SetBool("UnlockSilkFinalCutscene", value); } } public static int silkSpoolParts { get { return PlayerData.instance.GetInt("silkSpoolParts"); } set { PlayerData.instance.SetInt("silkSpoolParts", value); } } public static bool atBench { get { return PlayerData.instance.GetBool("atBench"); } set { PlayerData.instance.SetBool("atBench", value); } } public static string respawnScene { get { return PlayerData.instance.GetString("respawnScene"); } set { PlayerData.instance.SetString("respawnScene", value); } } public static MapZone mapZone { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<MapZone>((IIncludeVariableExtensions)(object)PlayerData.instance, "mapZone"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<MapZone>((IIncludeVariableExtensions)(object)PlayerData.instance, "mapZone", value); } } public static ExtraRestZones extraRestZone { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<ExtraRestZones>((IIncludeVariableExtensions)(object)PlayerData.instance, "extraRestZone"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<ExtraRestZones>((IIncludeVariableExtensions)(object)PlayerData.instance, "extraRestZone", value); } } public static string respawnMarkerName { get { return PlayerData.instance.GetString("respawnMarkerName"); } set { PlayerData.instance.SetString("respawnMarkerName", value); } } public static int respawnType { get { return PlayerData.instance.GetInt("respawnType"); } set { PlayerData.instance.SetInt("respawnType", value); } } public static string tempRespawnScene { get { return PlayerData.instance.GetString("tempRespawnScene"); } set { PlayerData.instance.SetString("tempRespawnScene", value); } } public static string tempRespawnMarker { get { return PlayerData.instance.GetString("tempRespawnMarker"); } set { PlayerData.instance.SetString("tempRespawnMarker", value); } } public static int tempRespawnType { get { return PlayerData.instance.GetInt("tempRespawnType"); } set { PlayerData.instance.SetInt("tempRespawnType", value); } } public static string nonLethalRespawnScene { get { return PlayerData.instance.GetString("nonLethalRespawnScene"); } set { PlayerData.instance.SetString("nonLethalRespawnScene", value); } } public static string nonLethalRespawnMarker { get { return PlayerData.instance.GetString("nonLethalRespawnMarker"); } set { PlayerData.instance.SetString("nonLethalRespawnMarker", value); } } public static int nonLethalRespawnType { get { return PlayerData.instance.GetInt("nonLethalRespawnType"); } set { PlayerData.instance.SetInt("nonLethalRespawnType", value); } } public static Vector3 hazardRespawnLocation { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return PlayerData.instance.GetVector3("hazardRespawnLocation"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) PlayerData.instance.SetVector3("hazardRespawnLocation", value); } } public static FacingDirection hazardRespawnFacing { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<FacingDirection>((IIncludeVariableExtensions)(object)PlayerData.instance, "hazardRespawnFacing"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<FacingDirection>((IIncludeVariableExtensions)(object)PlayerData.instance, "hazardRespawnFacing", value); } } public static string HeroCorpseScene { get { return PlayerData.instance.GetString("HeroCorpseScene"); } set { PlayerData.instance.SetString("HeroCorpseScene", value); } } public static Vector2 HeroDeathScenePos { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<Vector2>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroDeathScenePos"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<Vector2>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroDeathScenePos", value); } } public static Vector2 HeroDeathSceneSize { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<Vector2>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroDeathSceneSize"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<Vector2>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroDeathSceneSize", value); } } public static byte[] HeroCorpseMarkerGuid { get { return VariableExtensions.GetVariable<byte[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroCorpseMarkerGuid"); } set { VariableExtensions.SetVariable<byte[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroCorpseMarkerGuid", value); } } public static HeroDeathCocoonTypes HeroCorpseType { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<HeroDeathCocoonTypes>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroCorpseType"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<HeroDeathCocoonTypes>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroCorpseType", value); } } public static int HeroCorpseMoneyPool { get { return PlayerData.instance.GetInt("HeroCorpseMoneyPool"); } set { PlayerData.instance.SetInt("HeroCorpseMoneyPool", value); } } public static int nailRange { get { return PlayerData.instance.GetInt("nailRange"); } set { PlayerData.instance.SetInt("nailRange", value); } } public static int beamDamage { get { return PlayerData.instance.GetInt("beamDamage"); } set { PlayerData.instance.SetInt("beamDamage", value); } } public static int nailUpgrades { get { return PlayerData.instance.GetInt("nailUpgrades"); } set { PlayerData.instance.SetInt("nailUpgrades", value); } } public static bool InvNailHasNew { get { return PlayerData.instance.GetBool("InvNailHasNew"); } set { PlayerData.instance.SetBool("InvNailHasNew", value); } } public static bool hasSilkSpecial { get { return PlayerData.instance.GetBool("hasSilkSpecial"); } set { PlayerData.instance.SetBool("hasSilkSpecial", value); } } public static int silkSpecialLevel { get { return PlayerData.instance.GetInt("silkSpecialLevel"); } set { PlayerData.instance.SetInt("silkSpecialLevel", value); } } public static bool hasNeedleThrow { get { return PlayerData.instance.GetBool("hasNeedleThrow"); } set { PlayerData.instance.SetBool("hasNeedleThrow", value); } } public static bool hasThreadSphere { get { return PlayerData.instance.GetBool("hasThreadSphere"); } set { PlayerData.instance.SetBool("hasThreadSphere", value); } } public static bool hasParry { get { return PlayerData.instance.GetBool("hasParry"); } set { PlayerData.instance.SetBool("hasParry", value); } } public static bool hasHarpoonDash { get { return PlayerData.instance.GetBool("hasHarpoonDash"); } set { PlayerData.instance.SetBool("hasHarpoonDash", value); } } public static bool hasSilkCharge { get { return PlayerData.instance.GetBool("hasSilkCharge"); } set { PlayerData.instance.SetBool("hasSilkCharge", value); } } public static bool hasSilkBomb { get { return PlayerData.instance.GetBool("hasSilkBomb"); } set { PlayerData.instance.SetBool("hasSilkBomb", value); } } public static bool hasSilkBossNeedle { get { return PlayerData.instance.GetBool("hasSilkBossNeedle"); } set { PlayerData.instance.SetBool("hasSilkBossNeedle", value); } } public static bool hasNeedolin { get { return PlayerData.instance.GetBool("hasNeedolin"); } set { PlayerData.instance.SetBool("hasNeedolin", value); } } public static int attunement { get { return PlayerData.instance.GetInt("attunement"); } set { PlayerData.instance.SetInt("attunement", value); } } public static int attunementLevel { get { return PlayerData.instance.GetInt("attunementLevel"); } set { PlayerData.instance.SetInt("attunementLevel", value); } } public static bool hasNeedolinMemoryPowerup { get { return PlayerData.instance.GetBool("hasNeedolinMemoryPowerup"); } set { PlayerData.instance.SetBool("hasNeedolinMemoryPowerup", value); } } public static bool hasDash { get { return PlayerData.instance.GetBool("hasDash"); } set { PlayerData.instance.SetBool("hasDash", value); } } public static bool hasBrolly { get { return PlayerData.instance.GetBool("hasBrolly"); } set { PlayerData.instance.SetBool("hasBrolly", value); } } public static bool hasWalljump { get { return PlayerData.instance.GetBool("hasWalljump"); } set { PlayerData.instance.SetBool("hasWalljump", value); } } public static bool hasDoubleJump { get { return PlayerData.instance.GetBool("hasDoubleJump"); } set { PlayerData.instance.SetBool("hasDoubleJump", value); } } public static bool hasQuill { get { return PlayerData.instance.GetBool("hasQuill"); } set { PlayerData.instance.SetBool("hasQuill", value); } } public static bool hasChargeSlash { get { return PlayerData.instance.GetBool("hasChargeSlash"); } set { PlayerData.instance.SetBool("hasChargeSlash", value); } } public static bool hasSuperJump { get { return PlayerData.instance.GetBool("hasSuperJump"); } set { PlayerData.instance.SetBool("hasSuperJump", value); } } public static int QuillState { get { return PlayerData.instance.GetInt("QuillState"); } set { PlayerData.instance.SetInt("QuillState", value); } } public static bool HasSeenDash { get { return PlayerData.instance.GetBool("HasSeenDash"); } set { PlayerData.instance.SetBool("HasSeenDash", value); } } public static bool HasSeenWalljump { get { return PlayerData.instance.GetBool("HasSeenWalljump"); } set { PlayerData.instance.SetBool("HasSeenWalljump", value); } } public static bool HasSeenSuperJump { get { return PlayerData.instance.GetBool("HasSeenSuperJump"); } set { PlayerData.instance.SetBool("HasSeenSuperJump", value); } } public static bool HasSeenNeedolin { get { return PlayerData.instance.GetBool("HasSeenNeedolin"); } set { PlayerData.instance.SetBool("HasSeenNeedolin", value); } } public static bool HasSeenNeedolinUp { get { return PlayerData.instance.GetBool("HasSeenNeedolinUp"); } set { PlayerData.instance.SetBool("HasSeenNeedolinUp", value); } } public static bool HasSeenNeedolinDown { get { return PlayerData.instance.GetBool("HasSeenNeedolinDown"); } set { PlayerData.instance.SetBool("HasSeenNeedolinDown", value); } } public static bool HasSeenHarpoon { get { return PlayerData.instance.GetBool("HasSeenHarpoon"); } set { PlayerData.instance.SetBool("HasSeenHarpoon", value); } } public static bool HasSeenEvaHeal { get { return PlayerData.instance.GetBool("HasSeenEvaHeal"); } set { PlayerData.instance.SetBool("HasSeenEvaHeal", value); } } public static int cloakOdour_slabFly { get { return PlayerData.instance.GetInt("cloakOdour_slabFly"); } set { PlayerData.instance.SetInt("cloakOdour_slabFly", value); } } public static bool HasSeenSilkHearts { get { return PlayerData.instance.GetBool("HasSeenSilkHearts"); } set { PlayerData.instance.SetBool("HasSeenSilkHearts", value); } } public static bool hasKilled { get { return PlayerData.instance.GetBool("hasKilled"); } set { PlayerData.instance.SetBool("hasKilled", value); } } public static CompletionState CompletedEndings { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<CompletionState>((IIncludeVariableExtensions)(object)PlayerData.instance, "CompletedEndings"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<CompletionState>((IIncludeVariableExtensions)(object)PlayerData.instance, "CompletedEndings", value); } } public static CompletionState LastCompletedEnding { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<CompletionState>((IIncludeVariableExtensions)(object)PlayerData.instance, "LastCompletedEnding"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<CompletionState>((IIncludeVariableExtensions)(object)PlayerData.instance, "LastCompletedEnding", value); } } public static bool fixerQuestBoardConvo { get { return PlayerData.instance.GetBool("fixerQuestBoardConvo"); } set { PlayerData.instance.SetBool("fixerQuestBoardConvo", value); } } public static bool fixerAcceptedQuestConvo { get { return PlayerData.instance.GetBool("fixerAcceptedQuestConvo"); } set { PlayerData.instance.SetBool("fixerAcceptedQuestConvo", value); } } public static bool fixerBridgeConstructed { get { return PlayerData.instance.GetBool("fixerBridgeConstructed"); } set { PlayerData.instance.SetBool("fixerBridgeConstructed", value); } } public static bool fixerBridgeBreaking { get { return PlayerData.instance.GetBool("fixerBridgeBreaking"); } set { PlayerData.instance.SetBool("fixerBridgeBreaking", value); } } public static bool fixerBridgeBroken { get { return PlayerData.instance.GetBool("fixerBridgeBroken"); } set { PlayerData.instance.SetBool("fixerBridgeBroken", value); } } public static bool fixerStatueConstructed { get { return PlayerData.instance.GetBool("fixerStatueConstructed"); } set { PlayerData.instance.SetBool("fixerStatueConstructed", value); } } public static bool fixerStatueConvo { get { return PlayerData.instance.GetBool("fixerStatueConvo"); } set { PlayerData.instance.SetBool("fixerStatueConvo", value); } } public static bool metSherma { get { return PlayerData.instance.GetBool("metSherma"); } set { PlayerData.instance.SetBool("metSherma", value); } } public static bool seenBellBeast { get { return PlayerData.instance.GetBool("seenBellBeast"); } set { PlayerData.instance.SetBool("seenBellBeast", value); } } public static int shermaPos { get { return PlayerData.instance.GetInt("shermaPos"); } set { PlayerData.instance.SetInt("shermaPos", value); } } public static bool shermaConvoBellBeast { get { return PlayerData.instance.GetBool("shermaConvoBellBeast"); } set { PlayerData.instance.SetBool("shermaConvoBellBeast", value); } } public static bool metShermaPilgrimsRest { get { return PlayerData.instance.GetBool("metShermaPilgrimsRest"); } set { PlayerData.instance.SetBool("metShermaPilgrimsRest", value); } } public static bool shermaInBellhart { get { return PlayerData.instance.GetBool("shermaInBellhart"); } set { PlayerData.instance.SetBool("shermaInBellhart", value); } } public static bool shermaSeenInBellhart { get { return PlayerData.instance.GetBool("shermaSeenInBellhart"); } set { PlayerData.instance.SetBool("shermaSeenInBellhart", value); } } public static bool shermaSeenInSteps { get { return PlayerData.instance.GetBool("shermaSeenInSteps"); } set { PlayerData.instance.SetBool("shermaSeenInSteps", value); } } public static bool shermaAtSteps { get { return PlayerData.instance.GetBool("shermaAtSteps"); } set { PlayerData.instance.SetBool("shermaAtSteps", value); } } public static bool shermaConvoCoralBench { get { return PlayerData.instance.GetBool("shermaConvoCoralBench"); } set { PlayerData.instance.SetBool("shermaConvoCoralBench", value); } } public static bool shermaConvoCoralJudges { get { return PlayerData.instance.GetBool("shermaConvoCoralJudges"); } set { PlayerData.instance.SetBool("shermaConvoCoralJudges", value); } } public static bool hasActivatedBellBench { get { return PlayerData.instance.GetBool("hasActivatedBellBench"); } set { PlayerData.instance.SetBool("hasActivatedBellBench", value); } } public static bool shermaWokeInSteps { get { return PlayerData.instance.GetBool("shermaWokeInSteps"); } set { PlayerData.instance.SetBool("shermaWokeInSteps", value); } } public static bool enteredCoral_10 { get { return PlayerData.instance.GetBool("enteredCoral_10"); } set { PlayerData.instance.SetBool("enteredCoral_10", value); } } public static bool shermaCitadelEntrance_Visiting { get { return PlayerData.instance.GetBool("shermaCitadelEntrance_Visiting"); } set { PlayerData.instance.SetBool("shermaCitadelEntrance_Visiting", value); } } public static bool shermaCitadelEntrance_Seen { get { return PlayerData.instance.GetBool("shermaCitadelEntrance_Seen"); } set { PlayerData.instance.SetBool("shermaCitadelEntrance_Seen", value); } } public static bool shermaCitadelEntrance_Left { get { return PlayerData.instance.GetBool("shermaCitadelEntrance_Left"); } set { PlayerData.instance.SetBool("shermaCitadelEntrance_Left", value); } } public static bool openedCitadelSpaLeft { get { return PlayerData.instance.GetBool("openedCitadelSpaLeft"); } set { PlayerData.instance.SetBool("openedCitadelSpaLeft", value); } } public static bool openedCitadelSpaRight { get { return PlayerData.instance.GetBool("openedCitadelSpaRight"); } set { PlayerData.instance.SetBool("openedCitadelSpaRight", value); } } public static bool shermaCitadelSpa_Visiting { get { return PlayerData.instance.GetBool("shermaCitadelSpa_Visiting"); } set { PlayerData.instance.SetBool("shermaCitadelSpa_Visiting", value); } } public static bool shermaCitadelSpa_Seen { get { return PlayerData.instance.GetBool("shermaCitadelSpa_Seen"); } set { PlayerData.instance.SetBool("shermaCitadelSpa_Seen", value); } } public static bool shermaCitadelSpa_Left { get { return PlayerData.instance.GetBool("shermaCitadelSpa_Left"); } set { PlayerData.instance.SetBool("shermaCitadelSpa_Left", value); } } public static bool shermaCitadelSpa_ExtraConvo { get { return PlayerData.instance.GetBool("shermaCitadelSpa_ExtraConvo"); } set { PlayerData.instance.SetBool("shermaCitadelSpa_ExtraConvo", value); } } public static bool shermaInEnclave { get { return PlayerData.instance.GetBool("shermaInEnclave"); } set { PlayerData.instance.SetBool("shermaInEnclave", value); } } public static bool shermaCitadelEnclave_Seen { get { return PlayerData.instance.GetBool("shermaCitadelEnclave_Seen"); } set { PlayerData.instance.SetBool("shermaCitadelEnclave_Seen", value); } } public static bool metShermaEnclave { get { return PlayerData.instance.GetBool("metShermaEnclave"); } set { PlayerData.instance.SetBool("metShermaEnclave", value); } } public static bool shermaEnclaveHealingConvo { get { return PlayerData.instance.GetBool("shermaEnclaveHealingConvo"); } set { PlayerData.instance.SetBool("shermaEnclaveHealingConvo", value); } } public static bool shermaQuestActive { get { return PlayerData.instance.GetBool("shermaQuestActive"); } set { PlayerData.instance.SetBool("shermaQuestActive", value); } } public static bool shermaHealerActive { get { return PlayerData.instance.GetBool("shermaHealerActive"); } set { PlayerData.instance.SetBool("shermaHealerActive", value); } } public static int shermaWoundedPilgrim { get { return PlayerData.instance.GetInt("shermaWoundedPilgrim"); } set { PlayerData.instance.SetInt("shermaWoundedPilgrim", value); } } public static bool shermaCaretakerConvo1 { get { return PlayerData.instance.GetBool("shermaCaretakerConvo1"); } set { PlayerData.instance.SetBool("shermaCaretakerConvo1", value); } } public static bool shermaCaretakerConvoFinal { get { return PlayerData.instance.GetBool("shermaCaretakerConvoFinal"); } set { PlayerData.instance.SetBool("shermaCaretakerConvoFinal", value); } } public static bool metMapper { get { return PlayerData.instance.GetBool("metMapper"); } set { PlayerData.instance.SetBool("metMapper", value); } } public static bool mapperRosaryConvo { get { return PlayerData.instance.GetBool("mapperRosaryConvo"); } set { PlayerData.instance.SetBool("mapperRosaryConvo", value); } } public static bool mapperMentorConvo { get { return PlayerData.instance.GetBool("mapperMentorConvo"); } set { PlayerData.instance.SetBool("mapperMentorConvo", value); } } public static bool mapperQuillConvo { get { return PlayerData.instance.GetBool("mapperQuillConvo"); } set { PlayerData.instance.SetBool("mapperQuillConvo", value); } } public static bool mapperMappingConvo { get { return PlayerData.instance.GetBool("mapperMappingConvo"); } set { PlayerData.instance.SetBool("mapperMappingConvo", value); } } public static bool mapperCalledConvo { get { return PlayerData.instance.GetBool("mapperCalledConvo"); } set { PlayerData.instance.SetBool("mapperCalledConvo", value); } } public static bool mapperHauntedBellhartConvo { get { return PlayerData.instance.GetBool("mapperHauntedBellhartConvo"); } set { PlayerData.instance.SetBool("mapperHauntedBellhartConvo", value); } } public static bool mapperBellhartConvo { get { return PlayerData.instance.GetBool("mapperBellhartConvo"); } set { PlayerData.instance.SetBool("mapperBellhartConvo", value); } } public static bool mapperBellhartConvoTimePassed { get { return PlayerData.instance.GetBool("mapperBellhartConvoTimePassed"); } set { PlayerData.instance.SetBool("mapperBellhartConvoTimePassed", value); } } public static bool mapperBellhartConvo2 { get { return PlayerData.instance.GetBool("mapperBellhartConvo2"); } set { PlayerData.instance.SetBool("mapperBellhartConvo2", value); } } public static bool mapperAway { get { return PlayerData.instance.GetBool("mapperAway"); } set { PlayerData.instance.SetBool("mapperAway", value); } } public static bool mapperMetInAnt04 { get { return PlayerData.instance.GetBool("mapperMetInAnt04"); } set { PlayerData.instance.SetBool("mapperMetInAnt04", value); } } public static bool mapperTubeConvo { get { return PlayerData.instance.GetBool("mapperTubeConvo"); } set { PlayerData.instance.SetBool("mapperTubeConvo", value); } } public static bool mapperBrokenBenchConvo { get { return PlayerData.instance.GetBool("mapperBrokenBenchConvo"); } set { PlayerData.instance.SetBool("mapperBrokenBenchConvo", value); } } public static bool mapperCursedConvo { get { return PlayerData.instance.GetBool("mapperCursedConvo"); } set { PlayerData.instance.SetBool("mapperCursedConvo", value); } } public static bool mapperMaggottedConvo { get { return PlayerData.instance.GetBool("mapperMaggottedConvo"); } set { PlayerData.instance.SetBool("mapperMaggottedConvo", value); } } public static bool mapperSellingTubePins { get { return PlayerData.instance.GetBool("mapperSellingTubePins"); } set { PlayerData.instance.SetBool("mapperSellingTubePins", value); } } public static bool mapperMasterAfterConvo { get { return PlayerData.instance.GetBool("mapperMasterAfterConvo"); } set { PlayerData.instance.SetBool("mapperMasterAfterConvo", value); } } public static bool mapperReactedToBrokenBellBench { get { return PlayerData.instance.GetBool("mapperReactedToBrokenBellBench"); } set { PlayerData.instance.SetBool("mapperReactedToBrokenBellBench", value); } } public static bool SeenMapperBonetown { get { return PlayerData.instance.GetBool("SeenMapperBonetown"); } set { PlayerData.instance.SetBool("SeenMapperBonetown", value); } } public static bool MapperLeftBonetown { get { return PlayerData.instance.GetBool("MapperLeftBonetown"); } set { PlayerData.instance.SetBool("MapperLeftBonetown", value); } } public static bool MapperAppearInBellhart { get { return PlayerData.instance.GetBool("MapperAppearInBellhart"); } set { PlayerData.instance.SetBool("MapperAppearInBellhart", value); } } public static bool SeenMapperBoneForest { get { return PlayerData.instance.GetBool("SeenMapperBoneForest"); } set { PlayerData.instance.SetBool("SeenMapperBoneForest", value); } } public static bool MapperLeftBoneForest { get { return PlayerData.instance.GetBool("MapperLeftBoneForest"); } set { PlayerData.instance.SetBool("MapperLeftBoneForest", value); } } public static bool SeenMapperDocks { get { return PlayerData.instance.GetBool("SeenMapperDocks"); } set { PlayerData.instance.SetBool("SeenMapperDocks", value); } } public static bool MapperLeftDocks { get { return PlayerData.instance.GetBool("MapperLeftDocks"); } set { PlayerData.instance.SetBool("MapperLeftDocks", value); } } public static bool SeenMapperWilds { get { return PlayerData.instance.GetBool("SeenMapperWilds"); } set { PlayerData.instance.SetBool("SeenMapperWilds", value); } } public static bool MapperLeftWilds { get { return PlayerData.instance.GetBool("MapperLeftWilds"); } set { PlayerData.instance.SetBool("MapperLeftWilds", value); } } public static bool SeenMapperCrawl { get { return PlayerData.instance.GetBool("SeenMapperCrawl"); } set { PlayerData.instance.SetBool("SeenMapperCrawl", value); } } public static bool MapperLeftCrawl { get { return PlayerData.instance.GetBool("MapperLeftCrawl"); } set { PlayerData.instance.SetBool("MapperLeftCrawl", value); } } public static bool SeenMapperGreymoor { get { return PlayerData.instance.GetBool("SeenMapperGreymoor"); } set { PlayerData.instance.SetBool("SeenMapperGreymoor", value); } } public static bool MapperLeftGreymoor { get { return PlayerData.instance.GetBool("MapperLeftGreymoor"); } set { PlayerData.instance.SetBool("MapperLeftGreymoor", value); } } public static bool SeenMapperBellhart { get { return PlayerData.instance.GetBool("SeenMapperBellhart"); } set { PlayerData.instance.SetBool("SeenMapperBellhart", value); } } public static bool MapperLeftBellhart { get { return PlayerData.instance.GetBool("MapperLeftBellhart"); } set { PlayerData.instance.SetBool("MapperLeftBellhart", value); } } public static bool SeenMapperShellwood { get { return PlayerData.instance.GetBool("SeenMapperShellwood"); } set { PlayerData.instance.SetBool("SeenMapperShellwood", value); } } public static bool MapperLeftShellwood { get { return PlayerData.instance.GetBool("MapperLeftShellwood"); } set { PlayerData.instance.SetBool("MapperLeftShellwood", value); } } public static bool SeenMapperHuntersNest { get { return PlayerData.instance.GetBool("SeenMapperHuntersNest"); } set { PlayerData.instance.SetBool("SeenMapperHuntersNest", value); } } public static bool MapperLeftHuntersNest { get { return PlayerData.instance.GetBool("MapperLeftHuntersNest"); } set { PlayerData.instance.SetBool("MapperLeftHuntersNest", value); } } public static bool SeenMapperJudgeSteps { get { return PlayerData.instance.GetBool("SeenMapperJudgeSteps"); } set { PlayerData.instance.SetBool("SeenMapperJudgeSteps", value); } } public static bool MapperLeftJudgeSteps { get { return PlayerData.instance.GetBool("MapperLeftJudgeSteps"); } set { PlayerData.instance.SetBool("MapperLeftJudgeSteps", value); } } public static bool SeenMapperDustpens { get { return PlayerData.instance.GetBool("SeenMapperDustpens"); } set { PlayerData.instance.SetBool("SeenMapperDustpens", value); } } public static bool MapperLeftDustpens { get { return PlayerData.instance.GetBool("MapperLeftDustpens"); } set { PlayerData.instance.SetBool("MapperLeftDustpens", value); } } public static bool SeenMapperPeak { get { return PlayerData.instance.GetBool("SeenMapperPeak"); } set { PlayerData.instance.SetBool("SeenMapperPeak", value); } } public static bool MapperLeftPeak { get { return PlayerData.instance.GetBool("MapperLeftPeak"); } set { PlayerData.instance.SetBool("MapperLeftPeak", value); } } public static bool SeenMapperShadow { get { return PlayerData.instance.GetBool("SeenMapperShadow"); } set { PlayerData.instance.SetBool("SeenMapperShadow", value); } } public static bool MapperLeftShadow { get { return PlayerData.instance.GetBool("MapperLeftShadow"); } set { PlayerData.instance.SetBool("MapperLeftShadow", value); } } public static bool SeenMapperCoralCaverns { get { return PlayerData.instance.GetBool("SeenMapperCoralCaverns"); } set { PlayerData.instance.SetBool("SeenMapperCoralCaverns", value); } } public static bool MapperLeftCoralCaverns { get { return PlayerData.instance.GetBool("MapperLeftCoralCaverns"); } set { PlayerData.instance.SetBool("MapperLeftCoralCaverns", value); } } public static bool mapperSparIntro { get { return PlayerData.instance.GetBool("mapperSparIntro"); } set { PlayerData.instance.SetBool("mapperSparIntro", value); } } public static int mapperLocationAct3 { get { return PlayerData.instance.GetInt("mapperLocationAct3"); } set { PlayerData.instance.SetInt("mapperLocationAct3", value); } } public static bool seenMapperAct3 { get { return PlayerData.instance.GetBool("seenMapperAct3"); } set { PlayerData.instance.SetBool("seenMapperAct3", value); } } public static bool mapperIsFightingAct3 { get { return PlayerData.instance.GetBool("mapperIsFightingAct3"); } set { PlayerData.instance.SetBool("mapperIsFightingAct3", value); } } public static int mapperFightGroup { get { return PlayerData.instance.GetInt("mapperFightGroup"); } set { PlayerData.instance.SetInt("mapperFightGroup", value); } } public static bool mapperConvo_Act3Intro { get { return PlayerData.instance.GetBool("mapperConvo_Act3Intro"); } set { PlayerData.instance.SetBool("mapperConvo_Act3Intro", value); } } public static bool mapperConvo_Act3IntroTimePassed { get { return PlayerData.instance.GetBool("mapperConvo_Act3IntroTimePassed"); } set { PlayerData.instance.SetBool("mapperConvo_Act3IntroTimePassed", value); } } public static bool mapperConvo_Act3NoStock { get { return PlayerData.instance.GetBool("mapperConvo_Act3NoStock"); } set { PlayerData.instance.SetBool("mapperConvo_Act3NoStock", value); } } public static bool mapperConvo_WhiteFlower { get { return PlayerData.instance.GetBool("mapperConvo_WhiteFlower"); } set { PlayerData.instance.SetBool("mapperConvo_WhiteFlower", value); } } public static bool metDruid { get { return PlayerData.instance.GetBool("metDruid"); } set { PlayerData.instance.SetBool("metDruid", value); } } public static bool druidTradeIntro { get { return PlayerData.instance.GetBool("druidTradeIntro"); } set { PlayerData.instance.SetBool("druidTradeIntro", value); } } public static int druidMossBerriesSold { get { return PlayerData.instance.GetInt("druidMossBerriesSold"); } set { PlayerData.instance.SetInt("druidMossBerriesSold", value); } } public static int[] mossBerryValueList { get { return VariableExtensions.GetVariable<int[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "mossBerryValueList"); } set { VariableExtensions.SetVariable<int[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "mossBerryValueList", value); } } public static bool druidAct3Intro { get { return PlayerData.instance.GetBool("druidAct3Intro"); } set { PlayerData.instance.SetBool("druidAct3Intro", value); } } public static bool metLearnedPilgrim { get { return PlayerData.instance.GetBool("metLearnedPilgrim"); } set { PlayerData.instance.SetBool("metLearnedPilgrim", value); } } public static bool metLearnedPilgrimAct3 { get { return PlayerData.instance.GetBool("metLearnedPilgrimAct3"); } set { PlayerData.instance.SetBool("metLearnedPilgrimAct3", value); } } public static bool metDicePilgrim { get { return PlayerData.instance.GetBool("metDicePilgrim"); } set { PlayerData.instance.SetBool("metDicePilgrim", value); } } public static bool dicePilgrimDefeated { get { return PlayerData.instance.GetBool("dicePilgrimDefeated"); } set { PlayerData.instance.SetBool("dicePilgrimDefeated", value); } } public static int dicePilgrimState { get { return PlayerData.instance.GetInt("dicePilgrimState"); } set { PlayerData.instance.SetInt("dicePilgrimState", value); } } public static bool dicePilgrimGameExplained { get { return PlayerData.instance.GetBool("dicePilgrimGameExplained"); } set { PlayerData.instance.SetBool("dicePilgrimGameExplained", value); } } public static int dicePilgrimBank { get { return PlayerData.instance.GetInt("dicePilgrimBank"); } set { PlayerData.instance.SetInt("dicePilgrimBank", value); } } public static bool metGarmond { get { return PlayerData.instance.GetBool("metGarmond"); } set { PlayerData.instance.SetBool("metGarmond", value); } } public static bool garmondMoorwingConvo { get { return PlayerData.instance.GetBool("garmondMoorwingConvo"); } set { PlayerData.instance.SetBool("garmondMoorwingConvo", value); } } public static bool garmondMoorwingConvoReady { get { return PlayerData.instance.GetBool("garmondMoorwingConvoReady"); } set { PlayerData.instance.SetBool("garmondMoorwingConvoReady", value); } } public static bool garmondPurposeConvo { get { return PlayerData.instance.GetBool("garmondPurposeConvo"); } set { PlayerData.instance.SetBool("garmondPurposeConvo", value); } } public static bool garmondSeenInGreymoor10 { get { return PlayerData.instance.GetBool("garmondSeenInGreymoor10"); } set { PlayerData.instance.SetBool("garmondSeenInGreymoor10", value); } } public static bool garmondInDust05 { get { return PlayerData.instance.GetBool("garmondInDust05"); } set { PlayerData.instance.SetBool("garmondInDust05", value); } } public static bool garmondSeenInDust05 { get { return PlayerData.instance.GetBool("garmondSeenInDust05"); } set { PlayerData.instance.SetBool("garmondSeenInDust05", value); } } public static bool garmondEncounterCooldown { get { return PlayerData.instance.GetBool("garmondEncounterCooldown"); } set { PlayerData.instance.SetBool("garmondEncounterCooldown", value); } } public static bool enteredSong_19 { get { return PlayerData.instance.GetBool("enteredSong_19"); } set { PlayerData.instance.SetBool("enteredSong_19", value); } } public static bool enteredSong_01 { get { return PlayerData.instance.GetBool("enteredSong_01"); } set { PlayerData.instance.SetBool("enteredSong_01", value); } } public static bool enteredSong_02 { get { return PlayerData.instance.GetBool("enteredSong_02"); } set { PlayerData.instance.SetBool("enteredSong_02", value); } } public static bool garmondInSong01 { get { return PlayerData.instance.GetBool("garmondInSong01"); } set { PlayerData.instance.SetBool("garmondInSong01", value); } } public static bool garmondSeenInSong01 { get { return PlayerData.instance.GetBool("garmondSeenInSong01"); } set { PlayerData.instance.SetBool("garmondSeenInSong01", value); } } public static bool garmondInSong02 { get { return PlayerData.instance.GetBool("garmondInSong02"); } set { PlayerData.instance.SetBool("garmondInSong02", value); } } public static bool garmondSeenInSong02 { get { return PlayerData.instance.GetBool("garmondSeenInSong02"); } set { PlayerData.instance.SetBool("garmondSeenInSong02", value); } } public static bool enteredSong_13 { get { return PlayerData.instance.GetBool("enteredSong_13"); } set { PlayerData.instance.SetBool("enteredSong_13", value); } } public static bool garmondInSong13 { get { return PlayerData.instance.GetBool("garmondInSong13"); } set { PlayerData.instance.SetBool("garmondInSong13", value); } } public static bool garmondSeenInSong13 { get { return PlayerData.instance.GetBool("garmondSeenInSong13"); } set { PlayerData.instance.SetBool("garmondSeenInSong13", value); } } public static bool enteredSong_17 { get { return PlayerData.instance.GetBool("enteredSong_17"); } set { PlayerData.instance.SetBool("enteredSong_17", value); } } public static bool garmondInSong17 { get { return PlayerData.instance.GetBool("garmondInSong17"); } set { PlayerData.instance.SetBool("garmondInSong17", value); } } public static bool garmondSeenInSong17 { get { return PlayerData.instance.GetBool("garmondSeenInSong17"); } set { PlayerData.instance.SetBool("garmondSeenInSong17", value); } } public static bool garmondInLibrary { get { return PlayerData.instance.GetBool("garmondInLibrary"); } set { PlayerData.instance.SetBool("garmondInLibrary", value); } } public static bool garmondLibrarySeen { get { return PlayerData.instance.GetBool("garmondLibrarySeen"); } set { PlayerData.instance.SetBool("garmondLibrarySeen", value); } } public static bool garmondLibraryMet { get { return PlayerData.instance.GetBool("garmondLibraryMet"); } set { PlayerData.instance.SetBool("garmondLibraryMet", value); } } public static bool garmondLibraryOffered { get { return PlayerData.instance.GetBool("garmondLibraryOffered"); } set { PlayerData.instance.SetBool("garmondLibraryOffered", value); } } public static bool garmondLibraryDefeatedHornet { get { return PlayerData.instance.GetBool("garmondLibraryDefeatedHornet"); } set { PlayerData.instance.SetBool("garmondLibraryDefeatedHornet", value); } } public static bool garmondWillAidInForumBattle { get { return PlayerData.instance.GetBool("garmondWillAidInForumBattle"); } set { PlayerData.instance.SetBool("garmondWillAidInForumBattle", value); } } public static bool garmondInEnclave { get { return PlayerData.instance.GetBool("garmondInEnclave"); } set { PlayerData.instance.SetBool("garmondInEnclave", value); } } public static bool garmondMetEnclave { get { return PlayerData.instance.GetBool("garmondMetEnclave"); } set { PlayerData.instance.SetBool("garmondMetEnclave", value); } } public static int garmondEncounters_act3 { get { return PlayerData.instance.GetInt("garmondEncounters_act3"); } set { PlayerData.instance.SetInt("garmondEncounters_act3", value); } } public static bool metGarmondAct3 { get { return PlayerData.instance.GetBool("metGarmondAct3"); } set { PlayerData.instance.SetBool("metGarmondAct3", value); } } public static bool garmondFinalQuestReady { get { return PlayerData.instance.GetBool("garmondFinalQuestReady"); } set { PlayerData.instance.SetBool("garmondFinalQuestReady", value); } } public static bool garmondBlackThreadDefeated { get { return PlayerData.instance.GetBool("garmondBlackThreadDefeated"); } set { PlayerData.instance.SetBool("garmondBlackThreadDefeated", value); } } public static bool pilgrimRestMerchant_SingConvo { get { return PlayerData.instance.GetBool("pilgrimRestMerchant_SingConvo"); } set { PlayerData.instance.SetBool("pilgrimRestMerchant_SingConvo", value); } } public static bool pilgrimRestMerchant_RhinoRuckusConvo { get { return PlayerData.instance.GetBool("pilgrimRestMerchant_RhinoRuckusConvo"); } set { PlayerData.instance.SetBool("pilgrimRestMerchant_RhinoRuckusConvo", value); } } public static int pilgrimRestCrowd { get { return PlayerData.instance.GetInt("pilgrimRestCrowd"); } set { PlayerData.instance.SetInt("pilgrimRestCrowd", value); } } public static bool nuuIsHome { get { return PlayerData.instance.GetBool("nuuIsHome"); } set { PlayerData.instance.SetBool("nuuIsHome", value); } } public static bool MetHalfwayHunterFan { get { return PlayerData.instance.GetBool("MetHalfwayHunterFan"); } set { PlayerData.instance.SetBool("MetHalfwayHunterFan", value); } } public static bool MetHunterFanOutside { get { return PlayerData.instance.GetBool("MetHunterFanOutside"); } set { PlayerData.instance.SetBool("MetHunterFanOutside", value); } } public static bool nuuVisiting_splinterQueen { get { return PlayerData.instance.GetBool("nuuVisiting_splinterQueen"); } set { PlayerData.instance.SetBool("nuuVisiting_splinterQueen", value); } } public static bool nuuEncountered_splinterQueen { get { return PlayerData.instance.GetBool("nuuEncountered_splinterQueen"); } set { PlayerData.instance.SetBool("nuuEncountered_splinterQueen", value); } } public static bool nuuVisiting_coralDrillers { get { return PlayerData.instance.GetBool("nuuVisiting_coralDrillers"); } set { PlayerData.instance.SetBool("nuuVisiting_coralDrillers", value); } } public static bool nuuEncountered_coralDrillers { get { return PlayerData.instance.GetBool("nuuEncountered_coralDrillers"); } set { PlayerData.instance.SetBool("nuuEncountered_coralDrillers", value); } } public static bool nuuVisiting_skullKing { get { return PlayerData.instance.GetBool("nuuVisiting_skullKing"); } set { PlayerData.instance.SetBool("nuuVisiting_skullKing", value); } } public static bool nuuEncountered_skullKing { get { return PlayerData.instance.GetBool("nuuEncountered_skullKing"); } set { PlayerData.instance.SetBool("nuuEncountered_skullKing", value); } } public static bool nuuVisiting_zapNest { get { return PlayerData.instance.GetBool("nuuVisiting_zapNest"); } set { PlayerData.instance.SetBool("nuuVisiting_zapNest", value); } } public static bool nuuEncountered_zapNest { get { return PlayerData.instance.GetBool("nuuEncountered_zapNest"); } set { PlayerData.instance.SetBool("nuuEncountered_zapNest", value); } } public static bool nuuSlappedOutside { get { return PlayerData.instance.GetBool("nuuSlappedOutside"); } set { PlayerData.instance.SetBool("nuuSlappedOutside", value); } } public static bool nuuIntroAct3 { get { return PlayerData.instance.GetBool("nuuIntroAct3"); } set { PlayerData.instance.SetBool("nuuIntroAct3", value); } } public static bool nuuMementoAwarded { get { return PlayerData.instance.GetBool("nuuMementoAwarded"); } set { PlayerData.instance.SetBool("nuuMementoAwarded", value); } } public static bool gillyMet { get { return PlayerData.instance.GetBool("gillyMet"); } set { PlayerData.instance.SetBool("gillyMet", value); } } public static bool gillyIntroduced { get { return PlayerData.instance.GetBool("gillyIntroduced"); } set { PlayerData.instance.SetBool("gillyIntroduced", value); } } public static bool gillyStatueConvo { get { return PlayerData.instance.GetBool("gillyStatueConvo"); } set { PlayerData.instance.SetBool("gillyStatueConvo", value); } } public static bool gillyTrapConvo { get { return PlayerData.instance.GetBool("gillyTrapConvo"); } set { PlayerData.instance.SetBool("gillyTrapConvo", value); } } public static bool gillyHunterCampConvo { get { return PlayerData.instance.GetBool("gillyHunterCampConvo"); } set { PlayerData.instance.SetBool("gillyHunterCampConvo", value); } } public static bool gillyAct3Convo { get { return PlayerData.instance.GetBool("gillyAct3Convo"); } set { PlayerData.instance.SetBool("gillyAct3Convo", value); } } public static int gillyLocation { get { return PlayerData.instance.GetInt("gillyLocation"); } set { PlayerData.instance.SetInt("gillyLocation", value); } } public static int gillyLocationAct3 { get { return PlayerData.instance.GetInt("gillyLocationAct3"); } set { PlayerData.instance.SetInt("gillyLocationAct3", value); } } public static bool gillyQueueMovingOn { get { return PlayerData.instance.GetBool("gillyQueueMovingOn"); } set { PlayerData.instance.SetBool("gillyQueueMovingOn", value); } } public static string dreamReturnScene { get { return PlayerData.instance.GetString("dreamReturnScene"); } set { PlayerData.instance.SetString("dreamReturnScene", value); } } public static bool hasJournal { get { return PlayerData.instance.GetBool("hasJournal"); } set { PlayerData.instance.SetBool("hasJournal", value); } } public static bool seenJournalMsg { get { return PlayerData.instance.GetBool("seenJournalMsg"); } set { PlayerData.instance.SetBool("seenJournalMsg", value); } } public static bool seenMateriumMsg { get { return PlayerData.instance.GetBool("seenMateriumMsg"); } set { PlayerData.instance.SetBool("seenMateriumMsg", value); } } public static bool seenJournalQuestUpdateMsg { get { return PlayerData.instance.GetBool("seenJournalQuestUpdateMsg"); } set { PlayerData.instance.SetBool("seenJournalQuestUpdateMsg", value); } } public static EnemyJournalKillData EnemyJournalKillData { get { return VariableExtensions.GetVariable<EnemyJournalKillData>((IIncludeVariableExtensions)(object)PlayerData.instance, "EnemyJournalKillData"); } set { VariableExtensions.SetVariable<EnemyJournalKillData>((IIncludeVariableExtensions)(object)PlayerData.instance, "EnemyJournalKillData", value); } } public static int currentInvPane { get { return PlayerData.instance.GetInt("currentInvPane"); } set { PlayerData.instance.SetInt("currentInvPane", value); } } public static bool showGeoUI { get { return PlayerData.instance.GetBool("showGeoUI"); } set { PlayerData.instance.SetBool("showGeoUI", value); } } public static bool showHealthUI { get { return PlayerData.instance.GetBool("showHealthUI"); } set { PlayerData.instance.SetBool("showHealthUI", value); } } public static bool promptFocus { get { return PlayerData.instance.GetBool("promptFocus"); } set { PlayerData.instance.SetBool("promptFocus", value); } } public static bool seenFocusTablet { get { return PlayerData.instance.GetBool("seenFocusTablet"); } set { PlayerData.instance.SetBool("seenFocusTablet", value); } } public static bool seenDreamNailPrompt { get { return PlayerData.instance.GetBool("seenDreamNailPrompt"); } set { PlayerData.instance.SetBool("seenDreamNailPrompt", value); } } public static bool isFirstGame { get { return PlayerData.instance.GetBool("isFirstGame"); } set { PlayerData.instance.SetBool("isFirstGame", value); } } public static bool enteredTutorialFirstTime { get { return PlayerData.instance.GetBool("enteredTutorialFirstTime"); } set { PlayerData.instance.SetBool("enteredTutorialFirstTime", value); } } public static bool isInvincible { get { return PlayerData.instance.GetBool("isInvincible"); } set { PlayerData.instance.SetBool("isInvincible", value); } } public static bool infiniteAirJump { get { return PlayerData.instance.GetBool("infiniteAirJump"); } set { PlayerData.instance.SetBool("infiniteAirJump", value); } } public static string currentArea { get { return PlayerData.instance.GetString("currentArea"); } set { PlayerData.instance.SetString("currentArea", value); } } public static bool visitedMossCave { get { return PlayerData.instance.GetBool("visitedMossCave"); } set { PlayerData.instance.SetBool("visitedMossCave", value); } } public static bool visitedBoneBottom { get { return PlayerData.instance.GetBool("visitedBoneBottom"); } set { PlayerData.instance.SetBool("visitedBoneBottom", value); } } public static bool visitedBoneForest { get { return PlayerData.instance.GetBool("visitedBoneForest"); } set { PlayerData.instance.SetBool("visitedBoneForest", value); } } public static bool visitedMosstown { get { return PlayerData.instance.GetBool("visitedMosstown"); } set { PlayerData.instance.SetBool("visitedMosstown", value); } } public static bool visitedHuntersTrail { get { return PlayerData.instance.GetBool("visitedHuntersTrail"); } set { PlayerData.instance.SetBool("visitedHuntersTrail", value); } } public static bool visitedDeepDocks { get { return PlayerData.instance.GetBool("visitedDeepDocks"); } set { PlayerData.instance.SetBool("visitedDeepDocks", value); } } public static bool visitedWilds { get { return PlayerData.instance.GetBool("visitedWilds"); } set { PlayerData.instance.SetBool("visitedWilds", value); } } public static bool visitedGrove { get { return PlayerData.instance.GetBool("visitedGrove"); } set { PlayerData.instance.SetBool("visitedGrove", value); } } public static bool visitedGreymoor { get { return PlayerData.instance.GetBool("visitedGreymoor"); } set { PlayerData.instance.SetBool("visitedGreymoor", value); } } public static bool visitedWisp { get { return PlayerData.instance.GetBool("visitedWisp"); } set { PlayerData.instance.SetBool("visitedWisp", value); } } public static bool visitedBellhartHaunted { get { return PlayerData.instance.GetBool("visitedBellhartHaunted"); } set { PlayerData.instance.SetBool("visitedBellhartHaunted", value); } } public static bool visitedBellhart { get { return PlayerData.instance.GetBool("visitedBellhart"); } set { PlayerData.instance.SetBool("visitedBellhart", value); } } public static bool visitedBellhartSaved { get { return PlayerData.instance.GetBool("visitedBellhartSaved"); } set { PlayerData.instance.SetBool("visitedBellhartSaved", value); } } public static bool visitedShellwood { get { return PlayerData.instance.GetBool("visitedShellwood"); } set { PlayerData.instance.SetBool("visitedShellwood", value); } } public static bool visitedCrawl { get { return PlayerData.instance.GetBool("visitedCrawl"); } set { PlayerData.instance.SetBool("visitedCrawl", value); } } public static bool visitedDustpens { get { return PlayerData.instance.GetBool("visitedDustpens"); } set { PlayerData.instance.SetBool("visitedDustpens", value); } } public static bool visitedShadow { get { return PlayerData.instance.GetBool("visitedShadow"); } set { PlayerData.instance.SetBool("visitedShadow", value); } } public static bool visitedAqueducts { get { return PlayerData.instance.GetBool("visitedAqueducts"); } set { PlayerData.instance.SetBool("visitedAqueducts", value); } } public static bool visitedMistmaze { get { return PlayerData.instance.GetBool("visitedMistmaze"); } set { PlayerData.instance.SetBool("visitedMistmaze", value); } } public static bool visitedCoral { get { return PlayerData.instance.GetBool("visitedCoral"); } set { PlayerData.instance.SetBool("visitedCoral", value); } } public static bool visitedCoralRiver { get { return PlayerData.instance.GetBool("visitedCoralRiver"); } set { PlayerData.instance.SetBool("visitedCoralRiver", value); } } public static bool visitedCoralRiverInner { get { return PlayerData.instance.GetBool("visitedCoralRiverInner"); } set { PlayerData.instance.SetBool("visitedCoralRiverInner", value); } } public static bool visitedCoralTower { get { return PlayerData.instance.GetBool("visitedCoralTower"); } set { PlayerData.instance.SetBool("visitedCoralTower", value); } } public static bool visitedSlab { get { return PlayerData.instance.GetBool("visitedSlab"); } set { PlayerData.instance.SetBool("visitedSlab", value); } } public static bool visitedGrandGate { get { return PlayerData.instance.GetBool("visitedGrandGate"); } set { PlayerData.instance.SetBool("visitedGrandGate", value); } } public static bool visitedCitadel { get { return PlayerData.instance.GetBool("visitedCitadel"); } set { PlayerData.instance.SetBool("visitedCitadel", value); } } public static bool visitedUnderstore { get { return PlayerData.instance.GetBool("visitedUnderstore"); } set { PlayerData.instance.SetBool("visitedUnderstore", value); } } public static bool visitedWard { get { return PlayerData.instance.GetBool("visitedWard"); } set { PlayerData.instance.SetBool("visitedWard", value); } } public static bool visitedHalls { get { return PlayerData.instance.GetBool("visitedHalls"); } set { PlayerData.instance.SetBool("visitedHalls", value); } } public static bool visitedLibrary { get { return PlayerData.instance.GetBool("visitedLibrary"); } set { PlayerData.instance.SetBool("visitedLibrary", value); } } public static bool visitedStage { get { return PlayerData.instance.GetBool("visitedStage"); } set { PlayerData.instance.SetBool("visitedStage", value); } } public static bool visitedGloom { get { return PlayerData.instance.GetBool("visitedGloom"); } set { PlayerData.instance.SetBool("visitedGloom", value); } } public static bool visitedWeave { get { return PlayerData.instance.GetBool("visitedWeave"); } set { PlayerData.instance.SetBool("visitedWeave", value); } } public static bool visitedMountain { get { return PlayerData.instance.GetBool("visitedMountain"); } set { PlayerData.instance.SetBool("visitedMountain", value); } } public static bool visitedIceCore { get { return PlayerData.instance.GetBool("visitedIceCore"); } set { PlayerData.instance.SetBool("visitedIceCore", value); } } public static bool visitedHang { get { return PlayerData.instance.GetBool("visitedHang"); } set { PlayerData.instance.SetBool("visitedHang", value); } } public static bool visitedHangAtrium { get { return PlayerData.instance.GetBool("visitedHangAtrium"); } set { PlayerData.instance.SetBool("visitedHangAtrium", value); } } public static bool visitedEnclave { get { return PlayerData.instance.GetBool("visitedEnclave"); } set { PlayerData.instance.SetBool("visitedEnclave", value); } } public static bool visitedArborium { get { return PlayerData.instance.GetBool("visitedArborium"); } set { PlayerData.instance.SetBool("visitedArborium", value); } } public static bool visitedCogwork { get { return PlayerData.instance.GetBool("visitedCogwork"); } set { PlayerData.instance.SetBool("visitedCogwork", value); } } public static bool visitedCradle { get { return PlayerData.instance.GetBool("visitedCradle"); } set { PlayerData.instance.SetBool("visitedCradle", value); } } public static bool visitedRuinedCradle { get { return PlayerData.instance.GetBool("visitedRuinedCradle"); } set { PlayerData.instance.SetBool("visitedRuinedCradle", value); } } public static bool visitedFleatopia { get { return PlayerData.instance.GetBool("visitedFleatopia"); } set { PlayerData.instance.SetBool("visitedFleatopia", value); } } public static bool visitedFleaFestival { get { return PlayerData.instance.GetBool("visitedFleaFestival"); } set { PlayerData.instance.SetBool("visitedFleaFestival", value); } } public static bool visitedAbyss { get { return PlayerData.instance.GetBool("visitedAbyss"); } set { PlayerData.instance.SetBool("visitedAbyss", value); } } public static bool citadelHalfwayComplete { get { return PlayerData.instance.GetBool("citadelHalfwayComplete"); } set { PlayerData.instance.SetBool("citadelHalfwayComplete", value); } } public static HashSet<string> scenesVisited { get { return VariableExtensions.GetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesVisited"); } set { VariableExtensions.SetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesVisited", value); } } public static HashSet<string> scenesMapped { get { return VariableExtensions.GetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesMapped"); } set { VariableExtensions.SetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesMapped", value); } } public static HashSet<string> scenesEncounteredBench { get { return VariableExtensions.GetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesEncounteredBench"); } set { VariableExtensions.SetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesEncounteredBench", value); } } public static HashSet<string> scenesEncounteredCocoon { get { return VariableExtensions.GetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesEncounteredCocoon"); } set { VariableExtensions.SetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesEncounteredCocoon", value); } } public static bool mapUpdateQueued { get { return PlayerData.instance.GetBool("mapUpdateQueued"); } set { PlayerData.instance.SetBool("mapUpdateQueued", value); } } public static bool mapAllRooms { get { return PlayerData.instance.GetBool("mapAllRooms"); } set { PlayerData.instance.SetBool("mapAllRooms", value); } } public static bool HasSeenMapUpdated { get { return PlayerData.instance.GetBool("HasSeenMapUpdated"); } set { PlayerData.instance.SetBool("HasSeenMapUpdated", value); } } public static bool HasSeenMapMarkerUpdated { get { return PlayerData.instance.GetBool("HasSeenMapMarkerUpdated"); } set { PlayerData.instance.SetBool("HasSeenMapMarkerUpdated", value); } } public static bool HasMossGrottoMap { get { return PlayerData.instance.GetBool("HasMossGrottoMap"); } set { PlayerData.instance.SetBool("HasMossGrottoMap", value); } } public static bool HasWildsMap { get { return PlayerData.instance.GetBool("HasWildsMap"); } set { PlayerData.instance.SetBool("HasWildsMap", value); } } public static bool HasBoneforestMap { get { return PlayerData.instance.GetBool("HasBoneforestMap"); } set { PlayerData.instance.SetBool("HasBoneforestMap", value); } } public static bool HasDocksMap { get { return PlayerData.instance.GetBool("HasDocksMap"); } set { PlayerData.instance.SetBool("HasDocksMap", value); } } public static bool HasGreymoorMap { get { return PlayerData.instance.GetBool("HasGreymoorMap"); } set { PlayerData.instance.SetBool("HasGreymoorMap", value); } } public static bool HasBellhartMap { get { return PlayerData.instance.GetBool("HasBellhartMap"); } set { PlayerData.instance.SetBool("HasBellhartMap", value); } } public static bool HasShellwoodMap { get { return PlayerData.instance.GetBool("HasShellwoodMap"); } set { PlayerData.instance.SetBool("HasShellwoodMap", value); } } public static bool HasCrawlMap { get { return PlayerData.instance.GetBool("HasCrawlMap"); } set { PlayerData.instance.SetBool("HasCrawlMap", value); } } public static bool HasHuntersNestMap { get { return PlayerData.instance.GetBool("HasHuntersNestMap"); } set { PlayerData.instance.SetBool("HasHuntersNestMap", value); } } public static bool HasJudgeStepsMap { get { return PlayerData.instance.GetBool("HasJudgeStepsMap"); } set { PlayerData.instance.SetBool("HasJudgeStepsMap", value); } } public static bool HasDustpensMap { get { return PlayerData.instance.GetBool("HasDustpensMap"); } set { PlayerData.instance.SetBool("HasDustpensMap", value); } } public static bool HasSlabMap { get { return PlayerData.instance.GetBool("HasSlabMap"); } set { PlayerData.instance.SetBool("HasSlabMap", value); } } public static bool HasPeakMap { get { return PlayerData.instance.GetBool("HasPeakMap"); } set { PlayerData.instance.SetBool("HasPeakMap", value); } } public static bool HasCitadelUnderstoreMap { get { return PlayerData.instance.GetBool("HasCitadelUnderstoreMap"); } set { PlayerData.instance.SetBool("HasCitadelUnderstoreMap", value); } } public static bool HasCoralMap { get { return PlayerData.instance.GetBool("HasCoralMap"); } set { PlayerData.instance.SetBool("HasCoralMap", value); } } public static bool HasSwampMap { get { return PlayerData.instance.GetBool("HasSwampMap"); } set { PlayerData.instance.SetBool("HasSwampMap", value); } } public static bool HasCloverMap { get { return PlayerData.instance.GetBool("HasCloverMap"); } set { PlayerData.instance.SetBool("HasCloverMap", value); } } public static bool HasAbyssMap { get { return PlayerData.instance.GetBool("HasAbyssMap"); } set { PlayerData.instance.SetBool("HasAbyssMap", value); } } public static bool HasHangMap { get { return PlayerData.instance.GetBool("HasHangMap"); } set { PlayerData.instance.SetBool("HasHangMap", value); } } public static bool HasSongGateMap { get { return PlayerData.instance.GetBool("HasSongGateMap"); } set { PlayerData.instance.SetBool("HasSongGateMap", value); } } public static bool HasHallsMap { get { return PlayerData.instance.GetBool("HasHallsMap"); } set { PlayerData.instance.SetBool("HasHallsMap", value); } } public static bool HasWardMap { get { return PlayerData.instance.GetBool("HasWardMap"); } set { PlayerData.instance.SetBool("HasWardMap", value); } } public static bool HasCogMap { get { return PlayerData.instance.GetBool("HasCogMap"); } set { PlayerData.instance.SetBool("HasCogMap", value); } } public static bool HasLibraryMap { get { return PlayerData.instance.GetBool("HasLibraryMap"); } set { PlayerData.instance.SetBool("HasLibraryMap", value); } } public static bool HasCradleMap { get { return PlayerData.instance.GetBool("HasCradleMap"); } set { PlayerData.instance.SetBool("HasCradleMap", value); } } public static bool HasArboriumMap { get { return PlayerData.instance.GetBool("HasArboriumMap"); } set { PlayerData.instance.SetBool("HasArboriumMap", value); } } public static bool HasAqueductMap { get { return PlayerData.instance.GetBool("HasAqueductMap"); } set { PlayerData.instance.SetBool("HasAqueductMap", value); } } public static bool HasWeavehomeMap { get { return PlayerData.instance.GetBool("HasWeavehomeMap"); } set { PlayerData.instance.SetBool("HasWeavehomeMap", value); } } public static bool act3MapUpdated { get { return PlayerData.instance.GetBool("act3MapUpdated"); } set { PlayerData.instance.SetBool("act3MapUpdated", value); } } public static bool ShakraFinalQuestAppear { get { return PlayerData.instance.GetBool("ShakraFinalQuestAppear"); } set { PlayerData.instance.SetBool("ShakraFinalQuestAppear", value); } } public static bool hasPinBench { get { return PlayerData.instance.GetBool("hasPinBench"); } set { PlayerData.instance.SetBool("hasPinBench", value); } } public static bool hasPinCocoon { get { return PlayerData.instance.GetBool("hasPinCocoon"); } set { PlayerData.instance.SetBool("hasPinCocoon", value); } } public static bool hasPinShop { get { return PlayerData.instance.GetBool("hasPinShop"); } set { PlayerData.instance.SetBool("hasPinShop", value); } } public static bool hasPinSpa { get { return PlayerData.instance.GetBool("hasPinSpa"); } set { PlayerData.instance.SetBool("hasPinSpa", value); } } public static bool hasPinStag { get { return PlayerData.instance.GetBool("hasPinStag"); } set { PlayerData.instance.SetBool("hasPinStag", value); } } public static bool hasPinTube { get { return PlayerData.instance.GetBool("hasPinTube"); } set { PlayerData.instance.SetBool("hasPinTube", value); } } public static bool hasPinFleaMarrowlands { get { return PlayerData.instance.GetBool("hasPinFleaMarrowlands"); } set { PlayerData.instance.SetBool("hasPinFleaMarrowlands", value); } } public static bool hasPinFleaMidlands { get { return PlayerData.instance.GetBool("hasPinFleaMidlands"); } set { PlayerData.instance.SetBool("hasPinFleaMidlands", value); } } public static bool hasPinFleaBlastedlands { get { return PlayerData.instance.GetBool("hasPinFleaBlastedlands"); } set { PlayerData.instance.SetBool("hasPinFleaBlastedlands", value); } } public static bool hasPinFleaCitadel { get { return PlayerData.instance.GetBool("hasPinFleaCitadel"); } set { PlayerData.instance.SetBool("hasPinFleaCitadel", value); } } public static bool hasPinFleaPeaklands { get { return PlayerData.instance.GetBool("hasPinFleaPeaklands"); } set { PlayerData.instance.SetBool("hasPinFleaPeaklands", value); } } public static bool hasPinFleaMucklands { get { return PlayerData.instance.GetBool("hasPinFleaMucklands"); } set { PlayerData.instance.SetBool("hasPinFleaMucklands", value); } } public static bool hasMarker { get { return PlayerData.instance.GetBool("hasMarker"); } set { PlayerData.instance.SetBool("hasMarker", value); } } public static bool hasMarker_a { get { return PlayerData.instance.GetBool("hasMarker_a"); } set { PlayerData.instance.SetBool("hasMarker_a", value); } } public static bool hasMarker_b { get { return PlayerData.instance.GetBool("hasMarker_b"); } set { PlayerData.instance.SetBool("hasMarker_b", value); } } public static bool hasMarker_c { get { return PlayerData.instance.GetBool("hasMarker_c"); } set { PlayerData.instance.SetBool("hasMarker_c", value); } } public static bool hasMarker_d { get { return PlayerData.instance.GetBool("hasMarker_d"); } set { PlayerData.instance.SetBool("hasMarker_d", value); } } public static bool hasMarker_e { get { return PlayerData.instance.GetBool("hasMarker_e"); } set { PlayerData.instance.SetBool("hasMarker_e", value); } } public static WrappedVector2List[] placedMarkers { get { return VariableExtensions.GetVariable<WrappedVector2List[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "placedMarkers"); } set { VariableExtensions.SetVariable<WrappedVector2List[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "placedMarkers", value); } } public static EnvironmentTypes environmentType { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return VariableExtensions.GetVariable<EnvironmentTypes>((IIncludeVariableExtensions)(object)PlayerData.instance, "environmentType"); } set { //IL_000a: Unknown result type (might be due to invalid IL or missing references) VariableExtensions.SetVariable<EnvironmentTypes>((IIncludeVariableExtensions)(object)PlayerData.instance, "environmentType", value); } } public static int previousDarkness { get { return PlayerData.instance.GetInt("previousDarkness"); } set { PlayerData.instance.SetInt("previousDarkness", value); } } public static bool HasMelodyArchitect { get { return PlayerData.instance.GetBool("HasMelodyArchitect"); } set { PlayerData.instance.SetBool("HasMelodyArchitect", value); } } public static bool HasMelodyLibrarian { get { return PlayerData.instance.GetBool("HasMelodyLibrarian"); } set { PlayerData.instance.SetBool("HasMelodyLibrarian", value); } } public static bool SeenMelodyLibrarianReturn { get { return PlayerData.instance.GetBool("SeenMelodyLibrarianReturn"); } set { PlayerData.instance.SetBool("SeenMelodyLibrarianReturn", value); } } public static bool HasMelodyConductor { get { return PlayerData.instance.GetBool("HasMelodyConductor"); } set { PlayerData.instance.SetBool("HasMelodyConductor", value); } } public static bool UnlockedMelodyLift { get { return PlayerData.instance.GetBool("UnlockedMelodyLift"); } set { PlayerData.instance.SetBool("UnlockedMelodyLift", value); } } public static bool MelodyLiftCanReturn { get { return PlayerData.instance.GetBool("MelodyLiftCanReturn"); } set { PlayerData.instance.SetBool("MelodyLiftCanReturn", value); } } public static bool HeardMelodyConductorNoQuest { get { return PlayerData.instance.GetBool("HeardMelodyConductorNoQuest"); } set { PlayerData.instance.SetBool("HeardMelodyConductorNoQuest", value); } } public static bool ConductorWeaverDlgQueued { get { return PlayerData.instance.GetBool("ConductorWeaverDlgQueued"); } set { PlayerData.instance.SetBool("ConductorWeaverDlgQueued", value); } } public static bool ConductorWeaverDlgHeard { get { return PlayerData.instance.GetBool("ConductorWeaverDlgHeard"); } set { PlayerData.instance.SetBool("ConductorWeaverDlgHeard", value); } } public static bool muchTimePassed { get { return PlayerData.instance.GetBool("muchTimePassed"); } set { PlayerData.instance.SetBool("muchTimePassed", value); } } public static int pilgrimGroupBonegrave { get { return PlayerData.instance.GetInt("pilgrimGroupBonegrave"); } set { PlayerData.instance.SetInt("pilgrimGroupBonegrave", value); } } public static int pilgrimGroupShellgrave { get { return PlayerData.instance.GetInt("pilgrimGroupShellgrave"); } set { PlayerData.instance.SetInt("pilgrimGroupShellgrave", value); } } public static int pilgrimGroupGreymoorField { get { return PlayerData.instance.GetInt("pilgrimGroupGreymoorField"); } set { PlayerData.instance.SetInt("pilgrimGroupGreymoorField", value); } } public static bool shellGravePopulated { get { return PlayerData.instance.GetBool("shellGravePopulated"); } set { PlayerData.instance.SetBool("shellGravePopulated", value); } } public static bool bellShrineBoneForest { get { return PlayerData.instance.GetBool("bellShrineBoneForest"); } set { PlayerData.instance.SetBool("bellShrineBoneForest", value); } } public static bool bellShrineWilds { get { return PlayerData.instance.GetBool("bellShrineWilds"); } set { PlayerData.instance.SetBool("bellShrineWilds", value); } } public static bool bellShrineGreymoor { get { return PlayerData.instance.GetBool("bellShrineGreymoor"); } set { PlayerData.instance.SetBool("bellShrineGreymoor", value); } } public static bool bellShrineShellwood { get { return PlayerData.instance.GetBool("bellShrineShellwood"); } set { PlayerData.instance.SetBool("bellShrineShellwood", value); } } public static bool bellShrineBellhart { get { return PlayerData.instance.GetBool("bellShrineBellhart"); } set { PlayerData.instance.SetBool("bellShrineBellhart", value); } } public static bool bellShrineEnclave { get { return PlayerData.instance.GetBool("bellShrineEnclave"); } set { PlayerData.instance.SetBool("bellShrineEnclave", value); } } public static bool completedMemory_reaper { get { return PlayerData.instance.GetBool("completedMemory_reaper"); } set { PlayerData.instance.SetBool("completedMemory_reaper", value); } } public static bool completedMemory_wanderer { get { return PlayerData.instance.GetBool("completedMemory_wanderer"); } set { PlayerData.instance.SetBool("completedMemory_wanderer", value); } } public static bool completedMemory_beast { get { return PlayerData.instance.GetBool("completedMemory_beast"); } set { PlayerData.instance.SetBool("completedMemory_beast", value); } } public static bool completedMemory_witch { get { return PlayerData.instance.GetBool("completedMemory_witch"); } set { PlayerData.instance.SetBool("completedMemory_witch", value); } } public static bool completedMemory_toolmaster { get { return PlayerData.instance.GetBool("completedMemory_toolmaster"); } set { PlayerData.instance.SetBool("completedMemory_toolmaster", value); } } public static bool completedMemory_shaman { get { return PlayerData.instance.GetBool("completedMemory_shaman"); } set { PlayerData.instance.SetBool("completedMemory_shaman", value); } } public static bool chapelClosed_reaper { get { return PlayerData.instance.GetBool("chapelClosed_reaper"); } set { PlayerData.instance.SetBool("chapelClosed_reaper", value); } } public static bool chapelClosed_wanderer { get { return PlayerData.instance.GetBool("chapelClosed_wanderer"); } set { PlayerData.instance.SetBool("chapelClosed_wanderer", value); } } public static bool chapelClosed_beast { get { return PlayerData.instance.GetBool("chapelClosed_beast"); } set { PlayerData.instance.SetBool("chapelClosed_beast", value); } } public static bool chapelClosed_witch { get { return PlayerData.instance.GetBool("chapelClosed_witch"); } set { PlayerData.instance.SetBool("chapelClosed_witch", value); } } public static bool chapelClosed_toolmaster { get { return PlayerData.instance.GetBool("chapelClosed_toolmaster"); } set { PlayerData.instance.SetBool("chapelClosed_toolmaster", value); } } public static bool chapelClosed_shaman { get { return PlayerData.instance.GetBool("chapelClosed_shaman"); } set { PlayerData.instance.SetBool("chapelClosed_shaman", value); } } public static bool bindCutscenePlayed { get { return PlayerData.instance.GetBool("bindCutscenePlayed"); } set { PlayerData.instance.SetBool("bindCutscenePlayed", value); } } public static bool encounteredMossMother { get { return PlayerData.instance.GetBool("encounteredMossMother"); } set { PlayerData.instance.SetBool("encounteredMossMother", value); } } public static bool defeatedMossMother { get { return PlayerData.instance.GetBool("defeatedMossMother"); } set { PlayerData.instance.SetBool("defeatedMossMother", value); } } public static bool entered_Tut01b { get { return PlayerData.instance.GetBool("entered_Tut01b"); } set { PlayerData.instance.SetBool("entered_Tut01b", value); } } public static bool completedTutorial { get { return PlayerData.instance.GetBool("completedTutorial"); } set { PlayerData.instance.SetBool("completedTutorial", value); } } public static bool BonePlazaOpened { get { return PlayerData.instance.GetBool("BonePlazaOpened"); } set { PlayerData.instance.SetBool("BonePlazaOpened", value); } } public static bool sawPlinneyLeft { get { return PlayerData.instance.GetBool("sawPlinneyLeft"); } set { PlayerData.instance.SetBool("sawPlinneyLeft", value); } } public static bool savedPlinney { get { return PlayerData.instance.GetBool("savedPlinney"); } set { PlayerData.instance.SetBool("savedPlinney", value); } } public static bool savedPlinneyConvo { get { return PlayerData.instance.GetBool("savedPlinneyConvo");