82 lines
2.9 KiB
C#
82 lines
2.9 KiB
C#
using HarmonyLib;
|
|
using RimWorld;
|
|
using Verse;
|
|
using Verse.AI;
|
|
using Verse.AI.Group;
|
|
using UnityEngine;
|
|
|
|
namespace WulaFallenEmpire.HarmonyPatches
|
|
{
|
|
[HarmonyPatch(typeof(JobGiver_GatherOfferingsForPsychicRitual), "TryGiveJob")]
|
|
public static class Patch_JobGiver_GatherOfferingsForPsychicRitual_TryGiveJob
|
|
{
|
|
[HarmonyPrefix]
|
|
public static bool Prefix(Pawn pawn, ref Job __result)
|
|
{
|
|
Lord lord = pawn.GetLord();
|
|
if (lord == null)
|
|
{
|
|
return true; // Continue to original method
|
|
}
|
|
|
|
if (!(lord.CurLordToil is LordToil_PsychicRitual lordToil_PsychicRitual))
|
|
{
|
|
return true; // Continue to original method
|
|
}
|
|
|
|
var ritualDef = lordToil_PsychicRitual.RitualData.psychicRitual.def as PsychicRitualDef_WulaBase;
|
|
if (ritualDef == null)
|
|
{
|
|
return true; // Not our custom ritual, continue to original method
|
|
}
|
|
|
|
if (ritualDef.RequiredOffering == null)
|
|
{
|
|
__result = null;
|
|
return false; // Stop original method
|
|
}
|
|
|
|
PsychicRitual psychicRitual = lordToil_PsychicRitual.RitualData.psychicRitual;
|
|
PsychicRitualRoleDef psychicRitualRoleDef = psychicRitual.assignments.RoleForPawn(pawn);
|
|
if (psychicRitualRoleDef == null)
|
|
{
|
|
__result = null;
|
|
return false; // Stop original method
|
|
}
|
|
|
|
float num = PsychicRitualToil_GatherOfferings.PawnsOfferingCount(psychicRitual.assignments.AssignedPawns(psychicRitualRoleDef), ritualDef.RequiredOffering);
|
|
int needed = Mathf.CeilToInt(ritualDef.RequiredOffering.GetBaseCount() - num);
|
|
if (needed == 0)
|
|
{
|
|
__result = null;
|
|
return false; // Stop original method
|
|
}
|
|
|
|
Thing thing2 = GenClosest.ClosestThingReachable(pawn.PositionHeld, pawn.MapHeld, ThingRequest.ForGroup(ThingRequestGroup.HaulableAlways), PathEndMode.Touch, TraverseParms.For(pawn), 9999f, delegate (Thing thing)
|
|
{
|
|
if (!ritualDef.RequiredOffering.filter.Allows(thing))
|
|
{
|
|
return false;
|
|
}
|
|
if (thing.IsForbidden(pawn))
|
|
{
|
|
return false;
|
|
}
|
|
int stackCount = Mathf.Min(needed, thing.stackCount);
|
|
return pawn.CanReserve(thing, 10, stackCount);
|
|
});
|
|
|
|
if (thing2 == null)
|
|
{
|
|
__result = null;
|
|
return false; // Stop original method
|
|
}
|
|
|
|
Job job = JobMaker.MakeJob(JobDefOf.TakeCountToInventory, thing2);
|
|
job.count = Mathf.Min(needed, thing2.stackCount);
|
|
__result = job;
|
|
|
|
return false; // Stop original method, we've provided the result
|
|
}
|
|
}
|
|
} |