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 TargetPortalProtectionReworked v1.0.1
plugins/TargetPortalProtectionReworked.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Jotunn.Entities; using Jotunn.Extensions; using Jotunn.Managers; using Jotunn.Utils; using Splatform; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("TargetPortalProtectionRewamped")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("TargetPortalProtectionRewamped")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("de68470c-68b8-40d0-9a09-eeb9170beaaa")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace TargetPortalProtection; internal static class PortalProtectionLogic { [HarmonyPatch(typeof(ZRoutedRpc), "InvokeRoutedRPC", new Type[] { typeof(long), typeof(string), typeof(object[]) })] internal static class TP_BlockChangeModeRpc { private static bool Prefix(string methodName, object[] parameters) { if (!PortalProtectionEnabled()) { return true; } if (methodName != "TargetPortals ChangePortalMode" || parameters == null || parameters.Length == 0) { return true; } ZNetView val = FindNviewFromZdoid(parameters[0]); if ((Object)(object)val == (Object)null || !val.IsValid() || !IsTargetPortal(val)) { return true; } if (!CanModifyPortal(val, out var reason)) { LogDebug("Blocked portal mode change: " + reason); Center(Player.m_localPlayer, "$tweaks_portal_protected"); return false; } TryStoreGuildIdOnPortal(val, "ChangeMode RPC after permission"); return true; } } [HarmonyPatch(typeof(WearNTear), "Damage")] internal static class TP_Indestructible_NoDamage { private static bool Prefix(WearNTear __instance) { if (!PortalProtectionEnabled()) { return true; } TeleportWorld component = ((Component)__instance).GetComponent<TeleportWorld>(); ZNetView portalNView = GetPortalNView(component); if ((Object)(object)component == (Object)null || (Object)(object)portalNView == (Object)null || !portalNView.IsValid() || !IsTargetPortal(portalNView)) { return true; } TryStoreGuildIdOnPortal(portalNView, "WearNTear.Damage"); if (CanModifyPortal(portalNView, out var _)) { return true; } LogDebug("Blocked portal damage"); return false; } } [HarmonyPatch(typeof(WearNTear), "Remove")] internal static class TP_Indestructible_NoRemove { private static bool Prefix(WearNTear __instance) { if (!PortalProtectionEnabled()) { return true; } TeleportWorld component = ((Component)__instance).GetComponent<TeleportWorld>(); ZNetView portalNView = GetPortalNView(component); if ((Object)(object)component == (Object)null || (Object)(object)portalNView == (Object)null || !portalNView.IsValid() || !IsTargetPortal(portalNView)) { return true; } TryStoreGuildIdOnPortal(portalNView, "WearNTear.Remove"); if (CanModifyPortal(portalNView, out var _)) { return true; } LogDebug("Blocked portal remove"); return false; } } [HarmonyPatch(typeof(TeleportWorld), "Interact")] internal static class TP_CacheGuildIdOnPortalInteract { private static void Prefix(TeleportWorld __instance) { ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || !component.IsValid() || !component.IsOwner()) { return; } ZDO zDO = component.GetZDO(); if (zDO == null) { return; } string @string = zDO.GetString("TargetPortal PortalOwnerId", ""); if (string.IsNullOrEmpty(@string)) { string text = ""; try { text = ((object)(PlatformUserID)(ref UserInfo.GetLocalUser().UserId)).ToString(); } catch { } if (!string.IsNullOrEmpty(text)) { zDO.Set("TargetPortal PortalOwnerId", text); LogDebug("Owner ID beállítva: " + text); } } TryStoreGuildIdOnPortal(component, "TeleportWorld.Interact"); } } [HarmonyPatch(typeof(PrivateArea), "CheckAccess")] internal static class TP_Terrain_PrivateArea { private static void Postfix(Vector3 point, bool flash, ref bool __result) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) if (TerrainProtectionEnabled() && __result && IsNearProtectedTargetPortal(point, out var reason)) { LogDebug("Blocked terrain access: " + reason); if (flash && (Object)(object)Player.m_localPlayer != (Object)null) { Center(Player.m_localPlayer, "$tweaks_portal_terrain"); } __result = false; } } } [HarmonyPatch(typeof(Location), "IsInsideNoBuildLocation")] internal static class TP_Terrain_NoBuildLocation { private static void Postfix(Vector3 point, ref bool __result) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (TerrainProtectionEnabled() && !__result && IsNearProtectedTargetPortal(point, out var reason)) { LogDebug("Blocked no-build check bypass: " + reason); __result = true; } } } [HarmonyPatch(typeof(TerrainComp), "ApplyOperation")] internal static class TP_Terrain_BlockTerraform { private static bool Prefix(TerrainOp modifier) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) if (!TerrainProtectionEnabled() || (Object)(object)modifier == (Object)null) { return true; } if (IsNearProtectedTargetPortal(((Component)modifier).transform.position, out var reason)) { LogDebug("Blocked terraform operation: " + reason); Center(Player.m_localPlayer, "$tweaks_portal_terrain"); return false; } return true; } } [HarmonyPatch(typeof(Minimap), "OnMapLeftClick")] internal static class TP_BlockUnauthorizedTargetPortalClick { [HarmonyPriority(800)] private static bool Prefix() { if (!VisibilityProtectionEnabled()) { return true; } if (!IsTargetPortalTeleportActive()) { return true; } if (!TryGetClickedTargetPortalZdo(out var portalZdo)) { return true; } if (CanSeePortal(portalZdo, out var _)) { return true; } Center(Player.m_localPlayer, "$tweaks_portal_protected"); return false; } } [CompilerGenerated] private sealed class <EnumerateAllZdos>d__51 : IEnumerable<ZDO>, IEnumerable, IEnumerator<ZDO>, IDisposable, IEnumerator { private int <>1__state; private ZDO <>2__current; private int <>l__initialThreadId; private object <zdoMan>5__1; private Type <zdoManType>5__2; private BindingFlags <flags>5__3; private FieldInfo[] <fields>5__4; private HashSet<ZDOID> <seen>5__5; private FieldInfo[] <>s__6; private int <>s__7; private FieldInfo <field>5__8; private object <fieldValue>5__9; private IEnumerator<ZDO> <>s__10; private ZDO <zdo>5__11; ZDO IEnumerator<ZDO>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnumerateAllZdos>d__51(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <zdoMan>5__1 = null; <zdoManType>5__2 = null; <fields>5__4 = null; <seen>5__5 = null; <>s__6 = null; <field>5__8 = null; <fieldValue>5__9 = null; <>s__10 = null; <zdo>5__11 = null; <>1__state = -2; } private bool MoveNext() { try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -3; <zdo>5__11 = null; goto IL_014b; } <>1__state = -1; if (ZDOMan.instance == null) { return false; } <zdoMan>5__1 = ZDOMan.instance; <zdoManType>5__2 = <zdoMan>5__1.GetType(); <flags>5__3 = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; <fields>5__4 = <zdoManType>5__2.GetFields(<flags>5__3); <seen>5__5 = new HashSet<ZDOID>(); <>s__6 = <fields>5__4; <>s__7 = 0; goto IL_0183; IL_014b: if (<>s__10.MoveNext()) { <zdo>5__11 = <>s__10.Current; <>2__current = <zdo>5__11; <>1__state = 1; return true; } <>m__Finally1(); <>s__10 = null; <fieldValue>5__9 = null; <field>5__8 = null; goto IL_0175; IL_0175: <>s__7++; goto IL_0183; IL_0183: if (<>s__7 < <>s__6.Length) { <field>5__8 = <>s__6[<>s__7]; <fieldValue>5__9 = null; try { <fieldValue>5__9 = <field>5__8.GetValue(<zdoMan>5__1); } catch { goto IL_0175; } if (<fieldValue>5__9 == null) { goto IL_0175; } <>s__10 = EnumerateZdosFromObject(<fieldValue>5__9, <seen>5__5).GetEnumerator(); <>1__state = -3; goto IL_014b; } <>s__6 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>s__10 != null) { <>s__10.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<ZDO> IEnumerable<ZDO>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <EnumerateAllZdos>d__51(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<ZDO>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <EnumerateZdosFromObject>d__52 : IEnumerable<ZDO>, IEnumerable, IEnumerator<ZDO>, IDisposable, IEnumerator { private int <>1__state; private ZDO <>2__current; private int <>l__initialThreadId; private object obj; public object <>3__obj; private HashSet<ZDOID> seen; public HashSet<ZDOID> <>3__seen; private ZDO <singleZdo>5__1; private IDictionary <dictionary>5__2; private IEnumerable <enumerable>5__3; private IDictionaryEnumerator <>s__4; private DictionaryEntry <entry>5__5; private IEnumerator<ZDO> <>s__6; private ZDO <zdo>5__7; private IEnumerator <>s__8; private object <item>5__9; private IEnumerator<ZDO> <>s__10; private ZDO <zdo>5__11; ZDO IEnumerator<ZDO>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnumerateZdosFromObject>d__52(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; switch (num) { case -4: case -3: case 2: try { if (num == -4 || num == 2) { try { } finally { <>m__Finally2(); } } } finally { <>m__Finally1(); } break; case -6: case -5: case 3: try { if (num == -6 || num == 3) { try { } finally { <>m__Finally4(); } } } finally { <>m__Finally3(); } break; } <singleZdo>5__1 = null; <dictionary>5__2 = null; <enumerable>5__3 = null; <>s__4 = null; <entry>5__5 = default(DictionaryEntry); <>s__6 = null; <zdo>5__7 = null; <>s__8 = null; <item>5__9 = null; <>s__10 = null; <zdo>5__11 = null; <>1__state = -2; } private bool MoveNext() { //IL_007f: Unknown result type (might be due to invalid IL or missing references) try { switch (<>1__state) { default: return false; case 0: { <>1__state = -1; if (this.obj == null) { return false; } ref ZDO reference = ref <singleZdo>5__1; object obj = this.obj; reference = (ZDO)((obj is ZDO) ? obj : null); if (<singleZdo>5__1 != null) { if (seen.Add(<singleZdo>5__1.m_uid)) { <>2__current = <singleZdo>5__1; <>1__state = 1; return true; } goto IL_00b2; } <dictionary>5__2 = this.obj as IDictionary; if (<dictionary>5__2 != null) { <>s__4 = <dictionary>5__2.GetEnumerator(); <>1__state = -3; goto IL_01a3; } <enumerable>5__3 = this.obj as IEnumerable; if (<enumerable>5__3 == null || this.obj is string) { break; } <>s__8 = <enumerable>5__3.GetEnumerator(); <>1__state = -5; goto IL_02b3; } case 1: <>1__state = -1; goto IL_00b2; case 2: <>1__state = -4; <zdo>5__7 = null; goto IL_017b; case 3: { <>1__state = -6; <zdo>5__11 = null; goto IL_0290; } IL_0290: if (<>s__10.MoveNext()) { <zdo>5__11 = <>s__10.Current; <>2__current = <zdo>5__11; <>1__state = 3; return true; } <>m__Finally4(); <>s__10 = null; <item>5__9 = null; goto IL_02b3; IL_01a3: if (<>s__4.MoveNext()) { <entry>5__5 = (DictionaryEntry)<>s__4.Current; <>s__6 = EnumerateZdosFromObject(<entry>5__5.Value, seen).GetEnumerator(); <>1__state = -4; goto IL_017b; } <>m__Finally1(); <>s__4 = null; return false; IL_017b: if (<>s__6.MoveNext()) { <zdo>5__7 = <>s__6.Current; <>2__current = <zdo>5__7; <>1__state = 2; return true; } <>m__Finally2(); <>s__6 = null; <entry>5__5 = default(DictionaryEntry); goto IL_01a3; IL_00b2: return false; IL_02b3: if (<>s__8.MoveNext()) { <item>5__9 = <>s__8.Current; <>s__10 = EnumerateZdosFromObject(<item>5__9, seen).GetEnumerator(); <>1__state = -6; goto IL_0290; } <>m__Finally3(); <>s__8 = null; return false; } return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>s__4 is IDisposable disposable) { disposable.Dispose(); } } private void <>m__Finally2() { <>1__state = -3; if (<>s__6 != null) { <>s__6.Dispose(); } } private void <>m__Finally3() { <>1__state = -1; if (<>s__8 is IDisposable disposable) { disposable.Dispose(); } } private void <>m__Finally4() { <>1__state = -5; if (<>s__10 != null) { <>s__10.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<ZDO> IEnumerable<ZDO>.GetEnumerator() { <EnumerateZdosFromObject>d__52 <EnumerateZdosFromObject>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <EnumerateZdosFromObject>d__ = this; } else { <EnumerateZdosFromObject>d__ = new <EnumerateZdosFromObject>d__52(0); } <EnumerateZdosFromObject>d__.obj = <>3__obj; <EnumerateZdosFromObject>d__.seen = <>3__seen; return <EnumerateZdosFromObject>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<ZDO>)this).GetEnumerator(); } } private const float DefaultTerrainProtectionRadius = 5f; private const float VisibilityPinMatchMaxDistance = 10f; private const float SearchRadiusPadding = 25f; private const string ZdoOwnerKey = "TargetPortal PortalOwnerId"; private const string ZdoModeKey = "TargetPortal PortalMode"; private const string ZdoGuildIdKey = "TargetPortal GuildId"; private const string RpcChangeMode = "TargetPortals ChangePortalMode"; private const string MsgProtected = "$tweaks_portal_protected"; private const string MsgTerrain = "$tweaks_portal_terrain"; private const int PortalModePublic = 0; private const int PortalModePrivate = 1; private const int PortalModeGroup = 2; private const int PortalModeAdmin = 3; private const int PortalModeGuild = 4; private static List<ZDO> _cachedPortalZdos; private static float _lastZdoCacheTime; private const float ZdoCacheLifetime = 0.5f; internal static void Init() { } private static ZNetView GetPortalNView(TeleportWorld portal) { return ((Object)(object)portal != (Object)null) ? ((Component)portal).GetComponent<ZNetView>() : null; } private static bool PortalProtectionEnabled() { try { return TargetPortalProtectionPlugin.CE_PortalProtection_Enabled == null || TargetPortalProtectionPlugin.CE_PortalProtection_Enabled.Value; } catch { return true; } } private static bool TerrainProtectionEnabled() { try { return TargetPortalProtectionPlugin.CE_TerrainProtection_Enabled == null || TargetPortalProtectionPlugin.CE_TerrainProtection_Enabled.Value; } catch { return true; } } internal static bool VisibilityProtectionEnabled() { try { return TargetPortalProtectionPlugin.CE_VisibilityProtection_Enabled == null || TargetPortalProtectionPlugin.CE_VisibilityProtection_Enabled.Value; } catch { return true; } } private static float TerrainProtectionRadius() { try { return Mathf.Max(0f, (TargetPortalProtectionPlugin.CE_TerrainProtection_Radius != null) ? TargetPortalProtectionPlugin.CE_TerrainProtection_Radius.Value : 5f); } catch { return 5f; } } private static float SearchRadius() { return Mathf.Max(TerrainProtectionRadius(), TerrainProtectionRadius() + 25f); } private static bool DebugLoggingEnabled() { try { return TargetPortalProtectionPlugin.CE_DebugLogging_Enabled != null && TargetPortalProtectionPlugin.CE_DebugLogging_Enabled.Value; } catch { return false; } } private static bool AdminBypass() { try { return TargetPortalProtectionPlugin.CE_TargetPortalProtection_AdminBypass == null || TargetPortalProtectionPlugin.CE_TargetPortalProtection_AdminBypass.Value; } catch { return true; } } private static bool GuildIntegrationEnabled() { try { return TargetPortalProtectionPlugin.CE_GuildIntegration_Enabled == null || TargetPortalProtectionPlugin.CE_GuildIntegration_Enabled.Value; } catch { return true; } } private static bool AllowGuildMembersToModifyPortals() { try { return TargetPortalProtectionPlugin.CE_GuildIntegration_AllowGuildMembersToModifyPortals == null || TargetPortalProtectionPlugin.CE_GuildIntegration_AllowGuildMembersToModifyPortals.Value; } catch { return true; } } private static bool AllowGuildMembersToBypassTerrainProtection() { try { return TargetPortalProtectionPlugin.CE_GuildIntegration_AllowGuildMembersToBypassTerrainProtection != null && TargetPortalProtectionPlugin.CE_GuildIntegration_AllowGuildMembersToBypassTerrainProtection.Value; } catch { return false; } } private static bool StoreGuildIdOnPortal() { try { return TargetPortalProtectionPlugin.CE_GuildIntegration_StoreGuildIdOnPortal == null || TargetPortalProtectionPlugin.CE_GuildIntegration_StoreGuildIdOnPortal.Value; } catch { return true; } } private static bool RequireGuildRankForNonOwners() { try { return TargetPortalProtectionPlugin.CE_GuildIntegration_RequireRankForNonOwnerPortalModify != null && TargetPortalProtectionPlugin.CE_GuildIntegration_RequireRankForNonOwnerPortalModify.Value; } catch { return false; } } private static string AllowedGuildRanksForPortalModify() { try { return (TargetPortalProtectionPlugin.CE_GuildIntegration_AllowedRanksToModifyPortals != null) ? TargetPortalProtectionPlugin.CE_GuildIntegration_AllowedRanksToModifyPortals.Value : "leader,officer,coleader"; } catch { return "leader,officer,coleader"; } } private static void Center(Player player, string tokenOrText) { if ((Object)(object)player == (Object)null) { return; } string text = tokenOrText; try { if (TargetPortalProtectionPlugin.ModLocalization != null) { text = TargetPortalProtectionPlugin.ModLocalization.TryTranslate(tokenOrText); } } catch { text = tokenOrText; } ((Character)player).Message((MessageType)2, text, 0, (Sprite)null); } private static void LogDebug(string message) { if (DebugLoggingEnabled() && TargetPortalProtectionPlugin.Log != null) { TargetPortalProtectionPlugin.Log.LogInfo((object)message); } } private static string NormalizeOwnerId(string value) { return string.IsNullOrEmpty(value) ? string.Empty : value.Replace("Steam_", string.Empty); } private static string GetPortalDebugName(ZNetView nview) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)nview == (Object)null) { return "<null portal>"; } string text = (((Object)(object)((Component)nview).gameObject != (Object)null) ? ((Object)((Component)nview).gameObject).name : "<unknown>"); Vector3 val = (((Object)(object)((Component)nview).transform != (Object)null) ? ((Component)nview).transform.position : Vector3.zero); Vector3 val2 = val; return text + " @ " + ((object)(Vector3)(ref val2)).ToString(); } private static bool CanModifyPortal(ZNetView nview, out string reason) { LogDebug("[TPP] CanModifyPortal START: " + GetPortalDebugName(nview)); if (IsOwnerOrAdmin(nview, out reason)) { LogDebug("[TPP] CanModifyPortal -> OWNER/ADMIN TRUE: " + reason); return true; } LogDebug("[TPP] CanModifyPortal -> owner/admin FALSE: " + reason); if (!AllowGuildMembersToModifyPortals()) { reason = "guild portal modification is disabled for " + GetPortalDebugName(nview); LogDebug("[TPP] CanModifyPortal -> guild módosítás tiltva: " + reason); return false; } if (IsSameGuildAsPortal(nview, out var reason2)) { reason = reason2; LogDebug("[TPP] CanModifyPortal -> guild TRUE: " + reason); return true; } reason = reason2; LogDebug("[TPP] CanModifyPortal -> guild FALSE: " + reason); return false; } private static bool CanBypassTerrainProtection(ZNetView nview, out string reason) { if (IsOwnerOrAdmin(nview, out reason)) { return true; } if (!AllowGuildMembersToBypassTerrainProtection()) { reason = "guild terrain bypass is disabled for " + GetPortalDebugName(nview); return false; } if (IsSameGuildAsPortal(nview, out var reason2)) { reason = reason2; return true; } reason = reason2; return false; } private static bool IsOwnerOrAdmin(ZNetView nview, out string reason) { reason = "unknown owner/admin check result"; if ((Object)(object)nview == (Object)null || !nview.IsValid()) { reason = "portal nview is missing or invalid"; LogDebug("[TPP] IsOwnerOrAdmin FALSE: " + reason); return false; } if (AdminBypass() && TargetPortalProtectionPlugin.IsLocalPlayerAdmin()) { reason = "player is admin and AdminBypass is enabled"; LogDebug("[TPP] IsOwnerOrAdmin TRUE: " + reason); return true; } ZDO zDO = nview.GetZDO(); if (zDO == null) { reason = "portal ZDO is null"; LogDebug("[TPP] IsOwnerOrAdmin FALSE: " + reason); return false; } string text = NormalizeOwnerId(zDO.GetString("TargetPortal PortalOwnerId", string.Empty)); if (string.IsNullOrEmpty(text)) { reason = "portal has no owner id: " + GetPortalDebugName(nview); LogDebug("[TPP] IsOwnerOrAdmin FALSE: " + reason); return false; } string text2; try { text2 = NormalizeOwnerId(((object)(PlatformUserID)(ref UserInfo.GetLocalUser().UserId)).ToString()); } catch { text2 = string.Empty; } if (!string.IsNullOrEmpty(text2) && text == text2) { reason = "local platform user matches portal owner id"; LogDebug("[TPP] IsOwnerOrAdmin TRUE: " + reason + " | ownerId=" + text + " | localUserId=" + text2); return true; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null) { long @long = zDO.GetLong(ZDOVars.s_creator, 0L); if (@long != 0L && @long == localPlayer.GetPlayerID()) { reason = "local player creator id matches portal creator"; LogDebug("[TPP] IsOwnerOrAdmin TRUE: " + reason + " | creator=" + @long + " | playerId=" + localPlayer.GetPlayerID()); return true; } } reason = "owner/admin mismatch for " + GetPortalDebugName(nview) + " (ownerId=" + text + ", localUserId=" + text2 + ")"; LogDebug("[TPP] IsOwnerOrAdmin FALSE: " + reason); return false; } private static bool IsOwnerOrAdmin(ZDO zdo, out string reason) { reason = "unknown owner/admin check result"; if (zdo == null) { reason = "portal ZDO is null"; return false; } if (AdminBypass() && TargetPortalProtectionPlugin.IsLocalPlayerAdmin()) { reason = "player is admin and AdminBypass is enabled"; return true; } string text = NormalizeOwnerId(zdo.GetString("TargetPortal PortalOwnerId", string.Empty)); if (string.IsNullOrEmpty(text)) { reason = "portal has no owner id"; return false; } string text2; try { text2 = NormalizeOwnerId(((object)(PlatformUserID)(ref UserInfo.GetLocalUser().UserId)).ToString()); } catch { text2 = string.Empty; } if (!string.IsNullOrEmpty(text2) && text == text2) { reason = "local platform user matches portal owner id"; return true; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null) { long @long = zdo.GetLong(ZDOVars.s_creator, 0L); if (@long != 0L && @long == localPlayer.GetPlayerID()) { reason = "local player creator id matches portal creator"; return true; } } reason = "owner/admin mismatch (ownerId=" + text + ", localUserId=" + text2 + ")"; return false; } private static bool IsTargetPortal(ZNetView nview) { if ((Object)(object)nview == (Object)null || !nview.IsValid()) { LogDebug("[TPP] IsTargetPortal FALSE: nview null vagy invalid"); return false; } ZDO zDO = nview.GetZDO(); if (zDO == null) { LogDebug("[TPP] IsTargetPortal FALSE: ZDO null"); return false; } int @int = zDO.GetInt("TargetPortal PortalMode", -1); string @string = zDO.GetString("TargetPortal PortalOwnerId", string.Empty); bool result = @int != -1 || !string.IsNullOrEmpty(@string); LogDebug("[TPP] IsTargetPortal: " + GetPortalDebugName(nview) + " | portalMode=" + @int + " | owner=" + @string + " | result=" + result); return result; } private static ZNetView FindNviewFromZdoid(object firstParam) { //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_0035: Unknown result type (might be due to invalid IL or missing references) if (!(firstParam is ZDOID val)) { return null; } if (ZDOMan.instance == null) { return null; } ZDO zDO = ZDOMan.instance.GetZDO(val); if (zDO == null) { return null; } return ((Object)(object)ZNetScene.instance != (Object)null) ? ZNetScene.instance.FindInstance(zDO) : null; } private static ZNetView FindNviewFromZdo(ZDO zdo) { if (zdo == null || (Object)(object)ZNetScene.instance == (Object)null) { return null; } return ZNetScene.instance.FindInstance(zdo); } private static bool IsTargetPortalZdo(ZDO zdo) { if (zdo == null) { return false; } int @int = zdo.GetInt("TargetPortal PortalMode", -1); string @string = zdo.GetString("TargetPortal PortalOwnerId", string.Empty); return @int != -1 || !string.IsNullOrEmpty(@string); } [IteratorStateMachine(typeof(<EnumerateAllZdos>d__51))] private static IEnumerable<ZDO> EnumerateAllZdos() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <EnumerateAllZdos>d__51(-2); } [IteratorStateMachine(typeof(<EnumerateZdosFromObject>d__52))] private static IEnumerable<ZDO> EnumerateZdosFromObject(object obj, HashSet<ZDOID> seen) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <EnumerateZdosFromObject>d__52(-2) { <>3__obj = obj, <>3__seen = seen }; } private static List<ZDO> CollectAllTargetPortalZdos() { if (_cachedPortalZdos != null && Time.time - _lastZdoCacheTime < 0.5f) { return _cachedPortalZdos; } List<ZDO> list = new List<ZDO>(); foreach (ZDO item in EnumerateAllZdos()) { if (item != null && IsTargetPortalZdo(item)) { list.Add(item); } } _cachedPortalZdos = list; _lastZdoCacheTime = Time.time; return list; } private static ZDO FindClosestPortalZdoFromPin(PinData pinData, List<ZDO> portalZdos, out string debugReason) { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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_007d: Unknown result type (might be due to invalid IL or missing references) debugReason = "unknown"; if (pinData == null) { debugReason = "pinData is null"; return null; } if (portalZdos == null || portalZdos.Count == 0) { debugReason = "portalZdos list is empty"; return null; } float num = float.MaxValue; ZDO val = null; foreach (ZDO portalZdo in portalZdos) { if (portalZdo != null) { Vector3 position = portalZdo.GetPosition(); float num2 = Vector3.Distance(pinData.m_pos, position); if (num2 < num) { num = num2; val = portalZdo; } } } if (val == null) { debugReason = "no closest portal found"; return null; } if (num > 10f) { debugReason = "nearest portal too far: " + num.ToString("0.00"); return null; } debugReason = "matched portal at distance=" + num.ToString("0.00"); return val; } private static bool IsTargetPortalTeleportActive() { Type type = AccessTools.TypeByName("TargetPortal.Map"); if (type == null) { return false; } FieldInfo fieldInfo = AccessTools.DeclaredField(type, "Teleporting") ?? AccessTools.Field(type, "Teleporting"); if (fieldInfo == null) { return false; } try { object value = fieldInfo.GetValue(null); bool flag = default(bool); int num; if (value is bool) { flag = (bool)value; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } catch { return false; } } private static bool TryGetClickedTargetPortalZdo(out ZDO portalZdo) { portalZdo = null; Type type = AccessTools.TypeByName("TargetPortal.Map"); if (type == null) { return false; } MethodInfo methodInfo = AccessTools.DeclaredMethod(type, "GetClosestPortal", (Type[])null, (Type[])null); if (methodInfo == null) { return false; } object[] array = new object[2]; try { if (!(bool)methodInfo.Invoke(null, array)) { return false; } portalZdo = (ZDO)((array.Length > 1) ? /*isinst with value type is only supported in some contexts*/: null); return portalZdo != null; } catch (Exception ex) { LogDebug("[TPP] TryGetClickedTargetPortalZdo hiba: " + ex); return false; } } private static bool IsNearProtectedTargetPortal(Vector3 point, out string reason) { //IL_000d: 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_0084: 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_00c7: Unknown result type (might be due to invalid IL or missing references) float num = TerrainProtectionRadius(); float num2 = SearchRadius(); Collider[] array = Physics.OverlapSphere(point, num2); Collider[] array2 = array; foreach (Collider val in array2) { TeleportWorld componentInParent = ((Component)val).GetComponentInParent<TeleportWorld>(); ZNetView portalNView = GetPortalNView(componentInParent); if (!((Object)(object)componentInParent == (Object)null) && !((Object)(object)portalNView == (Object)null) && portalNView.IsValid() && IsTargetPortal(portalNView)) { TryStoreGuildIdOnPortal(portalNView, "Terrain proximity check"); float num3 = Vector3.Distance(point, ((Component)componentInParent).transform.position); if (!(num3 > num) && !CanBypassTerrainProtection(portalNView, out var reason2)) { string[] obj = new string[10] { "point ", null, null, null, null, null, null, null, null, null }; Vector3 val2 = point; obj[1] = ((object)(Vector3)(ref val2)).ToString(); obj[2] = " is within "; obj[3] = num3.ToString("0.00"); obj[4] = "m of protected portal "; obj[5] = GetPortalDebugName(portalNView); obj[6] = " (radius "; obj[7] = num.ToString("0.00"); obj[8] = "m). "; obj[9] = reason2; reason = string.Concat(obj); return true; } } } reason = "no protected target portal found in range"; return false; } private static bool IsSameGuildAsPortal(ZNetView nview, out string reason) { reason = "guild integration check failed"; if (!GuildIntegrationEnabled()) { reason = "guild integration is disabled"; LogDebug("IsSameGuildAsPortal: FALSE -> " + reason); return false; } if (!GuildsCompat.IsLoaded()) { reason = "Guilds mod is not loaded"; LogDebug("IsSameGuildAsPortal: FALSE -> " + reason); return false; } ZDO val = (((Object)(object)nview != (Object)null) ? nview.GetZDO() : null); if (val == null) { reason = "portal ZDO is null during guild check"; LogDebug("IsSameGuildAsPortal: FALSE -> " + reason); return false; } int @int = val.GetInt("TargetPortal GuildId", 0); if (@int == 0) { LogDebug("[GUILD CHECK] portalGuildId = 0 -> próbál menteni"); TryStoreGuildIdOnPortal(nview, "Guild comparison fallback"); @int = val.GetInt("TargetPortal GuildId", 0); } int ownGuildId = GuildsCompat.GetOwnGuildId(); string ownGuildRankKey = GuildsCompat.GetOwnGuildRankKey(); LogDebug($"[GUILD CHECK] portalGuild={@int} playerGuild={ownGuildId} playerRank={ownGuildRankKey}"); if (@int == 0) { reason = "portal has no cached guild id: " + GetPortalDebugName(nview); LogDebug("IsSameGuildAsPortal: FALSE -> " + reason); return false; } if (ownGuildId == 0) { reason = "local player has no guild id"; LogDebug("IsSameGuildAsPortal: FALSE -> " + reason); return false; } if (ownGuildId != @int) { reason = "guild mismatch for " + GetPortalDebugName(nview) + " (portalGuildId=" + @int + ", ownGuildId=" + ownGuildId + ")"; LogDebug("IsSameGuildAsPortal: FALSE -> " + reason); return false; } if (!RequireGuildRankForNonOwners()) { reason = "guild match succeeded (guildId=" + ownGuildId + ") for " + GetPortalDebugName(nview); LogDebug("IsSameGuildAsPortal: TRUE -> " + reason); return true; } if (GuildsCompat.HasPortalModifyPermission(AllowedGuildRanksForPortalModify())) { reason = "guild match succeeded and rank allows portal modification (guildId=" + ownGuildId + ", rank=" + ownGuildRankKey + ")"; LogDebug("IsSameGuildAsPortal: TRUE -> " + reason); return true; } reason = "guild matches but rank does not allow portal modification (guildId=" + ownGuildId + ", rank=" + ownGuildRankKey + ")"; LogDebug("IsSameGuildAsPortal: FALSE -> " + reason); return false; } private static bool IsSameGuildAsPortalForVisibility(ZDO zdo, out string reason) { reason = "guild visibility check failed"; if (!GuildIntegrationEnabled()) { reason = "guild integration is disabled"; return false; } if (!GuildsCompat.IsLoaded()) { reason = "Guilds mod is not loaded"; return false; } if (zdo == null) { reason = "portal ZDO is null during visibility guild check"; return false; } int @int = zdo.GetInt("TargetPortal GuildId", 0); if (@int == 0) { ZNetView val = FindNviewFromZdo(zdo); if ((Object)(object)val != (Object)null && val.IsValid()) { TryStoreGuildIdOnPortal(val, "Visibility guild fallback"); @int = zdo.GetInt("TargetPortal GuildId", 0); } } int ownGuildId = GuildsCompat.GetOwnGuildId(); if (@int == 0) { reason = "portal has no cached guild id"; return false; } if (ownGuildId == 0) { reason = "local player has no guild id"; return false; } if (ownGuildId != @int) { reason = "guild mismatch (portalGuildId=" + @int + ", ownGuildId=" + ownGuildId + ")"; return false; } reason = "guild visibility match (guildId=" + ownGuildId + ")"; return true; } internal static bool CanSeePortal(ZDO zdo, out string reason) { reason = "unknown visibility result"; if (!VisibilityProtectionEnabled()) { reason = "visibility protection disabled"; return true; } if (zdo == null) { reason = "portal ZDO is null"; return false; } LogDebug("CanSeePortal check: mode=" + zdo.GetInt("TargetPortal PortalMode", 0)); switch (zdo.GetInt("TargetPortal PortalMode", 0)) { case 0: reason = "public portal"; return true; case 1: return IsOwnerOrAdmin(zdo, out reason); case 4: return IsSameGuildAsPortalForVisibility(zdo, out reason); case 3: if (TargetPortalProtectionPlugin.IsLocalPlayerAdmin()) { reason = "admin portal visible to admin"; return true; } reason = "admin portal hidden from non-admin"; return false; case 2: reason = "group portal uses original visibility"; return true; default: reason = "unknown portal mode, leaving visible"; return true; } } internal static void FilterVisiblePortalPins() { //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Expected I4, but got Unknown if (!VisibilityProtectionEnabled()) { return; } Minimap instance = Minimap.instance; if ((Object)(object)instance == (Object)null) { return; } FieldInfo fieldInfo = AccessTools.Field(typeof(Minimap), "m_pins"); if (fieldInfo == null || !(fieldInfo.GetValue(instance) is IList list) || list.Count == 0) { return; } MethodInfo methodInfo = AccessTools.Method(typeof(Minimap), "RemovePin", new Type[1] { typeof(PinData) }, (Type[])null); if (methodInfo == null) { return; } List<object> list2 = new List<object>(); foreach (object item in list) { if (item != null) { list2.Add(item); } } List<ZDO> portalZdos = CollectAllTargetPortalZdos(); List<PinData> list3 = new List<PinData>(); foreach (object item2 in list2) { PinData val = (PinData)((item2 is PinData) ? item2 : null); if (val == null) { continue; } int num = (int)val.m_type; if (num == 17) { ZDO val2; string debugReason; try { val2 = FindClosestPortalZdoFromPin(val, portalZdos, out debugReason); } catch (Exception ex) { LogDebug("[VISIBILITY] portal lookup hiba: " + ex); continue; } string reason; if (val2 == null) { LogDebug("[VISIBILITY] nincs ZDO ehhez a pinhez: " + val.m_name + " | " + debugReason); } else if (!CanSeePortal(val2, out reason)) { LogDebug("[VISIBILITY] ELREJTEM: " + val.m_name + " | " + reason); list3.Add(val); } } } foreach (PinData item3 in list3) { try { methodInfo.Invoke(instance, new object[1] { item3 }); } catch (Exception ex2) { LogDebug("[VISIBILITY] pin remove hiba: " + ex2); } } } internal static bool TryPatchVisibility(Harmony harmony) { //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown try { Type type = AccessTools.TypeByName("TargetPortal.Map"); if (type == null) { LogDebug("TryPatchVisibility: TargetPortal.Map még nincs betöltve"); return false; } MethodInfo methodInfo = AccessTools.DeclaredMethod(type, "AddPortalPins", (Type[])null, (Type[])null); if (methodInfo == null) { LogDebug("TryPatchVisibility: AddPortalPins metódus nem található"); return false; } MethodInfo methodInfo2 = AccessTools.DeclaredMethod(typeof(PortalProtectionLogic), "VisibilityPostfix", (Type[])null, (Type[])null); if (methodInfo2 == null) { LogDebug("TryPatchVisibility: VisibilityPostfix metódus nem található"); return false; } harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); LogDebug("TryPatchVisibility: AddPortalPins postfix patch sikeresen felment"); return true; } catch (Exception ex) { if (TargetPortalProtectionPlugin.Log != null) { TargetPortalProtectionPlugin.Log.LogError((object)("TryPatchVisibility hiba: " + ex)); } return false; } } private static void VisibilityPostfix() { FilterVisiblePortalPins(); } private static void TryStoreGuildIdOnPortal(ZNetView nview, string context) { LogDebug("[GUILD CACHE ENTER] context=" + context + " portal=" + (((Object)(object)nview != (Object)null) ? GetPortalDebugName(nview) : "<null>")); if (!GuildIntegrationEnabled() || !StoreGuildIdOnPortal() || !GuildsCompat.IsLoaded()) { LogDebug("[GUILD CACHE EXIT] guild integration disabled or Guilds missing"); return; } if ((Object)(object)nview == (Object)null || !nview.IsValid()) { LogDebug("[GUILD CACHE EXIT] invalid nview"); return; } ZDO zDO = nview.GetZDO(); if (zDO == null) { LogDebug("[GUILD CACHE EXIT] zdo null"); return; } if (!nview.IsOwner()) { LogDebug("[GUILD CACHE EXIT] not zdo owner"); return; } int ownGuildId = GuildsCompat.GetOwnGuildId(); int @int = zDO.GetInt("TargetPortal GuildId", 0); LogDebug($"[GUILD CACHE STATE] currentGuildId={@int} ownGuildId={ownGuildId} context={context}"); if (ownGuildId == 0) { LogDebug("[GUILD CACHE EXIT] ownGuildId == 0"); return; } if (@int == ownGuildId) { LogDebug("[GUILD CACHE EXIT] already same guild id"); return; } zDO.Set("TargetPortal GuildId", ownGuildId); LogDebug($"[GUILD CACHE WRITE] portal={GetPortalDebugName(nview)} oldGuildId={@int} newGuildId={ownGuildId} context={context}"); } } internal static class GuildsCompat { private const string GuildsPluginGuid = "org.bepinex.plugins.guilds"; private const string GuildsApiTypeName = "Guilds.API"; private static Type _apiType; private static MethodInfo _isLoadedMethod; private static MethodInfo _getOwnGuildMethod; private static bool _initialized; private static void PortalProtectionLogicLogDebug(string message) { try { if (TargetPortalProtectionPlugin.CE_DebugLogging_Enabled != null && TargetPortalProtectionPlugin.CE_DebugLogging_Enabled.Value && TargetPortalProtectionPlugin.Log != null) { TargetPortalProtectionPlugin.Log.LogInfo((object)message); } } catch { } } internal static bool IsLoaded() { EnsureInitialized(); if (!Chainloader.PluginInfos.ContainsKey("org.bepinex.plugins.guilds")) { return false; } if (_apiType == null || _isLoadedMethod == null) { return false; } try { return (bool)_isLoadedMethod.Invoke(null, null); } catch { return false; } } internal static int GetOwnGuildId() { EnsureInitialized(); if (!IsLoaded() || _getOwnGuildMethod == null) { return 0; } try { object obj = _getOwnGuildMethod.Invoke(null, null); if (obj == null) { return 0; } object memberValue = GetMemberValue(obj, "General"); if (memberValue == null) { return 0; } object memberValue2 = GetMemberValue(memberValue, "id"); return (memberValue2 is int) ? ((int)memberValue2) : Convert.ToInt32(memberValue2); } catch { return 0; } } internal static void DebugGuildMembers() { try { if (!IsLoaded()) { return; } object obj = ((_getOwnGuildMethod != null) ? _getOwnGuildMethod.Invoke(null, null) : null); if (obj == null) { return; } object obj2 = GetMemberValue(obj, "Members") ?? GetMemberValue(obj, "members"); if (!(obj2 is IEnumerable enumerable)) { PortalProtectionLogicLogDebug("[GUILD DEBUG] Members nincs vagy nem enumerable"); return; } foreach (object item in enumerable) { if (item != null) { object memberValue = GetMemberValue(item, "Key"); object memberValue2 = GetMemberValue(item, "Value"); string text = ReadStringLike(memberValue, "Name") ?? ReadStringLike(memberValue, "name") ?? ReadStringLike(memberValue, "PlayerName") ?? ReadStringLike(memberValue, "playerName") ?? ReadStringLike(memberValue, "Username") ?? ReadStringLike(memberValue, "username"); string text2 = ReadStringLike(memberValue, "PlayerID") ?? ReadStringLike(memberValue, "playerID") ?? ReadStringLike(memberValue, "PlayerId") ?? ReadStringLike(memberValue, "playerId") ?? ReadStringLike(memberValue, "Id") ?? ReadStringLike(memberValue, "id") ?? ReadStringLike(memberValue, "UserId") ?? ReadStringLike(memberValue, "userId"); string text3 = TryReadRankLikeValue(memberValue2); PortalProtectionLogicLogDebug("[GUILD MEMBER] keyType=" + ((memberValue != null) ? memberValue.GetType().FullName : "<null>") + " valueType=" + ((memberValue2 != null) ? memberValue2.GetType().FullName : "<null>") + " name=" + text + " id=" + text2 + " rank=" + text3); } } } catch (Exception ex) { PortalProtectionLogicLogDebug("[GUILD DEBUG ERROR] " + ex); } } internal static string GetOwnGuildRankKey() { EnsureInitialized(); if (!IsLoaded() || _getOwnGuildMethod == null) { return string.Empty; } try { object obj = _getOwnGuildMethod.Invoke(null, null); if (obj == null) { return string.Empty; } object obj2 = FindOwnMemberObject(obj); if (obj2 == null) { PortalProtectionLogicLogDebug("[GUILD RANK] Nem találtam saját member objektumot."); return string.Empty; } string value = TryReadRankLikeValue(obj2); if (!string.IsNullOrEmpty(value)) { return NormalizeRankKey(value); } object memberValue = GetMemberValue(obj2, "General"); if (memberValue != null) { string value2 = TryReadRankLikeValue(memberValue); if (!string.IsNullOrEmpty(value2)) { return NormalizeRankKey(value2); } } PortalProtectionLogicLogDebug("[GUILD RANK] A member megvan, de rank nem olvasható."); return string.Empty; } catch (Exception ex) { PortalProtectionLogicLogDebug("[GUILD RANK ERROR] " + ex); return string.Empty; } } internal static bool HasPortalModifyPermission(string allowedRanksCsv) { string text = NormalizeRankKey(GetOwnGuildRankKey()); HashSet<string> hashSet = ParseAllowedRanks(allowedRanksCsv); if (string.IsNullOrEmpty(text)) { return false; } return hashSet.Contains(text); } private static HashSet<string> ParseAllowedRanks(string csv) { HashSet<string> hashSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase); if (string.IsNullOrWhiteSpace(csv)) { return hashSet; } string[] array = csv.Split(new char[4] { ',', ';', '|', ' ' }, StringSplitOptions.RemoveEmptyEntries); string[] array2 = array; foreach (string value in array2) { string text = NormalizeRankKey(value); if (!string.IsNullOrEmpty(text)) { hashSet.Add(text); } } return hashSet; } private static string NormalizeRankKey(string value) { if (string.IsNullOrWhiteSpace(value)) { return string.Empty; } string text = value.Trim().ToLowerInvariant().Replace("_", "") .Replace("-", "") .Replace(" ", ""); switch (text) { default: if (!(text == "deputyleader")) { if (text == "officer" || text == "elder" || text == "moderator") { return "officer"; } switch (text) { default: if (!(text == "admin")) { if (text == "member" || text == "default") { return "member"; } return text; } goto case "leader"; case "leader": case "owner": case "guildmaster": case "master": return "leader"; } } goto case "coleader"; case "coleader": case "subleader": case "viceleader": return "coleader"; } } private static object FindOwnMemberObject(object guild) { if (guild == null) { return null; } object memberValue = GetMemberValue(guild, "Members"); if (memberValue == null) { memberValue = GetMemberValue(guild, "members"); } if (!(memberValue is IEnumerable enumerable)) { return null; } string localUserId = string.Empty; string localPlayerName = string.Empty; long localPlayerId = 0L; try { localUserId = ((object)(PlatformUserID)(ref UserInfo.GetLocalUser().UserId)).ToString(); } catch { } try { if ((Object)(object)Player.m_localPlayer != (Object)null) { localPlayerName = Player.m_localPlayer.GetPlayerName(); localPlayerId = Player.m_localPlayer.GetPlayerID(); } } catch { } foreach (object item in enumerable) { if (item != null) { object memberValue2 = GetMemberValue(item, "Key"); object memberValue3 = GetMemberValue(item, "Value"); if (memberValue2 != null && memberValue3 != null && MatchesPlayerReference(memberValue2, localUserId, localPlayerName, localPlayerId)) { return memberValue3; } } } return null; } private static bool MatchesPlayerReference(object playerRef, string localUserId, string localPlayerName, long localPlayerId) { if (playerRef == null) { return false; } string[] array = new string[12] { ReadStringLike(playerRef, "PlayerID"), ReadStringLike(playerRef, "playerID"), ReadStringLike(playerRef, "PlayerId"), ReadStringLike(playerRef, "playerId"), ReadStringLike(playerRef, "Id"), ReadStringLike(playerRef, "id"), ReadStringLike(playerRef, "UserId"), ReadStringLike(playerRef, "userId"), ReadStringLike(playerRef, "SteamId"), ReadStringLike(playerRef, "steamId"), ReadStringLike(playerRef, "PlatformId"), ReadStringLike(playerRef, "platformId") }; string[] array2 = array; foreach (string text in array2) { if (!string.IsNullOrEmpty(text)) { string text2 = text.Replace("Steam_", string.Empty); string text3 = (string.IsNullOrEmpty(localUserId) ? string.Empty : localUserId.Replace("Steam_", string.Empty)); if (!string.IsNullOrEmpty(text3) && text2 == text3) { return true; } if (localPlayerId != 0L && text2 == localPlayerId.ToString()) { return true; } } } string[] array3 = new string[6] { ReadStringLike(playerRef, "Name"), ReadStringLike(playerRef, "name"), ReadStringLike(playerRef, "PlayerName"), ReadStringLike(playerRef, "playerName"), ReadStringLike(playerRef, "Username"), ReadStringLike(playerRef, "username") }; string[] array4 = array3; foreach (string text4 in array4) { if (!string.IsNullOrEmpty(text4) && !string.IsNullOrEmpty(localPlayerName) && string.Equals(text4, localPlayerName, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } private static bool MatchesLocalUser(object member, string localUserId) { if (member == null || string.IsNullOrEmpty(localUserId)) { return false; } string[] array = new string[12] { ReadStringLike(member, "UserId"), ReadStringLike(member, "userId"), ReadStringLike(member, "SteamId"), ReadStringLike(member, "steamId"), ReadStringLike(member, "PlatformId"), ReadStringLike(member, "platformId"), ReadStringLike(member, "PlayerId"), ReadStringLike(member, "playerId"), ReadStringLike(member, "playerID"), ReadStringLike(member, "PlayerID"), ReadStringLike(member, "id"), ReadStringLike(member, "Id") }; string[] array2 = array; foreach (string text in array2) { if (!string.IsNullOrEmpty(text)) { string text2 = text.Replace("Steam_", string.Empty); string text3 = localUserId.Replace("Steam_", string.Empty); if (text2 == text3) { return true; } } } return false; } private static bool MatchesLocalPlayerName(object member, string localPlayerName) { if (member == null || string.IsNullOrEmpty(localPlayerName)) { return false; } string[] array = new string[6] { ReadStringLike(member, "name"), ReadStringLike(member, "Name"), ReadStringLike(member, "playerName"), ReadStringLike(member, "PlayerName"), ReadStringLike(member, "username"), ReadStringLike(member, "Username") }; string[] array2 = array; foreach (string text in array2) { if (!string.IsNullOrEmpty(text) && string.Equals(text, localPlayerName, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } private static string TryReadRankLikeValue(object instance) { if (instance == null) { return string.Empty; } object[] array = new object[10] { GetMemberValue(instance, "Role"), GetMemberValue(instance, "role"), GetMemberValue(instance, "Rank"), GetMemberValue(instance, "rank"), GetMemberValue(instance, "Permission"), GetMemberValue(instance, "permission"), GetMemberValue(instance, "MemberRole"), GetMemberValue(instance, "memberRole"), GetMemberValue(instance, "MemberRank"), GetMemberValue(instance, "memberRank") }; object[] array2 = array; foreach (object candidate in array2) { string text = ConvertRankCandidate(candidate); if (!string.IsNullOrEmpty(text)) { return text; } } return string.Empty; } private static string ConvertRankCandidate(object candidate) { if (candidate == null) { return string.Empty; } if (candidate is string result) { return result; } Type type = candidate.GetType(); if (type.IsEnum) { return candidate.ToString(); } if (candidate is int || candidate is long || candidate is byte || candidate is short) { int num = Convert.ToInt32(candidate); return num switch { 0 => "leader", 1 => "coleader", 2 => "officer", 3 => "member", _ => num.ToString(), }; } return candidate.ToString(); } private static string ReadStringLike(object instance, string name) { return GetMemberValue(instance, name)?.ToString(); } private static void EnsureInitialized() { if (!_initialized) { _initialized = true; _apiType = AccessTools.TypeByName("Guilds.API"); if (!(_apiType == null)) { _isLoadedMethod = AccessTools.DeclaredMethod(_apiType, "IsLoaded", (Type[])null, (Type[])null); _getOwnGuildMethod = AccessTools.DeclaredMethod(_apiType, "GetOwnGuild", (Type[])null, (Type[])null); } } } private static object GetMemberValue(object instance, string name) { if (instance == null) { return null; } Type type = instance.GetType(); PropertyInfo property = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null) { return property.GetValue(instance, null); } FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return (field != null) ? field.GetValue(instance) : null; } } [BepInPlugin("hardheim.TargetPortalProtectionReworked", "TargetPortalProtectionReworked", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [SynchronizationMode(/*Could not decode attribute arguments.*/)] public class TargetPortalProtectionPlugin : BaseUnityPlugin { internal const string ModGuid = "hardheim.TargetPortalProtectionReworked"; internal const string ModName = "TargetPortalProtectionReworked"; internal const string ModVersion = "1.0.1"; private static readonly Harmony HarmonyInstance = new Harmony("hardheim.TargetPortalProtectionReworked"); private static bool _bootstrapped; private bool _visibilityPatchApplied; private float _nextVisibilityPatchRetryTime; private CustomLocalization _localization; internal static ManualLogSource Log; internal static CustomLocalization ModLocalization; public static ConfigEntry<bool> CE_PortalProtection_Enabled; public static ConfigEntry<bool> CE_TerrainProtection_Enabled; public static ConfigEntry<float> CE_TerrainProtection_Radius; public static ConfigEntry<bool> CE_TargetPortalProtection_AdminBypass; public static ConfigEntry<bool> CE_DebugLogging_Enabled; public static ConfigEntry<bool> CE_VisibilityProtection_Enabled; public static ConfigEntry<bool> CE_GuildIntegration_Enabled; public static ConfigEntry<bool> CE_GuildIntegration_AllowGuildMembersToModifyPortals; public static ConfigEntry<bool> CE_GuildIntegration_AllowGuildMembersToBypassTerrainProtection; public static ConfigEntry<bool> CE_GuildIntegration_StoreGuildIdOnPortal; public static ConfigEntry<bool> CE_GuildIntegration_RequireRankForNonOwnerPortalModify; public static ConfigEntry<string> CE_GuildIntegration_AllowedRanksToModifyPortals; public static bool IsLocalPlayerAdmin() { try { return SynchronizationManager.Instance != null && SynchronizationManager.Instance.PlayerIsAdmin; } catch { return false; } } private void Awake() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"TargetPortalProtectionReworked loaded."); Log = ((BaseUnityPlugin)this).Logger; PortalProtectionLogic.Init(); AddLocalizations(); if (_bootstrapped) { return; } _bootstrapped = true; CE_PortalProtection_Enabled = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "PortalProtection", "Enabled", true, "Ha engedélyezve van, más játékosok nem tudják módosítani vagy elpusztítani a védett TargetPortalokat, kivéve ha ők a tulajdonosok, ugyanabban a guildben vannak (ha engedélyezett), vagy adminok.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_TerrainProtection_Enabled = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "TerrainProtection", "Enabled", true, "Ha engedélyezve van, a védett TargetPortalok környezetében nem lehet terepet módosítani.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); ConfigFile config = ((BaseUnityPlugin)this).Config; AcceptableValueBase val = (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 50f); CE_TerrainProtection_Radius = ConfigFileExtensions.BindConfig<float>(config, "TerrainProtection", "Radius", 5f, "A védelem sugara méterben a TargetPortal körül. Ezen belül tiltott a terep módosítása.", true, (int?)null, val, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_TargetPortalProtection_AdminBypass = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "PortalProtection", "AdminBypass", true, "Ha engedélyezve van, az adminok figyelmen kívül hagyják a portal védelmet, és módosíthatják a védett TargetPortalokat.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_VisibilityProtection_Enabled = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "VisibilityProtection", "Enabled", true, "Ha engedélyezve van, a TargetPortal selector térképén a private portálok csak a tulajdonosnak, a guild portálok csak ugyanazon guild tagjainak, az admin portálok csak adminoknak látszanak.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_DebugLogging_Enabled = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "Debug", "EnableLogging", false, "Ha engedélyezve van, részletes debug információk kerülnek a BepInEx logba.", false, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_GuildIntegration_Enabled = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "GuildIntegration", "Enabled", true, "Ha engedélyezve van, a mod együttműködik a Guilds moddal, és figyelembe veszi a guild tagságot.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_GuildIntegration_AllowGuildMembersToModifyPortals = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "GuildIntegration", "AllowGuildMembersToModifyPortals", true, "Ha engedélyezve van, a portal tulajdonosával azonos guildben lévő játékosok módosíthatják a portált.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_GuildIntegration_AllowGuildMembersToBypassTerrainProtection = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "GuildIntegration", "AllowGuildMembersToBypassTerrainProtection", false, "Ha engedélyezve van, a guild tagok figyelmen kívül hagyhatják a terepvédelmet a portal közelében.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_GuildIntegration_StoreGuildIdOnPortal = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "GuildIntegration", "StoreGuildIdOnPortal", true, "Ha engedélyezve van, a portal eltárolja a tulajdonos guild azonosítóját.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_GuildIntegration_RequireRankForNonOwnerPortalModify = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "GuildIntegration", "RequireRankForNonOwnerPortalModify", false, "Ha engedélyezve van, a nem tulajdonos guild tagok csak megfelelő guild ranggal módosíthatják a portált.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); CE_GuildIntegration_AllowedRanksToModifyPortals = ConfigFileExtensions.BindConfig<string>(((BaseUnityPlugin)this).Config, "GuildIntegration", "AllowedRanksToModifyPortals", "leader,officer,coleader", "Azok a guild rangok, amelyek nem tulajdonosként módosíthatják a guild portálokat.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); SynchronizationManager.OnConfigurationSynchronized += delegate(object obj, ConfigurationSynchronizationEventArgs args) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[CONFIG SYNC] Lefutott. Initial: {args.InitialSynchronization}"); if (CE_GuildIntegration_AllowGuildMembersToModifyPortals != null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[CONFIG SYNC] AllowGuildMembersToModifyPortals = {CE_GuildIntegration_AllowGuildMembersToModifyPortals.Value}"); } if (CE_GuildIntegration_RequireRankForNonOwnerPortalModify != null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[CONFIG SYNC] RequireRankForNonOwnerPortalModify = {CE_GuildIntegration_RequireRankForNonOwnerPortalModify.Value}"); } if (CE_GuildIntegration_AllowedRanksToModifyPortals != null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("[CONFIG SYNC] AllowedRanksToModifyPortals = " + CE_GuildIntegration_AllowedRanksToModifyPortals.Value)); } if (CE_VisibilityProtection_Enabled != null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[CONFIG SYNC] VisibilityProtection.Enabled = {CE_VisibilityProtection_Enabled.Value}"); } }; HarmonyInstance.PatchAll(); _visibilityPatchApplied = false; _nextVisibilityPatchRetryTime = Time.time + 2f; } private void Update() { if (!_visibilityPatchApplied && !(Time.time < _nextVisibilityPatchRetryTime)) { _nextVisibilityPatchRetryTime = Time.time + 2f; if (PortalProtectionLogic.TryPatchVisibility(HarmonyInstance)) { _visibilityPatchApplied = true; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[VISIBILITY] AddPortalPins patch applied successfully."); } else if (CE_DebugLogging_Enabled != null && CE_DebugLogging_Enabled.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[VISIBILITY] AddPortalPins patch még nem rakható fel, újrapróbálom..."); } } } private void AddLocalizations() { _localization = LocalizationManager.Instance.GetLocalization(); ModLocalization = _localization; CustomLocalization localization = _localization; string text = "English"; localization.AddTranslation(ref text, new Dictionary<string, string> { { "tweaks_portal_protected", "You are not allowed to modify this protected TargetPortal." }, { "tweaks_portal_terrain", "You cannot modify terrain near this protected TargetPortal." } }); CustomLocalization localization2 = _localization; text = "Hungarian"; localization2.AddTranslation(ref text, new Dictionary<string, string> { { "tweaks_portal_protected", "Ehhez a védett portálhoz nincs módosítási jogosultságod." }, { "tweaks_portal_terrain", "A védett portál közelében nem módosíthatod a terepet." } }); } }