Decompiled source of SpiderPositionFix v1.2.1

DLLs/fandovec03.SpiderPositionFix.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using SpiderPositionFix.Patches;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;

[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("fandovec03.SpiderPositionFix")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.2.1.0")]
[assembly: AssemblyInformationalVersion("1.2.1+f4e16d8d9209a0c622f927e2f805e757ebd69466")]
[assembly: AssemblyProduct("SpiderPositionFix")]
[assembly: AssemblyTitle("fandovec03.SpiderPositionFix")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.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 SpiderPositionFix
{
	[BepInPlugin("fandovec03.SpiderPositionFix", "SpiderPositionFix", "1.2.1")]
	public class InitialScript : BaseUnityPlugin
	{
		internal static bool isStarlancePresent = Chainloader.PluginInfos.ContainsKey("AudioKnight-StarlancerEnemyEscape");

		public static AssetBundle SpiderAssets;

		public static InitialScript Instance { get; private set; } = null;


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


		internal static Harmony? Harmony { get; set; }

		internal static ConfigClass configSettings { get; set; } = null;


		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			configSettings = new ConfigClass(((BaseUnityPlugin)this).Config);
			Patch();
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			SpiderAssets = AssetBundle.LoadFromFile(Path.Combine(directoryName, "spideranimationfixbundle"));
			if ((Object)(object)SpiderAssets == (Object)null)
			{
				Logger.LogError((object)"Failed to load Assets");
			}
			Logger.LogInfo((object)"fandovec03.SpiderPositionFix v1.2.1 has loaded!");
		}

		internal static void Patch()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony = new Harmony("fandovec03.SpiderPositionFix");
			}
			if (isStarlancePresent)
			{
				Logger.LogInfo((object)"Found StarlanceEnemyEscape in Chainloader");
			}
			Logger.LogDebug((object)"Patching spider position fix...");
			Harmony.PatchAll(typeof(SpiderPositionPatch));
			Logger.LogDebug((object)"Finished patching!");
		}

		internal static void Unpatch()
		{
			Logger.LogDebug((object)"Unpatching spider position fix...");
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Logger.LogDebug((object)"Finished unpatching!");
		}
	}
	internal class ConfigClass
	{
		public readonly ConfigEntry<bool> applyMask;

		public readonly ConfigEntry<bool> debug;

		public ConfigClass(ConfigFile cfg)
		{
			cfg.SaveOnConfigSet = false;
			applyMask = cfg.Bind<bool>("Settings", "Apply changes to agent areaMask", true, "Apply the changes made to the spider agent areaMask. This will affect the pathfinding over offMeshLinks");
			debug = cfg.Bind<bool>("Debug", "Debug logs", false, "Enable debug logs");
			ClearOrphanedEntries(cfg);
			cfg.Save();
			cfg.SaveOnConfigSet = true;
		}

		public void ClearOrphanedEntries(ConfigFile cfg)
		{
			PropertyInfo propertyInfo = AccessTools.Property(typeof(ConfigFile), "OrphanedEntries");
			Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)propertyInfo.GetValue(cfg);
			dictionary.Clear();
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "fandovec03.SpiderPositionFix";

		public const string PLUGIN_NAME = "SpiderPositionFix";

		public const string PLUGIN_VERSION = "1.2.1";
	}
}
namespace SpiderPositionFix.Patches
{
	internal class spiderPositionData
	{
		public int currentJumpMaskBit = 1;

		public float returningFromWallState = 0f;

		public bool startPatch = false;

		public bool applySpeedSlowdown = false;

		public float originalSpeed = 4.25f;

		public float offsetSpeed = 0f;

		public float reachedWallTimer = 0f;

		public float delayTimer = 0f;

		public int delayTimes = 0;
	}
	[HarmonyPatch(typeof(SandSpiderAI))]
	public class SpiderPositionPatch
	{
		private static bool debug = InitialScript.configSettings.debug.Value;

		private static Dictionary<SandSpiderAI, spiderPositionData> spiderData = new Dictionary<SandSpiderAI, spiderPositionData>();

		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void StartPostfix(SandSpiderAI __instance)
		{
			if ((Object)(object)InitialScript.SpiderAssets != (Object)null)
			{
				try
				{
					AnimatorOverrideController runtimeAnimatorController = InitialScript.SpiderAssets.LoadAsset<AnimatorOverrideController>("Assets/LethalCompany/CustomAnims/SandSpider/Spider Anim Override.overrideController");
					((EnemyAI)__instance).creatureAnimator.runtimeAnimatorController = (RuntimeAnimatorController)(object)runtimeAnimatorController;
				}
				catch
				{
					InitialScript.Logger.LogError((object)"Failed to load OverrideController asset");
				}
			}
			if (!spiderData.ContainsKey(__instance))
			{
				spiderData.Add(__instance, new spiderPositionData());
			}
			spiderData[__instance].startPatch = true;
		}

		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		private static void UpdatePrefix(SandSpiderAI __instance)
		{
			spiderPositionData spiderPositionData2 = spiderData[__instance];
			if (!((NetworkBehaviour)__instance).IsOwner)
			{
				return;
			}
			if (__instance.reachedWallPosition && ((EnemyAI)__instance).currentBehaviourStateIndex == 1 && ((Behaviour)((EnemyAI)__instance).agent).enabled)
			{
				((Behaviour)((EnemyAI)__instance).agent).enabled = false;
			}
			if (!((Behaviour)((EnemyAI)__instance).agent).enabled && (!__instance.onWall || __instance.waitOnWallTimer <= 0f || ((EnemyAI)__instance).currentBehaviourStateIndex != 1))
			{
				((Behaviour)((EnemyAI)__instance).agent).enabled = true;
				if (!__instance.onWall)
				{
				}
			}
		}

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void UpdatePostfix(SandSpiderAI __instance)
		{
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_036a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0370: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0383: Unknown result type (might be due to invalid IL or missing references)
			spiderPositionData spiderPositionData2 = spiderData[__instance];
			if (!((NetworkBehaviour)__instance).IsOwner)
			{
				return;
			}
			if (InitialScript.configSettings.applyMask.Value)
			{
				if (((EnemyAI)__instance).isOutside && spiderPositionData2.currentJumpMaskBit != 1)
				{
					ChangeJumpMask(__instance, ref spiderPositionData2.currentJumpMaskBit);
					spiderPositionData2.currentJumpMaskBit = 1;
				}
				else if (!((EnemyAI)__instance).isOutside && spiderPositionData2.currentJumpMaskBit != 0)
				{
					ChangeJumpMask(__instance, ref spiderPositionData2.currentJumpMaskBit);
					spiderPositionData2.currentJumpMaskBit = 0;
				}
			}
			if (__instance.watchFromDistance)
			{
				if (debug)
				{
					InitialScript.Logger.LogDebug((object)"watchFromDistance true. Returning...");
				}
				return;
			}
			if (!spiderPositionData2.applySpeedSlowdown)
			{
				if (((EnemyAI)__instance).currentBehaviourStateIndex == 1)
				{
					spiderPositionData2.originalSpeed = __instance.spiderSpeed;
				}
				else
				{
					spiderPositionData2.originalSpeed = ((EnemyAI)__instance).agent.speed;
				}
			}
			if (!__instance.onWall)
			{
				if (Vector3.Distance(__instance.meshContainer.position, ((Component)__instance).transform.position) > 0.4f && !((EnemyAI)__instance).agent.isOnOffMeshLink)
				{
					if (spiderPositionData2.applySpeedSlowdown)
					{
						spiderPositionData2.offsetSpeed = Mathf.Clamp(Vector3.Distance(__instance.meshContainer.position, ((Component)__instance).transform.position), 0f, 2f) / 2f;
						((EnemyAI)__instance).agent.speed = spiderPositionData2.originalSpeed - Mathf.Min(1f, spiderPositionData2.offsetSpeed) - 0.15f;
					}
					else
					{
						spiderPositionData2.applySpeedSlowdown = true;
						if (((EnemyAI)__instance).currentBehaviourStateIndex == 1)
						{
							spiderPositionData2.originalSpeed = __instance.spiderSpeed;
						}
						else
						{
							((EnemyAI)__instance).agent.speed = spiderPositionData2.originalSpeed;
						}
					}
					if (debug && spiderPositionData2.originalSpeed != 0f)
					{
						InitialScript.Logger.LogDebug((object)("Applying slowdown. New speed: " + ((EnemyAI)__instance).agent.speed));
					}
				}
				else if (spiderPositionData2.applySpeedSlowdown && !((EnemyAI)__instance).agent.isOnOffMeshLink)
				{
					spiderPositionData2.applySpeedSlowdown = false;
					spiderPositionData2.offsetSpeed = 0f;
					((EnemyAI)__instance).agent.speed = spiderPositionData2.originalSpeed;
					if (debug)
					{
						InitialScript.Logger.LogDebug((object)"Returning original speed");
					}
				}
				if (((EnemyAI)__instance).agent.isOnOffMeshLink)
				{
					spiderPositionData2.applySpeedSlowdown = true;
					((EnemyAI)__instance).agent.speed = spiderPositionData2.originalSpeed / 1.15f;
					if (debug)
					{
						InitialScript.Logger.LogDebug((object)"On offMeshLink. Cutting speed");
					}
				}
				return;
			}
			if (spiderPositionData2.applySpeedSlowdown && __instance.onWall && !__instance.reachedWallPosition)
			{
				spiderPositionData2.applySpeedSlowdown = false;
				spiderPositionData2.offsetSpeed = 0f;
				((EnemyAI)__instance).agent.speed = spiderPositionData2.originalSpeed;
				if (debug)
				{
					InitialScript.Logger.LogDebug((object)"/2/ Returning original speed");
				}
			}
			if (__instance.onWall && (__instance.meshContainerTarget == __instance.floorPosition || __instance.meshContainerTarget == __instance.wallPosition))
			{
				((EnemyAI)__instance).agent.speed = 0f;
			}
		}

		[HarmonyPatch("LateUpdate")]
		[HarmonyPostfix]
		private static void MeshContainerPositionFix(SandSpiderAI __instance)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: 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_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0320: Unknown result type (might be due to invalid IL or missing references)
			//IL_032b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0292: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_023b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: 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_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: 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_01c8: Unknown result type (might be due to invalid IL or missing references)
			spiderPositionData spiderPositionData2 = spiderData[__instance];
			if (!((NetworkBehaviour)__instance).IsOwner || !spiderPositionData2.startPatch)
			{
				return;
			}
			if (!__instance.onWall)
			{
				if (Vector3.Distance(__instance.meshContainer.position, ((Component)__instance).transform.position) > 0.8f || Mathf.Abs(__instance.meshContainer.position.y - ((Component)__instance).transform.position.y) > 0.25f)
				{
					string text = "null";
					if (Vector3.Distance(__instance.meshContainer.position, ((Component)__instance).transform.position) > 0.8f)
					{
						text = "Triggered by distance: " + Vector3.Distance(__instance.meshContainer.position, ((Component)__instance).transform.position);
					}
					else if (Mathf.Abs(__instance.meshContainer.position.y - ((Component)__instance).transform.position.y) > 0.25f)
					{
						text = "Triggered by height projection: " + Mathf.Abs(__instance.meshContainer.position.y - ((Component)__instance).transform.position.y);
					}
					if (!__instance.onWall && !__instance.overrideSpiderLookRotation)
					{
						__instance.meshContainerTargetRotation = ((Component)((EnemyAI)__instance).agent).transform.rotation;
					}
					if (debug)
					{
						InitialScript.Logger.LogDebug((object)text);
					}
					__instance.meshContainerTarget = ((Component)((EnemyAI)__instance).agent).transform.position;
				}
				if (((EnemyAI)__instance).agent.isOnOffMeshLink)
				{
					__instance.meshContainer.position = Vector3.Lerp(__instance.meshContainer.position, ((EnemyAI)__instance).agent.nextPosition, Distance(Vector3.Distance(__instance.meshContainer.position, ((Component)__instance).transform.position), 0.5f));
					__instance.meshContainerPosition = __instance.meshContainer.position;
					Quaternion rotation = __instance.meshContainer.rotation;
					OffMeshLinkData currentOffMeshLinkData = ((EnemyAI)__instance).agent.currentOffMeshLinkData;
					__instance.meshContainerTargetRotation = Quaternion.Lerp(rotation, Quaternion.LookRotation(((OffMeshLinkData)(ref currentOffMeshLinkData)).endPos - __instance.meshContainer.position, Vector3.up), 0.75f);
				}
				else if (Mathf.Abs(__instance.meshContainer.position.y - ((Component)__instance).transform.position.y) > 0.25f)
				{
					__instance.meshContainerTargetRotation = Quaternion.LookRotation(((Component)((EnemyAI)__instance).agent).transform.position - __instance.meshContainer.position, Vector3.up);
				}
			}
			if (!__instance.lookingForWallPosition && __instance.onWall && ((EnemyAI)__instance).movingTowardsTargetPlayer && ((__instance.onWall && Vector3.Distance(__instance.meshContainer.position, ((Component)__instance).transform.position) < 1f) || spiderPositionData2.returningFromWallState > 6f))
			{
				spiderPositionData2.returningFromWallState = 0f;
			}
		}

		[HarmonyPatch("DoAIInterval")]
		[HarmonyPostfix]
		private static void DoAIIntervalPostfix(SandSpiderAI __instance)
		{
		}

		[HarmonyPatch("CalculateMeshMovement")]
		[HarmonyPrefix]
		private static bool MeshMovementPatch(SandSpiderAI __instance)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0171: 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_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.lookingForWallPosition && __instance.gotWallPositionInLOS && ((NetworkBehaviour)__instance).IsOwner && !__instance.onWall)
			{
				float num = Vector3.Distance(((Component)__instance).transform.position, __instance.floorPosition);
				float num2 = Vector3.Distance(((Component)__instance.meshContainer).transform.position, __instance.floorPosition);
				if (spiderData[__instance].delayTimer > 0.4f)
				{
					if (debug)
					{
						InitialScript.Logger.LogInfo((object)("distanceFromFloorPosition: " + num));
						InitialScript.Logger.LogInfo((object)("distanceFromFloorPositionMesh: " + num2));
					}
					spiderData[__instance].delayTimer = 0f;
					spiderData[__instance].delayTimes++;
					if (spiderData[__instance].delayTimes >= 40)
					{
						InitialScript.Logger.LogWarning((object)(((object)__instance)?.ToString() + ", ID " + ((NetworkBehaviour)__instance).NetworkObjectId + " failing to climb walls within set timer!"));
					}
				}
				else
				{
					spiderData[__instance].delayTimer += Time.deltaTime;
				}
				((EnemyAI)__instance).SetDestinationToPosition(__instance.floorPosition, false);
				__instance.CalculateSpiderPathToPosition();
				__instance.navigateToPositionTarget = ((Component)__instance).transform.position + Vector3.Normalize(((EnemyAI)__instance).agent.desiredVelocity) * 2f;
				if (num < 1.7f && num2 < 1.7f)
				{
					__instance.onWall = true;
					spiderData[__instance].delayTimes = 0;
					return true;
				}
				return false;
			}
			return true;
		}

		private static float Distance(float distance, float time)
		{
			return distance / time;
		}

		private static void ChangeJumpMask(SandSpiderAI __instance, ref int bit)
		{
			if ((Object)(object)__instance != (Object)null)
			{
				NavMeshAgent agent = ((EnemyAI)__instance).agent;
				agent.areaMask ^= 1 << NavMesh.GetAreaFromName("Jump");
				if (bit == 0)
				{
					bit = 1;
				}
				else if (bit == 1)
				{
					bit = 0;
				}
				if (debug)
				{
					InitialScript.Logger.LogDebug((object)("Spider: Toggled mask bit to " + bit));
				}
			}
		}

		[HarmonyPatch("TriggerChaseWithPlayer")]
		[HarmonyPrefix]
		private static void TriggerChaseWithPlayerPrefix(SandSpiderAI __instance)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if (!((Behaviour)((EnemyAI)__instance).agent).enabled)
			{
				((Behaviour)((EnemyAI)__instance).agent).enabled = true;
				if (__instance.onWall)
				{
					((EnemyAI)__instance).agent.Warp(__instance.floorPosition);
				}
			}
		}
	}
}