Decompiled source of LucilleJohnson v0.0.7

BepInEx/plugins/LJMod/TimeBomb.dll

Decompiled 6 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using TimeBomb.NetcodePatcher;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("TimeBomb")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Lucille Johnson mod for Lethal Company")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TimeBomb")]
[assembly: AssemblyTitle("TimeBomb")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace TimeBomb
{
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "TimeBomb";

		public const string PLUGIN_NAME = "TimeBomb";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace LucilleJohnson
{
	internal class DeleteAfter : MonoBehaviour
	{
		private float duration = 4f;

		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(DeleteIn(duration));
		}

		private IEnumerator DeleteIn(float dur)
		{
			yield return (object)new WaitForSeconds(dur);
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}
	}
	[HarmonyPatch(typeof(GameNetworkManager))]
	internal class GameNetworkManagerPatcher
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void AddToPrefabs(ref GameNetworkManager __instance)
		{
			((Component)__instance).GetComponent<NetworkManager>().AddNetworkPrefab(Plugin.Instance.TimeBombPrefab);
			((Component)__instance).GetComponent<NetworkManager>().AddNetworkPrefab(Plugin.Instance.LJPrefab);
			((Component)__instance).GetComponent<NetworkManager>().AddNetworkPrefab(Plugin.Instance.NetworkManagerPrefab);
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatcher
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void SpawnLJNetworkManager(StartOfRound __instance)
		{
			if (((NetworkBehaviour)__instance).IsHost)
			{
				Object.Instantiate<GameObject>(Plugin.Instance.NetworkManagerPrefab).GetComponent<NetworkObject>().Spawn(false);
			}
		}
	}
	internal class LJAI : EnemyAI
	{
		public List<AudioClip> sfx;

		public GameObject ljFlashPrefab;

		public GameObject bombPrefab;

		public float bombDist = 0.05f;

		private bool alreadyActivated = false;

		private bool ljFlashActivated = false;

		private ulong bombNetworkObjectId;

		private GameObject bomb = null;

		private PlayerControllerB attachTarget;

		private UnityAction<PlayerControllerB> TeleportAction;

		private Coroutine teleportCoroutine;

		public override void Start()
		{
			((EnemyAI)this).Start();
			base.moveTowardsDestination = false;
			TeleportAction = (UnityAction<PlayerControllerB>)(object)Delegate.Combine((Delegate?)(object)TeleportAction, (Delegate?)(object)new UnityAction<PlayerControllerB>(OnTeleport));
			((UnityEvent<PlayerControllerB>)(object)StartOfRound.Instance.playerTeleportedEvent).AddListener(TeleportAction);
		}

		public override void Update()
		{
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: 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_0150: 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)
			//IL_017f: 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_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).Update();
			if (bomb == null)
			{
				if (bombNetworkObjectId != 0)
				{
					bomb = ((Component)IdToBomb(bombNetworkObjectId)).gameObject;
					if ((Object)(object)bomb != (Object)null)
					{
						((GrabbableObject)bomb.GetComponent<PhysicsProp>()).grabbable = false;
						((GrabbableObject)bomb.GetComponent<PhysicsProp>()).grabbableToEnemies = false;
					}
				}
			}
			else if ((Object)(object)bomb == (Object)null)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
				return;
			}
			if ((Object)(object)bomb != (Object)null && (Object)(object)attachTarget != (Object)null && !attachTarget.isPlayerDead)
			{
				PhysicsProp component = bomb.GetComponent<PhysicsProp>();
				float num = (360f - ((Component)attachTarget).transform.eulerAngles.y) * (MathF.PI / 180f);
				bomb.transform.position = ((Component)attachTarget).transform.position + bombDist * new Vector3(0f - Mathf.Sin(num), 0f, Mathf.Cos(num)) + Vector3.up * 1.5f;
				((GrabbableObject)component).startFallingPosition = bomb.transform.position;
				((GrabbableObject)component).targetFloorPosition = bomb.transform.position;
				bomb.transform.eulerAngles = new Vector3(0f, ((Component)attachTarget).transform.eulerAngles.y - 90f, 0f);
			}
			else if ((Object)(object)bomb != (Object)null && (Object)(object)attachTarget != (Object)null && attachTarget.isPlayerDead)
			{
				TimeBombProp component2 = bomb.GetComponent<TimeBombProp>();
				component2.SetGrabbableServerRpc();
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}

		public void OnTeleport(PlayerControllerB player)
		{
			Debug.Log((object)"Player teleported!");
			if (teleportCoroutine == null && (Object)(object)bomb != (Object)null)
			{
				teleportCoroutine = ((MonoBehaviour)this).StartCoroutine(TeleportCoroutine(player));
			}
		}

		private IEnumerator TeleportCoroutine(PlayerControllerB player)
		{
			Debug.Log((object)"Teleport Coroutine Started!");
			yield return null;
			if ((Object)(object)attachTarget == (Object)null)
			{
				teleportCoroutine = null;
				yield break;
			}
			float dist = float.MaxValue;
			ShipTeleporter[] array = Object.FindObjectsByType<ShipTeleporter>((FindObjectsSortMode)0);
			foreach (ShipTeleporter teleporter in array)
			{
				Transform tele = ((Component)teleporter).transform.Find("AnimContainer").Find("TeleportPosition");
				float num = dist;
				Vector3 val = ((Component)attachTarget).transform.position - tele.position;
				dist = Mathf.Min(num, ((Vector3)(ref val)).magnitude);
			}
			Debug.Log((object)$"Distance from teleporter: {dist}");
			if (dist >= 2f)
			{
				teleportCoroutine = null;
				yield break;
			}
			yield return (object)new WaitForSeconds(0.5f);
			if (!((Object)(object)bomb == (Object)null) && (Object)(object)player == (Object)(object)attachTarget && !player.isPlayerDead)
			{
				Debug.Log((object)"Bomb detached!");
				TimeBombProp bombProp = bomb.GetComponent<TimeBombProp>();
				bombProp.SetGrabbableServerRpc();
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}

		public override void OnDestroy()
		{
			((EnemyAI)this).OnDestroy();
			((UnityEvent<PlayerControllerB>)(object)StartOfRound.Instance.playerTeleportedEvent).RemoveListener(TeleportAction);
		}

		public void OnTriggerEnter(Collider other)
		{
			if (alreadyActivated)
			{
				return;
			}
			Debug.Log((object)"LJ Triggered!");
			if (((Component)other).CompareTag("Player") || ((Component)((Component)other).transform.parent).CompareTag("Player"))
			{
				PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>();
				if (!((Component)other).CompareTag("Player"))
				{
					component = ((Component)((Component)other).transform.parent).GetComponent<PlayerControllerB>();
				}
				if ((Object)(object)component != (Object)null && !component.isPlayerDead && !((Object)(object)component != (Object)(object)GameNetworkManager.Instance.localPlayerController) && !alreadyActivated)
				{
					Debug.Log((object)"LJ Activated!");
					TriggerServerRpc(component.playerClientId);
				}
			}
		}

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

		private IEnumerator SpawnBombServerCoroutine(ulong triggererId)
		{
			yield return (object)new WaitForSeconds(0.2f);
			bomb = Object.Instantiate<GameObject>(bombPrefab);
			NetworkObject bombNetObj = bomb.GetComponent<NetworkObject>();
			bombNetObj.Spawn(false);
			((GrabbableObject)bomb.GetComponent<PhysicsProp>()).grabbable = false;
			((GrabbableObject)bomb.GetComponent<PhysicsProp>()).grabbableToEnemies = false;
			AttachBombClientRpc(triggererId, bombNetObj.NetworkObjectId);
			yield return (object)new WaitForSeconds(3f);
			bomb.GetComponent<TimeBombProp>().ActivateBomb();
		}

		[ClientRpc]
		public void LJFlashClientRpc(ulong triggererId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1481855219u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, triggererId);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1481855219u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				alreadyActivated = true;
				if (!ljFlashActivated && GameNetworkManager.Instance.localPlayerController.playerClientId == triggererId)
				{
					LJFlash();
					ljFlashActivated = true;
				}
			}
		}

		[ClientRpc]
		public void AttachBombClientRpc(ulong triggererId, ulong networkObjectId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3814598918u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, triggererId);
					BytePacker.WriteValueBitPacked(val2, networkObjectId);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3814598918u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					((Component)this).GetComponent<AudioSource>().volume = 0f;
					bombNetworkObjectId = networkObjectId;
					attachTarget = IdToPlayer(triggererId);
				}
			}
		}

		private void LJFlash()
		{
			Transform transform = GameObject.Find("Systems").transform;
			AudioSource component = ((Component)transform.Find("Audios").Find("UIAudio")).GetComponent<AudioSource>();
			component.PlayOneShot(sfx[Random.Range(0, sfx.Count)]);
			Canvas component2 = ((Component)transform.Find("UI").Find("Canvas")).GetComponent<Canvas>();
			Object.Instantiate<GameObject>(ljFlashPrefab, ((Component)component2).gameObject.transform).AddComponent<DeleteAfter>();
		}

		private PlayerControllerB IdToPlayer(ulong triggererId)
		{
			PlayerControllerB[] array = Object.FindObjectsByType<PlayerControllerB>((FindObjectsSortMode)1);
			foreach (PlayerControllerB val in array)
			{
				if (val.playerClientId == triggererId)
				{
					return val;
				}
			}
			return null;
		}

		private TimeBombProp IdToBomb(ulong networkObjectId)
		{
			TimeBombProp[] array = Object.FindObjectsByType<TimeBombProp>((FindObjectsSortMode)1);
			foreach (TimeBombProp timeBombProp in array)
			{
				if (((NetworkBehaviour)timeBombProp).NetworkObjectId == networkObjectId)
				{
					return timeBombProp;
				}
			}
			return null;
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_LJAI()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3610995932u, new RpcReceiveHandler(__rpc_handler_3610995932));
			NetworkManager.__rpc_func_table.Add(1481855219u, new RpcReceiveHandler(__rpc_handler_1481855219));
			NetworkManager.__rpc_func_table.Add(3814598918u, new RpcReceiveHandler(__rpc_handler_3814598918));
		}

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

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

		private static void __rpc_handler_3814598918(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong triggererId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref triggererId);
				ulong networkObjectId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref networkObjectId);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((LJAI)(object)target).AttachBombClientRpc(triggererId, networkObjectId);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "LJAI";
		}
	}
	public class LJConfig
	{
		public static ConfigEntry<int> LJSpawnRarity;

		public static ConfigEntry<int> LJSpawnLimit;

		public static void Load()
		{
			LJSpawnRarity = Plugin.config.Bind<int>("Enemies", "Lucille Johnson Spawn Rate", 30, "How often does Lucille Johnson spawn? Bigger number for more spawn frequency.");
			LJSpawnLimit = Plugin.config.Bind<int>("Enemies", "Lucille Johnson Spawn Limit", 1, "How many Lucille Johnsons can spawn? Bigger number for more spawns at once.");
		}
	}
	internal class LJNetworkManager : NetworkBehaviour
	{
		public static LJNetworkManager Instance;

		private void Awake()
		{
			Instance = this;
		}

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

		protected internal override string __getTypeName()
		{
			return "LJNetworkManager";
		}
	}
	[BepInPlugin("2991e0dc-44d3-4fd2-9f65-3a447d782dfe", "TimeBomb", "0.1")]
	public class Plugin : BaseUnityPlugin
	{
		private const string PLUGIN_GUID = "2991e0dc-44d3-4fd2-9f65-3a447d782dfe";

		private const string PLUGIN_NAME = "TimeBomb";

		private const string PLUGIN_VERSION = "0.1";

		public static Plugin Instance;

		public GameObject TimeBombPrefab;

		public GameObject LJPrefab;

		public GameObject NetworkManagerPrefab;

		public static ConfigFile config;

		private void Awake()
		{
			config = ((BaseUnityPlugin)this).Config;
			LJConfig.Load();
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			Instance = this;
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "timebomb");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			NetworkManagerPrefab = val.LoadAsset<GameObject>("Assets/TimeBomb/LJNetworkManager.prefab");
			NetworkManagerPrefab.AddComponent<LJNetworkManager>();
			AudioClip beep = val.LoadAsset<AudioClip>("Assets/TimeBomb/beep0.wav");
			AudioClip beep2 = val.LoadAsset<AudioClip>("Assets/TimeBomb/beep1.wav");
			AudioClip dudSFX = val.LoadAsset<AudioClip>("Assets/TimeBomb/dud.wav");
			Item val2 = val.LoadAsset<Item>("Assets/TimeBomb/TimeBombItem.asset");
			TimeBombProp timeBombProp = val2.spawnPrefab.AddComponent<TimeBombProp>();
			((GrabbableObject)timeBombProp).grabbable = true;
			((GrabbableObject)timeBombProp).grabbableToEnemies = true;
			((GrabbableObject)timeBombProp).itemProperties = val2;
			timeBombProp.beep0 = beep;
			timeBombProp.beep1 = beep2;
			timeBombProp.dudSFX = dudSFX;
			TimeBombPrefab = val2.spawnPrefab;
			NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab);
			Utilities.FixMixerGroups(val2.spawnPrefab);
			AudioClip item = val.LoadAsset<AudioClip>("Assets/TimeBomb/glitch0.wav");
			AudioClip item2 = val.LoadAsset<AudioClip>("Assets/TimeBomb/glitch1.wav");
			AudioClip item3 = val.LoadAsset<AudioClip>("Assets/TimeBomb/glitch2.wav");
			AudioClip item4 = val.LoadAsset<AudioClip>("Assets/TimeBomb/glitch3.wav");
			GameObject ljFlashPrefab = val.LoadAsset<GameObject>("Assets/TimeBomb/TimeBombOverlay.prefab");
			EnemyType val3 = val.LoadAsset<EnemyType>("Assets/TimeBomb/LJ.asset");
			LJAI lJAI = val3.enemyPrefab.AddComponent<LJAI>();
			lJAI.sfx = new List<AudioClip> { item, item2, item3, item4 };
			lJAI.ljFlashPrefab = ljFlashPrefab;
			lJAI.bombPrefab = val2.spawnPrefab;
			((EnemyAI)lJAI).enemyType = val3;
			val3.MaxCount = LJConfig.LJSpawnLimit.Value;
			LJPrefab = val3.enemyPrefab;
			NetworkPrefabs.RegisterNetworkPrefab(val3.enemyPrefab);
			TerminalKeyword val4 = val.LoadAsset<TerminalKeyword>("Assets/TimeBomb/LJKeyword.asset");
			Enemies.RegisterEnemy(val3, LJConfig.LJSpawnRarity.Value, (LevelTypes)(-1), (SpawnType)0, (TerminalNode)null, val4);
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "2991e0dc-44d3-4fd2-9f65-3a447d782dfe");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin 2991e0dc-44d3-4fd2-9f65-3a447d782dfe is loaded!");
		}
	}
	internal class TimeBombProp : PhysicsProp
	{
		private Coroutine explode = null;

		public AudioClip beep0;

		public AudioClip beep1;

		public AudioClip dudSFX;

		private bool alreadyActivated = false;

		private bool alreadyDetonated = false;

		private bool dud = false;

		private float dudChance = 5f;

		public int TimePhaseA = 40;

		public int TimePhaseB = 30;

		public int TimePhaseC = 20;

		private AudioSource audioSource;

		public void Awake()
		{
			audioSource = ((Component)this).GetComponent<AudioSource>();
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null && explode == null)
			{
				ActivateBomb();
			}
		}

		public void ActivateBomb()
		{
			if (!alreadyActivated)
			{
				alreadyActivated = true;
				StartBombServerRpc();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void StartBombServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3257605038u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3257605038u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					Debug.Log((object)$"TimeBomb (Server): Player used bomb. Dud: {dud}");
					dud = Random.Range(0f, 100f) < dudChance;
					alreadyActivated = true;
					StartBombClientRpc(dud);
				}
			}
		}

		[ClientRpc]
		public void StartBombClientRpc(bool dud)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: 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_0097: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1403438466u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref dud, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1403438466u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				Debug.Log((object)$"TimeBomb (Client): Player used bomb. Dud: {dud}");
				this.dud = dud;
				alreadyActivated = true;
				if (explode == null)
				{
					explode = ((MonoBehaviour)this).StartCoroutine((IEnumerator)TimeBombCoroutine());
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void SetGrabbableServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2935319038u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2935319038u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					SetGrabbableClientRpc();
				}
			}
		}

		[ClientRpc]
		public void SetGrabbableClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(558465907u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 558465907u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					((GrabbableObject)this).FallToGround(false);
					((GrabbableObject)this).grabbable = true;
					((GrabbableObject)this).grabbableToEnemies = true;
				}
			}
		}

		public void ConvertToScrap()
		{
			((Component)this).GetComponentInChildren<ScanNodeProperties>().scrapValue = 100;
			((GrabbableObject)((Component)this).GetComponent<PhysicsProp>()).scrapValue = 100;
			explode = null;
			alreadyActivated = false;
			alreadyDetonated = false;
		}

		private IEnumerator<object> TimeBombCoroutine()
		{
			Debug.Log((object)"TimeBomb: Starting timer");
			for (int k = 0; k < TimePhaseA; k++)
			{
				audioSource.PlayOneShot(beep0);
				if (StartOfRound.Instance.inShipPhase)
				{
					ConvertToScrap();
					yield break;
				}
				yield return (object)new WaitForSeconds(1f);
			}
			for (int j = 0; j < TimePhaseB; j++)
			{
				audioSource.PlayOneShot(beep0);
				if (StartOfRound.Instance.inShipPhase)
				{
					ConvertToScrap();
					yield break;
				}
				yield return (object)new WaitForSeconds(0.5f);
			}
			for (int i = 0; i < TimePhaseC; i++)
			{
				audioSource.PlayOneShot(beep1);
				if (StartOfRound.Instance.inShipPhase)
				{
					ConvertToScrap();
					yield break;
				}
				yield return (object)new WaitForSeconds(0.25f);
			}
			Debug.Log((object)"TimeBomb: Exploding");
			if (GameNetworkManager.Instance.isHostingGame)
			{
				DetonateClientRpc();
			}
		}

		[ClientRpc]
		public void DetonateClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3420457884u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3420457884u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && !alreadyDetonated)
				{
					alreadyDetonated = true;
					Detonate();
				}
			}
		}

		public void Detonate()
		{
			//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_0011: Unknown result type (might be due to invalid IL or missing references)
			CreateExplosion(((Component)this).transform.position + Vector3.up, spawnExplosionEffect: true, (!dud) ? 100 : 0, 5.7f, 6.4f, 6, (CauseOfDeath)3, null, dud ? dudSFX : null);
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}

		public static void CreateExplosion(Vector3 explosionPosition, bool spawnExplosionEffect = false, int damage = 20, float minDamageRange = 0f, float maxDamageRange = 1f, int enemyHitForce = 6, CauseOfDeath causeOfDeath = 3, PlayerControllerB attacker = null, AudioClip playSound = null)
		{
			//IL_00d0: 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_006f: 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_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: 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_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: 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)
			//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: 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)
			Debug.Log((object)"Spawning explosion at pos: {explosionPosition}");
			Transform val = null;
			if ((Object)(object)RoundManager.Instance != (Object)null && (Object)(object)RoundManager.Instance.mapPropsContainer != (Object)null && (Object)(object)RoundManager.Instance.mapPropsContainer.transform != (Object)null)
			{
				val = RoundManager.Instance.mapPropsContainer.transform;
			}
			if (spawnExplosionEffect)
			{
				GameObject val2 = Object.Instantiate<GameObject>(StartOfRound.Instance.explosionPrefab, explosionPosition, Quaternion.Euler(-90f, 0f, 0f), val);
				if ((Object)(object)playSound != (Object)null)
				{
					AudioSource componentInChildren = val2.GetComponentInChildren<AudioSource>();
					componentInChildren.clip = playSound;
					componentInChildren.Play();
				}
				val2.SetActive(true);
			}
			float num = Vector3.Distance(((Component)GameNetworkManager.Instance.localPlayerController).transform.position, explosionPosition);
			if (num < 14f)
			{
				HUDManager.Instance.ShakeCamera((ScreenShakeType)1);
			}
			else if (num < 25f)
			{
				HUDManager.Instance.ShakeCamera((ScreenShakeType)0);
			}
			Collider[] array = Physics.OverlapSphere(explosionPosition, maxDamageRange, 2621448, (QueryTriggerInteraction)2);
			PlayerControllerB val3 = null;
			for (int i = 0; i < array.Length; i++)
			{
				float num2 = Vector3.Distance(explosionPosition, ((Component)array[i]).transform.position);
				if (num2 > 4f && Physics.Linecast(explosionPosition, ((Component)array[i]).transform.position + Vector3.up * 0.3f, 256, (QueryTriggerInteraction)1))
				{
					continue;
				}
				if (((Component)array[i]).gameObject.layer == 3)
				{
					val3 = ((Component)array[i]).gameObject.GetComponent<PlayerControllerB>();
					if ((Object)(object)val3 != (Object)null && ((NetworkBehaviour)val3).IsOwner)
					{
						float num3 = 1f - Mathf.Clamp01((num2 - minDamageRange) / (maxDamageRange - minDamageRange));
						val3.DamagePlayer((int)((float)damage * num3), true, true, causeOfDeath, 0, false, default(Vector3));
					}
				}
				else if (((Component)array[i]).gameObject.layer == 19)
				{
					EnemyAICollisionDetect componentInChildren2 = ((Component)array[i]).gameObject.GetComponentInChildren<EnemyAICollisionDetect>();
					if ((Object)(object)componentInChildren2 != (Object)null && ((NetworkBehaviour)componentInChildren2.mainScript).IsOwner && num2 < 4.5f)
					{
						componentInChildren2.mainScript.HitEnemyOnLocalClient(enemyHitForce, default(Vector3), attacker, false);
					}
				}
			}
			int num4 = ~LayerMask.GetMask(new string[1] { "Room" });
			num4 = ~LayerMask.GetMask(new string[1] { "Colliders" });
			array = Physics.OverlapSphere(explosionPosition, 10f, num4);
			for (int j = 0; j < array.Length; j++)
			{
				Rigidbody component = ((Component)array[j]).GetComponent<Rigidbody>();
				if ((Object)(object)component != (Object)null)
				{
					component.AddExplosionForce(70f, explosionPosition, 10f);
				}
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_TimeBombProp()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3257605038u, new RpcReceiveHandler(__rpc_handler_3257605038));
			NetworkManager.__rpc_func_table.Add(1403438466u, new RpcReceiveHandler(__rpc_handler_1403438466));
			NetworkManager.__rpc_func_table.Add(2935319038u, new RpcReceiveHandler(__rpc_handler_2935319038));
			NetworkManager.__rpc_func_table.Add(558465907u, new RpcReceiveHandler(__rpc_handler_558465907));
			NetworkManager.__rpc_func_table.Add(3420457884u, new RpcReceiveHandler(__rpc_handler_3420457884));
		}

		private static void __rpc_handler_3257605038(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((TimeBombProp)(object)target).StartBombServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1403438466(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: 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)
			//IL_0044: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TimeBombProp)(object)target).StartBombClientRpc(flag);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2935319038(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((TimeBombProp)(object)target).SetGrabbableServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_558465907(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TimeBombProp)(object)target).SetGrabbableClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3420457884(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TimeBombProp)(object)target).DetonateClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "TimeBombProp";
		}
	}
}
namespace TimeBomb.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}