原创
背包自动扩容修复 · FL_Backpack_AutoFit
适用:7 Days To Die V3.0(b252 / b257 / b259 等同系列)。作者:BD。
作用:修复 “安装大背包 mod 后,超过原版 45 格的物品放不进、或会消失“的问题。
特性:自动识别背包格数(无需配置文件);专用服支持客户端零安装。
一、它解决什么问题
安装了把背包改大的 mod(如 90 格、115 格)后:
-
•界面上能看到更多格子;
-
•但物品只能正常放到第 45 格;
-
•往第 46 格及以后放:放不进,或者关闭背包 / 重进世界 / 存档读档后消失;
-
•有的还需要 “手动拖一个物品到下面、再点整理 “才勉强能用。
装上本 mod 后:背包自动按真实格数工作,超出 45 的格子正常存放、不再丢失,也不用手动整理。
二、为什么会这样(原理详解)
#1. 背包真实大小在游戏 “开始 “之前就被定死成 45
7DTD 玩家实体初始化顺序:先 Awake()、后 Init(entityClass)。背包在 Awake() 里创建:
而 EffectManager.GetValue 开头有一道 “门 “:
Awake() 时游戏尚未 IsGameStarted(),于是 GetValue(BagSize) 返回硬编码的 45,读不到 entityclasses.xml 里的 BagSize。结果:无论 XML 把 BagSize 改成多少,背包数组都被固定为 45。
#2. 纯 XML 大背包 mod 只改了 “界面 “,没改 “后端 “
| 层 | 来源 | 大背包 mod 改了吗 |
|---|---|---|
| 界面网格(看到的格子数) | windows.xml(XUi) |
✅ 改了(所以能看到 90 / 115 格) |
后端数据(真正存物品的 Bag 数组) |
代码 new Bag(45) |
❌ 没改(被定死 45) |
于是出现 界面 90 / 后端 45 的错位,第 46 格之后是 “空壳格“。
#3. 空壳格为什么 “放不进 / 丢东西 / 要手动整理 “
-
•绑定时只接前 N 个格子:
XUiC_Backpack.SetStacks只把min(后端格数, 界面格数)个格子接到后端。若开背包那一刻后端还是 45,就只绑了 45,第 46 格之后是 “死格 “。 -
•越界写入被丢弃:
Bag.SetSlot(index,…)里if (index < items.Length),索引 ≥ 后端长度的写入被静默忽略,物品消失。 -
•“手动拖 + 整理 “为什么能救:整理按钮会
Bag.SetSlots(…)→ 触发一次刷新,重新按当前后端长度绑定;如果那时后端已被扩大,就把全部格子接上了。本 mod 把 “扩容 “放在绑定之前、并在绑定之后自动刷新一次,所以你不用再手动整理。
#4. 这不是某版本改坏的
Bag、XUiC_Backpack、XUiC_ItemStackGrid、XUiM_PlayerInventory、EntityPlayer.Awake() 在 b252 / b257 / b259 完全相同,整个 3.0 都是这套机制,回退版本解决不了,必须代码层修补(即本 mod)。
三、本 mod 做了什么(详解)
核心:把后端 Bag 自动对齐到应有格数,保留已有物品、只扩不缩。三条通路 + 自动识别:
#通路 A —— 客户端开背包(最可靠)
Hook XUiC_Backpack.OnOpen:
-
•Prefix:在界面绑定之前,读界面真实格数(
itemControllers.Length,你装的大背包定义的 90 / 115…),把本地bag扩到一致。 -
•Postfix:绑定之后再强制刷新一次(
RefreshBackpackSlots),等于自动替你点了 “整理 “ → 第一次开包就绑满,无需手动拖 + 整理。
#通路 B —— 进入世界时
Hook ModEvents.PlayerSpawnedInWorld:玩家进世界时把其 bag 扩到 max(BagSize, 本地界面格数, 目标值)。服务端 / 主机 / 本地客户端都会跑。
#通路 C —— 客户端零安装(服务端)
Hook PlayerDataFile.Load:专用服在玩家进服、原版把存档背包随 NetPackagePlayerId 下发给客户端之前,先把它扩好。客户端收到后 PlayerDataFile.ToPlayer 会执行 player.bag = bag(整包直接赋值)→ 客户端本地背包变成目标大小。因此客户端不用装任何东西(详见 “部署 · 模式二 “)。
#自动识别格数(无需配置文件)
服务端没界面,就读 entityclasses 的 BagSize(你的大背包 mod 设的值)。优先级:backpack_size.txt(可选手动覆盖)> 自动识别的 BagSize > 兜底 96。
换更大的背包(如 115)无需改本 mod:只要那个 mod 也设了 BagSize=115,重启服务器即自动识别。
#共同特性
-
•只扩不缩:后端比目标小才扩,绝不缩小。
-
•保留物品:扩容时原样复制原有格子。
-
•老角色也能修:老角色被存档定死的尺寸,会在开包 / 进服时扩好并写回。
-
•自适应任意格数:换别的大背包 mod 无需改本 mod。
四、安装与部署
前提
相关端 EAC 关闭(Harmony 必需);服务器与客户端游戏大版本一致;UI 大背包 mod 为纯 XML(含 entityclasses 的 BagSize)。
#模式一:单机 / 双装(体验最好,全场景无缝)
把以下文件夹放进各自 …\7 Days To Die\Mods\(单机就一台;联机则客户端和服务器都放):
-
•
0_TFP_Harmony(Harmony 加载器,必需) -
•你的 UI 大背包 mod(如
V3.X90格背包,提供界面 +BagSize) -
•
FL_Backpack_AutoFit(本 mod)
所有情况都无缝,包括全新角色第一次进服 / 开档(通路 A 开包即扩 + 刷新)。
#模式二:专用服 · 客户端零安装
只在服务器 Mods\ 放上述三件套;客户端什么都不装(但连服时客户端要以无 EAC 方式启动)。
-
•原理:服务器把界面、
BagSize等SendToClients配置下发给客户端显示大背包;通路 C 在下发存档前把背包扩好,客户端拿到即为目标大小。 -
•老角色 / 有存档玩家:进服即大背包、能存、退出不丢。
-
•全新角色第一次进服:服务器还没他的存档,这一局仍是 45 格;退出重进一次后即为大背包(之后一直正常)。想连这一步也免掉 → 用模式一。
五、注意事项
-
•界面格数应与
BagSize一致:UI 网格格数最好等于entityclasses的BagSize,避免多余空壳格。 -
•CarryCapacity 建议也一起设:否则超过
CarryCapacity的格子会 “负重 “减速(但不丢东西)。 -
•EAC 必须关闭(相关端),否则 DLL / Harmony mod 不生效;零安装模式下客户端也要无 EAC 启动才能连服。
-
•版本一致:服务器与客户端游戏大版本需一致。
-
•游戏更新:若大版本改动了相关类签名,本 mod 需重新编译。
-
•日志:认准
[BD][BackpackAutoFit]前缀;服务端零安装扩容会打印(server/zero-install) … grown to N …。
隐藏内容需要回复可以看见











鄂公网安备42011202002543号




感谢大佬的付出,赞一个!
6666666666
这个逼装的我给82分,剩下的用666的方式打给你!
感谢大佬的付出,赞一个!
这个逼装的我给82分,剩下的用666的方式打给你!
我看看怎么个事?
感谢修复问题
感谢大佬的付出,赞一个!
感谢大佬的付出,赞一个!
感谢大佬分享