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) { /* These particular jobs need special code don't play anim for now */ if(__instance is JobDriver_Masturbate || __instance is JobDriver_ViolateCorpse) { return; } if(!AnimationSettings.PlayAnimForNonsexualActs && NonSexualAct(__instance)) { return; } Pawn pawn = __instance.pawn; Pawn partner = __instance.Target as Pawn; Building_Bed bed = __instance.Bed; if (partner?.jobs?.curDriver is JobDriver_SexBaseReciever partnerSexBaseReceiver) { Pawn Target = __instance.Target as Pawn; bool quickie = (__instance is JobDriver_SexQuick) && AnimationSettings.fastAnimForQuickie; int preAnimDuration = __instance.duration; int AnimationTimeTicks = 0; List participants = partnerSexBaseReceiver.parteners.Append(partner).ToList(); RerollAnimations(participants); //Modify Orgasm ticks to only orgasm as many times as RJW stock orgasm allows if (AnimationTimeTicks != 0) { __instance.orgasmstick = preAnimDuration * __instance.orgasmstick / AnimationTimeTicks; } } } public static void RerollAnimations(List participants) { participants[0].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation1); participants[1].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation2); } static IEnumerable 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 Postfix(ref JobDriver_SexBaseInitiator __instance) { //stop animation } } }