diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 49cf3c48..ee4c8bd8 100644
Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_PocketShuttle.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_PocketShuttle.xml
index e6943045..8d645163 100644
--- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_PocketShuttle.xml
+++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_PocketShuttle.xml
@@ -21,6 +21,8 @@
无法进入内部空间。
访问被拒绝。
穿梭机未部署。
+ 传送功能已禁用(穿梭机飞行中)。
+ 无目标地图。
内部空间创建失败。
{0} 名人员已成功传送到内部空间。
即将切换到内部口袋空间。确认吗?
@@ -32,7 +34,6 @@
请选择至少一名殖民者进入内部空间。
没有可用的殖民者。
所有殖民者 ({0}人)
- 仅切换视角
通过传送门返回
diff --git a/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml b/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml
index 85ed3874..6a906de2 100644
--- a/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml
+++ b/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml
@@ -20,6 +20,8 @@
Cannot enter pocket space.
Access denied.
+ Transport functionality disabled (shuttle in flight).
+ No target map available.
Shuttle not deployed.
Pocket space creation failed.
{0} personnel successfully transferred to pocket space.
@@ -32,7 +34,7 @@
Please select at least one colonist to enter the pocket space.
No available colonists.
All colonists ({0} people)
- View only
+
Return through portal
diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs
index 869b7b74..f096946b 100644
--- a/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs
+++ b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs
@@ -16,7 +16,7 @@ namespace WulaFallenEmpire
/// 结合了武装防御能力和口袋空间技术的复合型载具
///
[StaticConstructorOnStartup]
- public class Building_ArmedShuttleWithPocket : Building_ArmedShuttle, IThingHolder
+ public class Building_ArmedShuttleWithPocket : Building_ArmedShuttle
{
#region 静态图标定义(使用原版MapPortal的图标)
@@ -27,7 +27,7 @@ namespace WulaFallenEmpire
private static readonly Texture2D CancelEnterTex = ContentFinder.Get("UI/Designators/Cancel");
/// 默认进入图标
- private static readonly Texture2D DefaultEnterTex = ContentFinder.Get("UI/Commands/EnterCave");
+ private static readonly Texture2D DefaultEnterTex = ContentFinder.Get("UI/Commands/LoadTransporter");
#endregion
#region 口袋空间字段
@@ -50,6 +50,9 @@ namespace WulaFallenEmpire
/// 允许直接访问(无需骇入)
private bool allowDirectAccess = true;
+ /// 传送功能是否暂停(飞行时为 true)
+ private bool transportDisabled = false;
+
// 注意:我们不再使用自定义的innerContainer,
// 所有物品都存储在CompTransporter.innerContainer中,保持简单和一致
@@ -165,6 +168,7 @@ namespace WulaFallenEmpire
Scribe_Defs.Look(ref mapGenerator, "mapGenerator");
Scribe_Defs.Look(ref exitDef, "exitDef");
Scribe_Values.Look(ref allowDirectAccess, "allowDirectAccess", true);
+ Scribe_Values.Look(ref transportDisabled, "transportDisabled", false);
// 不再序列化innerContainer,只使用CompTransporter的容器
@@ -187,24 +191,71 @@ namespace WulaFallenEmpire
public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish)
{
- // 清理口袋地图
- if (pocketMap != null && pocketMapGenerated)
+ Log.Message($"[WULA-DEBUG] DeSpawn called with mode: {mode}");
+
+ // 只在真正销毁时清理口袋地图,发射时保留
+ if (ShouldDestroyPocketMapOnDeSpawn(mode))
{
- try
+ if (pocketMap != null && pocketMapGenerated)
{
- // 将口袋空间中的物品和人员转移到主地图
- TransferAllFromPocketToMainMap();
-
- // 销毁口袋地图
- PocketMapUtility.DestroyPocketMap(pocketMap);
- }
- catch (Exception ex)
- {
- Log.Error($"[WULA] Error cleaning up pocket map: {ex}");
+ try
+ {
+ Log.Message("[WULA-DEBUG] Destroying pocket map due to shuttle destruction");
+
+ // 将口袋空间中的物品和人员转移到主地图
+ TransferAllFromPocketToMainMap();
+
+ // 销毁口袋地图
+ PocketMapUtility.DestroyPocketMap(pocketMap);
+ pocketMap = null;
+ pocketMapGenerated = false;
+ }
+ catch (Exception ex)
+ {
+ Log.Error($"[WULA-ERROR] Error cleaning up pocket map: {ex}");
+ }
}
}
+ else
+ {
+ Log.Message("[WULA-DEBUG] Preserving pocket map during shuttle launch/transport");
+ // 发射时暂停传送功能,但保留口袋空间
+ transportDisabled = true;
+ if (pocketMap != null && exit != null)
+ {
+ // 标记传送功能暂停
+ Log.Message("[WULA-DEBUG] Transport functionality disabled during flight");
+ }
+ }
+
base.DeSpawn(mode);
}
+
+ ///
+ /// 判断是否应该在DeSpawn时销毁口袋地图
+ ///
+ private bool ShouldDestroyPocketMapOnDeSpawn(DestroyMode mode)
+ {
+ // 只在真正销毁时删除口袋空间
+ switch (mode)
+ {
+ case DestroyMode.Vanish: // 发射时使用,保留口袋空间
+ return false;
+ case DestroyMode.Deconstruct: // 拆除,删除口袋空间
+ return true;
+ case DestroyMode.KillFinalize: // 被摧毁,删除口袋空间
+ return true;
+ case DestroyMode.Cancel: // 取消建造,删除口袋空间
+ return true;
+ case DestroyMode.Refund: // 退款,删除口袋空间
+ return true;
+ case DestroyMode.FailConstruction: // 建造失败,删除口袋空间
+ return true;
+ default:
+ Log.Warning($"[WULA-WARNING] Unknown DestroyMode: {mode}, defaulting to preserve pocket map");
+ return false;
+ }
+ }
public override string GetInspectString()
{
@@ -272,6 +323,11 @@ namespace WulaFallenEmpire
return false;
}
+ if (transportDisabled)
+ {
+ return false; // 飞行中禁用传送功能
+ }
+
return true;
}
@@ -763,22 +819,6 @@ namespace WulaFallenEmpire
}
};
}
-
- // 添加同步物品按钮(用于修复物品消失问题)
- if (pocketMapGenerated && pocketMap != null)
- {
- yield return new Command_Action
- {
- defaultLabel = "同步物品",
- defaultDesc = "将口袋空间中的物品同步到穿梭机容器中。如果物品消失,可以尝试点击此按钮。",
- icon = ContentFinder.Get("UI/Commands/LoadTransporter"),
- action = delegate
- {
- SyncPocketItemsToMainContainer();
- Messages.Message("物品同步完成。" + GetPocketSpaceDebugInfo(), this, MessageTypeDefOf.TaskCompletion);
- }
- };
- }
}
}
@@ -786,39 +826,6 @@ namespace WulaFallenEmpire
#endregion
- #region IThingHolder接口实现
-
- public ThingOwner GetDirectlyHeldThings()
- {
- // 只使用穿梭机的标准容器,保持简单和一致性
- CompTransporter transporter = this.GetComp();
- if (transporter?.innerContainer != null)
- {
- Log.Message($"[WULA-DEBUG] GetDirectlyHeldThings: Returning main container with {transporter.innerContainer.Count} items");
- return transporter.innerContainer;
- }
-
- // 如果CompTransporter不存在,说明有严重问题,直接报错
- Log.Error("[WULA-ERROR] CompTransporter is null! This should never happen for a shuttle.");
-
- // 返回一个临时空容器避免游戏崩溃,但这种情况应该被修复
- var tempContainer = new ThingOwner(this, oneStackOnly: false);
- Log.Error($"[WULA-ERROR] Created temporary container as fallback. This is a bug!");
- return tempContainer;
- }
-
- public void GetChildHolders(List outChildren)
- {
- // 只添加穿梭机的主容器
- CompTransporter transporter = this.GetComp();
- if (transporter != null)
- {
- outChildren.Add(transporter);
- }
- }
-
- #endregion
-
#region MapPortal兼容接口(使Dialog_EnterPortal能正常工作)
///
@@ -838,6 +845,12 @@ namespace WulaFallenEmpire
return false;
}
+ if (transportDisabled)
+ {
+ reason = "WULA.PocketSpace.TransportDisabled".Translate();
+ return false;
+ }
+
reason = "";
return true;
}
@@ -927,27 +940,6 @@ namespace WulaFallenEmpire
options.Add(allOption);
}
- // 添加“只切换视角”选项
- FloatMenuOption viewOnlyOption = new FloatMenuOption(
- "WULA.PocketSpace.ViewOnly".Translate(),
- delegate
- {
- if (pocketMapGenerated)
- {
- SwitchToPocketSpace();
- }
- else
- {
- CreatePocketMap();
- if (pocketMapGenerated)
- {
- SwitchToPocketSpace();
- }
- }
- }
- );
- options.Add(viewOnlyOption);
-
// 显示浮动菜单
FloatMenu floatMenu = new FloatMenu(options);
Find.WindowStack.Add(floatMenu);
@@ -1146,6 +1138,20 @@ namespace WulaFallenEmpire
// 更新退出点目标(处理穿梭机重新部署的情况)
UpdateExitPointTarget();
+ // 如果是从飞行状态恢复,重新启用传送功能
+ if (transportDisabled)
+ {
+ Log.Message("[WULA-DEBUG] Re-enabling transport functionality after landing");
+ transportDisabled = false;
+
+ // 如果有口袋空间,确保退出点正确连接到新地图
+ if (pocketMapGenerated && pocketMap != null && exit != null)
+ {
+ Log.Message($"[WULA-DEBUG] Reconnecting pocket space exit to new map: {map?.uniqueID} at {this.Position}");
+ // 退出点会在 UpdateExitPointTarget 中自动更新
+ }
+ }
+
// 从 ThingDef 中读取 portal 配置
if (def.HasModExtension())
{
diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs b/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs
index e458f819..3ca890fe 100644
--- a/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs
+++ b/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs
@@ -3,6 +3,7 @@ using Verse;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
+using System.Reflection;
namespace WulaFallenEmpire
{
@@ -75,7 +76,7 @@ namespace WulaFallenEmpire
}
///
- /// 重写是否可进入,检查目标地图是否存在(模仿原版MapPortal.IsEnterable)
+ /// 重写是否可进入,检查目标地图是否存在及传送状态(模仿原版MapPortal.IsEnterable)
///
public override bool IsEnterable(out string reason)
{
@@ -84,6 +85,25 @@ namespace WulaFallenEmpire
reason = "WULA.PocketSpace.NoTargetMap".Translate();
return false;
}
+
+ // 检查父穿梭机的传送状态
+ if (parentShuttle != null)
+ {
+ // 使用反射获取 transportDisabled 字段值
+ var transportDisabledField = typeof(Building_ArmedShuttleWithPocket).GetField("transportDisabled",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+
+ if (transportDisabledField != null)
+ {
+ bool transportDisabled = (bool)transportDisabledField.GetValue(parentShuttle);
+ if (transportDisabled)
+ {
+ reason = "WULA.PocketSpace.TransportDisabled".Translate();
+ return false;
+ }
+ }
+ }
+
reason = "";
return true;
}
@@ -107,9 +127,9 @@ namespace WulaFallenEmpire
public override string EnterString => "WULA.PocketSpace.ExitToMainMap".Translate();
///
- /// 重写进入按钮图标,使用原版的ViewCave图标
+ /// 重写进入按钮图标,使用装载按钮的贴图
///
- protected override Texture2D EnterTex => ContentFinder.Get("UI/Commands/ViewCave");
+ protected override Texture2D EnterTex => ContentFinder.Get("UI/Commands/LoadTransporter");