using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("FishMagnet")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("FishMagnet")] [assembly: AssemblyTitle("FishMagnet")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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 FishMagnet { internal sealed class FishCollector { private const float ScanInterval = 0.2f; private const float RequestCooldown = 2f; private readonly List _buffer = new List(); private readonly Dictionary _requested = new Dictionary(); private readonly List _expired = new List(); private float _timer; public void Tick(float deltaTime) { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) _timer -= deltaTime; if (_timer > 0f) { return; } _timer = 0.2f; Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null || ((Character)localPlayer).IsDead()) { return; } PruneRequests(); _buffer.Clear(); foreach (IMonoUpdater instance in Fish.Instances) { Fish val = (Fish)(object)((instance is Fish) ? instance : null); if (val != null && (Object)(object)val != (Object)null) { _buffer.Add(val); } } float value = Plugin.Range.Value; float num = value * value; Vector3 position = ((Component)localPlayer).transform.position; Inventory inventory = ((Humanoid)localPlayer).GetInventory(); foreach (Fish item in _buffer) { if ((Object)(object)item == (Object)null) { continue; } Vector3 val2 = ((Component)item).transform.position - position; if (((Vector3)(ref val2)).sqrMagnitude > num) { continue; } ZNetView component = ((Component)item).GetComponent(); if (!((Object)(object)component == (Object)null) && component.IsValid() && (!Plugin.SkipHookedFish.Value || !IsHooked(component))) { ZDOID uid = component.GetZDO().m_uid; if (!_requested.ContainsKey(uid) && (!((Object)(object)item.m_pickupItem != (Object)null) || inventory.CanAddItem(item.m_pickupItem, item.m_pickupItemStackSize)) && item.Pickup((Humanoid)(object)localPlayer)) { _requested[uid] = Time.time; } } } } private static bool IsHooked(ZNetView nview) { return nview.GetZDO().GetInt(ZDOVars.s_hooked, 0) != 0; } private void PruneRequests() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) if (_requested.Count == 0) { return; } float time = Time.time; _expired.Clear(); foreach (KeyValuePair item in _requested) { if (time - item.Value >= 2f) { _expired.Add(item.Key); } } foreach (ZDOID item2 in _expired) { _requested.Remove(item2); } } } [BepInPlugin("matheba.fishmagnet", "FishMagnet", "1.0.0")] [BepInProcess("valheim.exe")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Log; internal static ConfigEntry ModEnabled; internal static ConfigEntry ToggleKey; internal static ConfigEntry ShowToggleMessage; internal static ConfigEntry Range; internal static ConfigEntry SkipHookedFish; private FishCollector _collector; private void Awake() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Expected O, but got Unknown //IL_011a: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; ModEnabled = ((BaseUnityPlugin)this).Config.Bind("1 - General", "Fish magnet", false, "Turns the fish magnet on and off. Applies only to your own character, on your client."); ToggleKey = ((BaseUnityPlugin)this).Config.Bind("1 - General", "Toggle hotkey", new KeyboardShortcut((KeyCode)288, Array.Empty()), "Key that turns the magnet on and off in game. Ignored while you are typing in chat or the console."); ShowToggleMessage = ((BaseUnityPlugin)this).Config.Bind("1 - General", "Show on-screen message", true, "Shows a centre-screen message when you toggle the magnet with the hotkey."); Range = ((BaseUnityPlugin)this).Config.Bind("2 - Behaviour", "Range", 20f, new ConfigDescription("How far away fish are collected from, in metres. Measured from you, so it works the same standing on shore or sailing a boat.", (AcceptableValueBase)(object)new AcceptableValueRange(2f, 100f), Array.Empty())); SkipHookedFish = ((BaseUnityPlugin)this).Config.Bind("2 - Behaviour", "Skip hooked fish", true, "Leaves fish alone while someone has them on a fishing line, so the magnet does not steal a catch another player is reeling in."); _collector = new FishCollector(); Log.LogInfo((object)string.Format("{0} {1} loaded. Enabled: {2}, hotkey: {3}", "FishMagnet", "1.0.0", ModEnabled.Value, ToggleKey.Value)); } private void Update() { //IL_0005: 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) KeyboardShortcut value = ToggleKey.Value; if (((KeyboardShortcut)(ref value)).IsDown() && !IsTyping()) { ModEnabled.Value = !ModEnabled.Value; Log.LogInfo((object)("Fish magnet: " + (ModEnabled.Value ? "on" : "off"))); if (ShowToggleMessage.Value && (Object)(object)Player.m_localPlayer != (Object)null) { ((Character)Player.m_localPlayer).Message((MessageType)2, ModEnabled.Value ? $"Fish magnet: ON ({Range.Value:0}m)" : "Fish magnet: OFF", 0, (Sprite)null); } } if (ModEnabled.Value) { _collector.Tick(Time.deltaTime); } } private static bool IsTyping() { if (Console.IsVisible() || TextInput.IsVisible()) { return true; } if ((Object)(object)Chat.instance != (Object)null) { return Chat.instance.HasFocus(); } return false; } } internal static class PluginInfo { internal const string Guid = "matheba.fishmagnet"; internal const string Name = "FishMagnet"; internal const string Version = "1.0.0"; } }