Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of TouhouEnemyModels v1.0.0
TouhouEnemyModels.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using HarmonyLib; using LCSoundTool; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; using UnityEngine.Animations.Rigging; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TouhouEnemyModels")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("A template for Lethal Company")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+058acb040a2bbc99bb95ca54a9b05dc08dc7be12")] [assembly: AssemblyProduct("TouhouEnemyModels")] [assembly: AssemblyTitle("TouhouEnemyModels")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace TouhouEnemyModels { public static class MyPluginInfo { public const string PLUGIN_GUID = "com.bean.TouhouEnemyModels"; public const string PLUGIN_NAME = "TouhouEnemyModels"; public const string PLUGIN_VERSION = "0.9.5"; } [HarmonyPatch] internal class Patches { [HarmonyPatch(typeof(DeadBodyInfo), "Start")] [HarmonyPostfix] private static void ReplaceDeadBodySpringModel(DeadBodyInfo __instance) { //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: 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_0162: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) if (__instance == null || (Object)(object)TouhouEnemiesPlugin.SekiHeadVisuals == (Object)null || !TouhouEnemiesPlugin.EnableCoilHeadReplace.Value || !TouhouEnemiesPlugin.EnableBodyCoilReplace.Value) { return; } try { Rigidbody[] bodyParts = __instance.bodyParts; foreach (Rigidbody val in bodyParts) { if (((Object)val).name.Contains("Spring")) { Transform val2 = ((Component)val).transform.Find("spine.001/spine.002/spine.003/spine.004/SpringContainer"); SkinnedMeshRenderer component = ((Component)val2.Find("Spring.001")).GetComponent<SkinnedMeshRenderer>(); Transform val3 = val2.Find("SpringMetarig"); if ((Object)(object)component != (Object)null) { ((Renderer)component).enabled = false; } GameObject val4 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.SekiHeadVisuals); val4.transform.SetParent(val2); val4.transform.localPosition = Vector3.zero; val4.transform.localRotation = Quaternion.identity; val4.transform.localScale = Vector3.one; Transform val5 = val4.transform.Find("Head/Body"); Transform val6 = val4.transform.Find("Head/Armature"); val6.SetParent(val3.parent, true); ((Component)val6).transform.localScale = ((Component)val3).transform.localScale; ((Component)val6).transform.localRotation = ((Component)val3).transform.localRotation; ((Component)val6).transform.localPosition = ((Component)val3).transform.localPosition; SkinnedMeshRenderer component2 = ((Component)val5).GetComponent<SkinnedMeshRenderer>(); component2.rootBone = val6; ((Object)val6).name = "SpringMetarig"; TouhouEnemiesPlugin.Instance.AddLog("Spring model changed."); } } } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to replace the spring."); } } [HarmonyPatch(typeof(EnemyAI), "Start")] [HarmonyPrefix] private static void ReplaceEnemyModels(EnemyAI __instance) { //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Expected O, but got Unknown //IL_11c6: Unknown result type (might be due to invalid IL or missing references) //IL_11d8: Unknown result type (might be due to invalid IL or missing references) //IL_11ea: Unknown result type (might be due to invalid IL or missing references) //IL_1256: Unknown result type (might be due to invalid IL or missing references) //IL_126f: Unknown result type (might be due to invalid IL or missing references) //IL_1288: Unknown result type (might be due to invalid IL or missing references) //IL_137c: Unknown result type (might be due to invalid IL or missing references) //IL_1386: Expected O, but got Unknown //IL_0861: Unknown result type (might be due to invalid IL or missing references) //IL_0873: Unknown result type (might be due to invalid IL or missing references) //IL_0885: Unknown result type (might be due to invalid IL or missing references) //IL_08d4: Unknown result type (might be due to invalid IL or missing references) //IL_08ed: Unknown result type (might be due to invalid IL or missing references) //IL_0906: Unknown result type (might be due to invalid IL or missing references) //IL_098c: Unknown result type (might be due to invalid IL or missing references) //IL_099f: Unknown result type (might be due to invalid IL or missing references) //IL_09b2: Unknown result type (might be due to invalid IL or missing references) //IL_0a05: Unknown result type (might be due to invalid IL or missing references) //IL_0a18: Unknown result type (might be due to invalid IL or missing references) //IL_0a2b: Unknown result type (might be due to invalid IL or missing references) //IL_0af6: Unknown result type (might be due to invalid IL or missing references) //IL_0b00: Expected O, but got Unknown //IL_04f4: Unknown result type (might be due to invalid IL or missing references) //IL_0506: Unknown result type (might be due to invalid IL or missing references) //IL_0518: Unknown result type (might be due to invalid IL or missing references) //IL_0567: Unknown result type (might be due to invalid IL or missing references) //IL_0580: Unknown result type (might be due to invalid IL or missing references) //IL_0599: Unknown result type (might be due to invalid IL or missing references) //IL_063a: Unknown result type (might be due to invalid IL or missing references) //IL_064d: Unknown result type (might be due to invalid IL or missing references) //IL_0660: Unknown result type (might be due to invalid IL or missing references) //IL_06b5: Unknown result type (might be due to invalid IL or missing references) //IL_06bf: Expected O, but got Unknown //IL_0f2b: Unknown result type (might be due to invalid IL or missing references) //IL_0f3d: Unknown result type (might be due to invalid IL or missing references) //IL_0f4f: Unknown result type (might be due to invalid IL or missing references) //IL_0f97: Unknown result type (might be due to invalid IL or missing references) //IL_0fb0: 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_104f: Unknown result type (might be due to invalid IL or missing references) //IL_1062: Unknown result type (might be due to invalid IL or missing references) //IL_1075: Unknown result type (might be due to invalid IL or missing references) //IL_10aa: Unknown result type (might be due to invalid IL or missing references) //IL_10b4: Expected O, but got Unknown //IL_0d5f: Unknown result type (might be due to invalid IL or missing references) //IL_0d71: Unknown result type (might be due to invalid IL or missing references) //IL_0d83: Unknown result type (might be due to invalid IL or missing references) //IL_0dcb: Unknown result type (might be due to invalid IL or missing references) //IL_0de4: Unknown result type (might be due to invalid IL or missing references) //IL_0dfd: Unknown result type (might be due to invalid IL or missing references) //IL_0e83: Unknown result type (might be due to invalid IL or missing references) //IL_0e96: Unknown result type (might be due to invalid IL or missing references) //IL_0ea9: Unknown result type (might be due to invalid IL or missing references) SpringManAI val = (SpringManAI)(object)((__instance is SpringManAI) ? __instance : null); if (val == null) { NutcrackerEnemyAI val2 = (NutcrackerEnemyAI)(object)((__instance is NutcrackerEnemyAI) ? __instance : null); if (val2 == null) { ForestGiantAI val3 = (ForestGiantAI)(object)((__instance is ForestGiantAI) ? __instance : null); if (val3 == null) { HoarderBugAI val4 = (HoarderBugAI)(object)((__instance is HoarderBugAI) ? __instance : null); if (val4 == null) { SandWormAI val5 = (SandWormAI)(object)((__instance is SandWormAI) ? __instance : null); if (val5 == null || !((Object)(object)TouhouEnemiesPlugin.YuyukoVisuals != (Object)null) || !TouhouEnemiesPlugin.EnableSandWormReplace.Value) { return; } try { Animator componentInChildren = ((Component)val5).GetComponentInChildren<Animator>(); RuntimeAnimatorController runtimeAnimatorController = componentInChildren.runtimeAnimatorController; Transform val6 = ((Component)val5).transform.Find("MeshContainer"); object obj; if (val6 == null) { obj = null; } else { Transform obj2 = val6.Find("Renderer"); obj = ((obj2 != null) ? ((Component)obj2).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val7 = (SkinnedMeshRenderer)obj; if ((Object)(object)val7 != (Object)null) { ((Renderer)val7).enabled = false; } Transform val8 = ((val6 != null) ? val6.Find("Armature").Find("Bone") : null); if (!((Object)(object)val8 == (Object)null)) { ((Object)val8).name = "old-Bone"; GameObject val9 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.YuyukoVisuals); val9.transform.SetParent(((Component)val5).transform); val9.transform.localPosition = Vector3.zero; val9.transform.localRotation = Quaternion.identity; val9.transform.localScale = Vector3.one; Transform val10 = val9.transform.Find("MeshContainer"); Transform val11 = ((Component)val10).transform.Find("Renderer"); Transform val12 = ((Component)val10).transform.Find("Armature").Find("Bone"); val12.SetParent(val8.parent, true); ((Component)val12).transform.localScale = ((Component)val8).transform.localScale; ((Component)val12).transform.localRotation = ((Component)val8).transform.localRotation; ((Component)val12).transform.localPosition = ((Component)val8).transform.localPosition; TouhouEnemiesPlugin.Instance.AddLog("SandWorm model changed."); Transform parent = ((Component)val12).transform.Find("Bone.001/Bone.003/Bone.002"); Transform val13 = ((Component)val8).transform.Find("Bone.001/Bone.003/Bone.002/Collider"); Transform val14 = ((Component)val8).transform.Find("Bone.001/Bone.003/Bone.002/VoiceAudio"); Transform val15 = ((Component)val8).transform.Find("Bone.001/Bone.003/Bone.002/ScanNode"); ((Component)val15).gameObject.GetComponent<ScanNodeProperties>().headerText = "EaterYuyuko"; val13.SetParent(parent); val14.SetParent(parent); val15.SetParent(parent); TouhouEnemiesPlugin.Instance.AddLog($"Collider: {(Object)(object)val13 != (Object)null}, " + $"Voice: {(Object)(object)val14 != (Object)null}, " + $"ScanNode: {(Object)(object)val15 != (Object)null}"); componentInChildren.runtimeAnimatorController = (RuntimeAnimatorController)new AnimatorOverrideController(runtimeAnimatorController); TouhouEnemiesPlugin.Instance.AddLog("The state of the animator reset."); } return; } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to replace SandWorm."); return; } } if (!((Object)(object)TouhouEnemiesPlugin.MarisaVisuals != (Object)null) || !TouhouEnemiesPlugin.EnableHoarderBugReplace.Value) { return; } try { Animator componentInChildren2 = ((Component)val4).GetComponentInChildren<Animator>(); RuntimeAnimatorController runtimeAnimatorController2 = componentInChildren2.runtimeAnimatorController; Transform val16 = ((Component)val4).transform.Find("HoarderBugModel"); object obj4; if (val16 == null) { obj4 = null; } else { Transform obj5 = val16.Find("Cube"); obj4 = ((obj5 != null) ? ((Component)obj5).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val17 = (SkinnedMeshRenderer)obj4; object obj6; if (val16 == null) { obj6 = null; } else { Transform obj7 = val16.Find("Cube.001"); obj6 = ((obj7 != null) ? ((Component)obj7).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val18 = (SkinnedMeshRenderer)obj6; object obj8; if (val16 == null) { obj8 = null; } else { Transform obj9 = val16.Find("AnimContainer/Armature/Abdomen/Chest/Head/LeftWing"); obj8 = ((obj9 != null) ? ((Component)obj9).GetComponent<MeshRenderer>() : null); } MeshRenderer val19 = (MeshRenderer)obj8; object obj10; if (val16 == null) { obj10 = null; } else { Transform obj11 = val16.Find("AnimContainer/Armature/Abdomen/Chest/Head/RightWing"); obj10 = ((obj11 != null) ? ((Component)obj11).GetComponent<MeshRenderer>() : null); } MeshRenderer val20 = (MeshRenderer)obj10; if ((Object)(object)val17 != (Object)null) { ((Renderer)val17).enabled = false; } if ((Object)(object)val18 != (Object)null) { ((Renderer)val18).enabled = false; } if ((Object)(object)val19 != (Object)null) { ((Renderer)val19).enabled = false; } if ((Object)(object)val20 != (Object)null) { ((Renderer)val20).enabled = false; } Transform val21 = ((val16 != null) ? val16.Find("AnimContainer").Find("Armature") : null); if ((Object)(object)val21 == (Object)null) { return; } ((Object)val21).name = "old-Armature"; int num = Random.Range(0, 10); if (TouhouEnemiesPlugin.BugSpawnRate.Value < num + 1) { Animator val22 = ((val16 != null) ? ((Component)val16.Find("AnimContainer")).GetComponent<Animator>() : null); if ((Object)(object)val22 != (Object)null) { ((Behaviour)val22).enabled = false; } ((Component)((Component)val4).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText = "HoarderMarisa"; GameObject val23 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.MarisaVisuals); Animator component = ((Component)val23.transform.Find("HoarderBugModel")).GetComponent<Animator>(); ((EnemyAI)val4).creatureAnimator = component; TouhouEnemiesPlugin.Instance.AddLog("The animator is replaced."); val23.transform.SetParent(((Component)val4).transform); val23.transform.localPosition = Vector3.zero; val23.transform.localRotation = Quaternion.identity; val23.transform.localScale = Vector3.one; Transform val24 = val23.transform.Find("HoarderBugModel/Cube"); Transform val25 = val23.transform.Find("HoarderBugModel/Armature"); val25.SetParent(val21.parent, true); ((Component)val25).transform.localScale = Vector3.one; ((Component)val25).transform.localRotation = ((Component)val21).transform.localRotation; ((Component)val25).transform.localPosition = ((Component)val21).transform.localPosition; SkinnedMeshRenderer component2 = ((Component)val24).GetComponent<SkinnedMeshRenderer>(); component2.rootBone = ((Component)val25).transform.Find("Abdomen"); ((Object)val25).name = "Armature"; TouhouEnemiesPlugin.Instance.AddLog("HoarderBug model changed."); Transform val26 = ((Component)val25).transform.Find("Abdomen/Spine"); val4.grabTarget.SetParent(val26); Transform val27 = ((Component)val26).transform.Find("HoldItemsTarget"); val4.grabTarget.localScale = val27.localScale; val4.grabTarget.localRotation = val27.localRotation; val4.grabTarget.localPosition = val27.localPosition; TouhouEnemiesPlugin.Instance.AddLog($"GrabTarget: {(Object)(object)val4.grabTarget != (Object)null}"); } else { ((Component)((Component)val4).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText = "KirisameBug"; GameObject val28 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.BugVisuals); val28.transform.SetParent(((Component)val4).transform); val28.transform.localPosition = Vector3.zero; val28.transform.localRotation = Quaternion.identity; val28.transform.localScale = Vector3.one; Transform val29 = val28.transform.Find("AnimContainer/Cube"); Transform val30 = val28.transform.Find("AnimContainer/Armature"); val30.SetParent(val21.parent, true); ((Component)val30).transform.localScale = Vector3.one; ((Component)val30).transform.localRotation = ((Component)val21).transform.localRotation; ((Component)val30).transform.localPosition = ((Component)val21).transform.localPosition; SkinnedMeshRenderer component3 = ((Component)val29).GetComponent<SkinnedMeshRenderer>(); component3.rootBone = ((Component)val30).transform.Find("Abdomen"); ((Object)val30).name = "Armature"; TouhouEnemiesPlugin.Instance.AddLog("HoarderBug model changed."); Transform val31 = ((Component)val30).transform.Find("Abdomen/Spine"); val4.grabTarget.SetParent(val31); Transform val32 = ((Component)val31).transform.Find("HoldItemsTarget"); val4.grabTarget.localScale = val32.localScale; val4.grabTarget.localRotation = val32.localRotation; val4.grabTarget.localPosition = val32.localPosition; TouhouEnemiesPlugin.Instance.AddLog($"GrabTarget: {(Object)(object)val4.grabTarget != (Object)null}"); componentInChildren2.runtimeAnimatorController = (RuntimeAnimatorController)new AnimatorOverrideController(runtimeAnimatorController2); TouhouEnemiesPlugin.Instance.AddLog("The animator is replaced."); } return; } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to replace HoarderBug."); return; } } if (!((Object)(object)TouhouEnemiesPlugin.SuikaVisuals != (Object)null) || !TouhouEnemiesPlugin.EnableForestGiantReplace.Value) { return; } try { Animator componentInChildren3 = ((Component)val3).GetComponentInChildren<Animator>(); RuntimeAnimatorController runtimeAnimatorController3 = componentInChildren3.runtimeAnimatorController; Transform val33 = ((Component)val3).transform.Find("FGiantModelContainer"); object obj13; if (val33 == null) { obj13 = null; } else { Transform obj14 = val33.Find("BodyLOD0"); obj13 = ((obj14 != null) ? ((Component)obj14).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val34 = (SkinnedMeshRenderer)obj13; object obj15; if (val33 == null) { obj15 = null; } else { Transform obj16 = val33.Find("BodyLOD1"); obj15 = ((obj16 != null) ? ((Component)obj16).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val35 = (SkinnedMeshRenderer)obj15; object obj17; if (val33 == null) { obj17 = null; } else { Transform obj18 = val33.Find("BodyLOD2"); obj17 = ((obj18 != null) ? ((Component)obj18).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val36 = (SkinnedMeshRenderer)obj17; if ((Object)(object)val34 != (Object)null) { ((Renderer)val34).enabled = false; } if ((Object)(object)val35 != (Object)null) { ((Renderer)val35).enabled = false; } if ((Object)(object)val36 != (Object)null) { ((Renderer)val36).enabled = false; } ((Component)((Component)val3).transform.Find("ScanNode (1)")).gameObject.GetComponent<ScanNodeProperties>().headerText = "SuikaGiant"; Transform val37 = ((val33 != null) ? val33.Find("AnimContainer").Find("metarig") : null); if (!((Object)(object)val37 == (Object)null)) { ((Object)val37).name = "old-metarig"; GameObject val38 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.SuikaVisuals); val38.transform.SetParent(((Component)val3).transform); val38.transform.localPosition = Vector3.zero; val38.transform.localRotation = Quaternion.identity; val38.transform.localScale = Vector3.one; Transform val39 = val38.transform.Find("FGiantModelContainer/BodyLOD0"); Transform val40 = val38.transform.Find("FGiantModelContainer/metarig"); val40.SetParent(val37.parent, true); ((Component)val40).transform.localScale = ((Component)val37).transform.localScale; ((Component)val40).transform.localRotation = ((Component)val37).transform.localRotation; ((Component)val40).transform.localPosition = ((Component)val37).transform.localPosition; SkinnedMeshRenderer component4 = ((Component)val39).GetComponent<SkinnedMeshRenderer>(); component4.rootBone = ((Component)val40).transform.Find("spine"); ((Object)val40).name = "metarig"; TouhouEnemiesPlugin.Instance.AddLog("ForestGiant model changed."); Transform val41 = val38.transform.Find("FGiantModelContainer"); val3.centerPosition.SetParent(val41); Transform val42 = ((Component)val41).transform.Find("CenterPosition"); val3.centerPosition.localScale = val42.localScale; val3.centerPosition.localRotation = val42.localRotation; val3.centerPosition.localPosition = val42.localPosition; val3.handBone = ((Component)val40).transform.Find("spine/spine.003/shoulder.R/upper_arm.R/forearm.R/hand.R"); val3.holdPlayerPoint.SetParent(val3.handBone); Transform val43 = ((Component)val3.handBone).transform.Find("PlayerPoint"); val3.holdPlayerPoint.localScale = val43.localScale; val3.holdPlayerPoint.localRotation = val43.localRotation; val3.holdPlayerPoint.localPosition = val43.localPosition; TouhouEnemiesPlugin.Instance.AddLog($"CenterPos: {(Object)(object)val3.centerPosition != (Object)null}, " + $"HandBone: {(Object)(object)val3.handBone != (Object)null}, " + $"HoldPoint: {(Object)(object)val3.holdPlayerPoint != (Object)null}"); ((TwoBoneIKConstraintData)(ref ((RigConstraint<TwoBoneIKConstraintJob, TwoBoneIKConstraintData, TwoBoneIKConstraintJobBinder<TwoBoneIKConstraintData>>)(object)val3.reachForPlayerRig).data)).root = ((Component)val40).transform.Find("spine/spine.003/shoulder.R/upper_arm.R"); ((TwoBoneIKConstraintData)(ref ((RigConstraint<TwoBoneIKConstraintJob, TwoBoneIKConstraintData, TwoBoneIKConstraintJobBinder<TwoBoneIKConstraintData>>)(object)val3.reachForPlayerRig).data)).mid = ((Component)val40).transform.Find("spine/spine.003/shoulder.R/upper_arm.R/forearm.R"); ((TwoBoneIKConstraintData)(ref ((RigConstraint<TwoBoneIKConstraintJob, TwoBoneIKConstraintData, TwoBoneIKConstraintJobBinder<TwoBoneIKConstraintData>>)(object)val3.reachForPlayerRig).data)).tip = val3.handBone; componentInChildren3.runtimeAnimatorController = (RuntimeAnimatorController)new AnimatorOverrideController(runtimeAnimatorController3); TouhouEnemiesPlugin.Instance.AddLog("The state of the animator is reset."); } return; } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to replace ForestGiant."); return; } } if (!((Object)(object)TouhouEnemiesPlugin.SatoriVisuals != (Object)null) || !TouhouEnemiesPlugin.EnableNutcrackerReplace.Value) { return; } try { Animator componentInChildren4 = ((Component)val2).GetComponentInChildren<Animator>(); RuntimeAnimatorController runtimeAnimatorController4 = componentInChildren4.runtimeAnimatorController; AudioSource component5 = ((Component)((Component)val2).transform.Find("CreatureVoice")).GetComponent<AudioSource>(); component5.volume = TouhouEnemiesPlugin.SatoriSFXVolume.Value; component5 = ((Component)((Component)val2).transform.Find("LongRangeSFX")).GetComponent<AudioSource>(); component5.volume = TouhouEnemiesPlugin.SatoriSFXVolume.Value; Transform val44 = ((Component)val2).transform.Find("MeshContainer"); object obj20; if (val44 == null) { obj20 = null; } else { Transform obj21 = val44.Find("LOD0"); obj20 = ((obj21 != null) ? ((Component)obj21).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val45 = (SkinnedMeshRenderer)obj20; object obj22; if (val44 == null) { obj22 = null; } else { Transform obj23 = val44.Find("LOD1"); obj22 = ((obj23 != null) ? ((Component)obj23).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val46 = (SkinnedMeshRenderer)obj22; object obj24; if (val44 == null) { obj24 = null; } else { Transform obj25 = val44.Find("AnimContainer/metarig/spinecontainer/GunAndArmsContainer/GunPoint/GunPointWithOffset/TestShotgun"); obj24 = ((obj25 != null) ? ((Component)obj25).GetComponent<MeshRenderer>() : null); } MeshRenderer val47 = (MeshRenderer)obj24; object obj26; if (val44 == null) { obj26 = null; } else { Transform obj27 = val44.Find("AnimContainer/metarig/spinecontainer/GunAndArmsContainer/GunPoint/GunPointWithOffset/TestShotgun/GunBarrel"); obj26 = ((obj27 != null) ? ((Component)obj27).GetComponent<MeshRenderer>() : null); } MeshRenderer val48 = (MeshRenderer)obj26; if ((Object)(object)val45 != (Object)null) { ((Renderer)val45).enabled = false; } if ((Object)(object)val46 != (Object)null) { ((Renderer)val46).enabled = false; } if ((Object)(object)val47 != (Object)null) { ((Renderer)val47).enabled = false; } if ((Object)(object)val48 != (Object)null) { ((Renderer)val48).enabled = false; } ((Component)((Component)val2).transform.Find("ScanNode (1)")).gameObject.GetComponent<ScanNodeProperties>().headerText = "NutSatori"; Transform val49 = ((val44 != null) ? val44.Find("AnimContainer").Find("metarig") : null); if (!((Object)(object)val49 == (Object)null)) { ((Object)val49).name = "old-metarig"; GameObject val50 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.SatoriVisuals); val50.transform.SetParent(((Component)val2).transform); val50.transform.localPosition = Vector3.zero; val50.transform.localRotation = Quaternion.identity; val50.transform.localScale = Vector3.one; Transform val51 = val50.transform.Find("MeshContainer/LOD0"); Transform val52 = val50.transform.Find("MeshContainer/Armature/metarig"); val52.SetParent(val49.parent, true); ((Component)val52).transform.localScale = ((Component)val49).transform.localScale; ((Component)val52).transform.localRotation = ((Component)val49).transform.localRotation; ((Component)val52).transform.localPosition = ((Component)val49).transform.localPosition; SkinnedMeshRenderer component6 = ((Component)val51).GetComponent<SkinnedMeshRenderer>(); component6.rootBone = ((Component)val52).transform.Find("spinecontainer/spine"); ((Object)val52).name = "metarig"; TouhouEnemiesPlugin.Instance.AddLog("Nutcracker model changed."); val2.torsoContainer = ((Component)val52).transform.Find("spinecontainer"); Transform val53 = ((Component)val2.torsoContainer).transform.Find("GunAndArmsContainer/GunPoint"); val2.gunPoint.SetParent(val53); Transform val54 = ((Component)val53).transform.Find("GunPointWithOffset"); val2.gunPoint.localScale = val54.localScale; val2.gunPoint.localRotation = val54.localRotation; val2.gunPoint.localPosition = val54.localPosition; TouhouEnemiesPlugin.Instance.AddLog($"Torso: {(Object)(object)val2.torsoContainer != (Object)null}, " + $"GunPoint: {(Object)(object)val2.gunPoint != (Object)null}"); componentInChildren4.runtimeAnimatorController = (RuntimeAnimatorController)new AnimatorOverrideController(runtimeAnimatorController4); TouhouEnemiesPlugin.Instance.AddLog("The state of the animator is reset."); } return; } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to replace Nutcracker."); return; } } if (!((Object)(object)TouhouEnemiesPlugin.SekiVisuals != (Object)null) || !TouhouEnemiesPlugin.EnableCoilHeadReplace.Value) { return; } try { Animator componentInChildren5 = ((Component)val).GetComponentInChildren<Animator>(); RuntimeAnimatorController runtimeAnimatorController5 = componentInChildren5.runtimeAnimatorController; Transform val55 = ((Component)val).transform.Find("SpringManModel"); object obj29; if (val55 == null) { obj29 = null; } else { Transform obj30 = val55.Find("Body"); obj29 = ((obj30 != null) ? ((Component)obj30).GetComponent<SkinnedMeshRenderer>() : null); } SkinnedMeshRenderer val56 = (SkinnedMeshRenderer)obj29; if ((Object)(object)val56 != (Object)null) { ((Renderer)val56).enabled = false; } object obj31; if (val55 == null) { obj31 = null; } else { Transform obj32 = val55.Find("Head"); obj31 = ((obj32 != null) ? ((Component)obj32).GetComponent<MeshRenderer>() : null); } MeshRenderer val57 = (MeshRenderer)obj31; if ((Object)(object)val57 != (Object)null) { ((Renderer)val57).enabled = false; } ((Component)val55.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText = "Coilbanki"; Transform val58 = val55.Find("AnimContainer").Find("metarig"); if (!((Object)(object)val58 == (Object)null)) { ((Object)val58).name = "old-metarig"; GameObject val59 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.SekiVisuals); val59.transform.SetParent(((Component)val).transform); val59.transform.localPosition = Vector3.zero; val59.transform.localRotation = Quaternion.identity; val59.transform.localScale = Vector3.one; Transform val60 = val59.transform.Find("SekibankiModel"); Transform val61 = ((Component)val60).transform.Find("Body"); Transform val62 = ((Component)val60).transform.Find("Head"); Transform val63 = ((Component)val60).transform.Find("AnimContainer"); val63.SetParent(val58.parent, true); ((Component)val63).transform.localScale = ((Component)val58).transform.localScale; ((Component)val63).transform.localRotation = ((Component)val58).transform.localRotation; ((Component)val63).transform.localPosition = ((Component)val58).transform.localPosition; SkinnedMeshRenderer component7 = ((Component)val61).GetComponent<SkinnedMeshRenderer>(); component7.rootBone = ((Component)val63).transform.Find("spine"); component7 = ((Component)val62).GetComponent<SkinnedMeshRenderer>(); component7.rootBone = ((Component)val63).transform.Find("spine"); ((Object)val63).name = "metarig"; TouhouEnemiesPlugin.Instance.AddLog("SpringMan model changed."); componentInChildren5.runtimeAnimatorController = (RuntimeAnimatorController)new AnimatorOverrideController(runtimeAnimatorController5); TouhouEnemiesPlugin.Instance.AddLog("The state of the animator reset."); } } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to replace SpringMan."); } } [HarmonyPatch(typeof(SpringManAI), "SetAnimationGoClientRpc")] [HarmonyPostfix] [ClientRpc] public static void PlaySekibankiTheme(SpringManAI __instance) { if (!TouhouEnemiesPlugin.EnableCoilHeadReplace.Value || !TouhouEnemiesPlugin.EnableSekibankiTheme.Value || (Object)(object)TouhouEnemiesPlugin.SekibankiTheme == (Object)null) { return; } try { if ((Object)(object)((EnemyAI)__instance).creatureSFX.clip != (Object)(object)TouhouEnemiesPlugin.SekibankiTheme) { ((EnemyAI)__instance).creatureSFX.clip = TouhouEnemiesPlugin.SekibankiTheme; ((EnemyAI)__instance).creatureSFX.volume = TouhouEnemiesPlugin.SekibankiSFXVolume.Value; ((EnemyAI)__instance).creatureSFX.loop = true; } if (((EnemyAI)__instance).creatureSFX.isPlaying) { ((EnemyAI)__instance).creatureSFX.UnPause(); } else { ((EnemyAI)__instance).creatureSFX.Play(); } WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureSFX, TouhouEnemiesPlugin.SekibankiTheme, TouhouEnemiesPlugin.SekibankiSFXVolume.Value / 2f); TouhouEnemiesPlugin.Instance.AddLog("Playing Sekibanki theme."); } catch { TouhouEnemiesPlugin.Instance.AddLog("Play Sekibanki theme failed."); } } [HarmonyPatch(typeof(SpringManAI), "SetAnimationStopClientRpc")] [HarmonyPostfix] [ClientRpc] public static void PauseSekibankiTheme(SpringManAI __instance) { if (TouhouEnemiesPlugin.EnableCoilHeadReplace.Value && TouhouEnemiesPlugin.EnableSekibankiTheme.Value && !((Object)(object)TouhouEnemiesPlugin.SekibankiTheme == (Object)null) && ((EnemyAI)__instance).creatureSFX.isPlaying) { ((EnemyAI)__instance).creatureSFX.Pause(); TouhouEnemiesPlugin.Instance.AddLog("Pause Sekibanki theme."); } } [HarmonyPatch(typeof(NutcrackerEnemyAI), "Start")] [HarmonyPostfix] public static void ReplaceSatoriTheme(NutcrackerEnemyAI __instance) { if (TouhouEnemiesPlugin.EnableNutcrackerReplace.Value && TouhouEnemiesPlugin.EnableSatoriTheme.Value && !((Object)(object)TouhouEnemiesPlugin.SatoriTheme == (Object)null)) { ((EnemyAI)__instance).enemyBehaviourStates[2].VoiceClip = TouhouEnemiesPlugin.SatoriTheme; ((EnemyAI)__instance).creatureSFX.volume = TouhouEnemiesPlugin.SatoriSFXVolume.Value; TouhouEnemiesPlugin.Instance.AddLog("Satori theme Loaded."); } } [HarmonyPatch(typeof(EnemyAI), "SwitchToBehaviourStateOnLocalClient")] [HarmonyPostfix] [ClientRpc] public static void ReplaceSuikaTheme(int stateIndex, EnemyAI __instance) { try { if (!(__instance is ForestGiantAI) || !TouhouEnemiesPlugin.EnableForestGiantReplace.Value) { return; } if (TouhouEnemiesPlugin.EnableSuikaVoice.Value) { switch (stateIndex) { case 0: if ((Object)(object)TouhouEnemiesPlugin.SuikaAudios[0] != (Object)null) { __instance.creatureVoice.PlayOneShot(TouhouEnemiesPlugin.SuikaAudios[0], TouhouEnemiesPlugin.SuikaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(__instance.creatureVoice, TouhouEnemiesPlugin.SuikaAudios[0], TouhouEnemiesPlugin.SuikaVoiceVolume.Value / 2f); } break; case 1: __instance.creatureVoice.volume = TouhouEnemiesPlugin.SuikaVoiceVolume.Value; if ((Object)(object)TouhouEnemiesPlugin.SuikaAudios[2] != (Object)null) { __instance.creatureVoice.PlayOneShot(TouhouEnemiesPlugin.SuikaAudios[2], TouhouEnemiesPlugin.SuikaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(__instance.creatureVoice, TouhouEnemiesPlugin.SuikaAudios[2], TouhouEnemiesPlugin.SuikaVoiceVolume.Value / 2f); } break; case 2: if ((Object)(object)TouhouEnemiesPlugin.SuikaAudios[1] != (Object)null && !TouhouEnemiesPlugin.SoundToolGood) { __instance.creatureVoice.PlayOneShot(TouhouEnemiesPlugin.SuikaAudios[1], TouhouEnemiesPlugin.SuikaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(__instance.creatureVoice, TouhouEnemiesPlugin.SuikaAudios[1], TouhouEnemiesPlugin.SuikaVoiceVolume.Value / 2f); } break; default: TouhouEnemiesPlugin.Instance.AddLog("Unexpected state for Suika voice."); break; } } if (!TouhouEnemiesPlugin.EnableSuikaTheme.Value || (Object)(object)TouhouEnemiesPlugin.SuikaTheme == (Object)null) { return; } switch (stateIndex) { case 0: __instance.creatureSFX.Stop(); TouhouEnemiesPlugin.Instance.AddLog("Stop Suika theme."); break; case 1: if ((Object)(object)__instance.creatureSFX.clip != (Object)(object)TouhouEnemiesPlugin.SuikaTheme) { __instance.creatureSFX.clip = TouhouEnemiesPlugin.SuikaTheme; __instance.creatureSFX.volume = TouhouEnemiesPlugin.SuikaThemeVolume.Value; __instance.creatureSFX.loop = true; __instance.creatureSFX.spatialBlend = 1f; } if (__instance.creatureSFX.isPlaying) { __instance.creatureSFX.UnPause(); } else { __instance.creatureSFX.Play(); } WalkieTalkie.TransmitOneShotAudio(__instance.creatureSFX, TouhouEnemiesPlugin.SuikaTheme, TouhouEnemiesPlugin.SuikaThemeVolume.Value / 2f); TouhouEnemiesPlugin.Instance.AddLog("Playing Suika theme."); break; case 2: __instance.creatureSFX.Pause(); TouhouEnemiesPlugin.Instance.AddLog("Pause Suika theme."); break; default: TouhouEnemiesPlugin.Instance.AddLog("Unexpected state for Suika theme."); break; } } catch { TouhouEnemiesPlugin.Instance.AddLog("SwitchToBehaviourStateOnLocalClient failed."); } } [HarmonyPatch(typeof(ForestGiantAI), "BeginEatPlayer")] [HarmonyPrefix] public static void SuikaEat(ForestGiantAI __instance) { ((EnemyAI)__instance).creatureSFX.Pause(); if (TouhouEnemiesPlugin.EnableForestGiantReplace.Value && TouhouEnemiesPlugin.EnableSuikaVoice.Value && (Object)(object)TouhouEnemiesPlugin.SuikaAudios[3] != (Object)null && !TouhouEnemiesPlugin.SoundToolGood) { ((EnemyAI)__instance).creatureVoice.PlayOneShot(TouhouEnemiesPlugin.SuikaAudios[3], TouhouEnemiesPlugin.SuikaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureVoice, TouhouEnemiesPlugin.SuikaAudios[3], TouhouEnemiesPlugin.SuikaVoiceVolume.Value / 2f); } } [HarmonyPatch(typeof(ForestGiantAI), "KillEnemy")] [HarmonyPrefix] public static void SuikaLost(ForestGiantAI __instance) { ((EnemyAI)__instance).creatureSFX.Stop(); if (TouhouEnemiesPlugin.EnableForestGiantReplace.Value) { if ((Object)(object)TouhouEnemiesPlugin.SuikaVisuals != (Object)null) { SkinnedMeshRenderer component = ((Component)((Component)__instance).transform.Find("SuikaGiant(Clone)/FGiantModelContainer/BodyLOD0")).GetComponent<SkinnedMeshRenderer>(); component.SetBlendShapeWeight(3, 100f); component.SetBlendShapeWeight(5, 100f); TouhouEnemiesPlugin.Instance.AddLog("Suika lost."); } if (TouhouEnemiesPlugin.EnableSuikaVoice.Value && (Object)(object)TouhouEnemiesPlugin.SuikaAudios[1] != (Object)null && (Object)(object)__instance.giantCry != (Object)(object)TouhouEnemiesPlugin.SuikaAudios[1]) { __instance.giantCry = TouhouEnemiesPlugin.SuikaAudios[1]; } if (TouhouEnemiesPlugin.EnableDeathAudio.Value && (Object)(object)TouhouEnemiesPlugin.LostAudio != (Object)null) { ((EnemyAI)__instance).creatureSFX.PlayOneShot(TouhouEnemiesPlugin.LostAudio, TouhouEnemiesPlugin.DeathAudioVolume.Value); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureSFX, TouhouEnemiesPlugin.LostAudio, TouhouEnemiesPlugin.DeathAudioVolume.Value / 2f); } } } [HarmonyPatch(typeof(HoarderBugAI), "Start")] [HarmonyPostfix] public static void ReplaceMarisaTheme(HoarderBugAI __instance) { if (!TouhouEnemiesPlugin.EnableHoarderBugReplace.Value) { return; } if (((Component)((Component)__instance).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText == "HoarderMarisa") { if (TouhouEnemiesPlugin.EnableMarisaVoice.Value) { if ((Object)(object)TouhouEnemiesPlugin.MarisaAudios[0] != (Object)null) { __instance.chitterSFX[0] = TouhouEnemiesPlugin.MarisaAudios[0]; } if ((Object)(object)TouhouEnemiesPlugin.MarisaAudios[3] != (Object)null) { __instance.chitterSFX[1] = TouhouEnemiesPlugin.MarisaAudios[3]; } if ((Object)(object)TouhouEnemiesPlugin.MarisaAudios[7] != (Object)null) { __instance.chitterSFX[2] = TouhouEnemiesPlugin.MarisaAudios[7]; } if ((Object)(object)TouhouEnemiesPlugin.MarisaAudios[0] != (Object)null) { __instance.angryScreechSFX[0] = TouhouEnemiesPlugin.MarisaAudios[0]; } if ((Object)(object)TouhouEnemiesPlugin.MarisaAudios[7] != (Object)null) { __instance.angryScreechSFX[1] = TouhouEnemiesPlugin.MarisaAudios[7]; } if ((Object)(object)TouhouEnemiesPlugin.MarisaAudios[1] != (Object)null) { __instance.angryVoiceSFX = TouhouEnemiesPlugin.MarisaAudios[1]; } ((EnemyAI)__instance).creatureVoice.loop = false; ((EnemyAI)__instance).creatureVoice.volume = TouhouEnemiesPlugin.MarisaVoiceVolume.Value; } if (!TouhouEnemiesPlugin.EnableMarisaTheme.Value || (Object)(object)TouhouEnemiesPlugin.MarisaTheme == (Object)null) { return; } __instance.bugFlySFX = TouhouEnemiesPlugin.MarisaTheme; ((EnemyAI)__instance).creatureSFX.volume = TouhouEnemiesPlugin.MarisaSFXVolume.Value; } else if (((Component)((Component)__instance).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText == "KirisameBug" && TouhouEnemiesPlugin.EnableBugVoice.Value) { if ((Object)(object)TouhouEnemiesPlugin.BugAudios[0] != (Object)null) { __instance.chitterSFX[0] = TouhouEnemiesPlugin.BugAudios[0]; } if ((Object)(object)TouhouEnemiesPlugin.BugAudios[3] != (Object)null) { __instance.chitterSFX[1] = TouhouEnemiesPlugin.BugAudios[3]; } if ((Object)(object)TouhouEnemiesPlugin.BugAudios[5] != (Object)null) { __instance.chitterSFX[2] = TouhouEnemiesPlugin.BugAudios[5]; } if ((Object)(object)TouhouEnemiesPlugin.BugAudios[0] != (Object)null) { __instance.angryScreechSFX[0] = TouhouEnemiesPlugin.BugAudios[0]; } if ((Object)(object)TouhouEnemiesPlugin.BugAudios[5] != (Object)null) { __instance.angryScreechSFX[1] = TouhouEnemiesPlugin.BugAudios[5]; } if ((Object)(object)TouhouEnemiesPlugin.BugAudios[1] != (Object)null) { __instance.angryVoiceSFX = TouhouEnemiesPlugin.BugAudios[1]; } ((EnemyAI)__instance).creatureVoice.loop = false; ((EnemyAI)__instance).creatureVoice.volume = TouhouEnemiesPlugin.MarisaVoiceVolume.Value; } TouhouEnemiesPlugin.Instance.AddLog("Marisa theme Loaded."); } [HarmonyPatch(typeof(HoarderBugAI), "GrabItem")] [HarmonyPostfix] public static void MarisaGrab(HoarderBugAI __instance) { if (TouhouEnemiesPlugin.EnableHoarderBugReplace.Value) { if (((Component)((Component)__instance).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText == "HoarderMarisa" && TouhouEnemiesPlugin.EnableMarisaVoice.Value && (Object)(object)TouhouEnemiesPlugin.MarisaAudios[4] != (Object)null) { ((EnemyAI)__instance).creatureVoice.PlayOneShot(TouhouEnemiesPlugin.MarisaAudios[4], TouhouEnemiesPlugin.MarisaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureVoice, TouhouEnemiesPlugin.MarisaAudios[4], TouhouEnemiesPlugin.MarisaVoiceVolume.Value / 2f); } else if (((Component)((Component)__instance).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText == "KirisameBug" && TouhouEnemiesPlugin.EnableBugVoice.Value && (Object)(object)TouhouEnemiesPlugin.BugAudios[4] != (Object)null) { ((EnemyAI)__instance).creatureVoice.PlayOneShot(TouhouEnemiesPlugin.BugAudios[4], TouhouEnemiesPlugin.MarisaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureVoice, TouhouEnemiesPlugin.BugAudios[4], TouhouEnemiesPlugin.MarisaVoiceVolume.Value / 2f); } } } [HarmonyPatch(typeof(HoarderBugAI), "HitEnemy")] [HarmonyPostfix] public static void MarisaHit(HoarderBugAI __instance) { if (!((EnemyAI)__instance).isEnemyDead && TouhouEnemiesPlugin.EnableHoarderBugReplace.Value && !(((Component)((Component)__instance).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText != "HoarderMarisa") && TouhouEnemiesPlugin.EnableMarisaVoice.Value && !((Object)(object)TouhouEnemiesPlugin.MarisaAudios[5] == (Object)null)) { ((EnemyAI)__instance).creatureVoice.PlayOneShot(TouhouEnemiesPlugin.MarisaAudios[5], TouhouEnemiesPlugin.MarisaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureVoice, TouhouEnemiesPlugin.MarisaAudios[5], TouhouEnemiesPlugin.MarisaVoiceVolume.Value / 2f); } } [HarmonyPatch(typeof(HoarderBugAI), "KillEnemy")] [HarmonyPostfix] public static void MarisaLost(HoarderBugAI __instance) { if (TouhouEnemiesPlugin.EnableHoarderBugReplace.Value) { if (((Component)((Component)__instance).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText == "HoarderMarisa" && TouhouEnemiesPlugin.EnableMarisaVoice.Value && (Object)(object)TouhouEnemiesPlugin.MarisaAudios[2] != (Object)null) { ((EnemyAI)__instance).creatureVoice.PlayOneShot(TouhouEnemiesPlugin.MarisaAudios[2], TouhouEnemiesPlugin.MarisaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureVoice, TouhouEnemiesPlugin.SuikaAudios[2], TouhouEnemiesPlugin.MarisaVoiceVolume.Value / 2f); } else if (((Component)((Component)__instance).transform.Find("ScanNode")).gameObject.GetComponent<ScanNodeProperties>().headerText == "KirisameBug" && TouhouEnemiesPlugin.EnableBugVoice.Value && (Object)(object)TouhouEnemiesPlugin.BugAudios[2] != (Object)null) { ((EnemyAI)__instance).creatureVoice.PlayOneShot(TouhouEnemiesPlugin.BugAudios[2], TouhouEnemiesPlugin.MarisaVoiceVolume.Value); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureVoice, TouhouEnemiesPlugin.BugAudios[2], TouhouEnemiesPlugin.MarisaVoiceVolume.Value / 2f); } if (TouhouEnemiesPlugin.EnableDeathAudio.Value && (Object)(object)TouhouEnemiesPlugin.LostAudio != (Object)null) { ((EnemyAI)__instance).creatureSFX.PlayOneShot(TouhouEnemiesPlugin.LostAudio, TouhouEnemiesPlugin.DeathAudioVolume.Value); WalkieTalkie.TransmitOneShotAudio(((EnemyAI)__instance).creatureSFX, TouhouEnemiesPlugin.LostAudio, TouhouEnemiesPlugin.DeathAudioVolume.Value / 2f); } } } [HarmonyPatch(typeof(SandWormAI), "Start")] [HarmonyPostfix] public static void ReplaceYuyukoTheme(SandWormAI __instance) { if (TouhouEnemiesPlugin.EnableSandWormReplace.Value && TouhouEnemiesPlugin.EnableYuyukoTheme.Value && !((Object)(object)TouhouEnemiesPlugin.YuyukoTheme == (Object)null)) { __instance.emergeFromGroundSFX = TouhouEnemiesPlugin.YuyukoTheme; ((EnemyAI)__instance).creatureSFX.volume = TouhouEnemiesPlugin.YuyukoSFXVolume.Value; TouhouEnemiesPlugin.Instance.AddLog("Yuyuko theme Loaded."); } } } [HarmonyPatch] public static class V50Patches { private static bool Prepare() { MethodInfo method = typeof(RoundManager).GetMethod("SpawnNestObjectForOutsideEnemy", BindingFlags.Instance | BindingFlags.Public); return method != null; } [HarmonyPatch(typeof(EnemyAI), "Start")] [HarmonyPrefix] public static void ReplaceUtsuhoTheme(EnemyAI __instance) { //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: 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_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0463: Unknown result type (might be due to invalid IL or missing references) //IL_0476: Unknown result type (might be due to invalid IL or missing references) //IL_0489: Unknown result type (might be due to invalid IL or missing references) //IL_053f: Unknown result type (might be due to invalid IL or missing references) //IL_0552: Unknown result type (might be due to invalid IL or missing references) //IL_0565: Unknown result type (might be due to invalid IL or missing references) //IL_060b: Unknown result type (might be due to invalid IL or missing references) //IL_061e: Unknown result type (might be due to invalid IL or missing references) //IL_0631: Unknown result type (might be due to invalid IL or missing references) //IL_079c: Unknown result type (might be due to invalid IL or missing references) //IL_07af: Unknown result type (might be due to invalid IL or missing references) //IL_07c2: Unknown result type (might be due to invalid IL or missing references) //IL_082f: Unknown result type (might be due to invalid IL or missing references) //IL_0842: Unknown result type (might be due to invalid IL or missing references) //IL_0855: Unknown result type (might be due to invalid IL or missing references) //IL_08ca: Unknown result type (might be due to invalid IL or missing references) //IL_08d1: Expected O, but got Unknown try { RadMechAI val = (RadMechAI)(object)((__instance is RadMechAI) ? __instance : null); if (val == null) { ButlerEnemyAI val2 = (ButlerEnemyAI)(object)((__instance is ButlerEnemyAI) ? __instance : null); if (val2 != null) { } } else { if (!((Object)(object)TouhouEnemiesPlugin.UtsuhoVisuals != (Object)null) || !TouhouEnemiesPlugin.EnableRadMechReplace.Value) { return; } try { Transform val3 = ((Component)val).transform.Find("MeshContainer"); if ((Object)(object)val3 == (Object)null) { return; } Animator componentInChildren = ((Component)val).GetComponentInChildren<Animator>(); RuntimeAnimatorController runtimeAnimatorController = componentInChildren.runtimeAnimatorController; Transform obj = val3.Find("Body"); SkinnedMeshRenderer val4 = ((obj != null) ? ((Component)obj).GetComponent<SkinnedMeshRenderer>() : null); ((Component)val3.Find("ScanNode (1)")).gameObject.GetComponent<ScanNodeProperties>().headerText = "OldUtsuho"; Transform val5 = val3.Find("AnimContainer").Find("metarig"); if ((Object)(object)val5 == (Object)null) { return; } ((Object)val5).name = "old-metarig"; GameObject val6 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.UtsuhoVisuals); val6.transform.SetParent(((Component)val).transform); val6.transform.localPosition = Vector3.zero; val6.transform.localRotation = Quaternion.identity; val6.transform.localScale = Vector3.one; Transform val7 = val6.transform.Find("MeshContainer/AnimContainer"); Transform val8 = ((Component)val7).transform.Find("metarig"); val8.SetParent(val5.parent, true); ((Component)val8).transform.localScale = ((Component)val5).transform.localScale; ((Component)val8).transform.localRotation = ((Component)val5).transform.localRotation; ((Component)val8).transform.localPosition = ((Component)val5).transform.localPosition; TouhouEnemiesPlugin.Instance.AddLog("RadMech model changed."); val.torsoContainer = ((Component)val8).transform.Find("TorsoContainer"); val.torsoDefaultRotation.SetParent(val8); Transform val9 = ((Component)val8).transform.Find("TorsoDefaultRotation0"); val.torsoDefaultRotation.localScale = val9.localScale; val.torsoDefaultRotation.localRotation = val9.localRotation; val.torsoDefaultRotation.localPosition = val9.localPosition; Transform val10 = ((Component)val5).transform.Find("VoiceSFX"); val10.SetParent(val8); Transform val11 = ((Component)val5).transform.Find("3DLradAudio"); val11.SetParent(val8); ((Component)val11).GetComponent<AudioSource>().volume = TouhouEnemiesPlugin.UtsuhoSFXVolume.Value; Transform val12 = ((Component)val5).transform.Find("3DLradAudio2"); val12.SetParent(val8); ((Component)val12).GetComponent<AudioSource>().volume = TouhouEnemiesPlugin.UtsuhoSFXVolume.Value; Transform val13 = ((Component)val5).transform.Find("EngineSFX"); val13.SetParent(val8); Transform val14 = ((Component)val5).transform.Find("CreatureSFX"); val14.SetParent(val8); Transform val15 = ((Component)val5).transform.Find("TorsoContainer/Torso"); Transform val16 = ((Component)val15).transform.Find("FlyingModeEye"); Transform val17 = ((Component)val15).transform.Find("LightContainer"); Transform val18 = ((Component)val15).transform.Find("SpotlightOnAudio"); Transform val19 = ((Component)val8).transform.Find("TorsoContainer/Torso"); val16.SetParent(val19); val17.SetParent(val19); val18.SetParent(val19); TouhouEnemiesPlugin.Instance.AddLog($"Collider: {(Object)(object)val.ownCollider != (Object)null}, " + $"Torso: {(Object)(object)val.torsoContainer != (Object)null}, " + $"TorsoRotation: {(Object)(object)val.torsoDefaultRotation != (Object)null}"); Transform parent = ((Component)val8).transform.Find("LegLeft/LegLeft2"); Transform val20 = ((Component)val5).transform.Find("LegLeft/LegLeft2"); Transform val21 = ((Component)val20).transform.Find("ShockwaveLeftFoot"); val21.SetParent(parent); Transform val22 = ((Component)val20).transform.Find("SmokeTrail"); val22.SetParent(parent); Transform val23 = ((Component)val20).transform.Find("LeftLegFireContainer"); val23.SetParent(parent); val.leftFootPoint.localScale = val23.localScale; val.leftFootPoint.localRotation = val23.localRotation; val.leftFootPoint.localPosition = val23.localPosition; TouhouEnemiesPlugin.Instance.AddLog($"LeftFoot: {(Object)(object)val.leftFootPoint != (Object)null}"); Transform parent2 = ((Component)val8).transform.Find("LegRight/LegRight2"); Transform val24 = ((Component)val5).transform.Find("LegRight/LegRight2"); Transform val25 = ((Component)val24).transform.Find("ShockwaveRightFoot"); val25.SetParent(parent2); Transform val26 = ((Component)val24).transform.Find("SmokeTrailRightLeg"); val26.SetParent(parent2); Transform val27 = ((Component)val24).transform.Find("RightLegFireContainer"); val27.SetParent(parent2); val.rightFootPoint.localScale = val27.localScale; val.rightFootPoint.localRotation = val27.localRotation; val.rightFootPoint.localPosition = val27.localPosition; TouhouEnemiesPlugin.Instance.AddLog($"RightFoot: {(Object)(object)val.rightFootPoint != (Object)null}"); Transform val28 = ((Component)val19).transform.Find("LeftUpperArm"); Transform val29 = ((Component)val28).transform.Find("GunArmDefaultRot0"); Transform val30 = ((Component)val15).transform.Find("LeftUpperArm"); Transform val31 = ((Component)val30).transform.Find("GunArmContainer"); Transform val32 = ((Component)val31).transform.Find("LeftLowerArm"); val.defaultArmRotation.SetParent(val28); val.defaultArmRotation.localScale = val29.localScale; val.defaultArmRotation.localRotation = val29.localRotation; val.defaultArmRotation.localPosition = val29.localPosition; TouhouEnemiesPlugin.Instance.AddLog($"GunArmRotation: {(Object)(object)val.defaultArmRotation != (Object)null}"); Transform val33 = (val.gunArm = ((Component)val28).transform.Find("GunArmContainer")); TouhouEnemiesPlugin.Instance.AddLog($"GunArm: {(Object)(object)val.gunArm != (Object)null}"); Transform val34 = ((Component)val33).transform.Find("LeftLowerArm"); Transform val35 = ((Component)val32).transform.Find("BlastParticle"); Transform val36 = ((Component)val32).transform.Find("BlowtorchAudio"); Transform val37 = ((Component)val32).transform.Find("FlamethrowerParticle"); TouhouEnemiesPlugin.Instance.AddLog($"blastParticle: {(Object)(object)val35 != (Object)null}"); TouhouEnemiesPlugin.Instance.AddLog($"blowtorchAudio: {(Object)(object)val36 != (Object)null}"); TouhouEnemiesPlugin.Instance.AddLog($"flamethrower: {(Object)(object)val37 != (Object)null}"); val35.SetParent(val34); val36.SetParent(val34); val37.SetParent(val34); val.gunPoint.SetParent(val34); Transform val38 = ((Component)val34).transform.Find("GunPoint0"); val.gunPoint.localScale = val38.localScale; val.gunPoint.localRotation = val38.localRotation; val.gunPoint.localPosition = val38.localPosition; TouhouEnemiesPlugin.Instance.AddLog($"GunPoint: {(Object)(object)val.gunPoint != (Object)null}"); Transform val39 = ((Component)val19).transform.Find("RightUpperArm/RightLowerarm"); val.holdPlayerPoint.SetParent(val39); Transform val40 = ((Component)val39).transform.Find("GrabPlayerPoint0"); val.holdPlayerPoint.localScale = val40.localScale; val.holdPlayerPoint.localRotation = val40.localRotation; val.holdPlayerPoint.localPosition = val40.localPosition; Transform val41 = ((Component)val5).transform.Find("TorsoContainer/Torso/RightUpperArm/RightLowerarm/ClawTrigger"); val41.SetParent(val39); if ((Object)(object)val4 != (Object)null) { ((Renderer)val4).enabled = false; } TouhouEnemiesPlugin.Instance.AddLog($"HoldPoint: {(Object)(object)val.holdPlayerPoint != (Object)null}"); Animator component = ((Component)((Component)val7).transform).GetComponent<Animator>(); AnimatorOverrideController val42 = new AnimatorOverrideController(runtimeAnimatorController); Dictionary<string, AnimationClip> dictionary = new Dictionary<string, AnimationClip>(); AnimationClip[] animationClips = component.runtimeAnimatorController.animationClips; foreach (AnimationClip val43 in animationClips) { dictionary[((Object)val43).name] = val43; } ((Behaviour)component).enabled = false; List<KeyValuePair<AnimationClip, AnimationClip>> list = new List<KeyValuePair<AnimationClip, AnimationClip>>(); val42.GetOverrides(list); for (int j = 0; j < list.Count; j++) { AnimationClip key = list[j].Key; if (dictionary.TryGetValue(((Object)key).name, out var value)) { list[j] = new KeyValuePair<AnimationClip, AnimationClip>(key, value); } } val42.ApplyOverrides((IList<KeyValuePair<AnimationClip, AnimationClip>>)list); componentInChildren.runtimeAnimatorController = (RuntimeAnimatorController)(object)val42; TouhouEnemiesPlugin.Instance.AddLog("The animator is replaced."); if (TouhouEnemiesPlugin.EnableUtsuhoTheme.Value && !((Object)(object)TouhouEnemiesPlugin.UtsuhoTheme == (Object)null)) { val.LocalLRADAudio.clip = TouhouEnemiesPlugin.UtsuhoTheme; ((EnemyAI)val).creatureSFX.volume = TouhouEnemiesPlugin.UtsuhoSFXVolume.Value; TouhouEnemiesPlugin.Instance.AddLog("Utsuho theme Loaded."); } return; } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to replace RadMech."); return; } } } catch { TouhouEnemiesPlugin.Instance.AddLog("Maybe lower than V50, ignore."); } } [HarmonyPatch(typeof(RoundManager), "SpawnNestObjectForOutsideEnemy")] [HarmonyPostfix] public static void ReplaceUtsuhoSpawnNest(RoundManager __instance, EnemyType enemyType) { //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0193: 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) if (enemyType.enemyName != "RadMech" || (Object)(object)TouhouEnemiesPlugin.UtsuhoNestSpawnVisuals == (Object)null || !TouhouEnemiesPlugin.EnableRadMechReplace.Value) { return; } try { Transform val = ((Component)__instance.enemyNestSpawnObjects.Last()).transform.Find("MeshContainer"); if (!((Object)(object)val == (Object)null)) { Transform obj = val.Find("Body"); SkinnedMeshRenderer val2 = ((obj != null) ? ((Component)obj).GetComponent<SkinnedMeshRenderer>() : null); if ((Object)(object)val2 != (Object)null) { ((Renderer)val2).enabled = false; } ((Component)val.Find("ScanNode (1)")).gameObject.GetComponent<ScanNodeProperties>().headerText = "Old-Bird Utsuho"; Transform val3 = ((val != null) ? val.Find("AnimContainer").Find("metarig") : null); if (!((Object)(object)val3 == (Object)null)) { ((Object)val3).name = "old-metarig"; GameObject val4 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.UtsuhoNestSpawnVisuals); val4.transform.SetParent(val); val4.transform.localPosition = Vector3.zero; val4.transform.localRotation = Quaternion.identity; val4.transform.localScale = Vector3.one; Transform val5 = val4.transform.Find("MeshContainer/Armature"); Transform val6 = ((Component)val5).transform.Find("metarig"); val5.SetParent(val, true); ((Component)val6).transform.localScale = ((Component)val3).transform.localScale; ((Component)val6).transform.localRotation = ((Component)val3).transform.localRotation; ((Component)val6).transform.localPosition = ((Component)val3).transform.localPosition; TouhouEnemiesPlugin.Instance.AddLog("RadMechNestSpawnObject model changed."); } } } catch { TouhouEnemiesPlugin.Instance.AddLog("RadMechNestSpawnObject model change failed."); } } } [HarmonyPatch] public static class MoreCounterplayPatches { private static Vector3 position = Vector3.zero; [HarmonyPatch(typeof(EnemyAI), "KillEnemy")] [HarmonyPrefix] public static void DecapitateCoilhead(EnemyAI __instance) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) if (__instance == null || (Object)(object)TouhouEnemiesPlugin.SekiVisuals == (Object)null || (Object)(object)TouhouEnemiesPlugin.SekiHeadVisuals == (Object)null || !TouhouEnemiesPlugin.EnableCoilHeadReplace.Value || !TouhouEnemiesPlugin.MoreCounterplayGood) { return; } SpringManAI val = (SpringManAI)(object)((__instance is SpringManAI) ? __instance : null); if (val == null) { return; } try { Transform val2 = ((Component)val).transform.Find("Sekibanki(Clone)/SekibankiModel/Head"); position = ((Component)val2).transform.position; ((Renderer)((Component)val2).GetComponent<SkinnedMeshRenderer>()).enabled = false; ((EnemyAI)val).creatureSFX.Stop(); ((Behaviour)((Component)((Component)val).transform.Find("SpringManModel/AnimContainer")).GetComponent<Animator>()).enabled = false; TouhouEnemiesPlugin.Instance.AddLog($"Sekibanki head drop at {position}."); } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to kill Sekibanki."); } } [HarmonyPatch(typeof(GrabbableObject), "Start")] [HarmonyPrefix] public static void DecapitateCoilhead(GrabbableObject __instance) { //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) if (__instance == null || (Object)(object)TouhouEnemiesPlugin.SekiHeadVisuals == (Object)null || !TouhouEnemiesPlugin.EnableCoilHeadReplace.Value || !TouhouEnemiesPlugin.MoreCounterplayGood) { return; } try { Transform transform = ((Component)__instance).transform; if (!(((Object)transform).name != "Head(Clone)")) { __instance.itemProperties.verticalOffset = 0.2f; Object.Destroy((Object)(object)((Component)transform).GetComponent<MeshRenderer>()); transform.position = new Vector3(position.x, position.y + 0.5f, position.z); transform.rotation = Quaternion.Euler(180f, 180f, 0f); transform.localScale = new Vector3(0.25f, 0.25f, 0.25f); BoxCollider component = ((Component)transform).GetComponent<BoxCollider>(); component.center = new Vector3(0.1f, 0.15f, -1f); component.size = new Vector3(2.15f, 2.15f, 2.15f); Transform val = transform.Find("ScanNode"); ((Component)val).gameObject.GetComponent<ScanNodeProperties>().headerText = "Sekibanki's Head"; component = ((Component)val).GetComponent<BoxCollider>(); component.center = new Vector3(0.1f, 0.15f, -1f); component.size = new Vector3(2.15f, 2.15f, 2.15f); GameObject val2 = Object.Instantiate<GameObject>(TouhouEnemiesPlugin.SekiHeadVisuals); val2.transform.SetParent(transform); val2.transform.localPosition = new Vector3(-18f, 0f, -1f); val2.transform.localRotation = Quaternion.Euler(0f, 0f, 270f); val2.transform.localScale = new Vector3(400f, 400f, 400f); TouhouEnemiesPlugin.Instance.AddLog("Sekibanki head replaced."); } } catch { TouhouEnemiesPlugin.Instance.AddLog("Failed to replace Sekibanki head."); } } } [BepInPlugin("com.bean.TouhouEnemyModels", "TouhouEnemyModels", "0.9.5")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class TouhouEnemiesPlugin : BaseUnityPlugin { public static TouhouEnemiesPlugin Instance; public static bool SoundToolGood = false; public static bool MoreCounterplayGood = false; public static AudioClip LostAudio; internal static ConfigEntry<bool> EnableDeathAudio; internal static ConfigEntry<float> DeathAudioVolume; public static GameObject SekiVisuals; public static GameObject SekiHeadVisuals; public static AudioClip SekibankiTheme; internal static ConfigEntry<bool> EnableCoilHeadReplace; internal static ConfigEntry<bool> EnableBodyCoilReplace; internal static ConfigEntry<bool> EnableSekibankiTheme; internal static ConfigEntry<float> SekibankiSFXVolume; public static GameObject SatoriVisuals; public static AudioClip SatoriTheme; internal static ConfigEntry<bool> EnableNutcrackerReplace; internal static ConfigEntry<bool> EnableSatoriTheme; internal static ConfigEntry<float> SatoriSFXVolume; public static GameObject SuikaVisuals; public static AudioClip SuikaTheme; public static AudioClip[] SuikaAudios = (AudioClip[])(object)new AudioClip[4]; internal static ConfigEntry<bool> EnableForestGiantReplace; internal static ConfigEntry<bool> EnableSuikaTheme; internal static ConfigEntry<float> SuikaThemeVolume; internal static ConfigEntry<bool> EnableSuikaVoice; internal static ConfigEntry<float> SuikaVoiceVolume; public static GameObject MarisaVisuals; public static GameObject BugVisuals; public static AudioClip MarisaTheme; public static AudioClip[] MarisaAudios = (AudioClip[])(object)new AudioClip[8]; public static AudioClip[] BugAudios = (AudioClip[])(object)new AudioClip[6]; internal static ConfigEntry<bool> EnableHoarderBugReplace; internal static ConfigEntry<int> BugSpawnRate; internal static ConfigEntry<bool> EnableMarisaTheme; internal static ConfigEntry<float> MarisaSFXVolume; internal static ConfigEntry<bool> EnableMarisaVoice; internal static ConfigEntry<bool> EnableBugVoice; internal static ConfigEntry<float> MarisaVoiceVolume; public static GameObject UtsuhoVisuals; public static GameObject UtsuhoNestSpawnVisuals; public static AudioClip UtsuhoTheme; internal static ConfigEntry<bool> EnableRadMechReplace; internal static ConfigEntry<bool> EnableUtsuhoTheme; internal static ConfigEntry<float> UtsuhoSFXVolume; public static GameObject YuyukoVisuals; public static AudioClip YuyukoTheme; internal static ConfigEntry<bool> EnableSandWormReplace; internal static ConfigEntry<bool> EnableYuyukoTheme; internal static ConfigEntry<float> YuyukoSFXVolume; private void Awake() { Instance = this; ((BaseUnityPlugin)this).Logger.LogInfo((object)" ______ ____ __ __ __ __ ____ __ __"); ((BaseUnityPlugin)this).Logger.LogInfo((object)" /_ __// __ \\ / / / // / / // __ \\ / / / /"); ((BaseUnityPlugin)this).Logger.LogInfo((object)" / / / / / // / / // /_/ // / / // / / / "); ((BaseUnityPlugin)this).Logger.LogInfo((object)" / / / /_/ // /_/ // __ // /_/ // /_/ / "); ((BaseUnityPlugin)this).Logger.LogInfo((object)"/_/ \\____/ \\____//_/ /_/ \\____/ \\____/ "); ((BaseUnityPlugin)this).Logger.LogInfo((object)""); EnableDeathAudio = ((BaseUnityPlugin)this).Config.Bind<bool>("0.General", "EnableDeathAudio", false, "Play a death audio when an enemy is killed."); DeathAudioVolume = ((BaseUnityPlugin)this).Config.Bind<float>("0.General", "DeathAudioVolume(0.0-1.0)", 0.5f, "Config the volume of the death audio."); EnableCoilHeadReplace = ((BaseUnityPlugin)this).Config.Bind<bool>("1.CoilHead", "EnableCoilHead", true, "Replace the model of Coil-Head to Sekibanki."); EnableBodyCoilReplace = ((BaseUnityPlugin)this).Config.Bind<bool>("1.CoilHead", "EnableDeadBodyCoil", true, "Replace the coil on the dead body to a head of Sekibanki."); EnableSekibankiTheme = ((BaseUnityPlugin)this).Config.Bind<bool>("1.CoilHead", "EnableSekibankiTheme", true, "Replace the step audio to Sekibanki's theme music."); SekibankiSFXVolume = ((BaseUnityPlugin)this).Config.Bind<float>("1.CoilHead", "SekibankiSoundVolume(0.0-1.0)", 0.5f, "Config the volume of Sekibanki's sound effect including the theme music."); EnableNutcrackerReplace = ((BaseUnityPlugin)this).Config.Bind<bool>("2.Nutcracker", "EnableNutcracker", true, "Replace the model of Nutcracker to NutSatori."); EnableSatoriTheme = ((BaseUnityPlugin)this).Config.Bind<bool>("2.Nutcracker", "EnableSatoriTheme", true, "Replace the angry audio to Satori's theme music."); SatoriSFXVolume = ((BaseUnityPlugin)this).Config.Bind<float>("2.Nutcracker", "SatoriSoundVolume(0.0-1.0)", 0.5f, "** THIS NOT WORK! ** Config the volume of Satori's sound effect including the theme music."); EnableForestGiantReplace = ((BaseUnityPlugin)this).Config.Bind<bool>("3.ForestGiant", "EnableForestGiant", true, "Replace the model of ForestGiant to SuikaGiant."); EnableSuikaTheme = ((BaseUnityPlugin)this).Config.Bind<bool>("3.ForestGiant", "EnableSuikaTheme", true, "Play Suika's theme music."); SuikaThemeVolume = ((BaseUnityPlugin)this).Config.Bind<float>("3.ForestGiant", "SuikaThemeVolume(0.0-1.0)", 0.5f, "Config the volume of Suika's theme music."); EnableSuikaVoice = ((BaseUnityPlugin)this).Config.Bind<bool>("3.ForestGiant", "EnableSuikaVoice", true, "Suika has something to say."); SuikaVoiceVolume = ((BaseUnityPlugin)this).Config.Bind<float>("3.ForestGiant", "SuikaVoiceVolume(0.0-1.0)", 1f, "Config the volume of Suika's voice."); EnableHoarderBugReplace = ((BaseUnityPlugin)this).Config.Bind<bool>("4.HoarderBug", "EnableHoarderBug", true, "Replace the model of HoarderBug to HoarderMarisa."); BugSpawnRate = ((BaseUnityPlugin)this).Config.Bind<int>("4.HoarderBug", "BugSpawnRate(0-10)", 5, "How likely Marisa will be spawn as a bug. HoarderMarisa(0) -> KirisameBug(10) No Sync!"); EnableMarisaTheme = ((BaseUnityPlugin)this).Config.Bind<bool>("4.HoarderBug", "EnableMarisaTheme", true, "Play Marisa's theme music. Not for the bug."); MarisaSFXVolume = ((BaseUnityPlugin)this).Config.Bind<float>("4.HoarderBug", "MarisaSoundVolume(0.0-1.0)", 0.5f, "Config the volume of Marisa's sound effect including the theme music."); EnableMarisaVoice = ((BaseUnityPlugin)this).Config.Bind<bool>("4.HoarderBug", "EnableMarisaVoice", true, "Marisa has something to say."); EnableBugVoice = ((BaseUnityPlugin)this).Config.Bind<bool>("4.HoarderBug", "EnableBugVoice", true, "It sounds like a Zerg Queen, but only for the bug."); MarisaVoiceVolume = ((BaseUnityPlugin)this).Config.Bind<float>("4.HoarderBug", "MarisaVoiceVolume(0.0-1.0)", 1f, "Config the volume of Marisa's voice."); EnableRadMechReplace = ((BaseUnityPlugin)this).Config.Bind<bool>("5.RadMech", "EnableRadMech", true, "Replace the model of RadMech to UtsuhoMech."); EnableUtsuhoTheme = ((BaseUnityPlugin)this).Config.Bind<bool>("5.RadMech", "EnableUtsuhoTheme", true, "Play Utsuho's theme music."); UtsuhoSFXVolume = ((BaseUnityPlugin)this).Config.Bind<float>("5.RadMech", "UtsuhoSoundVolume(0.0-1.0)", 0.5f, "** THIS NOT WORK! ** Config the volume of Utsuho's sound effect including the theme music."); EnableSandWormReplace = ((BaseUnityPlugin)this).Config.Bind<bool>("6.SandWorm", "EnableSandWorm", true, "Replace the model of SandWorm to Yuyuko."); EnableYuyukoTheme = ((BaseUnityPlugin)this).Config.Bind<bool>("6.SandWorm", "EnableYuyukoTheme", true, "Play Yuyuko's theme music."); YuyukoSFXVolume = ((BaseUnityPlugin)this).Config.Bind<float>("6.SandWorm", "YuyukoSoundVolume(0.0-1.0)", 0.5f, "Config the volume of Yuyuko's sound effect including the theme music."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Patching all functions."); MoreCounterplayGood = Chainloader.PluginInfos.ContainsKey("BaronDrakula.MoreCounterplay"); Instance.AddLog($"MoreCounterplay = {MoreCounterplayGood}"); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"All systems ready, begin loading assets."); try { string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); if (directoryName == null) { return; } string text = Path.Combine(directoryName, "touhouenemies"); AssetBundle val = AssetBundle.LoadFromFile(text); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Loading asset bundle."); if ((Object)(object)val == (Object)null) { return; } if (EnableDeathAudio.Value) { LostAudio = val.LoadAsset<AudioClip>("se_pldead00.mp3"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Load death audio."); } List<Renderer> list = new List<Renderer>(); if (EnableCoilHeadReplace.Value) { SekiVisuals = val.LoadAsset<GameObject>("Sekibanki.prefab"); list.AddRange(SekiVisuals.GetComponentsInChildren<Renderer>(true).ToList()); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load Sekibanki: {(Object)(object)SekiVisuals != (Object)null}"); if (EnableSekibankiTheme.Value) { SekibankiTheme = val.LoadAsset<AudioClip>("SekibankiTheme.mp3"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load SekibankiTheme: {(Object)(object)SekibankiTheme != (Object)null}"); } if (EnableBodyCoilReplace.Value) { SekiHeadVisuals = val.LoadAsset<GameObject>("SekibankiHead.prefab"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load SekibankiHead: {(Object)(object)SekiHeadVisuals != (Object)null}"); } } if (EnableNutcrackerReplace.Value) { SatoriVisuals = val.LoadAsset<GameObject>("NutSatori.prefab"); list.AddRange(SatoriVisuals.GetComponentsInChildren<Renderer>(true).ToList()); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load NutSatori: {(Object)(object)SatoriVisuals != (Object)null}"); if (EnableSatoriTheme.Value) { SatoriTheme = val.LoadAsset<AudioClip>("SatoriTheme.mp3"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load SatoriTheme: {(Object)(object)SatoriTheme != (Object)null}"); } } if (EnableForestGiantReplace.Value) { SuikaVisuals = val.LoadAsset<GameObject>("SuikaGiant.prefab"); list.AddRange(SuikaVisuals.GetComponentsInChildren<Renderer>(true).ToList()); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load SuikaGiant: {(Object)(object)SuikaVisuals != (Object)null}"); if (EnableSuikaTheme.Value) { SuikaTheme = val.LoadAsset<AudioClip>("SuikaTheme.mp3"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load SuikaTheme: {(Object)(object)SuikaTheme != (Object)null}"); } if (EnableSuikaVoice.Value) { SuikaAudios[0] = val.LoadAsset<AudioClip>("SuikaAngry.ogg"); SuikaAudios[1] = val.LoadAsset<AudioClip>("SuikaLost.ogg"); SuikaAudios[2] = val.LoadAsset<AudioClip>("SuikaHappy.ogg"); SuikaAudios[3] = val.LoadAsset<AudioClip>("SuikaWarn.ogg"); ((BaseUnityPlugin)this).Logger.LogInfo((object)($"Load SuikaAudio: 0: {(Object)(object)SuikaAudios[0] != (Object)null}, " + $"1: {(Object)(object)SuikaAudios[1] != (Object)null}, 2: {(Object)(object)SuikaAudios[2] != (Object)null}, 3: {(Object)(object)SuikaAudios[3] != (Object)null}")); } } if (EnableHoarderBugReplace.Value) { MarisaVisuals = val.LoadAsset<GameObject>("HoarderMarisa.prefab"); BugVisuals = val.LoadAsset<GameObject>("KirisameBug.prefab"); list.AddRange(MarisaVisuals.GetComponentsInChildren<Renderer>(true).ToList()); list.AddRange(BugVisuals.GetComponentsInChildren<Renderer>(true).ToList()); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load HoarderMarisa: {(Object)(object)MarisaVisuals != (Object)null}"); if (EnableMarisaTheme.Value) { MarisaTheme = val.LoadAsset<AudioClip>("MarisaTheme.mp3"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load MarisaTheme: {(Object)(object)MarisaTheme != (Object)null}"); } if (EnableMarisaVoice.Value) { MarisaAudios[0] = val.LoadAsset<AudioClip>("MarisaAngry.ogg"); MarisaAudios[1] = val.LoadAsset<AudioClip>("MarisaAttack.ogg"); MarisaAudios[2] = val.LoadAsset<AudioClip>("MarisaLost.ogg"); MarisaAudios[3] = val.LoadAsset<AudioClip>("MarisaGreeting.ogg"); MarisaAudios[4] = val.LoadAsset<AudioClip>("MarisaHappy.ogg"); MarisaAudios[5] = val.LoadAsset<AudioClip>("MarisaHurt.ogg"); MarisaAudios[6] = val.LoadAsset<AudioClip>("MarisaMove.ogg"); MarisaAudios[7] = val.LoadAsset<AudioClip>("MarisaWarn.ogg"); ((BaseUnityPlugin)this).Logger.LogInfo((object)($"Load MarisaAudio: 0: {(Object)(object)MarisaAudios[0] != (Object)null}, " + $"1: {(Object)(object)MarisaAudios[1] != (Object)null}, 2: {(Object)(object)MarisaAudios[2] != (Object)null}, " + $"3: {(Object)(object)MarisaAudios[3] != (Object)null}, 4: {(Object)(object)MarisaAudios[4] != (Object)null}, " + $"5: {(Object)(object)MarisaAudios[5] != (Object)null}, 6: {(Object)(object)MarisaAudios[6] != (Object)null}, " + $"7: {(Object)(object)MarisaAudios[7] != (Object)null}")); } if (EnableBugVoice.Value) { BugAudios[0] = val.LoadAsset<AudioClip>("BugAngry.ogg"); BugAudios[1] = val.LoadAsset<AudioClip>("BugAttack.ogg"); BugAudios[2] = val.LoadAsset<AudioClip>("BugLost.ogg"); BugAudios[3] = val.LoadAsset<AudioClip>("BugGreeting.ogg"); BugAudios[4] = val.LoadAsset<AudioClip>("BugHappy.ogg"); BugAudios[5] = val.LoadAsset<AudioClip>("BugWarn.ogg"); ((BaseUnityPlugin)this).Logger.LogInfo((object)($"Load MarisaAudio: 0: {(Object)(object)BugAudios[0] != (Object)null}, " + $"1: {(Object)(object)BugAudios[1] != (Object)null}, 2: {(Object)(object)BugAudios[2] != (Object)null}, " + $"3: {(Object)(object)BugAudios[3] != (Object)null}, 4: {(Object)(object)BugAudios[4] != (Object)null}, " + $"5: {(Object)(object)BugAudios[5] != (Object)null}")); } } if (EnableRadMechReplace.Value) { UtsuhoVisuals = val.LoadAsset<GameObject>("UtsuhoMech.prefab"); UtsuhoNestSpawnVisuals = val.LoadAsset<GameObject>("UtsuhoMechNestSpawnObject.prefab"); list.AddRange(UtsuhoVisuals.GetComponentsInChildren<Renderer>(true).ToList()); list.AddRange(UtsuhoNestSpawnVisuals.GetComponentsInChildren<Renderer>(true).ToList()); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load UtsuhoMech: {(Object)(object)UtsuhoVisuals != (Object)null}, NestSpawnObject: {(Object)(object)UtsuhoNestSpawnVisuals != (Object)null}"); if (EnableUtsuhoTheme.Value) { UtsuhoTheme = val.LoadAsset<AudioClip>("UtsuhoTheme.mp3"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load UtsuhoTheme: {(Object)(object)UtsuhoTheme != (Object)null}"); } } if (EnableSandWormReplace.Value) { YuyukoVisuals = val.LoadAsset<GameObject>("EaterYuyuko.prefab"); list.AddRange(YuyukoVisuals.GetComponentsInChildren<Renderer>(true).ToList()); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load EaterYuyuko: {(Object)(object)YuyukoVisuals != (Object)null}"); if (EnableYuyukoTheme.Value) { YuyukoTheme = val.LoadAsset<AudioClip>("YuyukoTheme.mp3"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Load YuyukoTheme: {(Object)(object)YuyukoTheme != (Object)null}"); } } foreach (Renderer item in list) { ((Component)item).gameObject.layer = LayerMask.NameToLayer("Enemies"); } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load assetbundle: " + ex.Message)); } } private void Start() { try { if ((Object)(object)SuikaAudios[1] != (Object)null) { SoundTool.ReplaceAudioClip("StunGiant", SuikaAudios[1]); } if ((Object)(object)SuikaAudios[3] != (Object)null) { SoundTool.ReplaceAudioClip("FGiantEatPlayerSFX", SuikaAudios[3]); } SoundToolGood = true; ((BaseUnityPlugin)this).Logger.LogInfo((object)"SoundTool is good."); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("SoundTool not good." + ex.Message)); } } public void AddLog(string info) { ((BaseUnityPlugin)this).Logger.LogInfo((object)info); } } public static class PluginInfo { public const string PLUGIN_GUID = "TouhouEnemyModels"; public const string PLUGIN_NAME = "TouhouEnemyModels"; public const string PLUGIN_VERSION = "1.0.0"; } }