维尔海姆武器类别

创作者: BunzBoiModding
已更新:2026-09-02 04:15:17
518KB

前置 MOD

使用 维尔海姆武器类别 时将自动安装

关于此 MOD

添加一个可制作的职业方尖碑,让玩家从10种战斗职业中选择,每种职业通过战斗经验升级,每10级解锁被动技能。

瓦尔海姆职业方尖碑 - 开发者自述文件

1. 概述

方尖碑职业是瓦尔海姆的一个模组(BepInEx插件,基于 约顿巨人 模组库),添加了一个可制作的“职业方尖碑”。玩家与方尖碑互动后可从10个战斗职业中进行选择:

剑术大师, 弓箭手, 粉碎者, 刺客, 斗士, 法师, 枪兵, 壁垒, 刽子手, 术士

每个职业使用对应武器类型时会造成额外伤害,并通过战斗获得经验值。职业等级从1级到50级,每10级解锁一个被动技能(10级/20级/30级/40级/50级)。

插件标识(BepInEx):

领域 数值
全局唯一标识符 com.bunzboi.valheimweaponclass
名称 维京英灵殿武器类别
版本 1.1.0

2. 需求 / 依赖

  • .NET Framework 4.7.2
  • BepInEx + 0Harmony(引用自本地 Steam 瓦尔海姆安装目录)
  • 巨人(声明为硬依赖,通过 [BepInDependency(Jotunn.Main.ModGuid)])— 用于预制体克隆、部件/建造系统以及所有自定义GUI(职业选择窗口)

这 项目文件 通过指向本地Steam安装目录的HintPaths引用游戏/BepInEx/Jotunn DLL(程序文件 (x86)\Steam\steamapps\common\Valheim\...)。如果你在新机器上进行设置,而构建时无法找到引用,请更新这些 HintPaths(或你的 Steam 安装路径)。

A Newtonsoft.Json.dll 被收录在 库/ 但是 不 当前未用于任何用途——所有存档数据都通过 Unity 自有的 Json工具 改为。

3. 项目布局

ClassObeliskMod.cs 插件入口点(BaseUnityPlugin)。创建方尖碑部件,并包含整个职业选择 GUI(使用 Jotunn 的 GUIManager 构建)。Utilities/ PlayerClass.cs PlayerClass 枚举 + PlayerClassHelper(显示名称、内部名称、武器类型查找)。PlayerClassManager.cs 每名玩家的职业数据(PlayerClassData)和静态注册表(PlayerClassManager)。还包含保存/加载的 Harmony 补丁。ClassCombatManager.cs 武器类型检测(这是剑吗?弓吗?等等)和职业伤害倍率。ClassDamageBonusSystem.cs 通用的每级伤害加成(与 ClassCombatManager 分离——见第 5 节)。XPSystemManager.cs 经验值授予、升级曲线,以及挂钩战斗事件以获取经验值的 Harmony 补丁。AnimationSpeedManager.cs 可复用的可叠加倍率工具,用于攻击/动画速度(供某些 perk 使用)。SEUtils.cs 用于检查原版 StatusEffects 的辅助工具(中毒/燃烧/寒霜层数、计时器等)PerkManagers/ 每个职业一个文件,各自实现该职业的 10/20/30/40/50 级被动 perk(SwordMasterPerkManager.cs、ArcherPerkManager.cs、CrusherPerkManager.cs、AssassinPerkManager.cs、BrawlerPerkManager.cs、WizardPerkManager.cs、LancerPerkManager.cs、BulwarkPerkManager.cs)。这里就是你添加或调整特定职业能力的地方。TestingResources/ 仅调试用的控制台命令(API 发现、弓测试、通用调试工具)。不属于预期的正式功能集。Resources/Icons/ 某些 perk 状态效果使用的嵌入式 .rgba 图标资源。Libs/ 内置的第三方 DLL(Newtonsoft.Json、AnimationSpeedManager)。

4. 职业选择机制

  1. 玩家使用锤子制作职业方尖碑。它是通过克隆原版 工作台 预制件并剥离其 制作站 组件,所以它纯粹是一个可交互物件,而非制作站(见 添加职业方尖碑 / 创建职业方尖碑预制体)。

  2. 与其互动(E)会召唤 方尖碑互动.交互,这会打开一个完全用Jotunn构建的职业选择窗口 界面管理器 (无 Unity 预制体/资源 UI)- 一个职业按钮网格,一个由硬编码填充的描述面板 职业描述 字典输入 方尖碑职业模组.cs,以及一个“选择职业”按钮。

  3. 点击“选择职业”会调用:

    玩家职业管理器.设置玩家激活职业(玩家, 职业名)
    

    解析该类并调用 设置激活职业, 替换 任何当前激活的类别——默认情况下,同一时间只能激活一个类别。

注意: 无法选择第二职业 当任意职业达到50级时返回true,暗示此时设计上意图开启第二个同时激活的职业。选择界面目前始终调用单职业的“替换”路径,而非“添加第二职业”路径,因此双职业看起来是一个已规划但尚未完全接通的功能。

5. 职业设置的所在位置

类定义没有外部数据文件(没有JSON/YAML)——所有内容都硬编码在C#中:

  • 工具类/玩家职业.cs — 这个 玩家职业 枚举(8个职业)加上 职业助手,它将每个职业映射到一个显示名称、一个内部/存档名称以及一个武器类型描述。
  • 方尖碑职业模组.cs (职业描述 字典) ——各职业特长风味文本描述,显示于选择界面。仅为展示文本,非机制内容。
  • 工具类/战斗管理器.cs — 武器类型检测(是否是剑类武器, 弓类武器, 钝器, 是否刀具武器, 是否为长矛武器, 徒手攻击, 魔法武器 - 主要是武器名称的字符串匹配)加上 获取职业伤害倍率既用于判定是否可获得经验值,也用于施加战斗伤害加成。
  • 工具/职业伤害加成系统.cs 一种与等级挂钩的通用伤害加成(每级0.5%,50级时上限25%),当装备的武器与当前职业的武器类型匹配时生效。

    注意: 这似乎与以下位置中的乘数逻辑重叠: 战斗管理器 - 两个补丁 伤害如果你要改动伤害计算,这一点值得统一处理,以免加成意外叠加。

  • PerkManagers/*.cs ——每个职业10/20/30/40/50级特长(增益、状态效果、耐力消耗减免、硬直等)的实际机制实现。这是添加新特长或重新平衡现有特长的主要位置。
  • 配置 — 仅存在一个BepInEx配置值: 启用模组 (布尔值,默认 真),束缚于 方尖碑职业模组.Awake()所有其他平衡数值(每级伤害加成、经验值比率、特长阈值/持续时间)都是普通的C#常量,散落在 文件伤害加成系统, XPSystemManager.cs,以及各个技能管理器——除了通过代码修改外,没有任何配置文件可以调整它们(少数几个值可以在运行时通过 比率 调试命令,不会持久化)。

6. 玩家数据与持久化

  • 玩家职业数据 (工具/玩家职业管理器.cs) 是每个玩家的状态容器:职业等级、各职业经验值、当前激活的职业,以及各职业的“已解锁”标记。

    注意: 已解锁职业 目前每次初始化时所有职业都处于解锁状态(“测试用全部解锁”)——解锁限制实际上尚未生效。

  • 职业管理器 持有一个静态内存字典, 字典<长整数, 玩家职业数据>,以玩家ID为键。此项通过以下方式延迟填充: 获取玩家数据(player).

  • 持久化依赖于原版角色存档,而非独立文件或世界存档:

    • 玩家_保存_补丁 (后缀开启 玩家.存档)序列化 玩家职业数据 使用Unity的 JsonUtility 并将其追加到角色的 包.
    • 玩家_加载_补丁 (后缀开启 玩家.加载读取尾部数据(并对旧版或未安装模组的角色文件安全地执行空操作)。

    实际效果:职业进度随玩家角色存档一起保存,不受其加入的世界/服务器影响。

多人游戏注意事项: 模组中没有任何自定义RPC/ZDO同步代码。职业/等级/经验值状态仅存在于计算它的那台机器(客户端或专用服务器)的本地内存中,不会在对等端之间广播。在有多名玩家同时在线的专用服务器上,这是一个很可能存在的漏洞,在实际多人游戏会话中依赖它之前值得测试和加固。

7. 经验与升级

核心逻辑: 功能模块/XPSystemManager.cs (职业经验管理器)

  • 击杀奖励经验值 ——唯一的经验来源。多个职业对同一生物造成的伤害会被追踪(伤害本身不奖励经验);该生物死亡时,会生成一个额外经验池(生物最大生命值× 击杀奖励倍率) 被分摊到造成伤害的各个职业上。
  • 这些通过Harmony挂钩在 伤害 (帖子,仅用于追踪)以及 角色.死亡时 (追踪补丁经验值)。
  • 升级曲线 — 经验值需求 是用于1-50级的硬编码累计经验值表(一条注释指出它最初源自一个 经验值_升级.json 仓库中已不再存在的参考文件——这些值现已直接内联在代码中)。 XPCurveHelper 暴露每级所需经验值、累计经验值、根据经验值获取当前等级以及进度(用于UI进度条)的查询接口。
  • 最高等级为50级。每提升10级(10/20/30/40/50)解锁一个被动技能(已在对应的 PerkManagers/*.cs 达到50级后,任何职业也会解锁第二个主动职业槽位(见第4节)。

8. 和谐补丁一览

所有补丁均通过一次调用被发现并应用 方尖碑职业模组.Awake(): new Harmony(PluginGUID).PatchAll().

文件 目标 目的
方尖碑职业模组.cs 终端.初始化终端 注册模组控制台命令
工具/玩家职业管理器.cs 玩家.保存 / 玩家.加载 持久化/恢复 玩家职业数据
终端.初始化终端 重置职业 调试命令
工具/经验值系统管理器.cs 伤害 (帖子) 按职业追踪伤害贡献以分配击杀奖励
角色.死亡时 触发击杀奖励经验分配
终端.初始化终端 测试经验值/税率/经验曲线 指令
工具/战斗职业管理器.cs 伤害, 弹体.*, 游戏更新, 终端.初始化终端 职业伤害倍率、武器类型检测、杂项记录/调试
工具类/职业伤害加成系统.cs 伤害, 终端.初始化终端 每级通用伤害加成 + 调试命令
实用工具/动画速度管理器.cs 角色动画事件.自定义固定更新, 角色.更新 攻击/动画速度倍率叠加工具,供若干技能使用
PerkManagers/*.cs 角色.伤害, 玩家/人形战斗与装备钩子, 玩家.已生成, 游戏.更新 各职业10-50级技能效果(见第5节)
测试资源/*.cs 终端。初始化终端 调试/API发现控制台命令

9. 调试 / 测试命令

所有这些都通过以下方式注册 终端.控制台命令 和谐后缀开启时 终端.初始化终端,所以只要模组已加载,它们随时都可以在游戏控制台(反引号键 / F5,具体取决于你的英灵神殿控制台按键绑定)中使用——没有单独的“调试版本”标志。它们纯粹是为了开发而存在,并且 不 意在作为生产功能。

9.1 职业进度与经验(工具类/玩家职业管理器.cs, 工具/经验系统管理器.cs)

命令 用法 它的作用
重置职业 重置职业 将你当前激活的职业等级和经验重置为0。适合从头重新测试升级和技能解锁。
测试经验值 测试经验值 [amount] 给予经验值(若省略则默认100)给 每个 当前激活的职业,无需战斗即可。打印旧等级/经验值 -> 新等级/经验值,并标记升级。
倍率 兑换率
击杀倍率
无参数时,打印当前 击杀奖励倍率. 带参数时,在当前会话中实时覆盖(例如 兑换率 1.5)。 未持久化 - 重启时重置为编码默认值。
经验值曲线 经验曲线 <level> (1-50) 打印达到以下等级所需的经验值 <关卡>、累计经验值总数,以及下一级所需经验——方便核对 经验值需求/曲线助手 无需游玩即可变更。

9.2 战斗与伤害加成(实用工具/职业战斗管理器.cs, 工具/职业伤害加成系统.cs)

命令 用途 作用
武器类型 武器类型 显示你当前装备的武器被归类为(剑/弓/钝器/匕首/长矛/徒手/魔法),依据是 战斗管理器的姓名匹配逻辑。
职业等级 职业等级 列出你的所有职业等级及其各自的伤害加成,以及你当前装备的武器。
伤害率 伤害倍率
每级伤害加成 <bonus_per_level> [最大加成]
显示或覆盖 职业伤害加成管理器每级加成与上限(数值为百分比,例如 伤害率 1.0 30 每级提升1%,上限30%)。不持久保存。
模拟伤害 模拟伤害 <职业> <等级> 打印伤害倍率以及针对假设职业/等级的完整计算示例(100伤害 -> X),无需该等级的实际角色。带有空格的职业名称需加引号,例如 模拟伤害 “剑术大师” 25.
测试伤害 测试伤害 显示当前应用于你装备武器的伤害加成/倍率。

注意: 测试伤害 已注册 两次 - 一旦进入 战斗调试命令 (战斗管理器.cs)以及一次在 伤害加成指令 (类伤害加成系统.cs),输出略有不同。因为两个补丁类都运行它们的 初始化终端 后缀,运行时实际上只有一个注册会胜出(无论哪个 终端.控制台命令 最后才为那个名称添加的)。如果你在调试伤害计算时发现输出结果错误或过时,很可能就是这个命名冲突导致的——在依赖它之前,值得先重命名其中一个。

9.3 弓拉弦时长测试(测试资源/弓箭测试命令.cs)

命令 用法 它的作用
查看绘画 查看抽奖 记录当前所装备弓的详细抽弓机制反射信息(需要装备弓)。
测试绘制时长 测试绘制持续时间 <multiplier> 使已装备的弓的 最短绘制时长 直播(例如 0.5 速度加倍, 1.5 = 50% 减速)。仅对当前会话/武器实例有效。
重置抽牌 重置抽牌 将抽牌时长倍率重置为1.0(正常)。
绘制信息 绘制信息 显示当前抽卡时长倍率以及测试是否处于激活状态。

有一个几乎重复但更简单的乘数命令版本—— 测试绘制时长 <multiplier> - 在 ApiDiscoveryCommands.cs (第9.4节);两者不共享状态,因此不要在同一测试会话中混用它们。

9.4 API/反射发现(测试资源/Api发现命令.cs)

这些内容用于探索英灵神殿的内部机制(找到正确的字段/方法进行Harmony补丁),无需手动反编译。运行 API帮助 在游戏中查看实时摘要。

指令 用法 功能说明
方法列表 列出方法 <className> [filter] 列出某个类型上的最多 25 个方法,可选择按名称子字符串筛选。接受以下快捷方式: 玩家, 技能, 角色, 类人, 物品掉落, 碎片, 攻击. 例如: 列出方法 角色攻击.
字段列表 list_fields <className> [filter] 和……思路相同 方法列表 但对于字段。示例: 物品掉落共享列表字段.
技能列表 技能列表 尝试反射到本地玩家的技能对象并报告其类型——这是一个起点 方法列表/字段列表 探索,并非全盘技能倾泻。
检查对象 检查对象 <target> 导出已知目标的当前字段值: 玩家, 武器, 技能,或 角色.
类型查找 查找类型 <pattern> 在所有已加载的程序集中搜索包含以下内容的类型名称 <图案> (不区分大小写),最多显示20个包含完整命名空间的匹配项。
测试抽取时长 测试抽取时长 <multiplier> 直接将所装备弓的拉弓时间乘以一个系数,用于快速一次性测试(见9.3中的注释)。
查看弓属性 弓属性 显示已装备弓的拉弓时间、速度系数、装填时间和耐力消耗。
接口帮助 接口帮助 打印此命令组的游戏内速查表。

9.5 将常规反射信息转储到文件(测试资源/英灵神殿调试工具.cs)

与上述命令(输出到游戏内控制台)不同,这些命令会将结果写入文本文件,以便你在游戏外查看大量转储数据——请查看 BepInEx 打印的日志/调试输出路径下的内容 调试路径.

指令 用途 它的作用
列出方法 listmethods <classname> 将类型上的每个公共/私有/实例/静态方法写入到 DebugLogs/methods_<classname>.txt,包括兼容 Harmony 的参数类型列表。
查找方法 查找方法 <classname> <keyword> 同 列出方法 但筛选出的方法名称中包含 <关键词>;写入到 DebugLogs/findmethod_<classname>_<keyword>.txt.
方法签名 方法签名 <classname> <methodname> 为每个重载写入完整签名,针对一个方法名,外加可直接粘贴的内容 [和谐补丁(...)] 属性和前缀方法占位符,到 调试日志/methodsig_<类名>_<方法名>.txt在编写新的Harmony补丁时非常有用。
调试路径 调试路径 打印这些转储文件写入的目录(以及该目录当前是否存在)。

9.6 其他/健全性检查(奥碑职业模组.cs)

命令 用途 它的作用
方尖碑测试 方尖碑测试 输出一条静态的“mod运行正常”消息——用于快速验证插件已加载且Harmony补丁已应用。
调试碎片 调试碎片 将可锤子建造的完整部件列表写入 锤子碎片.txt 在BepInEx根目录中,标记任何名称包含“Obelisk”或“Class”的文件——这有助于确认自定义部件是否已成功注册。

10. 入门(构建模组)

  1. 打开 瓦尔海姆职业方尖碑.sln 在Visual Studio(或你首选的支持.NET Framework的IDE)中。
  2. 确认提示路径 ValheimClassObelisk.csproj 匹配你本地的 Steam 英灵神殿安装(BepInEx 核心、Jotunn 插件文件夹以及游戏的管理程序集)。如果你的安装路径不同,请更新它们。
  3. 确保你的本地英灵神殿中已安装 Jotunn BepInEx/plugins 文件夹——它是运行时依赖,而不仅仅是编译时引用。
  4. 构建(调试或发布)。
  5. 复制生成的 瓦尔海姆职业方尖碑.dll (以及以下任何内容 库/ 需要的话)放入你的英灵神殿中 BepInEx/plugins 用于游戏内测试的文件夹。

Valheim: 英灵神殿 的热门 MOD

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

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