using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using UnboundLib.Cards; using UnboundLib.GameModes; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("MoonFaceWaterBottle")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("MoonFaceWaterBottle")] [assembly: AssemblyTitle("MoonFaceWaterBottle")] [assembly: AssemblyVersion("1.0.0.0")] namespace MoonFaceWaterBottle; public class DoorDashCard : CustomCard { protected override string GetTitle() { return "DoorDash"; } protected override string GetDescription() { return "On block heal half your missing HP, then stumble: heavy slow + no jumps + chunky gravity until the food coma passes. Food coma stacks time = max(timer left, ⌊ heal ÷ 5 ⌋ seconds capped at five). Blocking again refreshes timing without double-dipping slowdown."; } protected override GameObject GetCardArt() { return null; } protected override Rarity GetRarity() { return (Rarity)1; } protected override CardThemeColorType GetTheme() { return (CardThemeColorType)2; } protected override CardInfoStat[] GetStats() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_002b: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown return (CardInfoStat[])(object)new CardInfoStat[2] { new CardInfoStat { positive = true, stat = "Block heal", amount = "+50% missing HP" }, new CardInfoStat { positive = false, stat = "Food coma duration", amount = $"{1f}-{5f}s from ⌊ heal ÷ 5 ⌋ HP" } }; } public override string GetModName() { return "MFWB"; } public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block) { } public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { if ((Object)(object)((Component)player).gameObject.GetComponent() == (Object)null) { ((Component)player).gameObject.AddComponent(); } } public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { DoorDashEffect component = ((Component)player).gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } } } public class DoorDashEffect : MonoBehaviour { private Player _player; private Block _block; private HealthHandler _health; private Action _blockHandler; private bool _subscribed; private float _baselineMoveSpeed = float.NaN; private float _baselineJump = float.NaN; private float _baselineGravity = float.NaN; private float _slowUntil; private Coroutine _countdown; private CharacterStatModifiers GetStats() { if (!((Object)(object)_player != (Object)null)) { return null; } return ((Component)_player).GetComponent(); } private void Start() { _player = ((Component)this).GetComponent(); if (!((Object)(object)_player?.data?.block == (Object)null)) { _block = _player.data.block; _health = _player.data.healthHandler; Subscribe(); } } private void OnEnable() { if ((Object)(object)_block != (Object)null) { Subscribe(); } } private void OnDisable() { Unsubscribe(); ForceRestoreStats("OnDisable"); } private void OnDestroy() { Unsubscribe(); StopCountdownCoroutine(); ForceRestoreStats("OnDestroy"); } internal static float DebuffSecondsForHeal(float healAmount) { return Mathf.Clamp(Mathf.Floor(healAmount / 5f), 1f, 5f); } private void Subscribe() { if (!_subscribed && !((Object)(object)_block == (Object)null)) { _blockHandler = OnBlock; _block.BlockAction = (Action)Delegate.Combine(_block.BlockAction, _blockHandler); _subscribed = true; } } private void Unsubscribe() { if (_subscribed && !((Object)(object)_block == (Object)null) && _blockHandler != null) { _block.BlockAction = (Action)Delegate.Remove(_block.BlockAction, _blockHandler); _subscribed = false; } } private void OnBlock(BlockTriggerType t) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if ((int)t != 0 || (Object)(object)_player?.data == (Object)null || (Object)(object)_health == (Object)null) { return; } float num = Mathf.Max(0f, _player.data.maxHealth - _player.data.health); if (num <= 0.01f) { return; } float num2 = num * 0.5f; _health.Heal(num2); float num3 = DebuffSecondsForHeal(num2); CharacterStatModifiers stats = GetStats(); if (!((Object)(object)stats == (Object)null)) { ApplyOrRefreshBaseline(stats); float slowUntil = Mathf.Max(Time.time + num3, _slowUntil); _slowUntil = slowUntil; if (_countdown == null) { _countdown = ((MonoBehaviour)this).StartCoroutine(CountUntilRestore()); } } } private void ApplyOrRefreshBaseline(CharacterStatModifiers sm) { if (float.IsNaN(_baselineMoveSpeed)) { _baselineMoveSpeed = sm.movementSpeed; _baselineJump = sm.jump; _baselineGravity = sm.gravity; sm.movementSpeed *= 0.52f; sm.jump = 0f; sm.gravity *= 1.65f; } } private IEnumerator CountUntilRestore() { CharacterStatModifiers sm = GetStats(); if (!((Object)(object)sm == (Object)null)) { WaitForSeconds waitStep = new WaitForSeconds(0.05f); while (_slowUntil > Time.time) { yield return waitStep; } if ((Object)(object)sm != (Object)null && !float.IsNaN(_baselineMoveSpeed)) { sm.movementSpeed = _baselineMoveSpeed; sm.jump = _baselineJump; sm.gravity = _baselineGravity; } _baselineMoveSpeed = float.NaN; _baselineJump = float.NaN; _baselineGravity = float.NaN; _slowUntil = 0f; _countdown = null; } } private void StopCountdownCoroutine() { if (_countdown != null) { ((MonoBehaviour)this).StopCoroutine(_countdown); _countdown = null; } } private void ForceRestoreStats(string _) { StopCountdownCoroutine(); CharacterStatModifiers stats = GetStats(); if ((Object)(object)stats != (Object)null && !float.IsNaN(_baselineMoveSpeed)) { stats.movementSpeed = _baselineMoveSpeed; stats.jump = _baselineJump; stats.gravity = _baselineGravity; } _baselineMoveSpeed = float.NaN; _baselineJump = float.NaN; _baselineGravity = float.NaN; _slowUntil = 0f; } } public class DylartilleryCard : CustomCard { protected override string GetTitle() { return "Dylartillery"; } protected override string GetDescription() { return "Your primary fire originates from the ceiling and rains straight down."; } protected override GameObject GetCardArt() { return null; } protected override Rarity GetRarity() { return (Rarity)0; } protected override CardThemeColorType GetTheme() { return (CardThemeColorType)3; } protected override CardInfoStat[] GetStats() { return null; } public override string GetModName() { return "MFWB"; } public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block) { } public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { if ((Object)(object)((Component)player).gameObject.GetComponent() == (Object)null) { ((Component)player).gameObject.AddComponent(); } } public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { DylartilleryEffect component = ((Component)player).gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } } } public class DylartilleryEffect : MonoBehaviour { private const float HeightAboveCamera = 2f; private const float FallbackHeight = 25f; private const float MinFallSpeed = 28f; private const float HorizontalSpreadHalfWidth = 0.55f; private const float DownAngleSpread = 11f; private Player _player; private Gun _gun; private Action _handler; private bool _subscribed; private void Start() { _player = ((Component)this).GetComponent(); if (!((Object)(object)_player == (Object)null) && !((Object)(object)_player.data == (Object)null) && !((Object)(object)_player.data.weaponHandler == (Object)null)) { _gun = _player.data.weaponHandler.gun; Subscribe(); } } private void OnEnable() { if ((Object)(object)_gun != (Object)null) { Subscribe(); } } private void OnDisable() { Unsubscribe(); } private void OnDestroy() { Unsubscribe(); } private void Subscribe() { if (!_subscribed && !((Object)(object)_gun == (Object)null)) { _handler = OnProjectileSpawned; _gun.ShootPojectileAction = (Action)Delegate.Combine(_gun.ShootPojectileAction, _handler); _subscribed = true; } } private void Unsubscribe() { if (_subscribed && !((Object)(object)_gun == (Object)null) && _handler != null) { _gun.ShootPojectileAction = (Action)Delegate.Remove(_gun.ShootPojectileAction, _handler); _subscribed = false; } } private void OnProjectileSpawned(GameObject projectile) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_0035: 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_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011e: 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_014a: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)projectile == (Object)null || (Object)(object)_player == (Object)null) { return; } Camera main = Camera.main; float altitudeY = ((!((Object)(object)main != (Object)null) || !main.orthographic) ? (((Component)_player).transform.position.y + 25f) : (((Component)main).transform.position.y + main.orthographicSize + 2f)); Vector3 position = ((Component)_player).transform.position; Vector3 position2 = AimOnHorizontalPlane(main, altitudeY, position); position2.x += Random.Range(-0.55f, 0.55f); position2.z = projectile.transform.position.z; projectile.transform.position = position2; float num = Random.Range(-11f, 11f); projectile.transform.rotation = Quaternion.Euler(0f, 0f, -90f + num); MoveTransform component = projectile.GetComponent(); if ((Object)(object)component != (Object)null) { Vector3 velocity = component.velocity; Vector2 val = new Vector2(velocity.x, velocity.y); float num2 = ((Vector2)(ref val)).magnitude; if (num2 < 28f) { num2 = 28f; } Vector3 velocity2 = Quaternion.Euler(0f, 0f, num) * new Vector3(0f, 0f - num2, 0f); component.velocity = velocity2; } } private static Vector3 AimOnHorizontalPlane(Camera cam, float altitudeY, Vector3 fallback) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0009: 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_0057: 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_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)cam == (Object)null) { return fallback; } Ray val = cam.ScreenPointToRay(Input.mousePosition); float y = ((Ray)(ref val)).direction.y; if (Mathf.Abs(y) < 0.0001f) { return new Vector3(fallback.x, altitudeY, fallback.z); } float num = (altitudeY - ((Ray)(ref val)).origin.y) / y; float num2 = ((Ray)(ref val)).origin.x + ((Ray)(ref val)).direction.x * num; float num3 = ((Ray)(ref val)).origin.z + ((Ray)(ref val)).direction.z * num; return new Vector3(num2, altitudeY, num3); } } public class KomodoConfidenceCard : CustomCard { protected override string GetTitle() { return "Komodo Confidence"; } protected override string GetDescription() { return "\"Fake it 'til you make it\": when your bullets are punching above their tiny damage numbers they show up chunky; once real damage climbs, they tuck back toward respectable size—but other size cards still add on top."; } protected override GameObject GetCardArt() { return null; } protected override Rarity GetRarity() { return (Rarity)0; } protected override CardThemeColorType GetTheme() { return (CardThemeColorType)6; } protected override CardInfoStat[] GetStats() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_002b: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown return (CardInfoStat[])(object)new CardInfoStat[2] { new CardInfoStat { positive = true, stat = "Low-damage swagger", amount = "~+80% projectile bulk when dmg is tiny" }, new CardInfoStat { positive = false, stat = "Higher damage", amount = "~7% tighter than vanilla at full bore" } }; } public override string GetModName() { return "MFWB"; } public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block) { } public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { if ((Object)(object)((Component)player).gameObject.GetComponent() == (Object)null) { ((Component)player).gameObject.AddComponent(); } } public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { KomodoConfidenceEffect component = ((Component)player).gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } } } public class KomodoConfidenceEffect : MonoBehaviour { private const float SoftDamage = 0.12f; private const float FirmDamage = 95f; private const float BigShowMul = 1.78f; private const float TightMul = 0.93f; private Player _player; private Gun _gun; private Action _handler; private bool _subscribed; private void Start() { _player = ((Component)this).GetComponent(); if (!((Object)(object)_player?.data?.weaponHandler?.gun == (Object)null)) { _gun = _player.data.weaponHandler.gun; Subscribe(); } } private void OnEnable() { if ((Object)(object)_gun != (Object)null) { Subscribe(); } } private void OnDisable() { Unsubscribe(); } private void OnDestroy() { Unsubscribe(); } private void Subscribe() { if (!_subscribed && !((Object)(object)_gun == (Object)null)) { _handler = OnSpawn; _gun.ShootPojectileAction = (Action)Delegate.Combine(_gun.ShootPojectileAction, _handler); _subscribed = true; } } private void Unsubscribe() { if (_subscribed && !((Object)(object)_gun == (Object)null) && _handler != null) { _gun.ShootPojectileAction = (Action)Delegate.Remove(_gun.ShootPojectileAction, _handler); _subscribed = false; } } private void OnSpawn(GameObject projectile) { if (!((Object)(object)projectile == (Object)null) && !((Object)(object)_gun == (Object)null)) { float softness = InverseDamageFactor(_gun); ((MonoBehaviour)this).StartCoroutine(ReapplySizing(projectile, softness)); } } private float InverseDamageFactor(Gun gun) { float num = Mathf.Max(gun.damage * Mathf.Max(0.0001f, gun.bulletDamageMultiplier), 0.03f); float num2 = Mathf.InverseLerp(0.12f, 95f, num); num2 = Mathf.Clamp01(num2); return 1f - num2; } private IEnumerator ReapplySizing(GameObject projectile, float softness) { if (!((Object)(object)projectile == (Object)null)) { yield return null; yield return null; float num = Mathf.Lerp(1.78f, 0.93f, 1f - softness); num = Mathf.Clamp(num, 0.93f, 1.86f); Transform transform = projectile.transform; transform.localScale *= num; RayCastTrail componentInChildren = projectile.GetComponentInChildren(); if ((Object)(object)componentInChildren != (Object)null) { float num2 = Mathf.Lerp(0.14f, 0f, 1f - softness); componentInChildren.extraSize += num2; } } } } public class LeavingYourMarkCard : CustomCard { protected override string GetTitle() { return "Leaving Your Mark"; } protected override string GetDescription() { return "When you take real HP damage you retaliate: a quick burst and a brief hot spot on the ground. Throttled so it is not every chip of damage."; } protected override GameObject GetCardArt() { return null; } protected override Rarity GetRarity() { return (Rarity)1; } protected override CardThemeColorType GetTheme() { return (CardThemeColorType)4; } protected override CardInfoStat[] GetStats() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_002b: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown return (CardInfoStat[])(object)new CardInfoStat[2] { new CardInfoStat { positive = true, stat = "Retaliation", amount = "Burst + short hazard on taking HP loss" }, new CardInfoStat { positive = false, stat = "Cooldown", amount = "~0.38s between procs" } }; } public override string GetModName() { return "MFWB"; } public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block) { } public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { if ((Object)(object)((Component)player).gameObject.GetComponent() == (Object)null) { ((Component)player).gameObject.AddComponent(); } } public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { LeavingYourMarkEffect component = ((Component)player).gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } } } public class LeavingYourMarkEffect : MonoBehaviour { private const float ThrottleSeconds = 0.38f; private const int BurstCount = 8; private const float ZoneLifetime = 0.85f; private Player _player; private Gun _gun; private float _lastProc; private void Start() { _player = ((Component)this).GetComponent(); if ((Object)(object)_player?.data?.weaponHandler?.gun != (Object)null) { _gun = _player.data.weaponHandler.gun; } } public void NotifyDamaged(float damageDealt) { if (!((Object)(object)_player == (Object)null) && !(Time.time - _lastProc < 0.38f)) { _lastProc = Time.time; ((MonoBehaviour)this).StopAllCoroutines(); ((MonoBehaviour)this).StartCoroutine(ReactRoutine(damageDealt)); } } private IEnumerator ReactRoutine(float referenceDamage) { SpawnBurst(referenceDamage); yield return null; SpawnZone(referenceDamage); } private void SpawnBurst(float referenceDamage) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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) if (!((Object)(object)_gun == (Object)null) && _gun.projectiles != null && _gun.projectiles.Length != 0) { float damage = Mathf.Clamp(referenceDamage * 0.22f, 3f, 18f); Vector2 val = Vector2.op_Implicit(((Component)_player).transform.position); Vector2 val2 = default(Vector2); for (int i = 0; i < 8; i++) { float num = (float)i * (float)Math.PI * 2f / 8f; ((Vector2)(ref val2))..ctor(Mathf.Cos(num), Mathf.Sin(num)); GameObject val3 = new GameObject("MFWB_LeavingMarkShard"); val3.transform.position = Vector2.op_Implicit(val); val3.AddComponent().Setup(_player, damage, val2 * 26f); } } } private void SpawnZone(float referenceDamage) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) float damagePerTick = Mathf.Clamp(referenceDamage * 0.35f, 4f, 14f); GameObject val = new GameObject("MFWB_LeavingMarkZone"); val.transform.position = ((Component)_player).transform.position; CircleCollider2D obj = val.AddComponent(); ((Collider2D)obj).isTrigger = true; obj.radius = 1.05f; val.AddComponent().Setup(_player, damagePerTick, 0.85f); } } public class LeavingYourMarkShard : MonoBehaviour { private Player _owner; private float _damage; private bool _spent; public void Setup(Player owner, float damage, Vector2 velocity) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) _owner = owner; _damage = damage; Rigidbody2D obj = ((Component)this).gameObject.AddComponent(); obj.gravityScale = 0f; obj.collisionDetectionMode = (CollisionDetectionMode2D)1; obj.velocity = velocity; CircleCollider2D obj2 = ((Component)this).gameObject.AddComponent(); ((Collider2D)obj2).isTrigger = true; obj2.radius = 0.15f; Object.Destroy((Object)(object)((Component)this).gameObject, 0.55f); } private void OnTriggerEnter2D(Collider2D col) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) if (!_spent) { HealthHandler componentInParent = ((Component)col).GetComponentInParent(); Player val = MfwbHealth.PlayerOf(componentInParent); if (!((Object)(object)val == (Object)null) && !((Object)(object)val == (Object)(object)_owner)) { _spent = true; Bounds bounds = col.bounds; Vector2 val2 = Vector2.op_Implicit(((Bounds)(ref bounds)).center); ((Damagable)componentInParent).CallTakeDamage(new Vector2(_damage, 0f), val2, (GameObject)null, _owner, false); } } } } public class LeavingYourMarkHurtZone : MonoBehaviour { private Player _owner; private float _damagePerTick; private float _until; private float _lastTick; public void Setup(Player owner, float damagePerTick, float lifetime) { _owner = owner; _damagePerTick = damagePerTick; _until = Time.time + lifetime; } private void Update() { if (Time.time > _until) { Object.Destroy((Object)(object)((Component)this).gameObject); } } private void OnTriggerStay2D(Collider2D col) { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_0078: Unknown result type (might be due to invalid IL or missing references) if (!(Time.time > _until)) { HealthHandler componentInParent = ((Component)col).GetComponentInParent(); Player val = MfwbHealth.PlayerOf(componentInParent); if (!((Object)(object)val == (Object)null) && !((Object)(object)val == (Object)(object)_owner) && !(Time.time - _lastTick < 0.13f)) { _lastTick = Time.time; Bounds bounds = col.bounds; Vector2 val2 = Vector2.op_Implicit(((Bounds)(ref bounds)).center); ((Damagable)componentInParent).CallTakeDamage(new Vector2(_damagePerTick, 0f), val2, (GameObject)null, _owner, false); } } } } [HarmonyPatch] public static class LeavingYourMarkTakeDamagePatches { public static IEnumerable TargetMethods() { yield return AccessTools.Method(typeof(HealthHandler), "TakeDamage", new Type[6] { typeof(Vector2), typeof(Vector2), typeof(GameObject), typeof(Player), typeof(bool), typeof(bool) }, (Type[])null); yield return AccessTools.Method(typeof(HealthHandler), "TakeDamage", new Type[7] { typeof(Vector2), typeof(Vector2), typeof(Color), typeof(GameObject), typeof(Player), typeof(bool), typeof(bool) }, (Type[])null); } [HarmonyPrefix] public static void Prefix(HealthHandler __instance, ref float __state) { CharacterData val = MfwbHealth.DataOf(__instance); __state = (((Object)(object)val != (Object)null) ? val.health : 0f); } [HarmonyPostfix] public static void Postfix(HealthHandler __instance, float __state) { CharacterData val = MfwbHealth.DataOf(__instance); Player val2 = MfwbHealth.PlayerOf(__instance); if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val == (Object)null)) { float num = __state - val.health; if (!(num <= 0.05f)) { ((Component)val2).GetComponent()?.NotifyDamaged(num); } } } } public class LowBlowCard : CustomCard { protected override string GetTitle() { return "Low Blow"; } protected override string GetDescription() { return "Your primary bullets tag for bonus damage when they connect from below your target."; } protected override GameObject GetCardArt() { return null; } protected override Rarity GetRarity() { return (Rarity)0; } protected override CardThemeColorType GetTheme() { return (CardThemeColorType)0; } protected override CardInfoStat[] GetStats() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_0047: Expected O, but got Unknown return (CardInfoStat[])(object)new CardInfoStat[1] { new CardInfoStat { positive = true, stat = "Low hits", amount = "+" + Mathf.RoundToInt(39.999996f) + "% damage" } }; } public override string GetModName() { return "MFWB"; } public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block) { } public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { LowBlowEffect lowBlowEffect = ((Component)player).gameObject.GetComponent(); if ((Object)(object)lowBlowEffect == (Object)null) { lowBlowEffect = ((Component)player).gameObject.AddComponent(); } lowBlowEffect.AddStack(); } public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { LowBlowEffect component = ((Component)player).gameObject.GetComponent(); if (!((Object)(object)component == (Object)null)) { component.RemoveStack(); if (component.Stacks <= 0) { Object.Destroy((Object)(object)component); } } } } public class LowBlowEffect : MonoBehaviour { private Player _player; private Gun _gun; private Action _handler; private bool _subscribed; public int Stacks { get; private set; } public void AddStack() { Stacks = Mathf.Max(1, Stacks + 1); } public void RemoveStack() { Stacks = Mathf.Max(0, Stacks - 1); } private void Start() { _player = ((Component)this).GetComponent(); if (!((Object)(object)_player?.data?.weaponHandler?.gun == (Object)null)) { _gun = _player.data.weaponHandler.gun; Subscribe(); } } private void OnEnable() { if ((Object)(object)_gun != (Object)null) { Subscribe(); } } private void OnDisable() { Unsubscribe(); } private void OnDestroy() { Unsubscribe(); } private void Subscribe() { if (!_subscribed && !((Object)(object)_gun == (Object)null)) { _handler = OnSpawn; _gun.ShootPojectileAction = (Action)Delegate.Combine(_gun.ShootPojectileAction, _handler); _subscribed = true; } } private void Unsubscribe() { if (_subscribed && !((Object)(object)_gun == (Object)null) && _handler != null) { _gun.ShootPojectileAction = (Action)Delegate.Remove(_gun.ShootPojectileAction, _handler); _subscribed = false; } } private void OnSpawn(GameObject projectile) { if (!((Object)(object)projectile == (Object)null) && Stacks > 0) { LowBlowProjectileTag lowBlowProjectileTag = projectile.GetComponent(); if ((Object)(object)lowBlowProjectileTag == (Object)null) { lowBlowProjectileTag = projectile.gameObject.AddComponent(); } lowBlowProjectileTag.Enabled = true; lowBlowProjectileTag.Multiplier = 1f + 0.39999998f * (float)Mathf.Max(1, Stacks); } } } [HarmonyPatch(typeof(ProjectileHit), "Hit", new Type[] { typeof(HitInfo), typeof(bool) })] public static class LowBlowHitPatch { public const float DefaultMultiplier = 1.4f; [HarmonyPrefix] public static void Prefix(ProjectileHit __instance, HitInfo hit) { //IL_0068: 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) LowBlowProjectileTag component = ((Component)__instance).GetComponent(); if ((Object)(object)component == (Object)null || !component.Enabled || (Object)(object)__instance.ownPlayer == (Object)null || (Object)(object)hit.collider == (Object)null) { return; } HealthHandler componentInParent = ((Component)hit.collider).GetComponentInParent(); Player val = MfwbHealth.PlayerOf(componentInParent); if (!((Object)(object)val == (Object)null) && !((Object)(object)val == (Object)(object)__instance.ownPlayer)) { float y = ((Component)componentInParent).transform.position.y; if (!(((Component)__instance).transform.position.y >= y - 0.18f)) { __instance.damage *= component.Multiplier; } } } } public class LowBlowProjectileTag : MonoBehaviour { public bool Enabled = true; public float Multiplier = 1.4f; } internal static class MfwbHealth { internal static Player PlayerOf(HealthHandler h) { if ((Object)(object)h == (Object)null) { return null; } object value = Traverse.Create((object)h).Field("player").GetValue(); return (Player)((value is Player) ? value : null); } internal static CharacterData DataOf(HealthHandler h) { if ((Object)(object)h == (Object)null) { return null; } object value = Traverse.Create((object)h).Field("data").GetValue(); return (CharacterData)((value is CharacterData) ? value : null); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("keller.rounds.moonfacewaterbottle", "Moon Face Water Bottle", "2.0.1")] [BepInProcess("Rounds.exe")] public class MoonFaceWaterBottlePlugin : BaseUnityPlugin { public const string ModId = "keller.rounds.moonfacewaterbottle"; public const string ModName = "Moon Face Water Bottle"; public const string Version = "2.0.1"; public const string ModInitials = "MFWB"; private void Awake() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) new Harmony("keller.rounds.moonfacewaterbottle").PatchAll(); } private void Start() { PipeGongRoundHook.Register(); CustomCard.BuildCard(); CustomCard.BuildCard(); CustomCard.BuildCard(); CustomCard.BuildCard(); CustomCard.BuildCard(); CustomCard.BuildCard(); CustomCard.BuildCard(); } } public class OrbitBuddyCard : CustomCard { protected override string GetTitle() { return "Orbit Buddy"; } protected override string GetDescription() { return "A soft-body buddy orbits around you damped-like. Each primary launches an extra kinetic pellet from your buddy, aimed with your gun. Stacks boost damage. Buddy shots spawn only on your client (local pellet) — multiplayer behaviour may differ from vanilla bullets."; } protected override GameObject GetCardArt() { return null; } protected override Rarity GetRarity() { return (Rarity)1; } protected override CardThemeColorType GetTheme() { return (CardThemeColorType)8; } protected override CardInfoStat[] GetStats() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_002b: Expected O, but got Unknown return (CardInfoStat[])(object)new CardInfoStat[1] { new CardInfoStat { positive = true, stat = "Buddy shot", amount = "~+10× gun dmg mult per stack — local proj" } }; } public override string GetModName() { return "MFWB"; } public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block) { } public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { OrbitBuddyEffect orbitBuddyEffect = ((Component)player).gameObject.GetComponent(); if ((Object)(object)orbitBuddyEffect == (Object)null) { orbitBuddyEffect = ((Component)player).gameObject.AddComponent(); } orbitBuddyEffect.AddStack(); } public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { OrbitBuddyEffect component = ((Component)player).gameObject.GetComponent(); if (!((Object)(object)component == (Object)null)) { component.RemoveStack(); if (component.Stacks <= 0) { Object.Destroy((Object)(object)component); } } } } public class OrbitBuddyEffect : MonoBehaviour { private const float OrbitRadius = 1.05f; private const float OrbitSpeed = 2.05f; private const float SmoothTime = 0.09f; private Player _player; private Gun _gun; private GameObject _pet; private Action _shootHook; private bool _hooked; private float _orbitAngle; private Vector3 _smoothVel; public int Stacks { get; private set; } public void AddStack() { Stacks = Mathf.Max(1, Stacks + 1); } public void RemoveStack() { Stacks = Mathf.Max(0, Stacks - 1); } private void Start() { _player = ((Component)this).GetComponent(); if (!((Object)(object)_player?.data?.weaponHandler?.gun == (Object)null)) { _gun = _player.data.weaponHandler.gun; EnsurePet(); Subscribe(); } } private void OnEnable() { if ((Object)(object)_gun != (Object)null) { Subscribe(); } } private void OnDisable() { Unsubscribe(); } private void OnDestroy() { Unsubscribe(); if ((Object)(object)_pet != (Object)null) { Object.Destroy((Object)(object)_pet); } } private static bool HasLocalAuthority(Player player) { if ((Object)(object)player?.data?.view == (Object)null) { return true; } return player.data.view.IsMine; } private void EnsurePet() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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_0035: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: 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_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_pet != (Object)null) && !((Object)(object)_player == (Object)null)) { Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false) { wrapMode = (TextureWrapMode)1, filterMode = (FilterMode)1 }; val.SetPixels((Color[])(object)new Color[4] { Color.white, Color.white, Color.white, Color.white }); val.Apply(false); _pet = new GameObject("MFWB_OrbitBuddyPet"); Sprite sprite = Sprite.Create(val, new Rect(0f, 0f, 2f, 2f), new Vector2(0.5f, 0.5f), 16f); SpriteRenderer obj = _pet.AddComponent(); obj.sprite = sprite; obj.color = new Color(0.45f, 0.92f, 1f, 0.94f); _pet.transform.localScale = Vector3.one * 0.35f; _pet.transform.position = PlayerAnchor() + Vector3.right * 1.05f; } } private Vector3 PlayerAnchor() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_player != (Object)null)) { return Vector3.zero; } return ((Component)_player).transform.position; } private void LateUpdate() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: 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_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_player == (Object)null) && !((Object)(object)_pet == (Object)null)) { Vector3 val = PlayerAnchor(); _orbitAngle += 2.05f * Time.deltaTime; Vector3 val2 = val + new Vector3(Mathf.Cos(_orbitAngle) * 1.05f, Mathf.Sin(_orbitAngle) * 1.05f, 0f); _pet.transform.position = Vector3.SmoothDamp(_pet.transform.position, val2, ref _smoothVel, 0.09f); Vector3 position = _pet.transform.position; position.z = val.z; _pet.transform.position = position; } } private void Subscribe() { if (!_hooked && !((Object)(object)_gun == (Object)null)) { _shootHook = OnPrimarySpawn; _gun.ShootPojectileAction = (Action)Delegate.Combine(_gun.ShootPojectileAction, _shootHook); _hooked = true; } } private void Unsubscribe() { if (_hooked && !((Object)(object)_gun == (Object)null) && _shootHook != null) { _gun.ShootPojectileAction = (Action)Delegate.Remove(_gun.ShootPojectileAction, _shootHook); _hooked = false; } } private void OnPrimarySpawn(GameObject _) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Expected O, but got Unknown //IL_00f5: 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_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_gun == (Object)null) && !((Object)(object)_player == (Object)null) && Stacks > 0 && HasLocalAuthority(_player)) { Vector3 position = (((Object)(object)_pet != (Object)null) ? _pet.transform.position : PlayerAnchor()); Vector2 aimDirection = GetAimDirection(); float damagePerHit = Mathf.Clamp(_gun.damage * Mathf.Max(0.08f, _gun.bulletDamageMultiplier) * 4.2f * (float)Stacks, 7f, 85f); float num = Mathf.Clamp(_gun.projectileSpeed * 38f + 28f + _gun.damage * 6f * (float)Stacks, 32f, 170f); GameObject val = new GameObject("MFWB_OrbitBuddyPelletVisual"); val.transform.position = position; val.transform.position = new Vector3(val.transform.position.x, val.transform.position.y, PlayerAnchor().z); val.AddComponent().Initialize(_player, aimDirection * num, damagePerHit); } } private Vector2 GetAimDirection() { //IL_0053: 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_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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_0045: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_gun != (Object)null && (Object)(object)_gun.shootPosition != (Object)null) { Vector2 val = Vector2.op_Implicit(_gun.shootPosition.right); if (!(((Vector2)(ref val)).sqrMagnitude > 1E-05f)) { return Vector2.right; } return ((Vector2)(ref val)).normalized; } return Vector2.right; } } internal sealed class OrbitBuddyPellet : MonoBehaviour { private Player _owner; private Vector2 _velocity; private float _damage; private bool _spent; private Rigidbody2D _rb; public void Initialize(Player owner, Vector2 velocity, float damagePerHit) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) _owner = owner; _velocity = velocity; _damage = damagePerHit; } private void Start() { //IL_004c: Unknown result type (might be due to invalid IL or missing references) _rb = ((Component)this).gameObject.AddComponent(); _rb.bodyType = (RigidbodyType2D)0; _rb.gravityScale = 0f; _rb.constraints = (RigidbodyConstraints2D)4; _rb.collisionDetectionMode = (CollisionDetectionMode2D)1; _rb.velocity = _velocity; CircleCollider2D obj = ((Component)this).gameObject.AddComponent(); obj.radius = 0.16f; ((Collider2D)obj).isTrigger = true; Object.Destroy((Object)(object)((Component)this).gameObject, 3f); } private void OnTriggerEnter2D(Collider2D col) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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) if (!_spent && !((Object)(object)_owner == (Object)null)) { HealthHandler componentInParent = ((Component)col).GetComponentInParent(); Player val = MfwbHealth.PlayerOf(componentInParent); if (!((Object)(object)val == (Object)null) && !((Object)(object)val == (Object)(object)_owner)) { _spent = true; Vector2 val2 = Vector2.op_Implicit(((Component)componentInParent).transform.position); ((Damagable)componentInParent).CallTakeDamage(new Vector2(_damage, _damage), val2, ((Component)this).gameObject, _owner, false); Object.Destroy((Object)(object)((Component)this).gameObject); } } } } public class PipeGongCard : CustomCard { protected override string GetTitle() { return "Pipe Gong"; } protected override string GetDescription() { return "When you win a round, celebrate with a sharp metal clang (local-only SFX)."; } protected override GameObject GetCardArt() { return null; } protected override Rarity GetRarity() { return (Rarity)0; } protected override CardThemeColorType GetTheme() { return (CardThemeColorType)7; } protected override CardInfoStat[] GetStats() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_002b: Expected O, but got Unknown return (CardInfoStat[])(object)new CardInfoStat[1] { new CardInfoStat { positive = true, stat = "Round win", amount = "Clang!" } }; } public override string GetModName() { return "MFWB"; } public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block) { } public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { if ((Object)(object)((Component)player).gameObject.GetComponent() == (Object)null) { ((Component)player).gameObject.AddComponent(); } } public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats) { PipeGongTracker component = ((Component)player).gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } } } public static class PipeGongRoundHook { private static bool _registered; internal static void Register() { if (!_registered) { _registered = true; GameModeManager.AddHook("RoundEnd", (Func)OnRoundEnd); } } private static IEnumerator OnRoundEnd(IGameModeHandler gm) { if (gm == null) { yield break; } int[] roundWinners = gm.GetRoundWinners(); if (roundWinners == null || roundWinners.Length == 0) { yield break; } Player val = null; foreach (Player player in PlayerManager.instance.players) { if ((Object)(object)player?.data?.view != (Object)null && player.data.view.IsMine) { val = player; break; } } if ((Object)(object)val == (Object)null || (Object)(object)((Component)val).GetComponent() == (Object)null) { yield break; } bool flag = false; int[] array = roundWinners; for (int i = 0; i < array.Length; i++) { if (array[i] == val.teamID) { flag = true; break; } } if (flag) { PipeGongAudio.PlayNonBlocking(); } } } internal static class PipeGongAudio { private static AudioClip _clip; public static void PlayNonBlocking() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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) if ((Object)(object)_clip == (Object)null) { _clip = BuildClangClip(); } Vector3 val = (((Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.position : Vector3.zero); AudioSource.PlayClipAtPoint(_clip, val, 0.65f); } private static AudioClip BuildClangClip() { float num = 0.35f; int num2 = (int)(44100f * num); float[] array = new float[num2]; Random random = new Random(42); for (int i = 0; i < num2; i++) { float num3 = (float)i / 44100f; float num4 = Mathf.Exp((0f - num3) * 7f); float num5 = 580f; float num6 = 1220f; float num7 = Mathf.Sin((float)Math.PI * 2f * num5 * num3) * 0.55f + Mathf.Sin((float)Math.PI * 2f * num6 * num3) * 0.35f; float num8 = (float)(random.NextDouble() * 2.0 - 1.0) * 0.12f; array[i] = Mathf.Clamp((num7 + num8) * num4, -1f, 1f); } AudioClip obj = AudioClip.Create("MFWB_PipeGongClang", num2, 1, 44100, false); obj.SetData(array, 0); return obj; } } public class PipeGongTracker : MonoBehaviour { }