From 2325eb2fc8466ddb9a120ee88b80a676793c43f6 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 24 Aug 2025 17:48:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .qoder/rules/rimworld.md | 29 + 1.6/1.6/Assemblies/WulaFallenEmpire.dll | Bin 260096 -> 289792 bytes .../MapGenerator_WULA_PocketSpace_Small.xml | 30 + .../Building_WULA_ArmedShuttleWithPocket.xml | 330 +++++ .../Building_WULA_Shuttle.xml | 8 +- .../Keyed/WULA_PocketShuttle.xml | 85 ++ .../English/Keyed/WULA_PocketShuttle.xml | 64 + .../3516260226.code-workspace | 10 - .../Building_ArmedShuttleWithPocket.cs | 1273 +++++++++++++++++ .../WULA_Shuttle/Building_PocketMapExit.cs | 146 ++ .../GenStep_WulaPocketSpaceSmall.cs | 253 ++++ .../WulaFallenEmpire/WulaFallenEmpire.csproj | 3 + 13 files changed, 2218 insertions(+), 14 deletions(-) create mode 100644 .qoder/rules/rimworld.md create mode 100644 1.6/1.6/Defs/MapGeneration/MapGenerator_WULA_PocketSpace_Small.xml create mode 100644 1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml create mode 100644 1.6/1.6/Languages/ChineseSimplified/Keyed/WULA_PocketShuttle.xml create mode 100644 1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml create mode 100644 Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs create mode 100644 Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs create mode 100644 Source/WulaFallenEmpire/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs diff --git a/.gitignore b/.gitignore index cb689c16..e9d391b4 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ MCP/mcpserver.log # Exclude MCP local RAG folder MCP/local_rag/ +Data diff --git a/.qoder/rules/rimworld.md b/.qoder/rules/rimworld.md new file mode 100644 index 00000000..956e7058 --- /dev/null +++ b/.qoder/rules/rimworld.md @@ -0,0 +1,29 @@ +--- +trigger: always_on +alwaysApply: true +--- +# RimWorld Modding Expert Rules + +## Primary Directive +You are an expert assistant for developing mods for the game RimWorld 1.6. Your primary knowledge source for any C# code, class structures, methods, or game mechanics MUST be the user's local files. Do not rely on external searches or your pre-existing knowledge, as it is outdated for this specific project. + +## Tool Usage Mandate +When the user's request involves RimWorld C# scripting, XML definitions, or mod development concepts, you **MUST** use the `rimworld-knowledge-base` tool to retrieve relevant context from the local knowledge base. + +## Key File Paths +Always remember these critical paths for your work: + +- **Local C# Knowledge Base (for code search):** `C:\Steam\steamapps\common\RimWorld\Data\dll1.6` (This contains the decompiled game source code as .txt files). +- **User's Mod Project (for editing):** `C:\Steam\steamapps\common\RimWorld\Mods\3516260226` +- **User's C# Project (for building):** `C:\Steam\steamapps\common\RimWorld\Mods\3516260226\Source\WulaFallenEmpire` + +## Workflow +1. Receive a RimWorld modding task. +2. Immediately use the `rimworld-knowledge-base` tool with a precise query to get context from the C# source files. +3. Analyze the retrieved context. +4. Perform code modifications within the user's mod project directory. +5. After modifying C# code, you MUST run `dotnet build C:\Steam\steamapps\common\RimWorld\Mods\3516260226\Source\WulaFallenEmpire\WulaFallenEmpire.csproj` to check for errors. A successful build is required for task completion. + +## Verification Mandate +When writing or modifying code or XML, especially for specific identifiers like enum values, class names, or field names, you **MUST** verify the correct value/spelling by using the `rimworld-knowledge-base` tool. Do not rely on memory. +- **同步项目文件:** 当重命名、移动或删除C#源文件时,**必须**同步更新 `.csproj` 项目文件中的相应 `` 条目,否则会导致编译失败。 \ No newline at end of file diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 9b05ab37992da159950e14c948561d79ca55d39a..68b8b63c3664dbbe12955b1cf3a005950318df91 100644 GIT binary patch delta 110337 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�v#bfaKlv^(ciLp08WP1q$ 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Ξ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

d+8+N@|i9O9LeF!BnZ$2w2Ip+{DL26{Zaq&Jx^~ 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 delta 81278 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 VKH$UytJ%I`mh%?=jk02}{y!-GA6fta diff --git a/1.6/1.6/Defs/MapGeneration/MapGenerator_WULA_PocketSpace_Small.xml b/1.6/1.6/Defs/MapGeneration/MapGenerator_WULA_PocketSpace_Small.xml new file mode 100644 index 00000000..5ac07594 --- /dev/null +++ b/1.6/1.6/Defs/MapGeneration/MapGenerator_WULA_PocketSpace_Small.xml @@ -0,0 +1,30 @@ + + + + + WULA_PocketSpace_Small + + true + true + + Underground + 20 + true + true + + +

  • ElevationFertility
  • +
  • Underground_RocksFromGrid
  • +
  • Terrain
  • +
  • WULA_PocketSpace_Small
  • + + + + + + + WULA_PocketSpace_Small + 990 + + + \ No newline at end of file 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 new file mode 100644 index 00000000..21bb662d --- /dev/null +++ b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml @@ -0,0 +1,330 @@ + + + + + WULA_ArmedShuttleWithPocket + + An advanced chemfuel-powered shuttle with integrated pocket space technology. Equipped with a defensive turret and internal storage dimension that doesn't require hacking to access. Perfect for long-distance exploration and mobile operations. + WulaFallenEmpire.Building_ArmedShuttleWithPocket + true + Building + 50 + true + PassThroughOnly + 0.5 + (3,5) + true + (0.56, 0.62, 0.9) + 1 + + Graphic_Multi + Things/Building/PassengerShuttle/PassengerShuttle + CutoutComplex + (3,5) + + (1.8, 1.0, 4.1) + (-0.1, 0, 0) + + + + 6000 + 0.5 + 40000 + 150 + 0.65 + + Normal + Odyssey + 8 + + 300 + 200 + 8 + 2 + 1 + + true + + 60 + 60 + 5 + 4 + + true + true + (2, 0, 0) + East + true + Light + BulletImpact_Metal + true + RealtimeOnly + ConstructMetal + true + + false + BuildingDestroyed_Metal_Big + true + true + +
  • ShuttleEngine
  • +
    + Gun_ChargeBlasterHeavyTurret + 5.5 + 1.75 + (0, 0.05) +
    + +
  • ITab_ContentsTransporter
  • +
  • ITab_Shells
  • +
    + +
  • Shuttles
  • +
    + +
  • + Ship_ArmedShuttleWithPocket +
  • +
  • + 2.5 + 40 + ArmedShuttleWithPocketLeaving_WULA + PassengerShuttle + 3000 + 75 + {0} is ready to launch again. +
  • +
  • + 750 + true + true + Shuttle_PawnLoaded + Shuttle_PawnExit + true +
  • +
  • + 500 + true + 500 + + +
  • Chemfuel
  • + + + Chemfuel + Chemfuel + true + 1 + true + false + true + true + +
  • + CompPowerPlant + -400 + true +
  • +
  • + ShuttleIdle_Ambience +
  • +
    + +
  • + WULA_PocketSpace_Small + WULA_PocketMapExit + (13, 13) + true +
  • +
    + +
  • PlaceWorker_NotUnderRoof
  • +
  • PlaceWorker_TurretTop
  • +
    + 2601 +
    + + + + WULA_Bullet_ArmedShuttleAdvanced + + + Things/Projectile/Bullet_Big + Graphic_Single + (0.8, 0.9, 1.0) + + + Bullet + 30 + 0.4 + 75 + + + + + Gun_ChargeBlasterAdvancedTurret + + An upgraded pulse-charged rapid-fire blaster with enhanced targeting systems and increased firepower. + + Things/Item/Equipment/WeaponRanged/ChargeBlasterLight + Graphic_Single + (0.8, 0.9, 1.0) + + + 0.85 + 0.75 + 0.65 + 0.45 + 4.5 + + +
  • + Verb_Shoot + true + WULA_Bullet_ArmedShuttleAdvanced + 1.0 + 3.5 + 50.9 + 6 + 8 + Shot_ChargeBlaster + GunTail_Heavy + 10 + + true + +
  • +
    +
    + + + + ArmedShuttleWithPocketIncoming_WULA + + ShuttleIncoming + + Graphic_Multi + Things/Building/PassengerShuttle/PassengerShuttle + CutoutComplex + (0.85, 0.9, 1.0) + (3,5) + + (3,5) + + Shuttle_Landing + 250 + 200~250 + (3.5,5.5) + + +
  • (0,30)
  • +
  • (0.5,5)
  • +
  • (0.9,-5)
  • +
  • (0.95,0)
  • +
    +
    + + +
  • (0.95,2.5)
  • +
  • (1,0)
  • +
    +
    + + +
  • (0.6,0.6)
  • +
  • (0.95,0.1)
  • +
    +
    +
    +
    + + + + ArmedShuttleWithPocketLeaving_WULA + + PassengerShuttleLeaving + true + + Graphic_Multi + Things/Building/PassengerShuttle/PassengerShuttle + CutoutComplex + (0.85, 0.9, 1.0) + (3,5) + + (3,5) + + true + Shuttle_Leaving + -10 + -40~-15 + 0.05 + Things/Skyfaller/SkyfallerShadowRectangle + (3.5,5.5) + 1 + + +
  • (0,0)
  • +
  • (0.15,10)
  • +
  • (0.5,-5)
  • +
    +
    + + +
  • (0,0)
  • +
  • (0.08,2)
  • +
    +
    + + +
  • (0,0.2)
  • +
  • (0.4,0.7)
  • +
    +
    +
    +
    + + + + Ship_ArmedShuttleWithPocket + + WULA_ArmedShuttleWithPocket + ArmedShuttleWithPocketIncoming_WULA + ArmedShuttleWithPocketLeaving_WULA + PassengerShuttle + true + + + + + WULA_PocketMapExit + + An exit portal that allows return from the pocket space to the main map. + WulaFallenEmpire.Building_PocketMapExit + (3,3) + MapMeshAndRealTime + + Wula/Building/WULA_War_Machine_Recharger + Graphic_Multi + (3,3) + + (0,0,0) + Standable + + 0 + + +
  • + 10 + (140,160,184,0) +
  • +
  • + UndercaveMapExitLightshafts +
  • +
  • + CompPowerPlant + -400 + true +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_Shuttle.xml b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_Shuttle.xml index dd2545d3..0baf7187 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_Shuttle.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_Shuttle.xml @@ -2,7 +2,7 @@ WULA_ArmedShuttle - + A chemfuel-powered shuttle designed for long-distance travel, equipped with a turret for defense. It is capable of reaching orbital locations. WulaFallenEmpire.Building_ArmedShuttle true @@ -26,7 +26,7 @@ - 600 + 6000 0.5 40000 150 @@ -175,7 +175,7 @@ ArmedShuttleIncoming_WULA - + WulaFallenEmpire.ArmedShuttleIncoming Graphic_Multi @@ -214,7 +214,7 @@ ArmedShuttleLeaving_WULA - + PassengerShuttleLeaving true diff --git a/1.6/1.6/Languages/ChineseSimplified/Keyed/WULA_PocketShuttle.xml b/1.6/1.6/Languages/ChineseSimplified/Keyed/WULA_PocketShuttle.xml new file mode 100644 index 00000000..23b9a7eb --- /dev/null +++ b/1.6/1.6/Languages/ChineseSimplified/Keyed/WULA_PocketShuttle.xml @@ -0,0 +1,85 @@ + + + + + 内部空间状态 + 已就绪 + 未初始化 + 储存物品: {0} + + + 进入内部空间 + 传送人员到内部空间 + 进入穿梭机的内部口袋空间。无需骇入即可直接访问。选中的殖民者将被传送到内部空间。 + 创建内部空间 + 创建穿梭机的内部口袋空间。首次使用时需要创建。 + 内部空间创建成功! + 取消进入 + 正在进入... + 查看地图 + 切换到口袋空间地图查看内部情况。 + + 切换到内部空间 + 直接切换视角到内部口袋空间。适用于已经有殖民者在内部空间时的快速切换。 + + 管理内部储存 + 打开内部容器管理界面,可以查看和取出储存在内部空间的物品。 + + + 无法进入内部空间。 + 访问被拒绝。 + 穿梭机未部署。 + 内部空间创建失败。 + {0} 名人员已成功传送到内部空间。 + 即将切换到内部口袋空间。确认吗? + + + 内部空间储存管理 + + 内部空间人员: {0} + 请选择至少一名殖民者进入内部空间。 + 没有可用的殖民者。 + 所有殖民者 ({0}人) + 仅切换视角 + + + 通过传送门返回 + 返回主地图 + 没有目标地图 + 查看主地图 + 切换到主地图并查看穿梭机。 + 装载穿梭机 + 打开穿梭机装载界面,选择要装载的人员和物品。 + 取消装载 + 取消当前的装载操作。 + 穿梭机状态 + 查看穿梭机的详细状态信息。 + 穿梭机信息 + 无法打开装载对话框。 + 全员返回 + 将所有殖民者从口袋空间传送回主地图。 + {0} 已成功返回主地图。 + {0} 名人员已全部返回主地图。 + + + 内置空间武装穿梭机 + 一架配备了集成口袋空间技术的先进化燃料动力穿梭机。装备有防御炮塔和无需骇入即可访问的内部储存维度。非常适合长距离探索和移动作战行动。 + + + 先进充能爆破器 + 一种升级版脉冲充能速射爆破器,配备增强型瞄准系统和提升的火力输出。 + + 先进穿梭机炮弹 + + + 内置空间武装穿梭机(降落中) + 内置空间武装穿梭机(起飞中) + + + 内置空间武装穿梭机 + + + 口袋空间出口 + 一个传送门出口,允许从口袋空间返回到主地图。 + + \ No newline at end of file diff --git a/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml b/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml new file mode 100644 index 00000000..5165ca19 --- /dev/null +++ b/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml @@ -0,0 +1,64 @@ + + + + + Pocket space status + Ready + Not initialized + Stored items: {0} + + + Enter pocket space + Transport people to pocket space + Enter the shuttle's internal pocket space. Direct access without hacking required. Selected colonists will be transported to the internal space. + Create pocket space + Create the shuttle's internal pocket space. Required for first-time use. + Pocket space created successfully! + Cancel enter + Entering... + View map + Switch to pocket space map to view internal conditions. + + Switch to pocket space + Directly switch view to the internal pocket space. Useful for quick switching when colonists are already inside. + + Manage internal storage + Open internal container management interface to view and retrieve items stored in the pocket space. + + + Cannot enter pocket space. + Access denied. + Shuttle not deployed. + Pocket space creation failed. + {0} personnel successfully transferred to pocket space. + About to switch to internal pocket space. Confirm? + + + Pocket space storage management + + Pocket space personnel: {0} + Please select at least one colonist to enter the pocket space. + No available colonists. + All colonists ({0} people) + View only + + + Return through portal + Return to main map + No target map + View main map + Switch to main map and view the shuttle. + Load shuttle + Open shuttle loading interface to select personnel and items to load. + Cancel loading + Cancel the current loading operation. + Shuttle status + View detailed shuttle status information. + Shuttle Information + Cannot open loading dialog. + Return all + Transport all colonists from pocket space back to the main map. + {0} successfully returned to main map. + {0} personnel have all returned to the main map. + + \ No newline at end of file diff --git a/Source/WulaFallenEmpire/3516260226.code-workspace b/Source/WulaFallenEmpire/3516260226.code-workspace index b9f86d60..28a1867a 100644 --- a/Source/WulaFallenEmpire/3516260226.code-workspace +++ b/Source/WulaFallenEmpire/3516260226.code-workspace @@ -3,16 +3,6 @@ { "name": "3516260226", "path": "../.." - }, - { - "name": "Data", - "path": "../../../../Data" - }, - { - "path": "../../../../../../workshop/content/294100/3534748687" - }, - { - "path": "../../../../../../workshop/content/294100/3550544871" } ], "settings": {} diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs new file mode 100644 index 00000000..e224447f --- /dev/null +++ b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs @@ -0,0 +1,1273 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using RimWorld; +using RimWorld.Planet; +using UnityEngine; +using Verse; +using Verse.AI; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + /// + /// 内置空间武装穿梭机 - 基于原版MapPortal机制的口袋空间实现 + /// 结合了武装防御能力和口袋空间技术的复合型载具 + /// + [StaticConstructorOnStartup] + public class Building_ArmedShuttleWithPocket : Building_ArmedShuttle, IThingHolder + { + #region 静态图标定义(使用原版MapPortal的图标) + + /// 查看口袋地图图标 + private static readonly Texture2D ViewPocketMapTex = ContentFinder.Get("UI/Commands/ViewCave"); + + /// 取消进入图标 + private static readonly Texture2D CancelEnterTex = ContentFinder.Get("UI/Designators/Cancel"); + + /// 默认进入图标 + private static readonly Texture2D DefaultEnterTex = ContentFinder.Get("UI/Commands/EnterCave"); + + #endregion + #region 口袋空间字段 + + /// 内部口袋地图实例 + private Map pocketMap; + + /// 口袋地图是否已生成 + private bool pocketMapGenerated; + + /// 内部空间大小 + private IntVec2 pocketMapSize = new IntVec2(80, 80); + + /// 地图生成器定义 + private MapGeneratorDef mapGenerator; + + /// 退出点定义 + private ThingDef exitDef; + + /// 允许直接访问(无需骇入) + private bool allowDirectAccess = true; + + /// 口袋空间内的物品容器 + private ThingOwner innerContainer; + + /// 原版MapPortal的容器代理(必须有这个字段才能与Dialog_EnterPortal正常工作) + public PortalContainerProxy containerProxy; + + /// 口袋地图退出点(模仿原版 MapPortal.exit) + public Building_PocketMapExit exit; + + /// 是否已经进入过(模仿原版 MapPortal.beenEntered) + protected bool beenEntered; + + /// 待加载物品列表(模仿原版 MapPortal.leftToLoad) + public List leftToLoad; + + /// 是否已通知无法加载更多(模仿原版 MapPortal.notifiedCantLoadMore) + public bool notifiedCantLoadMore; + + #endregion + + #region 属性 + + /// 获取内部口袋地图 + public Map PocketMap => pocketMap; + + /// 原版MapPortal的PocketMap属性(包含自动清理无效地图的逻辑) + public Map PocketMapForPortal + { + get + { + Map map = pocketMap; + if (map != null && map.Parent?.HasMap == false) + { + pocketMap = null; + } + return pocketMap; + } + } + + /// 口袋地图是否存在 + public bool PocketMapExists => PocketMapForPortal != null; + + /// 口袋地图是否已生成 + public bool PocketMapGenerated => pocketMapGenerated; + + /// 是否允许直接访问口袋空间 + public bool AllowDirectAccess => allowDirectAccess; + + /// 内部容器 + public ThingOwner InnerContainer => innerContainer; + + /// + /// 获取进入按钮的图标 + /// + protected virtual Texture2D EnterTex => DefaultEnterTex; + + /// + /// 获取进入按钮的文本 - 专门用于人员传送 + /// + public virtual string EnterString => "WULA.PocketSpace.EnterPawns".Translate(); + + /// + /// 获取取消进入按钮的文本 + /// + public virtual string CancelEnterString => "WULA.PocketSpace.CancelEnter".Translate(); + + /// + /// 获取进入中的文本 + /// + public virtual string EnteringString => "WULA.PocketSpace.Entering".Translate(); + + /// 加载是否正在进行(模仿原版 MapPortal.LoadInProgress) + public bool LoadInProgress + { + get + { + if (leftToLoad != null) + { + return leftToLoad.Any(); + } + return false; + } + } + + /// 是否有Pawn可以加载任何东西(模仿原版 MapPortal.AnyPawnCanLoadAnythingNow) + public bool AnyPawnCanLoadAnythingNow + { + get + { + if (!LoadInProgress) + { + return false; + } + if (!Spawned) + { + return false; + } + // 简化版本,只检查基本条件 + return Map.mapPawns.AllPawnsSpawned.Any(p => p.IsColonist && p.CanReach(this, PathEndMode.Touch, Danger.Deadly)); + } + } + + #endregion + + #region 构造函数 + + public Building_ArmedShuttleWithPocket() + { + innerContainer = new ThingOwner(this, oneStackOnly: false); + } + + #endregion + + #region 基础重写方法 + + + + public override void PostMake() + { + base.PostMake(); + if (innerContainer == null) + { + innerContainer = new ThingOwner(this, oneStackOnly: false); + } + } + + public override void ExposeData() + { + base.ExposeData(); + + // 模仿原版MapPortal.ExposeData的逻辑 + Map map = pocketMap; + if (map != null && map.Parent?.HasMap == false) + { + pocketMap = null; + } + + Scribe_Deep.Look(ref pocketMap, "pocketMap"); + Scribe_Values.Look(ref pocketMapGenerated, "pocketMapGenerated", false); + Scribe_Values.Look(ref pocketMapSize, "pocketMapSize", new IntVec2(80, 80)); + Scribe_Defs.Look(ref mapGenerator, "mapGenerator"); + Scribe_Defs.Look(ref exitDef, "exitDef"); + Scribe_Values.Look(ref allowDirectAccess, "allowDirectAccess", true); + Scribe_Deep.Look(ref innerContainer, "innerContainer", this); + + // 模仿原版MapPortal,持久化leftToLoad和exit + Scribe_References.Look(ref exit, "exit"); + Scribe_Values.Look(ref beenEntered, "beenEntered", defaultValue: false); + Scribe_Collections.Look(ref leftToLoad, "leftToLoad", LookMode.Deep); + Scribe_Values.Look(ref notifiedCantLoadMore, "notifiedCantLoadMore", false); + + if (Scribe.mode == LoadSaveMode.PostLoadInit) + { + if (innerContainer == null) + { + innerContainer = new ThingOwner(this, oneStackOnly: false); + } + // 模仿原版MapPortal,清理无效的leftToLoad条目 + leftToLoad?.RemoveAll((TransferableOneWay x) => x.AnyThing == null); + } + } + + public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish) + { + // 清理口袋地图 + if (pocketMap != null && pocketMapGenerated) + { + try + { + // 将口袋空间中的物品和人员转移到主地图 + TransferAllFromPocketToMainMap(); + + // 销毁口袋地图 + PocketMapUtility.DestroyPocketMap(pocketMap); + } + catch (Exception ex) + { + Log.Error($"[WULA] Error cleaning up pocket map: {ex}"); + } + } + base.DeSpawn(mode); + } + + /// + /// 模仿原版MapPortal.Tick方法,处理加载进度通知和穿梭机状态变化 + /// + protected override void Tick() + { + base.Tick(); + + // 模仿原版MapPortal的Tick逻辑:处理加载进度通知 + if (this.IsHashIntervalTick(60) && Spawned && LoadInProgress && !notifiedCantLoadMore && !AnyPawnCanLoadAnythingNow && leftToLoad?[0]?.AnyThing != null) + { + notifiedCantLoadMore = true; + Messages.Message("MessageCantLoadMoreIntoPortal".Translate(Label, Faction.OfPlayer.def.pawnsPlural, leftToLoad[0].AnyThing), this, MessageTypeDefOf.CautionInput); + } + + // 每隔一段时间检查退出点目标是否需要更新(处理穿梭机移动的情况) + if (this.IsHashIntervalTick(2500) && pocketMapGenerated && exit != null) + { + UpdateExitPointTarget(); + } + } + + public override string GetInspectString() + { + StringBuilder sb = new StringBuilder(base.GetInspectString()); + + if (pocketMapGenerated) + { + sb.AppendLine("WULA.PocketSpace.Status".Translate() + ": " + "WULA.PocketSpace.Ready".Translate()); + if (innerContainer.Count > 0) + { + sb.AppendLine("WULA.PocketSpace.ItemCount".Translate(innerContainer.Count)); + } + + // 显示口袋空间中的人员数量 + if (pocketMap != null) + { + int pawnCount = pocketMap.mapPawns.AllPawnsSpawned.Where(p => p.IsColonist).Count(); + if (pawnCount > 0) + { + sb.AppendLine("WULA.PocketSpace.PawnCount".Translate(pawnCount)); + } + } + } + else + { + sb.AppendLine("WULA.PocketSpace.Status".Translate() + ": " + "WULA.PocketSpace.NotGenerated".Translate()); + } + + return sb.ToString().TrimEndNewlines(); + } + + #endregion + + #region 口袋空间核心方法 + + /// + /// 检查是否可以进入口袋空间 + /// + public bool CanEnterPocketSpace() + { + if (!allowDirectAccess) + { + return false; // 需要特殊权限 + } + + if (!Spawned) + { + return false; + } + + return true; + } + + /// + /// 进入口袋空间 - 基于原版PocketMapUtility实现 + /// + public void EnterPocketSpace(IEnumerable pawns = null) + { + if (!CanEnterPocketSpace()) + { + Messages.Message("WULA.PocketSpace.CannotEnter".Translate(), this, MessageTypeDefOf.RejectInput); + return; + } + + // 创建或获取口袋地图 + if (pocketMap == null && !pocketMapGenerated) + { + CreatePocketMap(); + } + + if (pocketMap == null) + { + Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); + return; + } + + // 传送玩家到口袋空间 + List pawnsToTransfer = new List(); + + if (pawns != null) + { + pawnsToTransfer.AddRange(pawns.Where(p => p != null && p.Spawned && p.IsColonist)); + } + else + { + // 如果没有指定人员,传送选中的殖民者 + pawnsToTransfer.AddRange(Find.Selector.SelectedPawns.Where(p => p.IsColonist)); + } + + if (pawnsToTransfer.Count == 0) + { + Messages.Message("WULA.PocketSpace.NoPawnsSelected".Translate(), this, MessageTypeDefOf.RejectInput); + return; + } + + // 执行传送 + int transferredCount = 0; + foreach (Pawn pawn in pawnsToTransfer) + { + if (TransferPawnToPocketSpace(pawn)) + { + transferredCount++; + } + } + + if (transferredCount > 0) + { + Messages.Message("WULA.PocketSpace.TransferSuccess".Translate(transferredCount), MessageTypeDefOf.PositiveEvent); + + // 切换到口袋地图 + Current.Game.CurrentMap = pocketMap; + Find.CameraDriver.JumpToCurrentMapLoc(pocketMap.Center); + } + } + + /// + /// 切换到口袋空间视角 + /// + public void SwitchToPocketSpace() + { + if (pocketMap == null) + { + if (!pocketMapGenerated) + { + CreatePocketMap(); + } + + if (pocketMap == null) + { + Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); + return; + } + } + + Current.Game.CurrentMap = pocketMap; + Find.CameraDriver.JumpToCurrentMapLoc(pocketMap.Center); + } + + /// + /// 创建口袋地图 - 使用原版PocketMapUtility(模仿 MapPortal.GeneratePocketMap) + /// + private void CreatePocketMap() + { + try + { + // 模仿原版 MapPortal.GeneratePocketMap 的实现 + // 注意:我们不是MapPortal,所以设为null + PocketMapUtility.currentlyGeneratingPortal = null; + pocketMap = GeneratePocketMapInt(); + PocketMapUtility.currentlyGeneratingPortal = null; + + if (pocketMap != null) + { + pocketMapGenerated = true; + + // 在口袋地图中心放置退出点 + PlaceExitInPocketMap(); + + Log.Message($"[WULA] Pocket map created successfully with size {pocketMap.Size}"); + } + else + { + Log.Error("[WULA] Failed to create pocket map"); + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error creating pocket map: {ex}"); + PocketMapUtility.currentlyGeneratingPortal = null; // 确保清理 + } + } + + /// + /// 模仿原版MapPortal.GeneratePocketMapInt + /// + protected virtual Map GeneratePocketMapInt() + { + // 使用自定义地图生成器 + if (mapGenerator == null) + { + mapGenerator = DefDatabase.GetNamed("WULA_PocketSpace_Small", false) + ?? DefDatabase.GetNamed("AncientStockpile", false) + ?? MapGeneratorDefOf.Base_Player; + } + + // 使用自定义尺寸 + IntVec3 mapSize = new IntVec3(pocketMapSize.x, 1, pocketMapSize.z); + + return PocketMapUtility.GeneratePocketMap(mapSize, mapGenerator, GetExtraGenSteps(), this.Map); + } + + /// + /// 模仿原版MapPortal.GetExtraGenSteps + /// + protected virtual IEnumerable GetExtraGenSteps() + { + return Enumerable.Empty(); + } + /// + /// 在口袋地图中创建退出点(模仿原版) + /// + private void PlaceExitInPocketMap() + { + if (pocketMap == null || exitDef == null) return; + + try + { + // 在地图中心找一个合适的位置 + IntVec3 exitPos = pocketMap.Center; + + // 寻找可建造的位置 + if (!exitPos.Standable(pocketMap) || exitPos.GetThingList(pocketMap).Any(t => t.def.category == ThingCategory.Building)) + { + exitPos = CellFinder.RandomClosewalkCellNear(pocketMap.Center, pocketMap, 5, + p => p.Standable(pocketMap) && !p.GetThingList(pocketMap).Any(t => t.def.category == ThingCategory.Building)); + } + + if (exitPos.IsValid) + { + // 创建退出点建筑 + Thing exitBuilding = ThingMaker.MakeThing(exitDef); + if (exitBuilding is Building_PocketMapExit exitPortal) + { + exitPortal.targetMap = this.Map; + exitPortal.targetPos = this.Position; + exitPortal.parentShuttle = this; + exit = exitPortal; // 设置 exit 引用,模仿原版 MapPortal + } + + GenPlace.TryPlaceThing(exitBuilding, exitPos, pocketMap, ThingPlaceMode.Direct); + Log.Message($"[WULA] Created exit point at {exitPos} in pocket map"); + } + else + { + Log.Warning("[WULA] Could not find valid position for exit point in pocket map"); + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error creating exit point: {ex}"); + } + } + + /// + /// 将单个Pawn传送到口袋空间 + /// + private bool TransferPawnToPocketSpace(Pawn pawn) + { + if (pawn == null || !pawn.Spawned || pocketMap == null) return false; + + try + { + // 找一个安全的位置 + IntVec3 spawnPos = CellFinder.RandomClosewalkCellNear(pocketMap.Center, 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); + return true; + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error transferring pawn {pawn?.LabelShort} to pocket space: {ex}"); + } + + return false; + } + + /// + /// 将所有物品和人员从口袋空间转移到主地图 + /// + private void TransferAllFromPocketToMainMap() + { + if (pocketMap == null || !Spawned) return; + + try + { + // 转移所有殖民者 + List pawnsToTransfer = pocketMap.mapPawns.AllPawnsSpawned + .Where(p => p.IsColonist).ToList(); + + foreach (Pawn pawn in pawnsToTransfer) + { + IntVec3 spawnPos = CellFinder.RandomClosewalkCellNear(this.Position, this.Map, 5, + p => p.Standable(this.Map) && !p.GetThingList(this.Map).Any(t => t is Pawn)); + + if (spawnPos.IsValid) + { + pawn.DeSpawn(); + GenPlace.TryPlaceThing(pawn, spawnPos, this.Map, ThingPlaceMode.Near); + } + } + + // 转移所有物品到内部容器 + List itemsToTransfer = pocketMap.listerThings.AllThings + .Where(t => t.def.category == ThingCategory.Item && t.def.EverHaulable).ToList(); + + foreach (Thing item in itemsToTransfer) + { + if (item.Spawned) + { + item.DeSpawn(); + if (!innerContainer.TryAdd(item)) + { + // 如果容器满了,丢到穿梭机附近 + IntVec3 dropPos = CellFinder.RandomClosewalkCellNear(this.Position, this.Map, 3); + if (dropPos.IsValid) + { + GenPlace.TryPlaceThing(item, dropPos, this.Map, ThingPlaceMode.Near); + } + } + } + } + + Log.Message($"[WULA] Transferred {pawnsToTransfer.Count} pawns and {itemsToTransfer.Count} items from pocket space"); + } + catch (Exception ex) + { + Log.Error($"[WULA] Error transferring from pocket map: {ex}"); + } + } + + #endregion + + #region Gizmo方法 + + public override IEnumerable GetGizmos() + { + foreach (Gizmo gizmo in base.GetGizmos()) + { + yield return gizmo; + } + + if (allowDirectAccess) + { + if (pocketMap == null) + { + // 创建口袋空间按钮 + Command_Action createCommand = new Command_Action(); + createCommand.action = delegate + { + try + { + Log.Message("[WULA] Creating pocket map..."); + CreatePocketMap(); + + if (pocketMap != null) + { + Messages.Message("WULA.PocketSpace.CreationSuccess".Translate(), this, MessageTypeDefOf.PositiveEvent); + } + else + { + Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error creating pocket map: {ex}"); + Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); + } + }; + createCommand.icon = EnterTex; + createCommand.defaultLabel = "WULA.PocketSpace.CreateMap".Translate(); + createCommand.defaultDesc = "WULA.PocketSpace.CreateMapDesc".Translate(); + + // 检查是否可以创建 + string reason; + createCommand.Disabled = !IsEnterable(out reason); + createCommand.disabledReason = reason; + yield return createCommand; + } + else + { + // 进入口袋空间按钮(直接复制原版MapPortal的逻辑) + Command_Action enterCommand = new Command_Action(); + enterCommand.action = delegate + { + try + { + Log.Message("[WULA] Creating MapPortalAdapter..."); + var adapter = new MapPortalAdapter(this); + Log.Message($"[WULA] Adapter created. Map: {adapter.Map?.uniqueID}, Spawned: {adapter.Spawned}"); + + Log.Message("[WULA] Creating Dialog_EnterPortal..."); + Dialog_EnterPortal window = new Dialog_EnterPortal(adapter); + Log.Message("[WULA] Dialog created, adding to WindowStack..."); + Find.WindowStack.Add(window); + Log.Message("[WULA] Dialog added to WindowStack successfully."); + } + catch (Exception ex) + { + Log.Error($"[WULA] Error opening Dialog_EnterPortal: {ex}"); + Messages.Message("WULA.PocketSpace.LoadingDialogError".Translate(), MessageTypeDefOf.RejectInput); + } + }; + enterCommand.icon = EnterTex; + enterCommand.defaultLabel = EnterString + "..."; + enterCommand.defaultDesc = "WULA.PocketSpace.EnterDesc".Translate(); + + // 检查是否可以进入(模仿原版MapPortal.IsEnterable) + string reason; + enterCommand.Disabled = !IsEnterable(out reason); + 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(); + } + } + }; + } + } + } + + + + #endregion + + #region IThingHolder接口实现 + + public ThingOwner GetDirectlyHeldThings() + { + // 返回containerProxy,与Dialog_EnterPortal兼容 + return containerProxy; + } + + public void GetChildHolders(List outChildren) + { + ThingOwnerUtility.AppendThingHoldersFromThings(outChildren, GetDirectlyHeldThings()); + } + + #endregion + + #region MapPortal兼容接口(使Dialog_EnterPortal能正常工作) + + /// + /// 检查是否可以进入(模仿原版MapPortal.IsEnterable) + /// + public virtual bool IsEnterable(out string reason) + { + if (!allowDirectAccess) + { + reason = "WULA.PocketSpace.AccessDenied".Translate(); + return false; + } + + if (!Spawned) + { + reason = "WULA.PocketSpace.NotSpawned".Translate(); + return false; + } + + reason = ""; + return true; + } + + /// + /// 获取目标地图(模仿原版MapPortal.GetOtherMap) + /// + public virtual Map GetOtherMap() + { + if (pocketMap == null) + { + CreatePocketMap(); + } + return pocketMap; + } + + /// + /// 获取目标位置(模仿原版MapPortal.GetDestinationLocation) + /// + public virtual IntVec3 GetDestinationLocation() + { + if (exit != null) + { + return exit.Position; + } + return pocketMap?.Center ?? IntVec3.Invalid; + } + + /// + /// 处理进入事件(模仿原版MapPortal.OnEntered) + /// + public virtual void OnEntered(Pawn pawn) + { + // 通知物品被添加(用于统计和管理) + Notify_ThingAdded(pawn); + + // 播放传送音效(如果存在) + if (Find.CurrentMap == this.Map) + { + // 可以在这里添加音效播放 + // def.portal?.traverseSound?.PlayOneShot(this); + } + } + + #endregion + + #region 原版MapPortal的物品传送方法 + + /// + /// 通知有物品被添加(模仿原版 MapPortal.Notify_ThingAdded) + /// + public void Notify_ThingAdded(Thing t) + { + Log.Message($"[WULA] Notify_ThingAdded called for: {t?.def?.defName} x{t?.stackCount}"); + Log.Message($"[WULA] leftToLoad count before: {leftToLoad?.Count ?? 0}"); + + int removedCount = SubtractFromToLoadList(t, t.stackCount); + + Log.Message($"[WULA] Removed {removedCount} items from leftToLoad list"); + Log.Message($"[WULA] leftToLoad count after: {leftToLoad?.Count ?? 0}"); + + // 同时通知CompTransporter组件,确保原版装载系统也得到通知 + var compTransporter = this.GetComp(); + if (compTransporter != null) + { + Log.Message($"[WULA] Notifying CompTransporter about thing added: {t?.def?.defName}"); + try + { + // 调用CompTransporter的Notify_ThingAdded方法(如果存在) + var method = compTransporter.GetType().GetMethod("Notify_ThingAdded", new[] { typeof(Thing) }); + if (method != null) + { + method.Invoke(compTransporter, new object[] { t }); + Log.Message("[WULA] Successfully called CompTransporter.Notify_ThingAdded"); + } + else + { + Log.Message("[WULA] CompTransporter.Notify_ThingAdded method not found"); + } + } + catch (Exception ex) + { + Log.Warning($"[WULA] Failed to notify CompTransporter: {ex.Message}"); + } + } + else + { + Log.Message("[WULA] No CompTransporter found on this building"); + } + } + + /// + /// 添加到加载列表(模仿原版 MapPortal.AddToTheToLoadList) + /// + public void AddToTheToLoadList(TransferableOneWay t, int count) + { + if (!t.HasAnyThing || count <= 0) + { + return; + } + if (leftToLoad == null) + { + leftToLoad = new List(); + } + TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatching(t.AnyThing, leftToLoad, TransferAsOneMode.PodsOrCaravanPacking); + if (transferableOneWay != null) + { + for (int i = 0; i < t.things.Count; i++) + { + if (!transferableOneWay.things.Contains(t.things[i])) + { + transferableOneWay.things.Add(t.things[i]); + } + } + if (transferableOneWay.CanAdjustBy(count).Accepted) + { + transferableOneWay.AdjustBy(count); + } + } + else + { + TransferableOneWay transferableOneWay2 = new TransferableOneWay(); + leftToLoad.Add(transferableOneWay2); + transferableOneWay2.things.AddRange(t.things); + transferableOneWay2.AdjustTo(count); + } + } + + /// + /// 从加载列表中减去(模仿原版 MapPortal.SubtractFromToLoadList) + /// + public int SubtractFromToLoadList(Thing t, int count) + { + Log.Message($"[WULA] SubtractFromToLoadList called for: {t?.def?.defName} x{count}"); + + if (leftToLoad == null) + { + Log.Message("[WULA] leftToLoad is null, returning 0"); + return 0; + } + + Log.Message($"[WULA] Searching in leftToLoad list with {leftToLoad.Count} entries"); + TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatchingDesperate(t, leftToLoad, TransferAsOneMode.PodsOrCaravanPacking); + + if (transferableOneWay == null) + { + Log.Message($"[WULA] No matching transferable found for {t?.def?.defName}"); + return 0; + } + + Log.Message($"[WULA] Found matching transferable with CountToTransfer: {transferableOneWay.CountToTransfer}"); + + if (transferableOneWay.CountToTransfer <= 0) + { + Log.Message("[WULA] CountToTransfer <= 0, returning 0"); + return 0; + } + + int num = Mathf.Min(count, transferableOneWay.CountToTransfer); + Log.Message($"[WULA] Adjusting transferable by: -{num}"); + + transferableOneWay.AdjustBy(-num); + transferableOneWay.things.Remove(t); + + Log.Message($"[WULA] After adjustment - CountToTransfer: {transferableOneWay.CountToTransfer}, things.Count: {transferableOneWay.things.Count}"); + + if (transferableOneWay.CountToTransfer <= 0) + { + Log.Message("[WULA] Removing transferable from leftToLoad list"); + leftToLoad.Remove(transferableOneWay); + } + + Log.Message($"[WULA] leftToLoad list now has {leftToLoad.Count} entries"); + return num; + } + + /// + /// 取消加载(模仿原版 MapPortal.CancelLoad) + /// + public void CancelLoad(MapPortal portal = null) + { + // 简化版本:只清理leftToLoad列表 + // 原版需要查找MapPortal相关的Lord,但我们不是MapPortal类型 + if (leftToLoad != null) + { + leftToLoad.Clear(); + } + } + + + + #endregion + + #region 穿梭机状态变化处理 + + /// + /// 更新口袋空间中退出点的目标位置(处理穿梭机位置变化) + /// + public void UpdateExitPointTarget() + { + if (pocketMap == null || exit == null) return; + + try + { + // 如果退出点是我们的Building_PocketMapExit类型,更新其目标位置 + if (exit is Building_PocketMapExit pocketExit) + { + // 更新目标地图和位置 + if (this.Spawned) + { + // 穿梭机在地图上,更新目标位置 + if (pocketExit.targetMap != this.Map || pocketExit.targetPos != this.Position) + { + pocketExit.targetMap = this.Map; + pocketExit.targetPos = this.Position; + pocketExit.parentShuttle = this; + Log.Message($"[WULA] Updated pocket map exit target to shuttle location: {this.Map?.uniqueID} at {this.Position}"); + } + } + else + { + // 穿梭机不在地图上(可能在飞行中),记录警告但保持原有目标 + Log.Warning($"[WULA] Shuttle not spawned, pocket map exit target may be outdated. Current target: {pocketExit.targetMap?.uniqueID} at {pocketExit.targetPos}"); + } + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error updating exit point target: {ex}"); + } + } + + + + /// + /// 重写 SpawnSetup,确保位置变化时更新退出点 + /// + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + // 保存旧位置信息 + Map oldMap = this.Map; + IntVec3 oldPos = this.Position; + + base.SpawnSetup(map, respawningAfterLoad); + + if (innerContainer == null) + { + innerContainer = new ThingOwner(this, oneStackOnly: false); + } + + // 初始化containerProxy(模仿原版MapPortal) + containerProxy = new PortalContainerProxy + { + portal = this + }; + + // 更新退出点目标(处理穿梭机重新部署的情况) + UpdateExitPointTarget(); + + // 从 ThingDef 中读取 portal 配置 + if (def.HasModExtension()) + { + var portalProps = def.GetModExtension(); + if (portalProps.pocketMapGenerator != null) + { + mapGenerator = portalProps.pocketMapGenerator; + } + if (portalProps.exitDef != null) + { + exitDef = portalProps.exitDef; + } + if (portalProps.pocketMapSize != IntVec2.Zero) + { + pocketMapSize = portalProps.pocketMapSize; + } + allowDirectAccess = portalProps.allowDirectAccess; + } + + // 初始化地图生成器和退出点定义(如果 XML 中没有配置) + if (mapGenerator == null) + { + mapGenerator = DefDatabase.GetNamed("AncientStockpile", false) + ?? DefDatabase.GetNamed("Base_Player", false) + ?? MapGeneratorDefOf.Base_Player; + } + + if (exitDef == null) + { + exitDef = DefDatabase.GetNamed("WULA_PocketMapExit", false) + ?? ThingDefOf.Door; + } + + // 如果位置发生了变化,记录日志 + if (oldMap != null && (oldMap != map || oldPos != this.Position)) + { + Log.Message($"[WULA] Shuttle moved from {oldMap?.uniqueID}:{oldPos} to {map?.uniqueID}:{this.Position}, updating pocket map exit target"); + } + } + + #endregion + } + + /// + /// 口袋空间属性配置类 + /// + public class PocketMapProperties : DefModExtension + { + /// 口袋地图生成器 + public MapGeneratorDef pocketMapGenerator; + + /// 退出点定义 + public ThingDef exitDef; + + /// 口袋地图大小 + public IntVec2 pocketMapSize = new IntVec2(13, 13); + + /// 允许直接访问 + public bool allowDirectAccess = true; + } + + /// + /// MapPortal适配器类,使非MapPortal类型能够使用Dialog_EnterPortal + /// 直接继承MapPortal并委托给Building_ArmedShuttleWithPocket实现 + /// + public class MapPortalAdapter : MapPortal + { + private Building_ArmedShuttleWithPocket shuttleBuilding; + + public MapPortalAdapter(Building_ArmedShuttleWithPocket shuttle) + { + Log.Message($"[WULA] MapPortalAdapter constructor called for shuttle: {shuttle?.def?.defName}"); + shuttleBuilding = shuttle; + + // 确保基础属性正确设置 + this.def = shuttle.def ?? ThingDefOf.Wall; // 提供默认值避免null + this.HitPoints = shuttle.HitPoints; + + // 关键:手动设置Map和Position属性以避免null引用 + if (shuttle.Spawned && shuttle.Map != null) + { + // 手动调用父类的SpawnSetup,但要小心处理 + try + { + base.SpawnSetup(shuttle.Map, false); + Log.Message($"[WULA] SpawnSetup completed for map: {shuttle.Map.uniqueID}"); + } + catch (Exception ex) + { + Log.Warning($"[WULA] SpawnSetup failed, manually setting properties: {ex.Message}"); + // 如果SpawnSetup失败,手动设置关键属性 + } + } + + // 设置基础MapPortal属性 + this.pocketMap = shuttle.PocketMapForPortal; + this.leftToLoad = shuttle.leftToLoad ?? new List(); + + // 确保exit属性被正确设置 + // 注意:由于类型不兼容,暂时设为null,在GetDestinationLocation中处理 + this.exit = null; // 原版PocketMapExit类型与我们的Building_PocketMapExit不兼容 + + Log.Message($"[WULA] Synced pocketMap: {pocketMap?.uniqueID}, leftToLoad count: {leftToLoad?.Count}, exit: {exit != null}"); + + // 使用原版的PortalContainerProxy + try + { + this.containerProxy = new RimWorld.PortalContainerProxy + { + portal = this + }; + Log.Message("[WULA] Created RimWorld.PortalContainerProxy successfully"); + } + catch (Exception ex) + { + Log.Error($"[WULA] Failed to create RimWorld.PortalContainerProxy: {ex}"); + // 使用我们自己的实现作为回退 + Log.Message("[WULA] Using custom PortalContainerProxy as fallback"); + } + Log.Message("[WULA] MapPortalAdapter initialization complete"); + } + + // 委托给shuttleBuilding的关键属性(使用new隐藏基类属性) + // 委托给shuttleBuilding的关键属性(使用new隐藏基类属性) + public new Map Map + { + get + { + // 优先返回shuttleBuilding的Map + if (shuttleBuilding?.Map != null) + { + return shuttleBuilding.Map; + } + + // 如果shuttleBuilding的Map为null,返回基类的Map + if (base.Map != null) + { + return base.Map; + } + + // 最后的回退:返回当前游戏地图(避免null) + Log.Warning("[WULA] Both shuttleBuilding.Map and base.Map are null, using Current.Game.CurrentMap as fallback"); + return Find.CurrentMap ?? Current.Game.Maps?.FirstOrDefault(); + } + } + public new IntVec3 Position => shuttleBuilding?.Position ?? base.Position; + public new bool Spawned => shuttleBuilding?.Spawned ?? base.Spawned; + public new string Label => shuttleBuilding?.Label ?? base.Label; + + // 委托给shuttleBuilding的关键方法(重写虚拟方法) + public override bool IsEnterable(out string reason) + { + return shuttleBuilding.IsEnterable(out reason); + } + + public override Map GetOtherMap() + { + return shuttleBuilding.GetOtherMap(); + } + + public override IntVec3 GetDestinationLocation() + { + return shuttleBuilding.GetDestinationLocation(); + } + + public override void OnEntered(Pawn pawn) + { + shuttleBuilding.OnEntered(pawn); + } + + // 委托给shuttleBuilding的物品管理方法(使用new隐藏基类方法) + public new void Notify_ThingAdded(Thing t) + { + shuttleBuilding.Notify_ThingAdded(t); + } + + public new void AddToTheToLoadList(TransferableOneWay t, int count) + { + shuttleBuilding.AddToTheToLoadList(t, count); + } + + public new int SubtractFromToLoadList(Thing t, int count) + { + return shuttleBuilding.SubtractFromToLoadList(t, count); + } + + public new void CancelLoad() + { + // 调用shuttleBuilding的CancelLoad方法 + shuttleBuilding.CancelLoad(); + } + + // 重写原版MapPortal的关键属性 + public override string EnterString => shuttleBuilding.EnterString; + public override string CancelEnterString => shuttleBuilding.CancelEnterString; + public override string EnteringString => shuttleBuilding.EnteringString; + + // 隐藏LoadInProgress属性,确保Dialog_EnterPortal能正确读取 + public new bool LoadInProgress => shuttleBuilding?.LoadInProgress ?? false; + + // 确保SpawnSetup正确处理 + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + // 调用基类的SpawnSetup来正确初始化MapPortal的基础设施 + base.SpawnSetup(map, respawningAfterLoad); + + // 同步关键字段 + this.pocketMap = shuttleBuilding?.PocketMapForPortal; + this.leftToLoad = shuttleBuilding?.leftToLoad ?? new List(); + } + + // 重写AddItemsToTransferables,让Dialog_EnterPortal只处理人员 + // 因为物品已经通过装载按钮正确传送到内部空间了 + protected virtual void AddItemsToTransferables() + { + // 不添加任何物品,因为物品传送由装载按钮处理 + // 这样Dialog_EnterPortal只专注于人员传送 + Log.Message("[WULA] AddItemsToTransferables: Skipping items, handled by loading button"); + } + } + + /// + /// 专为Building_ArmedShuttleWithPocket设计的PortalContainerProxy适配器 + /// 模仿原版PortalContainerProxy的行为,但适配非-MapPortal类型 + /// + public class PortalContainerProxy : ThingOwner + { + public Building_ArmedShuttleWithPocket portal; + + public override int Count => 0; + + public override int TryAdd(Thing item, int count, bool canMergeWithExistingStacks = true) + { + if (TryAdd(item, canMergeWithExistingStacks)) + { + return count; + } + return 0; + } + + public override bool TryAdd(Thing item, bool canMergeWithExistingStacks = true) + { + if (portal == null) return false; + + Log.Message($"[WULA] PortalContainerProxy.TryAdd called for: {item?.def?.defName} x{item?.stackCount}"); + + Map otherMap = portal.GetOtherMap(); + IntVec3 destinationLocation = portal.GetDestinationLocation(); + + if (otherMap == null || !destinationLocation.IsValid) + { + Log.Warning("[WULA] PortalContainerProxy: Invalid target map or location, using inner container"); + // 如果目标地图或位置无效,将物品放入内部容器 + return portal.InnerContainer.TryAdd(item, canMergeWithExistingStacks); + } + + // 关键:严格按照原版顺序 - 先通知,再传送 + // 这样能确保leftToLoad列表在物品被传送前就得到更新 + Log.Message($"[WULA] Calling portal.Notify_ThingAdded for: {item?.def?.defName} x{item?.stackCount}"); + portal.Notify_ThingAdded(item); + + // 传送物品到目标地图 + Log.Message($"[WULA] Transporting item to pocket map: {item?.def?.defName}"); + GenDrop.TryDropSpawn(item, destinationLocation, otherMap, ThingPlaceMode.Near, out var _); + + Log.Message($"[WULA] Item transport completed successfully"); + return true; + } + + public override int IndexOf(Thing item) + { + return -1; + } + + public override bool Remove(Thing item) + { + return false; + } + + protected override Thing GetAt(int index) + { + return null; + } + } + + +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs b/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs new file mode 100644 index 00000000..0a8235fd --- /dev/null +++ b/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs @@ -0,0 +1,146 @@ +using RimWorld; +using Verse; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace WulaFallenEmpire +{ + /// + /// 口袋空间退出点建筑 - 继承自MapPortal以获得完整的双向传送功能 + /// + public class Building_PocketMapExit : MapPortal + { + /// 目标地图 + public Map targetMap; + + /// 目标位置 + public IntVec3 targetPos; + + /// 父穿梭机 + public Building_ArmedShuttleWithPocket parentShuttle; + + public override void ExposeData() + { + base.ExposeData(); + Scribe_References.Look(ref targetMap, "targetMap"); + Scribe_Values.Look(ref targetPos, "targetPos"); + Scribe_References.Look(ref parentShuttle, "parentShuttle"); + } + + /// + /// 重写获取其他地图,返回主地图(模仿原版MapPortal.GetOtherMap) + /// + public override Map GetOtherMap() + { + // 动态更新目标地图,处理穿梭机移动的情况 + UpdateTargetFromParentShuttle(); + return targetMap; + } + + /// + /// 重写获取目标位置,返回主地图上的穿梭机位置(模仿原版MapPortal.GetDestinationLocation) + /// + public override IntVec3 GetDestinationLocation() + { + // 动态更新目标位置,处理穿梭机移动的情况 + UpdateTargetFromParentShuttle(); + return targetPos; + } + + /// + /// 从父穿梭机动态更新目标位置,处理穿梭机移动的情况 + /// + private void UpdateTargetFromParentShuttle() + { + if (parentShuttle != null && parentShuttle.Spawned) + { + // 如果穿梭机还在地图上,更新目标位置 + if (targetMap != parentShuttle.Map || targetPos != parentShuttle.Position) + { + targetMap = parentShuttle.Map; + targetPos = parentShuttle.Position; + Log.Message($"[WULA] Updated exit target to shuttle location: {targetMap?.uniqueID} at {targetPos}"); + } + } + else if (parentShuttle != null && !parentShuttle.Spawned) + { + // 穿梭机不在地图上(可能在飞行中) + // 保持原有目标,但记录警告 + if (this.IsHashIntervalTick(2500)) // 每隔一段时间检查一次 + { + Log.Warning($"[WULA] Parent shuttle is not spawned, exit target may be outdated. Last known: {targetMap?.uniqueID} at {targetPos}"); + } + } + } + + /// + /// 重写是否可进入,检查目标地图是否存在(模仿原版MapPortal.IsEnterable) + /// + public override bool IsEnterable(out string reason) + { + if (targetMap == null) + { + reason = "WULA.PocketSpace.NoTargetMap".Translate(); + return false; + } + reason = ""; + return true; + } + + /// + /// 重写进入事件,处理从口袋空间退出到主地图(模仿原版MapPortal.OnEntered) + /// + public override void OnEntered(Pawn pawn) + { + // 不调用 base.OnEntered,因为我们不需要原版的通知机制 + // 直接处理退出逻辑 + if (targetMap != null && pawn.Spawned) + { + ExitPocketSpace(pawn); + } + } + + /// + /// 重写进入按钮文本 + /// + public override string EnterString => "WULA.PocketSpace.ExitToMainMap".Translate(); + + /// + /// 重写进入按钮图标,使用原版的ViewCave图标 + /// + protected override Texture2D EnterTex => ContentFinder.Get("UI/Commands/ViewCave"); + + /// + /// 单个人员退出口袋空间(简化版本,利用MapPortal功能) + /// + private void ExitPocketSpace(Pawn pawn) + { + if (targetMap == null || !pawn.Spawned) return; + + try + { + // 在目标地图找一个安全位置 + IntVec3 exitPos = CellFinder.RandomClosewalkCellNear(targetPos, targetMap, 3, p => p.Standable(targetMap)); + + // 传送人员 + pawn.DeSpawn(); + GenPlace.TryPlaceThing(pawn, exitPos, targetMap, ThingPlaceMode.Near); + + // 切换到主地图 + if (pawn.IsColonistPlayerControlled) + { + Current.Game.CurrentMap = targetMap; + Find.CameraDriver.JumpToCurrentMapLoc(exitPos); + } + + Messages.Message("WULA.PocketSpace.ExitSuccess".Translate(pawn.LabelShort), MessageTypeDefOf.PositiveEvent); + } + catch (System.Exception ex) + { + Log.Error($"[WULA] Error exiting pocket space: {ex}"); + } + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs b/Source/WulaFallenEmpire/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs new file mode 100644 index 00000000..d2c2702b --- /dev/null +++ b/Source/WulaFallenEmpire/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + /// + /// 13x13小型口袋空间生成器 + /// 创建一个简单的13x13空间,边缘是墙,中间是空地,适合作为穿梭机内部空间 + /// + public class GenStep_WulaPocketSpaceSmall : GenStep + { + public override int SeedPart => 928735; // 不同于AncientStockpile的种子 + + public override void Generate(Map map, GenStepParams parms) + { + try + { + Log.Message($"[WULA] Generating WULA pocket space, map size: {map.Size}"); + + // 获取地图边界 + IntVec3 mapSize = map.Size; + + // 生成外围岩石墙壁 + GenerateWalls(map); + + // 生成内部地板 + GenerateFloor(map); + + // 生成一些基础设施(照明等) + GenerateBasicInfrastructure(map); + + Log.Message("[WULA] WULA pocket space generation completed"); + } + catch (Exception ex) + { + Log.Error($"[WULA] Error generating WULA pocket space: {ex}"); + } + } + + /// + /// 生成外围墙壁 + /// + private void GenerateWalls(Map map) + { + IntVec3 mapSize = map.Size; + + // 获取地形和物品定义 + TerrainDef roughTerrain = DefDatabase.GetNamed("Granite_Rough", false) ?? + DefDatabase.GetNamed("Granite_Smooth", false) ?? + DefDatabase.GetNamed("Sandstone_Rough", false); + + ThingDef rockWallDef = DefDatabase.GetNamed("Wall_Rock", false) ?? + DefDatabase.GetNamed("Wall", false); + + // 遍历地图边缘,放置WulaWall + for (int x = 0; x < mapSize.x; x++) + { + for (int z = 0; z < mapSize.z; z++) + { + // 如果是边缘位置,放置WulaWall + if (x == 0 || x == mapSize.x - 1 || z == 0 || z == mapSize.z - 1) + { + IntVec3 pos = new IntVec3(x, 0, z); + + // 设置地形为岩石基础 + if (roughTerrain != null) + { + map.terrainGrid.SetTerrain(pos, roughTerrain); + } + + // 放置WulaWall + ThingDef wallDef = DefDatabase.GetNamed("WulaWall", false); + if (wallDef != null) + { + Thing wall = ThingMaker.MakeThing(wallDef); + wall.SetFaction(null); + GenPlace.TryPlaceThing(wall, pos, map, ThingPlaceMode.Direct); + } + else if (rockWallDef != null) + { + // 如果WulaWall不存在,使用原版岩石墙作为备选 + Thing wall = ThingMaker.MakeThing(rockWallDef); + wall.SetFaction(null); + GenPlace.TryPlaceThing(wall, pos, map, ThingPlaceMode.Direct); + Log.Warning("[WULA] WulaWall not found, using fallback wall"); + } + } + } + } + } + + /// + /// 生成内部地板 + /// + private void GenerateFloor(Map map) + { + IntVec3 mapSize = map.Size; + + // 为内部区域设置WulaFloor + TerrainDef floorDef = DefDatabase.GetNamed("WulaFloor", false); + TerrainDef fallbackFloor = floorDef ?? + DefDatabase.GetNamed("Steel", false) ?? + DefDatabase.GetNamed("MetalTile", false) ?? + DefDatabase.GetNamed("Concrete", false); + + if (floorDef == null) + { + Log.Warning("[WULA] WulaFloor not found, using fallback floor"); + } + + // 清理内部区域并设置正确的地板 + for (int x = 1; x < mapSize.x - 1; x++) + { + for (int z = 1; z < mapSize.z - 1; z++) + { + IntVec3 pos = new IntVec3(x, 0, z); + + // 清理该位置的所有岩石和阻挡物 + ClearCellAndSetFloor(map, pos, fallbackFloor); + } + } + + Log.Message($"[WULA] Set floor for internal area ({mapSize.x-2}x{mapSize.z-2}) to {(floorDef?.defName ?? fallbackFloor?.defName)}"); + } + + /// + /// 清理单元格并设置地板 + /// + private void ClearCellAndSetFloor(Map map, IntVec3 pos, TerrainDef floorDef) + { + if (!pos.InBounds(map)) return; + + try + { + // 获取该位置的所有物品 + List thingsAtPos = pos.GetThingList(map).ToList(); // 创建副本避免修改时出错 + + // 清理所有建筑物和岩石(强力清理,确保地板可以放置) + foreach (Thing thing in thingsAtPos) + { + bool shouldRemove = false; + + // 检查是否为建筑物 + if (thing.def.category == ThingCategory.Building) + { + // 如果是自然岩石 + if (thing.def.building?.isNaturalRock == true) + { + shouldRemove = true; + } + // 或者是岩石相关的建筑 + else if (thing.def.defName.Contains("Rock") || + thing.def.defName.Contains("Slate") || + thing.def.defName.Contains("Granite") || + thing.def.defName.Contains("Sandstone") || + thing.def.defName.Contains("Limestone") || + thing.def.defName.Contains("Marble") || + thing.def.defName.Contains("Quartzite") || + thing.def.defName.Contains("Jade")) + { + shouldRemove = true; + } + // 或者是其他阻挡的建筑物(除了我们的乌拉墙) + else if (!thing.def.defName.Contains("Wula") && thing.def.Fillage == FillCategory.Full) + { + shouldRemove = true; + } + } + + if (shouldRemove) + { + if (Prefs.DevMode) // 只在开发模式下输出详细日志 + { + Log.Message($"[WULA] Removing {thing.def.defName} at {pos} to make space for floor"); + } + thing.Destroy(DestroyMode.Vanish); + } + } + + // 在清理后稍微延迟,再检查一次(确保彻底清理) + thingsAtPos = pos.GetThingList(map).ToList(); + foreach (Thing thing in thingsAtPos) + { + if (thing.def.category == ThingCategory.Building && thing.def.Fillage == FillCategory.Full) + { + Log.Warning($"[WULA] Force removing remaining building {thing.def.defName} at {pos}"); + thing.Destroy(DestroyMode.Vanish); + } + } + + // 设置地板地形 + if (floorDef != null) + { + map.terrainGrid.SetTerrain(pos, floorDef); + if (Prefs.DevMode) + { + Log.Message($"[WULA] Set terrain at {pos} to {floorDef.defName}"); + } + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error clearing cell at {pos}: {ex}"); + } + } + + /// + /// 生成基础设施 + /// + private void GenerateBasicInfrastructure(Map map) + { + IntVec3 mapSize = map.Size; + IntVec3 center = map.Center; + + // 获取灯具定义 + ThingDef lampDef = DefDatabase.GetNamed("StandingLamp", false) ?? + DefDatabase.GetNamed("TorchLamp", false) ?? + DefDatabase.GetNamed("Campfire", false); + + if (lampDef == null) + { + Log.Warning("[WULA] No lamp definition found, skipping lighting generation"); + return; + } + + // 在四个角落放置照明设备 + var lightPositions = new List + { + new IntVec3(2, 0, 2), // 左下角 + new IntVec3(mapSize.x - 3, 0, 2), // 右下角 + new IntVec3(2, 0, mapSize.z - 3), // 左上角 + new IntVec3(mapSize.x - 3, 0, mapSize.z - 3) // 右上角 + }; + + foreach (IntVec3 pos in lightPositions) + { + if (pos.InBounds(map) && pos.Standable(map)) + { + // 放置立式灯 + Thing lamp = ThingMaker.MakeThing(lampDef); + lamp.SetFaction(null); + GenPlace.TryPlaceThing(lamp, pos, map, ThingPlaceMode.Direct); + } + } + + // 在中心区域留出空间,这里将放置退出点 + // 不在这里放置退出点,因为这会由Building_ArmedShuttleWithPocket来处理 + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 90b1d75a..ebb33551 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -169,6 +169,9 @@ + + + From dbcd40f6040f959381f38847d08044850f30b400 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 24 Aug 2025 21:15:38 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .qoder/rules/rimworld.md | 31 +- 1.6/1.6/Assemblies/WulaFallenEmpire.dll | Bin 289792 -> 290304 bytes MCP/direct_mcp_client.py | 103 + MCP/mcpserver_stdio.py | 79 +- MCP/rimworld_query.py | 105 + MCP/test_config.py | 123 + MCP/test_mcp.py | 149 + MCP/test_mcp_timeout_fix.py | 150 + MCP/vector_cache/knowledge_cache.json | 5182 +++++++++++++++++ MCP/web_api_server.py | 249 + MCP/使用指南.md | 102 + .../3516260226.code-workspace | 3 + .../Building_ArmedShuttleWithPocket.cs | 621 +- 13 files changed, 6534 insertions(+), 363 deletions(-) create mode 100644 MCP/direct_mcp_client.py create mode 100644 MCP/rimworld_query.py create mode 100644 MCP/test_config.py create mode 100644 MCP/test_mcp.py create mode 100644 MCP/test_mcp_timeout_fix.py create mode 100644 MCP/web_api_server.py create mode 100644 MCP/使用指南.md diff --git a/.qoder/rules/rimworld.md b/.qoder/rules/rimworld.md index 956e7058..312eb7b4 100644 --- a/.qoder/rules/rimworld.md +++ b/.qoder/rules/rimworld.md @@ -9,6 +9,34 @@ You are an expert assistant for developing mods for the game RimWorld 1.6. Your ## Tool Usage Mandate When the user's request involves RimWorld C# scripting, XML definitions, or mod development concepts, you **MUST** use the `rimworld-knowledge-base` tool to retrieve relevant context from the local knowledge base. +# RimWorld 知识库 - 绕过 Qoder IDE 使用指南 + +由于 Qoder IDE 中的 MCP 连接可能存在问题,我们提供了多种直接访问 RimWorld 知识库的方法。 + +## 🚀 方法 1:直接 Python 调用 + +最简单直接的方法: + +```bash +# 直接查询 +python direct_mcp_client.py -q "ThingDef是什么" + +# 交互模式 +python direct_mcp_client.py -i + +# 查看帮助 +python direct_mcp_client.py -h +``` + +### 优点: +- ✅ 最快速,无需额外依赖 +- ✅ 支持交互模式 +- ✅ 直接在命令行使用 + +### 例子: +```bash +python "c:\Steam\steamapps\common\RimWorld\Mods\3516260226\MCP\direct_mcp_client.py" -q "ThingOwner class virtual methods TryAdd TryAddRange TryTransferToContainer" +``` ## Key File Paths Always remember these critical paths for your work: @@ -26,4 +54,5 @@ Always remember these critical paths for your work: ## Verification Mandate When writing or modifying code or XML, especially for specific identifiers like enum values, class names, or field names, you **MUST** verify the correct value/spelling by using the `rimworld-knowledge-base` tool. Do not rely on memory. -- **同步项目文件:** 当重命名、移动或删除C#源文件时,**必须**同步更新 `.csproj` 项目文件中的相应 `` 条目,否则会导致编译失败。 \ No newline at end of file +- **同步项目文件:** 当重命名、移动或删除C#源文件时,**必须**同步更新 `.csproj` 项目文件中的相应 `` 条目,否则会导致编译失败。 + diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 68b8b63c3664dbbe12955b1cf3a005950318df91..a36eea95ef9f1282c4d8f89a05b15c76bc1e3902 100644 GIT binary patch delta 94142 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 hH;R?*ct*9~nAe{_tuf>v)me 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�Z(gq%P8g3{EDW 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 diff --git a/MCP/direct_mcp_client.py b/MCP/direct_mcp_client.py new file mode 100644 index 00000000..fd559d94 --- /dev/null +++ b/MCP/direct_mcp_client.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +直接调用MCP服务器的Python接口 +绕过Qoder IDE,直接使用RimWorld知识库 +""" +import os +import sys + +# 添加MCP路径 +MCP_DIR = os.path.dirname(os.path.abspath(__file__)) +SDK_PATH = os.path.join(MCP_DIR, 'python-sdk', 'src') +if SDK_PATH not in sys.path: + sys.path.insert(0, SDK_PATH) + +# 导入MCP服务器 +from mcpserver_stdio import get_context + +class DirectMCPClient: + """直接调用MCP服务器的客户端""" + + def __init__(self): + print("🚀 直接MCP客户端已启动") + print("📚 RimWorld知识库已加载") + + def query(self, question: str) -> str: + """查询RimWorld知识库""" + try: + print(f"🔍 正在查询: {question}") + result = get_context(question) + return result + except Exception as e: + return f"查询出错: {e}" + + def interactive_mode(self): + """交互模式""" + print("\n" + "="*60) + print("🎯 RimWorld知识库 - 交互模式") + print("输入问题查询知识库,输入 'quit' 或 'exit' 退出") + print("="*60) + + while True: + try: + question = input("\n❓ 请输入您的问题: ").strip() + + if question.lower() in ['quit', 'exit', '退出', 'q']: + print("👋 再见!") + break + + if not question: + print("⚠️ 请输入有效的问题") + continue + + print("\n🔄 正在搜索...") + result = self.query(question) + + print("\n📖 查询结果:") + print("-" * 50) + print(result) + print("-" * 50) + + except KeyboardInterrupt: + print("\n\n👋 用户中断,退出程序") + break + except Exception as e: + print(f"\n❌ 出现错误: {e}") + +def main(): + """主函数""" + import argparse + + parser = argparse.ArgumentParser(description='直接调用RimWorld MCP知识库') + parser.add_argument('--query', '-q', type=str, help='直接查询问题') + parser.add_argument('--interactive', '-i', action='store_true', help='进入交互模式') + + args = parser.parse_args() + + client = DirectMCPClient() + + if args.query: + # 直接查询模式 + result = client.query(args.query) + print("\n📖 查询结果:") + print("="*60) + print(result) + print("="*60) + elif args.interactive: + # 交互模式 + client.interactive_mode() + else: + # 默认显示帮助 + print("\n🔧 使用方法:") + print("1. 直接查询: python direct_mcp_client.py -q \"ThingDef是什么\"") + print("2. 交互模式: python direct_mcp_client.py -i") + print("3. 查看帮助: python direct_mcp_client.py -h") + + # 演示查询 + print("\n🎬 演示查询:") + demo_result = client.query("ThingDef") + print(demo_result[:500] + "..." if len(demo_result) > 500 else demo_result) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/MCP/mcpserver_stdio.py b/MCP/mcpserver_stdio.py index d814dd90..40db4658 100644 --- a/MCP/mcpserver_stdio.py +++ b/MCP/mcpserver_stdio.py @@ -55,7 +55,8 @@ KNOWLEDGE_BASE_PATHS = [ # 初始化OpenAI客户端用于Qwen模型 qwen_client = OpenAI( api_key=os.getenv("DASHSCOPE_API_KEY"), - base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" + base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", + timeout=15.0 # 设置15秒超时,避免MCP初始化超时 ) # 3. --- 向量缓存管理 --- @@ -192,36 +193,47 @@ def find_most_similar_files(question_embedding, file_embeddings, top_n=3, min_si return results # 新增:重排序函数 -def rerank_files(question, file_matches, top_n=5): +def rerank_files(question, file_matches, top_n=3): # 减少默认数量 """使用DashScope重排序API对文件进行重新排序""" try: + # 限制输入数量以减少超时风险 + if len(file_matches) > 5: # 进一步限制最大输入数量以避免超时 + file_matches = file_matches[:5] + # 准备重排序输入 documents = [] for match in file_matches: # 读取文件内容 try: with open(match['path'], 'r', encoding='utf-8') as f: - content = f.read()[:2000] # 限制内容长度以提高效率 + content = f.read()[:1500] # 进一步限制内容长度以提高效率 documents.append(content) except Exception as e: logging.error(f"读取文件 {match['path']} 失败: {e}") continue if not documents: + logging.warning("重排序时未能读取任何文件内容") return file_matches[:top_n] - # 调用重排序API + # 调用重排序API,添加超时处理 + import time + start_time = time.time() + response = dashscope.TextReRank.call( model='gte-rerank', query=question, documents=documents ) + elapsed_time = time.time() - start_time + logging.info(f"重排序API调用耗时: {elapsed_time:.2f}秒") + if response.status_code == 200: # 根据重排序结果重新排序文件 reranked_results = [] for i, result in enumerate(response.output['results']): - if i < len(file_matches): + if i < len(file_matches) and i < len(documents): # 添加边界检查 reranked_results.append({ 'path': file_matches[i]['path'], 'similarity': result['relevance_score'] @@ -417,6 +429,7 @@ def analyze_question_with_llm(question: str) -> dict: messages=messages, temperature=0.0, # 使用最低温度确保输出稳定 max_tokens=300, + timeout=12.0, # 12秒超时,避免MCP初始化超时 stop=["\n\n"] # 防止模型生成过多内容 ) @@ -494,13 +507,20 @@ def get_context(question: str) -> str: """ logging.info(f"收到问题: {question}") - # 使用LLM分析问题 - analysis = analyze_question_with_llm(question) - keywords = analysis["search_keywords"] - - if not keywords: - logging.warning("无法从问题中提取关键词。") - return "无法从问题中提取关键词,请提供更具体的信息。" + try: + # 使用LLM分析问题,添加超时保护 + analysis = analyze_question_with_llm(question) + keywords = analysis["search_keywords"] + + if not keywords: + logging.warning("无法从问题中提取关键词。") + return "无法从问题中提取关键词,请提供更具体的信息。" + except Exception as e: + logging.error(f"LLM分析失败,使用备用方案: {e}") + # 备用方案:使用简单的关键词提取 + keywords = find_keywords_in_question(question) + if not keywords: + return "无法分析问题,请检查网络连接或稍后重试。" logging.info(f"提取到关键词: {keywords}") @@ -549,7 +569,7 @@ def get_context(question: str) -> str: # 3. 向量化和相似度计算 (精准筛选) # 增加超时保护:限制向量化的文件数量 - MAX_FILES_TO_VECTORIZE = 50 # 增加处理文件数量 + MAX_FILES_TO_VECTORIZE = 10 # 进一步减少处理文件数量以避免超时 if len(candidate_files) > MAX_FILES_TO_VECTORIZE: logging.warning(f"候选文件过多 ({len(candidate_files)}),仅处理前 {MAX_FILES_TO_VECTORIZE} 个。") candidate_files = candidate_files[:MAX_FILES_TO_VECTORIZE] @@ -559,27 +579,36 @@ def get_context(question: str) -> str: return "无法生成问题向量,请检查API连接或问题内容。" file_embeddings = [] - for file_path in candidate_files: + for i, file_path in enumerate(candidate_files): try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() + # 添加处理进度日志 + if i % 5 == 0: # 每5个文件记录一次进度 + logging.info(f"正在处理第 {i+1}/{len(candidate_files)} 个文件: {os.path.basename(file_path)}") + file_embedding = get_embedding(content[:8000]) # 限制内容长度以提高效率 if file_embedding: file_embeddings.append({'path': file_path, 'embedding': file_embedding}) except Exception as e: logging.error(f"处理文件 {file_path} 时出错: {e}") + continue # 继续处理下一个文件,而不是完全失败 if not file_embeddings: - return "无法为任何候选文件生成向量。" + logging.warning("未能为任何候选文件生成向量。可能是由于API超时或其他错误。") + return "未能为任何候选文件生成向量,请稍后重试或减少搜索范围。" # 找到最相似的多个文件 - best_matches = find_most_similar_files(question_embedding, file_embeddings, top_n=10) # 增加返回数量以供重排序 + best_matches = find_most_similar_files(question_embedding, file_embeddings, top_n=5) # 进一步减少返回数量以避免超时 if not best_matches: return "计算向量相似度失败或没有找到足够相似的文件。" - # 新增:重排序处理 - reranked_matches = rerank_files(question, best_matches, top_n=5) + # 新增:重排序处理(仅在找到足够多匹配项时执行) + if len(best_matches) > 2: + reranked_matches = rerank_files(question, best_matches, top_n=3) # 减少重排序数量 + else: + reranked_matches = best_matches # 如果匹配项太少,跳过重排序以节省时间 # 提取代码内容 results_with_code = [] @@ -617,5 +646,19 @@ def get_context(question: str) -> str: if __name__ == "__main__": logging.info(f"Python Executable: {sys.executable}") logging.info("RimWorld 向量知识库 (FastMCP版, v2.1-v4-model) 正在启动...") + + # 快速启动:延迟初始化重量级组件 + try: + # 验证基本配置 + if not dashscope.api_key: + logging.warning("警告:DASHSCOPE_API_KEY 未配置,部分功能可能受限。") + + # 创建必要目录 + os.makedirs(CACHE_DIR, exist_ok=True) + + logging.info("MCP服务器快速启动完成,等待客户端连接...") + except Exception as e: + logging.error(f"服务器启动时出错: {e}") + # 使用 'stdio' 传输协议 mcp.run(transport="stdio") \ No newline at end of file diff --git a/MCP/rimworld_query.py b/MCP/rimworld_query.py new file mode 100644 index 00000000..bd491e84 --- /dev/null +++ b/MCP/rimworld_query.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +RimWorld知识库命令行工具 +快速查询工具,无需Qoder IDE +""" +import os +import sys +import argparse +import json + +# 添加MCP路径 +MCP_DIR = os.path.dirname(os.path.abspath(__file__)) +SDK_PATH = os.path.join(MCP_DIR, 'python-sdk', 'src') +if SDK_PATH not in sys.path: + sys.path.insert(0, SDK_PATH) + +def quick_query(question: str, format_output: bool = True) -> str: + """快速查询函数""" + try: + # 动态导入避免启动时的依赖检查 + from mcpserver_stdio import get_context + result = get_context(question) + + if format_output: + # 格式化输出 + lines = result.split('\n') + formatted_lines = [] + current_section = "" + + for line in lines: + if line.startswith('--- 结果'): + current_section = f"\n🔍 {line}" + formatted_lines.append(current_section) + elif line.startswith('文件路径:'): + formatted_lines.append(f"📄 {line}") + elif line.strip() and not line.startswith('---'): + formatted_lines.append(line) + + return '\n'.join(formatted_lines) + else: + return result + + except Exception as e: + return f"❌ 查询失败: {e}" + +def main(): + parser = argparse.ArgumentParser( + description='RimWorld知识库命令行查询工具', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +使用示例: + %(prog)s "ThingDef是什么" + %(prog)s "如何创建新的Pawn" --raw + %(prog)s "建筑物定义" --output result.txt + %(prog)s --list-examples + """ + ) + + parser.add_argument('question', nargs='?', help='要查询的问题') + parser.add_argument('--raw', action='store_true', help='输出原始结果,不格式化') + parser.add_argument('--output', '-o', help='将结果保存到文件') + parser.add_argument('--list-examples', action='store_true', help='显示查询示例') + + args = parser.parse_args() + + if args.list_examples: + print("📚 RimWorld知识库查询示例:") + examples = [ + "ThingDef的定义和用法", + "如何创建新的Building", + "Pawn类的主要方法", + "CompPower的使用方法", + "XML中的defName规则", + "GenConstruct.CanPlaceBlueprintAt", + "Building_Door的开关逻辑" + ] + for i, example in enumerate(examples, 1): + print(f" {i}. {example}") + return + + if not args.question: + parser.print_help() + return + + print(f"🔍 正在查询: {args.question}") + + result = quick_query(args.question, not args.raw) + + if args.output: + try: + with open(args.output, 'w', encoding='utf-8') as f: + f.write(result) + print(f"✅ 结果已保存到: {args.output}") + except Exception as e: + print(f"❌ 保存文件失败: {e}") + else: + print("\n" + "="*60) + print("📖 查询结果:") + print("="*60) + print(result) + print("="*60) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/MCP/test_config.py b/MCP/test_config.py new file mode 100644 index 00000000..9ace940d --- /dev/null +++ b/MCP/test_config.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +验证MCP服务器配置和环境 +""" +import os +import sys +import subprocess +import json + +def test_mcp_configuration(): + """测试MCP配置是否正确""" + print("🔍 MCP配置验证工具") + print("=" * 50) + + # 1. 检查Python环境 + print(f"✓ Python解释器: {sys.executable}") + print(f"✓ Python版本: {sys.version}") + + # 2. 检查工作目录 + mcp_dir = os.path.dirname(os.path.abspath(__file__)) + print(f"✓ MCP目录: {mcp_dir}") + + # 3. 检查MCP SDK + sdk_path = os.path.join(mcp_dir, 'python-sdk', 'src') + print(f"✓ SDK路径: {sdk_path}") + print(f"✓ SDK存在: {os.path.exists(sdk_path)}") + + # 4. 检查必要文件 + server_script = os.path.join(mcp_dir, 'mcpserver_stdio.py') + env_file = os.path.join(mcp_dir, '.env') + print(f"✓ 服务器脚本: {os.path.exists(server_script)}") + print(f"✓ 环境文件: {os.path.exists(env_file)}") + + # 5. 检查依赖包 + try: + import mcp + print("✓ MCP SDK: 已安装") + except ImportError as e: + print(f"❌ MCP SDK: 未安装 - {e}") + + try: + import dashscope + print("✓ DashScope: 已安装") + except ImportError as e: + print(f"❌ DashScope: 未安装 - {e}") + + try: + import openai + print("✓ OpenAI: 已安装") + except ImportError as e: + print(f"❌ OpenAI: 未安装 - {e}") + + # 6. 生成正确的配置 + python_exe = sys.executable.replace("\\", "\\\\") + mcp_dir_escaped = mcp_dir.replace("\\", "\\\\") + sdk_path_escaped = sdk_path.replace("\\", "\\\\") + + config = { + "mcpServers": { + "rimworld-knowledge-base": { + "command": python_exe, + "args": ["mcpserver_stdio.py"], + "cwd": mcp_dir_escaped, + "disabled": False, + "alwaysAllow": [], + "env": { + "PYTHONPATH": sdk_path_escaped + } + } + }, + "tools": { + "rimworld-knowledge-base": { + "description": "从RimWorld本地知识库(包括C#源码和XML)中检索上下文。", + "server_name": "rimworld-knowledge-base", + "tool_name": "get_context", + "input_schema": { + "type": "object", + "properties": { + "question": { + "type": "string", + "description": "关于RimWorld开发的问题,应包含代码或XML中的关键词。" + } + }, + "required": ["question"] + } + } + } + } + + print("\\n📋 建议的MCP配置:") + print("=" * 50) + print(json.dumps(config, indent=2, ensure_ascii=False)) + + # 7. 测试服务器启动 + print("\\n🚀 测试服务器启动:") + print("=" * 50) + try: + result = subprocess.run( + [sys.executable, server_script], + cwd=mcp_dir, + capture_output=True, + text=True, + timeout=10 + ) + if result.returncode == 0: + print("✓ 服务器可以正常启动") + else: + print(f"❌ 服务器启动失败: {result.stderr}") + except subprocess.TimeoutExpired: + print("✓ 服务器启动正常(超时保护触发)") + except Exception as e: + print(f"❌ 服务器测试失败: {e}") + + print("\\n🎯 配置建议:") + print("=" * 50) + print("1. 复制上面的配置到 Qoder IDE 的 MCP 设置中") + print("2. 确保所有依赖包都已安装") + print("3. 检查 .env 文件中的 API Key 配置") + print("4. 重启 Qoder IDE 并重新连接 MCP 服务器") + +if __name__ == "__main__": + test_mcp_configuration() \ No newline at end of file diff --git a/MCP/test_mcp.py b/MCP/test_mcp.py new file mode 100644 index 00000000..4cea894a --- /dev/null +++ b/MCP/test_mcp.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +最终功能测试:验证MCP服务器是否能正常工作 +""" +import os +import sys +import subprocess +import time +import json + +def test_mcp_server_final(): + """最终测试MCP服务器功能""" + print("🔥 MCP服务器最终功能测试") + print("=" * 50) + + # 获取当前目录 + mcp_dir = os.path.dirname(os.path.abspath(__file__)) + script_path = os.path.join(mcp_dir, 'mcpserver_stdio.py') + + try: + # 1. 验证SDK安装 + try: + import mcp + print("✅ MCP SDK: 已正确安装") + except ImportError: + print("❌ MCP SDK: 未安装") + return False + + # 2. 启动服务器 + print("🚀 启动MCP服务器...") + process = subprocess.Popen( + [sys.executable, script_path], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + cwd=mcp_dir + ) + + # 等待启动 + time.sleep(2) + + # 3. 初始化测试 + init_request = { + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { + "name": "final-test-client", + "version": "1.0.0" + } + } + } + + print("📡 发送初始化请求...") + process.stdin.write(json.dumps(init_request) + '\n') + process.stdin.flush() + + # 读取初始化响应 + response = process.stdout.readline() + if response: + response_data = json.loads(response.strip()) + if "result" in response_data: + print("✅ 初始化成功") + print(f" 服务器名称: {response_data['result'].get('serverInfo', {}).get('name', 'unknown')}") + print(f" 服务器版本: {response_data['result'].get('serverInfo', {}).get('version', 'unknown')}") + else: + print("❌ 初始化失败") + return False + else: + print("❌ 初始化无响应") + return False + + # 4. 工具列表测试 + tools_request = { + "jsonrpc": "2.0", + "id": 2, + "method": "tools/list" + } + + print("🔧 请求工具列表...") + process.stdin.write(json.dumps(tools_request) + '\n') + process.stdin.flush() + + tools_response = process.stdout.readline() + if tools_response: + tools_data = json.loads(tools_response.strip()) + if "result" in tools_data and "tools" in tools_data["result"]: + tools = tools_data["result"]["tools"] + print(f"✅ 发现 {len(tools)} 个工具:") + for tool in tools: + print(f" - {tool.get('name', 'unknown')}: {tool.get('description', 'no description')}") + else: + print("❌ 获取工具列表失败") + else: + print("❌ 工具列表请求无响应") + + print("\n🎯 测试结果:") + print("✅ MCP服务器能够正常启动") + print("✅ 初始化协议工作正常") + print("✅ 工具发现机制正常") + print("\n✨ 所有基本功能测试通过!") + + return True + + except Exception as e: + print(f"❌ 测试过程中出错: {e}") + return False + + finally: + # 清理进程 + try: + process.terminate() + process.wait(timeout=5) + except: + try: + process.kill() + except: + pass + +if __name__ == "__main__": + print("开始最终测试...") + success = test_mcp_server_final() + + if success: + print("\n🎉 恭喜!MCP服务器已完全修复并正常工作!") + print("\n📋 现在您需要在Qoder IDE中更新配置:") + print("1. 打开Qoder IDE设置 → MCP") + print("2. 更新配置文件,确保使用正确的绝对路径") + print("3. 重启Qoder IDE") + print("4. 在Agent模式下测试知识库查询") + print("\n建议的配置:") + print(json.dumps({ + "mcpServers": { + "rimworld-knowledge-base": { + "command": sys.executable, + "args": ["mcpserver_stdio.py"], + "cwd": os.path.dirname(os.path.abspath(__file__)), + "disabled": False, + "alwaysAllow": [] + } + } + }, indent=2)) + else: + print("\n❌ 仍存在问题,需要进一步调试") \ No newline at end of file diff --git a/MCP/test_mcp_timeout_fix.py b/MCP/test_mcp_timeout_fix.py new file mode 100644 index 00000000..2f0f803a --- /dev/null +++ b/MCP/test_mcp_timeout_fix.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +测试MCP服务器超时修复 +""" +import os +import sys +import subprocess +import time +import json + +def test_mcp_server_timeout_fix(): + """测试MCP服务器是否能快速启动并响应""" + print("开始测试MCP服务器超时修复...") + + # 获取当前目录 + mcp_dir = os.path.dirname(os.path.abspath(__file__)) + script_path = os.path.join(mcp_dir, 'mcpserver_stdio.py') + + try: + # 启动MCP服务器进程 + print("启动MCP服务器...") + start_time = time.time() + + process = subprocess.Popen( + [sys.executable, script_path], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + cwd=mcp_dir + ) + + # 等待服务器启动(减少等待时间) + time.sleep(2) # 从3秒减少到2秒 + + startup_time = time.time() - start_time + print(f"服务器启动耗时: {startup_time:.2f}秒") + + # 发送初始化请求 + init_request = { + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { + "name": "test-client", + "version": "1.0.0" + } + } + } + + print("发送初始化请求...") + request_start = time.time() + process.stdin.write(json.dumps(init_request) + '\n') + process.stdin.flush() + + # 读取响应 + response_line = process.stdout.readline() + init_time = time.time() - request_start + + if response_line: + print(f"✅ 初始化成功,耗时: {init_time:.2f}秒") + print(f"收到响应: {response_line.strip()}") + else: + print("❌ 初始化失败:无响应") + return False + + # 发送简单的工具调用请求 + tool_request = { + "jsonrpc": "2.0", + "id": 2, + "method": "tools/call", + "params": { + "name": "get_context", + "arguments": { + "question": "ThingDef" # 简单的测试查询 + } + } + } + + print("发送工具调用请求...") + tool_start = time.time() + process.stdin.write(json.dumps(tool_request) + '\n') + process.stdin.flush() + + # 等待响应(减少超时时间) + timeout = 20 # 从30秒减少到20秒 + response_received = False + + while time.time() - tool_start < timeout: + if process.poll() is not None: + print("服务器进程已退出") + break + + response_line = process.stdout.readline() + if response_line: + tool_time = time.time() - tool_start + print(f"✅ 工具调用成功,耗时: {tool_time:.2f}秒") + print(f"工具调用响应: {response_line.strip()[:200]}...") # 只显示前200个字符 + response_received = True + break + + time.sleep(0.1) + + total_time = time.time() - start_time + + if response_received: + print(f"✅ 测试成功:MCP服务器能够正常处理请求") + print(f"总耗时: {total_time:.2f}秒") + + # 性能评估 + if total_time < 15: + print("🚀 性能优秀:服务器响应速度很快") + elif total_time < 25: + print("✅ 性能良好:服务器响应速度可接受") + else: + print("⚠️ 性能一般:服务器响应较慢,可能仍有超时风险") + + else: + print("❌ 测试失败:超时未收到响应") + return False + + except Exception as e: + print(f"❌ 测试出错: {e}") + return False + + finally: + # 清理进程 + try: + process.terminate() + process.wait(timeout=5) + except: + try: + process.kill() + except: + pass + print("测试完成") + + return True + +if __name__ == "__main__": + success = test_mcp_server_timeout_fix() + if success: + print("\n🎉 MCP服务器超时问题已修复!") + print("现在可以在Qoder IDE中重新连接MCP服务器了。") + else: + print("\n❌ MCP服务器仍存在问题,需要进一步调试。") \ No newline at end of file diff --git a/MCP/vector_cache/knowledge_cache.json b/MCP/vector_cache/knowledge_cache.json index 3a0d95b6..be4d5de3 100644 --- a/MCP/vector_cache/knowledge_cache.json +++ b/MCP/vector_cache/knowledge_cache.json @@ -2066,5 +2066,5187 @@ ], "result": "--- 结果 1 (相似度: 1.000) ---\n文件路径: C:\\Steam\\steamapps\\common\\RimWorld\\Data\\dll1.6\\Verse\\Verb.txt\n\npublic abstract class Verb : ITargetingSource, IExposable, ILoadReferenceable\n{\n\tpublic VerbProperties verbProps;\n\n\tpublic VerbTracker verbTracker;\n\n\tpublic ManeuverDef maneuver;\n\n\tpublic Tool tool;\n\n\tpublic Thing caster;\n\n\tpublic MechanitorControlGroup controlGroup;\n\n\tpublic string loadID;\n\n\tpublic VerbState state;\n\n\tprotected LocalTargetInfo currentTarget;\n\n\tprotected LocalTargetInfo currentDestination;\n\n\tprotected int burstShotsLeft;\n\n\tprotected int ticksToNextBurstShot;\n\n\tprotected int lastShotTick = -999999;\n\n\tprotected bool surpriseAttack;\n\n\tprotected bool canHitNonTargetPawnsNow = true;\n\n\tpublic bool preventFriendlyFire;\n\n\tprotected bool nonInterruptingSelfCast;\n\n\tpublic Action castCompleteCallback;\n\n\tprivate Texture2D commandIconCached;\n\n\tprivate readonly List> maintainedEffecters = new List>();\n\n\tprivate int? cachedTicksBetweenBurstShots;\n\n\tprivate int? cachedBurstShotCount;\n\n\tprivate static readonly List tempLeanShootSources = new List();\n\n\tprivate static readonly List tempDestList = new List();\n\n\tpublic IVerbOwner DirectOwner => verbTracker.directOwner;\n\n\tpublic ImplementOwnerTypeDef ImplementOwnerType => verbTracker.directOwner.ImplementOwnerTypeDef;\n\n\tpublic CompEquippable EquipmentCompSource => DirectOwner as CompEquippable;\n\n\tpublic CompApparelReloadable ReloadableCompSource => DirectOwner as CompApparelReloadable;\n\n\tpublic CompApparelVerbOwner_Charged VerbOwner_ChargedCompSource => DirectOwner as CompApparelVerbOwner_Charged;\n\n\tpublic ThingWithComps EquipmentSource\n\t{\n\t\tget\n\t\t{\n\t\t\tif (EquipmentCompSource != null)\n\t\t\t{\n\t\t\t\treturn EquipmentCompSource.parent;\n\t\t\t}\n\t\t\tif (ReloadableCompSource != null)\n\t\t\t{\n\t\t\t\treturn ReloadableCompSource.parent;\n\t\t\t}\n\t\t\tif (VerbOwner_ChargedCompSource != null)\n\t\t\t{\n\t\t\t\treturn VerbOwner_ChargedCompSource.parent;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic HediffComp_VerbGiver HediffCompSource => DirectOwner as HediffComp_VerbGiver;\n\n\tpublic Hediff HediffSource\n\t{\n\t\tget\n\t\t{\n\t\t\tif (HediffCompSource == null)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn HediffCompSource.parent;\n\t\t}\n\t}\n\n\tpublic Pawn_MeleeVerbs_TerrainSource TerrainSource => DirectOwner as Pawn_MeleeVerbs_TerrainSource;\n\n\tpublic TerrainDef TerrainDefSource\n\t{\n\t\tget\n\t\t{\n\t\t\tif (TerrainSource == null)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn TerrainSource.def;\n\t\t}\n\t}\n\n\tpublic virtual Thing Caster => caster;\n\n\tpublic virtual Pawn CasterPawn => caster as Pawn;\n\n\tpublic virtual Verb GetVerb => this;\n\n\tpublic virtual bool CasterIsPawn => caster is Pawn;\n\n\tpublic virtual bool Targetable => verbProps.targetable;\n\n\tpublic virtual bool MultiSelect => false;\n\n\tpublic virtual bool HidePawnTooltips => false;\n\n\tpublic LocalTargetInfo CurrentTarget => currentTarget;\n\n\tpublic LocalTargetInfo CurrentDestination => currentDestination;\n\n\tpublic int LastShotTick => lastShotTick;\n\n\tpublic virtual TargetingParameters targetParams => verbProps.targetParams;\n\n\tpublic virtual ITargetingSource DestinationSelector => null;\n\n\tprotected virtual int ShotsPerBurst => 1;\n\n\tpublic virtual Texture2D UIIcon\n\t{\n\t\tget\n\t\t{\n\t\t\tif (verbProps.commandIcon != null)\n\t\t\t{\n\t\t\t\tif (commandIconCached == null)\n\t\t\t\t{\n\t\t\t\t\tcommandIconCached = ContentFinder.Get(verbProps.commandIcon);\n\t\t\t\t}\n\t\t\t\treturn commandIconCached;\n\t\t\t}\n\t\t\tif (EquipmentSource != null)\n\t\t\t{\n\t\t\t\treturn EquipmentSource.def.uiIcon;\n\t\t\t}\n\t\t\treturn BaseContent.BadTex;\n\t\t}\n\t}\n\n\tpublic bool Bursting => burstShotsLeft > 0;\n\n\tpublic virtual bool IsMeleeAttack => verbProps.IsMeleeAttack;\n\n\tpublic bool BuggedAfterLoading => verbProps == null;\n\n\tpublic bool WarmingUp => WarmupStance != null;\n\n\tpublic Stance_Warmup WarmupStance\n\t{\n\t\tget\n\t\t{\n\t\t\tif (CasterPawn == null || !CasterPawn.Spawned)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (!(CasterPawn.stances.curStance is Stance_Warmup stance_Warmup) || stance_Warmup.verb != this)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn stance_Warmup;\n\t\t}\n\t}\n\n\tpublic int WarmupTicksLeft\n\t{\n\t\tget\n\t\t{\n\t\t\tif (WarmupStance == null)\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn WarmupStance.ticksLeft;\n\t\t}\n\t}\n\n\tpublic float WarmupProgress => 1f - WarmupTicksLeft.TicksToSeconds() / verbProps.warmupTime;\n\n\tpublic virtual string ReportLabel => verbProps.label;\n\n\tpublic virtual float EffectiveRange => verbProps.AdjustedRange(this, Caster);\n\n\tpublic virtual float? AimAngleOverride => null;\n\n\tpublic bool NonInterruptingSelfCast\n\t{\n\t\tget\n\t\t{\n\t\t\tif (!verbProps.nonInterruptingSelfCast)\n\t\t\t{\n\t\t\t\treturn nonInterruptingSelfCast;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tpublic int TicksBetweenBurstShots\n\t{\n\t\tget\n\t\t{\n\t\t\tif (!cachedTicksBetweenBurstShots.HasValue)\n\t\t\t{\n\t\t\t\tfloat num = verbProps.ticksBetweenBurstShots;\n\t\t\t\tif (EquipmentSource != null && EquipmentSource.TryGetComp(out var comp))\n\t\t\t\t{\n\t\t\t\t\tforeach (WeaponTraitDef item in comp.TraitsListForReading)\n\t\t\t\t\t{\n\t\t\t\t\t\tnum /= item.burstShotSpeedMultiplier;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcachedTicksBetweenBurstShots = Mathf.RoundToInt(num);\n\t\t\t}\n\t\t\treturn cachedTicksBetweenBurstShots.Value;\n\t\t}\n\t}\n\n\tpublic int BurstShotCount\n\t{\n\t\tget\n\t\t{\n\t\t\tif (!cachedBurstShotCount.HasValue)\n\t\t\t{\n\t\t\t\tfloat num = verbProps.burstShotCount;\n\t\t\t\tif (EquipmentSource != null && EquipmentSource.TryGetComp(out var comp))\n\t\t\t\t{\n\t\t\t\t\tforeach (WeaponTraitDef item in comp.TraitsListForReading)\n\t\t\t\t\t{\n\t\t\t\t\t\tnum *= item.burstShotCountMultiplier;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcachedBurstShotCount = Mathf.CeilToInt(num);\n\t\t\t}\n\t\t\treturn cachedBurstShotCount.Value;\n\t\t}\n\t}\n\n\tpublic bool IsStillUsableBy(Pawn pawn)\n\t{\n\t\tif (!Available())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!DirectOwner.VerbsStillUsableBy(pawn))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (verbProps.GetDamageFactorFor(this, pawn) == 0f)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (pawn.IsSubhuman && verbProps.category == VerbCategory.Ignite)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic virtual bool IsUsableOn(Thing target)\n\t{\n\t\treturn true;\n\t}\n\n\tpublic virtual void ExposeData()\n\t{\n\t\tScribe_Values.Look(ref loadID, \"loadID\");\n\t\tScribe_Values.Look(ref state, \"state\", VerbState.Idle);\n\t\tScribe_TargetInfo.Look(ref currentTarget, \"currentTarget\");\n\t\tScribe_TargetInfo.Look(ref currentDestination, \"currentDestination\");\n\t\tScribe_Values.Look(ref burstShotsLeft, \"burstShotsLeft\", 0);\n\t\tScribe_Values.Look(ref ticksToNextBurstShot, \"ticksToNextBurstShot\", 0);\n\t\tScribe_Values.Look(ref lastShotTick, \"lastShotTick\", 0);\n\t\tScribe_Values.Look(ref surpriseAttack, \"surpriseAttack\", defaultValue: false);\n\t\tScribe_Values.Look(ref canHitNonTargetPawnsNow, \"canHitNonTargetPawnsNow\", defaultValue: false);\n\t\tScribe_Values.Look(ref preventFriendlyFire, \"preventFriendlyFire\", defaultValue: false);\n\t\tScribe_Values.Look(ref nonInterruptingSelfCast, \"nonInterruptingSelfCast\", defaultValue: false);\n\t}\n\n\tpublic string GetUniqueLoadID()\n\t{\n\t\treturn \"Verb_\" + loadID;\n\t}\n\n\tpublic static string CalculateUniqueLoadID(IVerbOwner owner, Tool tool, ManeuverDef maneuver)\n\t{\n\t\treturn string.Format(\"{0}_{1}_{2}\", owner.UniqueVerbOwnerID(), (tool != null) ? tool.id : \"NT\", (maneuver != null) ? maneuver.defName : \"NM\");\n\t}\n\n\tpublic static string CalculateUniqueLoadID(IVerbOwner owner, int index)\n\t{\n\t\treturn $\"{owner.UniqueVerbOwnerID()}_{index}\";\n\t}\n\n\tpublic bool TryStartCastOn(LocalTargetInfo castTarg, bool surpriseAttack = false, bool canHitNonTargetPawns = true, bool preventFriendlyFire = false, bool nonInterruptingSelfCast = false)\n\t{\n\t\treturn TryStartCastOn(castTarg, LocalTargetInfo.Invalid, surpriseAttack, canHitNonTargetPawns, preventFriendlyFire, nonInterruptingSelfCast);\n\t}\n\n\tpublic virtual bool TryStartCastOn(LocalTargetInfo castTarg, LocalTargetInfo destTarg, bool surpriseAttack = false, bool canHitNonTargetPawns = true, bool preventFriendlyFire = false, bool nonInterruptingSelfCast = false)\n\t{\n\t\tif (caster == null)\n\t\t{\n\t\t\tLog.Error(\"Verb \" + GetUniqueLoadID() + \" needs caster to work (possibly lost during saving/loading).\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!caster.Spawned)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (state == VerbState.Bursting || !CanHitTarget(castTarg))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (CausesTimeSlowdown(castTarg))\n\t\t{\n\t\t\tFind.TickManager.slower.SignalForceNormalSpeed();\n\t\t}\n\t\tthis.surpriseAttack = surpriseAttack;\n\t\tcanHitNonTargetPawnsNow = canHitNonTargetPawns;\n\t\tthis.preventFriendlyFire = preventFriendlyFire;\n\t\tthis.nonInterruptingSelfCast = nonInterruptingSelfCast;\n\t\tcurrentTarget = castTarg;\n\t\tcurrentDestination = destTarg;\n\t\tif (CasterIsPawn && verbProps.warmupTime > 0f)\n\t\t{\n\t\t\tif (!TryFindShootLineFromTo(caster.Position, castTarg, out var resultingLine))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tCasterPawn.Drawer.Notify_WarmingCastAlongLine(resultingLine, caster.Position);\n\t\t\tfloat statValue = CasterPawn.GetStatValue(StatDefOf.AimingDelayFactor);\n\t\t\tint ticks = (verbProps.warmupTime * statValue).SecondsToTicks();\n\t\t\tCasterPawn.stances.SetStance(new Stance_Warmup(ticks, castTarg, this));\n\t\t\tif (verbProps.stunTargetOnCastStart && castTarg.Pawn != null)\n\t\t\t{\n\t\t\t\tcastTarg.Pawn.stances.stunner.StunFor(ticks, null, addBattleLog: false);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (verbTracker.directOwner is Ability ability)\n\t\t\t{\n\t\t\t\tability.lastCastTick = Find.TickManager.TicksGame;\n\t\t\t}\n\t\t\tWarmupComplete();\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic virtual void WarmupComplete()\n\t{\n\t\tburstShotsLeft = ShotsPerBurst;\n\t\tstate = VerbState.Bursting;\n\t\tTryCastNextBurstShot();\n\t}\n\n\tpublic void VerbTick()\n\t{\n\t\tif (state == VerbState.Bursting)\n\t\t{\n\t\t\tif (!caster.Spawned || (caster is Pawn pawn && pawn.stances.stunner.Stunned))\n\t\t\t{\n\t\t\t\tReset();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tticksToNextBurstShot--;\n\t\t\t\tif (ticksToNextBurstShot <= 0)\n\t\t\t\t{\n\t\t\t\t\tTryCastNextBurstShot();\n\t\t\t\t}\n\t\t\t\tBurstingTick();\n\t\t\t}\n\t\t}\n\t\tfor (int num = maintainedEffecters.Count - 1; num >= 0; num--)\n\t\t{\n\t\t\tEffecter item = maintainedEffecters[num].Item1;\n\t\t\tif (item.ticksLeft > 0)\n\t\t\t{\n\t\t\t\tTargetInfo item2 = maintainedEffecters[num].Item2;\n\t\t\t\tTargetInfo item3 = maintainedEffecters[num].Item3;\n\t\t\t\titem.EffectTick(item2, item3);\n\t\t\t\titem.ticksLeft--;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\titem.Cleanup();\n\t\t\t\tmaintainedEffecters.RemoveAt(num);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic virtual void BurstingTick()\n\t{\n\t}\n\n\tpublic void AddEffecterToMaintain(Effecter eff, IntVec3 pos, int ticks, Map map = null)\n\t{\n\t\teff.ticksLeft = ticks;\n\t\tTargetInfo targetInfo = new TargetInfo(pos, map ?? caster.Map);\n\t\tmaintainedEffecters.Add(new Tuple(eff, targetInfo, targetInfo));\n\t}\n\n\tpublic void AddEffecterToMaintain(Effecter eff, IntVec3 posA, IntVec3 posB, int ticks, Map map = null)\n\t{\n\t\teff.ticksLeft = ticks;\n\t\tTargetInfo item = new TargetInfo(posA, map ?? caster.Map);\n\t\tTargetInfo item2 = new TargetInfo(posB, map ?? caster.Map);\n\t\tmaintainedEffecters.Add(new Tuple(eff, item, item2));\n\t}\n\n\tpublic virtual bool Available()\n\t{\n\t\tif (verbProps.consumeFuelPerShot > 0f)\n\t\t{\n\t\t\tCompRefuelable compRefuelable = caster.TryGetComp();\n\t\t\tif (compRefuelable != null && compRefuelable.Fuel < verbProps.consumeFuelPerShot)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tCompApparelVerbOwner compApparelVerbOwner = EquipmentSource?.GetComp();\n\t\tif (compApparelVerbOwner != null && !compApparelVerbOwner.CanBeUsed(out var reason))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (CasterIsPawn && EquipmentSource != null && EquipmentUtility.RolePreventsFromUsing(CasterPawn, EquipmentSource, out reason))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprotected void TryCastNextBurstShot()\n\t{\n\t\tLocalTargetInfo localTargetInfo = currentTarget;\n\t\tif (Available() && TryCastShot())\n\t\t{\n\t\t\tif (verbProps.muzzleFlashScale > 0.01f)\n\t\t\t{\n\t\t\t\tFleckMaker.Static(caster.Position, caster.Map, FleckDefOf.ShotFlash, verbProps.muzzleFlashScale);\n\t\t\t}\n\t\t\tif (verbProps.soundCast != null)\n\t\t\t{\n\t\t\t\tverbProps.soundCast.PlayOneShot(new TargetInfo(caster.Position, caster.MapHeld));\n\t\t\t}\n\t\t\tif (verbProps.soundCastTail != null)\n\t\t\t{\n\t\t\t\tverbProps.soundCastTail.PlayOneShotOnCamera(caster.Map);\n\t\t\t}\n\t\t\tif (CasterIsPawn)\n\t\t\t{\n\t\t\t\tCasterPawn.Notify_UsedVerb(CasterPawn, this);\n\t\t\t\tif (CasterPawn.thinker != null && localTargetInfo == CasterPawn.mindState.enemyTarget)\n\t\t\t\t{\n\t\t\t\t\tCasterPawn.mindState.Notify_EngagedTarget();\n\t\t\t\t}\n\t\t\t\tif (CasterPawn.mindState != null)\n\t\t\t\t{\n\t\t\t\t\tCasterPawn.mindState.Notify_AttackedTarget(localTargetInfo);\n\t\t\t\t}\n\t\t\t\tif (CasterPawn.MentalState != null)\n\t\t\t\t{\n\t\t\t\t\tCasterPawn.MentalState.Notify_AttackedTarget(localTargetInfo);\n\t\t\t\t}\n\t\t\t\tif (TerrainDefSource != null)\n\t\t\t\t{\n\t\t\t\t\tCasterPawn.meleeVerbs.Notify_UsedTerrainBasedVerb();\n\t\t\t\t}\n\t\t\t\tif (CasterPawn.health != null)\n\t\t\t\t{\n\t\t\t\t\tCasterPawn.health.Notify_UsedVerb(this, localTargetInfo);\n\t\t\t\t}\n\t\t\t\tif (EquipmentSource != null)\n\t\t\t\t{\n\t\t\t\t\tEquipmentSource.Notify_UsedWeapon(CasterPawn);\n\t\t\t\t}\n\t\t\t\tif (!CasterPawn.Spawned)\n\t\t\t\t{\n\t\t\t\t\tReset();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (verbProps.consumeFuelPerShot > 0f)\n\t\t\t{\n\t\t\t\tcaster.TryGetComp()?.ConsumeFuel(verbProps.consumeFuelPerShot);\n\t\t\t}\n\t\t\tburstShotsLeft--;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tburstShotsLeft = 0;\n\t\t}\n\t\tif (burstShotsLeft > 0)\n\t\t{\n\t\t\tticksToNextBurstShot = TicksBetweenBurstShots;\n\t\t\tif (CasterIsPawn && !NonInterruptingSelfCast)\n\t\t\t{\n\t\t\t\tCasterPawn.stances.SetStance(new Stance_Cooldown(TicksBetweenBurstShots + 1, currentTarget, this));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tstate = VerbState.Idle;\n\t\tif (CasterIsPawn && !NonInterruptingSelfCast)\n\t\t{\n\t\t\tCasterPawn.stances.SetStance(new Stance_Cooldown(verbProps.AdjustedCooldownTicks(this, CasterPawn), currentTarget, this));\n\t\t}\n\t\tif (castCompleteCallback != null)\n\t\t{\n\t\t\tcastCompleteCallback();\n\t\t}\n\t\tif (verbProps.consumeFuelPerBurst > 0f)\n\t\t{\n\t\t\tcaster.TryGetComp()?.ConsumeFuel(verbProps.consumeFuelPerBurst);\n\t\t}\n\t}\n\n\tpublic virtual void OrderForceTarget(LocalTargetInfo target)\n\t{\n\t\tif (verbProps.IsMeleeAttack)\n\t\t{\n\t\t\tJob job = JobMaker.MakeJob(JobDefOf.AttackMelee, target);\n\t\t\tjob.playerForced = true;\n\t\t\tif (target.Thing is Pawn pawn)\n\t\t\t{\n\t\t\t\tjob.killIncappedTarget = pawn.Downed;\n\t\t\t}\n\t\t\tCasterPawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);\n\t\t\treturn;\n\t\t}\n\t\tfloat num = verbProps.EffectiveMinRange(target, CasterPawn);\n\t\tif ((float)CasterPawn.Position.DistanceToSquared(target.Cell) < num * num && CasterPawn.Position.AdjacentTo8WayOrInside(target.Cell))\n\t\t{\n\t\t\tMessages.Message(\"MessageCantShootInMelee\".Translate(), CasterPawn, MessageTypeDefOf.RejectInput, historical: false);\n\t\t\treturn;\n\t\t}\n\t\tJob job2 = JobMaker.MakeJob(verbProps.ai_IsWeapon ? JobDefOf.AttackStatic : JobDefOf.UseVerbOnThing);\n\t\tjob2.verbToUse = this;\n\t\tjob2.targetA = target;\n\t\tjob2.endIfCantShootInMelee = true;\n\t\tCasterPawn.jobs.TryTakeOrderedJob(job2, JobTag.Misc);\n\t}\n\n\tprotected abstract bool TryCastShot();\n\n\tpublic void Notify_PickedUp()\n\t{\n\t\tReset();\n\t}\n\n\tpublic virtual void Reset()\n\t{\n\t\tstate = VerbState.Idle;\n\t\tcurrentTarget = null;\n\t\tcurrentDestination = null;\n\t\tburstShotsLeft = 0;\n\t\tticksToNextBurstShot = 0;\n\t\tcastCompleteCallback = null;\n\t\tsurpriseAttack = false;\n\t\tpreventFriendlyFire = false;\n\t}\n\n\tpublic virtual void Notify_EquipmentLost()\n\t{\n\t\tif (!CasterIsPawn)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tPawn casterPawn = CasterPawn;\n\t\tif (casterPawn.Spawned)\n\t\t{\n\t\t\tif (casterPawn.stances.curStance is Stance_Warmup stance_Warmup && stance_Warmup.verb == this)\n\t\t\t{\n\t\t\t\tcasterPawn.stances.CancelBusyStanceSoft();\n\t\t\t}\n\t\t\tif (casterPawn.CurJob != null && casterPawn.CurJob.def == JobDefOf.AttackStatic)\n\t\t\t{\n\t\t\t\tcasterPawn.jobs.EndCurrentJob(JobCondition.Incompletable);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic virtual float HighlightFieldRadiusAroundTarget(out bool needLOSToCenter)\n\t{\n\t\tneedLOSToCenter = false;\n\t\treturn 0f;\n\t}\n\n\tprivate bool CausesTimeSlowdown(LocalTargetInfo castTarg)\n\t{\n\t\tif (!verbProps.CausesTimeSlowdown)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!castTarg.HasThing)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tThing thing = castTarg.Thing;\n\t\tif (thing.def.category != ThingCategory.Pawn && (thing.def.building == null || !thing.def.building.IsTurret))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tPawn pawn = thing as Pawn;\n\t\tbool flag = pawn?.Downed ?? false;\n\t\tif ((CasterPawn != null && CasterPawn.Faction == Faction.OfPlayer && CasterPawn.IsShambler) || (pawn != null && pawn.Faction == Faction.OfPlayer && pawn.IsShambler))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (thing.Faction != Faction.OfPlayer || !caster.HostileTo(Faction.OfPlayer))\n\t\t{\n\t\t\tif (caster.Faction == Faction.OfPlayer && thing.HostileTo(Faction.OfPlayer))\n\t\t\t{\n\t\t\t\treturn !flag;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic virtual bool CanHitTarget(LocalTargetInfo targ)\n\t{\n\t\tif (caster == null || !caster.Spawned)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (targ == caster)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn CanHitTargetFrom(caster.Position, targ);\n\t}\n\n\tpublic virtual bool ValidateTarget(LocalTargetInfo target, bool showMessages = true)\n\t{\n\t\tif (CasterIsPawn && target.Thing is Pawn p && (p.InSameExtraFaction(caster as Pawn, ExtraFactionType.HomeFaction) || p.InSameExtraFaction(caster as Pawn, ExtraFactionType.MiniFaction)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (CasterIsPawn && target.Thing is Pawn victim && HistoryEventUtility.IsKillingInnocentAnimal(CasterPawn, victim) && !new HistoryEvent(HistoryEventDefOf.KilledInnocentAnimal, CasterPawn.Named(HistoryEventArgsNames.Doer)).Notify_PawnAboutToDo())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (CasterIsPawn && target.Thing is Pawn pawn && CasterPawn.Ideo != null && CasterPawn.Ideo.IsVeneratedAnimal(pawn) && !new HistoryEvent(HistoryEventDefOf.HuntedVeneratedAnimal, CasterPawn.Named(HistoryEventArgsNames.Doer)).Notify_PawnAboutToDo())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic virtual void DrawHighlight(LocalTargetInfo target)\n\t{\n\t\tverbProps.DrawRadiusRing(caster.Position, this);\n\t\tif (target.IsValid)\n\t\t{\n\t\t\tGenDraw.DrawTargetHighlight(target);\n\t\t\tDrawHighlightFieldRadiusAroundTarget(target);\n\t\t}\n\t}\n\n\tprotected void DrawHighlightFieldRadiusAroundTarget(LocalTargetInfo target)\n\t{\n\t\tbool needLOSToCenter;\n\t\tfloat num = HighlightFieldRadiusAroundTarget(out needLOSToCenter);\n\t\tif (!(num > 0.2f) || !TryFindShootLineFromTo(caster.Position, target, out var resultingLine))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (needLOSToCenter)\n\t\t{\n\t\t\tGenExplosion.RenderPredictedAreaOfEffect(resultingLine.Dest, num, verbProps.explosionRadiusRingColor);\n\t\t\treturn;\n\t\t}\n\t\tGenDraw.DrawFieldEdges((from x in GenRadial.RadialCellsAround(resultingLine.Dest, num, useCenter: true)\n\t\t\twhere x.InBounds(Find.CurrentMap)\n\t\t\tselect x).ToList(), verbProps.explosionRadiusRingColor);\n\t}\n\n\tpublic virtual void OnGUI(LocalTargetInfo target)\n\t{\n\t\tTexture2D icon = ((!target.IsValid) ? TexCommand.CannotShoot : ((!(UIIcon != BaseContent.BadTex)) ? TexCommand.Attack : UIIcon));\n\t\tGenUI.DrawMouseAttachment(icon);\n\t}\n\n\tpublic virtual bool CanHitTargetFrom(IntVec3 root, LocalTargetInfo targ)\n\t{\n\t\tif (targ.Thing != null && targ.Thing == caster)\n\t\t{\n\t\t\treturn targetParams.canTargetSelf;\n\t\t}\n\t\tif (targ.Pawn != null && targ.Pawn.IsPsychologicallyInvisible() && caster.HostileTo(targ.Pawn))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (ApparelPreventsShooting())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tShootLine resultingLine;\n\t\treturn TryFindShootLineFromTo(root, targ, out resultingLine);\n\t}\n\n\tpublic bool ApparelPreventsShooting()\n\t{\n\t\treturn FirstApparelPreventingShooting() != null;\n\t}\n\n\tpublic Apparel FirstApparelPreventingShooting()\n\t{\n\t\tif (CasterIsPawn && CasterPawn.apparel != null)\n\t\t{\n\t\t\tList wornApparel = CasterPawn.apparel.WornApparel;\n\t\t\tfor (int i = 0; i < wornApparel.Count; i++)\n\t\t\t{\n\t\t\t\tif (!wornApparel[i].AllowVerbCast(this))\n\t\t\t\t{\n\t\t\t\t\treturn wornApparel[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic bool TryFindShootLineFromTo(IntVec3 root, LocalTargetInfo targ, out ShootLine resultingLine, bool ignoreRange = false)\n\t{\n\t\tif (targ.HasThing && targ.Thing.Map != caster.Map)\n\t\t{\n\t\t\tresultingLine = default(ShootLine);\n\t\t\treturn false;\n\t\t}\n\t\tif (verbProps.IsMeleeAttack || EffectiveRange <= 1.42f)\n\t\t{\n\t\t\tresultingLine = new ShootLine(root, targ.Cell);\n\t\t\treturn ReachabilityImmediate.CanReachImmediate(root, targ, caster.Map, PathEndMode.Touch, null);\n\t\t}\n\t\tCellRect occupiedRect = (targ.HasThing ? targ.Thing.OccupiedRect() : CellRect.SingleCell(targ.Cell));\n\t\tif (!ignoreRange && OutOfRange(root, targ, occupiedRect))\n\t\t{\n\t\t\tresultingLine = new ShootLine(root, targ.Cell);\n\t\t\treturn false;\n\t\t}\n\t\tif (!verbProps.requireLineOfSight)\n\t\t{\n\t\t\tresultingLine = new ShootLine(root, targ.Cell);\n\t\t\treturn true;\n\t\t}\n\t\tIntVec3 goodDest;\n\t\tif (CasterIsPawn)\n\t\t{\n\t\t\tif (CanHitFromCellIgnoringRange(root, targ, out goodDest))\n\t\t\t{\n\t\t\t\tresultingLine = new ShootLine(root, goodDest);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tShootLeanUtility.LeanShootingSourcesFromTo(root, occupiedRect.ClosestCellTo(root), caster.Map, tempLeanShootSources);\n\t\t\tfor (int i = 0; i < tempLeanShootSources.Count; i++)\n\t\t\t{\n\t\t\t\tIntVec3 intVec = tempLeanShootSources[i];\n\t\t\t\tif (CanHitFromCellIgnoringRange(intVec, targ, out goodDest))\n\t\t\t\t{\n\t\t\t\t\tresultingLine = new ShootLine(intVec, goodDest);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforeach (IntVec3 item in caster.OccupiedRect())\n\t\t\t{\n\t\t\t\tif (CanHitFromCellIgnoringRange(item, targ, out goodDest))\n\t\t\t\t{\n\t\t\t\t\tresultingLine = new ShootLine(item, goodDest);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tresultingLine = new ShootLine(root, targ.Cell);\n\t\treturn false;\n\t}\n\n\tpublic bool OutOfRange(IntVec3 root, LocalTargetInfo targ, CellRect occupiedRect)\n\t{\n\t\tfloat num = verbProps.EffectiveMinRange(targ, caster);\n\t\tfloat num2 = occupiedRect.ClosestDistSquaredTo(root);\n\t\tif (num2 > EffectiveRange * EffectiveRange || num2 < num * num)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate bool CanHitFromCellIgnoringRange(IntVec3 sourceCell, LocalTargetInfo targ, out IntVec3 goodDest)\n\t{\n\t\tif (targ.Thing != null)\n\t\t{\n\t\t\tif (targ.Thing.Map != caster.Map)\n\t\t\t{\n\t\t\t\tgoodDest = IntVec3.Invalid;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tShootLeanUtility.CalcShootableCellsOf(tempDestList, targ.Thing, sourceCell);\n\t\t\tfor (int i = 0; i < tempDestList.Count; i++)\n\t\t\t{\n\t\t\t\tif (CanHitCellFromCellIgnoringRange(sourceCell, tempDestList[i], targ.Thing.def.Fillage == FillCategory.Full))\n\t\t\t\t{\n\t\t\t\t\tgoodDest = tempDestList[i];\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (CanHitCellFromCellIgnoringRange(sourceCell, targ.Cell))\n\t\t{\n\t\t\tgoodDest = targ.Cell;\n\t\t\treturn true;\n\t\t}\n\t\tgoodDest = IntVec3.Invalid;\n\t\treturn false;\n\t}\n\n\tprivate bool CanHitCellFromCellIgnoringRange(IntVec3 sourceSq, IntVec3 targetLoc, bool includeCorners = false)\n\t{\n\t\tif (verbProps.mustCastOnOpenGround && (!targetLoc.Standable(caster.Map) || caster.Map.thingGrid.CellContains(targetLoc, ThingCategory.Pawn)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (verbProps.requireLineOfSight)\n\t\t{\n\t\t\tif (!includeCorners)\n\t\t\t{\n\t\t\t\tif (!GenSight.LineOfSight(sourceSq, targetLoc, caster.Map, skipFirstCell: true))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (!GenSight.LineOfSightToEdges(sourceSq, targetLoc, caster.Map, skipFirstCell: true))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic override string ToString()\n\t{\n\t\tstring text = ((verbProps == null) ? \"null\" : ((!verbProps.label.NullOrEmpty()) ? verbProps.label : ((HediffCompSource != null) ? HediffCompSource.Def.label : ((EquipmentSource != null) ? EquipmentSource.def.label : ((verbProps.AdjustedLinkedBodyPartsGroup(tool) == null) ? \"unknown\" : verbProps.AdjustedLinkedBodyPartsGroup(tool).defName)))));\n\t\tif (tool != null)\n\t\t{\n\t\t\ttext = text + \"/\" + loadID;\n\t\t}\n\t\treturn $\"{GetType()}({text})\";\n\t}\n}\n\n", "timestamp": "2025-08-22 19:48:28,843" + }, + "ThingOwner-TryAdd-TryAddRange-TryTransferToContainer": { + "keywords": [ + "ThingOwner", + "TryAdd", + "TryAddRange", + "TryTransferToContainer" + ], + "question": "ThingOwner class virtual methods TryAdd TryAddRange TryTransferToContainer", + "embedding": [ + 0.006078479811549187, + -0.0008539823465980589, + -0.02052130177617073, + 0.011929108761250973, + -0.06403351575136185, + 0.04042520001530647, + 0.004759148694574833, + 0.06885513663291931, + 0.05618367716670036, + 0.029517745599150658, + -0.037220582365989685, + -0.05224405974149704, + -0.026269029825925827, + -0.02418161928653717, + -0.03651497885584831, + -0.009474196471273899, + -0.029929347336292267, + -0.1125437542796135, + -0.05239105969667435, + -0.0003801346756517887, + 0.06356311589479446, + 0.041513003408908844, + 0.008827393874526024, + 0.054743070155382156, + 0.06150510534644127, + 0.012568562291562557, + 0.012465661391615868, + 0.029032643884420395, + 0.009731448255479336, + 0.016728682443499565, + -0.01001809909939766, + 0.00038955191848799586, + 0.0012706374982371926, + -0.05915309116244316, + 0.025989728048443794, + 0.011745357885956764, + 0.011502807028591633, + -0.04039580002427101, + -0.0007308692438527942, + 0.048480838537216187, + -0.02247641049325466, + 0.0027636135928332806, + -0.021476805210113525, + -0.004314471501857042, + -0.029238443821668625, + 0.016522882506251335, + 0.029253143817186356, + -0.046746231615543365, + -0.004384296480566263, + 0.04163060709834099, + 0.002495337277650833, + 0.013127164915204048, + -0.03886699303984642, + 0.0032891412265598774, + 0.02394641749560833, + 0.021623807027935982, + -0.038131989538669586, + -0.014913223683834076, + -0.018860192969441414, + 0.03345736488699913, + -0.003965344745665789, + 0.0423068106174469, + -0.02116810530424118, + -0.0380437895655632, + 0.03951379656791687, + -0.01206875964999199, + 0.03472157195210457, + -0.005681578069925308, + 0.0306643508374691, + -0.023858217522501945, + -0.003750355914235115, + -0.018742593005299568, + -0.03822018951177597, + 0.03433936834335327, + -0.03669138252735138, + 0.05800648778676987, + 0.03536837548017502, + 0.029429545626044273, + -0.010988304391503334, + 0.022829212248325348, + -0.025122424587607384, + 0.009753498248755932, + -0.017522485926747322, + 0.054537270218133926, + 0.10978014022111893, + 0.054272666573524475, + -0.010973604395985603, + -0.07526437193155289, + -0.03580937534570694, + 0.009900499135255814, + 0.02180020697414875, + 0.02071240171790123, + 0.031634557992219925, + 0.002998814918100834, + -0.0067252833396196365, + 0.08014479279518127, + -0.10060729831457138, + -0.016037778928875923, + -0.030723150819540024, + 0.018874892964959145, + -0.023667117580771446, + -0.01815458945930004, + -0.006045404821634293, + 0.05118565261363983, + -0.03172275796532631, + 0.1239510104060173, + -0.02588682807981968, + -0.012708213180303574, + -0.021021103486418724, + 0.028812142089009285, + 0.004939224570989609, + -0.009988699108362198, + 0.03254596143960953, + 0.0020745478104799986, + -0.03125235438346863, + -0.0010455426527187228, + 0.0052846758626401424, + -0.04768703505396843, + -0.02501952275633812, + -0.026371929794549942, + 0.05541927367448807, + 0.02334371581673622, + 0.025519326329231262, + -0.013876868411898613, + -0.020609501749277115, + 0.04318881407380104, + 0.011348456144332886, + 0.0282682403922081, + -0.01594957895576954, + -0.007335336413234472, + -0.029870547354221344, + -0.00015986329526640475, + -0.003902869299054146, + -0.024225719273090363, + -0.019756898283958435, + 0.018051689490675926, + 0.05530167371034622, + 0.00983434822410345, + -0.0724419578909874, + 0.01809578947722912, + -0.029400145635008812, + 0.02785663679242134, + 0.0012660437496379018, + -0.013185964897274971, + 0.06150510534644127, + -0.005376551765948534, + -0.07561717182397842, + -0.016537582501769066, + -0.02566632628440857, + 0.005369201302528381, + -0.02784193679690361, + 0.020447801798582077, + -0.012134909629821777, + 0.05133265256881714, + 0.018624991178512573, + 0.002504524774849415, + 0.0016546769766137004, + -0.021271005272865295, + 0.00037186589906923473, + -0.03924919292330742, + 0.03822018951177597, + 0.0055345771834254265, + -0.01622888073325157, + 0.014927923679351807, + 0.012340710498392582, + -0.03774978592991829, + -0.012715563178062439, + 0.009385996498167515, + 0.07032514363527298, + -0.00907729472965002, + 0.05956469476222992, + 0.008283491246402264, + 0.0056448280811309814, + 0.02052130177617073, + 0.04901004210114479, + -0.041748207062482834, + 0.010245950892567635, + 0.039160992950201035, + 0.011561607010662556, + -0.05009784922003746, + 0.05909429118037224, + -0.0019367345375940204, + 0.012767013162374496, + 0.014354621060192585, + 0.02118280529975891, + -0.02609262801706791, + 0.028753342106938362, + 0.013560816645622253, + 0.011987908743321896, + 0.05150905251502991, + 0.003939619287848473, + 0.04095440357923508, + 0.006879633758217096, + 0.017742987722158432, + -0.04236561059951782, + 0.01855149120092392, + -0.03727938234806061, + 0.02524002455174923, + -0.10913334041833878, + -0.008768592961132526, + 0.0043585714884102345, + -0.018433891236782074, + 0.036838382482528687, + 0.01380336843430996, + 0.039601996541023254, + -0.023035014048218727, + 0.0065929824486374855, + -0.02134450525045395, + 0.01046645175665617, + 0.02631312981247902, + 0.026033828034996986, + 0.006534182466566563, + -0.007155260536819696, + -0.04245381057262421, + -0.02695993334054947, + -0.0029933021869510412, + -0.027136333286762238, + -0.003075990127399564, + 0.037661585956811905, + 0.027445035055279732, + -0.013935668393969536, + 0.004376946482807398, + -0.002739726100116968, + -0.042395010590553284, + -0.008871493861079216, + -0.020859403535723686, + -0.0027525885961949825, + -0.026886433362960815, + 0.003226666012778878, + -0.0056448280811309814, + -0.04051339998841286, + 0.016566982492804527, + -0.08467242121696472, + -0.012517111375927925, + 0.007644037716090679, + -0.028371140360832214, + -0.025945628061890602, + -0.002388761844485998, + -0.007236110512167215, + 0.002947364468127489, + 0.0023005614057183266, + 0.02610732801258564, + -0.0009775548242032528, + 0.05130325257778168, + 0.002002884866669774, + -0.004990674555301666, + -0.03366316482424736, + 0.04539382457733154, + 0.031222954392433167, + 0.0048326486721634865, + 0.0332515649497509, + 0.01165715791285038, + -0.05888849124312401, + 0.020653601735830307, + -0.023167314007878304, + 0.03627977892756462, + 0.0019587846472859383, + -0.003325891448184848, + -0.008606892079114914, + -0.033810168504714966, + -0.014001819305121899, + 0.041571807116270065, + 0.00426669605076313, + -0.009525647386908531, + -0.020168500021100044, + 0.017860587686300278, + 0.021535607054829597, + 0.01794878952205181, + -0.03883759304881096, + -0.023446615785360336, + -0.017331385985016823, + 0.052773259580135345, + -0.00777633860707283, + -0.042424410581588745, + -0.024505021050572395, + 0.02981174737215042, + 0.01637588068842888, + 0.04483522102236748, + -0.014185570180416107, + -0.002296886406838894, + 0.0028260890394449234, + 0.006390856578946114, + 0.007460286840796471, + -0.015361575409770012, + 0.039631396532058716, + 0.02265281230211258, + 0.013671067543327808, + 0.0023611991200596094, + 0.003437979379668832, + -0.05724208429455757, + 0.02657773159444332, + 0.03513317182660103, + 0.043482813984155655, + 0.024211019277572632, + -0.03304576501250267, + 0.026886433362960815, + 0.003015352413058281, + 0.009011144749820232, + 0.002293211407959461, + 0.021006403490900993, + -0.016522882506251335, + 0.04654042795300484, + -0.012656762264668941, + 0.007361061405390501, + 0.03777918592095375, + 0.023814117535948753, + 0.006074804812669754, + -0.1676984280347824, + 0.017845887690782547, + -0.12159900367259979, + 0.006387181580066681, + 0.01661108247935772, + -0.03904339298605919, + 0.02526942454278469, + 0.00588370393961668, + 0.04207160696387291, + -0.021756106987595558, + -0.015582077205181122, + 0.008349641226232052, + 0.026915833353996277, + -0.009841698221862316, + 0.04107200354337692, + 0.041307203471660614, + 0.015243975445628166, + -0.02895914390683174, + 0.004509247373789549, + 0.04042520001530647, + -0.012384811416268349, + -0.013222714886069298, + -0.015523276291787624, + -0.05806528776884079, + 0.011289656162261963, + 0.010672252625226974, + 0.0041564456187188625, + 0.04424721747636795, + -0.03319276496767998, + -0.01392831839621067, + 0.0003445329493843019, + -0.010076900012791157, + -0.0018365903524681926, + 0.02867984212934971, + -0.05286145955324173, + 0.026386629790067673, + -0.028385840356349945, + 0.02873864211142063, + 0.006611357443034649, + -0.023696517571806908, + 0.01813988946378231, + 0.007982139475643635, + 0.009106694720685482, + -0.02371121756732464, + -0.007489686831831932, + -0.02848874032497406, + 0.03627977892756462, + -0.006291631143540144, + -0.01101035438477993, + 0.03348676487803459, + 0.00582857895642519, + -0.043482813984155655, + 0.012752313166856766, + 0.03780858591198921, + -0.02719513513147831, + 0.05747728422284126, + 0.002901426749303937, + 0.02415221929550171, + -0.006287956144660711, + -0.004347546491771936, + 0.005413301754742861, + -0.0067252833396196365, + -0.01045175176113844, + -0.006096855271607637, + -0.060329098254442215, + -0.015030824579298496, + 0.000876951206009835, + 0.024005219340324402, + -0.018242789432406425, + 0.03084075264632702, + -0.04792223498225212, + 0.019815698266029358, + 0.07591117173433304, + -0.005692603066563606, + 0.008820043876767159, + -0.026680631563067436, + -0.00572935352101922, + -0.023182014003396034, + 0.007526437286287546, + -0.012678812257945538, + 0.02157970704138279, + 0.03927859291434288, + -0.015493876300752163, + 0.001029005041345954, + 0.03145815432071686, + -0.06156390532851219, + -0.006188730709254742, + -0.009547697380185127, + 0.01621418073773384, + 0.013876868411898613, + 0.032281357795000076, + 0.01500142365694046, + -0.004571722354739904, + 0.01594957895576954, + -0.013163914903998375, + 0.00567055307328701, + 0.01983039826154709, + 0.006773058325052261, + -0.01940409652888775, + 0.029635345563292503, + 0.01944819651544094, + -0.03777918592095375, + 0.0029051017481833696, + -0.056036677211523056, + 0.0069384342059493065, + 0.03883759304881096, + -0.018169289454817772, + -0.031222954392433167, + -0.033369164913892746, + 0.02047720178961754, + -0.01944819651544094, + 0.019345294684171677, + -0.1034885123372078, + 0.03084075264632702, + 0.03645617887377739, + 0.00013700926501769572, + 0.013340315781533718, + 0.030517350882291794, + -0.02848874032497406, + -0.007067060098052025, + -0.06303390860557556, + -0.012620012275874615, + 0.007078085094690323, + -0.02806243859231472, + -0.03777918592095375, + 0.029605945572257042, + 0.05092105269432068, + 0.013840118423104286, + -0.0530378632247448, + 0.04901004210114479, + -0.03263416141271591, + -0.03977839648723602, + -0.03448637202382088, + -0.024710822850465775, + -0.002739726100116968, + -0.012046709656715393, + -0.0039065442979335785, + -0.07532317191362381, + -0.013112464919686317, + 0.003570280037820339, + 0.02591622807085514, + 0.04118960350751877, + 0.046716831624507904, + 0.0013790505472570658, + -0.01370046753436327, + -0.07455876469612122, + 0.03178155794739723, + 0.02895914390683174, + 0.011605706997215748, + 0.010172449983656406, + -0.027959538623690605, + -0.02544582635164261, + -0.017360785976052284, + -0.006875958759337664, + -0.02741563506424427, + -0.008930293843150139, + 0.027048133313655853, + 0.00453864736482501, + -0.0209623035043478, + -0.0742647647857666, + 0.014582471922039986, + -0.004406346939504147, + -0.00652683200314641, + 0.00048693991266191006, + -0.0028830517549067736, + 0.004759148694574833, + -0.024534421041607857, + 0.03663258254528046, + -0.04818683862686157, + -0.018816092982888222, + 0.0018806905718520284, + 0.004549672361463308, + -0.011929108761250973, + 0.006159330252557993, + -0.0040351697243750095, + -0.031222954392433167, + 0.014237020164728165, + -0.017169684171676636, + -0.05791828781366348, + -0.06797313690185547, + -0.019918598234653473, + 0.01466332282871008, + -0.04224800691008568, + -0.0076293377205729485, + -0.015493876300752163, + -0.023784717544913292, + 0.005016399547457695, + -0.024754922837018967, + 0.017316685989499092, + -0.035515375435352325, + 0.0095109473913908, + -0.014369321055710316, + -0.09225765615701675, + -0.01424437016248703, + 0.04633462801575661, + -0.017419585958123207, + -0.01218636054545641, + 0.021756106987595558, + 0.004568047355860472, + -0.06250470876693726, + -0.03366316482424736, + -0.051450252532958984, + 0.07173635065555573, + 0.0010703490115702152, + 0.005835928954184055, + 0.025798628106713295, + -0.0375145860016346, + -0.0009986861841753125, + 0.0051781004294753075, + 0.07050155103206635, + -0.00512665044516325, + 0.007923339493572712, + 0.05371406674385071, + -0.013185964897274971, + -0.0077469381503760815, + -0.0015150262042880058, + -0.008570142090320587, + -0.026033828034996986, + 0.004303446039557457, + -0.030091049149632454, + 0.0119658587500453, + 0.015611477196216583, + -0.0037264684215188026, + -0.006670157890766859, + 0.043071214109659195, + -0.002585375215858221, + -0.005159725435078144, + 0.00894499383866787, + 0.05121505260467529, + 0.0029675771947950125, + 0.016125978901982307, + 0.0023464991245418787, + 0.10260650515556335, + 0.022549910470843315, + 0.029473645612597466, + 0.00970939826220274, + -0.010848653502762318, + 0.08096799999475479, + -0.04959804564714432, + 0.02371121756732464, + -0.07920399308204651, + 0.027739036828279495, + 0.0026496881619095802, + 0.0036750182043761015, + 0.05927069112658501, + -9.824931476032361e-05, + 0.020374299958348274, + 0.03283996134996414, + -0.026004428043961525, + 0.013671067543327808, + -0.01662578247487545, + 0.021418005228042603, + -0.06791433691978455, + 0.01896309293806553, + -0.019712796434760094, + -0.03945499658584595, + -0.03910219296813011, + 0.006394531577825546, + 0.032516561448574066, + 0.007210385520011187, + 0.02135920524597168, + 0.0004628225869964808, + -0.02569572627544403, + -0.02571042627096176, + 0.03000284731388092, + -0.007607287727296352, + 0.052567459642887115, + 0.0735003650188446, + -0.031164154410362244, + -0.0024457245599478483, + 0.0742647647857666, + 0.06344551593065262, + -0.04213040694594383, + 0.00016238987154792994, + 0.014972023665904999, + -0.0209623035043478, + -0.002914289478212595, + 0.002976764691993594, + 0.03178155794739723, + -0.006166680250316858, + -0.0037411684170365334, + -0.01768418774008751, + -0.004138070624321699, + 0.02246171049773693, + 0.0032450410071760416, + -0.034839171916246414, + -0.004641547799110413, + -0.006074804812669754, + 0.013303565792739391, + 0.018639691174030304, + 0.02738623507320881, + -0.005233225878328085, + 0.04621702805161476, + -0.030987752601504326, + 0.03689718246459961, + -0.009951949119567871, + 0.00426669605076313, + 0.020565401762723923, + 0.020638901740312576, + 0.005538252182304859, + -0.0027360511012375355, + 0.021873708814382553, + -0.0013533254386857152, + 0.014369321055710316, + 0.0500684455037117, + -0.00021659638150595129, + 0.010143049992620945, + 0.00035716581624001265, + -0.008452542126178741, + 0.021506207063794136, + 0.0025614877231419086, + -0.012237810529768467, + 0.0004632819618564099, + -0.009283095598220825, + -0.01165715791285038, + 0.02762143686413765, + -0.037867385894060135, + 0.02657773159444332, + -0.0018025963800027966, + 0.06250470876693726, + -0.00196797214448452, + 0.002647850662469864, + 0.016125978901982307, + -0.007599937729537487, + 0.021418005228042603, + -0.03307516500353813, + 0.02115340530872345, + 0.006159330252557993, + -0.008158540353178978, + -0.04421781748533249, + 0.015934878960251808, + 0.033133964985609055, + 0.012318660505115986, + 0.03131115436553955, + 0.005402276758104563, + 0.00962119735777378, + 0.02005089819431305, + -0.0003475189150776714, + -0.004149095620959997, + -0.006648107897490263, + -0.03360436484217644, + 0.004777523688971996, + -0.012090809643268585, + 0.014567771926522255, + 0.014817672781646252, + 0.002030447591096163, + -0.014090019278228283, + -0.04071919992566109, + 0.012039359658956528, + -0.004042520187795162, + 0.021903108805418015, + 0.011833558790385723, + 0.007452936843037605, + -0.0196686964482069, + 0.009577097371220589, + -0.025798628106713295, + -0.0004687944892793894, + 0.05065644904971123, + -0.018463291227817535, + 0.00022348704806063324, + -0.017007984220981598, + 0.010672252625226974, + -0.02806243859231472, + 0.04950984567403793, + -0.01794878952205181, + 0.022314710542559624, + -0.0037062556948512793, + 0.009224295616149902, + 0.03910219296813011, + 0.005681578069925308, + -0.030576150864362717, + 0.013685767538845539, + 0.027474435046315193, + 0.0019054969307035208, + 0.00907729472965002, + -0.030135149136185646, + 0.056007277220487595, + -0.019301194697618484, + 0.03295756131410599, + 0.0008659261511638761, + 0.01090745348483324, + -0.04624642804265022, + -0.012517111375927925, + 0.04809863865375519, + -0.015155774541199207, + 0.02765083685517311, + 0.010944204404950142, + -0.042189206928014755, + 0.013641667552292347, + -0.008246740326285362, + -0.057300884276628494, + 0.02182960696518421, + 0.05012724921107292, + -0.02028609998524189, + 0.006515807006508112, + 0.09319846332073212, + -0.0019661346450448036, + -0.0142296701669693, + -0.008937643840909004, + -0.019771598279476166, + -0.029267843812704086, + -0.011738007888197899, + 0.014207620173692703, + -0.025813328102231026, + 0.012377461418509483, + 0.005949854385107756, + 0.014604521915316582, + -0.004718723241239786, + 0.01769888773560524, + 0.021506207063794136, + -0.0172725860029459, + -0.0644451156258583, + 0.000543443311471492, + -0.018463291227817535, + 0.0009665297693572938, + -0.008437841199338436, + 0.04030760005116463, + -0.015978978946805, + 0.0016721332212910056, + 0.012737613171339035, + -0.012215760536491871, + -0.04621702805161476, + 0.06550352275371552, + 0.01424437016248703, + -0.041101403534412384, + -0.0015949578955769539, + -0.0012761499965563416, + 0.00680245878174901, + -0.02177080698311329, + 0.02157970704138279, + -0.028121238574385643, + 0.006967834196984768, + 0.03904339298605919, + -0.0044798469170928, + -0.0174636859446764, + 0.11030934751033783, + -0.0419246070086956, + 0.010811903513967991, + -0.02438742108643055, + -0.021476805210113525, + 0.06297510862350464, + -0.0011861120583489537, + 0.00865099299699068, + -0.010760453529655933, + 0.03845538944005966, + -0.004027819726616144, + 0.007254485972225666, + 0.03425116837024689, + 0.000848469790071249, + 0.06373951584100723, + 0.005894728936254978, + 0.005376551765948534, + -0.0012577750021591783, + -0.011899708770215511, + -0.01680218242108822, + 0.01897779293358326, + 0.014913223683834076, + -0.004351221490651369, + 0.0016473268624395132, + 0.0371323823928833, + -0.019139494746923447, + -0.026621831580996513, + 0.027724336832761765, + -0.022520510479807854, + 0.057065680623054504, + -0.01282581314444542, + 0.07155995070934296, + -0.013796018436551094, + 0.03460397198796272, + -0.007192010525614023, + -0.0032321785110980272, + -0.03063495084643364, + -0.04295361042022705, + 0.009996049106121063, + 0.004545997362583876, + -0.06550352275371552, + -0.019727498292922974, + 0.01856619119644165, + 0.03304576501250267, + -0.03087015263736248, + 0.02763613685965538, + -0.00040080666076391935, + 0.07914519309997559, + 0.0052993763238191605, + -0.04706963151693344, + 0.01391361840069294, + -0.007265510968863964, + -0.005946179386228323, + -0.03001754730939865, + -0.029062043875455856, + 0.08631882816553116, + 0.01163510698825121, + 0.02718043327331543, + 0.0055603026412427425, + -0.027592036873102188, + -0.020139100030064583, + 0.007967439480125904, + 0.018654393032193184, + 0.008562792092561722, + -0.008349641226232052, + -0.025195924565196037, + -0.053184863179922104, + 0.0336337648332119, + -0.04509982094168663, + -0.02675413154065609, + 0.028753342106938362, + -0.005799178499728441, + -0.011003004387021065, + 0.026166129857301712, + 0.016522882506251335, + 0.011929108761250973, + -0.026210229843854904, + -0.018198689445853233, + 0.004509247373789549, + 0.026019128039479256, + 0.012649412266910076, + -0.003950644284486771, + 0.025137124583125114, + -0.020374299958348274, + 0.014104719273746014, + -0.04595242813229561, + -0.002906939247623086, + 0.015214575454592705, + 0.07826318591833115, + -0.009422746486961842, + -0.05932949110865593, + 0.07126595079898834, + 0.03307516500353813, + 0.043747417628765106, + -0.031840357929468155, + -0.0011567119508981705, + -0.018727893009781837, + -0.03201675787568092, + -0.017110884189605713, + -0.010973604395985603, + -0.0042740460485219955, + 0.012524462305009365, + -0.03175215795636177, + 0.002971252193674445, + 0.01684628240764141, + -0.016758082434535027, + -0.029899947345256805, + 0.004733423236757517, + 0.05885909125208855, + 0.010216550901532173, + -0.006030704826116562, + -0.01489117369055748, + 0.03469217196106911, + 0.04210100695490837, + -0.004178495611995459, + -0.030135149136185646, + 0.010304750874638557, + -0.004270371049642563, + -0.002925314474850893, + -0.013560816645622253, + -0.025578126311302185, + -0.0079894894734025, + -0.01963929645717144, + -0.014112069271504879, + 0.049068842083215714, + 0.005755078513175249, + 0.03586817532777786, + -0.03216375783085823, + 0.04189520701766014, + 0.07838078588247299, + -0.009518297389149666, + -0.012480361387133598, + 0.01944819651544094, + -0.03451577201485634, + -0.02547522634267807, + 0.024255119264125824, + -0.005755078513175249, + 0.020550701767206192, + -0.03301636129617691, + -0.0239317175000906, + 0.00906259473413229, + 0.009518297389149666, + -0.025519326329231262, + 0.03460397198796272, + -0.0004455959424376488, + -0.016699282452464104, + -0.011157355271279812, + 0.034221768379211426, + 0.04365921393036842, + -0.00841579120606184, + 0.002664388157427311, + 0.018507391214370728, + 0.0014690884854644537, + -0.00981964822858572, + 0.011686557903885841, + 0.024064019322395325, + 0.0001028430851874873, + 0.00013700926501769572, + -0.025813328102231026, + -0.0833200141787529, + 0.06350431591272354, + -0.02591622807085514, + -0.03345736488699913, + -0.005909429397433996, + -0.03369256481528282, + -0.02571042627096176, + -0.011502807028591633, + 0.01985979825258255, + -0.009555047377943993, + 0.015493876300752163, + 0.031840357929468155, + -0.008408441208302975, + -0.003439816879108548, + 0.02528412453830242, + -0.007519087288528681, + 0.06321030855178833, + -0.003658480476588011, + -0.012112859636545181, + -0.011319056153297424, + 0.027018733322620392, + 0.016537582501769066, + -0.040895603597164154, + 0.024563821032643318, + -0.0029510394670069218, + 0.01815458945930004, + -0.019756898283958435, + -0.01962459646165371, + 0.0358387753367424, + 0.048921842128038406, + 0.04033700004220009, + 0.02672473154962063, + 0.021315105259418488, + 0.061387501657009125, + -0.008151190355420113, + -0.03472157195210457, + 0.006409231573343277, + 0.0015637201722711325, + -0.054919470101594925, + 0.029032643884420395, + -0.009988699108362198, + 0.019168894737958908, + 0.005350826308131218, + -0.015846678987145424, + 0.032928161323070526, + 0.02134450525045395, + -0.031575754284858704, + 0.03604457899928093, + -0.01621418073773384, + -0.04512922465801239, + -0.01686098240315914, + 0.008327591232955456, + 0.007585237268358469, + -0.05991749465465546, + 0.013002214021980762, + 0.018669093027710915, + -0.006409231573343277, + -0.0005985685857012868, + -0.021285705268383026, + 0.06215190514922142, + 0.005152375437319279, + 0.0013165752170607448, + -0.003654805477708578, + -0.015346875414252281, + -0.03866118937730789, + -0.01946289651095867, + -0.03736758604645729, + -0.009657947346568108, + 0.005251600872725248, + 0.007353711407631636, + 0.0388081930577755, + -0.011730657890439034, + -0.06850233674049377, + 0.023417215794324875, + 0.024255119264125824, + -0.00358681776560843, + -0.03283996134996414, + -0.07708717882633209, + 0.0077469381503760815, + 0.0025780252180993557, + 0.032722361385822296, + -0.024284519255161285, + -0.020550701767206192, + -0.018272189423441887, + -0.06115230172872543, + 0.013002214021980762, + -0.024284519255161285, + 0.020330199971795082, + -0.04430601745843887, + -0.00432549649849534, + -0.06450391560792923, + -0.007379436399787664, + 0.028106538578867912, + 0.03525077551603317, + -0.012634712271392345, + -0.025137124583125114, + -0.020388999953866005, + 0.031193554401397705, + -0.003627242986112833, + 0.008151190355420113, + 0.00810709036886692, + -0.0102533008903265, + -0.005714653059840202, + -0.006251205690205097, + 0.0020010473672300577, + -0.08620122820138931, + 0.0021792857442051172, + 0.002517387503758073, + 0.02632782980799675, + 0.08302600681781769, + 0.004759148694574833, + 0.015258675441145897, + -0.008695092983543873, + 0.061387501657009125, + -0.04704023152589798, + 0.00010112042218679562, + 0.011510157026350498, + -0.01123820524662733, + -0.014861773699522018, + -0.036338578909635544, + 0.021256305277347565, + 0.05330246314406395, + 0.011495457030832767 + ], + "result": "--- 结果 1 (相似度: 1.000) ---\n文件路径: C:\\Steam\\steamapps\\common\\RimWorld\\Data\\dll1.6\\Verse\\ThingOwner.txt\n\npublic class ThingOwner : ThingOwner, IList, ICollection, IEnumerable, IEnumerable where T : Thing\n{\n\tprivate List innerList = new List();\n\n\tpublic List InnerListForReading => innerList;\n\n\tpublic new T this[int index] => innerList[index];\n\n\tpublic override int Count => innerList.Count;\n\n\tT IList.this[int index]\n\t{\n\t\tget\n\t\t{\n\t\t\treturn innerList[index];\n\t\t}\n\t\tset\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow setting individual elements.\");\n\t\t}\n\t}\n\n\tbool ICollection.IsReadOnly => true;\n\n\tpublic ThingOwner()\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, bool oneStackOnly, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner, oneStackOnly, contentsLookMode, removeContentsIfDestroyed)\n\t{\n\t}\n\n\tpublic override void ExposeData()\n\t{\n\t\tbase.ExposeData();\n\t\tScribe_Collections.Look(ref innerList, \"innerList\", true, contentsLookMode);\n\t\tif (Scribe.mode == LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\tint num = innerList.RemoveAll((T x) => x == null || (x is MinifiedThing minifiedThing && minifiedThing.InnerThing == null));\n\t\t\tif (num > 0)\n\t\t\t{\n\t\t\t\tLog.Warning($\"ThingOwner removed {num} invalid entries during PostLoadInit.\");\n\t\t\t}\n\t\t}\n\t\tif (Scribe.mode != LoadSaveMode.LoadingVars && Scribe.mode != LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] != null)\n\t\t\t{\n\t\t\t\tinnerList[i].holdingOwner = this;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic List.Enumerator GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tpublic override int GetCountCanAccept(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (!(item is T))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\treturn base.GetCountCanAccept(item, canMergeWithExistingStacks);\n\t}\n\n\tpublic override int TryAdd(Thing item, int count, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (count <= 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item?.ToString() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + count + \" of \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tint stackCount = item.stackCount;\n\t\tint num = Mathf.Min(stackCount, count);\n\t\tThing thing = item.SplitOff(num);\n\t\tif (!TryAdd((T)thing, canMergeWithExistingStacks))\n\t\t{\n\t\t\tif (thing != item)\n\t\t\t{\n\t\t\t\tint result = stackCount - item.stackCount - thing.stackCount;\n\t\t\t\titem.TryAbsorbStack(thing, respectStackLimit: false);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn stackCount - item.stackCount;\n\t\t}\n\t\tCompPushable compPushable = item.TryGetComp();\n\t\tif (compPushable != null && owner is Pawn pawn)\n\t\t{\n\t\t\tcompPushable.OnStartedCarrying(pawn);\n\t\t}\n\t\treturn num;\n\t}\n\n\tpublic override bool TryAdd(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (canMergeWithExistingStacks)\n\t\t{\n\t\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t\t{\n\t\t\t\tT val = innerList[i];\n\t\t\t\tif (!val.CanStackWith(item))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint num = Mathf.Min(item.stackCount, val.def.stackLimit - val.stackCount);\n\t\t\t\tif (num > 0)\n\t\t\t\t{\n\t\t\t\t\tThing other = item.SplitOff(num);\n\t\t\t\t\tint stackCount = val.stackCount;\n\t\t\t\t\tval.TryAbsorbStack(other, respectStackLimit: true);\n\t\t\t\t\tif (val.stackCount > stackCount)\n\t\t\t\t\t{\n\t\t\t\t\t\tNotifyAddedAndMergedWith(val, val.stackCount - stackCount);\n\t\t\t\t\t}\n\t\t\t\t\tif (item.Destroyed || item.stackCount == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Count >= maxStacks)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\titem.holdingOwner = this;\n\t\tinnerList.Add(item2);\n\t\tNotifyAdded(item2);\n\t\treturn true;\n\t}\n\n\tprotected override void NotifyAdded(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemAdded(item as T);\n\t\t}\n\t\tbase.NotifyAdded(item);\n\t}\n\n\tprotected override void NotifyRemoved(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemRemoved(item as T);\n\t\t}\n\t\tbase.NotifyRemoved(item);\n\t}\n\n\tpublic void TryAddRangeOrTransfer(IEnumerable things, bool canMergeWithExistingStacks = true, bool destroyLeftover = false)\n\t{\n\t\tif (things == this)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (things is ThingOwner thingOwner)\n\t\t{\n\t\t\tthingOwner.TryTransferAllToContainer(this, canMergeWithExistingStacks);\n\t\t\tif (destroyLeftover)\n\t\t\t{\n\t\t\t\tthingOwner.ClearAndDestroyContents();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (things is IList list)\n\t\t{\n\t\t\tfor (int i = 0; i < list.Count; i++)\n\t\t\t{\n\t\t\t\tif (!TryAddOrTransfer(list[i], canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t\t{\n\t\t\t\t\tlist[i].Destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tforeach (T thing in things)\n\t\t{\n\t\t\tif (!TryAddOrTransfer(thing, canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t{\n\t\t\t\tthing.Destroy();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override int IndexOf(Thing item)\n\t{\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\treturn innerList.IndexOf(item2);\n\t}\n\n\tpublic override bool Remove(Thing item)\n\t{\n\t\tif (!Contains(item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner == this)\n\t\t{\n\t\t\titem.holdingOwner = null;\n\t\t}\n\t\tint index = innerList.LastIndexOf((T)item);\n\t\tinnerList.RemoveAt(index);\n\t\tNotifyRemoved(item);\n\t\treturn true;\n\t}\n\n\tpublic int RemoveAll(Predicate predicate)\n\t{\n\t\tint num = 0;\n\t\tfor (int num2 = innerList.Count - 1; num2 >= 0; num2--)\n\t\t{\n\t\t\tif (predicate(innerList[num2]))\n\t\t\t{\n\t\t\t\tRemove(innerList[num2]);\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\t\treturn num;\n\t}\n\n\tprotected override Thing GetAt(int index)\n\t{\n\t\treturn innerList[index];\n\t}\n\n\tpublic void GetThingsOfType(List list) where J : Thing\n\t{\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] is J item)\n\t\t\t{\n\t\t\t\tlist.Add(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic int TryTransferToContainer(Thing item, ThingOwner otherContainer, int stackCount, out T resultingTransferredItem, bool canMergeWithExistingStacks = true)\n\t{\n\t\tThing resultingTransferredItem2;\n\t\tint result = TryTransferToContainer(item, otherContainer, stackCount, out resultingTransferredItem2, canMergeWithExistingStacks);\n\t\tresultingTransferredItem = (T)resultingTransferredItem2;\n\t\treturn result;\n\t}\n\n\tpublic new T Take(Thing thing, int count)\n\t{\n\t\treturn (T)base.Take(thing, count);\n\t}\n\n\tpublic new T Take(Thing thing)\n\t{\n\t\treturn (T)base.Take(thing);\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, int count, out T resultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing resultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, count, out resultingThing2, placedAction2, nearPlaceValidator);\n\t\tresultingThing = (T)resultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, mode, out lastResultingThing2, placedAction2, nearPlaceValidator);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, out lastResultingThing2, placedAction2, nearPlaceValidator, playDropSound: true);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tint IList.IndexOf(T item)\n\t{\n\t\treturn innerList.IndexOf(item);\n\t}\n\n\tvoid IList.Insert(int index, T item)\n\t{\n\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow inserting individual elements at any position.\");\n\t}\n\n\tvoid ICollection.Add(T item)\n\t{\n\t\tTryAdd(item);\n\t}\n\n\tvoid ICollection.CopyTo(T[] array, int arrayIndex)\n\t{\n\t\tinnerList.CopyTo(array, arrayIndex);\n\t}\n\n\tbool ICollection.Contains(T item)\n\t{\n\t\treturn innerList.Contains(item);\n\t}\n\n\tbool ICollection.Remove(T item)\n\t{\n\t\treturn Remove(item);\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n}\n\n", + "timestamp": "2025-08-24 20:52:47,868" + }, + "IThingHolder-ThingOwner-virtual methods": { + "keywords": [ + "ThingOwner", + "IThingHolder", + "virtual methods" + ], + "question": "public class ThingOwner : IThingHolder virtual methods", + "embedding": [ + 0.0014595270622521639, + 0.0027306692209094763, + 0.040208324790000916, + 0.010125240311026573, + -0.06315106898546219, + 0.01258339174091816, + 0.016694942489266396, + 0.05387447401881218, + 0.012312701903283596, + 0.09405353665351868, + -0.051387060433626175, + -0.04582695662975311, + -0.01600724458694458, + -0.02946854755282402, + 0.06917939335107803, + -0.017587484791874886, + 0.015012279152870178, + -0.08732288330793381, + -0.03616993501782417, + -0.011486003175377846, + 0.03924262523651123, + 0.06478983163833618, + -0.010205715894699097, + 0.04246162995696068, + 0.019665207713842392, + -0.02184535376727581, + 0.02374749444425106, + 0.061570826917886734, + -0.04240310192108154, + -0.016065772622823715, + 0.0027270112186670303, + 0.018231285735964775, + -0.01777769811451435, + 0.004466372542083263, + 0.006317301653325558, + 0.020148057490587234, + -0.06227315589785576, + -0.0003463633474893868, + -0.0028294341173022985, + -0.013132086023688316, + -0.021128391847014427, + -0.0050443303771317005, + -0.03991568833589554, + 0.025942271575331688, + -0.02516678348183632, + 0.00871326681226492, + 0.017953280359506607, + -0.04614885523915291, + -0.03254123404622078, + 0.08129455894231796, + -0.012927239760756493, + 0.012854080647230148, + 0.002642878098413348, + -0.007034262176603079, + 0.006178298965096474, + 0.02832726202905178, + 0.022035567089915276, + -0.020996706560254097, + -0.016621781513094902, + 0.02336706593632698, + 0.00079011992784217, + 0.019094565883278847, + -0.03570171445608139, + -0.029044223949313164, + 0.07450538128614426, + 0.022664736956357956, + 0.011412843130528927, + 0.006031980272382498, + 0.02172829769551754, + -0.019767630845308304, + -0.014375792816281319, + 0.026761654764413834, + -0.03482380509376526, + 0.021303974092006683, + -0.01650472730398178, + 0.04088139161467552, + -0.00806214939802885, + 0.013139401562511921, + -0.023191483691334724, + -0.014551375061273575, + -0.00603929627686739, + 0.009130274876952171, + 0.007443954236805439, + 0.009444859810173512, + 0.08738141506910324, + -0.0059844269417226315, + 0.019489625468850136, + -0.08199688792228699, + -0.003321430180221796, + 0.0681258961558342, + -0.020806491374969482, + 0.007103763520717621, + 0.01954815164208412, + -0.0027434718795120716, + -0.01270044595003128, + 0.1193959042429924, + -0.06683829426765442, + -0.005413784645497799, + -0.019723733887076378, + 0.018070336431264877, + -0.02364507131278515, + -0.042988378554582596, + -0.008976640179753304, + 0.05896635726094246, + 0.01840686798095703, + 0.030404984951019287, + -0.03327282890677452, + -0.0052089388482272625, + -0.015275652520358562, + 0.019870053976774216, + 0.012115172110497952, + -0.01894824579358101, + 0.025854479521512985, + 0.029644129797816277, + -0.05759096518158913, + 0.025854479521512985, + -0.018245916813611984, + -0.019123828038573265, + 0.014624535106122494, + 0.011105574667453766, + 0.04652928560972214, + -0.022313572466373444, + 0.016329145058989525, + -0.008245048113167286, + -0.033858101814985275, + 0.015275652520358562, + 0.016051139682531357, + 0.02412792108952999, + -0.01613893173635006, + -0.03163406252861023, + -0.06174641102552414, + 0.018743401393294334, + -0.020777227357029915, + -0.03795501962304115, + 0.016036508604884148, + -0.004499293863773346, + 0.04155445471405983, + 0.012971135787665844, + -0.09171243757009506, + 0.02250378578901291, + -0.019533520564436913, + 0.013878310099244118, + -0.030843941494822502, + -0.00794509518891573, + 0.06876970082521439, + -0.0012290754821151495, + -0.04664634168148041, + -0.046324439346790314, + -0.0130223473533988, + -0.0003241869271732867, + -0.020235849544405937, + 0.002410597400739789, + -0.0196798387914896, + 0.05103589594364166, + 0.023191483691334724, + -0.009474122896790504, + 0.028371158987283707, + -0.03596508875489235, + -0.011156786233186722, + -0.02095280960202217, + -0.002304516499862075, + 0.026088589802384377, + -0.0633266493678093, + 0.008215784095227718, + 0.015041542239487171, + -0.05530839413404465, + 0.004455398302525282, + 0.05261613428592682, + 0.01180790364742279, + 0.02311832457780838, + 0.021903879940509796, + -0.0009913078974932432, + 0.023454856127500534, + 0.034472640603780746, + 0.003268389729782939, + -0.010754410177469254, + 0.04635370150208473, + 0.07298366725444794, + 0.01751432567834854, + -0.029702655971050262, + 0.03611140698194504, + 0.010103292763233185, + 0.07228134572505951, + -0.00314584793522954, + 0.002401452511548996, + -0.021245447918772697, + -0.011376263573765755, + 0.014156315475702286, + 0.013402774930000305, + 0.017967913299798965, + -0.02161124348640442, + -0.0028495530132204294, + 0.01188837829977274, + 0.04310543090105057, + -0.00871326681226492, + -0.029058855026960373, + -0.03453116863965988, + 0.018977509811520576, + -0.08480620384216309, + -0.0002622301981318742, + 0.03403368592262268, + 0.04494904354214668, + -0.007520771119743586, + 3.7751316995127127e-05, + 0.052791718393564224, + -0.038569558411836624, + 0.0383647121489048, + -0.026205644011497498, + 0.0020265113562345505, + 0.010037449188530445, + 0.04813878983259201, + -0.01764601096510887, + 0.004707797896116972, + -0.04535873606801033, + -0.06356076151132584, + -0.01701684296131134, + -0.05873224884271622, + 0.020616278052330017, + 0.029761184006929398, + -0.033858101814985275, + -0.010352034121751785, + 0.028166312724351883, + 0.00972286518663168, + 0.04626591131091118, + 0.03160479664802551, + -0.011778639629483223, + 0.00654043722897768, + 0.028897905722260475, + 0.008874217048287392, + -0.023015901446342468, + -0.010117924772202969, + 0.011734744533896446, + -0.04252015799283981, + -0.0011156785767525434, + 0.031224370002746582, + -0.015787767246365547, + 0.004535873886197805, + -0.03192669898271561, + 0.012663866393268108, + 0.032102279365062714, + -0.029175909236073494, + 0.03979863226413727, + 0.0044151609763503075, + 0.03833544999361038, + -0.0014458097284659743, + 0.007059867959469557, + -0.07438832521438599, + 0.007217160426080227, + 0.05334772914648056, + -0.036023616790771484, + 0.01404657680541277, + 0.04114476218819618, + -0.04304690286517143, + -0.0039030462503433228, + -0.004129840061068535, + 0.03532128781080246, + -0.015041542239487171, + 0.0022331862710416317, + -0.002408768516033888, + -0.017719171941280365, + -0.039447467774152756, + -0.0038115971256047487, + 0.0035518817603588104, + -0.016592519357800484, + -0.03815986588597298, + 0.031165841966867447, + 0.04143740236759186, + 0.02513751946389675, + -0.07608561962842941, + -0.05665452405810356, + -0.017748434096574783, + 0.03760385513305664, + 0.026907972991466522, + -0.025122888386249542, + -0.05606925114989281, + 0.00048559452989138663, + 0.024844883009791374, + 0.030902467668056488, + -0.07907052338123322, + 0.011646953411400318, + -0.010183768346905708, + 0.01403926033526659, + -0.036667417734861374, + -0.021772194653749466, + -0.02363043837249279, + 0.008230416104197502, + 0.024347400292754173, + -0.03760385513305664, + 0.000373112183297053, + -0.02771272510290146, + 0.036404043436050415, + 0.021289343014359474, + 0.00037128321127966046, + -0.01932867430150509, + -0.018465396016836166, + 0.04992387443780899, + -0.016548622399568558, + -0.0061417194083333015, + -0.02032363973557949, + 0.017119266092777252, + -0.02121618390083313, + -0.002280739601701498, + 0.008420630358159542, + -0.018084967508912086, + 0.044539354741573334, + 0.007352504879236221, + -0.007630510255694389, + -0.10646134614944458, + -0.001123909023590386, + -0.09218066185712814, + -0.025503315031528473, + -0.0020027344580739737, + -0.0719301775097847, + -0.018860455602407455, + -0.0020301693584769964, + -0.007586614694446325, + -0.029892871156334877, + -0.01282481662929058, + 0.0004675333620980382, + 0.04688045009970665, + 0.0059771109372377396, + -0.0073890844359993935, + 0.038920722901821136, + 0.033331356942653656, + -0.02225504443049431, + 0.0021234473679214716, + 0.027771253138780594, + 0.010271559469401836, + -0.014631850644946098, + 0.022079462185502052, + -0.028941800817847252, + 0.0067343092523515224, + 0.029190542176365852, + 0.021157655864953995, + -0.03239491581916809, + 0.008413313888013363, + 0.02603006176650524, + -0.018275180831551552, + 0.02440592646598816, + 0.016621781513094902, + -0.010125240311026573, + -0.044012606143951416, + 0.010578827932476997, + 0.020426062867045403, + 0.007586614694446325, + -0.026205644011497498, + 0.0066648079082369804, + 0.03549686819314957, + 0.0497775562107563, + 0.016841260716319084, + 0.004660244565457106, + 0.004331027623265982, + -0.03371178358793259, + 0.024698564782738686, + -0.02109912782907486, + -0.01354177761822939, + 0.0028477238956838846, + 0.00818652007728815, + -0.05121147632598877, + 0.0066830976866185665, + -0.006174641195684671, + 0.015582920983433723, + 0.02857600338757038, + 0.02781514823436737, + 0.06385339796543121, + 0.005424758419394493, + -0.019094565883278847, + 0.06496541947126389, + -0.004060338716953993, + -0.005940531380474567, + 0.012993083335459232, + -0.04003274440765381, + 0.004927275702357292, + 0.006606280338019133, + -0.005808844696730375, + 0.018362972885370255, + 0.025356996804475784, + 0.004960197489708662, + 0.0028257761150598526, + 0.05928825959563255, + 0.08948840200901031, + -0.0021014995872974396, + -0.008640107698738575, + -0.0335654653608799, + -0.04404187202453613, + -0.012495600618422031, + 0.0006273405742831528, + -0.004290790297091007, + 0.019460361450910568, + -0.06279990077018738, + 0.003844518680125475, + 0.017485061660408974, + -0.0317511148750782, + -0.013907574117183685, + 0.043661441653966904, + 0.01880192756652832, + 0.006551411002874374, + 0.0454757921397686, + -0.010527616366744041, + 0.011193365789949894, + -0.012181015685200691, + -0.014148999936878681, + -0.02387917973101139, + -0.00894737709313631, + -0.005739343352615833, + -0.018714137375354767, + 0.040471699088811874, + 0.018728768453001976, + -0.022664736956357956, + 0.039681579917669296, + -0.06139524653553963, + 0.038452502340078354, + 0.07649531215429306, + -0.020235849544405937, + -0.04240310192108154, + -0.007681721355766058, + 0.006858679931610823, + -0.01981152594089508, + 0.031224370002746582, + -0.09305857121944427, + -0.006833074148744345, + 0.05311361700296402, + 0.0029464890249073505, + 0.013293036259710789, + 0.012971135787665844, + 0.0006108797388151288, + -0.014156315475702286, + -0.014273370616137981, + -0.0158755574375391, + -0.007085473742336035, + -0.03745753690600395, + -0.010747094638645649, + -0.016168195754289627, + 0.06139524653553963, + 0.0018820217810571194, + -0.030141612514853477, + 0.0151293333619833, + 0.00319340149872005, + -0.026015430688858032, + -0.003862808458507061, + -0.05961015820503235, + -0.022459890693426132, + 0.011610373854637146, + -0.014119735918939114, + -0.07438832521438599, + 0.0014622706221416593, + 0.03643330931663513, + -0.006745283026248217, + 0.02121618390083313, + 0.0001646083255764097, + -0.023410961031913757, + 0.02860526740550995, + 0.007385426666587591, + 0.02415718510746956, + 0.028107784688472748, + 0.02440592646598816, + -0.02935149148106575, + 0.0009163196664303541, + -0.038423240184783936, + -0.0008170974324457347, + 0.010600775480270386, + -0.05246981605887413, + 0.0044151609763503075, + -0.010520300827920437, + -0.013892942108213902, + -0.04307616874575615, + -0.026644600555300713, + 0.010827569290995598, + -0.022430626675486565, + -0.0472901426255703, + 0.00019318614795338362, + -0.021903879940509796, + -0.004316396079957485, + -0.031253632158041, + 0.0050187245942652225, + 0.00940096378326416, + -0.014119735918939114, + 0.0026794576551765203, + 0.016929050907492638, + 0.05606925114989281, + 0.0007073585293255746, + 0.010827569290995598, + -0.02275252714753151, + 0.021025968715548515, + -0.07187165319919586, + -0.009481439366936684, + -0.046061065047979355, + -0.018084967508912086, + 0.006306327413767576, + -0.0262934360653162, + 0.0011376263573765755, + -0.05399153009057045, + -0.007074499968439341, + 0.010205715894699097, + 0.002551428973674774, + 0.0065697007812559605, + 0.0018445276655256748, + 0.07550034672021866, + -0.009708233177661896, + -0.1126067191362381, + -0.010783674195408821, + 0.021552715450525284, + -0.01575850322842598, + -0.014463583938777447, + 0.04061801731586456, + -0.0001903283700812608, + -0.05943457782268524, + 0.014785485342144966, + -0.031107313930988312, + 0.03312651067972183, + 0.010469089262187481, + 0.024449821561574936, + 0.029058855026960373, + -0.034501902759075165, + -0.0232353787869215, + 0.0030269641429185867, + 0.0767294242978096, + -0.0036762524396181107, + 0.01586092635989189, + -0.003127558156847954, + 0.0003715118218678981, + -0.022459890693426132, + 0.0158755574375391, + -0.019635943695902824, + -0.02999529428780079, + 0.03470674902200699, + 0.005823476705700159, + 0.011595741845667362, + 0.023703597486019135, + -0.04079360142350197, + -0.020557750016450882, + -0.001602187636308372, + -0.005903951823711395, + -0.007974358275532722, + 0.020235849544405937, + 0.015831662341952324, + 0.037925757467746735, + 0.01212248858064413, + 0.02796146646142006, + 0.11336757987737656, + 0.08410387486219406, + 0.032716818153858185, + 0.010651987046003342, + 0.06127819046378136, + 0.03508717939257622, + 0.011251892894506454, + 0.041612982749938965, + -0.04240310192108154, + 0.005475969985127449, + -0.009935026988387108, + -0.010842201299965382, + 0.023030532523989677, + -0.021625874564051628, + 0.0030214772559702396, + 0.023937707766890526, + -0.03535054996609688, + -0.025225309655070305, + 0.011500634253025055, + 0.03063909523189068, + -0.06110261008143425, + 0.00908637885004282, + -0.00311292614787817, + -0.05794212967157364, + -0.053669627755880356, + -0.016329145058989525, + 0.010688566602766514, + 0.010044765658676624, + 0.008237731643021107, + 0.07315925508737564, + 0.018567819148302078, + -0.05206012353301048, + 0.0002437117655063048, + -0.03558466210961342, + 0.0459732748568058, + 0.02212335728108883, + 0.005249176640063524, + 0.007092789746820927, + 0.017177792266011238, + 0.08328449726104736, + -0.016168195754289627, + -0.021655138581991196, + 0.03318503871560097, + 0.0026812865398824215, + -0.012400493025779724, + 0.01187374722212553, + 0.04284206032752991, + 0.029892871156334877, + -0.010110609233379364, + 0.054693859070539474, + 0.019431097432971, + 0.027551773935556412, + -0.030551305040717125, + -0.050626203417778015, + 0.00244534807279706, + 0.005695447791367769, + 0.03696005418896675, + 0.008157256990671158, + 0.023688966408371925, + 0.01701684296131134, + 0.007842672057449818, + -0.014200211502611637, + -0.003892072243615985, + -0.010125240311026573, + 0.014997647143900394, + 0.043778497725725174, + 0.005636920686811209, + 0.015612185001373291, + 0.010388613678514957, + 0.00806214939802885, + 0.0022514760494232178, + 0.018758032470941544, + 0.03783796727657318, + -0.027990730479359627, + 0.006858679931610823, + 0.008149940520524979, + -0.005468653980642557, + 0.008786425925791264, + -0.02033827267587185, + -0.029410019516944885, + -0.0037201480008661747, + -0.011193365789949894, + -0.010637355037033558, + 0.008596212603151798, + -0.05033356696367264, + 0.006017348729074001, + 0.01022034790366888, + 0.019401833415031433, + -0.003034279914572835, + -0.01105436310172081, + -0.029146647080779076, + -0.01651936024427414, + 0.00616366695612669, + -0.03748680278658867, + 0.009093695320189, + -0.0012089567026123405, + -0.047582779079675674, + -0.01726558431982994, + 0.0303464587777853, + -0.0005683559575118124, + -0.06519952416419983, + -0.003892072243615985, + 0.023089060559868813, + 0.010198400355875492, + -0.016607150435447693, + -0.019782261922955513, + 0.0009364384459331632, + -0.05554250627756119, + -0.034004420042037964, + -0.007381768431514502, + 0.006935497280210257, + -0.046324439346790314, + 0.03693079203367233, + 0.006536779459565878, + 0.006309985648840666, + -0.0036396728828549385, + 0.005622288677841425, + -0.0051394375041127205, + -0.0018481856677681208, + 0.020367536693811417, + -0.016665678471326828, + -0.03669667989015579, + -0.030053820461034775, + -0.027112819254398346, + -0.010286190547049046, + 0.030814677476882935, + 0.0013497882755473256, + -0.007067183963954449, + -0.05121147632598877, + 0.024084025993943214, + -0.0005633262335322797, + 0.014083156362175941, + -0.020396800711750984, + 0.01855318620800972, + -0.0009803340071812272, + 0.024947306141257286, + 0.0661359652876854, + -0.06765767931938171, + -0.04073507338762283, + 0.018611714243888855, + 0.08398682624101639, + -0.0017594799865037203, + 0.023015901446342468, + -0.017455797642469406, + 0.005786897148936987, + 0.015451233834028244, + 0.01689978688955307, + -0.028415054082870483, + 0.04784615337848663, + -0.06601890921592712, + 0.009978922083973885, + 0.05580587685108185, + 0.010147188790142536, + 0.06490688771009445, + 0.018772663548588753, + -0.06256579607725143, + -0.02020658552646637, + -0.019855421036481857, + -0.03213154524564743, + -0.010037449188530445, + 0.06116113439202309, + 0.020250480622053146, + -0.01830444484949112, + 0.04951418191194534, + -0.0016561426455155015, + 0.02237210050225258, + -0.021303974092006683, + -0.03201448917388916, + -0.06063438951969147, + -0.010366666130721569, + 0.008274311199784279, + 0.020923545584082603, + 0.03192669898271561, + -0.017060738056898117, + -0.0005459509557113051, + -0.016299881041049957, + -0.0073890844359993935, + 0.020660173147916794, + -0.03646257147192955, + -0.06707240641117096, + -0.0009318660013377666, + -0.02057238109409809, + -0.04322248697280884, + -0.005706421565264463, + 0.015407338738441467, + 0.0013900258345529437, + -0.036901526153087616, + 0.015070806257426739, + -0.016431568190455437, + -0.02351338416337967, + 0.07983137667179108, + -0.0006396862445399165, + -0.022269677370786667, + 0.006178298965096474, + -0.00470414012670517, + -0.015729239210486412, + -0.04620738327503204, + 0.025503315031528473, + -0.04875332489609718, + -0.025474052876234055, + -0.001649741199798882, + -0.0020009055733680725, + -0.016826627776026726, + 0.03757459297776222, + -0.04079360142350197, + 0.016665678471326828, + -0.024449821561574936, + -0.006551411002874374, + 0.05814697593450546, + -0.006686755921691656, + -0.013688095845282078, + 0.006372170988470316, + 0.019913949072360992, + 0.010256927460432053, + -0.03295092657208443, + 0.028502844274044037, + -0.019109196960926056, + 0.03382883965969086, + 0.03160479664802551, + -0.004941907711327076, + 0.03549686819314957, + 0.0010095976758748293, + -0.01448553241789341, + 0.026351962238550186, + 0.04208120331168175, + 0.008537684567272663, + 0.0021380791440606117, + -0.0027398141101002693, + 0.0092180659994483, + -0.00650751544162631, + -0.011361631564795971, + -0.01891898363828659, + 0.0009240928338840604, + -0.026644600555300713, + 0.053933002054691315, + 0.028371158987283707, + 0.04374923184514046, + -0.01919698715209961, + -0.02921980619430542, + -0.014090471900999546, + -0.03060983121395111, + 0.004989461041986942, + -0.009335121139883995, + -0.07830966264009476, + -0.005805186927318573, + 0.020894283428788185, + 0.04916301742196083, + -0.016095034778118134, + 0.056449681520462036, + 0.03049277700483799, + 0.02642512135207653, + 0.006862338166683912, + -0.029029591009020805, + 0.025605738162994385, + 0.0005610400112345815, + 0.007864619605243206, + 0.007001340389251709, + -0.0019149434519931674, + 0.11886915564537048, + 0.030404984951019287, + -0.0011705480283126235, + 0.04889964312314987, + -0.027551773935556412, + 0.05323067307472229, + -0.03300945460796356, + 0.02742008864879608, + 0.03994495049118996, + -0.0018399552209302783, + -0.02806388959288597, + -0.030463512986898422, + -0.003965231589972973, + 0.012919924221932888, + -0.019153092056512833, + -0.01676810160279274, + -0.009057115763425827, + -0.001569265965372324, + -0.03350693732500076, + 0.0335654653608799, + -0.0029044223483651876, + 0.004404187202453613, + -0.013263772241771221, + 0.04260794818401337, + 0.09779928624629974, + 0.028429685160517693, + 0.022298939526081085, + 0.03751606494188309, + -0.028868641704320908, + 0.02986360713839531, + -0.03254123404622078, + -0.022547682747244835, + 0.009861866943538189, + 0.03415073826909065, + 0.007480533793568611, + 0.004660244565457106, + 0.020001739263534546, + -0.006913549266755581, + -0.013322300277650356, + -0.021025968715548515, + 0.008230416104197502, + 0.009020536206662655, + 0.023937707766890526, + -0.005651552230119705, + 0.01865560933947563, + -0.0006808383041061461, + 0.002410597400739789, + -0.02389381267130375, + 0.017865490168333054, + 0.009269277565181255, + -0.005307703744620085, + -0.007261055987328291, + -0.017104633152484894, + -0.010037449188530445, + 0.05337699130177498, + -0.005121147725731134, + -0.003983521368354559, + -0.0027379849925637245, + 0.031341422349214554, + -0.013768571428954601, + 0.001310465158894658, + -0.015904821455478668, + -0.003906704019755125, + -0.02453761361539364, + 0.011800587177276611, + -9.752185178513173e-06, + 0.01589019037783146, + -0.018889719620347023, + -0.0015299428487196565, + -0.029058855026960373, + 0.007151316851377487, + -0.0021472240332514048, + -0.041086237877607346, + 0.050509147346019745, + 0.07023288309574127, + -0.005805186927318573, + 0.031575534492731094, + 0.004122524056583643, + 0.029702655971050262, + -0.028546741232275963, + 0.013797835446894169, + 0.004898012150079012, + 0.014778168871998787, + 0.01969447173178196, + -0.02592763863503933, + 0.02667386457324028, + -0.009166854433715343, + -0.040354643017053604, + 0.007096447516232729, + 0.007747564930468798, + -0.026761654764413834, + -0.019533520564436913, + 0.06022469699382782, + 0.02007489837706089, + -0.010110609233379364, + 0.016065772622823715, + 0.033477675169706345, + -0.023849915713071823, + -0.019767630845308304, + -0.014346529729664326, + 0.007359820883721113, + 0.027595670893788338, + -0.010227663442492485, + -0.013944153673946857, + -0.06086849793791771, + 0.006145377177745104, + -0.029395388439297676, + -0.036521099507808685, + 0.02857600338757038, + -0.0534062534570694, + -0.0022587920539081097, + -0.031107313930988312, + 0.04129108414053917, + -0.017938649281859398, + 0.01701684296131134, + 0.0224891547113657, + 0.0028495530132204294, + -0.03795501962304115, + 0.034238532185554504, + -0.0269518680870533, + 0.054196376353502274, + 0.012034697458148003, + -0.016051139682531357, + 0.05144558846950531, + 0.00457611121237278, + 0.010761725716292858, + -0.03549686819314957, + 0.007283003535121679, + 0.009254645556211472, + 0.036140672862529755, + 0.020265113562345505, + -0.005805186927318573, + 0.019284779205918312, + 0.0643216148018837, + 0.028883272781968117, + 0.023732861503958702, + -0.01232733391225338, + 0.011749375611543655, + -0.009057115763425827, + -0.0009048884967342019, + -0.02225504443049431, + 0.011412843130528927, + -0.019489625468850136, + 0.022811055183410645, + -0.027039660140872, + 0.00775488093495369, + -0.006156350951641798, + 0.020031003281474113, + 0.012063960544764996, + 0.0002841779787559062, + -0.04383702576160431, + 0.02986360713839531, + 0.02490340918302536, + -0.010856833308935165, + 0.00852305255830288, + -0.03151700645685196, + 0.012685814872384071, + -0.03391662985086441, + -0.015904821455478668, + 0.02566426619887352, + -0.020001739263534546, + 0.009291225112974644, + -0.027478614822030067, + 0.038540296256542206, + 0.023469489067792892, + 0.007180580869317055, + -0.013563725166022778, + -0.014712326228618622, + -0.024362031370401382, + -0.025503315031528473, + -0.04064727947115898, + 0.0028422370087355375, + 0.015919454395771027, + -0.043778497725725174, + 0.025444788858294487, + -0.010395930148661137, + -0.03611140698194504, + 0.016358409076929092, + -0.014873276464641094, + 0.00012619970948435366, + -0.03432632237672806, + -0.11916179209947586, + -0.0255472119897604, + 0.05653747171163559, + 0.012210279703140259, + -0.05276245251297951, + 0.041993413120508194, + -0.05785433575510979, + -0.037018582224845886, + 0.012473653070628643, + -0.003734779777005315, + -0.015158597379922867, + -0.06707240641117096, + -0.026600703597068787, + -0.060809969902038574, + -0.01174206007272005, + 0.04638296738266945, + 0.016929050907492638, + -0.016680309548974037, + -0.02543015591800213, + 0.002213067375123501, + 0.023586543276906013, + -0.00952533446252346, + -0.0013945982791483402, + 0.04611959308385849, + -0.04658781364560127, + 0.014500164426863194, + 0.009620442055165768, + 0.014500164426863194, + -0.06988172233104706, + -0.011500634253025055, + -0.0002711464767344296, + 0.024303503334522247, + 0.09235624223947525, + -0.008698634803295135, + 0.00768903736025095, + -0.041612982749938965, + 0.04445156082510948, + 0.0017018670914694667, + -0.005318677518516779, + -0.005289413966238499, + 0.01739726960659027, + -0.012415125034749508, + -0.05580587685108185, + 0.055835142731666565, + 0.017836226150393486, + 0.00952533446252346 + ], + "result": "--- 结果 1 (相似度: 1.000) ---\n文件路径: C:\\Steam\\steamapps\\common\\RimWorld\\Data\\dll1.6\\Verse\\ThingOwner.txt\n\npublic class ThingOwner : ThingOwner, IList, ICollection, IEnumerable, IEnumerable where T : Thing\n{\n\tprivate List innerList = new List();\n\n\tpublic List InnerListForReading => innerList;\n\n\tpublic new T this[int index] => innerList[index];\n\n\tpublic override int Count => innerList.Count;\n\n\tT IList.this[int index]\n\t{\n\t\tget\n\t\t{\n\t\t\treturn innerList[index];\n\t\t}\n\t\tset\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow setting individual elements.\");\n\t\t}\n\t}\n\n\tbool ICollection.IsReadOnly => true;\n\n\tpublic ThingOwner()\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, bool oneStackOnly, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner, oneStackOnly, contentsLookMode, removeContentsIfDestroyed)\n\t{\n\t}\n\n\tpublic override void ExposeData()\n\t{\n\t\tbase.ExposeData();\n\t\tScribe_Collections.Look(ref innerList, \"innerList\", true, contentsLookMode);\n\t\tif (Scribe.mode == LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\tint num = innerList.RemoveAll((T x) => x == null || (x is MinifiedThing minifiedThing && minifiedThing.InnerThing == null));\n\t\t\tif (num > 0)\n\t\t\t{\n\t\t\t\tLog.Warning($\"ThingOwner removed {num} invalid entries during PostLoadInit.\");\n\t\t\t}\n\t\t}\n\t\tif (Scribe.mode != LoadSaveMode.LoadingVars && Scribe.mode != LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] != null)\n\t\t\t{\n\t\t\t\tinnerList[i].holdingOwner = this;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic List.Enumerator GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tpublic override int GetCountCanAccept(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (!(item is T))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\treturn base.GetCountCanAccept(item, canMergeWithExistingStacks);\n\t}\n\n\tpublic override int TryAdd(Thing item, int count, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (count <= 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item?.ToString() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + count + \" of \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tint stackCount = item.stackCount;\n\t\tint num = Mathf.Min(stackCount, count);\n\t\tThing thing = item.SplitOff(num);\n\t\tif (!TryAdd((T)thing, canMergeWithExistingStacks))\n\t\t{\n\t\t\tif (thing != item)\n\t\t\t{\n\t\t\t\tint result = stackCount - item.stackCount - thing.stackCount;\n\t\t\t\titem.TryAbsorbStack(thing, respectStackLimit: false);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn stackCount - item.stackCount;\n\t\t}\n\t\tCompPushable compPushable = item.TryGetComp();\n\t\tif (compPushable != null && owner is Pawn pawn)\n\t\t{\n\t\t\tcompPushable.OnStartedCarrying(pawn);\n\t\t}\n\t\treturn num;\n\t}\n\n\tpublic override bool TryAdd(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (canMergeWithExistingStacks)\n\t\t{\n\t\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t\t{\n\t\t\t\tT val = innerList[i];\n\t\t\t\tif (!val.CanStackWith(item))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint num = Mathf.Min(item.stackCount, val.def.stackLimit - val.stackCount);\n\t\t\t\tif (num > 0)\n\t\t\t\t{\n\t\t\t\t\tThing other = item.SplitOff(num);\n\t\t\t\t\tint stackCount = val.stackCount;\n\t\t\t\t\tval.TryAbsorbStack(other, respectStackLimit: true);\n\t\t\t\t\tif (val.stackCount > stackCount)\n\t\t\t\t\t{\n\t\t\t\t\t\tNotifyAddedAndMergedWith(val, val.stackCount - stackCount);\n\t\t\t\t\t}\n\t\t\t\t\tif (item.Destroyed || item.stackCount == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Count >= maxStacks)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\titem.holdingOwner = this;\n\t\tinnerList.Add(item2);\n\t\tNotifyAdded(item2);\n\t\treturn true;\n\t}\n\n\tprotected override void NotifyAdded(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemAdded(item as T);\n\t\t}\n\t\tbase.NotifyAdded(item);\n\t}\n\n\tprotected override void NotifyRemoved(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemRemoved(item as T);\n\t\t}\n\t\tbase.NotifyRemoved(item);\n\t}\n\n\tpublic void TryAddRangeOrTransfer(IEnumerable things, bool canMergeWithExistingStacks = true, bool destroyLeftover = false)\n\t{\n\t\tif (things == this)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (things is ThingOwner thingOwner)\n\t\t{\n\t\t\tthingOwner.TryTransferAllToContainer(this, canMergeWithExistingStacks);\n\t\t\tif (destroyLeftover)\n\t\t\t{\n\t\t\t\tthingOwner.ClearAndDestroyContents();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (things is IList list)\n\t\t{\n\t\t\tfor (int i = 0; i < list.Count; i++)\n\t\t\t{\n\t\t\t\tif (!TryAddOrTransfer(list[i], canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t\t{\n\t\t\t\t\tlist[i].Destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tforeach (T thing in things)\n\t\t{\n\t\t\tif (!TryAddOrTransfer(thing, canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t{\n\t\t\t\tthing.Destroy();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override int IndexOf(Thing item)\n\t{\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\treturn innerList.IndexOf(item2);\n\t}\n\n\tpublic override bool Remove(Thing item)\n\t{\n\t\tif (!Contains(item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner == this)\n\t\t{\n\t\t\titem.holdingOwner = null;\n\t\t}\n\t\tint index = innerList.LastIndexOf((T)item);\n\t\tinnerList.RemoveAt(index);\n\t\tNotifyRemoved(item);\n\t\treturn true;\n\t}\n\n\tpublic int RemoveAll(Predicate predicate)\n\t{\n\t\tint num = 0;\n\t\tfor (int num2 = innerList.Count - 1; num2 >= 0; num2--)\n\t\t{\n\t\t\tif (predicate(innerList[num2]))\n\t\t\t{\n\t\t\t\tRemove(innerList[num2]);\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\t\treturn num;\n\t}\n\n\tprotected override Thing GetAt(int index)\n\t{\n\t\treturn innerList[index];\n\t}\n\n\tpublic void GetThingsOfType(List list) where J : Thing\n\t{\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] is J item)\n\t\t\t{\n\t\t\t\tlist.Add(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic int TryTransferToContainer(Thing item, ThingOwner otherContainer, int stackCount, out T resultingTransferredItem, bool canMergeWithExistingStacks = true)\n\t{\n\t\tThing resultingTransferredItem2;\n\t\tint result = TryTransferToContainer(item, otherContainer, stackCount, out resultingTransferredItem2, canMergeWithExistingStacks);\n\t\tresultingTransferredItem = (T)resultingTransferredItem2;\n\t\treturn result;\n\t}\n\n\tpublic new T Take(Thing thing, int count)\n\t{\n\t\treturn (T)base.Take(thing, count);\n\t}\n\n\tpublic new T Take(Thing thing)\n\t{\n\t\treturn (T)base.Take(thing);\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, int count, out T resultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing resultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, count, out resultingThing2, placedAction2, nearPlaceValidator);\n\t\tresultingThing = (T)resultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, mode, out lastResultingThing2, placedAction2, nearPlaceValidator);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, out lastResultingThing2, placedAction2, nearPlaceValidator, playDropSound: true);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tint IList.IndexOf(T item)\n\t{\n\t\treturn innerList.IndexOf(item);\n\t}\n\n\tvoid IList.Insert(int index, T item)\n\t{\n\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow inserting individual elements at any position.\");\n\t}\n\n\tvoid ICollection.Add(T item)\n\t{\n\t\tTryAdd(item);\n\t}\n\n\tvoid ICollection.CopyTo(T[] array, int arrayIndex)\n\t{\n\t\tinnerList.CopyTo(array, arrayIndex);\n\t}\n\n\tbool ICollection.Contains(T item)\n\t{\n\t\treturn innerList.Contains(item);\n\t}\n\n\tbool ICollection.Remove(T item)\n\t{\n\t\treturn Remove(item);\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n}\n\n", + "timestamp": "2025-08-24 20:53:10,931" + }, + "ThingOwner": { + "keywords": [ + "ThingOwner" + ], + "question": "public abstract class ThingOwner", + "embedding": [ + -0.010147521272301674, + 0.008173150010406971, + 0.036745648831129074, + 0.00934287253767252, + -0.07223962247371674, + 0.032156169414520264, + 0.004172255285084248, + 0.06139175966382027, + 0.051437947899103165, + 0.09852483123540878, + -0.02407987415790558, + -0.06705410778522491, + -0.01253166701644659, + -0.07605426013469696, + 0.061272550374269485, + -0.03811653330922127, + 0.02048875391483307, + -0.07551782578229904, + -0.030144546180963516, + -0.022112954407930374, + 0.02022053860127926, + 0.06878261268138885, + -0.003967368043959141, + 0.023245424032211304, + 0.023632846772670746, + -0.019639402627944946, + -0.016942337155342102, + 0.048576973378658295, + -0.02101028710603714, + -0.01197288278490305, + 0.002253762912005186, + 0.015131876803934574, + -0.03316942974925041, + -0.003548279870301485, + -0.010996873490512371, + 0.026940850540995598, + -0.05000746250152588, + 0.023588145151734352, + 0.011063927784562111, + 0.0006235100445337594, + -0.009126808494329453, + -0.008173150010406971, + -0.009581286460161209, + 0.001336425542831421, + -0.04184176027774811, + 0.019997024908661842, + 0.02627030946314335, + -0.030472366139292717, + -0.035136353224515915, + 0.026568327099084854, + -0.0013932352885603905, + -0.005956639535725117, + -0.03683505579829216, + 0.02266428805887699, + -0.005148265045136213, + -0.0006379453116096556, + 0.02913128398358822, + -0.023111315444111824, + -0.020637763664126396, + 0.03710327297449112, + 0.00791238434612751, + 0.0011613398091867566, + -0.02805841900408268, + -0.03644763305783272, + 0.0452093668282032, + -0.0007413203711621463, + 0.04553718864917755, + 0.025614667683839798, + 0.00575175229460001, + -0.037133075296878815, + -0.014178218320012093, + 0.028371337801218033, + -0.013157505542039871, + 0.011518405750393867, + -0.03930860757827759, + 0.032543592154979706, + 0.009007601998746395, + 0.017717184498906136, + -0.01922217756509781, + -0.023111315444111824, + -0.00934287253767252, + -0.03203696012496948, + -0.010318881832063198, + 0.02539115399122238, + 0.08159739524126053, + 0.003002533921971917, + 0.04860677570104599, + -0.07390852272510529, + -0.01306064985692501, + 0.10996873676776886, + -0.045984216034412384, + 0.0006505179335363209, + 0.014640146866440773, + 0.02333482913672924, + -0.014945615082979202, + 0.09131278842687607, + -0.05936523526906967, + 0.0036227842792868614, + -0.0176277793943882, + 0.028416039422154427, + -0.01153330598026514, + -0.07700791209936142, + -0.020831475034356117, + 0.03948741778731346, + 0.011808972805738449, + 0.04661005362868309, + -0.026046795770525932, + -0.008359411731362343, + -0.010840414091944695, + 0.010244376957416534, + -0.0012898602290078998, + -0.016107887029647827, + -0.0038630615454167128, + 0.04154374450445175, + -0.04357026889920235, + 0.047444503754377365, + -0.04208017513155937, + 0.017136048525571823, + -0.003904039040207863, + -0.0008572681108489633, + 0.04115632176399231, + -0.020116232335567474, + 0.007625542115420103, + -0.023707352578639984, + -0.024318289011716843, + 0.006474446505308151, + 0.0186112392693758, + -0.003257711883634329, + -0.006239756941795349, + -0.008016690611839294, + -0.05158695951104164, + -0.003412308869883418, + 0.0029503805562853813, + -0.035017143934965134, + -0.005889585707336664, + 0.013440622948110104, + 0.07617346197366714, + 0.007599465548992157, + -0.1050812378525734, + 0.00821040291339159, + -0.03954702243208885, + 0.006314261816442013, + -0.06282224506139755, + 0.00560274301096797, + 0.08946508169174194, + -0.0013625022256746888, + -0.042646411806344986, + -0.03158993273973465, + -0.02640441618859768, + 0.009804800152778625, + -0.014506038278341293, + -0.009655791334807873, + -0.003330353880301118, + 0.04622263088822365, + 0.01083296351134777, + -0.03153033182024956, + 0.016271796077489853, + -0.041454337537288666, + -0.005341976881027222, + -0.029235590249300003, + 0.008292357437312603, + 0.031679339706897736, + -0.060527507215738297, + 2.5378116333740763e-05, + -0.0019371185917407274, + -0.033407844603061676, + -0.011883477680385113, + 0.030040239915251732, + -0.005435107741504908, + 0.02539115399122238, + 0.047653116285800934, + 0.007223217282444239, + 0.020458953455090523, + 0.02632991224527359, + 0.026225605979561806, + -0.013418271206319332, + 0.04446432366967201, + 0.053613483905792236, + 0.02002682536840439, + -0.04568619653582573, + 0.04497095197439194, + 0.011324693448841572, + 0.11580988764762878, + 0.0018104608170688152, + 0.005021607503294945, + -0.02632991224527359, + -0.014118614606559277, + 0.03236478194594383, + 0.0033117278944700956, + 0.0372522808611393, + -0.02247057668864727, + 0.028907770290970802, + 0.0239308662712574, + 0.05206378921866417, + -0.05605723336338997, + -0.017597977072000504, + -0.016599616035819054, + 0.041931167244911194, + -0.04306363686919212, + -0.010683953762054443, + 0.006005067843943834, + 0.03078528493642807, + 0.002898227423429489, + 0.015184029936790466, + 0.057755935937166214, + -0.03376546874642372, + 0.021457314491271973, + -0.02706005610525608, + 0.027432579547166824, + 0.012256000190973282, + 0.03963642567396164, + -0.010356133803725243, + 0.01213679276406765, + -0.027179263532161713, + -0.06011028215289116, + -0.009223665110766888, + -0.03909999504685402, + 0.016137687489390373, + -0.003445836016908288, + -0.018000302836298943, + -0.01220384705811739, + 0.008597826585173607, + -0.0037792439106851816, + 0.0292653925716877, + 0.03749069571495056, + -0.010751008056104183, + 0.013693938963115215, + 0.04821935296058655, + 0.016644319519400597, + -0.03236478194594383, + 0.0037270907778292894, + 0.03936821222305298, + -0.0671137124300003, + 0.010147521272301674, + -0.0025368803180754185, + -0.01642080582678318, + 0.005368053913116455, + -0.04362986981868744, + 0.028892869129776955, + 0.035464171320199966, + -0.021859638392925262, + 0.029742220416665077, + -0.010654152370989323, + 0.03531516343355179, + -0.01601848006248474, + 0.030904492363333702, + -0.07164358347654343, + 0.011697215959429741, + 0.022857999429106712, + -0.032871413975954056, + 0.009767548181116581, + 0.0419013649225235, + -0.017523473128676414, + -0.011145882308483124, + -0.009037403389811516, + 0.059544045478105545, + -0.0111384317278862, + 0.018432429060339928, + -0.02327522449195385, + -0.02387126162648201, + -0.033944278955459595, + 0.029548509046435356, + 0.011630162596702576, + -0.02832663431763649, + -0.019788412377238274, + 0.023781856521964073, + 0.024959027767181396, + 0.02312621660530567, + -0.0651467889547348, + -0.061332155019044876, + -0.022843098267912865, + 0.02866935543715954, + 0.020980484783649445, + -0.02998063527047634, + -0.04109671711921692, + 0.011384297162294388, + 0.002916853642091155, + 0.024154379963874817, + -0.08821339905261993, + -0.013053199276328087, + -0.00920876394957304, + 0.020444052293896675, + -0.029548509046435356, + -0.029280293732881546, + -0.02148711495101452, + 0.02679184079170227, + 0.04342125728726387, + -0.03111310489475727, + -0.0005126845207996666, + -0.0018048729980364442, + 0.031083302572369576, + -0.012986144982278347, + -0.0259275883436203, + -0.02135300822556019, + -0.009246015921235085, + 0.03403368219733238, + -0.005394130479544401, + 0.01076590921729803, + -0.026419317349791527, + 0.019594699144363403, + -0.00011193146201549098, + 0.0025033531710505486, + -0.005144540220499039, + -0.023111315444111824, + 0.04753391072154045, + -0.0018700645305216312, + -0.013470425270497799, + -0.09018032252788544, + -0.007763375528156757, + -0.08964388817548752, + -0.007375951856374741, + -0.008754285983741283, + -0.03933840990066528, + 0.0015673896996304393, + -0.002305916277691722, + 0.0019650578033179045, + -0.020190736278891563, + -0.0037159151397645473, + -0.004261660855263472, + 0.03385487198829651, + 0.021785134449601173, + 0.015087174251675606, + 0.029816726222634315, + 0.01816421188414097, + -0.03695426136255264, + -0.015161678194999695, + 0.021621223539114, + 0.01676352694630623, + -0.016778428107500076, + 0.026881245896220207, + -0.00960363820195198, + 0.004984355065971613, + 0.01353002805262804, + 0.018790051341056824, + 0.007629266940057278, + -0.00455595413222909, + 0.021636124700307846, + -0.005215319339185953, + 0.04109671711921692, + 0.007070483174175024, + -0.01847713068127632, + -0.018402626737952232, + 0.03385487198829651, + 0.01306064985692501, + -0.008255105465650558, + 0.009335421957075596, + -0.01127254031598568, + 0.04899419844150543, + 0.03051706776022911, + 0.013701388612389565, + 0.018849654123187065, + -0.00218670885078609, + -0.03918939828872681, + 0.03263299912214279, + -0.015243633650243282, + -0.02120399847626686, + 0.017985401675105095, + -0.0003287513682153076, + -0.01901356503367424, + 0.013172406703233719, + -0.003952466882765293, + 0.04273581504821777, + 0.028013715520501137, + 0.03549397364258766, + 0.03430189937353134, + -0.009156610816717148, + -0.012710478156805038, + 0.041066914796829224, + -0.02413947880268097, + -0.0037643429823219776, + 0.011585459113121033, + -0.050692904740571976, + -0.01820891536772251, + 0.021919243037700653, + -0.00987930502742529, + 0.0020209362264722586, + 0.013850398361682892, + -0.04801074042916298, + 0.007204591296613216, + 0.04005365073680878, + 0.08010730147361755, + 0.01682312972843647, + -0.020235439762473106, + -0.052421409636735916, + -0.028967373073101044, + -0.023617945611476898, + 0.022843098267912865, + -0.01350022666156292, + 0.020861277356743813, + -0.07885562628507614, + 0.006012517958879471, + 0.016733724623918533, + -0.028147824108600616, + -0.00997616071254015, + 0.03176874667406082, + 0.016331400722265244, + 0.0004609969910234213, + 0.04747430607676506, + -0.01289673987776041, + 0.02805841900408268, + 0.0005448146257549524, + -0.022023549303412437, + -0.04240799695253372, + -0.00024353679327759892, + -0.0009955671848729253, + -0.0285799503326416, + 0.024437496438622475, + 0.015735363587737083, + -0.010326332412660122, + 0.03981523960828781, + -0.06669648736715317, + 0.023960666730999947, + 0.08892864733934402, + -0.035344965755939484, + -0.06538520008325577, + -0.002847936935722828, + 0.029429301619529724, + -0.016808228567242622, + 0.05906721577048302, + -0.07271645218133926, + 0.01734466291964054, + 0.06532560288906097, + 0.01636120118200779, + -0.0398748405277729, + 0.006597378756850958, + 0.07599465548992157, + -0.0332290343940258, + -0.021963944658637047, + -0.01353002805262804, + 0.023111315444111824, + -0.01807480677962303, + -0.01350022666156292, + -0.045119963586330414, + 0.0691402330994606, + 0.0018616827437654138, + -0.04440471902489662, + 0.0009601775673218071, + 0.010251827538013458, + -0.026210704818367958, + -0.001405342249199748, + -0.07742514461278915, + -0.023156017065048218, + -0.0013336316915228963, + 0.01655491441488266, + -0.07855761051177979, + -0.006504248362034559, + 0.011920729652047157, + -0.005118463188409805, + -0.0005443489644676447, + -0.0055021620355546474, + -0.006548950914293528, + 0.017702283337712288, + 0.018402626737952232, + 0.02632991224527359, + 0.015161678194999695, + 0.04082849994301796, + -0.02406497299671173, + 0.0020414250902831554, + -0.0139621552079916, + -0.002460513263940811, + 0.003315452951937914, + -0.045179568231105804, + -0.006884221453219652, + 0.011242737993597984, + -0.012151693925261497, + -0.03352705389261246, + -0.006921473890542984, + -0.0008307258831337094, + -0.01279988419264555, + -0.057547323405742645, + 0.0024810018949210644, + 0.00021711095178034157, + 0.01160036027431488, + -0.017538374289870262, + 0.018387725576758385, + 0.03468932583928108, + -0.01333631668239832, + 0.008188051171600819, + 0.012293253093957901, + 0.007822979241609573, + 0.010512594133615494, + -0.008314709179103374, + -0.02135300822556019, + 0.0285799503326416, + -0.08600806444883347, + -0.008024141192436218, + -0.05996127054095268, + -0.003941291477531195, + 0.023483838886022568, + -0.03558338060975075, + 0.00025867053773254156, + -0.04070929437875748, + -0.0019538821652531624, + 0.0008302602218464017, + -0.0031664439011365175, + -0.010713756084442139, + -0.014625245705246925, + 0.06687529385089874, + -0.010490242391824722, + -0.08761736750602722, + -0.024556703865528107, + 0.025823282077908516, + -0.02667263336479664, + 0.0069624511525034904, + -0.0013205934083089232, + 0.00807629432529211, + -0.06139175966382027, + -0.022649386897683144, + -0.0018039416754618287, + -0.010981972329318523, + 0.00781552866101265, + 0.017791690304875374, + 0.04792133346199989, + -0.04735510051250458, + -0.018983762711286545, + 0.013373568654060364, + 0.08392193913459778, + 0.002819997724145651, + 0.033080026507377625, + -0.0037326784804463387, + 0.00911190826445818, + -0.04488154873251915, + -0.030934294685721397, + -0.02068246714770794, + -0.040798697620630264, + 0.03671584650874138, + -0.0032204596791416407, + -0.0049433778040111065, + 0.05534198880195618, + -0.057487718760967255, + -0.013798245228827, + 0.00460438197478652, + 0.030397862195968628, + -0.045984216034412384, + 0.008165700361132622, + 0.020697366446256638, + 0.06508718430995941, + 0.003429072443395853, + 0.025242146104574203, + 0.08356431871652603, + 0.07814038544893265, + 0.04210997745394707, + 0.010877666063606739, + 0.045835208147764206, + 0.05480555444955826, + -0.019505294039845467, + 0.03471912443637848, + -0.02074206992983818, + 0.01701684109866619, + -0.013321415521204472, + 0.005755477584898472, + 0.015012669377028942, + -0.00830725859850645, + 0.00286656292155385, + 0.011153332889080048, + -0.0030137095600366592, + -0.026583228260278702, + 0.0305766724050045, + 0.019132772460579872, + -0.04818955063819885, + -0.020265240222215652, + -0.007986889220774174, + -0.0399046428501606, + -0.025108037516474724, + 0.007074207998812199, + 0.016987040638923645, + 0.02241097204387188, + -0.013112802989780903, + 0.06705410778522491, + 0.014140966348350048, + -0.029220689088106155, + 0.01774698682129383, + -0.016778428107500076, + 0.03868276998400688, + 0.03960662707686424, + -0.0012554018758237362, + -0.0071375370025634766, + 0.031083302572369576, + 0.08290867507457733, + -0.02421398274600506, + -0.01090001780539751, + 0.028445841744542122, + 0.024586506187915802, + -0.012263450771570206, + 0.008575474843382835, + 0.01701684109866619, + 0.017836391925811768, + -0.034599918872117996, + 0.05942483991384506, + -0.005025332793593407, + 0.030040239915251732, + -0.00218670885078609, + -0.04315304383635521, + -0.008337060920894146, + -0.007148712873458862, + 0.02354344166815281, + 0.008925646543502808, + 0.01981821283698082, + 0.005111013073474169, + 0.033407844603061676, + 0.005572941154241562, + -0.0007161751273088157, + -0.013917452655732632, + 0.012419910170137882, + 0.04643124341964722, + -0.01688273437321186, + 0.013939803466200829, + 0.01189837884157896, + 0.006623455788940191, + 0.0003471446980256587, + 0.039070192724466324, + 0.032483987510204315, + -0.018298320472240448, + 0.007681420538574457, + 0.018909258767962456, + 0.007618091534823179, + 0.02181493490934372, + 0.00042164925253018737, + -0.011548207141458988, + -0.011615261435508728, + -0.018790051341056824, + -0.01728505827486515, + 0.0004279355925973505, + -0.027834905311465263, + -0.0007329386426135898, + -0.000144818244734779, + 0.02758158929646015, + 0.007372226566076279, + -0.01935628615319729, + -0.0004281683941371739, + -0.0558486208319664, + 0.00884369108825922, + -0.030934294685721397, + 0.009953809902071953, + 0.00860527716577053, + -0.032603196799755096, + -0.012159144505858421, + 0.01603338122367859, + -0.0007497021579183638, + -0.05659366399049759, + 0.003632097505033016, + 0.018834752961993217, + 0.024020271375775337, + -0.011615261435508728, + -0.010937269777059555, + -0.007942186668515205, + -0.02732827328145504, + -0.02506333403289318, + 0.015973778441548347, + -0.0035799441393464804, + -0.04801074042916298, + 0.032603196799755096, + 0.016659220680594444, + 0.0004973179311491549, + 0.007115185726433992, + 0.02254508063197136, + -0.004459097981452942, + -0.012360306456685066, + 0.016256894916296005, + -0.01512442622333765, + -0.041513942182064056, + -0.0625242292881012, + -0.021978845819830894, + -0.015273435041308403, + 0.03915959969162941, + 0.01326926238834858, + -0.02300700917840004, + -0.03862316533923149, + 0.008120996877551079, + -0.017657581716775894, + 0.0242586862295866, + -0.0005462115514092147, + 0.008724484592676163, + -0.0014416632475331426, + 0.03032335638999939, + 0.05638505145907402, + -0.08678291738033295, + -0.04929221794009209, + -0.004544778261333704, + 0.06163017451763153, + -0.0011073240311816335, + 0.03609000891447067, + -0.023096414282917976, + 0.013887650333344936, + 0.026896147057414055, + 0.023617945611476898, + 0.0016065046656876802, + 0.043838486075401306, + -0.07831919938325882, + 0.007025780156254768, + 0.04440471902489662, + -0.008411564864218235, + 0.0531962588429451, + 0.021755332127213478, + -0.05638505145907402, + -0.018864555284380913, + -0.02168082818388939, + -0.02886306680738926, + -0.01621219329535961, + 0.03647743538022041, + 0.004839071538299322, + -0.02066756598651409, + 0.07086873799562454, + 0.0012498140567913651, + 0.009223665110766888, + -0.020846376195549965, + -0.016793327406048775, + -0.04333185404539108, + -0.011287441477179527, + -0.011026674881577492, + 0.007293996401131153, + 0.007234393153339624, + 0.0032372232526540756, + -0.0005285167135298252, + -0.02381165884435177, + -0.0037662056274712086, + 0.029935933649539948, + -0.04181196168065071, + -0.03662644326686859, + -0.005606468301266432, + -0.02840113826096058, + -0.012285802513360977, + 0.005543139297515154, + 0.02878856286406517, + 0.025301748886704445, + -0.0684845969080925, + 0.01749367080628872, + -0.023617945611476898, + 0.0159588772803545, + 0.0751006007194519, + -0.01273282989859581, + -0.045656394213438034, + -0.00475339125841856, + -0.01269557699561119, + 0.0020246615167707205, + -0.053613483905792236, + 0.008217853493988514, + -0.04294443130493164, + -0.026344813406467438, + 0.010922368615865707, + -0.002285427413880825, + -0.021695729345083237, + 0.05221279710531235, + -0.03150052949786186, + 0.03564298152923584, + -0.012069739401340485, + -0.018924158066511154, + 0.04362986981868744, + -0.010296530090272427, + -0.007644168101251125, + 0.011101179756224155, + 0.025614667683839798, + -0.04196096956729889, + -0.020369546487927437, + -0.003484950866550207, + -0.019982123747467995, + 0.021725529804825783, + 0.03519595414400101, + -0.023960666730999947, + 0.046848468482494354, + -0.002313366625458002, + 0.00967069249600172, + 0.014997768215835094, + 0.03445091098546982, + 0.007644168101251125, + 0.012263450771570206, + 0.030546870082616806, + -0.002363657345995307, + -0.014647596515715122, + -0.028341535478830338, + -0.013686488382518291, + -0.007621816825121641, + -0.029623012989759445, + 0.07277605682611465, + 0.02254508063197136, + 0.03078528493642807, + -0.006206229794770479, + -0.020369546487927437, + -0.024109676480293274, + -0.015318137593567371, + 0.02154671959578991, + 0.024690812453627586, + -0.04416630417108536, + -0.00037997326580807567, + 0.02014603279531002, + 0.024512000381946564, + -0.03701386600732803, + 0.04559679329395294, + 0.014342128299176693, + 0.019117871299386024, + 0.011630162596702576, + -0.03957682475447655, + 0.011637612245976925, + 0.015407543629407883, + 0.0007632061024196446, + -0.004131278023123741, + -0.014573092572391033, + 0.11390257626771927, + 0.02606169506907463, + -0.006466995924711227, + 0.03617941588163376, + -0.0531962588429451, + 0.06633885949850082, + -0.011287441477179527, + 0.024288486689329147, + 0.025093136355280876, + -0.0005713568534702063, + -0.0399046428501606, + -0.03495753929018974, + -0.027238868176937103, + 0.014699749648571014, + -0.0016037106979638338, + 0.0038630615454167128, + -0.005330801475793123, + 0.008828790858387947, + -0.03889138251543045, + 0.033020421862602234, + -0.0024381617549806833, + -0.011279990896582603, + 0.01289673987776041, + 0.029161086305975914, + 0.06878261268138885, + 0.028565049171447754, + 0.0018812401685863733, + 0.013537478633224964, + 0.020265240222215652, + 0.033676061779260635, + -0.03838475048542023, + -0.028311733156442642, + -0.0009611088316887617, + 0.03650723397731781, + -0.010840414091944695, + -0.019460592418909073, + 0.03293101489543915, + 0.0017750711413100362, + -0.0024251234717667103, + -0.0058448826894164085, + 0.017985401675105095, + 0.018536735326051712, + -0.006567577365785837, + -0.014774254523217678, + 0.016391003504395485, + -0.0001331769017269835, + -0.0013261812273412943, + -0.02074206992983818, + 0.03439130634069443, + 0.012069739401340485, + 0.0029969459865242243, + -0.02168082818388939, + -0.03164953738451004, + -0.020309943705797195, + 0.03111310489475727, + -0.010162422433495522, + -0.022232161834836006, + -0.012069739401340485, + 0.016718823462724686, + -0.012121892534196377, + -0.02101028710603714, + 0.005010431632399559, + 0.008798988536000252, + -0.024765316396951675, + 0.0166145171970129, + 0.00586723443120718, + 0.014066461473703384, + -0.0399046428501606, + 0.02671733684837818, + -0.02200864814221859, + 0.003483088221400976, + -0.0037811065558344126, + -0.03629862144589424, + 0.038593363016843796, + 0.06028909236192703, + -0.02233646810054779, + 0.027432579547166824, + -0.014111164025962353, + 0.008351961150765419, + -0.027149463072419167, + 0.00950678251683712, + 3.620456118369475e-05, + -0.011361945420503616, + 0.01203993707895279, + -0.014237822033464909, + 0.04488154873251915, + -0.00904485397040844, + -0.017240354791283607, + -0.0013317690463736653, + -0.0008060462423600256, + -0.018268518149852753, + -0.004492625128477812, + 0.045447781682014465, + 0.011011774651706219, + -0.014386830851435661, + 0.016048282384872437, + 0.03209656476974487, + -0.021129494532942772, + -0.037669505923986435, + -0.04127552732825279, + -0.0015115112764760852, + 0.0186112392693758, + -0.01782149076461792, + 0.02598719112575054, + -0.05844137817621231, + 0.035344965755939484, + -0.020175835117697716, + -0.027030255645513535, + 0.011913279071450233, + -0.047504108399152756, + 0.006128000095486641, + -0.04908360540866852, + 0.017657581716775894, + -0.01747876964509487, + 0.023379530757665634, + 0.02612129971385002, + 0.0006998772150836885, + -0.036596640944480896, + 0.025942487642169, + -0.045179568231105804, + 0.05963345244526863, + 0.01868574507534504, + -0.02354344166815281, + 0.0458948090672493, + 0.03358665481209755, + -0.004224408883601427, + -0.027238868176937103, + 0.004846521653234959, + 0.01655491441488266, + 0.00465280981734395, + 0.03704366832971573, + -0.0055692158639431, + 0.01456564199179411, + 0.04881538823246956, + 0.03129191696643829, + 0.04592461138963699, + 0.01399195659905672, + -0.004976904951035976, + -0.019505294039845467, + 0.006090748123824596, + -0.0159588772803545, + 0.002218373352661729, + -0.021770233288407326, + 0.015079723671078682, + -0.01622709445655346, + 0.0020749520044773817, + 0.0026542250998318195, + 0.007338699419051409, + 0.019862916320562363, + 0.0038220840506255627, + -0.0372224785387516, + 0.03814633563160896, + -0.0025927587412297726, + -0.02267918922007084, + 0.007215766701847315, + -0.02533155120909214, + -0.015251084230840206, + -0.049202810972929, + -0.027358075603842735, + 0.03072568215429783, + -0.03811653330922127, + 0.0012991733383387327, + -0.03871257230639458, + 0.04824915528297424, + 0.04249740391969681, + -0.010087917558848858, + -0.005151990335434675, + -0.005051409360021353, + -0.03489793837070465, + -0.03051706776022911, + -0.038742370903491974, + 1.307467755395919e-05, + 0.006884221453219652, + -0.017702283337712288, + 0.038742370903491974, + -0.018179113045334816, + -0.033825069665908813, + 0.004429296124726534, + -0.03847415745258331, + 0.010944720357656479, + -0.028758760541677475, + -0.14519448578357697, + -0.01603338122367859, + 0.057219505310058594, + 0.006943825166672468, + -0.03364625945687294, + 0.04148413985967636, + -0.028237229213118553, + -0.04911340773105621, + 0.018462231382727623, + -0.02320072054862976, + 0.00691402330994606, + -0.09661751985549927, + -0.01402920950204134, + -0.06082552298903465, + 0.006578752771019936, + 0.020905980840325356, + 0.0030230225529521704, + -0.04446432366967201, + -0.02446729876101017, + -0.004816719796508551, + 0.031232312321662903, + -0.023349730297923088, + -0.015809867531061172, + 0.04136493429541588, + -0.060676515102386475, + 0.005111013073474169, + 0.005114738363772631, + 0.0018654079176485538, + -0.05400090664625168, + 0.007986889220774174, + -0.0014099988620728254, + -8.89398215804249e-05, + 0.0745045617222786, + -0.0046751610934734344, + 0.02972732111811638, + -0.03954702243208885, + 0.041066914796829224, + -0.004582030698657036, + -0.0030993898399174213, + 0.0020954408682882786, + -0.012047387659549713, + -0.01528833620250225, + -0.03802713006734848, + 0.06770974397659302, + -0.01855163648724556, + 0.009849502705037594 + ], + "result": "--- 结果 1 (相似度: 1.000) ---\n文件路径: C:\\Steam\\steamapps\\common\\RimWorld\\Data\\dll1.6\\Verse\\ThingOwner.txt\n\npublic class ThingOwner : ThingOwner, IList, ICollection, IEnumerable, IEnumerable where T : Thing\n{\n\tprivate List innerList = new List();\n\n\tpublic List InnerListForReading => innerList;\n\n\tpublic new T this[int index] => innerList[index];\n\n\tpublic override int Count => innerList.Count;\n\n\tT IList.this[int index]\n\t{\n\t\tget\n\t\t{\n\t\t\treturn innerList[index];\n\t\t}\n\t\tset\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow setting individual elements.\");\n\t\t}\n\t}\n\n\tbool ICollection.IsReadOnly => true;\n\n\tpublic ThingOwner()\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, bool oneStackOnly, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner, oneStackOnly, contentsLookMode, removeContentsIfDestroyed)\n\t{\n\t}\n\n\tpublic override void ExposeData()\n\t{\n\t\tbase.ExposeData();\n\t\tScribe_Collections.Look(ref innerList, \"innerList\", true, contentsLookMode);\n\t\tif (Scribe.mode == LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\tint num = innerList.RemoveAll((T x) => x == null || (x is MinifiedThing minifiedThing && minifiedThing.InnerThing == null));\n\t\t\tif (num > 0)\n\t\t\t{\n\t\t\t\tLog.Warning($\"ThingOwner removed {num} invalid entries during PostLoadInit.\");\n\t\t\t}\n\t\t}\n\t\tif (Scribe.mode != LoadSaveMode.LoadingVars && Scribe.mode != LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] != null)\n\t\t\t{\n\t\t\t\tinnerList[i].holdingOwner = this;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic List.Enumerator GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tpublic override int GetCountCanAccept(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (!(item is T))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\treturn base.GetCountCanAccept(item, canMergeWithExistingStacks);\n\t}\n\n\tpublic override int TryAdd(Thing item, int count, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (count <= 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item?.ToString() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + count + \" of \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tint stackCount = item.stackCount;\n\t\tint num = Mathf.Min(stackCount, count);\n\t\tThing thing = item.SplitOff(num);\n\t\tif (!TryAdd((T)thing, canMergeWithExistingStacks))\n\t\t{\n\t\t\tif (thing != item)\n\t\t\t{\n\t\t\t\tint result = stackCount - item.stackCount - thing.stackCount;\n\t\t\t\titem.TryAbsorbStack(thing, respectStackLimit: false);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn stackCount - item.stackCount;\n\t\t}\n\t\tCompPushable compPushable = item.TryGetComp();\n\t\tif (compPushable != null && owner is Pawn pawn)\n\t\t{\n\t\t\tcompPushable.OnStartedCarrying(pawn);\n\t\t}\n\t\treturn num;\n\t}\n\n\tpublic override bool TryAdd(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (canMergeWithExistingStacks)\n\t\t{\n\t\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t\t{\n\t\t\t\tT val = innerList[i];\n\t\t\t\tif (!val.CanStackWith(item))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint num = Mathf.Min(item.stackCount, val.def.stackLimit - val.stackCount);\n\t\t\t\tif (num > 0)\n\t\t\t\t{\n\t\t\t\t\tThing other = item.SplitOff(num);\n\t\t\t\t\tint stackCount = val.stackCount;\n\t\t\t\t\tval.TryAbsorbStack(other, respectStackLimit: true);\n\t\t\t\t\tif (val.stackCount > stackCount)\n\t\t\t\t\t{\n\t\t\t\t\t\tNotifyAddedAndMergedWith(val, val.stackCount - stackCount);\n\t\t\t\t\t}\n\t\t\t\t\tif (item.Destroyed || item.stackCount == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Count >= maxStacks)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\titem.holdingOwner = this;\n\t\tinnerList.Add(item2);\n\t\tNotifyAdded(item2);\n\t\treturn true;\n\t}\n\n\tprotected override void NotifyAdded(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemAdded(item as T);\n\t\t}\n\t\tbase.NotifyAdded(item);\n\t}\n\n\tprotected override void NotifyRemoved(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemRemoved(item as T);\n\t\t}\n\t\tbase.NotifyRemoved(item);\n\t}\n\n\tpublic void TryAddRangeOrTransfer(IEnumerable things, bool canMergeWithExistingStacks = true, bool destroyLeftover = false)\n\t{\n\t\tif (things == this)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (things is ThingOwner thingOwner)\n\t\t{\n\t\t\tthingOwner.TryTransferAllToContainer(this, canMergeWithExistingStacks);\n\t\t\tif (destroyLeftover)\n\t\t\t{\n\t\t\t\tthingOwner.ClearAndDestroyContents();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (things is IList list)\n\t\t{\n\t\t\tfor (int i = 0; i < list.Count; i++)\n\t\t\t{\n\t\t\t\tif (!TryAddOrTransfer(list[i], canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t\t{\n\t\t\t\t\tlist[i].Destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tforeach (T thing in things)\n\t\t{\n\t\t\tif (!TryAddOrTransfer(thing, canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t{\n\t\t\t\tthing.Destroy();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override int IndexOf(Thing item)\n\t{\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\treturn innerList.IndexOf(item2);\n\t}\n\n\tpublic override bool Remove(Thing item)\n\t{\n\t\tif (!Contains(item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner == this)\n\t\t{\n\t\t\titem.holdingOwner = null;\n\t\t}\n\t\tint index = innerList.LastIndexOf((T)item);\n\t\tinnerList.RemoveAt(index);\n\t\tNotifyRemoved(item);\n\t\treturn true;\n\t}\n\n\tpublic int RemoveAll(Predicate predicate)\n\t{\n\t\tint num = 0;\n\t\tfor (int num2 = innerList.Count - 1; num2 >= 0; num2--)\n\t\t{\n\t\t\tif (predicate(innerList[num2]))\n\t\t\t{\n\t\t\t\tRemove(innerList[num2]);\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\t\treturn num;\n\t}\n\n\tprotected override Thing GetAt(int index)\n\t{\n\t\treturn innerList[index];\n\t}\n\n\tpublic void GetThingsOfType(List list) where J : Thing\n\t{\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] is J item)\n\t\t\t{\n\t\t\t\tlist.Add(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic int TryTransferToContainer(Thing item, ThingOwner otherContainer, int stackCount, out T resultingTransferredItem, bool canMergeWithExistingStacks = true)\n\t{\n\t\tThing resultingTransferredItem2;\n\t\tint result = TryTransferToContainer(item, otherContainer, stackCount, out resultingTransferredItem2, canMergeWithExistingStacks);\n\t\tresultingTransferredItem = (T)resultingTransferredItem2;\n\t\treturn result;\n\t}\n\n\tpublic new T Take(Thing thing, int count)\n\t{\n\t\treturn (T)base.Take(thing, count);\n\t}\n\n\tpublic new T Take(Thing thing)\n\t{\n\t\treturn (T)base.Take(thing);\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, int count, out T resultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing resultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, count, out resultingThing2, placedAction2, nearPlaceValidator);\n\t\tresultingThing = (T)resultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, mode, out lastResultingThing2, placedAction2, nearPlaceValidator);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, out lastResultingThing2, placedAction2, nearPlaceValidator, playDropSound: true);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tint IList.IndexOf(T item)\n\t{\n\t\treturn innerList.IndexOf(item);\n\t}\n\n\tvoid IList.Insert(int index, T item)\n\t{\n\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow inserting individual elements at any position.\");\n\t}\n\n\tvoid ICollection.Add(T item)\n\t{\n\t\tTryAdd(item);\n\t}\n\n\tvoid ICollection.CopyTo(T[] array, int arrayIndex)\n\t{\n\t\tinnerList.CopyTo(array, arrayIndex);\n\t}\n\n\tbool ICollection.Contains(T item)\n\t{\n\t\treturn innerList.Contains(item);\n\t}\n\n\tbool ICollection.Remove(T item)\n\t{\n\t\treturn Remove(item);\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n}\n\n", + "timestamp": "2025-08-24 20:53:27,802" + }, + "ThingOwner-TryAdd-override-virtual": { + "keywords": [ + "ThingOwner", + "TryAdd", + "virtual", + "override" + ], + "question": "public abstract class ThingOwner virtual override TryAdd", + "embedding": [ + -0.0049171303398907185, + 0.0012670025462284684, + 0.019699471071362495, + -0.01261199451982975, + -0.08294514566659927, + 0.0006480089505203068, + 0.017130648717284203, + 0.04450564086437225, + 0.02870582789182663, + 0.07916928082704544, + -0.055399928241968155, + -0.0877113938331604, + -0.011567442677915096, + -0.05781400203704834, + 0.004495440982282162, + -0.0044722286984324455, + -0.01843053475022316, + -0.0782407894730568, + -0.03262096270918846, + 0.026926221325993538, + 0.01801271364092827, + 0.0709366649389267, + 0.013463110662996769, + 0.0554618276655674, + 0.04150352254509926, + -0.0018540793098509312, + -0.0014275539433583617, + 0.06069232150912285, + -0.01242629624903202, + -0.008774233981966972, + -0.03707771748304367, + 0.026260804384946823, + -0.005396850407123566, + -0.021680250763893127, + 0.02480616793036461, + 0.012735793367028236, + -0.056173671036958694, + 0.0025939701590687037, + 0.014600511640310287, + -0.012975653633475304, + -0.01609383337199688, + -0.01444576308131218, + -0.004356167279183865, + 0.0029382852371782064, + -0.026632199063897133, + 0.03546833246946335, + 0.01826031133532524, + -0.04462943971157074, + -0.007671651896089315, + 0.05902104079723358, + -0.008588536642491817, + 0.006039056461304426, + -0.024713318794965744, + -0.029170073568820953, + -0.01337799895554781, + 0.018291261047124863, + -0.003855169517919421, + -0.019668521359562874, + -0.019885169342160225, + 0.04370094835758209, + -0.014283277094364166, + 0.03136749938130379, + -0.02638460136950016, + -0.027870187535881996, + 0.049364738166332245, + 0.017362769693136215, + 0.003957690205425024, + 0.04193681478500366, + 0.011157359927892685, + -0.02989739179611206, + -0.004781725350767374, + -0.008457000367343426, + -0.06938917934894562, + 0.011497805826365948, + -0.05567847564816475, + 0.061187516897916794, + 0.021277904510498047, + 0.02735951729118824, + -0.007307993248105049, + 0.010252081789076328, + -0.011668029241263866, + -0.021695725619792938, + -0.028968900442123413, + 0.013849982060492039, + 0.07731229811906815, + 0.024187175557017326, + -0.003183948341757059, + -0.09049686789512634, + -0.04688876494765282, + 0.10262914001941681, + -0.007509165909141302, + 0.024109801277518272, + 0.015699224546551704, + -0.02189689874649048, + -0.01648070476949215, + 0.08690670132637024, + -0.06976057589054108, + 0.015629587695002556, + -0.017687741667032242, + 0.010669901967048645, + -0.012844117358326912, + -0.10300053656101227, + -0.02797851152718067, + 0.07564102113246918, + 0.0016954621532931924, + 0.05960908532142639, + -0.009818785823881626, + -0.00341993966139853, + -0.017409194260835648, + 0.01846148446202278, + -0.032682862132787704, + -0.018151987344026566, + 0.03395180031657219, + 0.028783202171325684, + -0.02231471985578537, + 0.03124370239675045, + -0.009223004803061485, + -0.03203291818499565, + -1.2973779121239204e-05, + -0.011296633630990982, + 0.05397624149918556, + -0.0009255888871848583, + 0.005304001271724701, + -0.013873194344341755, + -0.010724063962697983, + 0.03280666097998619, + -0.006990759167820215, + 0.013842244632542133, + -0.014724310487508774, + 0.015358778648078442, + -0.014995119534432888, + -0.015536739490926266, + -0.026137005537748337, + -0.03729436546564102, + -0.0056289732456207275, + -0.01917332597076893, + 0.021865949034690857, + 0.006588412914425135, + -0.09879137575626373, + 0.008395100943744183, + -0.02407885156571865, + 0.007133901119232178, + -0.00038348586531355977, + -0.0005628973012790084, + 0.08597820997238159, + -0.020906507968902588, + -0.05574037507176399, + -0.02327415905892849, + -0.015258192084729671, + 0.005950076039880514, + -0.009617612697184086, + -0.01114962249994278, + -0.005346557125449181, + 0.039275143295526505, + 0.020983882248401642, + 0.0028067491948604584, + 0.019065003842115402, + -0.035777829587459564, + -0.0038803161587566137, + -0.0349731370806694, + 0.005160859320312738, + 0.029541470110416412, + -0.03720151633024216, + 0.008836133405566216, + 0.014391601085662842, + -0.024001477286219597, + 0.023630080744624138, + 0.004746907390654087, + 0.04233916103839874, + 0.03317805752158165, + 0.039306093007326126, + -0.008820658549666405, + 0.034230347722768784, + 0.04274150729179382, + 0.020132767036557198, + -0.053821492940187454, + 0.04116307571530342, + 0.05515233054757118, + 0.02910817414522171, + -0.05834014713764191, + 0.060599472373723984, + 0.002671344205737114, + 0.018585283309221268, + 0.00245276209898293, + -0.007373761385679245, + -0.03751101344823837, + 0.010468728840351105, + 0.02307298593223095, + 0.022670641541481018, + 0.04942663758993149, + 0.015366516076028347, + 0.04964328557252884, + 0.02113863080739975, + 0.031909119337797165, + -0.02482164278626442, + -0.01114962249994278, + -0.03438509628176689, + 0.04948853701353073, + -0.11878487467765808, + 0.0068205357529222965, + 0.0029266790952533484, + 0.010375880636274815, + 0.01097939908504486, + -0.007725813891738653, + 0.03008308820426464, + -0.02233019471168518, + -0.0021471341606229544, + -0.032868560403585434, + 0.01590813510119915, + 0.006468483246862888, + 0.03608732670545578, + -0.008371888659894466, + 0.008905770257115364, + -0.048436250537633896, + -0.03299235925078392, + -0.023614605888724327, + -0.02889152616262436, + 0.005775983911007643, + 0.03413749858736992, + -0.004100832622498274, + 0.004356167279183865, + 0.018291261047124863, + -0.00843378808349371, + -0.0020136635284870863, + 0.017950814217329025, + -0.021633826196193695, + 0.025115665048360825, + 0.0538833923637867, + 0.03155319765210152, + -0.02290276251733303, + -0.013246462680399418, + 0.016449755057692528, + -0.05119077116250992, + 0.00597328832373023, + 0.016062883660197258, + -0.03881089761853218, + -0.007598146330565214, + -0.011551967822015285, + 0.043360501527786255, + 0.012256073765456676, + -0.03806810826063156, + 0.029727168381214142, + -0.008805183693766594, + 0.026090580970048904, + -0.004255581181496382, + 0.00941644050180912, + -0.035251684486866, + 0.01329288724809885, + 0.035623081028461456, + -0.008070128969848156, + 0.024388348683714867, + 0.034446995705366135, + -0.04602217301726341, + 0.025270413607358932, + -0.011497805826365948, + 0.03785146027803421, + -0.012929229065775871, + 0.011079985648393631, + -0.009989009238779545, + -0.039677489548921585, + -0.02718929387629032, + 0.024868067353963852, + 0.012372134253382683, + -0.017115173861384392, + -0.036768220365047455, + 0.008387363515794277, + 0.00979557354003191, + 0.007923117838799953, + -0.06784170120954514, + -0.0627659484744072, + -0.008309989236295223, + 0.040048886090517044, + 0.010623477399349213, + -0.0454341284930706, + -0.046826865524053574, + -0.013053027912974358, + 0.02636912651360035, + 0.038687098771333694, + -0.04933378845453262, + -0.002611379139125347, + -0.022825388237833977, + 0.011304371058940887, + -0.055214229971170425, + -0.007176456972956657, + -0.02559538558125496, + 0.017935339361429214, + 0.02986644208431244, + -0.06901778280735016, + -0.006793454755097628, + -0.027514265850186348, + 0.0036636684089899063, + 0.06425153464078903, + -0.03494218736886978, + 0.006743161473423243, + -0.027669014409184456, + 0.020999357104301453, + -0.01883288100361824, + 0.003584359772503376, + -0.018925730139017105, + 0.02347533218562603, + -0.013702970929443836, + -0.0049287364818155766, + 0.0015658603515475988, + 0.018523383885622025, + 0.03413749858736992, + 0.00030417731613852084, + -0.003491510869935155, + -0.12348922342061996, + 0.026276279240846634, + -0.09136345237493515, + -0.01649617962539196, + 0.01251140795648098, + -0.013122664764523506, + 0.005516780540347099, + -0.018538858741521835, + 0.016960425302386284, + -0.05942338705062866, + 0.0022960794158279896, + 0.010716326534748077, + 0.02172667533159256, + 0.009060518816113472, + 0.013339311815798283, + -0.0005063174176029861, + 0.019126901403069496, + -0.02561086043715477, + 0.0028995980974286795, + 0.021432653069496155, + 0.008201665244996548, + -0.00788829941302538, + 0.007690995465964079, + -0.03277571126818657, + -0.003688815049827099, + 0.040234584361314774, + 0.008178452961146832, + 0.005269182845950127, + -0.0011248274240642786, + 0.012534620240330696, + -0.033487554639577866, + 0.010453253984451294, + 0.019683996215462685, + -0.010321718640625477, + -0.05047892779111862, + 0.026817897334694862, + 0.018306735903024673, + 0.023336058482527733, + 0.010027696378529072, + -0.01903405413031578, + 0.041627321392297745, + 0.022221870720386505, + 0.008944457396864891, + 8.41444416437298e-05, + -0.008170715533196926, + -0.01784249022603035, + 0.03877994790673256, + 0.001028109691105783, + -0.019838744774460793, + 0.013819032348692417, + -0.005164728034287691, + -0.03602542728185654, + 0.00902956910431385, + -0.015575426630675793, + 0.013826769776642323, + 0.008565324358642101, + 0.021680250763893127, + 0.02929387241601944, + 0.023583656176924706, + -0.002363781910389662, + 0.05837109684944153, + -0.013153614476323128, + -0.007385367527604103, + 0.011141885071992874, + -0.0699462741613388, + -0.017579417675733566, + 0.005903651472181082, + 0.009679512120783329, + -0.033673252910375595, + 0.01706874929368496, + -0.02287181280553341, + 0.003205226268619299, + 0.07898358255624771, + 0.048436250537633896, + -0.0014643067261204123, + 0.0021355280186980963, + -0.03556118160486221, + -0.02752974070608616, + 0.010004484094679356, + -0.018693607300519943, + 0.025146614760160446, + 0.031135378405451775, + -0.062363605946302414, + 0.017734166234731674, + 0.025548961013555527, + -0.03342565521597862, + -0.011451381258666515, + 0.01357917208224535, + 0.013726183213293552, + 0.000961858022492379, + 0.04794105514883995, + 0.03146034851670265, + 0.0029537600930780172, + 0.010615739971399307, + -0.015057018958032131, + -0.020287515595555305, + 0.040853578597307205, + 0.006104824598878622, + -0.03983223810791969, + 0.022252820432186127, + 0.019838744774460793, + -0.008774233981966972, + 0.030315211042761803, + -0.04695066437125206, + 0.00044780317693948746, + 0.030005713924765587, + -0.0037255678325891495, + -0.03203291818499565, + -0.011768615804612637, + 0.02327415905892849, + -0.009927109815180302, + 0.08449262380599976, + -0.0768171027302742, + -0.01884835585951805, + 0.04326765239238739, + 0.01561411377042532, + 0.02889152616262436, + 0.013672021217644215, + 0.009385490790009499, + 0.0020600880961865187, + -0.028086835518479347, + -0.011056773364543915, + 0.0011693176347762346, + 0.008658172562718391, + -0.003127851989120245, + -0.022825388237833977, + 0.0695129781961441, + 0.00806239154189825, + -0.025966782122850418, + 0.02172667533159256, + 0.02660124935209751, + -0.05236686021089554, + -0.012828642502427101, + -0.032280515879392624, + -0.007013971451669931, + -0.019111426547169685, + -0.009772361256182194, + -0.037572912871837616, + -0.0388418473303318, + 0.024713318794965744, + 0.009509289637207985, + 0.021200530230998993, + 0.023336058482527733, + -0.0014497990487143397, + -0.0012225123355165124, + -0.0004782692703884095, + 0.018167462199926376, + 0.03664442151784897, + 0.042958155274391174, + -0.05292395129799843, + -0.025177564471960068, + -0.014871321618556976, + 0.01436065137386322, + -0.021448127925395966, + -0.032094817608594894, + 0.008542112074792385, + 0.004920999053865671, + -0.0016151864547282457, + 0.00490552419796586, + -0.02674052305519581, + 0.00645687710493803, + -0.015730174258351326, + -0.05601892247796059, + 0.01824483647942543, + -0.0252239890396595, + -0.0052459705621004105, + -0.018182937055826187, + 0.011157359927892685, + -0.023939577862620354, + -0.027313092723488808, + 0.023722929880023003, + 0.006433664821088314, + -0.00854984950274229, + 0.020504163578152657, + -0.004495440982282162, + -0.005880439188331366, + 0.012062638066709042, + -0.036582522094249725, + -0.06858449429273605, + -0.06815119832754135, + -0.03280666097998619, + 0.007311861962080002, + -0.04574362561106682, + -0.006077743601053953, + -0.05057177692651749, + -0.0050447979010641575, + 0.016805676743388176, + -0.010731801390647888, + 0.0016451689880341291, + -0.012735793367028236, + 0.06437533348798752, + -0.022469468414783478, + -0.13877835869789124, + -0.033394705504179, + 0.03376610204577446, + -0.023011086508631706, + 0.010623477399349213, + 0.033642303198575974, + 0.008936719968914986, + -0.04478418827056885, + 0.0021896897815167904, + -0.002996315946802497, + 0.008526637218892574, + -0.012449508532881737, + 0.007865087129175663, + 0.046672116965055466, + -0.04193681478500366, + -0.029371246695518494, + 0.01801271364092827, + 0.05821634829044342, + -0.017796065658330917, + 0.023630080744624138, + 0.026260804384946823, + 0.005745034199208021, + -0.03432319685816765, + -0.0050834850408136845, + -0.02850465476512909, + -0.04487703740596771, + 0.037170566618442535, + 0.010932974517345428, + -0.018337685614824295, + 0.043731898069381714, + -0.03311615809798241, + -0.04487703740596771, + -0.0016828888328745961, + -0.020519638434052467, + -0.024156225845217705, + 0.022593267261981964, + 0.05233591049909592, + 0.02113863080739975, + 0.0052575767040252686, + 0.03305425867438316, + 0.0676560029387474, + 0.0577521026134491, + 0.026322703808546066, + 0.005598023533821106, + -0.017238972708582878, + 0.06555142253637314, + -0.004824281204491854, + 0.044753238558769226, + -0.07489822804927826, + 0.011907889507710934, + -0.024976391345262527, + -0.0038029418792575598, + 0.04555792734026909, + -0.00015523198817390949, + 0.03221861645579338, + -0.0013027881504967809, + -0.008805183693766594, + 0.0029943815898150206, + 0.01651165448129177, + 0.016821151599287987, + -0.060444723814725876, + 0.0050061107613146305, + -0.01269710622727871, + -0.030887780711054802, + -0.05125267058610916, + 0.0014062761329114437, + 0.013819032348692417, + 0.025301363319158554, + 0.019065003842115402, + 0.051685966551303864, + -0.021045781672000885, + -0.027792813256382942, + 0.021633826196193695, + -0.03583972901105881, + 0.03933704271912575, + 0.042586758732795715, + 0.0017022324027493596, + 0.023119410499930382, + 0.03395180031657219, + 0.06381823867559433, + -0.009238479658961296, + 0.006244097836315632, + 0.03942989185452461, + 0.008665909990668297, + -0.02500734105706215, + 0.03648967295885086, + 0.01937449909746647, + 0.01242629624903202, + -0.003154932986944914, + -0.011521018110215664, + -0.0029614975210279226, + 0.02988191694021225, + -0.0009768492309376597, + -0.07167945802211761, + -0.005988763179630041, + -0.0262298546731472, + 0.03608732670545578, + 0.0013066567480564117, + 0.07130806148052216, + -0.008650435134768486, + 0.003787467023357749, + -0.01686757616698742, + 0.0034489550162106752, + -0.026075106114149094, + 0.020891033113002777, + 0.03416844829916954, + -0.006371765397489071, + -0.0031742765568196774, + 0.00891350768506527, + 0.017347294837236404, + -0.007586540188640356, + 0.04391759634017944, + 0.04639356955885887, + -0.018709082156419754, + 0.006538120098412037, + 0.015118918381631374, + -0.017393719404935837, + 0.019095951691269875, + -0.02189689874649048, + -0.0026191165670752525, + 0.0021800179965794086, + 0.006379502825438976, + -0.018678132444620132, + 0.02231471985578537, + -0.04283435642719269, + -0.006805060897022486, + 0.0013569500297307968, + 0.02000896818935871, + 0.014701098203659058, + -0.01436065137386322, + 0.0022612609900534153, + -0.017208022996783257, + 0.024883542209863663, + -0.06914158165454865, + 0.042555809020996094, + 0.021448127925395966, + -0.0147629976272583, + 0.02678694762289524, + 0.028999850153923035, + -0.005362031981348991, + -0.040079835802316666, + 0.01821388676762581, + 0.026910746470093727, + 0.022577792406082153, + -0.015730174258351326, + -0.0008685254142619669, + -0.02539421245455742, + -0.012766743078827858, + -0.04345335066318512, + 0.014167215675115585, + -0.015103443525731564, + 0.005481962114572525, + 0.02209807187318802, + 0.004131782334297895, + -0.029572419822216034, + -0.031940069049596786, + 0.01668187789618969, + 0.01844600960612297, + 0.018322210758924484, + 0.014724310487508774, + -0.020318465307354927, + -0.028071360662579536, + -0.024171700701117516, + -0.030423535034060478, + -0.014468975365161896, + 0.04794105514883995, + -0.006650312338024378, + -0.008573061786592007, + -0.01785796508193016, + 0.027715438976883888, + -0.01262746937572956, + 0.024310974404215813, + -0.0038609725888818502, + 0.017300870269536972, + -0.02757616527378559, + 0.024295499548316002, + 0.05184071511030197, + -0.008758759126067162, + -0.05100507289171219, + -0.0038396946620196104, + 0.05199546366930008, + 0.02195879817008972, + 0.018167462199926376, + -0.03243526443839073, + 0.002692622132599354, + 0.015761123970150948, + -0.003491510869935155, + -0.0195601973682642, + 0.051593117415905, + -0.03893469646573067, + -0.023227734491229057, + 0.06323019415140152, + -0.012333447113633156, + 0.02910817414522171, + 0.018786456435918808, + -0.05038607865571976, + -0.01577659882605076, + -0.009068256244063377, + -0.035963527858257294, + -0.00788829941302538, + 0.0520264133810997, + 0.0028086835518479347, + -0.009106943383812904, + 0.05722595751285553, + 0.010159232653677464, + -0.002539808163419366, + -0.016372380778193474, + -0.01349406037479639, + -0.03667537122964859, + -0.0017505913274362683, + -0.03141392394900322, + -0.011234734207391739, + 0.05063367635011673, + -0.024403823539614677, + -0.00902956910431385, + -0.0051221721805632114, + 0.018585283309221268, + 0.04636261984705925, + -0.0246514193713665, + -0.03995603695511818, + 0.007184194400906563, + -0.034632690250873566, + -0.019683996215462685, + -0.006518776528537273, + 0.015567689202725887, + -0.012658419087529182, + -0.016728302463889122, + 0.010329456068575382, + -0.014414813369512558, + -0.03515883535146713, + 0.0547499842941761, + -0.007246093824505806, + -0.022392094135284424, + -0.017146123573184013, + 0.02757616527378559, + 0.010608002543449402, + -0.02927839756011963, + 0.014708835631608963, + -0.03023783676326275, + -0.010128282941877842, + 0.028566554188728333, + -0.007687126751989126, + -0.014600511640310287, + 0.09606780856847763, + -0.0508812740445137, + 0.028396330773830414, + 0.004085357766598463, + -0.005818539764732122, + 0.03136749938130379, + 0.008820658549666405, + -0.0013492126017808914, + 0.024914491921663284, + 0.01524271722882986, + -0.025951307266950607, + 0.002990512875840068, + 0.029340296983718872, + -0.027050020173192024, + 0.04964328557252884, + 0.012774480506777763, + 0.0021896897815167904, + 0.0262298546731472, + 0.02112315595149994, + -0.012449508532881737, + 0.01329288724809885, + 0.01066216453909874, + 0.003195554483681917, + 0.02834990620613098, + 0.033394705504179, + 0.017409194260835648, + -0.02268611639738083, + -0.005126040894538164, + -0.018956679850816727, + 0.030980629846453667, + -0.04933378845453262, + 0.05601892247796059, + -0.005547730252146721, + 0.02542516216635704, + -0.013757132925093174, + -0.011172834783792496, + -0.05205736309289932, + -0.048621948808431625, + 0.0434224009513855, + 0.006843748036772013, + -0.05964003503322601, + -0.0042710560373961926, + 0.022639691829681396, + 0.03218766674399376, + -0.012851854786276817, + 0.055771324783563614, + 0.010468728840351105, + 0.06072327122092247, + 0.004909392911940813, + -0.020287515595555305, + 0.011637079529464245, + 0.021448127925395966, + -0.01940544880926609, + -0.015258192084729671, + -0.004031195770949125, + 0.11519470810890198, + 0.04484608769416809, + -0.0007732583908364177, + 0.03240431472659111, + -0.04035838320851326, + 0.017966289073228836, + -0.008356413803994656, + 0.033673252910375595, + 0.04561982676386833, + -0.007617489900439978, + -0.03062470816075802, + -0.03822285309433937, + 0.0004688392800744623, + -0.017718691378831863, + -0.0162640567868948, + 0.004526390694081783, + -0.00611643074080348, + 0.008387363515794277, + -0.01883288100361824, + 0.028009461238980293, + 0.0075942776165902615, + 0.00933132879436016, + -0.014801684767007828, + 0.03788240998983383, + 0.06784170120954514, + 0.0349731370806694, + -0.011977526359260082, + 0.04302005469799042, + 0.002655869349837303, + 0.033085208386182785, + -0.044319942593574524, + -0.012333447113633156, + 0.005748902913182974, + 0.025657285004854202, + -0.02019466646015644, + -0.018863830715417862, + 0.06462293118238449, + 0.021680250763893127, + 0.009532501921057701, + -0.031692471355199814, + 0.004619239829480648, + -0.008101078681647778, + -0.032280515879392624, + -0.031197277829051018, + 0.01162934210151434, + 0.004154994618147612, + -0.019730420783162117, + -0.008480212651193142, + 0.0161247830837965, + -0.013819032348692417, + -0.01940544880926609, + 0.0038222854491323233, + -0.030330685898661613, + -0.005930732470005751, + 0.028814151883125305, + 0.014414813369512558, + 0.010375880636274815, + 0.03240431472659111, + 0.05648316442966461, + 0.0018627839162945747, + -0.0027119657024741173, + 0.0030059877317398787, + -0.00572955934330821, + -0.008689122274518013, + 0.009339066222310066, + -0.01881740614771843, + 0.008379626087844372, + -0.03472553938627243, + 0.009772361256182194, + 0.011141885071992874, + 0.004127913620322943, + -0.002698425203561783, + -0.03155319765210152, + 0.02830348163843155, + 0.08573061227798462, + -0.003996377345174551, + 0.021401703357696533, + 0.02152550220489502, + -0.013145877048373222, + -0.025734659284353256, + 0.015196292661130428, + 0.0055013056844472885, + 0.024001477286219597, + -0.03262096270918846, + -0.024388348683714867, + 0.038501400500535965, + -0.015165342949330807, + -0.08430692553520203, + 0.0035437382757663727, + 0.03766576200723648, + -0.0007945363176986575, + -0.026461975648999214, + 0.04806485399603844, + 0.0006465581827796996, + -0.013919618912041187, + 0.02367650531232357, + 0.03028426133096218, + 0.0031375237740576267, + -0.0041433884762227535, + -0.03435414656996727, + 0.03064018301665783, + 0.024109801277518272, + -0.017579417675733566, + -0.006878566462546587, + -0.08053106814622879, + 0.004576683975756168, + -0.03673727065324783, + -0.03902754560112953, + -0.027653539553284645, + -0.027684489265084267, + -0.003826154163107276, + -0.026709573343396187, + 0.04286530613899231, + -0.002748718485236168, + 0.026461975648999214, + 0.02774638868868351, + 0.02191237360239029, + -0.013849982060492039, + 0.010747276246547699, + -0.024001477286219597, + 0.06610851734876633, + 0.00941644050180912, + -0.028458230197429657, + 0.029773592948913574, + 0.004414197988808155, + -0.0018318342044949532, + -0.038130007684230804, + 0.01094844937324524, + 0.035592131316661835, + 0.043762847781181335, + 0.023753879591822624, + -0.0180591382086277, + 0.05007658153772354, + 0.038872797042131424, + 0.02640007622539997, + 0.034632690250873566, + 0.008240352384746075, + 0.02500734105706215, + -0.0070255775935947895, + -0.00543166883289814, + -0.03843950107693672, + -0.035035036504268646, + -0.039863187819719315, + 0.02833443135023117, + -0.010174707509577274, + 0.003568884916603565, + 0.022392094135284424, + 0.0013956371694803238, + 0.027313092723488808, + 0.007350549101829529, + -0.018399585038423538, + 0.028860576450824738, + -0.006688999477773905, + -0.038903746753931046, + -0.006642574910074472, + -0.03924419358372688, + 0.01898762956261635, + -0.04908619076013565, + 0.029850967228412628, + 0.02796303667128086, + -0.0010571250459179282, + -0.009872947819530964, + -0.033487554639577866, + 0.07570292055606842, + 0.020844610407948494, + -0.011853727512061596, + 0.0017080354737117887, + -0.010174707509577274, + -0.028071360662579536, + -0.014724310487508774, + -0.04017268493771553, + -0.016542604193091393, + 0.01807461306452751, + -0.02754521556198597, + 0.02907722443342209, + -0.004418066702783108, + -0.047043513506650925, + 0.009153367951512337, + 0.018105562776327133, + -0.00790377426892519, + -0.03819190338253975, + -0.11965146660804749, + 0.003127851989120245, + -0.009145630523562431, + 0.021571926772594452, + -0.041410673409700394, + 0.013548222370445728, + -0.024202650412917137, + -0.050355128943920135, + 0.006309865973889828, + -0.022423043847084045, + 0.024202650412917137, + -0.043143853545188904, + -0.019885169342160225, + -0.05979478359222412, + -0.013718445785343647, + 0.05574037507176399, + 0.031909119337797165, + -0.029015325009822845, + -0.06425153464078903, + -0.0013772607780992985, + 0.003013725159689784, + -0.020999357104301453, + 0.027808288112282753, + 0.05744260549545288, + -0.01632595621049404, + -0.005358163267374039, + 0.01881740614771843, + 0.016186682507395744, + -0.09495361894369125, + 0.016604503616690636, + -0.007849612273275852, + 0.028458230197429657, + 0.06288974732160568, + 0.01094844937324524, + 0.023614605888724327, + -0.038903746753931046, + 0.05663791298866272, + -0.01866265758872032, + -0.01047646626830101, + 0.0017496241489425302, + 0.012875067070126534, + -0.002197427209466696, + -0.018740031868219376, + 0.07774559408426285, + 0.05725690722465515, + -0.0022631953470408916 + ], + "result": "--- 结果 1 (相似度: 1.000) ---\n文件路径: C:\\Steam\\steamapps\\common\\RimWorld\\Data\\dll1.6\\Verse\\ThingOwner.txt\n\npublic class ThingOwner : ThingOwner, IList, ICollection, IEnumerable, IEnumerable where T : Thing\n{\n\tprivate List innerList = new List();\n\n\tpublic List InnerListForReading => innerList;\n\n\tpublic new T this[int index] => innerList[index];\n\n\tpublic override int Count => innerList.Count;\n\n\tT IList.this[int index]\n\t{\n\t\tget\n\t\t{\n\t\t\treturn innerList[index];\n\t\t}\n\t\tset\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow setting individual elements.\");\n\t\t}\n\t}\n\n\tbool ICollection.IsReadOnly => true;\n\n\tpublic ThingOwner()\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, bool oneStackOnly, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner, oneStackOnly, contentsLookMode, removeContentsIfDestroyed)\n\t{\n\t}\n\n\tpublic override void ExposeData()\n\t{\n\t\tbase.ExposeData();\n\t\tScribe_Collections.Look(ref innerList, \"innerList\", true, contentsLookMode);\n\t\tif (Scribe.mode == LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\tint num = innerList.RemoveAll((T x) => x == null || (x is MinifiedThing minifiedThing && minifiedThing.InnerThing == null));\n\t\t\tif (num > 0)\n\t\t\t{\n\t\t\t\tLog.Warning($\"ThingOwner removed {num} invalid entries during PostLoadInit.\");\n\t\t\t}\n\t\t}\n\t\tif (Scribe.mode != LoadSaveMode.LoadingVars && Scribe.mode != LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] != null)\n\t\t\t{\n\t\t\t\tinnerList[i].holdingOwner = this;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic List.Enumerator GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tpublic override int GetCountCanAccept(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (!(item is T))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\treturn base.GetCountCanAccept(item, canMergeWithExistingStacks);\n\t}\n\n\tpublic override int TryAdd(Thing item, int count, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (count <= 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item?.ToString() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + count + \" of \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tint stackCount = item.stackCount;\n\t\tint num = Mathf.Min(stackCount, count);\n\t\tThing thing = item.SplitOff(num);\n\t\tif (!TryAdd((T)thing, canMergeWithExistingStacks))\n\t\t{\n\t\t\tif (thing != item)\n\t\t\t{\n\t\t\t\tint result = stackCount - item.stackCount - thing.stackCount;\n\t\t\t\titem.TryAbsorbStack(thing, respectStackLimit: false);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn stackCount - item.stackCount;\n\t\t}\n\t\tCompPushable compPushable = item.TryGetComp();\n\t\tif (compPushable != null && owner is Pawn pawn)\n\t\t{\n\t\t\tcompPushable.OnStartedCarrying(pawn);\n\t\t}\n\t\treturn num;\n\t}\n\n\tpublic override bool TryAdd(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (canMergeWithExistingStacks)\n\t\t{\n\t\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t\t{\n\t\t\t\tT val = innerList[i];\n\t\t\t\tif (!val.CanStackWith(item))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint num = Mathf.Min(item.stackCount, val.def.stackLimit - val.stackCount);\n\t\t\t\tif (num > 0)\n\t\t\t\t{\n\t\t\t\t\tThing other = item.SplitOff(num);\n\t\t\t\t\tint stackCount = val.stackCount;\n\t\t\t\t\tval.TryAbsorbStack(other, respectStackLimit: true);\n\t\t\t\t\tif (val.stackCount > stackCount)\n\t\t\t\t\t{\n\t\t\t\t\t\tNotifyAddedAndMergedWith(val, val.stackCount - stackCount);\n\t\t\t\t\t}\n\t\t\t\t\tif (item.Destroyed || item.stackCount == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Count >= maxStacks)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\titem.holdingOwner = this;\n\t\tinnerList.Add(item2);\n\t\tNotifyAdded(item2);\n\t\treturn true;\n\t}\n\n\tprotected override void NotifyAdded(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemAdded(item as T);\n\t\t}\n\t\tbase.NotifyAdded(item);\n\t}\n\n\tprotected override void NotifyRemoved(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemRemoved(item as T);\n\t\t}\n\t\tbase.NotifyRemoved(item);\n\t}\n\n\tpublic void TryAddRangeOrTransfer(IEnumerable things, bool canMergeWithExistingStacks = true, bool destroyLeftover = false)\n\t{\n\t\tif (things == this)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (things is ThingOwner thingOwner)\n\t\t{\n\t\t\tthingOwner.TryTransferAllToContainer(this, canMergeWithExistingStacks);\n\t\t\tif (destroyLeftover)\n\t\t\t{\n\t\t\t\tthingOwner.ClearAndDestroyContents();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (things is IList list)\n\t\t{\n\t\t\tfor (int i = 0; i < list.Count; i++)\n\t\t\t{\n\t\t\t\tif (!TryAddOrTransfer(list[i], canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t\t{\n\t\t\t\t\tlist[i].Destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tforeach (T thing in things)\n\t\t{\n\t\t\tif (!TryAddOrTransfer(thing, canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t{\n\t\t\t\tthing.Destroy();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override int IndexOf(Thing item)\n\t{\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\treturn innerList.IndexOf(item2);\n\t}\n\n\tpublic override bool Remove(Thing item)\n\t{\n\t\tif (!Contains(item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner == this)\n\t\t{\n\t\t\titem.holdingOwner = null;\n\t\t}\n\t\tint index = innerList.LastIndexOf((T)item);\n\t\tinnerList.RemoveAt(index);\n\t\tNotifyRemoved(item);\n\t\treturn true;\n\t}\n\n\tpublic int RemoveAll(Predicate predicate)\n\t{\n\t\tint num = 0;\n\t\tfor (int num2 = innerList.Count - 1; num2 >= 0; num2--)\n\t\t{\n\t\t\tif (predicate(innerList[num2]))\n\t\t\t{\n\t\t\t\tRemove(innerList[num2]);\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\t\treturn num;\n\t}\n\n\tprotected override Thing GetAt(int index)\n\t{\n\t\treturn innerList[index];\n\t}\n\n\tpublic void GetThingsOfType(List list) where J : Thing\n\t{\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] is J item)\n\t\t\t{\n\t\t\t\tlist.Add(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic int TryTransferToContainer(Thing item, ThingOwner otherContainer, int stackCount, out T resultingTransferredItem, bool canMergeWithExistingStacks = true)\n\t{\n\t\tThing resultingTransferredItem2;\n\t\tint result = TryTransferToContainer(item, otherContainer, stackCount, out resultingTransferredItem2, canMergeWithExistingStacks);\n\t\tresultingTransferredItem = (T)resultingTransferredItem2;\n\t\treturn result;\n\t}\n\n\tpublic new T Take(Thing thing, int count)\n\t{\n\t\treturn (T)base.Take(thing, count);\n\t}\n\n\tpublic new T Take(Thing thing)\n\t{\n\t\treturn (T)base.Take(thing);\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, int count, out T resultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing resultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, count, out resultingThing2, placedAction2, nearPlaceValidator);\n\t\tresultingThing = (T)resultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, mode, out lastResultingThing2, placedAction2, nearPlaceValidator);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, out lastResultingThing2, placedAction2, nearPlaceValidator, playDropSound: true);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tint IList.IndexOf(T item)\n\t{\n\t\treturn innerList.IndexOf(item);\n\t}\n\n\tvoid IList.Insert(int index, T item)\n\t{\n\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow inserting individual elements at any position.\");\n\t}\n\n\tvoid ICollection.Add(T item)\n\t{\n\t\tTryAdd(item);\n\t}\n\n\tvoid ICollection.CopyTo(T[] array, int arrayIndex)\n\t{\n\t\tinnerList.CopyTo(array, arrayIndex);\n\t}\n\n\tbool ICollection.Contains(T item)\n\t{\n\t\treturn innerList.Contains(item);\n\t}\n\n\tbool ICollection.Remove(T item)\n\t{\n\t\treturn Remove(item);\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n}\n\n", + "timestamp": "2025-08-24 20:56:15,798" + }, + "ThingOwner-TryAdd-abstract-override-virtual": { + "keywords": [ + "ThingOwner", + "TryAdd", + "virtual", + "override", + "abstract" + ], + "question": "ThingOwner TryAdd virtual override abstract methods", + "embedding": [ + 0.006892177741974592, + -0.005672356579452753, + -0.007039462681859732, + 0.0001993302721530199, + -0.05933693051338196, + 0.038037266582250595, + 0.0027663125656545162, + 0.05111918970942497, + 0.029139749705791473, + 0.05743355676531792, + -0.020544353872537613, + -0.07142184674739838, + -0.019743729382753372, + -0.02217581868171692, + -0.0059593734331429005, + -0.008240400813519955, + -0.012371931225061417, + -0.08973048627376556, + -0.05160258337855339, + 0.0030741000082343817, + 0.06090796738862991, + 0.06441259384155273, + 0.0151363555341959, + 0.06284155696630478, + 0.06169348955154419, + 0.03513688966631889, + 0.011896087788045406, + 0.04601331055164337, + 0.008368803188204765, + 0.025302790105342865, + -0.01186587568372488, + 0.0035537201911211014, + 0.014645406045019627, + -0.03465349227190018, + 0.03900406137108803, + 0.014977741055190563, + -0.029804419726133347, + -0.020091170445084572, + 0.02022712491452694, + 0.034834764897823334, + -0.03087695688009262, + 0.0015691505977883935, + -0.002292357152327895, + -0.013066813349723816, + -0.031209291890263557, + 0.03205523639917374, + -0.003870949149131775, + -0.04296186938881874, + 0.0003927597135771066, + 0.03707047551870346, + -0.012032043188810349, + 0.019804153591394424, + -0.043535903096199036, + -0.014305517077445984, + 0.013444467447698116, + 0.010506322607398033, + -0.04084701091051102, + -0.005306032951921225, + -0.013716378249228, + 0.050333667546510696, + -0.008602948859333992, + 0.012296400032937527, + -0.006178412586450577, + -0.021360086277127266, + 0.05154215916991234, + 0.0006198239279910922, + 0.005464647430926561, + 0.01998542807996273, + 0.013942969962954521, + -0.040182340890169144, + -0.01148822158575058, + -0.02013648860156536, + -0.04640607163310051, + 0.031994812190532684, + -0.05124003812670708, + 0.05441232770681381, + 0.03136035427451134, + 0.0036141446325927973, + -0.022855594754219055, + 0.025589806959033012, + -0.009161875583231449, + -0.015921873971819878, + -0.0033120219595730305, + 0.04250868782401085, + 0.08308378607034683, + 0.034593068063259125, + 0.00490571977570653, + -0.1038094162940979, + -0.04021255299448967, + 0.042689960449934006, + 0.006548513192683458, + 0.022221136838197708, + 0.026148732751607895, + -0.017719505354762077, + -0.011254076845943928, + 0.07510774582624435, + -0.08247954398393631, + -0.008368803188204765, + -0.026390431448817253, + 0.02527257800102234, + -0.017462700605392456, + -0.0561344288289547, + -0.013837226666510105, + 0.09837120026350021, + -0.024743862450122833, + 0.10634724795818329, + -0.04196486622095108, + 0.012545651756227016, + -0.02782551571726799, + 0.004588490817695856, + 0.004728222731500864, + -0.015045718289911747, + 0.013625741004943848, + 0.02867146022617817, + -0.017115259543061256, + 0.011155886575579643, + 0.004327910020947456, + -0.051421310752630234, + -0.02432089112699032, + -0.00781742949038744, + 0.064714714884758, + 0.011306948028504848, + 0.008111998438835144, + -0.009743462316691875, + -0.027462968602776527, + 0.03945724666118622, + 0.01602761819958687, + 0.0044638654217123985, + -0.03016696684062481, + 0.0010026702657341957, + -0.009962501004338264, + 0.00486040161922574, + -0.010309942997992039, + -0.0424482636153698, + -0.025665337219834328, + -0.01799141615629196, + 0.030091436579823494, + -0.005143641494214535, + -0.07837066799402237, + 0.009501763619482517, + -0.02003074623644352, + 0.0037954184226691723, + 0.015846343711018562, + 0.0010602624388411641, + 0.07142184674739838, + -0.021692421287298203, + -0.07522859424352646, + -0.022311773151159286, + -0.001380323781631887, + -0.004562055226415396, + -0.027493180707097054, + 0.012122679501771927, + -0.00946399848908186, + 0.045227792114019394, + 0.014048713259398937, + 0.003578267525881529, + 0.00894283689558506, + -0.02158667892217636, + 0.004781094379723072, + -0.05299235135316849, + 0.010173987597227097, + 0.001458686892874539, + -0.029154855757951736, + 0.029789313673973083, + 0.022462835535407066, + -0.020302657037973404, + 0.0346837043762207, + -0.014970188029110432, + 0.04954814910888672, + -0.012273740954697132, + 0.05830971151590347, + 0.004475194960832596, + 0.01101237814873457, + 0.045288216322660446, + 0.022311773151159286, + -0.05788674205541611, + 0.016314635053277016, + 0.04776562377810478, + 0.025786185637116432, + -0.06229773536324501, + 0.04867199435830116, + 0.008300825953483582, + -0.001127295894548297, + -0.019048847258090973, + -0.001308569684624672, + -0.04704052954912186, + 0.03549943491816521, + 0.014992847107350826, + 0.015529114753007889, + 0.045832037925720215, + 0.01101237814873457, + 0.025453850626945496, + 0.014449025504291058, + 0.017719505354762077, + -0.04779583588242531, + -0.005404222756624222, + -0.031602051109075546, + 0.020514141768217087, + -0.08102934807538986, + 0.0032855861354619265, + 0.008806881494820118, + -0.01208491437137127, + 0.01888267882168293, + -0.0027776421047747135, + 0.032387569546699524, + -0.03208544850349426, + 0.010166434571146965, + -0.017613762989640236, + 0.019804153591394424, + 0.024532375857234, + 0.01848991960287094, + -0.0035914855543524027, + -0.00859539583325386, + -0.05504678562283516, + -0.0161786787211895, + -0.02347494661808014, + -0.004320356994867325, + -0.010883975774049759, + 0.029049113392829895, + 0.02581639774143696, + -0.007099887356162071, + -0.0023678878787904978, + -0.00989452376961708, + -0.03785599395632744, + 0.005128535442054272, + -0.027840621769428253, + 0.014584980905056, + 0.013746590353548527, + 0.0270248893648386, + 0.0006575892912223935, + -0.05698037147521973, + 0.015770813450217247, + -0.07831024378538132, + 0.022417515516281128, + 0.020650098100304604, + -0.02533300220966339, + -0.055167634040117264, + -0.029547614976763725, + 0.022870700806379318, + 0.016601651906967163, + -0.02537832036614418, + 0.031209291890263557, + -0.011986724101006985, + 0.03571092337369919, + 0.013791908510029316, + -0.014041160233318806, + -0.048581354320049286, + 0.02661702409386635, + 0.03401903435587883, + 0.025136621668934822, + 0.03492540121078491, + 0.025242365896701813, + -0.04404951259493828, + 0.030287817120552063, + -0.022447729483246803, + 0.04401930049061775, + -0.010022926144301891, + 0.0037765358574688435, + -0.00583097105845809, + -0.03395861014723778, + -0.02137519232928753, + 0.01983436569571495, + 0.0055326251313090324, + -0.015249651856720448, + -0.012417249381542206, + 0.030756106600165367, + 0.024804286658763885, + 0.013731484301388264, + -0.03682877868413925, + -0.027991682291030884, + -0.017810143530368805, + 0.053475745022296906, + -0.0072509488090872765, + -0.06072669476270676, + -0.025846611708402634, + 0.0176288690418005, + 0.032840754836797714, + 0.05755440518260002, + -0.023490052670240402, + -0.003221384948119521, + 0.009947394952178001, + 0.00989452376961708, + -0.02447195164859295, + -0.013452020473778248, + 0.006759998854249716, + 0.030242498964071274, + 0.020665204152464867, + -0.0382789671421051, + 0.012069808319211006, + -0.04489545896649361, + 0.016057830303907394, + 0.0661044791340828, + 0.018958209082484245, + 0.028354231268167496, + -0.028006788343191147, + 0.03441179543733597, + -0.007983596995472908, + 0.005521295126527548, + -0.017704399302601814, + 0.02663213014602661, + -4.767876453115605e-05, + 0.026601918041706085, + -0.01717568375170231, + 0.020060958340764046, + 0.04549970477819443, + 0.022100286558270454, + 0.00658250181004405, + -0.12447462230920792, + 0.024638120085000992, + -0.09891502559185028, + 0.00520784268155694, + -0.004973697476089001, + -0.015385606326162815, + 0.010000267066061497, + -0.011556199751794338, + 0.043143145740032196, + -0.055167634040117264, + -0.007107440382242203, + 0.02797657623887062, + 0.02403387427330017, + 0.01719079166650772, + 0.037040263414382935, + 0.015468690544366837, + 0.005245608277618885, + -0.028006788343191147, + 0.002432089066132903, + 0.04290144518017769, + -0.007254725322127342, + -0.00520784268155694, + -0.006608937401324511, + -0.03117907978594303, + 0.00859539583325386, + 0.03157183900475502, + 0.007945830933749676, + 0.02481939271092415, + -0.0172814279794693, + -0.00765503803268075, + -0.024653226137161255, + -0.002855061087757349, + 0.008142211474478245, + -0.0018901561852544546, + -0.05344553291797638, + 0.02787083387374878, + -0.0012415361125022173, + 0.027342118322849274, + 0.009547082707285881, + -0.018943103030323982, + 0.03498582914471626, + 0.025151727721095085, + 0.008912624791264534, + -0.008844646625220776, + -0.01574060134589672, + -0.0316624753177166, + 0.04951793700456619, + 0.00011701360199367628, + -0.010151328518986702, + 0.025650231167674065, + -0.009373362176120281, + -0.04562055319547653, + 0.007409563288092613, + 0.002520837588235736, + -0.02132987417280674, + 0.021344980224967003, + 0.03426073119044304, + 0.010498769581317902, + 0.01957756094634533, + 0.0016191897448152304, + 0.026964465156197548, + -0.012779797427356243, + -0.009501763619482517, + 0.005978255998343229, + -0.04885326698422432, + -0.013912757858633995, + -0.005037898663431406, + 0.005026569124311209, + -0.011926299892365932, + 0.041390832513570786, + -0.034744128584861755, + 0.014509450644254684, + 0.07299288362264633, + 0.01303660124540329, + 0.009796333499252796, + -0.016012512147426605, + -0.005445764400064945, + -0.026798298582434654, + 0.014018501155078411, + -0.012470121495425701, + 0.02028755098581314, + 0.051028549671173096, + -0.02403387427330017, + 0.0005830026930198073, + 0.03679856285452843, + -0.046526920050382614, + -0.009599953889846802, + 0.012077361345291138, + 0.016918880864977837, + 0.01838417537510395, + 0.0489439032971859, + 0.010951953940093517, + -0.009486657567322254, + -0.004630032926797867, + -0.018656086176633835, + 0.006510747596621513, + 0.02093711495399475, + -0.009229853749275208, + -0.02817295677959919, + 0.03250842168927193, + 0.027644241228699684, + -0.013074366375803947, + 0.025317896157503128, + -0.030892062932252884, + -0.01593698002398014, + 0.06302282959222794, + 0.013550210744142532, + -0.00988697074353695, + -0.027689559385180473, + 0.01139003224670887, + -0.014584980905056, + 0.06423132121562958, + -0.08604459464550018, + 0.00898815505206585, + 0.013912757858633995, + 0.0042561558075249195, + 0.04075637459754944, + 0.009645272046327591, + 0.028339125216007233, + -0.005521295126527548, + -0.04788647219538689, + -0.013807014562189579, + 0.018807148560881615, + 0.03891342505812645, + -0.027311906218528748, + 0.01563485898077488, + 0.06695042550563812, + 0.023203035816550255, + -0.04634564742445946, + 0.03725174814462662, + -0.0256351251155138, + -0.04380781576037407, + -0.026586811989545822, + -0.029305918142199516, + -0.00040102089405991137, + -0.012945964932441711, + 0.0007109328871592879, + -0.057614829391241074, + -0.02562001906335354, + 0.015272310934960842, + 0.013467126525938511, + 0.0284750796854496, + 0.02117881178855896, + 0.0028191839810460806, + -0.016949092969298363, + -0.03362627327442169, + 0.03136035427451134, + 0.03250842168927193, + 0.038581088185310364, + -0.0071980771608650684, + -0.030635258182883263, + -0.02726658806204796, + 0.00015448391786776483, + -0.035741135478019714, + -0.018746724352240562, + -0.008278165943920612, + 0.016511013731360435, + 0.008821987546980381, + -0.01788567379117012, + -0.07347627729177475, + 0.019502030685544014, + -0.0016588433645665646, + -0.02858082205057144, + 0.0019449159735813737, + -0.008897517807781696, + 0.014683171175420284, + -0.004275038372725248, + 0.013142344541847706, + -0.04936687648296356, + -0.02858082205057144, + 0.005842301063239574, + 0.00205443543381989, + -0.008829540573060513, + 0.018006522208452225, + 0.0008978713885881007, + -0.0010715919779613614, + -0.002056323690339923, + -0.026360219344496727, + -0.054925937205553055, + -0.04142104461789131, + -0.03220629692077637, + -0.003234602976590395, + -0.04649670794606209, + 0.007892959751188755, + -0.025212151929736137, + -0.002458524890244007, + -0.005124758929014206, + -0.009486657567322254, + 0.014970188029110432, + -0.02202475629746914, + 0.02492513693869114, + -0.017251215875148773, + -0.10930804908275604, + -0.034049246460199356, + 0.038097694516181946, + -0.037281960248947144, + 0.009275171905755997, + 0.03821854293346405, + 0.008036468178033829, + -0.0439588762819767, + -0.011760132387280464, + -0.03332415223121643, + 0.045137155801057816, + -0.01053653471171856, + -0.0015795361250638962, + 0.036738138645887375, + -0.04580182582139969, + -0.0067486693151295185, + 0.015589539892971516, + 0.05006175860762596, + -0.019154589623212814, + 0.003923820797353983, + 0.04710095375776291, + -0.005041675176471472, + -0.019502030685544014, + -0.002913597272709012, + -0.005423105321824551, + -0.037433020770549774, + 0.025045985355973244, + -0.012432355433702469, + -0.007447328418493271, + 0.03341478854417801, + -0.014509450644254684, + -0.005479753483086824, + 0.04867199435830116, + -0.006355909630656242, + -0.02518193982541561, + 0.013980735093355179, + 0.07226778566837311, + -0.0011707261437550187, + 0.01703972928225994, + 0.019698411226272583, + 0.07486604154109955, + 0.03175311163067818, + 0.022221136838197708, + 0.007779663894325495, + -0.012349272146821022, + 0.09299341589212418, + -0.03066547028720379, + 0.043838027864694595, + -0.07414095103740692, + 0.02022712491452694, + -0.037886206060647964, + 0.011299395002424717, + 0.04169295355677605, + 0.00976612139493227, + 0.04160231724381447, + 0.013580422848463058, + -0.021103281527757645, + 0.020242230966687202, + -0.0133387241512537, + 0.014267751947045326, + -0.0764370858669281, + 0.02642064355313778, + -0.026662342250347137, + -0.044683970510959625, + -0.03855087608098984, + 0.032991815358400345, + 0.024003662168979645, + 0.024849604815244675, + 0.0316624753177166, + 0.017462700605392456, + -0.028112532570958138, + -0.04474439471960068, + 0.012840221635997295, + -0.028157850727438927, + 0.04595288634300232, + 0.06652745604515076, + -0.018369069322943687, + 0.023067081347107887, + 0.047282226383686066, + 0.046677980571985245, + -0.018640980124473572, + -0.0010640389518812299, + 0.03142077848315239, + -0.016511013731360435, + -0.013489785604178905, + 0.018958209082484245, + 0.017598656937479973, + 0.009917182847857475, + 0.011714814230799675, + -0.015340288169682026, + 0.0061670830473303795, + 0.02423025295138359, + 0.008308378979563713, + -0.08719265460968018, + -0.006673138588666916, + -0.009607506915926933, + 0.03022739291191101, + 0.01842949539422989, + 0.04181380569934845, + -0.00946399848908186, + 0.05160258337855339, + -0.02003074623644352, + 0.026209158822894096, + -0.02288580685853958, + 0.023263460025191307, + 0.020468823611736298, + 0.029562722891569138, + 0.008648267015814781, + 0.009260065853595734, + 0.03102801740169525, + -0.0043958877213299274, + 0.018822254613041878, + 0.05145152285695076, + -0.008353697136044502, + 0.010075797326862812, + 0.0065447366796433926, + -0.0019637986551970243, + 0.018701404333114624, + 0.002409429755061865, + -0.007435998879373074, + 0.007269831374287605, + 0.011858322657644749, + -0.01428285799920559, + 0.030242498964071274, + -0.023505158722400665, + 0.01429041102528572, + -0.002298021921887994, + 0.05024303123354912, + 0.011971618048846722, + -0.004543172661215067, + 0.01213778555393219, + -0.0005126647301949561, + 0.013942969962954521, + -0.046829044818878174, + 0.025317896157503128, + 0.016873562708497047, + -0.02871677838265896, + 0.017553338780999184, + 0.026450855657458305, + 0.01732674613595009, + -0.023248353973031044, + 0.031994812190532684, + 0.015461137518286705, + 0.030484197661280632, + 0.007454881444573402, + -0.002607697853818536, + -0.025997672230005264, + -0.031541626900434494, + -0.026209158822894096, + 0.009411127306520939, + -0.021118387579917908, + 0.03133014217019081, + 0.014804020524024963, + 0.007772110402584076, + -0.026390431448817253, + -0.040544889867305756, + 0.004592267330735922, + 0.0017768600955605507, + 0.009199640713632107, + 0.006982814520597458, + 0.0058196415193378925, + -0.01613336056470871, + -0.0172814279794693, + -0.024018768221139908, + -0.014569874852895737, + 0.06272070854902267, + -0.02503087930381298, + 0.005513742100447416, + -0.029789313673973083, + 0.017115259543061256, + -0.007983596995472908, + 0.053173623979091644, + -0.012032043188810349, + 0.017462700605392456, + -0.01738717034459114, + 0.02661702409386635, + 0.0555603951215744, + 0.005929161328822374, + -0.05015239492058754, + 0.027039995416998863, + 0.04951793700456619, + 0.00765503803268075, + 0.02232687920331955, + -0.011352266184985638, + 0.02726658806204796, + -0.006552289705723524, + 0.032840754836797714, + 0.020151594653725624, + 0.018323751166462898, + -0.0482490211725235, + -0.015423372387886047, + 0.0720260888338089, + -0.032387569546699524, + 0.030333135277032852, + 0.03157183900475502, + -0.04664776846766472, + 0.011858322657644749, + -0.029789313673973083, + -0.03716111183166504, + 0.02817295677959919, + 0.046738408505916595, + -0.007024356629699469, + 0.000802513852249831, + 0.08380888402462006, + -8.851255552144721e-05, + 0.000924779218621552, + -0.024200040847063065, + -0.02492513693869114, + -0.023958342149853706, + -0.0045658317394554615, + -0.00911655742675066, + -0.020861582830548286, + 0.05281107500195503, + -0.007809875998646021, + -0.004482747986912727, + -0.005540178157389164, + 0.032145872712135315, + 0.032296933233737946, + -0.03401903435587883, + -0.04876263067126274, + 0.005211619194597006, + -0.026601918041706085, + 0.0011782791698351502, + -0.020952221006155014, + 0.02652638778090477, + -0.03549943491816521, + -0.008436781354248524, + 0.002339563798159361, + -0.012054702267050743, + -0.03471391648054123, + 0.05855141207575798, + -0.0027512062806636095, + -0.030846744775772095, + -0.00993984192609787, + 0.016918880864977837, + 0.007809875998646021, + -0.048430293798446655, + 0.02507619746029377, + -0.05429147928953171, + -0.006140646990388632, + 0.04849071800708771, + -0.0008582177688367665, + -0.019607773050665855, + 0.09595422446727753, + -0.05468423664569855, + 0.01703972928225994, + -0.014985294081270695, + -0.016359953209757805, + 0.061240304261446, + 0.02661702409386635, + -0.005910278297960758, + 0.016752712428569794, + 0.02483449876308441, + -0.02728169411420822, + 0.005460870917886496, + 0.03003101237118244, + 0.0012991282856091857, + 0.053626809269189835, + 0.004811306484043598, + 0.01987968385219574, + 0.004849072080105543, + 0.008202635683119297, + -0.033203303813934326, + 0.010740467347204685, + 0.02308218739926815, + -0.013799461536109447, + 0.02972888946533203, + 0.019517136737704277, + -0.017855461686849594, + -0.022840488702058792, + -0.003317686729133129, + -0.018505025655031204, + 0.03640580549836159, + -0.0317833237349987, + 0.04945751279592514, + -0.003587709041312337, + 0.02048392966389656, + -0.0008138434495776892, + 0.004380781669169664, + -0.05664803832769394, + -0.01743248850107193, + 0.02093711495399475, + 0.0016786701744422317, + -0.041995078325271606, + -0.0019232007907703519, + 0.018912890926003456, + 0.03755387291312218, + -0.011178545653820038, + 0.04205550253391266, + -0.008882411755621433, + 0.09287256747484207, + -0.002492513507604599, + -0.06087775528430939, + 0.014018501155078411, + 0.038641512393951416, + -0.021571572870016098, + -0.020770946517586708, + -0.022190924733877182, + 0.08115020394325256, + 0.02542363852262497, + 0.018157584592700005, + 0.0005900837131775916, + -0.05151194706559181, + -0.0012660835636779666, + 0.0048906137235462666, + 0.02587682381272316, + 0.017659081146121025, + 0.0011131339706480503, + -0.013044154271483421, + -0.05163279548287392, + 0.013482232578098774, + -0.028248487040400505, + -0.029049113392829895, + 0.02897358313202858, + 0.004120200406759977, + -0.0009818993275985122, + 0.012522992677986622, + 0.01311213243752718, + 0.011820556595921516, + -0.004799976944923401, + -0.014902209863066673, + 0.007938277907669544, + 0.05269022658467293, + 0.011284288950264454, + -0.02258368395268917, + 0.030741000548005104, + -0.023595795035362244, + 0.016662076115608215, + -0.023187929764389992, + -0.021103281527757645, + 0.025589806959033012, + 0.060424573719501495, + 0.008534970693290234, + -0.04577161371707916, + 0.054321691393852234, + 0.024245359003543854, + 0.03420030698180199, + -0.0131650036200881, + -0.005015239585191011, + -0.012447461485862732, + -0.0346837043762207, + -0.027402544394135475, + -0.002122413134202361, + -0.0015880332794040442, + -0.0003125083458144218, + -0.025786185637116432, + 0.005755440331995487, + 0.006087775807827711, + -0.021496040746569633, + 0.001679614302702248, + -0.002014781814068556, + 0.02342962846159935, + 0.009297830983996391, + -8.312804311572108e-06, + 0.0019326421897858381, + 0.022493047639727592, + 0.07692047953605652, + -0.006272825878113508, + -0.029502296820282936, + 0.034442007541656494, + 0.0017069941386580467, + -0.010657384060323238, + -0.0010999160585924983, + -0.036949627101421356, + 0.008376356214284897, + -0.020544353872537613, + -0.01833885721862316, + 0.05259959027171135, + -0.012666501104831696, + 0.00827061291784048, + -0.015574433840811253, + 0.04849071800708771, + 0.08096892386674881, + -0.011495774611830711, + 0.004546949174255133, + 0.017115259543061256, + -0.025937248021364212, + -0.02007606439292431, + 0.028052108362317085, + 0.007300043478608131, + 0.03957809507846832, + -0.039487458765506744, + -0.02836933732032776, + 0.013134791515767574, + -0.00717919459566474, + -0.055076997727155685, + 0.00042981698061339557, + 0.023248353973031044, + 0.011382479220628738, + -0.017900779843330383, + 0.03265948221087456, + 0.01808205246925354, + -0.01747780665755272, + 0.01018909364938736, + 0.01238703727722168, + 0.0038596196100115776, + -0.003646245226264, + -0.009932288900017738, + 0.03471391648054123, + -0.0022885806392878294, + 0.00021172204287722707, + -0.021450722590088844, + -0.08809902518987656, + 0.03220629692077637, + -0.03265948221087456, + -0.032840754836797714, + -0.020000534132122993, + -0.026450855657458305, + -0.016903774812817574, + -0.02648106962442398, + 0.020121382549405098, + 0.0060462336987257, + 0.031692687422037125, + 0.04495588317513466, + 0.016223996877670288, + -0.011284288950264454, + 0.0036235861480236053, + -0.02542363852262497, + 0.07885406911373138, + -0.009109004400670528, + -0.013784355483949184, + 0.012115126475691795, + -0.00829327292740345, + -0.012575863860547543, + -0.04625501111149788, + 0.031450990587472916, + 0.04296186938881874, + 0.03972915560007095, + 0.0031080888584256172, + -0.028701672330498695, + 0.04172316566109657, + 0.04275038465857506, + 0.028052108362317085, + 0.03586198389530182, + 0.025061091408133507, + 0.06296240538358688, + -0.01028728298842907, + -0.031148867681622505, + -0.022810276597738266, + -0.02483449876308441, + -0.07033420354127884, + 0.028490185737609863, + -0.013874992728233337, + 0.00646920595318079, + 0.027100421488285065, + 0.0, + 0.03957809507846832, + 0.013399149291217327, + 0.004278814885765314, + 0.023067081347107887, + 0.0012330389581620693, + -0.03087695688009262, + -0.038037266582250595, + -0.008285719901323318, + 0.0021167483646422625, + -0.06235815957188606, + 0.003432871075347066, + 0.00827061291784048, + -0.027236375957727432, + -0.005324915517121553, + -0.03223650902509689, + 0.06519811600446701, + 0.016359953209757805, + 0.022417515516281128, + -0.010022926144301891, + -0.019456712529063225, + -0.02886783890426159, + -0.021148599684238434, + -0.025997672230005264, + -0.009547082707285881, + 0.022190924733877182, + -0.016254210844635963, + 0.055771879851818085, + -0.010249517858028412, + -0.05537911877036095, + 0.0248798169195652, + 0.0359526202082634, + -0.005060557741671801, + -0.04087722301483154, + -0.1198219284415245, + 0.024910029023885727, + 0.007983596995472908, + 0.029985694214701653, + -0.028233380988240242, + -0.0013831562828272581, + -0.0176288690418005, + -0.07208651304244995, + 0.012877986766397953, + -0.012251081876456738, + 0.030786318704485893, + -0.04335463047027588, + -0.00899570807814598, + -0.07468476891517639, + -0.004180625081062317, + 0.05643654987215996, + 0.023051973432302475, + -0.01083865761756897, + -0.03462328016757965, + -0.022568577900528908, + 0.03915512189269066, + 0.008504758588969707, + 0.01555932778865099, + 0.024109404534101486, + -0.0035121783148497343, + -0.03102801740169525, + 0.020408399403095245, + 0.004969920963048935, + -0.11130206286907196, + 0.02352026477456093, + -0.015453584492206573, + 0.03323351591825485, + 0.06084754317998886, + -0.0007723015733063221, + 0.010853763669729233, + -0.021994544193148613, + 0.06713169813156128, + -0.040695950388908386, + -0.00619351863861084, + 0.005468423943966627, + 0.02258368395268917, + -0.0032723683398216963, + -0.026737872511148453, + 0.04281080886721611, + 0.05803780257701874, + -0.0013227316085249186 + ], + "result": "--- 结果 1 (相似度: 1.000) ---\n文件路径: C:\\Steam\\steamapps\\common\\RimWorld\\Data\\dll1.6\\Verse\\ThingOwner.txt\n\npublic class ThingOwner : ThingOwner, IList, ICollection, IEnumerable, IEnumerable where T : Thing\n{\n\tprivate List innerList = new List();\n\n\tpublic List InnerListForReading => innerList;\n\n\tpublic new T this[int index] => innerList[index];\n\n\tpublic override int Count => innerList.Count;\n\n\tT IList.this[int index]\n\t{\n\t\tget\n\t\t{\n\t\t\treturn innerList[index];\n\t\t}\n\t\tset\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow setting individual elements.\");\n\t\t}\n\t}\n\n\tbool ICollection.IsReadOnly => true;\n\n\tpublic ThingOwner()\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner)\n\t{\n\t}\n\n\tpublic ThingOwner(IThingHolder owner, bool oneStackOnly, LookMode contentsLookMode = LookMode.Deep, bool removeContentsIfDestroyed = true)\n\t\t: base(owner, oneStackOnly, contentsLookMode, removeContentsIfDestroyed)\n\t{\n\t}\n\n\tpublic override void ExposeData()\n\t{\n\t\tbase.ExposeData();\n\t\tScribe_Collections.Look(ref innerList, \"innerList\", true, contentsLookMode);\n\t\tif (Scribe.mode == LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\tint num = innerList.RemoveAll((T x) => x == null || (x is MinifiedThing minifiedThing && minifiedThing.InnerThing == null));\n\t\t\tif (num > 0)\n\t\t\t{\n\t\t\t\tLog.Warning($\"ThingOwner removed {num} invalid entries during PostLoadInit.\");\n\t\t\t}\n\t\t}\n\t\tif (Scribe.mode != LoadSaveMode.LoadingVars && Scribe.mode != LoadSaveMode.PostLoadInit)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] != null)\n\t\t\t{\n\t\t\t\tinnerList[i].holdingOwner = this;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic List.Enumerator GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tpublic override int GetCountCanAccept(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (!(item is T))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\treturn base.GetCountCanAccept(item, canMergeWithExistingStacks);\n\t}\n\n\tpublic override int TryAdd(Thing item, int count, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (count <= 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item?.ToString() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + count + \" of \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn 0;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\tint stackCount = item.stackCount;\n\t\tint num = Mathf.Min(stackCount, count);\n\t\tThing thing = item.SplitOff(num);\n\t\tif (!TryAdd((T)thing, canMergeWithExistingStacks))\n\t\t{\n\t\t\tif (thing != item)\n\t\t\t{\n\t\t\t\tint result = stackCount - item.stackCount - thing.stackCount;\n\t\t\t\titem.TryAbsorbStack(thing, respectStackLimit: false);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn stackCount - item.stackCount;\n\t\t}\n\t\tCompPushable compPushable = item.TryGetComp();\n\t\tif (compPushable != null && owner is Pawn pawn)\n\t\t{\n\t\t\tcompPushable.OnStartedCarrying(pawn);\n\t\t}\n\t\treturn num;\n\t}\n\n\tpublic override bool TryAdd(Thing item, bool canMergeWithExistingStacks = true)\n\t{\n\t\tif (item == null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add null item to ThingOwner.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (Contains(item))\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this item is already here.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner != null)\n\t\t{\n\t\t\tLog.Warning(\"Tried to add \" + item.ToStringSafe() + \" to ThingOwner but this thing is already in another container. owner=\" + owner.ToStringSafe() + \", current container owner=\" + item.holdingOwner.Owner.ToStringSafe() + \". Use TryAddOrTransfer, TryTransferToContainer, or remove the item before adding it.\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanAcceptAnyOf(item, canMergeWithExistingStacks))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (canMergeWithExistingStacks)\n\t\t{\n\t\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t\t{\n\t\t\t\tT val = innerList[i];\n\t\t\t\tif (!val.CanStackWith(item))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint num = Mathf.Min(item.stackCount, val.def.stackLimit - val.stackCount);\n\t\t\t\tif (num > 0)\n\t\t\t\t{\n\t\t\t\t\tThing other = item.SplitOff(num);\n\t\t\t\t\tint stackCount = val.stackCount;\n\t\t\t\t\tval.TryAbsorbStack(other, respectStackLimit: true);\n\t\t\t\t\tif (val.stackCount > stackCount)\n\t\t\t\t\t{\n\t\t\t\t\t\tNotifyAddedAndMergedWith(val, val.stackCount - stackCount);\n\t\t\t\t\t}\n\t\t\t\t\tif (item.Destroyed || item.stackCount == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Count >= maxStacks)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\titem.holdingOwner = this;\n\t\tinnerList.Add(item2);\n\t\tNotifyAdded(item2);\n\t\treturn true;\n\t}\n\n\tprotected override void NotifyAdded(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemAdded(item as T);\n\t\t}\n\t\tbase.NotifyAdded(item);\n\t}\n\n\tprotected override void NotifyRemoved(Thing item)\n\t{\n\t\tif (owner is IThingHolderEvents thingHolderEvents)\n\t\t{\n\t\t\tthingHolderEvents.Notify_ItemRemoved(item as T);\n\t\t}\n\t\tbase.NotifyRemoved(item);\n\t}\n\n\tpublic void TryAddRangeOrTransfer(IEnumerable things, bool canMergeWithExistingStacks = true, bool destroyLeftover = false)\n\t{\n\t\tif (things == this)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (things is ThingOwner thingOwner)\n\t\t{\n\t\t\tthingOwner.TryTransferAllToContainer(this, canMergeWithExistingStacks);\n\t\t\tif (destroyLeftover)\n\t\t\t{\n\t\t\t\tthingOwner.ClearAndDestroyContents();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (things is IList list)\n\t\t{\n\t\t\tfor (int i = 0; i < list.Count; i++)\n\t\t\t{\n\t\t\t\tif (!TryAddOrTransfer(list[i], canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t\t{\n\t\t\t\t\tlist[i].Destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tforeach (T thing in things)\n\t\t{\n\t\t\tif (!TryAddOrTransfer(thing, canMergeWithExistingStacks) && destroyLeftover)\n\t\t\t{\n\t\t\t\tthing.Destroy();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override int IndexOf(Thing item)\n\t{\n\t\tif (!(item is T item2))\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\treturn innerList.IndexOf(item2);\n\t}\n\n\tpublic override bool Remove(Thing item)\n\t{\n\t\tif (!Contains(item))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (item.holdingOwner == this)\n\t\t{\n\t\t\titem.holdingOwner = null;\n\t\t}\n\t\tint index = innerList.LastIndexOf((T)item);\n\t\tinnerList.RemoveAt(index);\n\t\tNotifyRemoved(item);\n\t\treturn true;\n\t}\n\n\tpublic int RemoveAll(Predicate predicate)\n\t{\n\t\tint num = 0;\n\t\tfor (int num2 = innerList.Count - 1; num2 >= 0; num2--)\n\t\t{\n\t\t\tif (predicate(innerList[num2]))\n\t\t\t{\n\t\t\t\tRemove(innerList[num2]);\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\t\treturn num;\n\t}\n\n\tprotected override Thing GetAt(int index)\n\t{\n\t\treturn innerList[index];\n\t}\n\n\tpublic void GetThingsOfType(List list) where J : Thing\n\t{\n\t\tfor (int i = 0; i < innerList.Count; i++)\n\t\t{\n\t\t\tif (innerList[i] is J item)\n\t\t\t{\n\t\t\t\tlist.Add(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic int TryTransferToContainer(Thing item, ThingOwner otherContainer, int stackCount, out T resultingTransferredItem, bool canMergeWithExistingStacks = true)\n\t{\n\t\tThing resultingTransferredItem2;\n\t\tint result = TryTransferToContainer(item, otherContainer, stackCount, out resultingTransferredItem2, canMergeWithExistingStacks);\n\t\tresultingTransferredItem = (T)resultingTransferredItem2;\n\t\treturn result;\n\t}\n\n\tpublic new T Take(Thing thing, int count)\n\t{\n\t\treturn (T)base.Take(thing, count);\n\t}\n\n\tpublic new T Take(Thing thing)\n\t{\n\t\treturn (T)base.Take(thing);\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, int count, out T resultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing resultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, count, out resultingThing2, placedAction2, nearPlaceValidator);\n\t\tresultingThing = (T)resultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, mode, out lastResultingThing2, placedAction2, nearPlaceValidator);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tpublic bool TryDrop(Thing thing, IntVec3 dropLoc, Map map, ThingPlaceMode mode, out T lastResultingThing, Action placedAction = null, Predicate nearPlaceValidator = null)\n\t{\n\t\tAction placedAction2 = null;\n\t\tif (placedAction != null)\n\t\t{\n\t\t\tplacedAction2 = delegate(Thing t, int c)\n\t\t\t{\n\t\t\t\tplacedAction((T)t, c);\n\t\t\t};\n\t\t}\n\t\tThing lastResultingThing2;\n\t\tbool result = TryDrop(thing, dropLoc, map, mode, out lastResultingThing2, placedAction2, nearPlaceValidator, playDropSound: true);\n\t\tlastResultingThing = (T)lastResultingThing2;\n\t\treturn result;\n\t}\n\n\tint IList.IndexOf(T item)\n\t{\n\t\treturn innerList.IndexOf(item);\n\t}\n\n\tvoid IList.Insert(int index, T item)\n\t{\n\t\tthrow new InvalidOperationException(\"ThingOwner doesn't allow inserting individual elements at any position.\");\n\t}\n\n\tvoid ICollection.Add(T item)\n\t{\n\t\tTryAdd(item);\n\t}\n\n\tvoid ICollection.CopyTo(T[] array, int arrayIndex)\n\t{\n\t\tinnerList.CopyTo(array, arrayIndex);\n\t}\n\n\tbool ICollection.Contains(T item)\n\t{\n\t\treturn innerList.Contains(item);\n\t}\n\n\tbool ICollection.Remove(T item)\n\t{\n\t\treturn Remove(item);\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n\n\tIEnumerator IEnumerable.GetEnumerator()\n\t{\n\t\treturn innerList.GetEnumerator();\n\t}\n}\n\n", + "timestamp": "2025-08-24 20:56:53,480" } } \ No newline at end of file diff --git a/MCP/web_api_server.py b/MCP/web_api_server.py new file mode 100644 index 00000000..5a29b922 --- /dev/null +++ b/MCP/web_api_server.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +RimWorld知识库Web API服务器 +提供HTTP接口,可以通过浏览器或HTTP客户端访问 +""" +import os +import sys +import json +from http.server import HTTPServer, BaseHTTPRequestHandler +from urllib.parse import urlparse, parse_qs +import threading +import webbrowser + +# 添加MCP路径 +MCP_DIR = os.path.dirname(os.path.abspath(__file__)) +SDK_PATH = os.path.join(MCP_DIR, 'python-sdk', 'src') +if SDK_PATH not in sys.path: + sys.path.insert(0, SDK_PATH) + +class RimWorldAPIHandler(BaseHTTPRequestHandler): + """HTTP请求处理器""" + + def do_GET(self): + """处理GET请求""" + parsed_url = urlparse(self.path) + + if parsed_url.path == '/': + self.serve_web_interface() + elif parsed_url.path == '/query': + self.handle_query_get(parsed_url) + elif parsed_url.path == '/api/query': + self.handle_api_query_get(parsed_url) + else: + self.send_error(404, "Not Found") + + def do_POST(self): + """处理POST请求""" + if self.path == '/api/query': + self.handle_api_query_post() + else: + self.send_error(404, "Not Found") + + def serve_web_interface(self): + """提供Web界面""" + html = """ + + + + + + RimWorld 知识库 + + + +

    +

    🎮 RimWorld 知识库

    +

    直接查询RimWorld游戏的C#源码和XML定义

    +
    + +
    + + +
    + +
    +

    💡 查询示例:

    +
    • ThingDef的定义和用法
    +
    • 如何创建Building
    +
    • Pawn类的主要方法
    +
    • CompPower的使用
    +
    + + + + + + + """ + + self.send_response(200) + self.send_header('Content-Type', 'text/html; charset=utf-8') + self.end_headers() + self.wfile.write(html.encode('utf-8')) + + def handle_query_get(self, parsed_url): + """处理GET查询请求""" + params = parse_qs(parsed_url.query) + question = params.get('q', [''])[0] + + if not question: + self.send_error(400, "Missing 'q' parameter") + return + + try: + from mcpserver_stdio import get_context + result = get_context(question) + + self.send_response(200) + self.send_header('Content-Type', 'text/plain; charset=utf-8') + self.end_headers() + self.wfile.write(result.encode('utf-8')) + except Exception as e: + self.send_error(500, f"Query failed: {e}") + + def handle_api_query_get(self, parsed_url): + """处理API GET查询""" + params = parse_qs(parsed_url.query) + question = params.get('q', [''])[0] + + if not question: + response = {"success": False, "error": "Missing 'q' parameter"} + else: + try: + from mcpserver_stdio import get_context + result = get_context(question) + response = {"success": True, "result": result} + except Exception as e: + response = {"success": False, "error": str(e)} + + self.send_response(200) + self.send_header('Content-Type', 'application/json; charset=utf-8') + self.end_headers() + self.wfile.write(json.dumps(response, ensure_ascii=False).encode('utf-8')) + + def handle_api_query_post(self): + """处理API POST查询""" + content_length = int(self.headers['Content-Length']) + post_data = self.rfile.read(content_length) + + try: + data = json.loads(post_data.decode('utf-8')) + question = data.get('question', '') + + if not question: + response = {"success": False, "error": "Missing 'question' field"} + else: + from mcpserver_stdio import get_context + result = get_context(question) + response = {"success": True, "result": result} + except Exception as e: + response = {"success": False, "error": str(e)} + + self.send_response(200) + self.send_header('Content-Type', 'application/json; charset=utf-8') + self.send_header('Access-Control-Allow-Origin', '*') + self.end_headers() + self.wfile.write(json.dumps(response, ensure_ascii=False).encode('utf-8')) + + def log_message(self, format, *args): + """自定义日志输出""" + print(f"[{self.address_string()}] {format % args}") + +def start_server(port=8080, open_browser=True): + """启动Web服务器""" + server_address = ('', port) + httpd = HTTPServer(server_address, RimWorldAPIHandler) + + print(f"🌐 RimWorld知识库Web服务器启动") + print(f"📍 服务地址: http://localhost:{port}") + print(f"🔍 查询API: http://localhost:{port}/api/query?q=您的问题") + print(f"💻 Web界面: http://localhost:{port}") + print("按 Ctrl+C 停止服务器") + + if open_browser: + # 延迟打开浏览器 + def open_browser_delayed(): + import time + time.sleep(1) + webbrowser.open(f'http://localhost:{port}') + + thread = threading.Thread(target=open_browser_delayed) + thread.daemon = True + thread.start() + + try: + httpd.serve_forever() + except KeyboardInterrupt: + print("\n🛑 服务器已停止") + httpd.shutdown() + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description='RimWorld知识库Web API服务器') + parser.add_argument('--port', '-p', type=int, default=8080, help='服务器端口 (默认: 8080)') + parser.add_argument('--no-browser', action='store_true', help='不自动打开浏览器') + + args = parser.parse_args() + + start_server(args.port, not args.no_browser) \ No newline at end of file diff --git a/MCP/使用指南.md b/MCP/使用指南.md new file mode 100644 index 00000000..9fd0dcb5 --- /dev/null +++ b/MCP/使用指南.md @@ -0,0 +1,102 @@ +# RimWorld 知识库 - 绕过 Qoder IDE 使用指南 + +由于 Qoder IDE 中的 MCP 连接可能存在问题,我们提供了多种直接访问 RimWorld 知识库的方法。 + +## 🚀 方法 1:直接 Python 调用 + +最简单直接的方法: + +```bash +# 直接查询 +python direct_mcp_client.py -q "ThingDef是什么" + +# 交互模式 +python direct_mcp_client.py -i + +# 查看帮助 +python direct_mcp_client.py -h +``` + +### 优点: +- ✅ 最快速,无需额外依赖 +- ✅ 支持交互模式 +- ✅ 直接在命令行使用 + +## 🛠️ 方法 2:命令行工具 + +专业的命令行查询工具: + +```bash +# 基本查询 +python rimworld_query.py "ThingDef的定义" + +# 保存结果到文件 +python rimworld_query.py "Building类的方法" --output building_info.txt + +# 显示原始结果(不格式化) +python rimworld_query.py "Pawn类" --raw + +# 查看示例 +python rimworld_query.py --list-examples +``` + +### 优点: +- ✅ 结果可保存到文件 +- ✅ 支持原始输出格式 +- ✅ 内置查询示例 + +## 📝 常用查询示例 + +```bash +# 查询类定义 +"ThingDef的定义和用法" +"Building类有哪些方法" +"Pawn类的构造函数" + +# 查询特定方法 +"GenConstruct.CanPlaceBlueprintAt 方法" +"Building_Door 的开关逻辑" +"CompPower 的电力管理" + +# 查询XML相关 +"XML中的defName规则" +"如何定义新的ThingDef" +"建筑物的XML结构" +``` + +## 🔧 故障排除 + +### 如果出现导入错误: +```bash +# 确保在正确的目录 +cd "C:\Steam\steamapps\common\RimWorld\Mods\3516260226\MCP" + +# 检查 Python 环境 +python -c "import mcp; print('MCP SDK 正常')" +``` + +### 如果查询结果为空: +- 尝试使用更具体的关键词 +- 检查关键词拼写 +- 使用英文类名或方法名 + +### 如果 Web 服务器无法启动: +- 检查端口是否被占用 +- 尝试使用不同的端口号 +- 确保没有其他程序占用该端口 + +## 💡 推荐使用场景 + +- **快速查询**: 使用方法 1 (direct_mcp_client.py) +- **批量处理**: 使用方法 2 (rimworld_query.py) +- **团队共享**: 使用方法 3 (web_api_server.py) +- **集成开发**: 使用 Web API 接口 + +## 🎯 性能优化 + +所有方法都已经过优化: +- 向量化处理限制在 10 个文件以内 +- API 调用超时设置为 12-15 秒 +- 支持本地缓存加速重复查询 + +现在您可以完全绕过 Qoder IDE,直接使用 RimWorld 知识库了! \ No newline at end of file diff --git a/Source/WulaFallenEmpire/3516260226.code-workspace b/Source/WulaFallenEmpire/3516260226.code-workspace index 28a1867a..2d26aeb1 100644 --- a/Source/WulaFallenEmpire/3516260226.code-workspace +++ b/Source/WulaFallenEmpire/3516260226.code-workspace @@ -3,6 +3,9 @@ { "name": "3516260226", "path": "../.." + }, + { + "path": "../../../../../../workshop/content/294100/3551234893/1.6/Assemblies/ShelterShuttle" } ], "settings": {} diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs index e224447f..6bc8298b 100644 --- a/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs +++ b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs @@ -106,20 +106,7 @@ namespace WulaFallenEmpire /// protected virtual Texture2D EnterTex => DefaultEnterTex; - /// - /// 获取进入按钮的文本 - 专门用于人员传送 - /// - public virtual string EnterString => "WULA.PocketSpace.EnterPawns".Translate(); - - /// - /// 获取取消进入按钮的文本 - /// - public virtual string CancelEnterString => "WULA.PocketSpace.CancelEnter".Translate(); - - /// - /// 获取进入中的文本 - /// - public virtual string EnteringString => "WULA.PocketSpace.Entering".Translate(); + // 人员传送相关属性已删除 - 不再使用Dialog_EnterPortal /// 加载是否正在进行(模仿原版 MapPortal.LoadInProgress) public bool LoadInProgress @@ -288,85 +275,7 @@ namespace WulaFallenEmpire #region 口袋空间核心方法 - /// - /// 检查是否可以进入口袋空间 - /// - public bool CanEnterPocketSpace() - { - if (!allowDirectAccess) - { - return false; // 需要特殊权限 - } - - if (!Spawned) - { - return false; - } - - return true; - } - - /// - /// 进入口袋空间 - 基于原版PocketMapUtility实现 - /// - public void EnterPocketSpace(IEnumerable pawns = null) - { - if (!CanEnterPocketSpace()) - { - Messages.Message("WULA.PocketSpace.CannotEnter".Translate(), this, MessageTypeDefOf.RejectInput); - return; - } - - // 创建或获取口袋地图 - if (pocketMap == null && !pocketMapGenerated) - { - CreatePocketMap(); - } - - if (pocketMap == null) - { - Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); - return; - } - - // 传送玩家到口袋空间 - List pawnsToTransfer = new List(); - - if (pawns != null) - { - pawnsToTransfer.AddRange(pawns.Where(p => p != null && p.Spawned && p.IsColonist)); - } - else - { - // 如果没有指定人员,传送选中的殖民者 - pawnsToTransfer.AddRange(Find.Selector.SelectedPawns.Where(p => p.IsColonist)); - } - - if (pawnsToTransfer.Count == 0) - { - Messages.Message("WULA.PocketSpace.NoPawnsSelected".Translate(), this, MessageTypeDefOf.RejectInput); - return; - } - - // 执行传送 - int transferredCount = 0; - foreach (Pawn pawn in pawnsToTransfer) - { - if (TransferPawnToPocketSpace(pawn)) - { - transferredCount++; - } - } - - if (transferredCount > 0) - { - Messages.Message("WULA.PocketSpace.TransferSuccess".Translate(transferredCount), MessageTypeDefOf.PositiveEvent); - - // 切换到口袋地图 - Current.Game.CurrentMap = pocketMap; - Find.CameraDriver.JumpToCurrentMapLoc(pocketMap.Center); - } - } + // 人员传送方法已删除 - 不再使用Dialog_EnterPortal进行人员传送 /// /// 切换到口袋空间视角 @@ -496,33 +405,7 @@ namespace WulaFallenEmpire } } - /// - /// 将单个Pawn传送到口袋空间 - /// - private bool TransferPawnToPocketSpace(Pawn pawn) - { - if (pawn == null || !pawn.Spawned || pocketMap == null) return false; - - try - { - // 找一个安全的位置 - IntVec3 spawnPos = CellFinder.RandomClosewalkCellNear(pocketMap.Center, 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); - return true; - } - } - catch (Exception ex) - { - Log.Error($"[WULA] Error transferring pawn {pawn?.LabelShort} to pocket space: {ex}"); - } - - return false; - } + // TransferPawnToPocketSpace方法已删除 - 不再使用单个人员传送 /// /// 将所有物品和人员从口袋空间转移到主地图 @@ -627,40 +510,7 @@ namespace WulaFallenEmpire createCommand.disabledReason = reason; yield return createCommand; } - else - { - // 进入口袋空间按钮(直接复制原版MapPortal的逻辑) - Command_Action enterCommand = new Command_Action(); - enterCommand.action = delegate - { - try - { - Log.Message("[WULA] Creating MapPortalAdapter..."); - var adapter = new MapPortalAdapter(this); - Log.Message($"[WULA] Adapter created. Map: {adapter.Map?.uniqueID}, Spawned: {adapter.Spawned}"); - - Log.Message("[WULA] Creating Dialog_EnterPortal..."); - Dialog_EnterPortal window = new Dialog_EnterPortal(adapter); - Log.Message("[WULA] Dialog created, adding to WindowStack..."); - Find.WindowStack.Add(window); - Log.Message("[WULA] Dialog added to WindowStack successfully."); - } - catch (Exception ex) - { - Log.Error($"[WULA] Error opening Dialog_EnterPortal: {ex}"); - Messages.Message("WULA.PocketSpace.LoadingDialogError".Translate(), MessageTypeDefOf.RejectInput); - } - }; - enterCommand.icon = EnterTex; - enterCommand.defaultLabel = EnterString + "..."; - enterCommand.defaultDesc = "WULA.PocketSpace.EnterDesc".Translate(); - - // 检查是否可以进入(模仿原版MapPortal.IsEnterable) - string reason; - enterCommand.Disabled = !IsEnterable(out reason); - enterCommand.disabledReason = reason; - yield return enterCommand; - } + // 进入口袋空间按钮已删除 - 按钮无法正常工作 // 查看口袋地图按钮(模仿原版MapPortal) if (pocketMap != null) @@ -695,8 +545,18 @@ namespace WulaFallenEmpire public ThingOwner GetDirectlyHeldThings() { - // 返回containerProxy,与Dialog_EnterPortal兼容 - return containerProxy; + // 仅在第一次调用时记录日志 + if (containerProxy != null) + { + return containerProxy; + } + else + { + Log.Warning("[WULA] containerProxy is null! Creating new one..."); + containerProxy = new PortalContainerProxy { portal = this }; + Log.Message($"[WULA] Created new containerProxy - portal set: {containerProxy.portal != null}"); + return containerProxy; + } } public void GetChildHolders(List outChildren) @@ -706,7 +566,7 @@ namespace WulaFallenEmpire #endregion - #region MapPortal兼容接口(使Dialog_EnterPortal能正常工作) + #region MapPortal兼容接口(用于物品传送和地图管理) /// /// 检查是否可以进入(模仿原版MapPortal.IsEnterable) @@ -753,21 +613,7 @@ namespace WulaFallenEmpire return pocketMap?.Center ?? IntVec3.Invalid; } - /// - /// 处理进入事件(模仿原版MapPortal.OnEntered) - /// - public virtual void OnEntered(Pawn pawn) - { - // 通知物品被添加(用于统计和管理) - Notify_ThingAdded(pawn); - - // 播放传送音效(如果存在) - if (Find.CurrentMap == this.Map) - { - // 可以在这里添加音效播放 - // def.portal?.traverseSound?.PlayOneShot(this); - } - } + // OnEntered方法已删除 - 不再使用Dialog_EnterPortal机制 #endregion @@ -778,13 +624,23 @@ namespace WulaFallenEmpire /// public void Notify_ThingAdded(Thing t) { - Log.Message($"[WULA] Notify_ThingAdded called for: {t?.def?.defName} x{t?.stackCount}"); - Log.Message($"[WULA] leftToLoad count before: {leftToLoad?.Count ?? 0}"); - - int removedCount = SubtractFromToLoadList(t, t.stackCount); - - Log.Message($"[WULA] Removed {removedCount} items from leftToLoad list"); - Log.Message($"[WULA] leftToLoad count after: {leftToLoad?.Count ?? 0}"); + // 检查是否为Pawn类型 + if (t is Pawn pawn) + { + Log.Message($"[WULA] Notify_ThingAdded called for PAWN: {pawn.LabelShort} ({pawn.def.defName})"); + // 对于Pawn,我们不需要更新leftToLoad列表,因为原版也不这样做 + // 只需要通知CompTransporter + } + else + { + Log.Message($"[WULA] Notify_ThingAdded called for ITEM: {t?.def?.defName} x{t?.stackCount}"); + Log.Message($"[WULA] leftToLoad count before: {leftToLoad?.Count ?? 0}"); + + int removedCount = SubtractFromToLoadList(t, t.stackCount); + + Log.Message($"[WULA] Removed {removedCount} items from leftToLoad list"); + Log.Message($"[WULA] leftToLoad count after: {leftToLoad?.Count ?? 0}"); + } // 同时通知CompTransporter组件,确保原版装载系统也得到通知 var compTransporter = this.GetComp(); @@ -981,6 +837,28 @@ namespace WulaFallenEmpire portal = this }; + // 关键:替换CompTransporter的innerContainer字段,确保一切添加操作都经过我们的代理 + var compTransporter = this.GetComp(); + if (compTransporter != null) + { + try { + var field = typeof(CompTransporter).GetField("innerContainer", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); + if (field != null) + { + field.SetValue(compTransporter, containerProxy); + } + else + { + Log.Error("[WULA] Failed to find innerContainer field in CompTransporter"); + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error replacing CompTransporter.innerContainer: {ex}"); + } + } + // 更新退出点目标(处理穿梭机重新部署的情况) UpdateExitPointTarget(); @@ -1045,175 +923,25 @@ namespace WulaFallenEmpire public bool allowDirectAccess = true; } - /// - /// MapPortal适配器类,使非MapPortal类型能够使用Dialog_EnterPortal - /// 直接继承MapPortal并委托给Building_ArmedShuttleWithPocket实现 - /// - public class MapPortalAdapter : MapPortal - { - private Building_ArmedShuttleWithPocket shuttleBuilding; - - public MapPortalAdapter(Building_ArmedShuttleWithPocket shuttle) - { - Log.Message($"[WULA] MapPortalAdapter constructor called for shuttle: {shuttle?.def?.defName}"); - shuttleBuilding = shuttle; - - // 确保基础属性正确设置 - this.def = shuttle.def ?? ThingDefOf.Wall; // 提供默认值避免null - this.HitPoints = shuttle.HitPoints; - - // 关键:手动设置Map和Position属性以避免null引用 - if (shuttle.Spawned && shuttle.Map != null) - { - // 手动调用父类的SpawnSetup,但要小心处理 - try - { - base.SpawnSetup(shuttle.Map, false); - Log.Message($"[WULA] SpawnSetup completed for map: {shuttle.Map.uniqueID}"); - } - catch (Exception ex) - { - Log.Warning($"[WULA] SpawnSetup failed, manually setting properties: {ex.Message}"); - // 如果SpawnSetup失败,手动设置关键属性 - } - } - - // 设置基础MapPortal属性 - this.pocketMap = shuttle.PocketMapForPortal; - this.leftToLoad = shuttle.leftToLoad ?? new List(); - - // 确保exit属性被正确设置 - // 注意:由于类型不兼容,暂时设为null,在GetDestinationLocation中处理 - this.exit = null; // 原版PocketMapExit类型与我们的Building_PocketMapExit不兼容 - - Log.Message($"[WULA] Synced pocketMap: {pocketMap?.uniqueID}, leftToLoad count: {leftToLoad?.Count}, exit: {exit != null}"); - - // 使用原版的PortalContainerProxy - try - { - this.containerProxy = new RimWorld.PortalContainerProxy - { - portal = this - }; - Log.Message("[WULA] Created RimWorld.PortalContainerProxy successfully"); - } - catch (Exception ex) - { - Log.Error($"[WULA] Failed to create RimWorld.PortalContainerProxy: {ex}"); - // 使用我们自己的实现作为回退 - Log.Message("[WULA] Using custom PortalContainerProxy as fallback"); - } - Log.Message("[WULA] MapPortalAdapter initialization complete"); - } - - // 委托给shuttleBuilding的关键属性(使用new隐藏基类属性) - // 委托给shuttleBuilding的关键属性(使用new隐藏基类属性) - public new Map Map - { - get - { - // 优先返回shuttleBuilding的Map - if (shuttleBuilding?.Map != null) - { - return shuttleBuilding.Map; - } - - // 如果shuttleBuilding的Map为null,返回基类的Map - if (base.Map != null) - { - return base.Map; - } - - // 最后的回退:返回当前游戏地图(避免null) - Log.Warning("[WULA] Both shuttleBuilding.Map and base.Map are null, using Current.Game.CurrentMap as fallback"); - return Find.CurrentMap ?? Current.Game.Maps?.FirstOrDefault(); - } - } - public new IntVec3 Position => shuttleBuilding?.Position ?? base.Position; - public new bool Spawned => shuttleBuilding?.Spawned ?? base.Spawned; - public new string Label => shuttleBuilding?.Label ?? base.Label; - - // 委托给shuttleBuilding的关键方法(重写虚拟方法) - public override bool IsEnterable(out string reason) - { - return shuttleBuilding.IsEnterable(out reason); - } - - public override Map GetOtherMap() - { - return shuttleBuilding.GetOtherMap(); - } - - public override IntVec3 GetDestinationLocation() - { - return shuttleBuilding.GetDestinationLocation(); - } - - public override void OnEntered(Pawn pawn) - { - shuttleBuilding.OnEntered(pawn); - } - - // 委托给shuttleBuilding的物品管理方法(使用new隐藏基类方法) - public new void Notify_ThingAdded(Thing t) - { - shuttleBuilding.Notify_ThingAdded(t); - } - - public new void AddToTheToLoadList(TransferableOneWay t, int count) - { - shuttleBuilding.AddToTheToLoadList(t, count); - } - - public new int SubtractFromToLoadList(Thing t, int count) - { - return shuttleBuilding.SubtractFromToLoadList(t, count); - } - - public new void CancelLoad() - { - // 调用shuttleBuilding的CancelLoad方法 - shuttleBuilding.CancelLoad(); - } - - // 重写原版MapPortal的关键属性 - public override string EnterString => shuttleBuilding.EnterString; - public override string CancelEnterString => shuttleBuilding.CancelEnterString; - public override string EnteringString => shuttleBuilding.EnteringString; - - // 隐藏LoadInProgress属性,确保Dialog_EnterPortal能正确读取 - public new bool LoadInProgress => shuttleBuilding?.LoadInProgress ?? false; - - // 确保SpawnSetup正确处理 - public override void SpawnSetup(Map map, bool respawningAfterLoad) - { - // 调用基类的SpawnSetup来正确初始化MapPortal的基础设施 - base.SpawnSetup(map, respawningAfterLoad); - - // 同步关键字段 - this.pocketMap = shuttleBuilding?.PocketMapForPortal; - this.leftToLoad = shuttleBuilding?.leftToLoad ?? new List(); - } - - // 重写AddItemsToTransferables,让Dialog_EnterPortal只处理人员 - // 因为物品已经通过装载按钮正确传送到内部空间了 - protected virtual void AddItemsToTransferables() - { - // 不添加任何物品,因为物品传送由装载按钮处理 - // 这样Dialog_EnterPortal只专注于人员传送 - Log.Message("[WULA] AddItemsToTransferables: Skipping items, handled by loading button"); - } - } + // MapPortalAdapter类已删除 - 不再使用Dialog_EnterPortal进行人员传送 /// /// 专为Building_ArmedShuttleWithPocket设计的PortalContainerProxy适配器 /// 模仿原版PortalContainerProxy的行为,但适配非-MapPortal类型 + /// 这个类拦截所有向容器添加物品和人员的操作 /// public class PortalContainerProxy : ThingOwner { public Building_ArmedShuttleWithPocket portal; - public override int Count => 0; + public override int Count + { + get + { + // 不记录日志,避免日志刷屏 + return 0; + } + } public override int TryAdd(Thing item, int count, bool canMergeWithExistingStacks = true) { @@ -1226,10 +954,34 @@ namespace WulaFallenEmpire public override bool TryAdd(Thing item, bool canMergeWithExistingStacks = true) { - if (portal == null) return false; + return ProcessItemOrPawn(item, canMergeWithExistingStacks); + } + + /// + /// 统一的物品和人员处理方法 + /// 动物当作物品处理,只有殖民者才当作Pawn处理 + /// + private bool ProcessItemOrPawn(Thing item, bool canMergeWithExistingStacks = true) + { + if (portal == null) + { + Log.Error("[WULA] PortalContainerProxy.ProcessItemOrPawn: portal is null!"); + return false; + } - Log.Message($"[WULA] PortalContainerProxy.TryAdd called for: {item?.def?.defName} x{item?.stackCount}"); + Log.Message($"[WULA] PortalContainerProxy.ProcessItemOrPawn called for: {item?.def?.defName} ({item?.GetType()?.Name}) x{item?.stackCount}"); + // 只有殖民者才当作Pawn处理,动物当作物品处理 + if (item is Pawn pawn && pawn.IsColonist) + { + Log.Message($"[WULA] INTERCEPTING COLONIST PAWN: {pawn.LabelShort} ({pawn.def.defName}) - Type: {pawn.GetType().Name}"); + + bool result = TransferPawnToPocketSpace(pawn); + Log.Message($"[WULA] Colonist transfer result: {result}"); + return result; + } + + // 动物和其他所有物品都当作物品处理 Map otherMap = portal.GetOtherMap(); IntVec3 destinationLocation = portal.GetDestinationLocation(); @@ -1245,11 +997,11 @@ namespace WulaFallenEmpire Log.Message($"[WULA] Calling portal.Notify_ThingAdded for: {item?.def?.defName} x{item?.stackCount}"); portal.Notify_ThingAdded(item); - // 传送物品到目标地图 - Log.Message($"[WULA] Transporting item to pocket map: {item?.def?.defName}"); + // 传送物品(包括动物)到目标地图 + Log.Message($"[WULA] Transporting item/animal to pocket map: {item?.def?.defName}"); GenDrop.TryDropSpawn(item, destinationLocation, otherMap, ThingPlaceMode.Near, out var _); - Log.Message($"[WULA] Item transport completed successfully"); + Log.Message($"[WULA] Item/animal transport completed successfully"); return true; } @@ -1267,6 +1019,187 @@ namespace WulaFallenEmpire { return null; } + + /// + /// 传送单个Pawn到口袋空间(使用直接传送机制) + /// + private bool TransferPawnToPocketSpace(Pawn pawn) + { + if (pawn == null) + { + Log.Warning("[WULA] TransferPawnToPocketSpace: Pawn is null"); + return false; + } + + if (portal == null) + { + Log.Warning("[WULA] TransferPawnToPocketSpace: Portal is null"); + return false; + } + + if (!pawn.Spawned && pawn.holdingOwner == null) + { + Log.Warning($"[WULA] TransferPawnToPocketSpace: Pawn {pawn.LabelShort} is not spawned and not in a container"); + + // 即使武装没有spawned或不在容器中,仍然尝试传送 + // 记录原始状态并继续 + Log.Message($"[WULA] Attempting to transfer pawn anyway: {pawn.LabelShort}"); + } + + // 创建口袋地图(如果需要) + Map targetMap = portal.GetOtherMap(); + if (targetMap == null) + { + Log.Warning("[WULA] TransferPawnToPocketSpace: Failed to get or create pocket map"); + return false; + } + + IntVec3 destinationLocation = portal.GetDestinationLocation(); + if (!destinationLocation.IsValid) + { + Log.Warning("[WULA] TransferPawnToPocketSpace: Invalid destination location"); + return false; + } + + try + { + // 保存重要状态 + bool wasDrafted = pawn.Drafted; + Map sourceMap = pawn.Map; // 可能为null如果pawn在容器中 + IntVec3 sourcePos = pawn.Position; + ThingOwner owner = pawn.holdingOwner; + + Log.Message($"[WULA] Starting transfer of pawn {pawn.LabelShort} to pocket space"); + + // 通知系统人员被添加,更新装载状态 + portal.Notify_ThingAdded(pawn); + + // 寻找安全的生成位置 + IntVec3 spawnPos = CellFinder.StandableCellNear(destinationLocation, targetMap, 5, + p => p.Standable(targetMap) && !p.GetThingList(targetMap).Any(t => t is Pawn)); + + if (!spawnPos.IsValid) + { + Log.Warning("[WULA] Could not find valid spawn position in pocket map, using center"); + spawnPos = CellFinder.RandomClosewalkCellNear(targetMap.Center, targetMap, 10, + p => p.Standable(targetMap)); + + if (!spawnPos.IsValid) + { + Log.Error("[WULA] All spawn position attempts failed, using map center"); + spawnPos = targetMap.Center; + } + } + + // 关键情况记录 + Log.Message($"[WULA] Found valid spawn position: {spawnPos}"); + Log.Message($"[WULA] Pawn state - Spawned: {pawn.Spawned}, In container: {owner != null}"); + + // 从Pawn当前位置安全移除 + if (owner != null) + { + Log.Message($"[WULA] Removing pawn from container"); + if (!owner.Remove(pawn)) + { + Log.Error($"[WULA] Failed to remove pawn from container!"); + return false; + } + } + else if (pawn.Spawned) + { + Log.Message($"[WULA] Despawning pawn from map {pawn.Map?.uniqueID ?? -1}"); + pawn.DeSpawn(DestroyMode.Vanish); + } + else + { + // Pawn既不在地图上也不在容器中,可能被CompTransporter直接持有 + Log.Message($"[WULA] Pawn in special state - ParentHolder: {pawn.ParentHolder?.ToString() ?? "None"}"); + + // 尝试从CompTransporter中直接提取 + if (pawn.ParentHolder != null) + { + Log.Message($"[WULA] Attempting to extract pawn from ParentHolder: {pawn.ParentHolder}"); + + // 检查是否在特殊容器中 + var parentHolder = pawn.ParentHolder; + if (parentHolder is ThingOwner thingOwner) + { + Log.Message($"[WULA] ParentHolder is a ThingOwner, attempting to remove pawn"); + if (thingOwner.Contains(pawn)) + { + bool removed = thingOwner.Remove(pawn); + Log.Message($"[WULA] Removed from ThingOwner: {removed}"); + } + } + else if (parentHolder.ToString().Contains("CompTransporter")) + { + // 尝试使用反射从CompTransporter中移除 + Log.Message($"[WULA] Attempting to extract from CompTransporter"); + var compTransporter = portal.GetComp(); + if (compTransporter != null) + { + var innerContainerField = typeof(CompTransporter).GetField("innerContainer", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); + + if (innerContainerField != null) + { + var transporterContainer = innerContainerField.GetValue(compTransporter) as ThingOwner; + if (transporterContainer != null && transporterContainer.Contains(pawn)) + { + bool removed = transporterContainer.Remove(pawn); + Log.Message($"[WULA] Removed from CompTransporter: {removed}"); + } + } + } + } + } + } + + // 确认是否已从原位置移除 + if (pawn.Spawned) + { + Log.Error($"[WULA] Failed to despawn pawn! Still spawned after despawn attempt"); + return false; + } + + // 生成到目标位置 + Log.Message($"[WULA] Spawning pawn at {spawnPos} in map {targetMap.uniqueID}"); + GenSpawn.Spawn(pawn, spawnPos, targetMap); + + // 验证是否成功生成 + if (!pawn.Spawned || pawn.Map != targetMap) + { + Log.Error($"[WULA] Pawn failed to spawn correctly! Spawned: {pawn.Spawned}, Map: {pawn.Map?.uniqueID ?? -1}"); + + // 尝试恢复到原始位置 + if (sourceMap != null && sourceMap.IsPlayerHome) + { + Log.Message($"[WULA] Attempting emergency recovery to original position"); + GenSpawn.Spawn(pawn, sourcePos, sourceMap); + + if (!pawn.Spawned) + { + Log.Error($"[WULA] Emergency recovery failed! Pawn is lost"); + } + } + return false; + } + + // 恢复状态 + if (wasDrafted && pawn.drafter != null) + { + pawn.drafter.Drafted = true; + } + + Log.Message($"[WULA] Pawn {pawn.LabelShort} successfully transferred to pocket space"); + return true; + } + catch (Exception ex) + { + Log.Error($"[WULA] Exception during pawn transfer: {ex}"); + return false; + } + } }