
鱼类调整
一些可配置的鱼类调整,比如可见的鱼类精灵。
查看大图描述: 我逐渐意识到,我喜欢采矿和耕种,因为我可以选择我开采或种植的内容。 我不讨厌这个小游戏,但既然游戏把鱼生成为实体... 你基本上从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



还没有人评论,去客户端里说两句吧。
评论在新手盒子客户端中发表,这里同步展示。