using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Nessie.ATLYSS.EasySettings; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("com.NPCDisabler.sftwre")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.2.0")] [assembly: AssemblyInformationalVersion("1.0.2+22394e34d2f151bb530de6ca3d8be51778a38bc2")] [assembly: AssemblyProduct("Player Moderation")] [assembly: AssemblyTitle("NPCDisabler")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.2.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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] [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 NPCDisabler { [BepInPlugin("com.NPCDisabler.sftwre", "NPCDisabler", "1.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal const string EasySettingsGuid = "Nessie.ATLYSS.EasySettings"; public static Plugin Instance; internal static ManualLogSource Log; private readonly Harmony harmony = new Harmony("com.NPCDisabler.sftwre"); internal static readonly Dictionary> NpcToggles = new Dictionary>(); internal static ConfigEntry DisableAllNpcs; private static readonly Dictionary> NpcRegistry = new Dictionary>(); private static readonly Dictionary LastAppliedHiddenState = new Dictionary(); private float _rescanTimer; private const float RescanInterval = 5f; internal static bool SettingsInitialized; private static bool _easySettingsAvailable; private Scene _currentTargetScene; private void Awake() { Instance = this; Log = ((BaseUnityPlugin)this).Logger; harmony.PatchAll(); DisableAllNpcs = ((BaseUnityPlugin)this).Config.Bind("Global", "Disable All NetNPCs", false, "Hides every NetNPC discovered in your current map instance, client-side only. Overrides individual NPC toggles below while enabled."); DisableAllNpcs.SettingChanged += delegate { ReapplyHiddenState(); }; Log.LogInfo((object)"NPCDisabler v1.0.2 Loaded."); SceneManager.sceneLoaded += OnSceneLoaded; _easySettingsAvailable = Chainloader.PluginInfos.ContainsKey("Nessie.ATLYSS.EasySettings"); if (_easySettingsAvailable) { EasySettingsIntegration.Init(); } } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } private void Update() { //IL_0002: 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_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_001a: 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) Scene currentMapScene = GetCurrentMapScene(); if (currentMapScene != _currentTargetScene) { _currentTargetScene = currentMapScene; NpcRegistry.Clear(); LastAppliedHiddenState.Clear(); ScanForNetNPCs(); } _rescanTimer += Time.deltaTime; if (!(_rescanTimer < 5f)) { _rescanTimer = 0f; ScanForNetNPCs(); } } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) _currentTargetScene = default(Scene); } private Scene GetCurrentMapScene() { //IL_0035: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Player._mainPlayer != (Object)null && (Object)(object)Player._mainPlayer.Network_playerMapInstance != (Object)null) { Scene scene = ((Component)Player._mainPlayer.Network_playerMapInstance).gameObject.scene; if (((Scene)(ref scene)).isLoaded) { return scene; } } if ((Object)(object)Player._mainPlayer != (Object)null) { Scene scene2 = ((Component)Player._mainPlayer).gameObject.scene; if (((Scene)(ref scene2)).isLoaded && ((Scene)(ref scene2)).name != "DontDestroyOnLoad") { return scene2; } } return SceneManager.GetActiveScene(); } private void ScanForNetNPCs() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0077: 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_00ba: 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_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) Scene targetScene = GetCurrentMapScene(); if (!((Scene)(ref targetScene)).isLoaded) { return; } MapInstance targetInstance = (((Object)(object)Player._mainPlayer != (Object)null) ? Player._mainPlayer.Network_playerMapInstance : null); string text = "null"; string text2 = "null"; if ((Object)(object)Player._mainPlayer != (Object)null) { Scene scene = ((Component)Player._mainPlayer).gameObject.scene; text = $"{((Scene)(ref scene)).name} (handle={((Scene)(ref scene)).handle})"; if ((Object)(object)targetInstance != (Object)null) { Scene scene2 = ((Component)targetInstance).gameObject.scene; text2 = $"{((Scene)(ref scene2)).name} (handle={((Scene)(ref scene2)).handle}, instanceID={((Object)targetInstance).GetInstanceID()})"; } } NetNPC[] array = Object.FindObjectsOfType(true); Log.LogDebug((object)(string.Format("[{0}][DEBUG] targetScene={1} (handle={2}) | ", "NPCDisabler", ((Scene)(ref targetScene)).name, ((Scene)(ref targetScene)).handle) + "playerScene=" + text + " | assignedMapInstance=" + text2 + " | " + $"totalNetNPCsInMemory={array.Length}")); NetNPC[] array2 = array; foreach (NetNPC val in array2) { Scene scene3 = ((Component)val).gameObject.scene; MapInstance componentInParent = ((Component)val).GetComponentInParent(true); bool flag = scene3 == targetScene; bool flag2 = (Object)(object)componentInParent != (Object)null && (Object)(object)targetInstance != (Object)null && (Object)(object)componentInParent == (Object)(object)targetInstance; string arg = (((Object)(object)componentInParent != (Object)null) ? $"instanceID={((Object)componentInParent).GetInstanceID()}" : "NOT PARENTED under a MapInstance"); Log.LogDebug((object)("[NPCDisabler][DEBUG] NPC '" + GetNpcIdentifier(val) + "' in scene " + ((Scene)(ref scene3)).name + " " + $"(handle={((Scene)(ref scene3)).handle}) | parentMapInstance: {arg} | " + $"sceneMatch={flag} instanceMatch={flag2}")); } IEnumerable enumerable = array.Where(delegate(NetNPC npc) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)targetInstance != (Object)null) { MapInstance componentInParent2 = ((Component)npc).GetComponentInParent(true); if ((Object)(object)componentInParent2 != (Object)null) { return (Object)(object)componentInParent2 == (Object)(object)targetInstance; } } return ((Component)npc).gameObject.scene == targetScene; }); bool flag3 = false; foreach (NetNPC item in enumerable) { string npcName = GetNpcIdentifier(item); if (!NpcRegistry.TryGetValue(npcName, out List value)) { value = new List(); NpcRegistry[npcName] = value; } if (!value.Contains(((Component)item).gameObject)) { value.Add(((Component)item).gameObject); } if (!NpcToggles.ContainsKey(npcName)) { ConfigEntry val2 = ((BaseUnityPlugin)this).Config.Bind("NPCs", npcName, false, "Hide '" + npcName + "' client-side when encountered. Does not affect other players. Overridden by 'Disable All NetNPCs' above while that's enabled."); NpcToggles[npcName] = val2; val2.SettingChanged += delegate { SetNpcHidden(npcName, IsEffectivelyHidden(npcName)); }; flag3 = true; if (_easySettingsAvailable && SettingsInitialized) { EasySettingsIntegration.AddNpcToggle(npcName, val2); } } } if (flag3) { Log.LogInfo((object)string.Format("[{0}] Discovered {1} unique NPC type(s) in scene: {2}", "NPCDisabler", NpcToggles.Count, ((Scene)(ref targetScene)).name)); } ReapplyHiddenState(); } private string GetNpcIdentifier(NetNPC npc) { return ((Object)((Component)npc).gameObject).name.Replace("(Clone)", string.Empty).Trim(); } private static bool IsEffectivelyHidden(string npcName) { if (DisableAllNpcs.Value) { return true; } ConfigEntry value; return NpcToggles.TryGetValue(npcName, out value) && value.Value; } private static void SetNpcHidden(string npcName, bool hide) { if (!NpcRegistry.TryGetValue(npcName, out List value) || (LastAppliedHiddenState.TryGetValue(npcName, out var value2) && value2 == hide)) { return; } foreach (GameObject item in value) { if (!((Object)(object)item == (Object)null)) { ApplyHiddenState(item, hide); } } LastAppliedHiddenState[npcName] = hide; Log.LogInfo((object)("[NPCDisabler] " + (hide ? "Hid" : "Restored") + " '" + npcName + "' " + $"({value.Count} instance(s)).")); } private static void ApplyHiddenState(GameObject npcGo, bool hide) { if (!((Object)(object)Player._mainPlayer != (Object)null) || !Player._mainPlayer._isHostPlayer) { npcGo.SetActive(!hide); return; } Renderer[] componentsInChildren = npcGo.GetComponentsInChildren(true); foreach (Renderer val in componentsInChildren) { val.enabled = !hide; } Canvas[] componentsInChildren2 = npcGo.GetComponentsInChildren(true); foreach (Canvas val2 in componentsInChildren2) { ((Behaviour)val2).enabled = !hide; } CanvasGroup[] componentsInChildren3 = npcGo.GetComponentsInChildren(true); foreach (CanvasGroup val3 in componentsInChildren3) { ((Behaviour)val3).enabled = !hide; } Animator[] componentsInChildren4 = npcGo.GetComponentsInChildren(true); foreach (Animator val4 in componentsInChildren4) { ((Behaviour)val4).enabled = !hide; } } internal static void ReapplyHiddenState() { foreach (string key in NpcRegistry.Keys) { SetNpcHidden(key, IsEffectivelyHidden(key)); } } } internal static class EasySettingsIntegration { [CompilerGenerated] private static class <>O { public static UnityAction <0>__OnSettingsInitialized; public static UnityAction <1>__OnSettingsApplied; } private static SettingsTab _modTab; private static bool _globalToggleAdded; private static readonly HashSet _npcNamesAddedToTab = new HashSet(); [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void Init() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown try { UnityEvent onInitialized = Settings.OnInitialized; object obj = <>O.<0>__OnSettingsInitialized; if (obj == null) { UnityAction val = OnSettingsInitialized; <>O.<0>__OnSettingsInitialized = val; obj = (object)val; } onInitialized.AddListener((UnityAction)obj); UnityEvent onApplySettings = Settings.OnApplySettings; object obj2 = <>O.<1>__OnSettingsApplied; if (obj2 == null) { UnityAction val2 = OnSettingsApplied; <>O.<1>__OnSettingsApplied = val2; obj2 = (object)val2; } onApplySettings.AddListener((UnityAction)obj2); } catch (Exception arg) { Plugin.Log.LogWarning((object)"Failed to register with EasySettings! Please report this to the mod author!"); Plugin.Log.LogWarning((object)$"Exception: {arg}"); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void OnSettingsInitialized() { try { Plugin.SettingsInitialized = true; if (_modTab == null) { _modTab = Settings.GetOrAddCustomTab("NPCDisabler"); } if (_modTab == null) { Plugin.Log.LogWarning((object)"Failed to get or add EasySettings tab."); return; } if (!_globalToggleAdded) { _modTab.AddHeader("Global"); _modTab.AddToggle("Disable All NetNPCs", Plugin.DisableAllNpcs); _globalToggleAdded = true; } List>> list = (from kvp in Plugin.NpcToggles where !_npcNamesAddedToTab.Contains(kvp.Key) orderby kvp.Key select kvp).ToList(); foreach (KeyValuePair> item in list) { _modTab.AddToggle(item.Key, item.Value); _npcNamesAddedToTab.Add(item.Key); } } catch (Exception arg) { Plugin.Log.LogWarning((object)"Failed to initialize EasySettings tab! Please report this to the mod author!"); Plugin.Log.LogWarning((object)$"Exception: {arg}"); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void OnSettingsApplied() { try { ((BaseUnityPlugin)Plugin.Instance).Config.Save(); Plugin.ReapplyHiddenState(); Plugin.Log.LogInfo((object)"[NPCDisabler] Settings applied and saved."); } catch (Exception arg) { Plugin.Log.LogWarning((object)"Failed to apply EasySettings changes! Please report this to the mod author!"); Plugin.Log.LogWarning((object)$"Exception: {arg}"); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddNpcToggle(string npcName, ConfigEntry entry) { try { if (_modTab != null && !_npcNamesAddedToTab.Contains(npcName)) { _modTab.AddToggle(npcName, entry); _npcNamesAddedToTab.Add(npcName); } } catch (Exception arg) { Plugin.Log.LogWarning((object)("Failed to add EasySettings toggle for '" + npcName + "'! Please report this to the mod author!")); Plugin.Log.LogWarning((object)$"Exception: {arg}"); } } } internal static class ModInfo { public const string GUID = "com.NPCDisabler.sftwre"; public const string NAME = "NPCDisabler"; public const string VERSION = "1.0.2"; } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }