mirror of
https://gitgud.io/c0ffeeeeeeee/rimworld-animations.git
synced 2024-08-15 00:43:45 +00:00
Compare commits
2 commits
26a5993ffd
...
1a66bae865
Author | SHA1 | Date | |
---|---|---|---|
|
1a66bae865 | ||
|
03a41e32c0 |
2 changed files with 122 additions and 81 deletions
Binary file not shown.
|
@ -6,93 +6,134 @@ using RimWorld;
|
||||||
using Verse;
|
using Verse;
|
||||||
using rjw;
|
using rjw;
|
||||||
|
|
||||||
namespace Rimworld_Animations {
|
namespace Rimworld_Animations
|
||||||
|
{
|
||||||
|
|
||||||
[HarmonyPatch(typeof(JobDriver_SexBaseInitiator), "Start")]
|
[HarmonyPatch(typeof(JobDriver_SexBaseInitiator), "Start")]
|
||||||
static class HarmonyPatch_JobDriver_SexBaseInitiator_Start {
|
static class HarmonyPatch_JobDriver_SexBaseInitiator_Start
|
||||||
public static void Postfix(ref JobDriver_SexBaseInitiator __instance) {
|
{
|
||||||
|
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)
|
|
||||||
{
|
|
||||||
if (RJWAnimationSettings.debugMode)
|
|
||||||
{
|
|
||||||
Log.Message("Participant: " + participant.Name);
|
|
||||||
Log.Message("JobDriver: " + participant.CurJobDef.defName);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//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))
|
|
||||||
|
Pawn pawn = __instance.pawn;
|
||||||
|
Pawn partner = __instance.Target as Pawn;
|
||||||
|
|
||||||
|
if (partner == null)
|
||||||
|
partner = pawn;
|
||||||
|
|
||||||
|
List<Pawn> participants = GetAllSexParticipants(pawn);
|
||||||
|
GroupAnimationDef groupAnimation = AnimationUtility.FindGroupAnimation(participants, out int reorder);
|
||||||
|
|
||||||
|
if (groupAnimation != null)
|
||||||
{
|
{
|
||||||
return true;
|
Thing anchor = (Thing)__instance.Bed ?? partner;
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
AnimationUtility.StartGroupAnimation(participants, groupAnimation, reorder, anchor);
|
||||||
|
int animTicks = AnimationUtility.GetAnimationLength(pawn);
|
||||||
|
|
||||||
[HarmonyPatch(typeof(JobDriver_SexBaseInitiator), "End")]
|
foreach (Pawn participant in participants)
|
||||||
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);
|
if (RJWAnimationSettings.debugMode)
|
||||||
}
|
{
|
||||||
|
Log.Message("Participant: " + participant.Name);
|
||||||
|
Log.Message("JobDriver: " + participant.CurJobDef.defName);
|
||||||
|
}
|
||||||
|
|
||||||
|
//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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public static List<Pawn> GetAllSexParticipants(this Pawn pawn)
|
||||||
|
{
|
||||||
|
List<Pawn> participants = new List<Pawn>();
|
||||||
|
|
||||||
|
if (pawn?.jobs?.curDriver == null ||
|
||||||
|
(pawn.jobs.curDriver is JobDriver_Sex) == false)
|
||||||
|
return participants;
|
||||||
|
|
||||||
|
var receiver = pawn.GetSexReceiver();
|
||||||
|
|
||||||
|
if (receiver != null)
|
||||||
|
{
|
||||||
|
participants = (receiver.jobs.curDriver as JobDriver_SexBaseReciever).parteners;
|
||||||
|
participants.AddDistinct(receiver);
|
||||||
|
|
||||||
|
return participants;
|
||||||
|
}
|
||||||
|
|
||||||
|
participants.AddDistinct(pawn);
|
||||||
|
|
||||||
|
return participants;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Pawn GetSexReceiver(this Pawn pawn)
|
||||||
|
{
|
||||||
|
if (pawn?.jobs?.curDriver == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (pawn.jobs.curDriver is JobDriver_SexBaseReciever)
|
||||||
|
return pawn;
|
||||||
|
|
||||||
|
JobDriver_SexBaseInitiator jobDriver = pawn.jobs.curDriver as JobDriver_SexBaseInitiator;
|
||||||
|
|
||||||
|
if (jobDriver?.Partner?.jobs?.curDriver == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (jobDriver.Partner.jobs.curDriver is JobDriver_SexBaseReciever)
|
||||||
|
return jobDriver.Partner;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue