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 RiskOfTraitors v2.0.1
RiskOfTraitors.dll
Decompiled 2 years agousing System; using System.Collections.ObjectModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using On.RoR2; using R2API.Networking; using R2API.Networking.Interfaces; using R2API.Utils; using RoR2; using RoR2.Networking; using UnityEngine; using UnityEngine.Networking; 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: AssemblyCompany("RiskOfTraitors")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RiskOfTraitors")] [assembly: AssemblyTitle("RiskOfTraitors")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace RiskOfTraitors { public class AverageItems : MonoBehaviour { public void RedistributeItems() { //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_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Invalid comparison between Unknown and I4 //IL_04a7: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Expected I4, but got Unknown //IL_030f: Unknown result type (might be due to invalid IL or missing references) Log.Info("Started RedistributeItems"); int count = PlayerCharacterMasterController._instancesReadOnly.Count; int[] array = new int[count]; int num = 0; int num2 = 0; int itemsBelowAverage = RiskOfTraitors.itemsBelowAverage; int itemsAboveAverage = RiskOfTraitors.itemsAboveAverage; bool enableItemAveraging = RiskOfTraitors.enableItemAveraging; bool removeLunarItems = RiskOfTraitors.removeLunarItems; Log.Info($"Player Count is: {count}"); for (int i = 0; i < count; i++) { if ((Object)(object)PlayerCharacterMasterController._instancesReadOnly[i].master != (Object)null) { array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)0); array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)1); array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)2); array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)3); array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)4); array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)6); array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)7); array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)8); array[i] += PlayerCharacterMasterController._instancesReadOnly[i].master.inventory.GetTotalItemCountOfTier((ItemTier)9); num += array[i]; Log.Info($"playerItemCount {i}: {array[i]}"); } else { Log.Warning($"Player body at index {i} was null"); } } num2 = num / count; Log.Info($"totalItemCount: {num}"); Log.Info($"averageItemCount: {num2}"); for (int j = 0; j < count; j++) { int totalItemCountOfTier = PlayerCharacterMasterController._instancesReadOnly[j].master.inventory.GetTotalItemCountOfTier((ItemTier)3); if (totalItemCountOfTier > 0 && removeLunarItems) { int num3 = 0; ItemIndex[] array2 = (ItemIndex[])(object)new ItemIndex[totalItemCountOfTier]; foreach (ItemIndex item in PlayerCharacterMasterController.instances[j].master.inventory.itemAcquisitionOrder) { ItemDef itemDef = ItemCatalog.GetItemDef(item); if ((int)itemDef.tier == 3) { array2[num3] = (ItemIndex)(int)item; num3++; Log.Info($"Lunar item index {item} found in inventory of {PlayerCharacterMasterController.instances[j].GetDisplayName()}"); } } for (int k = 0; k < totalItemCountOfTier; k++) { PlayerCharacterMasterController.instances[j].master.inventory.RemoveItem(array2[k], 1); Log.Info($"Successfully removed lunar item index: {array2[k]}"); } } while (array[j] < num2 - itemsBelowAverage && enableItemAveraging) { Log.Info($"Giving item to player at index {j}"); PlayerCharacterMasterController.instances[j].master.inventory.GiveRandomItems(1, false, false); array[j]++; Log.Info($"Player {j} new item count: {array[j]}"); } while (array[j] > num2 + itemsAboveAverage && enableItemAveraging) { int num4 = Random.Range(0, PlayerCharacterMasterController.instances[j].master.inventory.itemAcquisitionOrder.Count); Log.Info($"Remove item index {num4} from player {PlayerCharacterMasterController.instances[j].GetDisplayName()}"); PlayerCharacterMasterController.instances[j].master.inventory.RemoveItem(PlayerCharacterMasterController.instances[j].master.inventory.itemAcquisitionOrder[num4], 1); array[j]--; } } } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [R2APISubmoduleDependency(new string[] { "CommandHelper" })] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("MeatyJesus.RiskOfTraitors", "RiskOfTraitors", "2.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class RiskOfTraitors : BaseUnityPlugin { public const string PluginGUID = "MeatyJesus.RiskOfTraitors"; public const string PluginAuthor = "MeatyJesus"; public const string PluginName = "RiskOfTraitors"; public const string PluginVersion = "2.0.0"; public TeamComponent team; public TeleporterInteraction teleport; public CustomGUI score = null; public RoleDisplayUI roleDisplay = null; public SyncScoreString sync; public SyncTraitorTeam syncTraitor; public AverageItems averageItems; public static bool canDamageSelf = false; public static int itemsBelowAverage = 1; public static int itemsAboveAverage = 1; public static bool enableItemAveraging = true; public static bool removeLunarItems = false; public int playerCount; public int deadInnoCount; public int deadTraitorCount; public bool innocentWin = false; public bool traitorWin = false; public bool newGameStart = true; public bool wonByEliminatingAllTraitors = false; public bool sentInnoWinMessageAlready = false; public bool skippingRound = false; public int[] winsAsTraitor; public int[] winsAsInnocent; public int[] killsOnTraitors; public int[] killsOnInnocents; public int[] teamKills; public int[] randomNum; public static int maxRounds = 5; public int roundsPlayed = 0; public static int numTraitors = 1; public static int oldPlayerDamageMul = 0; public static int playerOutgoingDamageMul = 0; public static int oldEnemyDamageMul = 0; public static int enemyOutgoingDamageMul = 0; public static bool updatePlayerDamageMul = false; public static bool updateMonsterDamageMul = false; public const string imposterText = "<color=red>TRAITOR:</color> Eliminate all Innocent players to win."; public const string innoText = "<color=green>INNOCENT:</color> Escape via the teleporter to win, or eliminate all Traitors."; public static string scoreDataFromServer = ""; public static string syncedScore = "Default Synced Score"; public static string traitorTeamNames = ""; public void Awake() { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); CommandHelper.AddToConsoleWhenReady(); NetworkingAPI.RegisterMessageType<SyncScoreString>(); NetworkingAPI.RegisterMessageType<SyncTraitorTeam>(); GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal; Stage.onServerStageBegin += Stage_onServerStageBegin; Run.onServerGameOver += Run_onServerGameOver; CharacterBody.onBodyStartGlobal += BodyStartGlobal; HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage); Run.onRunStartGlobal += Run_onRunStartGlobal; TeamComponent.onJoinTeamGlobal += TeamComponent_onJoinTeamGlobal; TeleporterInteraction.Start += new hook_Start(TeleporterInteraction_Start); Run.CCRunEnd += new hook_CCRunEnd(Run_CCRunEnd); Log.Info("Awake DONE LOADING RISK OF TRAITORS."); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void ToggleLunarRemoval(ConCommandArgs args) { removeLunarItems = !removeLunarItems; ChatMessage.Send("<color=blue>Lunar item removal after each stage set to: <color=green>" + removeLunarItems + "</color></color>"); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void ToggleSelfDamage(ConCommandArgs args) { canDamageSelf = !canDamageSelf; ChatMessage.Send("<color=yellow>Self damage set to: <color=green>" + canDamageSelf + "</color></color>"); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void MaxRounds(ConCommandArgs args) { maxRounds = ((ConCommandArgs)(ref args)).GetArgInt(0); if (maxRounds < 1) { maxRounds = 1; } Log.Info($"Max rounds set to: {maxRounds}"); ChatMessage.Send("<color=yellow>Max rounds set to: <color=green>" + maxRounds + "</color></color>"); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void PlayerDamage(ConCommandArgs args) { playerOutgoingDamageMul = ((ConCommandArgs)(ref args)).GetArgInt(0); if (playerOutgoingDamageMul < -99) { playerOutgoingDamageMul = -99; } Log.Info($"Player damage set to: {100f + (float)(100 * playerOutgoingDamageMul) * 0.01f}%"); ChatMessage.Send("<color=yellow>Player damage set to: <color=green>" + (100f + (float)(100 * playerOutgoingDamageMul) * 0.01f) + "%</color></color>"); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void MonsterDamage(ConCommandArgs args) { enemyOutgoingDamageMul = ((ConCommandArgs)(ref args)).GetArgInt(0); if (enemyOutgoingDamageMul < -99) { enemyOutgoingDamageMul = -99; } Log.Info($"Enemy damage set to: {100f + (float)(100 * enemyOutgoingDamageMul) * 0.01f}%"); ChatMessage.Send("<color=yellow>Enemy damage set to: <color=green>" + (100f + (float)(100 * enemyOutgoingDamageMul) * 0.01f) + "%</color></color>"); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void TraitorCount(ConCommandArgs args) { numTraitors = ((ConCommandArgs)(ref args)).GetArgInt(0); if (numTraitors <= 0) { numTraitors = 0; } ChatMessage.Send("<color=yellow>Next stage traitor count set to: <color=red>" + numTraitors + "</color></color>"); Log.Info($"Traitor count set to: {numTraitors}"); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void AverageItemRange(ConCommandArgs args) { enableItemAveraging = ((ConCommandArgs)(ref args)).GetArgBool(0); itemsBelowAverage = ((ConCommandArgs)(ref args)).GetArgInt(1); itemsAboveAverage = ((ConCommandArgs)(ref args)).GetArgInt(2); if (enableItemAveraging) { ChatMessage.Send("<color=yellow>Min items below average set to: <color=green>" + itemsBelowAverage + "</color>, Max items above average set to: <color=green>" + itemsAboveAverage + "</color></color>"); Log.Info($"Min items below average: {itemsBelowAverage}, Max items above average: {itemsAboveAverage}"); } else { ChatMessage.Send("Item averaging each stage has been <color=red>disabled.</color>"); Log.Info("Item averaging each stage has been disabled."); } } private void Run_onRunStartGlobal(Run obj) { roundsPlayed = 0; innocentWin = false; traitorWin = false; newGameStart = true; } private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) try { if ((int)damageInfo.damageType != 1075905024) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); if (((NetworkBehaviour)component).netId == ((NetworkBehaviour)self.body).netId && !canDamageSelf) { damageInfo.damage = 0f; } } else { Log.Info($"Damage type was {damageInfo.damageType}, skipping."); } orig.Invoke(self, damageInfo); } catch { orig.Invoke(self, damageInfo); Log.Info("Skipping damage check."); } } private void BodyStartGlobal(CharacterBody body) { if (body.isPlayerControlled) { float baseDamage = body.baseDamage; body.baseDamage *= 1f + (float)playerOutgoingDamageMul * 0.01f; Log.Info($"Player spawned with basedamage of {body.baseDamage} from old {baseDamage}"); } else { body.baseDamage *= 1f + (float)enemyOutgoingDamageMul * 0.01f; } } private void Run_CCRunEnd(orig_CCRunEnd orig, ConCommandArgs args) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(args); roundsPlayed = 0; innocentWin = false; traitorWin = false; newGameStart = true; } private void TeleporterInteraction_Start(orig_Start orig, TeleporterInteraction self) { orig.Invoke(self); teleport = self; Log.Info("Teleporter has been initialized."); if (NetworkServer.active) { NetMessageExtensions.Send((INetMessage)(object)new SyncScoreString(scoreDataFromServer), (NetworkDestination)1); syncedScore = scoreDataFromServer; ChatMessage.Send("<color=#A040C0>Round <color=yellow>" + (roundsPlayed + 1) + "/" + maxRounds + "</color></color>"); } score = new CustomGUI(); score.Init(); roleDisplay = new RoleDisplayUI(); roleDisplay.Init(); } private void TeamComponent_onJoinTeamGlobal(TeamComponent teamcomp, TeamIndex index) { team = teamcomp; teamcomp.hideAllyCardDisplay = true; } private void Run_onServerGameOver(Run run, GameEndingDef gameEnd) { roundsPlayed = 0; innocentWin = false; traitorWin = false; newGameStart = true; } public NetworkConnection GetNetworkConnectionFromPlayerControllerIndex(int index) { //IL_0025: 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_0040: Unknown result type (might be due to invalid IL or missing references) PlayerCharacterMasterController val = PlayerCharacterMasterController.instances[index]; for (int i = 0; i < NetworkServer.connections.Count; i++) { NetworkConnection val2 = NetworkServer.connections[i]; if (val2.clientOwnedObjects.Contains(val.networkUserInstanceId)) { Log.Info($"Match found in conn: {val2.clientOwnedObjects} for {val.networkUserInstanceId}"); return val2; } Log.Warning($"No match found in conn: {val2.clientOwnedObjects} for {val.networkUserInstanceId}"); } ChatMessage.Send("<color=orange>An error may have occurred. If you notice any gamebreaking bugs, have the host relaunch their game.</color>"); return NetworkServer.connections[0]; } private void SendMessageFromStringAndIndex(string message, int index) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown SimpleChatMessage val = new SimpleChatMessage(); val.baseToken = "{0}"; val.paramTokens = new string[1] { message }; NetworkWriter val2 = new NetworkWriter(); val2.StartMessage((short)59); val2.Write(((ChatMessageBase)val).GetTypeIndex()); val2.Write((MessageBase)(object)val); val2.FinishMessage(); GetNetworkConnectionFromPlayerControllerIndex(index).SendWriter(val2, QosChannelIndex.chat.intVal); } private int FindPlayerIndexFromBodyInstanceID(NetworkInstanceId playerBodyId) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < playerCount; i++) { NetworkUser val = NetworkUser.readOnlyInstancesList[i]; if (val.master.bodyInstanceId == playerBodyId) { return i; } } return 0; } private void GlobalEventManager_onCharacterDeathGlobal(DamageReport report) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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_007c: 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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) int count = PlayerCharacterMasterController.instances.Count; bool flag = true; bool flag2 = true; int num = -1; int num2 = -1; for (int i = 0; i < count; i++) { _ = report.victimMaster.bodyInstanceId; if (report.victimMaster.bodyInstanceId == PlayerCharacterMasterController.instances[i].master.bodyInstanceId) { num = FindPlayerIndexFromBodyInstanceID(report.victimMaster.bodyInstanceId); } _ = report.attackerMaster.bodyInstanceId; if (report.attackerMaster.bodyInstanceId == PlayerCharacterMasterController.instances[i].master.bodyInstanceId) { num2 = FindPlayerIndexFromBodyInstanceID(report.attackerMaster.bodyInstanceId); } } string text = "Player <color=red>"; string text2 = "Player <color=green>"; if (num != -1) { text = text + PlayerCharacterMasterController.instances[num].GetDisplayName() + "</color> was a <color=red>Traitor!</color>"; text2 = text2 + PlayerCharacterMasterController.instances[num].GetDisplayName() + "</color> was a <color=green>Innocent!</color>"; } if (!report.victimMaster.IsDeadAndOutOfLivesServer() || num == -1 || traitorWin || innocentWin) { return; } for (int j = 0; j < randomNum.Length; j++) { NetworkUser val = NetworkUser.readOnlyInstancesList[randomNum[j]]; if (!(report.victimMaster.bodyInstanceId == val.master.bodyInstanceId)) { continue; } if (num2 != -1) { for (int k = 0; k < randomNum.Length; k++) { NetworkUser val2 = NetworkUser.readOnlyInstancesList[randomNum[k]]; if (val2.master.bodyInstanceId == report.attackerMaster.bodyInstanceId) { flag2 = false; teamKills[num2]++; text = "<color=orange>(TEAMKILL)</color> " + text; } } if (flag2) { killsOnTraitors[num2]++; } SendMessageFromStringAndIndex(text, num2); } deadTraitorCount++; flag = false; if (deadTraitorCount >= randomNum.Length && !traitorWin) { DoInnocentWin(); } } if (!flag) { return; } if (num2 != -1) { for (int l = 0; l < randomNum.Length; l++) { NetworkUser val3 = NetworkUser.readOnlyInstancesList[randomNum[l]]; if (val3.master.bodyInstanceId == report.attackerMaster.bodyInstanceId) { killsOnInnocents[num2]++; flag2 = false; } } if (flag2) { teamKills[num2]++; text2 = "<color=orange>(TEAMKILL)</color> " + text2; } SendMessageFromStringAndIndex(text2, num2); } deadInnoCount++; if (deadInnoCount >= count - randomNum.Length && !innocentWin) { DoTraitorWin(); } } public void DoTraitorWin() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) string text = "<color=red>Traitor team wins!</color> Traitors: <color=red>"; for (int i = 0; i < randomNum.Length; i++) { NetworkUser val = NetworkUser.readOnlyInstancesList[randomNum[i]]; text = text + val.masterController.GetDisplayName() + " "; winsAsTraitor[FindPlayerIndexFromBodyInstanceID(val.masterController.master.bodyInstanceId)]++; } text += "</color>"; ChatMessage.Send(text); innocentWin = false; traitorWin = true; EndRoundWarpToNextStage(); } public void DoInnocentWin() { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) innocentWin = true; traitorWin = false; wonByEliminatingAllTraitors = true; string text = "<color=green>Innocents win!</color> Traitors: <color=red>"; for (int i = 0; i < randomNum.Length; i++) { NetworkUser val = NetworkUser.readOnlyInstancesList[randomNum[i]]; text = text + val.masterController.GetDisplayName() + " "; } bool flag = true; for (int j = 0; j < playerCount; j++) { ReadOnlyCollection<NetworkUser> readOnlyInstancesList = NetworkUser.readOnlyInstancesList; for (int k = 0; k < randomNum.Length; k++) { if (readOnlyInstancesList[j].masterController.networkUserInstanceId == readOnlyInstancesList[randomNum[k]].masterController.networkUserInstanceId) { flag = false; } } if (flag) { winsAsInnocent[j]++; } flag = true; } text += "</color>"; ChatMessage.Send(text); EndRoundWarpToNextStage(); } public void EndRoundWarpToNextStage() { SceneDef sceneDef = SceneCatalog.GetSceneDef((SceneIndex)7); string baseSceneName = Run.instance.nextStageScene.baseSceneName; Log.Info("Next Stage Basename: " + baseSceneName); if (roundsPlayed >= maxRounds - 1) { ChatMessage.Send("Round limit of " + maxRounds + " reached. Game Over!"); NetMessageExtensions.Send((INetMessage)(object)new SyncScoreString(scoreDataFromServer), (NetworkDestination)1); syncedScore = scoreDataFromServer; score = new CustomGUI(); score.Init(); Run.instance.BeginGameOver(GameEndingCatalog.gameEndingDefs[3]); return; } if (baseSceneName.Equals("moon2") || baseSceneName.Equals("golemplains") || baseSceneName.Equals("golemplains2") || baseSceneName.Equals("blackbeach") || baseSceneName.Equals("blackbeach2") || baseSceneName.Equals("snowyforest")) { Log.Info("I just pissed on the moon"); switch (Random.Range(0, 4)) { case 0: sceneDef = SceneCatalog.GetSceneDef((SceneIndex)7); break; case 1: sceneDef = SceneCatalog.GetSceneDef((SceneIndex)8); break; case 2: sceneDef = SceneCatalog.GetSceneDef((SceneIndex)15); break; case 3: sceneDef = SceneCatalog.GetSceneDef((SceneIndex)16); break; } Run.instance.nextStageScene = sceneDef; teleport.sceneExitController.destinationScene = sceneDef; } averageItems = new AverageItems(); averageItems.RedistributeItems(); teleport.sceneExitController.SetState((ExitState)1); } private void RoleDisplay() { if (traitorTeamNames.Equals("")) { roleDisplay.UpdateTextInnocent(); roleDisplay.ToggleWindow(); } else { roleDisplay.UpdateTextTraitor(traitorTeamNames); roleDisplay.ToggleWindow(); } } private void Update() { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Invalid comparison between Unknown and I4 if (PlayerCharacterMasterController.instances.Count != 0 && Input.GetKeyDown((KeyCode)283)) { score.UpdateTextContent(syncedScore); score.ToggleWindow(); } if (PlayerCharacterMasterController.instances.Count != 0 && Input.GetKeyDown((KeyCode)284)) { RoleDisplay(); } if (NetworkServer.active) { if ((Object)(object)teleport != (Object)null && deadTraitorCount < randomNum.Length && (int)teleport.sceneExitController.exitState == 1 && !wonByEliminatingAllTraitors && !sentInnoWinMessageAlready && deadInnoCount < playerCount - randomNum.Length && !skippingRound && !traitorWin) { InnocentWinByTeleport(); sentInnoWinMessageAlready = true; EndRoundWarpToNextStage(); } if (NetworkServer.active && Input.GetKeyDown((KeyCode)286)) { ChatMessage.Send("<color=yellow>Host has forced a skip to the next stage.</color>"); EndRoundWarpToNextStage(); skippingRound = true; } } } private string BuildScoreText() { string text = ""; for (int i = 0; i < playerCount; i++) { Log.Info($"Building string for index: {i}"); string displayName = NetworkUser.readOnlyInstancesList[i].masterController.GetDisplayName(); text = text + "Player " + (i + 1) + ": " + displayName + "\n\tInnocent wins: " + winsAsInnocent[i] + "\n\tTraitor wins: " + winsAsTraitor[i] + "\n\tTotal wins: " + (winsAsTraitor[i] + winsAsInnocent[i]) + "\n\tTraitors killed as Innocent: " + killsOnTraitors[i] + "\n\tInnocents killed as Traitor: " + killsOnInnocents[i] + "\n\tTeamkills: " + teamKills[i] + "\n \n"; Log.Info($"Finished String For Index: {i}"); } Log.Info("Finished building all strings."); return text; } private void Stage_onServerStageBegin(Stage stage) { playerCount = PlayerCharacterMasterController.instances.Count; if (newGameStart) { wonByEliminatingAllTraitors = false; winsAsInnocent = new int[playerCount]; winsAsTraitor = new int[playerCount]; teamKills = new int[playerCount]; killsOnTraitors = new int[playerCount]; killsOnInnocents = new int[playerCount]; roundsPlayed = 0; for (int i = 0; i < playerCount; i++) { winsAsInnocent[i] = 0; winsAsTraitor[i] = 0; killsOnTraitors[i] = 0; killsOnInnocents[i] = 0; teamKills[i] = 0; } } else { Run instance = Run.instance; instance.stageClearCount--; roundsPlayed++; } scoreDataFromServer = BuildScoreText(); wonByEliminatingAllTraitors = false; newGameStart = false; innocentWin = false; traitorWin = false; sentInnoWinMessageAlready = false; deadInnoCount = 0; deadTraitorCount = 0; skippingRound = false; if (playerCount <= numTraitors || numTraitors == 0) { ChatMessage.Send("<color=red>WARNING!!!</color> <color=orange>There must be at least one Traitor player. Adjust Traitor count with the console command 'a_traitor_count' and restart.</color>"); } randomNum = new int[numTraitors]; for (int j = 0; j < numTraitors; j++) { int randomVar = Random.Range(1, playerCount + 1); while (Array.Exists(randomNum, (int num) => num == randomVar) && playerCount > 1 && numTraitors > 1) { randomVar = Random.Range(1, playerCount + 1); } randomNum[j] = randomVar; } for (int k = 0; k < randomNum.Length; k++) { randomNum[k]--; } Log.Info("Finished assigning Traitors"); SendRolesToAllPlayers(); string text = "There are <color=red>" + randomNum.Length + "</color> Traitor(s)."; ChatMessage.Send(text); } private void SendRolesToAllPlayers() { string text = "<color=yellow>Your team:</color><color=red> "; traitorTeamNames = ""; string text2 = ""; new SyncTraitorTeam(traitorTeamNames); for (int i = 0; i < randomNum.Length; i++) { NetworkUser val = NetworkUser.readOnlyInstancesList[randomNum[i]]; text = text + val.masterController.GetDisplayName() + " "; text2 = text2 + val.masterController.GetDisplayName() + " "; } text += "</color>"; Log.Info("Successfully built traitor team message"); bool flag = true; for (int j = 0; j < playerCount; j++) { NetworkUser val2 = NetworkUser.readOnlyInstancesList[j]; NetworkConnection networkConnectionFromPlayerControllerIndex = GetNetworkConnectionFromPlayerControllerIndex(j); Log.Info($"Player character: {j}, Connection ID: {networkConnectionFromPlayerControllerIndex.connectionId}"); for (int k = 0; k < randomNum.Length; k++) { if (j == randomNum[k]) { Log.Info($"Traitor character: {j}"); SendMessageFromStringAndIndex("<color=red>TRAITOR:</color> Eliminate all Innocent players to win.", j); if (j == 0) { traitorTeamNames = text2; } else { NetMessageExtensions.Send((INetMessage)(object)new SyncTraitorTeam(text2), networkConnectionFromPlayerControllerIndex); } if (randomNum.Length >= 1) { SendMessageFromStringAndIndex(text, j); } flag = false; } } if (flag) { SendMessageFromStringAndIndex("<color=green>INNOCENT:</color> Escape via the teleporter to win, or eliminate all Traitors.", j); if (j != 0) { NetMessageExtensions.Send((INetMessage)(object)new SyncTraitorTeam(""), networkConnectionFromPlayerControllerIndex); } } flag = true; } } private void InnocentWinByTeleport() { //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) innocentWin = true; traitorWin = false; string text = "<color=green>Innocents win!</color> Traitors: <color=red>"; for (int i = 0; i < randomNum.Length; i++) { NetworkUser val = NetworkUser.readOnlyInstancesList[randomNum[i]]; text = text + val.masterController.GetDisplayName() + " "; } bool flag = true; for (int j = 0; j < playerCount; j++) { NetworkUser val2 = NetworkUser.readOnlyInstancesList[j]; for (int k = 0; k < randomNum.Length; k++) { NetworkUser val3 = NetworkUser.readOnlyInstancesList[randomNum[k]]; if (val2.masterController.networkUserInstanceId == val3.masterController.networkUserInstanceId) { flag = false; } } if (flag) { Log.Info("Adding a win to player: " + val2.masterController.GetDisplayName()); winsAsInnocent[j]++; } flag = true; } text += "</color>"; ChatMessage.Send(text); } } public class SyncScoreString : INetMessage, ISerializableObject { private string networkSyncScoreString = "Default unsynced"; public SyncScoreString() { } public SyncScoreString(string newString) { networkSyncScoreString = newString; } public void Deserialize(NetworkReader reader) { RiskOfTraitors.syncedScore = reader.ReadString(); } public void OnReceived() { if (!NetworkServer.active) { } } public void Serialize(NetworkWriter writer) { writer.Write(networkSyncScoreString); } } public class SyncTraitorTeam : INetMessage, ISerializableObject { private string traitorTeam = "none"; public SyncTraitorTeam() { } public SyncTraitorTeam(string traitorTeam) { this.traitorTeam = traitorTeam; } public void Deserialize(NetworkReader reader) { RiskOfTraitors.traitorTeamNames = reader.ReadString(); } public void OnReceived() { if (NetworkServer.active) { Log.Info("SyncTraitorTeam: Host ran this. Skip."); } } public void Serialize(NetworkWriter writer) { writer.Write(traitorTeam); } } public class SyncPlayerMonsterDamage : INetMessage, ISerializableObject { private int oldPlayerDamageMul = 0; private int playerOutgoingDamageMul = 0; private int oldEnemyDamageMul = 0; private int enemyOutgoingDamageMul = 0; private bool updatePlayerMul = false; private bool updateEnemyMul = false; public SyncPlayerMonsterDamage() { } public SyncPlayerMonsterDamage(int oldPlayerMul, int curPlayerMul, int oldEnemyMul, int curEnemyMul, bool updatePlayerMul, bool updateEnemyMul) { oldPlayerDamageMul = oldPlayerMul; playerOutgoingDamageMul = curPlayerMul; oldEnemyDamageMul = oldEnemyMul; enemyOutgoingDamageMul = curEnemyMul; this.updatePlayerMul = updatePlayerMul; this.updateEnemyMul = updateEnemyMul; } public void Deserialize(NetworkReader reader) { RiskOfTraitors.oldPlayerDamageMul = reader.ReadInt32(); RiskOfTraitors.playerOutgoingDamageMul = reader.ReadInt32(); RiskOfTraitors.oldEnemyDamageMul = reader.ReadInt32(); RiskOfTraitors.enemyOutgoingDamageMul = reader.ReadInt32(); RiskOfTraitors.updatePlayerDamageMul = reader.ReadBoolean(); RiskOfTraitors.updateMonsterDamageMul = reader.ReadBoolean(); } public void OnReceived() { if (NetworkServer.active) { Log.Info("SyncTraitorTeam: Host ran this. Skip."); return; } Log.Info($"Received muls from server: {oldPlayerDamageMul}, {playerOutgoingDamageMul}, {oldEnemyDamageMul}, {enemyOutgoingDamageMul}"); } public void Serialize(NetworkWriter writer) { writer.Write(oldPlayerDamageMul); writer.Write(playerOutgoingDamageMul); writer.Write(oldEnemyDamageMul); writer.Write(enemyOutgoingDamageMul); writer.Write(updatePlayerMul); writer.Write(updateEnemyMul); } } public class SyncWinningTeam : INetMessage, ISerializableObject { private bool didInnocentWin = true; private string traitorTeam = ""; public SyncWinningTeam() { } public SyncWinningTeam(bool didInnocentWin, string traitorTeam) { this.didInnocentWin = didInnocentWin; this.traitorTeam = traitorTeam; } public void Deserialize(NetworkReader reader) { didInnocentWin = reader.ReadBoolean(); traitorTeam = reader.ReadString(); } public void OnReceived() { if (NetworkServer.active) { Log.Info("SyncTraitorTeam: Host ran this. Skip."); } } public void Serialize(NetworkWriter writer) { writer.Write(didInnocentWin); writer.Write(traitorTeam); } } public class RoleDisplayUI : MonoBehaviour { private GameObject canvas; public GameObject windowPanel; public Text roleText; public bool windowVisible = false; public void Init() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) canvas = new GameObject("Canvas", new Type[2] { typeof(Canvas), typeof(CanvasScaler) }); canvas.GetComponent<Canvas>().renderMode = (RenderMode)0; windowPanel = new GameObject("WindowPanel"); windowPanel.AddComponent<CanvasRenderer>(); ((Graphic)windowPanel.AddComponent<Image>()).color = new Color(0.1f, 0.1f, 0.15f, 0.9f); windowPanel.transform.SetParent(canvas.transform); windowPanel.GetComponent<RectTransform>().anchorMin = new Vector2(0.05f, 0.33f); windowPanel.GetComponent<RectTransform>().anchorMax = new Vector2(0.2f, 0.4f); windowPanel.GetComponent<RectTransform>().anchoredPosition = Vector2.zero; roleText = new GameObject("roleText").AddComponent<Text>(); ((Component)roleText).transform.SetParent(windowPanel.transform); ((Graphic)roleText).rectTransform.anchorMin = new Vector2(0.01f, 1f); ((Graphic)roleText).rectTransform.anchorMax = new Vector2(0.01f, 1f); ((Graphic)roleText).rectTransform.pivot = new Vector2(0f, 1f); ((Graphic)roleText).rectTransform.anchoredPosition = Vector2.zero; roleText.font = Resources.GetBuiltinResource<Font>("Arial.ttf"); ((Graphic)roleText).color = Color.white; roleText.fontSize = 22; roleText.text = "Your text content here"; roleText.horizontalOverflow = (HorizontalWrapMode)0; roleText.verticalOverflow = (VerticalWrapMode)1; RectTransform rectTransform = ((Graphic)roleText).rectTransform; Rect rect = windowPanel.GetComponent<RectTransform>().rect; float width = ((Rect)(ref rect)).width; rect = windowPanel.GetComponent<RectTransform>().rect; rectTransform.sizeDelta = new Vector2(width, ((Rect)(ref rect)).height); AdjustFontSizeToFit(roleText); windowPanel.SetActive(false); } private void AdjustFontSizeToFit(Text roleText) { //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) while (true) { float preferredHeight = roleText.preferredHeight; Rect rect = ((Graphic)roleText).rectTransform.rect; if (preferredHeight > ((Rect)(ref rect)).height && roleText.fontSize > 12) { int fontSize = roleText.fontSize; roleText.fontSize = fontSize - 1; continue; } break; } } public void UpdateTextTraitor(string traitorTeam) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) roleText.text = "Role: Traitor\n " + traitorTeam; ((Graphic)roleText).color = Color.red; AdjustFontSizeToFit(roleText); } public void UpdateTextInnocent() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) roleText.text = "Role: Innocent"; ((Graphic)roleText).color = Color.green; AdjustFontSizeToFit(roleText); } public void ToggleWindow() { windowVisible = !windowVisible; windowPanel.SetActive(windowVisible); } } public class CustomGUI : MonoBehaviour { private GameObject canvas; public GameObject windowPanel; public Text textElement; public bool windowVisible = false; public void Init() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) canvas = new GameObject("Canvas", new Type[2] { typeof(Canvas), typeof(CanvasScaler) }); canvas.GetComponent<Canvas>().renderMode = (RenderMode)0; windowPanel = new GameObject("WindowPanel"); windowPanel.AddComponent<CanvasRenderer>(); ((Graphic)windowPanel.AddComponent<Image>()).color = new Color(0.1f, 0.1f, 0.15f, 0.9f); windowPanel.transform.SetParent(canvas.transform); windowPanel.GetComponent<RectTransform>().anchorMin = new Vector2(0.25f, 0.1f); windowPanel.GetComponent<RectTransform>().anchorMax = new Vector2(0.75f, 0.9f); windowPanel.GetComponent<RectTransform>().anchoredPosition = Vector2.zero; textElement = new GameObject("TextElement").AddComponent<Text>(); ((Component)textElement).transform.SetParent(windowPanel.transform); ((Graphic)textElement).rectTransform.anchorMin = new Vector2(0.01f, 1f); ((Graphic)textElement).rectTransform.anchorMax = new Vector2(0.01f, 1f); ((Graphic)textElement).rectTransform.pivot = new Vector2(0f, 1f); ((Graphic)textElement).rectTransform.anchoredPosition = Vector2.zero; textElement.font = Resources.GetBuiltinResource<Font>("Arial.ttf"); ((Graphic)textElement).color = Color.white; textElement.fontSize = 28; textElement.text = "Your text content here"; textElement.horizontalOverflow = (HorizontalWrapMode)0; textElement.verticalOverflow = (VerticalWrapMode)1; RectTransform rectTransform = ((Graphic)textElement).rectTransform; Rect rect = windowPanel.GetComponent<RectTransform>().rect; float width = ((Rect)(ref rect)).width; rect = windowPanel.GetComponent<RectTransform>().rect; rectTransform.sizeDelta = new Vector2(width, ((Rect)(ref rect)).height); AdjustFontSizeToFit(textElement); windowPanel.SetActive(false); } private void AdjustFontSizeToFit(Text textElement) { //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) while (true) { float preferredHeight = textElement.preferredHeight; Rect rect = ((Graphic)textElement).rectTransform.rect; if (preferredHeight > ((Rect)(ref rect)).height && textElement.fontSize > 12) { int fontSize = textElement.fontSize; textElement.fontSize = fontSize - 1; continue; } break; } } public void UpdateTextContent(string newText) { textElement.text = newText; AdjustFontSizeToFit(textElement); } public void ToggleWindow() { windowVisible = !windowVisible; windowPanel.SetActive(windowVisible); } } }