Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Control Company Detector v4.0.3
BepInEx/plugins/ControlCompanyDetector.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using ControlCompanyDetector.Logic; using ControlCompanyDetector.Patches; using HarmonyLib; using LobbyCompatibility.Attributes; using LobbyCompatibility.Features; using LobbyCompatibility.Models; using Microsoft.CodeAnalysis; using Steamworks.Data; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; [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: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace ControlCompanyDetector { [BepInPlugin("JS03.ControlCompanyDetector", "Control Company Detector", "4.0.3")] [BepInDependency(/*Could not decode attribute arguments.*/)] [LobbyCompatibility(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { private const string modGUID = "JS03.ControlCompanyDetector"; private const string modName = "Control Company Detector"; private const string modVersion = "4.0.3"; public static string[] colors; public static List<string> keywords; public static bool canHostDetectEnemySpawning; public static bool clientHasCCFilter; public static bool clientHasRBL; public static PluginInfo problematicPluginInfo; public static ConfigEntry<bool> ignoreFriendlyLobbies; public static ConfigEntry<bool> showCCLobbyPrefix; public static ConfigEntry<bool> highlightCCLobbies; public static ConfigEntry<bool> showControlCompanyLobbiesOnly; public static ConfigEntry<bool> hideControlCompanyLobbies; public static ConfigEntry<bool> detectEnemySpawning; public static ConfigEntry<bool> detectMaskedSpawning; public static ConfigEntry<bool> detectEnemySpawningAsHost; public static ConfigEntry<string> lobbyHighlightColor; public static ConfigEntry<bool> sendChatMessage; private readonly Harmony harmony = new Harmony("JS03.ControlCompanyDetector"); private static Plugin Instance; internal static ManualLogSource mls; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } GenerateColors(); GenerateConfigValues(); GenerateKeywords(); mls = Logger.CreateLogSource("JS03.ControlCompanyDetector"); mls.LogInfo((object)"Control Company Detector has started"); PatchStuff(); } internal void PatchStuff() { harmony.PatchAll(typeof(Plugin)); harmony.PatchAll(typeof(StartOfRoundPatch)); harmony.PatchAll(typeof(LobbyListPatch)); harmony.PatchAll(typeof(LobbySlotPatch)); harmony.PatchAll(typeof(RoundManagerPatch)); harmony.PatchAll(typeof(EnemyVentPatch)); harmony.PatchAll(typeof(MaskedEnemyPatch)); harmony.PatchAll(typeof(MenuManagerPatch)); } internal void GenerateConfigValues() { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown showCCLobbyPrefix = ((BaseUnityPlugin)this).Config.Bind<bool>("Public Lobbies", "Show CC lobby prefix", true, "Lobbies that are certain to use Control Company will have the [CC] prefix in the lobby list\nNOTE: Challenge moon lobbies that have Control Company will always have the [CC] prefix"); highlightCCLobbies = ((BaseUnityPlugin)this).Config.Bind<bool>("Public Lobbies", "Highlight Control Company lobbies", true, "Lobbies that are certain to use Control Company will be highlighted in the lobby list"); lobbyHighlightColor = ((BaseUnityPlugin)this).Config.Bind<string>("Public Lobbies", "Lobby highlight color", "DEFAULT", new ConfigDescription("Changes the color of highlighted lobbies", (AcceptableValueBase)(object)new AcceptableValueList<string>(colors), Array.Empty<object>())); hideControlCompanyLobbies = ((BaseUnityPlugin)this).Config.Bind<bool>("Public Lobbies", "Hide Control Company lobbies", false, "Hides lobbies hosting Control Company"); showControlCompanyLobbiesOnly = ((BaseUnityPlugin)this).Config.Bind<bool>("Public Lobbies", "Only show Control Company lobbies", false, "Only shows lobbies hosting Control Company"); ignoreFriendlyLobbies = ((BaseUnityPlugin)this).Config.Bind<bool>("Private Lobbies", "Ignore friend lobbies", true, "Should the mod completely ignore lobbies created by friends?"); detectEnemySpawning = ((BaseUnityPlugin)this).Config.Bind<bool>("Spawn detection", "Detect enemy spawning", true, "Should the mod be able to detect if an enemy has been spawned by the host? (Only works with indoor enemies)"); detectMaskedSpawning = ((BaseUnityPlugin)this).Config.Bind<bool>("Spawn detection", "Detect Masked enemy spawning", true, "Should the mod be able to detect if a Masked enemy has been spawned by the host?\nDisable this if you're using mods that alter how Masked enemies spawn"); detectEnemySpawningAsHost = ((BaseUnityPlugin)this).Config.Bind<bool>("Spawn detection", "Detect enemy spawning as host", true, "Should the mod be able to detect if an enemy has been spawned by another player when hosting a lobby? (Only works if Detect enemy spawning is enabled)"); sendChatMessage = ((BaseUnityPlugin)this).Config.Bind<bool>("Text Chat", "Send chat message", false, "Sends a message in the chat to let others know when a lobby has Control Company"); } internal static void GenerateKeywords() { keywords = new List<string> { "BrutalCompany", "HullBreaker", "MoreMonsters", "MonstersPlus", "SavageCompany", "Lethal_Company_Variables", "LethalHoardingSwarm", "TitaniumTurbine.EnemySpawner", "Waffle.MaskedWaves" }; } internal static void GenerateColors() { colors = new string[12] { "DEFAULT", "RANDOM", "GREEN", "LIME", "BLUE", "CYAN", "PINK", "PURPLE", "YELLOW", "GRAY", "GREY", "MAROON" }; } public static void CheckProblematicMods() { canHostDetectEnemySpawning = true; Dictionary<string, PluginInfo> pluginInfos = Chainloader.PluginInfos; mls.LogInfo((object)"Getting currently loaded mods..."); foreach (PluginInfo value in pluginInfos.Values) { foreach (string keyword in keywords) { if (value.Metadata.GUID.Contains(keyword)) { mls.LogWarning((object)"A mod that alters how enemies spawn has been detected!"); canHostDetectEnemySpawning = false; problematicPluginInfo = value; return; } } } } public static bool UserHasMod(string modGUID) { Dictionary<string, PluginInfo> pluginInfos = Chainloader.PluginInfos; mls.LogInfo((object)("Checking for " + modGUID + "...")); foreach (PluginInfo value in pluginInfos.Values) { if (value.Metadata.GUID.Equals(modGUID)) { return true; } } return false; } public static void LogInfoMLS(string info) { mls.LogInfo((object)info); } public static void LogWarnMLS(string warn) { mls.LogWarning((object)warn); } } } namespace ControlCompanyDetector.Patches { [HarmonyPatch(typeof(EnemyVent))] internal class EnemyVentPatch { public static int openVentCount; [HarmonyPatch("OpenVentClientRpc")] [HarmonyPostfix] private static void GetOpenVentCount() { openVentCount++; } } internal class LobbyListPatch { [HarmonyPatch(typeof(SteamLobbyManager), "loadLobbyListAndFilter")] [HarmonyPrefix] private static void FilterLobbyList(ref Lobby[] lobbyList, ref Lobby[] ___currentLobbyList) { Plugin.clientHasCCFilter = Plugin.UserHasMod("ControlCompany.ControlCompanyFilter"); Plugin.clientHasRBL = Plugin.UserHasMod("Ryokune.BetterLobbies"); if (Plugin.hideControlCompanyLobbies.Value) { List<Lobby> list = ___currentLobbyList.ToList(); list.RemoveAll(delegate(Lobby lobby) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) LobbyDiff lobbyDiff2 = LobbyHelper.GetLobbyDiff(lobby); if (lobbyDiff2.PluginDiffs.Any((PluginDiff diff) => diff.ServerVersion != null)) { return lobbyDiff2.PluginDiffs.Any((PluginDiff diff) => diff.GUID == "ControlCompany.ControlCompany"); } string data2 = ((Lobby)(ref lobby)).GetData("name"); return data2.Contains('\u200b'); }); lobbyList = (___currentLobbyList = list.ToArray()); } else { if (!Plugin.showControlCompanyLobbiesOnly.Value) { return; } List<Lobby> list2 = ___currentLobbyList.ToList(); list2.RemoveAll(delegate(Lobby lobby) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) LobbyDiff lobbyDiff = LobbyHelper.GetLobbyDiff(lobby); if (lobbyDiff.PluginDiffs.Any((PluginDiff diff) => diff.ServerVersion != null)) { return !lobbyDiff.PluginDiffs.Any((PluginDiff diff) => diff.GUID == "ControlCompany.ControlCompany"); } string data = ((Lobby)(ref lobby)).GetData("name"); bool flag = data.Contains('\u200b'); return !flag; }); lobbyList = (___currentLobbyList = list2.ToArray()); } } } [HarmonyPatch(typeof(LobbySlot))] internal class LobbySlotPatch { private static LobbyDiff lobbyDiff; private static Color outline; private static Color joinHighlight; private static Color text; private static Color slot; private static Color customTextColor; [HarmonyPatch("Awake")] [HarmonyPostfix] private static void AwakePatch(LobbySlot __instance) { if ((Object)(object)__instance != (Object)null) { CoroutineManager.StartCoroutine(ModifySlot(__instance)); } } internal static IEnumerator ModifySlot(LobbySlot lobbySlot) { yield return (object)new WaitForEndOfFrame(); lobbyDiff = LobbyHelper.GetLobbyDiff(lobbySlot.thisLobby); AddCCPrefix(lobbySlot); if (Plugin.highlightCCLobbies.Value) { ChangeHighlightColor(Plugin.lobbyHighlightColor.Value); CreateCustomSlot(lobbySlot, outline, joinHighlight, text, slot, customTextColor, Plugin.clientHasRBL); } else { if (!Plugin.clientHasRBL || !Plugin.clientHasCCFilter) { yield break; } RectTransform[] rectTransforms = Object.FindObjectsOfType<RectTransform>(); RectTransform[] array = rectTransforms; foreach (RectTransform rectTransform in array) { if (((Object)((Component)rectTransform).gameObject).name.Equals("cc")) { ((Transform)rectTransform).localPosition = new Vector3(60f, -12.5f, -7f); rectTransform.sizeDelta = new Vector2(220f, 24f); } } } } internal static void AddCCPrefix(LobbySlot lobbySlot) { bool flag = ((Object)((Component)lobbySlot).transform).name.Contains("Challenge"); string data = ((Lobby)(ref lobbySlot.thisLobby)).GetData("name"); if (lobbyDiff.PluginDiffs.Any((PluginDiff diff) => diff.ServerVersion != null)) { if (lobbyDiff.PluginDiffs.Any((PluginDiff diff) => diff.GUID == "ControlCompany.ControlCompany")) { if (flag) { ((TMP_Text)lobbySlot.LobbyName).SetText("[CC] " + data, true); return; } string text = (Plugin.showCCLobbyPrefix.Value ? "[CC] " : ""); ((TMP_Text)lobbySlot.LobbyName).SetText(text + data, true); } } else if (data.Contains('\u200b')) { if (flag) { ((TMP_Text)lobbySlot.LobbyName).SetText("[CC] " + data, true); return; } string text2 = (Plugin.showCCLobbyPrefix.Value ? "[CC] " : ""); ((TMP_Text)lobbySlot.LobbyName).SetText(text2 + data, true); } } internal static void CreateCustomSlot(LobbySlot lobbySlot, Color outline, Color joinHighlight, Color text, Color slot, Color customTextColor, bool placeLeft) { if (((Object)((Component)lobbySlot).transform).name.Contains("Challenge")) { return; } string data = ((Lobby)(ref lobbySlot.thisLobby)).GetData("name"); if (lobbyDiff.PluginDiffs.Any((PluginDiff diff) => diff.ServerVersion != null)) { if (lobbyDiff.PluginDiffs.Any((PluginDiff diff) => diff.GUID == "ControlCompany.ControlCompany")) { CreateSlotComponents(lobbySlot, placeLeft); } } else if (data.Contains('\u200b')) { CreateSlotComponents(lobbySlot, placeLeft); } } private static void CreateSlotComponents(LobbySlot lobbySlot, bool placeLeft) { //IL_0049: 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_008a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: 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_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) Transform obj = ((Component)lobbySlot).transform.Find("Outline"); Image val = ((obj != null) ? ((Component)obj).GetComponent<Image>() : null); Transform obj2 = ((Component)lobbySlot).transform.Find("JoinButton/SelectionHighlight"); Image val2 = ((obj2 != null) ? ((Component)obj2).GetComponent<Image>() : null); if (Object.op_Implicit((Object)(object)val)) { ((Graphic)val).color = outline; } if (Object.op_Implicit((Object)(object)val2)) { ((Graphic)val2).color = joinHighlight; } TextMeshProUGUI lobbyName = lobbySlot.LobbyName; TextMeshProUGUI playerCount = lobbySlot.playerCount; ((Graphic)lobbyName).color = text; ((Graphic)playerCount).color = text; Image component = ((Component)lobbySlot).GetComponent<Image>(); ((Graphic)component).color = slot; Object.Destroy((Object)(object)GameObject.Find("cc")); GameObject val3 = new GameObject("CCSlot", new Type[1] { typeof(RectTransform) }); RectTransform component2 = val3.GetComponent<RectTransform>(); TextMeshProUGUI val4 = ((Component)component2).gameObject.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val4).fontSize = 21f; ((TMP_Text)val4).text = "CONTROL COMPANY"; ((TMP_Text)val4).alignment = (TextAlignmentOptions)4097; ((TMP_Text)val4).font = ((TMP_Text)playerCount).font; ((Graphic)val4).color = customTextColor; ((Transform)component2).SetParent(((Component)lobbySlot).transform); component2.anchorMin = new Vector2(0f, 1f); component2.anchorMax = new Vector2(0f, 1f); component2.pivot = new Vector2(0f, 1f); ((Transform)component2).localScale = new Vector3(0.8497399f, 0.8497399f, 0.8497399f); ((Transform)component2).localPosition = new Vector3(180f, -15f, -7f); if (placeLeft) { ((Transform)component2).localPosition = new Vector3(60f, -15f, -7f); } component2.sizeDelta = new Vector2(170.5f, 24f); } private static Color GetColorFromRGBA(float r, float b, float g, float a) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) return new Color(r / 255f, b / 255f, g / 255f, a / 255f); } internal static void ChangeHighlightColor(string preset) { //IL_0605: Unknown result type (might be due to invalid IL or missing references) //IL_060a: Unknown result type (might be due to invalid IL or missing references) //IL_0623: Unknown result type (might be due to invalid IL or missing references) //IL_0628: Unknown result type (might be due to invalid IL or missing references) //IL_0641: Unknown result type (might be due to invalid IL or missing references) //IL_0646: Unknown result type (might be due to invalid IL or missing references) //IL_065f: Unknown result type (might be due to invalid IL or missing references) //IL_0664: Unknown result type (might be due to invalid IL or missing references) //IL_067d: Unknown result type (might be due to invalid IL or missing references) //IL_0682: Unknown result type (might be due to invalid IL or missing references) //IL_04cf: Unknown result type (might be due to invalid IL or missing references) //IL_04d4: Unknown result type (might be due to invalid IL or missing references) //IL_04ed: Unknown result type (might be due to invalid IL or missing references) //IL_04f2: Unknown result type (might be due to invalid IL or missing references) //IL_050b: Unknown result type (might be due to invalid IL or missing references) //IL_0510: Unknown result type (might be due to invalid IL or missing references) //IL_0529: Unknown result type (might be due to invalid IL or missing references) //IL_052e: Unknown result type (might be due to invalid IL or missing references) //IL_0547: Unknown result type (might be due to invalid IL or missing references) //IL_054c: 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_01cd: 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_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_0303: Unknown result type (might be due to invalid IL or missing references) //IL_031c: Unknown result type (might be due to invalid IL or missing references) //IL_0321: Unknown result type (might be due to invalid IL or missing references) //IL_033a: Unknown result type (might be due to invalid IL or missing references) //IL_033f: Unknown result type (might be due to invalid IL or missing references) //IL_0358: Unknown result type (might be due to invalid IL or missing references) //IL_035d: Unknown result type (might be due to invalid IL or missing references) //IL_0376: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Unknown result type (might be due to invalid IL or missing references) //IL_073b: Unknown result type (might be due to invalid IL or missing references) //IL_0740: Unknown result type (might be due to invalid IL or missing references) //IL_0759: Unknown result type (might be due to invalid IL or missing references) //IL_075e: Unknown result type (might be due to invalid IL or missing references) //IL_0777: Unknown result type (might be due to invalid IL or missing references) //IL_077c: Unknown result type (might be due to invalid IL or missing references) //IL_0795: Unknown result type (might be due to invalid IL or missing references) //IL_079a: Unknown result type (might be due to invalid IL or missing references) //IL_07b3: Unknown result type (might be due to invalid IL or missing references) //IL_07b8: Unknown result type (might be due to invalid IL or missing references) //IL_056a: Unknown result type (might be due to invalid IL or missing references) //IL_056f: Unknown result type (might be due to invalid IL or missing references) //IL_0588: Unknown result type (might be due to invalid IL or missing references) //IL_058d: Unknown result type (might be due to invalid IL or missing references) //IL_05a6: Unknown result type (might be due to invalid IL or missing references) //IL_05ab: Unknown result type (might be due to invalid IL or missing references) //IL_05c4: Unknown result type (might be due to invalid IL or missing references) //IL_05c9: Unknown result type (might be due to invalid IL or missing references) //IL_05e2: Unknown result type (might be due to invalid IL or missing references) //IL_05e7: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) //IL_0286: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02c2: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_06a0: Unknown result type (might be due to invalid IL or missing references) //IL_06a5: Unknown result type (might be due to invalid IL or missing references) //IL_06be: Unknown result type (might be due to invalid IL or missing references) //IL_06c3: Unknown result type (might be due to invalid IL or missing references) //IL_06dc: Unknown result type (might be due to invalid IL or missing references) //IL_06e1: Unknown result type (might be due to invalid IL or missing references) //IL_06fa: Unknown result type (might be due to invalid IL or missing references) //IL_06ff: Unknown result type (might be due to invalid IL or missing references) //IL_0718: Unknown result type (might be due to invalid IL or missing references) //IL_071d: Unknown result type (might be due to invalid IL or missing references) //IL_0434: Unknown result type (might be due to invalid IL or missing references) //IL_0439: Unknown result type (might be due to invalid IL or missing references) //IL_0452: Unknown result type (might be due to invalid IL or missing references) //IL_0457: Unknown result type (might be due to invalid IL or missing references) //IL_0470: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Unknown result type (might be due to invalid IL or missing references) //IL_048e: Unknown result type (might be due to invalid IL or missing references) //IL_0493: Unknown result type (might be due to invalid IL or missing references) //IL_04ac: Unknown result type (might be due to invalid IL or missing references) //IL_04b1: Unknown result type (might be due to invalid IL or missing references) //IL_0399: Unknown result type (might be due to invalid IL or missing references) //IL_039e: Unknown result type (might be due to invalid IL or missing references) //IL_03b7: Unknown result type (might be due to invalid IL or missing references) //IL_03bc: Unknown result type (might be due to invalid IL or missing references) //IL_03d5: Unknown result type (might be due to invalid IL or missing references) //IL_03da: Unknown result type (might be due to invalid IL or missing references) //IL_03f3: Unknown result type (might be due to invalid IL or missing references) //IL_03f8: Unknown result type (might be due to invalid IL or missing references) //IL_0411: Unknown result type (might be due to invalid IL or missing references) //IL_0416: Unknown result type (might be due to invalid IL or missing references) if (preset.Equals("RANDOM")) { int num = Random.Range(2, Plugin.colors.Length); preset = Plugin.colors[num]; } switch (preset) { case "BLUE": outline = GetColorFromRGBA(0f, 0f, 255f, 255f); joinHighlight = GetColorFromRGBA(50f, 50f, 255f, 255f); text = GetColorFromRGBA(100f, 100f, 255f, 255f); slot = GetColorFromRGBA(0f, 0f, 125f, 64f); customTextColor = GetColorFromRGBA(0f, 0f, 175f, 127f); break; case "GREEN": outline = GetColorFromRGBA(0f, 155f, 0f, 255f); joinHighlight = GetColorFromRGBA(0f, 165f, 0f, 255f); text = GetColorFromRGBA(0f, 175f, 0f, 255f); slot = GetColorFromRGBA(0f, 90f, 0f, 64f); customTextColor = GetColorFromRGBA(0f, 120f, 0f, 127f); break; case "LIME": outline = GetColorFromRGBA(0f, 235f, 0f, 235f); joinHighlight = GetColorFromRGBA(20f, 235f, 20f, 255f); text = GetColorFromRGBA(70f, 235f, 70f, 255f); slot = GetColorFromRGBA(0f, 125f, 0f, 64f); customTextColor = GetColorFromRGBA(0f, 175f, 0f, 127f); break; case "CYAN": outline = GetColorFromRGBA(0f, 235f, 235f, 235f); joinHighlight = GetColorFromRGBA(72f, 235f, 235f, 255f); text = GetColorFromRGBA(98f, 235f, 235f, 255f); slot = GetColorFromRGBA(0f, 130f, 130f, 64f); customTextColor = GetColorFromRGBA(0f, 170f, 170f, 127f); break; case "PINK": outline = GetColorFromRGBA(232f, 136f, 220f, 255f); joinHighlight = GetColorFromRGBA(232f, 145f, 222f, 255f); text = GetColorFromRGBA(233f, 161f, 223f, 255f); slot = GetColorFromRGBA(252f, 156f, 240f, 15f); customTextColor = GetColorFromRGBA(252f, 165f, 242f, 63f); break; case "PURPLE": outline = GetColorFromRGBA(255f, 35f, 255f, 255f); joinHighlight = GetColorFromRGBA(255f, 85f, 255f, 255f); text = GetColorFromRGBA(255f, 90f, 255f, 255f); slot = GetColorFromRGBA(145f, 0f, 145f, 64f); customTextColor = GetColorFromRGBA(190f, 0f, 190f, 127f); break; case "YELLOW": outline = GetColorFromRGBA(235f, 235f, 0f, 255f); joinHighlight = GetColorFromRGBA(235f, 235f, 75f, 255f); text = GetColorFromRGBA(235f, 235f, 85f, 255f); slot = GetColorFromRGBA(125f, 125f, 0f, 64f); customTextColor = GetColorFromRGBA(165f, 165f, 0f, 127f); break; case "GRAY": case "GREY": outline = GetColorFromRGBA(128f, 128f, 128f, 255f); joinHighlight = GetColorFromRGBA(158f, 158f, 158f, 255f); text = GetColorFromRGBA(168f, 168f, 168f, 255f); slot = GetColorFromRGBA(75f, 75f, 75f, 64f); customTextColor = GetColorFromRGBA(100f, 100f, 100f, 127f); break; case "MAROON": outline = GetColorFromRGBA(158f, 49f, 72f, 255f); joinHighlight = GetColorFromRGBA(210f, 0f, 72f, 255f); text = GetColorFromRGBA(205f, 71f, 100f, 255f); slot = GetColorFromRGBA(158f, 49f, 72f, 64f); customTextColor = GetColorFromRGBA(150f, 60f, 89f, 127f); break; default: outline = GetColorFromRGBA(158f, 49f, 72f, 255f); joinHighlight = GetColorFromRGBA(210f, 0f, 72f, 255f); text = GetColorFromRGBA(205f, 71f, 100f, 255f); slot = GetColorFromRGBA(158f, 49f, 72f, 64f); customTextColor = GetColorFromRGBA(150f, 60f, 89f, 127f); break; } } } [HarmonyPatch(typeof(MaskedPlayerEnemy))] internal class MaskedEnemyPatch { [HarmonyPatch("CreateMimicClientRpc")] [HarmonyPostfix] private static void CreateMimicPatch() { RoundManagerPatch.maskDeaths++; } } [HarmonyPatch(typeof(MenuManager))] internal class MenuManagerPatch { [HarmonyPatch("ConfirmHostButton")] [HarmonyPrefix] private static void CheckIfHostCanDetectEnemySpawning() { if (Plugin.detectEnemySpawningAsHost.Value) { Plugin.CheckProblematicMods(); } } } [HarmonyPatch(typeof(RoundManager))] internal class RoundManagerPatch : MonoBehaviour { internal static int enemyCount; internal static int previousEnemyCount; internal static int previousOpenVentCount; public static int maskDeaths; internal static int previousMaskDeaths; internal static EnemyAI spawnedEnemy; [HarmonyPatch("Start")] [HarmonyPostfix] private static void DisplayHostOnlyMsg() { if (!Plugin.canHostDetectEnemySpawning && Plugin.detectEnemySpawningAsHost.Value && ((NetworkBehaviour)StartOfRound.Instance).IsHost) { CoroutineManager.StartCoroutine(Detector.SendDelayedUITip("Control Company Detector:", "<size=15>Detect enemy spawning as host has been disabled because you have the following mod installed:</size>\n" + Plugin.problematicPluginInfo.Metadata.Name, warning: false, 3.5f)); } } [HarmonyPatch("Update")] [HarmonyPrefix] private static void PatchUpdate() { if (!((NetworkBehaviour)StartOfRound.Instance).IsHost) { if (Detector.canClientDetectEnemySpawning) { StartSpawnDetection(); } } else if (Plugin.detectEnemySpawningAsHost.Value && Plugin.canHostDetectEnemySpawning) { StartSpawnDetection(); } } internal static void StartSpawnDetection() { if (Plugin.detectEnemySpawning.Value) { if (!Detector.clientIsFriendsWithHost) { DetectEnemySpawning(); } else if (((NetworkBehaviour)StartOfRound.Instance).IsHost) { DetectEnemySpawning(); } else if (!Plugin.ignoreFriendlyLobbies.Value) { DetectEnemySpawning(); } } } internal static void DetectEnemySpawning() { EnemyAI[] array = Object.FindObjectsOfType<EnemyAI>(); enemyCount = array.Length; if (enemyCount > previousEnemyCount) { spawnedEnemy = array[0]; DetectIndoorsEnemySpawning(); previousOpenVentCount = EnemyVentPatch.openVentCount; } previousEnemyCount = enemyCount; } internal static void DetectIndoorsEnemySpawning() { if (IsEnemyTypeValid()) { if (EnemyVentPatch.openVentCount <= previousOpenVentCount) { DisplayEnemyMessage(); } } else if (Plugin.detectMaskedSpawning.Value) { DetectMaskedEnemySpawning(); } } internal static void DetectMaskedEnemySpawning() { if (((object)spawnedEnemy).GetType() == typeof(MaskedPlayerEnemy) && EnemyVentPatch.openVentCount <= previousOpenVentCount && previousMaskDeaths == maskDeaths) { DisplayEnemyMessage(); } previousMaskDeaths = maskDeaths; } internal static void DisplayEnemyMessage() { Plugin.LogWarnMLS("An enemy has spawned in an abnormal manner"); if (Detector.hostHasCC) { Detector.SendUITip("WARNING:", "The host has spawned " + FormatEnemyName(spawnedEnemy, upper: false), warning: false); } else if (((NetworkBehaviour)StartOfRound.Instance).IsHost) { Detector.SendUITip("WARNING:", FormatEnemyName(spawnedEnemy, upper: true) + " has been spawned by a player", warning: false); } } internal static string FormatEnemyName(EnemyAI enemy, bool upper) { string text = (upper ? "A " : "a "); if (((object)enemy).GetType() == typeof(FlowermanAI)) { return text + "Bracken"; } if (((object)enemy).GetType() == typeof(SpringManAI)) { return text + "Coil-Head"; } if (((object)enemy).GetType() == typeof(BlobAI)) { return text + "Hygrodere"; } if (((object)enemy).GetType() == typeof(PufferAI)) { return text + "Spore Lizard"; } if (((object)enemy).GetType() == typeof(CrawlerAI)) { return text + "Thumper"; } if (((object)enemy).GetType() == typeof(HoarderBugAI)) { return (Random.Range(0, 4) == 0) ? (text + "Yippee Bug") : (text + "Hoarding Bug"); } if (((object)enemy).GetType() == typeof(NutcrackerEnemyAI)) { return text + "Nutcracker"; } if (((object)enemy).GetType() == typeof(CentipedeAI)) { return text + "Snare Flea"; } if (((object)enemy).GetType() == typeof(SandSpiderAI)) { return text + "Bunker Spider"; } if (((object)enemy).GetType() == typeof(JesterAI)) { return text + "Jester"; } if (((object)enemy).GetType() == typeof(MaskedPlayerEnemy)) { return text + "Masked Employee"; } if (((object)enemy).GetType() == typeof(LassoManAI)) { return text + "Lasso Man"; } if (((object)enemy).GetType() == typeof(TestEnemy)) { text = (upper ? "An " : "an "); return text + "Obunga"; } if (((object)enemy).GetType() == typeof(ButlerEnemyAI)) { return text + "Butler"; } if (((object)enemy).GetType() == typeof(ClaySurgeonAI)) { return text + "Barber"; } if (((object)enemy).GetType() == typeof(CaveDwellerAI)) { return text + "Maneater"; } return text + "[REDACTED]"; } internal static bool IsEnemyTypeValid() { return ((object)spawnedEnemy).GetType() == typeof(FlowermanAI) || ((object)spawnedEnemy).GetType() == typeof(SpringManAI) || ((object)spawnedEnemy).GetType() == typeof(BlobAI) || ((object)spawnedEnemy).GetType() == typeof(PufferAI) || ((object)spawnedEnemy).GetType() == typeof(CrawlerAI) || ((object)spawnedEnemy).GetType() == typeof(HoarderBugAI) || ((object)spawnedEnemy).GetType() == typeof(NutcrackerEnemyAI) || ((object)spawnedEnemy).GetType() == typeof(CentipedeAI) || ((object)spawnedEnemy).GetType() == typeof(SandSpiderAI) || ((object)spawnedEnemy).GetType() == typeof(JesterAI) || ((object)spawnedEnemy).GetType() == typeof(LassoManAI) || ((object)spawnedEnemy).GetType() == typeof(TestEnemy) || ((object)spawnedEnemy).GetType() == typeof(ButlerEnemyAI) || ((object)spawnedEnemy).GetType() == typeof(ClaySurgeonAI) || ((object)spawnedEnemy).GetType() == typeof(CaveDwellerAI); } } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatch : MonoBehaviour { [HarmonyPatch("OnPlayerConnectedClientRpc")] [HarmonyPostfix] private static void PatchOnPlayerConnected() { if ((Object)(object)HUDManager.Instance != (Object)null) { CoroutineManager.StartCoroutine(Detector.StartDetection()); } } } } namespace ControlCompanyDetector.Logic { public static class CoroutineManager { internal class CoroutineManagerBehaviour : MonoBehaviour { } private static MonoBehaviour _instance; private static MonoBehaviour instance { get { //IL_0016: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_instance == (Object)null) { _instance = (MonoBehaviour)(object)new GameObject("CoroutineManager").AddComponent<CoroutineManagerBehaviour>(); } return _instance; } } public static Coroutine StartCoroutine(IEnumerator routine) { return instance.StartCoroutine(routine); } } internal static class Detector { public static bool hostHasCC; public static bool clientIsFriendsWithHost; public static bool canClientDetectEnemySpawning; public static IEnumerator StartDetection() { Plugin.LogInfoMLS("Checking if host and client are friends..."); yield return (object)new WaitForSeconds(3.5f); clientIsFriendsWithHost = true; if (!StartOfRound.Instance.IsClientFriendsWithHost()) { clientIsFriendsWithHost = false; Detect(); } else if (!Plugin.ignoreFriendlyLobbies.Value) { Detect(); } } internal static void Detect() { //IL_0085: Unknown result type (might be due to invalid IL or missing references) Plugin.LogInfoMLS("Detection started"); Plugin.LogInfoMLS("Lobby name: " + GameNetworkManager.Instance.steamLobbyName); hostHasCC = false; canClientDetectEnemySpawning = true; if (!((Object)(object)GameNetworkManager.Instance != (Object)null)) { return; } bool hasValue = GameNetworkManager.Instance.currentLobby.HasValue; Plugin.LogInfoMLS("Is the lobby a steam lobby? -> " + hasValue); if (!hasValue) { return; } LobbyDiff lobbyDiff = LobbyHelper.GetLobbyDiff(GameNetworkManager.Instance.currentLobby.GetValueOrDefault()); if (lobbyDiff.PluginDiffs.Any((PluginDiff diff) => diff.ServerVersion != null)) { if (lobbyDiff.PluginDiffs.Any((PluginDiff diff) => diff.GUID == "ControlCompany.ControlCompany")) { DisplayWarning(); } { foreach (PluginDiff pluginDiff in lobbyDiff.PluginDiffs) { foreach (string keyword in Plugin.keywords) { if (pluginDiff.GUID.Contains(keyword)) { canClientDetectEnemySpawning = false; Plugin.LogWarnMLS("The host is using a mod that alters enemy spawning!"); SendUITip("Control Company Detector:", "<size=15>Detect enemy spawning has been disabled because the host has the following mod installed:</size>\n" + pluginDiff.GUID, warning: false); return; } } } return; } } if (GameNetworkManager.Instance.steamLobbyName.Contains('\u200b')) { DisplayWarning(); } } internal static void DisplayWarning() { hostHasCC = true; Plugin.LogWarnMLS("Control Company has been detected!"); SendUITip("WARNING:", "The host is using Control Company", warning: true); if (Plugin.sendChatMessage.Value) { HUDManager.Instance.AddTextToChatOnServer("<color=#FF0000>Control Company Detector</color>:<color=#FFFF00> Hey! " + RoundManager.Instance.playersManager.allPlayerScripts[0].playerUsername + " is using Control Company!</color>", -1); } } internal static void SendUITip(string header, string message, bool warning) { Plugin.LogInfoMLS("Displaying HUD message"); HUDManager.Instance.DisplayTip(header, message, warning, false, "LC_Tip1"); } public static IEnumerator SendDelayedUITip(string header, string message, bool warning, float delay) { Plugin.LogInfoMLS("Sending a delayed message..."); yield return (object)new WaitForSeconds(delay); Plugin.LogInfoMLS("Displaying HUD message"); HUDManager.Instance.DisplayTip(header, message, warning, false, "LC_Tip1"); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }