Decompiled source of Pontso v1.0.0

plugins/K00PE-Pontsomod/K00PE.Pontso.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
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.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using K00PE.Pontso.NetcodePatcher;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Pontso.Configuration;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("K00PE.Pontso")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Pontso mod")]
[assembly: AssemblyTitle("K00PE.Pontso")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
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;
		}
	}
}
namespace Pontso
{
	public class PontsoAI : EnemyAI, INoiseListener
	{
		private enum VoiceClip
		{
			alert,
			chase,
			chatter,
			death,
			escape,
			hurt,
			lost,
			mock,
			panic,
			stun,
			victory
		}

		public enum AnimationState
		{
			Idle,
			Walk,
			Stun,
			Hurt,
			Attack,
			LookAround,
			Dead,
			Dancing
		}

		public enum LogicState
		{
			Chatting,
			Dancing,
			Roaming,
			Listening,
			Chasing,
			CatchingUp,
			Investigating,
			Panic
		}

		public Transform attackArea;

		private const float shakeRange = 8f;

		private const float killLaunchSpeed = 1.5f;

		private const float verticalKillLaunch = 0.5f;

		private float lastTouch;

		private const int touchDamage = 20;

		private const float touchCooldown = 0.5f;

		private const float touchSlowdown = 2f;

		private const float touchDuration = 1f;

		private bool ignorePlayers;

		private PlayerControllerB losPlayer;

		private Vector3? lastTargetPosition;

		private int lookAroundCount;

		private float timeSinceHeardNoise;

		private const float maxHearingRange = 30f;

		private const float minNoiseLoudness = 0.25f;

		private const float alertCooldown = 1.5f;

		private const float noiseCooldown = 0.5f;

		private float lastSpottedLocalPlayer;

		private float lastSpottedPlayer;

		private float lastSpottedMonster;

		private bool stingerPlayed;

		private bool playingAmnesia;

		private readonly float amnesiaFadeout = 20f;

		private readonly float stingerCooldown = 5f;

		private float lastVoiceline;

		private const float voiceCooldown = 0.3f;

		public AudioSource SFX;

		public AudioSource MemeSFX;

		public AudioSource Voice;

		public AudioClip[] alertSound;

		public AudioClip[] chaseSound;

		public AudioClip[] chatterSound;

		public AudioClip[] deathSound;

		public AudioClip[] escapeSound;

		public AudioClip[] hurtSound;

		public AudioClip[] lostSound;

		public AudioClip[] mockSound;

		public AudioClip[] panicSound;

		public AudioClip[] stunSound;

		public AudioClip[] victorySound;

		public AudioClip[] stepSound;

		public AudioClip[] attackSound;

		public AudioClip[] memeSound;

		private LogicState _logicState;

		private PlayerControllerB localPlayer => GameNetworkManager.Instance.localPlayerController;

		public AnimationState animState
		{
			get
			{
				return (AnimationState)base.creatureAnimator.GetInteger("state");
			}
			set
			{
				if (animState == AnimationState.Dead)
				{
					return;
				}
				if (((NetworkBehaviour)this).IsServer)
				{
					if (value != AnimationState.Walk)
					{
						base.agent.speed = 0f;
					}
					SyncAnimClientRpc((int)value);
				}
				else if (value == AnimationState.Idle)
				{
					base.creatureAnimator.SetInteger("state", (int)value);
				}
			}
		}

		public LogicState logicState
		{
			get
			{
				return _logicState;
			}
			set
			{
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
				if (!((NetworkBehaviour)this).IsServer)
				{
					return;
				}
				switch (value)
				{
				case LogicState.Panic:
					if (animState == AnimationState.Idle || animState == AnimationState.LookAround || animState == AnimationState.Dancing)
					{
						animState = AnimationState.Walk;
					}
					if (logicState != LogicState.Panic)
					{
						PlayVoiceServerRpc(8);
					}
					break;
				case LogicState.Chasing:
					if (animState != AnimationState.Attack && animState != AnimationState.Hurt && animState != AnimationState.Stun)
					{
						animState = AnimationState.Walk;
					}
					lastTargetPosition = ((Component)base.targetPlayer).transform.position;
					break;
				case LogicState.CatchingUp:
					if (animState == AnimationState.Idle || animState == AnimationState.LookAround)
					{
						animState = AnimationState.Walk;
					}
					if (logicState != LogicState.CatchingUp)
					{
						((MonoBehaviour)this).StartCoroutine(BreakRoutine(LogicState.CatchingUp));
					}
					break;
				case LogicState.Investigating:
					if (animState == AnimationState.Idle || animState == AnimationState.LookAround)
					{
						animState = AnimationState.Walk;
					}
					if (logicState != LogicState.Investigating)
					{
						((MonoBehaviour)this).StartCoroutine(BreakRoutine(LogicState.Investigating));
					}
					break;
				case LogicState.Listening:
					if (animState == AnimationState.Idle || animState == AnimationState.Walk)
					{
						animState = AnimationState.LookAround;
					}
					if (logicState != LogicState.Listening)
					{
						lookAroundCount = 3;
						if (Time.time - lastSpottedPlayer > 1.5f)
						{
							PlayVoiceServerRpc(6);
						}
					}
					break;
				case LogicState.Chatting:
					if (animState == AnimationState.Idle || animState == AnimationState.Walk || animState == AnimationState.Dancing)
					{
						animState = AnimationState.LookAround;
					}
					if (logicState != 0)
					{
						lookAroundCount = 3;
						PlayVoiceServerRpc(2);
					}
					break;
				case LogicState.Dancing:
					if (animState == AnimationState.Idle || animState == AnimationState.Walk || animState == AnimationState.LookAround)
					{
						animState = AnimationState.Dancing;
					}
					break;
				case LogicState.Roaming:
					if (animState == AnimationState.Idle || animState == AnimationState.LookAround || animState == AnimationState.Dancing)
					{
						animState = AnimationState.Walk;
					}
					if (logicState != LogicState.Roaming)
					{
						((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null);
						((MonoBehaviour)this).StartCoroutine(BreakRoutine(LogicState.Roaming));
					}
					break;
				}
				_logicState = value;
			}
		}

		private AudioClip[] SelectVoice(VoiceClip v)
		{
			return v switch
			{
				VoiceClip.alert => alertSound, 
				VoiceClip.chase => chaseSound, 
				VoiceClip.chatter => chatterSound, 
				VoiceClip.death => deathSound, 
				VoiceClip.escape => escapeSound, 
				VoiceClip.hurt => hurtSound, 
				VoiceClip.lost => lostSound, 
				VoiceClip.mock => mockSound, 
				VoiceClip.panic => panicSound, 
				VoiceClip.stun => stunSound, 
				VoiceClip.victory => victorySound, 
				_ => chatterSound, 
			};
		}

		[ServerRpc(RequireOwnership = false)]
		private void PlayVoiceServerRpc(int voiceID)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1479079518u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, voiceID);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1479079518u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && !(Time.time - lastVoiceline <= 0.3f))
				{
					lastVoiceline = Time.time;
					AudioClip[] array = SelectVoice((VoiceClip)voiceID);
					int clipID = Random.RandomRangeInt(0, array.Length);
					PlayVoiceClientRpc(voiceID, clipID);
				}
			}
		}

		[ClientRpc]
		private void PlayVoiceClientRpc(int voiceID, int clipID)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: 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)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2345384742u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, voiceID);
					BytePacker.WriteValueBitPacked(val2, clipID);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2345384742u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					Voice.Stop();
					Voice.clip = SelectVoice((VoiceClip)voiceID)[clipID];
					Voice.Play();
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void PlayMemesoundServerRpc(int clipID)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(371327229u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, clipID);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 371327229u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					PlayMemesoundClientRpc(clipID);
				}
			}
		}

		[ClientRpc]
		private void PlayMemesoundClientRpc(int clipID)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(668413318u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, clipID);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 668413318u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					SFX.PlayOneShot(memeSound[clipID]);
				}
			}
		}

		private void PlayRandomSFX(AudioClip[] sound)
		{
			SFX.PlayOneShot(sound[Random.RandomRangeInt(0, sound.Length)]);
		}

		[ClientRpc]
		public void SyncAnimClientRpc(int state)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(4046748191u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, state);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4046748191u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					base.creatureAnimator.SetInteger("state", state);
				}
			}
		}

		public void WalkStartEvent()
		{
			if (((NetworkBehaviour)this).IsServer)
			{
				base.agent.speed = ((logicState == LogicState.Panic) ? 8f : 5f);
				base.agent.angularSpeed = 360f;
				base.agent.acceleration = 30f;
			}
		}

		public void TakeStepEvent()
		{
			PlayRandomSFX(stepSound);
		}

		public void LookEndEvent()
		{
			if (((NetworkBehaviour)this).IsServer)
			{
				if (lookAroundCount == 3 && animState == AnimationState.LookAround)
				{
					PlayMemesoundClientRpc(6);
				}
				lookAroundCount--;
				if (lookAroundCount <= 0)
				{
					PlayVoiceServerRpc(2);
					logicState = LogicState.Roaming;
				}
			}
		}

		public void DanceEndEvent()
		{
			if (((NetworkBehaviour)this).IsServer)
			{
				logicState = LogicState.Chatting;
			}
		}

		private LogicState DecideLogic()
		{
			//IL_004d: 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)
			if (base.enemyHP < 4)
			{
				return LogicState.Panic;
			}
			if ((Object)(object)base.targetPlayer != (Object)null)
			{
				return LogicState.Chasing;
			}
			if (logicState == LogicState.Chasing)
			{
				return LogicState.CatchingUp;
			}
			if (logicState == LogicState.Investigating || logicState == LogicState.CatchingUp)
			{
				if (!lastTargetPosition.HasValue)
				{
					return LogicState.Listening;
				}
				if (Vector3.Distance(lastTargetPosition.Value, ((Component)this).transform.position) < 2.5f)
				{
					return LogicState.Listening;
				}
				return logicState;
			}
			if (logicState == LogicState.Listening)
			{
				return LogicState.Listening;
			}
			if (logicState == LogicState.Dancing)
			{
				return LogicState.Dancing;
			}
			if (logicState == LogicState.Chatting)
			{
				return LogicState.Chatting;
			}
			return LogicState.Roaming;
		}

		private IEnumerator BreakRoutine(LogicState oldState)
		{
			yield return (object)new WaitForSeconds((float)Random.Range(10, 35));
			if (logicState == oldState)
			{
				logicState = LogicState.Chatting;
			}
		}

		private void Log(object log)
		{
			try
			{
				PontsoModPlugin.LogInfo("\n\n-----------------------------\n" + log.ToString() + "\n-----------------------------\n\n");
			}
			catch (Exception)
			{
				Debug.Log(log);
			}
		}

		public override void Start()
		{
			((EnemyAI)this).Start();
			Log("Pontso spawned");
			logicState = LogicState.Roaming;
		}

		public override void Update()
		{
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).Update();
			if (playingAmnesia)
			{
				MemeSFX.volume = (amnesiaFadeout + lastSpottedLocalPlayer - Time.time) / amnesiaFadeout;
			}
			if (playingAmnesia && Time.time - lastSpottedLocalPlayer > amnesiaFadeout)
			{
				MemeSFX.Stop();
				playingAmnesia = false;
			}
			if (base.isEnemyDead)
			{
				return;
			}
			if (((ButtonControl)Keyboard.current.lKey).wasPressedThisFrame && ((NetworkBehaviour)this).IsServer)
			{
				ignorePlayers = !ignorePlayers;
			}
			if (localPlayer.HasLineOfSightToPosition(base.eye.position, 50f, 60, -1f))
			{
				lastSpottedMonster = Time.time;
				localPlayer.IncreaseFearLevelOverTime(1f, 1f);
				if (!stingerPlayed)
				{
					MemeSFX.volume = 1f;
					MemeSFX.PlayOneShot(memeSound[3]);
					stingerPlayed = true;
				}
			}
			if (stingerPlayed && Time.time - lastSpottedMonster > stingerCooldown)
			{
				stingerPlayed = false;
			}
			if (((NetworkBehaviour)this).IsServer && !ignorePlayers && animState != AnimationState.Dancing && logicState == LogicState.Chasing && Time.time - lastSpottedPlayer > 1.5f)
			{
				PlayVoiceServerRpc(1);
			}
			if (((NetworkBehaviour)this).IsServer && !ignorePlayers && animState != AnimationState.Dancing && (Object)(object)losPlayer != (Object)null)
			{
				lastSpottedPlayer = Time.time;
			}
			if (!ignorePlayers && animState != AnimationState.Dancing && (Object)(object)losPlayer != (Object)null && (Object)(object)losPlayer == (Object)(object)localPlayer)
			{
				lastSpottedLocalPlayer = Time.time;
				localPlayer.IncreaseFearLevelOverTime(1f, 1f);
				if (!playingAmnesia)
				{
					MemeSFX.volume = 1f;
					MemeSFX.loop = true;
					MemeSFX.clip = memeSound[1];
					MemeSFX.Play();
					playingAmnesia = true;
				}
			}
		}

		public void FixedUpdate()
		{
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			if (base.isEnemyDead || StartOfRound.Instance.allPlayersDead || base.stunNormalizedTimer > 0f)
			{
				return;
			}
			losPlayer = ((ignorePlayers || animState == AnimationState.Dancing) ? null : ((EnemyAI)this).CheckLineOfSightForPlayer(160f, 60, 4));
			if (((NetworkBehaviour)this).IsServer)
			{
				if (base.stunNormalizedTimer <= 0f && animState == AnimationState.Stun)
				{
					animState = AnimationState.Idle;
				}
				if (logicState == LogicState.Panic)
				{
					((EnemyAI)this).StopSearch(base.currentSearch, true);
					base.targetPlayer = ((EnemyAI)this).GetClosestPlayer(true, false, false);
					Transform val = ((EnemyAI)this).ChooseFarthestNodeFromPosition(((Component)base.targetPlayer).transform.position, true, 0, false);
					((EnemyAI)this).SetDestinationToPosition(val.position, false);
				}
				base.targetPlayer = losPlayer;
				if (logicState == LogicState.Panic && (Object)(object)base.targetPlayer != (Object)null && Time.time - lastVoiceline > 1.5f)
				{
					PlayVoiceServerRpc(8);
				}
				logicState = DecideLogic();
				if (logicState == LogicState.Chasing)
				{
					((EnemyAI)this).StopSearch(base.currentSearch, true);
					((EnemyAI)this).SetMovingTowardsTargetPlayer(base.targetPlayer);
				}
				if (logicState == LogicState.Investigating || logicState == LogicState.CatchingUp)
				{
					((EnemyAI)this).StopSearch(base.currentSearch, true);
					((EnemyAI)this).SetDestinationToPosition(lastTargetPosition.Value, false);
				}
			}
		}

		public override void DetectNoise(Vector3 noisePosition, float noiseLoudness, int timesNoisePlayedInOneSpot = 0, int noiseID = 0)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).DetectNoise(noisePosition, noiseLoudness, timesNoisePlayedInOneSpot, noiseID);
			if (!((NetworkBehaviour)this).IsServer || base.isEnemyDead || base.stunNormalizedTimer > 0f || noiseID == 7 || noiseID == 546 || timesNoisePlayedInOneSpot > 15 || logicState == LogicState.Chasing || logicState == LogicState.Panic || logicState == LogicState.CatchingUp)
			{
				return;
			}
			float num = Vector3.Distance(((Component)this).transform.position, noisePosition);
			if (Physics.Linecast(((Component)this).transform.position, noisePosition, 256))
			{
				num *= 2f;
			}
			if (noiseLoudness < 0.25f || num > 30f || Time.time - timeSinceHeardNoise <= 0.5f)
			{
				return;
			}
			if (Time.time - timeSinceHeardNoise > 1.5f && Time.time - lastSpottedPlayer > 1.5f)
			{
				PlayVoiceServerRpc(0);
			}
			timeSinceHeardNoise = Time.time;
			((EnemyAI)this).StopSearch(base.currentSearch, true);
			lastTargetPosition = noisePosition;
			if (num < 3f && ((EnemyAI)this).CheckLineOfSightForPosition(noisePosition, 160f, 60, 3f, (Transform)null))
			{
				if (noiseID == 5)
				{
					logicState = LogicState.Dancing;
				}
			}
			else
			{
				logicState = LogicState.Investigating;
				((EnemyAI)this).SetDestinationToPosition(noisePosition, false);
			}
		}

		public override void OnCollideWithPlayer(Collider other)
		{
			//IL_0042: 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)
			((EnemyAI)this).OnCollideWithPlayer(other);
			PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false);
			if ((Object)(object)val != (Object)null && Time.time - lastTouch > 0.5f)
			{
				lastTouch = Time.time;
				val.DamagePlayer(20, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
				((MonoBehaviour)this).StartCoroutine(ApplySlowdown(val));
			}
		}

		private IEnumerator ApplySlowdown(PlayerControllerB player)
		{
			player.isMovementHindered++;
			player.hinderedMultiplier *= 2f;
			yield return (object)new WaitForSeconds(1f);
			if ((Object)(object)player != (Object)null && player.isMovementHindered > 0 && player.hinderedMultiplier >= 2f)
			{
				player.isMovementHindered = Mathf.Clamp(player.isMovementHindered - 1, 0, 1000);
				player.hinderedMultiplier /= 2f;
			}
		}

		public void SwingAtPlayer()
		{
			if (!base.isEnemyDead && !(base.stunNormalizedTimer > 0f) && ((NetworkBehaviour)this).IsServer && animState != AnimationState.Attack && animState != AnimationState.Hurt)
			{
				animState = AnimationState.Attack;
			}
		}

		public void AttackEvent()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: 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_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			if (base.isEnemyDead || base.stunNormalizedTimer > 0f)
			{
				return;
			}
			PlayRandomSFX(attackSound);
			if (Vector3.Distance(((Component)localPlayer.gameplayCamera).transform.position, base.eye.position) < 8f)
			{
				HUDManager.Instance.ShakeCamera((ScreenShakeType)1);
			}
			int num = 8;
			Collider[] array = Physics.OverlapBox(attackArea.position, attackArea.localScale, Quaternion.identity, num);
			foreach (Collider val in array)
			{
				PlayerControllerB val2 = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(val, false, false);
				if ((Object)(object)val2 != (Object)null)
				{
					Vector3 val3 = ((Component)val2.gameplayCamera).transform.position - attackArea.position;
					Vector3 val4 = new Vector3(val3.x, val3.y, 0f);
					Vector3 normalized = ((Vector3)(ref val4)).normalized;
					val4 = new Vector3(normalized.x, 0.5f, normalized.z);
					Vector3 val5 = ((Vector3)(ref val4)).normalized * 1.5f;
					val2.KillPlayer(val5, true, (CauseOfDeath)1, 0);
					PlayMemesoundServerRpc(5);
					PlayMemesoundServerRpc(0);
					PlayVoiceServerRpc(10);
				}
			}
		}

		public override void HitEnemy(int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
		{
			((EnemyAI)this).HitEnemy(force, playerWhoHit, playHitSFX, hitID);
			if (base.isEnemyDead)
			{
				return;
			}
			base.enemyHP -= force;
			if (animState == AnimationState.Attack)
			{
				if (Random.Range(0f, 1f) > 0.5f)
				{
					animState = AnimationState.Hurt;
				}
			}
			else
			{
				animState = AnimationState.Hurt;
			}
			PlayVoiceServerRpc(5);
			if (((NetworkBehaviour)this).IsServer && base.enemyHP <= 0 && !base.isEnemyDead)
			{
				((MonoBehaviour)this).StopCoroutine(base.searchCoroutine);
				((EnemyAI)this).KillEnemyOnOwnerClient(false);
			}
		}

		public override void SetEnemyStunned(bool setToStunned, float setToStunTime = 1f, PlayerControllerB setStunnedByPlayer = null)
		{
			((EnemyAI)this).SetEnemyStunned(setToStunned, setToStunTime, setStunnedByPlayer);
			animState = AnimationState.Stun;
			PlayVoiceServerRpc(9);
		}

		public override void KillEnemy(bool destroy = false)
		{
			((EnemyAI)this).KillEnemy(destroy);
			animState = AnimationState.Dead;
			PlayVoiceServerRpc(3);
			PlayMemesoundServerRpc(2);
		}

		public void DyingEndEvent()
		{
			base.creatureAnimator.speed = 0f;
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_PontsoAI()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(1479079518u, new RpcReceiveHandler(__rpc_handler_1479079518));
			NetworkManager.__rpc_func_table.Add(2345384742u, new RpcReceiveHandler(__rpc_handler_2345384742));
			NetworkManager.__rpc_func_table.Add(371327229u, new RpcReceiveHandler(__rpc_handler_371327229));
			NetworkManager.__rpc_func_table.Add(668413318u, new RpcReceiveHandler(__rpc_handler_668413318));
			NetworkManager.__rpc_func_table.Add(4046748191u, new RpcReceiveHandler(__rpc_handler_4046748191));
		}

		private static void __rpc_handler_1479079518(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int voiceID = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref voiceID);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((PontsoAI)(object)target).PlayVoiceServerRpc(voiceID);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2345384742(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: 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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int voiceID = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref voiceID);
				int clipID = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref clipID);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((PontsoAI)(object)target).PlayVoiceClientRpc(voiceID, clipID);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_371327229(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int clipID = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref clipID);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((PontsoAI)(object)target).PlayMemesoundServerRpc(clipID);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_668413318(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int clipID = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref clipID);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((PontsoAI)(object)target).PlayMemesoundClientRpc(clipID);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_4046748191(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int state = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref state);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((PontsoAI)(object)target).SyncAnimClientRpc(state);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "PontsoAI";
		}
	}
	public class PontsoAnimEvents : MonoBehaviour
	{
		public PontsoAI pontsoAI;

		public void AttackEvent()
		{
			pontsoAI.AttackEvent();
		}

		public void AttackEndEvent()
		{
			if (pontsoAI.animState == PontsoAI.AnimationState.Attack)
			{
				pontsoAI.animState = PontsoAI.AnimationState.Idle;
			}
		}

		public void HurtEndEvent()
		{
			if (pontsoAI.animState == PontsoAI.AnimationState.Hurt)
			{
				pontsoAI.animState = PontsoAI.AnimationState.Idle;
			}
		}

		public void DyingEndEvent()
		{
			pontsoAI.DyingEndEvent();
		}

		public void WalkStartEvent()
		{
			if (pontsoAI.animState == PontsoAI.AnimationState.Walk)
			{
				pontsoAI.WalkStartEvent();
			}
		}

		public void TakeStepEvent()
		{
			pontsoAI.TakeStepEvent();
		}

		public void LookEndEvent()
		{
			pontsoAI.LookEndEvent();
		}

		public void DanceEndEvent()
		{
			pontsoAI.DanceEndEvent();
		}
	}
	public class PontsoAttackCollider : MonoBehaviour
	{
		public PontsoAI pontsoAI;

		private void OnTriggerStay(Collider other)
		{
			if (((Component)other).CompareTag("Player"))
			{
				pontsoAI.SwingAtPlayer();
			}
		}
	}
	[BepInPlugin("com.koope.lethalcompany.pontsomod", "Pontso Mod", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class PontsoModPlugin : BaseUnityPlugin
	{
		public const string VERSION = "1.0.0";

		public const string NAME = "Pontso Mod";

		public const string GUID = "com.koope.lethalcompany.pontsomod";

		public PluginConfig modConfig;

		public static PontsoModPlugin Instance;

		private void Awake()
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			Instance = this;
			LogInfo("\n\n------ Initializing Pontso Mod ------\n");
			modConfig = new PluginConfig(((BaseUnityPlugin)this).Config);
			InitializeNetworkBehaviours();
			LoadAssets();
			LogInfo("Applying patches...");
			new Harmony("com.koope.lethalcompany.pontsomod").PatchAll();
			LogInfo("Patches applied!");
			LogInfo("\n------ Pontso mod configured ------\n\n");
		}

		public static void LoadAssets()
		{
			LogInfo("Loading assets...");
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "pontsomod");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			if ((Object)(object)val == (Object)null)
			{
				LogError("Failed to load assets from path: " + text);
				return;
			}
			int num = 200;
			EnemyType val2 = val.LoadAsset<EnemyType>("pontsoenemytype.asset");
			TerminalNode val3 = val.LoadAsset<TerminalNode>("pontsoenemytn.asset");
			TerminalKeyword val4 = val.LoadAsset<TerminalKeyword>("pontsoenemytk.asset");
			NetworkPrefabs.RegisterNetworkPrefab(val2.enemyPrefab);
			Enemies.RegisterEnemy(val2, num, (LevelTypes)(-1), val3, val4);
			LogInfo("Assets loaded");
		}

		internal static void LogDebug(string message)
		{
			Instance.Log(message, (LogLevel)32);
		}

		internal static void LogInfo(string message)
		{
			Instance.Log(message, (LogLevel)16);
		}

		internal static void LogWarning(string message)
		{
			Instance.Log(message, (LogLevel)4);
		}

		internal static void LogError(string message)
		{
			Instance.Log(message, (LogLevel)2);
		}

		internal static void LogError(Exception ex)
		{
			Instance.Log(ex.Message + "\n" + ex.StackTrace, (LogLevel)2);
		}

		private void Log(string message, LogLevel logLevel)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			((BaseUnityPlugin)this).Logger.Log(logLevel, (object)message);
		}

		private static void InitializeNetworkBehaviours()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			for (int i = 0; i < types.Length; i++)
			{
				MethodInfo[] methods = types[i].GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				foreach (MethodInfo methodInfo in methods)
				{
					if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "K00PE.Pontso";

		public const string PLUGIN_NAME = "Pontso mod";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace Pontso.Configuration
{
	public class PluginConfig
	{
		public readonly ConfigEntry<int> spawnWeight;

		public PluginConfig(ConfigFile cfg)
		{
			cfg.SaveOnConfigSet = false;
			spawnWeight = cfg.Bind<int>("General", "Spawn weight", 40, "The spawn chance weight for Pontso, relative to other existing enemies.\nGoes up from 0, lower is more rare, 100 and up is very common.");
			ClearUnusedEntries(cfg);
			cfg.SaveOnConfigSet = true;
		}

		private void ClearUnusedEntries(ConfigFile cfg)
		{
			((Dictionary<ConfigDefinition, string>)((object)cfg).GetType().GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(cfg, null)).Clear();
			cfg.Save();
		}
	}
}
namespace K00PE.Pontso.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}