Decompiled source of DerangedCompany v0.3.0

DerangedCompany.dll

Decompiled 5 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using DerangedCompany.MonoBehaviours;
using GameNetcodeStuff;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using On;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("DerangedCompany")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Adds a bunch of random (deranged) things to the game")]
[assembly: AssemblyFileVersion("0.3.0.0")]
[assembly: AssemblyInformationalVersion("0.3.0")]
[assembly: AssemblyProduct("DerangedCompany")]
[assembly: AssemblyTitle("DerangedCompany")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.3.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace DerangedCompany
{
	[BepInPlugin("DerangedCompany", "DerangedCompany", "0.3.0")]
	public class Plugin : BaseUnityPlugin
	{
		private AssetBundle _assets;

		private static Dictionary<string, GameObject> _prefabs;

		private void Awake()
		{
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Loading plugin...");
			_assets = AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("DerangedCompany.derangedassets"));
			if ((Object)(object)_assets == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogFatal((object)"Asset bundle could not be found.");
				return;
			}
			_prefabs = new Dictionary<string, GameObject>();
			GameObject val = _assets.LoadAsset<GameObject>("Assets/DerangedCompany/Scrap/AmongPlushie/VentDrop.prefab");
			AudioClip value = _assets.LoadAsset<AudioClip>("Assets/DerangedCompany/Audio/impostor-kill.mp3");
			NetworkPrefabs.RegisterNetworkPrefab(val);
			LoadScrap("Deez", 20, (LevelTypes)(-1));
			LoadScrap("AmongPlushie", 10, (LevelTypes)(-1), typeof(ItemUseDeath), new Dictionary<string, object>
			{
				{ "incrementChance", 0.4f },
				{ "frustrateChance", 0.1f },
				{
					"frustrateBounds",
					(object)new Vector2(8f, 14f)
				},
				{ "deathObject", val },
				{ "deathSound", value },
				{ "frustrationDeathReduction", 3f }
			});
			LoadScrap("Policia", 1, (LevelTypes)(-1), typeof(Policia));
			LoadScrap("AmongChip", 1, (LevelTypes)992, typeof(HealItem));
			LoadEnemy("Finger", 40, (LevelTypes)(-1), typeof(FingerAI));
			LoadEnemy("YourMother", 20, (LevelTypes)992, typeof(YourMotherAI));
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin loaded!!");
		}

		private void LoadScrap(string assetName, int rarity = 20, LevelTypes levelTypes = -1, Type customScript = null, Dictionary<string, object> newFields = null)
		{
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: 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_00e3: Unknown result type (might be due to invalid IL or missing references)
			Item val = _assets.LoadAsset<Item>("Assets/DerangedCompany/Scrap/" + assetName + "/" + assetName + ".asset");
			if ((Object)(object)val == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Could not load scrap " + assetName + "."));
			}
			if (customScript != null)
			{
				val.spawnPrefab = SwapScripts(val.spawnPrefab, typeof(GrabbableObject), customScript, newFields);
			}
			GameObject spawnPrefab = val.spawnPrefab;
			if (assetName != "Deez")
			{
				spawnPrefab.AddComponent<AudioMixerFixer>();
			}
			_prefabs.Add(assetName, spawnPrefab);
			NetworkPrefabs.RegisterNetworkPrefab(spawnPrefab);
			Items.RegisterScrap(val, rarity, (LevelTypes)(levelTypes & 0x1C));
			Items.RegisterScrap(val, (int)Math.Round((double)rarity * 1.5), (LevelTypes)(levelTypes & 0x60));
			Items.RegisterScrap(val, rarity * 2, (LevelTypes)(levelTypes & 0x380));
		}

		private void LoadEnemy(string assetName, int rarity = 40, LevelTypes levelTypes = -1, Type customScript = null, Dictionary<string, object> newFields = null)
		{
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			EnemyType val = _assets.LoadAsset<EnemyType>("Assets/DerangedCompany/Enemies/" + assetName + "/" + assetName + ".asset");
			if ((Object)(object)val == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Could not load enemy " + assetName + "."));
			}
			if (customScript != null)
			{
				val.enemyPrefab = SwapScripts(val.enemyPrefab, typeof(EnemyAI), customScript, newFields);
			}
			GameObject enemyPrefab = val.enemyPrefab;
			enemyPrefab.AddComponent<AudioMixerFixer>();
			TerminalNode val2 = _assets.LoadAsset<TerminalNode>("Assets/DerangedCompany/Enemies/" + assetName + "/TerminalNode.asset");
			TerminalKeyword val3 = _assets.LoadAsset<TerminalKeyword>("Assets/DerangedCompany/Enemies/" + assetName + "/TerminalKeyword.asset");
			if ((Object)(object)val2 == (Object)null || (Object)(object)val3 == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Could not load terminal configs for " + assetName + "."));
			}
			_prefabs.Add(assetName, enemyPrefab);
			NetworkPrefabs.RegisterNetworkPrefab(enemyPrefab);
			Enemies.RegisterEnemy(val, rarity, levelTypes, (SpawnType)0, val2, val3);
		}

		private GameObject SwapScripts(GameObject obj, Type original, Type replacement, Dictionary<string, object> newFields = null)
		{
			Component component = obj.GetComponent(original);
			Component obj2 = obj.AddComponent(replacement);
			FieldInfo[] fields = ((object)component).GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);
			foreach (FieldInfo fieldInfo in fields)
			{
				FieldInfo field = replacement.GetField(fieldInfo.Name);
				if (field != null)
				{
					field.SetValue(obj2, fieldInfo.GetValue(component));
				}
			}
			Object.Destroy((Object)(object)component);
			if (newFields != null)
			{
				foreach (string key in newFields.Keys)
				{
					FieldInfo field2 = replacement.GetField(key);
					object obj3 = newFields[key];
					if (field2 != null && field2.FieldType == obj3.GetType())
					{
						field2.SetValue(obj2, obj3);
					}
				}
			}
			return obj;
		}

		private static void SpawnPrefab(StartOfRound self, string name)
		{
			//IL_0040: 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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			float num = (((Object)(object)_prefabs[name].GetComponent<EnemyAI>() == (Object)null) ? 0f : 2f);
			Object.Instantiate<GameObject>(_prefabs[name], ((Component)self.localPlayerController.gameplayCamera).transform.position + Vector3.forward * num, Quaternion.identity).GetComponent<NetworkObject>().Spawn(false);
			UnityLogWriter.WriteStringToUnityLog("Spawned " + name + "!");
		}

		private static void StartOfRound_Update(orig_Update super, StartOfRound self)
		{
			if (((ButtonControl)Keyboard.current[(Key)94]).wasPressedThisFrame)
			{
				SpawnPrefab(self, "Deez");
			}
			if (((ButtonControl)Keyboard.current[(Key)95]).wasPressedThisFrame)
			{
				SpawnPrefab(self, "AmongPlushie");
			}
			if (((ButtonControl)Keyboard.current[(Key)96]).wasPressedThisFrame)
			{
				SpawnPrefab(self, "Vent");
			}
			if (((ButtonControl)Keyboard.current[(Key)97]).wasPressedThisFrame)
			{
				SpawnPrefab(self, "Policia");
			}
			if (((ButtonControl)Keyboard.current[(Key)98]).wasPressedThisFrame)
			{
				SpawnPrefab(self, "AmongChip");
			}
			if (((ButtonControl)Keyboard.current[(Key)103]).wasPressedThisFrame)
			{
				SpawnPrefab(self, "Finger");
			}
			if (((ButtonControl)Keyboard.current[(Key)102]).wasPressedThisFrame)
			{
				SpawnPrefab(self, "YourMother");
			}
			super.Invoke(self);
		}
	}
	[StructLayout(LayoutKind.Sequential, Size = 1)]
	public struct LevelTypeUtil
	{
		public const LevelTypes Easy = 28;

		public const LevelTypes Middle = 96;

		public const LevelTypes Expert = 896;
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "DerangedCompany";

		public const string PLUGIN_NAME = "DerangedCompany";

		public const string PLUGIN_VERSION = "0.3.0";
	}
}
namespace DerangedCompany.MonoBehaviours
{
	public class AudioMixerFixer : MonoBehaviour
	{
		private static AudioMixerGroup _masterDiageticMixer;

		public static AudioMixerGroup MasterDiageticMixer
		{
			get
			{
				if ((Object)(object)_masterDiageticMixer == (Object)null)
				{
					AudioSource? obj = (from p in ((Component)GameNetworkManager.Instance).GetComponent<NetworkManager>().NetworkConfig.Prefabs.Prefabs
						select p.Prefab.GetComponentInChildren<NoisemakerProp>() into p
						where (Object)(object)p != (Object)null
						select ((Component)p).GetComponentInChildren<AudioSource>() into p
						where (Object)(object)p != (Object)null
						select p).FirstOrDefault();
					if ((Object)(object)obj == (Object)null)
					{
						throw new Exception("Failed to locate a suitable AudioSource output mixer to reference! Could you be calling this method before the GameNetworkManager is initialized?");
					}
					_masterDiageticMixer = obj.outputAudioMixerGroup;
				}
				return _masterDiageticMixer;
			}
		}

		private void Start()
		{
			foreach (AudioSource item in ((Component)this).GetComponents<AudioSource>().Concat(((Component)this).GetComponentsInChildren<AudioSource>()))
			{
				item.outputAudioMixerGroup = MasterDiageticMixer;
			}
		}
	}
	public class FingerAI : EnemyAI
	{
		public int fingerDamage = 35;

		public float deathCrunch = 0.3f;

		private float _timeSinceHittingLocalPlayer;

		public override void Start()
		{
			((Component)this).GetComponentInChildren<EnemyAICollisionDetect>().mainScript = (EnemyAI)(object)this;
			((EnemyAI)this).Start();
			_timeSinceHittingLocalPlayer = 0f;
		}

		public override void Update()
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).Update();
			if (base.isEnemyDead)
			{
				((Behaviour)base.creatureAnimator).enabled = false;
				Vector3 val = default(Vector3);
				((Vector3)(ref val))..ctor(((Component)this).transform.localScale.x, deathCrunch, ((Component)this).transform.localScale.z);
				((Component)this).transform.localScale = Vector3.Lerp(((Component)this).transform.localScale, val, 0.1f);
			}
			if (base.ventAnimationFinished && !base.isEnemyDead && !StartOfRound.Instance.allPlayersDead)
			{
				_timeSinceHittingLocalPlayer += Time.deltaTime;
			}
		}

		public override void DoAIInterval()
		{
			((EnemyAI)this).DoAIInterval();
			if (!base.isEnemyDead && !StartOfRound.Instance.allPlayersDead)
			{
				base.targetPlayer = ((EnemyAI)this).GetClosestPlayer(false, true, true);
				base.movingTowardsTargetPlayer = base.targetPlayer.isInsideFactory;
			}
		}

		public override void OnCollideWithPlayer(Collider other)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).OnCollideWithPlayer(other);
			if (!((double)_timeSinceHittingLocalPlayer < 0.25))
			{
				PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false);
				if (!((Object)(object)val == (Object)null))
				{
					_timeSinceHittingLocalPlayer = 0f;
					val.DamagePlayer(fingerDamage, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
					val.bleedingHeavily = true;
				}
			}
		}

		public override void HitEnemy(int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false)
		{
			if (!base.isEnemyDead)
			{
				base.enemyHP -= force;
				if (((NetworkBehaviour)this).IsOwner && base.enemyHP <= 0)
				{
					((EnemyAI)this).HitEnemy(force, playerWhoHit, false);
					((EnemyAI)this).KillEnemyOnOwnerClient(false);
				}
				else
				{
					((EnemyAI)this).HitEnemy(force, playerWhoHit, playHitSFX);
				}
			}
		}
	}
	public class HealItem : NoisemakerProp
	{
		[Range(0f, 1f)]
		public float useChance = 1f;

		public int itemUses = 1;

		[Range(0f, 1f)]
		public float healAmount = 1f;

		private Random _random;

		private float _uses;

		public override void Start()
		{
			((NoisemakerProp)this).Start();
			_uses = 0f;
			_random = new Random(StartOfRound.Instance.randomMapSeed);
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			if (!((Object)(object)localPlayerController == (Object)null) && !((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null))
			{
				((NoisemakerProp)this).ItemActivate(used, buttonDown);
				bool flag = ((Object)localPlayerController).name == ((Object)((GrabbableObject)this).playerHeldBy).name && localPlayerController.actualClientId == ((GrabbableObject)this).playerHeldBy.actualClientId;
				if (flag)
				{
					localPlayerController.health = Mathf.Min(100, localPlayerController.health + (int)(100f * healAmount));
					HUDManager.Instance.UpdateHealthUI(localPlayerController.health, false);
				}
				if (_random.NextDouble() <= (double)useChance)
				{
					_uses += 1f;
				}
				if (_uses >= (float)itemUses && flag)
				{
					((GrabbableObject)this).DestroyObjectInHand(localPlayerController);
				}
			}
		}
	}
	public class ItemUseDeath : NoisemakerProp
	{
		[Range(0f, 1f)]
		public float incrementChance = 0.5f;

		public float frustrateIncrement = 1f;

		[Range(0f, 1f)]
		public float frustrateChance = 0.5f;

		public Vector2 frustrateBounds = new Vector2(4f, 10f);

		public GameObject deathObject;

		public AudioClip deathSound;

		public float frustrationDeathReduction = 2f;

		private AudioSource _audioSource;

		private Random _random;

		private float _frustration;

		public override void Start()
		{
			((NoisemakerProp)this).Start();
			_audioSource = ((Component)this).GetComponent<AudioSource>();
			_random = new Random(StartOfRound.Instance.randomMapSeed);
			_frustration = 0f;
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			//IL_0121: 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_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			if ((Object)(object)localPlayerController == (Object)null || (Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null)
			{
				return;
			}
			if (_random.NextDouble() >= (double)incrementChance)
			{
				_frustration += frustrateIncrement;
			}
			bool num = (_frustration >= frustrateBounds.x && _random.NextDouble() >= (double)frustrateChance) || _frustration >= frustrateBounds.y;
			bool flag = ((Object)localPlayerController).name == ((Object)((GrabbableObject)this).playerHeldBy).name && localPlayerController.actualClientId == ((GrabbableObject)this).playerHeldBy.actualClientId;
			if (num && !StartOfRound.Instance.inShipPhase)
			{
				if (flag)
				{
					localPlayerController.bleedingHeavily = true;
					localPlayerController.DropBlood(Vector3.up, true, false);
					localPlayerController.DropBlood(Vector3.down, true, false);
					localPlayerController.AddBloodToBody();
					localPlayerController.KillPlayer(Vector3.down, true, (CauseOfDeath)6, 0);
					localPlayerController.AddBloodToBody();
				}
				Object.Instantiate<GameObject>(deathObject, ((Component)((GrabbableObject)this).playerHeldBy.gameplayCamera).transform.position, Quaternion.identity).GetComponent<NetworkObject>().Spawn(true);
				_frustration /= frustrationDeathReduction;
				_audioSource.PlayOneShot(deathSound);
			}
			else
			{
				((NoisemakerProp)this).ItemActivate(used, buttonDown);
			}
		}
	}
	public class Policia : GrabbableObject
	{
		private Transform _siren;

		private Transform _player;

		public override void Start()
		{
			((GrabbableObject)this).Start();
			_siren = ((Component)((Component)this).GetComponentInChildren<SpriteRenderer>()).transform;
			_player = ((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform;
		}

		public override void Update()
		{
			((GrabbableObject)this).Update();
			if (!((Object)(object)_siren == (Object)null) && !((Object)(object)_player == (Object)null))
			{
				_siren.LookAt(_player);
			}
		}
	}
	public class YourMotherAI : EnemyAI
	{
		public int hitDamage = 35;

		private int _maxHp;

		private float _timeSinceHittingLocalPlayer;

		private Vector3 _originalSize;

		public override void Start()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).GetComponentInChildren<EnemyAICollisionDetect>().mainScript = (EnemyAI)(object)this;
			((EnemyAI)this).Start();
			_maxHp = base.enemyHP;
			_timeSinceHittingLocalPlayer = 0f;
			_originalSize = ((Component)this).transform.localScale;
		}

		public override void Update()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).Update();
			float num = Mathf.Max((float)base.enemyHP / (float)_maxHp, 0f);
			((Component)this).transform.localScale = Vector3.Lerp(((Component)this).transform.localScale, new Vector3(num * _originalSize.x, _originalSize.y, num * _originalSize.z), 0.1f);
			if (base.ventAnimationFinished && !base.isEnemyDead && !StartOfRound.Instance.allPlayersDead)
			{
				_timeSinceHittingLocalPlayer += Time.deltaTime;
			}
		}

		public override void OnCollideWithPlayer(Collider other)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).OnCollideWithPlayer(other);
			if (!((double)_timeSinceHittingLocalPlayer < 0.25))
			{
				PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false);
				if (!((Object)(object)val == (Object)null))
				{
					_timeSinceHittingLocalPlayer = 0f;
					val.DamagePlayer(hitDamage, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
					val.DropBlood(default(Vector3), true, false);
				}
			}
		}

		public override void HitEnemy(int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false)
		{
			//IL_0022: 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)
			if (!base.isEnemyDead)
			{
				base.enemyHP -= force;
				if (Object.op_Implicit((Object)(object)playerWhoHit))
				{
					playerWhoHit.DropBlood(default(Vector3), true, false);
				}
				if (((NetworkBehaviour)this).IsOwner && base.enemyHP <= 0)
				{
					((EnemyAI)this).HitEnemy(force, playerWhoHit, false);
					((EnemyAI)this).KillEnemyOnOwnerClient(false);
				}
				else
				{
					((EnemyAI)this).HitEnemy(force, playerWhoHit, playHitSFX);
				}
			}
		}
	}
}