118 lines
3.9 KiB
C#
118 lines
3.9 KiB
C#
using RimWorld;
|
||
using System.Collections.Generic;
|
||
using Verse;
|
||
using Verse.AI;
|
||
|
||
namespace ArachnaeSwarm
|
||
{
|
||
public class WorkGiver_ExtractHoney : WorkGiver_Scanner
|
||
{
|
||
public override PathEndMode PathEndMode => PathEndMode.Touch;
|
||
|
||
public override Danger MaxPathDanger(Pawn pawn)
|
||
{
|
||
return Danger.None;
|
||
}
|
||
|
||
// 扫描所有虫族成员,检查是否需要挤出蜂蜜
|
||
public override IEnumerable<Thing> PotentialWorkThingsGlobal(Pawn pawn)
|
||
{
|
||
// 返回所有有蜂蜜需求的虫族Pawn
|
||
IReadOnlyList<Pawn> allPawns = pawn.Map.mapPawns.AllPawnsSpawned;
|
||
List<Thing> workThings = new List<Thing>();
|
||
|
||
foreach (Pawn potentialPawn in allPawns)
|
||
{
|
||
// 只检查玩家阵营的虫族成员
|
||
if (potentialPawn.Faction == Faction.OfPlayer &&
|
||
HasHoneyNeed(potentialPawn))
|
||
{
|
||
workThings.Add(potentialPawn);
|
||
}
|
||
}
|
||
|
||
return workThings;
|
||
}
|
||
|
||
public override bool ShouldSkip(Pawn pawn, bool forced = false)
|
||
{
|
||
// 检查Pawn是否属于玩家阵营
|
||
if (pawn.Faction != Faction.OfPlayer)
|
||
return true;
|
||
|
||
// 检查Pawn是否是虫族成员
|
||
if (!IsSwarmMember(pawn))
|
||
return true;
|
||
|
||
// 检查Pawn是否能够工作
|
||
if (pawn.Dead || pawn.Downed || pawn.InMentalState)
|
||
return true;
|
||
|
||
// 检查Pawn是否正在执行其他挤出工作
|
||
if (pawn.CurJobDef == ARA_JobDefOf.ARA_ExtractHoney)
|
||
return true;
|
||
|
||
return false;
|
||
}
|
||
|
||
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
|
||
{
|
||
// 如果目标不是Pawn,返回false
|
||
if (t == null || !(t is Pawn targetPawn))
|
||
return false;
|
||
|
||
// 检查是否是挤出自己的蜂蜜
|
||
if (targetPawn != pawn)
|
||
return false; // 只能挤出自己的蜂蜜
|
||
|
||
// 检查目标Pawn是否有蜂蜜需求
|
||
Need_HoneyProduction honeyNeed = targetPawn.needs?.TryGetNeed<Need_HoneyProduction>();
|
||
if (honeyNeed == null)
|
||
return false;
|
||
|
||
// 检查是否可以挤出
|
||
return CanExtractNow(honeyNeed);
|
||
}
|
||
|
||
public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
|
||
{
|
||
if (t == null || !(t is Pawn targetPawn) || targetPawn != pawn)
|
||
return null;
|
||
|
||
// 创建挤出工作,使用Pawn自身作为目标
|
||
Job job = JobMaker.MakeJob(ARA_JobDefOf.ARA_ExtractHoney, pawn);
|
||
job.count = 1;
|
||
return job;
|
||
}
|
||
|
||
// 检查是否有蜂蜜需求
|
||
private bool HasHoneyNeed(Pawn pawn)
|
||
{
|
||
return pawn.needs?.TryGetNeed<Need_HoneyProduction>() != null;
|
||
}
|
||
|
||
// 检查是否可以立即挤出
|
||
private bool CanExtractNow(Need_HoneyProduction honeyNeed)
|
||
{
|
||
// 如果MaxLevel大于1.5,需要超过80%储量才考虑挤蜜
|
||
if (honeyNeed.MaxLevel > 1.5f)
|
||
{
|
||
return honeyNeed.CurLevelPercentage > 0.8f;
|
||
}
|
||
// 否则在大于1时挤蜜
|
||
else
|
||
{
|
||
return honeyNeed.CurLevel >= 1.0f;
|
||
}
|
||
}
|
||
|
||
// 检查是否是虫族成员
|
||
private bool IsSwarmMember(Pawn pawn)
|
||
{
|
||
return pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindMaster) ||
|
||
pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone) ||
|
||
pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindWorker);
|
||
}
|
||
}
|
||
}
|