Decompiled source of MikuBeam v1.0.4

BepInEX/plugins/MikuBeam/MikuBeam.dll

Decompiled 2 hours ago
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BlackMagicAPI.Managers;
using BlackMagicAPI.Modules.Spells;
using BlackMagicAPI.Network;
using FishNet;
using FishNet.Connection;
using FishNet.Object;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("MikuBeam")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("MikuBeam")]
[assembly: AssemblyTitle("MikuBeam")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace MikuBeam;

public class MikuBeamData : SpellData
{
	public override string Name => "Miku Beam";

	public override float Cooldown => 90f;

	public override Color GlowColor => new Color(0.25f, 0.75f, 1f);

	public override string[] SubNames => new string[9] { "Mica Beam", "Mika Beam", "Miko Beam", "Mickey Beam", "Meeko Beam", "Micro Beam", "Meeker Beam", "Miku", "Mica" };

	public override bool CanSpawnInTeamChest => false;

	public override bool DebugForceSpawn => false;
}
public class MikuBeamLogic : SpellLogic
{
	private const float BEAM_DELAY = 10f;

	private const float BEAM_DURATION = 9f;

	private const float BEAM_RANGE = 80f;

	private const float EYE_HEIGHT = 1.5f;

	private const float LIGHTNING_INTERVAL = 0.8f;

	private static GameObject s_explosionPrefab;

	private static Material s_particleMat;

	public override bool CastSpell(PlayerMovement caster, PageController page, Vector3 spawnPos, Vector3 viewDirectionVector, int castingLevel)
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		((MonoBehaviour)this).StartCoroutine(FireLightningLoop(caster, ((Vector3)(ref viewDirectionVector)).normalized));
		return true;
	}

	public override void WriteData(DataWriter writer, PageController page, PlayerMovement caster, Vector3 spawnPos, Vector3 viewDirectionVector, int level)
	{
		//IL_0001: 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_001b: 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_0035: 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)
		writer.Write<float>(spawnPos.x);
		writer.Write<float>(spawnPos.y);
		writer.Write<float>(spawnPos.z);
		writer.Write<float>(viewDirectionVector.x);
		writer.Write<float>(viewDirectionVector.y);
		writer.Write<float>(viewDirectionVector.z);
	}

	public override void SyncData(object[] values)
	{
		//IL_004a: 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)
		if (((SpellLogic)this).IsPrefab)
		{
			return;
		}
		try
		{
			Vector3 castOrigin = default(Vector3);
			((Vector3)(ref castOrigin))..ctor(Convert.ToSingle(values[0]), Convert.ToSingle(values[1]), Convert.ToSingle(values[2]));
			Vector3 castDir = default(Vector3);
			((Vector3)(ref castDir))..ctor(Convert.ToSingle(values[3]), Convert.ToSingle(values[4]), Convert.ToSingle(values[5]));
			((MonoBehaviour)this).StartCoroutine(PlayBeamSequence(castOrigin, castDir));
		}
		catch (Exception ex)
		{
			Debug.LogError((object)("[MikuBeam] SyncData failed: " + ex.Message));
		}
	}

	private IEnumerator FireLightningLoop(PlayerMovement caster, Vector3 dir)
	{
		yield return (object)new WaitForSeconds(10f);
		BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
		MethodInfo lightningStrike = typeof(PlayerMovement).GetMethod("LightningStrike", bindingAttr);
		object? obj = typeof(PlayerMovement).GetField("playerCamera", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(caster);
		Camera playerCam = (Camera)((obj is Camera) ? obj : null);
		if ((Object)(object)s_explosionPrefab == (Object)null)
		{
			Type type = typeof(PlayerMovement).Assembly.GetType("FireballController");
			FieldInfo fieldInfo = type?.GetField("explosion", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (type != null && fieldInfo != null)
			{
				Object[] array = Resources.FindObjectsOfTypeAll(type);
				foreach (Object obj2 in array)
				{
					object? value = fieldInfo.GetValue(obj2);
					GameObject val = (GameObject)((value is GameObject) ? value : null);
					if ((Object)(object)val != (Object)null)
					{
						s_explosionPrefab = val;
						break;
					}
				}
			}
		}
		if ((Object)(object)s_particleMat == (Object)null)
		{
			ParticleSystemRenderer[] array2 = Object.FindObjectsOfType<ParticleSystemRenderer>();
			foreach (ParticleSystemRenderer val2 in array2)
			{
				if ((Object)(object)((Renderer)val2).sharedMaterial != (Object)null)
				{
					s_particleMat = ((Renderer)val2).sharedMaterial;
					break;
				}
			}
		}
		Type expCtrlType = typeof(PlayerMovement).Assembly.GetType("ExplosionController");
		FieldInfo fogeField = expCtrlType?.GetField("foge", bindingAttr);
		FieldInfo levelField = expCtrlType?.GetField("level", bindingAttr);
		MethodInfo explodeMethod = expCtrlType?.GetMethod("Explode", bindingAttr);
		Debug.Log((object)("[MikuBeam] Fireball loop ready | strike=" + ((lightningStrike != null) ? "found" : "missing") + " | cam=" + ((!((Object)(object)playerCam != (Object)null)) ? "none" : (((Behaviour)playerCam).enabled ? "active" : "disabled")) + " | explosionPrefab=" + (((Object)(object)s_explosionPrefab != (Object)null) ? ((Object)s_explosionPrefab).name : "none")));
		for (float elapsed = 0f; elapsed < 9f; elapsed += 0.8f)
		{
			try
			{
				Vector3 val3 = (((Object)(object)playerCam != (Object)null && ((Behaviour)playerCam).enabled) ? ((Component)playerCam).transform.forward : ((Component)caster).transform.forward);
				Vector3 val4 = ((Component)caster).transform.position + Vector3.up * 1.5f;
				float beamRange = GetBeamRange(val4, val3);
				Vector3 val5 = val4 + val3 * beamRange;
				if ((Object)(object)s_explosionPrefab != (Object)null && explodeMethod != null)
				{
					Component component = Object.Instantiate<GameObject>(s_explosionPrefab, val5, Quaternion.identity).GetComponent(expCtrlType);
					if ((Object)(object)component != (Object)null)
					{
						object? obj3 = fogeField?.GetValue(component);
						Component val6 = (Component)((obj3 is Component) ? obj3 : null);
						if ((Object)(object)val6 != (Object)null)
						{
							Object.Destroy((Object)(object)val6);
						}
						levelField?.SetValue(component, 0);
						explodeMethod.Invoke(component, new object[1] { ((Component)caster).gameObject });
					}
				}
				else
				{
					SpawnBlueImpact(val5);
				}
				((MonoBehaviour)this).StartCoroutine(SpawnBlueFire(val5));
				if (lightningStrike != null)
				{
					PlayerMovement[] array3 = Object.FindObjectsOfType<PlayerMovement>();
					foreach (PlayerMovement val7 in array3)
					{
						if (!((Object)(object)((Component)val7).gameObject == (Object)(object)((Component)caster).gameObject) && !(Vector3.Distance(((Component)val7).transform.position, val5) > 8f))
						{
							try
							{
								lightningStrike.Invoke(val7, new object[2]
								{
									val5,
									((Component)caster).gameObject
								});
							}
							catch (Exception ex)
							{
								Debug.LogWarning((object)("[MikuBeam] LightningStrike: " + (ex.InnerException?.Message ?? ex.Message)));
							}
						}
					}
				}
			}
			catch (Exception ex2)
			{
				Debug.LogWarning((object)("[MikuBeam] Tick error: " + ex2.Message));
			}
			yield return (object)new WaitForSeconds(0.8f);
		}
	}

	private static void SpawnBlueImpact(Vector3 pos)
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Expected O, but got Unknown
		//IL_0011: 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_0024: 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)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_010c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: 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_0121: 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_0194: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = new GameObject("MikuBlueImpact");
		val.transform.position = pos;
		ParticleSystem val2 = val.AddComponent<ParticleSystem>();
		MainModule main = val2.main;
		((MainModule)(ref main)).duration = 0.2f;
		((MainModule)(ref main)).loop = false;
		((MainModule)(ref main)).startLifetime = new MinMaxCurve(0.25f, 0.65f);
		((MainModule)(ref main)).startSpeed = new MinMaxCurve(4f, 10f);
		((MainModule)(ref main)).startSize = new MinMaxCurve(0.15f, 0.55f);
		((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(0f, 0.55f, 1f, 1f), new Color(0.6f, 0.92f, 1f, 0.8f));
		((MainModule)(ref main)).gravityModifier = new MinMaxCurve(0.25f);
		((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1;
		((MainModule)(ref main)).maxParticles = 40;
		EmissionModule emission = val2.emission;
		((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(0f);
		((EmissionModule)(ref emission)).SetBursts((Burst[])(object)new Burst[1]
		{
			new Burst(0f, (short)25, (short)35, 1, 0.01f)
		});
		ShapeModule shape = val2.shape;
		((ShapeModule)(ref shape)).enabled = true;
		((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)0;
		((ShapeModule)(ref shape)).radius = 0.3f;
		if ((Object)(object)s_particleMat != (Object)null)
		{
			((Renderer)((Component)val2).GetComponent<ParticleSystemRenderer>()).sharedMaterial = s_particleMat;
		}
		GameObject val3 = new GameObject("ImpactLight");
		val3.transform.SetParent(val.transform, false);
		Light obj = val3.AddComponent<Light>();
		obj.type = (LightType)2;
		obj.color = new Color(0.3f, 0.7f, 1f);
		obj.intensity = 18f;
		obj.range = 14f;
		Object.Destroy((Object)(object)val, 2f);
	}

	private IEnumerator SpawnBlueFire(Vector3 endpoint)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		yield return null;
		Vector3 val = default(Vector3);
		RaycastHit val3 = default(RaycastHit);
		for (int i = 0; i < 2; i++)
		{
			((Vector3)(ref val))..ctor(Random.Range(-1.5f, 1.5f), 0f, Random.Range(-1.5f, 1.5f));
			Vector3 val2 = endpoint + val + Vector3.up * 2f;
			Vector3 pos = endpoint + val;
			if (Physics.Raycast(val2, Vector3.down, ref val3, 30f))
			{
				pos = ((RaycastHit)(ref val3)).point;
			}
			CreateBlueFirePool(pos);
		}
	}

	private static void CreateBlueFirePool(Vector3 pos)
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Expected O, but got Unknown
		//IL_0011: 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_0024: 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)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0145: 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_0178: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = new GameObject("MikuBlueFire");
		val.transform.position = pos;
		ParticleSystem val2 = val.AddComponent<ParticleSystem>();
		MainModule main = val2.main;
		((MainModule)(ref main)).duration = 5f;
		((MainModule)(ref main)).loop = false;
		((MainModule)(ref main)).startLifetime = new MinMaxCurve(1.2f, 2.5f);
		((MainModule)(ref main)).startSpeed = new MinMaxCurve(0.4f, 2f);
		((MainModule)(ref main)).startSize = new MinMaxCurve(0.25f, 0.75f);
		((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(0f, 0.55f, 1f, 1f), new Color(0.3f, 0.9f, 1f, 0.6f));
		((MainModule)(ref main)).gravityModifier = new MinMaxCurve(-0.1f);
		((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1;
		((MainModule)(ref main)).maxParticles = 60;
		EmissionModule emission = val2.emission;
		((EmissionModule)(ref emission)).rateOverTime = new MinMaxCurve(15f);
		ShapeModule shape = val2.shape;
		((ShapeModule)(ref shape)).enabled = true;
		((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)4;
		((ShapeModule)(ref shape)).angle = 15f;
		((ShapeModule)(ref shape)).radius = 0.2f;
		if ((Object)(object)s_particleMat != (Object)null)
		{
			((Renderer)((Component)val2).GetComponent<ParticleSystemRenderer>()).sharedMaterial = s_particleMat;
		}
		GameObject val3 = new GameObject("FlameLight");
		val3.transform.SetParent(val.transform, false);
		Light obj = val3.AddComponent<Light>();
		obj.type = (LightType)2;
		obj.color = new Color(0.2f, 0.65f, 1f);
		obj.intensity = 5f;
		obj.range = 8f;
		Object.Destroy((Object)(object)val, 7f);
	}

	private IEnumerator PlayBeamSequence(Vector3 castOrigin, Vector3 castDir)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: 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)
		if (((Vector3)(ref castDir)).sqrMagnitude < 0.001f)
		{
			castDir = Vector3.forward;
		}
		castDir = ((Vector3)(ref castDir)).normalized;
		Transform casterTf = FindNearestPlayer(castOrigin);
		bool isCaster = IsLocalCaster(casterTf);
		((MonoBehaviour)this).StartCoroutine(ShowCountdown(casterTf, castOrigin));
		string text = Path.Combine(Path.GetDirectoryName(typeof(MikuBeamLogic).Assembly.Location), "Sounds", "MikuBeam.wav");
		string text2 = "file:///" + text.Replace('\\', '/');
		AudioClip clip = null;
		UnityWebRequest req = UnityWebRequestMultimedia.GetAudioClip(text2, (AudioType)20);
		yield return req.SendWebRequest();
		if ((int)req.result == 1)
		{
			clip = DownloadHandlerAudioClip.GetContent(req);
		}
		else
		{
			Debug.LogError((object)("[MikuBeam] Audio load failed: " + req.error));
		}
		req.Dispose();
		GameObject audioObj = new GameObject("MikuBeamAudio");
		AudioSource src = audioObj.AddComponent<AudioSource>();
		src.spatialBlend = 0f;
		src.volume = 1f;
		src.priority = 0;
		if ((Object)(object)clip != (Object)null)
		{
			src.clip = clip;
			src.Play();
		}
		yield return (object)new WaitForSeconds(10f);
		MakeBeamLayer("MikuBeamOuter", 5f, new Color(0.2f, 0.8f, 1f, 0.22f), out var outerObj, out var outerLR);
		MakeBeamLayer("MikuBeamMid", 1.8f, new Color(0.3f, 0.9f, 1f, 0.9f), out var midObj, out var midLR);
		MakeBeamLayer("MikuBeamCore", 0.25f, new Color(0.9f, 1f, 1f, 1f), out var coreObj, out var coreLR);
		GameObject lightObj = new GameObject("MikuBeamLight");
		Light beamLight = lightObj.AddComponent<Light>();
		beamLight.type = (LightType)2;
		beamLight.color = new Color(0.3f, 0.85f, 1f);
		beamLight.intensity = 15f;
		beamLight.range = 40f;
		Shader val = Shader.Find("Particles/Additive") ?? Shader.Find("Particles/Standard Unlit") ?? Shader.Find("Sprites/Default");
		GameObject tipObj = new GameObject("MikuBeamTip");
		Light tipLight = tipObj.AddComponent<Light>();
		tipLight.type = (LightType)2;
		tipLight.color = new Color(0.7f, 0.95f, 1f);
		tipLight.intensity = 25f;
		tipLight.range = 14f;
		LineRenderer[] tipBolts = (LineRenderer[])(object)new LineRenderer[6];
		for (int i = 0; i < 6; i++)
		{
			GameObject val2 = new GameObject("TipBolt" + i);
			val2.transform.SetParent(tipObj.transform);
			tipBolts[i] = val2.AddComponent<LineRenderer>();
			tipBolts[i].useWorldSpace = true;
			tipBolts[i].positionCount = 6;
			tipBolts[i].startWidth = ((i % 2 == 0) ? 0.07f : 0.04f);
			tipBolts[i].endWidth = 0f;
			if ((Object)(object)val != (Object)null)
			{
				((Renderer)tipBolts[i]).material = new Material(val);
			}
			tipBolts[i].startColor = new Color(0.85f, 0.97f, 1f, 1f);
			tipBolts[i].endColor = new Color(0.4f, 0.8f, 1f, 0f);
		}
		float elapsed = 0f;
		while (elapsed < 9f)
		{
			Vector3 val3 = (((Object)(object)casterTf != (Object)null) ? casterTf.position : castOrigin) + Vector3.up * 1.5f;
			Vector3 val4 = ((isCaster && (Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.forward : castDir);
			float beamRange = GetBeamRange(val3, val4);
			Vector3 val5 = val3 + val4 * beamRange;
			float num = 1f + Random.Range(-0.04f, 0.04f);
			ApplyBeam(outerLR, val3, val5, 5f * num, new Color(0.2f, 0.8f, 1f, 0.22f), new Color(0.3f, 0.9f, 1f, 0.04f));
			ApplyBeam(midLR, val3, val5, 1.8f * num, new Color(0.3f, 0.9f, 1f, 0.9f), new Color(0.4f, 0.95f, 1f, 0.35f));
			ApplyBeam(coreLR, val3, val5, 0.25f, new Color(0.9f, 1f, 1f, 1f), new Color(0.9f, 1f, 1f, 0.8f));
			tipObj.transform.position = val5;
			tipLight.intensity = 20f + Random.Range(-8f, 8f);
			for (int j = 0; j < tipBolts.Length; j++)
			{
				Vector3 val6 = val4 + Random.insideUnitSphere * 0.7f;
				Vector3 normalized = ((Vector3)(ref val6)).normalized;
				float length = Random.Range(1f, 4f);
				SetJaggedBolt(tipBolts[j], val5, normalized, length);
				((Renderer)tipBolts[j]).enabled = Random.value > 0.25f;
			}
			lightObj.transform.position = val3;
			beamLight.intensity = (15f + Random.Range(-1.5f, 1.5f)) * num;
			elapsed += Time.deltaTime;
			yield return null;
		}
		float fade = 0f;
		while (fade < 0.5f)
		{
			fade += Time.deltaTime;
			float num2 = 1f - fade / 0.5f;
			Vector3 val7 = (((Object)(object)casterTf != (Object)null) ? casterTf.position : castOrigin) + Vector3.up * 1.5f;
			Vector3 val8 = ((isCaster && (Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.forward : castDir);
			float beamRange2 = GetBeamRange(val7, val8);
			Vector3 val9 = val7 + val8 * beamRange2;
			ApplyBeam(outerLR, val7, val9, 5f * num2, new Color(0.2f, 0.8f, 1f, 0.22f * num2), new Color(0.3f, 0.9f, 1f, 0.04f * num2));
			ApplyBeam(midLR, val7, val9, 1.8f * num2, new Color(0.3f, 0.9f, 1f, 0.9f * num2), new Color(0.4f, 0.95f, 1f, 0.35f * num2));
			ApplyBeam(coreLR, val7, val9, 0.25f * num2, new Color(0.9f, 1f, 1f, num2), new Color(0.9f, 1f, 1f, 0.8f * num2));
			tipObj.transform.position = val9;
			tipLight.intensity = 20f * num2;
			for (int k = 0; k < tipBolts.Length; k++)
			{
				((Renderer)tipBolts[k]).enabled = num2 > 0.3f && Random.value > 0.25f;
			}
			beamLight.intensity = 15f * num2;
			yield return null;
		}
		Object.Destroy((Object)(object)outerObj);
		Object.Destroy((Object)(object)midObj);
		Object.Destroy((Object)(object)coreObj);
		Object.Destroy((Object)(object)lightObj);
		Object.Destroy((Object)(object)tipObj);
		if ((Object)(object)src != (Object)null && (Object)(object)src.clip != (Object)null)
		{
			float num3 = src.clip.length - 10f - 9f - 0.5f;
			if (num3 > 0f)
			{
				yield return (object)new WaitForSeconds(num3);
			}
		}
		Object.Destroy((Object)(object)audioObj);
	}

	private IEnumerator ShowCountdown(Transform casterTf, Vector3 fallbackPos)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		yield return (object)new WaitForSeconds(5f);
		GameObject go = new GameObject("MikuCountdown");
		TextMesh tm = go.AddComponent<TextMesh>();
		tm.fontSize = 200;
		tm.characterSize = 0.035f;
		tm.color = new Color(0.25f, 0.75f, 1f);
		tm.anchor = (TextAnchor)4;
		tm.alignment = (TextAlignment)1;
		Light obj = go.AddComponent<Light>();
		obj.type = (LightType)2;
		obj.color = new Color(0.25f, 0.75f, 1f);
		obj.intensity = 80f;
		obj.range = 60f;
		float t = 0f;
		while (t < 5f)
		{
			tm.text = ((t < 1f) ? "1" : ((t < 2.5f) ? "2" : "3"));
			Vector3 position = (((Object)(object)casterTf != (Object)null) ? casterTf.position : fallbackPos) + Vector3.up * 2.8f;
			go.transform.position = position;
			if ((Object)(object)Camera.main != (Object)null)
			{
				go.transform.rotation = ((Component)Camera.main).transform.rotation;
			}
			t += Time.deltaTime;
			yield return null;
		}
		Object.Destroy((Object)(object)go);
	}

	private static void MakeBeamLayer(string name, float width, Color color, out GameObject go, out LineRenderer lr)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_0039: 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_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_009e: 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_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: Expected O, but got Unknown
		go = new GameObject(name);
		lr = go.AddComponent<LineRenderer>();
		lr.useWorldSpace = true;
		lr.positionCount = 2;
		lr.startWidth = width;
		lr.endWidth = width;
		lr.startColor = color;
		lr.endColor = new Color(color.r, color.g, color.b, color.a * 0.1f);
		Shader val = Shader.Find("Particles/Additive") ?? Shader.Find("Particles/Standard Unlit") ?? Shader.Find("Sprites/Default");
		if ((Object)(object)val != (Object)null)
		{
			((Renderer)lr).material = new Material(val)
			{
				color = color
			};
		}
	}

	private static void ApplyBeam(LineRenderer lr, Vector3 from, Vector3 to, float width, Color startColor, Color endColor)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		lr.SetPosition(0, from);
		lr.SetPosition(1, to);
		lr.startWidth = width;
		lr.endWidth = Mathf.Max(width * 0.15f, 0.05f);
		lr.startColor = startColor;
		lr.endColor = endColor;
	}

	private static float GetBeamRange(Vector3 origin, Vector3 dir)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//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)
		RaycastHit val = default(RaycastHit);
		if (Physics.Raycast(origin + dir * 0.5f, dir, ref val, 80f, -5, (QueryTriggerInteraction)1))
		{
			return Mathf.Min(((RaycastHit)(ref val)).distance + 0.5f, 80f);
		}
		return 80f;
	}

	private static Transform FindNearestPlayer(Vector3 pos)
	{
		//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)
		Transform result = null;
		float num = float.MaxValue;
		PlayerMovement[] array = Object.FindObjectsOfType<PlayerMovement>();
		foreach (PlayerMovement val in array)
		{
			float num2 = Vector3.Distance(((Component)val).transform.position, pos);
			if (num2 < num)
			{
				num = num2;
				result = ((Component)val).transform;
			}
		}
		return result;
	}

	private static void SetJaggedBolt(LineRenderer lr, Vector3 start, Vector3 dir, float length)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//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_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: 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_0036: Unknown result type (might be due to invalid IL or missing references)
		//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_0021: 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_0027: 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_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: 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_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_008b: 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_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: 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_00b5: 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)
		int positionCount = lr.positionCount;
		Vector3 val = Vector3.Cross(dir, Vector3.up);
		if (((Vector3)(ref val)).sqrMagnitude < 0.001f)
		{
			val = Vector3.Cross(dir, Vector3.right);
		}
		val = ((Vector3)(ref val)).normalized;
		Vector3 val2 = Vector3.Cross(dir, val);
		Vector3 normalized = ((Vector3)(ref val2)).normalized;
		for (int i = 0; i < positionCount; i++)
		{
			float num = (float)i / (float)(positionCount - 1);
			float num2 = ((i == 0 || i == positionCount - 1) ? 0f : (0.35f * Mathf.Sin(num * (float)Math.PI)));
			Vector3 val3 = start + dir * (length * num) + val * Random.Range(0f - num2, num2) + normalized * Random.Range(0f - num2, num2);
			lr.SetPosition(i, val3);
		}
	}

	private static bool IsLocalCaster(Transform casterTf)
	{
		if ((Object)(object)casterTf == (Object)null)
		{
			return false;
		}
		try
		{
			NetworkConnection val = InstanceFinder.ClientManager?.Connection;
			if (val == (NetworkConnection)null)
			{
				return false;
			}
			foreach (NetworkObject @object in val.Objects)
			{
				PlayerMovement component = ((Component)@object).GetComponent<PlayerMovement>();
				if ((Object)(object)component != (Object)null && (Object)(object)((Component)component).transform == (Object)(object)casterTf)
				{
					return true;
				}
			}
		}
		catch
		{
		}
		return false;
	}
}
[BepInPlugin("com.thewargod_ares.mikubeam", "MikuBeam", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
	public const string GUID = "com.thewargod_ares.mikubeam";

	public const string NAME = "MikuBeam";

	public const string VERSION = "1.0.0";

	public static string modsync = "all";

	private void Awake()
	{
		BlackMagicManager.RegisterSpell((BaseUnityPlugin)(object)this, typeof(MikuBeamData), typeof(MikuBeamLogic));
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Miku Beam loaded — say 'Miku Beam' to unleash chaos.");
	}
}