Please disclose if your mod was created primarily 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 BetterFishing v1.2.3
BetterFishing.dll
Decompiled a year agousing System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Jotunn.Utils; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("SmartFishing")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SmartFishing")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("5adf077a-740b-4e39-8ede-7f719ad19c53")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace BetterFishing; [BepInPlugin("kam1goroshi.BetterFishing", "BetterFishing", "1.2.3")] [BepInProcess("valheim.exe")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class BetterFishing : BaseUnityPlugin { [HarmonyPatch(typeof(FishingFloat), "Awake")] private class FishingFixedUpdatePatch { private static void Postfix(ref float ___m_fishingSkillImproveHookedMultiplier) { ___m_fishingSkillImproveHookedMultiplier = hookExpMultiplier.Value; } } [HarmonyPatch(typeof(Fish), "OnHooked")] private class fishLevelBoostPatch { private static void Postfix(Fish __instance, FishingFloat ff) { //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) ItemDrop itemDrop = __instance.m_itemDrop; string value; if ((Object)(object)itemDrop == (Object)null || itemDrop.m_itemData == null) { logger.LogError((object)"Called boost patch on fish that had no itemDrop on it"); } else if (itemDrop.m_itemData.m_customData.ContainsKey("FishHadBeenCaught")) { logger.LogMessage((object)"Fish has been marked as caught. Won't boost attempt"); } else if ((Object)(object)ff != (Object)null) { float skillLevel = ((Character)Player.m_localPlayer).GetSkillLevel((SkillType)104); if (skillLevel >= (float)fishingBoosterStartLevel.Value && !itemDrop.m_itemData.m_customData.ContainsKey("BoostedByFishingLevel")) { float num = skillLevel / 100f; float num2 = fishingBoosterMaxChance.Value * num; int num3 = 0; float num4 = Random.Range(0f, 1f); logger.LogMessage((object)$"Boosting success rate: {num2 * 100f:f2}% and rolled {num4 * 100f:F2}%"); if (num2 > num4) { itemDrop.SetQuality(Mathf.Clamp(itemDrop.m_itemData.m_quality + 1, minFishLevel, maxFishLevel)); num3++; } if (num3 > 0) { ff.GetOwner().Message((MessageType)2, $"Fish Level raised by {num3}!", 0, (Sprite)null); itemDrop.m_itemData.m_customData.Add("BoostedByFishingLevel", $"{num3}"); Object.Instantiate<GameObject>(myAssetBundle.LoadAsset<GameObject>("kam_LevelUpEffect"), ((Component)__instance).transform.position, ((Component)__instance).transform.rotation); itemDrop.Save(); } } } else if (itemDrop.m_itemData.m_customData.TryGetValue("BoostedByFishingLevel", out value)) { logger.LogMessage((object)"In OnHooked(null) with fish that was not already caught"); int num5 = int.Parse(value); itemDrop.SetQuality(Mathf.Clamp(itemDrop.m_itemData.m_quality - num5, minFishLevel, maxFishLevel)); itemDrop.m_itemData.m_customData.Remove("BoostedByFishingLevel"); itemDrop.Save(); ((Character)Player.m_localPlayer).Message((MessageType)2, "Failed to catch, fish level unboosted..", 0, (Sprite)null); } } } [HarmonyPatch(typeof(FishingFloat), "Catch")] private class FishCatchPatch { private static void Prefix(Fish fish, Character owner) { if ((Object)(object)fish != (Object)null) { ItemDrop component = ((Component)fish).gameObject.GetComponent<ItemDrop>(); string name = ((Object)((Humanoid)Player.m_localPlayer).GetAmmoItem().m_dropPrefab).name; float expGainOnCatch = getExpGainOnCatch(component.m_itemData.m_quality, name); ((Character)Player.m_localPlayer).RaiseSkill((SkillType)104, expGainOnCatch); if (!component.m_itemData.m_customData.ContainsKey("FishHadBeenCaught")) { component.m_itemData.m_customData.Add("FishHadBeenCaught", ""); component.Save(); } } else { logger.LogError((object)"null fish in FishCatchPatch"); } } } [HarmonyPatch(typeof(Fish), "Pickup")] private class FishPickupPatch { private static void Prefix(Fish __instance) { ItemDrop component = ((Component)__instance).GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { if (__instance.IsHooked()) { string name = ((Object)((Humanoid)Player.m_localPlayer).GetAmmoItem().m_dropPrefab).name; float expGainOnCatch = getExpGainOnCatch(component.m_itemData.m_quality, name); ((Character)Player.m_localPlayer).RaiseSkill((SkillType)104, expGainOnCatch); if (!component.m_itemData.m_customData.ContainsKey("FishHadBeenCaught")) { component.m_itemData.m_customData.Add("FishHadBeenCaught", ""); component.Save(); } } } else { logger.LogError((object)"null fish in FishPickupPatch"); } } } private const string GUID = "kam1goroshi.BetterFishing"; private const string readableName = "BetterFishing"; private const string version = "1.2.3"; private static AssetBundle myAssetBundle; private static string ConfigFileName = "kam1goroshi.BetterFishing.cfg"; private static string configFilePath = Paths.ConfigPath; private static string ConfigFileFullPath; private static readonly int maxFishLevel; private static readonly int minFishLevel; private static ManualLogSource logger; private readonly Harmony harmony = new Harmony("kam1goroshi.BetterFishing"); private static Dictionary<string, float> baitBonusExpMap; private static ConfigEntry<float> hookExpMultiplier; private static ConfigEntry<float> stepsForCatch; private static ConfigEntry<float> bonusPerFishLevel; private static ConfigEntry<float> fishingBaitBonus; private static ConfigEntry<float> fishingBaitForestBonus; private static ConfigEntry<float> fishingBaitSwampBonus; private static ConfigEntry<float> fishingBaitCaveBonus; private static ConfigEntry<float> fishingBaitPlainsBonus; private static ConfigEntry<float> fishingBaitOceanBonus; private static ConfigEntry<float> fishingBaitAshlandsBonus; private static ConfigEntry<float> fishingBaitDeepNorthBonus; private static ConfigEntry<float> fishingBaitMistlandsBonus; private static ConfigEntry<int> fishingBoosterStartLevel; private static ConfigEntry<float> fishingBoosterMaxChance; private const string caughtFlagKey = "FishHadBeenCaught"; private const string boostedByFishingLevelKey = "BoostedByFishingLevel"; private void Awake() { //IL_001e: 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_002b: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Expected O, but got Unknown //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Expected O, but got Unknown //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Expected O, but got Unknown //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Expected O, but got Unknown //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Expected O, but got Unknown //IL_02b0: Unknown result type (might be due to invalid IL or missing references) //IL_02ba: Expected O, but got Unknown //IL_02f2: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Expected O, but got Unknown //IL_0334: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Expected O, but got Unknown //IL_036c: Unknown result type (might be due to invalid IL or missing references) //IL_0376: Expected O, but got Unknown //IL_03ae: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Expected O, but got Unknown myAssetBundle = AssetUtils.LoadAssetBundleFromResources("kam_bundle", typeof(BetterFishing).Assembly); ConfigurationManagerAttributes val = new ConfigurationManagerAttributes { IsAdminOnly = true }; hookExpMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Hook_Exp_Multiplier", 2f, new ConfigDescription("Reeling exp with a hooked fish compared to vanilla empty reel. Vanilla/Default: 2x", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), new object[1] { val })); stepsForCatch = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Steps_For_Catch", 10f, new ConfigDescription("Catching bonus compared to vanilla empty reel. 0 gives no bonus in any case", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), new object[1] { val })); bonusPerFishLevel = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Bonus_Per_Fish_Level", 0.5f, new ConfigDescription("Exp bonus multiplier given for fish level. 0 for no bonus. With 1.0 a 5 star fish will give +500% exp", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Simple_Fishing_Bait_bonus", 0f, new ConfigDescription("Bonus exp multiplier for using the default bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitForestBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Mossy_Fishing_Bait_bonus", 0.25f, new ConfigDescription("Bonus exp multiplier for using black forrest bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitSwampBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Sticky_Fishing_Bait_bonus", 0.4f, new ConfigDescription("Bonus exp multiplier for using swamp bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitCaveBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Cold_Fishing_Bait_bonus", 0.8f, new ConfigDescription("Bonus exp multiplier for using cave bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitPlainsBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Stingy_Fishing_Bait_bonus", 0.5f, new ConfigDescription("Bonus exp multiplier for using plains bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitOceanBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Heavy_Fishing_Bait_bonus", 1.2f, new ConfigDescription("Bonus exp multiplier for using ocean bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitMistlandsBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Misty_Fishing_Bait_bonus", 0.75f, new ConfigDescription("Bonus exp multiplier for using mistlands bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitAshlandsBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Hot_Fishing_Bait_bonus", 1f, new ConfigDescription("Bonus exp multiplier for using ashlands bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBaitDeepNorthBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Fish type bonus", "Frosty_Fishing_Bait_bonus", 1.3f, new ConfigDescription("Bonus exp multiplier for using deep north bait. 0 for no additional bonus.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), new object[1] { val })); fishingBoosterStartLevel = ((BaseUnityPlugin)this).Config.Bind<int>("Fish Level Booster", "Boosting_Starting_Level", 20, new ConfigDescription("At what level you can increase the level of fish by hooking them", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { val })); fishingBoosterMaxChance = ((BaseUnityPlugin)this).Config.Bind<float>("Fish Level Booster", "Max_Boosting_Chance", 1f, new ConfigDescription("What is the max chance? You chances increase linearly as you level until max. 0 to turn off", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[1] { val })); baitBonusExpMap.Add("FishingBait", fishingBaitBonus.Value); baitBonusExpMap.Add("FishingBaitForest", fishingBaitForestBonus.Value); baitBonusExpMap.Add("FishingBaitSwamp", fishingBaitSwampBonus.Value); baitBonusExpMap.Add("FishingBaitCave", fishingBaitCaveBonus.Value); baitBonusExpMap.Add("FishingBaitPlains", fishingBaitPlainsBonus.Value); baitBonusExpMap.Add("FishingBaitOcean", fishingBaitOceanBonus.Value); baitBonusExpMap.Add("FishingBaitMistlands", fishingBaitMistlandsBonus.Value); baitBonusExpMap.Add("FishingBaitAshlands", fishingBaitAshlandsBonus.Value); baitBonusExpMap.Add("FishingBaitDeepNorth", fishingBaitDeepNorthBonus.Value); SetupWatcher(); foreach (KeyValuePair<string, float> item in baitBonusExpMap) { logger.LogDebug((object)$"Added <key:{item.Key},value:{item.Value} in baitBonusExpMap"); } harmony.PatchAll(); } private void OnDestroy() { harmony.UnpatchSelf(); } private void SetupWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName); fileSystemWatcher.Changed += ReadConfigValues; fileSystemWatcher.Created += ReadConfigValues; fileSystemWatcher.Renamed += ReadConfigValues; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; } private void ReadConfigValues(object sender, FileSystemEventArgs e) { if (!File.Exists(ConfigFileFullPath)) { return; } try { logger.LogDebug((object)"Attempting to reload configuration..."); ((BaseUnityPlugin)this).Config.Reload(); } catch { logger.LogError((object)("There was an issue loading " + ConfigFileName)); } } private static float getExpGainOnCatch(float quality, string baitPrefabName) { float value = stepsForCatch.Value; value *= 1f + bonusPerFishLevel.Value * (quality - 1f); if (baitBonusExpMap.TryGetValue(baitPrefabName, out var value2)) { value *= value2 + 1f; logger.LogMessage((object)$"Skill raised by {value}"); return value; } logger.LogError((object)"Key wasn't found in bait bonus map."); return value; } static BetterFishing() { string text = configFilePath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = text + directorySeparatorChar + ConfigFileName; maxFishLevel = 5; minFishLevel = 1; logger = Logger.CreateLogSource("BetterFishing"); baitBonusExpMap = new Dictionary<string, float>(); } }