This commit is contained in:
2025-08-25 12:49:36 +08:00
parent 9ef38c24ea
commit 7dbe1df334
5 changed files with 118 additions and 89 deletions

View File

@@ -21,6 +21,8 @@
<WULA.PocketSpace.CannotEnter>无法进入内部空间。</WULA.PocketSpace.CannotEnter>
<WULA.PocketSpace.AccessDenied>访问被拒绝。</WULA.PocketSpace.AccessDenied>
<WULA.PocketSpace.NotSpawned>穿梭机未部署。</WULA.PocketSpace.NotSpawned>
<WULA.PocketSpace.TransportDisabled>传送功能已禁用(穿梭机飞行中)。</WULA.PocketSpace.TransportDisabled>
<WULA.PocketSpace.NoTargetMap>无目标地图。</WULA.PocketSpace.NoTargetMap>
<WULA.PocketSpace.CreationFailed>内部空间创建失败。</WULA.PocketSpace.CreationFailed>
<WULA.PocketSpace.TransferSuccess>{0} 名人员已成功传送到内部空间。</WULA.PocketSpace.TransferSuccess>
<WULA.PocketSpace.SwitchToPocket>即将切换到内部口袋空间。确认吗?</WULA.PocketSpace.SwitchToPocket>
@@ -32,7 +34,6 @@
<WULA.PocketSpace.NoPawnsSelected>请选择至少一名殖民者进入内部空间。</WULA.PocketSpace.NoPawnsSelected>
<WULA.PocketSpace.NoPawnsAvailable>没有可用的殖民者。</WULA.PocketSpace.NoPawnsAvailable>
<WULA.PocketSpace.AllColonists>所有殖民者 ({0}人)</WULA.PocketSpace.AllColonists>
<WULA.PocketSpace.ViewOnly>仅切换视角</WULA.PocketSpace.ViewOnly>
<!-- 退出点相关 -->
<WULA.PocketSpace.ExitThroughPortal>通过传送门返回</WULA.PocketSpace.ExitThroughPortal>

View File

@@ -20,6 +20,8 @@
<!-- Message text -->
<WULA.PocketSpace.CannotEnter>Cannot enter pocket space.</WULA.PocketSpace.CannotEnter>
<WULA.PocketSpace.AccessDenied>Access denied.</WULA.PocketSpace.AccessDenied>
<WULA.PocketSpace.TransportDisabled>Transport functionality disabled (shuttle in flight).</WULA.PocketSpace.TransportDisabled>
<WULA.PocketSpace.NoTargetMap>No target map available.</WULA.PocketSpace.NoTargetMap>
<WULA.PocketSpace.NotSpawned>Shuttle not deployed.</WULA.PocketSpace.NotSpawned>
<WULA.PocketSpace.CreationFailed>Pocket space creation failed.</WULA.PocketSpace.CreationFailed>
<WULA.PocketSpace.TransferSuccess>{0} personnel successfully transferred to pocket space.</WULA.PocketSpace.TransferSuccess>
@@ -32,7 +34,7 @@
<WULA.PocketSpace.NoPawnsSelected>Please select at least one colonist to enter the pocket space.</WULA.PocketSpace.NoPawnsSelected>
<WULA.PocketSpace.NoPawnsAvailable>No available colonists.</WULA.PocketSpace.NoPawnsAvailable>
<WULA.PocketSpace.AllColonists>All colonists ({0} people)</WULA.PocketSpace.AllColonists>
<WULA.PocketSpace.ViewOnly>View only</WULA.PocketSpace.ViewOnly>
<!-- Exit point related -->
<WULA.PocketSpace.ExitThroughPortal>Return through portal</WULA.PocketSpace.ExitThroughPortal>

View File

@@ -16,7 +16,7 @@ namespace WulaFallenEmpire
/// 结合了武装防御能力和口袋空间技术的复合型载具
/// </summary>
[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<Texture2D>.Get("UI/Designators/Cancel");
/// <summary>默认进入图标</summary>
private static readonly Texture2D DefaultEnterTex = ContentFinder<Texture2D>.Get("UI/Commands/EnterCave");
private static readonly Texture2D DefaultEnterTex = ContentFinder<Texture2D>.Get("UI/Commands/LoadTransporter");
#endregion
#region
@@ -50,6 +50,9 @@ namespace WulaFallenEmpire
/// <summary>允许直接访问(无需骇入)</summary>
private bool allowDirectAccess = true;
/// <summary>传送功能是否暂停(飞行时为 true</summary>
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);
}
/// <summary>
/// 判断是否应该在DeSpawn时销毁口袋地图
/// </summary>
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<Texture2D>.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<CompTransporter>();
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<Thing>(this, oneStackOnly: false);
Log.Error($"[WULA-ERROR] Created temporary container as fallback. This is a bug!");
return tempContainer;
}
public void GetChildHolders(List<IThingHolder> outChildren)
{
// 只添加穿梭机的主容器
CompTransporter transporter = this.GetComp<CompTransporter>();
if (transporter != null)
{
outChildren.Add(transporter);
}
}
#endregion
#region MapPortal兼容接口使Dialog_EnterPortal能正常工作
/// <summary>
@@ -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<PocketMapProperties>())
{

View File

@@ -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
}
/// <summary>
/// 重写是否可进入检查目标地图是否存在模仿原版MapPortal.IsEnterable
/// 重写是否可进入,检查目标地图是否存在及传送状态模仿原版MapPortal.IsEnterable
/// </summary>
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();
/// <summary>
/// 重写进入按钮图标,使用原版的ViewCave图标
/// 重写进入按钮图标,使用装载按钮的贴图
/// </summary>
protected override Texture2D EnterTex => ContentFinder<Texture2D>.Get("UI/Commands/ViewCave");
protected override Texture2D EnterTex => ContentFinder<Texture2D>.Get("UI/Commands/LoadTransporter");