using System.Collections.Generic; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using UnityEngine; [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyVersion("0.0.0.0")] namespace MikuTetoSkulls; [BepInPlugin("com.Only1Wolf.mikutetoskulls", "Miku Teto Skulls", "1.0")] [BepInProcess("ULTRAKILL.exe")] public class Plugin : BaseUnityPlugin { public static AssetBundle skullsBundle; public static GameObject mikuPrefab; public static GameObject tetoPrefab; public static GameObject neruPrefab; public static AudioClip mikuSound; public static AudioClip tetoSound; public static AudioClip neruSound; private float scanTimer = 0f; private void Awake() { ((BaseUnityPlugin)this).Logger.LogWarning((object)"--- INICIANDO MOD VOCALOID ITEMS ---"); string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "mikuteto_skulls"); if (File.Exists(text)) { skullsBundle = AssetBundle.LoadFromFile(text); tetoPrefab = skullsBundle.LoadAsset("TetoSkull"); mikuPrefab = skullsBundle.LoadAsset("MikuSkull"); neruPrefab = skullsBundle.LoadAsset("NeruTorch"); mikuSound = skullsBundle.LoadAsset("Miku_Sound"); tetoSound = skullsBundle.LoadAsset("Teto_Sound"); neruSound = skullsBundle.LoadAsset("Neru_Sound"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"¡AssetBundle cargado exitosamente!"); } else { ((BaseUnityPlugin)this).Logger.LogError((object)("ERROR: No se encontró 'mikuteto_skulls' en: " + text)); } } private void Update() { scanTimer += Time.deltaTime; if (scanTimer >= 1f) { scanTimer = 0f; ProcessItemsInScene(); } } private void ProcessItemsInScene() { //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Invalid comparison between Unknown and I4 //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Invalid comparison between Unknown and I4 //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_02d2: Unknown result type (might be due to invalid IL or missing references) //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) ItemIdentifier[] array = Object.FindObjectsOfType(); ItemIdentifier[] array2 = array; Vector3 customPosition = default(Vector3); Vector3 customRotation = default(Vector3); Vector3 customPosition2 = default(Vector3); Vector3 customRotation2 = default(Vector3); foreach (ItemIdentifier val in array2) { if ((Object)(object)val == (Object)null || (Object)(object)((Component)val).GetComponent() != (Object)null) { continue; } string text = ((Object)((Component)val).gameObject).name.ToLower(); ((Vector3)(ref customPosition))..ctor(-0.2f, 0f, -0.12f); ((Vector3)(ref customRotation))..ctor(0f, 105f, 90f); ((Vector3)(ref customPosition2))..ctor(-0.2f, 0f, -0.15f); ((Vector3)(ref customRotation2))..ctor(0f, 105f, 90f); if ((int)val.itemType == 2 || text.Contains("redskull") || text.Contains("skullred")) { if ((Object)(object)tetoPrefab != (Object)null) { ReplaceAndTrackModel(((Component)val).gameObject, tetoPrefab, customPosition, customRotation, Vector3.one, tetoSound, val); } } else if (((int)val.itemType == 1 || text.Contains("blueskull") || text.Contains("skullblue")) && (Object)(object)mikuPrefab != (Object)null) { ReplaceAndTrackModel(((Component)val).gameObject, mikuPrefab, customPosition2, customRotation2, Vector3.one, mikuSound, val); } } GameObject[] array3 = Object.FindObjectsOfType(); GameObject[] array4 = array3; Vector3 customPosition3 = default(Vector3); Vector3 customRotation3 = default(Vector3); Vector3 customScale = default(Vector3); foreach (GameObject val2 in array4) { if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val2.GetComponent() != (Object)null)) { string text2 = ((Object)val2).name.ToLower(); if (text2.Contains("torch") && !text2.Contains("altar") && !text2.Contains("pedestal") && !text2.Contains("spawner") && !text2.Contains("arm") && !text2.Contains("preview") && !((Object)(object)val2.GetComponent() == (Object)null) && (Object)(object)neruPrefab != (Object)null) { ((Vector3)(ref customPosition3))..ctor(0f, -0.7f, 0f); ((Vector3)(ref customRotation3))..ctor(0f, 90f, 0f); ((Vector3)(ref customScale))..ctor(2.2f, 2.2f, 2.2f); ReplaceAndTrackTorch(val2, neruPrefab, customPosition3, customRotation3, customScale, neruSound); } } } } private void ReplaceAndTrackModel(GameObject rootObject, GameObject newPrefab, Vector3 customPosition, Vector3 customRotation, Vector3 customScale, AudioClip clip, ItemIdentifier itemID) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) List list = new List(); MeshRenderer[] componentsInChildren = rootObject.GetComponentsInChildren(); MeshRenderer[] array = componentsInChildren; foreach (MeshRenderer val in array) { if (((Object)((Component)val).gameObject).name != "CustomModelPlaced") { ((Renderer)val).enabled = false; list.Add(val); } } InstantiateModel(rootObject, newPrefab, customPosition, customRotation, customScale); SoundTracker soundTracker = rootObject.AddComponent(); soundTracker.clip = clip; soundTracker.itemID = itemID; soundTracker.meshesToHide = list.ToArray(); } private void ReplaceAndTrackTorch(GameObject rootObject, GameObject newPrefab, Vector3 customPosition, Vector3 customRotation, Vector3 customScale, AudioClip clip) { //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) List list = new List(); MeshRenderer[] componentsInChildren = rootObject.GetComponentsInChildren(); MeshRenderer[] array = componentsInChildren; foreach (MeshRenderer val in array) { if (((Object)((Component)val).gameObject).name.ToLower().Contains("cylinder")) { ((Renderer)val).enabled = false; list.Add(val); } } InstantiateModel(rootObject, newPrefab, customPosition, customRotation, customScale); SoundTracker soundTracker = rootObject.AddComponent(); soundTracker.clip = clip; soundTracker.meshesToHide = list.ToArray(); } private void InstantiateModel(GameObject rootObject, GameObject newPrefab, Vector3 pos, Vector3 rot, Vector3 scale) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate(newPrefab, rootObject.transform); ((Object)val).name = "CustomModelPlaced"; val.transform.localPosition = pos; val.transform.localRotation = Quaternion.Euler(rot); val.transform.localScale = scale; SetLayerRecursively(val, rootObject.layer); } private void SetLayerRecursively(GameObject obj, int newLayer) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown if ((Object)(object)obj == (Object)null) { return; } obj.layer = newLayer; foreach (Transform item in obj.transform) { Transform val = item; if ((Object)(object)val != (Object)null) { SetLayerRecursively(((Component)val).gameObject, newLayer); } } } } public class SoundTracker : MonoBehaviour { public bool hasPlayed = false; public AudioClip clip; public ItemIdentifier itemID; public MeshRenderer[] meshesToHide; private AudioSource source; private void Update() { if (meshesToHide != null) { for (int i = 0; i < meshesToHide.Length; i++) { if ((Object)(object)meshesToHide[i] != (Object)null && ((Renderer)meshesToHide[i]).enabled) { ((Renderer)meshesToHide[i]).enabled = false; } } } if ((Object)(object)clip != (Object)null) { bool flag = false; flag = ((!((Object)(object)itemID != (Object)null)) ? IsParentHand(((Component)this).transform) : (itemID.pickedUp || IsParentHand(((Component)this).transform))); if (flag && !hasPlayed) { PlaySoundFollow(clip); hasPlayed = true; } else if (!flag) { hasPlayed = false; } } } private bool IsParentHand(Transform t) { if ((Object)(object)t.parent == (Object)null) { return false; } string text = ((Object)t.parent).name.ToLower(); if (text.Contains("canvas") || text.Contains("menu") || text.Contains("ui")) { return false; } return text.Contains("hand") || text.Contains("holder") || text.Contains("player") || text.Contains("arm"); } private void PlaySoundFollow(AudioClip clipToPlay) { if ((Object)(object)source == (Object)null) { source = ((Component)this).gameObject.AddComponent(); source.spatialBlend = 0f; source.playOnAwake = false; AudioSource[] componentsInChildren = ((Component)this).gameObject.GetComponentsInChildren(true); AudioSource[] array = componentsInChildren; foreach (AudioSource val in array) { if ((Object)(object)val != (Object)(object)source && (Object)(object)val.outputAudioMixerGroup != (Object)null) { source.outputAudioMixerGroup = val.outputAudioMixerGroup; break; } } } source.clip = clipToPlay; source.Play(); } }