Some mods may be broken due to the recent Alloyed Collective update.
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); } } }