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);
}
}
}
}
}