Don't Starve Together

Don't Starve Together

45 Inventory Slots [Fixed + EquipSlot UI expand] 整合版
xuopleu  [developer] 24 Jan, 2024 @ 5:09am
20240124 近期进展:背包融合/手柄操作问题+能力勋章融合勋章兼容性问题
交代既往承诺修复的 bug/新增的功能的工作进展
45 格 mod融合背包模式+手柄操作模式
当前进度
主要功能早已实现,但有两个主要问题。
触发条件:设置背包模式为融合或手柄连接。
实现效果:实现原生物品栏融合模式的主要功能。当手柄连接后可以实现物品取放。界面上会显示为三行,第三行为原有背包的映射。将物品放入背包、取出背包,自动放置或取用背包内物品时等基本操作和原版一致。
已知问题
已知问题 1:融合背包容量大于背包最后一行时格子数时,有关逻辑不知如何处理。
触发情景:例如设置为 45 格模式,同时升级背包>最后一行容量即26 格时之后,多余 27 及之后的背包格子无法处理。
初步设想为当该模式启动时,掉落超出部分的格子物品自动掉落(基本实现),禁用位于 overflow 的多余的格子,使得这几个格子一直为空且物品无法进入这几个格子中。
尝试过的方法:
a修改 overflow 对应 container 的 itemtestfn,修改成功,但这一逻辑仅仅在传入 slot 时才可以实现返回 false 值。不能阻止拾取时物品进入多余格子中。
b 尝试hook Container:CanTakeItemInSlot方法,一直没有定位到该方法,没有找到原因。
c 尝试修改inventory 的 GetNextAvailableSlot,尝试对使用到 overflow 的地方加入单独逻辑。但尚不清楚拾取物品时具体执行方法及其逻辑。效果也没有看到。这份尝试没见到效果。

还有时,可能直接禁止了多余格子的功能,同时也使得非融合模式下的背包功能失效。

这个前前后后搞了好几周的周末,一直没有解决,还会出现很多我不知如何产生和解决的问题。所以摆烂了很久。

已知问题 2:手柄操作 UI 遮挡、放置位置的问题。
比较小的问题,但一直没着手解决。


能力勋章融合勋章格子显示问题
问题描述
触发情景:能力勋章配置,开启勋章栏+勋章移动贴边。
融合勋章,开启勋章栏可以实现预期效果,但勋章移动贴边开启后本 mod 无法像原版中效果一样,成功显示勋章盒。但融合勋章的功能似乎仍然有效,可以将勋章放融合勋章中,当无法取出,无法显示。
当前进度
基本定位该问题发生于 widget parent 的有关问题上,导致其子 widget 无法正常显示。正按照这一思路,查找有关widget parent 作用的资料。
< >
Showing 1-2 of 2 comments
xuopleu  [developer] 6 Feb, 2024 @ 7:31am 
能力勋章融合勋章格子显示问题修复进度
问题定位
抱歉又拖了很久。
之前想太多,与 parent 无关。两 mod 的parent.parent同为 root,彼此可以正常访问。理论上可以同时显示。
更换 parent 的做法可以改善有关问题,但定位逻辑依然有问题,并且可能带来新的问题。

主要原因在于能力勋章hook了widgets/inventorybar的 rebuild 方法,会额外调用RefreshMedalInvPos方法更新融合勋章栏位置。

该方法会更新设置融合勋章的容器的位置:self.medal_inv:SetPosition(x, medal_inv_y, 0)
其中, x 值由 getTotalW方法计算而来,x的计算会导入本地常数W、SEP、INTERSEP。45 格也有这三个常数,但与能力勋章的数值不同。更重要的是 45 格的格子数为45,这会导致计算出的 x 值远大于正常显示位置,使得融合勋章盒子显示在正常屏幕显示范围之外。
其中,medal_inv_y值为 80 或 40,这是兼容默认物品栏的设计。

问题解决
Inventorybar:OnUpdate中加入有关mod 的判断,覆写 RefreshMedalInvPos方法。

与本 mod 同时开启时,能力勋章mod 会在本 mod 之后加载,两 mod 都会重写 Inventorybar:Rebuild方法,在本 mod Rebuild方法之后,能力勋章继续 hook,写入特有逻辑。mod 的 rebuild 基础上再次重写 rebuild。在本 mod 中修改 rebuild 方法势必会导致覆盖。

方案缺陷

无法第一时间覆写RefreshMedalInvPos,需要手动触发Inventorybar:OnUpdate方法。
每次触发Inventorybar:OnUpdate时会再次判断是否已经覆写有关方法。
xuopleu  [developer] 5 May, 2024 @ 4:47am 
45 格 mod融合背包模式
因为之前一直没什么新进展,就又鸽了几个月,:steamsad:
五一假期又重新研究了起来,终于找到了比较好的解决方案。
问题
  1. 多余格子物品丢弃问题
    使用 for 循环内执行slot:DropItem()方法丢弃格子内物品时,a 可能动作不及时执行 b 如果两物品相同,并且其他格子有该物品时,使用该方法会有时会将所有同种物品一同丢弃。
    ·尝试解决 a 问题,研究scheduler,DoTaskInTime,BufferedAction,SendRPCToServer,没效果
    ·尝试解决 b 问题,使用 PushEvent、ListenForEvent 等方法将该事件关联到 slot.inst,没效果。列队行为学,没学明白
  2. 格子禁用问题
    尝试修改 container 组件的 IsEmpty,都无效

新思路:翻页式融合背包
这一方案来自于 Upgradeable Chest -- 可升级箱子,模组可以实现原版物品栏下,融合背包模式下翻页的功能。感谢该模组的作者们,也感谢带给作者灵感的其他贡献者。

简单实现:找到2484725102/main/widgets/inventorybar.lua 的NEW_Rebuild中定义的组件位置,重新定位。

有精力的情况,可以参考该 mod,完成翻页等Control功能。
Last edited by xuopleu; 5 May, 2024 @ 7:30am
< >
Showing 1-2 of 2 comments
Per page: 1530 50