Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SilksongPrepatcher v1.4.0
patchers/SilksongPrepatcher.dll
Decompiled 4 months 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.4.0.0")] [assembly: AssemblyInformationalVersion("1.4.0+ce91871617411504140d285a0055130135e6d5e8")] [assembly: AssemblyProduct("SilksongPrepatcher")] [assembly: AssemblyTitle("SilksongPrepatcher")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.4.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("GetTypesSafelyIgnoreModded", new Type[1] { typeof(Assembly) })); BasePrepatcher item2 = 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)>(7) { ("TeamCherry.NestedFadeGroup.dll", item), ("PlayMaker.dll", item), ("Newtonsoft.Json.UnityConverters.dll", item), ("PlayMaker.dll", new ReflectionUtilsPatcher()), ("Assembly-CSharp.dll", new PlayerDataPatcher()), ("TeamCherry.SharedUtils.dll", new VariableExtensionsPatcher()), ("Newtonsoft.Json.UnityConverters.dll", item2) }; } 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 const string IncludeInTypeSearchAttributeKey = "SilksongPrepatcher.IncludeInUnmoddedTypeSearch"; 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)) { return Array.Empty<Type>(); } return asm.GetTypesSafely(); } private static bool ShouldSkip(Assembly asm) { 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; } string text; try { text = asm.Location; } catch (NotSupportedException) { text = string.Empty; } if (text.StartsWith(Paths.BepInExRootPath)) { if (asm.GetCustomAttributes<AssemblyMetadataAttribute>().Any((AssemblyMetadataAttribute m) => m.Key == "SilksongPrepatcher.IncludeInUnmoddedTypeSearch" && m.Value == "True")) { return false; } 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 4 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; 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.4.0.0")] [assembly: AssemblyInformationalVersion("1.4.0+ce91871617411504140d285a0055130135e6d5e8")] [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.4.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] 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")] [Microsoft.CodeAnalysis.Embedded] 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")] [Microsoft.CodeAnalysis.Embedded] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace Microsoft.CodeAnalysis { [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace PrepatcherPlugin { [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class EventSubscriptionPriorityAttribute : Attribute { public float Priority { get; set; } public EventSubscriptionPriorityAttribute(float priority) { Priority = priority; } internal static float GetPriority<T>(T? func) where T : Delegate { return (func?.Method?.GetCustomAttribute<EventSubscriptionPriorityAttribute>()?.Priority).GetValueOrDefault(); } } 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 { PlayerDat