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