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 Troll mod v1.0.2
TrollMod.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net.Http; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text.RegularExpressions; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalCompanyTrollMenuMod.Component; using LethalCompanyTrollMenuMod.helpers; using LethalCompanyTrollMenuMod.tabs; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("TrollMod")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("TrollMod")] [assembly: AssemblyTitle("TrollMod")] [assembly: AssemblyVersion("1.0.0.0")] namespace LethalCompanyTrollMenuMod { internal enum MessageType { ERROR, SUCCESS, INFO } internal class Message { public MessageType type = MessageType.INFO; public string message; public string copybuffer; public Message(string message, MessageType type) { this.message = message; this.type = type; copybuffer = message; } public Message(string message, MessageType type, string copybuffer) { this.message = message; this.type = type; this.copybuffer = copybuffer; } } internal class TrollConsole : MonoBehaviour { public static TrollConsole Instance; public static bool showConsole = false; public static List<Message> messages = new List<Message>(); private static Vector2 scrollViewVector = Vector2.zero; private static KeyCode key = (KeyCode)283; private void OnGUI() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: 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_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) if (!showConsole) { return; } Rect val = default(Rect); ((Rect)(ref val))..ctor(0f, 0f, 400f, (float)(messages.Count * 30)); scrollViewVector = GUI.BeginScrollView(new Rect((float)(Screen.width - Screen.width / 2), (float)(Screen.height - Screen.height / 2), (float)(Screen.width / 2), (float)(Screen.height / 2)), scrollViewVector, val); int num = 0; Rect val2 = default(Rect); foreach (Message message in messages) { ((Rect)(ref val2))..ctor(0f, (float)num, (float)Screen.width, 25f); num += 25; switch (message.type) { case MessageType.ERROR: GUI.Label(val2, "[ERROR] " + message.message, TrollMenuStyle.errorStyle); break; case MessageType.SUCCESS: GUI.Label(val2, "[SUCCESS] " + message.message, TrollMenuStyle.successStyle); break; case MessageType.INFO: GUI.Label(val2, "[INFO] " + message.message, TrollMenuStyle.infoStyle); break; } if ((int)Event.current.type == 0 && Event.current.button == 0 && ((Rect)(ref val2)).Contains(Event.current.mousePosition)) { GUIUtility.systemCopyBuffer = message.copybuffer; if (message.copybuffer.StartsWith("http")) { Process.Start(message.copybuffer); } } } GUI.EndScrollView(); } private void Update() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut val = new KeyboardShortcut(key, Array.Empty<KeyCode>()); if (((KeyboardShortcut)(ref val)).IsUp()) { showConsole = !showConsole; } } public static void DisplayMessage(string message, MessageType type = MessageType.INFO) { DisplayMessage(message, message, type); } public static void DisplayMessage(string message, string copybuffer, MessageType type = MessageType.INFO) { if (type == MessageType.ERROR) { showConsole = true; } if (messages.Count > 1000) { messages.RemoveAt(0); } messages.Add(new Message(message, type, copybuffer)); scrollViewVector.y = messages.Count * 30; } private void Awake() { TrollMenu.mls.LogInfo((object)"LOADED CONSOLE"); GetRequest("https://thunderstore.io/api/experimental/package/TrollNation/Troll_mod/", checkVersion); } private void checkVersion(string response) { response = response.Replace(" ", ""); string value = Regex.Match(response, "\"version_number\"[ ]*:[ ]*\"[0-9\\.]+\"").Value; TrollMenu.mls.LogInfo((object)("Version : " + value)); value = value.Replace("\"", ""); value = value.Split(new char[1] { ':' })[1]; if (value != "1.0.2") { showConsole = true; DisplayMessage("You have version (1.0.2)"); DisplayMessage("There is a new version of the mod available (" + value + ")", MessageType.SUCCESS); DisplayMessage("You can download it at https://thunderstore.io/c/lethal-company/p/TrollNation/Troll_mod/", "https://thunderstore.io/c/lethal-company/p/TrollNation/Troll_mod/", MessageType.SUCCESS); DisplayMessage("You can click the link to copy it"); DisplayMessage("You can close this by pressing " + ((object)(KeyCode)(ref key)).ToString()); } } private async Task GetRequest(string uri, Action<string> success = null, Action<int> failed = null) { HttpClient client = new HttpClient(); try { HttpResponseMessage response = await client.GetAsync(uri); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); success?.Invoke(responseBody); } else { failed?.Invoke((int)response.StatusCode); } } catch (HttpRequestException val) { HttpRequestException val2 = val; HttpRequestException e = val2; failed?.Invoke(-1); TrollMenu.mls.LogError((object)("Exception: " + ((Exception)(object)e).Message)); } finally { ((IDisposable)client)?.Dispose(); } } } [BepInPlugin("Nico78916.TrollMenu", "Lethal Company Troll Menu", "1.0.2")] public class TrollMenu : BaseUnityPlugin { [HarmonyPatch] public class EnemyAIUpdatePatch { private static void Postfix(EnemyAI __instance) { if (AliveEnemies.frozenEnemies.ContainsKey(__instance) && AliveEnemies.frozenEnemies[__instance]) { __instance.agent.speed = 0f; } } private static bool Prefix(EnemyAI __instance) { return true; } } private const string modGUID = "Nico78916.TrollMenu"; private const string modName = "Lethal Company Troll Menu"; public const string modVersion = "1.0.2"; private readonly Harmony harmony = new Harmony("Nico78916.TrollMenu"); public static PlayerControllerB playerRef; internal static TabManager Window; private static GameObject obj; public static Dictionary<string, EnemyType> insideEnemies = new Dictionary<string, EnemyType>(); public static Dictionary<string, EnemyType> outsideEnemies = new Dictionary<string, EnemyType>(); public static Dictionary<string, AnomalyType> anomalies = new Dictionary<string, AnomalyType>(); public static Dictionary<string, SpawnableMapObject> deadlyobjects = new Dictionary<string, SpawnableMapObject>(); public static bool isInGame = false; public static EnemyVent[] enemyVentsCache = (EnemyVent[])(object)new EnemyVent[0]; public static GameObject[] outsideSpawn = (GameObject[])(object)new GameObject[0]; public static RoundManager roundManager; public static Dictionary<string, PlayerControllerB> alivePlayers = new Dictionary<string, PlayerControllerB>(); public static Dictionary<string, PlayerControllerB> deadPlayers = new Dictionary<string, PlayerControllerB>(); public static Dictionary<string, PlayerControllerB> allPlayers = new Dictionary<string, PlayerControllerB>(); public static List<EnemyAI> stoppedEnemies = new List<EnemyAI>(); private static RandomMapObject[] randomMapObjects = (RandomMapObject[])(object)new RandomMapObject[0]; public static ManualLogSource mls { get; private set; } public static List<EnemyAI> aliveEnemies { get { if (!isInGame || (Object)(object)roundManager == (Object)null) { return new List<EnemyAI>(); } return roundManager.SpawnedEnemies; } } private Assembly getGameAssembly() { Assembly executingAssembly = Assembly.GetExecutingAssembly(); string location = executingAssembly.Location; string[] array = location.Split(new char[1] { '\\' }); int num = Array.IndexOf(array, "Lethal Company"); List<string> list = new List<string>(); for (int i = 0; i <= num; i++) { list.Add(array[i]); } list.Add("Lethal Company_Data"); list.Add("Managed"); list.Add("Assembly-CSharp.dll"); string text = string.Join("\\", list.ToArray()); mls.LogInfo((object)text); return Assembly.LoadFile(text); } private void Awake() { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Expected O, but got Unknown //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Expected O, but got Unknown mls = Logger.CreateLogSource("TrollMenu"); mls.LogInfo((object)"Loaded Nico78916.TrollMenu. Patching."); harmony.PatchAll(typeof(TrollMenu)); mls = ((BaseUnityPlugin)this).Logger; mls.LogInfo((object)"Creating Menu"); TrollMenu.obj = new GameObject("TrollMenu"); Object.DontDestroyOnLoad((Object)(object)TrollMenu.obj); ((Object)TrollMenu.obj).hideFlags = (HideFlags)61; TrollMenu.obj.AddComponent<TabManager>(); TrollMenu.obj.AddComponent<TrollConsole>(); Window = TrollMenu.obj.GetComponent<TabManager>(); TrollMenuStyle.Awake(); IEnumerable<Type> enumerable = from t in getGameAssembly().GetTypes() where t.IsSubclassOf(typeof(EnemyAI)) select t; mls.LogInfo((object)(enumerable.Count() + " subclasses of EnemyAI found")); foreach (Type item in enumerable) { mls.LogInfo((object)("Found " + item.Name + " as subclass of EnemyAI")); Harmony obj = harmony; MethodInfo methodInfo = AccessTools.Method(item, "Update", (Type[])null, (Type[])null); HarmonyMethod val = new HarmonyMethod(typeof(EnemyAIUpdatePatch), "Postfix", (Type[])null); obj.Patch((MethodBase)methodInfo, new HarmonyMethod(typeof(EnemyAIUpdatePatch), "Prefix", (Type[])null), val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } MethodInfo[] methods = typeof(EnemyAI).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic); MethodInfo[] array = methods; foreach (MethodInfo methodInfo2 in array) { mls.LogInfo((object)methodInfo2.Name); } } public EnemyAI[] FindAliveEnemies() { if (!isInGame) { return (EnemyAI[])(object)new EnemyAI[0]; } return Object.FindObjectsOfType<EnemyAI>(); } [HarmonyPatch(typeof(RoundManager), "LoadNewLevel")] [HarmonyPrefix] public static bool LoadNewLevelPatch(ref RoundManager __instance) { roundManager = __instance; roundManager.mapPropsContainer = GameObject.FindGameObjectWithTag("MapPropsContainer"); EnemyType[] array = Resources.FindObjectsOfTypeAll<EnemyType>(); EnemyType[] array2 = array; foreach (EnemyType val in array2) { if (val.isOutsideEnemy) { if (!outsideEnemies.ContainsKey(((Object)val).name)) { outsideEnemies.Add(((Object)val).name, val); } } else if (!insideEnemies.ContainsKey(((Object)val).name)) { insideEnemies.Add(((Object)val).name, val); } mls.LogInfo((object)("Added " + ((Object)val).name + " (" + (val.isOutsideEnemy ? "outside" : "inside") + ") to the list")); } mls.LogInfo((object)("Found " + array.Length + " EnemyType")); EnemyType[] array3 = array; foreach (EnemyType val2 in array3) { mls.LogInfo((object)("\t" + val2.enemyName)); } return true; } [HarmonyPatch(typeof(RoundManager), "SpawnScrapInLevel")] [HarmonyPrefix] public static bool SpawnScrapInLevelPatch(ref RoundManager __instance) { if (ScrapMenu.randomValue) { mls.LogError((object)"Random Scrap Value is activated"); mls.LogInfo((object)("Min Scrap Value: " + ScrapMenu.minScrapValue)); mls.LogInfo((object)("Max Scrap Value: " + ScrapMenu.maxScrapValue)); __instance.currentLevel.maxTotalScrapValue = ScrapMenu.maxScrapValue; __instance.currentLevel.minTotalScrapValue = ScrapMenu.minScrapValue; } if (ScrapMenu.randomAmount) { mls.LogError((object)"Random Scrap Amount is activated"); mls.LogInfo((object)("Min Scrap: " + ScrapMenu.minScrap)); mls.LogInfo((object)("Max Scrap: " + ScrapMenu.maxScrap)); __instance.currentLevel.minScrap = ScrapMenu.minScrap; __instance.currentLevel.maxScrap = ScrapMenu.maxScrap; } if (!ScrapMenu.randomAmount && !ScrapMenu.randomValue) { mls.LogError((object)"No Scrap changes detected"); } return true; } [HarmonyPatch(typeof(RoundManager), "GeneratedFloorPostProcessing")] [HarmonyPostfix] public static void GeneratedFloorPostProcessingPatch(ref RoundManager __instance) { randomMapObjects = Object.FindObjectsOfType<RandomMapObject>(); mls.LogError((object)("Found " + randomMapObjects.Length + " RandomMapObject")); SpawnableMapObject[] spawnableMapObjects = __instance.spawnableMapObjects; mls.LogInfo((object)("Found " + spawnableMapObjects.Length + " SpawnableMapObject")); SpawnableMapObject[] array = spawnableMapObjects; foreach (SpawnableMapObject val in array) { mls.LogInfo((object)("Found " + ((Object)val.prefabToSpawn).name)); if (!deadlyobjects.ContainsKey(((Object)val.prefabToSpawn).name)) { deadlyobjects.Add(((Object)val.prefabToSpawn).name, val); } } } [HarmonyPatch(typeof(ItemDropship), "ShipLeave")] [HarmonyPostfix] public static void OnShipLeave() { mls.LogInfo((object)"Ship left"); SpawnMenu.currentPlayer = null; } [HarmonyPatch(typeof(EnemyAI), "Start")] [HarmonyPrefix] public static bool EnemyAIStartPatch(ref EnemyAI __instance) { return true; } private static void SpawnInsideEnemy(EnemyType enemy, EnemyVent vent) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) SpawnEnemy(enemy, ((Component)vent).transform.position, isOutside: false); } public static void SpawnInsideEnemy(EnemyType enemy) { enemyVentsCache = Object.FindObjectsOfType<EnemyVent>(); if ((Object)(object)enemy == (Object)null) { mls.LogError((object)"Enemy is null"); return; } if ((Object)(object)enemy.enemyPrefab == (Object)null) { mls.LogError((object)"Enemy Prefab is null"); return; } if (enemy.isOutsideEnemy) { mls.LogError((object)"Enemy is outside enemy"); return; } if (enemyVentsCache.Length == 0) { mls.LogError((object)"No vents found"); return; } EnemyVent val = enemyVentsCache[Random.Range(0, enemyVentsCache.Length)]; if ((Object)(object)val == (Object)null) { mls.LogError((object)"Vent is null"); } else { SpawnInsideEnemy(enemy, val); } } public static void SpawnOutsideEnemy(EnemyType enemy) { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_012c: 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_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) outsideSpawn = GameObject.FindGameObjectsWithTag("OutsideAINode"); if ((Object)(object)enemy == (Object)null) { mls.LogError((object)"Enemy is null"); return; } if ((Object)(object)enemy.enemyPrefab == (Object)null) { mls.LogError((object)"Enemy Prefab is null"); return; } if (!enemy.isOutsideEnemy) { mls.LogError((object)"Enemy is inside enemy"); return; } if (outsideSpawn.Length == 0) { mls.LogError((object)"No outside spawn found"); return; } GameObject[] array = outsideSpawn; if (array == null) { mls.LogError((object)"No spawnPoints"); return; } Vector3 randomNavMeshPositionInRadius = roundManager.GetRandomNavMeshPositionInRadius(array[roundManager.AnomalyRandom.Next(0, array.Length)].transform.position, 4f, default(NavMeshHit)); int num = 0; bool flag = false; for (int i = 0; i < array.Length - 1; i++) { for (int j = 0; j < roundManager.spawnDenialPoints.Length; j++) { flag = true; if ((double)Vector3.Distance(randomNavMeshPositionInRadius, roundManager.spawnDenialPoints[j].transform.position) < 16.0) { num = (num + 1) % array.Length; randomNavMeshPositionInRadius = roundManager.GetRandomNavMeshPositionInRadius(array[num].transform.position, 4f, default(NavMeshHit)); flag = false; break; } } if (flag) { break; } } SpawnEnemy(enemy, randomNavMeshPositionInRadius, isOutside: true); } public static EnemyAI SpawnEnemy(EnemyType enemy, Vector3 position, bool isOutside) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) GameObject enemyPrefab = enemy.enemyPrefab; GameObject val = Object.Instantiate<GameObject>(enemy.enemyPrefab, position, Quaternion.Euler(Vector3.zero)); val.SetActive(false); EnemyAI component = val.GetComponent<EnemyAI>(); roundManager.SpawnedEnemies.Add(component); EnemyType enemyType = val.GetComponent<EnemyAI>().enemyType; enemyType.numberSpawned++; component.isOutside = isOutside; val.SetActive(true); val.gameObject.GetComponentInChildren<NetworkObject>().Spawn(true); string[] obj = new string[7] { "Spawned ", enemy.enemyName, " at ", null, null, null, null }; Vector3 val2 = position; obj[3] = ((object)(Vector3)(ref val2)).ToString(); obj[4] = "("; obj[5] = (isOutside ? "outside" : "inside"); obj[6] = ")"; TrollConsole.DisplayMessage(string.Concat(obj), MessageType.SUCCESS); return component; } public static void SpawnEnemyInsideNearPlayer(EnemyType enemy, PlayerControllerB player) { TrollConsole.DisplayMessage("Spawning " + enemy.enemyName + " near " + player.playerUsername); enemyVentsCache = Object.FindObjectsOfType<EnemyVent>(); if ((Object)(object)enemy == (Object)null) { mls.LogError((object)"Enemy is null"); return; } if ((Object)(object)enemy.enemyPrefab == (Object)null) { mls.LogError((object)"Enemy Prefab is null"); return; } if (enemy.isOutsideEnemy) { mls.LogError((object)"Enemy is outside enemy"); return; } if (enemyVentsCache.Length == 0) { mls.LogError((object)"No vents found"); return; } if (!player.isInsideFactory) { mls.LogError((object)"The player isn't inside"); return; } EnemyVent val = enemyVentsCache.OrderBy((EnemyVent x) => Vector3.Distance(((Component)x).transform.position, ((Component)player).transform.position)).First(); if ((Object)(object)val == (Object)null) { mls.LogError((object)"Vent is null"); } else { SpawnInsideEnemy(enemy, val); } } public static void SpawnEnemyOutsideNearPlayer(EnemyType enemy, PlayerControllerB player) { //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) TrollConsole.DisplayMessage("Spawning " + enemy.enemyName + " near " + player.playerUsername); outsideSpawn = GameObject.FindGameObjectsWithTag("OutsideAINode"); if ((Object)(object)enemy == (Object)null) { mls.LogError((object)"Enemy is null"); return; } if ((Object)(object)enemy.enemyPrefab == (Object)null) { mls.LogError((object)"Enemy Prefab is null"); return; } if (!enemy.isOutsideEnemy) { mls.LogError((object)"Enemy is inside enemy"); return; } if (outsideSpawn.Length == 0) { mls.LogError((object)"No outside spawn found"); return; } GameObject[] array = outsideSpawn; if (array == null) { mls.LogError((object)"No spawnPoints"); return; } Vector3 position = array.OrderBy((GameObject x) => Vector3.Distance(x.transform.position, ((Component)player).transform.position)).First().transform.position; Vector3 randomNavMeshPositionInRadius = roundManager.GetRandomNavMeshPositionInRadius(position, 4f, default(NavMeshHit)); int num = 0; bool flag = false; for (int i = 0; i < array.Length - 1; i++) { for (int j = 0; j < roundManager.spawnDenialPoints.Length; j++) { flag = true; if ((double)Vector3.Distance(randomNavMeshPositionInRadius, roundManager.spawnDenialPoints[j].transform.position) < 16.0) { num = (num + 1) % array.Length; randomNavMeshPositionInRadius = roundManager.GetRandomNavMeshPositionInRadius(array[num].transform.position, 4f, default(NavMeshHit)); flag = false; break; } } if (flag) { break; } } SpawnEnemy(enemy, randomNavMeshPositionInRadius, isOutside: false); } public static void SpawnHostileObjectAtPosition(SpawnableMapObject obj, Vector3 pos) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(obj.prefabToSpawn, pos, Quaternion.identity, roundManager.mapPropsContainer.transform); val.transform.eulerAngles = ((!obj.spawnFacingAwayFromWall) ? new Vector3(val.transform.eulerAngles.x, (float)roundManager.AnomalyRandom.Next(0, 360), val.transform.eulerAngles.z) : new Vector3(0f, roundManager.YRotationThatFacesTheFarthestFromPosition(pos + Vector3.up * 0.2f, 25f, 6), 0f)); val.GetComponent<NetworkObject>().Spawn(true); TrollConsole.DisplayMessage("Spawned " + ((Object)obj.prefabToSpawn).name, MessageType.SUCCESS); } public static void SpawnHostileObjectAtRandomPos(SpawnableMapObject obj) { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: 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_0081: 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) GameObject[] insideAINodes = roundManager.insideAINodes; if (obj == null) { mls.LogError((object)"SpawnableMapObject is null"); return; } GameObject val = insideAINodes[roundManager.AnomalyRandom.Next(0, insideAINodes.Length)]; if ((Object)(object)val == (Object)null) { mls.LogError((object)"RandomMapObject is null"); return; } Vector3 randomNavMeshPositionInRadius = roundManager.GetRandomNavMeshPositionInRadius(val.transform.position, 100f, default(NavMeshHit)); SpawnHostileObjectAtPosition(obj, randomNavMeshPositionInRadius); } public static void SpawnHostileObjectNearPlayer(SpawnableMapObject obj, PlayerControllerB ply) { if (!ply.isInsideFactory) { mls.LogError((object)"Player isn't inside the factory"); } else { SpawnHostileObjectNearPlayer(obj, ply, 50); } } public static void SpawnHostileObjectNearPlayer(SpawnableMapObject obj, PlayerControllerB ply, int range) { //IL_003b: 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_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) if (!ply.isInsideFactory) { mls.LogError((object)"Player isn't inside the factory"); TrollConsole.DisplayMessage("Player isn't inside the factory", MessageType.ERROR); return; } Vector3 randomNavMeshPositionInRadius = roundManager.GetRandomNavMeshPositionInRadius(((Component)ply).transform.position, (float)range, default(NavMeshHit)); string name = ((Object)obj.prefabToSpawn).name; Vector3 val = randomNavMeshPositionInRadius; TrollConsole.DisplayMessage("Position of " + name + " = " + ((object)(Vector3)(ref val)).ToString()); TrollConsole.DisplayMessage("Spawning " + ((Object)obj.prefabToSpawn).name + " at " + Vector3.Distance(randomNavMeshPositionInRadius, ((Component)ply).transform.position) + "m from " + ply.playerUsername); SpawnHostileObjectAtPosition(obj, randomNavMeshPositionInRadius); } public static Vector3 GetPositionBehind(Vector3 pos, Vector3 forward, float distance = 10f, NavMeshHit navHit = default(NavMeshHit)) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) Vector3 val = pos - ((Vector3)(ref forward)).normalized * distance; float y = val.y; val = Random.insideUnitSphere * distance + val; val.y = y; if (NavMesh.SamplePosition(val, ref navHit, distance, -1)) { return ((NavMeshHit)(ref navHit)).position; } TrollConsole.DisplayMessage("Unable to get position behind! Returning old pos", MessageType.ERROR); return pos; } } internal class TrollMenuStyle : MonoBehaviour { public static GUIStyle menuStyle = new GUIStyle(); public static GUIStyle buttonStyle = new GUIStyle(); public static GUIStyle labelStyle = new GUIStyle(); public static GUIStyle toggleStyle = new GUIStyle(); public static GUIStyle hScrollStyle = new GUIStyle(); public static GUIStyle errorLabel = new GUIStyle(); public static GUIStyle errorStyle = new GUIStyle(); public static GUIStyle successStyle = new GUIStyle(); public static GUIStyle infoStyle = new GUIStyle(); private static Texture2D CreateTexture(int width, int height, Color col) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown Color[] array = (Color[])(object)new Color[width * height]; for (int i = 0; i < array.Length; i++) { array[i] = col; } Texture2D val = new Texture2D(width, height); val.SetPixels(array); val.Apply(); return val; } public static void Awake() { InitTextures(); } public static void InitTextures() { //IL_000b: 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_0074: 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) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0121: 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_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: 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) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_027b: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_0327: Unknown result type (might be due to invalid IL or missing references) //IL_0352: Unknown result type (might be due to invalid IL or missing references) //IL_038f: Unknown result type (might be due to invalid IL or missing references) menuStyle.normal.textColor = Color.white; menuStyle.normal.background = CreateTexture(2, 2, new Color(0f, 0f, 0f, 0f)); menuStyle.fontSize = 18; ((Object)menuStyle.normal.background).hideFlags = (HideFlags)61; buttonStyle.normal.textColor = Color.white; buttonStyle.fontSize = 18; labelStyle.normal.textColor = Color.white; labelStyle.fontSize = 25; labelStyle.normal.background = CreateTexture(2, 2, new Color(0f, 0f, 0f, 0f)); ((Object)labelStyle.normal.background).hideFlags = (HideFlags)61; toggleStyle.normal.textColor = Color.white; toggleStyle.fontSize = 18; hScrollStyle.normal.textColor = Color.white; hScrollStyle.normal.background = CreateTexture(2, 2, new Color(0f, 0f, 0f, 0f)); ((Object)hScrollStyle.normal.background).hideFlags = (HideFlags)61; errorLabel.normal.textColor = Color.red; errorLabel.onNormal.textColor = Color.red; errorLabel.normal.background = CreateTexture(2, 2, new Color(0f, 0f, 0f, 0f)); errorLabel.fontSize = 18; errorStyle.normal.textColor = Color.red; errorStyle.onNormal.textColor = Color.red; errorStyle.normal.background = CreateTexture(2, 2, new Color(0f, 0f, 0f, 0f)); errorStyle.fontSize = 20; errorStyle.active.background = CreateTexture(2, 2, new Color(1f, 1f, 1f, 0.2f)); successStyle.normal.textColor = Color.green; successStyle.onNormal.textColor = Color.green; successStyle.normal.background = CreateTexture(2, 2, new Color(0f, 0f, 0f, 0f)); successStyle.fontSize = 20; successStyle.active.background = CreateTexture(2, 2, new Color(1f, 1f, 1f, 0.2f)); infoStyle.normal.textColor = Color.white; infoStyle.onNormal.textColor = Color.white; infoStyle.normal.background = CreateTexture(2, 2, new Color(0f, 0f, 0f, 0f)); infoStyle.fontSize = 20; infoStyle.active.background = CreateTexture(2, 2, new Color(1f, 1f, 1f, 0.2f)); } } } namespace LethalCompanyTrollMenuMod.tabs { internal class AliveEnemies { private static Dictionary<string, int> modes = new Dictionary<string, int> { { "Kill", 0 }, { "Teleport to", 1 }, { "Freeze", 2 }, { "1 HP", 3 }, { "Heal", 4 } }; private static Select<int> modeSelect = null; private static int selectedMode = 0; private static PlayerControllerB selectedPlayer = null; private static Select<PlayerControllerB> playerSelect = null; private static Rect enemyListView = new Rect(0f, 0f, 100f, 100f); private static Rect enemyListViewRect = new Rect(0f, 0f, 100f, 200f); private static Vector2 enemyListViewVector = Vector2.zero; private static ManualLogSource log = TrollMenu.mls; private static Dictionary<EnemyAI, int> enemiesDefaultHP = new Dictionary<EnemyAI, int>(); private static Dictionary<EnemyAI, float> enemiesDefaultSpeed = new Dictionary<EnemyAI, float>(); public static Dictionary<EnemyAI, bool> frozenEnemies = new Dictionary<EnemyAI, bool>(); public static Dictionary<EnemyAI, bool> teleportEnemy = new Dictionary<EnemyAI, bool>(); public static void OnMenuOpened() { log.LogInfo((object)"Menu opened"); if (modeSelect == null) { log.LogWarning((object)"modeSelect is null"); modeSelect = new Select<int>(modes); modeSelect.SetDefault(0); } if ((Object)(object)StartOfRound.Instance != (Object)null) { log.LogInfo((object)"StartOfRound found"); } else { log.LogInfo((object)"StartOfRound not found"); } } private static void trigger(EnemyAI enemy) { switch (selectedMode) { case 0: Kill(enemy); break; case 1: TeleportToEnemy(enemy); break; case 2: Freeze(enemy); break; case 3: MakeOneHit(enemy); break; case 4: Heal(enemy); break; case 5: TeleportEnemyToPlayer(enemy, selectedPlayer); break; } } public static void Draw(Rect wr) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) bool flag = false; int num = 50; GUI.Label(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), "Alive Enemies"); num += 25; selectedMode = modeSelect.Draw(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, 200f, 25f)); num += modes.Count * 25; if ((Object)(object)TrollMenu.roundManager == (Object)null) { return; } enemyListView = new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, ((Rect)(ref wr)).height - (float)num); enemyListViewRect = new Rect(0f, 0f, ((Rect)(ref enemyListView)).width, (float)(25 * TrollMenu.roundManager.SpawnedEnemies.Count)); enemyListViewVector = GUI.BeginScrollView(enemyListView, enemyListViewVector, enemyListViewRect); if (TrollMenu.roundManager.SpawnedEnemies.Count == 0) { GUI.Label(new Rect(0f, 0f, 200f, 30f), "No enemies alive", TrollMenuStyle.errorLabel); GUI.EndScrollView(); return; } int num2 = 0; foreach (EnemyAI spawnedEnemy in TrollMenu.roundManager.SpawnedEnemies) { if (!spawnedEnemy.isEnemyDead) { if (!enemiesDefaultHP.ContainsKey(spawnedEnemy)) { enemiesDefaultHP.Add(spawnedEnemy, spawnedEnemy.enemyHP); } if (!enemiesDefaultSpeed.ContainsKey(spawnedEnemy)) { enemiesDefaultSpeed.Add(spawnedEnemy, spawnedEnemy.agent.speed); } if (GUI.Button(new Rect(0f, (float)num2, ((Rect)(ref enemyListViewRect)).width, 25f), ((Object)spawnedEnemy).name.Replace("(Clone)", " " + Math.Round(Vector3.Distance(((Component)StartOfRound.Instance.localPlayerController).transform.position, spawnedEnemy.serverPosition)) + "m"))) { trigger(spawnedEnemy); } num2 += 25; } } GUI.EndScrollView(); } private static void Kill(EnemyAI enemy) { if (!enemy.enemyType.canDie) { RoundManager.Instance.DespawnEnemyOnServer(((NetworkBehaviour)enemy).NetworkObject); TrollConsole.DisplayMessage("Made " + ((Object)enemy).name + " despawn", MessageType.SUCCESS); } else { enemy.KillEnemy(true); TrollConsole.DisplayMessage("Killed " + ((Object)enemy).name, MessageType.SUCCESS); } } private static void TeleportEnemyToPlayer(EnemyAI enemy, PlayerControllerB ply) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)enemy == (Object)null) { TrollConsole.DisplayMessage("No enemy selected", MessageType.ERROR); return; } if ((Object)(object)ply == (Object)null) { TrollConsole.DisplayMessage("No player selected", MessageType.ERROR); return; } Vector3 positionBehind = TrollMenu.GetPositionBehind(((Component)ply).transform.position, ((Component)ply).transform.forward); ((Component)enemy).transform.position = positionBehind; enemy.moveTowardsDestination = false; TrollConsole.DisplayMessage("Teleported " + ((Object)enemy).name + " behind " + ply.playerUsername + " at " + Vector3.Distance(((Component)enemy).transform.position, ((Component)ply).transform.position), MessageType.SUCCESS); } private static void TeleportToEnemy(EnemyAI enemy) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController; localPlayerController.isInsideFactory = !enemy.isOutside; ((Component)localPlayerController).transform.position = TrollMenu.roundManager.GetRandomNavMeshPositionInRadius(((Component)enemy).transform.position, 10f, default(NavMeshHit)); TrollConsole.DisplayMessage("Teleported " + localPlayerController.playerUsername + " to " + ((Object)enemy).name, MessageType.SUCCESS); } private static void Freeze(EnemyAI enemy) { if (frozenEnemies[enemy]) { frozenEnemies[enemy] = false; TrollConsole.DisplayMessage("Unfroze " + ((Object)enemy).name, MessageType.SUCCESS); } else { frozenEnemies[enemy] = true; TrollConsole.DisplayMessage("Froze " + ((Object)enemy).name, MessageType.SUCCESS); } } private static void MakeOneHit(EnemyAI enemy) { enemy.enemyHP = 1; TrollConsole.DisplayMessage("Made " + ((Object)enemy).name + " one hit to kill", MessageType.SUCCESS); } private static void Heal(EnemyAI enemy) { enemy.enemyHP = enemiesDefaultHP[enemy]; TrollConsole.DisplayMessage("Healed " + ((Object)enemy).name, MessageType.SUCCESS); } } internal class DeadlyItems { public static Select<int> spawnMode = null; public static int currentMode = 0; public static Select<PlayerControllerB> playerSelect = null; public static PlayerControllerB currentPlayer = null; public static int range = 10; public static string rangeString = range.ToString(); public static void OnMenuOpened() { if (TrollMenu.isInGame) { if (spawnMode == null) { Dictionary<string, int> opts = new Dictionary<string, int> { { "Random Spawn", 0 }, { "Spawn Near Player", 1 }, { "Spawn Near Random Player", 2 } }; spawnMode = new Select<int>(opts); spawnMode.SetDefault(0); } if (playerSelect == null) { playerSelect = new Select<PlayerControllerB>(TrollMenu.allPlayers); } } } public static void Draw(Rect wr) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) int num = 50; GUI.Label(new Rect(((Rect)(ref wr)).x + 10f, ((Rect)(ref wr)).y + (float)num, 200f, 30f), "Deadly Items", TrollMenuStyle.labelStyle); num += 30; currentMode = spawnMode.Draw(new Rect(((Rect)(ref wr)).x + 10f, ((Rect)(ref wr)).y + (float)num, 200f, 30f)); num += 90; currentPlayer = playerSelect.Draw(new Rect(((Rect)(ref wr)).x + ((Rect)(ref wr)).width + 10f, ((Rect)(ref wr)).y, 200f, 30f)); GUI.Label(new Rect(((Rect)(ref wr)).x + 10f, ((Rect)(ref wr)).y + (float)num, 200f, 25f), "Near Player Range: "); rangeString = GUI.TextField(new Rect(((Rect)(ref wr)).x + 200f, ((Rect)(ref wr)).y + (float)num, 100f, 30f), rangeString); if (rangeString != "") { if (int.TryParse(rangeString, out var result)) { range = result; } else { range = 10; } } rangeString = range.ToString(); foreach (KeyValuePair<string, SpawnableMapObject> deadlyobject in TrollMenu.deadlyobjects) { num += 30; if (GUI.Button(new Rect(((Rect)(ref wr)).x + 5f, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width - 10f, 25f), deadlyobject.Key)) { if (currentMode == 0) { TrollConsole.DisplayMessage("Spawning " + deadlyobject.Key + "at random position"); TrollMenu.SpawnHostileObjectAtRandomPos(deadlyobject.Value); } else if (currentMode == 1) { TrollConsole.DisplayMessage("Spawning " + deadlyobject.Key + "at " + currentPlayer.playerUsername + " position"); TrollMenu.SpawnHostileObjectNearPlayer(deadlyobject.Value, currentPlayer, range); } else if (currentMode == 2) { PlayerControllerB[] array = TrollMenu.alivePlayers.Values.ToArray(); PlayerControllerB val = array[TrollMenu.roundManager.AnomalyRandom.Next(0, array.Length)]; TrollConsole.DisplayMessage("Spawning " + deadlyobject.Key + "at " + val.playerUsername + " position"); TrollMenu.SpawnHostileObjectNearPlayer(deadlyobject.Value, val, range); } } } } } public class ScrapMenu { public static bool randomValue = false; public static bool randomAmount = false; public static int minScrap = 0; public static int maxScrap = 100; public static int minScrapValue = 0; public static int maxScrapValue = 1000; private static string minScrapStr = minScrap.ToString(); private static string maxScrapStr = maxScrap.ToString(); private static string minScrapValueStr = minScrapValue.ToString(); private static string maxScrapValueStr = maxScrapValue.ToString(); public static void Draw(Rect wr) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_010a: 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_0175: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) //IL_0381: Unknown result type (might be due to invalid IL or missing references) int num = 50; int num2 = 100; GUI.Label(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), "Scrap Menu"); num += 25; GUI.Label(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), "Every change will be applied on next day", TrollMenuStyle.errorLabel); num += 25; randomValue = GUI.Toggle(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), randomValue, "Activate Random"); num += 25; if (randomValue) { GUI.Label(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), "Min Scrap"); minScrapStr = GUI.TextField(new Rect(((Rect)(ref wr)).x + (float)num2, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width - (float)(num2 + 5), 25f), minScrapStr); num += 25; GUI.Label(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), "Max Scrap"); maxScrapStr = GUI.TextField(new Rect(((Rect)(ref wr)).x + (float)num2, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width - (float)(num2 + 5), 25f), maxScrapStr); try { if (minScrapStr != "") { minScrap = int.Parse(minScrapStr); } if (maxScrapStr != "") { maxScrap = int.Parse(maxScrapStr); } if (maxScrap < 0) { maxScrap = 0; } if (minScrap < 0) { minScrap = 0; } if (minScrap > maxScrap) { minScrap = maxScrap; } if (maxScrap < minScrap) { maxScrap = minScrap; } } catch (Exception ex) { TrollMenu.mls.LogError((object)"Error while parsing custom values"); TrollMenu.mls.LogError((object)ex.Message); } num += 25; } num2 = 0; randomAmount = GUI.Toggle(new Rect(((Rect)(ref wr)).x + (float)num2, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), randomAmount, "Activate Custom Value"); num += 25; num2 = 100; if (!randomAmount) { return; } GUI.Label(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), "Min Scrap Value"); minScrapValueStr = GUI.TextField(new Rect(((Rect)(ref wr)).x + (float)num2, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width - (float)(num2 + 5), 25f), minScrapValueStr.ToString()); num += 25; GUI.Label(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), "Max Scrap Value"); maxScrapValueStr = GUI.TextField(new Rect(((Rect)(ref wr)).x + (float)num2, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width - (float)(num2 + 5), 25f), maxScrapValueStr.ToString()); try { if (minScrapValueStr != "") { minScrapValue = int.Parse(minScrapValueStr); } if (maxScrapValueStr != "") { maxScrapValue = int.Parse(maxScrapValueStr); } if (maxScrapValue < 0) { maxScrapValue = 0; } if (minScrapValue < 0) { minScrapValue = 0; } if (minScrapValue > maxScrapValue) { minScrapValue = maxScrapValue; } if (maxScrapValue < minScrapValue) { maxScrapValue = minScrapValue; } } catch (Exception ex2) { TrollMenu.mls.LogError((object)"Error while parsing custom values"); TrollMenu.mls.LogError((object)ex2.Message); } } } internal class SpawnMenu { private static Vector2 scrollViewVector = Vector2.zero; private static Rect scrollRect = new Rect(0f, 0f, 100f, 100f); public static PlayerControllerB currentPlayer = null; public static List<bool> plyToggle = new List<bool>(); public static List<bool> lastToggleState = new List<bool>(); public static Select<PlayerControllerB> playerSelect = null; private static Dictionary<string, int> spawnType = new Dictionary<string, int> { { "Random Spawn", 0 }, { "Spawn Near Player", 1 }, { "Spawn Near Random Player", 2 }, { "Spawn Behind Player", 3 }, { "Spawn Behind Random Player", 4 } }; private static Select<int> spawnSelect = null; private static int selected = 0; public static void OnMenuOpened() { if (TrollMenu.isInGame) { if (playerSelect == null) { playerSelect = new Select<PlayerControllerB>(TrollMenu.allPlayers); } if (spawnSelect == null) { spawnSelect = new Select<int>(spawnType); spawnSelect.SetDefault(0); } } } public static void Draw(Rect wr) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: 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_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0316: Unknown result type (might be due to invalid IL or missing references) //IL_03a1: Unknown result type (might be due to invalid IL or missing references) //IL_0362: Unknown result type (might be due to invalid IL or missing references) int num = 75; GUI.Label(new Rect(((Rect)(ref wr)).x, (float)num, ((Rect)(ref wr)).width, 25f), "Spawn Menu"); num += 25; selected = spawnSelect.Draw(new Rect(((Rect)(ref wr)).x, (float)num, 200f, 25f)); num += 130; scrollRect = new Rect(0f, 0f, ((Rect)(ref wr)).width, (float)(100 + 30 * TrollMenu.outsideEnemies.Count + 30 * TrollMenu.insideEnemies.Count)); scrollViewVector = GUI.BeginScrollView(new Rect(((Rect)(ref wr)).x, (float)num, ((Rect)(ref wr)).width, ((Rect)(ref wr)).height - (float)num), scrollViewVector, scrollRect); GUI.Label(new Rect(0f, 0f, ((Rect)(ref wr)).width, 25f), "Outside Enemies"); int num2 = 25; foreach (KeyValuePair<string, EnemyType> outsideEnemy in TrollMenu.outsideEnemies) { string key = outsideEnemy.Key; EnemyType value = outsideEnemy.Value; if (GUI.Button(new Rect(0f, (float)num2, ((Rect)(ref wr)).width, 25f), key)) { PlayerControllerB randomPlayer = GetRandomPlayer(); switch (selected) { case 1: TrollMenu.SpawnEnemyOutsideNearPlayer(value, currentPlayer); break; case 2: TrollMenu.SpawnEnemyOutsideNearPlayer(value, randomPlayer); break; case 3: SpawnEnemyBehindPlayer(value, currentPlayer); break; case 4: SpawnEnemyBehindPlayer(value, randomPlayer); break; default: TrollMenu.SpawnOutsideEnemy(value); break; } } num2 += 30; } num2 += 25; GUI.Label(new Rect(0f, (float)num2, ((Rect)(ref wr)).width, 25f), "Inside Enemies"); num2 += 25; foreach (KeyValuePair<string, EnemyType> insideEnemy in TrollMenu.insideEnemies) { string key2 = insideEnemy.Key; EnemyType value2 = insideEnemy.Value; if (GUI.Button(new Rect(0f, (float)num2, ((Rect)(ref wr)).width, 25f), key2)) { PlayerControllerB randomPlayer2 = GetRandomPlayer(); switch (selected) { case 1: TrollMenu.SpawnEnemyInsideNearPlayer(value2, currentPlayer); break; case 2: TrollMenu.SpawnEnemyInsideNearPlayer(value2, randomPlayer2); break; case 3: SpawnEnemyBehindPlayer(value2, currentPlayer); break; case 4: SpawnEnemyBehindPlayer(value2, randomPlayer2); break; default: TrollMenu.SpawnInsideEnemy(value2); break; } } num2 += 30; } GUI.EndScrollView(); GUI.Box(new Rect(((Rect)(ref wr)).x + ((Rect)(ref wr)).width, ((Rect)(ref wr)).y, ((Rect)(ref wr)).width, (float)(30 * GetPlayer().Length)), "Select a player"); if (TrollMenu.allPlayers.Count == 0) { GUI.Label(new Rect(((Rect)(ref wr)).x + ((Rect)(ref wr)).width, ((Rect)(ref wr)).y + 25f, ((Rect)(ref wr)).width, 25f), "No players found"); } else { currentPlayer = playerSelect.Draw(new Rect(((Rect)(ref wr)).x + ((Rect)(ref wr)).width, ((Rect)(ref wr)).y + 25f, ((Rect)(ref wr)).width, 25f)); } } private static PlayerControllerB GetRandomPlayer() { PlayerControllerB[] player = GetPlayer(); PlayerControllerB val = player[TrollMenu.roundManager.AnomalyRandom.Next(0, player.Length)]; if ((Object)(object)val == (Object)null) { val = ((!((Object)(object)currentPlayer == (Object)null)) ? currentPlayer : GetPlayer()[0]); } return val; } private static PlayerControllerB[] GetPlayer() { return StartOfRound.Instance.allPlayerScripts; } public static void CreatePlayerMenu(Rect wr) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) int num = 0; int num2 = 0; GUI.Box(wr, "Player Menu"); num += 25; PlayerControllerB[] player = GetPlayer(); if (plyToggle.Count != player.Length) { plyToggle.Clear(); lastToggleState.Clear(); for (num2 = 0; num2 < player.Length; num2++) { plyToggle.Add(item: false); lastToggleState.Add(item: false); } } if (player == null || player.Length == 0) { GUI.Label(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), "No players found"); return; } num2 = 0; PlayerControllerB[] array = player; foreach (PlayerControllerB val in array) { plyToggle[num2] = GUI.Toggle(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num, ((Rect)(ref wr)).width, 25f), plyToggle[num2], val.playerUsername); num += 30; num2++; } for (num2 = 0; num2 < plyToggle.Count; num2++) { if (plyToggle[num2] == lastToggleState[num2]) { continue; } if (plyToggle[num2]) { for (int j = 0; j < plyToggle.Count; j++) { if (j != num2) { plyToggle[j] = false; } } currentPlayer = player[num2]; } lastToggleState[num2] = plyToggle[num2]; } if (!plyToggle.Contains(item: true)) { currentPlayer = null; } } private static void SpawnEnemyBehindPlayer(EnemyType enemy, PlayerControllerB ply) { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)enemy == (Object)null) { TrollConsole.DisplayMessage("No enemy selected", MessageType.ERROR); return; } if ((Object)(object)ply == (Object)null) { TrollConsole.DisplayMessage("No player selected", MessageType.ERROR); return; } TrollConsole.DisplayMessage("Spawning " + ((Object)enemy).name + " behind " + ply.playerUsername + "(" + (ply.isInsideFactory ? "Inside" : "Outside") + ")"); Vector3 positionBehind = TrollMenu.GetPositionBehind(((Component)ply).transform.position, ((Component)ply).transform.forward); EnemyAI val = TrollMenu.SpawnEnemy(enemy, positionBehind, !ply.isInsideFactory); val.destination = ((Component)ply).transform.position; val.moveTowardsDestination = true; } } } namespace LethalCompanyTrollMenuMod.Component { internal class TabManager : MonoBehaviour { private Rect wr = new Rect(20f, 20f, 500f, 800f); private int toolbarInt = 0; private Type[] toolBarTypes = null; private string[] toolbarStrings = new string[1] { "No tabs spotted" }; private bool showMenu = false; public static bool showMessage; private string scene = ""; private Type[] getTabs() { Assembly executingAssembly = Assembly.GetExecutingAssembly(); Type[] types = executingAssembly.GetTypes(); List<Type> list = new List<Type>(); Type[] array = types; foreach (Type type in array) { if (type.Namespace == "LethalCompanyTrollMenuMod.tabs" && !type.Name.Contains("<")) { list.Add(type); } } return list.ToArray(); } private void OnGUI() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) if (showMenu) { wr = new Rect(20f, 20f, 500f, 800f); GUI.Box(wr, "Troll Menu"); toolbarInt = GUI.Toolbar(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + 25f, ((Rect)(ref wr)).width, 25f), toolbarInt, toolbarStrings); Type type = toolBarTypes[toolbarInt]; object[] parameters = new object[1] { wr }; type.GetMethod("Draw").Invoke(null, parameters); } } private void Awake() { TrollMenu.mls.LogInfo((object)"LOADED MENU"); Type[] tabs = getTabs(); toolbarStrings = tabs.Select((Type x) => x.Name).ToArray(); toolBarTypes = tabs; } private string CurrentScene() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); return ((Scene)(ref activeScene)).name; } private void Update() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut val = new KeyboardShortcut((KeyCode)282, Array.Empty<KeyCode>()); if (((KeyboardShortcut)(ref val)).IsUp() && (TrollMenu.isInGame || showMenu)) { showMenu = !showMenu; if (showMenu) { TrollMenu.allPlayers.Clear(); PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val2 in allPlayerScripts) { TrollMenu.allPlayers.Add(val2.playerUsername, val2); } Type[] array = toolBarTypes; foreach (Type type in array) { if (type.GetMethod("OnMenuOpened") != null) { type.GetMethod("OnMenuOpened").Invoke(null, null); } } } } if (CurrentScene() != scene) { scene = CurrentScene(); TrollMenu.isInGame = scene == "SampleSceneRelay"; SpawnMenu.currentPlayer = null; SpawnMenu.playerSelect.SetToDefault(); DeadlyItems.currentPlayer = null; DeadlyItems.playerSelect.SetToDefault(); } } private void OnDestroy() { TrollMenu.mls.LogError((object)"UNLOADED MENU"); } } } namespace LethalCompanyTrollMenuMod.helpers { internal class Select<T> { private Dictionary<string, T> opts; private bool[] old; private bool[] current; private T defaultValue = default(T); private int defaultIndex = -1; public Select(Dictionary<string, T> opts) { this.opts = opts; old = new bool[opts.Count]; current = new bool[opts.Count]; for (int i = 0; i < opts.Count; i++) { old[i] = false; current[i] = false; } } public void SetDefault(T value) { defaultValue = value; defaultIndex = opts.Values.ToList().IndexOf(value); } public void SetToDefault() { for (int i = 0; i < opts.Count; i++) { old[i] = false; current[i] = false; } if (defaultValue != null) { current[defaultIndex] = true; } } public T Draw(Rect wr) { //IL_0106: Unknown result type (might be due to invalid IL or missing references) if (opts.Count == 0) { return defaultValue; } int num = 0; if (old.Length != opts.Count) { old = new bool[opts.Count]; current = new bool[opts.Count]; for (num = 0; num < opts.Count; num++) { old[num] = false; current[num] = false; } return defaultValue; } T result = defaultValue; int num2 = 0; num = 0; T[] array = opts.Values.ToArray(); foreach (KeyValuePair<string, T> opt in opts) { current[num] = GUI.Toggle(new Rect(((Rect)(ref wr)).x, ((Rect)(ref wr)).y + (float)num2, ((Rect)(ref wr)).width, 25f), current[num], opt.Key); num2 += 25; num++; } for (num = 0; num < current.Length; num++) { if (current[num] == old[num]) { continue; } if (current[num]) { for (int i = 0; i < current.Length; i++) { if (i != num) { current[i] = false; old[i] = false; } } } old[num] = current[num]; } List<bool> list = current.ToList(); int num3 = list.IndexOf(item: true); if (num3 != -1) { result = array[num3]; } if (!current.Contains(value: true)) { if (defaultValue != null) { current[defaultIndex] = true; } result = defaultValue; } return result; } } }