乌拉自己找吃的
This commit is contained in:
98
Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
Normal file
98
Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
Normal file
@@ -0,0 +1,98 @@
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using System.Linq; // For FirstOrDefault
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class JobGiver_WulaGetEnergy : ThinkNode_JobGiver
|
||||
{
|
||||
public float minEnergyLevelPercentage = 0.3f;
|
||||
public float emergencyThreshold = 0.1f;
|
||||
public float normalPriority = 5f;
|
||||
public float emergencyPriority = 9.5f;
|
||||
|
||||
public override ThinkNode DeepCopy(bool resolve = true)
|
||||
{
|
||||
JobGiver_WulaGetEnergy obj = (JobGiver_WulaGetEnergy)base.DeepCopy(resolve);
|
||||
obj.minEnergyLevelPercentage = minEnergyLevelPercentage;
|
||||
obj.emergencyThreshold = emergencyThreshold;
|
||||
obj.normalPriority = normalPriority;
|
||||
obj.emergencyPriority = emergencyPriority;
|
||||
return obj;
|
||||
}
|
||||
|
||||
public override float GetPriority(Pawn pawn)
|
||||
{
|
||||
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
|
||||
if (energyNeed == null)
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
|
||||
// 如果能量充足,则不需要寻找能量核心
|
||||
if (energyNeed.CurLevelPercentage > minEnergyLevelPercentage)
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
|
||||
// 如果能量非常低,给予高优先级
|
||||
if (energyNeed.CurLevelPercentage < emergencyThreshold)
|
||||
{
|
||||
return emergencyPriority;
|
||||
}
|
||||
|
||||
// 否则,给予中等优先级
|
||||
return normalPriority;
|
||||
}
|
||||
|
||||
protected override Job TryGiveJob(Pawn pawn)
|
||||
{
|
||||
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
|
||||
if (energyNeed == null || energyNeed.CurLevelPercentage > minEnergyLevelPercentage)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// 寻找最佳能量核心
|
||||
Thing bestEnergySource = GenClosest.ClosestThingReachable(
|
||||
pawn.Position,
|
||||
pawn.Map,
|
||||
ThingRequest.ForGroup(ThingRequestGroup.HaulableEver), // 扫描所有可搬运的物品
|
||||
PathEndMode.ClosestTouch,
|
||||
TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false),
|
||||
9999f,
|
||||
(Thing t) =>
|
||||
{
|
||||
// 检查物品是否是能量核心
|
||||
ThingDefExtension_EnergySource energySourceExt = t.def.GetModExtension<ThingDefExtension_EnergySource>();
|
||||
if (energySourceExt == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// 检查物品是否可摄取
|
||||
if (!t.IngestibleNow)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// 检查物品是否被禁止或无法预留
|
||||
if (t.IsForbidden(pawn) || !pawn.CanReserve(t, 1, -1, null, false))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
);
|
||||
|
||||
if (bestEnergySource != null)
|
||||
{
|
||||
// 创建摄取能量核心的Job
|
||||
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_IngestWulaEnergy"), bestEnergySource);
|
||||
job.count = 1; // 每次摄取一个
|
||||
return job;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user