Decompiled source of SusVoreModFundedByTheMan v0.1.0

TheSusVoreModFundedByTheMan.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using On.RoR2;
using R2API;
using RoR2;
using UnityEngine;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("TheSusVoreModFundedByTheMan")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+839c39b4f3c608370945bef93fd15f8e60b2d3e0")]
[assembly: AssemblyProduct("TheSusVoreModFundedByTheMan")]
[assembly: AssemblyTitle("TheSusVoreModFundedByTheMan")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public static class DisplayUtils
{
	public static void EnsureCockMasterDisplay(GameObject prefab)
	{
		if (!Object.op_Implicit((Object)(object)prefab))
		{
			return;
		}
		ItemDisplay val = prefab.GetComponent<ItemDisplay>();
		if (!Object.op_Implicit((Object)(object)val))
		{
			val = prefab.AddComponent<ItemDisplay>();
			Debug.LogWarning((object)("[Mutator] Added ItemDisplay component to " + ((Object)prefab).name));
		}
		Renderer[] componentsInChildren = prefab.GetComponentsInChildren<Renderer>(true);
		if (componentsInChildren != null && componentsInChildren.Length != 0)
		{
			val.rendererInfos = componentsInChildren.Select(delegate(Renderer renderer)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				RendererInfo result = default(RendererInfo);
				result.renderer = renderer;
				result.defaultMaterial = renderer.sharedMaterial;
				result.ignoreOverlays = false;
				result.defaultShadowCastingMode = (ShadowCastingMode)1;
				return result;
			}).ToArray();
		}
		else
		{
			Debug.LogWarning((object)("[Mutator] No renderers found on " + ((Object)prefab).name + ", display may be invisible!"));
			val.rendererInfos = (RendererInfo[])(object)new RendererInfo[0];
		}
	}
}
namespace MutatorEquipmentMod
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("YourName.MutatorEquipmentMod", "MutatorEquipmentMod", "1.0.0")]
	public class MutatorEquipmentPlugin : BaseUnityPlugin
	{
		public class ItemAnimationTrigger : MonoBehaviour
		{
			public void TriggerVore(GameObject itemObject)
			{
				Animator[] componentsInChildren = itemObject.GetComponentsInChildren<Animator>();
				Animator[] array = componentsInChildren;
				foreach (Animator val in array)
				{
					val.SetTrigger("vore");
				}
			}
		}

		public static class Log
		{
			private static ManualLogSource _log;

			public static void Init(ManualLogSource l)
			{
				_log = l;
			}

			public static void Info(object o)
			{
				ManualLogSource log = _log;
				if (log != null)
				{
					log.LogInfo(o);
				}
			}

			public static void Error(object o)
			{
				ManualLogSource log = _log;
				if (log != null)
				{
					log.LogError(o);
				}
			}
		}

		public class MutatorTargetingController : MonoBehaviour
		{
			private CharacterBody body;

			private EquipmentSlot slot;

			private Indicator indicator;

			private static GameObject indicatorPrefab;

			private void Awake()
			{
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				//IL_0071: Expected O, but got Unknown
				body = ((Component)this).GetComponent<CharacterBody>();
				slot = ((Component)this).GetComponent<EquipmentSlot>();
				if (!Object.op_Implicit((Object)(object)indicatorPrefab))
				{
					indicatorPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/LightningIndicator");
					if (!Object.op_Implicit((Object)(object)indicatorPrefab))
					{
						indicatorPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/HuntressTrackingIndicator");
					}
				}
				indicator = new Indicator(((Component)this).gameObject, indicatorPrefab);
				indicator.active = false;
			}

			private void OnDestroy()
			{
				Indicator obj = indicator;
				if (obj != null)
				{
					obj.DestroyVisualizer();
				}
			}

			private void Update()
			{
				//IL_00be: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: 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_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_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
				if (Input.GetKeyDown((KeyCode)292))
				{
					LocalUser firstLocalUser = LocalUserManager.GetFirstLocalUser();
					CharacterBody val = ((firstLocalUser != null) ? firstLocalUser.cachedBody : null);
					if (Object.op_Implicit((Object)(object)val))
					{
						Vector3 corePosition = val.corePosition;
						PickupDropletController.CreatePickupDroplet(new PickupIndex(equipDef.equipmentIndex), corePosition, Vector3.zero);
						Log.Info("Spawned Mutator equipment at player position.");
					}
				}
				if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)slot))
				{
					indicator.active = false;
					return;
				}
				bool flag = false;
				try
				{
					flag = slot.equipmentIndex == equipDef.equipmentIndex;
				}
				catch
				{
					try
					{
						flag = slot.equipmentIndex == equipDef.equipmentIndex;
					}
					catch
					{
						flag = false;
					}
				}
				if (!flag)
				{
					indicator.active = false;
					return;
				}
				if (!IsEquipmentReady(slot))
				{
					indicator.active = false;
					return;
				}
				HurtBox val2 = FindTarget(body, 80f, 30f);
				if (Object.op_Implicit((Object)(object)val2) && Object.op_Implicit((Object)(object)val2.healthComponent) && val2.healthComponent.alive)
				{
					indicator.targetTransform = ((Component)val2).transform;
					indicator.active = true;
				}
				else
				{
					indicator.active = false;
				}
			}

			private static bool IsEquipmentReady(EquipmentSlot s)
			{
				if (!Object.op_Implicit((Object)(object)s))
				{
					return false;
				}
				try
				{
					if (s.equipmentDisabled)
					{
						return false;
					}
				}
				catch
				{
				}
				try
				{
					if (s.subcooldownTimer > 0f)
					{
						return false;
					}
				}
				catch
				{
				}
				try
				{
					if (s.cooldownTimer > 0f)
					{
						return false;
					}
				}
				catch
				{
				}
				return true;
			}

			public static HurtBox FindTarget(CharacterBody source, float maxDist, float maxAngle)
			{
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: 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_0045: 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_0051: Unknown result type (might be due to invalid IL or missing references)
				//IL_0058: Unknown result type (might be due to invalid IL or missing references)
				//IL_005d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0062: 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_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0073: 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_0082: 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)
				//IL_008a: Expected O, but got Unknown
				if (!Object.op_Implicit((Object)(object)source) || !Object.op_Implicit((Object)(object)source.inputBank) || !Object.op_Implicit((Object)(object)source.teamComponent))
				{
					return null;
				}
				BullseyeSearch val = new BullseyeSearch
				{
					teamMaskFilter = TeamMask.GetEnemyTeams(source.teamComponent.teamIndex),
					filterByLoS = true,
					searchOrigin = source.inputBank.aimOrigin,
					searchDirection = source.inputBank.aimDirection,
					maxDistanceFilter = maxDist,
					maxAngleFilter = maxAngle,
					sortMode = (SortMode)1
				};
				val.RefreshCandidates();
				return val.GetResults().FirstOrDefault();
			}
		}

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

			private object <>2__current;

			public CharacterBody body;

			public float seconds;

			public MutatorEquipmentPlugin <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(seconds);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<>4__this.SpawnCndm(body);
					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 <PullAndKill>d__23 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public EquipmentSlot slot;

			public CharacterBody user;

			public CharacterBody victim;

			public MutatorEquipmentPlugin <>4__this;

			private CharacterMotor <motor>5__1;

			private Rigidbody <rb>5__2;

			private float <v>5__3;

			private Vector3 <originalScale>5__4;

			private float <shrinkStartDistance>5__5;

			private Vector3 <playerPelvisPosition>5__6;

			private List<Animator> <targetAnimators>5__7;

			private ItemDisplay[] <allDisplays>5__8;

			private Animator[] <victimAnimators>5__9;

			private int <frameCount>5__10;

			private ItemDisplay[] <>s__11;

			private int <>s__12;

			private ItemDisplay <display>5__13;

			private Animator[] <animators>5__14;

			private Animator[] <>s__15;

			private int <>s__16;

			private Animator <anim>5__17;

			private string <objName>5__18;

			private AudioSource <source>5__19;

			private Animator[] <>s__20;

			private int <>s__21;

			private Animator <anim>5__22;

			private string <objName>5__23;

			private Vector3 <userPos>5__24;

			private Vector3 <vicPos>5__25;

			private Vector3 <toUser>5__26;

			private float <dist>5__27;

			private Vector3 <dir>5__28;

			private float <t>5__29;

			private List<Animator>.Enumerator <>s__30;

			private Animator <anim>5__31;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<motor>5__1 = null;
				<rb>5__2 = null;
				<targetAnimators>5__7 = null;
				<allDisplays>5__8 = null;
				<victimAnimators>5__9 = null;
				<>s__11 = null;
				<display>5__13 = null;
				<animators>5__14 = null;
				<>s__15 = null;
				<anim>5__17 = null;
				<objName>5__18 = null;
				<source>5__19 = null;
				<>s__20 = null;
				<anim>5__22 = null;
				<objName>5__23 = null;
				<>s__30 = default(List<Animator>.Enumerator);
				<anim>5__31 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0097: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: 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_00d6: Unknown result type (might be due to invalid IL or missing references)
				//IL_049b: Unknown result type (might be due to invalid IL or missing references)
				//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_04ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_04b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_04b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_04be: Unknown result type (might be due to invalid IL or missing references)
				//IL_04c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_04c8: Unknown result type (might be due to invalid IL or missing references)
				//IL_058b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0540: Unknown result type (might be due to invalid IL or missing references)
				//IL_054b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0566: Unknown result type (might be due to invalid IL or missing references)
				//IL_059e: Unknown result type (might be due to invalid IL or missing references)
				//IL_05a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_05e4: Unknown result type (might be due to invalid IL or missing references)
				//IL_05ea: 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_05ff: Unknown result type (might be due to invalid IL or missing references)
				//IL_0604: Unknown result type (might be due to invalid IL or missing references)
				//IL_0609: Unknown result type (might be due to invalid IL or missing references)
				//IL_065d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0663: Unknown result type (might be due to invalid IL or missing references)
				//IL_0674: Unknown result type (might be due to invalid IL or missing references)
				//IL_062b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0631: Unknown result type (might be due to invalid IL or missing references)
				//IL_0642: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_06af: Expected O, but got Unknown
				//IL_0802: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (!Object.op_Implicit((Object)(object)victim))
					{
						Debug.LogWarning((object)"[Mutator] No victim provided!");
						return false;
					}
					<motor>5__1 = victim.characterMotor;
					<rb>5__2 = victim.rigidbody;
					<v>5__3 = 18f;
					Debug.Log((object)("[Mutator] Starting PullAndKill for victim: " + ((Object)victim).name));
					<originalScale>5__4 = victim.transform.localScale;
					<shrinkStartDistance>5__5 = 10f;
					<playerPelvisPosition>5__6 = user.transform.position + new Vector3(0f, 0.5f, 0f);
					<targetAnimators>5__7 = new List<Animator>();
					<allDisplays>5__8 = Object.FindObjectsOfType<ItemDisplay>(true);
					Debug.Log((object)("[Mutator] Found " + <allDisplays>5__8.Length + " ItemDisplays in the scene"));
					<>s__11 = <allDisplays>5__8;
					for (<>s__12 = 0; <>s__12 < <>s__11.Length; <>s__12++)
					{
						<display>5__13 = <>s__11[<>s__12];
						<animators>5__14 = ((Component)<display>5__13).GetComponentsInChildren<Animator>(true);
						<>s__15 = <animators>5__14;
						for (<>s__16 = 0; <>s__16 < <>s__15.Length; <>s__16++)
						{
							<anim>5__17 = <>s__15[<>s__16];
							if (!((Object)(object)<anim>5__17 == (Object)null))
							{
								<objName>5__18 = ((Object)((Component)<anim>5__17).gameObject).name;
								if (<objName>5__18.Contains("Cock") || <objName>5__18.Contains("Condom"))
								{
									Debug.Log((object)("[Mutator] Found animator on " + <objName>5__18));
									<anim>5__17.SetTrigger("Vore");
									<targetAnimators>5__7.Add(<anim>5__17);
									<source>5__19 = ((Component)<anim>5__17).GetComponent<AudioSource>();
									if ((Object)(object)<source>5__19 == (Object)null)
									{
										<source>5__19 = ((Component)<anim>5__17).GetComponentInChildren<AudioSource>(true);
									}
									if ((Object)(object)<source>5__19 == (Object)null)
									{
										<source>5__19 = ((Component)<display>5__13).GetComponentInChildren<AudioSource>(true);
									}
									if ((Object)(object)<source>5__19 != (Object)null)
									{
										Debug.Log((object)("[Mutator] Playing" + ((object)<source>5__19.clip).ToString() + "from " + ((Object)((Component)<source>5__19).gameObject).name));
										<source>5__19.Play();
									}
									else
									{
										Debug.LogWarning((object)("[Mutator] No AudioSource found near " + <objName>5__18));
									}
									<source>5__19 = null;
								}
								<objName>5__18 = null;
								<anim>5__17 = null;
							}
						}
						<>s__15 = null;
						<animators>5__14 = null;
						<display>5__13 = null;
					}
					<>s__11 = null;
					<victimAnimators>5__9 = ((Component)victim).GetComponentsInChildren<Animator>(true);
					<>s__20 = <victimAnimators>5__9;
					for (<>s__21 = 0; <>s__21 < <>s__20.Length; <>s__21++)
					{
						<anim>5__22 = <>s__20[<>s__21];
						if (!((Object)(object)<anim>5__22 == (Object)null))
						{
							<objName>5__23 = ((Object)((Component)<anim>5__22).gameObject).name;
							if ((<objName>5__23.Contains("Cock") || <objName>5__23.Contains("Condom")) && !<targetAnimators>5__7.Contains(<anim>5__22))
							{
								Debug.Log((object)("[Mutator] Found victim animator on " + <objName>5__23));
								<anim>5__22.SetTrigger("Vore");
								<targetAnimators>5__7.Add(<anim>5__22);
							}
							<objName>5__23 = null;
							<anim>5__22 = null;
						}
					}
					<>s__20 = null;
					<frameCount>5__10 = 0;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (Object.op_Implicit((Object)(object)victim) && Object.op_Implicit((Object)(object)victim.healthComponent) && victim.healthComponent.alive)
				{
					<frameCount>5__10++;
					<userPos>5__24 = user.corePosition;
					<vicPos>5__25 = victim.corePosition;
					<toUser>5__26 = <userPos>5__24 - <vicPos>5__25;
					<dist>5__27 = ((Vector3)(ref <toUser>5__26)).magnitude;
					Debug.Log((object)$"[Mutator] Frame {<frameCount>5__10}: Distance to player = {<dist>5__27:F2}");
					if (<dist>5__27 <= <shrinkStartDistance>5__5)
					{
						<t>5__29 = Mathf.Clamp01(<dist>5__27 / <shrinkStartDistance>5__5);
						victim.transform.localScale = <originalScale>5__4 * <t>5__29;
						Debug.Log((object)$"[Mutator] Shrinking victim: scale = {victim.transform.localScale}");
					}
					else
					{
						victim.transform.localScale = <originalScale>5__4;
					}
					<dir>5__28 = ((Vector3)(ref <toUser>5__26)).normalized;
					<v>5__3 = Mathf.Min(60f, <v>5__3 + 40f * Time.fixedDeltaTime);
					if ((Object)(object)<motor>5__1 != (Object)null)
					{
						CharacterMotor obj = <motor>5__1;
						obj.rootMotion += <dir>5__28 * <v>5__3 * Time.fixedDeltaTime;
					}
					else if ((Object)(object)<rb>5__2 != (Object)null)
					{
						<rb>5__2.MovePosition(Vector3.MoveTowards(<vicPos>5__25, <userPos>5__24, <v>5__3 * Time.fixedDeltaTime));
					}
					else
					{
						victim.transform.position = Vector3.MoveTowards(<vicPos>5__25, <userPos>5__24, <v>5__3 * Time.fixedDeltaTime);
					}
					if (!(<dist>5__27 <= 4f))
					{
						<>2__current = (object)new WaitForFixedUpdate();
						<>1__state = 1;
						return true;
					}
					Debug.Log((object)"[Mutator] Victim is very close to player, breaking pull loop");
				}
				<>s__30 = <targetAnimators>5__7.GetEnumerator();
				try
				{
					while (<>s__30.MoveNext())
					{
						<anim>5__31 = <>s__30.Current;
						if ((Object)(object)<anim>5__31 != (Object)null)
						{
							<anim>5__31.ResetTrigger("Vore");
							Debug.Log((object)("[Mutator] Reset Vore trigger on " + ((Object)((Component)<anim>5__31).gameObject).name));
						}
						<anim>5__31 = null;
					}
				}
				finally
				{
					((IDisposable)<>s__30).Dispose();
				}
				<>s__30 = default(List<Animator>.Enumerator);
				if (Object.op_Implicit((Object)(object)victim) && Object.op_Implicit((Object)(object)victim.healthComponent) && victim.healthComponent.alive)
				{
					Debug.Log((object)"[Mutator] Killing victim");
					victim.healthComponent.Suicide(((Component)user).gameObject, ((Component)user).gameObject, DamageTypeCombo.op_Implicit((DamageType)0));
				}
				if (Object.op_Implicit((Object)(object)user) && Object.op_Implicit((Object)(object)user.healthComponent) && user.healthComponent.alive)
				{
					Debug.Log((object)"[Mutator] Applying digest buff to user");
					user.AddTimedBuff(digestBuff, 17.25f);
					((MonoBehaviour)slot).StartCoroutine(<>4__this.DigestionEndedAfter(user, 17.25f));
				}
				Debug.Log((object)"[Mutator] PullAndKill finished");
				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();
			}
		}

		public const string PluginAuthor = "YourName";

		public const string PluginName = "MutatorEquipmentMod";

		public const string PluginVersion = "1.0.0";

		public const string PluginGUID = "YourName.MutatorEquipmentMod";

		private static GameObject cockmasterPrefab;

		private static GameObject condomPrefab;

		private static Sprite cockicon;

		private static EquipmentDef equipDef;

		private static BuffDef digestBuff;

		private const float EquipCooldown = 30f;

		private const float DigestDuration = 17.25f;

		private const float PullSpeedBase = 18f;

		private const float PullSpeedMax = 60f;

		private const float TargetMaxDist = 80f;

		private const float TargetMaxAngle = 30f;

		private void Awake()
		{
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Expected O, but got Unknown
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Expected O, but got Unknown
			LoadAllBundles();
			Log.Init(((BaseUnityPlugin)this).Logger);
			CreateEquipment();
			CreateBuff();
			LanguageAPI.Add("MUTATOR_EQUIP_NAME", "Vorator");
			LanguageAPI.Add("MUTATOR_EQUIP_PICKUP", "Force a foe down your urethra, and digest them in your balls for a strong buff");
			LanguageAPI.Add("MUTATOR_EQUIP_DESC", "Aim at an enemy closeby, use the equipment and vore them into your cock. Then gain <style=cIsDamage>3× damage</style>, <style=cIsUtility>-30% move speed</style>, and <style=cIsHealing>75% damage reduction</style> for 15s.");
			LanguageAPI.Add("MUTATOR_EQUIP_LORE", "The throbbing parasite attaches to your crotch, rewriting your reproductive purpose to only consume and digest living organism, boosting your own");
			LanguageAPI.Add("MUTATOR_DIGEST_NAME", "Digestion");
			EquipmentSlot.PerformEquipmentAction += new hook_PerformEquipmentAction(OnEquipUse);
			CharacterBody.RecalculateStats += new hook_RecalculateStats(OnRecalculateStats);
			HealthComponent.TakeDamage += new hook_TakeDamage(OnTakeDamage);
			CharacterBody.Start += new hook_Start(OnBodyStart);
		}

		private void LoadAllBundles()
		{
			try
			{
				string directoryName = Path.GetDirectoryName(typeof(MutatorEquipmentPlugin).Assembly.Location);
				string text = Path.Combine(directoryName, "assets");
				if (!Directory.Exists(text))
				{
					Debug.LogError((object)("[MutatorEquipment] Assets folder not found: " + text));
					return;
				}
				string[] files = Directory.GetFiles(text, "*", SearchOption.AllDirectories);
				string[] array = files;
				foreach (string text2 in array)
				{
					Debug.LogWarning((object)("[MutatorEquipment] Attempting to load bundle: " + text2));
					AssetBundle val = AssetBundle.LoadFromFile(text2);
					if ((Object)(object)val == (Object)null)
					{
						Debug.LogError((object)("[MutatorEquipment] Failed to load AssetBundle at: " + text2));
						continue;
					}
					string[] allAssetNames = val.GetAllAssetNames();
					foreach (string text3 in allAssetNames)
					{
						Debug.LogWarning((object)("[MutatorEquipment] Asset found in " + Path.GetFileName(text2) + ": " + text3));
						if (text3.EndsWith("cockmaster.prefab", StringComparison.OrdinalIgnoreCase))
						{
							cockmasterPrefab = val.LoadAsset<GameObject>(text3);
							Debug.LogWarning((object)("[MutatorEquipment] Loaded cockmaster prefab from: " + text3));
							EnsureItemDisplay(cockmasterPrefab);
						}
						if (text3.EndsWith("condomprop.prefab", StringComparison.OrdinalIgnoreCase))
						{
							condomPrefab = val.LoadAsset<GameObject>(text3);
							Debug.LogWarning((object)"[MutatorEquipment] Loaded condomprop prefab!");
						}
						if (text3.EndsWith("cockicon.png", StringComparison.OrdinalIgnoreCase))
						{
							cockicon = val.LoadAsset<Sprite>(text3);
							Debug.LogWarning((object)"[MutatorEquipment] Loaded cockicon prefab!");
						}
					}
				}
				if ((Object)(object)cockmasterPrefab == (Object)null)
				{
					Debug.LogError((object)"[MutatorEquipment] cockmaster prefab not found in any bundle! Falling back to crowbar.");
					cockmasterPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/PickupModels/PickupCrowbar");
					EnsureItemDisplay(cockmasterPrefab);
				}
			}
			catch (Exception arg)
			{
				Debug.LogError((object)$"[MutatorEquipment] Error loading bundles: {arg}");
			}
		}

		private void CreateEquipment()
		{
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Expected O, but got Unknown
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: 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_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Expected O, but got Unknown
			equipDef = ScriptableObject.CreateInstance<EquipmentDef>();
			((Object)equipDef).name = "MUTATOR_EQUIP";
			equipDef.nameToken = "MUTATOR_EQUIP_NAME";
			equipDef.pickupToken = "MUTATOR_EQUIP_PICKUP";
			equipDef.descriptionToken = "MUTATOR_EQUIP_DESC";
			equipDef.loreToken = "MUTATOR_EQUIP_LORE";
			equipDef.cooldown = 30f;
			equipDef.appearsInSinglePlayer = true;
			equipDef.appearsInMultiPlayer = true;
			equipDef.canDrop = true;
			equipDef.enigmaCompatible = true;
			GameObject val = cockmasterPrefab;
			Sprite pickupIconSprite = cockicon;
			equipDef.pickupModelPrefab = val;
			equipDef.pickupIconSprite = pickupIconSprite;
			GameObject val2 = (Object.op_Implicit((Object)(object)cockmasterPrefab) ? cockmasterPrefab : val);
			DisplayUtils.EnsureCockMasterDisplay(val2);
			ItemDisplayRuleDict val3 = new ItemDisplayRuleDict(Array.Empty<ItemDisplayRule>());
			string[] array = new string[14]
			{
				"mdlCommandoDualies", "mdlHuntress", "mdlToolbot", "mdlEngi", "mdlMage", "mdlMerc", "mdlTreebot", "mdlLoader", "mdlCroco", "mdlCaptain",
				"mdlBandit2", "mdlRailGunner", "mdlVoidSurvivor", "mdlHeretic"
			};
			Vector3 zero = Vector3.zero;
			Vector3 zero2 = Vector3.zero;
			Vector3 one = Vector3.one;
			string[] array2 = array;
			foreach (string text in array2)
			{
				val3.Add(text, (ItemDisplayRule[])(object)new ItemDisplayRule[1]
				{
					new ItemDisplayRule
					{
						ruleType = (ItemDisplayRuleType)0,
						followerPrefab = val2,
						childName = "Pelvis",
						localPos = zero,
						localAngles = zero2,
						localScale = one
					}
				});
			}
			ItemAPI.Add(new CustomEquipment(equipDef, val3));
		}

		private static void EnsureItemDisplay(GameObject prefab)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)prefab))
			{
				ItemDisplay val = prefab.GetComponent<ItemDisplay>();
				if (!Object.op_Implicit((Object)(object)val))
				{
					val = prefab.AddComponent<ItemDisplay>();
				}
				Renderer[] componentsInChildren = prefab.GetComponentsInChildren<Renderer>();
				RendererInfo[] array = (RendererInfo[])(object)new RendererInfo[componentsInChildren.Length];
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					array[i] = new RendererInfo
					{
						renderer = componentsInChildren[i],
						defaultMaterial = componentsInChildren[i].sharedMaterial,
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false
					};
				}
				val.rendererInfos = array;
			}
		}

		private void CreateBuff()
		{
			//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)
			digestBuff = ScriptableObject.CreateInstance<BuffDef>();
			((Object)digestBuff).name = "MUTATOR_DIGEST";
			digestBuff.buffColor = Color.green;
			digestBuff.canStack = false;
			digestBuff.isDebuff = false;
			digestBuff.isCooldown = false;
			digestBuff.isHidden = false;
			digestBuff.iconSprite = LegacyResourcesAPI.Load<Sprite>("Textures/BuffIcons/texBuffGenericShield");
			ContentAddition.AddBuffDef(digestBuff);
		}

		private void OnBodyStart(orig_Start orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (self.isPlayerControlled && !Object.op_Implicit((Object)(object)((Component)self).GetComponent<MutatorTargetingController>()))
			{
				((Component)self).gameObject.AddComponent<MutatorTargetingController>();
			}
		}

		private bool OnEquipUse(orig_PerformEquipmentAction orig, EquipmentSlot slot, EquipmentDef usedDef)
		{
			if ((Object)(object)usedDef != (Object)(object)equipDef)
			{
				return orig.Invoke(slot, usedDef);
			}
			CharacterBody characterBody = slot.characterBody;
			if (!Object.op_Implicit((Object)(object)characterBody) || !Object.op_Implicit((Object)(object)characterBody.healthComponent) || !characterBody.healthComponent.alive)
			{
				return false;
			}
			HurtBox val = MutatorTargetingController.FindTarget(characterBody, 80f, 30f);
			if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val.healthComponent) || !val.healthComponent.alive)
			{
				Log.Info("Mutator: no valid target.");
				return false;
			}
			((MonoBehaviour)slot).StartCoroutine(PullAndKill(slot, characterBody, val.healthComponent.body));
			return true;
		}

		[IteratorStateMachine(typeof(<PullAndKill>d__23))]
		private IEnumerator PullAndKill(EquipmentSlot slot, CharacterBody user, CharacterBody victim)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <PullAndKill>d__23(0)
			{
				<>4__this = this,
				slot = slot,
				user = user,
				victim = victim
			};
		}

		[IteratorStateMachine(typeof(<DigestionEndedAfter>d__24))]
		private IEnumerator DigestionEndedAfter(CharacterBody body, float seconds)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DigestionEndedAfter>d__24(0)
			{
				<>4__this = this,
				body = body,
				seconds = seconds
			};
		}

		private void SpawnCndm(CharacterBody body)
		{
			//IL_003f: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: 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)
			if (!Object.op_Implicit((Object)(object)body))
			{
				Log.Error("[MutatorEquipment] Tried to spawn condom but body was null!");
				return;
			}
			if ((Object)(object)condomPrefab == (Object)null)
			{
				Debug.LogError((object)"[MutatorEquipment] condomprop prefab not loaded!");
				return;
			}
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(body.footPosition.x, body.footPosition.y + 1f, body.footPosition.z);
			GameObject val2 = Object.Instantiate<GameObject>(condomPrefab, val, Quaternion.Euler(-90f, 0f, 0f));
			Log.Info("[MutatorEquipment] Spawned condom object at player feet.");
			Object.Destroy((Object)(object)val2, 25f);
		}

		private void OnRecalculateStats(orig_RecalculateStats orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (self.HasBuff(digestBuff))
			{
				self.damage *= 3f;
				self.moveSpeed *= 0.7f;
				self.regen += 25f;
			}
		}

		private void OnTakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo info)
		{
			try
			{
				if (Object.op_Implicit((Object)(object)self.body) && self.body.HasBuff(digestBuff))
				{
					info.damage *= 0.25f;
				}
			}
			catch
			{
			}
			orig.Invoke(self, info);
		}

		public static HurtBox FindTarget(CharacterBody source, float maxDist, float maxAngle)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: 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_0045: 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_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: 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_0082: 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)
			//IL_008a: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)source) || !Object.op_Implicit((Object)(object)source.inputBank) || !Object.op_Implicit((Object)(object)source.teamComponent))
			{
				return null;
			}
			BullseyeSearch val = new BullseyeSearch
			{
				teamMaskFilter = TeamMask.GetEnemyTeams(source.teamComponent.teamIndex),
				filterByLoS = true,
				searchOrigin = source.inputBank.aimOrigin,
				searchDirection = source.inputBank.aimDirection,
				maxDistanceFilter = maxDist,
				maxAngleFilter = maxAngle,
				sortMode = (SortMode)1
			};
			val.RefreshCandidates();
			return val.GetResults().FirstOrDefault();
		}
	}
}
namespace ExamplePlugin
{
	internal static class Log
	{
		private static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void Debug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void Error(object data)
		{
			_logSource.LogError(data);
		}

		internal static void Fatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void Info(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void Message(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
}