Decompiled source of Bloons v1.0.2

Bloons.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Receiver2;
using SimpleJSON;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.6", FrameworkDisplayName = ".NET Framework 4.6")]
[assembly: AssemblyCompany("Bloons")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Balloons!")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Bloons")]
[assembly: AssemblyTitle("Bloons")]
[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 Bloons
{
	public abstract class BaseBalloon : MonoBehaviour
	{
		public abstract bool OnShoot(ref Balloon instance, ref ShootableQuery query);

		public abstract bool OnTouch(ref Balloon instance, Collider collider);

		public virtual void OnStart(ref Balloon instance)
		{
		}

		public void Start()
		{
			Balloon instance = ((Component)this).GetComponentInParent<Balloon>();
			OnStart(ref instance);
		}

		protected int bonus()
		{
			return Random.Range(0, 2);
		}

		public virtual void GetPersistentData(ref Balloon instance, ref JSONObject result)
		{
		}

		public virtual void SetPersistentData(ref Balloon instance, JSONObject data)
		{
		}

		public static void CustomPop(Balloon __instance, ShootableQuery shootable_query, int min, int max)
		{
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: 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_00f3: Expected O, but got Unknown
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: 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_005f: 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)
			if (__instance.IsPopped)
			{
				return;
			}
			int num = Random.Range(min, max);
			if ((Object)(object)ReceiverCoreScript.Instance().RoundPrefab != (Object)null)
			{
				for (int i = 0; i < num; i++)
				{
					ShellCasingScript component = Object.Instantiate<GameObject>(ReceiverCoreScript.Instance().RoundPrefab).GetComponent<ShellCasingScript>();
					((Component)component).transform.position = ((Component)__instance).transform.position + Random.insideUnitSphere * 0.1f;
					((Component)component).transform.rotation = Random.rotationUniform;
					((InventoryItem)component).item_owner_id = -1;
					((Component)component).GetComponent<InventoryItem>().Move((InventorySlot)null);
					if (ReceiverCoreScript.Instance().IsPlayerAlive())
					{
						LocalAimHandler.player_instance.PickUpBullet((InventoryItem)(object)component, (List<InventoryItem>)null);
					}
				}
			}
			AudioManager.PlayOneShot3D(__instance.balloon_pop, ((Component)__instance).transform.position, 1f, 1f);
			ReceiverEvents.TriggerEvent(new EntityDestroyed
			{
				shootable_query = shootable_query,
				entity_type = (ReceiverEntityType)7,
				game_object = ((Component)__instance).gameObject
			});
			Object.Instantiate<GameObject>(__instance.pop_prefab, ((Component)__instance).transform.position, ((Component)__instance).transform.rotation);
			__instance.SetPopped();
		}
	}
	public class BlinkBalloon : BaseBalloon
	{
		private float next_time;

		private bool on;

		public override void OnStart(ref Balloon instance)
		{
			//IL_0038: 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)
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				next_time = Time.time + 0.5f;
				on = false;
				((Component)instance).GetComponentInChildren<Renderer>().material.color = Color.yellow;
				((Component)instance).GetComponentInChildren<Renderer>().material.EnableKeyword("_EMISSION");
				((Component)instance).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.black);
			}
		}

		public void Update()
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: 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 (Time.frameCount % 5 != 0)
			{
				return;
			}
			Balloon componentInParent = ((Component)this).GetComponentInParent<Balloon>();
			if (!((Object)(object)componentInParent == (Object)null) && !componentInParent.IsPopped)
			{
				if (on)
				{
					((Component)this).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.yellow * 2f);
				}
				else
				{
					((Component)this).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.black);
				}
				if (!(Time.time < next_time))
				{
					on = !on;
					next_time = Time.time + (on ? 0.5f : Random.Range(1f, 2f));
				}
			}
		}

		public override bool OnShoot(ref Balloon instance, ref ShootableQuery query)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			if (!instance.IsPopped)
			{
				PopAlarm(instance, query);
				query.shot_response = (ShotResponse)3;
				query.hit_event = (Event)5;
			}
			return false;
		}

		public override void GetPersistentData(ref Balloon instance, ref JSONObject result)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((JSONNode)result).Add("type", (JSONNode)new JSONString("blink"));
			}
		}

		public override void SetPersistentData(ref Balloon instance, JSONObject data)
		{
			if (((JSONNode)data).HasKey("type") && ((JSONNode)data)["type"].Value == "blink")
			{
				((Component)instance).gameObject.AddComponent<BlinkBalloon>();
			}
		}

		public override bool OnTouch(ref Balloon instance, Collider other)
		{
			PopAlarm(instance, null);
			return false;
		}

		private void PopAlarm(Balloon instance, ShootableQuery query)
		{
			if (!on)
			{
				BaseBalloon.CustomPop(instance, query, 0, 1);
				return;
			}
			int num = bonus();
			BaseBalloon.CustomPop(instance, query, 1 + num, 3 + num);
		}
	}
	public class GhostBalloon : BaseBalloon
	{
		public override void OnStart(ref Balloon instance)
		{
			//IL_0020: 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)
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((Component)instance).GetComponentInChildren<Renderer>().material.color = Color.white;
				((Component)instance).GetComponentInChildren<Renderer>().material.EnableKeyword("_EMISSION");
				((Component)instance).transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
			}
		}

		public override void GetPersistentData(ref Balloon instance, ref JSONObject result)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((JSONNode)result).Add("type", (JSONNode)new JSONString("ghost"));
			}
		}

		public override void SetPersistentData(ref Balloon instance, JSONObject data)
		{
			if (((JSONNode)data).HasKey("type") && ((JSONNode)data)["type"].Value == "ghost")
			{
				((Component)instance).gameObject.AddComponent<GhostBalloon>();
			}
		}

		public void Update()
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			if (Time.frameCount % 5 != 0)
			{
				return;
			}
			Balloon componentInParent = ((Component)this).GetComponentInParent<Balloon>();
			if ((Object)(object)componentInParent == (Object)null || componentInParent.IsPopped)
			{
				return;
			}
			LocalAimHandler player_instance = LocalAimHandler.player_instance;
			if (!((Object)(object)player_instance == (Object)null))
			{
				if (((Component)player_instance).gameObject.GetComponent<QuickDrawListener>().quickDraw())
				{
					((Component)this).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.white * 2f);
				}
				else
				{
					((Component)this).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.black);
				}
			}
		}

		public override bool OnShoot(ref Balloon instance, ref ShootableQuery query)
		{
			//IL_0059: 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_0047: 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)
			LocalAimHandler player_instance = LocalAimHandler.player_instance;
			if ((Object)(object)player_instance == (Object)null)
			{
				return false;
			}
			QuickDrawListener component = ((Component)player_instance).gameObject.GetComponent<QuickDrawListener>();
			if (!instance.IsPopped)
			{
				if (component.quickDraw())
				{
					int num = bonus();
					BaseBalloon.CustomPop(instance, query, 1 + num, 3 + num);
					query.shot_response = (ShotResponse)3;
					query.hit_event = (Event)5;
				}
				else
				{
					query.shot_response = (ShotResponse)2;
					query.hit_event = (Event)0;
					if (!component.ghost)
					{
						ReceiverOnScreenMessage.QueueMessage("", "Draw and shoot quickly to break ghost balloons.", true);
						component.ghost = true;
					}
				}
			}
			return false;
		}

		public override bool OnTouch(ref Balloon instance, Collider other)
		{
			return false;
		}
	}
	public class LeadBalloon : BaseBalloon
	{
		private bool canBreak;

		private IEnumerator routine;

		public override void OnStart(ref Balloon instance)
		{
			//IL_002f: 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_0092: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((Component)instance).GetComponentInChildren<Renderer>().material.color = new Color(0.2f, 0.2f, 0.2f);
				((Component)instance).GetComponentInChildren<BallisticMaterialSpecial>().ballistic_properties.no_penetration = true;
				((Component)instance).transform.localScale = new Vector3(1.6f, 1.6f, 1.6f);
				((Component)instance).GetComponentInChildren<Renderer>().material.EnableKeyword("_EMISSION");
				((Component)instance).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.black);
			}
		}

		public override bool OnShoot(ref Balloon instance, ref ShootableQuery query)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: 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)
			if (!instance.IsPopped && (int)query.hit_type == 0)
			{
				if (!canBreak)
				{
					canBreak = true;
					routine = clearShot(instance);
					((MonoBehaviour)this).StartCoroutine(routine);
					((Component)instance).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.gray * 2f);
					query.shot_response = (ShotResponse)0;
					query.hit_event = (Event)0;
				}
				else
				{
					((MonoBehaviour)this).StopCoroutine(routine);
					canBreak = false;
					int num = bonus();
					BaseBalloon.CustomPop(instance, query, 2 + num, 5 + num);
					query.shot_response = (ShotResponse)3;
					query.hit_event = (Event)5;
				}
			}
			return false;
		}

		public override void GetPersistentData(ref Balloon instance, ref JSONObject result)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((JSONNode)result).Add("type", (JSONNode)new JSONString("lead"));
			}
		}

		public override void SetPersistentData(ref Balloon instance, JSONObject data)
		{
			if (((JSONNode)data).HasKey("type") && ((JSONNode)data)["type"].Value == "lead")
			{
				((Component)instance).gameObject.AddComponent<LeadBalloon>();
			}
		}

		public override bool OnTouch(ref Balloon instance, Collider other)
		{
			return false;
		}

		private IEnumerator clearShot(Balloon instance)
		{
			yield return (object)new WaitForSeconds(1f);
			Debug.Log((object)(Time.time + " Reset!"));
			canBreak = false;
			((Component)instance).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.black);
			LocalAimHandler player_instance = LocalAimHandler.player_instance;
			if ((Object)(object)player_instance != (Object)null)
			{
				QuickDrawListener component = ((Component)player_instance).gameObject.GetComponent<QuickDrawListener>();
				if (!component.lead)
				{
					ReceiverOnScreenMessage.QueueMessage("", "Lead balloons require a double tap to break.", true);
					component.lead = true;
				}
			}
			yield return null;
		}
	}
	[BepInPlugin("Bloons", "Bloons", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		private static ConfigEntry<bool> allBalloons;

		private static List<string> rankSpawnTable = new List<string> { ".", "l.", "lg..", "lgbn....", "lgsbn.....", "lgsbn....." };

		private static List<string> allSpawnTable = new List<string> { ".", "lgsbn.....", "lgsbn.....", "lgsbn.....", "lgsbn.....", "lgsbn....." };

		private void Awake()
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Balloons !");
			Harmony.CreateAndPatchAll(((object)this).GetType(), (string)null);
			allBalloons = ((BaseUnityPlugin)this).Config.Bind<bool>("General.Toggles", "SpawnAllBalloons", false, "Spawn all balloon types in all levels.");
		}

		[HarmonyPatch(typeof(LocalAimHandler), "Awake")]
		[HarmonyPostfix]
		public static void LahAwake(LocalAimHandler __instance)
		{
			((Component)LocalAimHandler.player_instance).gameObject.AddComponent<QuickDrawListener>();
		}

		[HarmonyPatch(typeof(LocalAimHandler), "DrawMainItem")]
		[HarmonyPostfix]
		public static void DrawItem(LocalAimHandler __instance, Type type)
		{
			((Component)__instance).gameObject.GetComponent<QuickDrawListener>().startQuickdraw();
		}

		[HarmonyPatch(typeof(Balloon), "Start")]
		[HarmonyPostfix]
		public static void Start(Balloon __instance)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Invalid comparison between Unknown and I4
			if ((int)ReceiverCoreScript.Instance().game_mode.GetGameMode() == 2 && !__instance.IsPopped)
			{
				GameModeBase game_mode = ReceiverCoreScript.Instance().game_mode;
				int receiver_rank = ((RankingProgressionGameMode)((game_mode is RankingProgressionGameMode) ? game_mode : null)).progression_data.receiver_rank;
				string text = (allBalloons.Value ? allSpawnTable : rankSpawnTable)[receiver_rank];
				switch (text[Random.Range(0, text.Length)])
				{
				case 'l':
					((Component)__instance).gameObject.AddComponent<LeadBalloon>();
					break;
				case 'b':
					((Component)__instance).gameObject.AddComponent<BlinkBalloon>();
					break;
				case 'g':
					((Component)__instance).gameObject.AddComponent<GhostBalloon>();
					break;
				case 's':
					((Component)__instance).gameObject.AddComponent<SpawnBalloon>();
					break;
				case 'n':
					((Component)__instance).gameObject.AddComponent<SnipeBalloon>();
					break;
				}
			}
		}

		[HarmonyPatch(typeof(Balloon), "WasShot")]
		[HarmonyPrefix]
		public static bool WasShot(Balloon __instance, ref ShootableQuery shootable_query)
		{
			BaseBalloon component = ((Component)__instance).GetComponent<BaseBalloon>();
			if ((Object)(object)component == (Object)null)
			{
				return true;
			}
			if (!__instance.IsPopped)
			{
				return component.OnShoot(ref __instance, ref shootable_query);
			}
			return false;
		}

		[HarmonyPatch(typeof(Balloon), "SetPersistentData")]
		[HarmonyPostfix]
		public static void SetPersistentData(Balloon __instance, JSONObject data)
		{
			try
			{
				if (!((Object)(object)__instance == (Object)null) && !__instance.IsPopped)
				{
					((Component)__instance).gameObject.GetComponent<BaseBalloon>().SetPersistentData(ref __instance, data);
				}
			}
			catch (Exception ex)
			{
				Debug.Log((object)("Caught exception in SetPersistentData " + ex.ToString()));
			}
		}

		[HarmonyPatch(typeof(Balloon), "GetPersistentData")]
		[HarmonyPostfix]
		public static void GetPersistentData(Balloon __instance, JSONObject __result)
		{
			try
			{
				if (!((Object)(object)__instance == (Object)null) && !__instance.IsPopped)
				{
					((Component)__instance).gameObject.GetComponent<BaseBalloon>().GetPersistentData(ref __instance, ref __result);
				}
			}
			catch (Exception)
			{
			}
		}

		[HarmonyPatch(typeof(Balloon), "OnTriggerEnter")]
		[HarmonyPrefix]
		public static bool OnTriggerEnter(Balloon __instance, Collider other)
		{
			if (!__instance.IsPopped)
			{
				BaseBalloon component = ((Component)__instance).gameObject.GetComponent<BaseBalloon>();
				if ((Object)(object)component != (Object)null)
				{
					return component.OnTouch(ref __instance, other);
				}
			}
			return true;
		}
	}
	public class QuickDrawListener : MonoBehaviour
	{
		private bool qd;

		public bool lead;

		public bool ghost;

		public bool snipe;

		public bool quickDraw()
		{
			return qd;
		}

		public void startQuickdraw()
		{
			if (!qd)
			{
				qd = true;
				((MonoBehaviour)this).StartCoroutine(endQuickdraw());
			}
		}

		private IEnumerator endQuickdraw()
		{
			yield return (object)new WaitForSeconds(2f);
			qd = false;
			yield return null;
		}
	}
	public class SnipeBalloon : BaseBalloon
	{
		public override void OnStart(ref Balloon instance)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((Component)instance).GetComponentInChildren<Renderer>().material.color = Color.green;
				((Component)instance).GetComponentInChildren<Renderer>().material.EnableKeyword("_EMISSION");
			}
		}

		public override void GetPersistentData(ref Balloon instance, ref JSONObject result)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((JSONNode)result).Add("type", (JSONNode)new JSONString("snipe"));
			}
		}

		public override void SetPersistentData(ref Balloon instance, JSONObject data)
		{
			if (((JSONNode)data).HasKey("type") && ((JSONNode)data)["type"].Value == "snipe")
			{
				((Component)instance).gameObject.AddComponent<GhostBalloon>();
			}
		}

		public void Update()
		{
			//IL_0039: 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_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			if (Time.frameCount % 5 != 0)
			{
				return;
			}
			Balloon componentInParent = ((Component)this).GetComponentInParent<Balloon>();
			if ((Object)(object)componentInParent == (Object)null || componentInParent.IsPopped)
			{
				return;
			}
			LocalAimHandler player_instance = LocalAimHandler.player_instance;
			if (!((Object)(object)player_instance == (Object)null))
			{
				if (Vector3.Distance(((Component)componentInParent).transform.position, ((Component)player_instance).gameObject.transform.position) > 12f)
				{
					((Component)this).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.green * 2f);
				}
				else
				{
					((Component)this).GetComponentInChildren<Renderer>().material.SetColor("_EmissionColor", Color.black);
				}
			}
		}

		public override bool OnShoot(ref Balloon instance, ref ShootableQuery query)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: 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_0081: 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_006f: Unknown result type (might be due to invalid IL or missing references)
			LocalAimHandler player_instance = LocalAimHandler.player_instance;
			if ((Object)(object)player_instance == (Object)null)
			{
				return false;
			}
			QuickDrawListener component = ((Component)player_instance).gameObject.GetComponent<QuickDrawListener>();
			if (!instance.IsPopped)
			{
				if (Vector3.Distance(((Component)instance).transform.position, ((Component)player_instance).gameObject.transform.position) > 12f)
				{
					int num = bonus();
					BaseBalloon.CustomPop(instance, query, 1 + num, 3 + num);
					query.shot_response = (ShotResponse)3;
					query.hit_event = (Event)5;
				}
				else
				{
					query.shot_response = (ShotResponse)2;
					query.hit_event = (Event)0;
					if (!component.snipe)
					{
						ReceiverOnScreenMessage.QueueMessage("", "Stand far enough away until the balloon glows.", true);
						component.snipe = true;
					}
				}
			}
			return false;
		}

		public override bool OnTouch(ref Balloon instance, Collider other)
		{
			return false;
		}
	}
	public class SpawnBalloon : BaseBalloon
	{
		public override void OnStart(ref Balloon instance)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((Component)instance).GetComponentInChildren<Renderer>().material.color = new Color(1f, 0f, 1f);
			}
		}

		public override bool OnShoot(ref Balloon instance, ref ShootableQuery query)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			if (!instance.IsPopped)
			{
				PopSpawn(instance, query);
				query.shot_response = (ShotResponse)3;
				query.hit_event = (Event)5;
			}
			return false;
		}

		public override void GetPersistentData(ref Balloon instance, ref JSONObject result)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			if (!((Object)(object)instance == (Object)null) && !instance.IsPopped)
			{
				((JSONNode)result).Add("type", (JSONNode)new JSONString("spawn"));
			}
		}

		public override void SetPersistentData(ref Balloon instance, JSONObject data)
		{
			if (((JSONNode)data).HasKey("type") && ((JSONNode)data)["type"].Value == "spawn")
			{
				((Component)instance).gameObject.AddComponent<SpawnBalloon>();
			}
		}

		public override bool OnTouch(ref Balloon instance, Collider other)
		{
			PopSpawn(instance, null);
			return false;
		}

		private void PopSpawn(Balloon instance, ShootableQuery query)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			//IL_0008: 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)
			//IL_0013: 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)
			TileEnemySpawn val = new TileEnemySpawn();
			val.spawn_type = (SpawnType)2;
			val.offset = Vector3.up;
			GameObject drone = ReceiverCoreScript.Instance().SpawnStandaloneEnemy(((Component)instance).transform.position, val);
			int num = bonus();
			BaseBalloon.CustomPop(instance, query, 2 + num, 5 + num);
			IEnumerator enumerator = AlertDrone(drone);
			((MonoBehaviour)this).StartCoroutine(enumerator);
		}

		private IEnumerator AlertDrone(GameObject drone)
		{
			yield return (object)new WaitForSeconds(0.01f);
			ShockDrone component = drone.GetComponent<ShockDrone>();
			CameraPart val = (((Object)(object)component != (Object)null) ? component.camera_part : null);
			if ((Object)(object)val != (Object)null)
			{
				val.AlertImmediate();
			}
			yield return null;
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "Bloons";

		public const string PLUGIN_NAME = "Bloons";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}