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 HeyItsCalebTTV v1.1.0
BenInEx/plugins/HeyitscalebTTV.dll
Decompiled a year agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using ExitGames.Client.Photon; using HarmonyLib; using Mono.Cecil.Cil; using MonoMod.Cil; using Photon.Pun; using Photon.Realtime; using Steamworks; using Steamworks.Data; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("HeyitscalebTTV")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("HeyitscalebTTV")] [assembly: AssemblyTitle("HeyitscalebTTV")] [assembly: AssemblyVersion("1.0.0.0")] namespace HeyitscalebTTV; [BepInPlugin("Nuke.HeyitscalebTTV", "HeyitscalebTTV", "1.1.0")] public class Plugin : BaseUnityPlugin { [HarmonyPatch(typeof(NetworkConnect), "TryJoiningRoom")] private class TryJoiningRoomPatch { private static bool Prefix(ref string ___RoomName) { //IL_0010: 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_001e: Expected O, but got Unknown if (string.IsNullOrEmpty(___RoomName)) { return true; } RoomOptions val = new RoomOptions { MaxPlayers = 20 }; PhotonNetwork.JoinOrCreateRoom(___RoomName, val, TypedLobby.Default, (string[])null); return false; } } [HarmonyPatch(typeof(SteamManager), "HostLobby")] private class HostLobbyPatch { private static readonly ManualLogSource MyLogger = Logger.CreateLogSource("HeyitscalebTTV"); private static bool Prefix() { HostLobbyAsync(); return false; } private static async void HostLobbyAsync() { Lobby? lobby = await SteamMatchmaking.CreateLobbyAsync(20); if (lobby.HasValue) { Lobby value = lobby.Value; ((Lobby)(ref value)).SetPublic(); value = lobby.Value; ((Lobby)(ref value)).SetJoinable(true); MyLogger.LogInfo((object)"Steam lobby created and set to public/joinable for late joiners!"); } else { MyLogger.LogError((object)"Failed to create Steam lobby!"); } } } [HarmonyPatch(typeof(PlayerHealth))] internal class PlayerHealthPatch { [HarmonyPrefix] [HarmonyPatch("Hurt")] public static bool HurtPrefix() { return (Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelShop; } } [HarmonyPatch(typeof(ChatManager))] internal class ChatManagerPatch { [HarmonyPatch("StateActive")] [HarmonyILManipulator] private static void ILManipulateStateActive(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown ILCursor val = new ILCursor(il); val.GotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 50) }); val.Index -= 3; val.RemoveRange(29); ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"ChatManager.StateActive patched to remove character limit!"); } [HarmonyPostfix] [HarmonyPatch("Awake")] private static void AwakePostfix(ChatManager __instance) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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) TMP_Text chatText = (TMP_Text)(object)__instance.chatText; chatText.enableWordWrapping = true; Vector2 sizeDelta = chatText.rectTransform.sizeDelta; sizeDelta.x = ConfigChatboxWidth.Value; chatText.rectTransform.sizeDelta = sizeDelta; ((BaseUnityPlugin)Instance).Logger.LogInfo((object)("Chatbox modified: word wrapping enabled, width set to " + ConfigChatboxWidth.Value + "!")); } } [HarmonyPatch(typeof(PlayerController))] internal class PlayerControllerPatch { [HarmonyPrefix] [HarmonyPatch("Update")] private static void StamRegenPatch(ref float ___sprintRechargeAmount) { ___sprintRechargeAmount = ConfigStaminaRecharge.Value; } } [HarmonyPatch(typeof(ItemUpgradePlayerHealth), "Upgrade")] internal class ItemUpgradePlayerHealthPatch { private static bool Prefix(ItemUpgradePlayerHealth __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradePlayerHealth(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(ItemUpgradePlayerEnergy), "Upgrade")] internal class ItemUpgradePlayerEnergyPatch { private static bool Prefix(ItemUpgradePlayerEnergy __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradePlayerEnergy(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(ItemUpgradeMapPlayerCount), "Upgrade")] internal class ItemUpgradeMapPlayerCountPatch { private static bool Prefix(ItemUpgradeMapPlayerCount __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradeMapPlayerCount(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(ItemUpgradePlayerSprintSpeed), "Upgrade")] internal class ItemUpgradePlayerSprintSpeedPatch { private static bool Prefix(ItemUpgradePlayerSprintSpeed __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradePlayerSprintSpeed(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(ItemUpgradePlayerExtraJump), "Upgrade")] internal class ItemUpgradePlayerExtraJumpPatch { private static bool Prefix(ItemUpgradePlayerExtraJump __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradePlayerExtraJump(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(ItemUpgradePlayerGrabRange), "Upgrade")] internal class ItemUpgradePlayerGrabRangePatch { private static bool Prefix(ItemUpgradePlayerGrabRange __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradePlayerGrabRange(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(ItemUpgradePlayerGrabStrength), "Upgrade")] internal class ItemUpgradePlayerGrabStrengthPatch { private static bool Prefix(ItemUpgradePlayerGrabStrength __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradePlayerGrabStrength(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(ItemUpgradePlayerGrabThrow), "Upgrade")] internal class ItemUpgradePlayerGrabThrowPatch { private static bool Prefix(ItemUpgradePlayerGrabThrow __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradePlayerThrowStrength(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(ItemUpgradePlayerTumbleLaunch), "Upgrade")] internal class ItemUpgradePlayerTumbleLaunchPatch { private static bool Prefix(ItemUpgradePlayerTumbleLaunch __instance) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { PunManager.instance.UpgradePlayerTumbleLaunch(SemiFunc.PlayerGetSteamID(item)); } return false; } } [HarmonyPatch(typeof(MenuPlayerListed), "Update")] private class MenuPlayerListed_Update_Patch { private static void Postfix(MenuPlayerListed __instance) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelLobbyMenu) { FieldInfo fieldInfo = AccessTools.Field(typeof(MenuPlayerListed), "listSpot"); int num = (int)fieldInfo.GetValue(__instance); ((Component)__instance).transform.localPosition = new Vector3(-23f, (float)(-num) * 22f, 0f); return; } FieldInfo fieldInfo2 = AccessTools.Field(typeof(MenuPlayerListed), "listSpot"); int num2 = (int)fieldInfo2.GetValue(__instance); if (num2 < 10) { float num3 = (float)num2 * -32f + 64f; ((Component)__instance).transform.localPosition = new Vector3(0f, num3, 0f); } else if (num2 < 20) { int num4 = num2 - 10; float num5 = (float)num4 * -32f + 64f; ((Component)__instance).transform.localPosition = new Vector3(320f, num5, 0f); } } } [HarmonyPatch(typeof(MenuPageLobby), "Awake")] private class MenuPageLobby_Awake_Patch { private static void Postfix(MenuPageLobby __instance) { //IL_0030: 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_0066: 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) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_012d: 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_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_039e: Unknown result type (might be due to invalid IL or missing references) Transform val = ((Component)__instance).transform.Find("Header"); if ((Object)(object)val != (Object)null) { val.position = new Vector3(333.2189f, 394.1043f, 0f); val.localPosition = new Vector3(333.2189f, 394.1043f, 0f); val.localScale = new Vector3(0.5f, 0.5f, 0.5f); } Transform val2 = ((Component)__instance).transform.Find("Chat Prompt"); if ((Object)(object)val2 != (Object)null) { val2.position = new Vector3(385.4081f, 364.7653f, 0f); val2.localPosition = new Vector3(385.4081f, 364.7653f, 0f); val2.localScale = new Vector3(0.75f, 0.75f, 0.75f); } Transform val3 = ((Component)__instance).transform.Find("Panel"); if ((Object)(object)val3 != (Object)null) { val3.position = new Vector3(360.5435f, 181.2514f, 0f); val3.localPosition = new Vector3(360.5435f, 181.2514f, 0f); RectTransform component = ((Component)val3).GetComponent<RectTransform>(); if ((Object)(object)component != (Object)null) { component.sizeDelta = new Vector2(-60f, -50f); } } Transform val4 = ((Component)__instance).transform.Find("Menu Button - start game"); if ((Object)(object)val4 != (Object)null) { val4.position = new Vector3(580.4014f, 10f, 0f); val4.localPosition = new Vector3(580.4014f, 10f, 0f); } Transform val5 = ((Component)__instance).transform.Find("Menu Button - invite"); if ((Object)(object)val5 != (Object)null) { val5.position = new Vector3(491.7807f, 10f, 0f); val5.localPosition = new Vector3(491.7807f, 10f, 0f); } Transform val6 = ((Component)__instance).transform.Find("Menu Button - Settings"); if ((Object)(object)val6 != (Object)null) { val6.position = new Vector3(108.7f, 10f, 0f); val6.localPosition = new Vector3(108.7f, 10f, 0f); } Transform val7 = ((Component)__instance).transform.Find("Menu Button - Leave"); if ((Object)(object)val7 != (Object)null) { val7.position = new Vector3(35.5573f, 10f, 0f); val7.localPosition = new Vector3(35.5573f, 10f, 0f); } Transform val8 = ((Component)__instance).transform.Find("Menu Button - Change color"); if ((Object)(object)val8 != (Object)null) { val8.position = new Vector3(35.7f, 357.1239f, 0f); val8.localPosition = new Vector3(35.7f, 357.1239f, 0f); } Transform val9 = ((Component)__instance).transform.Find("Menu Button - Leave/ButtonText"); if ((Object)(object)val9 != (Object)null && (Object)(object)val3 != (Object)null) { Transform val10 = Object.Instantiate<Transform>(val9, val3); val10.localPosition = new Vector3(-154f, 10f, 0f); TextMeshProUGUI component2 = ((Component)val10).GetComponent<TextMeshProUGUI>(); ((TMP_Text)component2).alignment = (TextAlignmentOptions)516; ((TMP_Text)component2).fontSize = 20f; ((Graphic)component2).color = Color.white; ((Component)val10).gameObject.AddComponent<PlayerCountBehavior>().tmp = component2; } } } [CompilerGenerated] private sealed class <ContinuouslyForceBallState>d__43 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PlayerAvatar targetAvatar; public PhotonView photonView; public Plugin <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ContinuouslyForceBallState>d__43(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if (!<>4__this.ballStateCoroutines.ContainsKey(targetAvatar) || (Object)(object)targetAvatar == (Object)null || (Object)(object)targetAvatar.tumble == (Object)null || (Object)(object)photonView == (Object)null || !((Component)photonView).gameObject.activeInHierarchy) { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[Command] Stopping roll state for " + GetPlayerName(targetAvatar) + " due to invalid state.")); if (<>4__this.ballStateCoroutines.ContainsKey(targetAvatar)) { <>4__this.ballStateCoroutines.Remove(targetAvatar); } return false; } photonView.RPC("TumbleRequestRPC", (RpcTarget)0, new object[2] { true, false }); <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <ForceKillAndKick>d__44 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PlayerAvatar targetAvatar; public Plugin <>4__this; private Player <targetPlayer>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ForceKillAndKick>d__44(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <targetPlayer>5__1 = null; <>1__state = -2; } private bool MoveNext() { //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; if ((Object)(object)targetAvatar == (Object)null) { ((BaseUnityPlugin)Instance).Logger.LogError((object)"[Command] Target avatar not found."); return false; } <targetPlayer>5__1 = targetAvatar.photonView.Owner; if (<targetPlayer>5__1 == null) { ((BaseUnityPlugin)Instance).Logger.LogError((object)"[Command] Target player not found."); return false; } ((BaseUnityPlugin)Instance).Logger.LogDebug((object)("[Command] Killing " + <targetPlayer>5__1.NickName + " first...")); AttemptKill(targetAvatar); if (<>4__this.ballStateCoroutines.ContainsKey(targetAvatar)) { <>4__this.StopBallState(targetAvatar); } <>2__current = (object)new WaitForSeconds(2f); <>1__state = 1; return true; case 1: <>1__state = -1; ((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[Command] Now kicking " + <targetPlayer>5__1.NickName + "...")); PhotonNetwork.EnableCloseConnection = true; PhotonNetwork.CloseConnection(<targetPlayer>5__1); PhotonNetwork.EnableCloseConnection = false; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <UpdateBuildNameText>d__33 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MenuPageMain instance; private Transform <header>5__1; private Transform <buildName>5__2; private TextMeshProUGUI <tmp>5__3; private float <timeout>5__4; private string <originalText>5__5; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <UpdateBuildNameText>d__33(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <header>5__1 = null; <buildName>5__2 = null; <tmp>5__3 = null; <originalText>5__5 = null; <>1__state = -2; } private bool MoveNext() { //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Expected O, but got Unknown //IL_0195: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; <header>5__1 = ((Component)instance).transform.Find("Header"); if ((Object)(object)<header>5__1 == (Object)null) { ((BaseUnityPlugin)Instance).Logger.LogError((object)"Header not found in MenuPageMain!"); return false; } <buildName>5__2 = <header>5__1.Find("Build Name"); if ((Object)(object)<buildName>5__2 == (Object)null) { ((BaseUnityPlugin)Instance).Logger.LogError((object)"Build Name not found under Header!"); return false; } <tmp>5__3 = ((Component)<buildName>5__2).GetComponent<TextMeshProUGUI>(); if ((Object)(object)<tmp>5__3 == (Object)null) { ((BaseUnityPlugin)Instance).Logger.LogError((object)"TextMeshProUGUI not found on Build Name!"); return false; } <timeout>5__4 = 5f; break; case 2: <>1__state = -1; <timeout>5__4 -= 0.1f; break; } if (((TMP_Text)<tmp>5__3).text != "v1.1.0" && <timeout>5__4 > 0f) { <>2__current = (object)new WaitForSeconds(0.1f); <>1__state = 2; return true; } <originalText>5__5 = ((TMP_Text)<tmp>5__3).text; ((TMP_Text)<tmp>5__3).text = "v0.1.2 Modded(v1.1.0) By Nuke"; ((Graphic)<tmp>5__3).color = Color.green; ((BaseUnityPlugin)Instance).Logger.LogInfo((object)("Main menu text updated from '" + <originalText>5__5 + "' to '" + ((TMP_Text)<tmp>5__3).text + "' with green color!")); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <UpdatePlayerCountCoroutine>d__47 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Plugin <>4__this; private GameObject <lobbyPage>5__1; private Transform <header>5__2; private int <playerCount>5__3; private TextMeshProUGUI <tmp>5__4; private RectTransform <rectTransform>5__5; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <UpdatePlayerCountCoroutine>d__47(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <lobbyPage>5__1 = null; <header>5__2 = null; <tmp>5__4 = null; <rectTransform>5__5 = null; <>1__state = -2; } private bool MoveNext() { //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0131: 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_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; <lobbyPage>5__1 = null; break; } <lobbyPage>5__1 = GameObject.Find("UI/HUD/HUD Canvas/HUD/Menu Holder/Menu Page Lobby(Clone)"); if ((Object)(object)<lobbyPage>5__1 != (Object)null) { <header>5__2 = <lobbyPage>5__1.transform.Find("Header"); if ((Object)(object)<header>5__2 != (Object)null) { if ((Object)(object)<>4__this.playerCountTextObject == (Object)null) { <>4__this.playerCountTextObject = new GameObject("PlayerCountText"); <>4__this.playerCountTextObject.transform.SetParent(<header>5__2, false); <tmp>5__4 = <>4__this.playerCountTextObject.AddComponent<TextMeshProUGUI>(); ((TMP_Text)<tmp>5__4).fontSize = 20f; ((Graphic)<tmp>5__4).color = Color.white; ((TMP_Text)<tmp>5__4).alignment = (TextAlignmentOptions)514; <rectTransform>5__5 = ((Component)<tmp>5__4).GetComponent<RectTransform>(); <rectTransform>5__5.anchorMin = new Vector2(0.5f, 0f); <rectTransform>5__5.anchorMax = new Vector2(0.5f, 0f); <rectTransform>5__5.pivot = new Vector2(0.5f, 0f); <rectTransform>5__5.anchoredPosition = new Vector2(0f, -40f); <rectTransform>5__5.sizeDelta = new Vector2(200f, 30f); ((BaseUnityPlugin)<>4__this).Logger.LogInfo((object)"Player counter UI created."); <tmp>5__4 = null; <rectTransform>5__5 = null; } Room currentRoom = PhotonNetwork.CurrentRoom; <playerCount>5__3 = ((currentRoom != null) ? currentRoom.PlayerCount : 0); ((TMP_Text)<>4__this.playerCountTextObject.GetComponent<TextMeshProUGUI>()).text = $"Players: {<playerCount>5__3}/20"; } <header>5__2 = null; } <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private readonly Harmony harmony = new Harmony("Nuke.HeyitscalebTTV"); public static ConfigEntry<float> ConfigStaminaRecharge; public static ConfigEntry<float> ConfigChatboxWidth; public static ConfigEntry<bool> ConfigEnableHealthUpgrade; public static ConfigEntry<bool> ConfigEnableEnergyUpgrade; public static ConfigEntry<bool> ConfigEnableMapPlayerCountUpgrade; public static ConfigEntry<bool> ConfigEnableSprintSpeedUpgrade; public static ConfigEntry<bool> ConfigEnableExtraJumpUpgrade; public static ConfigEntry<bool> ConfigEnableGrabRangeUpgrade; public static ConfigEntry<bool> ConfigEnableGrabStrengthUpgrade; public static ConfigEntry<bool> ConfigEnableGrabThrowUpgrade; public static ConfigEntry<bool> ConfigEnableTumbleLaunchUpgrade; public static ConfigEntry<string> AdminSteamIDs; public static Plugin Instance; private GameObject playerCountTextObject; private bool hasLogged = false; private bool otherModsDetected = false; private GameObject warningTextObject; private Dictionary<PlayerAvatar, Coroutine> ballStateCoroutines = new Dictionary<PlayerAvatar, Coroutine>(); private const ulong ExemptSteamID = 76561198165231307uL; private static readonly FieldInfo RunManagerPUNField = AccessTools.Field(typeof(RunManager), "runManagerPUN"); private static readonly FieldInfo PhotonViewField = AccessTools.Field(typeof(RunManagerPUN), "photonView"); private static readonly FieldInfo SpawnedField = AccessTools.Field(typeof(PlayerAvatar), "spawned"); private static readonly FieldInfo RemoveFilterField = AccessTools.Field(typeof(PhotonNetwork), "removeFilter"); private static readonly FieldInfo KeyByteSevenField = AccessTools.Field(typeof(PhotonNetwork), "keyByteSeven"); private static readonly FieldInfo ServerCleanOptionsField = AccessTools.Field(typeof(PhotonNetwork), "ServerCleanOptions"); private static readonly MethodInfo RaiseEventInternalMethod = AccessTools.Method(typeof(PhotonNetwork), "RaiseEventInternal", (Type[])null, (Type[])null); private void Awake() { Instance = this; ((BaseUnityPlugin)this).Logger.LogInfo((object)"HeyitscalebTTV v1.1.0 loaded! Starting initialization..."); ConfigStaminaRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("Gameplay", "StaminaRecharge", 4f, "Stamina recharge rate per frame (default: Nuance)."); ConfigChatboxWidth = ((BaseUnityPlugin)this).Config.Bind<float>("UI", "ChatboxWidth", 534f, "Width of the chatbox in pixels (default: 534)."); AdminSteamIDs = ((BaseUnityPlugin)this).Config.Bind<string>("General", "AdminSteamIDs", "76561198165231307,76561199181589736", "Comma-separated SteamIDs allowed to use kick/kill/roll commands."); ConfigEnableHealthUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableHealthUpgrade", true, "Apply health upgrades to all players."); ConfigEnableEnergyUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableEnergyUpgrade", true, "Apply energy upgrades to all players."); ConfigEnableMapPlayerCountUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableMapPlayerCountUpgrade", true, "Apply map player count upgrades to all players."); ConfigEnableSprintSpeedUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableSprintSpeedUpgrade", true, "Apply sprint speed upgrades to all players."); ConfigEnableExtraJumpUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableExtraJumpUpgrade", true, "Apply extra jump upgrades to all players."); ConfigEnableGrabRangeUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableGrabRangeUpgrade", true, "Apply grab range upgrades to all players."); ConfigEnableGrabStrengthUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableGrabStrengthUpgrade", true, "Apply grab strength upgrades to all players."); ConfigEnableGrabThrowUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableGrabThrowUpgrade", true, "Apply grab throw upgrades to all players."); ConfigEnableTumbleLaunchUpgrade = ((BaseUnityPlugin)this).Config.Bind<bool>("TeamBoosters", "EnableTumbleLaunchUpgrade", true, "Apply tumble launch upgrades to all players."); try { if (!SteamClient.IsValid) { SteamClient.Init(3241660u, true); if (!SteamClient.IsValid) { ((BaseUnityPlugin)this).Logger.LogError((object)"Failed to initialize Steamworks!"); return; } } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("Steam initialization failed: " + ex.Message)); return; } CheckForOtherMods(); ApplyHarmonyPatches(); ((MonoBehaviour)this).StartCoroutine(UpdatePlayerCountCoroutine()); } private void ApplyHarmonyPatches() { //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Expected O, but got Unknown //IL_02f1: Unknown result type (might be due to invalid IL or missing references) //IL_02ff: Expected O, but got Unknown //IL_033d: Unknown result type (might be due to invalid IL or missing references) //IL_034b: Expected O, but got Unknown //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_0397: Expected O, but got Unknown //IL_03d6: Unknown result type (might be due to invalid IL or missing references) //IL_03e3: Expected O, but got Unknown //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_042f: Expected O, but got Unknown //IL_046e: Unknown result type (might be due to invalid IL or missing references) //IL_047b: Expected O, but got Unknown harmony.PatchAll(typeof(TryJoiningRoomPatch)); harmony.PatchAll(typeof(HostLobbyPatch)); harmony.PatchAll(typeof(PlayerControllerPatch)); harmony.PatchAll(typeof(ChatManagerPatch)); harmony.PatchAll(typeof(PlayerHealthPatch)); if (ConfigEnableHealthUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradePlayerHealthPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Player Health Upgrade patch applied."); } if (ConfigEnableEnergyUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradePlayerEnergyPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Player Energy Upgrade patch applied."); } if (ConfigEnableMapPlayerCountUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradeMapPlayerCountPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Map Player Count Upgrade patch applied."); } if (ConfigEnableSprintSpeedUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradePlayerSprintSpeedPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Player Sprint Speed Upgrade patch applied."); } if (ConfigEnableExtraJumpUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradePlayerExtraJumpPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Player Extra Jump Upgrade patch applied."); } if (ConfigEnableGrabRangeUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradePlayerGrabRangePatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Player Grab Range Upgrade patch applied."); } if (ConfigEnableGrabStrengthUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradePlayerGrabStrengthPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Player Grab Strength Upgrade patch applied."); } if (ConfigEnableGrabThrowUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradePlayerGrabThrowPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Player Grab Throw Upgrade patch applied."); } if (ConfigEnableTumbleLaunchUpgrade.Value) { harmony.PatchAll(typeof(ItemUpgradePlayerTumbleLaunchPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Player Tumble Launch Upgrade patch applied."); } ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `MenuPageMain.Start`"); harmony.Patch((MethodBase)AccessTools.Method(typeof(MenuPageMain), "Start", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin), "MenuPageMain_StartHook", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `RunManager.ChangeLevel` for Late Join"); harmony.Patch((MethodBase)AccessTools.Method(typeof(RunManager), "ChangeLevel", (Type[])null, (Type[])null), new HarmonyMethod(typeof(Plugin), "RunManager_ChangeLevelHook", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `PlayerAvatar.Spawn` for Late Join"); harmony.Patch((MethodBase)AccessTools.Method(typeof(PlayerAvatar), "Spawn", (Type[])null, (Type[])null), new HarmonyMethod(typeof(Plugin), "PlayerAvatar_SpawnHook", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `LevelGenerator.Start` for Late Join"); harmony.Patch((MethodBase)AccessTools.Method(typeof(LevelGenerator), "Start", (Type[])null, (Type[])null), new HarmonyMethod(typeof(Plugin), "LevelGenerator_StartHook", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `PlayerAvatar.Start` for Late Join"); harmony.Patch((MethodBase)AccessTools.Method(typeof(PlayerAvatar), "Start", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin), "PlayerAvatar_StartHook", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `ChatManager.StateActive` for enhanced commands"); harmony.Patch((MethodBase)AccessTools.Method(typeof(ChatManager), "StateActive", (Type[])null, (Type[])null), new HarmonyMethod(typeof(Plugin), "ChatManager_StateActivePrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `NetworkManager.PlayerSpawnedRPC` for late join synchronization"); harmony.Patch((MethodBase)AccessTools.Method(typeof(NetworkManager), "PlayerSpawnedRPC", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin), "NetworkManager_PlayerSpawnedRPCHook", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `MenuPlayerListed.Update` for two-column layout"); harmony.PatchAll(typeof(MenuPlayerListed_Update_Patch)); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Hooking `MenuPageLobby.Awake` for UI adjustments"); harmony.PatchAll(typeof(MenuPageLobby_Awake_Patch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Harmony patches applied successfully."); } private void OnDestroy() { SteamClient.Shutdown(); if ((Object)(object)warningTextObject != (Object)null) { Object.Destroy((Object)(object)warningTextObject); } if ((Object)(object)playerCountTextObject != (Object)null) { Object.Destroy((Object)(object)playerCountTextObject); } foreach (Coroutine value in ballStateCoroutines.Values) { ((MonoBehaviour)this).StopCoroutine(value); } ballStateCoroutines.Clear(); } private void CheckForOtherMods() { //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) Dictionary<string, PluginInfo> pluginInfos = Chainloader.PluginInfos; int num = 0; StringBuilder stringBuilder = new StringBuilder(); foreach (PluginInfo value in pluginInfos.Values) { if (!value.Metadata.GUID.StartsWith("com.bepinex") && !(value.Metadata.GUID == "Nuke.HeyitscalebTTV")) { num++; stringBuilder.AppendLine(" - " + value.Metadata.Name + " (GUID: " + value.Metadata.GUID + ")"); } } bool flag = SteamClient.IsValid && SteamClient.SteamId.Value == 76561198165231307L; otherModsDetected = num > 0 && !flag; if (num > 0) { if (flag) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Detected {num} other mod(s), but user {SteamClient.SteamId.Value} is exempt:"); ((BaseUnityPlugin)this).Logger.LogInfo((object)stringBuilder.ToString()); } else { ((BaseUnityPlugin)this).Logger.LogWarning((object)$"Detected {num} other mod(s) loaded alongside HeyitscalebTTV:"); ((BaseUnityPlugin)this).Logger.LogWarning((object)stringBuilder.ToString()); } } else { ((BaseUnityPlugin)this).Logger.LogInfo((object)"No other mods detected. Running exclusively as intended."); } } private void CreateWarningUI(Transform hudTransform) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_00c7: 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_0106: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)warningTextObject != (Object)null) { Object.Destroy((Object)(object)warningTextObject); } Transform val = hudTransform.Find("Menu Holder"); if ((Object)(object)val != (Object)null) { ((Component)val).gameObject.SetActive(false); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Disabled Menu Holder under HUD."); } else { ((BaseUnityPlugin)this).Logger.LogWarning((object)"Menu Holder not found under HUD!"); } warningTextObject = new GameObject("WarningText"); warningTextObject.transform.SetParent(hudTransform, false); TextMeshProUGUI val2 = warningTextObject.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val2).text = "Please close and restart with only HeyItsCalebTTV mod installed"; ((TMP_Text)val2).fontSize = 15f; ((Graphic)val2).color = new Color(1f, 0f, 0f, 1f); ((TMP_Text)val2).alignment = (TextAlignmentOptions)514; RectTransform component = ((Component)val2).GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(0.5f, 0.5f); component.anchoredPosition = Vector2.zero; component.sizeDelta = new Vector2(600f, 100f); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Warning text created on HUD."); } [HarmonyPostfix] [HarmonyPatch(typeof(MenuPageMain), "Start")] private static void MenuPageMain_StartHook(MenuPageMain __instance) { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"MenuPageMain.Start triggered, starting text patch coroutine..."); ((MonoBehaviour)__instance).StartCoroutine(UpdateBuildNameText(__instance)); if (Instance.otherModsDetected) { GameObject val = GameObject.Find("UI/HUD/HUD Canvas/HUD"); if ((Object)(object)val != (Object)null) { Instance.CreateWarningUI(val.transform); } else { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)"HUD not found in scene!"); } } } [IteratorStateMachine(typeof(<UpdateBuildNameText>d__33))] private static IEnumerator UpdateBuildNameText(MenuPageMain instance) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <UpdateBuildNameText>d__33(0) { instance = instance }; } [HarmonyPrefix] [HarmonyPatch(typeof(RunManager), "ChangeLevel")] private static bool RunManager_ChangeLevelHook(RunManager __instance, bool _completedLevel, bool _levelFailed, ChangeLevelType _changeLevelType) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown ((BaseUnityPlugin)Instance).Logger.LogInfo((object)$"RunManager.ChangeLevel called: completed={_completedLevel}, failed={_levelFailed}, type={_changeLevelType}, IsMasterClient={PhotonNetwork.IsMasterClient}"); if (_levelFailed || !PhotonNetwork.IsMasterClient) { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"Skipping Late Join hook: level failed or not master client."); return true; } object value = RunManagerPUNField.GetValue(__instance); if (value != null) { PhotonView val = (PhotonView)PhotonViewField.GetValue(value); if ((Object)(object)val != (Object)null) { PhotonNetwork.RemoveBufferedRPCs(val.ViewID, (string)null, (int[])null); ((BaseUnityPlugin)Instance).Logger.LogInfo((object)$"Cleared buffered RPCs for RunManagerPUN PhotonView ID: {val.ViewID}"); } } if (PhotonNetwork.CurrentRoom != null) { PhotonNetwork.CurrentRoom.IsOpen = true; ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"Room set to open for late joiners."); } return true; } [HarmonyPrefix] [HarmonyPatch(typeof(PlayerAvatar), "Spawn")] private static bool PlayerAvatar_SpawnHook(PlayerAvatar __instance, Vector3 position, Quaternion rotation) { if ((bool)SpawnedField.GetValue(__instance)) { ((BaseUnityPlugin)Instance).Logger.LogDebug((object)("PlayerAvatar.Spawn skipped for " + GetPlayerName(__instance) + ": already spawned.")); return false; } ((BaseUnityPlugin)Instance).Logger.LogDebug((object)("PlayerAvatar.Spawn allowed for " + GetPlayerName(__instance) + ".")); return true; } [HarmonyPrefix] [HarmonyPatch(typeof(LevelGenerator), "Start")] private static void LevelGenerator_StartHook(LevelGenerator __instance) { if (PhotonNetwork.IsMasterClient) { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"Resyncing level generator for late joiners."); PhotonNetwork.RemoveBufferedRPCs(__instance.PhotonView.ViewID, (string)null, (int[])null); } } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerAvatar), "Start")] private static void PlayerAvatar_StartHook(PlayerAvatar __instance) { //IL_0091: 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) if (PhotonNetwork.IsConnectedAndReady && !PhotonNetwork.IsMasterClient) { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)("Resyncing level and voice for late joiner: " + GetPlayerName(__instance))); __instance.photonView.RPC("LoadingLevelAnimationCompletedRPC", (RpcTarget)5, Array.Empty<object>()); if (!Object.FindObjectsOfType<GameObject>().Any((GameObject obj) => ((Object)obj).name == "Voice")) { PhotonNetwork.Instantiate("Voice", Vector3.zero, Quaternion.identity, (byte)0, (object[])null); ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"Voice object instantiated for late joiner."); } else { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"Voice object already exists for the local player."); } } } [HarmonyPostfix] [HarmonyPatch(typeof(NetworkManager), "PlayerSpawnedRPC")] private static void NetworkManager_PlayerSpawnedRPCHook(NetworkManager __instance) { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"PlayerSpawnedRPC triggered. Checking if all players are ready..."); if (!PhotonNetwork.IsMasterClient || !((Object)(object)GameDirector.instance != (Object)null)) { return; } Room currentRoom = PhotonNetwork.CurrentRoom; if (((currentRoom != null) ? new int?(currentRoom.PlayerCount) : null) == GameDirector.instance.PlayerList.Count) { PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); if ((Object)(object)component != (Object)null) { component.RPC("AllPlayerSpawnedRPC", (RpcTarget)3, Array.Empty<object>()); ((BaseUnityPlugin)Instance).Logger.LogInfo((object)"All players are ready. Game state synchronized."); } else { ((BaseUnityPlugin)Instance).Logger.LogError((object)"NetworkManager PhotonView is null!"); } } } [HarmonyPrefix] [HarmonyPatch(typeof(ChatManager), "StateActive")] private static bool ChatManager_StateActivePrefix(ChatManager __instance, ref string ___chatText) { //IL_0103: 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_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_032f: Unknown result type (might be due to invalid IL or missing references) //IL_03e1: Unknown result type (might be due to invalid IL or missing references) //IL_0392: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrWhiteSpace(___chatText)) { return true; } if (!___chatText.StartsWith("/")) { return true; } ((BaseUnityPlugin)Instance).Logger.LogInfo((object)("Command detected: " + ___chatText)); if (string.IsNullOrWhiteSpace(AdminSteamIDs.Value)) { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)"[Command] AdminSteamIDs configuration is empty."); __instance.AddLetterToChat(" Admin commands are disabled due to missing configuration!"); ___chatText = ""; return false; } ulong result; List<ulong> list = (from id in AdminSteamIDs.Value.Split(',') select ulong.TryParse(id.Trim(), out result) ? result : 0 into id where id != 0 select id).ToList(); if (!SteamClient.IsValid || !list.Contains(SteamClient.SteamId.Value)) { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)$"[Command] {SteamClient.SteamId.Value} is not an admin; command ignored."); __instance.AddLetterToChat(" You are not an admin!"); ___chatText = ""; return false; } if (!PhotonNetwork.IsMasterClient) { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)"[Command] Only the master client can use commands."); __instance.AddLetterToChat(" Only the master client can use commands!"); ___chatText = ""; return false; } string[] array = ___chatText.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (array.Length < 2) { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)"[Command] Invalid command format. Use: /kick <name>, /kill <name>, or /roll <name>"); __instance.AddLetterToChat(" Invalid format! Use: /kick <name>, /kill <name>, or /roll <name>"); ___chatText = ""; return false; } string text = array[0].ToLower(); string targetName = array[1].ToLower(); PlayerAvatar val = ((IEnumerable<PlayerAvatar>)GameDirector.instance.PlayerList).FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => GetPlayerName(p).ToLower().Contains(targetName))); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)("[Command] No player found matching '" + targetName + "'.")); __instance.AddLetterToChat(" Player '" + targetName + "' not found!"); ___chatText = ""; return false; } string playerName = GetPlayerName(val); switch (text) { case "/kick": ((BaseUnityPlugin)Instance).Logger.LogInfo((object)$"[Command] Kicking {playerName} by admin {SteamClient.SteamId.Value}"); ((MonoBehaviour)Instance).StartCoroutine(Instance.ForceKillAndKick(val)); __instance.AddLetterToChat(" Kicking " + playerName + "..."); break; case "/kill": ((BaseUnityPlugin)Instance).Logger.LogInfo((object)$"[Command] Killing {playerName} by admin {SteamClient.SteamId.Value}"); AttemptKill(val); __instance.AddLetterToChat(" Killed " + playerName); break; case "/roll": if (Instance.ballStateCoroutines.ContainsKey(val)) { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)$"[Command] Stopping roll state for {playerName} by admin {SteamClient.SteamId.Value}"); Instance.StopBallState(val); __instance.AddLetterToChat(" Stopped rolling " + playerName); } else { ((BaseUnityPlugin)Instance).Logger.LogInfo((object)$"[Command] Forcing roll state for {playerName} by admin {SteamClient.SteamId.Value}"); Instance.StartBallState(val); __instance.AddLetterToChat(" Rolling " + playerName); } break; default: ((BaseUnityPlugin)Instance).Logger.LogWarning((object)("[Command] Unknown command '" + text + "'. Use /kick, /kill, or /roll.")); __instance.AddLetterToChat(" Unknown command '" + text + "'. Use /kick, /kill, or /roll"); break; } ___chatText = ""; return false; } private static void AttemptKill(PlayerAvatar targetAvatar) { if (!PhotonNetwork.IsMasterClient) { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)"[Command] You are not the MasterClient, cannot execute kill!"); return; } if ((Object)(object)targetAvatar == (Object)null) { ((BaseUnityPlugin)Instance).Logger.LogError((object)"[Command] Target avatar not found."); return; } ((BaseUnityPlugin)Instance).Logger.LogDebug((object)("[Command] Executing kill & disable on " + GetPlayerName(targetAvatar))); targetAvatar.photonView.RPC("PlayerDeathRPC", (RpcTarget)0, new object[1] { 0 }); targetAvatar.photonView.RPC("SetDisabledRPC", (RpcTarget)0, Array.Empty<object>()); } private void StartBallState(PlayerAvatar targetAvatar) { if (!PhotonNetwork.IsMasterClient) { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)"[Command] You are not the MasterClient, cannot force roll state!"); return; } if ((Object)(object)targetAvatar == (Object)null) { ((BaseUnityPlugin)Instance).Logger.LogError((object)"[Command] Target avatar not found."); return; } if (ballStateCoroutines.ContainsKey(targetAvatar)) { ((BaseUnityPlugin)Instance).Logger.LogDebug((object)("[Command] Roll state already active for " + GetPlayerName(targetAvatar))); return; } FieldInfo field = ((object)targetAvatar.tumble).GetType().GetField("photonView", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { object? value = field.GetValue(targetAvatar.tumble); PhotonView val = (PhotonView)((value is PhotonView) ? value : null); if ((Object)(object)val != (Object)null) { Coroutine value2 = ((MonoBehaviour)this).StartCoroutine(ContinuouslyForceBallState(targetAvatar, val)); ballStateCoroutines[targetAvatar] = value2; ((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[Command] Started roll state for " + GetPlayerName(targetAvatar))); } else { ((BaseUnityPlugin)Instance).Logger.LogError((object)"[Command] PhotonView is null on tumble."); } } else { ((BaseUnityPlugin)Instance).Logger.LogError((object)"[Command] PhotonView field not found on tumble."); } } private void StopBallState(PlayerAvatar targetAvatar) { if (ballStateCoroutines.ContainsKey(targetAvatar)) { ((MonoBehaviour)this).StopCoroutine(ballStateCoroutines[targetAvatar]); ballStateCoroutines.Remove(targetAvatar); ((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[Command] Stopped roll state for " + GetPlayerName(targetAvatar))); } } [IteratorStateMachine(typeof(<ContinuouslyForceBallState>d__43))] private IEnumerator ContinuouslyForceBallState(PlayerAvatar targetAvatar, PhotonView photonView) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ContinuouslyForceBallState>d__43(0) { <>4__this = this, targetAvatar = targetAvatar, photonView = photonView }; } [IteratorStateMachine(typeof(<ForceKillAndKick>d__44))] private IEnumerator ForceKillAndKick(PlayerAvatar targetAvatar) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ForceKillAndKick>d__44(0) { <>4__this = this, targetAvatar = targetAvatar }; } private static void ClearPhotonCache(PhotonView photonView) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)photonView == (Object)null)) { object? value = RemoveFilterField.GetValue(null); Hashtable val = (Hashtable)((value is Hashtable) ? value : null); object value2 = KeyByteSevenField.GetValue(null); object? value3 = ServerCleanOptionsField.GetValue(null); RaiseEventOptions val2 = (RaiseEventOptions)((value3 is RaiseEventOptions) ? value3 : null); val[value2] = photonView.InstantiationId; val2.CachingOption = (EventCaching)6; RaiseEventInternalMethod.Invoke(null, new object[4] { (byte)202, val, val2, SendOptions.SendReliable }); } } private static string GetPlayerName(PlayerAvatar targetAvatar) { if ((Object)(object)targetAvatar == (Object)null) { return "Unknown"; } FieldInfo field = typeof(PlayerAvatar).GetField("playerName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return (field != null) ? ((string)field.GetValue(targetAvatar)) : "Unknown"; } [IteratorStateMachine(typeof(<UpdatePlayerCountCoroutine>d__47))] private IEnumerator UpdatePlayerCountCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <UpdatePlayerCountCoroutine>d__47(0) { <>4__this = this }; } } public class PlayerCountBehavior : MonoBehaviour { public TextMeshProUGUI tmp; private void Update() { Room currentRoom = PhotonNetwork.CurrentRoom; int num = ((currentRoom != null) ? currentRoom.PlayerCount : 0); ((TMP_Text)tmp).text = $"Players: {num}/20"; } }