diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 1e78cf1..32aba2a 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/JobDefs/SuperCarry_JobDef.xml b/1.6/1.6/Defs/JobDefs/SuperCarry_JobDef.xml new file mode 100644 index 0000000..25d0c61 --- /dev/null +++ b/1.6/1.6/Defs/JobDefs/SuperCarry_JobDef.xml @@ -0,0 +1,13 @@ + + + + + SuperCarry + ArachnaeSwarm.JobDriver_SuperCarry + 正在超级携带 TargetA。 + false + true + true + + + \ No newline at end of file diff --git a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml index 8d825cf..0e3714d 100644 --- a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml +++ b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml @@ -261,6 +261,13 @@ 0 + +
  • + true + true + false +
  • +
    ArachnaeNode_Race_NeuroSwarm diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/SuperCarry_Keys.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/SuperCarry_Keys.xml new file mode 100644 index 0000000..e5bb7e7 --- /dev/null +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/SuperCarry_Keys.xml @@ -0,0 +1,6 @@ + + + + 强制携带 {0} + + \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index 15261f2..9466487 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -222,6 +222,11 @@ + + + + + diff --git a/Source/ArachnaeSwarm/FloatMenuOptionProvider_SuperCarry.cs b/Source/ArachnaeSwarm/FloatMenuOptionProvider_SuperCarry.cs new file mode 100644 index 0000000..bae6d0e --- /dev/null +++ b/Source/ArachnaeSwarm/FloatMenuOptionProvider_SuperCarry.cs @@ -0,0 +1,63 @@ +using Verse; +using Verse.AI; +using RimWorld; + +namespace ArachnaeSwarm +{ + public class FloatMenuOptionProvider_SuperCarry : FloatMenuOptionProvider + { + protected override bool Drafted => true; + protected override bool Undrafted => false; + protected override bool Multiselect => false; + protected override bool RequiresManipulation => true; + + protected override bool AppliesInt(FloatMenuContext context) + { + var extension = context.FirstSelectedPawn.kindDef.GetModExtension(); + if (extension == null || !extension.canSuperCarry) + { + return false; + } + + if (extension.requiresFlight) + { + if (context.FirstSelectedPawn.flight == null || !context.FirstSelectedPawn.flight.Flying) + { + return false; + } + } + + return true; + } + + protected override FloatMenuOption GetSingleOptionFor(Pawn clickedPawn, FloatMenuContext context) + { + Pawn carrier = context.FirstSelectedPawn; + var extension = carrier.kindDef.GetModExtension(); + + if (clickedPawn == carrier) return null; + + // 新增:检查是否允许携带敌对单位 + if (clickedPawn.HostileTo(Faction.OfPlayer) && (extension == null || !extension.canCarryHostile)) + { + return new FloatMenuOption("CannotCarry".Translate(clickedPawn) + ": " + "CarriedPawnHostile".Translate(), null); + } + + if (!carrier.CanReach(clickedPawn, PathEndMode.ClosestTouch, Danger.Deadly)) + { + return new FloatMenuOption("CannotCarry".Translate(clickedPawn) + ": " + "NoPath".Translate().CapitalizeFirst(), null); + } + if (!carrier.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)) + { + return new FloatMenuOption("CannotCarry".Translate(carrier) + ": " + "Incapable".Translate().CapitalizeFirst(), null); + } + + return FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("SuperCarry".Translate(clickedPawn.LabelShort, clickedPawn), delegate + { + Job job = JobMaker.MakeJob(DefDatabase.GetNamed("SuperCarry"), clickedPawn); + job.count = 1; + carrier.jobs.TryTakeOrderedJob(job, JobTag.Misc); + }), carrier, clickedPawn); + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/JobDriver_SuperCarry.cs b/Source/ArachnaeSwarm/JobDriver_SuperCarry.cs new file mode 100644 index 0000000..b5489ac --- /dev/null +++ b/Source/ArachnaeSwarm/JobDriver_SuperCarry.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Verse; +using Verse.AI; +using RimWorld; + +namespace ArachnaeSwarm +{ + public class JobDriver_SuperCarry : JobDriver + { + private const TargetIndex TakeeIndex = TargetIndex.A; + + protected Pawn Takee => (Pawn)job.GetTarget(TargetIndex.A).Thing; + + public override bool TryMakePreToilReservations(bool errorOnFailed) + { + return pawn.Reserve(Takee, job, 1, -1, null, errorOnFailed); + } + + protected override IEnumerable MakeNewToils() + { + this.FailOnDestroyedOrNull(TargetIndex.A); + this.FailOnAggroMentalState(TargetIndex.A); + + yield return Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch) + .FailOnDespawnedNullOrForbidden(TargetIndex.A) + .FailOnSomeonePhysicallyInteracting(TargetIndex.A); + + yield return Toils_Haul.StartCarryThing(TargetIndex.A); + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/SuperCarryExtension.cs b/Source/ArachnaeSwarm/SuperCarryExtension.cs new file mode 100644 index 0000000..8f6fa52 --- /dev/null +++ b/Source/ArachnaeSwarm/SuperCarryExtension.cs @@ -0,0 +1,11 @@ +using Verse; + +namespace ArachnaeSwarm +{ + public class SuperCarryExtension : DefModExtension + { + public bool canSuperCarry = false; + public bool requiresFlight = false; + public bool canCarryHostile = false; // 新增字段 + } +} \ No newline at end of file