Changed from rerouting the job to another for joininbed to simply patching joininbed, code tidying
This commit is contained in:
parent
8177b95bc8
commit
702964a8c2
Binary file not shown.
|
@ -1,17 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<Defs>
|
||||
<JobDef>
|
||||
<defName>JoinInBedAnimation</defName>
|
||||
<driverClass>Rimworld_Animations.JobDriver_SexCasualForAnimation</driverClass>
|
||||
<reportString>joining someone in bed.</reportString>
|
||||
<casualInterruptible>false</casualInterruptible>
|
||||
</JobDef>
|
||||
|
||||
<JobDef>
|
||||
<defName>GettinLovedAnimation</defName>
|
||||
<driverClass>Rimworld_Animations.JobDriver_SexBaseRecieverLovedForAnimation</driverClass>
|
||||
<reportString>lovin'.</reportString>
|
||||
<casualInterruptible>false</casualInterruptible>
|
||||
</JobDef>
|
||||
</Defs>
|
|
@ -82,31 +82,27 @@
|
|||
<Compile Include="Source\Comps\CompProperties_ThingAnimator.cs" />
|
||||
<Compile Include="Source\Comps\CompThingAnimator.cs" />
|
||||
<Compile Include="Source\Defs\AnimationDef.cs" />
|
||||
<Compile Include="Source\JobDrivers\JobDriver_SexBaseRecieverLovedForAnimation.cs" />
|
||||
<Compile Include="Source\JobDrivers\JobDriver_SexCasualForAnimation.cs" />
|
||||
<Compile Include="Source\MainTabWindows\WorldComponent_UpdateMainTab.cs" />
|
||||
<Compile Include="Source\MainTabWindows\MainTabWindow_OffsetConfigure.cs" />
|
||||
<Compile Include="Source\MainTabWindows\OffsetMainButtonDefOf.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_AlienRace.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_CSL.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_DontShaveYourHead.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_FacialAnimation.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_HatsDisplaySelection.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_HeadHair.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_PawnRenderer.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_PawnRotation.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_Pawn_DrawTracker.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_SetPawnAnimatable.cs" />
|
||||
<Compile Include="Source\Patches\HarmonyPatch_ShowHairWithHats.cs" />
|
||||
<Compile Include="Source\Patches\OtherModPatches\HarmonyPatch_AlienRace.cs" />
|
||||
<Compile Include="Source\Patches\OtherModPatches\HarmonyPatch_CSL.cs" />
|
||||
<Compile Include="Source\Patches\OtherModPatches\HarmonyPatch_DontShaveYourHead.cs" />
|
||||
<Compile Include="Source\Patches\OtherModPatches\HarmonyPatch_FacialAnimation.cs" />
|
||||
<Compile Include="Source\Patches\OtherModPatches\HarmonyPatch_HatsDisplaySelection.cs" />
|
||||
<Compile Include="Source\Patches\RimworldPatches\HarmonyPatch_HeadHair.cs" />
|
||||
<Compile Include="Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderer.cs" />
|
||||
<Compile Include="Source\Patches\RimworldPatches\HarmonyPatch_PawnRotation.cs" />
|
||||
<Compile Include="Source\Patches\RimworldPatches\HarmonyPatch_Pawn_DrawTracker.cs" />
|
||||
<Compile Include="Source\Patches\RimworldPatches\HarmonyPatch_SetPawnAnimatable.cs" />
|
||||
<Compile Include="Source\Patches\OtherModPatches\HarmonyPatch_ShowHairWithHats.cs" />
|
||||
<Compile Include="Source\Patches\Harmony_PatchAll.cs" />
|
||||
<Compile Include="Source\Patches\rjwPatches\HarmonyPatch_DoLovinAnimationPatch.cs" />
|
||||
<Compile Include="Source\Patches\rjwPatches\HarmonyPatch_DrawSemen.cs" />
|
||||
<Compile Include="Source\Patches\rjwPatches\HarmonyPatch_JobDriver_SexBaseInitiator.cs" />
|
||||
<Compile Include="Source\Patches\rjwPatches\HarmonyPatch_JoinInBedGiveJob.cs" />
|
||||
<Compile Include="Source\Patches\rjwPatches\HarmonyPatch_PlayAnimJoinInBedRMB.cs" />
|
||||
<Compile Include="Source\Patches\rjwPatches\HarmonyPatch_PlaySexSounds.cs" />
|
||||
<Compile Include="Source\Patches\rjwPatches\HarmonyPatch_SexTick.cs" />
|
||||
<Compile Include="Source\Patches\rjwPatches\HarmonyPatch_WorkGiverSex.cs" />
|
||||
<Compile Include="Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_JoinInBed.cs" />
|
||||
<Compile Include="Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_SexBaseInitiator.cs" />
|
||||
<Compile Include="Source\Patches\RJWPatches\HarmonyPatch_PlaySexSounds.cs" />
|
||||
<Compile Include="Source\Patches\RJWPatches\HarmonyPatch_SexTick.cs" />
|
||||
<Compile Include="Source\Patches\RJWPatches\HarmonyPatch_WorkGiverSex.cs" />
|
||||
<Compile Include="Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs" />
|
||||
<Compile Include="Source\Settings\AnimationSettings.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
@ -120,13 +116,14 @@
|
|||
<Content Include="Defs\AnimationDefs\Animations_Multi.xml" />
|
||||
<Content Include="Defs\AnimationDefs\Animations_vanilla.xml" />
|
||||
<Content Include="Defs\AnimationDefs\Animations_Vanilla2.xml" />
|
||||
<Content Include="Defs\JobDefs\Jobs_SexForAnim.xml" />
|
||||
<Content Include="Defs\MainTabDefs\MainButtonDef.xml" />
|
||||
<Content Include="Defs\SoundDefs\Sounds_Sex.xml" />
|
||||
<Content Include="LoadFolders.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="1.3\Assemblies\" />
|
||||
<Folder Include="Defs\JobDefs\" />
|
||||
<Folder Include="Source\JobDrivers\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -1,89 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using System;
|
||||
using rjw;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
public class JobDriver_SexBaseRecieverLovedForAnimation : JobDriver_SexBaseReciever {
|
||||
|
||||
public readonly TargetIndex ipartner = TargetIndex.A;
|
||||
public readonly TargetIndex ibed = TargetIndex.B;
|
||||
|
||||
public override bool TryMakePreToilReservations(bool errorOnFailed) {
|
||||
|
||||
return base.TryMakePreToilReservations(errorOnFailed);
|
||||
}
|
||||
|
||||
protected override IEnumerable<Toil> MakeNewToils() {
|
||||
|
||||
|
||||
setup_ticks();
|
||||
|
||||
float partner_ability = xxx.get_sex_ability(Partner);
|
||||
|
||||
// More/less hearts based on partner ability.
|
||||
if (partner_ability < 0.8f)
|
||||
ticks_between_thrusts += 100;
|
||||
else if (partner_ability > 2.0f)
|
||||
ticks_between_thrusts -= 25;
|
||||
|
||||
// More/less hearts based on opinion.
|
||||
if (pawn.relations.OpinionOf(Partner) < 0)
|
||||
ticks_between_hearts += 50;
|
||||
else if (pawn.relations.OpinionOf(Partner) > 60)
|
||||
ticks_between_hearts -= 25;
|
||||
|
||||
|
||||
parteners.Add(Partner);// add job starter, so this wont fail, before Initiator starts his job
|
||||
//--Log.Message("[RJW]JobDriver_GettinLoved::MakeNewToils is called");
|
||||
|
||||
this.FailOnDespawnedOrNull(ipartner);
|
||||
this.FailOn(() => !Partner.health.capacities.CanBeAwake);
|
||||
this.FailOn(() => pawn.Drafted);
|
||||
this.KeepLyingDown(ibed);
|
||||
yield return Toils_Reserve.Reserve(ipartner, 1, 0);
|
||||
yield return Toils_Reserve.Reserve(ibed, Bed.SleepingSlotsCount, 0);
|
||||
|
||||
Toil get_loved = new Toil();
|
||||
get_loved.FailOn(() => {
|
||||
|
||||
for (int i = 0; i < parteners.Count; i++)
|
||||
{
|
||||
if (parteners[i].CurJobDef != DefDatabase<JobDef>.GetNamed("JoinInBedAnimation", true))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
});
|
||||
get_loved.defaultCompleteMode = ToilCompleteMode.Never;
|
||||
get_loved.socialMode = RandomSocialMode.Off;
|
||||
get_loved.handlingFacing = true;
|
||||
get_loved.AddPreTickAction(delegate {
|
||||
if (pawn.IsHashIntervalTick(ticks_between_hearts))
|
||||
FleckMaker.ThrowMetaIcon(pawn.Position, pawn.Map, FleckDefOf.Heart);
|
||||
|
||||
});
|
||||
get_loved.AddEndCondition(() =>
|
||||
{
|
||||
if (parteners.Count <= 0)
|
||||
{
|
||||
return JobCondition.Succeeded;
|
||||
}
|
||||
return JobCondition.Ongoing;
|
||||
|
||||
});
|
||||
get_loved.AddFinishAction(delegate {
|
||||
if (xxx.is_human(pawn))
|
||||
pawn.Drawer.renderer.graphics.ResolveApparelGraphics();
|
||||
});
|
||||
yield return get_loved;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,93 +0,0 @@
|
|||
using RimWorld;
|
||||
using rjw;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
class JobDriver_SexCasualForAnimation : JobDriver_SexBaseInitiator {
|
||||
|
||||
public readonly TargetIndex ipartner = TargetIndex.A;
|
||||
public readonly TargetIndex ibed = TargetIndex.B;
|
||||
|
||||
public override bool TryMakePreToilReservations(bool errorOnFailed) {
|
||||
return pawn.Reserve(Target, job, xxx.max_rapists_per_prisoner, 0, null, errorOnFailed);
|
||||
}
|
||||
|
||||
protected override IEnumerable<Toil> MakeNewToils() {
|
||||
setup_ticks();
|
||||
this.FailOnDespawnedOrNull(ipartner);
|
||||
this.FailOnDespawnedOrNull(ibed);
|
||||
this.FailOn(() => !Partner.health.capacities.CanBeAwake);
|
||||
|
||||
yield return Toils_Reserve.Reserve(ipartner, xxx.max_rapists_per_prisoner, 0, null);
|
||||
|
||||
Toil goToPawnInBed = Toils_Goto.GotoThing(ipartner, PathEndMode.OnCell);
|
||||
goToPawnInBed.FailOn(() => !RestUtility.InBed(Partner) && Partner.CurJobDef != DefDatabase<JobDef>.GetNamed("GettinLovedAnimation") && !xxx.in_same_bed(Partner, pawn));
|
||||
|
||||
yield return goToPawnInBed;
|
||||
|
||||
|
||||
Toil startPartnerSex = new Toil();
|
||||
startPartnerSex.initAction = delegate {
|
||||
|
||||
if(Partner.CurJobDef != DefDatabase<JobDef>.GetNamed("GettinLovedAnimation")) // allows threesomes
|
||||
{
|
||||
Job gettinLovedJob = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("GettinLovedAnimation"), pawn, Bed); // new gettin loved toil that wakes up the pawn goes here
|
||||
|
||||
Partner.jobs.jobQueue.EnqueueFirst(gettinLovedJob);
|
||||
Partner.jobs.EndCurrentJob(JobCondition.InterruptForced);
|
||||
}
|
||||
|
||||
};
|
||||
yield return startPartnerSex;
|
||||
|
||||
Toil sexToil = new Toil();
|
||||
sexToil.FailOn(() => (Partner.CurJobDef == null) || Partner.CurJobDef != DefDatabase<JobDef>.GetNamed("GettinLovedAnimation", true)); //partner jobdriver is not sexbaserecieverlovedforanim
|
||||
sexToil.socialMode = RandomSocialMode.Off;
|
||||
sexToil.defaultCompleteMode = ToilCompleteMode.Never;
|
||||
sexToil.handlingFacing = true;
|
||||
sexToil.initAction = delegate {
|
||||
|
||||
usedCondom = (CondomUtility.TryUseCondom(base.pawn) || CondomUtility.TryUseCondom(Partner));
|
||||
Start();
|
||||
};
|
||||
|
||||
sexToil.AddPreTickAction(delegate {
|
||||
|
||||
if(!Partner.TryGetComp<CompBodyAnimator>().isAnimating)
|
||||
{
|
||||
pawn.TryGetComp<CompBodyAnimator>().isAnimating = false;
|
||||
}
|
||||
|
||||
if(Gen.IsHashIntervalTick(pawn, ticks_between_hearts)) {
|
||||
FleckMaker.ThrowMetaIcon(pawn.Position, pawn.Map, FleckDefOf.Heart);
|
||||
}
|
||||
SexTick(pawn, Partner);
|
||||
SexUtility.reduce_rest(Partner);
|
||||
SexUtility.reduce_rest(pawn, 2);
|
||||
if (ticks_left <= 0)
|
||||
ReadyForNextToil();
|
||||
|
||||
});
|
||||
sexToil.AddFinishAction(delegate {
|
||||
|
||||
End();
|
||||
|
||||
});
|
||||
yield return sexToil;
|
||||
|
||||
Toil finish = new Toil();
|
||||
finish.initAction = delegate {
|
||||
SexUtility.ProcessSex(pawn, Partner, usedCondom, isRape, isCoreLovin: false, isWhoring, sexType);
|
||||
};
|
||||
finish.defaultCompleteMode = ToilCompleteMode.Instant;
|
||||
yield return finish;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Reflection.Emit;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using Verse;
|
||||
using AlienRace;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
[HarmonyPatch(typeof(AlienRace.HarmonyPatches), "DrawAddons")]
|
||||
public static class HarmonyPatch_AlienRace {
|
||||
|
||||
|
||||
|
||||
public static void RenderHeadAddonInAnimation(Mesh mesh, Vector3 loc, Quaternion quat, Material mat, bool drawNow, Graphic graphic, AlienPartGenerator.BodyAddon bodyAddon, Vector3 v, float num, Vector3 headOffset, Pawn pawn, PawnRenderFlags renderFlags)
|
||||
{
|
||||
|
||||
CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
if (!renderFlags.FlagSet(PawnRenderFlags.Portrait) && pawnAnimator.isAnimating && (bodyAddon.drawnInBed || bodyAddon.alignWithHead))
|
||||
{
|
||||
|
||||
Quaternion headQuatInAnimation = Quaternion.AngleAxis(pawnAnimator.headAngle, Vector3.up);
|
||||
Rot4 headRotInAnimation = pawnAnimator.headFacing;
|
||||
Vector3 headPositionInAnimation = pawnAnimator.getPawnHeadPosition() - pawn.Drawer.renderer.BaseHeadOffsetAt(pawnAnimator.headFacing).RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: headQuatInAnimation)) * 2f * 57.29578f);
|
||||
|
||||
Log.Message(bodyAddon.path + " " + bodyAddon.inFrontOfBody.ToStringSafe());
|
||||
headPositionInAnimation.y += bodyAddon.inFrontOfBody ? 1f : -1f;
|
||||
|
||||
GenDraw.DrawMeshNowOrLater(mesh: graphic.MeshAt(rot: headRotInAnimation), loc: headPositionInAnimation + (bodyAddon.alignWithHead ? headOffset : Vector3.zero) + v.RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: headQuatInAnimation)) * 2f * 57.29578f),
|
||||
quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * headQuatInAnimation, mat: graphic.MatAt(rot: pawnAnimator.headFacing), drawNow: drawNow);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
GenDraw.DrawMeshNowOrLater(mesh, loc, quat, mat, drawNow);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
|
||||
{
|
||||
List<CodeInstruction> ins = instructions.ToList();
|
||||
for (int i = 0; i < ins.Count; i++)
|
||||
{
|
||||
|
||||
Type[] type = new Type[] { typeof(Mesh), typeof(Vector3), typeof(Quaternion), typeof(Material), typeof(bool) };
|
||||
|
||||
|
||||
if (ins[i].OperandIs(AccessTools.Method(typeof(GenDraw), "DrawMeshNowOrLater", type)))
|
||||
{
|
||||
|
||||
yield return new CodeInstruction(OpCodes.Ldloc, (object)7); //graphic
|
||||
yield return new CodeInstruction(OpCodes.Ldloc, (object)4); //bodyAddon
|
||||
yield return new CodeInstruction(OpCodes.Ldloc, (object)5); //offsetVector/AddonOffset (v)
|
||||
yield return new CodeInstruction(OpCodes.Ldloc, (object)6); //num
|
||||
yield return new CodeInstruction(OpCodes.Ldarg, (object)2); //headOffset
|
||||
yield return new CodeInstruction(OpCodes.Ldarg, (object)3); //pawn
|
||||
yield return new CodeInstruction(OpCodes.Ldarg, (object)0); //renderflags
|
||||
|
||||
yield return new CodeInstruction(OpCodes.Call, AccessTools.DeclaredMethod(typeof(HarmonyPatch_AlienRace), "RenderHeadAddonInAnimation"));
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
yield return ins[i];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(PawnGraphicSet), "ResolveApparelGraphics")]
|
||||
public static class HarmonyPatch_ResolveApparelGraphics
|
||||
{
|
||||
public static bool Prefix(ref Pawn ___pawn)
|
||||
{
|
||||
|
||||
if (___pawn.TryGetComp<CompBodyAnimator>() != null && ___pawn.TryGetComp<CompBodyAnimator>().isAnimating)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,87 +0,0 @@
|
|||
/*
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using rjw;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
using System.Reflection.Emit;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
[StaticConstructorOnStartup]
|
||||
public static class HarmonyPatch_CSL {
|
||||
static HarmonyPatch_CSL() {
|
||||
try {
|
||||
((Action)(() => {
|
||||
if (LoadedModManager.RunningModsListForReading.Any(x => x.Name == "Children, school and learning")) {
|
||||
|
||||
(new Harmony("rjw")).Patch(AccessTools.Method(AccessTools.TypeByName("Children.PawnRenderer_RenderPawnInternal_Patch"), "RenderPawnInternalScaled"),
|
||||
prefix: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_CSL), "Prefix_CSL")),
|
||||
transpiler: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_CSL), "Transpiler_CSL")));
|
||||
}
|
||||
}))();
|
||||
}
|
||||
catch (TypeLoadException ex) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static void Prefix_CSL(PawnRenderer __instance, Pawn pawn, ref Vector3 rootLoc, ref float angle, bool renderBody, ref Rot4 bodyFacing, ref Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump, bool invisible) {
|
||||
|
||||
PawnGraphicSet graphics = __instance.graphics;
|
||||
CompBodyAnimator bodyAnim = pawn.TryGetComp<CompBodyAnimator>();
|
||||
|
||||
if (!graphics.AllResolved) {
|
||||
graphics.ResolveAllGraphics();
|
||||
}
|
||||
|
||||
|
||||
if (bodyAnim != null && bodyAnim.isAnimating && !portrait) {
|
||||
bodyAnim.tickGraphics(graphics);
|
||||
pawn.TryGetComp<CompBodyAnimator>().animatePawn(ref rootLoc, ref angle, ref bodyFacing, ref headFacing);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<CodeInstruction> Transpiler_CSL(IEnumerable<CodeInstruction> instructions) {
|
||||
|
||||
MethodInfo drawMeshNowOrLater = AccessTools.Method(typeof(GenDraw), "DrawMeshNowOrLater");
|
||||
FieldInfo headGraphic = AccessTools.Field(typeof(PawnGraphicSet), "headGraphic");
|
||||
|
||||
|
||||
List<CodeInstruction> codes = instructions.ToList();
|
||||
bool forHead = true;
|
||||
for (int i = 0; i < codes.Count(); i++) {
|
||||
|
||||
//Instead of calling drawmeshnoworlater, add pawn to the stack and call my special static method
|
||||
if (codes[i].OperandIs(drawMeshNowOrLater) && forHead) {
|
||||
|
||||
yield return new CodeInstruction(OpCodes.Ldarg_0);
|
||||
yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.DeclaredField(typeof(PawnRenderer), "pawn"));
|
||||
yield return new CodeInstruction(OpCodes.Ldarg_2);
|
||||
yield return new CodeInstruction(OpCodes.Call, AccessTools.DeclaredMethod(typeof(AnimationUtility), nameof(AnimationUtility.RenderPawnHeadMeshInAnimation), new Type[] { typeof(Mesh), typeof(Vector3), typeof(Quaternion), typeof(Material), typeof(bool), typeof(Pawn), typeof(float) }));
|
||||
|
||||
}
|
||||
//checking for if(graphics.headGraphic != null)
|
||||
else if (codes[i].opcode == OpCodes.Ldfld && codes[i].OperandIs(headGraphic)) {
|
||||
forHead = true;
|
||||
yield return codes[i];
|
||||
}
|
||||
//checking for if(renderbody)
|
||||
else if (codes[i].opcode == OpCodes.Ldarg_3) {
|
||||
forHead = false;
|
||||
yield return codes[i];
|
||||
}
|
||||
else {
|
||||
yield return codes[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}*/
|
|
@ -1,29 +0,0 @@
|
|||
using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
class HarmonyPatch_DontShaveYourHead {
|
||||
|
||||
[StaticConstructorOnStartup]
|
||||
public static class Patch_DontShaveYourHead {
|
||||
|
||||
static Patch_DontShaveYourHead() {
|
||||
try {
|
||||
((Action)(() =>
|
||||
{
|
||||
if (LoadedModManager.RunningModsListForReading.Any(x => x.Name == "Don't Shave Your Head 1.0")) {
|
||||
(new Harmony("rjw")).Patch(AccessTools.Method(AccessTools.TypeByName("DontShaveYourHead.Harmony_PawnRenderer"), "DrawHairReroute"), //typeof(ShowHair.Patch_PawnRenderer_RenderPawnInternal), nameof(ShowHair.Patch_PawnRenderer_RenderPawnInternal.Postfix)),
|
||||
transpiler: new HarmonyMethod(AccessTools.Method(typeof(Patch_ShowHairWithHats), "Transpiler")));
|
||||
}
|
||||
}))();
|
||||
}
|
||||
catch (TypeLoadException ex) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,104 +0,0 @@
|
|||
using HarmonyLib;
|
||||
using RimWorld;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Reflection.Emit;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using Verse;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
[StaticConstructorOnStartup]
|
||||
public static class Patch_FacialAnimation {
|
||||
|
||||
static Patch_FacialAnimation() {
|
||||
try {
|
||||
((Action)(() => {
|
||||
if (LoadedModManager.RunningModsListForReading.Any(x => x.Name == "[NL] Facial Animation - WIP")) {
|
||||
(new Harmony("rjw")).Patch(AccessTools.Method(AccessTools.TypeByName("FacialAnimation.DrawFaceGraphicsComp"), "DrawGraphics"),
|
||||
prefix: new HarmonyMethod(AccessTools.Method(typeof(Patch_FacialAnimation), "Prefix")));
|
||||
}
|
||||
}))();
|
||||
}
|
||||
catch (TypeLoadException ex) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static bool Prefix(ref Pawn ___pawn, ref Rot4 headFacing, ref Vector3 headOrigin, ref Quaternion quaternion, ref bool portrait) {
|
||||
|
||||
CompBodyAnimator bodyAnim = ___pawn.TryGetComp<CompBodyAnimator>();
|
||||
|
||||
if (bodyAnim != null && bodyAnim.isAnimating && !portrait) {
|
||||
|
||||
headFacing = bodyAnim.headFacing;
|
||||
headOrigin = new Vector3(bodyAnim.getPawnHeadPosition().x, headOrigin.y, bodyAnim.getPawnHeadPosition().z);
|
||||
quaternion = Quaternion.AngleAxis(bodyAnim.headAngle, Vector3.up);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
public static List<string> rjwLovinDefNames = new List<string>{
|
||||
"Lovin",
|
||||
"Quickie",
|
||||
"GettingQuickie",
|
||||
"JoinInBed",
|
||||
"JoinInBedAnimation",
|
||||
"GettinLovedAnimation",
|
||||
"GettinLoved",
|
||||
"GettinLicked",
|
||||
"GettinSucked",
|
||||
"GettinRaped",
|
||||
"ViolateCorpse",
|
||||
"RJW_Masturbate",
|
||||
"GettinBred",
|
||||
"Breed",
|
||||
"RJW_Mate",
|
||||
"Bestiality",
|
||||
"BestialityForFemale",
|
||||
"StruggleInBondageGear",
|
||||
"WhoreIsServingVisitors",
|
||||
"UseFM"
|
||||
};
|
||||
|
||||
public static List<string> rjwRapeDefNames = new List<string> {
|
||||
"RapeComfortPawn",
|
||||
"RandomRape",
|
||||
"RapeEnemy"
|
||||
};
|
||||
|
||||
public static bool Prefix_IsSameA(JobDef job, string ___jobDef, ref bool __result) {
|
||||
|
||||
if(___jobDef != null && ___jobDef == "Lovin" && job?.defName != null && rjwLovinDefNames.Contains(job?.defName)) {
|
||||
__result = true;
|
||||
return false;
|
||||
}
|
||||
else if (___jobDef != null && ___jobDef == "Wait_Combat" && job?.defName != null && rjwRapeDefNames.Contains(job?.defName)) {
|
||||
__result = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool Prefix_IsSameB(string jobName, string ___jobDef, ref bool __result) {
|
||||
|
||||
if (___jobDef != null && ___jobDef == "Lovin" && jobName != null && rjwLovinDefNames.Contains(jobName)) {
|
||||
__result = true;
|
||||
return false;
|
||||
}
|
||||
if (___jobDef != null && ___jobDef == "Wait_Combat" && jobName != null && rjwRapeDefNames.Contains(jobName)) {
|
||||
__result = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
using HarmonyLib;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Rimworld_Animations
|
||||
{
|
||||
[HarmonyPatch(typeof(PawnUtility), "GetPosture")]
|
||||
public static class HarmonyPatch_SetPawnLaying
|
||||
{
|
||||
|
||||
public static bool Prefix(Pawn p, ref PawnPosture __result)
|
||||
{
|
||||
if(p.TryGetComp<CompBodyAnimator>().isAnimating)
|
||||
{
|
||||
__result = PawnPosture.LayingOnGroundNormal;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Reflection.Emit;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using Verse;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
[StaticConstructorOnStartup]
|
||||
public static class Patch_ShowHairWithHats {
|
||||
|
||||
static Patch_ShowHairWithHats() {
|
||||
try {
|
||||
((Action)(() =>
|
||||
{
|
||||
if (LoadedModManager.RunningModsListForReading.Any(x => x.Name == "[KV] Show Hair With Hats or Hide All Hats - 1.1")) {
|
||||
(new Harmony("rjw")).Patch(AccessTools.Method(AccessTools.TypeByName("ShowHair.Patch_PawnRenderer_RenderPawnInternal"), "Postfix"), //typeof(ShowHair.Patch_PawnRenderer_RenderPawnInternal), nameof(ShowHair.Patch_PawnRenderer_RenderPawnInternal.Postfix)),
|
||||
transpiler: new HarmonyMethod(AccessTools.Method(typeof(Patch_ShowHairWithHats), "Transpiler")));
|
||||
}
|
||||
}))();
|
||||
}
|
||||
catch (TypeLoadException ex) { }
|
||||
}
|
||||
|
||||
|
||||
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) {
|
||||
|
||||
MethodInfo drawMeshNowOrLater = AccessTools.Method(typeof(GenDraw), "DrawMeshNowOrLater");
|
||||
|
||||
List<CodeInstruction> codes = instructions.ToList();
|
||||
for (int i = 0; i < codes.Count(); i++) {
|
||||
|
||||
//Instead of calling drawmeshnoworlater, add pawn to the stack and call my special static method
|
||||
if (codes[i].OperandIs(drawMeshNowOrLater)) {
|
||||
|
||||
yield return new CodeInstruction(OpCodes.Ldarg_0);
|
||||
yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.DeclaredField(typeof(PawnRenderer), "pawn"));
|
||||
yield return new CodeInstruction(OpCodes.Call, AccessTools.DeclaredMethod(typeof(AnimationUtility), nameof(AnimationUtility.RenderPawnHeadMeshInAnimation), new Type[] { typeof(Mesh), typeof(Vector3), typeof(Quaternion), typeof(Material), typeof(bool), typeof(Pawn) }));
|
||||
|
||||
}
|
||||
else {
|
||||
yield return codes[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using rjw;
|
||||
using System.Reflection.Emit;
|
||||
using Verse.AI;
|
||||
|
||||
namespace Rimworld_Animations
|
||||
{
|
||||
|
||||
[HarmonyPatch(typeof(xxx), "in_same_bed")]
|
||||
public static class HarmonyPatch_JobDriver_InSameBedPatch
|
||||
{
|
||||
|
||||
public static bool Prefix(Pawn partner, ref bool __result)
|
||||
{
|
||||
|
||||
if(partner != null && partner.CurJobDef == xxx.casual_sex)
|
||||
{
|
||||
__result = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(JobDriver_JoinInBed), "MakeNewToils")]
|
||||
public static class HarmonyPatch_JobDriver_JoinInBed
|
||||
{
|
||||
|
||||
public static void Postfix(JobDriver_JoinInBed __instance, ref IEnumerable<Toil> __result)
|
||||
{
|
||||
|
||||
var toils = __result.ToList();
|
||||
|
||||
Toil goToPawnInBed = Toils_Goto.GotoThing(__instance.iTarget, PathEndMode.OnCell);
|
||||
goToPawnInBed.FailOn(() => !RestUtility.InBed(__instance.Partner) && __instance.Partner.CurJobDef != xxx.gettin_loved && !xxx.in_same_bed(__instance.Partner, __instance.pawn));
|
||||
|
||||
toils[1] = goToPawnInBed;
|
||||
|
||||
|
||||
Toil startPartnerSex = new Toil();
|
||||
startPartnerSex.initAction = delegate {
|
||||
|
||||
|
||||
if (!(__instance.Partner.jobs.curDriver is JobDriver_SexBaseReciever)) // allows threesomes
|
||||
{
|
||||
Job gettinLovedJob = JobMaker.MakeJob(xxx.gettin_loved, __instance.pawn, __instance.Bed); // new gettin loved toil that wakes up the pawn goes here
|
||||
__instance.Partner.jobs.jobQueue.EnqueueFirst(gettinLovedJob);
|
||||
__instance.Partner.jobs.EndCurrentJob(JobCondition.InterruptForced);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
toils[2] = startPartnerSex;
|
||||
|
||||
toils[3].AddPreTickAction(() =>
|
||||
{
|
||||
if (!__instance.Partner.TryGetComp<CompBodyAnimator>().isAnimating)
|
||||
{
|
||||
__instance.pawn.TryGetComp<CompBodyAnimator>().isAnimating = false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
__result = toils.AsEnumerable();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -25,30 +25,10 @@ namespace Rimworld_Animations {
|
|||
|
||||
Building_Bed bed = __instance.Bed;
|
||||
|
||||
/*
|
||||
if (__instance is JobDriver_BestialityForFemale)
|
||||
bed = (__instance as JobDriver_BestialityForFemale).Bed;
|
||||
else if (__instance is JobDriver_WhoreIsServingVisitors) {
|
||||
bed = (__instance as JobDriver_WhoreIsServingVisitors).Bed;
|
||||
}
|
||||
else if (__instance is JobDriver_SexCasualForAnimation) {
|
||||
bed = (__instance as JobDriver_SexCasualForAnimation).Bed;
|
||||
}
|
||||
else if (__instance is JobDriver_Masturbate)
|
||||
bed = (__instance as JobDriver_Masturbate).Bed;
|
||||
else if (__instance is JobDriver_Rape)
|
||||
bed = (__instance?.Partner?.jobs?.curDriver as JobDriver_Sex)?.Bed;
|
||||
|
||||
*/
|
||||
|
||||
if ((__instance.Target as Pawn)?.jobs?.curDriver is JobDriver_SexBaseReciever) {
|
||||
|
||||
Pawn Target = __instance.Target as Pawn;
|
||||
|
||||
if (!(Target.jobs.curDriver as JobDriver_SexBaseReciever).parteners.Contains(pawn)) {
|
||||
(Target.jobs.curDriver as JobDriver_SexBaseReciever).parteners.Add(pawn);
|
||||
}
|
||||
|
||||
bool quickie = (__instance is JobDriver_SexQuick) && AnimationSettings.fastAnimForQuickie;
|
||||
|
||||
int preAnimDuration = __instance.duration;
|
|
@ -0,0 +1,40 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using rjw;
|
||||
using System.Reflection.Emit;
|
||||
|
||||
namespace Rimworld_Animations
|
||||
{
|
||||
|
||||
[HarmonyPatch(typeof(JobDriver_SexBaseRecieverLoved), "MakeSexToil")]
|
||||
public static class HarmonyPatch_JobDriver_SexBaseReceiverLoved
|
||||
{
|
||||
|
||||
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> codeInstructions)
|
||||
{
|
||||
|
||||
var ins = codeInstructions.ToList();
|
||||
for(int i = 0; i < ins.Count; i++)
|
||||
{
|
||||
if(i + 13 < ins.Count && ins[i + 13].opcode == OpCodes.Call && ins[i + 13].OperandIs(AccessTools.DeclaredMethod(typeof(Toils_LayDown), "LayDown"))) {
|
||||
|
||||
ins.RemoveRange(i, 14);
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
yield return ins[i];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using rjw;
|
||||
using Verse.AI;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
|
||||
[HarmonyPatch(typeof(JobGiver_DoLovin), "TryGiveJob")]
|
||||
public static class HarmonyPatch_DoLovinAnimationPatch {
|
||||
|
||||
public static void Postfix(ref Pawn pawn, ref Job __result) {
|
||||
|
||||
if(__result != null) {
|
||||
Pawn partnerInMyBed = LovePartnerRelationUtility.GetPartnerInMyBed(pawn);
|
||||
RestUtility.WakeUp(pawn);
|
||||
__result = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("JoinInBedAnimation", true), partnerInMyBed, partnerInMyBed.CurrentBed());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
/*
|
||||
* Todo: Ask to make SemenSplatch and DrawSemen public
|
||||
*
|
||||
*
|
||||
* using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using rjw;
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
[HarmonyPatch("DrawSemen")]
|
||||
public static class HarmonyPatch_DrawSemen {
|
||||
|
||||
public static void Prefix(ref Dictionary<string, SemenSplatch>) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}*/
|
|
@ -1,68 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using rjw;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using RimWorld;
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
[HarmonyPatch(typeof(JobGiver_JoinInBed), "TryGiveJob")]
|
||||
public static class HarmonyPatch_JoinInBedGiveJob {
|
||||
|
||||
public static bool Prefix(ref Job __result, ref Pawn pawn) {
|
||||
|
||||
__result = null;
|
||||
|
||||
if (!RJWHookupSettings.HookupsEnabled)
|
||||
return false;
|
||||
|
||||
if (pawn.Drafted)
|
||||
return false;
|
||||
|
||||
if (!SexUtility.ReadyForHookup(pawn))
|
||||
return false;
|
||||
|
||||
// We increase the time right away to prevent the fairly expensive check from happening too frequently
|
||||
SexUtility.IncreaseTicksToNextHookup(pawn);
|
||||
|
||||
// If the pawn is a whore, or recently had sex, skip the job unless they're really horny
|
||||
if (!xxx.is_frustrated(pawn) && (xxx.is_whore(pawn) || !SexUtility.ReadyForLovin(pawn)))
|
||||
return false;
|
||||
|
||||
// This check attempts to keep groups leaving the map, like guests or traders, from turning around to hook up
|
||||
if (pawn.mindState?.duty?.def == DutyDefOf.TravelOrLeave) {
|
||||
// TODO: Some guest pawns keep the TravelOrLeave duty the whole time, I think the ones assigned to guard the pack animals.
|
||||
// That's probably ok, though it wasn't the intention.
|
||||
if (RJWSettings.DebugLogJoinInBed) ModLog.Message($"JoinInBed.TryGiveJob:({xxx.get_pawnname(pawn)}): has TravelOrLeave, no time for lovin [ANIM JOBGIVER]!");
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((pawn.CurJob == null || pawn.CurJob.def == JobDefOf.LayDown) && CasualSex_Helper.CanHaveSex(pawn)) {
|
||||
//--Log.Message(" finding partner");
|
||||
Pawn partner = CasualSex_Helper.find_partner(pawn, pawn.Map, bedsex: true);
|
||||
|
||||
//--Log.Message(" checking partner");
|
||||
if (partner == null)
|
||||
return false;
|
||||
|
||||
// Can never be null, since find checks for bed.
|
||||
Building_Bed bed = partner.CurrentBed();
|
||||
|
||||
// Interrupt current job.
|
||||
if (pawn.CurJob != null && pawn.jobs.curDriver != null)
|
||||
pawn.jobs.curDriver.EndJobWith(JobCondition.InterruptForced);
|
||||
|
||||
__result = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("JoinInBedAnimation", true), partner, bed);
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using RimWorld;
|
||||
using Verse.AI;
|
||||
using rjw;
|
||||
using HarmonyLib;
|
||||
using Verse;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
|
||||
[HarmonyPatch(typeof(Pawn_JobTracker), "TryTakeOrderedJob")]
|
||||
class HarmonyPatch_PlayAnimJoinInBedRMB {
|
||||
public static void Prefix(ref Job job) {
|
||||
if(job.def == xxx.casual_sex) {
|
||||
if (AnimationSettings.debugMode || RJWSettings.DevMode)
|
||||
Log.Message("Replacing vanilla RJW JoinInBed JobDriver for animation JobDriver");
|
||||
job = new Job(DefDatabase<JobDef>.GetNamed("JoinInBedAnimation", true), job.targetA, job.targetB, job.targetC);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue