Jump to content
IGNORED

[Rimworld 1.3] RJW Animation Framework


c0ffeeeee

Recommended Posts

7 minutes ago, platinumspoons said:

Also, mods that change RenderPawnInternal may not work, so hair with hats, HumanoidAlienRaces, etc. It's still in an early state and I plan on adding compatibility later.

HumanoidAlienRaces was the problem, thought it was compatible, it seems that for now I will play with humans only, thanks for the hard work and the fast answer anyway, Platinum

Link to comment
10 minutes ago, Algen said:

HumanoidAlienRaces was the problem, thought it was compatible, it seems that for now I will play with humans only, thanks for the hard work and the fast answer anyway, Platinum

Can confirm that it does work with Alien Races that don't use fancy renderers. Garam most certainly will break it though;

I can confirm because i've enabled the available animations for all my humanoid races on my end and it works fine!

Link to comment
13 minutes ago, red3dred said:

Can confirm that it does work with Alien Races that don't use fancy renderers. Garam most certainly will break it though;

I can confirm because i've enabled the available animations for all my humanoid races on my end and it works fine!

Oh really? Nice! Less work for me

Link to comment

Ed just updated RJW to 4.0.3. I would support making this a patcher for it, or work with Ed to integrate it into the next-ish update.

I would also like to see if it isn't already in this (because i'm not about to bork my savefile to test this) lesbian anims for pawns and animals, and if you haven't already made them, male pawn on female animal animation added. This is such a great step in the right direction for RJW.

Link to comment
41 minutes ago, wilderpuss said:

Ed just updated RJW to 4.0.3. I would support making this a patcher for it, or work with Ed to integrate it into the next-ish update.

I would also like to see if it isn't already in this (because i'm not about to bork my savefile to test this) lesbian anims for pawns and animals, and if you haven't already made them, male pawn on female animal animation added. This is such a great step in the right direction for RJW.

Those are the next 2 things on my todo list :)

Link to comment

I just realized. If it is incompatible with Humanoid alien races because of the render internal, it is unlikely this would ever become part of RJW since there is a big overlap in use between those two mods. Speaking as someone in that overlap. Is there any way to bypass this incompatibility? Through either Harmony or patching?

Link to comment

So, pardon my lack of knowledge here, PlatinumSpoons, but i'd like to know more about some of the tags in your mod, and how it defines what is a valid position.


In the animationDefs, i see <stageIndex> but it is always 0 despite being the start, middle or climax. Is this just not used yet, or is it vestigial code from a previous update?

Also, i've looked through a few of the comps and module files, yet i don't see a readable table as for what kind of sex each animation belongs to, and where they should fit, to be allowed for use with "X" pawn kinds of "Y" genders.

Link to comment
Quote

In the animationDefs, i see <stageIndex> but it is always 0 despite being the start, middle or climax. Is this just not used yet, or is it vestigial code from a previous update?

I left stageIndex in there in case I wanted to have manual animation selecting, but currently it doesn't do anything.

Quote

Also, i've looked through a few of the comps and module files, yet i don't see a readable table as for what kind of sex each animation belongs to, and where they should fit, to be allowed for use with "X" pawn kinds of "Y" genders.

See AnimationUtility.TryFindAnimation()

Link to comment
5 hours ago, wilderpuss said:

I just realized. If it is incompatible with Humanoid alien races because of the render internal, it is unlikely this would ever become part of RJW since there is a big overlap in use between those two mods. Speaking as someone in that overlap. Is there any way to bypass this incompatibility? Through either Harmony or patching?

I'll probably write simple XML patches that adds your race's defName to the animations, and maybe some offsets to help align them properly if they're unusually sized. HAR full compatibility is a top priority for me, so don't worry!

Link to comment
11 hours ago, platinumspoons said:

I'll probably write simple XML patches that adds your race's defName to the animations, and maybe some offsets to help align them properly if they're unusually sized. HAR full compatibility is a top priority for me, so don't worry!

That sounds promising for compatibility and the likelyhood of integration into RJW core.

Do you really need to write one block for every single race, or would a simple "Defs/AlienRace.ThingDef_AlienRace/alienRace/..." string do the trick like with the 'Belts and accessory alien support' patcher mod?
If it requires the defname of every individual race, I can help out with that. I found a long list of those while inspecting some mod files last night. All I'd have to do is find that mod file again. At worst I'd have to dig through my workshop list.

Link to comment
29 minutes ago, platinumspoons said:

Ideally I'd just have a <li> list of every single thingdef name for each pawn. Then it's just a matter of patching each anim with that list.

Alright, well i would highly suggest trying the universal fix first, since most alien races tend to have roughly the same dimensions, largely because new race mod makers largely just copy from other's files. So the "Defs/AlienRace.ThingDef_AlienRace/..." thing serves as a one and done solution that seems to makes it forever compatible with any humanoid alien race mod, past, present and future without you or anyone else ever having to go in and manually add their own race to the long list.

However, IF that should not work. Here is the list out of the milkable colonist mod from this very forum. Appended with a few aliens i'm aware of that wasn't on that list at the moment.

 

Spoiler

<xpath>/Defs/AlienRace.ThingDef_AlienRace[
                         defName="Alien_Callistan" or
                         defName="Alien_Astoriel" or
                         defName="Fantasy_Goblin" or
                         defName="LotRD_DwarfStandardRace" or
                         defName="LotRE_ElfStandardRace" or
                         defName="LotRH_HobbitStandardRace" or
                         defName="Alien_Orassan" or
                         defName="RGK_Race_Ratty" or
                         defName="Ratkin" or
                         defName="Alien_Twilek" or
                         defName="Alien_Zabrak" or
                         defName="Avali" or
                         defName="Alien_Argonian" or
                         defName="Naga" or
                         defName="Alien_Asari_Base" or
                         defName="Alien_Eldar" or
                         defName="Alien_Kroot" or
                         defName="Alien_Ork" or
                         defName="Alien_Tau" or
                         defName="Alien_Vespid" or
                         defName="Alien_Terran" or
                         defName="Alien_Sororitas" or
                         defName="Alien_Salamander" or
                         defName="Alien_Astartes" or
                         defName="Alien_Guevesa" or
                         defName="Alien_Krieg" or
                         defName="Alien_Valhallan" or
                         defName="Alien_Ferrex" or
                         defName="Alien_Xenn" or
                         defName="Alien_Leeani" or
                         defName="Alien_Fennex" or
                         defName="Alien_Frijjid" or
                         defName="Alien_Gnoll" or
                         defName="Alien_Drow_Otto" or
                         defName="Alien_Mantodean" or
                         defName="Android1Tier" or
                         defName="Android2Tier" or
                         defName="Android3Tier" or
                         defName="Android4Tier" or
                         defName="Android5Tier" or
                         defName="Alien_Crystalloid" or
                         defName="Arachne" or
                         defName="Alien_Wolvx" or
                         defName="AFerian" or        
                         defName="Alien_Cutebold" or    
                         defName="Alien_Orc" or
                         defName="DesignerMatesXH" or
                         defName="ScaleManXH" or
                         defName="SoldiermorphXH" or
                         defName="WolfManXH" or
                         defName="Dragon_Kilhn" or
                         defName="Alien_Cassowary" or
                         defName="Alien_Chicken" or
                         defName="Alien_Dodo" or
                         defName="Alien_Owl" or
                         defName="Alien_Parrot" or
                         defName="Alien_Penguin" or
                         defName="Alien_Vulture" or
                         defName="DRNTF_Race" or
                         defName="Alien_ElderThing_Race_Standard" or
                         defName="StarWarsRaces_Twilek" or
                         defName="StarWarsRaces_Wookie" or
                         defName="StarWarsRaces_Ewok" or
                         defName="StarWarsRaces_Rodian" or    
                         defName="Apini" or
                         defName="Azuri" or                            
                         defName="AlienQuarian" or
                         defName="Alien_Yabil" or
                         defName="Alien_Equium" or
                         defName="BearMan" or
                         defName="CamelMan" or
                         defName="WolfMan" or
                         defName="ElephantMan" or
                         defName="ElkMan" or
                         defName="FoxMan" or
                         defName="GazelleMan" or
                         defName="LynxMan" or
                         defName="PigMan" or
                         defName="RaccoonMan" or
                         defName="WoW_BloodElf" or
                         defName="WoW_Forsaken" or
                         defName="WoW_HighElf" or
                         defName="WoW_Human" or
                         defName="WoW_NightElf" or
                         defName="WoW_Orc" or
                         defName="WoW_Troll" or
                         defName="KIJIN_Race" or
                         defName="Alien_Daemonette" or
                         defName="Alien_Slaaneshi" or
                         defName="Alien_SlaaPrince" or
                         defName="Alien_Dryad" or
                         defName="Alien_Skaven" or
                         defName="Alien_HornedSkaven" or
                         defName="Alien_SkavenStorm" or
                         defName="Alien_Hisa" or
                         defName="Alien_Kija" or
                         defName="RRY_Alien_Yautja" or
                         defName="Thrumbo_Race" or
                         defName="Avian" or
                         defName="BlueMagmaRace" or
                         defName="MagmaRace" or
                         defName="MGDragon_Race"]/comps</xpath>

 

 

(My additions)

Mantis race (or Lighter than fast)
                         defName="Alien_Mantis" or

 

Racc race mod
                         defName="Alien_Racc" or

 

Sergal gnolls and lions (or whatever its named)
                         defName="Alien_Frog" or
                         defName="Alien_SGnoll" or
                         defName="Alien_Lion" or
                         defName="Alien_Sergal" or
                         defName="Alien_StripedGnoll" or

 

Slither race
                         defName="SlitherRace" or

 

Playable Kobolds
                         defName="Alien_Kobold" or

 

O21 Race mods collection (Kobolds, goblins etc)
                         defName="O21_Alien_Kobold" or
                         defName="O21_Alien_Kobold" or

 

Various Warhammer mods not already on the list (Gor, Lizardment, Fimir)
                         defName="Alien_Bullgor" or
                         defName="Alien_Gor" or
                         defName="Alien_Ungor" or
                         defName="Races_Lizardman" or
                         defName="Alien_Dirach" or
                         defName="Alien_Fimm" or
                         defName="Alien_Meargh" or
                         defName="Alien_Shearl" or

 

Beta Humanoids:       (Beta Humanoids mod defs seem to do some weird stuff, like defining males and females. may or may not want to patch it. Additionally for NPC the only difference is the lack of the Player suffix, while tribal have an added _Tribal after Player.)
                         defName="BetaBearPlayer" or
                         defName="BetaCamelPlayer" or
                         defName="BetaElephantPlayer" or
                         defName="BetaElkPlayer_Male" or
                         defName="BetaElkPlayer_Female" or
                         defName="BetaGazellePlayer" or
                         defName="BetaLynxPlayer" or
                         defName="BetaHogPlayer" or
                         defName="BetaRaccoonPlayer" or
                         defName="BetaWolfPlayer" or
                         defName="BetaCrocPlayer" or

 

I believed i had another one, but turns out it just replaced the graphics for all humans with colorful kobold-like pawns.

 

That's all i can add out of my downloaded mods list. For a more comprehensive list, you would need more submissions from people.

Something else i'm curious about is, on the animal side of things, does it matter whether its vanilla or modded animals, or will they all use the same animations? Seems like RJW's animations function regardless, so my assumption would be yours would too.

Link to comment

403 RED:

 

Attempt to use string SoundEffect to refer to field soundEffect in type rjw.PawnKeyframe; xml tags are now case-sensitive. XML: <li><tickDuration>7</tickDuration><SoundEffect>Suck</SoundEffect><bodyAngle>0</bodyAngle><bodyOffsetX>0</bodyOffsetX><bodyOffsetZ>-0.290</bodyOffsetZ><bodyFacing>0</bodyFacing><headFacing>0</headFacing><headBob>-0.008</headBob></li>

 

 

Link to comment

You asked for input on what animations players want to see. I have no request for any single specific animations, but just would like to see "common" and "obvious" stuff covered first, NOT a dozen variations for the same race and hole, or anims for exotic animals before commonly used ones. So yeah, my only request is you focussing on coverage and most-bang-for-the-buck first.

 

Also, for horsies please remember that in 1.0 most people used the jenfalk mod, and some of us still have savegames with that horse running on 1.1. Shouldn't be much work anyways, once the vanilla horses are covered. At most it will just be applying some offset, and bam: Jenfalk horses supported.

Link to comment
51 minutes ago, juste95 said:

After your update I have some problems: The  sex animations don't start, if my female hero start the casual sex with a male. But it's works fine, if a male hero fucks a female pawn.

My latest commit, the extra stages to bj animation? That's very strange, I didn't change any of the way anims were selected, only some of the animation XMLs. Make sure your pawns are capable of fucking/being fucked, i.e. having the right genitalia. Are they only doing the generic thrusting animation, or are they frozen stiff?

Link to comment

It works as long as a male pawn is the active part, for example in hero mode or when I select the rape in direct control.

My female hero cannot start the animation anymore. If I select "have sex with xyz" with her, only the standard animation will be shown after the update.

 

EDIT: I tried a little more. "Having Sex" doesn't work as I said, I'm just seeing the standard RJW animation. If I choose rape, it works. But often the animation and the noted sex under the social-tab don't match. For example, the animation shows a blowjob, but under social-tab it says anal sex.

The problem only occurs when a female pawn initiates the sex. When a man initiates sex, everything seems to work smoothly.

 

Another thing: I think FemaleBB causes problems with the blowjob animation. Sometimes the Pawns' bodies are twisted; looks like a neck break or something :D

 

Link to comment

So, after some more thorough testing, i've seen several issues, and the issues with this mod compound pretty badly;

  • Animations can be interrupted sometimes, which leads to some really bad results. Things like animals nuzzling the actors, the actor being a animal that is being trained/fed, or the worst offender, saving the game during a animation.  --
  • -- The above lead to some really terrible behaviour; Pawns were stuck, visually, in the animation, but were still actually moving around normally, until one point the animation completely imploded and defaulted to showing their position as invisible, inside 0,0 (Bottom left corner). Then their AI started breaking afterwards, as they themselves thought they were there, pathing wasn't working, and social interactions were failing to proceed, mainly sex ones. (I've fixed this on my end several times by removing the animation data from the pawn in the save file)
  • Animations don't finish playing sometimes, and the act just finishes early. This is notable with raping downed pawns.
  • I don't understand the sound effect player. I've set several sounds to play in a animation i've extended, and yet, none of them play but one.
  • Animations don't line up with the act-- i know this is a nitpick as the mod is still very early in development, but if you make a hook to call which sex animation is being used and throw possible outcomes to RJW's main process, something you can probably work out with Ed, would be the best solution. EG: "Fellatio can only end up in Fellatio, Doggy can be both penetrations or DP."

 

So, my "complaints"/Suggestions;

  • These variables shouldn't be stored on the pawn data, just temporary and not deep-saved, so they reset when the game is reloaded, and prevents persistent issues. Would help a lot!
  • Animation hook from above; Not gonna quote myself again, that'd be repeating myself =V
  • Second actor (Sucker) for Fellatio has their body drawn behind the body of actor 1 (Sucked), that works poorly for pawn types that aren't humanoid (Animals mostly). This is probably easily fixable on your end.
  • Support for that one other face mod that doesn't fuck up pawn rendering is actually compatible with this (Albeit they revert to vanilla heads when you animate):
    https://steamcommunity.com/sharedfiles/filedetails/?id=1635901197
    That one actually has animations for loving in it by default, so hooking onto that would be neat.

 

Link to comment
16 hours ago, red3dred said:

So, after some more thorough testing, i've seen several issues, and the issues with this mod compound pretty badly;

  • Animations can be interrupted sometimes, which leads to some really bad results. Things like animals nuzzling the actors, the actor being a animal that is being trained/fed, or the worst offender, saving the game during a animation.  --
  • -- The above lead to some really terrible behaviour; Pawns were stuck, visually, in the animation, but were still actually moving around normally, until one point the animation completely imploded and defaulted to showing their position as invisible, inside 0,0 (Bottom left corner). Then their AI started breaking afterwards, as they themselves thought they were there, pathing wasn't working, and social interactions were failing to proceed, mainly sex ones. (I've fixed this on my end several times by removing the animation data from the pawn in the save file)
  • Animations don't finish playing sometimes, and the act just finishes early. This is notable with raping downed pawns.
  • I don't understand the sound effect player. I've set several sounds to play in a animation i've extended, and yet, none of them play but one.
  • Animations don't line up with the act-- i know this is a nitpick as the mod is still very early in development, but if you make a hook to call which sex animation is being used and throw possible outcomes to RJW's main process, something you can probably work out with Ed, would be the best solution. EG: "Fellatio can only end up in Fellatio, Doggy can be both penetrations or DP."

 

So, my "complaints"/Suggestions;

  • These variables shouldn't be stored on the pawn data, just temporary and not deep-saved, so they reset when the game is reloaded, and prevents persistent issues. Would help a lot!
  • Animation hook from above; Not gonna quote myself again, that'd be repeating myself =V
  • Second actor (Sucker) for Fellatio has their body drawn behind the body of actor 1 (Sucked), that works poorly for pawn types that aren't humanoid (Animals mostly). This is probably easily fixable on your end.
  • Support for that one other face mod that doesn't fuck up pawn rendering is actually compatible with this (Albeit they revert to vanilla heads when you animate):
    https://steamcommunity.com/sharedfiles/filedetails/?id=1635901197
    That one actually has animations for loving in it by default, so hooking onto that would be neat.

 

Thanks a ton for the feedback!

 

Ed is currently changing the way all the sex JobDrivers work, which is great because the jobdrivers are VERY spaghetti (look under JobDriver_Sex: ticks_left, duration, ticks_remaining... what's the difference...?), but means it's hard to work on figuring out when to call/stop animations, how to change the toil duration of each pawn for a new animation when everything keeps changing, etc. I can put in a check to my animation component to make sure that the pawn is currently doing a job involving sex, but ideally the JobDrivers will be well written enough that it doesn't need to make these checks every tick.

 

As for the sound effect player, each keyframe has a tag soundEffect which searches for a SoundDef with that name. I pretty much just copy/pasted the SoundDef format from RJW and the mod RJW - New Sounds, which you can find in rjw/Defs/SoundDefs. Currently you can only play one sound effect each keyframe. Also, make sure your AnimationDef has <sounds>true</sounds>.

 

Animations that reflect the sex act is planned. Just need more animations that suit each action, and then it's just a matter of using the rjwSextype enum in my AnimationDefs.

 

Also, the fellatio wasn't intended for pawns other than humanoids. I can add a fellatio animation in for quadrupeds and other animals, but they'd probably be another animation entirely.

Link to comment
1 hour ago, platinumspoons said:

Thanks a ton for the feedback!

Least i can do. Good to have someone that actually sees feedback and doesn't mock the users for it cough.

 

1 hour ago, platinumspoons said:

As for the sound effect player, each keyframe has a tag soundEffect which searches for a SoundDef with that name. I pretty much just copy/pasted the SoundDef format from RJW and the mod RJW - New Sounds, which you can find in rjw/Defs/SoundDefs. Currently you can only play one sound effect each keyframe. Also, make sure your AnimationDef has <sounds>true</sounds>.

Yeah i was extending the Fellatio animation on my end, and added 3 more stages, up to a total of 4, and the last bit (Climax) really irks me; It's probably that this sound in particular (Swallow) is so quiet i can't hear it, but there's a few others in between and i only ever hear the last two (Suck) and (Cum), despite the Cum sounds coming from the other actor instead of this one...
 

Spoiler

image.png.10fb9c100ed55960548fa8bd6202da95.pngimage.png.906dfcba1fa8ebeaf7e22b8db7320465.pngimage.png.072be3f05c9c1af9a683011dd2783c21.png+more

 

I also get some animation errors thrown at me during that part (Drawing curve with no points) but the animation continues anyway.

 

1 hour ago, platinumspoons said:

Also, the fellatio wasn't intended for pawns other than humanoids. I can add a fellatio animation in for quadrupeds and other animals, but they'd probably be another animation entirely.

Well, i got some humanoid animals (Monster Girls, plus a few others) and they kinda fall under the gap of "Animal but still humanoid enough to animate", which is why i noticed the issue.

Link to comment
34 minutes ago, red3dred said:

Least i can do. Good to have someone that actually sees feedback and doesn't mock the users for it cough.

 

Yeah i was extending the Fellatio animation on my end, and added 3 more stages, up to a total of 4, and the last bit (Climax) really irks me; It's probably that this sound in particular (Swallow) is so quiet i can't hear it, but there's a few others in between and i only ever hear the last two (Suck) and (Cum), despite the Cum sounds coming from the other actor instead of this one...
 

  Hide contents

image.png.10fb9c100ed55960548fa8bd6202da95.pngimage.png.906dfcba1fa8ebeaf7e22b8db7320465.pngimage.png.072be3f05c9c1af9a683011dd2783c21.png+more

 

I also get some animation errors thrown at me during that part (Drawing curve with no points) but the animation continues anyway.

 

Well, i got some humanoid animals (Monster Girls, plus a few others) and they kinda fall under the gap of "Animal but still humanoid enough to animate", which is why i noticed the issue.

Actually, I was going to remove the swallow sound effect and find a better gagging sound because it didn't sound too great (you could tell I ripped it from a public domain water-drinking clip lol), so for now it's placeholder.

 

Each AnimationStage uses SimpleCurves for each value, which lerps the values you've set between each tick. The animations need to start and end with all parameters. See under Animations_Beast--the dog animation needs headAngle, headFacing and headBob to be set at the beginning and end of the animation despite not being used.

 

Also, if you're adding more stages to the anims, I would absolutely love to see them if you're willing to share :)

Link to comment
9 minutes ago, platinumspoons said:

Actually, I was going to remove the swallow sound effect and find a better gagging sound because it didn't sound too great (you could tell I ripped it from a public domain water-drinking clip lol), so for now it's placeholder.

 

Each AnimationStage uses SimpleCurves for each value, which lerps the values you've set between each tick. The animations need to start and end with all parameters. See under Animations_Beast--the dog animation needs headAngle, headFacing and headBob to be set at the beginning and end of the animation despite not being used.

 

Also, if you're adding more stages to the anims, I would absolutely love to see them if you're willing to share :)

Very well, lemme add a very big spoiler text full of code because oof.

Spoiler

<animationStages>
      <li>
        <stageName>Slow_Suck</stageName>
        <isLooping>true</isLooping>
        <playTimeTicks>1200</playTimeTicks>
        <stageIndex>0</stageIndex>
        <animationClips>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>59</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>59</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>59</tickDuration>
                <bodyAngle></bodyAngle>
                <headAngle>6</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>59</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <tickDuration>59</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.008</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
        </animationClips>
      </li>
      <li>
        <stageName>Suck</stageName>
        <isLooping>true</isLooping>
        <playTimeTicks>600</playTimeTicks>
        <stageIndex>0</stageIndex>
        <animationClips>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>15</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>-15</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>6</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>-6</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.008</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
        </animationClips>
      </li>
      <li>
        <stageName>PrepForCum</stageName>
        <isLooping>true</isLooping>
        <playTimeTicks>60</playTimeTicks>
        <stageIndex>0</stageIndex>
        <animationClips>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>10</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>41</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>15</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0.0</headBob>
              </li>
              <li>
                <tickDuration>9</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.02</headBob>
              </li>
            </keyframes>
          </li>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>10</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <tickDuration>41</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.008</headBob>
              </li>
              <li>
                <tickDuration>9</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
        </animationClips>
      </li>
      <li>
        <stageName>Cum</stageName>
        <isLooping>false</isLooping>
        <playTimeTicks>250</playTimeTicks>
        <stageIndex>0</stageIndex>
        <animationClips>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>50</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0.0</headBob>
              </li>
              <li>
                <soundEffect>Swallow</soundEffect>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.254</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.03</headBob>
              </li>
              <li>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.01</headBob>
              </li>
              <li>
                <tickDuration>40</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.254</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0.0</headBob>
              </li>
              <li>
                <soundEffect>Swallow</soundEffect>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.03</headBob>
              </li>
              <li>
                <soundEffect>Swallow</soundEffect>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.254</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.01</headBob>
              </li>
              <li>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.03</headBob>
              </li>
              <li>
                <soundEffect>Swallow</soundEffect>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.254</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.01</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>40</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
            </keyframes>
          </li>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <soundEffect>Cum</soundEffect>
                <tickDuration>210</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.012</headBob>
              </li>
              <li>
                <tickDuration>40</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.008</headBob>
              </li>
            </keyframes>
          </li>
        </animationClips>
      </li>

    </animationStages>

 

Other additions i made were just a couple tailored cum sounds, to add a slight bit of variety, and tried to increased the volume of the Swallow sound effects, apparently didn't go too well.

Link to comment
On 3/23/2020 at 5:52 PM, red3dred said:

Very well, lemme add a very big spoiler text full of code because oof.

  Reveal hidden contents


<animationStages>
      <li>
        <stageName>Slow_Suck</stageName>
        <isLooping>true</isLooping>
        <playTimeTicks>1200</playTimeTicks>
        <stageIndex>0</stageIndex>
        <animationClips>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>59</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>59</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>59</tickDuration>
                <bodyAngle></bodyAngle>
                <headAngle>6</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>59</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>15</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <tickDuration>59</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.008</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
        </animationClips>
      </li>
      <li>
        <stageName>Suck</stageName>
        <isLooping>true</isLooping>
        <playTimeTicks>600</playTimeTicks>
        <stageIndex>0</stageIndex>
        <animationClips>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>15</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>-15</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>6</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>

              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>-6</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>8</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <tickDuration>29</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.008</headBob>
              </li>
              <li>
                <tickDuration>1</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
        </animationClips>
      </li>
      <li>
        <stageName>PrepForCum</stageName>
        <isLooping>true</isLooping>
        <playTimeTicks>60</playTimeTicks>
        <stageIndex>0</stageIndex>
        <animationClips>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>10</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>41</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>15</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0.0</headBob>
              </li>
              <li>
                <tickDuration>9</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.02</headBob>
              </li>
            </keyframes>
          </li>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <tickDuration>10</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
              <li>
                <tickDuration>41</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.008</headBob>
              </li>
              <li>
                <tickDuration>9</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.485</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>0</headBob>
              </li>
            </keyframes>
          </li>
        </animationClips>
      </li>
      <li>
        <stageName>Cum</stageName>
        <isLooping>false</isLooping>
        <playTimeTicks>250</playTimeTicks>
        <stageIndex>0</stageIndex>
        <animationClips>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>50</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0.0</headBob>
              </li>
              <li>
                <soundEffect>Swallow</soundEffect>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.254</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.03</headBob>
              </li>
              <li>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.01</headBob>
              </li>
              <li>
                <tickDuration>40</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.254</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>0.0</headBob>
              </li>
              <li>
                <soundEffect>Swallow</soundEffect>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.03</headBob>
              </li>
              <li>
                <soundEffect>Swallow</soundEffect>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.254</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.01</headBob>
              </li>
              <li>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.255</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.03</headBob>
              </li>
              <li>
                <soundEffect>Swallow</soundEffect>
                <tickDuration>20</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.254</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.01</headBob>
              </li>
              <li>
                <soundEffect>Suck</soundEffect>
                <tickDuration>40</tickDuration>
                <bodyAngle>0</bodyAngle>
                <headAngle>0</headAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>-0.352</bodyOffsetZ>
                <bodyFacing>0</bodyFacing>
                <headFacing>0</headFacing>
                <headBob>-0.15</headBob>
              </li>
            </keyframes>
          </li>
          <li Class="rjw.PawnAnimationClip">
            <keyframes>
              <li>
                <soundEffect>Cum</soundEffect>
                <tickDuration>210</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.012</headBob>
              </li>
              <li>
                <tickDuration>40</tickDuration>
                <bodyAngle>0</bodyAngle>
                <bodyOffsetX>0</bodyOffsetX>
                <bodyOffsetZ>0.473</bodyOffsetZ>
                <bodyFacing>2</bodyFacing>
                <headFacing>2</headFacing>
                <headBob>-0.008</headBob>
              </li>
            </keyframes>
          </li>
        </animationClips>
      </li>

    </animationStages>

 

Other additions i made were just a couple tailored cum sounds, to add a slight bit of variety, and tried to increased the volume of the Swallow sound effects, apparently didn't go too well.

Hey, I took in mind some of the advice you gave. In theory none of the jobs should stop without ending all animations, but just in case I added in a check every 10 seconds or so to make sure that your pawns are still in a sex jobdriver for the animator to continue. I kinda still want to keep these variables deepsaved, so that pawns don't restart their animations when you load a save, but I've done some testing of my own, randomly downing pawns in anims, to make sure they never get stuck in a loop.

Link to comment

This is looking really nice :) Just got into really playing so its great to see a mod of this sort in the works. As for what kind of animations to do, I agree that getting some basic ones in first would be a good idea. Like a doggy style, missionary, and blow job for M/F and M/M and then do Cowboy for F/M, F/F and M/M. (Not sure about other Les animations to do... Scissoring might look weird) After that maybe work on getting one for each animal like the wolf one you did.

 

How hard is it to do the animations? I've never done any kind of modding but if its not to hard I wouldn't mind messing around and tying to make some Animal ones. Just if I do I wont be able to share them often as don't have the internet at home. Still if its something a beginner could do i'd like to give it a try.

Link to comment
  • c0ffeeeee changed the title to [Rimworld 1.3] RJW Animation Framework

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...