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");