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

4.6 KiB
Raw Blame History

武装穿梭机口袋空间物品消失问题修复

问题描述

装载到穿梭机口袋空间中的物品会神秘消失,玩家无法在穿梭机的容器界面中看到这些物品。

问题原因分析

  1. 双重存储系统混乱:代码中同时存在两个容器:

    • innerContainer(自定义容器)
    • CompTransporter.innerContainer(穿梭机标准容器)
  2. 错误的容器优先级:物品被存储到自定义的 innerContainer 中,但游戏界面和穿梭机系统期望物品在 CompTransporter.innerContainer 中。

  3. 缺乏自动同步机制:口袋空间中的物品没有定期同步到穿梭机的主容器中。

解决方案

设计理念:简单即是美

经过重新设计,我们移除了备用容器的复杂性,采用更简洁的单一容器策略:

核心原则

  • 唯一权威容器:只使用穿梭机的 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. 现有问题修复

如果您已经遇到物品消失问题:

  1. 选中武装穿梭机
  2. 点击新增的"同步物品"按钮
  3. 系统会将口袋空间中的物品同步到主容器

2. 预防措施

  • 系统现在会每5分钟自动同步一次
  • 物品会优先存储到穿梭机的标准容器中
  • 在开发模式下,您可以看到详细的物品分布信息

3. 调试功能

在开发模式下:

  • 穿梭机信息面板会显示详细的容器状态
  • 自动同步时会在日志中输出详细信息
  • 可以追踪物品的存储位置

技术细节

容器优先级

  1. 主容器CompTransporter.innerContainer - 游戏界面可见
  2. 备用容器innerContainer - 用于溢出存储
  3. 地面存储:当所有容器都满时,物品会被放置在穿梭机附近

同步时机

  • 销毁时:穿梭机被销毁时自动转移所有物品
  • 定期同步每5分钟检查一次18000 ticks
  • 手动同步:玩家点击同步按钮时
  • 进入时:从口袋空间返回时

兼容性

  • 兼容现有存档
  • 不影响其他模组
  • 保持原有功能完整性
  • 支持多语言界面

验证方法

  1. 将物品放入口袋空间
  2. 检查穿梭机的"内容"标签页
  3. 物品应该正确显示在列表中
  4. 穿梭机起飞时物品应该随行

修复后,您的物品不会再神秘消失,并且可以正常通过穿梭机界面管理。