大猩猩解体

大猩猩解体

从你的物品栏中分解物品。

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,在内存中修补。不会修改任何游戏文件。

安装

  1. 为 Valheim 安装 BepInEx 5,即 denikson-BepInExPack_Valheim 包。启动游戏一次,以便它创建自己的文件夹。
  2. GorilaDeconstruct.dll 复制到 Valheim/BepInEx/plugins/GorilaDeconstruct/,或者将 -nexus.zip 发行版解压到游戏文件夹中。
  3. 启动游戏。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.OnTabCraftPressedOnTabUpgradePressed prefix 离开 Deconstruct 标签页
ZNet.AwakeRPC_PeerInfoShutdown postfix 返还率同步

原版标签页通过使选中的标签页不可交互来标记它。新标签页遵循同样的约定:当它被选中时,Craft 和 Upgrade 都是可交互的,这使得游戏的 InCraftTabInUpradeTab 都返回 false,因此游戏中的其他任何内容都不会将 Deconstruct 列表误认为二者之一。

复制的标签页会失去游戏手柄绑定以及随附的 Localize 组件,因为它们会按下 Upgrade 并恢复 Upgrade 标题,并且其点击监听器被替换。

配方列表是一个私有结构体的 List,因此通过反射访问,在启动时解析一次。如果游戏更新重命名其中任何成员,插件会记录是哪一个并保持关闭,而不是每帧抛出异常。

材料在测量可用空间后通过 Inventory.AddItem(ItemData) 添加,其余部分通过 ItemDrop.DropItem 掉落。有意避免使用 Inventory.AddItem(string, ...):当背包已满时,它会掉落预制品的新副本,而不是它正在添加的堆叠,这可能会丢失其中一部分。

配置同步是游戏自身网络层的两个路由 RPC:客户端在连接后请求一次,服务器以其返还率应答,而服务器永远不会从客户端获取该值。服务器的值仅保存在内存中,因此加入服务器永远不会重写玩家自己的配置文件。

已知限制

  • 制作奖励不会被收回。 在高制作技能下,游戏有时会为可堆叠制作(例如箭矢)添加额外物品。分解一批会返还一批的成本,因此在 100% 时那些奖励物品是一点小利润。如果这在你的服务器上很重要,请降低 ReturnPercent
  • 拥有多个配方的物品按游戏为其列出的第一个配方计价。
  • 该标签页没有自己的游戏手柄快捷键。它可以被点击,并且一旦标签页打开,列表和按钮可用游戏手柄操作。
  • 该标签页标题在所有语言中都是英文。