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 SkinDetailPicker v2.0.1
DetailPicker.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using HG; using HG.Reflection; using IL.RoR2; using LobbySkinsFix; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using MonoMod.RuntimeDetour; using On.RoR2; using On.RoR2.UI; using Pathfinder.Components; using R2API.Utils; using RedGuyMod; using RedGuyMod.Content.Components; using RiskOfOptions; using RiskOfOptions.Options; using RiskOfRuinaMod.Modules; using RiskOfRuinaMod.Modules.Components; using RoR2; using RoR2.Projectile; using RoR2.Skills; using RoR2.SurvivorMannequins; using RoR2.UI; using RoR2BepInExPack.Utilities; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("DetailPicker")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+7d419db9e7e69fafc19c4ae46119fa0760e2284a")] [assembly: AssemblyProduct("DetailPicker")] [assembly: AssemblyTitle("DetailPicker")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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 DetailPicker { [BepInPlugin("xyz.yekoc.DetailPicker", "Skin Detail Picker", "2.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class SkinDetailPickerPlugin : BaseUnityPlugin { public class CharacterDetail<T> { public T detail; public SkinDef sourceSkin; public int index; public string path; public Action<GameObject> applyAction; } public class CharacterDetailCatalog { public Dictionary<BodyIndex, List<CharacterDetail<MinionSkinReplacement>>> minionSkins = new Dictionary<BodyIndex, List<CharacterDetail<MinionSkinReplacement>>>(); public Dictionary<GameObject, List<CharacterDetail<ProjectileGhostReplacement>>> projectiles = new Dictionary<GameObject, List<CharacterDetail<ProjectileGhostReplacement>>>(); public Dictionary<Renderer, List<CharacterDetail<RendererInfo>>> infoTs = new Dictionary<Renderer, List<CharacterDetail<RendererInfo>>>(); public Dictionary<Renderer, List<CharacterDetail<MeshReplacement>>> meshTs = new Dictionary<Renderer, List<CharacterDetail<MeshReplacement>>>(); public Dictionary<GameObject, List<CharacterDetail<bool>>> actT = new Dictionary<GameObject, List<CharacterDetail<bool>>>(); } public class OverlaySkin { public SkinDef orig; public RuntimeSkin rSkin; public BodyIndex bodyIndex; public bool seperateMaterials; public List<MinionSkinReplacement> minions; public List<ProjectileGhostReplacement> projectiles; public int[] syncInfo; public Action<GameObject> onApply; public int FindIndex(int category) { return (syncInfo != null && category < syncInfo.Length) ? syncInfo[category] : 0; } public static void GenerateSyncFromSkinRows(ref int[] sync, SkinDef skin, IEnumerable<Row> detailRows) { int num = 0; foreach (Row item in detailRows.Reverse()) { int num2 = item.buttons.FindIndex(delegate(MPButton b) { string overrideTitleText3 = ((Component)b).GetComponent<TooltipProvider>().overrideTitleText; return overrideTitleText3.Contains(Language.GetString(skin.nameToken)); }); if (num2 == -1 && skin.baseSkins.Any()) { num2 = item.buttons.FindIndex(delegate(MPButton b) { string overrideTitleText2 = ((Component)b).GetComponent<TooltipProvider>().overrideTitleText; return overrideTitleText2.Contains(Language.GetString(skin.baseSkins.Last().nameToken)); }); } if (num2 == -1) { num2 = ((item.buttons.FindIndex(delegate(MPButton b) { string overrideTitleText = ((Component)b).GetComponent<TooltipProvider>().overrideTitleText; return overrideTitleText.Contains(Language.GetString("Disabled")); }) != -1) ? (-2) : (-1)); } if (num2 != -1) { sync[rowCountStore - 1 - num] = num2; item.UpdateHighlightedChoice(); } num++; } } public void BuildRSkin(int[] syncInfo) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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_004f: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0091: 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) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0a03: Unknown result type (might be due to invalid IL or missing references) //IL_06a4: Unknown result type (might be due to invalid IL or missing references) //IL_03b2: Unknown result type (might be due to invalid IL or missing references) //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03cf: Unknown result type (might be due to invalid IL or missing references) //IL_0777: Unknown result type (might be due to invalid IL or missing references) //IL_078f: Unknown result type (might be due to invalid IL or missing references) //IL_0794: Unknown result type (might be due to invalid IL or missing references) //IL_0848: Unknown result type (might be due to invalid IL or missing references) //IL_0860: Unknown result type (might be due to invalid IL or missing references) //IL_0865: Unknown result type (might be due to invalid IL or missing references) //IL_0bb0: Unknown result type (might be due to invalid IL or missing references) orig.Bake(); rSkin = new RuntimeSkin { meshReplacementTemplates = ArrayUtils.Clone<MeshReplacementTemplate>(orig.runtimeSkin.meshReplacementTemplates), rendererInfoTemplates = ArrayUtils.Clone<RendererInfoTemplate>(orig.runtimeSkin.rendererInfoTemplates), gameObjectActivationTemplates = ArrayUtils.Clone<GameObjectActivationTemplate>(orig.runtimeSkin.gameObjectActivationTemplates) }; minions.Clear(); projectiles.Clear(); onApply = null; int num = 0; SkinDef[] bodySkins = BodyCatalog.GetBodySkins(bodyIndex); if (!detailCatalog.ContainsKey(bodyIndex) || syncInfo.Length == 0) { minions.AddRange(orig.minionSkinReplacements); projectiles.AddRange(orig.projectileGhostReplacements); return; } CharacterDetailCatalog details = detailCatalog[bodyIndex]; if (seperateMaterials) { foreach (KeyValuePair<Renderer, List<CharacterDetail<MeshReplacement>>> l in details.meshTs) { if (l.Value.Count <= 1) { continue; } int num2 = syncInfo[num]; if (num2 >= l.Value.Count) { num++; continue; } if (num2 == -2 || (num2 == 0 && !bodySkins[0].meshReplacements.Any((MeshReplacement r) => (Object)(object)r.renderer == (Object)(object)l.Key))) { int num3 = Array.FindIndex(rSkin.meshReplacementTemplates, (MeshReplacementTemplate r) => r.path == l.Value[0].path); if (num3 != -1) { ArrayUtils.ArrayRemoveAtAndResize<MeshReplacementTemplate>(ref rSkin.meshReplacementTemplates, num3, 1); } } else { CharacterDetail<MeshReplacement> characterDetail = l.Value[num2]; ref MeshReplacementTemplate[] meshReplacementTemplates = ref rSkin.meshReplacementTemplates; MeshReplacementTemplate val = new MeshReplacementTemplate { path = characterDetail.path, mesh = characterDetail.detail.mesh }; ArrayUtils.ArrayAppend<MeshReplacementTemplate>(ref meshReplacementTemplates, ref val); onApply = (Action<GameObject>)Delegate.Combine(onApply, characterDetail.applyAction); } num++; } foreach (KeyValuePair<Renderer, List<CharacterDetail<RendererInfo>>> j in details.infoTs) { if (j.Value.Count <= 1) { continue; } int num4 = syncInfo[num]; if (num4 >= j.Value.Count) { num++; continue; } int num5 = Array.FindIndex(rSkin.rendererInfoTemplates, (RendererInfoTemplate r) => r.path == j.Value[0].path); if (num5 != -1) { ArrayUtils.ArrayRemoveAtAndResize<RendererInfoTemplate>(ref rSkin.rendererInfoTemplates, num5, 1); } if (num4 != -2 && (num4 != 0 || bodySkins[0].rendererInfos.Any((RendererInfo r) => (Object)(object)r.renderer == (Object)(object)j.Key))) { CharacterDetail<RendererInfo> characterDetail2 = j.Value[num4]; ref RendererInfoTemplate[] rendererInfoTemplates = ref rSkin.rendererInfoTemplates; RendererInfoTemplate val2 = new RendererInfoTemplate { path = characterDetail2.path, data = characterDetail2.detail }; ArrayUtils.ArrayAppend<RendererInfoTemplate>(ref rendererInfoTemplates, ref val2); onApply = (Action<GameObject>)Delegate.Combine(onApply, characterDetail2.applyAction); } num++; } } else { foreach (Renderer r2 in details.meshTs.Keys.Union(details.infoTs.Keys).Distinct()) { int num6 = 0; if (details.meshTs.ContainsKey(r2)) { num6 += details.meshTs[r2].Count; int num7 = Array.FindIndex(rSkin.meshReplacementTemplates, (MeshReplacementTemplate t) => t.path == details.meshTs[r2][0].path); if (num7 != -1) { ArrayUtils.ArrayRemoveAtAndResize<MeshReplacementTemplate>(ref rSkin.meshReplacementTemplates, num7, 1); } } if (details.infoTs.ContainsKey(r2)) { num6 += details.infoTs[r2].Count; int num8 = Array.FindIndex(rSkin.rendererInfoTemplates, (RendererInfoTemplate t) => t.path == details.infoTs[r2][0].path); if (num8 != -1) { ArrayUtils.ArrayRemoveAtAndResize<RendererInfoTemplate>(ref rSkin.rendererInfoTemplates, num8, 1); } } if (num6 <= 1) { continue; } int num9 = syncInfo[num]; if (num9 != -2 && (num9 != 0 || bodySkins[0].meshReplacements.Any((MeshReplacement m) => (Object)(object)m.renderer == (Object)(object)r2) || bodySkins[0].rendererInfos.Any((RendererInfo i) => (Object)(object)i.renderer == (Object)(object)r2))) { SkinDef val3 = null; if (details.meshTs.ContainsKey(r2) && details.meshTs[r2].Count > num9) { CharacterDetail<MeshReplacement> repl = details.meshTs[r2][num9]; val3 = repl.sourceSkin; ref MeshReplacementTemplate[] meshReplacementTemplates2 = ref rSkin.meshReplacementTemplates; MeshReplacementTemplate val = new MeshReplacementTemplate { path = repl.path, mesh = repl.detail.mesh }; ArrayUtils.ArrayAppend<MeshReplacementTemplate>(ref meshReplacementTemplates2, ref val); onApply = (Action<GameObject>)Delegate.Combine(onApply, repl.applyAction); if (details.infoTs.ContainsKey(r2)) { CharacterDetail<RendererInfo> characterDetail3 = details.infoTs[r2].FirstOrDefault((CharacterDetail<RendererInfo> i) => (Object)(object)i.sourceSkin == (Object)(object)repl.sourceSkin); if (Object.op_Implicit((Object)(object)characterDetail3.sourceSkin)) { ref RendererInfoTemplate[] rendererInfoTemplates2 = ref rSkin.rendererInfoTemplates; RendererInfoTemplate val2 = new RendererInfoTemplate { path = characterDetail3.path, data = characterDetail3.detail }; ArrayUtils.ArrayAppend<RendererInfoTemplate>(ref rendererInfoTemplates2, ref val2); onApply = (Action<GameObject>)Delegate.Combine(onApply, characterDetail3.applyAction); } } } else if (details.infoTs.ContainsKey(r2) && details.infoTs[r2].Count > num9) { CharacterDetail<RendererInfo> characterDetail4 = details.infoTs[r2][num9]; ref RendererInfoTemplate[] rendererInfoTemplates3 = ref rSkin.rendererInfoTemplates; RendererInfoTemplate val2 = new RendererInfoTemplate { path = characterDetail4.path, data = characterDetail4.detail }; ArrayUtils.ArrayAppend<RendererInfoTemplate>(ref rendererInfoTemplates3, ref val2); onApply = (Action<GameObject>)Delegate.Combine(onApply, characterDetail4.applyAction); } } num++; } } foreach (KeyValuePair<BodyIndex, List<CharacterDetail<MinionSkinReplacement>>> k in details.minionSkins) { int num10 = syncInfo[num]; if (num10 >= k.Value.Count) { num++; continue; } if (num10 == -2) { minions.RemoveAll((MinionSkinReplacement r) => BodyCatalog.FindBodyIndex(r.minionBodyPrefab) == k.Key); foreach (CharacterDetail<MinionSkinReplacement> item in k.Value) { onApply = (Action<GameObject>)Delegate.Remove(onApply, item.applyAction); if (item.index == -2) { onApply = (Action<GameObject>)Delegate.Combine(onApply, item.applyAction); } } } else if (Object.op_Implicit((Object)(object)k.Value[num10].detail.minionSkin)) { minions.Add(k.Value[num10].detail); onApply = (Action<GameObject>)Delegate.Combine(onApply, k.Value[num10].applyAction); } num++; } foreach (KeyValuePair<GameObject, List<CharacterDetail<ProjectileGhostReplacement>>> p in details.projectiles) { int num11 = syncInfo[num]; if (num11 >= p.Value.Count) { num++; continue; } if (num11 == -2) { projectiles.RemoveAll((ProjectileGhostReplacement r) => (Object)(object)r.projectilePrefab == (Object)(object)p.Key); foreach (CharacterDetail<ProjectileGhostReplacement> item2 in p.Value) { onApply = (Action<GameObject>)Delegate.Remove(onApply, item2.applyAction); if (item2.index == -2) { onApply = (Action<GameObject>)Delegate.Combine(onApply, item2.applyAction); } } } else if (Object.op_Implicit((Object)(object)p.Value[num11].detail.projectileGhostReplacementPrefab)) { projectiles.Add(p.Value[num11].detail); onApply = (Action<GameObject>)Delegate.Combine(onApply, p.Value[num11].applyAction); } num++; } } } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Func<KeyValuePair<Renderer, List<CharacterDetail<MeshReplacement>>>, IEnumerable<CharacterDetail<MeshReplacement>>> <>9__20_0; public static Func<KeyValuePair<Renderer, List<CharacterDetail<RendererInfo>>>, IEnumerable<CharacterDetail<RendererInfo>>> <>9__20_2; public static Func<KeyValuePair<Renderer, List<CharacterDetail<MeshReplacement>>>, IEnumerable<CharacterDetail<MeshReplacement>>> <>9__22_3; public static Func<Instruction, bool> <>9__22_5; public static Func<Instruction, bool> <>9__22_6; public static Func<Component, bool> <>9__22_7; public static Func<Instruction, bool> <>9__22_8; public static Func<Instruction, bool> <>9__22_9; public static Func<Instruction, bool> <>9__22_10; public static hook_FindProjectileGhostPrefab <>9__24_0; public static Func<Instruction, bool> <>9__24_11; public static Func<MinionSkinReplacement[], MasterSummon, MinionSkinReplacement[]> <>9__24_10; public static Manipulator <>9__24_1; public static hook_Apply <>9__24_2; public static Func<Instruction, bool> <>9__24_13; public static Func<bool, BodyLoadoutManager, int, bool> <>9__24_12; public static Manipulator <>9__24_4; public static hook_Serialize <>9__24_6; public static hook_Deserialize <>9__24_7; public static hook_Copy <>9__24_8; internal IEnumerable<CharacterDetail<MeshReplacement>> <HandleRuina>b__20_0(KeyValuePair<Renderer, List<CharacterDetail<MeshReplacement>>> x) { return x.Value; } internal IEnumerable<CharacterDetail<RendererInfo>> <HandleRuina>b__20_2(KeyValuePair<Renderer, List<CharacterDetail<RendererInfo>>> x) { return x.Value; } internal IEnumerable<CharacterDetail<MeshReplacement>> <HandleRavager>b__22_3(KeyValuePair<Renderer, List<CharacterDetail<MeshReplacement>>> x) { return x.Value; } internal bool <HandleRavager>b__22_5(Instruction x) { return ILPatternMatchingExt.MatchStfld(x, typeof(RedGuyController).GetField("cachedSkinDef", (BindingFlags)(-1))); } internal bool <HandleRavager>b__22_6(Instruction x) { ILLabel val = default(ILLabel); return ILPatternMatchingExt.MatchBrfalse(x, ref val); } internal bool <HandleRavager>b__22_7(Component self) { return <HandleRavager>g__SmhWhyIsThisRequired|22_1(self); } internal bool <HandleRavager>b__22_8(Instruction x) { return ILPatternMatchingExt.MatchLdstr(x, "SwordElectricity"); } internal bool <HandleRavager>b__22_9(Instruction x) { return ILPatternMatchingExt.MatchLdarg(x, 0); } internal bool <HandleRavager>b__22_10(Instruction x) { return ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)typeof(ParticleSystemRenderer).GetProperty("trailMaterial").GetSetMethod()); } internal GameObject <Awake>b__24_0(orig_FindProjectileGhostPrefab orig, ProjectileController projcontroller) { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: 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) <>c__DisplayClass24_0 CS$<>8__locals0 = new <>c__DisplayClass24_0(); GameObject val = orig.Invoke(projcontroller); CS$<>8__locals0.prefab = ProjectileCatalog.GetProjectilePrefab(projcontroller.catalogIndex); GameObject owner = projcontroller.owner; object obj; if (owner == null) { obj = null; } else { CharacterBody component = owner.GetComponent<CharacterBody>(); obj = ((component == null) ? null : component.master?.loadout); } Loadout val2 = (Loadout)obj; OverlaySkin overlaySkin = default(OverlaySkin); ProjectileGhostReplacement? val3 = ((val2 == null || !networkOSkins.TryGetValue(val2, ref overlaySkin)) ? null : overlaySkin?.projectiles?.Find((ProjectileGhostReplacement p) => (Object)(object)p.projectilePrefab == (Object)(object)CS$<>8__locals0.prefab)); return (val3.HasValue && Object.op_Implicit((Object)(object)val3.Value.projectilePrefab)) ? val3.Value.projectileGhostReplacementPrefab : val; } internal void <Awake>b__24_1(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdfld(x, typeof(SkinDef).GetField("minionSkinReplacements")) })) { return; } val.Emit(OpCodes.Ldarg_0); val.EmitDelegate<Func<MinionSkinReplacement[], MasterSummon, MinionSkinReplacement[]>>((Func<MinionSkinReplacement[], MasterSummon, MinionSkinReplacement[]>)delegate(MinionSkinReplacement[] reps, MasterSummon self) { GameObject summonerBodyObject = self.summonerBodyObject; object obj; if (summonerBodyObject == null) { obj = null; } else { CharacterBody component = summonerBodyObject.GetComponent<CharacterBody>(); obj = ((component == null) ? null : component.master?.loadout); } Loadout val2 = (Loadout)obj; OverlaySkin overlaySkin = default(OverlaySkin); return (val2 != null && networkOSkins.TryGetValue(val2, ref overlaySkin) && overlaySkin.minions != null) ? overlaySkin.minions.ToArray() : reps; }); } internal bool <Awake>b__24_11(Instruction x) { return ILPatternMatchingExt.MatchLdfld(x, typeof(SkinDef).GetField("minionSkinReplacements")); } internal MinionSkinReplacement[] <Awake>b__24_10(MinionSkinReplacement[] reps, MasterSummon self) { GameObject summonerBodyObject = self.summonerBodyObject; object obj; if (summonerBodyObject == null) { obj = null; } else { CharacterBody component = summonerBodyObject.GetComponent<CharacterBody>(); obj = ((component == null) ? null : component.master?.loadout); } Loadout val = (Loadout)obj; OverlaySkin overlaySkin = default(OverlaySkin); return (val != null && networkOSkins.TryGetValue(val, ref overlaySkin) && overlaySkin.minions != null) ? overlaySkin.minions.ToArray() : reps; } internal void <Awake>b__24_2(orig_Apply orig, SkinDef self, GameObject model) { orig.Invoke(self, model); CharacterModel component = model.GetComponent<CharacterModel>(); object obj; if (component == null) { obj = null; } else { CharacterBody body = component.body; obj = ((body == null) ? null : body.master?.loadout); } Loadout val = (Loadout)obj; if (val == null) { val = model.GetComponentInParent<SurvivorMannequinSlotController>()?.currentLoadout; if (val != null) { bool flag = true; } } OverlaySkin overlaySkin = default(OverlaySkin); if (val != null && networkOSkins.TryGetValue(val, ref overlaySkin) && (Object)(object)overlaySkin.orig == (Object)(object)self) { RuntimeSkin rSkin = overlaySkin.rSkin; if (rSkin != null) { rSkin.Apply(model); } overlaySkin.onApply?.Invoke(model); } } internal void <Awake>b__24_4(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); ILLabel val2 = default(ILLabel); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchBrfalse(x, ref val2) })) { val.Emit(OpCodes.Ldarg_0); val.Emit(OpCodes.Ldarg_1); val.EmitDelegate<Func<bool, BodyLoadoutManager, int, bool>>((Func<bool, BodyLoadoutManager, int, bool>)((bool orig, BodyLoadoutManager self, int index) => orig && (!detailCatalog.ContainsKey(self.modifiedBodyLoadouts[index].bodyIndex) || oSkin.bodyIndex != self.modifiedBodyLoadouts[index].bodyIndex))); } } internal bool <Awake>b__24_13(Instruction x) { ILLabel val = default(ILLabel); return ILPatternMatchingExt.MatchBrfalse(x, ref val); } internal bool <Awake>b__24_12(bool orig, BodyLoadoutManager self, int index) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) return orig && (!detailCatalog.ContainsKey(self.modifiedBodyLoadouts[index].bodyIndex) || oSkin.bodyIndex != self.modifiedBodyLoadouts[index].bodyIndex); } internal void <Awake>b__24_6(orig_Serialize orig, Loadout self, NetworkWriter writer) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected I4, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, writer); OverlaySkin orCreateValue = networkOSkins.GetOrCreateValue(self); if (orCreateValue == null || (Object)(object)orCreateValue.orig == (Object)null || !detailCatalog.ContainsKey(orCreateValue.bodyIndex) || orCreateValue.syncInfo.Length == 0) { writer.Write(-1); return; } writer.Write((int)orCreateValue.orig.skinIndex); NetworkExtensions.WriteBodyIndex(writer, orCreateValue.bodyIndex); writer.Write(orCreateValue.seperateMaterials); writer.Write(orCreateValue.syncInfo.Length); int[] syncInfo = orCreateValue.syncInfo; foreach (int num in syncInfo) { writer.Write(num); } } internal void <Awake>b__24_7(orig_Deserialize orig, Loadout self, NetworkReader reader) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Invalid comparison between Unknown and I4 //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, reader); SkinIndex val = (SkinIndex)reader.ReadInt32(); if ((int)val != -1) { OverlaySkin orCreateValue = networkOSkins.GetOrCreateValue(self); orCreateValue.orig = SkinCatalog.GetSkinDef(val); orCreateValue.bodyIndex = NetworkExtensions.ReadBodyIndex(reader); orCreateValue.seperateMaterials = reader.ReadBoolean(); int num = reader.ReadInt32(); orCreateValue.syncInfo = new int[num]; for (int i = 0; i < num; i++) { orCreateValue.syncInfo[i] = reader.ReadInt32(); } orCreateValue.minions = new List<MinionSkinReplacement>(); orCreateValue.projectiles = new List<ProjectileGhostReplacement>(); if (detailCatalog.ContainsKey(orCreateValue.bodyIndex)) { orCreateValue.BuildRSkin(orCreateValue.syncInfo); } } } internal void <Awake>b__24_8(orig_Copy orig, Loadout self, Loadout target) { orig.Invoke(self, target); OverlaySkin overlaySkin = default(OverlaySkin); if (networkOSkins.TryGetValue(self, ref overlaySkin)) { networkOSkins.Remove(target); networkOSkins.Add(target, overlaySkin); } } } [CompilerGenerated] private sealed class <>c__DisplayClass24_0 { public GameObject prefab; internal bool <Awake>b__9(ProjectileGhostReplacement p) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return (Object)(object)p.projectilePrefab == (Object)(object)prefab; } } public static Dictionary<BodyIndex, CharacterDetailCatalog> detailCatalog = new Dictionary<BodyIndex, CharacterDetailCatalog>(); public static List<string> blacklist = new List<string> { "RobHunkBody" }; public static bool lobbySkinFix = false; public static bool ravagerFix = false; public static bool pathfinderFix = false; public Sprite icon = LegacyResourcesAPI.Load<SkillDef>("SkillDefs/CaptainBody/CaptainSkillUsedUp").icon; public static FixedConditionalWeakTable<Loadout, OverlaySkin> networkOSkins = new FixedConditionalWeakTable<Loadout, OverlaySkin>(); public ConfigEntry<bool> seperateMaterials; public static UserProfile localProfile; public List<Row> detailRows = new List<Row>(); public static int rowCountStore; public static OverlaySkin oSkin { get { return networkOSkins.GetOrCreateValue(localProfile.loadout); } set { networkOSkins.Remove(localProfile.loadout); networkOSkins.Add(localProfile.loadout, value); } } [SystemInitializer(new Type[] { typeof(SurvivorCatalog), typeof(SkinCatalog) })] public static void CreateCatalog() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: 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_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: 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_0158: 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_0166: 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_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_02e8: Unknown result type (might be due to invalid IL or missing references) //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_0547: Unknown result type (might be due to invalid IL or missing references) //IL_0679: Unknown result type (might be due to invalid IL or missing references) //IL_067e: Unknown result type (might be due to invalid IL or missing references) //IL_0680: Unknown result type (might be due to invalid IL or missing references) //IL_0681: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_068f: Unknown result type (might be due to invalid IL or missing references) //IL_0695: Unknown result type (might be due to invalid IL or missing references) //IL_0327: Unknown result type (might be due to invalid IL or missing references) //IL_0329: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_03c0: Unknown result type (might be due to invalid IL or missing references) //IL_03c5: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_06ad: Unknown result type (might be due to invalid IL or missing references) //IL_06b3: Unknown result type (might be due to invalid IL or missing references) //IL_070a: Unknown result type (might be due to invalid IL or missing references) //IL_0388: Unknown result type (might be due to invalid IL or missing references) //IL_03e9: Unknown result type (might be due to invalid IL or missing references) //IL_06cb: Unknown result type (might be due to invalid IL or missing references) //IL_06d1: Unknown result type (might be due to invalid IL or missing references) //IL_03ff: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_0428: Unknown result type (might be due to invalid IL or missing references) //IL_0637: Unknown result type (might be due to invalid IL or missing references) //IL_06e9: Unknown result type (might be due to invalid IL or missing references) //IL_06ef: Unknown result type (might be due to invalid IL or missing references) //IL_0460: Unknown result type (might be due to invalid IL or missing references) foreach (SurvivorDef allSurvivorDef in SurvivorCatalog.allSurvivorDefs) { BodyIndex val = SurvivorCatalog.survivorIndexToBodyIndex[allSurvivorDef.survivorIndex]; if (blacklist.Contains(((Object)allSurvivorDef.bodyPrefab).name) || detailCatalog.ContainsKey(val)) { continue; } CharacterDetailCatalog characterDetailCatalog = new CharacterDetailCatalog(); SkinDef[] bodySkinDefs = SkinCatalog.GetBodySkinDefs(val); SkinDef[] array = bodySkinDefs; foreach (SkinDef val2 in array) { string @string = Language.GetString(val2.nameToken); MinionSkinReplacement[] minionSkinReplacements = val2.minionSkinReplacements; foreach (MinionSkinReplacement val3 in minionSkinReplacements) { BodyIndex key = BodyCatalog.FindBodyIndex(val3.minionBodyPrefab); List<CharacterDetail<MinionSkinReplacement>> list = (characterDetailCatalog.minionSkins.ContainsKey(key) ? characterDetailCatalog.minionSkins[key] : new List<CharacterDetail<MinionSkinReplacement>>()); list.Add(new CharacterDetail<MinionSkinReplacement> { detail = val3, sourceSkin = val2, index = list.Count }); if (list.Count <= 1) { characterDetailCatalog.minionSkins.Add(key, list); } } ProjectileGhostReplacement[] projectileGhostReplacements = val2.projectileGhostReplacements; foreach (ProjectileGhostReplacement val4 in projectileGhostReplacements) { List<CharacterDetail<ProjectileGhostReplacement>> list2 = (characterDetailCatalog.projectiles.ContainsKey(val4.projectilePrefab) ? characterDetailCatalog.projectiles[val4.projectilePrefab] : new List<CharacterDetail<ProjectileGhostReplacement>>()); list2.Add(new CharacterDetail<ProjectileGhostReplacement> { detail = val4, sourceSkin = val2, index = list2.Count }); if (list2.Count <= 1) { characterDetailCatalog.projectiles.Add(val4.projectilePrefab, list2); } } GameObjectActivation[] gameObjectActivations = val2.gameObjectActivations; foreach (GameObjectActivation val5 in gameObjectActivations) { List<CharacterDetail<bool>> list3 = (characterDetailCatalog.actT.ContainsKey(val5.gameObject) ? characterDetailCatalog.actT[val5.gameObject] : new List<CharacterDetail<bool>>()); list3.Add(new CharacterDetail<bool> { detail = val5.shouldActivate, sourceSkin = val2, index = list3.Count, path = Util.BuildPrefabTransformPath(val2.rootObject.transform, val5.gameObject.transform, false, false) }); if (list3.Count <= 1) { characterDetailCatalog.actT.Add(val5.gameObject, list3); } } RendererInfo[] rendererInfos = val2.rendererInfos; foreach (RendererInfo val6 in rendererInfos) { List<CharacterDetail<RendererInfo>> list4 = (characterDetailCatalog.infoTs.ContainsKey(val6.renderer) ? characterDetailCatalog.infoTs[val6.renderer] : new List<CharacterDetail<RendererInfo>>()); list4.Add(new CharacterDetail<RendererInfo> { detail = val6, sourceSkin = val2, index = list4.Count, path = Util.BuildPrefabTransformPath(val2.rootObject.transform, ((Component)val6.renderer).transform, false, false) }); if (list4.Count <= 1) { characterDetailCatalog.infoTs.Add(val6.renderer, list4); } } MeshReplacement[] meshReplacements = val2.meshReplacements; foreach (MeshReplacement val7 in meshReplacements) { List<CharacterDetail<MeshReplacement>> list5 = (characterDetailCatalog.meshTs.ContainsKey(val7.renderer) ? characterDetailCatalog.meshTs[val7.renderer] : new List<CharacterDetail<MeshReplacement>>()); list5.Add(new CharacterDetail<MeshReplacement> { detail = val7, sourceSkin = val2, index = list5.Count, path = Util.BuildPrefabTransformPath(val2.rootObject.transform, ((Component)val7.renderer).transform, false, false) }); if (list5.Count <= 1) { characterDetailCatalog.meshTs.Add(val7.renderer, list5); } } } foreach (KeyValuePair<BodyIndex, List<CharacterDetail<MinionSkinReplacement>>> mini in characterDetailCatalog.minionSkins) { if (bodySkinDefs[0].minionSkinReplacements.Any((MinionSkinReplacement m) => BodyCatalog.FindBodyIndex(m.minionBodyPrefab) == mini.Key)) { continue; } foreach (CharacterDetail<MinionSkinReplacement> item in mini.Value) { item.index++; } mini.Value.Insert(0, new CharacterDetail<MinionSkinReplacement> { detail = default(MinionSkinReplacement), sourceSkin = bodySkinDefs[0], index = -2 }); } foreach (KeyValuePair<GameObject, List<CharacterDetail<ProjectileGhostReplacement>>> proj in characterDetailCatalog.projectiles) { if (bodySkinDefs[0].projectileGhostReplacements.Any((ProjectileGhostReplacement m) => (Object)(object)m.projectilePrefab == (Object)(object)proj.Key)) { continue; } foreach (CharacterDetail<ProjectileGhostReplacement> item2 in proj.Value) { item2.index++; } proj.Value.Insert(0, new CharacterDetail<ProjectileGhostReplacement> { detail = default(ProjectileGhostReplacement), sourceSkin = bodySkinDefs[0], index = -2 }); } BodyIndex val8 = BodyCatalog.FindBodyIndex("EngiBody"); if (val != val8) { if (val == BodyCatalog.FindBodyIndex("RobPaladinBody")) { HandlePaladin(characterDetailCatalog); } else if (val == BodyCatalog.FindBodyIndex("RobRavagerBody")) { HandleRavager(characterDetailCatalog); } else if (val == BodyCatalog.FindBodyIndex("PathfinderBody")) { HandlePathfinder(characterDetailCatalog); } else if (val == BodyCatalog.FindBodyIndex("RedMistBody")) { HandleRuina(characterDetailCatalog); } } detailCatalog.Add(val, characterDetailCatalog); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public void HandleRiskOfOptions() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown ModSettingsManager.SetModDescription("Mix and Match Skins"); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(seperateMaterials)); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public void HandleLobbySkinFix() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) new Hook((MethodBase)typeof(ReverseSkin).GetMethod("Initialize", (BindingFlags)(-1)), (Delegate)new Action<Action<ReverseSkin, GameObject, SkinDef>, ReverseSkin, GameObject, SkinDef>(hook)); [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] static void hook(Action<ReverseSkin, GameObject, SkinDef> orig, ReverseSkin self, GameObject model, SkinDef skin) { RuntimeSkin runtimeSkin = skin.runtimeSkin; CharacterModel component = model.GetComponent<CharacterModel>(); object obj; if (component == null) { obj = null; } else { CharacterBody body = component.body; obj = ((body == null) ? null : body.master?.loadout); } Loadout val = (Loadout)obj; OverlaySkin overlaySkin = default(OverlaySkin); skin.runtimeSkin = ((val != null && networkOSkins.TryGetValue(val, ref overlaySkin) && (Object)(object)overlaySkin.orig == (Object)(object)skin) ? overlaySkin.rSkin : runtimeSkin); orig(self, model, skin); skin.runtimeSkin = runtimeSkin; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void HandleRuina(CharacterDetailCatalog details) { foreach (CharacterDetail<MeshReplacement> repl2 in details.meshTs.SelectMany((KeyValuePair<Renderer, List<CharacterDetail<MeshReplacement>>> x) => x.Value)) { CharacterDetail<MeshReplacement> characterDetail = repl2; characterDetail.applyAction = (Action<GameObject>)Delegate.Combine(characterDetail.applyAction, (Action<GameObject>)delegate(GameObject model) { CharacterModel component2 = model.GetComponent<CharacterModel>(); object obj2; if (component2 == null) { obj2 = null; } else { CharacterBody body2 = component2.body; obj2 = ((body2 != null) ? ((Component)body2).GetComponent<RedMistStatTracker>() : null); } RedMistStatTracker val2 = (RedMistStatTracker)obj2; if (Object.op_Implicit((Object)(object)val2)) { if (repl2.sourceSkin.nameToken == "COF_REDMIST_BODY_MASTERY_SKIN_NAME") { if (repl2.path.Contains("Body")) { ChildLocator componentInChildren = ((Component)val2).gameObject.GetComponentInChildren<ChildLocator>(); val2.EGOActivatePrefab = Assets.argaliaEGOActivate; val2.musicName = "Play_ArgaliaMusic"; if (Object.op_Implicit((Object)(object)componentInChildren)) { val2.mistEffect = ((Component)componentInChildren.FindChild("ArgaliaCloud")).GetComponent<ParticleSystem>(); ((Component)componentInChildren.FindChild("ParticleHair").GetChild(0)).gameObject.SetActive(false); ((Component)componentInChildren.FindChild("ParticleHair").GetChild(1)).gameObject.SetActive(true); } } } else if (repl2.sourceSkin.nameToken == "COF_REDMIST_BODY_DEFAULT_SKIN_NAME" && repl2.path.Contains("Body")) { ChildLocator componentInChildren2 = ((Component)val2).gameObject.GetComponentInChildren<ChildLocator>(); val2.musicName = "Play_Ruina_Boss_Music"; val2.EGOActivatePrefab = Assets.argaliaEGOActivate; if (Object.op_Implicit((Object)(object)componentInChildren2)) { val2.mistEffect = ((Component)componentInChildren2.FindChild("BloodCloud")).GetComponent<ParticleSystem>(); ((Component)componentInChildren2.FindChild("ParticleHair").GetChild(0)).gameObject.SetActive(true); ((Component)componentInChildren2.FindChild("ParticleHair").GetChild(1)).gameObject.SetActive(false); } } } }); } foreach (CharacterDetail<RendererInfo> repl in details.infoTs.SelectMany((KeyValuePair<Renderer, List<CharacterDetail<RendererInfo>>> x) => x.Value)) { CharacterDetail<RendererInfo> characterDetail2 = repl; characterDetail2.applyAction = (Action<GameObject>)Delegate.Combine(characterDetail2.applyAction, (Action<GameObject>)delegate(GameObject model) { CharacterModel component = model.GetComponent<CharacterModel>(); object obj; if (component == null) { obj = null; } else { CharacterBody body = component.body; obj = ((body != null) ? ((Component)body).GetComponent<RedMistStatTracker>() : null); } RedMistStatTracker val = (RedMistStatTracker)obj; if (Object.op_Implicit((Object)(object)val)) { if (repl.sourceSkin.nameToken == "COF_REDMIST_BODY_MASTERY_SKIN_NAME") { if (repl.path.Contains("Mimicry")) { val.slashPrefab = Assets.argaliaSwordSwingEffect; val.piercePrefab = Assets.argaliaSpearPierceEffect; val.EGOSlashPrefab = Assets.argaliaEGOSwordSwingEffect; val.EGOPiercePrefab = Assets.argaliaEGOSpearPierceEffect; val.hitEffect = Assets.argaliaSwordHitEffect; val.phaseEffect = Assets.argaliaPhaseEffect; val.groundPoundEffect = Assets.argaliaGroundPoundEffect; val.spinPrefab = Assets.argaliaSwordSpinEffect; val.spinPrefabTwo = Assets.argaliaSwordSpinEffectTwo; val.counterBurst = Assets.argaliaCounterBurst; val.afterimageBlock = Assets.argaliaAfterimageBlock; val.afterimageSlash = Assets.argaliaAfterimageSlash; } } else if (repl.sourceSkin.nameToken == "COF_REDMIST_BODY_DEFAULT_SKIN_NAME" && repl.path.Contains("Mimicry")) { val.slashPrefab = Assets.swordSwingEffect; val.piercePrefab = Assets.spearPierceEffect; val.EGOSlashPrefab = Assets.EGOSwordSwingEffect; val.EGOPiercePrefab = Assets.EGOSpearPierceEffect; val.hitEffect = Assets.swordHitEffect; val.phaseEffect = Assets.phaseEffect; val.groundPoundEffect = Assets.groundPoundEffect; val.spinPrefab = Assets.swordSpinEffect; val.spinPrefabTwo = Assets.swordSpinEffectTwo; val.counterBurst = Assets.counterBurst; val.afterimageBlock = Assets.afterimageBlock; val.afterimageSlash = Assets.afterimageSlash; } } }); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void HandlePathfinder(CharacterDetailCatalog details) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) if (!pathfinderFix) { new Hook((MethodBase)typeof(SquallController).GetMethod("Start", (BindingFlags)(-1)), (Delegate)new Action<Action<SquallController>, SquallController>(hook)); pathfinderFix = true; } foreach (CharacterDetail<MinionSkinReplacement> repl in details.minionSkins[BodyCatalog.FindBodyIndex("SquallBody")]) { CharacterDetail<MinionSkinReplacement> characterDetail = repl; characterDetail.applyAction = (Action<GameObject>)Delegate.Combine(characterDetail.applyAction, (Action<GameObject>)delegate(GameObject model) { CharacterSelectSurvivorPreviewDisplayController component3 = model.GetComponent<CharacterSelectSurvivorPreviewDisplayController>(); int num = Math.Max(0, repl.index); if (Object.op_Implicit((Object)(object)component3) && component3.skinChangeResponses.Length > num && Object.op_Implicit((Object)(object)model.GetComponentInParent<SurvivorMannequinSlotController>())) { UnityEvent response = component3.skinChangeResponses[num].response; if (response != null) { response.Invoke(); } } }); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] static void hook(Action<SquallController> orig, SquallController self) { //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) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) orig(self); if (Object.op_Implicit((Object)(object)self.owner) && Object.op_Implicit((Object)(object)self.selfBody)) { FixedConditionalWeakTable<Loadout, OverlaySkin> obj = networkOSkins; CharacterBody component = self.owner.GetComponent<CharacterBody>(); OverlaySkin overlaySkin = default(OverlaySkin); if (obj.TryGetValue((component == null) ? null : component.master?.loadout, ref overlaySkin)) { ModelLocator component2 = ((Component)self).GetComponent<ModelLocator>(); ModelSkinController val = ((component2 != null) ? ((Component)component2.modelTransform).GetComponent<ModelSkinController>() : null); MinionSkinReplacement val2 = ((IEnumerable<MinionSkinReplacement>)overlaySkin.minions).FirstOrDefault((Func<MinionSkinReplacement, bool>)((MinionSkinReplacement m) => (Object)(object)m.minionBodyPrefab == (Object)(object)self.selfBody.master.bodyPrefab)); if (Object.op_Implicit((Object)(object)val)) { val.ApplySkin(Object.op_Implicit((Object)(object)val2.minionSkin) ? SkinCatalog.FindLocalSkinIndexForBody(self.selfBody.bodyIndex, val2.minionSkin) : 0); } } } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void HandleRavager(CharacterDetailCatalog details) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_002e: Unknown result type (might be due to invalid IL or missing references) if (!ravagerFix) { new ILHook((MethodBase)typeof(RedGuyController).GetMethod("ApplySkin"), new Manipulator(Ilhook)); ravagerFix = true; } foreach (CharacterDetail<MeshReplacement> repl in details.meshTs.SelectMany((KeyValuePair<Renderer, List<CharacterDetail<MeshReplacement>>> x) => x.Value)) { CharacterDetail<MeshReplacement> characterDetail = repl; characterDetail.applyAction = (Action<GameObject>)Delegate.Combine(characterDetail.applyAction, (Action<GameObject>)delegate(GameObject model) { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) RavagerSkinDef val6 = RecreateRedGuySkin(model); if (Object.op_Implicit((Object)(object)val6)) { RavagerSkinDef skin = RavagerSkinCatalog.GetSkin(repl.sourceSkin.nameToken); if (repl.path.Contains("meshSword")) { val6.basicSwingEffectPrefab = skin.basicSwingEffectPrefab; val6.bigSwingEffectPrefab = skin.bigSwingEffectPrefab; val6.slashEffectPrefab = skin.slashEffectPrefab; ChildLocator component = model.GetComponent<ChildLocator>(); ((Component)component.FindChild("SwordElectricity")).gameObject.GetComponent<ParticleSystemRenderer>().trailMaterial = skin.electricityMat; ((Component)component.FindChild("SwordLight")).gameObject.GetComponent<Light>().color = skin.glowColor; } if (repl.path.Contains("meshBody")) { val6.bloodBombEffectPrefab = skin.bloodBombEffectPrefab; val6.bloodOrbEffectPrefab = skin.bloodOrbEffectPrefab; val6.bloodOrbOverlayMaterial = skin.bloodOrbOverlayMaterial; val6.bloodRushActivationEffectPrefab = skin.bloodRushActivationEffectPrefab; val6.bloodRushOverlayMaterial = skin.bloodRushOverlayMaterial; val6.consumeSoundString = skin.consumeSoundString; val6.healSoundString = skin.healSoundString; val6.swordElectricityMat = skin.swordElectricityMat; val6.electricityMat = skin.electricityMat; val6.glowColor = skin.glowColor; val6.leapEffectPrefab = skin.leapEffectPrefab; } if (repl.path.Contains("ImpWrap")) { val6.useAltAnimSet = skin.nameToken.Contains("MAHORAGA") || skin.useAltAnimSet; } } }); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] static void Ilhook(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0077: 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_015c: Unknown result type (might be due to invalid IL or missing references) ILCursor val2 = new ILCursor(il); if (val2.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchStfld(x, typeof(RedGuyController).GetField("cachedSkinDef", (BindingFlags)(-1))) })) { ILLabel val3 = val2.MarkLabel(); ILLabel val5 = default(ILLabel); val2.GotoPrev((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchBrfalse(x, ref val5) }); val2.Emit(OpCodes.Ldarg_0); val2.EmitDelegate<Func<Component, bool>>((Func<Component, bool>)((Component self) => SmhWhyIsThisRequired(self))); val2.Emit(OpCodes.Brtrue, (object)val3); val2.GotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdstr(x, "SwordElectricity") }); val2.GotoPrev(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0) }); ILLabel val4 = val2.MarkLabel(); val2.GotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)typeof(ParticleSystemRenderer).GetProperty("trailMaterial").GetSetMethod()) }); val3 = val2.MarkLabel(); val2.GotoLabel(val4, (MoveType)1, false); val2.Emit(OpCodes.Br, (object)val3); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] static RavagerSkinDef RecreateRedGuySkin(GameObject model) { CharacterModel componentInChildren = model.GetComponentInChildren<CharacterModel>(); object obj; if (componentInChildren == null) { obj = null; } else { CharacterBody body = componentInChildren.body; obj = ((body != null) ? ((Component)body).GetComponentInChildren<RedGuyController>() : null); } RedGuyController val = (RedGuyController)obj; if (!Object.op_Implicit((Object)(object)val)) { return null; } val.skinController = ((Component)val).GetComponentInChildren<ModelSkinController>(); if (!Object.op_Implicit((Object)(object)val.cachedSkinDef)) { val.cachedSkinDef = RavagerSkinCatalog.GetSkin(val.skinController.skins[model.GetComponent<CharacterModel>().body.skinIndex].nameToken); } if (RavagerSkinCatalog.skinDefs.Contains(val.cachedSkinDef)) { val.cachedSkinDef = Object.Instantiate<RavagerSkinDef>(val.cachedSkinDef); } return val.cachedSkinDef; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] static bool SmhWhyIsThisRequired(Component controller) { return Object.op_Implicit((Object)(object)((RedGuyController)(((controller is RedGuyController) ? controller : null)?)).cachedSkinDef); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void HandlePaladin(CharacterDetailCatalog details) { List<Renderer> list = new List<Renderer>(); foreach (Renderer key in details.meshTs.Keys) { if (((Object)key).name == "Crystal") { list.Add(key); } } foreach (Renderer key2 in details.infoTs.Keys) { if (((Object)key2).name == "Crystal") { list.Add(key2); } } foreach (Renderer item in list) { details.meshTs.Remove(item); details.infoTs.Remove(item); } } private void Awake() { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_009d: 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) //IL_00a8: Expected O, but got Unknown //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Expected O, but got Unknown //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Expected O, but got Unknown //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Expected O, but got Unknown //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Expected O, but got Unknown //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Expected O, but got Unknown //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Expected O, but got Unknown lobbySkinFix = Chainloader.PluginInfos.ContainsKey("com.KingEnderBrine.LobbySkinsFix"); seperateMaterials = ((BaseUnityPlugin)this).Config.Bind<bool>("Configuration", "Seperate Materials", false, "Present extra selections for materials (the default merges them with mesh replacements)"); if (lobbySkinFix) { HandleLobbySkinFix(); } if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions")) { HandleRiskOfOptions(); } object obj = <>c.<>9__24_0; if (obj == null) { hook_FindProjectileGhostPrefab val = delegate(orig_FindProjectileGhostPrefab orig, ProjectileController projcontroller) { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: 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) GameObject val22 = orig.Invoke(projcontroller); GameObject prefab = ProjectileCatalog.GetProjectilePrefab(projcontroller.catalogIndex); GameObject owner = projcontroller.owner; object obj30; if (owner == null) { obj30 = null; } else { CharacterBody component3 = owner.GetComponent<CharacterBody>(); obj30 = ((component3 == null) ? null : component3.master?.loadout); } Loadout val23 = (Loadout)obj30; OverlaySkin overlaySkin5 = default(OverlaySkin); ProjectileGhostReplacement? val24 = ((val23 == null || !networkOSkins.TryGetValue(val23, ref overlaySkin5)) ? null : overlaySkin5?.projectiles?.Find((ProjectileGhostReplacement p) => (Object)(object)p.projectilePrefab == (Object)(object)prefab)); return (val24.HasValue && Object.op_Implicit((Object)(object)val24.Value.projectilePrefab)) ? val24.Value.projectileGhostReplacementPrefab : val22; }; <>c.<>9__24_0 = val; obj = (object)val; } ProjectileGhostReplacementManager.FindProjectileGhostPrefab += (hook_FindProjectileGhostPrefab)obj; object obj2 = <>c.<>9__24_1; if (obj2 == null) { Manipulator val2 = delegate(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) ILCursor val20 = new ILCursor(il); if (val20.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdfld(x, typeof(SkinDef).GetField("minionSkinReplacements")) })) { val20.Emit(OpCodes.Ldarg_0); val20.EmitDelegate<Func<MinionSkinReplacement[], MasterSummon, MinionSkinReplacement[]>>((Func<MinionSkinReplacement[], MasterSummon, MinionSkinReplacement[]>)delegate(MinionSkinReplacement[] reps, MasterSummon self) { GameObject summonerBodyObject = self.summonerBodyObject; object obj29; if (summonerBodyObject == null) { obj29 = null; } else { CharacterBody component2 = summonerBodyObject.GetComponent<CharacterBody>(); obj29 = ((component2 == null) ? null : component2.master?.loadout); } Loadout val21 = (Loadout)obj29; OverlaySkin overlaySkin4 = default(OverlaySkin); return (val21 != null && networkOSkins.TryGetValue(val21, ref overlaySkin4) && overlaySkin4.minions != null) ? overlaySkin4.minions.ToArray() : reps; }); } }; <>c.<>9__24_1 = val2; obj2 = (object)val2; } MasterSummon.Perform += (Manipulator)obj2; object obj3 = <>c.<>9__24_2; if (obj3 == null) { hook_Apply val3 = delegate(orig_Apply orig, SkinDef self, GameObject model) { orig.Invoke(self, model); CharacterModel component = model.GetComponent<CharacterModel>(); object obj28; if (component == null) { obj28 = null; } else { CharacterBody body = component.body; obj28 = ((body == null) ? null : body.master?.loadout); } Loadout val19 = (Loadout)obj28; if (val19 == null) { val19 = model.GetComponentInParent<SurvivorMannequinSlotController>()?.currentLoadout; if (val19 != null) { bool flag2 = true; } } OverlaySkin overlaySkin3 = default(OverlaySkin); if (val19 != null && networkOSkins.TryGetValue(val19, ref overlaySkin3) && (Object)(object)overlaySkin3.orig == (Object)(object)self) { RuntimeSkin rSkin = overlaySkin3.rSkin; if (rSkin != null) { rSkin.Apply(model); } overlaySkin3.onApply?.Invoke(model); } }; <>c.<>9__24_2 = val3; obj3 = (object)val3; } SkinDef.Apply += (hook_Apply)obj3; UserProfile.onLoadoutChangedGlobal += delegate(UserProfile u) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_00ca: 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_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Expected O, but got Unknown if (u == localProfile) { BodyIndex bodyIndexFromSurvivorIndex = SurvivorCatalog.GetBodyIndexFromSurvivorIndex(u.survivorPreference.survivorIndex); SkinDef bodySkinDef2 = SkinCatalog.GetBodySkinDef(bodyIndexFromSurvivorIndex, (int)u.loadout.bodyLoadoutManager.GetSkinIndex(bodyIndexFromSurvivorIndex)); if ((oSkin.bodyIndex != bodyIndexFromSurvivorIndex || (Object)(object)oSkin.orig != (Object)(object)bodySkinDef2) && detailRows.Any()) { bodySkinDef2.Bake(); oSkin = new OverlaySkin { orig = bodySkinDef2, bodyIndex = bodyIndexFromSurvivorIndex, minions = bodySkinDef2.minionSkinReplacements.ToList(), projectiles = bodySkinDef2.projectileGhostReplacements.ToList(), seperateMaterials = seperateMaterials.Value, rSkin = new RuntimeSkin { meshReplacementTemplates = ArrayUtils.Clone<MeshReplacementTemplate>(bodySkinDef2.runtimeSkin.meshReplacementTemplates), rendererInfoTemplates = ArrayUtils.Clone<RendererInfoTemplate>(bodySkinDef2.runtimeSkin.rendererInfoTemplates), gameObjectActivationTemplates = ArrayUtils.Clone<GameObjectActivationTemplate>(bodySkinDef2.runtimeSkin.gameObjectActivationTemplates) }, syncInfo = new int[rowCountStore] }; OverlaySkin.GenerateSyncFromSkinRows(ref oSkin.syncInfo, bodySkinDef2, detailRows); } } }; object obj4 = <>c.<>9__24_4; if (obj4 == null) { Manipulator val4 = delegate(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) ILCursor val17 = new ILCursor(il); ILLabel val18 = default(ILLabel); if (val17.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchBrfalse(x, ref val18) })) { val17.Emit(OpCodes.Ldarg_0); val17.Emit(OpCodes.Ldarg_1); val17.EmitDelegate<Func<bool, BodyLoadoutManager, int, bool>>((Func<bool, BodyLoadoutManager, int, bool>)((bool orig, BodyLoadoutManager self, int index) => orig && (!detailCatalog.ContainsKey(self.modifiedBodyLoadouts[index].bodyIndex) || oSkin.bodyIndex != self.modifiedBodyLoadouts[index].bodyIndex))); } }; <>c.<>9__24_4 = val4; obj4 = (object)val4; } BodyLoadoutManager.RemoveBodyLoadoutIfDefault_int += (Manipulator)obj4; LoadoutPanelController.Rebuild += (hook_Rebuild)delegate(orig_Rebuild orig, LoadoutPanelController self) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Invalid comparison between Unknown and I4 //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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_0090: 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_0179: 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_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_0115: 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_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_07ab: Unknown result type (might be due to invalid IL or missing references) //IL_07b3: Unknown result type (might be due to invalid IL or missing references) //IL_07bd: Expected O, but got Unknown //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Expected O, but got Unknown //IL_098b: Unknown result type (might be due to invalid IL or missing references) //IL_0998: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_04db: Unknown result type (might be due to invalid IL or missing references) //IL_04fc: Unknown result type (might be due to invalid IL or missing references) //IL_0506: Expected O, but got Unknown //IL_08ba: Unknown result type (might be due to invalid IL or missing references) //IL_08c7: Unknown result type (might be due to invalid IL or missing references) //IL_0b71: Unknown result type (might be due to invalid IL or missing references) //IL_0b74: Unknown result type (might be due to invalid IL or missing references) //IL_0b7e: Unknown result type (might be due to invalid IL or missing references) //IL_0b88: Expected O, but got Unknown //IL_03fd: Unknown result type (might be due to invalid IL or missing references) //IL_040a: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Expected O, but got Unknown //IL_09c0: Expected O, but got Unknown //IL_0317: Expected O, but got Unknown //IL_0599: Unknown result type (might be due to invalid IL or missing references) //IL_05a6: Unknown result type (might be due to invalid IL or missing references) //IL_0a9d: Unknown result type (might be due to invalid IL or missing references) //IL_0aaa: Unknown result type (might be due to invalid IL or missing references) //IL_0abb: Expected O, but got Unknown //IL_08ef: Expected O, but got Unknown //IL_0e20: Unknown result type (might be due to invalid IL or missing references) //IL_0e2d: Unknown result type (might be due to invalid IL or missing references) //IL_0e37: Expected O, but got Unknown //IL_0d0d: Unknown result type (might be due to invalid IL or missing references) //IL_0d1a: Unknown result type (might be due to invalid IL or missing references) //IL_05ce: Expected O, but got Unknown //IL_06b4: Unknown result type (might be due to invalid IL or missing references) //IL_06c1: Unknown result type (might be due to invalid IL or missing references) //IL_06d2: Expected O, but got Unknown //IL_0d4c: Expected O, but got Unknown //IL_0c4d: Unknown result type (might be due to invalid IL or missing references) //IL_0c5a: Unknown result type (might be due to invalid IL or missing references) //IL_0fbc: Unknown result type (might be due to invalid IL or missing references) //IL_0fc9: Unknown result type (might be due to invalid IL or missing references) //IL_0c8c: Expected O, but got Unknown //IL_0ffb: Expected O, but got Unknown //IL_0efc: Unknown result type (might be due to invalid IL or missing references) //IL_0f09: Unknown result type (might be due to invalid IL or missing references) //IL_0f3b: Expected O, but got Unknown orig.Invoke(self); BodyIndex bodyIndex = self.currentDisplayData.bodyIndex; if ((int)bodyIndex != -1) { localProfile = self.currentDisplayData.userProfile; SurvivorMannequinSlotController diorama = GameObject.Find("SurvivorMannequinDiorama").GetComponent<SurvivorMannequinDioramaController>().mannequinSlots[0]; SkinDef defaultSkin = SkinCatalog.GetBodySkinDef(bodyIndex, 0); SkinDef bodySkinDef = SkinCatalog.GetBodySkinDef(bodyIndex, (int)self.currentDisplayData.userProfile.loadout.bodyLoadoutManager.GetSkinIndex(bodyIndex)); int num3 = 0; bool flag = false; if (oSkin.bodyIndex != bodyIndex || (Object)(object)oSkin.orig != (Object)(object)bodySkinDef) { flag = true; if (bodySkinDef != null) { bodySkinDef.Bake(); } oSkin = new OverlaySkin { orig = bodySkinDef, bodyIndex = self.currentDisplayData.bodyIndex, seperateMaterials = seperateMaterials.Value, minions = bodySkinDef.minionSkinReplacements.ToList(), projectiles = bodySkinDef.projectileGhostReplacements.ToList(), rSkin = new RuntimeSkin { meshReplacementTemplates = ArrayUtils.Clone<MeshReplacementTemplate>(bodySkinDef.runtimeSkin.meshReplacementTemplates), rendererInfoTemplates = ArrayUtils.Clone<RendererInfoTemplate>(bodySkinDef.runtimeSkin.rendererInfoTemplates), gameObjectActivationTemplates = ArrayUtils.Clone<GameObjectActivationTemplate>(bodySkinDef.runtimeSkin.gameObjectActivationTemplates) } }; } detailRows.Clear(); if (detailCatalog.TryGetValue(bodyIndex, out var value)) { if (seperateMaterials.Value) { foreach (KeyValuePair<Renderer, List<CharacterDetail<MeshReplacement>>> meshT in value.meshTs) { List<CharacterDetail<MeshReplacement>> value2 = meshT.Value; Row row5 = new Row(self, bodyIndex, ((Object)value2.First().detail.renderer).name + " Mesh"); int catVal5 = num3; row5.findCurrentChoice = delegate { int num6 = oSkin.FindIndex(catVal5); return (num6 >= 0) ? num6 : (row5.buttons.Count - 1); }; string text = string.Empty; foreach (CharacterDetail<MeshReplacement> repl4 in value2) { if (!Object.op_Implicit((Object)(object)repl4.detail.mesh)) { text = text + Language.GetString(repl4.sourceSkin.nameToken) + "\n"; } else { SkinDef sourceSkin = repl4.sourceSkin; Row obj8 = row5; Sprite obj9 = sourceSkin.icon; string nameToken = sourceSkin.nameToken; string nameToken2 = sourceSkin.nameToken; Color primaryColor = row5.primaryColor; UnityAction val9 = delegate { oSkin.syncInfo[catVal5] = repl4.index; oSkin.BuildRSkin(oSkin.syncInfo); row5.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }; UnlockableDef unlockableDef = sourceSkin.unlockableDef; obj8.AddButton(self, obj9, nameToken, nameToken2, primaryColor, val9, ((unlockableDef != null) ? unlockableDef.cachedName : null) ?? "", (Node)null, false); } } if (value.actT.ContainsKey(((Component)meshT.Key).gameObject)) { foreach (CharacterDetail<bool> item in value.actT[((Component)meshT.Key).gameObject]) { if (!item.detail) { text = text + Language.GetString(item.sourceSkin.nameToken) + "\n"; } } } if (text != string.Empty) { row5.AddButton(self, icon, "Disabled", text, row5.primaryColor, (UnityAction)delegate { oSkin.syncInfo[catVal5] = -2; oSkin.BuildRSkin(oSkin.syncInfo); row5.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }, "", (Node)null, false); } if (row5.buttons.Count > 1) { row5.FinishSetup(false); self.rows.Add(row5); detailRows.Add(row5); num3++; } else { row5.Dispose(); } } foreach (KeyValuePair<Renderer, List<CharacterDetail<RendererInfo>>> infoT in value.infoTs) { List<CharacterDetail<RendererInfo>> value3 = infoT.Value; Row row4 = new Row(self, bodyIndex, ((Object)value3.First().detail.renderer).name + " Material"); int catVal4 = num3; row4.findCurrentChoice = delegate { int num5 = oSkin.FindIndex(catVal4); return (num5 >= 0) ? num5 : (row4.buttons.Count - 1); }; string text2 = string.Empty; foreach (CharacterDetail<RendererInfo> repl3 in value3) { SkinDef sourceSkin2 = repl3.sourceSkin; Row obj10 = row4; Sprite obj11 = sourceSkin2.icon; string nameToken3 = sourceSkin2.nameToken; string nameToken4 = sourceSkin2.nameToken; Color primaryColor2 = row4.primaryColor; UnityAction val10 = delegate { oSkin.syncInfo[catVal4] = repl3.index; oSkin.BuildRSkin(oSkin.syncInfo); row4.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }; UnlockableDef unlockableDef2 = sourceSkin2.unlockableDef; obj10.AddButton(self, obj11, nameToken3, nameToken4, primaryColor2, val10, ((unlockableDef2 != null) ? unlockableDef2.cachedName : null) ?? "", (Node)null, false); } if (value.actT.ContainsKey(((Component)infoT.Key).gameObject)) { foreach (CharacterDetail<bool> item2 in value.actT[((Component)infoT.Key).gameObject]) { if (!item2.detail) { text2 = text2 + Language.GetString(item2.sourceSkin.nameToken) + "\n"; } } } if (text2 != string.Empty) { row4.AddButton(self, icon, "Disabled", text2, row4.primaryColor, (UnityAction)delegate { oSkin.syncInfo[catVal4] = -2; oSkin.BuildRSkin(oSkin.syncInfo); row4.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }, "", (Node)null, false); } if (row4.buttons.Count > 1) { row4.FinishSetup(false); self.rows.Add(row4); detailRows.Add(row4); num3++; } else { row4.Dispose(); } } } else { foreach (Renderer item3 in value.meshTs.Keys.Concat(value.infoTs.Keys).Distinct()) { Row row3 = new Row(self, bodyIndex, ((Object)item3).name); int catVal3 = num3; row3.findCurrentChoice = delegate { int num4 = oSkin.FindIndex(catVal3); return (num4 >= 0) ? num4 : (row3.buttons.Count - 1); }; string text3 = string.Empty; if (value.meshTs.ContainsKey(item3)) { foreach (CharacterDetail<MeshReplacement> repl2 in value.meshTs[item3]) { if (!Object.op_Implicit((Object)(object)repl2.detail.mesh)) { text3 = text3 + Language.GetString(repl2.sourceSkin.nameToken) + "\n"; } else { SkinDef sourceSkin3 = repl2.sourceSkin; Row obj12 = row3; Sprite obj13 = sourceSkin3.icon; string nameToken5 = sourceSkin3.nameToken; string nameToken6 = sourceSkin3.nameToken; Color primaryColor3 = row3.primaryColor; UnityAction val11 = delegate { oSkin.syncInfo[catVal3] = repl2.index; oSkin.BuildRSkin(oSkin.syncInfo); row3.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }; UnlockableDef unlockableDef3 = sourceSkin3.unlockableDef; obj12.AddButton(self, obj13, nameToken5, nameToken6, primaryColor3, val11, ((unlockableDef3 != null) ? unlockableDef3.cachedName : null) ?? "", (Node)null, false); } } } else { foreach (CharacterDetail<RendererInfo> repl in value.infoTs[item3]) { SkinDef sourceSkin4 = repl.sourceSkin; Row obj14 = row3; Sprite obj15 = sourceSkin4.icon; string nameToken7 = sourceSkin4.nameToken; string nameToken8 = sourceSkin4.nameToken; Color primaryColor4 = row3.primaryColor; UnityAction val12 = delegate { oSkin.syncInfo[catVal3] = repl.index; oSkin.BuildRSkin(oSkin.syncInfo); row3.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }; UnlockableDef unlockableDef4 = sourceSkin4.unlockableDef; obj14.AddButton(self, obj15, nameToken7, nameToken8, primaryColor4, val12, ((unlockableDef4 != null) ? unlockableDef4.cachedName : null) ?? "", (Node)null, false); } } if (value.actT.ContainsKey(((Component)item3).gameObject)) { foreach (CharacterDetail<bool> item4 in value.actT[((Component)item3).gameObject]) { if (!item4.detail) { text3 = text3 + Language.GetString(item4.sourceSkin.nameToken) + "\n"; } } } if (text3 != string.Empty) { row3.AddButton(self, icon, "Disabled", text3, row3.primaryColor, (UnityAction)delegate { oSkin.syncInfo[catVal3] = -2; oSkin.BuildRSkin(oSkin.syncInfo); row3.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }, "", (Node)null, false); } if (row3.buttons.Count > 1) { row3.FinishSetup(false); self.rows.Add(row3); detailRows.Add(row3); num3++; } else { row3.Dispose(); } } } foreach (KeyValuePair<BodyIndex, List<CharacterDetail<MinionSkinReplacement>>> minionSkin in value.minionSkins) { Row row2 = new Row(self, bodyIndex, BodyCatalog.GetBodyName(minionSkin.Key)); int catVal2 = num3; row2.findCurrentChoice = (Loadout l) => Math.Max(0, oSkin.FindIndex(catVal2)); if (!minionSkin.Value.Any((CharacterDetail<MinionSkinReplacement> r) => (Object)(object)r.sourceSkin == (Object)(object)defaultSkin)) { Row obj16 = row2; Sprite obj17 = defaultSkin?.icon; string obj18 = defaultSkin?.nameToken; string obj19 = defaultSkin?.nameToken; Color primaryColor5 = row2.primaryColor; UnityAction val13 = delegate { oSkin.syncInfo[catVal2] = -2; oSkin.BuildRSkin(oSkin.syncInfo); row2.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }; UnlockableDef unlockableDef5 = defaultSkin.unlockableDef; obj16.AddButton(self, obj17, obj18, obj19, primaryColor5, val13, ((unlockableDef5 != null) ? unlockableDef5.cachedName : null) ?? "", (Node)null, false); } foreach (CharacterDetail<MinionSkinReplacement> miniS in minionSkin.Value) { Row obj20 = row2; Sprite obj21 = miniS.sourceSkin.icon; string nameToken9 = miniS.sourceSkin.nameToken; string nameToken10 = miniS.sourceSkin.nameToken; Color primaryColor6 = row2.primaryColor; UnityAction val14 = delegate { oSkin.syncInfo[catVal2] = miniS.index; oSkin.BuildRSkin(oSkin.syncInfo); row2.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }; UnlockableDef unlockableDef6 = miniS.sourceSkin.unlockableDef; obj20.AddButton(self, obj21, nameToken9, nameToken10, primaryColor6, val14, ((unlockableDef6 != null) ? unlockableDef6.cachedName : null) ?? "", (Node)null, false); } if (row2.buttons.Count > 1) { row2.FinishSetup(false); self.rows.Add(row2); detailRows.Add(row2); num3++; } else { row2.Dispose(); } } foreach (KeyValuePair<GameObject, List<CharacterDetail<ProjectileGhostReplacement>>> projectile in value.projectiles) { Row row = new Row(self, bodyIndex, ((Object)projectile.Key).name); int catVal = num3; row.findCurrentChoice = (Loadout l) => Math.Max(0, oSkin.FindIndex(catVal)); if (!projectile.Value.Any((CharacterDetail<ProjectileGhostReplacement> r) => (Object)(object)r.sourceSkin == (Object)(object)defaultSkin)) { Row obj22 = row; Sprite obj23 = defaultSkin?.icon; string obj24 = defaultSkin?.nameToken; string obj25 = defaultSkin?.nameToken; Color primaryColor7 = row.primaryColor; UnityAction val15 = delegate { oSkin.syncInfo[catVal] = -2; oSkin.BuildRSkin(oSkin.syncInfo); row.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }; UnlockableDef unlockableDef7 = defaultSkin.unlockableDef; obj22.AddButton(self, obj23, obj24, obj25, primaryColor7, val15, ((unlockableDef7 != null) ? unlockableDef7.cachedName : null) ?? "", (Node)null, false); } foreach (CharacterDetail<ProjectileGhostReplacement> ghost in projectile.Value) { Row obj26 = row; Sprite obj27 = ghost.sourceSkin.icon; string nameToken11 = ghost.sourceSkin.nameToken; string nameToken12 = ghost.sourceSkin.nameToken; Color primaryColor8 = row.primaryColor; UnityAction val16 = delegate { oSkin.syncInfo[catVal] = ghost.index; oSkin.BuildRSkin(oSkin.syncInfo); row.UpdateHighlightedChoice(); diorama.loadoutDirty = true; }; UnlockableDef unlockableDef8 = ghost.sourceSkin.unlockableDef; obj26.AddButton(self, obj27, nameToken11, nameToken12, primaryColor8, val16, ((unlockableDef8 != null) ? unlockableDef8.cachedName : null) ?? "", (Node)null, false); } if (row.buttons.Count > 1) { row.FinishSetup(false); self.rows.Add(row); detailRows.Add(row); num3++; } else { row.Dispose(); } } rowCountStore = num3; if (flag) { OverlaySkin overlaySkin2 = oSkin; if (overlaySkin2.syncInfo == null) { overlaySkin2.syncInfo = new int[num3]; } OverlaySkin.GenerateSyncFromSkinRows(ref oSkin.syncInfo, bodySkinDef, detailRows); oSkin.BuildRSkin(oSkin.syncInfo); } diorama.loadoutDirty = true; ArrayUtils.EnsureCapacity<int>(ref oSkin.syncInfo, num3); bool saveRequestPending = localProfile.saveRequestPending; localProfile.OnLoadoutChanged(); localProfile.saveRequestPending = saveRequestPending; } } }; object obj5 = <>c.<>9__24_6; if (obj5 == null) { hook_Serialize val5 = delegate(orig_Serialize orig, Loadout self, NetworkWriter writer) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected I4, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, writer); OverlaySkin orCreateValue2 = networkOSkins.GetOrCreateValue(self); if (orCreateValue2 == null || (Object)(object)orCreateValue2.orig == (Object)null || !detailCatalog.ContainsKey(orCreateValue2.bodyIndex) || orCreateValue2.syncInfo.Length == 0) { writer.Write(-1); } else { writer.Write((int)orCreateValue2.orig.skinIndex); NetworkExtensions.WriteBodyIndex(writer, orCreateValue2.bodyIndex); writer.Write(orCreateValue2.seperateMaterials); writer.Write(orCreateValue2.syncInfo.Length); int[] syncInfo = orCreateValue2.syncInfo; foreach (int num2 in syncInfo) { writer.Write(num2); } } }; <>c.<>9__24_6 = val5; obj5 = (object)val5; } Loadout.Serialize += (hook_Serialize)obj5; object obj6 = <>c.<>9__24_7; if (obj6 == null) { hook_Deserialize val6 = delegate(orig_Deserialize orig, Loadout self, NetworkReader reader) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Invalid comparison between Unknown and I4 //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, reader); SkinIndex val8 = (SkinIndex)reader.ReadInt32(); if ((int)val8 != -1) { OverlaySkin orCreateValue = networkOSkins.GetOrCreateValue(self); orCreateValue.orig = SkinCatalog.GetSkinDef(val8); orCreateValue.bodyIndex = NetworkExtensions.ReadBodyIndex(reader); orCreateValue.seperateMaterials = reader.ReadBoolean(); int num = reader.ReadInt32(); orCreateValue.syncInfo = new int[num]; for (int i = 0; i < num; i++) { orCreateValue.syncInfo[i] = reader.ReadInt32(); } orCreateValue.minions = new List<MinionSkinReplacement>(); orCreateValue.projectiles = new List<ProjectileGhostReplacement>(); if (detailCatalog.ContainsKey(orCreateValue.bodyIndex)) { orCreateValue.BuildRSkin(orCreateValue.syncInfo); } } }; <>c.<>9__24_7 = val6; obj6 = (object)val6; } Loadout.Deserialize += (hook_Deserialize)obj6; object obj7 = <>c.<>9__24_8; if (obj7 == null) { hook_Copy val7 = delegate(orig_Copy orig, Loadout self, Loadout target) { orig.Invoke(self, target); OverlaySkin overlaySkin = default(OverlaySkin); if (networkOSkins.TryGetValue(self, ref overlaySkin)) { networkOSkins.Remove(target); networkOSkins.Add(target, overlaySkin); } }; <>c.<>9__24_8 = val7; obj7 = (object)val7; } Loadout.Copy += (hook_Copy)obj7; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] [CompilerGenerated] internal static bool <HandleRavager>g__SmhWhyIsThisRequired|22_1(Component controller) { return Object.op_Implicit((Object)(object)((RedGuyController)(((controller is RedGuyController) ? controller : null)?)).cachedSkinDef); } } }