94 lines
2.7 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|