Decompiled source of PeakPocalypse v0.1.1

plugins/com.github.Evanovah.PeakPocalypse.dll

Decompiled 2 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("com.github.Evanovah.PeakPocalypse")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.1.0")]
[assembly: AssemblyInformationalVersion("0.1.1")]
[assembly: AssemblyProduct("com.github.Evanovah.PeakPocalypse")]
[assembly: AssemblyTitle("PeakPocalypse")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace PeakPocalypse
{
	[BepInPlugin("com.github.Evanovah.PeakPocalypse", "PeakPocalypse", "0.1.1")]
	public class Plugin : BaseUnityPlugin
	{
		private class ZombieLabel : MonoBehaviour
		{
			private Rigidbody? _rb;

			private Vector3 _offset;

			private void Start()
			{
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				Transform parent = ((Component)this).transform.parent;
				if ((Object)(object)parent != (Object)null)
				{
					_rb = ((Component)parent).GetComponentInChildren<Rigidbody>();
					_offset = ((Component)this).transform.localPosition;
					((Component)this).transform.SetParent((Transform)null, true);
				}
			}

			private void LateUpdate()
			{
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				//IL_0057: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_rb != (Object)null)
				{
					((Component)this).transform.position = _rb.position + _offset;
				}
				else
				{
					Object.Destroy((Object)(object)((Component)this).gameObject);
				}
				Camera main = Camera.main;
				if ((Object)(object)main != (Object)null)
				{
					((Component)this).transform.rotation = ((Component)main).transform.rotation;
				}
			}
		}

		private const int DesiredMaxActiveZombies = 100000;

		private static readonly string[] ZombieNames = new string[7] { "Nikki", "Leet", "Noah", "Martin", "Take", "Kien", "Amelia" };

		private static readonly Random _nameRng = new Random();

		private static readonly Color PeakTextColor = new Color(0.8745f, 0.8549f, 0.7608f, 1f);

		private string _statusMessage = "";

		private float _statusTimer;

		private float _zombieSpawnTimer = 60f;

		private static TMP_FontAsset? _fontAsset;

		private static int _shadowMaterialId;

		private bool _fontSearched;

		private Canvas? _canvas;

		private TextMeshProUGUI? _titleText;

		private TextMeshProUGUI? _timerText;

		private TextMeshProUGUI? _statusText;

		public const string Id = "com.github.Evanovah.PeakPocalypse";

		internal static ManualLogSource Log { get; private set; } = null;


		public static string Name => "PeakPocalypse";

		public static string Version => "0.1.1";

		private void Awake()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			Harmony val = new Harmony("com.github.Evanovah.PeakPocalypse");
			val.PatchAll();
			Log.LogInfo((object)("Plugin " + Name + " is loaded!"));
		}

		private void FindFont()
		{
			if (_fontSearched)
			{
				return;
			}
			_fontSearched = true;
			TMP_FontAsset[] array = Resources.FindObjectsOfTypeAll<TMP_FontAsset>();
			foreach (TMP_FontAsset val in array)
			{
				if (((Object)val).name == "DarumaDropOne-Regular SDF")
				{
					_fontAsset = val;
					Log.LogInfo((object)"Found Peak font: DarumaDropOne-Regular SDF");
					break;
				}
			}
			Material[] array2 = Resources.FindObjectsOfTypeAll<Material>();
			foreach (Material val2 in array2)
			{
				if (((Object)val2).name == "DarumaDropOne-Regular SDF Shadow")
				{
					_shadowMaterialId = ((Object)val2).GetInstanceID();
					Log.LogInfo((object)"Found Peak shadow material");
					break;
				}
			}
		}

		private void InitUI()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_canvas != (Object)null))
			{
				FindFont();
				if ((Object)(object)_fontAsset == (Object)null)
				{
					Log.LogWarning((object)"Peak font not found, UI will not be created yet");
					_fontSearched = false;
					return;
				}
				GameObject val = new GameObject("PeakPocalypseCanvas");
				Object.DontDestroyOnLoad((Object)(object)val);
				_canvas = val.AddComponent<Canvas>();
				_canvas.renderMode = (RenderMode)0;
				_canvas.sortingOrder = 999;
				val.AddComponent<CanvasScaler>();
				Material shadowMat = (Material)((_shadowMaterialId != 0) ? /*isinst with value type is only supported in some contexts*/: null);
				_titleText = CreateText(val.transform, "TitleText", 20f, PeakTextColor, shadowMat);
				SetupTextAnchor(_titleText, new Vector2(1f, 1f), new Vector2(-10f, -10f));
				((TMP_Text)_titleText).alignment = (TextAlignmentOptions)260;
				((TMP_Text)_titleText).text = "Peak Pocalypse v3";
				_timerText = CreateText(val.transform, "TimerText", 18f, PeakTextColor, shadowMat);
				SetupTextAnchor(_timerText, new Vector2(1f, 1f), new Vector2(-10f, -40f));
				((TMP_Text)_timerText).alignment = (TextAlignmentOptions)260;
				_statusText = CreateText(val.transform, "StatusText", 16f, Color.yellow, shadowMat);
				SetupTextAnchor(_statusText, new Vector2(1f, 1f), new Vector2(-10f, -65f));
				((TMP_Text)_statusText).alignment = (TextAlignmentOptions)260;
				((Component)_statusText).gameObject.SetActive(false);
			}
		}

		private TextMeshProUGUI CreateText(Transform parent, string name, float fontSize, Color color, Material? shadowMat)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			TextMeshProUGUI val2 = val.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val2).font = _fontAsset;
			if ((Object)(object)shadowMat != (Object)null)
			{
				((TMP_Text)val2).fontMaterial = shadowMat;
			}
			((Graphic)val2).color = color;
			((TMP_Text)val2).fontSize = fontSize;
			((Graphic)val2).raycastTarget = false;
			return val2;
		}

		private static void SetupTextAnchor(TextMeshProUGUI text, Vector2 anchor, Vector2 pos)
		{
			//IL_0008: 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_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			RectTransform rectTransform = ((TMP_Text)text).rectTransform;
			rectTransform.anchorMin = anchor;
			rectTransform.anchorMax = anchor;
			rectTransform.pivot = anchor;
			rectTransform.anchoredPosition = pos;
			rectTransform.sizeDelta = new Vector2(500f, 50f);
		}

		private void ShowStatus(string message)
		{
			_statusMessage = message;
			_statusTimer = 3f;
			if ((Object)(object)_statusText != (Object)null)
			{
				((TMP_Text)_statusText).text = message;
				((Component)_statusText).gameObject.SetActive(true);
			}
			Log.LogInfo((object)message);
		}

		private void AddZombieLabel(GameObject zombie)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Expected O, but got Unknown
			//IL_00f3: 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_0130: 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_0148: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("ZombieLabel");
			val.transform.SetParent(zombie.transform, false);
			val.transform.localPosition = new Vector3(0f, 2f, 0f);
			val.AddComponent<ZombieLabel>();
			Canvas val2 = val.AddComponent<Canvas>();
			val2.renderMode = (RenderMode)2;
			val2.sortingOrder = 999;
			RectTransform component = val.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(200f, 50f);
			((Transform)component).localScale = new Vector3(0.01f, 0.01f, 0.01f);
			GameObject val3 = new GameObject("Text");
			val3.transform.SetParent(val.transform, false);
			TextMeshProUGUI val4 = val3.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val4).font = _fontAsset;
			string text = ZombieNames[_nameRng.Next(ZombieNames.Length)];
			((TMP_Text)val4).text = text;
			((TMP_Text)val4).fontSize = 36f;
			((Graphic)val4).color = Color.white;
			((TMP_Text)val4).fontStyle = (FontStyles)0;
			((TMP_Text)val4).alignment = (TextAlignmentOptions)514;
			((Graphic)val4).raycastTarget = false;
			RectTransform rectTransform = ((TMP_Text)val4).rectTransform;
			rectTransform.anchorMin = Vector2.zero;
			rectTransform.anchorMax = Vector2.one;
			rectTransform.offsetMin = Vector2.zero;
			rectTransform.offsetMax = Vector2.zero;
		}

		private void Update()
		{
			InitUI();
			if (_statusTimer > 0f)
			{
				_statusTimer -= Time.deltaTime;
				if (_statusTimer <= 0f && (Object)(object)_statusText != (Object)null)
				{
					((Component)_statusText).gameObject.SetActive(false);
				}
			}
			if ((Object)(object)_timerText != (Object)null)
			{
				int value = Mathf.CeilToInt(_zombieSpawnTimer);
				((TMP_Text)_timerText).text = $"Next Zombie spawn in: {value}s";
			}
			ApplyZombieCapOverride();
			_zombieSpawnTimer -= Time.deltaTime;
			if (_zombieSpawnTimer <= 0f)
			{
				_zombieSpawnTimer = 60f;
				SpawnZombieNearPlayer();
			}
		}

		private void ApplyZombieCapOverride()
		{
			if (!PhotonNetwork.InRoom || PhotonNetwork.IsMasterClient)
			{
				ZombieManager instance = ZombieManager.Instance;
				if (!((Object)(object)instance == (Object)null) && instance.maxActiveZombies < 100000)
				{
					instance.maxActiveZombies = 100000;
					Log.LogInfo((object)$"Set game zombie cap to {100000}.");
				}
			}
		}

		private void SpawnZombieNearPlayer()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: 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_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			Character localCharacter = Character.localCharacter;
			if ((Object)(object)localCharacter == (Object)null)
			{
				ShowStatus("No local character found!");
				return;
			}
			Rigidbody componentInChildren = ((Component)localCharacter).GetComponentInChildren<Rigidbody>();
			Vector3 position;
			Vector3 val;
			if ((Object)(object)componentInChildren != (Object)null)
			{
				position = componentInChildren.position;
				val = (((Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.forward : ((Component)localCharacter).transform.forward);
			}
			else if ((Object)(object)Camera.main != (Object)null)
			{
				position = ((Component)Camera.main).transform.position;
				val = ((Component)Camera.main).transform.forward;
			}
			else
			{
				position = ((Component)localCharacter).transform.position;
				val = ((Component)localCharacter).transform.forward;
			}
			Vector3 val2 = position + val * 5f;
			GameObject zombie;
			if (PhotonNetwork.InRoom)
			{
				zombie = PhotonNetwork.Instantiate("MushroomZombie", val2, Quaternion.identity, (byte)0, (object[])null);
			}
			else
			{
				GameObject val3 = Resources.Load<GameObject>("MushroomZombie");
				if ((Object)(object)val3 == (Object)null)
				{
					ShowStatus("MushroomZombie prefab not found!");
					return;
				}
				zombie = Object.Instantiate<GameObject>(val3, val2, Quaternion.identity);
			}
			AddZombieLabel(zombie);
			ShowStatus("Zombie spawned near player!");
		}
	}
	[HarmonyPatch(typeof(MushroomZombieBiteCollider), "OnTriggerEnter")]
	internal static class ZombieBiteNoSporesPatch
	{
		private static bool Prefix(MushroomZombieBiteCollider __instance, Collider other)
		{
			if (Time.time - __instance.lastBitLocalCharacter < 5f)
			{
				return false;
			}
			Character val = default(Character);
			if (!CharacterRagdoll.TryGetCharacterFromCollider(other, ref val) || !val.IsLocal)
			{
				return false;
			}
			__instance.lastBitLocalCharacter = Time.time;
			float num = (val.data.isSkeleton ? (__instance.parentZombie.biteInitialInjury / 8f * 2f) : __instance.parentZombie.biteInitialInjury);
			val.refs.afflictions.AddStatus((STATUSTYPE)0, num, false, true, true);
			val.Fall(__instance.parentZombie.biteStunTime, 0f);
			__instance.parentZombie.OnBitCharacter(val);
			return false;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}