超重且被锁定时恢复耐力

创作者: aiTookMyJob
已更新:2024-02-24 21:43:01
3KB

关于此 MOD

战利品堆积如山,压得你喘不过气?再也不用担心战斗中体力耗尽!
这个模组的诞生是因为另一个模组让我可以在超重状态下走动,但一旦敌人攻击我就完蛋了。这个模组就是为了解决这个问题,让你即使被背包里的物品压得喘不过气也能战斗,但战斗结束后还是得慢慢走回家。

使用BepInEx;
使用BepInEx.Configuration;
使用HarmonyLib;
使用UnityEngine;
使用 System.Linq;
使用 System.Collections.Generic;

超重且被锁定时恢复耐力
{
    [BepInPlugin("innocreator.regenstamina", "超重且被瞄准时恢复耐力", "3.0")]
    [BepInProcess("valheim.exe")]
    超重且被瞄准时恢复体力
    {
       
        public static ConfigEntry<int> nexusID;
        public static ConfigEntry<bool> showDebugMessages;
        public static ConfigEntry<float> playerCarryWeight;
        public static ConfigEntry<float> targetScanRange;

        // 用于修补方法的 Harmony 实例
        private readonly Harmony harmony = new Harmony("innocreator.regenstamina");

        唤醒
        {
            // 绑定配置项
            nexusID = Config.Bind<int>("General", "nexusID", 2703, "用于追踪更新的Nexus ID。");
            showDebugMessages = Config.Bind<bool>("General", "showDebugMessages", false, "显示脚本调试消息。");
            playerCarryWeight = Config.Bind<float>("Options", "playerCarryWeight", 300f, "玩家基础负重。");
            targetScanRange = Config.Bind<float>("Options", "targetScanRange", 30f, "目标扫描范围。");

            // 修补此程序集中所有标记了 Harmony 特性的方法
            harmony.PatchAll();
        }

        // HarmonyPatch 特性指定对 Player 类的 OnTargeted 方法的补丁
        [HarmonyPatch(typeof(Player), nameof(Player.OnTargeted))]
        超重且被指定目标时恢复耐力_被指定目标时
        {
            // 前缀方法在原方法执行之前被调用
            static void Prefix()
            {
                // 获取游戏中的所有玩家列表
                List<Player> _playersList = Player.GetAllPlayers();
                // 选择列表中的第一个玩家
                _playerOneList = _playersList[0];
                // 根据玩家 ID 获取玩家引用
                玩家 _playerOneReference = Player.GetPlayer(_playerOneList.GetPlayerID());
                // 检查玩家引用是否存在
                如果(!_playerOneReference)
                    返回;
                // 获取游戏中所有符合特定条件的潜在目标列表
                var potentialTargets = Character.GetAllCharacters().Where(target =>
                    !target.IsDead() &&
                    !target.IsTamed() &&
                    !target.IsPlayer() &&
                    (int)target.GetFaction() != 0 &&
                    Vector3.Distance(_playerOneReference.GetCenterPoint(), target.GetCenterPoint()) > 0 &&
                    Vector3.Distance(_playerOneReference.GetCenterPoint(), target.GetCenterPoint()) < targetScanRange.Value);

                // 如果玩家被锁定且负重过度,则增加其最大负重
                如果(潜在目标数量大于0且玩家一引用被选中且玩家一引用处于负重状态)
                {
                    如果(showDebugMessages.Value)
                        Debug.Log($"innoCreator 已锁定目标: {_playerOneReference.IsTargeted()}, 名称: {potentialTargets.FirstOrDefault().name}, 距离: {Vector3.Distance(_playerOneReference.GetCenterPoint(), potentialTargets.FirstOrDefault().GetCenterPoint())}, 数量: {potentialTargets.Count()}");
                    _playerOneReference.m_maxCarryWeight = 9999;
                    返回;
                }
                // 如果玩家的最大负重尚未设置为增加后的值,则返回
                若(_playerOneReference.m_maxCarryWeight 不等于 9999)
                    返回;
                // 如果玩家未被选为目标或没有潜在目标,则将最大负重设置为默认值
                如果 (!_playerOneReference.IsTargeted() || potentialTargets.Count() < 1)
                {
                    如果启用了调试信息
                        Debug.Log("innoCreator OnTargeted 重置权重");
                    _playerOneReference.m_maxCarryWeight = playerCarryWeight.Value;
                    返回;
                }
            }
        }

        // HarmonyPatch 特性指定了对 Player 类的 UseStamina 方法的补丁
        [和谐补丁(typeof(玩家), nameof(玩家.使用耐力))]
        超重且被瞄准时恢复体力的_消耗体力
        {
            // 前缀方法在原方法执行前调用
            static void Prefix()
            {
                // 获取游戏中的所有玩家列表
                List<Player> _playersList = Player.GetAllPlayers();
                // 选择列表中的第一个玩家
                玩家 _playerOneList = _playersList[0];
                // 根据玩家ID获取玩家引用
                玩家 _playerOneReference = Player.GetPlayer(_playerOneList.GetPlayerID());
                // 检查玩家引用是否存在
                如果(!_playerOneReference)
                    返回;

                // 如果玩家的最大负重尚未设置为增加后的数值,则返回
                if (_playerOneReference.m_maxCarryWeight != 9999)
                    返回;
                // 如果玩家未被选中,将最大负重设置为配置值
                if (!_playerOneReference.IsTargeted())
                {
                    如果(显示调试信息.值)
                        Debug.Log("innoCreator UseStamina 1 Reset Weight");
                    _playerOneReference.m_maxCarryWeight = playerCarryWeight.Value;
                    返回;
                }

                // 获取游戏中所有符合特定条件的潜在目标列表
                var potentialTargets = Character.GetAllCharacters().Where(target =>
                    !target.IsDead() &&
                    !target.IsTamed() &&
                    !target.IsPlayer() &&
                    (int)target.GetFaction() != 0 &&
                    Vector3.Distance(_playerOneReference.GetCenterPoint(), target.GetCenterPoint()) > 0 &&
                    Vector3.Distance(_playerOneReference.GetCenterPoint(), target.GetCenterPoint()) < targetScanRange.Value);

                如果目标不存在,将最大负重设置为配置值
                如果(潜在目标.数量() < 1)
                {
                    如果(showDebugMessages.Value)
                        Debug.Log("innoCreator UseStamina 2 重置权重");
                    _playerOneReference.m_maxCarryWeight = playerCarryWeight.Value;
                    返回;
                }
            }
        }
    }
}

Valheim: 英灵神殿 的热门 MOD

探索适用于 Valheim: 英灵神殿 的最佳MOD,带来新功能、升级画面,以及令人兴奋的方式来改变您的游戏体验。

使用 Xmod 解锁 Valheim: 英灵神殿 的全部潜力 — 今天就探索这些顶级 MOD!