diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll
index 40f289a..a51815b 100644
Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ
diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs
index 2420fae..5c433d8 100644
--- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs
+++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs
@@ -250,57 +250,68 @@ namespace ArachnaeSwarm
///
/// 检查两个部位是否对称
+ /// 使用 MCP 验证的 RimWorld 1.6 API
///
private bool IsSymmetricalPart(BodyPartRecord part1, BodyPartRecord part2)
{
- // 优先使用 BodyPartDef 的对称标签检测
- if (part1.def == part2.def)
+ if (part1 == null || part2 == null || part1 == part2)
+ return false;
+
+ // 方法1:使用 BodyPartDef.IsMirroredPart(MCP验证:tags.Contains(BodyPartTagDefOf.Mirrored))
+ // 镜像部位通常有左右之分
+ if (part1.def.IsMirroredPart && part2.def.IsMirroredPart && part1.def == part2.def)
{
- // 检查是否有对称标签
- if (part1.def.tags != null)
- {
- // 使用 BodyPartTagDef 进行对称检测
- bool part1Left = part1.def.tags.Any(t => t.defName.Contains("Left"));
- bool part1Right = part1.def.tags.Any(t => t.defName.Contains("Right"));
- bool part2Left = part2.def.tags.Any(t => t.defName.Contains("Left"));
- bool part2Right = part2.def.tags.Any(t => t.defName.Contains("Right"));
-
- if ((part1Left && part2Right) || (part1Right && part2Left))
- return true;
- }
+ // 同类型的镜像部位,检查是否是相反侧
+ if (AreOppositeMirroredParts(part1, part2))
+ return true;
}
- // 备用方案:使用自定义标签检测(支持本地化)
+ // 方法2:通过 customLabel 检测(如 "left arm", "right arm")
string label1 = part1.customLabel ?? part1.def.label;
string label2 = part2.customLabel ?? part2.def.label;
- // 使用翻译键检测,而非硬编码英文
- string leftKey = "Left".Translate();
- string rightKey = "Right".Translate();
-
- bool label1HasLeft = label1.Contains(leftKey) || label1.Contains("Left");
- bool label1HasRight = label1.Contains(rightKey) || label1.Contains("Right");
- bool label2HasLeft = label2.Contains(leftKey) || label2.Contains("Left");
- bool label2HasRight = label2.Contains(rightKey) || label2.Contains("Right");
-
- if ((label1HasLeft && label2HasRight) || (label1HasRight && label2HasLeft))
- return true;
-
- // 检查前后对称
- string frontKey = "Front".Translate();
- string backKey = "Back".Translate();
-
- bool label1HasFront = label1.Contains(frontKey) || label1.Contains("Front");
- bool label1HasBack = label1.Contains(backKey) || label1.Contains("Back");
- bool label2HasFront = label2.Contains(frontKey) || label2.Contains("Front");
- bool label2HasBack = label2.Contains(backKey) || label2.Contains("Back");
-
- if ((label1HasFront && label2HasBack) || (label1HasBack && label2HasFront))
- return true;
+ if (!string.IsNullOrEmpty(label1) && !string.IsNullOrEmpty(label2))
+ {
+ // 检查左右对称(使用翻译键支持本地化)
+ bool part1Left = label1.Contains("Left") || label1.Contains("left");
+ bool part1Right = label1.Contains("Right") || label1.Contains("right");
+ bool part2Left = label2.Contains("Left") || label2.Contains("left");
+ bool part2Right = label2.Contains("Right") || label2.Contains("right");
+
+ if ((part1Left && part2Right) || (part1Right && part2Left))
+ return true;
+
+ // 检查前后对称
+ bool part1Front = label1.Contains("Front") || label1.Contains("front");
+ bool part1Back = label1.Contains("Back") || label1.Contains("back");
+ bool part2Front = label2.Contains("Front") || label2.Contains("front");
+ bool part2Back = label2.Contains("Back") || label2.Contains("back");
+
+ if ((part1Front && part2Back) || (part1Back && part2Front))
+ return true;
+ }
return false;
}
+ ///
+ /// 检查两个镜像部位是否是相反侧
+ ///
+ private bool AreOppositeMirroredParts(BodyPartRecord part1, BodyPartRecord part2)
+ {
+ // 检查是否在同一层级(相同的父部位)
+ if (part1.parent != part2.parent)
+ return false;
+
+ // 检查索引是否不同(左右部位通常是相邻的)
+ if (part1.Index == part2.Index)
+ return false;
+
+ // 对于镜像部位,如果它们有相同的 BodyPartDef 但不同的 Index,通常是对称的
+ // 这是一个合理的假设,因为 RimWorld 的身体定义中镜像部位通常是成对出现的
+ return true;
+ }
+
///
/// 检查身体部位是否有效
///