diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 7c1049f1..fde1fd95 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/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml index 21bb662d..b5728ab4 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml @@ -102,6 +102,7 @@ Shuttle_PawnExit true +
  • 500 true @@ -128,6 +129,7 @@
  • ShuttleIdle_Ambience
  • +
  • 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 8d645163..0c559d8c 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_PocketShuttle.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_PocketShuttle.xml @@ -8,6 +8,9 @@ 储存物品: {0} + 初始化内部空间 + 初始化穿梭机的内部口袋空间。这将在穿梭机内部创建维度储存空间。 + 进入内部空间 进入穿梭机的内部口袋空间。无需骇入即可直接访问。选中的殖民者将被传送到内部空间。 @@ -18,6 +21,11 @@ 打开内部容器管理界面,可以查看和取出储存在内部空间的物品。 + 无法初始化内部空间。 + 内部空间已经初始化。 + 内部空间初始化成功。 + 内部空间初始化失败。 + 无法进入内部空间。 访问被拒绝。 穿梭机未部署。 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 6a906de2..bbf8e202 100644 --- a/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml +++ b/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml @@ -8,6 +8,9 @@ Stored items: {0} + Initialize pocket space + Initialize the shuttle's internal pocket space. This will create the dimensional storage space inside the shuttle. + Enter pocket space Enter the shuttle's internal pocket space. Direct access without hacking required. Selected colonists will be transported to the internal space. @@ -18,6 +21,11 @@ Open internal container management interface to view and retrieve items stored in the pocket space. + Cannot initialize pocket space. + Pocket space already initialized. + Pocket space initialized successfully. + Pocket space initialization failed. + Cannot enter pocket space. Access denied. Transport functionality disabled (shuttle in flight). diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs index f096946b..e270a996 100644 --- a/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs +++ b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs @@ -20,9 +20,7 @@ namespace WulaFallenEmpire { #region 静态图标定义(使用原版MapPortal的图标) - /// 查看口袋地图图标 - private static readonly Texture2D ViewPocketMapTex = ContentFinder.Get("UI/Commands/ViewCave"); - + /// 取消进入图标 private static readonly Texture2D CancelEnterTex = ContentFinder.Get("UI/Designators/Cancel"); @@ -797,28 +795,7 @@ namespace WulaFallenEmpire enterCommand.disabledReason = reason; yield return enterCommand; - // 查看口袋地图按钮(模仿原版MapPortal) - if (pocketMap != null) - { - yield return new Command_Action - { - defaultLabel = "WULA.PocketSpace.ViewMap".Translate(), - defaultDesc = "WULA.PocketSpace.ViewMapDesc".Translate(), - icon = ViewPocketMapTex, - action = delegate - { - // 模仿原版,跳转到口袋地图并选中退出点 - if (exit != null) - { - CameraJumper.TryJumpAndSelect(exit); - } - else - { - SwitchToPocketSpace(); - } - } - }; - } + } } diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/CompPocketMapPortal.cs b/Source/WulaFallenEmpire/WULA_Shuttle/CompPocketMapPortal.cs index 971bdf1b..d14e4ef3 100644 --- a/Source/WulaFallenEmpire/WULA_Shuttle/CompPocketMapPortal.cs +++ b/Source/WulaFallenEmpire/WULA_Shuttle/CompPocketMapPortal.cs @@ -1,106 +1,65 @@ using RimWorld; using Verse; -using Verse.AI; using System.Collections.Generic; -using System.Linq; using UnityEngine; using System.Reflection; namespace WulaFallenEmpire { /// - /// 口袋空间传送门组件 - 将Building_PocketMapExit的功能转换成可挂载的组件 - /// 直接挂载在穿梭机上处理进入内部空间的逻辑 + /// 口袋空间传送门组件 - 只作为入口功能,附加在穿梭机上处理进入内部空间的逻辑 /// public class CompPocketMapPortal : ThingComp { - /// 目标地图(口袋空间) - public Map targetMap; - - /// 目标位置(在口袋空间中的位置) - public IntVec3 targetPos; - - /// 父穿梭机引用 - public Building_ArmedShuttleWithPocket parentShuttle; - /// 组件属性 public CompProperties_PocketMapPortal Props => (CompProperties_PocketMapPortal)props; - /// 父建筑(应该是穿梭机) - public Building_ArmedShuttleWithPocket ParentShuttle - { - get - { - if (parentShuttle == null && parent is Building_ArmedShuttleWithPocket shuttle) - { - parentShuttle = shuttle; - } - return parentShuttle; - } - } - - public override void PostExposeData() - { - base.PostExposeData(); - Scribe_References.Look(ref targetMap, "targetMap"); - Scribe_Values.Look(ref targetPos, "targetPos"); - Scribe_References.Look(ref parentShuttle, "parentShuttle"); - } + /// 父建筑(必须是穿梭机) + public Building_ArmedShuttleWithPocket ParentShuttle => parent as Building_ArmedShuttleWithPocket; + /// MapPortal适配器,用于使用原版Dialog_EnterPortal + private ShuttlePortalAdapter portalAdapter; + public override void PostSpawnSetup(bool respawningAfterLoad) { base.PostSpawnSetup(respawningAfterLoad); - // 确保父穿梭机引用正确 - if (parent is Building_ArmedShuttleWithPocket shuttle) - { - parentShuttle = shuttle; - Log.Message($"[WULA] CompPocketMapPortal attached to shuttle: {parent.LabelShort}"); - } - else + // 检查父对象是否是穿梭机 + if (ParentShuttle == null) { Log.Error($"[WULA] CompPocketMapPortal attached to non-shuttle building: {parent?.def?.defName}"); } - } - - /// - /// 设置口袋空间目标(由穿梭机调用) - /// - public void SetPocketSpaceTarget(Map pocketMap, IntVec3 exitPos) - { - targetMap = pocketMap; - targetPos = exitPos; - Log.Message($"[WULA] CompPocketMapPortal target set to pocket map: {pocketMap?.uniqueID} at {exitPos}"); - } - - /// - /// 获取其他地图(口袋空间),模仿原版MapPortal.GetOtherMap - /// - public Map GetOtherMap() - { - // 如果没有目标地图,尝试从父穿梭机获取 - if (targetMap == null && ParentShuttle != null) + else { - targetMap = ParentShuttle.PocketMap; + // 创建MapPortal适配器,并设置其地图和位置信息 + portalAdapter = new ShuttlePortalAdapter(ParentShuttle); + // 使用反射设置适配器的地图和位置,让Dialog_EnterPortal能正确访问 + if (portalAdapter != null && ParentShuttle.Spawned) + { + try + { + // 使用反射设置私有字段 + var mapField = typeof(Thing).GetField("mapIndexOrState", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var positionField = typeof(Thing).GetField("positionInt", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + if (mapField != null && positionField != null) + { + mapField.SetValue(portalAdapter, mapField.GetValue(ParentShuttle)); + positionField.SetValue(portalAdapter, positionField.GetValue(ParentShuttle)); + } + } + catch (System.Exception ex) + { + Log.Warning($"[WULA] Could not set adapter map/position via reflection: {ex.Message}"); + } + } } - return targetMap; } /// - /// 获取目标位置(在口袋空间中的位置),模仿原版MapPortal.GetDestinationLocation - /// - public IntVec3 GetDestinationLocation() - { - // 如果没有目标位置,使用口袋地图中心 - if (targetPos == IntVec3.Invalid && targetMap != null) - { - targetPos = targetMap.Center; - } - return targetPos; - } - - /// - /// 检查是否可以进入口袋空间,模仿原版MapPortal.IsEnterable + /// 检查穿梭机是否可以进入(仅作为入口功能) /// public bool IsEnterable(out string reason) { @@ -122,27 +81,22 @@ namespace WulaFallenEmpire return false; } - // 检查父穿梭机的传送状态 - if (ParentShuttle != null) + // 检查穿梭机的传送状态 + var transportDisabledField = typeof(Building_ArmedShuttleWithPocket).GetField("transportDisabled", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + if (transportDisabledField != 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) { - bool transportDisabled = (bool)transportDisabledField.GetValue(ParentShuttle); - if (transportDisabled) - { - reason = "WULA.PocketSpace.TransportDisabled".Translate(); - return false; - } + reason = "WULA.PocketSpace.TransportDisabled".Translate(); + return false; } } - // 检查目标地图是否存在 - Map pocketMap = GetOtherMap(); - if (pocketMap == null) + // 检查口袋地图是否存在 + if (ParentShuttle.PocketMap == null) { reason = "WULA.PocketSpace.NoTargetMap".Translate(); return false; @@ -151,177 +105,80 @@ namespace WulaFallenEmpire reason = ""; return true; } + /// - /// 处理进入事件,将Pawn传送到口袋空间,模仿原版MapPortal.OnEntered + /// 获取组件额外的Gizmo按钮(根据口袋空间初始化状态显示不同按钮) + /// 重写CompGetGizmosExtra方法,这样RimWorld会自动调用并显示按钮 /// - public void OnEntered(Pawn pawn) + public override IEnumerable CompGetGizmosExtra() { - Map pocketMap = GetOtherMap(); - if (pocketMap == null || !pawn.Spawned) return; - - try + if (ParentShuttle == null) yield break; + + // 检查口袋空间是否已初始化 + bool pocketMapExists = ParentShuttle.PocketMap != null; + + if (!pocketMapExists) { - // 在口袋地图找一个安全位置 - IntVec3 spawnPos = GetDestinationLocation(); - if (spawnPos == IntVec3.Invalid) + // 口袋空间未创建,显示初始化按钮 + Command_Action initializeCommand = new Command_Action(); + initializeCommand.action = delegate { - spawnPos = pocketMap.Center; + // 创建口袋空间 + InitializePocketSpace(); + }; + initializeCommand.icon = ContentFinder.Get("UI/Commands/LoadTransporter"); + initializeCommand.defaultLabel = "WULA.PocketSpace.Initialize".Translate(); + initializeCommand.defaultDesc = "WULA.PocketSpace.InitializeDesc".Translate(); + + // 检查是否可以初始化 + if (!ParentShuttle.Spawned) + { + initializeCommand.Disabled = true; + initializeCommand.disabledReason = "WULA.PocketSpace.NotSpawned".Translate(); } - // 寻找可行走的位置 - spawnPos = CellFinder.RandomClosewalkCellNear(spawnPos, pocketMap, 10, - p => p.Standable(pocketMap) && !p.GetThingList(pocketMap).Any(t => t is Pawn)); - - if (spawnPos.IsValid) - { - // 传送人员到口袋空间 - pawn.DeSpawn(); - GenPlace.TryPlaceThing(pawn, spawnPos, pocketMap, ThingPlaceMode.Near); - - // 通知父穿梭机有物品被添加 - if (ParentShuttle != null) - { - ParentShuttle.Notify_ThingAdded(pawn); - } - - // 如果是玩家控制的殖民者,切换到口袋地图 - if (pawn.IsColonistPlayerControlled) - { - Current.Game.CurrentMap = pocketMap; - Find.CameraDriver.JumpToCurrentMapLoc(spawnPos); - } - - Messages.Message("WULA.PocketSpace.TransferSuccess".Translate(1), MessageTypeDefOf.PositiveEvent); - Log.Message($"[WULA] Transferred {pawn.LabelShort} to pocket space at {spawnPos}"); - } - else - { - Log.Error($"[WULA] Could not find valid spawn position in pocket space for {pawn.LabelShort}"); - } + yield return initializeCommand; } - catch (System.Exception ex) + else { - Log.Error($"[WULA] Error entering pocket space: {ex}"); - } - } - - /// - /// 处理从口袋空间退出到主地图的逻辑 - /// - public void ExitPocketSpace(Pawn pawn) - { - if (ParentShuttle == null || !ParentShuttle.Spawned || !pawn.Spawned) return; - - try - { - // 在主地图找一个安全位置(穿梭机附近) - IntVec3 exitPos = CellFinder.RandomClosewalkCellNear(ParentShuttle.Position, ParentShuttle.Map, 3, - p => p.Standable(ParentShuttle.Map) && !p.GetThingList(ParentShuttle.Map).Any(t => t is Pawn)); + // 穿梭机已创建,显示装载按钮(使用原版Dialog_EnterPortal) + Command_Action enterCommand = new Command_Action(); + enterCommand.action = delegate + { + // 使用和Building_PocketMapExit一模一样的Dialog_EnterPortal方法 + if (portalAdapter != null && portalAdapter.shuttle != null) + { + var dialog = new Dialog_EnterPortal(portalAdapter); + Find.WindowStack.Add(dialog); + } + else + { + Log.Error("[WULA] Portal adapter or shuttle is null, recreating adapter"); + // 重新创建适配器 + if (ParentShuttle != null) + { + portalAdapter = new ShuttlePortalAdapter(ParentShuttle); + var dialog = new Dialog_EnterPortal(portalAdapter); + Find.WindowStack.Add(dialog); + } + else + { + Messages.Message("内部错误:穿梭机引用丢失", ParentShuttle, MessageTypeDefOf.RejectInput); + } + } + }; + enterCommand.icon = ContentFinder.Get(Props.buttonIconPath); + enterCommand.defaultLabel = Props.enterButtonTextKey.Translate() + "..."; + enterCommand.defaultDesc = Props.enterButtonDescKey.Translate(); - if (exitPos.IsValid) - { - // 传送人员回主地图 - pawn.DeSpawn(); - GenPlace.TryPlaceThing(pawn, exitPos, ParentShuttle.Map, ThingPlaceMode.Near); - - // 如果是玩家控制的殖民者,切换到主地图 - if (pawn.IsColonistPlayerControlled) - { - Current.Game.CurrentMap = ParentShuttle.Map; - Find.CameraDriver.JumpToCurrentMapLoc(exitPos); - } - - Messages.Message("WULA.PocketSpace.ExitSuccess".Translate(pawn.LabelShort), MessageTypeDefOf.PositiveEvent); - Log.Message($"[WULA] {pawn.LabelShort} exited pocket space to main map at {exitPos}"); - } - else - { - Log.Error($"[WULA] Could not find valid exit position for {pawn.LabelShort}"); - } - } - catch (System.Exception ex) - { - Log.Error($"[WULA] Error exiting pocket space: {ex}"); - } - } - - /// - /// 获取Gizmo按钮(进入口袋空间按钮) - /// - public IEnumerable GetGizmos() - { - if (ParentShuttle == null || !ParentShuttle.AllowDirectAccess) yield break; - - // 进入口袋空间按钮 - Command_Action enterCommand = new Command_Action(); - enterCommand.action = delegate - { - // 使用穿梭机的殖民者选择对话框 - if (ParentShuttle != null) - { - // 获取所有可用的殖民者 - List availablePawns = ParentShuttle.Map.mapPawns.AllPawnsSpawned - .Where(p => p.IsColonist && !p.Downed && p.CanReach(ParentShuttle, PathEndMode.Touch, Danger.Deadly)) - .ToList(); - - if (availablePawns.Count == 0) - { - Messages.Message("WULA.PocketSpace.NoPawnsAvailable".Translate(), ParentShuttle, MessageTypeDefOf.RejectInput); - return; - } - - // 创建选项列表 - List options = new List(); - - // 添加单个殖民者选项 - foreach (Pawn pawn in availablePawns) - { - FloatMenuOption option = new FloatMenuOption( - $"{pawn.LabelShort}", - delegate - { - OnEntered(pawn); - } - ); - options.Add(option); - } - - // 添加"全部殖民者"选项 - if (availablePawns.Count > 1) - { - FloatMenuOption allOption = new FloatMenuOption( - "WULA.PocketSpace.AllColonists".Translate(availablePawns.Count), - delegate - { - foreach (Pawn pawn in availablePawns) - { - OnEntered(pawn); - } - } - ); - options.Add(allOption); - } - - // 显示浮动菜单 - FloatMenu floatMenu = new FloatMenu(options); - Find.WindowStack.Add(floatMenu); - } - }; - enterCommand.icon = ContentFinder.Get("UI/Commands/LoadTransporter"); - enterCommand.defaultLabel = "WULA.PocketSpace.Enter".Translate() + "..."; - enterCommand.defaultDesc = "WULA.PocketSpace.EnterDesc".Translate(); - - // 检查是否可以进入 - string reason; - enterCommand.Disabled = !IsEnterable(out reason); - enterCommand.disabledReason = reason; - yield return enterCommand; - - // 查看口袋地图按钮 - Map pocketMap = GetOtherMap(); - if (pocketMap != null) - { + // 检查是否可以进入 + string reason; + enterCommand.Disabled = !IsEnterable(out reason); + enterCommand.disabledReason = reason; + yield return enterCommand; + + // 查看口袋地图按钮 yield return new Command_Action { defaultLabel = "WULA.PocketSpace.SwitchTo".Translate(), @@ -329,41 +186,55 @@ namespace WulaFallenEmpire icon = ContentFinder.Get("UI/Commands/ViewCave"), action = delegate { - Current.Game.CurrentMap = pocketMap; - Find.CameraDriver.JumpToCurrentMapLoc(GetDestinationLocation()); + Current.Game.CurrentMap = ParentShuttle.PocketMap; + Find.CameraDriver.JumpToCurrentMapLoc(ParentShuttle.PocketMap.Center); } }; } } /// - /// 获取检视字符串信息 + /// 初始化口袋空间 /// - public string GetInspectString() + private void InitializePocketSpace() { - if (ParentShuttle == null) return ""; - - List info = new List(); - - // 口袋空间状态 - if (targetMap != null) + if (ParentShuttle == null || !ParentShuttle.Spawned) { - info.Add("WULA.PocketSpace.Status".Translate() + ": " + "WULA.PocketSpace.Ready".Translate()); + Messages.Message("WULA.PocketSpace.CannotInitialize".Translate(), ParentShuttle, MessageTypeDefOf.RejectInput); + return; + } + + if (ParentShuttle.PocketMap != null) + { + Messages.Message("WULA.PocketSpace.AlreadyInitialized".Translate(), ParentShuttle, MessageTypeDefOf.RejectInput); + return; + } + + try + { + Log.Message("[WULA] Starting pocket space initialization via component"); - // 显示口袋空间中的人员数量 - int pawnCount = targetMap.mapPawns.AllPawnsSpawned.Where(p => p.IsColonist).Count(); - if (pawnCount > 0) + // 使用穿梭机的SwitchToPocketSpace方法,它会自动创建口袋空间 + ParentShuttle.SwitchToPocketSpace(); + + if (ParentShuttle.PocketMap != null) { - info.Add("WULA.PocketSpace.PawnCount".Translate(pawnCount)); + Messages.Message("WULA.PocketSpace.InitializeSuccess".Translate(), ParentShuttle, MessageTypeDefOf.PositiveEvent); + Log.Message("[WULA] Pocket space initialization completed successfully"); + } + else + { + Messages.Message("WULA.PocketSpace.InitializeFailed".Translate(), ParentShuttle, MessageTypeDefOf.RejectInput); + Log.Error("[WULA] Pocket space initialization failed"); } } - else + catch (System.Exception ex) { - info.Add("WULA.PocketSpace.Status".Translate() + ": " + "WULA.PocketSpace.NotGenerated".Translate()); + Log.Error($"[WULA] Error during pocket space initialization: {ex}"); + Messages.Message("WULA.PocketSpace.InitializeFailed".Translate(), ParentShuttle, MessageTypeDefOf.RejectInput); } - - return string.Join("\n", info); } + } /// @@ -371,9 +242,138 @@ namespace WulaFallenEmpire /// public class CompProperties_PocketMapPortal : CompProperties { + /// 进入按钮文本键 + public string enterButtonTextKey = "WULA.PocketSpace.Enter"; + + /// 进入按钮描述键 + public string enterButtonDescKey = "WULA.PocketSpace.EnterDesc"; + + /// 按钮图标路径 + public string buttonIconPath = "UI/Commands/LoadTransporter"; + public CompProperties_PocketMapPortal() { this.compClass = typeof(CompPocketMapPortal); } } + + /// + /// MapPortal适配器类,将Building_ArmedShuttleWithPocket适配为MapPortal接口 + /// 完全模仿Building_PocketMapExit的实现方式 + /// + public class ShuttlePortalAdapter : MapPortal + { + /// 关联的穿梭机 + public Building_ArmedShuttleWithPocket shuttle; + + /// + /// 默认构造函数(RimWorld组件系统要求) + /// + public ShuttlePortalAdapter() + { + // 为空,在PostSpawnSetup中初始化 + } + + public ShuttlePortalAdapter(Building_ArmedShuttleWithPocket shuttle) + { + this.shuttle = shuttle; + } + + /// + /// 重写获取其他地图,返回口袋空间(模仿Building_PocketMapExit.GetOtherMap) + /// + public override Map GetOtherMap() + { + if (shuttle?.PocketMap == null) + { + // 如果口袋空间还没创建,先创建它 + shuttle?.SwitchToPocketSpace(); + } + return shuttle?.PocketMap; + } + + /// + /// 重写获取目标位置,返回口袋空间中心(模仿Building_PocketMapExit.GetDestinationLocation) + /// + public override IntVec3 GetDestinationLocation() + { + return shuttle?.PocketMap?.Center ?? IntVec3.Invalid; + } + + /// + /// 重写是否可进入,检查穿梭机状态(模仿Building_PocketMapExit.IsEnterable) + /// + public override bool IsEnterable(out string reason) + { + if (shuttle == null || !shuttle.Spawned) + { + reason = "WULA.PocketSpace.NotSpawned".Translate(); + return false; + } + + if (!shuttle.AllowDirectAccess) + { + reason = "WULA.PocketSpace.AccessDenied".Translate(); + return false; + } + + // 检查穿梭机的传送状态 + var transportDisabledField = typeof(Building_ArmedShuttleWithPocket).GetField("transportDisabled", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + if (transportDisabledField != null) + { + bool transportDisabled = (bool)transportDisabledField.GetValue(shuttle); + if (transportDisabled) + { + reason = "WULA.PocketSpace.TransportDisabled".Translate(); + return false; + } + } + + reason = ""; + return true; + } + + /// + /// 重写进入事件,处理进入口袋空间(模仿Building_PocketMapExit.OnEntered) + /// + public override void OnEntered(Pawn pawn) + { + // 通知穿梭机有物品被添加(用于统计和管理) + shuttle?.Notify_ThingAdded(pawn); + + // 播放传送音效(如果存在) + if (Find.CurrentMap == shuttle?.Map) + { + // 可以在这里添加音效播放 + // def.portal?.traverseSound?.PlayOneShot(this); + } + } + + /// + /// 重写进入按钮文本 + /// + public override string EnterString => "WULA.PocketSpace.Enter".Translate(); + + /// + /// 重写进入按钮图标,使用装载按钮的贴图 + /// + protected override Texture2D EnterTex => ContentFinder.Get("UI/Commands/LoadTransporter"); + + /// + /// 获取地图引用(用于Dialog_EnterPortal) + /// + public new Map Map => shuttle?.Map; + + /// + /// 获取位置引用(用于Dialog_EnterPortal) + /// + public new IntVec3 Position => shuttle?.Position ?? IntVec3.Invalid; + + /// + /// 获取定义引用(用于Dialog_EnterPortal) + /// + public new ThingDef def => shuttle?.def; + } } \ No newline at end of file