using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using AtlyssCommandLib.API; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Mirror; using Nessie.ATLYSS.EasySettings; using Newtonsoft.Json; using UnityEngine; using UnityEngine.Events; 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("com.PModeration.sftwre")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.1.5.0")] [assembly: AssemblyInformationalVersion("1.1.5+01e62892afe9c1597dca8193a46498455754ddc5")] [assembly: AssemblyProduct("Player Moderation")] [assembly: AssemblyTitle("PModeration")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.5.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 PModeration { [BepInPlugin("com.PModeration.sftwre", "PModeration", "1.1.5")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static CommandCallback <>9__32_2; public static CommandCallback <>9__32_3; public static CommandCallback <>9__32_7; internal bool b__32_2(Caller c, string[] _) { //IL_0001: 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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) Utils.NotifyCaller(c, $"Blocked Users ({BlockedSteamIDs.Count}):", Color.white); foreach (ulong blockedSteamID in BlockedSteamIDs) { Utils.NotifyCaller(c, $"- {blockedSteamID}", Color.white); } return true; } internal bool b__32_3(Caller c, string[] a) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) string text = ((a.Length != 0) ? a[0] : Path.Combine(Paths.ConfigPath, "PModeration_BlockList_Export.json")); File.WriteAllText(text, JsonConvert.SerializeObject((object)BlockedSteamIDs, (Formatting)1)); Utils.NotifyCaller(c, "[Export] Blocklist saved to " + text, Color.white); return true; } internal bool b__32_7(Caller c, string[] _) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) Utils.NotifyCaller(c, "=== PModeration Commands (all client-side) ===", Color.white); Utils.NotifyCaller(c, "/block — Hide player (model, nameplate, audio)", Color.white); Utils.NotifyCaller(c, "/unblock — Unhide player", Color.white); Utils.NotifyCaller(c, "/hideglobal — Hide only @global name (RP title stays)", Color.white); Utils.NotifyCaller(c, "/unhideglobal — Unhide @global name", Color.white); Utils.NotifyCaller(c, "/blocklist — List all blocked SteamIDs", Color.white); Utils.NotifyCaller(c, "/blockexport [optional path] — Save blocklist to JSON", Color.white); Utils.NotifyCaller(c, "/blockimport — Load blocklist from JSON", Color.white); Utils.NotifyCaller(c, "Tip: Use SteamID with /unblock or /unhideglobal if the player is hidden and name not visible.", Color.gray); Utils.NotifyCaller(c, "Config: Edit BepInEx/config/PModeration.cfg or use Mod Settings menu.", Color.gray); return true; } } public static Plugin Instance; internal static ManualLogSource Log; private readonly Harmony harmony = new Harmony("com.PModeration.sftwre"); public static ConfigEntry CfgEnabled; public static ConfigEntry CfgHardBlock; public static ConfigEntry CfgCensorChat; public static ConfigEntry CfgCensorReplacement; public static ConfigEntry CfgDebugMode; public static HashSet BlockedSteamIDs = new HashSet(); public static HashSet HiddenGlobalNameIDs = new HashSet(); private string blockListPath; private string globalNameListPath; private float visualRefreshTimer = 0f; private const string TARGET_GLOBAL_OBJ_NAME = "_text_playerGlobalName"; private void Awake() { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; blockListPath = Path.Combine(Paths.ConfigPath, "PModeration_BlockList.json"); globalNameListPath = Path.Combine(Paths.ConfigPath, "PModeration_GlobalNameHides.json"); InitConfig(); Settings.OnInitialized.AddListener(new UnityAction(AddSettings)); Settings.OnApplySettings.AddListener((UnityAction)delegate { ((BaseUnityPlugin)this).Config.Save(); ForceRefreshAll(); }); LoadBlockList(); LoadGlobalNameList(); RegisterModCommands(); harmony.PatchAll(); Log.LogInfo((object)"PModeration v1.1.5 Loaded."); } private void Update() { if (CfgEnabled.Value) { visualRefreshTimer += Time.deltaTime; if (visualRefreshTimer >= 1f) { visualRefreshTimer = 0f; RefreshBlockedPlayersInScene(); } } } private void ProcessPlayer(Player p) { //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Expected O, but got Unknown if ((Object)(object)p == (Object)null || ((NetworkBehaviour)p).isLocalPlayer || !ulong.TryParse(p._steamID, out var result)) { return; } bool flag = BlockedSteamIDs.Contains(result) && CfgEnabled.Value; bool flag2 = HiddenGlobalNameIDs.Contains(result); if (CfgHardBlock.Value) { if (flag && ((Component)p).gameObject.activeSelf) { ((Component)p).gameObject.SetActive(false); } else if (!flag && !((Component)p).gameObject.activeSelf) { ((Component)p).gameObject.SetActive(true); } } else { if (!((Component)p).gameObject.activeSelf) { ((Component)p).gameObject.SetActive(true); } Renderer[] componentsInChildren = ((Component)p).GetComponentsInChildren(true); foreach (Renderer val in componentsInChildren) { val.forceRenderingOff = flag; } Canvas[] componentsInChildren2 = ((Component)p).GetComponentsInChildren(true); foreach (Canvas val2 in componentsInChildren2) { ((Behaviour)val2).enabled = !flag; } AudioSource[] componentsInChildren3 = ((Component)p).GetComponentsInChildren(true); foreach (AudioSource val3 in componentsInChildren3) { if (flag) { if (val3.isPlaying) { val3.Stop(); } ((Behaviour)val3).enabled = false; } else { ((Behaviour)val3).enabled = true; } } foreach (Transform item in ((Component)p).transform) { Transform val4 = item; if (!((Object)val4).name.StartsWith("_")) { ((Component)val4).gameObject.SetActive(!flag); } } } if (flag) { return; } Transform val5 = FindChildRecursive(((Component)p).transform, "_text_playerGlobalName"); if ((Object)(object)val5 != (Object)null) { bool flag3 = !flag2; if (((Component)val5).gameObject.activeSelf != flag3) { ((Component)val5).gameObject.SetActive(flag3); } } } private Transform FindChildRecursive(Transform parent, string name) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown foreach (Transform item in parent) { Transform val = item; if (((Object)val).name.Equals(name)) { return val; } Transform val2 = FindChildRecursive(val, name); if ((Object)(object)val2 != (Object)null) { return val2; } } return null; } public void ForceRefreshAll() { Player[] array = Object.FindObjectsOfType(); foreach (Player val in array) { if (!((Object)(object)val == (Object)null) && !((NetworkBehaviour)val).isLocalPlayer) { ProcessPlayer(val); } } } private void RefreshBlockedPlayersInScene() { ForceRefreshAll(); } public void AddBlock(ulong steamID, string name = null) { if (BlockedSteamIDs.Add(steamID)) { SaveBlockList(); ForceRefreshAll(); PModerationAPI.NotifyBlocked(steamID); } } public void RemoveBlock(ulong steamID) { if (BlockedSteamIDs.Remove(steamID)) { SaveBlockList(); ForceRefreshAll(); PModerationAPI.NotifyUnblocked(steamID); } } public bool IsBlocked(ulong steamID) { return BlockedSteamIDs.Contains(steamID); } public bool IsGlobalNameHidden(ulong steamID) { return HiddenGlobalNameIDs.Contains(steamID); } public void HideGlobalName(ulong steamID) { if (HiddenGlobalNameIDs.Add(steamID)) { SaveGlobalNameList(); ForceRefreshAll(); } } public void UnhideGlobalName(ulong steamID) { if (HiddenGlobalNameIDs.Remove(steamID)) { SaveGlobalNameList(); ForceRefreshAll(); } } private void LoadBlockList() { if (!File.Exists(blockListPath)) { return; } try { List list = JsonConvert.DeserializeObject>(File.ReadAllText(blockListPath)); if (list != null) { BlockedSteamIDs = new HashSet(list); } } catch { } } private void SaveBlockList() { File.WriteAllText(blockListPath, JsonConvert.SerializeObject((object)BlockedSteamIDs.ToList(), (Formatting)1)); } private void LoadGlobalNameList() { if (!File.Exists(globalNameListPath)) { return; } try { List list = JsonConvert.DeserializeObject>(File.ReadAllText(globalNameListPath)); if (list != null) { HiddenGlobalNameIDs = new HashSet(list); } } catch { } } private void SaveGlobalNameList() { File.WriteAllText(globalNameListPath, JsonConvert.SerializeObject((object)HiddenGlobalNameIDs.ToList(), (Formatting)1)); } private void InitConfig() { CfgEnabled = ((BaseUnityPlugin)this).Config.Bind("1. General", "Enabled", true, "Master switch"); CfgHardBlock = ((BaseUnityPlugin)this).Config.Bind("2. Blocking", "Hard Block", false, "True = Disables GameObject. False = Hides Visuals."); CfgCensorChat = ((BaseUnityPlugin)this).Config.Bind("3. Chat", "Censor Chat", true, "Replace blocked players' chat."); CfgCensorReplacement = ((BaseUnityPlugin)this).Config.Bind("3. Chat", "Replacement Text", "[BLOCKED]", "Text to show."); CfgDebugMode = ((BaseUnityPlugin)this).Config.Bind("4. Advanced", "Debug Mode", false, "Log details."); } private void AddSettings() { SettingsTab orAddCustomTab = Settings.GetOrAddCustomTab("PModeration"); orAddCustomTab.AddHeader("General"); orAddCustomTab.AddToggle(CfgEnabled); orAddCustomTab.AddHeader("Blocking"); orAddCustomTab.AddToggle(CfgHardBlock); orAddCustomTab.AddHeader("Chat"); orAddCustomTab.AddToggle(CfgCensorChat); orAddCustomTab.AddTextField(CfgCensorReplacement, "Text..."); orAddCustomTab.AddHeader("Advanced"); orAddCustomTab.AddToggle(CfgDebugMode); } private void RegisterModCommands() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Expected O, but got Unknown CommandOptions val = default(CommandOptions); ((CommandOptions)(ref val))..ctor(); val.chatCommand = (ChatCommandType)1; CommandOptions value = val; Utils.RegisterCommand("block", "Locally hides a player's visuals (and optionally chat).", (CommandCallback)delegate(Caller c, string[] a) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) if (a.Length == 0) { return false; } string text7 = string.Join(" ", a); Player val8 = FindPlayerByName(text7); if ((Object)(object)val8 != (Object)null && ulong.TryParse(val8._steamID, out var result6)) { AddBlock(result6, val8._nickname); Utils.NotifyCaller(c, "[Block] Hid " + val8._nickname + ".", Color.white); } else { Utils.NotifyCaller(c, "[Block] Player '" + text7 + "' not found.", Color.white); } return true; }, (CommandOptions?)value); Utils.RegisterCommand("unblock", "Unhides a player by name or SteamID.", (CommandCallback)delegate(Caller c, string[] a) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: 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_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) if (a.Length == 0) { return false; } string text6 = string.Join(" ", a); if (ulong.TryParse(text6, out var result4)) { RemoveBlock(result4); ForceRefreshAll(); Utils.NotifyCaller(c, $"[Unblock] Unblocked ID {result4}.", Color.white); return true; } Player val7 = FindPlayerByName(text6); if ((Object)(object)val7 != (Object)null && ulong.TryParse(val7._steamID, out var result5)) { RemoveBlock(result5); ForceRefreshAll(); Utils.NotifyCaller(c, "[Unblock] Unblocked " + val7._nickname + ".", Color.white); } else { Utils.NotifyCaller(c, "[Unblock] Player not found. Use SteamID if hidden.", Color.white); } return true; }, (CommandOptions?)value); object obj = <>c.<>9__32_2; if (obj == null) { CommandCallback val2 = delegate(Caller c, string[] _) { //IL_0001: 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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) Utils.NotifyCaller(c, $"Blocked Users ({BlockedSteamIDs.Count}):", Color.white); foreach (ulong blockedSteamID in BlockedSteamIDs) { Utils.NotifyCaller(c, $"- {blockedSteamID}", Color.white); } return true; }; <>c.<>9__32_2 = val2; obj = (object)val2; } Utils.RegisterCommand("blocklist", "Lists all blocked SteamIDs.", (CommandCallback)obj, (CommandOptions?)value); object obj2 = <>c.<>9__32_3; if (obj2 == null) { CommandCallback val3 = delegate(Caller c, string[] a) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) string text5 = ((a.Length != 0) ? a[0] : Path.Combine(Paths.ConfigPath, "PModeration_BlockList_Export.json")); File.WriteAllText(text5, JsonConvert.SerializeObject((object)BlockedSteamIDs, (Formatting)1)); Utils.NotifyCaller(c, "[Export] Blocklist saved to " + text5, Color.white); return true; }; <>c.<>9__32_3 = val3; obj2 = (object)val3; } Utils.RegisterCommand("blockexport", "Exports blocklist to a file.", (CommandCallback)obj2, (CommandOptions?)value); Utils.RegisterCommand("blockimport", "Imports blocklist from a file.", (CommandCallback)delegate(Caller c, string[] a) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: 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) if (a.Length == 0) { return false; } string text3 = a[0]; if (!File.Exists(text3)) { Utils.NotifyCaller(c, "[Import] File not found: " + text3, Color.white); return true; } string text4 = File.ReadAllText(text3); List list = JsonConvert.DeserializeObject>(text4); BlockedSteamIDs.UnionWith(list); SaveBlockList(); ForceRefreshAll(); Utils.NotifyCaller(c, $"[Import] Imported {list.Count} IDs.", Color.white); return true; }, (CommandOptions?)value); Utils.RegisterCommand("hideglobal", "Hides only a player's @global name (does not hide model or RP title).", (CommandCallback)delegate(Caller c, string[] a) { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) if (a.Length == 0) { return false; } string text2 = string.Join(" ", a); Player val6 = FindPlayerByName(text2); if ((Object)(object)val6 != (Object)null && ulong.TryParse(val6._steamID, out var result3)) { HideGlobalName(result3); Utils.NotifyCaller(c, "[HideGlobal] Hid @global name for " + val6._nickname + ".", Color.white); } else { Utils.NotifyCaller(c, "[HideGlobal] Player '" + text2 + "' not found.", Color.white); } return true; }, (CommandOptions?)value); Utils.RegisterCommand("unhideglobal", "Unhides a player's @global name.", (CommandCallback)delegate(Caller c, string[] a) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: 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_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) if (a.Length == 0) { return false; } string text = string.Join(" ", a); if (ulong.TryParse(text, out var result)) { UnhideGlobalName(result); ForceRefreshAll(); Utils.NotifyCaller(c, $"[UnhideGlobal] Unhid @global name for ID {result}.", Color.white); return true; } Player val5 = FindPlayerByName(text); if ((Object)(object)val5 != (Object)null && ulong.TryParse(val5._steamID, out var result2)) { UnhideGlobalName(result2); ForceRefreshAll(); Utils.NotifyCaller(c, "[UnhideGlobal] Unhid @global name for " + val5._nickname + ".", Color.white); } else { Utils.NotifyCaller(c, "[UnhideGlobal] Player not found. Use SteamID if hidden.", Color.white); } return true; }, (CommandOptions?)value); object obj3 = <>c.<>9__32_7; if (obj3 == null) { CommandCallback val4 = delegate(Caller c, string[] _) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) Utils.NotifyCaller(c, "=== PModeration Commands (all client-side) ===", Color.white); Utils.NotifyCaller(c, "/block — Hide player (model, nameplate, audio)", Color.white); Utils.NotifyCaller(c, "/unblock — Unhide player", Color.white); Utils.NotifyCaller(c, "/hideglobal — Hide only @global name (RP title stays)", Color.white); Utils.NotifyCaller(c, "/unhideglobal — Unhide @global name", Color.white); Utils.NotifyCaller(c, "/blocklist — List all blocked SteamIDs", Color.white); Utils.NotifyCaller(c, "/blockexport [optional path] — Save blocklist to JSON", Color.white); Utils.NotifyCaller(c, "/blockimport — Load blocklist from JSON", Color.white); Utils.NotifyCaller(c, "Tip: Use SteamID with /unblock or /unhideglobal if the player is hidden and name not visible.", Color.gray); Utils.NotifyCaller(c, "Config: Edit BepInEx/config/PModeration.cfg or use Mod Settings menu.", Color.gray); return true; }; <>c.<>9__32_7 = val4; obj3 = (object)val4; } Utils.RegisterCommand("blockhelp", "Shows all PModeration commands and tips.", (CommandCallback)obj3, (CommandOptions?)value); } private static Player FindPlayerByName(string name) { string name2 = name; return ((IEnumerable)Object.FindObjectsOfType()).FirstOrDefault((Func)((Player p) => !((NetworkBehaviour)p).isLocalPlayer && p._nickname.IndexOf(name2, StringComparison.OrdinalIgnoreCase) >= 0)); } } public static class PModerationAPI { public static event Action OnPlayerBlocked; public static event Action OnPlayerUnblocked; public static bool IsPlayerBlocked(ulong steamID) { return Plugin.Instance.IsBlocked(steamID); } public static void BlockPlayer(ulong steamID) { Plugin.Instance.AddBlock(steamID); } public static void UnblockPlayer(ulong steamID) { Plugin.Instance.RemoveBlock(steamID); } public static void HideGlobalName(ulong steamID) { Plugin.Instance.HideGlobalName(steamID); } public static void UnhideGlobalName(ulong steamID) { Plugin.Instance.UnhideGlobalName(steamID); } public static void IsGlobalNameHidden(ulong steamID) { Plugin.Instance.IsGlobalNameHidden(steamID); } internal static void NotifyBlocked(ulong id) { PModerationAPI.OnPlayerBlocked?.Invoke(id); } internal static void NotifyUnblocked(ulong id) { PModerationAPI.OnPlayerUnblocked?.Invoke(id); } } [HarmonyPatch(typeof(ChatBehaviour), "UserCode_Rpc_RecieveChatMessage__String__Boolean__ChatChannel")] [HarmonyPriority(0)] public static class ChatReceivePatch { private static bool Prefix(ChatBehaviour __instance, ref string message) { if (!Plugin.CfgEnabled.Value || !Plugin.CfgCensorChat.Value) { return true; } try { FieldInfo field = typeof(ChatBehaviour).GetField("_player", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { object? value = field.GetValue(__instance); Player val = (Player)((value is Player) ? value : null); if ((Object)(object)val != (Object)null && ulong.TryParse(val._steamID, out var result) && Plugin.Instance.IsBlocked(result)) { message = Plugin.CfgCensorReplacement.Value; } } } catch { } return true; } } [HarmonyPatch(typeof(WhoMenuCell), "Process_FindEntries")] public static class WhoMenuCell_ProcessFindEntriesPatch { [HarmonyPostfix] public static void Postfix(WhoMenuCell __instance, ref IEnumerator __result) { __result = WrapCoroutine(__instance, __result); } private static IEnumerator WrapCoroutine(WhoMenuCell whoMenu, IEnumerator original) { while (original.MoveNext()) { yield return original.Current; } yield return null; InjectButtons(whoMenu); } private static void InjectButtons(WhoMenuCell whoMenu) { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown if ((Object)(object)whoMenu == (Object)null) { return; } FieldInfo field = typeof(WhoMenuCell).GetField("_scrollRectContent", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { field = typeof(WhoMenuCell).GetField("_cell_ScrollViewContent", BindingFlags.Instance | BindingFlags.NonPublic); } if (field == null) { if (Plugin.CfgDebugMode.Value) { Plugin.Log.LogError((object)"PlayerListPatch: Could not find content field (_scrollRectContent)."); } return; } object? value = field.GetValue(whoMenu); Transform val = (Transform)((value is Transform) ? value : null); if ((Object)(object)val == (Object)null) { return; } foreach (Transform item in val) { Transform val2 = item; if (((Component)val2).gameObject.activeSelf) { WhoListDataEntry component = ((Component)val2).GetComponent(); if (!((Object)(object)component == (Object)null) && !((Object)(object)component._player == (Object)null) && !((NetworkBehaviour)component._player).isLocalPlayer) { UIBlockHelper.AddOrUpdateBlockButton(((Component)component).gameObject, component._player); UIBlockHelper.AddOrUpdateGlobalNameButton(((Component)component).gameObject, component._player); } } } LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform)(object)((val is RectTransform) ? val : null)); } } public static class UIBlockHelper { private const string BLOCK_BUTTON_NAME = "BlockButton"; private const string GLOBALNAME_BUTTON_NAME = "GlobalNameButton"; private const string HEADER_NAME = "_dolly_whoInfo_header"; private const string REF_BUTTON_NAME = "_button_steamProfile"; private const string GLOBAL_TEXT_NAME = "_text_globalName"; private const string CHAR_TEXT_NAME = "_text_characterName"; private static Sprite _blockSprite; private static Sprite _unblockSprite; private static Sprite _globalShowSprite; private static Sprite _globalHideSprite; private static bool _spritesLoaded; private static void EnsureSpritesLoaded() { if (!_spritesLoaded) { _spritesLoaded = true; _blockSprite = LoadSpriteSmart("block.png"); _unblockSprite = LoadSpriteSmart("unblock.png"); _globalShowSprite = LoadSpriteSmart("globalshow.png"); _globalHideSprite = LoadSpriteSmart("globalhide.png"); } } private static Sprite LoadSpriteSmart(string fileNameEndsWith) { //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) string fileNameEndsWith2 = fileNameEndsWith; Assembly executingAssembly = Assembly.GetExecutingAssembly(); string text = executingAssembly.GetManifestResourceNames().FirstOrDefault((string n) => n.EndsWith(fileNameEndsWith2, StringComparison.OrdinalIgnoreCase)); if (string.IsNullOrEmpty(text)) { Plugin.Log.LogError((object)("[UIBlockHelper] MISSING RESOURCE ending with: '" + fileNameEndsWith2 + "'")); return null; } using Stream stream = executingAssembly.GetManifestResourceStream(text); if (stream == null) { return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, array); return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } public static void AddOrUpdateBlockButton(GameObject entryObj, Player player) { AddOrUpdateButton(entryObj, player, "BlockButton", isGlobalName: false); } public static void AddOrUpdateGlobalNameButton(GameObject entryObj, Player player) { AddOrUpdateButton(entryObj, player, "GlobalNameButton", isGlobalName: true); } private static void AddOrUpdateButton(GameObject entryObj, Player player, string buttonName, bool isGlobalName) { //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Expected O, but got Unknown Player player2 = player; if ((Object)(object)entryObj == (Object)null || (Object)(object)player2 == (Object)null || !ulong.TryParse(player2._steamID, out var steamID)) { return; } Transform val = FindChildRecursive(entryObj.transform, "_dolly_whoInfo_header"); if ((Object)(object)val == (Object)null) { return; } ApplyLayoutConstraint(val, "_text_characterName", 65f); ApplyLayoutConstraint(val, "_text_globalName", 55f); RectTransform component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null && component.sizeDelta.x < 400f) { component.sizeDelta = new Vector2(component.sizeDelta.x + 40f, component.sizeDelta.y); ((Transform)component).localScale = new Vector3(0.9f, 1f, 1f); } Transform val2 = val.Find(buttonName); if ((Object)(object)val2 != (Object)null) { UpdateButtonState(((Component)val2).gameObject, steamID, isGlobalName); return; } Transform val3 = val.Find("_button_steamProfile"); if ((Object)(object)val3 == (Object)null) { return; } GameObject btnObj = Object.Instantiate(((Component)val3).gameObject, val); ((Object)btnObj).name = buttonName; btnObj.SetActive(true); btnObj.transform.SetSiblingIndex(val3.GetSiblingIndex() + 1); Button component2 = btnObj.GetComponent