
大猩猩解体
从你的物品栏中分解物品。
查看大图为 Valheim 添加一个 Deconstruct(分解) 标签页,就位于每个制作台的 Craft 和 Upgrade 旁边。
制作了一顶不再想要的头盔?打开工作台,选择 Deconstruct 标签页,选中头盔并按下按钮。与制作相同的进度条会运行,头盔消失,其消耗的材料会回到你的背包,包括用于升级它的一切花费。
- 该标签页是游戏自带 Upgrade 标签页的副本,因此字体、大小和音效都是原版的。
- 列表显示你背包中当前制作台能够制作的物品,并带有它们的等级和耐久度,与 Upgrade 标签页的方式相同。
- 右侧面板准确显示你将取回什么。
- 返还率 从 50% 到 100%,默认 100%。安装了此模组的服务器会为其中所有人决定该值。
- 耐久度无关紧要,因为在 Valheim 中修理本来就是免费的。
什么可以被分解
当以下所有条件都成立时,物品会出现在列表中:
- 它有制作配方,并且该配方属于你正在使用的制作台,与 Craft 标签页遵循的规则相同。锻造物品在锻造台,工作台物品在工作台,徒手配方在制作台显示基础配方的地方;
- 该配方不是“多种原料中选一种”的配方,例如蜜酒和盛宴,因为无法确定放进去的是哪种原料;
- 它不是任务物品;
- 至少有一种材料会被返还。
当以下情况发生时,列表中的物品会变灰,并在面板中显示原因:
- 它已被装备,请先卸下;
- 如果安装了 GorilaChestMod 并且
RespectFavorites开启,它被该模组的 Alt 点击标记为收藏; - 配方一次制作一批,而你拥有的不足一整批。箭矢以 20 支为一组,因此分解需要 20 支箭,并返还一次制作的成本;
- 返还率太低,以至于每种材料都向下取整为零。
升级台以及没有制作台的地方永远不会显示该标签页。
返还多少
游戏在制作物品时收取 Requirement.GetAmount(1),将其升级到 n 级时收取 Requirement.GetAmount(n)。分解会将每个等级累加到物品自身等级,然后应用返还率,并对每种材料分别向下取整。
一件 3 级物品,其配方需要 5 个某种材料,每级额外需要 3 个,则花费了 5 + 3 + 6 = 14 个,因此在 100% 时返还 14 个,在 50% 时返还 7 个。
材料会进入你的背包。放不下的部分会掉落在你脚下,并显示通常的“背包已满”消息。
构建所针对的游戏版本
| 项目 | 值 |
|---|---|
| 游戏版本 | 1.0.12 |
| Steam 构建 | 25253764 |
| 引擎 | Unity 6000.0.75f1,Mono 后端 |
| 游戏代码 | valheim_Data/Managed/assembly_valheim.dll |
由于后端是 Mono 而不是 IL2CPP,通常的模组路径仍然适用:BepInEx 5 加 Harmony,在内存中修补。不会修改任何游戏文件。
安装
- 为 Valheim 安装 BepInEx 5,即
denikson-BepInExPack_Valheim包。启动游戏一次,以便它创建自己的文件夹。 - 将
GorilaDeconstruct.dll复制到Valheim/BepInEx/plugins/GorilaDeconstruct/,或者将-nexus.zip发行版解压到游戏文件夹中。 - 启动游戏。
BepInEx/LogOutput.log应包含一行GorilaDeconstruct 1.0.0 loaded。
使用 r2modman 或 Thunderstore Mod Manager 时,使用 Import local mod 并选择 -thunderstore.zip 发行版。不要将模组管理器与游戏根目录中的手动 BepInEx 安装混用,这是模组加载两次或完全不加载的经典原因。
多人游戏和专用服务器
分解完全发生在玩家自己的背包中,因此 该模组适用于任何服务器,包括原版服务器。每个想要该标签页的玩家都要安装它。
在服务器上也安装它是可选的,且只做一件事:服务器将其 ReturnPercent 交给每个连接的客户端,因此想要 50% 的管理员会让所有人都得到 50%。供运行服务器者参考的分步说明:docs/server-install.md。
配置
BepInEx/config/dev.trentini.goriladeconstruct.cfg 会在首次启动时写入,可在关闭游戏后编辑。
| 部分 | 选项 | 默认值 | 作用 |
|---|---|---|---|
| Deconstruct | Enabled |
true |
在制作台显示 Deconstruct 标签页。 |
| Deconstruct | ReturnPercent |
100 |
返还多少材料,50 到 100。服务器的值优先。 |
| Deconstruct | RespectFavorites |
true |
拒绝 GorilaChestMod 中标记为收藏的堆叠。 |
| Debug | Verbose |
false |
记录每次分解以及标签页的位置。 |
工作原理
制作面板已经知道如何列出你背包中的物品、显示详情面板、运行进度条并以回调结束:那就是 Upgrade 标签页。Deconstruct 标签页复用了这一切,只替换必须读取不同内容的部分。
| 游戏方法 | 补丁 | 原因 |
|---|---|---|
InventoryGui.Awake |
postfix | 将 Upgrade 标签页复制为第三个标签页 |
InventoryGui.UpdateCraftingPanel |
prefix | 仅在带有 Craft 标签页的制作台显示该标签页 |
InventoryGui.UpdateRecipeList |
prefix,替换 | 通过游戏自身的 AddRecipeToList 列出可分解物品 |
InventoryGui.UpdateRecipe |
postfix | 重写详情面板:材料、标题、按钮 |
InventoryGui.OnCraftPressed |
prefix,替换 | 为分解启动原版制作计时器 |
InventoryGui.DoCrafting |
prefix | 当计时器是分解时,改为执行分解 |
InventoryGui.OnTabCraftPressed、OnTabUpgradePressed |
prefix | 离开 Deconstruct 标签页 |
ZNet.Awake、RPC_PeerInfo、Shutdown |
postfix | 返还率同步 |
原版标签页通过使选中的标签页不可交互来标记它。新标签页遵循同样的约定:当它被选中时,Craft 和 Upgrade 都是可交互的,这使得游戏的 InCraftTab 和 InUpradeTab 都返回 false,因此游戏中的其他任何内容都不会将 Deconstruct 列表误认为二者之一。
复制的标签页会失去游戏手柄绑定以及随附的 Localize 组件,因为它们会按下 Upgrade 并恢复 Upgrade 标题,并且其点击监听器被替换。
配方列表是一个私有结构体的 List,因此通过反射访问,在启动时解析一次。如果游戏更新重命名其中任何成员,插件会记录是哪一个并保持关闭,而不是每帧抛出异常。
材料在测量可用空间后通过 Inventory.AddItem(ItemData) 添加,其余部分通过 ItemDrop.DropItem 掉落。有意避免使用 Inventory.AddItem(string, ...):当背包已满时,它会掉落预制品的新副本,而不是它正在添加的堆叠,这可能会丢失其中一部分。
配置同步是游戏自身网络层的两个路由 RPC:客户端在连接后请求一次,服务器以其返还率应答,而服务器永远不会从客户端获取该值。服务器的值仅保存在内存中,因此加入服务器永远不会重写玩家自己的配置文件。
已知限制
- 制作奖励不会被收回。 在高制作技能下,游戏有时会为可堆叠制作(例如箭矢)添加额外物品。分解一批会返还一批的成本,因此在 100% 时那些奖励物品是一点小利润。如果这在你的服务器上很重要,请降低
ReturnPercent。 - 拥有多个配方的物品按游戏为其列出的第一个配方计价。
- 该标签页没有自己的游戏手柄快捷键。它可以被点击,并且一旦标签页打开,列表和按钮可用游戏手柄操作。
- 该标签页标题在所有语言中都是英文。
还没有人评论,去客户端里说两句吧。
评论在新手盒子客户端中发表,这里同步展示。