Decompiled source of CompetitiveCompany v0.3.1

CompetitiveCompany.dll

Decompiled 9 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CSync.Lib;
using CSync.Util;
using CompetitiveCompany;
using CompetitiveCompany.patches;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements.Collections;

[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("CompetitiveCompany")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Your Mod Description Goes Here")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+8b26f609e928f638868b8916e7cd58fa7c6ac023")]
[assembly: AssemblyProduct("CompetitiveCompany")]
[assembly: AssemblyTitle("CompetitiveCompany")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.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;
		}
	}
}
[DataContract]
public class Config : SyncedConfig<Config>
{
	[DataMember]
	internal SyncedEntry<int> team1Suit { get; private set; }

	[DataMember]
	internal SyncedEntry<int> team2Suit { get; private set; }

	[DataMember]
	internal SyncedEntry<string> team1Name { get; private set; }

	[DataMember]
	internal SyncedEntry<string> team2Name { get; private set; }

	[DataMember]
	internal SyncedEntry<string> team1ColorCode { get; private set; }

	[DataMember]
	internal SyncedEntry<string> team2ColorCode { get; private set; }

	[DataMember]
	internal SyncedEntry<int> graceTime { get; private set; }

	[DataMember]
	internal SyncedEntry<int> fineAmount { get; private set; }

	public Config(ConfigFile cfg)
		: base("CompetitiveCompany")
	{
		ConfigManager.Register<Config>(this);
		team1Suit = Extensions.BindSyncedEntry<int>(cfg, "Suits", "Team 1 Suits", 0, "Originally the orange suit.\nIf you want to set a custom suit with AdditionalSuits, their suits\nGet logged when the game starts. Simply read the logs\nAnd use their SuitIDs!");
		team2Suit = Extensions.BindSyncedEntry<int>(cfg, "Suits", "Team 2 Suits", 3, "Originally the Pajama Suit");
		team1Name = Extensions.BindSyncedEntry<string>(cfg, "Names", "Team 1 Name", "Orange", "Set the name for team 1.");
		team2Name = Extensions.BindSyncedEntry<string>(cfg, "Names", "Team 2 Name", "Blue", "Set the name for team 2.");
		team1ColorCode = Extensions.BindSyncedEntry<string>(cfg, "Colors", "Team 1 Color", "orange", "Set the color code for team 1. Hex codes can be used.");
		team2ColorCode = Extensions.BindSyncedEntry<string>(cfg, "Colors", "Team 2 Color", "blue", "Set the color code for team 2. Hex codes can be used.");
		graceTime = Extensions.BindSyncedEntry<int>(cfg, "Grace Time", "Grace Time", 14, "How long grace lasts for. 12+ = PM");
		fineAmount = Extensions.BindSyncedEntry<int>(cfg, "Grace Time", "Fine Amount", 200, "How much should you be fined for leaving early");
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
	public static void InitializeLocalPlayer()
	{
		Plugin.Instance.mls.LogError((object)"10088 - Start");
		if (SyncedInstance<Config>.IsHost)
		{
			SyncedInstance<Config>.Synced = true;
		}
		else
		{
			SyncedInstance<Config>.Synced = false;
		}
	}
}
public class Randomizer
{
	public static void Randomize<T>(T[] items)
	{
		Random random = new Random();
		for (int i = 0; i < items.Length - 1; i++)
		{
			int num = random.Next(i, items.Length);
			T val = items[i];
			items[i] = items[num];
			items[num] = val;
		}
	}
}
namespace CompetitiveCompany
{
	[BepInPlugin("org.agmas.CompetitiveCompany", "Competitive Company", "0.3.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		private const string modGUID = "org.agmas.CompetitiveCompany";

		private const string modName = "Competitive Company";

		private const string modVersion = "0.3.0";

		private readonly Harmony harmony = new Harmony("org.agmas.CompetitiveCompany");

		public static Plugin Instance;

		public static int blueScore = 0;

		public static bool startLogic = false;

		public static bool warnship = true;

		public static bool finedForShip = false;

		public static int redScore = 0;

		public static int curHour = 0;

		public static int nextHour = 0;

		public static Dictionary<PlayerControllerB, int> teams = new Dictionary<PlayerControllerB, int>();

		public static Dictionary<PlayerControllerB, bool> initiated = new Dictionary<PlayerControllerB, bool>();

		public ManualLogSource mls;

		public static Config MyConfig { get; internal set; }

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			MyConfig = new Config(((BaseUnityPlugin)this).Config);
			mls = Logger.CreateLogSource("org.agmas.CompetitiveCompany");
			mls.LogInfo((object)"We're up and running!");
			harmony.PatchAll(typeof(RoundManagerPatch));
			harmony.PatchAll(typeof(HudManagerPatch));
			harmony.PatchAll(typeof(PlayerControllerBPatch));
			harmony.PatchAll(typeof(GrabbableObjectPatch));
			harmony.PatchAll(typeof(StartOfRoundPatch));
			harmony.PatchAll(typeof(Config));
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "CompetitiveCompany";

		public const string PLUGIN_NAME = "CompetitiveCompany";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace CompetitiveCompany.patches
{
	[HarmonyPatch(typeof(GrabbableObject))]
	internal class GrabbableObjectPatch
	{
	}
	[HarmonyPatch(typeof(HUDManager))]
	internal class HudManagerPatch
	{
		public static TextMeshProUGUI _blueTeam;

		public static TextMeshProUGUI _seperator;

		public static TextMeshProUGUI _redTeam;

		[HarmonyPatch(typeof(HUDManager), "Start")]
		[HarmonyPrefix]
		public static void fix(HUDManager __instance)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Expected O, but got Unknown
			//IL_00db: 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_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Expected O, but got Unknown
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("BlueHUD");
			val.AddComponent<RectTransform>();
			TextMeshProUGUI val2 = val.AddComponent<TextMeshProUGUI>();
			RectTransform rectTransform = ((TMP_Text)val2).rectTransform;
			((Transform)rectTransform).SetParent(((Component)__instance.PTTIcon).transform, false);
			rectTransform.anchoredPosition = new Vector2(0f, 2f);
			((TMP_Text)val2).font = ((TMP_Text)__instance.controlTipLines[0]).font;
			((TMP_Text)val2).fontSize = 16f;
			((TMP_Text)val2).text = "1000";
			((Graphic)val2).color = Color.red;
			((TMP_Text)val2).overflowMode = (TextOverflowModes)0;
			((Behaviour)val2).enabled = true;
			_redTeam = val2;
			GameObject val3 = new GameObject("SepHUD");
			val3.AddComponent<RectTransform>();
			TextMeshProUGUI val4 = val3.AddComponent<TextMeshProUGUI>();
			RectTransform rectTransform2 = ((TMP_Text)val4).rectTransform;
			((Transform)rectTransform2).SetParent(((Component)__instance.PTTIcon).transform, false);
			rectTransform2.anchoredPosition = new Vector2(0f, 2f);
			((TMP_Text)val4).font = ((TMP_Text)__instance.controlTipLines[0]).font;
			((TMP_Text)val4).fontSize = 16f;
			((TMP_Text)val4).text = "vs";
			((Graphic)val4).color = Color.gray;
			((TMP_Text)val4).overflowMode = (TextOverflowModes)0;
			((Behaviour)val4).enabled = true;
			_seperator = val4;
			GameObject val5 = new GameObject("RedHUD");
			val5.AddComponent<RectTransform>();
			TextMeshProUGUI val6 = val5.AddComponent<TextMeshProUGUI>();
			RectTransform rectTransform3 = ((TMP_Text)val6).rectTransform;
			((Transform)rectTransform3).SetParent(((Component)__instance.PTTIcon).transform, false);
			rectTransform3.anchoredPosition = new Vector2(0f, 2f);
			((TMP_Text)val6).font = ((TMP_Text)__instance.controlTipLines[0]).font;
			((TMP_Text)val6).fontSize = 16f;
			((TMP_Text)val6).text = "1000";
			((Graphic)val6).color = Color.blue;
			((TMP_Text)val6).overflowMode = (TextOverflowModes)0;
			((Behaviour)val6).enabled = true;
			_blueTeam = val6;
		}

		[HarmonyPatch(typeof(HUDManager), "DisplayDaysLeft")]
		[HarmonyPrefix]
		private static bool teams2()
		{
			if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer)
			{
				TimeOfDay.Instance.timeUntilDeadline = 2000f;
			}
			if (Plugin.blueScore > Plugin.redScore)
			{
				((TMP_Text)HUDManager.Instance.profitQuotaDaysLeftText).text = SyncedInstance<Config>.Instance.team2Name.Value + " Wins!";
				((TMP_Text)HUDManager.Instance.profitQuotaDaysLeftText2).text = SyncedInstance<Config>.Instance.team2Name.Value + " Wins!";
			}
			if (Plugin.blueScore < Plugin.redScore)
			{
				((TMP_Text)HUDManager.Instance.profitQuotaDaysLeftText).text = SyncedInstance<Config>.Instance.team1Name.Value + " Wins!";
				((TMP_Text)HUDManager.Instance.profitQuotaDaysLeftText2).text = SyncedInstance<Config>.Instance.team1Name.Value + " Wins!";
			}
			if (Plugin.blueScore == Plugin.redScore)
			{
				((TMP_Text)HUDManager.Instance.profitQuotaDaysLeftText).text = "Tie!";
				((TMP_Text)HUDManager.Instance.profitQuotaDaysLeftText2).text = "Tie!";
			}
			if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer)
			{
				RoundManager.Instance.DespawnPropsAtEndOfRound(true);
			}
			HUDManager.Instance.reachedProfitQuotaAnimator.SetTrigger("displayDaysLeftCalm");
			HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.profitQuotaDaysLeftCalmSFX);
			return false;
		}

		[HarmonyPatch(typeof(HUDManager), "FillEndGameStats")]
		[HarmonyPostfix]
		private static void teams()
		{
			if (Plugin.blueScore > Plugin.redScore)
			{
				((TMP_Text)HUDManager.Instance.statsUIElements.gradeLetter).text = SyncedInstance<Config>.Instance.team2Name.Value.Substring(0, 2);
				if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost)
				{
					HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team2ColorCode.Value + ">" + SyncedInstance<Config>.Instance.team2Name.Value + " won the game!!", -1);
				}
			}
			if (Plugin.blueScore < Plugin.redScore)
			{
				((TMP_Text)HUDManager.Instance.statsUIElements.gradeLetter).text = SyncedInstance<Config>.Instance.team1Name.Value.Substring(0, 2);
				if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost)
				{
					HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team1ColorCode.Value + ">" + SyncedInstance<Config>.Instance.team1Name.Value + " won the game!!", -1);
				}
			}
			if (Plugin.blueScore == Plugin.redScore)
			{
				((TMP_Text)HUDManager.Instance.statsUIElements.gradeLetter).text = "T";
				if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost)
				{
					HUDManager.Instance.AddTextToChatOnServer("<color=white>Tied.", -1);
				}
			}
		}

		[HarmonyPatch(typeof(HUDManager), "AddChatMessage")]
		[HarmonyPrefix]
		public static bool Prefix(HUDManager __instance, string chatMessage, string nameOfUserWhoTyped = "")
		{
			if (string.IsNullOrEmpty(nameOfUserWhoTyped))
			{
				if (chatMessage.StartsWith("<color=" + SyncedInstance<Config>.Instance.team1ColorCode.Value + ">") && chatMessage.EndsWith(" was put on " + SyncedInstance<Config>.Instance.team1Name.Value + "!"))
				{
					string text = (string)chatMessage.Clone();
					text = text.Remove(0, 8 + SyncedInstance<Config>.Instance.team1ColorCode.Value.Length);
					string[] array = text.Split(" was");
					Plugin.Instance.mls.LogInfo((object)("Detected Player " + array[0]));
					PlayerControllerB[] allPlayerScripts = RoundManager.Instance.playersManager.allPlayerScripts;
					foreach (PlayerControllerB val in allPlayerScripts)
					{
						if (array[0].Equals(val.playerUsername) && !Plugin.teams.ContainsKey(val))
						{
							Plugin.teams.Add(val, 0);
						}
					}
				}
				if (chatMessage.Equals("<color=green>Use the suit rack to switch team or\nPut on the Yellow suit to be randomly selected!"))
				{
					HUDManager.Instance.DisplayTip("Competitive Company", "Use the suit rack to switch team or\nPut on the Yellow suit to be randomly selected!", false, false, "LC_Tip1");
					return false;
				}
				if (chatMessage.StartsWith("<color=" + SyncedInstance<Config>.Instance.team2ColorCode.Value + ">") && chatMessage.EndsWith(" was put on " + SyncedInstance<Config>.Instance.team2Name.Value + "!"))
				{
					string text2 = (string)chatMessage.Clone();
					text2 = text2.Remove(0, 8 + SyncedInstance<Config>.Instance.team2ColorCode.Value.Length);
					string[] array2 = text2.Split(" was");
					Plugin.Instance.mls.LogInfo((object)("Detected Player " + array2[0]));
					PlayerControllerB[] allPlayerScripts2 = RoundManager.Instance.playersManager.allPlayerScripts;
					foreach (PlayerControllerB val2 in allPlayerScripts2)
					{
						if (array2[0].Equals(val2.playerUsername) && !Plugin.teams.ContainsKey(val2))
						{
							Plugin.teams.Add(val2, 1);
						}
					}
				}
				if (chatMessage.StartsWith("<color=" + SyncedInstance<Config>.Instance.team1ColorCode.Value + ">" + GameNetworkManager.Instance.localPlayerController.playerUsername + " was put on " + SyncedInstance<Config>.Instance.team1Name.Value + "!"))
				{
					__instance.DisplayTip("Competitive Company", "You're on " + SyncedInstance<Config>.Instance.team1Name.Value + "!", false, false, "LC_Tip1");
				}
				if (chatMessage.StartsWith("<color=" + SyncedInstance<Config>.Instance.team2ColorCode.Value + ">" + GameNetworkManager.Instance.localPlayerController.playerUsername + " was put on " + SyncedInstance<Config>.Instance.team2Name.Value + "!"))
				{
					__instance.DisplayTip("Competitive Company", "You're on " + SyncedInstance<Config>.Instance.team2Name.Value + "!", false, false, "LC_Tip1");
				}
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerControllerBPatch
	{
		[HarmonyPatch(typeof(PlayerControllerB), "SetItemInElevator")]
		[HarmonyPrefix]
		private static void gammaPatch2(PlayerControllerB __instance, ref GrabbableObject gObject, ref bool droppedInShipRoom)
		{
			if (!((gObject.itemProperties.isScrap && !gObject.scrapPersistedThroughRounds) & droppedInShipRoom) || RoundManager.Instance.scrapCollectedThisRound.Contains(gObject) || !Plugin.teams.ContainsKey(__instance))
			{
				return;
			}
			if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, __instance, 0) == 0)
			{
				Plugin.redScore += gObject.scrapValue;
				if (GameNetworkManager.Instance.isHostingGame)
				{
					Terminal val = Object.FindObjectOfType<Terminal>();
					val.groupCredits += gObject.scrapValue;
					val.SyncGroupCreditsServerRpc(val.groupCredits, val.numberOfItemsInDropship);
					HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team1ColorCode.Value + ">+" + gObject.scrapValue + "\n<color=white>(<color=red>" + Plugin.redScore + "<color=white> - <color=blue>" + Plugin.blueScore + "<color=white>)", -1);
				}
			}
			if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, __instance, 0) == 1)
			{
				Plugin.blueScore += gObject.scrapValue;
				if (GameNetworkManager.Instance.isHostingGame)
				{
					Terminal val2 = Object.FindObjectOfType<Terminal>();
					val2.groupCredits += gObject.scrapValue;
					val2.SyncGroupCreditsServerRpc(val2.groupCredits, val2.numberOfItemsInDropship);
					HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team2ColorCode.Value + ">+" + gObject.scrapValue + "\n<color=white>(<color=red>" + Plugin.redScore + "<color=white> - <color=blue>" + Plugin.blueScore + "<color=white>)", -1);
				}
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "DamagePlayerFromOtherClientServerRpc")]
		[HarmonyPrefix]
		private static void ff(PlayerControllerB __instance, ref int damageAmount, ref int playerWhoHit)
		{
			int num = (int)(TimeOfDay.Instance.normalizedTimeOfDay * (60f * (float)TimeOfDay.Instance.numberOfHours)) + 360;
			int num2 = (int)Mathf.Floor((float)(num / 60));
			if (RoundManager.Instance.playersManager.allPlayerScripts[playerWhoHit].currentSuitID == __instance.currentSuitID)
			{
				HUDManager.Instance.DisplayTip("Competitive Company", "Friendly fire is not allowed!", true, false, "LC_Tip1");
				damageAmount = 0;
			}
			if (num2 >= SyncedInstance<Config>.Instance.graceTime.Value)
			{
				return;
			}
			damageAmount = 0;
			if (((object)RoundManager.Instance.playersManager.allPlayerScripts[playerWhoHit]).Equals((object?)GameNetworkManager.Instance.localPlayerController))
			{
				int num3 = 0;
				string text = "am";
				num3 += SyncedInstance<Config>.Instance.graceTime.Value;
				if (num3 > 12)
				{
					num3 -= 12;
					text = "pm";
				}
				HUDManager.Instance.DisplayTip("Competitive Company", "You can only attack others in the factory or after " + num3 + text + "!", true, false, "LC_Tip1");
			}
		}

		private static IEnumerator SuitSetter(PlayerControllerB b)
		{
			yield return (object)new WaitForSeconds(2f);
			UnlockableSuit[] array = Object.FindObjectsOfType<UnlockableSuit>(true);
			UnlockableSuit[] array2 = array;
			foreach (UnlockableSuit us in array2)
			{
				if (us.suitID == 2)
				{
					us.SwitchSuitToThis(b);
				}
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "Update")]
		[HarmonyPostfix]
		private static void gammaPatch(PlayerControllerB __instance)
		{
			//IL_01c8: 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_020c: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)__instance != (Object)null))
			{
				return;
			}
			if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost)
			{
				if (!Plugin.initiated.ContainsKey(__instance))
				{
					Plugin.initiated.Add(__instance, value: true);
					HUDManager.Instance.AddTextToChatOnServer("<color=green>Use the suit rack to switch team or\nPut on the Yellow suit to be randomly selected!", -1);
					((MonoBehaviour)__instance).StartCoroutine(SuitSetter(__instance));
				}
				if (Plugin.teams.ContainsKey(__instance) && Plugin.startLogic && RoundManager.Instance.dungeonFinishedGeneratingForAllPlayers)
				{
					if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, __instance, 0) == 0 && __instance.currentSuitID != SyncedInstance<Config>.Instance.team1Suit.Value)
					{
						UnlockableSuit[] array = Object.FindObjectsOfType<UnlockableSuit>(true);
						UnlockableSuit[] array2 = array;
						foreach (UnlockableSuit val in array2)
						{
							if (val.suitID == SyncedInstance<Config>.Instance.team1Suit.Value)
							{
								val.SwitchSuitToThis(__instance);
							}
						}
					}
					if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, __instance, 0) == 1 && __instance.currentSuitID != SyncedInstance<Config>.Instance.team2Suit.Value)
					{
						UnlockableSuit[] array3 = Object.FindObjectsOfType<UnlockableSuit>(true);
						UnlockableSuit[] array4 = array3;
						foreach (UnlockableSuit val2 in array4)
						{
							if (val2.suitID == SyncedInstance<Config>.Instance.team2Suit.Value)
							{
								val2.SwitchSuitToThis(__instance);
							}
						}
					}
				}
			}
			if (__instance.currentSuitID == 0)
			{
				((Graphic)__instance.usernameBillboardText).color = Color.red;
			}
			if (__instance.currentSuitID == 3)
			{
				((Graphic)__instance.usernameBillboardText).color = Color.blue;
			}
			if (__instance.currentSuitID == 2)
			{
				((Graphic)__instance.usernameBillboardText).color = Color.yellow;
			}
		}
	}
	[HarmonyPatch(typeof(RoundManager))]
	internal class RoundManagerPatch
	{
		[HarmonyPatch(typeof(RoundManager), "OnDestroy")]
		[HarmonyPostfix]
		private static void undo(RoundManager __instance)
		{
			Plugin.startLogic = false;
			Plugin.teams.Clear();
			Plugin.initiated.Clear();
		}

		[HarmonyPatch(typeof(RoundManager), "Update")]
		[HarmonyPostfix]
		private static void checkIfDead(RoundManager __instance)
		{
			//IL_03af: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ef: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null)
			{
				return;
			}
			if (!StartOfRound.Instance.unlockablesList.unlockables[2].alreadyUnlocked && (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost))
			{
				if (SyncedInstance<Config>.Instance.team2Suit.Value == 0 || SyncedInstance<Config>.Instance.team1Suit.Value == 1 || SyncedInstance<Config>.Instance.team1Suit.Value == 24 || SyncedInstance<Config>.Instance.team1Suit.Value == 3)
				{
					UnlockShipItem(StartOfRound.Instance, SyncedInstance<Config>.Instance.team1Suit.Value, "Pajama Suit");
				}
				if (SyncedInstance<Config>.Instance.team2Suit.Value == 0 || SyncedInstance<Config>.Instance.team2Suit.Value == 1 || SyncedInstance<Config>.Instance.team2Suit.Value == 24 || SyncedInstance<Config>.Instance.team2Suit.Value == 3)
				{
					UnlockShipItem(StartOfRound.Instance, SyncedInstance<Config>.Instance.team2Suit.Value, "Pajama Suit");
				}
				UnlockShipItem(StartOfRound.Instance, 2, "Hazard Suit");
			}
			if (Plugin.startLogic)
			{
				if (StartOfRound.Instance.shipHasLanded)
				{
					if (Plugin.curHour >= Plugin.nextHour)
					{
					}
					int num = 0;
					int num2 = 0;
					PlayerControllerB[] allPlayerScripts = RoundManager.Instance.playersManager.allPlayerScripts;
					foreach (PlayerControllerB val in allPlayerScripts)
					{
						if (Plugin.teams.ContainsKey(val) && !val.isPlayerDead && val.isPlayerControlled)
						{
							if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, val, 0) == 0)
							{
								num++;
							}
							if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, val, 0) == 1)
							{
								num2++;
							}
						}
					}
					if (num == 0)
					{
						Plugin.startLogic = false;
						Plugin.redScore = -400;
						if (GameNetworkManager.Instance.isHostingGame)
						{
							HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team1ColorCode.Value + ">" + SyncedInstance<Config>.Instance.team1Name.Value + " was team-wiped...", -1);
							StartOfRound.Instance.EndGameServerRpc(-1);
						}
					}
					if (num2 == 0)
					{
						Plugin.startLogic = false;
						Plugin.blueScore = -400;
						if (GameNetworkManager.Instance.isHostingGame)
						{
							HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team2ColorCode.Value + ">" + SyncedInstance<Config>.Instance.team2Name.Value + " was team-wiped...", -1);
							StartOfRound.Instance.EndGameServerRpc(-1);
						}
					}
				}
				((TMP_Text)HudManagerPatch._blueTeam).text = Plugin.blueScore.ToString();
				((TMP_Text)HudManagerPatch._seperator).text = "vs";
				((TMP_Text)HudManagerPatch._redTeam).text = Plugin.redScore.ToString();
				((TMP_Text)HudManagerPatch._seperator).rectTransform.anchoredPosition = new Vector2((float)((((TMP_Text)HudManagerPatch._redTeam).text.Length + 1) * 8), 2f);
				((TMP_Text)HudManagerPatch._blueTeam).rectTransform.anchoredPosition = new Vector2((float)((((TMP_Text)HudManagerPatch._redTeam).text.Length + 1 + ((TMP_Text)HudManagerPatch._seperator).text.Length + 1) * 8), 2f);
			}
			else
			{
				((TMP_Text)HudManagerPatch._redTeam).text = "";
				((TMP_Text)HudManagerPatch._blueTeam).text = "";
				((TMP_Text)HudManagerPatch._seperator).text = "";
			}
		}

		[HarmonyPatch(typeof(TimeOfDay), "UpdateProfitQuotaCurrentTime")]
		[HarmonyPostfix]
		public static void noDeadline(RoundManager __instance)
		{
			TimeOfDay.Instance.timeUntilDeadline = (int)(TimeOfDay.Instance.totalTime * (float)TimeOfDay.Instance.quotaVariables.deadlineDaysAmount);
			((TMP_Text)StartOfRound.Instance.deadlineMonitorText).text = "Competitive\nCompany";
		}

		[HarmonyPatch(typeof(RoundManager), "GenerateNewLevelClientRpc")]
		[HarmonyPostfix]
		private static void gammaPatch(RoundManager __instance)
		{
			Plugin.warnship = true;
			Plugin.blueScore = 0;
			Plugin.startLogic = true;
			Plugin.redScore = 0;
		}

		[HarmonyPatch(typeof(StartMatchLever), "LeverAnimation")]
		[HarmonyPrefix]
		private static bool noLeave(StartMatchLever __instance)
		{
			int num = (int)(TimeOfDay.Instance.normalizedTimeOfDay * (60f * (float)TimeOfDay.Instance.numberOfHours)) + 360;
			int num2 = (int)Mathf.Floor((float)(num / 60));
			if (num2 < SyncedInstance<Config>.Instance.graceTime.Value && Plugin.warnship && RoundManager.Instance.playersManager.shipHasLanded)
			{
				HUDManager.Instance.DisplayTip("Competitive Company", "You can't leave this early!\nIf you want to leave anyways, You will be fined " + SyncedInstance<Config>.Instance.fineAmount.Value + "$ and the ship will leave.", true, false, "LC_Tip1");
				Plugin.warnship = false;
				return false;
			}
			return true;
		}

		private static void UnlockShipItem(StartOfRound instance, int unlockableID, string name)
		{
			try
			{
				MethodInfo method = ((object)instance).GetType().GetMethod("UnlockShipObject", BindingFlags.Instance | BindingFlags.NonPublic);
				method.Invoke(instance, new object[1] { unlockableID });
			}
			catch (NullReferenceException arg)
			{
				Plugin.Instance.mls.LogError((object)$"Could not invoke UnlockShipObject method: {arg}");
			}
		}

		public static Vector3 GetPlayerSpawnPosition(int playerNum, bool simpleTeleport = false)
		{
			//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_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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_0068: 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_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: 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)
			//IL_00b2: 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_019e: 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_00e2: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: 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_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: 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_0251: Unknown result type (might be due to invalid IL or missing references)
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: 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_025f: Unknown result type (might be due to invalid IL or missing references)
			//IL_026f: 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_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: 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_0160: 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_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: 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_0294: Unknown result type (might be due to invalid IL or missing references)
			Transform[] playerSpawnPositions = StartOfRound.Instance.playerSpawnPositions;
			if (simpleTeleport)
			{
				return playerSpawnPositions[0].position;
			}
			Debug.DrawRay(playerSpawnPositions[playerNum].position, Vector3.up, Color.red, 15f);
			if (!Physics.CheckSphere(playerSpawnPositions[playerNum].position, 0.2f, 67108864, (QueryTriggerInteraction)1))
			{
				return playerSpawnPositions[playerNum].position;
			}
			if (!Physics.CheckSphere(playerSpawnPositions[playerNum].position + Vector3.up, 0.2f, 67108864, (QueryTriggerInteraction)1))
			{
				return playerSpawnPositions[playerNum].position + Vector3.up * 0.5f;
			}
			for (int i = 0; i < playerSpawnPositions.Length; i++)
			{
				if (i != playerNum)
				{
					Debug.DrawRay(playerSpawnPositions[i].position, Vector3.up, Color.green, 15f);
					if (!Physics.CheckSphere(playerSpawnPositions[i].position, 0.12f, -67108865, (QueryTriggerInteraction)1))
					{
						return playerSpawnPositions[i].position;
					}
					if (!Physics.CheckSphere(playerSpawnPositions[i].position + Vector3.up, 0.12f, 67108864, (QueryTriggerInteraction)1))
					{
						return playerSpawnPositions[i].position + Vector3.up * 0.5f;
					}
				}
			}
			Random random = new Random(65);
			float y = playerSpawnPositions[0].position.y;
			Vector3 val = default(Vector3);
			for (int j = 0; j < 15; j++)
			{
				Bounds bounds = StartOfRound.Instance.shipInnerRoomBounds.bounds;
				int minValue = (int)((Bounds)(ref bounds)).min.x;
				bounds = StartOfRound.Instance.shipInnerRoomBounds.bounds;
				float num = random.Next(minValue, (int)((Bounds)(ref bounds)).max.x);
				bounds = StartOfRound.Instance.shipInnerRoomBounds.bounds;
				int minValue2 = (int)((Bounds)(ref bounds)).min.z;
				bounds = StartOfRound.Instance.shipInnerRoomBounds.bounds;
				((Vector3)(ref val))..ctor(num, y, (float)random.Next(minValue2, (int)((Bounds)(ref bounds)).max.z));
				val = ((Component)StartOfRound.Instance.shipInnerRoomBounds).transform.InverseTransformPoint(val);
				Debug.DrawRay(val, Vector3.up, Color.yellow, 15f);
				if (!Physics.CheckSphere(val, 0.12f, 67108864, (QueryTriggerInteraction)1))
				{
					return playerSpawnPositions[j].position;
				}
			}
			return playerSpawnPositions[0].position + Vector3.up * 0.5f;
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		[HarmonyPatch(typeof(StartOfRound), "EndOfGame")]
		[HarmonyPostfix]
		private static void undo(StartOfRound __instance)
		{
			Plugin.startLogic = false;
			Plugin.teams.Clear();
			if (!((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer && !((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost)
			{
				return;
			}
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				UnlockableSuit[] array = Object.FindObjectsOfType<UnlockableSuit>(true);
				UnlockableSuit[] array2 = array;
				foreach (UnlockableSuit val2 in array2)
				{
					if (val2.suitID == 2)
					{
						val2.SwitchSuitToThis(val);
					}
				}
			}
		}

		[HarmonyPatch(typeof(StartOfRound), "WritePlayerNotes")]
		[HarmonyPrefix]
		private static void teams()
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if ((!val.disconnectedMidGame && !val.isPlayerDead && !val.isPlayerControlled) || !Plugin.teams.ContainsKey(val))
				{
					continue;
				}
				if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, val, 0) == 0)
				{
					StartOfRound.Instance.gameStats.allPlayerStats[val.playerClientId].playerNotes.Add(SyncedInstance<Config>.Instance.team1Name.Value + " Team");
					if (Plugin.redScore >= Plugin.blueScore)
					{
						StartOfRound.Instance.gameStats.allPlayerStats[val.playerClientId].playerNotes.Add("Won the game!");
					}
					else
					{
						StartOfRound.Instance.gameStats.allPlayerStats[val.playerClientId].playerNotes.Add("Lost the game..");
					}
				}
				if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, val, 0) == 1)
				{
					StartOfRound.Instance.gameStats.allPlayerStats[val.playerClientId].playerNotes.Add(SyncedInstance<Config>.Instance.team2Name.Value + " Team");
					if (Plugin.blueScore >= Plugin.redScore)
					{
						StartOfRound.Instance.gameStats.allPlayerStats[val.playerClientId].playerNotes.Add("Won the game!");
					}
					else
					{
						StartOfRound.Instance.gameStats.allPlayerStats[val.playerClientId].playerNotes.Add("Lost the game..");
					}
				}
			}
		}

		[HarmonyPatch(typeof(StartOfRound), "StartGame")]
		[HarmonyPostfix]
		private static void gammaPatch(StartOfRound __instance)
		{
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			if (!((NetworkBehaviour)__instance).IsServer && !((NetworkBehaviour)__instance).IsHost)
			{
				return;
			}
			PlayerControllerB[] array = (PlayerControllerB[])RoundManager.Instance.playersManager.allPlayerScripts.Clone();
			Randomizer.Randomize(array);
			PlayerControllerB[] array2 = array;
			foreach (PlayerControllerB val in array2)
			{
				if (val.currentSuitID == SyncedInstance<Config>.Instance.team1Suit.Value)
				{
					num2++;
				}
				if (val.currentSuitID == SyncedInstance<Config>.Instance.team2Suit.Value)
				{
					num++;
				}
			}
			PlayerControllerB[] array3 = array;
			foreach (PlayerControllerB val2 in array3)
			{
				if (!val2.isPlayerControlled)
				{
					continue;
				}
				if (val2.currentSuitID != SyncedInstance<Config>.Instance.team1Suit.Value && val2.currentSuitID != SyncedInstance<Config>.Instance.team2Suit.Value)
				{
					if (num2 <= num)
					{
						HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team1ColorCode.Value + ">" + val2.playerUsername + " was put on " + SyncedInstance<Config>.Instance.team1Name.Value + "!", -1);
						num3 = 0;
						num2++;
					}
					else
					{
						HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team2ColorCode.Value + ">" + val2.playerUsername + " was put on " + SyncedInstance<Config>.Instance.team2Name.Value + "!", -1);
						num++;
						num3 = 1;
					}
					if (Plugin.teams.ContainsKey(val2))
					{
						Plugin.teams.Remove(val2);
					}
					Plugin.teams.Add(val2, num3);
				}
				if (val2.currentSuitID == SyncedInstance<Config>.Instance.team1Suit.Value)
				{
					HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team1ColorCode.Value + ">" + val2.playerUsername + " was put on " + SyncedInstance<Config>.Instance.team1Name.Value + "!", -1);
					if (Plugin.teams.ContainsKey(val2))
					{
						Plugin.teams.Remove(val2);
					}
					Plugin.teams.Add(val2, 0);
				}
				if (val2.currentSuitID == SyncedInstance<Config>.Instance.team2Suit.Value)
				{
					HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team2ColorCode.Value + ">" + val2.playerUsername + " was put on " + SyncedInstance<Config>.Instance.team2Name.Value + "!", -1);
					if (Plugin.teams.ContainsKey(val2))
					{
						Plugin.teams.Remove(val2);
					}
					Plugin.teams.Add(val2, 1);
				}
			}
		}

		[HarmonyPatch(typeof(StartOfRound), "EndGameClientRpc")]
		[HarmonyPostfix]
		private static void fine(StartOfRound __instance, ref int playerClientId)
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			if (playerClientId == -1)
			{
				return;
			}
			StartOfRound.Instance.localPlayerController.isInElevator = true;
			StartOfRound.Instance.localPlayerController.isInHangarShipRoom = true;
			StartOfRound.Instance.localPlayerController.isInsideFactory = false;
			StartOfRound.Instance.localPlayerController.TeleportPlayer(RoundManagerPatch.GetPlayerSpawnPosition((int)StartOfRound.Instance.localPlayerController.playerClientId, simpleTeleport: true), false, 0f, false, true);
			PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerClientId];
			if (Plugin.finedForShip)
			{
				return;
			}
			Plugin.finedForShip = true;
			int num = (int)(TimeOfDay.Instance.normalizedTimeOfDay * (60f * (float)TimeOfDay.Instance.numberOfHours)) + 360;
			int num2 = (int)Mathf.Floor((float)(num / 60));
			if (!Plugin.teams.ContainsKey(val) || num2 >= SyncedInstance<Config>.Instance.graceTime.Value)
			{
				return;
			}
			if (DictionaryExtensions.Get<PlayerControllerB, int>((IDictionary<PlayerControllerB, int>)Plugin.teams, val, 0) == 0)
			{
				if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost)
				{
					HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team1ColorCode.Value + ">" + SyncedInstance<Config>.Instance.team1Name.Value + " <color=red>was fined for leaving the ship early...", -1);
					HUDManager.Instance.DisplayTip("Fined!", SyncedInstance<Config>.Instance.team1Name.Value + " was fined for leaving!", true, false, "LC_Tip1");
				}
				Plugin.redScore -= SyncedInstance<Config>.Instance.fineAmount.Value;
			}
			else
			{
				if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsServer || ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost)
				{
					HUDManager.Instance.AddTextToChatOnServer("<color=" + SyncedInstance<Config>.Instance.team2ColorCode.Value + ">" + SyncedInstance<Config>.Instance.team2Name.Value + " <color=red>was fined for leaving the ship early...", -1);
					HUDManager.Instance.DisplayTip("Fined!", SyncedInstance<Config>.Instance.team1Name.Value + " was fined for leaving!", true, false, "LC_Tip1");
				}
				Plugin.blueScore -= SyncedInstance<Config>.Instance.fineAmount.Value;
			}
		}
	}
}