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; + } + /// /// 检查身体部位是否有效 ///