Files
WulaFallenEmpireRW/Source/WulaFallenEmpire/HarmonyPatches/Patch_JobGiver_GatherOfferingsForPsychicRitual.cs
2025-08-04 07:51:01 +08:00

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
}
}
}