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 LongTailAcrid v1.0.2
LongTailAcrid.dll
Decompiled 10 months 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 BepInEx; using BepInEx.Logging; using EnigmaticThunder.Util; using MonoMod.RuntimeDetour; using R2API.Utils; using RoR2; using RuneFoxMods; using UnityEngine; using UnityEngine.Rendering; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: R2API.Utils.ManualNetworkRegistration] [assembly: EnigmaticThunder.Util.ManualNetworkRegistration] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace RuneFoxMods { internal class Utils { public static void PrintBodyCatalog() { Debug.Log((object)"\nBodyCatalog"); foreach (GameObject allBodyPrefab in BodyCatalog.allBodyPrefabs) { Debug.Log((object)((Object)allBodyPrefab).name); } Debug.Log((object)"\n"); } public static void ReadChildren(GameObject parent, int tabs, bool includecomponents = true) { //IL_0097: Unknown result type (might be due to invalid IL or missing references) string text = ""; for (int i = 0; i < tabs; i++) { text += " "; } for (int j = 0; j < parent.transform.childCount; j++) { Transform child = parent.transform.GetChild(j); if ((Object)(object)child == (Object)null) { break; } string text2 = ((Component)child).gameObject.activeInHierarchy.ToString(); Debug.Log((object)(text + ((Object)child).name + " " + text2 + " " + ((Component)child).transform.position)); if (includecomponents) { ReadComponents(((Component)child).gameObject, tabs + 1); Debug.Log((object)""); } ReadChildren(((Component)child).gameObject, tabs + 1, includecomponents); } } public static void readheiarchy(GameObject parent, bool includeComponents = true) { Debug.Log((object)((Object)parent).name); if (includeComponents) { ReadComponents(parent, 1); Debug.Log((object)""); } ReadChildren(parent, 1, includeComponents); } public static void ReadComponents(GameObject obj, int tabs) { string text = ""; for (int i = 0; i < tabs; i++) { text += " "; } Component[] components = obj.GetComponents(typeof(Component)); Component[] array = components; foreach (Component val in array) { string text2 = ""; Debug.Log((object)(text + "Comp: " + ((object)val).GetType().ToString() + " " + text2)); } } public static void PrintAllPaths(GameObject parent) { Debug.Log((object)((Object)parent).name); PrintAllPathsInner(parent, ((Object)parent).name); } private static void PrintAllPathsInner(GameObject parent, string parent_string) { int childCount = parent.transform.childCount; for (int i = 0; i < childCount; i++) { Transform child = parent.transform.GetChild(i); if (((Object)child).name.EndsWith("_end")) { break; } string text = parent_string + "/" + ((Object)child).name; Debug.Log((object)(" " + ((Object)child).name + "\t\t" + text)); PrintAllPathsInner(((Component)child).gameObject, text); } } public static void PrintDynamicBone(DynamicBone DB) { //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)("Root: " + DB.m_Root)); Debug.Log((object)("Damping: " + DB.m_Damping)); Debug.Log((object)("Damping Dist: " + DB.m_DampingDistrib)); Debug.Log((object)("Elasticity: " + DB.m_Elasticity)); Debug.Log((object)("Elasticity Dist: " + DB.m_ElasticityDistrib)); Debug.Log((object)("Stiffness: " + DB.m_Stiffness)); Debug.Log((object)("Stiffness Dist: " + DB.m_StiffnessDistrib)); Debug.Log((object)("Inert: " + DB.m_Inert)); Debug.Log((object)("Inert Dist: " + DB.m_InertDistrib)); Debug.Log((object)("Radius: " + DB.m_Radius)); Debug.Log((object)("Radius Dist: " + DB.m_RadiusDistrib)); Debug.Log((object)("End Length: " + DB.m_EndLength)); Debug.Log((object)("End Offset: " + DB.m_EndOffset)); Debug.Log((object)("Gravity: " + DB.m_Gravity)); Debug.Log((object)("Force: " + DB.m_Force)); Debug.Log((object)("FreezeAxis: " + DB.m_FreezeAxis)); Debug.Log((object)("Colliders: " + DB.m_Colliders.Count)); foreach (DynamicBoneCollider collider in DB.m_Colliders) { Debug.Log((object)("\t Parent: " + ((Object)((Component)collider).transform).name)); Debug.Log((object)("\t Direction: " + collider.m_Direction)); Debug.Log((object)("\t Center " + collider.m_Center)); Debug.Log((object)("\t Bound " + collider.m_Bound)); Debug.Log((object)("\t Radius " + collider.m_Radius)); Debug.Log((object)("\t Height " + collider.m_Height)); } Debug.Log((object)("Exclusions: " + DB.m_Exclusions.Count)); foreach (Transform exclusion in DB.m_Exclusions) { Debug.Log((object)("\t Transform: " + ((Object)exclusion).name)); } } public static ChildLocator GetChildLocator(GameObject body) { ChildLocator val = null; Transform child = body.transform.GetChild(0); if (Object.op_Implicit((Object)(object)child)) { Transform child2 = child.GetChild(0); if (Object.op_Implicit((Object)(object)child2)) { val = ((Component)child2).GetComponent<ChildLocator>(); if (Object.op_Implicit((Object)(object)val)) { Debug.Log((object)"Locator Found"); } } } return val; } public static Transform FindChildInTree(Transform Root, string name) { Queue<Transform> queue = new Queue<Transform>(); queue.Enqueue(Root); while (queue.Count != 0) { Transform val = queue.Dequeue(); if (((Object)val).name == name) { return val; } for (int i = 0; i < val.childCount; i++) { Transform child = val.GetChild(i); queue.Enqueue(child); } } return null; } public static string RemoveCloneNaming(string str) { return str.Remove(str.Length - 7); } } } namespace EnigmaticThunder.Util { [AttributeUsage(AttributeTargets.Assembly)] public class ManualNetworkRegistrationAttribute : Attribute { } } namespace R2API.Utils { [AttributeUsage(AttributeTargets.Assembly)] public class ManualNetworkRegistrationAttribute : Attribute { } } namespace LongTailAcrid { [BepInPlugin("com.TailLover.LongTailAcrid", "LongTailAcrid", "1.0.1")] public class LongTailAcridPlugin : BaseUnityPlugin { private class Modification { public string prefabpath; public string bodyname; public string parentname; public GameObject prefab; public bool affectsbasemodel; public DynamicBoneData dynamicBoneData; public int boneIndex; public int boneCount; public GameObject instance; public GameObject inst_armature; public DynamicBone inst_dynamicBone; public List<DynamicBoneCollider> inst_DB_colliders = new List<DynamicBoneCollider>(); public Modification(string PrefabPath, string ParentName, string BodyName, bool AffectsBaseModel, AssetBundle assetBundle) { bodyname = BodyName; prefabpath = PrefabPath; parentname = ParentName; affectsbasemodel = AffectsBaseModel; prefab = assetBundle.LoadAsset<GameObject>(prefabpath); if ((Object)(object)prefab == (Object)null) { Debug.Log((object)("Asset at " + PrefabPath + " was not loaded")); } } } private class AppliedModifications { public Stack<Modification> BaseModelModifications = new Stack<Modification>(); public List<Modification> OtherModifications = new List<Modification>(); } private class DynamicBoneData { public string m_Root; public float m_Damping; public AnimationCurve m_DampingDistrib; public float m_Elasticity; public AnimationCurve m_ElasticityDistrib; public float m_Stiffness; public AnimationCurve m_StiffnessDistrib; public float m_Inert; public AnimationCurve m_InertDistrib; public float m_Radius; public AnimationCurve m_RadiusDistrib; public float m_EndLength; public Vector3 m_EndOffset; public Vector3 m_Gravity; public Vector3 m_Force; public List<DynamicBoneColliderData> m_Colliders; public List<string> m_Exclusions; public FreezeAxis m_FreezeAxis; public DynamicBoneData(string root, float damping, AnimationCurve damping_dist, float elasticity, AnimationCurve elasticity_dist, float stiffness, AnimationCurve stiffness_dist, float inert, AnimationCurve inert_dist, float radius, AnimationCurve radius_dist, float end_length, Vector3 end_offset, Vector3 gravity, Vector3 force, List<DynamicBoneColliderData> colliders, List<string> exclusions, FreezeAxis freeze_axis) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0070: 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_0078: 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_0090: Unknown result type (might be due to invalid IL or missing references) m_Root = root; m_Damping = damping; m_DampingDistrib = damping_dist; m_Elasticity = elasticity; m_ElasticityDistrib = elasticity_dist; m_Stiffness = stiffness; m_StiffnessDistrib = stiffness_dist; m_Inert = inert; m_InertDistrib = inert_dist; m_Radius = radius; m_RadiusDistrib = radius_dist; m_EndLength = end_length; m_EndOffset = end_offset; m_Gravity = gravity; m_Force = force; m_Colliders = colliders; m_Exclusions = exclusions; m_FreezeAxis = freeze_axis; } } private class DynamicBoneColliderData { public string m_parent_name; public Direction m_Direction; public Vector3 m_Center; public Bound m_Bound; public float m_Radius; public float m_Height; public DynamicBoneColliderData(string parent_name, Direction direction, Vector3 Center, Bound bound, float radius, float heaight) { //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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) m_parent_name = parent_name; m_Direction = direction; m_Center = Center; m_Bound = bound; m_Radius = radius; m_Height = heaight; } } private static AssetBundle assetBundle; private Modification AcridTail; private static GameObject LastModelObject; private static List<Modification> ModificationList = new List<Modification>(); private static Dictionary<GameObject, AppliedModifications> ModifiedObjects = new Dictionary<GameObject, AppliedModifications>(); internal static LongTailAcridPlugin Instance { get; private set; } internal static ManualLogSource InstanceLogger { get; private set; } public static SkinDef SkinDef { get; private set; } private void Awake() { //IL_0070: Unknown result type (might be due to invalid IL or missing references) Instance = this; BeforeAwake(); using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("LongTailAcrid.tailloverlongtailacrid")) { assetBundle = AssetBundle.LoadFromStream(stream); } ((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit); new Hook((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings)).Apply(); ReplaceShaders(); AfterAwake(); } private void BeforeAwake() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) Instance = this; new Hook((MethodBase)typeof(SkinDef).GetMethod("Apply"), (Delegate)new Action<Action<SkinDef, GameObject>, SkinDef, GameObject>(SkinDefApply)).Apply(); } private void AfterAwake() { //IL_005e: 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_0086: Unknown result type (might be due to invalid IL or missing references) AcridTail = new Modification("Tail_1.prefab", "hip", "CrocoBody", AffectsBaseModel: true, assetBundle); AcridTail.dynamicBoneData = new DynamicBoneData("Tail_1", 0.2f, null, 0.05f, null, 0.7f, null, 0.5f, null, 0.15f, null, 0f, new Vector3(0f, 0f, 0f), new Vector3(0f, -0.002f, 0f), new Vector3(0f, -0.005f, 0f), new List<DynamicBoneColliderData>(), new List<string>(), (FreezeAxis)0); ModificationList.Add(AcridTail); } private static void ReplaceShaders() { } private static Material LoadMaterialWithReplacedShader(string materialPath, string shaderName) { Material val = assetBundle.LoadAsset<Material>(materialPath); val.shader = Shader.Find(shaderName); return val; } private static void LanguageLoadStrings(Action<Language> orig, Language self) { orig(self); string text = self.name.ToLower(); if (text == "en") { self.SetStringByToken("TAILLOVER_SKIN_LONGTAILACRIDSKIN_NAME", "LongTail"); } else { self.SetStringByToken("TAILLOVER_SKIN_LONGTAILACRIDSKIN_NAME", "LongTail"); } } private static void Nothing(Action<SkinDef> orig, SkinDef self) { } private static void BodyCatalogInit() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown Hook val = new Hook((MethodBase)typeof(SkinDef).GetMethod("Awake", BindingFlags.Instance | BindingFlags.NonPublic), (Delegate)new Action<Action<SkinDef>, SkinDef>(Nothing)); val.Apply(); AddCrocoBodyLongTailAcridSkinSkin(); val.Undo(); } private static void CrocoBodyLongTailAcridSkinSkinAdded(SkinDef skinDef, GameObject bodyPrefab) { SkinDef = skinDef; } private static void AddCrocoBodyLongTailAcridSkinSkin() { //IL_00bc: 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_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) string text = "CrocoBody"; string text2 = "LongTailAcridSkin"; try { GameObject val = BodyCatalog.FindBodyPrefab(text); ModelLocator component = val.GetComponent<ModelLocator>(); GameObject gameObject = ((Component)component.modelTransform).gameObject; ModelSkinController component2 = gameObject.GetComponent<ModelSkinController>(); Renderer[] componentsInChildren = gameObject.GetComponentsInChildren<Renderer>(true); SkinDef val2 = ScriptableObject.CreateInstance<SkinDef>(); val2.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\LongTailAcrid\\Icons\\LongTailAcridSkinIcon.png"); ((Object)val2).name = text2; val2.nameToken = "TAILLOVER_SKIN_LONGTAILACRIDSKIN_NAME"; val2.rootObject = gameObject; val2.baseSkins = (SkinDef[])(object)new SkinDef[1] { component2.skins[0] }; val2.unlockableDef = null; val2.gameObjectActivations = Array.Empty<GameObjectActivation>(); val2.rendererInfos = Array.Empty<RendererInfo>(); val2.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[2] { new MeshReplacement { mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\LongTailAcrid\\Meshes\\CrocoMesh.001.mesh"), renderer = componentsInChildren.First((Renderer r) => ((Object)r).name == "CrocoMesh") }, new MeshReplacement { mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\LongTailAcrid\\Meshes\\CrocoSpineMesh.mesh"), renderer = componentsInChildren[3] } }; val2.minionSkinReplacements = Array.Empty<MinionSkinReplacement>(); val2.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>(); Array.Resize(ref component2.skins, component2.skins.Length + 1); component2.skins[component2.skins.Length - 1] = val2; BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = component2.skins; CrocoBodyLongTailAcridSkinSkinAdded(val2, val); } catch (Exception ex) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\"")); InstanceLogger.LogError((object)ex); } } private static void SkinDefApply(Action<SkinDef, GameObject> orig, SkinDef self, GameObject modelObject) { orig(self, modelObject); RemoveInvalidModelObjects(); ModifiedObjects.TryGetValue(modelObject, out var value); try { if ((Object)(object)self != (Object)(object)SkinDef) { if (value != null) { ClearSkinModifications(LastModelObject, value); } } else if (value == null) { AppliedModifications appliedModifications = new AppliedModifications(); ModifiedObjects.Add(modelObject, appliedModifications); ApplySkinModifications(modelObject, appliedModifications); } } catch (Exception ex) { InstanceLogger.LogWarning((object)"An error occured while adding accessories to a skin"); InstanceLogger.LogError((object)ex); } } private static void RemoveInvalidModelObjects() { foreach (GameObject item in ModifiedObjects.Keys.Where((GameObject el) => !Object.op_Implicit((Object)(object)el)).ToList()) { ModifiedObjects.Remove(item); } } private static void ClearSkinModifications(GameObject modelObject, AppliedModifications modifications) { while (modifications.BaseModelModifications.Count != 0) { Modification modification = modifications.BaseModelModifications.Pop(); clearModification(modification, modelObject, modifications); } while (modifications.OtherModifications.Count != 0) { clearModification(modifications.OtherModifications[0], modelObject, modifications); } ModifiedObjects.Remove(modelObject); } private static void ApplySkinModifications(GameObject modelObject, AppliedModifications modifications) { CharacterModel component = modelObject.GetComponent<CharacterModel>(); LastModelObject = modelObject; foreach (Modification modification in ModificationList) { ApplyModification(modelObject, component, modification, modifications); } } private static void ApplyModification(GameObject modelObject, CharacterModel characterModel, Modification modification, AppliedModifications modifications) { //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_030c: 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_031e: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_0330: Unknown result type (might be due to invalid IL or missing references) //IL_0335: Unknown result type (might be due to invalid IL or missing references) //IL_03c6: Unknown result type (might be due to invalid IL or missing references) //IL_03cb: Unknown result type (might be due to invalid IL or missing references) //IL_042a: Unknown result type (might be due to invalid IL or missing references) //IL_044c: Unknown result type (might be due to invalid IL or missing references) //IL_045f: Unknown result type (might be due to invalid IL or missing references) //IL_0461: Unknown result type (might be due to invalid IL or missing references) string bodyname = modification.bodyname; string parentname = modification.parentname; Transform val = Utils.FindChildInTree(modelObject.transform, parentname); GameObject val2; if (modification.affectsbasemodel) { val2 = Object.Instantiate<GameObject>(modification.prefab, val, false); ((Object)val2).name = Utils.RemoveCloneNaming(((Object)val2).name); modification.instance = val2; modification.inst_armature = val2; SkinnedMeshRenderer[] baseSkinRenderers = GetBaseSkinRenderers(modelObject); List<Transform> list = baseSkinRenderers[0].bones.ToList(); int num = FindBoneIndex2(val, list); Transform[] array = BoneArrayBuilder(modification.instance.transform); list.InsertRange(num, array); modification.boneIndex = num; modification.boneCount = array.Length; SkinnedMeshRenderer[] array2 = baseSkinRenderers; foreach (SkinnedMeshRenderer val3 in array2) { val3.bones = list.ToArray(); } modifications.BaseModelModifications.Push(modification); } else { val2 = Object.Instantiate<GameObject>(modification.prefab, modelObject.transform, false); ((Object)val2).name = Utils.RemoveCloneNaming(((Object)val2).name); modification.instance = val2; Transform armature = GetArmature(val2); ((Component)armature).transform.SetParent(val, false); modification.inst_armature = ((Component)armature).gameObject; } modification.instance = val2; DynamicBone val4 = (modification.inst_dynamicBone = modification.instance.AddComponent<DynamicBone>()); List<DynamicBoneCollider> list2 = new List<DynamicBoneCollider>(); foreach (DynamicBoneColliderData collider in modification.dynamicBoneData.m_Colliders) { Transform val5 = Utils.FindChildInTree(modelObject.transform, collider.m_parent_name); DynamicBoneCollider val6 = ((Component)val5).gameObject.AddComponent<DynamicBoneCollider>(); val6.m_Direction = collider.m_Direction; val6.m_Center = collider.m_Center; val6.m_Bound = collider.m_Bound; val6.m_Radius = collider.m_Radius; val6.m_Height = collider.m_Height; list2.Add(val6); } modification.inst_DB_colliders = list2; Transform root = (val4.m_Root = Utils.FindChildInTree(modification.inst_armature.transform, modification.dynamicBoneData.m_Root)); val4.m_Damping = modification.dynamicBoneData.m_Damping; val4.m_DampingDistrib = modification.dynamicBoneData.m_DampingDistrib; val4.m_Elasticity = modification.dynamicBoneData.m_Elasticity; val4.m_ElasticityDistrib = modification.dynamicBoneData.m_ElasticityDistrib; val4.m_Stiffness = modification.dynamicBoneData.m_Stiffness; val4.m_StiffnessDistrib = modification.dynamicBoneData.m_StiffnessDistrib; val4.m_Inert = modification.dynamicBoneData.m_Inert; val4.m_InertDistrib = modification.dynamicBoneData.m_InertDistrib; val4.m_Radius = modification.dynamicBoneData.m_Radius; val4.m_RadiusDistrib = modification.dynamicBoneData.m_RadiusDistrib; val4.m_EndLength = modification.dynamicBoneData.m_EndLength; val4.m_EndOffset = modification.dynamicBoneData.m_EndOffset; val4.m_Gravity = modification.dynamicBoneData.m_Gravity; val4.m_Force = modification.dynamicBoneData.m_Force; val4.m_Colliders = list2; val4.m_Exclusions = new List<Transform>(); foreach (string exclusion in modification.dynamicBoneData.m_Exclusions) { Transform val7 = Utils.FindChildInTree(root, exclusion); if ((Object)(object)val7 != (Object)null) { val4.m_Exclusions.Add(val7); } else { Debug.Log((object)"Tried to exclude a transform that could not be found"); } } val4.m_FreezeAxis = modification.dynamicBoneData.m_FreezeAxis; SkinnedMeshRenderer[] componentsInChildren = val2.GetComponentsInChildren<SkinnedMeshRenderer>(true); Array.Resize(ref characterModel.baseRendererInfos, characterModel.baseRendererInfos.Length + componentsInChildren.Length); if (componentsInChildren.Length != 0) { int num2 = componentsInChildren.Length; SkinnedMeshRenderer[] array3 = componentsInChildren; foreach (SkinnedMeshRenderer val8 in array3) { characterModel.baseRendererInfos[characterModel.baseRendererInfos.Length - num2] = new RendererInfo { renderer = (Renderer)(object)componentsInChildren[^num2], ignoreOverlays = false, defaultShadowCastingMode = (ShadowCastingMode)1, defaultMaterial = ((Renderer)val8).sharedMaterial }; num2--; } } modifications.OtherModifications.Add(modification); } private static void clearModification(Modification modification, GameObject modelObject, AppliedModifications modifications) { foreach (DynamicBoneCollider inst_DB_collider in modification.inst_DB_colliders) { Object.Destroy((Object)(object)inst_DB_collider); } if (modification.affectsbasemodel) { SkinnedMeshRenderer[] baseSkinRenderers = GetBaseSkinRenderers(modelObject); List<Transform> list = baseSkinRenderers[0].bones.ToList(); list.RemoveRange(modification.boneIndex, modification.boneCount); SkinnedMeshRenderer[] array = baseSkinRenderers; foreach (SkinnedMeshRenderer val in array) { val.bones = list.ToArray(); } } Object.Destroy((Object)(object)modifications.OtherModifications[0].inst_dynamicBone); Object.Destroy((Object)(object)modifications.OtherModifications[0].inst_armature); Object.Destroy((Object)(object)modifications.OtherModifications[0].instance); if (!modifications.OtherModifications.Remove(modification)) { InstanceLogger.LogError((object)"Skin Modification was not removed"); } } private static int FindBoneIndex(Transform targetBone, List<Transform> BoneList) { if (((Object)targetBone.parent).name.Contains("Armature")) { return BoneList.Count; } Transform parent = targetBone.parent; int siblingIndex = targetBone.GetSiblingIndex(); int childCount = parent.childCount; if (siblingIndex == childCount - 1) { return FindBoneIndex(targetBone.parent, BoneList); } Transform nextBone = targetBone.parent.GetChild(siblingIndex + 1); int num = BoneList.FindIndex((Transform x) => (Object)(object)x == (Object)(object)nextBone); if (num == -1) { FindBoneIndex(nextBone, BoneList); } return num; } private static int FindBoneIndex2(Transform targetBone, List<Transform> BoneList) { Dictionary<Transform, bool> dictionary = new Dictionary<Transform, bool>(); int num = 99999; for (int i = 0; i < BoneList.Count; i++) { Transform val = BoneList[i]; if (((Object)val).name == "ROOT") { dictionary.Add(val, value: false); continue; } if ((Object)(object)val == (Object)(object)targetBone) { num = i; } Transform parent = ((Component)val).transform.parent; if ((Object)(object)parent == (Object)(object)targetBone) { dictionary.Add(val, value: true); } else { if (!dictionary.ContainsKey(parent)) { continue; } if (dictionary[parent]) { dictionary.Add(val, value: true); continue; } dictionary.Add(val, value: false); if (i > num) { return i; } } } return BoneList.Count - 1; } private static SkinnedMeshRenderer[] GetBaseSkinRenderers(GameObject modelObject) { SkinnedMeshRenderer[] componentsInChildren = modelObject.GetComponentsInChildren<SkinnedMeshRenderer>(true); List<SkinnedMeshRenderer> list = new List<SkinnedMeshRenderer>(); SkinnedMeshRenderer[] array = componentsInChildren; foreach (SkinnedMeshRenderer val in array) { if ((Object)(object)((Component)val).transform.parent == (Object)(object)modelObject.transform) { list.Add(val); } } return list.ToArray(); } private static Transform[] BoneArrayBuilder(Transform NewBoneRoot) { List<Transform> list = new List<Transform>(); BoneArrayBuilderHelper(NewBoneRoot, list); return list.ToArray(); } private static void BoneArrayBuilderHelper(Transform parent, List<Transform> list) { if (!((Object)parent).name.EndsWith("_end")) { list.Add(parent); } for (int i = 0; i < parent.childCount; i++) { BoneArrayBuilderHelper(parent.GetChild(i), list); } } private static Transform GetArmature(GameObject obj) { return GetArmatureHelper(obj); } private static Transform GetArmatureHelper(GameObject obj) { if (((Object)obj).name.ToLower().Contains("armature")) { return obj.transform; } for (int i = 0; i < obj.transform.childCount; i++) { Transform armatureHelper = GetArmatureHelper(((Component)obj.transform.GetChild(i)).gameObject); if (Object.op_Implicit((Object)(object)armatureHelper)) { return armatureHelper; } } return null; } } }