using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Audio; using UnityEngine.Networking; using Xuaun.RepoMonstersCosmetics.Behaviours; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Xuaun.RepoMonstersCosmetics")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Comportamentos dos cosméticos de monstro: bomba (cresce/encolhe) e bexiga (explode após hits e volta depois de um tempo).")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Repo Monsters Cosmetics Behaviour")] [assembly: AssemblyTitle("Xuaun.RepoMonstersCosmetics")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 RepoMonstersCosmetics { public static class MyPluginInfo { public const string PLUGIN_GUID = "Xuaun.RepoMonstersCosmetics"; public const string PLUGIN_NAME = "Repo Monsters Cosmetics Behaviour"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace Xuaun.RepoMonstersCosmetics { internal static class Config { public static readonly string[] BombAssetIds = new string[2] { "repomonsterscosmetics:btbangbomb", "repomonsterscosmetics:bbbangdynamite" }; public static readonly string[] BalloonAssetIds = new string[1] { "repomonsterscosmetics:btbirthdayboyballoon" }; public static readonly string[] BombAssetNames = new string[2] { "Banger - bomb", "Banger - dynamite" }; public static readonly string[] BalloonAssetNames = new string[1] { "Birthday Boy - balloon" }; public static ConfigEntry Enabled; public static ConfigEntry Debug; public static ConfigEntry BombPulseSpeed; public static ConfigEntry BombPulseAmount; public static ConfigEntry BalloonHitsToPop; public static ConfigEntry BalloonDamageToPop; public static ConfigEntry BalloonRespawnTime; public static ConfigEntry BalloonReinflateTime; public static ConfigEntry BalloonPopParticles; public static readonly string[] SoundBalloonPop = new string[3] { "balloon_pop1.ogg", "balloon_pop2.ogg", "balloon_pop3.ogg" }; public static void Init(ConfigFile cfg) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Expected O, but got Unknown //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Expected O, but got Unknown //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Expected O, but got Unknown //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Expected O, but got Unknown //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Expected O, but got Unknown Enabled = cfg.Bind("General", "BehavioursEnabled", true, "Master switch for all monster-cosmetic behaviours."); Debug = cfg.Bind("General", "Debug", false, "Log events to the console (verbose). Keep off for normal play."); BombPulseSpeed = cfg.Bind("Bomb & Dynamite", "PulseSpeed", 0.6f, new ConfigDescription("Breathing frequency in cycles per second (not a duration). Lower = slower.", (AcceptableValueBase)(object)new AcceptableValueRange(0.05f, 4f), Array.Empty())); BombPulseAmount = cfg.Bind("Bomb & Dynamite", "PulseStrength", 0.1f, new ConfigDescription("Breathing size change as a ratio (0.10 = grows/shrinks ±10%).", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 0.5f), Array.Empty())); BalloonHitsToPop = cfg.Bind("Balloon", "HitsToPop", 3, new ConfigDescription("Pops when reaching this number of hits (0 = ignore hits, damage only).", (AcceptableValueBase)(object)new AcceptableValueRange(0, 20), Array.Empty())); BalloonDamageToPop = cfg.Bind("Balloon", "DamageToPop", 60, new ConfigDescription("Pops when reaching this total accumulated damage (0 = ignore damage, hits only). Hits and damage work together: whichever is reached first pops the balloon.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 500), Array.Empty())); BalloonRespawnTime = cfg.Bind("Balloon", "RespawnSeconds", 8f, new ConfigDescription("Seconds until the balloon comes back after popping.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 60f), Array.Empty())); BalloonReinflateTime = cfg.Bind("Balloon", "ReinflateSeconds", 0.6f, new ConfigDescription("Duration in seconds of the inflate animation when it returns.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 5f), Array.Empty())); BalloonPopParticles = cfg.Bind("Balloon", "PopParticles", true, new ConfigDescription("Spawn a colored particle burst when the balloon pops (matches the balloon color).", (AcceptableValueBase)null, Array.Empty())); } } internal static class CosmeticUtil { public static bool IsAnyTarget(Cosmetic cosmetic, string[] assetIds, string[] assetNames) { CosmeticAsset val = cosmetic?.cosmeticAsset; if ((Object)(object)val == (Object)null) { return false; } if (!ContainsExact(assetIds, val.assetId) && !ContainsExact(assetNames, val.assetName)) { return ContainsExact(assetNames, ((Object)val).name); } return true; } private static bool ContainsExact(string[] values, string value) { if (values == null || string.IsNullOrWhiteSpace(value)) { return false; } for (int i = 0; i < values.Length; i++) { if (string.Equals(values[i], value, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } } [BepInPlugin("com.xuaun.monstercosmetics", "MonsterCosmetics", "1.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { private class Runner : MonoBehaviour { } public const string Guid = "com.xuaun.monstercosmetics"; public const string Name = "MonsterCosmetics"; public const string Version = "1.1.0"; internal static ManualLogSource Log; private void Awake() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; Config.Init(((BaseUnityPlugin)this).Config); GameObject val = new GameObject("RepoMonstersCosmetics_Runner"); Object.DontDestroyOnLoad((Object)val); ((Object)val).hideFlags = (HideFlags)61; Runner runner = val.AddComponent(); SoundManager.Init(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), (MonoBehaviour)(object)runner); new Harmony("com.xuaun.monstercosmetics").PatchAll(Assembly.GetExecutingAssembly()); Log.LogInfo((object)string.Format("{0} {1} loaded. Bomb/dynamite={2} IDs, balloon={3} ID", "MonsterCosmetics", "1.1.0", Config.BombAssetIds.Length, Config.BalloonAssetIds.Length)); } } internal static class PopParticle { private static Shader _shader; private static bool _shaderResolved; public static void Spawn(Vector3 position, Color color) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: 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_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Expected O, but got Unknown //IL_0161: 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) if (!Config.BalloonPopParticles.Value) { return; } Shader val = ResolveShader(); if ((Object)(object)val == (Object)null) { if (Config.Debug.Value) { Plugin.Log.LogWarning((object)"PopParticle: no usable particle shader found, skipping burst."); } return; } GameObject val2 = new GameObject("BalloonPopParticle"); val2.transform.position = position; ParticleSystem val3 = val2.AddComponent(); val3.Stop(true, (ParticleSystemStopBehavior)0); MainModule main = val3.main; ((MainModule)(ref main)).loop = false; ((MainModule)(ref main)).playOnAwake = false; ((MainModule)(ref main)).duration = 1f; ((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.6f); ((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(3f); ((MainModule)(ref main)).startSize = MinMaxCurve.op_Implicit(0.06f); ((MainModule)(ref main)).gravityModifier = MinMaxCurve.op_Implicit(1.2f); ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(color); ((MainModule)(ref main)).maxParticles = 100; ((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1; EmissionModule emission = val3.emission; ((EmissionModule)(ref emission)).enabled = false; ShapeModule shape = val3.shape; ((ShapeModule)(ref shape)).enabled = true; ((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)0; ((ShapeModule)(ref shape)).radius = 0.08f; ParticleSystemRenderer component = val2.GetComponent(); component.renderMode = (ParticleSystemRenderMode)0; Material val4 = new Material(val); SetMaterialColor(val4, color); ((Renderer)component).material = val4; val3.Emit(30); Object.Destroy((Object)val2, 0.90000004f); if (Config.Debug.Value) { Plugin.Log.LogInfo((object)$"PopParticle: burst at {position} color {color}"); } } private static Shader ResolveShader() { if (_shaderResolved) { return _shader; } _shaderResolved = true; string[] array = new string[5] { "Particles/Standard Unlit", "Universal Render Pipeline/Particles/Unlit", "Sprites/Default", "Legacy Shaders/Particles/Alpha Blended Premultiply", "Particles/Additive" }; for (int i = 0; i < array.Length; i++) { Shader val = Shader.Find(array[i]); if ((Object)(object)val != (Object)null) { _shader = val; break; } } return _shader; } private static void SetMaterialColor(Material mat, Color color) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) if (mat.HasProperty("_BaseColor")) { mat.SetColor("_BaseColor", color); } if (mat.HasProperty("_Color")) { mat.SetColor("_Color", color); } if (mat.HasProperty("_TintColor")) { mat.SetColor("_TintColor", color); } mat.color = color; } } internal static class SoundManager { private static readonly Dictionary _clips = new Dictionary(); private static string _soundsDir; private static MonoBehaviour _runner; public static void Init(string pluginDir, MonoBehaviour runner) { _soundsDir = Path.Combine(pluginDir, "sounds"); _runner = runner; if (Config.SoundBalloonPop != null) { string[] soundBalloonPop = Config.SoundBalloonPop; for (int i = 0; i < soundBalloonPop.Length; i++) { Preload(soundBalloonPop[i]); } } } private static AudioType TypeFor(string fileName) { if (fileName.EndsWith(".ogg", StringComparison.OrdinalIgnoreCase)) { return (AudioType)14; } return (AudioType)20; } private static void Preload(string fileName) { if (!string.IsNullOrEmpty(fileName) && !_clips.ContainsKey(fileName)) { _runner.StartCoroutine(LoadClip(fileName)); } } private static IEnumerator LoadClip(string fileName) { string text = Path.Combine(_soundsDir, fileName); if (!File.Exists(text)) { Plugin.Log.LogWarning((object)("Sound file not found: " + text)); yield break; } string absoluteUri = new Uri(text).AbsoluteUri; UnityWebRequest req = UnityWebRequestMultimedia.GetAudioClip(absoluteUri, TypeFor(fileName)); try { yield return req.SendWebRequest(); if ((int)req.result != 1) { Plugin.Log.LogWarning((object)("Failed to load " + fileName + ": " + req.error)); yield break; } AudioClip content = DownloadHandlerAudioClip.GetContent(req); if ((Object)(object)content != (Object)null && content.length > 0f) { ((Object)content).name = fileName; _clips[fileName] = content; if (Config.Debug.Value) { Plugin.Log.LogInfo((object)$"Loaded sound: {fileName} ({content.length:0.00}s)"); } } else { Plugin.Log.LogWarning((object)("Empty/invalid clip: " + fileName)); } } finally { ((IDisposable)req)?.Dispose(); } } public static void PlayAt(string fileName, Vector3 position) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrEmpty(fileName)) { return; } if (!_clips.TryGetValue(fileName, out var value) || (Object)(object)value == (Object)null) { Plugin.Log.LogWarning((object)("Sound requested but not loaded: " + fileName)); return; } GameObject val = new GameObject("MonsterCosmeticSound"); val.transform.position = position; AudioSource val2 = val.AddComponent(); val2.clip = value; val2.spatialBlend = 1f; val2.minDistance = 1f; val2.maxDistance = 25f; val2.rolloffMode = (AudioRolloffMode)1; AudioMixerGroup val3 = (((Object)(object)AudioManager.instance != (Object)null) ? AudioManager.instance.SoundMasterGroup : null); if ((Object)(object)val3 != (Object)null) { val2.outputAudioMixerGroup = val3; } val2.Play(); if (Config.Debug.Value) { Plugin.Log.LogInfo((object)$"Playing monster cosmetic sound: {fileName} at {position}"); } Object.Destroy((Object)val, value.length + 0.2f); } public static void PlayRandomAt(string[] fileNames, Vector3 position) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (fileNames != null && fileNames.Length != 0) { PlayAt((fileNames.Length == 1) ? fileNames[0] : fileNames[Random.Range(0, fileNames.Length)], position); } } } } namespace Xuaun.RepoMonstersCosmetics.Patches { [HarmonyPatch(typeof(PlayerCosmetics))] internal static class ColorMirrorPatch { [HarmonyPostfix] [HarmonyPatch("SetupColorsLogic")] private static void AfterColorsLogic(PlayerCosmetics __instance) { Activate(__instance); } [HarmonyPostfix] [HarmonyPatch("SetupColorsAllLogic")] private static void AfterColorsAll(PlayerCosmetics __instance) { Activate(__instance); } private static void Activate(PlayerCosmetics cosmetics) { if (!((Object)(object)cosmetics == (Object)null)) { BalloonColorMirror[] componentsInChildren = (((Object)(object)cosmetics.playerAvatarVisuals != (Object)null) ? ((Component)cosmetics.playerAvatarVisuals).gameObject : ((Component)cosmetics).gameObject).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].Activate(); } } } } [HarmonyPatch(typeof(Cosmetic), "Setup")] internal static class CosmeticSetupPatch { [HarmonyPostfix] private static void Postfix(Cosmetic __instance) { if ((Object)(object)__instance == (Object)null || __instance.iconCreation || __instance.iconCreationAvatar) { return; } bool num = CosmeticUtil.IsAnyTarget(__instance, Config.BombAssetIds, Config.BombAssetNames); bool flag = CosmeticUtil.IsAnyTarget(__instance, Config.BalloonAssetIds, Config.BalloonAssetNames); if (num && (Object)(object)((Component)__instance).GetComponent() == (Object)null) { LogTarget("bomb/dynamite", __instance); ((Component)__instance).gameObject.AddComponent(); } if (flag) { if ((Object)(object)((Component)__instance).GetComponent() == (Object)null) { LogTarget("balloon", __instance); ((Component)__instance).gameObject.AddComponent(); } if ((Object)(object)((Component)__instance).GetComponent() == (Object)null) { ((Component)__instance).gameObject.AddComponent(); } } } private static void LogTarget(string kind, Cosmetic cosmetic) { if (Config.Debug.Value) { CosmeticAsset cosmeticAsset = cosmetic.cosmeticAsset; Plugin.Log.LogInfo((object)("Behaviour attached (" + kind + ") on '" + ((Object)((Component)cosmetic).gameObject).name + "' (assetId='" + cosmeticAsset.assetId + "', assetName='" + cosmeticAsset.assetName + "', name='" + ((Object)cosmeticAsset).name + "')")); } } } [HarmonyPatch(typeof(PlayerHealth), "Hurt")] internal static class HurtPatch { [HarmonyPostfix] private static void Postfix(PlayerHealth __instance, int damage) { if (!((Object)(object)__instance == (Object)null) && damage > 0) { PlayerAvatar val = __instance.playerAvatar; if ((Object)(object)val == (Object)null) { val = ((Component)__instance).GetComponent(); } if ((Object)(object)val == (Object)null) { val = PlayerAvatar.instance; } BalloonRouter.RouteDamage(val, damage); } } } internal static class BalloonRouter { public static void RouteDamage(PlayerAvatar avatar, int damage) { if (!((Object)(object)avatar == (Object)null) && damage > 0) { BalloonPop[] array = null; if ((Object)(object)avatar.playerAvatarVisuals != (Object)null) { array = ((Component)avatar.playerAvatarVisuals).GetComponentsInChildren(true); } if (array == null || array.Length == 0) { array = ((Component)avatar).GetComponentsInChildren(true); } BalloonPop[] array2 = array; for (int i = 0; i < array2.Length; i++) { array2[i].RegisterDamage(damage); } } } } [HarmonyPatch(typeof(PlayerHealth), "UpdateHealthRPC")] internal static class HurtRemotePatch { [HarmonyPrefix] private static void Prefix(PlayerHealth __instance, out int __state) { __state = (((Object)(object)__instance != (Object)null) ? __instance.health : 0); } [HarmonyPostfix] private static void Postfix(PlayerHealth __instance, int healthNew, bool effect, int __state) { if ((Object)(object)__instance == (Object)null || !effect || __instance.health != healthNew) { return; } int num = __state - healthNew; if (num > 0) { PlayerAvatar val = __instance.playerAvatar; if ((Object)(object)val == (Object)null) { val = ((Component)__instance).GetComponent(); } BalloonRouter.RouteDamage(val, num); } } } } namespace Xuaun.RepoMonstersCosmetics.Behaviours { public class BalloonColorMirror : MonoBehaviour { private static readonly int AlbedoId = Shader.PropertyToID("_AlbedoColor"); private static readonly int ColorId = Shader.PropertyToID("_Color"); private static readonly int EmissionId = Shader.PropertyToID("_EmissionColor"); private Material _source; private readonly List _targets = new List(); private bool _active; private void Start() { Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); foreach (Renderer val in componentsInChildren) { Material val2 = (((Object)(object)val != (Object)null) ? val.material : null); if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val2.shader == (Object)null)) { if (((Object)val2.shader).name.Contains("Hurtable")) { _source = val2; } else { _targets.Add(val2); } } } } public void Activate() { _active = true; Mirror(); } private void LateUpdate() { if (_active) { Mirror(); } } private void Mirror() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_source == (Object)null) { return; } Color color = _source.GetColor(AlbedoId); Color val = default(Color); ((Color)(ref val))..ctor(color.r, color.g, color.b, 1f); foreach (Material target in _targets) { if (!((Object)(object)target == (Object)null)) { target.SetColor(ColorId, val); target.SetColor(EmissionId, val * 0.28f); } } } } public class BalloonPop : MonoBehaviour { private readonly List _renderers = new List(); private readonly List _meshTransforms = new List(); private readonly List _baseScales = new List(); private int _hits; private int _accumulatedDamage; private bool _popped; private void Start() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); foreach (Renderer item in componentsInChildren) { _renderers.Add(item); } MeshFilter[] componentsInChildren2 = ((Component)this).GetComponentsInChildren(true); foreach (MeshFilter val in componentsInChildren2) { _meshTransforms.Add(((Component)val).transform); _baseScales.Add(((Component)val).transform.localScale); } } public void RegisterDamage(int damage) { if (!_popped && Config.Enabled.Value && damage > 0) { _hits++; _accumulatedDamage += damage; int value = Config.BalloonHitsToPop.Value; int value2 = Config.BalloonDamageToPop.Value; bool num = value > 0 && _hits >= value; bool flag = value2 > 0 && _accumulatedDamage >= value2; if (num || flag) { Pop(); } } } private void Pop() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) _popped = true; Vector3 val = ((_meshTransforms.Count > 0 && (Object)(object)_meshTransforms[0] != (Object)null) ? _meshTransforms[0].position : ((Component)this).transform.position); if (Config.Debug.Value) { Plugin.Log.LogInfo((object)$"BalloonPop: popping balloon at {val} (hits={_hits}, damage={_accumulatedDamage})"); } SoundManager.PlayRandomAt(Config.SoundBalloonPop, val); PopParticle.Spawn(val, ReadBalloonColor()); SetVisible(visible: false); ((MonoBehaviour)this).StartCoroutine(RespawnRoutine()); } private IEnumerator RespawnRoutine() { yield return (object)new WaitForSeconds(Config.BalloonRespawnTime.Value); SetVisible(visible: true); float reinflate = Mathf.Max(0.0001f, Config.BalloonReinflateTime.Value); float t = 0f; while (t < reinflate) { t += Time.deltaTime; float num = Mathf.Clamp01(t / reinflate); for (int i = 0; i < _meshTransforms.Count; i++) { if ((Object)(object)_meshTransforms[i] != (Object)null) { _meshTransforms[i].localScale = _baseScales[i] * num; } } yield return null; } for (int j = 0; j < _meshTransforms.Count; j++) { if ((Object)(object)_meshTransforms[j] != (Object)null) { _meshTransforms[j].localScale = _baseScales[j]; } } _hits = 0; _accumulatedDamage = 0; _popped = false; } private void SetVisible(bool visible) { foreach (Renderer renderer in _renderers) { if ((Object)(object)renderer != (Object)null) { renderer.enabled = visible; } } } private Color ReadBalloonColor() { //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) foreach (Renderer renderer in _renderers) { Material val = (((Object)(object)renderer != (Object)null) ? renderer.material : null); if (!((Object)(object)val == (Object)null) && !((Object)(object)val.shader == (Object)null) && !((Object)val.shader).name.Contains("Hurtable") && val.HasProperty("_Color")) { Color color = val.GetColor("_Color"); return new Color(color.r, color.g, color.b, 1f); } } return Color.white; } } public class BombPulse : MonoBehaviour { private readonly List _t = new List(); private readonly List _basePos = new List(); private readonly List _baseScale = new List(); private Vector3 _centroid; private float _phase; private bool _ready; private IEnumerator Start() { yield return (object)new WaitForSeconds(0.6f); MeshRenderer[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); foreach (MeshRenderer val in componentsInChildren) { _t.Add(((Component)val).transform); _basePos.Add(((Component)val).transform.localPosition); _baseScale.Add(((Component)val).transform.localScale); } if (_t.Count == 0) { yield break; } Vector3 val2 = Vector3.zero; foreach (Vector3 basePo in _basePos) { val2 += basePo; } _centroid = val2 / (float)_basePos.Count; _phase = Random.Range(0f, MathF.PI * 2f); _ready = true; } private void Update() { //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) if (!_ready || !Config.Enabled.Value) { return; } float num = 1f + Mathf.Sin(Time.time * Config.BombPulseSpeed.Value * MathF.PI * 2f + _phase) * Config.BombPulseAmount.Value; for (int i = 0; i < _t.Count; i++) { if (!((Object)(object)_t[i] == (Object)null)) { _t[i].localScale = _baseScale[i] * num; _t[i].localPosition = _centroid + (_basePos[i] - _centroid) * num; } } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }