Files
WulaFallenEmpireRW/Source/Documentation/PocketSpace_ItemFix_README.md
2025-08-25 12:29:12 +08:00

122 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 武装穿梭机口袋空间物品消失问题修复
## 问题描述
装载到穿梭机口袋空间中的物品会神秘消失,玩家无法在穿梭机的容器界面中看到这些物品。
## 问题原因分析
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. 穿梭机起飞时物品应该随行
修复后,您的物品不会再神秘消失,并且可以正常通过穿梭机界面管理。