Please disclose if your mod was created primarily 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 CessilCellsCeaChells v0.3.6
BepInEx/patchers/CessilCellsCeaChells/CessilCellsCeaChells.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using CessilCellsCeaChells.CeaChore; using CessilCellsCeaChells.Internal; using CessilCellsCeaChells.Merges; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Cecil.Rocks; using Mono.Collections.Generic; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyCompany("www_Day_Dream")] [assembly: AssemblyConfiguration("Mono10")] [assembly: AssemblyFileVersion("0.3.6.0")] [assembly: AssemblyInformationalVersion("0.3.6+7d89ac2f0f27f18bdede1a7a48d74cf17c6333f1")] [assembly: AssemblyProduct("CessilCellsCeaChells")] [assembly: AssemblyTitle("CessilCellsCeaChells")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.3.6.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 CessilCellsCeaChells { public class CessilMerger : IDisposable { public readonly List<AssemblyDefinition> AssembliesToDispose = new List<AssemblyDefinition>(); public IAssemblyResolver? TypeResolver { get; set; } public string CachePath { get; set; } = Path.GetDirectoryName(typeof(CessilMerger).Assembly.Location) ?? ""; public IEnumerable<string> TargetDLLFileNames => Merges.Select((CessilMerge merge) => merge.TargetAssemblyName).Distinct(); private List<CessilMerge> Merges { get; } = new List<CessilMerge>(); public static event Action<object>? LogDebug; public static event Action<object>? LogWarn; public static void LogDebugSafe(object o) { CessilMerger.LogDebug?.Invoke(o); } public static void LogWarnSafe(object o) { CessilMerger.LogWarn?.Invoke(o); } public bool LoadMergesFrom(string dllPath, out int count) { count = 0; if (!AssemblyCacheHandler.TryLoadCachedMerges(dllPath, this, out CessilMerge[] merges)) { return false; } Merges.AddRange(merges); count = merges.Length; return true; } public void MergeInto(AssemblyDefinition assembly) { AssemblyDefinition assembly2 = assembly; foreach (CessilMerge item in Merges.Where((CessilMerge merge) => merge.TargetAssemblyName == ((AssemblyNameReference)assembly2.Name).Name + ".dll")) { TypeDefinition type = assembly2.MainModule.GetType(((MemberReference)item.TargetTypeRef).FullName); IMemberDefinition memberDefinition; if (type == null) { LogWarnSafe("Disregarding merge as it's target type doesn't exist!"); } else if (item.TryMergeInto(type, out memberDefinition)) { LogDebugSafe("Successfully merged '" + ((memberDefinition != null) ? memberDefinition.FullName : null) + "' into '" + ((MemberReference)type).FullName + "'"); } } } public void Dispose() { LogDebugSafe("Disposing of loaded AssemblyDefinitions.."); foreach (AssemblyDefinition item in AssembliesToDispose) { item.Dispose(); } } } } namespace CessilCellsCeaChells.Merges { internal abstract class CessilMerge { internal readonly TypeReference TargetTypeRef; private static readonly Dictionary<string, Type> CessilMergeTypes = new Dictionary<string, Type> { { typeof(RequiresFieldAttribute).FullName, typeof(FieldMerge) }, { typeof(RequiresPropertyAttribute).FullName, typeof(PropertyMerge) }, { typeof(RequiresMethodAttribute).FullName, typeof(MethodMerge) }, { typeof(RequiresMethodDefaultsAttribute).FullName, typeof(MethodMerge) }, { typeof(RequiresEnumInsertionAttribute).FullName, typeof(EnumInsertionMerge) } }; internal string TargetAssemblyName => ((AssemblyNameReference)((MemberReference)TargetTypeRef.Resolve()).Module.Assembly.Name).Name + ".dll"; protected CessilMerge(TypeReference targetTypeRef) { TargetTypeRef = targetTypeRef; base..ctor(); } internal static bool TryCreateMerges(AssemblyDefinition assembly, out CessilMerge[] merges) { merges = (from customAttribute in (IEnumerable<CustomAttribute>)assembly.CustomAttributes select new KeyValuePair<bool, CessilMerge>(TryConvertFrom(customAttribute, out CessilMerge merge), merge) into tuple where tuple.Key select tuple.Value).ToArray(); return merges.Length != 0; } private static bool TryConvertFrom(CustomAttribute attribute, out CessilMerge? merge) { merge = null; if (!CessilMergeTypes.TryGetValue(((MemberReference)attribute.AttributeType).FullName, out Type value)) { return false; } merge = (CessilMerge)Activator.CreateInstance(value, attribute); return merge != null; } internal static TypeReference GetOrImportTypeReference(ModuleDefinition into, Type type) { TypeReference result = default(TypeReference); if (!into.TryGetTypeReference(type.FullName, ref result)) { return into.ImportReference(type); } return result; } internal static TypeReference GetOrImportTypeReference(ModuleDefinition into, TypeReference type) { TypeReference result = default(TypeReference); if (!into.TryGetTypeReference(((MemberReference)type).FullName, ref result)) { return into.ImportReference(type); } return result; } internal abstract CustomAttribute ConvertToAttribute(AssemblyDefinition into); internal abstract bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition); } internal class EnumInsertionMerge : CessilMerge { private readonly string EnumEntryName; public EnumInsertionMerge(CustomAttribute attribute) { //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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown CustomAttributeArgument val = attribute.ConstructorArguments[1]; EnumEntryName = (string)((CustomAttributeArgument)(ref val)).Value; val = attribute.ConstructorArguments[0]; base..ctor((TypeReference)((CustomAttributeArgument)(ref val)).Value); } internal override CustomAttribute ConvertToAttribute(AssemblyDefinition into) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(into.MainModule, typeof(Type)); TypeReference orImportTypeReference2 = CessilMerge.GetOrImportTypeReference(into.MainModule, TargetTypeRef); CustomAttribute val = new CustomAttribute(into.MainModule.ImportReference((MethodBase)typeof(RequiresEnumInsertionAttribute).GetConstructors().First())); val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference2)); val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.String, (object)EnumEntryName)); return val; } internal override bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition) { memberDefinition = null; FieldDefinition fieldDefinition; bool flag = CessilHelper.TryCreateField(typeDefinition, EnumEntryName, (TypeReference)(object)typeDefinition, out fieldDefinition, (FieldAttributes)32854); long num = -1L; foreach (FieldDefinition item in ((IEnumerable<FieldDefinition>)typeDefinition.Fields).Where((FieldDefinition field) => ((MemberReference)field).Name != "value__")) { if (Convert.ToInt64(item.Constant) > Convert.ToInt64(num)) { num = Convert.ToInt64(item.Constant); } } if (flag) { fieldDefinition.Constant = Convert.ChangeType(num + 1, Type.GetType(((MemberReference)((FieldReference)((IEnumerable<FieldDefinition>)typeDefinition.Fields).First((FieldDefinition field) => ((MemberReference)field).Name == "value__")).FieldType).FullName) ?? throw new InvalidOperationException()); } if (flag) { memberDefinition = (IMemberDefinition?)(object)fieldDefinition; } return flag; } } internal class FieldMerge : CessilMerge { private readonly string FieldName; private readonly TypeReference FieldType; private readonly bool IsPublic; public FieldMerge(CustomAttribute attribute) { //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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown CustomAttributeArgument val = attribute.ConstructorArguments[1]; FieldName = (string)((CustomAttributeArgument)(ref val)).Value; val = attribute.ConstructorArguments[2]; FieldType = (TypeReference)((CustomAttributeArgument)(ref val)).Value; int isPublic; if (attribute.ConstructorArguments.Count > 3) { val = attribute.ConstructorArguments[3]; isPublic = (((bool)((CustomAttributeArgument)(ref val)).Value) ? 1 : 0); } else { isPublic = 0; } IsPublic = (byte)isPublic != 0; val = attribute.ConstructorArguments[0]; base..ctor((TypeReference)((CustomAttributeArgument)(ref val)).Value); } internal override CustomAttribute ConvertToAttribute(AssemblyDefinition into) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_0099: 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) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(into.MainModule, typeof(Type)); TypeReference orImportTypeReference2 = CessilMerge.GetOrImportTypeReference(into.MainModule, TargetTypeRef); TypeReference orImportTypeReference3 = CessilMerge.GetOrImportTypeReference(into.MainModule, FieldType); CustomAttribute val = new CustomAttribute(into.MainModule.ImportReference((MethodBase)typeof(RequiresFieldAttribute).GetConstructors().First())); val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference2)); val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.String, (object)FieldName)); val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference3)); val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.Boolean, (object)IsPublic)); return val; } internal override bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition) { memberDefinition = null; FieldDefinition fieldDefinition; bool flag = CessilHelper.TryCreateField(typeDefinition, FieldName, CessilMerge.GetOrImportTypeReference(((MemberReference)typeDefinition).Module, FieldType), out fieldDefinition, (FieldAttributes)((!IsPublic) ? 1 : 6)); if (flag) { memberDefinition = (IMemberDefinition?)(object)fieldDefinition; } return flag; } } internal class MethodMerge : CessilMerge { private readonly string MethodName; private readonly TypeReference MethodType; private readonly TypeReference[] MethodParameters; private readonly object[] MethodDefaults; public MethodMerge(CustomAttribute attribute) { //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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown CustomAttributeArgument val = attribute.ConstructorArguments[1]; MethodName = (string)((CustomAttributeArgument)(ref val)).Value; val = attribute.ConstructorArguments[2]; MethodType = (TypeReference)((CustomAttributeArgument)(ref val)).Value; val = attribute.ConstructorArguments[3]; MethodParameters = ((IEnumerable<CustomAttributeArgument>)(CustomAttributeArgument[])((CustomAttributeArgument)(ref val)).Value).Select((Func<CustomAttributeArgument, TypeReference>)((CustomAttributeArgument attr) => (TypeReference)((CustomAttributeArgument)(ref attr)).Value)).ToArray(); object[] methodDefaults; if (attribute.ConstructorArguments.Count <= 4) { methodDefaults = new object[0]; } else { val = attribute.ConstructorArguments[4]; methodDefaults = ((CustomAttributeArgument[])((CustomAttributeArgument)(ref val)).Value).Select((CustomAttributeArgument attr) => ((CustomAttributeArgument)(ref attr)).Value).ToArray(); } MethodDefaults = methodDefaults; val = attribute.ConstructorArguments[0]; base..ctor((TypeReference)((CustomAttributeArgument)(ref val)).Value); } internal override CustomAttribute ConvertToAttribute(AssemblyDefinition into) { //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: 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_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Expected O, but got Unknown //IL_017f: Unknown result type (might be due to invalid IL or missing references) AssemblyDefinition into2 = into; TypeReference typeTypeRef = CessilMerge.GetOrImportTypeReference(into2.MainModule, typeof(Type)); TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(into2.MainModule, TargetTypeRef); TypeReference orImportTypeReference2 = CessilMerge.GetOrImportTypeReference(into2.MainModule, MethodType); Type type = ((MethodDefaults.Length != 0) ? typeof(RequiresMethodDefaultsAttribute) : typeof(RequiresMethodAttribute)); CustomAttribute val = new CustomAttribute(into2.MainModule.ImportReference((MethodBase)type.GetConstructors().First())); val.ConstructorArguments.Add(new CustomAttributeArgument(typeTypeRef, (object)orImportTypeReference)); val.ConstructorArguments.Add(new CustomAttributeArgument(into2.MainModule.TypeSystem.String, (object)MethodName)); val.ConstructorArguments.Add(new CustomAttributeArgument(typeTypeRef, (object)orImportTypeReference2)); val.ConstructorArguments.Add(new CustomAttributeArgument((TypeReference)(object)TypeReferenceRocks.MakeArrayType(typeTypeRef), (object)((IEnumerable<TypeReference>)MethodParameters).Select((Func<TypeReference, CustomAttributeArgument>)((TypeReference tRef) => new CustomAttributeArgument(typeTypeRef, (object)CessilMerge.GetOrImportTypeReference(into2.MainModule, tRef)))).ToArray())); CustomAttribute val2 = val; if (MethodDefaults.Length != 0) { val2.ConstructorArguments.Add(new CustomAttributeArgument((TypeReference)(object)TypeReferenceRocks.MakeArrayType(into2.MainModule.TypeSystem.Object), (object)((IEnumerable<object>)MethodDefaults).Select((Func<object, CustomAttributeArgument>)((object tObj) => new CustomAttributeArgument(into2.MainModule.TypeSystem.Object, tObj))).ToArray())); } return val2; } internal override bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition) { TypeDefinition typeDefinition2 = typeDefinition; memberDefinition = null; TypeReference[] importedParamReferences = MethodParameters.Select((TypeReference param) => ((MemberReference)typeDefinition2).Module.ImportReference((TypeReference)(object)param.Resolve())).ToArray(); MethodDefinition methodDefinition; bool flag = CessilHelper.TryCreateMethod(typeDefinition2, MethodName, CessilMerge.GetOrImportTypeReference(((MemberReference)typeDefinition2).Module, MethodType), importedParamReferences, ((IEnumerable<object>)MethodDefaults).Select((Func<object, CustomAttributeArgument>)((object obj) => (CustomAttributeArgument)obj)).ToArray(), out methodDefinition); if (flag) { memberDefinition = (IMemberDefinition?)(object)methodDefinition; } return flag; } } internal class PropertyMerge : CessilMerge { private readonly string PropertyName; private readonly TypeReference PropertyType; private readonly bool InitializeOnAccess; public PropertyMerge(CustomAttribute attribute) { //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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown CustomAttributeArgument val = attribute.ConstructorArguments[1]; PropertyName = (string)((CustomAttributeArgument)(ref val)).Value; val = attribute.ConstructorArguments[2]; PropertyType = (TypeReference)((CustomAttributeArgument)(ref val)).Value; val = attribute.ConstructorArguments[3]; InitializeOnAccess = (bool)((CustomAttributeArgument)(ref val)).Value; val = attribute.ConstructorArguments[0]; base..ctor((TypeReference)((CustomAttributeArgument)(ref val)).Value); } internal override CustomAttribute ConvertToAttribute(AssemblyDefinition into) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_0099: 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) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(into.MainModule, typeof(Type)); TypeReference orImportTypeReference2 = CessilMerge.GetOrImportTypeReference(into.MainModule, TargetTypeRef); TypeReference orImportTypeReference3 = CessilMerge.GetOrImportTypeReference(into.MainModule, PropertyType); CustomAttribute val = new CustomAttribute(into.MainModule.ImportReference((MethodBase)typeof(RequiresPropertyAttribute).GetConstructors().First())); val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference2)); val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.String, (object)PropertyName)); val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference3)); val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.Boolean, (object)InitializeOnAccess)); return val; } internal override bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition) { memberDefinition = null; TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(((MemberReference)typeDefinition).Module, PropertyType); if (!CessilHelper.TryCreateProperty(typeDefinition, PropertyName, orImportTypeReference, out FieldDefinition backingField, out PropertyDefinition propertyDefinition)) { return false; } if (InitializeOnAccess) { AddSingletonCheckToProperty(backingField, PropertyType.Resolve(), propertyDefinition); } memberDefinition = (IMemberDefinition?)(object)propertyDefinition; return true; } private static void AddSingletonCheckToProperty(FieldDefinition backingField, TypeDefinition resolvedAndImported, PropertyDefinition singletonPropDef) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: 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_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0105: 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) MethodDefinition val = ((IEnumerable<MethodDefinition>)resolvedAndImported.Methods).FirstOrDefault((Func<MethodDefinition, bool>)((MethodDefinition method) => ((MemberReference)method).Name == ".ctor" && ((MethodReference)method).Parameters.Count == 0)); if (val != null) { MethodReference val2 = ((MemberReference)backingField).Module.ImportReference((MethodReference)(object)val); MethodDefinition getMethod = singletonPropDef.GetMethod; getMethod.Body.Instructions.Clear(); ILProcessor iLProcessor = getMethod.Body.GetILProcessor(); iLProcessor.Emit(OpCodes.Ldarg_0); iLProcessor.Emit(OpCodes.Ldfld, (FieldReference)(object)backingField); iLProcessor.Emit(OpCodes.Ldnull); iLProcessor.Emit(OpCodes.Ceq); Instruction val3 = iLProcessor.Create(OpCodes.Nop); iLProcessor.Emit(OpCodes.Brfalse, val3); iLProcessor.Emit(OpCodes.Ldarg_0); iLProcessor.Emit(OpCodes.Newobj, val2); iLProcessor.Emit(OpCodes.Call, (MethodReference)(object)singletonPropDef.SetMethod); iLProcessor.Append(val3); MethodBodyRocks.OptimizeMacros(getMethod.Body); iLProcessor.Emit(OpCodes.Ldarg_0); iLProcessor.Emit(OpCodes.Ldfld, (FieldReference)(object)backingField); iLProcessor.Emit(OpCodes.Ret); } } } } namespace CessilCellsCeaChells.Internal { internal static class AssemblyCacheHandler { private const string AssemblyCacheDLLPrefix = "CessilCache."; internal static bool TryLoadCachedMerges(string assemblyPath, CessilMerger cessilMerger, out CessilMerge[] merges) { merges = new CessilMerge[0]; if (!Directory.Exists(cessilMerger.CachePath)) { Directory.CreateDirectory(cessilMerger.CachePath); } string text = Path.Combine(cessilMerger.CachePath, "CessilCache." + Path.GetFileName(assemblyPath)); long num = File.GetLastWriteTimeUtc(assemblyPath).ToFileTimeUtc(); bool flag = File.Exists(text) && File.GetLastWriteTimeUtc(text).ToFileTimeUtc() == num; AssemblyDefinition val = LoadAssembly(flag ? text : assemblyPath, cessilMerger); if (val == null) { return false; } if (flag) { CessilMerger.LogDebugSafe("Falling back to cached merges for '" + ((AssemblyNameReference)val.Name).Name + "'. Write Time hasn't changed."); } else { CessilMerger.LogDebugSafe("Loading and caching merges for '" + ((AssemblyNameReference)val.Name).Name + "'. " + (File.Exists(text) ? "Write Time has changed." : "Cache doesn't exist.")); } if (!CessilMerge.TryCreateMerges(val, out merges)) { CessilMerger.LogDebugSafe("Plugin '" + ((AssemblyNameReference)val.Name).Name + "' doesn't contain any merges."); } if (!flag) { CacheMerges(text, val, num, merges); } return merges.Length != 0; } internal static AssemblyDefinition? LoadAssembly(string assemblyPath, CessilMerger cessilMerger) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown AssemblyDefinition val = null; try { val = AssemblyDefinition.ReadAssembly(assemblyPath, new ReaderParameters { ReadWrite = true, AssemblyResolver = cessilMerger.TypeResolver }); } catch { } if (val != null) { cessilMerger.AssembliesToDispose.Add(val); } return val; } private static void CacheMerges(string cachePath, AssemblyDefinition assemblyDefinition, long writeTime, CessilMerge[] merges) { if (File.Exists(cachePath)) { File.Delete(cachePath); } AssemblyDefinition val = AssemblyDefinition.CreateAssembly(assemblyDefinition.Name, ((ModuleReference)assemblyDefinition.MainModule).Name, (ModuleKind)0); foreach (CessilMerge cessilMerge in merges) { val.CustomAttributes.Add(cessilMerge.ConvertToAttribute(val)); } val.Write(cachePath); if (File.Exists(cachePath)) { File.SetLastWriteTimeUtc(cachePath, DateTime.FromFileTimeUtc(writeTime)); } } } internal static class CessilHelper { internal static bool TryCreateField(TypeDefinition typeDef, string name, TypeReference importedFieldType, out FieldDefinition? fieldDefinition, FieldAttributes customAttributes = 1) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0048: Expected O, but got Unknown string name2 = name; fieldDefinition = null; if (((IEnumerable<FieldDefinition>)typeDef.Fields).Any((FieldDefinition field) => ((MemberReference)field).Name == name2)) { return false; } Collection<FieldDefinition> fields = typeDef.Fields; FieldDefinition val = new FieldDefinition(name2, customAttributes, importedFieldType); FieldDefinition val2 = val; fieldDefinition = val; fields.Add(val2); return true; } internal static bool TryCreateProperty(TypeDefinition typeDef, string name, TypeReference importedPropType, out FieldDefinition? backingField, out PropertyDefinition? propertyDefinition, string fieldNameTemplate = "<{0}>k__BackingField", string methodNameTemplate = "{0}_{1}") { //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Expected O, but got Unknown //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Expected O, but got Unknown //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Expected O, but got Unknown //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Expected O, but got Unknown //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Expected O, but got Unknown //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Expected O, but got Unknown //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: Expected O, but got Unknown //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Expected O, but got Unknown //IL_0259: Expected O, but got Unknown string name2 = name; propertyDefinition = null; backingField = null; if (((IEnumerable<PropertyDefinition>)typeDef.Properties).Any((PropertyDefinition prop) => ((MemberReference)prop).Name == name2)) { return false; } if (!TryCreateField(typeDef, string.Format(fieldNameTemplate, name2), importedPropType, out backingField, (FieldAttributes)1)) { return false; } TypeReference val = default(TypeReference); if (!((MemberReference)typeDef).Module.TryGetTypeReference(typeof(CompilerGeneratedAttribute).FullName, ref val)) { val = ((MemberReference)typeDef).Module.ImportReference(typeof(CompilerGeneratedAttribute)); } MethodReference val2 = ((MemberReference)typeDef).Module.ImportReference((MethodReference)(object)((IEnumerable<MethodDefinition>)val.Resolve().Methods).First((MethodDefinition method) => ((MemberReference)method).Name == ".ctor")); backingField.CustomAttributes.Add(new CustomAttribute(val2)); MethodDefinition val3 = new MethodDefinition(string.Format(methodNameTemplate, "get", name2), (MethodAttributes)2182, importedPropType); typeDef.Methods.Add(val3); val3.Body = new MethodBody(val3); val3.CustomAttributes.Add(new CustomAttribute(val2)); ILProcessor iLProcessor = val3.Body.GetILProcessor(); iLProcessor.Emit(OpCodes.Ldarg_0); iLProcessor.Emit(OpCodes.Ldfld, (FieldReference)(object)backingField); iLProcessor.Emit(OpCodes.Ret); MethodDefinition val4 = new MethodDefinition(string.Format(methodNameTemplate, "set", name2), (MethodAttributes)2182, ((MemberReference)typeDef).Module.Assembly.MainModule.TypeSystem.Void); typeDef.Methods.Add(val4); val4.Body = new MethodBody(val4); val4.CustomAttributes.Add(new CustomAttribute(val2)); ((MethodReference)val4).Parameters.Add(new ParameterDefinition("value", (ParameterAttributes)0, importedPropType)); iLProcessor = val4.Body.GetILProcessor(); iLProcessor.Emit(OpCodes.Ldarg_0); iLProcessor.Emit(OpCodes.Ldarg_1); iLProcessor.Emit(OpCodes.Stfld, (FieldReference)(object)backingField); iLProcessor.Emit(OpCodes.Ret); Collection<PropertyDefinition> properties = typeDef.Properties; PropertyDefinition val5 = new PropertyDefinition(name2, (PropertyAttributes)0, importedPropType) { GetMethod = val3, SetMethod = val4 }; PropertyDefinition val6 = val5; propertyDefinition = val5; properties.Add(val6); return true; } internal static bool TryCreateMethod(TypeDefinition typeDef, string name, TypeReference importedReturnType, TypeReference[] importedParamReferences, CustomAttributeArgument[] constants, out MethodDefinition? methodDefinition) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Expected O, but got Unknown //IL_0303: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Unknown result type (might be due to invalid IL or missing references) string name2 = name; TypeReference[] importedParamReferences2 = importedParamReferences; methodDefinition = null; if (((IEnumerable<MethodDefinition>)typeDef.Methods).Any((MethodDefinition method) => ((MemberReference)method).Name == name2 && ParameterTypesMatch(((IEnumerable<ParameterDefinition>)((MethodReference)method).Parameters).Select((ParameterDefinition param) => ((ParameterReference)param).ParameterType).ToArray(), importedParamReferences2))) { return false; } MethodDefinition val = new MethodDefinition(name2, (MethodAttributes)134, importedReturnType); val.Body.InitLocals = true; methodDefinition = val; methodDefinition.Body.GetILProcessor().Emit(OpCodes.Ret); Dictionary<string, int> dictionary = new Dictionary<string, int>(); Dictionary<string, int> dictionary2 = new Dictionary<string, int>(); TypeReference[] array = importedParamReferences2; foreach (TypeReference val2 in array) { string key = (val2.IsGenericInstance ? ((MemberReference)val2).Name.Substring(0, ((MemberReference)val2).Name.IndexOf('`')) : ((MemberReference)val2).Name); if (!dictionary2.ContainsKey(key)) { dictionary2.Add(key, 0); } if (!dictionary.ContainsKey(key)) { dictionary.Add(key, 0); } dictionary[key]++; } for (int j = 0; j < importedParamReferences2.Length; j++) { TypeReference val3 = importedParamReferences2[j]; string text = (val3.IsGenericInstance ? ((MemberReference)val3).Name.Substring(0, ((MemberReference)val3).Name.IndexOf('`')) : ((MemberReference)val3).Name); int num = dictionary[text]; int num2 = dictionary2[text]++; string text2 = "p" + text + ((num > 1) ? ("_" + num2) : ""); int num3 = importedParamReferences2.Length - constants.Length; int num4 = j - num3; bool flag = constants.Length != 0 && j >= num3 && ((MemberReference)((CustomAttributeArgument)(ref constants[num4])).Type).FullName == ((MemberReference)val3).FullName; ParameterDefinition val4 = new ParameterDefinition(text2, (ParameterAttributes)(flag ? 16 : 0), val3); if (num4 >= 0 && constants.Length > num4 && ((MemberReference)((CustomAttributeArgument)(ref constants[num4])).Type).FullName != ((MemberReference)val3).FullName) { CessilMerger.LogWarnSafe($"Ignoring parameter constant @ {j + 1}, and all preceding parameters, for " + "'" + ((MemberReference)typeDef).FullName + "::" + ((MemberReference)methodDefinition).Name + "' because '" + ((MemberReference)((CustomAttributeArgument)(ref constants[num4])).Type).FullName + "' is not the correct type! It should be '" + ((MemberReference)val3).FullName + "'."); } if (flag) { val4.Constant = ((CustomAttributeArgument)(ref constants[num4])).Value; } else { Enumerator<ParameterDefinition> enumerator = ((MethodReference)methodDefinition).Parameters.GetEnumerator(); try { while (enumerator.MoveNext()) { ParameterDefinition current = enumerator.Current; current.Constant = null; current.Attributes = (ParameterAttributes)0; } } finally { ((IDisposable)enumerator).Dispose(); } } ((MethodReference)methodDefinition).Parameters.Add(val4); } typeDef.Methods.Add(methodDefinition); return true; } private static bool ParameterTypesMatch(TypeReference[] parametersFrom, TypeReference[] parametersTo) { return parametersFrom.Select((TypeReference type) => ((MemberReference)type).FullName).SequenceEqual(parametersTo.Select((TypeReference type) => ((MemberReference)type).FullName)); } } [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public abstract class RequiresAttribute : Attribute { } } namespace CessilCellsCeaChells.CeaChore { public class RequiresFieldAttribute : RequiresAttribute { public RequiresFieldAttribute(Type targetType, string fieldName, Type fieldType, bool isPublic = false) { } } public class RequiresPropertyAttribute : RequiresAttribute { public RequiresPropertyAttribute(Type targetType, string propertyName, Type propertyType, bool singletonCreateOnAccess = false) { } } public class RequiresMethodAttribute : RequiresAttribute { public RequiresMethodAttribute(Type targetType, string methodName, Type returnType, params Type[] arguments) { } } public class RequiresMethodDefaultsAttribute : RequiresAttribute { public RequiresMethodDefaultsAttribute(Type targetType, string methodName, Type returnType, Type[] argumentTypes, object[] argumentDefaults) { } } public class RequiresEnumInsertionAttribute : RequiresAttribute { public RequiresEnumInsertionAttribute(Type targetType, string entryName) { } } }
BepInEx/patchers/CessilCellsCeaChells/CessilCellsCeaChells.Preloader.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Mono.Cecil; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyCompany("CessilCellsCeaChells.Preloader")] [assembly: AssemblyConfiguration("Mono10")] [assembly: AssemblyFileVersion("0.3.6.0")] [assembly: AssemblyInformationalVersion("0.3.6+7d89ac2f0f27f18bdede1a7a48d74cf17c6333f1")] [assembly: AssemblyProduct("CessilCellsCeaChells.Preloader")] [assembly: AssemblyTitle("CessilCellsCeaChells.Preloader")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.3.6.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 CessilCellsCeaChells.Preloader { internal static class CessilCellsCeaChellsDownByTheCeaChore { public static IEnumerable<string> TargetDLLs => Merger.TargetDLLFileNames; private static CessilMerger Merger { get; } = new CessilMerger(); private static ManualLogSource Logger { get; } = Logger.CreateLogSource("CessilCellsCeaChellsDownByTheCeaChore"); public static void Initialize() { CessilMerger.LogDebug += Logger.LogDebug; CessilMerger.LogWarn += Logger.LogWarning; Merger.CachePath = Path.Combine(Paths.CachePath, "CessilCellsCeaChellsDownByTheCeaChore"); Merger.TypeResolver = (IAssemblyResolver)(object)TypeLoader.Resolver; LoadPlugins(); Logger.LogInfo((object)"Initialized!"); } private static void LoadPlugins() { string text = Paths.PluginPath ?? ""; if (!Directory.Exists(text)) { throw new ArgumentException("Invalid plugin directory!", text); } int num = default(int); foreach (string item in Directory.GetFiles(text, "*.dll", SearchOption.AllDirectories).OrderBy(delegate(string path) { using SHA256 sHA = SHA256.Create(); string text2 = path.Replace(Paths.PluginPath, ""); int num2 = sHA.ComputeHash(Encoding.UTF8.GetBytes(text2)).Aggregate(0, (int i, byte b) => i + b); Logger.LogDebug((object)$"Hashed '{text2}' to '{num2}'"); return num2; })) { if (Merger.LoadMergesFrom(item, ref num)) { Logger.LogInfo((object)string.Format("Successfully loaded {0} merge{1} from '{2}'", num, (num == 1) ? "" : "s", Path.GetFileName(item))); } } } public static void Patch(AssemblyDefinition assembly) { Logger.LogInfo((object)("Patching '" + ((AssemblyNameReference)assembly.Name).Name + "'..")); Merger.MergeInto(assembly); if (!Directory.Exists(Paths.CachePath)) { Directory.CreateDirectory(Paths.CachePath); } string text = Path.Combine(Paths.CachePath, "Cessil." + ((AssemblyNameReference)assembly.Name).Name + ".dll"); assembly.Write(text); Logger.LogInfo((object)("Patching '" + ((AssemblyNameReference)assembly.Name).Name + "' done! Cached to '" + text + "'")); } public static void Finish() { Merger.Dispose(); Logger.LogInfo((object)"Finished!"); } } }