鱼类调整

鱼类调整

一些可配置的鱼类调整,比如可见的鱼类精灵。

杂项

描述: 我逐渐意识到,我喜欢采矿和耕种,因为我可以选择我开采或种植的内容。 我不讨厌这个小游戏,但既然游戏把鱼生成为实体... 你基本上从1-5个"未知"中挑选,等待它们被下一批随机生成的"未知"所取代出现... 结果却发现,在赛季结束前,没有一个是你缺少的那个特定物品... 所以现在你可以在决定捕捉它们之前选择查看那些"未知"是什么,以及其他可配置的调整(F1): 精灵设置: 0: 永远不要使用修改过的精灵图。 1: 在获得'锐利目光'技能前不要使用修改过的精灵。之后显示暗色修改精灵。 2: 在获得'锐利之眼'技能前显示暗色修改精灵。之后显示修改精灵。 3: 始终显示深色修改精灵。 4: 总是显示模组精灵。 应用光泽: 应用来自"锐利目光"技能的"稀有度闪光"。如果启用了非暗色鱼精灵,这可能毫无意义。 这种光泽也得到了改进,能够在水面上正确绘制,并反映出稀有度配色方案(而不是出现故障且为单一颜色)。 几率: 根据你的钓鱼等级,会应用一个小的鱼类生成加成。 根据使用的鱼饵,会小幅增加鱼群生成数量。 应用于整体鱼类生成几率的倍数。 这是我为了自己的游戏进程快速拼凑出来的,我不太可能进一步开发/维护它。 安装: 下载并安装最新版本的BepInEx。从文件部分下载此模组,并将模组的.dll文件解压到你的BepInEx\plugins文件夹中。 兼容性: 应与大多数钓鱼模组兼容。除非它们修改了相同的地方,在这种情况下,关闭某些功能可能会有所帮助。 来源: 剧透: 显示 using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using DG.Tweening; using HarmonyLib; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using UnityEngine; using Wish; [BepInPlugin(MOD_GUID, MOD_NAME, MOD_VER)] public class GenericPortraitsPlugin : BaseUnityPlugin {     private const string MOD_GUID = "barteke22.sunhaven.fish_tweaks";     private const string MOD_VER = "1.0.2";     private const string MOD_NAME = "Fish Tweaks";     private Harmony _harmony = new Harmony("barteke22.sunhaven.fish_tweaks");     public static ManualLogSource logger;     private static ConfigEntry<bool> conf_visual_override;     private static ConfigEntry<SpriteMode> conf_visual_applySprite;     private static ConfigEntry<bool> conf_visual_applyShine;     private static ConfigEntry<bool> conf_visual_keepUncaughtDark;     private static ConfigEntry<bool> conf_chance_levelScale;     private static ConfigEntry<bool> conf_chance_baitBonus;     private static ConfigEntry<float> conf_chance_mult;     private static Dictionary<MeshGenerator, FishEntry> _meshToFishDict = new Dictionary<MeshGenerator, FishEntry>();     private void Awake()     {         logger = Logger;         try         { Config.Bind("Info", "Info", "<-- 悬停查看信息。", "大多数设置仅在您更换位置后才会生效。禁用'几率'下的所有选项将禁用任何对FishSpawnManager Initialize()和SpawnRoutine()代码的前缀。");             conf_visual_override = Config.Bind("视觉", "覆盖咬钩", true, "为BiteRoutine添加前缀,将咬钩动画应用于鱼精灵。建议保持启用,除非您有其他修改BiteRoutine的钓鱼模组。");             conf_visual_applySprite = Config.Bind("视觉", "应用精灵", SpriteMode.Dark_KeenEye_Light, "0: 永远不使用修改后的精灵。" + Environment.NewLine                 + "1: 在获得'锐利目光'技能前不要使用修改后的精灵。之后显示暗色修改精灵。" + Environment.NewLine                 + "2: 在'锐利之眼'技能前显示暗色修改精灵。之后显示修改精灵。" + Environment.NewLine                 + "3: 始终显示暗色修改精灵。" + Environment.NewLine                 + "4: 始终显示模组精灵。");             conf_visual_applyShine = Config.Bind("视觉", "应用闪光", true, "应用'锐利目光'技能中的'稀有度闪光'。如果你启用了非暗色鱼类精灵,这可能毫无意义。");             conf_visual_keepUncaughtDark = Config.Bind("视觉", "保持未捕获鱼类为暗色", true, "无论是否拥有'锐利目光',都保持你从未捕获过的鱼类为暗色。");             conf_chance_levelScale = Config.Bind("Chance", "Level Bonus", true, "根据你的钓鱼等级,对鱼类生成应用小幅加成。");             conf_chance_baitBonus = Config.Bind("Chance", "Bait Bonus", true, "根据使用的鱼饵,对鱼类生成应用小幅加成。");             conf_chance_mult = Config.Bind("Chance", "Multiplier", 1f, "应用于整体鱼类生成几率的乘数。过高的乘数可能导致生成比正常情况下更多的鱼。为了平衡这一点,在某些数值下可能会增加生成延迟。");             _harmony.PatchAll(); logger.LogInfo(MOD_GUID + " v" + MOD_VER + " 已加载。");         }         catch (Exception e)         {             logger.LogError("** Awake FATAL - " + e);         }     }     public static void LogError(Exception e)     {         logger.LogError(e.Message + Environment.NewLine + e.StackTrace);     }     [HarmonyPatch(typeof(Fish), "Start")]     class HarmonyPatch_Fish_Start     {         private static bool Prefix(Fish __instance)         {             try             {                 FishData fishData = __instance.fishData;                 if (conf_visual_applyShine.Value)                 {                     if (fishData.rarity > ItemRarity.Uncommon && GameSave.Fishing.GetNode("Fishing8b"))                     {                         var particles = SingletonBehaviour<Prefabs>.Instance.fishShineParticles;                         particles.GetComponent().sortingOrder = 1000;                         var main = particles.main;                         switch (fishData.rarity)                         {                             case ItemRarity.Rare:                                 main.startColor = new Color(0f, 50f, 255f);                                 break;                             case ItemRarity.Epic: main.startColor = new Color(144f, 0f, 255f);                                 break;                             case ItemRarity.Legendary:                                 main.startColor = new Color(255f, 200f, 0f);                                 break;                         }                         Instantiate(particles, __instance.transform.position + new Vector3(0f, -1f, -1f), Quaternion.identity, __instance.transform);                     }                 }                 typeof(Fish).GetProperty("Caught").SetValue(__instance, false);                 if (conf_visual_applySprite.Value != 0 && (conf_visual_applySprite.Value > SpriteMode.Disabled_KeenEye_Dark || GameSave.Fishing.GetNode("Fishing8b")))//将鱼视觉预制体附加到原始鱼精灵上方                 {                     var offsetBugFix = "ElvenForest2".Equals(ScenePortalManager.ActiveSceneName, StringComparison.Ordinal) ? -1.2f : 0.1f;//修复隐形鱼的bug(原版问题)                     var obj = Instantiate(fishData.fishVisualPrefab, __instance.transform.position + new Vector3(0f, 0f, offsetBugFix), Quaternion.identity, __instance.transform);                     var meshGen = obj.GetComponentInChildren<MeshGenerator>();                     meshGen.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);                     meshGen.GetComponent().material.color = new Color(0f, 0f, 0f, 0.65f);                     _meshToFishDict[meshGen] = new FishEntry() { fish = __instance, oldDirection = __instance.FacingDirection };                     __instance.Graphics.position = new Vector3(0f, 0f, -99999f);//将原始精灵的图形向下移动                 } #if DEBUG logger.LogWarning(fishData.Name + " (" + fishData.rarity + ") 在 " + ScenePortalManager.ActiveSceneName); #endif                 return false;             }             catch (Exception e)             {                 LogError(e);             }             return true;         }     }     [HarmonyPatch(typeof(FishSpawnManager), "Initialize")]     class HarmonyPatch_FishSpawnManager_Initialize     {         private static bool Prefix(FishSpawnManager __instance)         {             try             {                 if (conf_chance_levelScale.Value || conf_chance_baitBonus.Value || conf_chance_mult.Value != 1f)                 {                     var _spawnRoutine = typeof(FishSpawnManager).GetField("_spawnRoutine", BindingFlags.NonPublic | BindingFlags.Instance);                     var _fishSpawners = typeof(FishSpawnManager).GetField("_fishSpawners", BindingFlags.NonPublic | BindingFlags.Instance);                     var currentFishDictionary = (Dictionary<int, Fish>)typeof(FishSpawnManager).GetField("currentFishDictionary", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(__instance);                     if (_spawnRoutine.GetValue(__instance) is Coroutine r)                     {                         __instance.StopCoroutine(r);                     }                     _fishSpawners.SetValue(__instance, UnityEngine.Object.FindObjectsOfType());                     var _fishSpawnersVal = (FishSpawner[])_fishSpawners.GetValue(__instance);                     for (int i = 0; i < _fishSpawnersVal.Length; i++)                     {                         FishSpawner fishSpawner = _fishSpawnersVal[i];                         fishSpawner.ID = (ushort)(i + ScenePortalManager.ActiveSceneIndex * 100);                         if (currentFishDictionary.TryGetValue(fishSpawner.ID, out var value))                         {                             fishSpawner.CurrentFish = value;                         }                     }                     _spawnRoutine.SetValue(__instance, __instance.StartCoroutine(FishSpawnManager_SpawnRoutine.SpawnRoutine(__instance)));                     return false;                 }             }             catch (Exception e)             {                 LogError(e);             }             return true;         }     }     [HarmonyPatch(typeof(MeshGenerator), "ChangeSprite")]     class HarmonyPatch_MeshGenerator_ChangeSprite     {         private static void Postfix(MeshGenerator __instance)         {             try             {                 if (_meshToFishDict.TryGetValue(__instance, out var fishEntry))                 {                     var curDir = fishEntry.fish.FacingDirection;                     var oldDir = fishEntry.oldDirection;                     fishEntry.oldDirection = curDir;                     if (curDir < Direction.East)                     {                         if (curDir != oldDir) __instance.flip = UnityEngine.Random.Range(0, 2) == 1;                         if ((__instance.flip && curDir == Direction.North) || (!__instance.flip && curDir == Direction.South))                         {                             __instance.transform.eulerAngles = new Vector3(-5f, -80f, -60f);                         }                         else __instance.transform.eulerAngles = new Vector3(-5f, 80f, 60f);                     }                     else                     {                         //if ((__instance.flip && curDir == Direction.West) || (!__instance.flip && curDir == Direction.East))                         //{                         __instance.flip = curDir == Direction.West;                         __instance.transform.eulerAngles = Vector3.zero;//由于视角是半俯视的,倒置看起来效果不佳                         //}                         //否则 __instance.transform.eulerAngles = new Vector3(-90, 0, 180);                     }                     if (conf_visual_applySprite.Value == SpriteMode.Disabled_KeenEye_Dark                         || conf_visual_applySprite.Value == SpriteMode.Always_Dark                         || (conf_visual_applySprite.Value == SpriteMode.Dark_KeenEye_Light && !GameSave.Fishing.GetNode("Fishing8b"))                         || (conf_visual_keepUncaughtDark.Value && !GameSave.CurrentCharacter.Encylopdeia.ContainsKey((short)fishEntry.fish.fishData.id)))                     {                         __instance.GetComponent().material.color = new Color(0f, 0f, 0f, 0.65f);                     }                 }             }             catch (Exception e)             {                 LogError(e);             }         }     }     [HarmonyPatch(typeof(MeshGenerator), "OnDestroy")]     class HarmonyPatch_MeshGenerator_OnDestroy     {         private static void Postfix(MeshGenerator __instance)         {             try             {                 _meshToFishDict.Remove(__instance);             }             catch (Exception e)             {                 LogError(e);             }         }     }     [HarmonyPatch(typeof(Fish), "BiteRoutine")]     class HarmonyPatch_Fish_BiteRoutine     {         private static