using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("PortalCompanionInterdiction")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.3.0")] [assembly: AssemblyInformationalVersion("1.0.3")] [assembly: AssemblyProduct("PortalCompanionInterdiction")] [assembly: AssemblyTitle("PortalCompanionInterdiction")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.3.0")] [module: UnverifiableCode] namespace PortalCompanionInterdiction; [BepInPlugin("com.yourname.portalcompanioninterdiction", "Portal Companion Interdiction", "1.0.24")] [BepInProcess("valheim.exe")] public class PortalInterdictionPlugin : BaseUnityPlugin { private readonly Harmony harmony = new Harmony("com.yourname.portalcompanioninterdiction"); private void Awake() { harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Portal Companion Interdiction v1.0.24 (Odin's Enforcement) loaded successfully!"); } } [HarmonyPatch(typeof(Inventory), "IsTeleportable")] public static class InventoryCargoInterdictionPatch { [HarmonyPostfix] public static void Postfix(Inventory __instance, ref bool __result) { if (!__result) { return; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null || ((Humanoid)localPlayer).GetInventory() != __instance) { return; } MonoBehaviour[] array = Object.FindObjectsByType((FindObjectsInactive)0, (FindObjectsSortMode)0); if (array == null) { return; } string text = localPlayer.GetPlayerID().ToString(); MonoBehaviour[] array2 = array; foreach (MonoBehaviour val in array2) { if ((Object)(object)val == (Object)null) { continue; } string name = ((object)val).GetType().Name; if (!name.Contains("CompanionAI")) { continue; } bool flag = false; ZNetView component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null && component.GetZDO() != null) { ZDO zDO = component.GetZDO(); string text2 = zDO.GetString(423985160, ""); if (zDO.GetBool(1424699564, true) && text2 == text) { flag = true; } } if (!flag) { object obj = ((object)val).GetType().GetField("m_followTarget", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(val) ?? ((object)val).GetType().GetField("m_follow", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(val); if (obj != null) { GameObject val2 = (GameObject)((obj is GameObject) ? obj : null); if (val2 != null && (Object)(object)val2 == (Object)(object)((Component)localPlayer).gameObject) { flag = true; goto IL_01f1; } } MethodInfo? method = ((object)val).GetType().GetMethod("IsFollowingPlayer"); object obj2; if ((object)method == null) { obj2 = null; } else { object[] parameters = (object[])(object)new Player[1] { localPlayer }; obj2 = method.Invoke(val, parameters); } if (obj2 is bool flag2) { flag = flag2; } } goto IL_01f1; IL_01f1: if (!flag) { continue; } Humanoid component2 = ((Component)val).GetComponent(); Inventory val3 = ((component2 != null) ? component2.GetInventory() : null); if (val3 != null && !val3.IsTeleportable()) { __result = false; if ((Object)(object)MessageHud.instance != (Object)null) { MessageHud.instance.ShowMessage((MessageType)2, "Odin disapproves of this action!", 0, (Sprite)null, false); MessageHud.instance.ShowMessage((MessageType)1, "Your companion is carrying items restricted by the portal.", 0, (Sprite)null, false); } break; } } } }