Decompiled source of Symbiosis v1.0.8

BepInEx/plugins/Symbiosis.dll

Decompiled 5 months ago
using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using NuclearLib;
using NuclearLib.ModContent;
using Symbiosis.Extensions;
using Symbiosis.ModBehaviours;
using Symbiosis.Patches;
using Symbiosis.Utils;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Symbiosis")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Symbiosis")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("97f95e36-1154-479c-be65-4ef35b78018f")]
[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")]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Symbiosis
{
	public class ConfigManager
	{
		public class HoarderBugConfig
		{
			public ConfigEntry<bool> ItemUse { get; set; }

			public ConfigEntry<int> MinItemUseInterval { get; set; }

			public ConfigEntry<int> MaxItemUseInterval { get; set; }

			public ConfigEntry<int> ItemUnuseChance { get; set; }

			public ConfigEntry<bool> Dispersion { get; set; }

			public ConfigEntry<bool> ItemDeathDrop { get; set; }
		}

		public HoarderBugConfig HoarderBug;

		public ConfigManager()
		{
			HoarderBug = new HoarderBugConfig
			{
				ItemUse = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("HoarderBug", "Item Use", true, "Allows the use of items at random intervals."),
				MinItemUseInterval = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<int>("HoarderBug", "Min Item Use Interval", 0, "Sets the minimum time interval (in seconds) between each item use."),
				MaxItemUseInterval = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<int>("HoarderBug", "Max Item Use Interval", 10, "Sets the maximum time interval (in seconds) between each item use."),
				ItemUnuseChance = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<int>("HoarderBug", "Item Unuse Chance", 3, "Defines the probability (1 in X) of stopping item use, e.g., stop spraying."),
				Dispersion = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("HoarderBug", "Dispersion", true, "Enables hoarding bugs to move around and make room, reducing crowding."),
				ItemDeathDrop = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("HoarderBug", "Item Death Drop", true, "Enables a bug fix ensuring hoarding bugs drop held items upon death.")
			};
		}
	}
	[BepInPlugin("niceh.Symbiosis", "Symbiosis", "1.0.8")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public const string GUID = "niceh.Symbiosis";

		public const string Name = "Symbiosis";

		public static Plugin Instance { get; private set; }

		public static ManualLogSource Log { get; private set; }

		public static ConfigManager ConfigManager { get; private set; }

		private void Awake()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			Instance = this;
			Log = ((BaseUnityPlugin)this).Logger;
			Log.LogInfo((object)"Patching...");
			Harmony val = new Harmony("niceh.Symbiosis");
			val.PatchAll(typeof(Patch_HoarderBug));
			Log.LogInfo((object)"Finished patching!");
			Log.LogInfo((object)"Registering ModBehaviours...");
			Plugin.RegisterModBehaviour<Mod_HoarderBug>(typeof(HoarderBugAI));
			Plugin.RegisterModBehaviour<Mod_ExtensionLadder>(typeof(ExtensionLadderItem));
			Plugin.RegisterModBehaviour<Mod_StunGrenade>(typeof(StunGrenadeItem));
			Log.LogInfo((object)"Finished registering ModBehaviours!");
			Log.LogInfo((object)"Loading Config...");
			ConfigManager = new ConfigManager();
			Log.LogInfo((object)"Finished Loading Config!");
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}
	}
}
namespace Symbiosis.Utils
{
	public static class Util_HoarderBug
	{
		public static HoarderBugAI FindHoarderBug(GrabbableObject item)
		{
			if ((Object)(object)item.playerHeldBy != (Object)null)
			{
				return null;
			}
			HoarderBugAI[] array = Object.FindObjectsByType<HoarderBugAI>((FindObjectsSortMode)0);
			HoarderBugAI[] array2 = array;
			foreach (HoarderBugAI val in array2)
			{
				if (val != null && val.heldItem != null && !((Object)(object)val.heldItem.itemGrabbableObject != (Object)(object)item))
				{
					return val;
				}
			}
			return null;
		}

		public static float GetNestSize(HoarderBugAI hoarderBug)
		{
			HoarderBugAI[] source = Object.FindObjectsOfType<HoarderBugAI>();
			return (float)source.Where((HoarderBugAI x) => x.nestPosition == hoarderBug.nestPosition).Count() * 0.5f + 1f;
		}
	}
	public static class Util_NavMesh
	{
		public static Vector3 GetRandomPointInArea(Vector3 center, float radius)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: 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)
			Vector3 val = Random.insideUnitSphere * radius;
			val += center;
			NavMeshHit val2 = default(NavMeshHit);
			NavMesh.SamplePosition(val, ref val2, radius, -1);
			return ((NavMeshHit)(ref val2)).position;
		}
	}
}
namespace Symbiosis.Properties
{
	[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
	[DebuggerNonUserCode]
	[CompilerGenerated]
	internal class Resources
	{
		private static ResourceManager resourceMan;

		private static CultureInfo resourceCulture;

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		internal static ResourceManager ResourceManager
		{
			get
			{
				if (resourceMan == null)
				{
					ResourceManager resourceManager = new ResourceManager("Symbiosis.Properties.Resources", typeof(Resources).Assembly);
					resourceMan = resourceManager;
				}
				return resourceMan;
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		internal static CultureInfo Culture
		{
			get
			{
				return resourceCulture;
			}
			set
			{
				resourceCulture = value;
			}
		}

		internal Resources()
		{
		}
	}
}
namespace Symbiosis.Patches
{
	internal static class Patch_HoarderBug
	{
		[HarmonyPatch(typeof(HoarderBugAI), "DropItem")]
		[HarmonyPrefix]
		private static void PreDropItem(HoarderBugAI __instance, NetworkObject item, Vector3 targetFloorPosition, bool droppingInNest = true)
		{
			if (__instance.heldItem != null)
			{
				Mod_HoarderBug component = ((Component)__instance).gameObject.GetComponent<Mod_HoarderBug>();
				component.lastItem = __instance.heldItem.itemGrabbableObject;
			}
		}

		[HarmonyPatch(typeof(HoarderBugAI), "DropItem")]
		[HarmonyPostfix]
		private static void PostDropItem(HoarderBugAI __instance, NetworkObject item, Vector3 targetFloorPosition, bool droppingInNest = true)
		{
			Mod_HoarderBug component = ((Component)__instance).gameObject.GetComponent<Mod_HoarderBug>();
			if (component.activatingItem && (Object)(object)component.lastItem != (Object)null)
			{
				component.lastItem.UseItemOnClient(false);
			}
			component.activatingItem = false;
			component.lastItem = null;
		}
	}
}
namespace Symbiosis.ModBehaviours
{
	public class Mod_HoarderBug : ModAI
	{
		public bool activatingItem;

		public GrabbableObject lastItem;

		private readonly Random _rand = new Random();

		public override void PreStart()
		{
			NetworkBehaviour original = ((ModBehaviour)this).Original;
			HoarderBugAI val = (HoarderBugAI)(object)((original is HoarderBugAI) ? original : null);
			if (val != null && Plugin.ConfigManager.HoarderBug.ItemUse.Value)
			{
				((MonoBehaviour)val).StartCoroutine(HoarderBugUseItem());
			}
		}

		public override void PostAI()
		{
			//IL_0055: 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_0074: 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_007f: 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_0094: 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)
			NetworkBehaviour original = ((ModBehaviour)this).Original;
			HoarderBugAI val = (HoarderBugAI)(object)((original is HoarderBugAI) ? original : null);
			if (val != null && !((EnemyAI)val).isEnemyDead && !StartOfRound.Instance.allPlayersDead && ((EnemyAI)val).currentBehaviourStateIndex == 1 && Plugin.ConfigManager.HoarderBug.Dispersion.Value && val.GetWaitingAtNest() && Vector3.Distance(((Component)val).transform.position, val.nestPosition) <= 0.5f)
			{
				float nestSize = Util_HoarderBug.GetNestSize(val);
				Vector3 randomPointInArea = Util_NavMesh.GetRandomPointInArea(val.nestPosition, nestSize);
				if (((EnemyAI)val).SetDestinationToPosition(randomPointInArea, true))
				{
					Plugin.Log.LogInfo((object)$"FOUND SPOT TO CHILL {Vector3.Distance(randomPointInArea, ((Component)val).transform.position)} UNITS AWAY FROM ME");
				}
			}
		}

		public override void PostKillEnemy(bool destroy = false)
		{
			NetworkBehaviour original = ((ModBehaviour)this).Original;
			HoarderBugAI val = (HoarderBugAI)(object)((original is HoarderBugAI) ? original : null);
			if (val != null && val.heldItem != null && ((NetworkBehaviour)val).IsOwner && Plugin.ConfigManager.HoarderBug.ItemDeathDrop.Value)
			{
				val.DropItemAndCallDropRPC(((Component)val.heldItem.itemGrabbableObject).GetComponent<NetworkObject>(), false);
			}
		}

		private IEnumerator HoarderBugUseItem()
		{
			NetworkBehaviour original = ((ModBehaviour)this).Original;
			HoarderBugAI hoarder = (HoarderBugAI)(object)((original is HoarderBugAI) ? original : null);
			if (hoarder == null)
			{
				yield break;
			}
			while (((Behaviour)hoarder).isActiveAndEnabled)
			{
				try
				{
					if (!((EnemyAI)hoarder).inSpecialAnimation && !((EnemyAI)hoarder).isEnemyDead && !StartOfRound.Instance.allPlayersDead && hoarder.heldItem != null && (Object)(object)hoarder.heldItem.itemGrabbableObject != (Object)null)
					{
						ManualLogSource log = Plugin.Log;
						HoarderBugItem heldItem = hoarder.heldItem;
						log.LogInfo((object)("USING " + ((heldItem != null) ? ((Object)heldItem.itemGrabbableObject.itemProperties).name : null)));
						activatingItem = _rand.Next(Plugin.ConfigManager.HoarderBug.ItemUnuseChance.Value) != 0;
						hoarder.heldItem.itemGrabbableObject.UseItemOnClient(activatingItem);
					}
				}
				catch (Exception ex)
				{
					Plugin.Log.LogError((object)ex);
				}
				yield return (object)new WaitForSeconds((float)_rand.Next(Plugin.ConfigManager.HoarderBug.MinItemUseInterval.Value, Plugin.ConfigManager.HoarderBug.MaxItemUseInterval.Value));
			}
		}

		protected override void __initializeVariables()
		{
			((ModAI)this).__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "Mod_HoarderBug";
		}
	}
	public class Mod_ExtensionLadder : ModItem
	{
		public override bool PreItemActivate(bool used, bool buttonDown)
		{
			//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_0084: Unknown result type (might be due to invalid IL or missing references)
			NetworkBehaviour original = ((ModBehaviour)this).Original;
			ExtensionLadderItem val = (ExtensionLadderItem)(object)((original is ExtensionLadderItem) ? original : null);
			if (val == null)
			{
				return true;
			}
			if ((Object)(object)((GrabbableObject)val).playerHeldBy != (Object)null)
			{
				return true;
			}
			Plugin.Log.LogInfo((object)"ITEM IS NOT HELD BY PLAYER");
			if (!((NetworkBehaviour)val).IsOwner)
			{
				return true;
			}
			Plugin.Log.LogInfo((object)"ITEM IS OWNER");
			HoarderBugAI val2 = Util_HoarderBug.FindHoarderBug((GrabbableObject)(object)val);
			if (val2 == null)
			{
				Plugin.Log.LogInfo((object)"NO BUG FOUND");
				return false;
			}
			Plugin.Log.LogInfo((object)"DROPPING LADDER");
			val2.DropItem(((Component)val).GetComponent<NetworkObject>(), ((GrabbableObject)val).GetItemFloorPosition(default(Vector3)), false);
			return false;
		}

		protected override void __initializeVariables()
		{
			((ModItem)this).__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "Mod_ExtensionLadder";
		}
	}
	public class Mod_StunGrenade : ModItem
	{
		public override bool PreItemActivate(bool used, bool buttonDown)
		{
			NetworkBehaviour original = ((ModBehaviour)this).Original;
			StunGrenadeItem val = (StunGrenadeItem)(object)((original is StunGrenadeItem) ? original : null);
			if (val == null)
			{
				return true;
			}
			if ((Object)(object)((GrabbableObject)val).playerHeldBy != (Object)null)
			{
				return true;
			}
			if (val.inPullingPinAnimation || val.pinPulled)
			{
				Plugin.Log.LogInfo((object)"STUNNADE IS ALREADY PULLED");
				return false;
			}
			if (val.GetPullPinCoroutine() != null)
			{
				Plugin.Log.LogInfo((object)"STUNNADE IS ALREADY IN PULLING ANIMATION");
				return false;
			}
			Plugin.Log.LogInfo((object)"ITEM HAS NO COROUTINE: STARTING NO PLAYER PULLING PIN ANIMATION");
			val.SetPullPinCoroutine(((MonoBehaviour)val).StartCoroutine(val.NoPlayerPullPinAnimation()));
			return false;
		}

		protected override void __initializeVariables()
		{
			((ModItem)this).__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "Mod_StunGrenade";
		}
	}
}
namespace Symbiosis.Extensions
{
	public static class Extension_HoarderBugAI
	{
		public static readonly FieldInfo info_waitingAtNest = typeof(HoarderBugAI).GetField("waitingAtNest", BindingFlags.Instance | BindingFlags.NonPublic);

		public static void SetWaitingAtNest(this HoarderBugAI bug, bool value)
		{
			info_waitingAtNest?.SetValue(bug, value);
		}

		public static bool GetWaitingAtNest(this HoarderBugAI bug)
		{
			return (bool)info_waitingAtNest?.GetValue(bug);
		}
	}
	public static class Extension_StunGrenadeItem
	{
		public static readonly FieldInfo info_pullPinCoroutine = typeof(StunGrenadeItem).GetField("pullPinCoroutine", BindingFlags.Instance | BindingFlags.NonPublic);

		public static void SetPullPinCoroutine(this StunGrenadeItem item, Coroutine coroutine)
		{
			info_pullPinCoroutine?.SetValue(item, coroutine);
		}

		public static Coroutine GetPullPinCoroutine(this StunGrenadeItem item)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			return (Coroutine)(info_pullPinCoroutine?.GetValue(item));
		}

		public static IEnumerator NoPlayerPullPinAnimation(this StunGrenadeItem item)
		{
			item.inPullingPinAnimation = true;
			item.itemAnimator.SetTrigger("pullPin");
			item.itemAudio.PlayOneShot(item.pullPinSFX);
			WalkieTalkie.TransmitOneShotAudio(item.itemAudio, item.pullPinSFX, 0.8f);
			yield return (object)new WaitForSeconds(1f);
			item.inPullingPinAnimation = false;
			item.pinPulled = true;
			((GrabbableObject)item).itemUsedUp = true;
		}
	}
}