Decompiled source of VideoChaos v0.8.0

plugins/VideoChaos.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("VideoChaos")]
[assembly: AssemblyCompany("TGamerT")]
[assembly: AssemblyFileVersion("0.8.0.0")]
[assembly: AssemblyInformationalVersion("0.8.0-development")]
[assembly: AssemblyVersion("0.8.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 VideoChaos
{
	internal static class BotAimBridge
	{
		internal static void Install(Harmony harmony)
		{
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			MethodInfo methodInfo = Type.GetType("LethalAI.BotItemInteraction, LethalAI", throwOnError: false)?.GetMethod("Input", BindingFlags.Static | BindingFlags.NonPublic);
			if (!(methodInfo == null))
			{
				ParameterInfo[] parameters = methodInfo.GetParameters();
				if (Array.Exists(parameters, (ParameterInfo p) => p.Name == "targetOffset" && p.ParameterType == typeof(Vector3)) && Array.Exists(parameters, (ParameterInfo p) => p.Name == "movingTarget" && p.ParameterType == typeof(Transform)))
				{
					harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(typeof(BotAimBridge), "Aim", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
					Plugin.Log.LogInfo((object)"VideoChaos: Bot-Zielhoehe fuer die neuen Gegner angepasst.");
				}
			}
		}

		private static void Aim(Transform movingTarget, ref Vector3 targetOffset)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			ChaosCreature chaosCreature = (((Object)(object)movingTarget != (Object)null) ? ((Component)movingTarget).GetComponent<ChaosCreature>() : null);
			if ((Object)(object)chaosCreature != (Object)null && ((NetworkBehaviour)chaosCreature).IsSpawned && (Object)(object)((EnemyAI)chaosCreature).eye != (Object)null)
			{
				targetOffset = ((EnemyAI)chaosCreature).eye.position - ((Component)chaosCreature).transform.position;
			}
		}
	}
	public enum ChaosKind : byte
	{
		Donnerhammer = 1,
		Korkenkanone,
		Kartoffel,
		Polterkiste,
		Zauberhut,
		Springfeder,
		Spukkompass,
		Wichtelsack,
		Blitzknipse,
		AlteMaske,
		Pupsgranate,
		Konfettikanone,
		DiscoKugel,
		Quietschei,
		Aktenkoffer,
		MiniFernseher
	}
	internal sealed class ChaosSpec
	{
		internal readonly ChaosKind Kind;

		internal readonly string Name;

		internal readonly string Description;

		internal readonly int Price;

		internal readonly int Damage;

		internal readonly float Cooldown;

		internal readonly float Windup;

		internal readonly float Reach;

		internal readonly float Stun;

		internal ChaosSpec(ChaosKind kind, string name, string description, int price, float cooldown, float windup, float reach, int damage, float stun)
		{
			Kind = kind;
			Name = name;
			Description = description;
			Price = price;
			Cooldown = cooldown;
			Windup = windup;
			Reach = reach;
			Damage = damage;
			Stun = stun;
		}
	}
	internal static class ChaosCatalog
	{
		internal static readonly ChaosSpec[] Ready = new ChaosSpec[15]
		{
			new ChaosSpec(ChaosKind.Donnerhammer, "Donnerhammer", "Ein schwerer Schlag. Lauter als vernuenftig.", 60, 1.8f, 0.38f, 2.7f, 2, 0.8f),
			new ChaosSpec(ChaosKind.Korkenkanone, "Korkenkanone", "Magische Korken, echter Rueckstoss.", 40, 1.4f, 0.12f, 30f, 1, 0.55f),
			new ChaosSpec(ChaosKind.Kartoffel, "Schreiende Kartoffel", "Aktivieren, ablegen, Abstand halten. Lockt Geraeuschjaeger an.", 12, 10f, 1.2f, 20f, 0, 0f),
			new ChaosSpec(ChaosKind.Polterkiste, "Polterkiste", "Oeffnen legt die Kiste ab. Daraus erwacht ein Kistenbeisser. Wird verbraucht.", 18, 6f, 1f, 0f, 0, 0f),
			new ChaosSpec(ChaosKind.Zauberhut, "Zauberhut", "Nach der Landung aktivieren: ablegen, Hoehlenkaninchen rufen. Wird verbraucht.", 22, 6f, 1f, 0f, 0, 0f),
			new ChaosSpec(ChaosKind.Spukkompass, "Spukkompass", "Sucht Beute oder einen Ausgang. Bei nahen Monstern wird die Nadel rot. Zeigt Richtung, keinen sicheren Weg.", 25, 2.5f, 0.2f, 60f, 0, 0f),
			new ChaosSpec(ChaosKind.Wichtelsack, "Wichtelsack", "Nach der Landung ablegen: Ein Schrottwichtel klaut losen Scrap ausserhalb des Schiffs. Bei einem Treffer laesst er ihn fallen. Wird verbraucht.", 20, 6f, 1f, 0f, 0, 0f),
			new ChaosSpec(ChaosKind.Blitzknipse, "Blitzknipse", "Ein kurzer Blitz betaeubt bis zu vier nahe Gegner vor dir. Funktioniert nur bei Gegnern, die sich betaeuben lassen.", 35, 8f, 0.18f, 7f, 0, 1.1f),
			new ChaosSpec(ChaosKind.AlteMaske, "Alte Maske", "Nach der Landung ablegen: Ruft den Maskenmann. Er bleibt stehen, solange ihn jemand ansieht. Wird verbraucht.", 25, 6f, 1f, 0f, 0, 0f),
			new ChaosSpec(ChaosKind.Pupsgranate, "Pupsgranate", "Nach Landung aktivieren: ablegen, 3 Sekunden Abstand gewinnen. 5 Sekunden Stinkwolke stoeren die Sicht und locken Geraeuschjaeger. Aufheben entschaerft. Wird verbraucht, kein Giftschaden.", 15, 8f, 0.15f, 3.2f, 0, 0f),
			new ChaosSpec(ChaosKind.Konfettikanone, "Konfettikanone", "Eine laute Konfettisalve trifft bis zu drei Gegner im engen Kegel. Eine Trefferstaerke, kurze Betaeubung. Waende schuetzen; keine Spielertreffer.", 45, 2f, 0.16f, 8f, 1, 0.4f),
			new ChaosSpec(ChaosKind.DiscoKugel, "Verfluchte Discokugel", "Nach Landung aktivieren: ablegen. 8 Sekunden Beat und langsam wanderndes Farblicht. Lockt Geraeuschjaeger an, statt vor Monstern zu schuetzen. Aufheben beendet die Party. Wiederverwendbar.", 30, 12f, 0.15f, 25f, 0, 0f),
			new ChaosSpec(ChaosKind.Quietschei, "Verfluchtes Quietschei", "Nach Landung aktivieren und ablegen: Ruft den Entenwaechter. Er verfolgt Laerm, warnt mit Quaken und greift nahe sichtbare Crew an. Ruhe beruhigt ihn. Wird verbraucht.", 20, 6f, 1f, 0f, 0, 0f),
			new ChaosSpec(ChaosKind.Aktenkoffer, "Verfluchter Aktenkoffer", "Nach Landung ablegen: Ruft den Zollwaechter. Er jagt sichtbare Scrap-Traeger. Lose Beute lenkt ihn zum Pruefen ab; leere Haende interessieren ihn nicht. Wird verbraucht.", 25, 6f, 1f, 0f, 0, 0f),
			new ChaosSpec(ChaosKind.MiniFernseher, "Flimmerfernseher", "Nach Landung ablegen: Ruft den Flimmerkasten. Ein echter getragener Taschenlampenstrahl treibt ihn zurueck. Im Dunkeln verfolgt er sichtbare Crew. Wird verbraucht.", 25, 6f, 1f, 0f, 0, 0f)
		};

		internal static ChaosSpec Get(ChaosKind kind)
		{
			ChaosSpec[] ready = Ready;
			foreach (ChaosSpec chaosSpec in ready)
			{
				if (chaosSpec.Kind == kind)
				{
					return chaosSpec;
				}
			}
			return null;
		}
	}
	internal sealed class ActionGate
	{
		private readonly Dictionary<ulong, int> sequences = new Dictionary<ulong, int>();

		private double next;

		internal bool Admit(bool server, bool owns, bool held, bool alive, bool busy, bool roundActive, ulong sender, int serial, double now, double cooldown)
		{
			if (!server || !owns || !held || !alive || busy || !roundActive || serial <= 0 || double.IsNaN(now) || double.IsInfinity(now))
			{
				return false;
			}
			if (sequences.TryGetValue(sender, out var value) && serial <= value)
			{
				return false;
			}
			if (now < next)
			{
				return false;
			}
			sequences[sender] = serial;
			cooldown = ((double.IsNaN(cooldown) || double.IsInfinity(cooldown)) ? 2.0 : Math.Max(0.25, Math.Min(30.0, cooldown)));
			next = now + cooldown;
			return true;
		}
	}
	internal static class ChaosCollision
	{
		internal static Vector3 Sweep(PhysicsScene scene, Vector3 root, float radius, float height, Vector3 movement, RaycastHit[] buffer, int mask, Func<Collider, bool> ignore)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: 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_0033: 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_0042: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			float magnitude = ((Vector3)(ref movement)).magnitude;
			if (magnitude < 1E-05f || float.IsNaN(magnitude) || float.IsInfinity(magnitude) || !((PhysicsScene)(ref scene)).IsValid())
			{
				return Vector3.zero;
			}
			Vector3 normal;
			Vector3 val = Cast(scene, root, radius, height, movement, buffer, mask, ignore, out normal);
			Vector3 normal2 = movement - val;
			if (((Vector3)(ref normal2)).sqrMagnitude < 1E-07f || ((Vector3)(ref normal)).sqrMagnitude < 0.5f)
			{
				return val;
			}
			Vector3 movement2 = Vector3.ProjectOnPlane(movement - val, normal);
			Vector3 val2 = Cast(scene, root + val, radius, height, movement2, buffer, mask, ignore, out normal2);
			return Vector3.ClampMagnitude(val + val2, magnitude);
		}

		private static Vector3 Cast(PhysicsScene scene, Vector3 root, float radius, float height, Vector3 movement, RaycastHit[] buffer, int mask, Func<Collider, bool> ignore, out Vector3 normal)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: 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_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			normal = Vector3.zero;
			float magnitude = ((Vector3)(ref movement)).magnitude;
			if (magnitude < 1E-05f)
			{
				return Vector3.zero;
			}
			Vector3 val = movement / magnitude;
			int num = ((PhysicsScene)(ref scene)).CapsuleCast(root + Vector3.up * radius, root + Vector3.up * (height - radius), radius, val, buffer, magnitude + 0.015f, mask, (QueryTriggerInteraction)1);
			float num2 = magnitude;
			for (int i = 0; i < num; i++)
			{
				RaycastHit val2 = buffer[i];
				if (!((Object)(object)((RaycastHit)(ref val2)).collider == (Object)null) && (ignore == null || !ignore(((RaycastHit)(ref val2)).collider)))
				{
					float num3 = 0.015f / Mathf.Max(0.05f, Mathf.Abs(Vector3.Dot(val, ((RaycastHit)(ref val2)).normal)));
					float num4 = Mathf.Max(0f, ((RaycastHit)(ref val2)).distance - num3);
					if (num4 < num2)
					{
						num2 = num4;
						normal = ((RaycastHit)(ref val2)).normal;
					}
				}
			}
			return val * num2;
		}
	}
	public sealed class ChaosCreature : EnemyAI
	{
		public CreatureKind Kind;

		internal GrabbableObject Loot;

		private readonly RaycastHit[] sweeps = (RaycastHit[])(object)new RaycastHit[24];

		private readonly Dictionary<long, float> hits = new Dictionary<long, float>();

		private readonly Dictionary<string, Transform> joints = new Dictionary<string, Transform>();

		private CreatureBrain brain;

		private CreaturePhase remotePhase;

		private CreaturePhase goblinPhase;

		private GrabbableObject lootTarget;

		private GrabbableObject ignoredLoot;

		private float nextLootSearch;

		private float nextGrabAttempt;

		private float carryUntil;

		private float restUntil;

		private float targetSince;

		private float ignoreUntil;

		private Vector3 fleeDestination;

		private Vector3 targetStart;

		private Func<Collider, bool> ignoreBody;

		private Transform visual;

		private Vector3 known;

		private Vector3 pose;

		private Vector3 lastPosition;

		private Vector3 dash;

		private Quaternion rotation;

		private float interestUntil;

		private float nextSense;

		private float nextPath;

		private float nextNav;

		private float nextSend;

		private float vertical;

		private float gait;

		private float phaseAt;

		private float nextGaze;

		private bool observed;

		private bool initialized;

		private bool enrolled;

		private bool havePose;

		public bool NaturalSpawn;

		private bool naturalBudgetCharged;

		private RoundManager naturalBudgetRound;

		private NovelEnemyPolicy novel;

		private float noiseUntil;

		private float reviewUntil;

		private float nextReviewSearch;

		private Vector3 noisePoint;

		private Vector3 retreat;

		private GrabbableObject reviewTarget;

		private readonly Dictionary<ulong, float> inspected = new Dictionary<ulong, float>();

		internal CreaturePhase Phase
		{
			get
			{
				if (!((NetworkBehaviour)this).IsServer)
				{
					return remotePhase;
				}
				if (Kind != CreatureKind.Schrottwichtel)
				{
					return LocalPhase;
				}
				return goblinPhase;
			}
		}

		private CreaturePhase LocalPhase
		{
			get
			{
				if (!Summons.Novel(Kind))
				{
					return brain.Phase;
				}
				return novel.Phase;
			}
		}

		internal Transform CarryAnchor
		{
			get
			{
				if (!joints.TryGetValue("carryAnchor", out var value))
				{
					return null;
				}
				return value;
			}
		}

		internal float DespawnAt { get; private set; }

		internal PlayerControllerB[] SensedPlayers { get; private set; } = Array.Empty<PlayerControllerB>();

		private float Radius => BodyRadius(Kind);

		private float Height => BodyHeight(Kind);

		private int WorldMask
		{
			get
			{
				if (!((Object)(object)StartOfRound.Instance != (Object)null))
				{
					return LayerMask.GetMask(new string[3] { "Default", "Room", "Colliders" });
				}
				return StartOfRound.Instance.collidersAndRoomMaskAndDefault;
			}
		}

		internal int SensePlayers(float width, int range, float proximity)
		{
			PlayerControllerB[] array = StartOfRound.Instance?.allPlayerScripts;
			if (array == null || (Object)(object)base.eye == (Object)null)
			{
				return 0;
			}
			if (SensedPlayers.Length != array.Length)
			{
				SensedPlayers = (PlayerControllerB[])(object)new PlayerControllerB[array.Length];
			}
			return ((EnemyAI)this).GetAllPlayersInLineOfSightNonAlloc(SensedPlayers, width, range, base.eye, proximity, WorldMask);
		}

		internal static float BodyRadius(CreatureKind kind)
		{
			return kind switch
			{
				CreatureKind.Maskenmann => 0.26f, 
				CreatureKind.Kistenbeisser => 0.31f, 
				CreatureKind.Flimmerkasten => 0.34f, 
				CreatureKind.Zollwaechter => 0.32f, 
				CreatureKind.Entenwaechter => 0.37f, 
				_ => 0.23f, 
			};
		}

		internal static float BodyHeight(CreatureKind kind)
		{
			return kind switch
			{
				CreatureKind.Maskenmann => 1.85f, 
				CreatureKind.Schrottwichtel => 1.05f, 
				CreatureKind.Kistenbeisser => 0.8f, 
				CreatureKind.Flimmerkasten => 1.35f, 
				CreatureKind.Zollwaechter => 1.7f, 
				CreatureKind.Entenwaechter => 0.86f, 
				_ => 0.7f, 
			};
		}

		public override void Awake()
		{
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)0;
			if ((Object)(object)RoundManager.Instance != (Object)null)
			{
				((EnemyAI)this).Awake();
			}
		}

		private void Initialize()
		{
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Expected O, but got Unknown
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
			if (!initialized)
			{
				initialized = true;
				brain = new CreatureBrain(Kind);
				novel = new NovelEnemyPolicy(Kind);
				ignoreBody = (Collider c) => (Object)(object)((Component)c).transform == (Object)(object)((Component)this).transform || ((Component)c).transform.IsChildOf(((Component)this).transform);
				base.thisNetworkObject = ((Component)this).GetComponent<NetworkObject>();
				if ((Object)(object)base.agent == (Object)null)
				{
					base.agent = ((Component)this).GetComponent<NavMeshAgent>();
				}
				((Behaviour)base.agent).enabled = false;
				base.agent.radius = Radius;
				base.agent.height = Height;
				base.agent.baseOffset = 0f;
				base.agent.acceleration = 20f;
				base.agent.angularSpeed = 440f;
				base.agent.stoppingDistance = ((Kind == CreatureKind.Schrottwichtel) ? 0.5f : 0.7f);
				base.agent.updatePosition = false;
				base.agent.updateRotation = false;
				base.path1 = new NavMeshPath();
				base.agentMask = -1;
				base.removedPowerLevel = true;
				if (NaturalSpawn)
				{
					base.isOutside = base.enemyType.isOutsideEnemy;
				}
				base.enemyBehaviourStates = (EnemyBehaviourState[])(((object)base.enemyBehaviourStates) ?? ((object)new EnemyBehaviourState[0]));
				base.ventAnimationFinished = true;
				base.exitVentAnimationTime = 0f;
				base.stunNormalizedTimer = -1f;
				base.postStunInvincibilityTimer = -1f;
				base.currentOwnershipOnThisClient = ((!((NetworkBehaviour)this).IsServer) ? (-1) : 0);
				base.movingTowardsTargetPlayer = false;
				base.moveTowardsDestination = false;
				visual = ((Component)this).transform.Find("CreatureVisual");
				if ((Object)(object)visual == (Object)null)
				{
					visual = ChaosVisuals.Creature(Kind, ((Component)this).transform).transform;
				}
				Transform[] componentsInChildren = ((Component)visual).GetComponentsInChildren<Transform>(true);
				foreach (Transform val in componentsInChildren)
				{
					joints[((Object)val).name] = val;
				}
				base.eye = (joints.TryGetValue("eye", out var value) ? value : ((Component)this).transform);
				base.meshRenderers = ((Component)this).GetComponentsInChildren<MeshRenderer>(true);
				base.skinnedMeshRenderers = ((Component)this).GetComponentsInChildren<SkinnedMeshRenderer>(true);
				if ((Object)(object)base.creatureVoice == (Object)null)
				{
					base.creatureVoice = ((Component)this).gameObject.AddComponent<AudioSource>();
				}
				base.creatureVoice.playOnAwake = false;
				base.creatureVoice.spatialBlend = 1f;
				base.creatureVoice.minDistance = 1f;
				base.creatureVoice.maxDistance = 24f;
				base.creatureSFX = base.creatureVoice;
				pose = (lastPosition = ((Component)this).transform.position);
				rotation = ((Component)this).transform.rotation;
			}
		}

		private void Enroll()
		{
			RoundManager instance = RoundManager.Instance;
			if (!enrolled && !((Object)(object)instance == (Object)null) && ((NetworkBehaviour)this).IsSpawned)
			{
				if (!instance.SpawnedEnemies.Contains((EnemyAI)(object)this))
				{
					instance.SpawnedEnemies.Add((EnemyAI)(object)this);
				}
				int numberOfEnemiesInScene = instance.numberOfEnemiesInScene;
				instance.numberOfEnemiesInScene = numberOfEnemiesInScene + 1;
				base.thisEnemyIndex = numberOfEnemiesInScene;
				enrolled = true;
			}
		}

		private void Unenroll()
		{
			RoundManager.Instance?.SpawnedEnemies?.Remove((EnemyAI)(object)this);
			enrolled = false;
		}

		public override void Start()
		{
			Initialize();
			Enroll();
		}

		public override void OnNetworkSpawn()
		{
			((NetworkBehaviour)this).OnNetworkSpawn();
			Initialize();
			AdoptNaturalSpawn();
			if (!NaturalSpawn || !((NetworkBehaviour)this).IsServer)
			{
				Enroll();
			}
			ChaosNet.Register(this);
			if (((NetworkBehaviour)this).IsServer)
			{
				ChaosNet.CreatureChanged(this, reliable: true);
			}
		}

		public override void OnNetworkDespawn()
		{
			ReleaseNaturalBudget();
			EmergencyDrop();
			Unenroll();
			if ((Object)(object)base.agent != (Object)null)
			{
				((Behaviour)base.agent).enabled = false;
			}
			ChaosNet.Unregister(this);
			((NetworkBehaviour)this).OnNetworkDespawn();
		}

		public override void OnDestroy()
		{
			ReleaseNaturalBudget();
			EmergencyDrop();
			Unenroll();
			base.removedPowerLevel = true;
			base.inSpecialAnimationWithPlayer = null;
			try
			{
				((EnemyAI)this).OnDestroy();
			}
			catch (NullReferenceException) when ((Object)(object)RoundManager.Instance == (Object)null)
			{
			}
		}

		public override void Update()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: 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_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			Initialize();
			if (((NetworkBehaviour)this).IsSpawned)
			{
				Enroll();
				float num = Mathf.Clamp(Time.deltaTime, 0f, 0.08f);
				base.timeSinceSpawn += num;
				Collider val = StartOfRound.Instance?.shipBounds;
				if ((Object)(object)val != (Object)null)
				{
					Bounds bounds = val.bounds;
					base.isInsidePlayerShip = ((Bounds)(ref bounds)).Contains(((Component)this).transform.position);
				}
				if (base.stunNormalizedTimer > -1f)
				{
					base.stunNormalizedTimer -= num;
				}
				if (base.postStunInvincibilityTimer > -1f)
				{
					base.postStunInvincibilityTimer -= num;
				}
				if (((NetworkBehaviour)this).IsServer)
				{
					HostTick(num);
				}
				else if (havePose)
				{
					float num2 = 1f - Mathf.Exp((0f - num) * 18f);
					((Component)this).transform.position = Vector3.Lerp(((Component)this).transform.position, pose, num2);
					((Component)this).transform.rotation = Quaternion.Slerp(((Component)this).transform.rotation, rotation, num2);
				}
				ChaosNet.ResolveCarry(this);
				Animate(num);
			}
		}

		private void HostTick(float dt)
		{
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_030b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0316: Unknown result type (might be due to invalid IL or missing references)
			//IL_031b: 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_03f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0406: Unknown result type (might be due to invalid IL or missing references)
			//IL_035b: Unknown result type (might be due to invalid IL or missing references)
			//IL_034e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0360: Unknown result type (might be due to invalid IL or missing references)
			StartOfRound instance = StartOfRound.Instance;
			if ((Object)(object)instance == (Object)null || (Object)(object)RoundManager.Instance == (Object)null || instance.shipIsLeaving || instance.firingPlayersCutsceneRunning)
			{
				return;
			}
			if (base.isEnemyDead)
			{
				Gravity(dt);
				if (DespawnAt > 0f && Time.time >= DespawnAt)
				{
					((NetworkBehaviour)this).NetworkObject.Despawn(true);
				}
				return;
			}
			if (Summons.Novel(Kind))
			{
				NovelTick(dt);
				return;
			}
			if (Kind == CreatureKind.Schrottwichtel)
			{
				GoblinTick(dt);
				if (Time.time >= nextSend)
				{
					nextSend = Time.time + 0.1f;
					ChaosNet.CreatureChanged(this, reliable: false);
				}
				return;
			}
			CreaturePhase phase = brain.Phase;
			if (base.stunNormalizedTimer > 0f || base.stunnedIndefinitely > 0)
			{
				brain.Interrupt(Time.time);
				Stop();
				Gravity(dt);
			}
			else
			{
				if (Time.time >= nextSense)
				{
					nextSense = Time.time + 0.2f;
					base.targetPlayer = null;
					float num = float.PositiveInfinity;
					int num2 = SensePlayers(110f, 18, 1.2f);
					for (int i = 0; i < num2; i++)
					{
						PlayerControllerB val = SensedPlayers[i];
						if (!((Object)(object)val == (Object)null) && val.isPlayerControlled && !val.isPlayerDead)
						{
							float num3 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
							if (num3 < num)
							{
								num = num3;
								base.targetPlayer = val;
							}
						}
					}
					if ((Object)(object)base.targetPlayer != (Object)null)
					{
						known = ((Component)base.targetPlayer).transform.position;
						if (Kind == CreatureKind.Kistenbeisser || num <= 4f || brain.Phase != CreaturePhase.Idle)
						{
							interestUntil = Time.time + 3f;
						}
					}
				}
				bool visible = (Object)(object)base.targetPlayer != (Object)null && !base.targetPlayer.isPlayerDead;
				if (Kind == CreatureKind.Maskenmann && Time.time >= nextGaze)
				{
					nextGaze = Time.time + 0.08f;
					observed = Watched();
				}
				brain.Tick(Time.time, visible, Vector3.Distance(((Component)this).transform.position, known), Time.time < interestUntil, observed);
				if (brain.Phase != phase)
				{
					phaseAt = Time.time;
					if (brain.Phase == CreaturePhase.Warning)
					{
						Stop();
						Face(known - ((Component)this).transform.position, 1f);
					}
					if (brain.Phase == CreaturePhase.Frozen)
					{
						Stop();
						vertical = Mathf.Min(vertical, 0f);
					}
					if (brain.Phase == CreaturePhase.Lunging)
					{
						dash = known - ((Component)this).transform.position;
						dash.y = 0f;
						dash = ((((Vector3)(ref dash)).sqrMagnitude > 0.001f) ? ((Vector3)(ref dash)).normalized : ((Component)this).transform.forward);
						vertical = ((Kind == CreatureKind.Hoehlenkaninchen) ? 3.8f : ((Kind == CreatureKind.Maskenmann) ? 0f : 1.8f));
						Stop();
					}
					ChaosNet.CreatureChanged(this, reliable: true);
				}
				if (brain.Phase == CreaturePhase.Hunting)
				{
					Walk(known, dt);
				}
				else if (brain.Phase == CreaturePhase.Lunging)
				{
					Move(dash * ((Kind == CreatureKind.Hoehlenkaninchen) ? 7f : ((Kind == CreatureKind.Maskenmann) ? 4.5f : 5.5f)) * dt);
					Face(dash, dt);
					TryContact();
				}
				else
				{
					Stop();
				}
				Gravity(dt);
			}
			if (Time.time >= nextSend)
			{
				nextSend = Time.time + 0.1f;
				ChaosNet.CreatureChanged(this, reliable: false);
			}
		}

		private bool Watched()
		{
			return WatchedBy(StartOfRound.Instance?.allPlayerScripts);
		}

		internal bool WatchedBy(PlayerControllerB[] players)
		{
			//IL_0062: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			if (players == null)
			{
				return false;
			}
			foreach (PlayerControllerB val in players)
			{
				if (!((Object)(object)val == (Object)null) && val.isPlayerControlled && !val.isPlayerDead && val.isInsideFactory != base.isOutside && !((Object)(object)val.gameplayCamera == (Object)null))
				{
					Transform transform = ((Component)val.gameplayCamera).transform;
					if (CombatSight.Visible(Physics.defaultPhysicsScene, transform.position, transform.forward, base.eye.position, 20f, 0.6f, WorldMask) || CombatSight.Visible(Physics.defaultPhysicsScene, transform.position, transform.forward, ((Component)this).transform.position + Vector3.up * 1.05f, 20f, 0.6f, WorldMask))
					{
						return true;
					}
				}
			}
			return false;
		}

		private void GoblinTick(float dt)
		{
			//IL_036c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0371: Unknown result type (might be due to invalid IL or missing references)
			//IL_033e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0349: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_03de: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			//IL_0269: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a6: 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_028f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
			CreaturePhase creaturePhase = goblinPhase;
			if (base.stunNormalizedTimer > 0f || base.stunnedIndefinitely > 0 || Time.time < restUntil)
			{
				if ((Object)(object)Loot != (Object)null)
				{
					ReleaseLoot();
				}
				goblinPhase = CreaturePhase.Recovering;
				Stop();
				Gravity(dt);
			}
			else if ((Object)(object)Loot != (Object)null)
			{
				if (!((NetworkBehaviour)Loot).IsSpawned || EnemyLoot.PlayerHolding(Loot) || (Object)(object)Loot.parentObject != (Object)(object)CarryAnchor)
				{
					ChaosNet.ReleaseLoot(this, forget: true);
					restUntil = Time.time + 2f;
					goblinPhase = CreaturePhase.Idle;
					Stop();
				}
				else if (Time.time >= carryUntil)
				{
					ReleaseLoot();
					restUntil = Time.time + 3f;
					goblinPhase = CreaturePhase.Idle;
					Stop();
				}
				else
				{
					goblinPhase = CreaturePhase.Fleeing;
					if (Time.time >= nextSense)
					{
						nextSense = Time.time + 1f;
						PlayerControllerB val = null;
						float num = 8f;
						int num2 = SensePlayers(180f, 10, 8f);
						for (int i = 0; i < num2; i++)
						{
							PlayerControllerB val2 = SensedPlayers[i];
							if (!((Object)(object)val2 == (Object)null) && val2.isPlayerControlled && !val2.isPlayerDead && val2.isInsideFactory != base.isOutside)
							{
								float num3 = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position);
								if (num3 < num && !Physics.Linecast(base.eye.position, ((Component)val2).transform.position + Vector3.up * 0.5f, WorldMask, (QueryTriggerInteraction)1))
								{
									val = val2;
									num = num3;
								}
							}
						}
						Vector3 val3 = (((Object)(object)val != (Object)null) ? (((Component)this).transform.position - ((Component)val).transform.position) : ((Component)this).transform.forward);
						val3.y = 0f;
						if (((Vector3)(ref val3)).sqrMagnitude < 0.01f)
						{
							val3 = ((Component)this).transform.forward;
						}
						Vector3 val4 = ((Component)this).transform.position + ((Vector3)(ref val3)).normalized * 5f;
						NavMeshHit val5 = default(NavMeshHit);
						fleeDestination = ((NavMesh.SamplePosition(val4, ref val5, 2f, -1) && Mathf.Abs(((NavMeshHit)(ref val5)).position.y - ((Component)this).transform.position.y) < 1f) ? ((NavMeshHit)(ref val5)).position : val4);
					}
					Walk(fleeDestination, dt);
					Gravity(dt);
				}
			}
			else
			{
				if (Time.time >= nextLootSearch)
				{
					nextLootSearch = Time.time + 0.8f;
					lootTarget = (from g in Object.FindObjectsOfType<GrabbableObject>()
						where (Object)(object)g != (Object)null && ((NetworkBehaviour)g).IsSpawned && EnemyLoot.Loose(g) && !g.isInShipRoom && !g.isInElevator && g.isInFactory != base.isOutside && ((Object)(object)g != (Object)(object)ignoredLoot || Time.time >= ignoreUntil) && Vector3.Distance(((Component)this).transform.position, ((Component)g).transform.position) < 18f
						orderby Vector3.Distance(((Component)this).transform.position, ((Component)g).transform.position)
						select g).FirstOrDefault();
					if ((Object)(object)lootTarget != (Object)null && (targetSince <= 0f || Vector3.Distance(targetStart, ((Component)this).transform.position) > 0.5f))
					{
						targetSince = Time.time;
						targetStart = ((Component)this).transform.position;
					}
				}
				if ((Object)(object)lootTarget != (Object)null && EnemyLoot.Loose(lootTarget) && ((NetworkBehaviour)lootTarget).IsSpawned)
				{
					goblinPhase = CreaturePhase.Hunting;
					Walk(((Component)lootTarget).transform.position, dt);
					bool flag = false;
					if (Vector3.Distance(((Component)this).transform.position, ((Component)lootTarget).transform.position) <= 0.9f && Time.time >= nextGrabAttempt)
					{
						nextGrabAttempt = Time.time + 0.8f;
						flag = ChaosNet.TakeLoot(this, lootTarget);
					}
					if (flag)
					{
						carryUntil = Time.time + 10f;
						nextSense = 0f;
						lootTarget = null;
						goblinPhase = CreaturePhase.Fleeing;
					}
					else if (Time.time - targetSince > 6f)
					{
						ignoredLoot = lootTarget;
						ignoreUntil = Time.time + 12f;
						lootTarget = null;
						targetSince = 0f;
						Stop();
					}
				}
				else
				{
					goblinPhase = CreaturePhase.Idle;
					Stop();
				}
				Gravity(dt);
			}
			if (creaturePhase != goblinPhase)
			{
				phaseAt = Time.time;
				ChaosNet.CreatureChanged(this, reliable: true);
			}
		}

		internal void ReleaseLoot()
		{
			if (!((Object)(object)Loot == (Object)null))
			{
				ignoredLoot = Loot;
				ignoreUntil = Time.time + 12f;
				ChaosNet.ReleaseLoot(this, forget: false);
				lootTarget = null;
				targetSince = 0f;
			}
		}

		internal void EmergencyDrop()
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)Loot == (Object)null))
			{
				if ((Object)(object)Loot.parentObject == (Object)(object)CarryAnchor && !EnemyLoot.PlayerHolding(Loot))
				{
					EnemyLoot.Drop(Loot, CarryAnchor, ((Component)Loot).transform.position, DropFloor(Loot), base.isOutside);
				}
				Loot = null;
			}
		}

		internal Vector3 DropFloor(GrabbableObject item)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: 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_0082: 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_00ac: Unknown result type (might be due to invalid IL or missing references)
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast((((Object)(object)CarryAnchor != (Object)null) ? CarryAnchor.position : (((Component)this).transform.position + Vector3.up * 0.6f)) + Vector3.up * 0.2f, Vector3.down, ref val, 3f, WorldMask, (QueryTriggerInteraction)1) && ((RaycastHit)(ref val)).normal.y > 0.45f)
			{
				return ((RaycastHit)(ref val)).point + Vector3.up * Mathf.Max(0.02f, item.itemProperties?.verticalOffset ?? 0.04f);
			}
			return ((Component)this).transform.position + Vector3.up * 0.1f;
		}

		private void TryContact()
		{
			if ((Summons.Novel(Kind) ? novel.Bitten : brain.Bitten) || StartOfRound.Instance?.allPlayerScripts == null)
			{
				return;
			}
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if (!((Object)(object)val == (Object)null) && val.isPlayerControlled && !val.isPlayerDead && val.isInsideFactory != base.isOutside && Touching(val) && (Kind != CreatureKind.Zollwaechter || CarriesScrap(val, Object.FindObjectsOfType<GrabbableObject>())))
				{
					if (Summons.Novel(Kind) ? novel.TryBite() : brain.TryBite())
					{
						ChaosNet.Bite(this, val, (Kind == CreatureKind.Entenwaechter) ? 6 : ((Kind == CreatureKind.Zollwaechter) ? 7 : ((Kind == CreatureKind.Flimmerkasten) ? 5 : ((Kind == CreatureKind.Hoehlenkaninchen) ? 5 : 8))));
					}
					break;
				}
			}
		}

		internal bool Touching(PlayerControllerB player)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)player == (Object)null || player.isPlayerDead)
			{
				return false;
			}
			Vector3 val = ((Component)player).transform.position - ((Component)this).transform.position;
			if (Mathf.Abs(val.y) > 1.1f)
			{
				return false;
			}
			val.y = 0f;
			if (((Vector3)(ref val)).magnitude <= ((Kind == CreatureKind.Hoehlenkaninchen) ? 0.85f : 1.05f))
			{
				return !Physics.Linecast(((Component)this).transform.position + Vector3.up * 0.4f, ((Component)player).transform.position + Vector3.up * 0.5f, WorldMask, (QueryTriggerInteraction)1);
			}
			return false;
		}

		public override void DetectNoise(Vector3 noisePosition, float noiseLoudness, int timesPlayedInOneSpot = 0, int noiseID = 0)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: 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_007f: Unknown result type (might be due to invalid IL or missing references)
			if (((NetworkBehaviour)this).IsServer && ((NetworkBehaviour)this).IsSpawned && !base.isEnemyDead && !(noiseLoudness < 0.15f) && !(Vector3.Distance(((Component)this).transform.position, noisePosition) > Mathf.Min(24f, noiseLoudness * 20f)) && (!Summons.Novel(Kind) || Kind == CreatureKind.Entenwaechter))
			{
				known = noisePosition;
				interestUntil = Time.time + 3f;
				if (Kind == CreatureKind.Entenwaechter)
				{
					noisePoint = noisePosition;
					noiseUntil = Time.time + 4f;
				}
			}
		}

		private void Stop()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			if (((Behaviour)base.agent).enabled && base.agent.isOnNavMesh)
			{
				base.agent.isStopped = true;
				base.agent.nextPosition = ((Component)this).transform.position;
			}
		}

		private void EnsureNav()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: 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)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			if (((Behaviour)base.agent).enabled && base.agent.isOnNavMesh)
			{
				return;
			}
			if (((Behaviour)base.agent).enabled)
			{
				((Behaviour)base.agent).enabled = false;
			}
			if (Time.time < nextNav)
			{
				return;
			}
			nextNav = Time.time + 1f;
			NavMeshQueryFilter val = default(NavMeshQueryFilter);
			((NavMeshQueryFilter)(ref val)).agentTypeID = base.agent.agentTypeID;
			((NavMeshQueryFilter)(ref val)).areaMask = base.agent.areaMask;
			NavMeshQueryFilter val2 = val;
			NavMeshHit val3 = default(NavMeshHit);
			if (!NavMesh.SamplePosition(((Component)this).transform.position, ref val3, 0.35f, val2) || Physics.Linecast(((Component)this).transform.position + Vector3.up * 0.4f, ((NavMeshHit)(ref val3)).position + Vector3.up * 0.4f, WorldMask, (QueryTriggerInteraction)1))
			{
				return;
			}
			Vector3 movement = ((NavMeshHit)(ref val3)).position - ((Component)this).transform.position;
			if (!(((Vector3)(ref movement)).magnitude > 0.35f))
			{
				Move(movement);
				Vector3 position = ((Component)this).transform.position;
				((Behaviour)base.agent).enabled = true;
				if (!base.agent.isOnNavMesh)
				{
					((Behaviour)base.agent).enabled = false;
					((Component)this).transform.position = position;
				}
				else
				{
					base.agent.Warp(position);
					((Component)this).transform.position = position;
					base.agent.nextPosition = position;
				}
			}
		}

		internal void Walk(Vector3 destination, float dt)
		{
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: 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_0271: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0282: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: 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_0297: Unknown result type (might be due to invalid IL or missing references)
			//IL_029c: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: 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)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			EnsureNav();
			float num = ((Kind == CreatureKind.Entenwaechter) ? 3f : ((Kind == CreatureKind.Zollwaechter) ? 2.2f : ((Kind != CreatureKind.Flimmerkasten) ? ((Kind == CreatureKind.Kistenbeisser) ? 2.6f : ((Kind != CreatureKind.Schrottwichtel) ? ((Kind == CreatureKind.Maskenmann) ? 2.2f : 3.5f) : (((Object)(object)Loot != (Object)null) ? 3.8f : 2.8f))) : ((LocalPhase == CreaturePhase.Fleeing) ? 4.1f : 3.1f))));
			if (((Behaviour)base.agent).enabled && base.agent.isOnNavMesh)
			{
				base.agent.isStopped = false;
				base.agent.speed = num;
				if (Time.time >= nextPath)
				{
					nextPath = Time.time + 0.25f;
					NavMeshHit val = default(NavMeshHit);
					if (NavMesh.SamplePosition(destination, ref val, 1f, base.agent.areaMask))
					{
						base.agent.SetDestination(((NavMeshHit)(ref val)).position);
					}
					else
					{
						base.agent.isStopped = true;
					}
				}
				if (!base.agent.isStopped && !base.agent.pathPending)
				{
					Vector3 val2 = Vector3.ClampMagnitude(base.agent.desiredVelocity * dt, num * dt);
					NavMeshHit val3 = default(NavMeshHit);
					if (NavMesh.SamplePosition(((Component)this).transform.position + val2, ref val3, 0.25f, base.agent.areaMask))
					{
						Vector3 val4 = ((NavMeshHit)(ref val3)).position - ((Component)this).transform.position - val2;
						val4.y = 0f;
						if (((Vector3)(ref val4)).sqrMagnitude < 0.01f)
						{
							val2.y = Mathf.Clamp(((NavMeshHit)(ref val3)).position.y - ((Component)this).transform.position.y, (0f - num) * dt, num * dt);
						}
					}
					Move(val2);
					Face(val2, dt);
				}
				base.agent.nextPosition = ((Component)this).transform.position;
				return;
			}
			float num2 = ((Kind == CreatureKind.Schrottwichtel) ? 0.5f : 0.8f);
			Vector3 val5 = destination - ((Component)this).transform.position;
			val5.y = 0f;
			if (!(((Vector3)(ref val5)).magnitude < num2))
			{
				Vector3 val6 = ((Vector3)(ref val5)).normalized * Mathf.Min(num * dt, ((Vector3)(ref val5)).magnitude - num2);
				RaycastHit val7 = default(RaycastHit);
				if (Physics.Raycast(((Component)this).transform.position + val6 + Vector3.up * 0.5f, Vector3.down, ref val7, 1f, WorldMask, (QueryTriggerInteraction)1) && ((RaycastHit)(ref val7)).normal.y > 0.6f && Mathf.Abs(((RaycastHit)(ref val7)).point.y - ((Component)this).transform.position.y) < 0.3f)
				{
					Move(val6);
					Face(val6, dt);
				}
			}
		}

		private void Move(Vector3 movement)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			Transform transform = ((Component)this).transform;
			transform.position += ChaosCollision.Sweep(Physics.defaultPhysicsScene, ((Component)this).transform.position, Radius, Height, movement, sweeps, WorldMask, ignoreBody);
		}

		internal void Gravity(float dt)
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			if (!(vertical <= 0f) || !((Behaviour)base.agent).enabled || !base.agent.isOnNavMesh || LocalPhase == CreaturePhase.Lunging)
			{
				if (LocalPhase == CreaturePhase.Lunging && ((Behaviour)base.agent).enabled)
				{
					((Behaviour)base.agent).enabled = false;
				}
				vertical = Mathf.Max(-18f, vertical - 18f * dt);
				Move(Vector3.up * (vertical * dt));
			}
		}

		private void Face(Vector3 direction, float dt)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			direction.y = 0f;
			if (((Vector3)(ref direction)).sqrMagnitude > 0.0001f)
			{
				((Component)this).transform.rotation = Quaternion.Slerp(((Component)this).transform.rotation, Quaternion.LookRotation(direction), 1f - Mathf.Exp((0f - dt) * 12f));
			}
		}

		internal void Apply(ChaosPacket p)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: 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_0066: 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_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			Initialize();
			if (((NetworkBehaviour)this).IsServer)
			{
				return;
			}
			CreaturePhase creaturePhase = (CreaturePhase)Mathf.Clamp(p.Code, 0, 7);
			if (creaturePhase != remotePhase)
			{
				remotePhase = creaturePhase;
				phaseAt = Time.time;
				if (creaturePhase == CreaturePhase.Warning)
				{
					ChaosPresentation.Sound(WarningCue(Kind), p.Position);
				}
			}
			pose = p.Position;
			rotation = p.Rotation;
			base.enemyHP = Mathf.Clamp(p.Amount, 0, 100);
			base.isEnemyDead = creaturePhase == CreaturePhase.Dead;
			base.isOutside = p.Target == 1;
			if (!havePose)
			{
				havePose = true;
				((Component)this).transform.SetPositionAndRotation(pose, rotation);
			}
			base.serverPosition = pose;
		}

		private void Animate(float dt)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: 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_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: 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_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: 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_02dd: Unknown result type (might be due to invalid IL or missing references)
			float num = ((dt > 0.0001f) ? (Vector3.Distance(((Component)this).transform.position, lastPosition) / dt) : 0f);
			lastPosition = ((Component)this).transform.position;
			gait += dt * (4f + Mathf.Min(num, 5f) * 4f);
			float num2 = Mathf.Clamp01(num / 2f);
			float num3 = Mathf.Sin(gait);
			float num4 = ((Phase == CreaturePhase.Warning) ? 35 : ((Phase == CreaturePhase.Lunging) ? 65 : 8));
			if (Phase == CreaturePhase.Dead)
			{
				visual.localRotation = Quaternion.Euler(0f, 0f, 80f);
				visual.localPosition = Vector3.up * ((Kind == CreatureKind.Kistenbeisser) ? 0.33f : 0.26f);
				return;
			}
			visual.localPosition = Vector3.up * Mathf.Abs(num3) * 0.025f * num2;
			if (joints.TryGetValue("lid", out var value))
			{
				value.localRotation = Quaternion.Euler(0f - num4, 0f, 0f);
			}
			if (joints.TryGetValue("head", out var value2))
			{
				value2.localRotation = ((Phase == CreaturePhase.Frozen) ? Quaternion.identity : Quaternion.Euler((float)((Phase == CreaturePhase.Warning) ? 12 : 0), Mathf.Sin(Time.time * 1.3f) * 5f, 0f));
			}
			for (int i = 0; i < 2; i++)
			{
				if (joints.TryGetValue((i == 0) ? "leftLeg" : "rightLeg", out var value3))
				{
					value3.localRotation = Quaternion.Euler(num3 * (float)((i == 0) ? 28 : (-28)) * num2, 0f, 0f);
				}
				if (joints.TryGetValue((i == 0) ? "backLeftLeg" : "backRightLeg", out var value4))
				{
					value4.localRotation = Quaternion.Euler(num3 * (float)((i == 0) ? (-28) : 28) * num2, 0f, 0f);
				}
				if (joints.TryGetValue((i == 0) ? "leftEar" : "rightEar", out var value5))
				{
					value5.localRotation = Quaternion.Euler((Phase == CreaturePhase.Warning) ? (-35f) : (Mathf.Sin(Time.time * 2f + (float)i) * 8f), 0f, (float)((i == 0) ? (-12) : 12));
				}
				if (joints.TryGetValue((i == 0) ? "leftArm" : "rightArm", out var value6))
				{
					value6.localRotation = Quaternion.Euler(((Object)(object)Loot != (Object)null) ? (-55f) : (num3 * (float)((i == 0) ? (-22) : 22) * num2), 0f, 0f);
				}
			}
			AnimateNovel();
		}

		public override void HitEnemy(int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
		{
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			Initialize();
			if (!((NetworkBehaviour)this).IsServer || base.isEnemyDead || force <= 0)
			{
				return;
			}
			long key = ((long)(((Object)(object)playerWhoHit != (Object)null) ? ((int)playerWhoHit.playerClientId) : (-1)) << 32) ^ (uint)hitID;
			float now = Time.realtimeSinceStartup;
			if (hits.TryGetValue(key, out var value) && now - value < 0.15f)
			{
				return;
			}
			if (hits.Count >= 64)
			{
				long[] array = (from h in hits
					where now - h.Value >= 0.15f
					select h.Key).ToArray();
				foreach (long key2 in array)
				{
					hits.Remove(key2);
				}
			}
			hits[key] = now;
			if (Kind == CreatureKind.Schrottwichtel)
			{
				ReleaseLoot();
				restUntil = Time.time + 0.9f;
				goblinPhase = CreaturePhase.Recovering;
			}
			base.enemyHP = Math.Max(0, base.enemyHP - Mathf.Clamp(force, 1, 100));
			if (base.enemyHP <= 0)
			{
				((EnemyAI)this).KillEnemy(false);
				return;
			}
			brain.Interrupt(Time.time);
			novel.Interrupt(Time.time);
			reviewUntil = 0f;
			if (Kind == CreatureKind.Entenwaechter && (Object)(object)playerWhoHit != (Object)null)
			{
				noisePoint = ((Component)playerWhoHit).transform.position;
				noiseUntil = Time.time + 4f;
			}
			ChaosNet.CreatureChanged(this, reliable: true);
		}

		public override void KillEnemy(bool destroy = false)
		{
			Initialize();
			if (((NetworkBehaviour)this).IsServer && !base.isEnemyDead)
			{
				ReleaseNaturalBudget();
				ReleaseLoot();
				base.enemyHP = 0;
				base.isEnemyDead = true;
				brain.Kill();
				novel.Kill();
				goblinPhase = CreaturePhase.Dead;
				Stop();
				if (((Behaviour)base.agent).enabled)
				{
					((Behaviour)base.agent).enabled = false;
				}
				vertical = 0f;
				DespawnAt = Time.time + 4f;
				ChaosNet.CreatureChanged(this, reliable: true);
			}
		}

		private void AdoptNaturalSpawn()
		{
			if (NaturalSpawn)
			{
				base.isOutside = base.enemyType.isOutsideEnemy;
				naturalBudgetCharged = ((NetworkBehaviour)this).IsServer && (Object)(object)RoundManager.Instance != (Object)null;
				if (naturalBudgetCharged)
				{
					naturalBudgetRound = RoundManager.Instance;
				}
			}
		}

		private void ReleaseNaturalBudget()
		{
			if (naturalBudgetCharged)
			{
				naturalBudgetCharged = false;
				NaturalSpawns.Refund(naturalBudgetRound, base.enemyType);
				naturalBudgetRound = null;
			}
		}

		internal static int WarningCue(CreatureKind kind)
		{
			return kind switch
			{
				CreatureKind.Maskenmann => 7, 
				CreatureKind.Kistenbeisser => 4, 
				CreatureKind.Flimmerkasten => 13, 
				CreatureKind.Zollwaechter => 12, 
				CreatureKind.Entenwaechter => 11, 
				_ => 5, 
			};
		}

		internal static bool CarriesScrap(PlayerControllerB player, GrabbableObject[] world = null)
		{
			if ((Object)(object)player == (Object)null)
			{
				return false;
			}
			if (!Scrap(player.currentlyHeldObjectServer) && (player.ItemSlots == null || !player.ItemSlots.Any(Scrap)))
			{
				return world?.Any((GrabbableObject item) => Scrap(item) && (Object)(object)item.playerHeldBy == (Object)(object)player && (item.isHeld || item.isPocketed)) ?? false;
			}
			return true;
			static bool Scrap(GrabbableObject item)
			{
				if ((Object)(object)item != (Object)null && (Object)(object)item.itemProperties != (Object)null)
				{
					return item.itemProperties.isScrap;
				}
				return false;
			}
		}

		private void NovelTick(float dt)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0250: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			//IL_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: 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_03de: Unknown result type (might be due to invalid IL or missing references)
			//IL_030a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0315: Unknown result type (might be due to invalid IL or missing references)
			//IL_031a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: 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_03fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_033c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0347: Unknown result type (might be due to invalid IL or missing references)
			//IL_034c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0351: Unknown result type (might be due to invalid IL or missing references)
			//IL_0418: Unknown result type (might be due to invalid IL or missing references)
			//IL_038c: Unknown result type (might be due to invalid IL or missing references)
			//IL_037f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0391: Unknown result type (might be due to invalid IL or missing references)
			//IL_0432: Unknown result type (might be due to invalid IL or missing references)
			//IL_0438: Unknown result type (might be due to invalid IL or missing references)
			//IL_0444: Unknown result type (might be due to invalid IL or missing references)
			CreaturePhase phase = novel.Phase;
			bool flag = false;
			Vector3 source = Vector3.zero;
			if (Time.time >= nextSense)
			{
				nextSense = Time.time + 0.2f;
				base.targetPlayer = null;
				float num = float.PositiveInfinity;
				GrabbableObject[] array = ((Kind == CreatureKind.Zollwaechter) ? Object.FindObjectsOfType<GrabbableObject>() : null);
				int num2 = SensePlayers(150f, 18, 1.2f);
				for (int i = 0; i < num2; i++)
				{
					PlayerControllerB val = SensedPlayers[i];
					if (!((Object)(object)val == (Object)null) && val.isPlayerControlled && !val.isPlayerDead && (Kind != CreatureKind.Zollwaechter || CarriesScrap(val, array)) && (Kind != CreatureKind.Entenwaechter || (!(Time.time >= noiseUntil) && !(Vector3.Distance(((Component)val).transform.position, noisePoint) > 4f))))
					{
						float num3 = Vector3.Distance(((Component)val).transform.position, ((Component)this).transform.position);
						if (num3 < num)
						{
							num = num3;
							base.targetPlayer = val;
						}
					}
				}
				if ((Object)(object)base.targetPlayer != (Object)null)
				{
					known = ((Component)base.targetPlayer).transform.position;
				}
				else if (Kind == CreatureKind.Entenwaechter)
				{
					known = noisePoint;
				}
				if (Kind == CreatureKind.Zollwaechter)
				{
					FindReview(array);
				}
			}
			if (Kind == CreatureKind.Flimmerkasten)
			{
				flag = LitBy(StartOfRound.Instance?.allPlayerScripts, out source);
			}
			bool distracted = Kind == CreatureKind.Zollwaechter && (Object)(object)reviewTarget != (Object)null && Time.time < reviewUntil && EnemyLoot.Loose(reviewTarget) && reviewTarget.isInFactory != base.isOutside;
			if (base.stunNormalizedTimer > 0f || base.stunnedIndefinitely > 0)
			{
				novel.Interrupt(Time.time);
				Stop();
				Gravity(dt);
			}
			else
			{
				novel.Tick(Time.time, (Object)(object)base.targetPlayer != (Object)null && !base.targetPlayer.isPlayerDead, Vector3.Distance(((Component)this).transform.position, known), Time.time < noiseUntil, flag, distracted);
				if (flag)
				{
					Vector3 val2 = ((Component)this).transform.position - source;
					val2.y = 0f;
					if (((Vector3)(ref val2)).sqrMagnitude < 0.01f)
					{
						val2 = -((Component)this).transform.forward;
					}
					retreat = ((Component)this).transform.position + ((Vector3)(ref val2)).normalized * 3f;
				}
				if (phase != novel.Phase)
				{
					phaseAt = Time.time;
					if (novel.Phase == CreaturePhase.Warning)
					{
						Stop();
						Face(known - ((Component)this).transform.position, 1f);
					}
					if (novel.Phase == CreaturePhase.Lunging)
					{
						dash = known - ((Component)this).transform.position;
						dash.y = 0f;
						dash = ((((Vector3)(ref dash)).sqrMagnitude > 0.001f) ? ((Vector3)(ref dash)).normalized : ((Component)this).transform.forward);
						vertical = ((Kind == CreatureKind.Entenwaechter) ? 1.4f : ((Kind == CreatureKind.Flimmerkasten) ? 0.8f : 0f));
						Stop();
					}
					ChaosNet.CreatureChanged(this, reliable: true);
				}
				if (novel.Phase == CreaturePhase.Hunting)
				{
					Walk(known, dt);
				}
				else if (novel.Phase == CreaturePhase.Fleeing)
				{
					Walk(retreat, dt);
				}
				else if (novel.Phase == CreaturePhase.Lunging)
				{
					Move(dash * ((Kind == CreatureKind.Zollwaechter) ? 3.4f : 6f) * dt);
					Face(dash, dt);
					TryContact();
				}
				else
				{
					Stop();
				}
				Gravity(dt);
			}
			if (Time.time >= nextSend)
			{
				nextSend = Time.time + 0.1f;
				ChaosNet.CreatureChanged(this, reliable: false);
			}
		}

		private void FindReview(GrabbableObject[] things)
		{
			if (Time.time < nextReviewSearch)
			{
				return;
			}
			nextReviewSearch = Time.time + 0.5f;
			if ((Object)(object)reviewTarget != (Object)null && Time.time < reviewUntil)
			{
				return;
			}
			reviewTarget = null;
			ulong[] array = (from p in inspected
				where Time.time >= p.Value
				select p.Key).ToArray();
			foreach (ulong key in array)
			{
				inspected.Remove(key);
			}
			if (things == null)
			{
				return;
			}
			GrabbableObject val = (from g in things
				where (Object)(object)g != (Object)null && ((NetworkBehaviour)g).IsSpawned && EnemyLoot.Loose(g) && g.isInFactory != base.isOutside && !g.isInShipRoom && !g.isInElevator && !inspected.ContainsKey(((NetworkBehaviour)g).NetworkObjectId) && Vector3.Distance(((Component)this).transform.position, ((Component)g).transform.position) <= 1.8f && !Physics.Linecast(base.eye.position, ((Component)g).transform.position + Vector3.up * 0.1f, WorldMask, (QueryTriggerInteraction)1)
				orderby Vector3.Distance(((Component)this).transform.position, ((Component)g).transform.position)
				select g).FirstOrDefault();
			if ((Object)(object)val != (Object)null)
			{
				reviewTarget = val;
				reviewUntil = Time.time + 6f;
				if (inspected.Count >= 64)
				{
					inspected.Remove(inspected.Keys.First());
				}
				inspected[((NetworkBehaviour)val).NetworkObjectId] = Time.time + 20f;
			}
		}

		internal bool LitBy(PlayerControllerB[] players, out Vector3 source)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			source = Vector3.zero;
			if (players == null)
			{
				return false;
			}
			foreach (PlayerControllerB val in players)
			{
				if ((Object)(object)val == (Object)null || !val.isPlayerControlled || val.isPlayerDead || val.isInsideFactory == base.isOutside)
				{
					continue;
				}
				Light val2 = null;
				GrabbableObject currentlyHeldObjectServer = val.currentlyHeldObjectServer;
				FlashlightItem val3 = (FlashlightItem)(object)((currentlyHeldObjectServer is FlashlightItem) ? currentlyHeldObjectServer : null);
				if (val3 != null && ((GrabbableObject)val3).isBeingUsed && !((GrabbableObject)val3).isPocketed && (Object)(object)val3.flashlightBulb != (Object)null && ((Behaviour)val3.flashlightBulb).enabled)
				{
					val2 = val3.flashlightBulb;
				}
				else if ((Object)(object)val.helmetLight != (Object)null && ((Behaviour)val.helmetLight).enabled)
				{
					val2 = val.helmetLight;
				}
				if (!((Object)(object)val2 == (Object)null) && !(val2.intensity <= 0f) && ((Behaviour)val2).enabled && (int)val2.type == 0)
				{
					float reach = Mathf.Min(8f, val2.range);
					float minimumDot = Mathf.Cos(Mathf.Clamp(val2.spotAngle * 0.5f, 5f, 80f) * (MathF.PI / 180f));
					if (CombatSight.Visible(Physics.defaultPhysicsScene, ((Component)val2).transform.position, ((Component)val2).transform.forward, base.eye.position, reach, minimumDot, WorldMask))
					{
						source = ((Component)val2).transform.position;
						return true;
					}
				}
			}
			return false;
		}

		private void AnimateNovel()
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			if (Summons.Novel(Kind))
			{
				if (Kind == CreatureKind.Entenwaechter && joints.TryGetValue("upperBeak", out var value))
				{
					value.localRotation = Quaternion.Euler((float)((Phase == CreaturePhase.Warning) ? (-24) : ((Phase == CreaturePhase.Lunging) ? (-38) : 0)), 0f, 0f);
				}
				if (Kind == CreatureKind.Zollwaechter && joints.TryGetValue("rightArm", out var value2))
				{
					value2.localRotation = Quaternion.Euler((float)((Phase == CreaturePhase.Warning) ? (-65) : ((Phase == CreaturePhase.Lunging) ? 35 : ((Phase == CreaturePhase.Frozen) ? (-30) : 0))), 0f, 0f);
				}
				if (Kind == CreatureKind.Zollwaechter && Phase == CreaturePhase.Frozen && joints.TryGetValue("head", out var value3))
				{
					value3.localRotation = Quaternion.Euler(30f, 0f, 0f);
				}
				if (Kind == CreatureKind.Flimmerkasten && joints.TryGetValue("antenna", out var value4))
				{
					value4.localRotation = Quaternion.Euler(0f, 0f, Mathf.Sin(Time.time * 2f) * 6f);
				}
			}
		}
	}
	public sealed class ChaosExtrasPresentation : MonoBehaviour
	{
		private sealed class View
		{
			internal GameObject Object;

			internal ChaosKind Kind;

			internal Vector3 Position;

			internal float Until;

			internal bool Inside;

			internal Light Light;

			internal LineRenderer[] Beams;
		}

		private static readonly Dictionary<ulong, View> views = new Dictionary<ulong, View>();

		private static readonly List<GameObject> salvos = new List<GameObject>();

		private static Material beamMaterial;

		private static float cloudAmount;

		internal static int Count => views.Count;

		internal static void Zone(ulong id, ChaosKind kind, Vector3 point, int milliseconds, bool inside)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: 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_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Expected O, but got Unknown
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Expected O, but got Unknown
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: 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_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Expected O, but got Unknown
			//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
			if (id == 0L || !ExtraPolicy.Placed(kind) || milliseconds < 0 || (float)milliseconds > ExtraPolicy.Lifetime(kind) * 1000f || !ExtraPolicy.Finite(point.x) || !ExtraPolicy.Finite(point.y) || !ExtraPolicy.Finite(point.z))
			{
				return;
			}
			View value;
			if (milliseconds == 0)
			{
				Remove(id);
			}
			else if (views.TryGetValue(id, out value))
			{
				if (value.Kind == kind)
				{
					value.Until = Time.time + (float)milliseconds / 1000f;
					value.Position = point;
					value.Object.transform.position = point + ((kind == ChaosKind.Pupsgranate) ? (Vector3.up * 0.35f) : Vector3.zero);
				}
			}
			else
			{
				if (views.Count >= 8)
				{
					return;
				}
				View view = new View
				{
					Kind = kind,
					Position = point,
					Inside = inside,
					Until = Time.time + (float)milliseconds / 1000f
				};
				if (kind == ChaosKind.Pupsgranate)
				{
					view.Object = ChaosVisuals.StinkCloud(point);
				}
				else
				{
					view.Object = new GameObject("VideoChaos_DiscoParty");
					view.Object.transform.position = point;
					GameObject val = new GameObject("gentle_party_light");
					val.transform.SetParent(view.Object.transform, false);
					val.transform.localPosition = Vector3.up * 0.6f;
					view.Light = val.AddComponent<Light>();
					view.Light.type = (LightType)2;
					view.Light.range = 5f;
					view.Light.color = new Color(0.8f, 0.15f, 0.7f);
					(val.GetComponent<HDAdditionalLightData>() ?? val.AddComponent<HDAdditionalLightData>()).intensity = 130f;
					view.Beams = (LineRenderer[])(object)new LineRenderer[3];
					for (int i = 0; i < 3; i++)
					{
						GameObject val2 = new GameObject("slow_disco_beam");
						val2.transform.SetParent(view.Object.transform, false);
						LineRenderer val3 = val2.AddComponent<LineRenderer>();
						val3.useWorldSpace = true;
						val3.positionCount = 2;
						val3.startWidth = 0.025f;
						val3.endWidth = 0.055f;
						((Renderer)val3).shadowCastingMode = (ShadowCastingMode)0;
						if ((Object)(object)beamMaterial == (Object)null)
						{
							beamMaterial = new Material(Shader.Find("HDRP/Unlit") ?? Shader.Find("Sprites/Default"));
							string[] array = new string[3] { "_UnlitColor", "_BaseColor", "_Color" };
							foreach (string text in array)
							{
								if (beamMaterial.HasProperty(text))
								{
									beamMaterial.SetColor(text, new Color(0.6f, 0.14f, 0.8f));
								}
							}
						}
						((Renderer)val3).sharedMaterial = beamMaterial;
						view.Beams[i] = val3;
					}
					AudioSource val4 = view.Object.AddComponent<AudioSource>();
					val4.playOnAwake = false;
					val4.clip = ChaosPresentation.PartyBeat;
					val4.spatialBlend = 1f;
					val4.minDistance = 2f;
					val4.maxDistance = 25f;
					val4.volume = 0.42f;
					val4.loop = true;
					PlayerControllerB val5 = GameNetworkManager.Instance?.localPlayerController;
					if ((Object)(object)val5?.movementAudio != (Object)null)
					{
						val4.outputAudioMixerGroup = val5.movementAudio.outputAudioMixerGroup;
					}
					val4.Play();
				}
				views.Add(id, view);
			}
		}

		internal static GameObject Salvo(Vector3 point, Vector3 direction)
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			salvos.RemoveAll((GameObject g) => (Object)(object)g == (Object)null);
			if (salvos.Count >= 16)
			{
				Object.Destroy((Object)(object)salvos[0]);
				salvos.RemoveAt(0);
			}
			GameObject val = ChaosVisuals.ConfettiSalvo(point, direction);
			salvos.Add(val);
			return val;
		}

		public void Update()
		{
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_0248: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: 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_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: 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_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0271: Unknown result type (might be due to invalid IL or missing references)
			cloudAmount = 0f;
			PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController;
			int num = (((Object)(object)StartOfRound.Instance != (Object)null) ? StartOfRound.Instance.collidersAndRoomMaskAndDefault : LayerMask.GetMask(new string[3] { "Default", "Room", "Colliders" }));
			KeyValuePair<ulong, View>[] array = views.ToArray();
			Vector3 val4 = default(Vector3);
			RaycastHit val6 = default(RaycastHit);
			for (int i = 0; i < array.Length; i++)
			{
				KeyValuePair<ulong, View> keyValuePair = array[i];
				View value = keyValuePair.Value;
				if ((Object)(object)value.Object == (Object)null || Time.time >= value.Until)
				{
					Remove(keyValuePair.Key);
					continue;
				}
				if (value.Kind == ChaosKind.Pupsgranate && (Object)(object)val != (Object)null)
				{
					Vector3 val2 = (((Object)(object)val.gameplayCamera != (Object)null) ? ((Component)val.gameplayCamera).transform.position : (((Component)val).transform.position + Vector3.up));
					bool clear = !Physics.Linecast(value.Position + Vector3.up * 0.5f, val2, num, (QueryTriggerInteraction)1);
					float num2 = Vector3.Distance(((Component)val).transform.position, value.Position);
					if (ExtraPolicy.InCloud(val.isPlayerControlled && !val.isPlayerDead, val.isInsideFactory == value.Inside, num2, clear))
					{
						cloudAmount = Mathf.Max(cloudAmount, 0.13f + 0.1f * (1f - num2 / 3.2f));
					}
				}
				if (value.Kind != ChaosKind.DiscoKugel)
				{
					continue;
				}
				value.Light.color = Color.HSVToRGB(Time.time * 0.045f % 1f, 0.7f, 0.8f);
				for (int j = 0; j < value.Beams.Length; j++)
				{
					Vector3 val3 = value.Position + Vector3.up * 0.5f;
					float num3 = Time.time * 0.32f + (float)j * MathF.PI * 2f / 3f;
					((Vector3)(ref val4))..ctor(Mathf.Sin(num3), 0.14f + Mathf.Sin(num3 * 0.5f) * 0.1f, Mathf.Cos(num3));
					Vector3 val5 = val3 + val4 * 5f;
					if (Physics.Linecast(val3, val5, ref val6, num, (QueryTriggerInteraction)1))
					{
						val5 = ((RaycastHit)(ref val6)).point;
					}
					value.Beams[j].SetPosition(0, val3);
					value.Beams[j].SetPosition(1, val5);
				}
			}
		}

		public void OnGUI()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			if (!(cloudAmount <= 0f))
			{
				Color color = GUI.color;
				GUI.color = new Color(0.3f, 0.48f, 0.03f, cloudAmount);
				GUI.DrawTexture(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), (Texture)(object)Texture2D.whiteTexture);
				GUI.color = new Color(0.8f, 0.9f, 0.6f);
				GUI.Label(new Rect((float)(Screen.width / 2 - 100), (float)(Screen.height - 120), 260f, 26f), "Uff! Raus aus der Stinkwolke!");
				GUI.color = color;
			}
		}

		private static void Remove(ulong id)
		{
			if (views.TryGetValue(id, out var value) && (Object)(object)value.Object != (Object)null)
			{
				Object.Destroy((Object)(object)value.Object);
			}
			views.Remove(id);
		}

		internal static void Clear()
		{
			ulong[] array = views.Keys.ToArray();
			for (int i = 0; i < array.Length; i++)
			{
				Remove(array[i]);
			}
			foreach (GameObject salvo in salvos)
			{
				if ((Object)(object)salvo != (Object)null)
				{
					Object.Destroy((Object)(object)salvo);
				}
			}
			salvos.Clear();
			cloudAmount = 0f;
		}

		public void OnDestroy()
		{
			Clear();
		}
	}
	internal static class ChaosHelp
	{
		internal static string[] Hud(ChaosKind kind)
		{
			return new string[2]
			{
				"Benutzen : Hauptaktion",
				ShortHint(kind)
			};
		}

		internal static string ShortHint(ChaosKind kind)
		{
			return kind switch
			{
				ChaosKind.Donnerhammer => "Schlag mit Blitz und kurzer Betaeubung", 
				ChaosKind.Korkenkanone => "Korken schiessen; spuerbarer Rueckstoss", 
				ChaosKind.Kartoffel => "Starten, ablegen: lockt Geraeuschjaeger", 
				ChaosKind.Polterkiste => "Nach Landung: ablegen, Kistenbeisser rufen", 
				ChaosKind.Zauberhut => "Nach Landung: ablegen, Kaninchen rufen", 
				ChaosKind.Spukkompass => "Nadel folgt Beute, Ausgang oder Gefahr", 
				ChaosKind.Wichtelsack => "Nach Landung: ablegen, Schrottwichtel rufen", 
				ChaosKind.Blitzknipse => "Blitz: nahe Gegner vor dir kurz betauben", 
				ChaosKind.AlteMaske => "Nach Landung: ablegen, Maskenmann rufen", 
				ChaosKind.Pupsgranate => "Ablegen: 3s Zuendung, Aufheben entschaerft", 
				ChaosKind.Konfettikanone => "Konfettisalve: Gegner treffen, Waende schuetzen", 
				ChaosKind.DiscoKugel => "Ablegen: laute Party. Aufheben stoppt den Beat", 
				ChaosKind.Quietschei => "Nach Landung: ablegen, Entenwaechter rufen", 
				ChaosKind.Aktenkoffer => "Nach Landung: ablegen, Zollwaechter rufen", 
				ChaosKind.MiniFernseher => "Nach Landung: ablegen, Flimmerkasten rufen", 
				_ => "", 
			};
		}

		internal static string Info(ChaosSpec spec)
		{
			StringBuilder stringBuilder = new StringBuilder("\n").Append(spec.Name).Append("\n\n").Append(Wrap(spec.Description))
				.Append("\n\n");
			stringBuilder.Append("Grundpreis: ").Append(spec.Price).Append(" Credits\n");
			if (spec.Reach > 0f)
			{
				stringBuilder.Append("Reichweite: ").Append(Number(spec.Reach)).Append(" m\n");
			}
			stringBuilder.Append("Pause zwischen Aktionen: ").Append(Number(spec.Cooldown)).Append(" s\n");
			if (spec.Damage > 0)
			{
				stringBuilder.Append("Trefferstaerke: ").Append(spec.Damage).Append("\n");
			}
			if (spec.Stun > 0f)
			{
				stringBuilder.Append("Kurze Betaeubung: ").Append(Number(spec.Stun)).Append(" s\n");
			}
			return stringBuilder.Append("\nBedienung: Gegenstand halten und Hauptaktion benutzen.\n\n").ToString();
			static string Number(float value)
			{
				return value.ToString("0.##", CultureInfo.GetCultureInfo("de-DE"));
			}
		}

		private static string Wrap(string text)
		{
			StringBuilder stringBuilder = new StringBuilder();
			int num = 0;
			string[] array = text.Split(' ');
			foreach (string text2 in array)
			{
				if (text2.Length != 0)
				{
					if (num > 0 && num + 1 + text2.Length > 58)
					{
						stringBuilder.Append('\n');
						num = 0;
					}
					if (num > 0)
					{
						stringBuilder.Append(' ');
						num++;
					}
					stringBuilder.Append(text2);
					num += text2.Length;
				}
			}
			return stringBuilder.ToString();
		}
	}
	internal static class ChaosIcons
	{
		internal static Sprite Create(ChaosKind kind)
		{
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Expected O, but got Unknown
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			Color[] array = (Color[])(object)new Color[16384];
			for (int i = 0; i < 128; i++)
			{
				for (int j = 0; j < 128; j++)
				{
					int num = 0;
					for (int k = 0; k < 2; k++)
					{
						for (int l = 0; l < 2; l++)
						{
							if (Shape(((float)j + ((float)k + 0.5f) * 0.5f) / 128f * 2f - 1f, ((float)i + ((float)l + 0.5f) * 0.5f) / 128f * 2f - 1f))
							{
								num++;
							}
						}
					}
					array[i * 128 + j] = new Color(1f, 1f, 1f, (float)num * 0.25f);
				}
			}
			Texture2D val = new Texture2D(128, 128, (TextureFormat)4, false)
			{
				name = "VideoChaosIcon_" + kind,
				filterMode = (FilterMode)1,
				wrapMode = (TextureWrapMode)1
			};
			val.SetPixels(array);
			val.Apply(false, false);
			Sprite obj = Sprite.Create(val, new Rect(0f, 0f, 128f, 128f), new Vector2(0.5f, 0.5f), 128f);
			((Object)obj).name = "VideoChaosIcon_" + kind;
			return obj;
			static bool Ellipse(float x, float y, float cx, float cy, float rx, float ry)
			{
				return Math.Pow((x - cx) / rx, 2.0) + Math.Pow((y - cy) / ry, 2.0) <= 1.0;
			}
			static bool Rect(float x, float y, float cx, float cy, float hx, float hy)
			{
				if (Math.Abs(x - cx) <= hx)
				{
					return Math.Abs(y - cy) <= hy;
				}
				return false;
			}
			bool Shape(float x, float y)
			{
				switch (kind)
				{
				case ChaosKind.Donnerhammer:
					if (!Rect(x, y, 0f, -0.13f, 0.075f, 0.54f))
					{
						return Rect(x, y, 0f, 0.44f, 0.52f, 0.19f);
					}
					return true;
				case ChaosKind.Korkenkanone:
					if (!Rect(x, y, 0.08f, 0.24f, 0.57f, 0.16f) && !Rect(x, y, -0.2f, -0.15f, 0.12f, 0.38f))
					{
						return Ellipse(x, y, 0.7f, 0.24f, 0.08f, 0.11f);
					}
					return true;
				case ChaosKind.Kartoffel:
					if (Ellipse(x, y, 0f, 0f, 0.47f, 0.64f) && !Ellipse(x, y, -0.17f, 0.18f, 0.07f, 0.09f) && !Ellipse(x, y, 0.17f, 0.18f, 0.07f, 0.09f))
					{
						return !Ellipse(x, y, 0f, -0.22f, 0.14f, 0.19f);
					}
					return false;
				case ChaosKind.Polterkiste:
					if (Rect(x, y, 0f, 0f, 0.58f, 0.48f) && (!(Math.Abs(y - 0.2f) < 0.027f) || !(Math.Abs(x) > 0.09f)))
					{
						if (!(Math.Abs(x - 0.38f) < 0.025f))
						{
							return !(Math.Abs(x + 0.38f) < 0.025f);
						}
						return false;
					}
					return false;
				case ChaosKind.Zauberhut:
					if (!Rect(x, y, 0f, -0.46f, 0.69f, 0.065f))
					{
						if (y > -0.4f && y < 0.68f)
						{
							return Math.Abs(x) < (0.68f - y) * 0.43f;
						}
						return false;
					}
					return true;
				case ChaosKind.Spukkompass:
				{
					float num2 = x * x + y * y;
					if ((!(num2 < 0.52f) || !(num2 > 0.36f)) && (!(Math.Abs(x) < 0.13f) || !(y > -0.4f) || !(y < 0.49f)))
					{
						if (y > 0.25f && y < 0.6f)
						{
							return Math.Abs(x) < (0.6f - y) * 0.7f;
						}
						return false;
					}
					return true;
				}
				case ChaosKind.Wichtelsack:
					if (!Ellipse(x, y, 0f, -0.12f, 0.48f, 0.52f) && !Rect(x, y, 0f, 0.44f, 0.23f, 0.07f))
					{
						if (y > 0.49f && y < 0.7f)
						{
							return Math.Abs(x) < (y - 0.43f) * 1.1f;
						}
						return false;
					}
					return true;
				case ChaosKind.Blitzknipse:
					if ((!Rect(x, y, 0f, -0.08f, 0.61f, 0.39f) || Ellipse(x, y, 0f, -0.08f, 0.24f, 0.24f)) && !Rect(x, y, 0.38f, 0.49f, 0.14f, 0.11f))
					{
						return Rect(x, y, -0.4f, 0.38f, 0.09f, 0.09f);
					}
					return true;
				case ChaosKind.AlteMaske:
					if (Ellipse(x, y, 0f, 0f, 0.43f, 0.67f) && !Ellipse(x, y, -0.17f, 0.16f, 0.1f, 0.13f) && !Ellipse(x, y, 0.17f, 0.16f, 0.1f, 0.13f))
					{
						return !Ellipse(x, y, 0f, -0.34f, 0.065f, 0.11f);
					}
					return false;
				case ChaosKind.Pupsgranate:
					if (!Ellipse(x, y, 0f, -0.17f, 0.38f, 0.49f) && !Rect(x, y, 0f, 0.36f, 0.2f, 0.1f))
					{
						if (Ellipse(x, y, 0.08f, 0.58f, 0.2f, 0.17f))
						{
							return !Ellipse(x, y, 0.08f, 0.58f, 0.11f, 0.08f);
						}
						return false;
					}
					return true;
				case ChaosKind.Konfettikanone:
					if (!Rect(x, y, 0f, 0.03f, 0.46f, 0.25f) && !Rect(x, y, -0.26f, -0.38f, 0.12f, 0.25f) && !Ellipse(x, y, 0.7f, 0.33f, 0.09f, 0.08f) && !Rect(x, y, 0.6f, 0.65f, 0.05f, 0.1f))
					{
						return Rect(x, y, 0.73f, -0.18f, 0.09f, 0.05f);
					}
					return true;
				case ChaosKind.DiscoKugel:
					if ((!Ellipse(x, y, 0f, 0.18f, 0.48f, 0.48f) || !(Math.Abs(x) > 0.025f) || !(Math.Abs(y - 0.18f) > 0.025f)) && !Rect(x, y, 0f, -0.4f, 0.065f, 0.16f))
					{
						return Rect(x, y, 0f, -0.6f, 0.38f, 0.06f);
					}
					return true;
				case ChaosKind.Quietschei:
					if (!Ellipse(x, y, 0f, -0.1f, 0.41f, 0.55f))
					{
						return Rect(x, y, 0f, 0.52f, 0.1f, 0.13f);
					}
					return true;
				case ChaosKind.Aktenkoffer:
					if (!Rect(x, y, 0f, -0.1f, 0.65f, 0.4f) && !Rect(x, y, 0f, 0.44f, 0.29f, 0.08f) && !Rect(x, y, -0.28f, 0.33f, 0.055f, 0.12f))
					{
						return Rect(x, y, 0.28f, 0.33f, 0.055f, 0.12f);
					}
					return true;
				case ChaosKind.MiniFernseher:
					if ((!Rect(x, y, 0f, -0.05f, 0.6f, 0.43f) || (Math.Abs(x) < 0.4f && Math.Abs(y + 0.05f) < 0.26f)) && (!(Math.Abs(x - y * 0.6f) < 0.045f) || !(y > 0.36f) || !(y < 0.72f)))
					{
						if (Math.Abs(x + y * 0.6f) < 0.045f && y > 0.36f)
						{
							return y < 0.72f;
						}
						return false;
					}
					return true;
				default:
					return false;
				}
			}
		}
	}
	public sealed class ChaosItem : GrabbableObject
	{
		public ChaosKind Kind;

		public int CompassMode;

		public float CompassDistance;

		public bool CompassHasSignal;

		private float localNextUse;

		private float animationStarted = -100f;

		private Transform visual;

		private Transform needle;

		private Quaternion rest;

		private Vector3 compassPoint;

		private ulong compassTarget;

		private float compassUntil;

		private MaterialPropertyBlock needleColor;

		internal float FuseUntil;

		public bool AiSafeToTest
		{
			get
			{
				if (Kind != ChaosKind.Kartoffel)
				{
					return Kind == ChaosKind.Spukkompass;
				}
				return true;
			}
		}

		public bool AiIsRangedWeapon
		{
			get
			{
				if (