Decompiled source of SafetyNet v1.0.0

SafetyNet.dll

Decompiled 3 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 HarmonyLib;
using UnityEngine;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("SafetyNet")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Riintouge")]
[assembly: AssemblyProduct("SafetyNet")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("35101263-734a-416b-8dd5-d02f3033ea98")]
[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 SafetyNet;

public class WireframeCapsule
{
	public Vector3 top { get; protected set; }

	public Vector3[][] latitudes { get; protected set; }

	public Vector3 bottom { get; protected set; }

	public bool isSphere { get; protected set; }

	public WireframeCapsule(Vector3 center, float radius, float cylinderHeight, int latitudeFidelity, int longitudeFidelity)
	{
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: 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_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: 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_01e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_016e: Unknown result type (might be due to invalid IL or missing references)
		if (radius <= 0f)
		{
			throw new ArgumentException("Radius is less than or equal to zero!");
		}
		if (cylinderHeight < 0f)
		{
			throw new ArgumentException("Capsule height is smaller than twice the radius!");
		}
		if (cylinderHeight == 0f)
		{
			isSphere = true;
		}
		latitudeFidelity = (isSphere ? 3 : 4) + 2 * Mathf.Max(0, latitudeFidelity);
		longitudeFidelity = 8 + 4 * Mathf.Max(0, longitudeFidelity);
		float num = cylinderHeight / 2f;
		float num2 = num + radius;
		top = new Vector3(center.x, center.y + num2, center.z);
		bottom = new Vector3(center.x, center.y - num2, center.z);
		latitudes = new Vector3[latitudeFidelity][];
		for (int i = 0; i < latitudes.Length; i++)
		{
			latitudes[i] = (Vector3[])(object)new Vector3[longitudeFidelity];
		}
		if (isSphere)
		{
			int num3 = (latitudes.Length - 1) / 2;
			computeLatitude(ref center, radius, 0f, 0f, ref latitudes[num3]);
			float num4 = 180f / (float)(latitudes.Length + 1);
			for (int num5 = num3 - 1; num5 >= 0; num5--)
			{
				Vector3[] latitude = latitudes[num5];
				int num6 = num3 - num5;
				computeLatitude(ref center, radius, num4 * (float)num6, 0f, ref latitude);
				Vector3[] dstLatitude = latitudes[latitudes.Length - 1 - num5];
				mirrorLatitude(ref latitude, ref dstLatitude, center);
			}
		}
		else
		{
			int num7 = latitudes.Length / 2 - 1;
			float num8 = 180f / (float)latitudes.Length;
			for (int num9 = num7; num9 >= 0; num9--)
			{
				Vector3[] latitude2 = latitudes[num9];
				int num10 = num7 - num9;
				computeLatitude(ref center, radius, num8 * (float)num10, num, ref latitude2);
				Vector3[] dstLatitude2 = latitudes[latitudes.Length - 1 - num9];
				mirrorLatitude(ref latitude2, ref dstLatitude2, center);
			}
		}
	}

	protected float heightForLatitude(float latitudeAngle, float equatorRadius)
	{
		return Mathf.Sin(latitudeAngle * ((float)Math.PI / 180f)) * equatorRadius;
	}

	protected float radiusForLatitude(float latitudeAngle, float equatorRadius)
	{
		return Mathf.Cos(latitudeAngle * ((float)Math.PI / 180f)) * equatorRadius;
	}

	protected void computeLatitude(ref Vector3 center, float equatorRadius, float latitudeAngle, float halfCylinderHeight, ref Vector3[] latitude)
	{
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: 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_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0147: Unknown result type (might be due to invalid IL or missing references)
		//IL_014c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_019c: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
		float num = radiusForLatitude(latitudeAngle, equatorRadius);
		float num2 = center.y + heightForLatitude(latitudeAngle, equatorRadius) + halfCylinderHeight;
		float num3 = 360f / (float)latitude.Length;
		int num4 = latitude.Length / 4;
		float x = center.x;
		float z = center.z;
		latitude[0] = new Vector3(x - num, num2, z);
		latitude[num4] = new Vector3(x, num2, z + num);
		latitude[2 * num4] = new Vector3(x + num, num2, z);
		latitude[3 * num4] = new Vector3(x, num2, z - num);
		float[] array = new float[num4 - 1];
		float[] array2 = new float[num4 - 1];
		for (int i = 0; i < array.Length; i++)
		{
			float num5 = 90f - num3 * (float)(i + 1);
			array[i] = num * Mathf.Sin(num5 * ((float)Math.PI / 180f));
			array2[i] = num * Mathf.Cos(num5 * ((float)Math.PI / 180f));
		}
		for (int j = 1; j < num4; j++)
		{
			float num6 = center.x - array[j - 1];
			float num7 = array2[j - 1];
			latitude[j] = new Vector3(num6, num2, center.z + num7);
			latitude[latitude.Length - j] = new Vector3(num6, num2, center.z - num7);
		}
		for (int k = num4 + 1; k < 2 * num4; k++)
		{
			int num8 = latitude.Length / 2 - (k + 1);
			float num9 = center.x + array[num8];
			float num10 = array2[num8];
			latitude[k] = new Vector3(num9, num2, center.z + num10);
			latitude[latitude.Length - k] = new Vector3(num9, num2, center.z - num10);
		}
	}

	protected void mirrorLatitude(ref Vector3[] srcLatitude, ref Vector3[] dstLatitude, Vector3 center)
	{
		//IL_0000: 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_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		float num = center.y - (srcLatitude[0].y - center.y);
		for (int i = 0; i < srcLatitude.Length; i++)
		{
			dstLatitude[i] = new Vector3(srcLatitude[i].x, num, srcLatitude[i].z);
		}
	}

	public List<Vector3> linePoints()
	{
		//IL_0023: 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_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		int num = latitudes[0].Length;
		List<Vector3> list = new List<Vector3>(1 + num + latitudes.Length * num * 2);
		list.Add(top);
		Vector3[][] array = latitudes;
		foreach (Vector3[] array2 in array)
		{
			list.AddRange(array2);
			list.Add(array2[0]);
		}
		list.Add(bottom);
		for (int num2 = latitudes.Length - 1; num2 >= 0; num2--)
		{
			list.Add(latitudes[num2][1]);
		}
		list.Add(top);
		int num3;
		for (num3 = 2; num3 < num; num3++)
		{
			for (int j = 0; j < latitudes.Length; j++)
			{
				list.Add(latitudes[j][num3]);
			}
			list.Add(bottom);
			num3++;
			for (int num4 = latitudes.Length - 1; num4 >= 0; num4--)
			{
				list.Add(latitudes[num4][num3]);
			}
			list.Add(top);
		}
		return list;
	}
}
[BepInPlugin("com.riintouge.safetynet", "Safety Net", "1.0.0")]
[BepInProcess("valheim.exe")]
public class SafetyNet : BaseUnityPlugin
{
	[HarmonyPatch(typeof(Hud))]
	public class HudPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void UpdatePostfix(Hud __instance)
		{
			//IL_0005: 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_0018: 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)
			KeyCode value = VisiblityToggleKey.Value;
			if ((Object)(object)Player.m_localPlayer != (Object)null && (int)value != 0 && ZInput.GetKeyDown(value, true))
			{
				IsEnabled.Value = !IsEnabled.Value;
			}
		}
	}

	[HarmonyPatch(typeof(EffectArea))]
	public class EffectAreaPatch
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void AwakePostfix(Hud __instance)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Invalid comparison between Unknown and I4
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Invalid comparison between Unknown and I4
			EffectArea[] componentsInChildren = ((Component)__instance).gameObject.GetComponentsInChildren<EffectArea>();
			foreach (EffectArea val in componentsInChildren)
			{
				if ((int)val.m_type == 4 || (int)val.m_type == 32)
				{
					SafetyNetBehaviour.CreateOnFor(((Component)val).gameObject, val);
				}
			}
		}
	}

	public class SafetyNetBehaviour : MonoBehaviour, IComparable<SafetyNetBehaviour>
	{
		protected static Shader MaterialShader;

		protected static Mesh SharedSphereMesh;

		public static WireframeMeshHelper WireframeMeshFactory { get; private set; }

		protected static List<SafetyNetBehaviour> SafetyNets { get; private set; }

		public Collider collider { get; private set; }

		public bool considerForRender { get; private set; }

		public EffectArea effectArea { get; private set; }

		public Type effectAreaType { get; private set; }

		public MeshRenderer meshRenderer { get; private set; }

		public MeshFilter meshFilter { get; private set; }

		public CircleProjector projector { get; private set; }

		protected float distanceFactor { get; private set; } = float.PositiveInfinity;


		protected float capsuleColliderRadius { get; private set; } = -1f;


		static SafetyNetBehaviour()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			WireframeMeshFactory = new WireframeMeshHelper();
			SafetyNets = new List<SafetyNetBehaviour>();
			MaterialShader = null;
			SharedSphereMesh = new Mesh();
			WireframeMeshFactory.latitudeFidelity = LatitudeFidelity.Value;
			WireframeMeshFactory.longitudeFidelity = LongitudeFidelity.Value;
			WireframeMeshFactory.RegenerateMeshForSphere(SharedSphereMesh);
		}

		public void Start()
		{
			//IL_0018: 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_0097: Expected O, but got Unknown
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: 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)
			GameObject gameObject = ((Component)((Component)this).gameObject.transform.parent).gameObject;
			effectArea = GetWidestEffectAreaOfTypeOn(effectAreaType, gameObject);
			collider = GetColliderFromEffectArea(effectArea);
			projector = ((Component)((Component)this).gameObject.transform.root).GetComponentInChildren<CircleProjector>(true);
			MaterialShader = MaterialShader ?? ((IEnumerable<Shader>)Resources.FindObjectsOfTypeAll<Shader>()).FirstOrDefault((Func<Shader, bool>)((Shader x) => ((Object)x).name == "Unlit/Color"));
			Material val = new Material(MaterialShader);
			float num = 0.5f + Mathf.Abs(((Component)this).gameObject.transform.position.x % 0.5f);
			float num2 = 0.5f + Mathf.Abs(((Component)this).gameObject.transform.position.y % 0.5f);
			float num3 = 0.5f + Mathf.Abs(((Component)this).gameObject.transform.position.z % 0.5f);
			val.SetColor("_Color", new Color(num, num2, num3));
			meshRenderer = ((Component)this).gameObject.AddComponent<MeshRenderer>();
			((Renderer)meshRenderer).shadowCastingMode = (ShadowCastingMode)0;
			((Renderer)meshRenderer).receiveShadows = false;
			((Renderer)meshRenderer).material = val;
			((Renderer)meshRenderer).enabled = false;
			meshFilter = ((Component)this).gameObject.AddComponent<MeshFilter>();
			CreateOrUpdateMesh();
			SafetyNets.Add(this);
		}

		public void FixedUpdate()
		{
			if (!IsEnabled.Value)
			{
				considerForRender = false;
				((Renderer)meshRenderer).enabled = false;
				if (Object.op_Implicit((Object)(object)projector))
				{
					((Behaviour)projector).enabled = false;
					((Component)projector).gameObject.SetActive(false);
				}
			}
		}

		public void OnDestroy()
		{
			SafetyNets.Remove(this);
			collider = null;
			effectArea = null;
			meshRenderer = null;
			meshFilter = null;
			projector = null;
		}

		protected bool CreateOrUpdateMesh()
		{
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			if (collider is SphereCollider)
			{
				if ((Object)(object)meshFilter.sharedMesh != (Object)(object)SharedSphereMesh)
				{
					meshFilter.mesh = null;
					meshFilter.sharedMesh = SharedSphereMesh;
					return true;
				}
			}
			else
			{
				Collider obj = collider;
				CapsuleCollider val = (CapsuleCollider)(object)((obj is CapsuleCollider) ? obj : null);
				if (val != null && val.radius != capsuleColliderRadius)
				{
					meshFilter.sharedMesh = null;
					meshFilter.mesh = (Mesh)(((object)meshFilter.mesh) ?? ((object)new Mesh()));
					WireframeMeshFactory.RegenerateMeshForCapsule(meshFilter.mesh, val);
					capsuleColliderRadius = val.radius;
					return true;
				}
			}
			return false;
		}

		protected void UpdateRenderConsiderations()
		{
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			if (IsEnabled.Value && Object.op_Implicit((Object)(object)Player.m_localPlayer) && Object.op_Implicit((Object)(object)effectArea))
			{
				CraftingStation? obj = ((Component)((Component)this).gameObject.transform.root).GetComponentsInChildren<CraftingStation>().FirstOrDefault();
				if (obj != null)
				{
					obj.GetLevel(true);
				}
				float radius = effectArea.GetRadius();
				float num = Mathf.Min(radius, 50f) * 2f;
				float num2 = num * num;
				Vector3 val = ((Component)Player.m_localPlayer).transform.position - ((Component)this).transform.position;
				float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
				if (sqrMagnitude <= num2)
				{
					distanceFactor = sqrMagnitude - radius * radius;
					considerForRender = true;
					if (collider is SphereCollider)
					{
						((Component)this).gameObject.transform.localScale = new Vector3(radius, radius, radius);
					}
					else if (CreateOrUpdateMesh())
					{
						((Component)this).gameObject.transform.localScale = Vector3.one;
					}
					return;
				}
			}
			considerForRender = false;
		}

		public int CompareTo(SafetyNetBehaviour other)
		{
			if (!(distanceFactor < other.distanceFactor))
			{
				if (!(other.distanceFactor < distanceFactor))
				{
					return 0;
				}
				return 1;
			}
			return -1;
		}

		public static void CreateOnFor(GameObject parent, EffectArea effectArea)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Invalid comparison between Unknown and I4
			//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_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: 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_0064: 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_0089: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject((((int)effectArea.m_type == 4) ? "PlayerBase" : "NoMonsters") + "SafetyNet");
			val.transform.parent = parent.transform;
			val.transform.localPosition = new Vector3(0f, 0f, 0f);
			val.transform.localRotation = Quaternion.identity;
			val.transform.localScale = new Vector3(1f, 1f, 1f);
			val.AddComponent<SafetyNetBehaviour>().effectAreaType = effectArea.m_type;
		}

		protected static Collider GetColliderFromEffectArea(EffectArea effectArea)
		{
			return Traverse.Create((object)effectArea).Field("m_collider").GetValue<Collider>();
		}

		protected static EffectArea GetWidestEffectAreaOfTypeOn(Type effectAreaType, GameObject go)
		{
			//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)
			return (from x in go.GetComponentsInChildren<EffectArea>()
				where x.m_type == effectAreaType
				orderby x.GetRadius() descending
				select x).FirstOrDefault();
		}

		public static void UpdateMeshes()
		{
			WireframeMeshFactory.RegenerateMeshForSphere(SharedSphereMesh);
			foreach (SafetyNetBehaviour safetyNet in SafetyNets)
			{
				safetyNet.CreateOrUpdateMesh();
			}
		}

		public static IEnumerable<SafetyNetBehaviour> UpdateRenderConsiderationsAndSort()
		{
			foreach (SafetyNetBehaviour safetyNet in SafetyNets)
			{
				safetyNet.UpdateRenderConsiderations();
			}
			SafetyNets.Sort();
			return SafetyNets;
		}
	}

	public static SafetyNet Instance;

	public static ConfigEntry<bool> IsEnabled;

	public static ConfigEntry<bool> LoadOnStart;

	public static ConfigEntry<int> LatitudeFidelity;

	public static ConfigEntry<int> LongitudeFidelity;

	public static ConfigEntry<int> MaximumObjects;

	public static ConfigEntry<float> UpdateFrequencyInSeconds;

	public static ConfigEntry<KeyCode> VisiblityToggleKey;

	private static Coroutine UpdateRenderCoroutine;

	private readonly Harmony Harmony = new Harmony("com.riintouge.safetynet");

	private void Awake()
	{
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Expected O, but got Unknown
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Expected O, but got Unknown
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Expected O, but got Unknown
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Expected O, but got Unknown
		IsEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("0 - Core", "Enable", false, "Whether this plugin has any effect when loaded.");
		LoadOnStart = ((BaseUnityPlugin)this).Config.Bind<bool>("0 - Core", "LoadOnStart", true, "Whether this plugin loads on game start.");
		LatitudeFidelity = ((BaseUnityPlugin)this).Config.Bind<int>("1 - General", "LatitudeFidelity", 2, new ConfigDescription("The number of additional latitudes per hemisphere.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 20), Array.Empty<object>()));
		LongitudeFidelity = ((BaseUnityPlugin)this).Config.Bind<int>("1 - General", "LongitudeFidelity", 2, new ConfigDescription("The number of additional longitudes per sphere quadrant.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 20), Array.Empty<object>()));
		MaximumObjects = ((BaseUnityPlugin)this).Config.Bind<int>("1 - General", "MaximumObjects", 3, new ConfigDescription("The maximum number of objects for which to show safety visuals.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 20), Array.Empty<object>()));
		UpdateFrequencyInSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("1 - General", "UpdateFrequencyInSeconds", 1000f, new ConfigDescription("How often to recalculate visibility when enabled, in seconds.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 5f), Array.Empty<object>()));
		VisiblityToggleKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("1 - General", "VisiblityToggleKey", (KeyCode)288, "The key to toggle wireframe visibility (effectively toggling IsEnabled).");
		if (LoadOnStart.Value)
		{
			Instance = this;
			Harmony.PatchAll();
			((BaseUnityPlugin)this).Config.SettingChanged += Config_SettingChanged;
			UpdateRenderCoroutine = ((MonoBehaviour)Instance).StartCoroutine(CoUpdateNetRendering());
		}
	}

	private void OnDestroy()
	{
		if (UpdateRenderCoroutine != null)
		{
			((MonoBehaviour)Instance).StopCoroutine(UpdateRenderCoroutine);
		}
		Harmony.UnpatchSelf();
	}

	private void Config_SettingChanged(object sender, SettingChangedEventArgs e)
	{
		if (e.ChangedSetting == LatitudeFidelity || e.ChangedSetting == LongitudeFidelity)
		{
			SafetyNetBehaviour.WireframeMeshFactory.latitudeFidelity = LatitudeFidelity.Value;
			SafetyNetBehaviour.WireframeMeshFactory.longitudeFidelity = LongitudeFidelity.Value;
			SafetyNetBehaviour.UpdateMeshes();
		}
	}

	private IEnumerator CoUpdateNetRendering()
	{
		while (true)
		{
			if (!IsEnabled.Value)
			{
				yield return (object)new WaitForSecondsRealtime(0.5f);
				continue;
			}
			int num = 0;
			foreach (SafetyNetBehaviour item in SafetyNetBehaviour.UpdateRenderConsiderationsAndSort())
			{
				bool flag = num < MaximumObjects.Value && item.considerForRender;
				((Renderer)item.meshRenderer).enabled = flag;
				if (flag)
				{
					num++;
				}
				CircleProjector projector = item.projector;
				if (Object.op_Implicit((Object)(object)projector))
				{
					((Behaviour)projector).enabled = flag;
					((Component)projector).gameObject.SetActive(flag);
				}
			}
			yield return (object)new WaitForSecondsRealtime(UpdateFrequencyInSeconds.Value);
		}
	}
}
public class WireframeMeshHelper
{
	public int latitudeFidelity { get; set; }

	public int longitudeFidelity { get; set; }

	public void RegenerateMeshForSphere(Mesh mesh)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)mesh))
		{
			WireframeCapsule wireframeCapsule = new WireframeCapsule(Vector3.zero, 1f, 0f, latitudeFidelity, longitudeFidelity);
			List<Vector3> list = wireframeCapsule.linePoints();
			list.Add(wireframeCapsule.bottom);
			RegenerateMesh(mesh, list);
		}
	}

	public void RegenerateMeshForCapsule(Mesh mesh, CapsuleCollider collider)
	{
		//IL_0010: 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)
		if (Object.op_Implicit((Object)(object)mesh))
		{
			if (Object.op_Implicit((Object)(object)collider))
			{
				WireframeCapsule wireframeCapsule = new WireframeCapsule(Vector3.zero, collider.radius, collider.height - 2f * collider.radius, latitudeFidelity, longitudeFidelity);
				List<Vector3> list = wireframeCapsule.linePoints();
				list.Add(wireframeCapsule.bottom);
				RegenerateMesh(mesh, list);
			}
			else
			{
				mesh.Clear();
			}
		}
	}

	protected void RegenerateMesh(Mesh mesh, List<Vector3> points)
	{
		int[] array = new int[points.Count];
		for (int i = 0; i < points.Count; i++)
		{
			array[i] = i;
		}
		mesh.Clear(false);
		mesh.vertices = points.ToArray();
		mesh.SetIndices(array, (MeshTopology)4, 0);
		mesh.RecalculateNormals();
	}
}