Decompiled source of SylwisCharm v1.8.8

Sylwi's Charm.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Sylwi's Charm")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Sylwi's Charm")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("565ae970-41fd-48cd-90e7-10edb1394458")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SylwisCharm;

[BepInPlugin("com.miha.sylwischarm", "Sylwis Charm", "1.8.7")]
public class SylwiisOrbPlugin : BaseUnityPlugin
{
	private class OrbState
	{
		public GameObject orb;

		public Light orbLight;

		public bool isRushingOut = false;

		public Vector3 rushOutTarget;

		public bool isReadyForCleanup = false;

		public Vector3 lastPlayerPos;

		public bool hasLastPlayerPos;

		public Vector3 currentVelocity = Vector3.zero;

		public float targetSpeed = 0f;

		public float noiseTimeX;

		public float noiseTimeY;

		public float noiseTimeZ;

		public float baseHeight = 2.3f;

		public float hoverRadius = 2.2f;

		public float minSeparation = 1.3f;

		public float pulseSpeed;

		public float pulseOffset;

		public float pulseStrength = 0.35f;

		public float spawnRushTimer = 0f;

		public float spawnRushSpeed = 10f;
	}

	[CompilerGenerated]
	private sealed class <>c__DisplayClass14_0
	{
		public ZDOID ownerId;

		internal bool <Co_RobustSpawnOrb>b__0(Player p)
		{
			//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)
			return ((Character)p).GetZDOID() == ownerId;
		}
	}

	[CompilerGenerated]
	private sealed class <Co_RobustDismissOrb>d__15 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public ZDOID ownerId;

		public int seed;

		public SylwiisOrbPlugin <>4__this;

		private int <retries>5__1;

		private OrbState <state>5__2;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <Co_RobustDismissOrb>d__15(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<state>5__2 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<retries>5__1 = 0;
				<state>5__2 = null;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			while ((<state>5__2 == null || (Object)(object)<state>5__2.orb == (Object)null) && <retries>5__1 < 10)
			{
				<>4__this.orbs.TryGetValue(ownerId, out <state>5__2);
				if (<state>5__2 == null || (Object)(object)<state>5__2.orb == (Object)null)
				{
					<retries>5__1++;
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
			}
			if (<state>5__2 == null || (Object)(object)<state>5__2.orb == (Object)null)
			{
				((BaseUnityPlugin)<>4__this).Logger.LogWarning((object)$"SylwiisOrb: Failed to find active orb state for ZDOID {ownerId} during dismissal after {10} attempts (RPC). Dismissal aborted.");
				return false;
			}
			<>4__this.ImmediateDismissOrb(ownerId, seed);
			return false;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <Co_RobustSpawnOrb>d__14 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public ZDOID ownerId;

		public int seed;

		public SylwiisOrbPlugin <>4__this;

		private <>c__DisplayClass14_0 <>8__1;

		private int <retries>5__2;

		private Player <owner>5__3;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <Co_RobustSpawnOrb>d__14(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>8__1 = null;
			<owner>5__3 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0034: 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_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>8__1 = new <>c__DisplayClass14_0();
				<>8__1.ownerId = ownerId;
				<retries>5__2 = 0;
				<owner>5__3 = null;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			while ((Object)(object)<owner>5__3 == (Object)null && <retries>5__2 < 10)
			{
				<owner>5__3 = ((IEnumerable<Player>)Player.GetAllPlayers()).FirstOrDefault((Func<Player, bool>)((Player p) => ((Character)p).GetZDOID() == <>8__1.ownerId));
				if ((Object)(object)<owner>5__3 == (Object)null)
				{
					<retries>5__2++;
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
			}
			if ((Object)(object)<owner>5__3 == (Object)null)
			{
				((BaseUnityPlugin)<>4__this).Logger.LogWarning((object)$"SylwiisOrb: Failed to find player with ZDOID {<>8__1.ownerId} after {10} attempts. Orb spawn aborted (RPC).");
				return false;
			}
			<>4__this.ImmediateSpawnOrb(<>8__1.ownerId, <owner>5__3, seed);
			return false;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private ConfigEntry<KeyCode> configSummonKey;

	private const float TeleportSnapDistance = 50f;

	private readonly Dictionary<ZDOID, OrbState> orbs = new Dictionary<ZDOID, OrbState>();

	private const string RpcSpawn = "SylwiisOrb_Spawn";

	private const string RpcDismiss = "SylwiisOrb_Dismiss";

	private bool rpcsRegistered = false;

	private ZDOID localPlayerZDOID = ZDOID.None;

	private void Awake()
	{
		configSummonKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("General", "SummonKey", (KeyCode)289, "The key used to summon or dismiss the Sylwiis Orb. Set to any Unity KeyCode.");
	}

	private void Update()
	{
		//IL_015a: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: 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_0055: 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_0069: 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_0096: 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_0198: Unknown result type (might be due to invalid IL or missing references)
		//IL_019d: 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_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_0202: Unknown result type (might be due to invalid IL or missing references)
		if (!rpcsRegistered && ZRoutedRpc.instance != null)
		{
			RegisterRPCs();
			rpcsRegistered = true;
		}
		if (IsTextInputFocused())
		{
			return;
		}
		Player localPlayer = Player.m_localPlayer;
		if ((Object)(object)localPlayer != (Object)null)
		{
			localPlayerZDOID = ((Character)localPlayer).GetZDOID();
			if (((Character)localPlayer).IsDead())
			{
				ImmediateDespawnOrb(localPlayerZDOID);
			}
			if (ZInput.GetKeyDown(configSummonKey.Value, true))
			{
				ZDOID val = localPlayerZDOID;
				OrbState value;
				bool flag = orbs.TryGetValue(val, out value) && (Object)(object)value.orb != (Object)null && !value.isRushingOut;
				int num = Random.Range(int.MinValue, int.MaxValue);
				if (ZRoutedRpc.instance != null)
				{
					ZPackage val2 = new ZPackage();
					val2.Write(val);
					val2.Write(num);
					if (!flag)
					{
						ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "SylwiisOrb_Spawn", new object[1] { val2 });
					}
					else
					{
						ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "SylwiisOrb_Dismiss", new object[1] { val2 });
					}
				}
			}
		}
		else
		{
			localPlayerZDOID = ZDOID.None;
		}
		List<Player> allPlayers = Player.GetAllPlayers();
		foreach (KeyValuePair<ZDOID, OrbState> item in orbs.ToList())
		{
			ZDOID ownerId = item.Key;
			OrbState value2 = item.Value;
			if ((Object)(object)value2.orb == (Object)null || value2.isReadyForCleanup)
			{
				ImmediateDespawnOrb(ownerId);
				continue;
			}
			Player val3 = ((IEnumerable<Player>)allPlayers).FirstOrDefault((Func<Player, bool>)((Player p) => ((Character)p).GetZDOID() == ownerId));
			if ((Object)(object)val3 == (Object)null)
			{
				ImmediateDespawnOrb(ownerId);
				continue;
			}
			UpdateOrbMovement(value2, val3);
			UpdateOrbGlow(value2);
		}
	}

	private void RegisterRPCs()
	{
		ZRoutedRpc.instance.Register<ZPackage>("SylwiisOrb_Spawn", (Action<long, ZPackage>)delegate(long sender, ZPackage pkg)
		{
			//IL_0002: 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_0011: Unknown result type (might be due to invalid IL or missing references)
			ZDOID ownerId2 = pkg.ReadZDOID();
			int seed2 = pkg.ReadInt();
			((MonoBehaviour)this).StartCoroutine(Co_RobustSpawnOrb(ownerId2, seed2));
		});
		ZRoutedRpc.instance.Register<ZPackage>("SylwiisOrb_Dismiss", (Action<long, ZPackage>)delegate(long sender, ZPackage pkg)
		{
			//IL_0002: 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_0011: Unknown result type (might be due to invalid IL or missing references)
			ZDOID ownerId = pkg.ReadZDOID();
			int seed = pkg.ReadInt();
			((MonoBehaviour)this).StartCoroutine(Co_RobustDismissOrb(ownerId, seed));
		});
		((BaseUnityPlugin)this).Logger.LogInfo((object)"SylwiisOrb: RPCs registered");
	}

	private bool IsTextInputFocused()
	{
		if ((Object)(object)Chat.instance != (Object)null && Chat.instance.HasFocus())
		{
			return true;
		}
		if (Console.IsVisible())
		{
			return true;
		}
		return false;
	}

	private void ImmediateDespawnOrb(ZDOID ownerId)
	{
		//IL_0007: 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)
		if (orbs.TryGetValue(ownerId, out var value))
		{
			if ((Object)(object)value.orb != (Object)null)
			{
				Object.Destroy((Object)(object)value.orb);
			}
			orbs.Remove(ownerId);
		}
	}

	private void ImmediateSpawnOrb(ZDOID ownerId, Player owner, int seed)
	{
		//IL_0007: 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)
		if (!orbs.TryGetValue(ownerId, out var value))
		{
			value = new OrbState();
			orbs[ownerId] = value;
		}
		if (!((Object)(object)value.orb != (Object)null))
		{
			SpawnOrb(value, owner, seed);
		}
	}

	private void ImmediateDismissOrb(ZDOID ownerId, int seed)
	{
		//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_0015: 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)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		if (orbs.TryGetValue(ownerId, out var value) && !((Object)(object)value.orb == (Object)null) && !value.isRushingOut)
		{
			Player val = ((IEnumerable<Player>)Player.GetAllPlayers()).FirstOrDefault((Func<Player, bool>)((Player p) => ((Character)p).GetZDOID() == ownerId));
			if ((Object)(object)val == (Object)null)
			{
				ImmediateDespawnOrb(ownerId);
			}
			else
			{
				StartRushOut(value, ownerId, seed);
			}
		}
	}

	[IteratorStateMachine(typeof(<Co_RobustSpawnOrb>d__14))]
	private IEnumerator Co_RobustSpawnOrb(ZDOID ownerId, int seed)
	{
		//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 decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <Co_RobustSpawnOrb>d__14(0)
		{
			<>4__this = this,
			ownerId = ownerId,
			seed = seed
		};
	}

	[IteratorStateMachine(typeof(<Co_RobustDismissOrb>d__15))]
	private IEnumerator Co_RobustDismissOrb(ZDOID ownerId, int seed)
	{
		//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 decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <Co_RobustDismissOrb>d__15(0)
		{
			<>4__this = this,
			ownerId = ownerId,
			seed = seed
		};
	}

	private void SpawnOrb(OrbState s, Player owner, int seed)
	{
		//IL_0018: 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_0071: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: 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_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: 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_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		//IL_0147: Unknown result type (might be due to invalid IL or missing references)
		//IL_0160: Unknown result type (might be due to invalid IL or missing references)
		//IL_0165: Unknown result type (might be due to invalid IL or missing references)
		//IL_0170: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: Expected O, but got Unknown
		//IL_0195: Unknown result type (might be due to invalid IL or missing references)
		//IL_019f: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0200: Unknown result type (might be due to invalid IL or missing references)
		//IL_020f: Unknown result type (might be due to invalid IL or missing references)
		//IL_021b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0220: Unknown result type (might be due to invalid IL or missing references)
		//IL_022b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0232: Expected O, but got Unknown
		//IL_025f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0310: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fd: Expected O, but got Unknown
		//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_040e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0415: Expected O, but got Unknown
		//IL_0419: Unknown result type (might be due to invalid IL or missing references)
		//IL_0425: Unknown result type (might be due to invalid IL or missing references)
		//IL_0431: Unknown result type (might be due to invalid IL or missing references)
		//IL_0440: Unknown result type (might be due to invalid IL or missing references)
		//IL_0454: Unknown result type (might be due to invalid IL or missing references)
		//IL_045e: Unknown result type (might be due to invalid IL or missing references)
		//IL_04eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_04f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_057c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0581: Unknown result type (might be due to invalid IL or missing references)
		//IL_0591: Unknown result type (might be due to invalid IL or missing references)
		//IL_05b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_05ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_05c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_05da: Unknown result type (might be due to invalid IL or missing references)
		//IL_05e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_05ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_05f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0601: Unknown result type (might be due to invalid IL or missing references)
		//IL_0606: Unknown result type (might be due to invalid IL or missing references)
		//IL_061b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0620: Unknown result type (might be due to invalid IL or missing references)
		//IL_0629: Unknown result type (might be due to invalid IL or missing references)
		//IL_0635: Unknown result type (might be due to invalid IL or missing references)
		//IL_063a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0670: Unknown result type (might be due to invalid IL or missing references)
		//IL_06b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_06bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_06be: Unknown result type (might be due to invalid IL or missing references)
		//IL_06c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_06c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_06cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_06ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_06d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_06d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_06da: Unknown result type (might be due to invalid IL or missing references)
		//IL_06de: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0717: Unknown result type (might be due to invalid IL or missing references)
		//IL_0719: Unknown result type (might be due to invalid IL or missing references)
		//IL_071d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0722: Unknown result type (might be due to invalid IL or missing references)
		//IL_0727: Unknown result type (might be due to invalid IL or missing references)
		//IL_072b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0730: Unknown result type (might be due to invalid IL or missing references)
		//IL_0735: Unknown result type (might be due to invalid IL or missing references)
		//IL_0738: Unknown result type (might be due to invalid IL or missing references)
		//IL_073a: Unknown result type (might be due to invalid IL or missing references)
		//IL_078b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0797: Unknown result type (might be due to invalid IL or missing references)
		//IL_07ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_0820: Unknown result type (might be due to invalid IL or missing references)
		//IL_0825: Unknown result type (might be due to invalid IL or missing references)
		//IL_0392: Unknown result type (might be due to invalid IL or missing references)
		//IL_0399: Unknown result type (might be due to invalid IL or missing references)
		s.orb = GameObject.CreatePrimitive((PrimitiveType)0);
		s.orb.transform.localScale = Vector3.one * 0.3f;
		Collider component = s.orb.GetComponent<Collider>();
		if ((Object)(object)component != (Object)null)
		{
			Object.Destroy((Object)(object)component);
		}
		s.orbLight = s.orb.AddComponent<Light>();
		s.orbLight.type = (LightType)2;
		s.orbLight.color = Color.white;
		s.orbLight.intensity = 2f;
		s.orbLight.range = 8f;
		ParticleSystem val = s.orb.AddComponent<ParticleSystem>();
		MainModule main = val.main;
		((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.45f);
		((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(0f);
		((MainModule)(ref main)).startSize = MinMaxCurve.op_Implicit(0.15f);
		((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(0.4f, 0.6f, 1f, 1f));
		((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1;
		EmissionModule emission = val.emission;
		((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(0f);
		((EmissionModule)(ref emission)).rateOverDistance = MinMaxCurve.op_Implicit(40f);
		ShapeModule shape = val.shape;
		((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)0;
		((ShapeModule)(ref shape)).radius = 0.05f;
		ColorOverLifetimeModule colorOverLifetime = val.colorOverLifetime;
		((ColorOverLifetimeModule)(ref colorOverLifetime)).enabled = true;
		Gradient val2 = new Gradient();
		val2.SetKeys((GradientColorKey[])(object)new GradientColorKey[2]
		{
			new GradientColorKey(new Color(0.4f, 0.6f, 1f, 1f), 0f),
			new GradientColorKey(new Color(0.4f, 0.6f, 1f, 1f), 1f)
		}, (GradientAlphaKey[])(object)new GradientAlphaKey[2]
		{
			new GradientAlphaKey(1f, 0f),
			new GradientAlphaKey(0f, 1f)
		});
		((ColorOverLifetimeModule)(ref colorOverLifetime)).color = MinMaxGradient.op_Implicit(val2);
		SizeOverLifetimeModule sizeOverLifetime = val.sizeOverLifetime;
		((SizeOverLifetimeModule)(ref sizeOverLifetime)).enabled = true;
		AnimationCurve val3 = new AnimationCurve();
		val3.AddKey(0f, 1f);
		val3.AddKey(1f, 0f);
		((SizeOverLifetimeModule)(ref sizeOverLifetime)).size = new MinMaxCurve(1f, val3);
		Renderer component2 = s.orb.GetComponent<Renderer>();
		Material val4 = null;
		GameObject val5 = (((Object)(object)ZNetScene.instance != (Object)null) ? ZNetScene.instance.GetPrefab("staff_iceshard_projectile") : null);
		if ((Object)(object)val5 != (Object)null)
		{
			Renderer componentInChildren = val5.GetComponentInChildren<Renderer>(true);
			if ((Object)(object)componentInChildren != (Object)null && (Object)(object)componentInChildren.sharedMaterial != (Object)null)
			{
				val4 = componentInChildren.sharedMaterial;
			}
		}
		if ((Object)(object)val4 != (Object)null)
		{
			component2.material = new Material(val4);
		}
		else
		{
			Material material = component2.material;
			material.color = Color.black;
			if (material.HasProperty("_Metallic"))
			{
				material.SetFloat("_Metallic", 0f);
			}
			if (material.HasProperty("_Glossiness"))
			{
				material.SetFloat("_Glossiness", 0f);
			}
			Color val6 = default(Color);
			((Color)(ref val6))..ctor(0.4f, 0.6f, 1f, 1f);
			material.EnableKeyword("_EMISSION");
			material.SetColor("_EmissionColor", val6 * 20f);
		}
		GameObject val7 = GameObject.CreatePrimitive((PrimitiveType)0);
		val7.transform.SetParent(s.orb.transform);
		val7.transform.localPosition = Vector3.zero;
		val7.transform.localScale = s.orb.transform.localScale * 1.15f;
		MeshRenderer component3 = val7.GetComponent<MeshRenderer>();
		Material val8 = new Material(component2.material);
		val8.color = new Color(val8.color.r, val8.color.g, val8.color.b, 0.25f);
		val8.SetColor("_EmissionColor", val8.color * 10f);
		val8.globalIlluminationFlags = (MaterialGlobalIlluminationFlags)1;
		val8.EnableKeyword("_EMISSION");
		val8.SetInt("_SrcBlend", 5);
		val8.SetInt("_DstBlend", 1);
		val8.SetInt("_ZWrite", 0);
		val8.DisableKeyword("_ALPHATEST_ON");
		val8.EnableKeyword("_ALPHABLEND_ON");
		val8.renderQueue = 3000;
		((Renderer)component3).material = val8;
		Object.Destroy((Object)(object)val7.GetComponent<Collider>());
		DynamicGI.SetEmissive((Renderer)(object)component3, val8.color * 10f);
		Material material2 = component2.material;
		material2.SetFloat("_Mode", 3f);
		material2.SetInt("_SrcBlend", 5);
		material2.SetInt("_DstBlend", 10);
		material2.SetInt("_ZWrite", 0);
		material2.DisableKeyword("_ALPHATEST_ON");
		material2.EnableKeyword("_ALPHABLEND_ON");
		material2.DisableKeyword("_ALPHAPREMULTIPLY_ON");
		material2.renderQueue = 3000;
		Color color = material2.color;
		color.a = 0.6f;
		material2.color = color;
		ParticleSystemRenderer component4 = ((Component)val).GetComponent<ParticleSystemRenderer>();
		((Renderer)component4).material = material2;
		component4.renderMode = (ParticleSystemRenderMode)0;
		MainModule main2 = val.main;
		((MainModule)(ref main2)).startSize = new MinMaxCurve(0.05f, 0.15f);
		((MainModule)(ref main2)).startLifetime = MinMaxCurve.op_Implicit(0.35f);
		((MainModule)(ref main2)).startColor = MinMaxGradient.op_Implicit(new Color(color.r, color.g, color.b, 0.35f));
		((MainModule)(ref main2)).simulationSpace = (ParticleSystemSimulationSpace)1;
		EmissionModule emission2 = val.emission;
		((EmissionModule)(ref emission2)).rateOverDistance = MinMaxCurve.op_Implicit(80f);
		ShapeModule shape2 = val.shape;
		((ShapeModule)(ref shape2)).shapeType = (ParticleSystemShapeType)4;
		((ShapeModule)(ref shape2)).radius = 0.15f;
		((ShapeModule)(ref shape2)).angle = 15f;
		((ShapeModule)(ref shape2)).position = new Vector3(0f, 0f, -0.15f);
		ParticleSystemRenderer component5 = ((Component)val).GetComponent<ParticleSystemRenderer>();
		((Renderer)component5).material = material2;
		component5.renderMode = (ParticleSystemRenderMode)0;
		component5.alignment = (ParticleSystemRenderSpace)1;
		component5.sortMode = (ParticleSystemSortMode)1;
		Random random = new Random(seed);
		Vector3 position = ((Component)owner).transform.position;
		Vector3 val9 = ((Character)owner).GetLookDir();
		Vector3 normalized = ((Vector3)(ref val9)).normalized;
		val9 = Vector3.Cross(Vector3.up, normalized);
		Vector3 normalized2 = ((Vector3)(ref val9)).normalized;
		float num = Mathf.Lerp(100f, 150f, (float)random.NextDouble());
		float num2 = Mathf.Lerp(-20f, 20f, (float)random.NextDouble());
		Vector3 val10 = position + normalized * num + normalized2 * num2;
		float groundY = GetGroundY(val10, position.y);
		s.baseHeight = 2.3f;
		s.hoverRadius = 2.2f;
		s.minSeparation = 1.3f;
		float num3 = s.baseHeight + Mathf.Lerp(-0.3f, 0.3f, (float)random.NextDouble());
		Vector3 position2 = default(Vector3);
		((Vector3)(ref position2))..ctor(val10.x, groundY + num3, val10.z);
		s.orb.transform.position = position2;
		s.spawnRushTimer = Mathf.Lerp(2f, 3f, (float)random.NextDouble());
		s.spawnRushSpeed = num / Mathf.Max(0.8f, s.spawnRushTimer);
		s.noiseTimeX = Random.value * 100f;
		s.noiseTimeY = Random.value * 100f;
		s.noiseTimeZ = Random.value * 100f;
		s.currentVelocity = Vector3.zero;
		s.targetSpeed = 0f;
		s.hasLastPlayerPos = false;
		s.pulseSpeed = Mathf.Lerp(0.6f, 1.2f, (float)random.NextDouble());
		s.pulseOffset = Mathf.Lerp(0f, (float)Math.PI * 2f, (float)random.NextDouble());
		s.pulseStrength = 0.35f;
		s.isRushingOut = false;
		s.isReadyForCleanup = false;
	}

	private void StartRushOut(OrbState s, ZDOID ownerId, int seed)
	{
		//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_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_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)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: 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_0110: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)s.orb == (Object)null))
		{
			Player val = ((IEnumerable<Player>)Player.GetAllPlayers()).FirstOrDefault((Func<Player, bool>)((Player p) => ((Character)p).GetZDOID() == ownerId));
			if (!((Object)(object)val == (Object)null))
			{
				s.isRushingOut = true;
				s.isReadyForCleanup = false;
				Random random = new Random(seed);
				double num = Math.PI * 2.0 * random.NextDouble();
				float num2 = 120f;
				Vector2 val2 = new Vector2((float)Math.Cos(num), (float)Math.Sin(num)) * num2;
				Vector3 rushOutTarget = ((Component)val).transform.position + new Vector3(val2.x, 0f, val2.y);
				s.rushOutTarget = rushOutTarget;
				s.rushOutTarget.y = GetGroundY(s.rushOutTarget, ((Component)val).transform.position.y) + s.baseHeight;
				float num3 = s.spawnRushSpeed * 0.6f;
				float num4 = Vector3.Distance(s.orb.transform.position, s.rushOutTarget);
				s.spawnRushTimer = num4 / Mathf.Max(0.8f, num4 / num3);
				s.spawnRushSpeed = num3;
			}
		}
	}

	private void UpdateOrbMovement(OrbState s, Player owner)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: 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_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: 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_0061: 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_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: 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_008e: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00de: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_012d: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01de: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e9: 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_0115: 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_012a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0258: Unknown result type (might be due to invalid IL or missing references)
		//IL_025d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0270: Unknown result type (might be due to invalid IL or missing references)
		//IL_0275: Unknown result type (might be due to invalid IL or missing references)
		//IL_0288: Unknown result type (might be due to invalid IL or missing references)
		//IL_0298: Unknown result type (might be due to invalid IL or missing references)
		//IL_029d: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_030e: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0361: Unknown result type (might be due to invalid IL or missing references)
		//IL_036d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0374: Unknown result type (might be due to invalid IL or missing references)
		//IL_0379: Unknown result type (might be due to invalid IL or missing references)
		//IL_0397: Unknown result type (might be due to invalid IL or missing references)
		//IL_0328: Unknown result type (might be due to invalid IL or missing references)
		//IL_032b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0430: Unknown result type (might be due to invalid IL or missing references)
		//IL_0407: Unknown result type (might be due to invalid IL or missing references)
		//IL_03fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_040c: Unknown result type (might be due to invalid IL or missing references)
		//IL_040e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0410: Unknown result type (might be due to invalid IL or missing references)
		//IL_0418: Unknown result type (might be due to invalid IL or missing references)
		//IL_041d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0422: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)s.orb == (Object)null)
		{
			return;
		}
		float deltaTime = Time.deltaTime;
		Vector3 position = ((Component)owner).transform.position;
		float groundY = GetGroundY(new Vector3(position.x, 0f, position.z), position.y);
		float num = Mathf.Max(groundY, position.y);
		Vector3 val = new Vector3(position.x, num, position.z) + Vector3.up * s.baseHeight;
		float num2 = Vector3.Distance(s.orb.transform.position, val);
		if (num2 > 50f && s.spawnRushTimer <= 0f && !s.isRushingOut)
		{
			s.orb.transform.position = val;
			s.currentVelocity = Vector3.zero;
			s.targetSpeed = 0f;
			s.lastPlayerPos = val;
			return;
		}
		Vector3 val2 = Vector3.zero;
		if (s.hasLastPlayerPos)
		{
			val2 = (position - s.lastPlayerPos) / Mathf.Max(deltaTime, 0.0001f);
		}
		s.lastPlayerPos = position;
		s.hasLastPlayerPos = true;
		Vector3 val3 = val;
		s.noiseTimeX += deltaTime * 0.25f;
		s.noiseTimeY += deltaTime * 0.25f;
		s.noiseTimeZ += deltaTime * 0.25f;
		Vector3 val4 = new Vector3((Mathf.PerlinNoise(s.noiseTimeX, 0f) - 0.5f) * 2f, (Mathf.PerlinNoise(s.noiseTimeY, 1f) - 0.5f) * 2f, (Mathf.PerlinNoise(s.noiseTimeZ, 2f) - 0.5f) * 2f) * s.hoverRadius;
		Vector3 val5 = val3 + val4;
		float num3 = Mathf.Max(3f, ((Vector3)(ref val2)).magnitude + 2.5f);
		bool flag = s.spawnRushTimer > 0f;
		if (flag)
		{
			num3 = s.spawnRushSpeed;
			s.spawnRushTimer -= deltaTime;
		}
		s.targetSpeed = Mathf.Lerp(s.targetSpeed, num3, deltaTime * 2f);
		Vector3 val6 = Vector3.SmoothDamp(s.orb.transform.position, val5, ref s.currentVelocity, 0.25f, s.targetSpeed);
		if (s.isRushingOut)
		{
			Vector3 val7 = s.rushOutTarget - s.orb.transform.position;
			Vector3 normalized = ((Vector3)(ref val7)).normalized;
			val6 = s.orb.transform.position + normalized * s.spawnRushSpeed * deltaTime;
			float groundY2 = GetGroundY(new Vector3(val6.x, 0f, val6.z), position.y);
			float num4 = groundY2 + s.baseHeight - 0.2f;
			if (val6.y < num4)
			{
				val6.y = num4;
			}
			if (Vector3.Distance(val6, s.rushOutTarget) < 1f)
			{
				s.isRushingOut = false;
				s.isReadyForCleanup = true;
				return;
			}
		}
		if (flag)
		{
			float groundY3 = GetGroundY(new Vector3(val6.x, 0f, val6.z), position.y);
			float num5 = groundY3 + s.baseHeight - 0.2f;
			if (val6.y < num5)
			{
				val6.y = num5;
			}
		}
		Vector3 val8 = position + Vector3.up * (s.baseHeight - 0.4f);
		Vector3 val9 = val6 - val8;
		float magnitude = ((Vector3)(ref val9)).magnitude;
		if (magnitude < s.minSeparation)
		{
			Vector3 val10 = ((magnitude > 0.001f) ? ((Vector3)(ref val9)).normalized : Vector3.up);
			val6 = val8 + val10 * s.minSeparation;
		}
		s.orb.transform.position = val6;
		s.orb.transform.Rotate(0f, 25f * deltaTime, 0f, (Space)0);
	}

	private void UpdateOrbGlow(OrbState s)
	{
		if (!((Object)(object)s.orbLight == (Object)null))
		{
			float num = Mathf.Sin(Time.time * s.pulseSpeed + s.pulseOffset) * s.pulseStrength + 1f;
			s.orbLight.intensity = 2f * num;
		}
	}

	private float GetGroundY(Vector3 xzPos, float fallbackY)
	{
		//IL_0027: 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_003f: 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)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: 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_00a2: 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)
		//IL_00d6: 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)
		float result = fallbackY;
		if ((Object)(object)ZoneSystem.instance != (Object)null)
		{
			try
			{
				result = ZoneSystem.instance.GetGroundHeight(xzPos);
			}
			catch
			{
				Vector3 val = default(Vector3);
				((Vector3)(ref val))..ctor(xzPos.x, fallbackY + 200f, xzPos.z);
				RaycastHit val2 = default(RaycastHit);
				if (Physics.Raycast(val, Vector3.down, ref val2, 400f, LayerMask.GetMask(new string[2] { "terrain", "Default" })))
				{
					result = ((RaycastHit)(ref val2)).point.y;
				}
			}
		}
		else
		{
			Vector3 val3 = default(Vector3);
			((Vector3)(ref val3))..ctor(xzPos.x, fallbackY + 200f, xzPos.z);
			RaycastHit val4 = default(RaycastHit);
			if (Physics.Raycast(val3, Vector3.down, ref val4, 400f, LayerMask.GetMask(new string[2] { "terrain", "Default" })))
			{
				result = ((RaycastHit)(ref val4)).point.y;
			}
		}
		return result;
	}
}