diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll
index 262ac07..5005dc5 100644
Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ
diff --git a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml
index 7d08298..e556a18 100644
--- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml
+++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml
@@ -192,7 +192,6 @@
Normal
EatVegetarian
Filth_Slime
- false
10
4
diff --git a/About/ModIcon.png b/About/ModIcon.png
new file mode 100644
index 0000000..f31ee42
Binary files /dev/null and b/About/ModIcon.png differ
diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo
index 36e843d..6937705 100644
Binary files a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo and b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo differ
diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json
index d53923e..990db67 100644
--- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json
+++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json
@@ -1,16 +1,7 @@
{
"Version": 1,
"WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\building_comps\\ara_compinteractiveproducer\\compinteractiveproducer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_compinteractiveproducer\\compinteractiveproducer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\abilities\\ara_queenability\\compabilityeffect_needcost.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_queenability\\compabilityeffect_needcost.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- }
- ],
+ "Documents": [],
"DocumentGroupContainers": [
{
"Orientation": 0,
@@ -18,34 +9,8 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 1,
+ "SelectedChildIndex": -1,
"Children": [
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "CompAbilityEffect_NeedCost.cs",
- "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_QueenAbility\\CompAbilityEffect_NeedCost.cs",
- "RelativeDocumentMoniker": "Abilities\\ARA_QueenAbility\\CompAbilityEffect_NeedCost.cs",
- "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_QueenAbility\\CompAbilityEffect_NeedCost.cs",
- "RelativeToolTip": "Abilities\\ARA_QueenAbility\\CompAbilityEffect_NeedCost.cs",
- "ViewState": "AgIAAF4AAAAAAAAAAAAgwHcAAAA2AAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-10-09T08:04:27.763Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "CompInteractiveProducer.cs",
- "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CompInteractiveProducer\\CompInteractiveProducer.cs",
- "RelativeDocumentMoniker": "Building_Comps\\ARA_CompInteractiveProducer\\CompInteractiveProducer.cs",
- "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CompInteractiveProducer\\CompInteractiveProducer.cs*",
- "RelativeToolTip": "Building_Comps\\ARA_CompInteractiveProducer\\CompInteractiveProducer.cs*",
- "ViewState": "AgIAADoBAAAAAAAAAAAmwLEBAAAgAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-10-09T08:03:31.079Z",
- "EditorCaption": ""
- },
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
diff --git a/Source/ArachnaeSwarm/Hediffs/MoharHediffs/HediffComp_Spawner.cs b/Source/ArachnaeSwarm/Hediffs/MoharHediffs/HediffComp_Spawner.cs
index 4ee91a8..a545cfe 100644
--- a/Source/ArachnaeSwarm/Hediffs/MoharHediffs/HediffComp_Spawner.cs
+++ b/Source/ArachnaeSwarm/Hediffs/MoharHediffs/HediffComp_Spawner.cs
@@ -405,54 +405,180 @@ namespace ArachnaeSwarm.MoharHediffs
}
else
{
- // 修改:物品直接添加到pawn的物品栏中
- Thing thing = ThingMaker.MakeThing(this.Props.thingToSpawn, null);
- if (thing == null)
- {
- return false;
- }
- thing.stackCount = this.calculatedQuantity;
+ // 重新设计物品生成逻辑:按优先级顺序尝试
+ return TrySpawnItemWithPriority(pawn);
+ }
+ }
+
+ // 新增:按优先级顺序尝试生成物品
+ private bool TrySpawnItemWithPriority(Pawn pawn)
+ {
+ Thing thing = ThingMaker.MakeThing(this.Props.thingToSpawn, null);
+ if (thing == null)
+ {
+ Tools.Warn("Failed to create thing: " + this.Props.thingToSpawn?.defName, this.myDebug);
+ return false;
+ }
+ thing.stackCount = this.calculatedQuantity;
+
+ // 记录原始物品用于校验
+ ThingDef originalThingDef = thing.def;
+ int originalStackCount = thing.stackCount;
+
+ // 按优先级顺序尝试生成
+ bool success = false;
+ string spawnMethod = "";
+
+ // 优先级1: 尝试在pawn附近空地生成
+ if (!success)
+ {
+ success = TrySpawnAtNearbyEmptyCell(pawn, thing, ref spawnMethod);
+ }
+
+ // 优先级2: 尝试在pawn脚底生成
+ if (!success)
+ {
+ success = TrySpawnAtPawnPosition(pawn, thing, ref spawnMethod);
+ }
+
+ // 优先级3: 尝试放入pawn物品栏
+ if (!success)
+ {
+ success = TrySpawnInInventory(pawn, thing, ref spawnMethod);
+ }
+
+ // 生成后校验
+ if (success)
+ {
+ bool verified = VerifySpawnSuccess(pawn, originalThingDef, originalStackCount, spawnMethod);
- // 检查pawn是否有物品栏
- if (pawn.inventory == null)
+ // 如果校验失败且不是在物品栏中生成的,尝试在物品栏中重新生成
+ if (!verified && spawnMethod != "inventory")
{
- Tools.Warn($"Pawn {pawn.Label} does not have an inventory to receive spawned items", this.myDebug);
- return false;
+ Tools.Warn($"Spawn verification failed for {spawnMethod}, attempting inventory fallback", this.myDebug);
+
+ // 重新创建物品
+ Thing fallbackThing = ThingMaker.MakeThing(originalThingDef, null);
+ fallbackThing.stackCount = originalStackCount;
+
+ success = TrySpawnInInventory(pawn, fallbackThing, ref spawnMethod);
+
+ if (success)
+ {
+ verified = VerifySpawnSuccess(pawn, originalThingDef, originalStackCount, "inventory_fallback");
+ if (!verified)
+ {
+ Tools.Warn("Inventory fallback also failed verification", this.myDebug);
+ success = false;
+ }
+ }
}
-
- // 尝试将物品添加到pawn的物品栏
- if (pawn.inventory.innerContainer.TryAdd(thing))
+
+ if (success && verified)
{
if (PawnUtility.ShouldSendNotificationAbout(pawn))
{
- Messages.Message(this.Props.spawnVerb.Translate(pawn.Named("PAWN"), thing.Named("THING")), pawn, MessageTypeDefOf.PositiveEvent, true);
- }
- return true;
- }
- else
- {
- // 如果物品栏添加失败,回退到原来的地面生成方式
- Tools.Warn($"Failed to add {thing.Label} to {pawn.Label}'s inventory, falling back to ground spawn", this.myDebug);
-
- IntVec3 intVec2;
- if (!this.TryFindSpawnCell(out intVec2))
- {
- return false;
- }
-
- if (this.Props.spawnForbidden)
- {
- thing.SetForbidden(true, true);
- }
- GenPlace.TryPlaceThing(thing, intVec2, pawn.Map, ThingPlaceMode.Direct, null, null, default(Rot4));
-
- if (PawnUtility.ShouldSendNotificationAbout(pawn))
- {
- Messages.Message(this.Props.spawnVerb.Translate(pawn.Named("PAWN"), thing.Named("THING")), thing, MessageTypeDefOf.PositiveEvent, true);
+ Messages.Message(this.Props.spawnVerb.Translate(pawn.Named("PAWN"), thing.Named("THING")),
+ spawnMethod == "inventory" || spawnMethod == "inventory_fallback" ? pawn : thing,
+ MessageTypeDefOf.PositiveEvent, true);
}
+ Tools.Warn($"Successfully spawned {originalStackCount}x {originalThingDef.defName} via {spawnMethod}", this.myDebug);
return true;
}
}
+
+ Tools.Warn($"Failed to spawn {originalStackCount}x {originalThingDef.defName} after all attempts", this.myDebug);
+ return false;
+ }
+
+ // 新增:尝试在附近空地生成
+ private bool TrySpawnAtNearbyEmptyCell(Pawn pawn, Thing thing, ref string spawnMethod)
+ {
+ IntVec3 spawnCell;
+ if (TryFindSpawnCell(out spawnCell))
+ {
+ if (this.Props.spawnForbidden)
+ {
+ thing.SetForbidden(true, true);
+ }
+
+ if (GenPlace.TryPlaceThing(thing, spawnCell, pawn.Map, ThingPlaceMode.Direct, null, null, default(Rot4)))
+ {
+ spawnMethod = "nearby_cell";
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // 新增:尝试在pawn位置生成
+ private bool TrySpawnAtPawnPosition(Pawn pawn, Thing thing, ref string spawnMethod)
+ {
+ IntVec3 pawnPosition = pawn.Position;
+ if (pawnPosition.IsValid && pawnPosition.Walkable(pawn.Map))
+ {
+ if (this.Props.spawnForbidden)
+ {
+ thing.SetForbidden(true, true);
+ }
+
+ if (GenPlace.TryPlaceThing(thing, pawnPosition, pawn.Map, ThingPlaceMode.Direct, null, null, default(Rot4)))
+ {
+ spawnMethod = "pawn_position";
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // 新增:尝试在物品栏生成
+ private bool TrySpawnInInventory(Pawn pawn, Thing thing, ref string spawnMethod)
+ {
+ if (pawn.inventory == null)
+ {
+ Tools.Warn($"Pawn {pawn.Label} does not have an inventory", this.myDebug);
+ return false;
+ }
+
+ if (pawn.inventory.innerContainer.TryAdd(thing))
+ {
+ spawnMethod = "inventory";
+ return true;
+ }
+ return false;
+ }
+
+ // 新增:生成后校验
+ private bool VerifySpawnSuccess(Pawn pawn, ThingDef thingDef, int expectedCount, string spawnMethod)
+ {
+ bool verificationSuccess = false;
+
+ switch (spawnMethod)
+ {
+ case "nearby_cell":
+ case "pawn_position":
+ case "inventory_fallback":
+ // 检查地图上是否有生成的物品
+ verificationSuccess = pawn.Map.listerThings.ThingsOfDef(thingDef)
+ .Any(t => t.stackCount >= expectedCount && t.Position.InHorDistOf(pawn.Position, 2f));
+ break;
+
+ case "inventory":
+ // 检查物品栏中是否有生成的物品
+ verificationSuccess = pawn.inventory.innerContainer.Any(t => t.def == thingDef && t.stackCount >= expectedCount);
+ break;
+ }
+
+ if (!verificationSuccess)
+ {
+ Tools.Warn($"Spawn verification failed for {thingDef.defName} via {spawnMethod}", this.myDebug);
+ }
+ else
+ {
+ Tools.Warn($"Spawn verification successful for {thingDef.defName} via {spawnMethod}", this.myDebug);
+ }
+
+ return verificationSuccess;
}
private bool TryFindSpawnCell(out IntVec3 result)