using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalConfig.ConfigItems.Options;
using ScarySpringMan.Patches;
using Unity.Netcode;
using Unity.Netcode.Components;
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: AssemblyTitle("ScarySpringMan")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ScarySpringMan")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("a2ea0121-cbf4-4689-8d62-85c2b28711cd")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ScarySpringMan
{
internal class ConfigManager
{
public static void setupLethalCongfig()
{
//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_0013: Expected O, but got Unknown
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Expected O, but got Unknown
//IL_0022: Expected O, but got Unknown
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected O, but got Unknown
ConfigEntry<int> configMoveProb = ScarySpringManBase.configMoveProb;
IntSliderOptions val = new IntSliderOptions();
((BaseRangeOptions<int>)val).Min = 10;
((BaseRangeOptions<int>)val).Max = 120;
IntSliderConfigItem val2 = new IntSliderConfigItem(configMoveProb, val);
BoolCheckBoxConfigItem val3 = new BoolCheckBoxConfigItem(ScarySpringManBase.configAttack, false);
LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val3);
LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val3);
}
}
[BepInPlugin("Goobius.ScaryCoilHead", "Scary Coil Head", "1.0.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class ScarySpringManBase : BaseUnityPlugin
{
public static ConfigEntry<bool> configAttack;
public static ConfigEntry<int> configMoveProb;
private const string modGUID = "Goobius.ScaryCoilHead";
private const string modName = "Scary Coil Head";
private const string modVersion = "1.0.1";
private readonly Harmony harmony = new Harmony("Goobius.ScaryCoilHead");
internal static ManualLogSource mls = Logger.CreateLogSource("Goobius.ScaryCoilHead");
private void Awake()
{
configAttack = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Can Attack", false, "If enabled Coil Head can attack when players are looking");
configMoveProb = ((BaseUnityPlugin)this).Config.Bind<int>("General", "Movement Probability", 60, "Changed amount of seconds player needs to look at Coil Head before it moves. Note: probability of movement is calculated as 100% chance Coil Head will move in a given time, i.e. can move earlier or later than defined time");
if (Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"))
{
ConfigManager.setupLethalCongfig();
}
mls.LogInfo((object)"Scary Spring Man is ALIVE :)");
harmony.PatchAll(typeof(ScarySpringManBase));
harmony.PatchAll(typeof(SpringManAIPatch));
}
}
}
namespace ScarySpringMan.Patches
{
[HarmonyPatch(typeof(SpringManAI))]
internal class SpringManAIPatch : EnemyAI
{
private static Random rnd = new Random();
public static bool multiplePeps = false;
public static bool kill = false;
[HarmonyPatch("Update")]
[HarmonyPostfix]
private static void patchUpdate(SpringManAI __instance)
{
if (((NetworkBehaviour)__instance).IsOwner && ShouldStartMoving(__instance))
{
((MonoBehaviour)__instance).StartCoroutine(MoveTowardsPlayer(__instance));
}
}
[HarmonyPatch("Update")]
[HarmonyPrefix]
public static void placeNetworkTransfom(SpringManAI __instance)
{
if (!Object.op_Implicit((Object)(object)((Component)__instance).gameObject.GetComponent<NetworkTransform>()))
{
((Component)__instance).gameObject.AddComponent<NetworkTransform>();
}
}
private static bool ShouldStartMoving(SpringManAI __instance)
{
//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_004a: 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_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
bool flag = false;
int num = 0;
multiplePeps = false;
for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++)
{
if (((EnemyAI)__instance).PlayerIsTargetable(StartOfRound.Instance.allPlayerScripts[i], false, false) && StartOfRound.Instance.allPlayerScripts[i].HasLineOfSightToPosition(((Component)__instance).transform.position + Vector3.up * 1.6f, 68f, 60, -1f) && Vector3.Distance(((Component)StartOfRound.Instance.allPlayerScripts[i].gameplayCamera).transform.position, ((EnemyAI)__instance).eye.position) > 0.3f)
{
flag = true;
num++;
}
}
if (flag)
{
int maxValue = ScarySpringManBase.configMoveProb.Value * 60;
int num2 = rnd.Next(1, maxValue);
if (num2 == 420)
{
if (ScarySpringManBase.configAttack.Value)
{
if (num == 2)
{
int num3 = rnd.Next(1, 100);
if (num3 == 69)
{
multiplePeps = true;
}
}
else if (num == 3)
{
int num3 = rnd.Next(1, 10);
if (num3 == 8)
{
multiplePeps = true;
}
}
else if (num >= 4)
{
int num4 = num - 4;
int num5 = 10 - num4 * 2;
int num3 = ((num5 <= 1) ? 1 : rnd.Next(1, num5));
if (num3 == 1)
{
multiplePeps = true;
}
}
}
return true;
}
}
return false;
}
private static IEnumerator MoveTowardsPlayer(SpringManAI __instance)
{
if ((!((Behaviour)((EnemyAI)__instance).agent).enabled || !((EnemyAI)__instance).agent.isOnNavMesh) && !((EnemyAI)__instance).agent.Warp(((Component)__instance).transform.position))
{
ScarySpringManBase.mls.LogInfo((object)"Cannot place on NavMesh");
yield break;
}
float currentSpeed = 0f;
float targetSpeed = 14.5f;
float acceleration = 2.5f;
((EnemyAI)__instance).agent.angularSpeed = 270f;
((EnemyAI)__instance).agent.stoppingDistance = 0.5f;
((EnemyAI)__instance).agent.updatePosition = true;
((EnemyAI)__instance).agent.updateRotation = true;
float distanceScalar = ((!multiplePeps) ? 0.5f : 1.1f);
Vector3 PlayerPosition = ((Component)GameNetworkManager.Instance.localPlayerController).transform.position;
Vector3 directionToPlayer = PlayerPosition - ((Component)__instance).transform.position;
Vector3 targetPosition = ((Component)__instance).transform.position + directionToPlayer * distanceScalar;
float distanceToTarget = Vector3.Distance(((Component)__instance).transform.position, targetPosition);
float maxDistance = 10f;
NavMeshHit hit = default(NavMeshHit);
if (NavMesh.SamplePosition(targetPosition, ref hit, maxDistance, -1))
{
targetPosition = ((NavMeshHit)(ref hit)).position;
}
else
{
ScarySpringManBase.mls.LogInfo((object)"Failed to find a point on the NavMesh near the target position.");
}
if (NavMesh.SamplePosition(targetPosition, ref hit, maxDistance, -1))
{
targetPosition = ((NavMeshHit)(ref hit)).position;
}
((EnemyAI)__instance).agent.SetDestination(targetPosition);
yield return (object)new WaitWhile((Func<bool>)(() => ((EnemyAI)__instance).agent.pathPending));
((EnemyAI)__instance).agent.isStopped = false;
while (distanceToTarget > ((EnemyAI)__instance).agent.stoppingDistance)
{
bool playerLooking = false;
for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++)
{
if (((EnemyAI)__instance).PlayerIsTargetable(StartOfRound.Instance.allPlayerScripts[i], false, false) && StartOfRound.Instance.allPlayerScripts[i].HasLineOfSightToPosition(((Component)__instance).transform.position + Vector3.up * 1.6f, 68f, 60, -1f) && Vector3.Distance(((Component)StartOfRound.Instance.allPlayerScripts[i].gameplayCamera).transform.position, ((EnemyAI)__instance).eye.position) > 0.3f)
{
playerLooking = true;
break;
}
}
if (!playerLooking || !((NetworkBehaviour)__instance).IsOwner)
{
yield break;
}
distanceToTarget = Vector3.Distance(((Component)__instance).transform.position, targetPosition);
currentSpeed = Mathf.Lerp(currentSpeed, targetSpeed, acceleration * Time.deltaTime);
((EnemyAI)__instance).agent.speed = currentSpeed;
__instance.SetAnimationGoServerRpc();
if (distanceToTarget <= ((EnemyAI)__instance).agent.stoppingDistance + 0.5f)
{
break;
}
ulong ownerID = ((NetworkBehaviour)__instance).OwnerClientId;
if (!((EnemyAI)__instance).PlayerIsTargetable(StartOfRound.Instance.allPlayerScripts[ownerID], false, false))
{
break;
}
yield return null;
}
((EnemyAI)__instance).agent.speed = 0f;
__instance.SetAnimationStopServerRpc();
((EnemyAI)__instance).agent.ResetPath();
}
}
}