4.6 KiB
4.6 KiB
武装穿梭机口袋空间物品消失问题修复
问题描述
装载到穿梭机口袋空间中的物品会神秘消失,玩家无法在穿梭机的容器界面中看到这些物品。
问题原因分析
-
双重存储系统混乱:代码中同时存在两个容器:
innerContainer(自定义容器)CompTransporter.innerContainer(穿梭机标准容器)
-
错误的容器优先级:物品被存储到自定义的
innerContainer中,但游戏界面和穿梭机系统期望物品在CompTransporter.innerContainer中。 -
缺乏自动同步机制:口袋空间中的物品没有定期同步到穿梭机的主容器中。
解决方案
设计理念:简单即是美
经过重新设计,我们移除了备用容器的复杂性,采用更简洁的单一容器策略:
核心原则:
- ✅ 唯一权威容器:只使用穿梭机的
CompTransporter.innerContainer - ✅ 简化存储逻辑:物品直接存储到游戏界面可见的容器
- ✅ 透明的失败处理:容器满了就放到地面,玩家可以看到并手动处理
- ✅ 向后兼容性:保留
innerContainer仅用于向后兼容,避免游戏崩溃
1. 修复物品转移逻辑
修改了 TransferAllFromPocketToMainMap() 方法:
- 直接使用主容器:物品直接存储到
CompTransporter.innerContainer - 透明的容量处理:容器满了就放到地面,并显示提示消息
- 清晰的反馈:玩家可以看到哪些物品因为容器满了被放到了地面
// 简化后的逻辑
if (!transporter.innerContainer.TryAdd(item))
{
// 容器满了,放到地面让玩家看到
GenPlace.TryPlaceThing(item, dropPos, this.Map, ThingPlaceMode.Near);
Messages.Message($"容器已满:{item.LabelShort} 被放置在穿梭机附近", MessageTypeDefOf.CautionInput);
}
2. 修复 IThingHolder 接口实现
修改了 GetDirectlyHeldThings() 方法:
- 优先返回主容器:游戏界面会正确显示穿梭机主容器中的物品
- 智能容器选择:自动选择有效的容器
public ThingOwner GetDirectlyHeldThings()
{
// 优先返回穿梭机的主容器
CompTransporter transporter = this.GetComp<CompTransporter>();
if (transporter != null && transporter.innerContainer != null)
{
return transporter.innerContainer;
}
// 备用容器
return innerContainer;
}
3. 添加物品同步功能
新增了 SyncPocketItemsToMainContainer() 方法:
- 手动同步:玩家可以通过按钮手动同步物品
- 自动同步:每5分钟自动检查并同步物品
- 智能检测:只同步不在主容器中的物品
4. 增强用户界面
- 新增同步按钮:玩家可以手动触发物品同步
- 详细状态显示:在穿梭机信息面板中显示物品分布情况
- 调试信息:开发模式下显示详细的调试信息
5. 自动监控机制
修改了 Tick() 方法:
- 定期检查:每5分钟自动检查口袋空间中的物品
- 预防性同步:发现物品时自动同步到主容器
- 异常处理:完善的错误处理机制
使用说明
1. 现有问题修复
如果您已经遇到物品消失问题:
- 选中武装穿梭机
- 点击新增的"同步物品"按钮
- 系统会将口袋空间中的物品同步到主容器
2. 预防措施
- 系统现在会每5分钟自动同步一次
- 物品会优先存储到穿梭机的标准容器中
- 在开发模式下,您可以看到详细的物品分布信息
3. 调试功能
在开发模式下:
- 穿梭机信息面板会显示详细的容器状态
- 自动同步时会在日志中输出详细信息
- 可以追踪物品的存储位置
技术细节
容器优先级
- 主容器:
CompTransporter.innerContainer- 游戏界面可见 - 备用容器:
innerContainer- 用于溢出存储 - 地面存储:当所有容器都满时,物品会被放置在穿梭机附近
同步时机
- 销毁时:穿梭机被销毁时自动转移所有物品
- 定期同步:每5分钟检查一次(18000 ticks)
- 手动同步:玩家点击同步按钮时
- 进入时:从口袋空间返回时
兼容性
- ✅ 兼容现有存档
- ✅ 不影响其他模组
- ✅ 保持原有功能完整性
- ✅ 支持多语言界面
验证方法
- 将物品放入口袋空间
- 检查穿梭机的"内容"标签页
- 物品应该正确显示在列表中
- 穿梭机起飞时物品应该随行
修复后,您的物品不会再神秘消失,并且可以正常通过穿梭机界面管理。