using 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";
}
}