rimworld-animations/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexB...

94 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using HarmonyLib;
using RimWorld;
using Verse;
using rjw;
namespace Rimworld_Animations {
[HarmonyPatch(typeof(JobDriver_SexBaseInitiator), "Start")]
static class HarmonyPatch_JobDriver_SexBaseInitiator_Start {
public static void Postfix(ref JobDriver_SexBaseInitiator __instance) {
Pawn pawn = __instance.pawn;
Pawn partner = __instance.Target as Pawn;
if (partner?.jobs?.curDriver is JobDriver_SexBaseReciever partnerSexBaseReceiver) {
Pawn Target = __instance.Target as Pawn;
List<Pawn> participants = partnerSexBaseReceiver.parteners.Append(partner).ToList();
GroupAnimationDef groupAnimation = AnimationUtility.FindGroupAnimation(participants, out int reorder);
if (groupAnimation != null)
{
Thing anchor = (Thing)__instance.Bed ?? partner;
AnimationUtility.StartGroupAnimation(participants, groupAnimation, reorder, anchor);
int animTicks = AnimationUtility.GetAnimationLength(pawn);
foreach(Pawn participant in participants)
{
//null ref check for pawns that might have lost their jobs or become null for some reason
if (participant?.jobs?.curDriver is JobDriver_Sex participantJobDriver)
{
participantJobDriver.ticks_left = animTicks;
participantJobDriver.sex_ticks = animTicks;
participantJobDriver.orgasmStartTick = animTicks;
participantJobDriver.duration = animTicks;
}
}
}
}
}
static IEnumerable<String> NonSexActRulePackDefNames = new String[]
{
"MutualHandholdingRP",
"MutualMakeoutRP",
};
public static bool NonSexualAct(JobDriver_SexBaseInitiator sexBaseInitiator)
{
if(NonSexActRulePackDefNames.Contains(sexBaseInitiator.Sexprops.rulePack))
{
return true;
}
return false;
}
}
[HarmonyPatch(typeof(JobDriver_SexBaseInitiator), "End")]
static class HarmonyPatch_JobDriver_SexBaseInitiator_End {
public static void Prefix(ref JobDriver_SexBaseInitiator __instance)
{
//stop pawn animating
AnimationUtility.StopGroupAnimation(__instance.pawn);
//stop partner animating
if (__instance.Partner is Pawn partner)
{
AnimationUtility.StopGroupAnimation(partner);
}
//stop partner's other partners (threesome pawns) animating
//added null ref checks for instances when pawns get nulled or lose their jobs
if (__instance.Partner?.jobs?.curDriver is JobDriver_SexBaseReciever partnerReceiverJob)
{
foreach(Pawn pawn in partnerReceiverJob.parteners)
{
if (pawn != null) AnimationUtility.StopGroupAnimation(pawn);
}
}
}
}
}