Jump to content

PAF Fixes and Addons


Recommended Posts

Posted (edited)

Thanks for the mod but I have a suggestion! Could their be 2 settings one for if your character hasn't pooped before a anal sex scene and their % is high they could poop during the animation causing their partner's arousal to go down or maybe even end the animation together with them being dissatisfied. 

 

2nd suggestion is if your character is being r*ped during a anal sex animation, they will poop if their % is 50% or higher.

Edited by Scarlet Queen
Posted (edited)
On 6/23/2026 at 11:12 AM, asdfgfdgrt said:

The Kink options don't work for me. I try all of them and only get "You cannot do this right now". I've tried adding the actor as NPC Toilet, I've tried setting the pressure to 1 so I don't need much pressure to start kink, I'm pretty sure I have the load order correct. Instead, both actors look like they are about to initiate something for about half a second, the UI disappears and then everything just stops and goes back to normal with the "You cannot do this right now" message. Help!

most likely you are failing conditions: 

 

                        if  !IsPafSexy(Dom, Sub, peepaf, poopaf) ; PFA
                            DisplayMessage("You cannot do this right now")
                        endif

 

several factors can lead to the IsPafSexy function to fail. 

Dom would be your Player character and sub would be victim actor or the sexlab toilet you set - can be none if a solo was chosen in menu.

Dom must have either pee pressure and or poop pressure.

The corresponding kink sex options in paf's mcm must be enabled. (fart sex or pee sex) 

If you have a sub they must have their 3d loaded. Also Sexlab must be able to validate both Dom and Sub actors. 

Since how your Ui disappears as if sexlab is trying to start, but obviously fails then the IsPafSexy function will return false which will trigger - 

the "You cannot do this right now" 

If sexlab is at least trying to start then all the above conditions should have passed, else it would failed before trying to start - 

So Sexlab thread tries to start and fails. Why ? 

 

    if  !(Thread.StartThread())   ; if false
        PAF_Player.CheckPafGender(Dom, True)
        if  Index >= 0
            PAF_NPCQuest.NPC_Sexlab_Active = False
        endif
        if  GetState() == "Busy"
            ToggleState(True)
        endif
        Return False

 

my guess would be invalid animations chosen or animations are failing to set. Check pfa/paf mcm for animation choices

and ensure proper animations are installed and loaded into sexlab. Sexlab should pack the default anims that paf uses.

pfa has option to open up random other animations maybe try disabling that and use paf defaults

Also if you have added tag names in pfa mcm maybe try blanking them so paf defaults can be used.

 

 

Edited by Dg75
Posted
On 6/23/2026 at 11:49 AM, Scarlet Queen said:

Thanks for the mod but I have a suggestion! Could their be 2 settings one for if your character hasn't pooped before a anal sex scene and their % is high they could poop during the animation causing their partner's arousal to go down or maybe even end the animation together with them being dissatisfied. 

 

2nd suggestion is if your character is being r*ped during a anal sex animation, they will poop if their % is 50% or higher.

What if partner shatting on partner satisfied partner ? Never know, would make for interesting event !!!

 

2nd suggestion is appealing. The problem is they could be any animation and movement would be too variable to place poo object. 

The script would have to know exact position and movement of anal hole else may end shatting from a belly button or worse !

Posted
18 hours ago, Dg75 said:

What if partner shatting on partner satisfied partner ? Never know, would make for interesting event !!!

 

2nd suggestion is appealing. The problem is they could be any animation and movement would be too variable to place poo object. 

The script would have to know exact position and movement of anal hole else may end shatting from a belly button or worse !

Ah, so it can't just trigger from a sexlab tag and shoot from the back region?  Even if it's not 100% accurate

Posted (edited)
On 6/30/2026 at 11:56 AM, Scarlet Queen said:

Ah, so it can't just trigger from a sexlab tag and shoot from the back region?  Even if it's not 100% accurate

Yeah ! its same issue I have with the dynamic poop in some idles with too much motion - the poop object cant move with the animated motion

I'm sure there is a way to make it move with motion - I just don't know how.

 

Could be made to happen using paf default method(non dynamic poop) 

Just spawn at tailbone area and let fall to ground.

I'll keep it mind.

Edited by Dg75
Posted
8 hours ago, Dg75 said:

Yeah ! its same issue I have with the dynamic poop in some idles with too much motion - the poop object cant move with the animated motion

I'm sure there is a way to make it move with motion - I just don't know how.

 

Could be made to happen using paf default method(non dynamic poop) 

Just spawn at tailbone area and let fall to ground.

I'll keep it mind.

Awesome, looking forward for it even if it's not perfect lol!

  • 2 weeks later...
Posted

While using PAF and PNO together, "Use Pno" option will use the pno piss mesh but you keep pissing for a few minutes.

If the "Let PFA handle PNO" option is turned on, paf piss stain appears on the ground but no actual piss mesh is visible and no sound will play.

When both options are turned off, the default paf piss mesh is used.

Any idea why this happens? PNO is not initialized or registered.

PAF version is 4.7.1

PNO version is 1.10.3

 

Testing load order:

Spoiler

Skyrim_Special_Edition__Mod_Organizer_v2.5.2_(Alp260716_154355.png.09bea071535d9ebe1a96f78db0c0628c.png

 

 

Posted (edited)
19 hours ago, Betaccca said:

While using PAF and PNO together, "Use Pno" option will use the pno piss mesh but you keep pissing for a few minutes.

If the "Let PFA handle PNO" option is turned on, paf piss stain appears on the ground but no actual piss mesh is visible and no sound will play.

When both options are turned off, the default paf piss mesh is used.

Any idea why this happens? PNO is not initialized or registered.

PAF version is 4.7.1

PNO version is 1.10.3

 


PNO 1.10.3 Did move some parts to a skse plugin. With this version I had the same issue with the invisible pee. Reverting to the version before that update returned it to a working state if "Let PFA handle PNO" turned on. Based on that would assume that PAF is looking for something that was moved with that patch.

Quote

What's New in Version 1.10.3

Released June 29

* I migrated the internal processing to an SKSE plugin to improve performance.

* Adjusted the timing of equipping and unequipping to fix an issue where gear was not equipped correctly.

* Fixed an issue where the excretion power was not functioning correctly.

* Added "TNG_AddonFemale" to the keywords used for detecting futanari characters.


___________________
Unrelated but also version related GS Pose mod 23/06 seems to have poses reordered so the mcm selection doesnt fit anymore. Was pretty funny tho to suddenly have a poledance animation play while peeing, certainly was a show.

Edited by Alpia
Posted (edited)
On 7/16/2026 at 2:07 AM, Betaccca said:

Any idea why this happens?

Likely it would need updated for pno's 1.10.3 v 

for now try leaving the "let pfa handle pno" option off and let pno handle things.

I'll have to look into what was done for a fix if possible .

from @Alpia description the inner workings may have been altered into a skse plugin and probably c++ code - 

may be nothing I can do with it !

 

Edit:

just looked into this:

 

Pno's versions 1.10+ have changed up code.

npc's that do not have line of sight of player or if the npc is male will be excluded from pno pee effects.

versions 1.10.2+ have changed how pee starts and stops via a new skse plugin(global native function)

Until I update pfa to accommodate these changes functionality wont correctly work. 

So you can leave the "let pfa handle pno" option in pfa's mcm disabled - leave "Use Pno" enabled and let 

Pno handle the integration.(no guarantees)

Or I'd recommend using older version 1.9.0b of pno - this is before any of the above changes.

 

 

Edited by Dg75
Posted
18 hours ago, Alpia said:

Unrelated but also version related GS Pose mod 23/06 seems to have poses reordered so the mcm selection doesnt fit anymore.

bummer. Guess this would need updated as well. 

Posted (edited)
On 7/16/2026 at 9:25 PM, Alpia said:

GS Pose mod 23/06

I do not see a Gs Poses 23/06 in the downloads only the GS Poses SE 20/03 of which pfa was made to use

google search didn't show anything either.

Where are you finding it ?

Edited by Dg75
Posted
9 minutes ago, Dg75 said:

I do not see a Gs Poses 23/06 in the downloads only the GS Poses SE 20/03 of which pfa was made to use

google search didn't show anything either.

Where are you finding it ?

https://www.patreon.com/Gunslicer/posts/pose-mod-23-06-161860799  on their patreon the old one is still up so its not a big deal.

Also if you are interested I did edit your PFA_PAFMCM and PAF_MainQuestScript a bit because I wanted to update the selection and insert some of my choice.
I changed the logic of the animation selection to read from a json so a user can put in their own selection of idles. For example

    { "event": "GS4",   "label": "Bend Over Look Back",                        "enabled": true, "dpExempt": false },

I also changed the mcm to fit with those changes allowing to browse through the list of idles and enable disable it and add or remove to the dynamic pooping exception writing/reading to the file.
Still have to make a few cosmetic changes but the core idea seems to work fine so far should have it ready later if you are interested I can upload it and list the changes made so you can check if its of interest for you. It would allow easier customization for yourself and users as the extra animations wouldnt be hard coded into the script anymore so dont need to recompile two scripts just to change animations. 

Posted
9 minutes ago, Alpia said:

https://www.patreon.com/Gunslicer/posts/pose-mod-23-06-161860799  on their patreon the old one is still up so its not a big deal.

Also if you are interested I did edit your PFA_PAFMCM and PAF_MainQuestScript a bit because I wanted to update the selection and insert some of my choice.
I changed the logic of the animation selection to read from a json so a user can put in their own selection of idles. For example

    { "event": "GS4",   "label": "Bend Over Look Back",                        "enabled": true, "dpExempt": false },

I also changed the mcm to fit with those changes allowing to browse through the list of idles and enable disable it and add or remove to the dynamic pooping exception writing/reading to the file.
Still have to make a few cosmetic changes but the core idea seems to work fine so far should have it ready later if you are interested I can upload it and list the changes made so you can check if its of interest for you. It would allow easier customization for yourself and users as the extra animations wouldnt be hard coded into the script anymore so dont need to recompile two scripts just to change animations. 

That would be great. Customization is always a plus. thx

Posted (edited)

I upload this for Dg75, if anyone else decides to use this before adopted officially any update may revert or break the changes.
Perfectly fine to use if you understand what you are doing.

20 hours ago, Dg75 said:

That would be great. Customization is always a plus. thx


There is the mentioned upgrade to the extra animation handling in Paf Fixes and Addons. (Edited scripts only main mod required) Paf Fixes and Addons 4.7.1 PATCH (Extra Idle System Overhaul) .7z
I've tested it for a hour or so seems to work fine, but cant make any guarantee's the mod is big and my knowledge limited. I avoided editing anything that didnt need to be edited.
Male side untested. There wasnt any support for it, simply added because why not same logic as female extra anims.

The goal was to replace the hardcoded "GS" extra idle slots with a dynamic system using a JSON file (Got the idea from rape tats and thinking of ponzi's devious followers etc. that take a similar approach). This makes it much easier to add custom pee/poop animations without editing the Papyrus scripts.

  • Add any animation into the game by editing a JSON file.
  • Use animations from other mods (as long as the animation event name is registered via FNIS/Nemesis/Pandora or whatever else is out there).
  • Enable/disable individual animations directly via json or MCM (written back into the json to reflect changes).
  • Decide per animation whether it should be excluded from Dynamic Pooping via mcm or json (written back into the json to reflect changes).
  • Browse and test animations easily from the MCM without guessing indices.
  • Have "unlimited" (still limited by papyrus to ~+100) extra animations (no longer restricted to the hardcoded GS slots).

How to add an animation:

  1. Open (or create) the file Data/PAF_ExtraIdles.json.
  2. Add a animation under the correct gender array, for example:
    JSON
    "extra_idles_f": [
      {
        "event": "MyAwesomePeeAnim",
        "label": "Custom Name You Want To See",
        "enabled": 1,
        "dpExempt": 0
      }
    ]

    (True/False also possible but when using mcm to make changes gets overwritten by 1/0)

  3. In the MCM -> AnimEX (Animations) page, click Reload Extra Idles. (Load on game load so only needed when life editing the json)
  4. Browse, enable, and test the new animation.

Json with selection from the new 23/06 GS poses is included. I just put any somewhat fitting animation in the json, so may need adjustment. Especially which animations work well with the dynamic pooping probably needs to be tested.

MCM Changes (Animations Page)

The AnimEX (Animations Page) page has been edited to reflect the script changes.

  • Browse Extra Idle (F) and Browse Extra Idle (M) buttons (on click) Cycle through loaded animations for female or male. Shows the current animation’s label.
  • Toggle Extra Idle (F/M) Enable or disable the currently browsed animation.
  • Toggle Dynamic Pooping (F/M) Choose whether the current animation should be used for Dynamic Pooping.
  • Reload Extra Idles Reloads the JSON file and rebuilds the internal lists. Use this after editing the JSON while in game (gets done on game load anyway)
  • Test Extra Idle (F) and Test Extra Idle (M) Plays the currently browsed animation on the player as nobody has a clue what GS696 looks like by the name).
  • Test Idle from previous implementation remains, but updated to be compatible with the json list.

Legacy options (Use Animation EX toggle, old GS toggles) are still present as code for compatibility, but when UseAnimEX (Use extra animations) is enabled, the new JSON system takes priority for extra slots. Tried to avoid removing what didnt need to be removed or edited.

Detailed Changes:

Spoiler

The "EX" extra-idle system (poses beyond the base 13 female / 12 male animations) was built on three fixed-size, positionally-linked structures that all had to be kept in sync by hand whenever the idle list changed:

  • GSEnabled[21] - a fixed 21-slot bool array, one MCM checkbox per pose, indexed purely by position
  • RandomInt(11, 35) - a hardcoded roll range in GetRandomAnimation, tuned to match exactly 21 entries starting at index 13
  • DPExclusionS[40] / DPExclusion[40] - a separate 40-entry list mapping Dynamic Pooping exemption, converted to/from pose index via ConvertIdleElement's own positional math

When the female idle list was expanded by me to 37 new poses, none of those three could resize or re-index themselves, which is where I figured I rather have a clean future proof solution without constantly having to edit the scripts.


So what I tried to do and did is replace all three fixed structures with one JSON file, read at runtime through JContainers (already a dependency of this mod JMap/JArray are already used in HasTattooApplied), so the pose list, per-pose enable state, and per-pose Dynamic Pooping exemption all live in one place that resizes itself.


New file: Data/PAF_ExtraIdles.json

{
  "extra_idles_f": [
    { "event": "GS4", "label": "Awesome description of what GS4 roughly looks like", "enabled": true, "dpExempt": false }
  ],
  "extra_idles_m": [
    { "event": "GS12", "label": "Example Male Pose - Replace Me", "enabled": false, "dpExempt": false }
  ]
}

Two arrays, one per gender. Each entry:

Field Meaning
event The animation event string sent to Debug.SendAnimationEvent. Must match a real event registered by an installed animation mod (FNIS/Nemesis/Pandora or whatever)
label Display name in the MCM. Falls back to event if blank.
enabled Whether this pose is currently eligible to be picked.
dpExempt Whether this pose is excluded from Dynamic Pooping.

Json with pose selection from GS 23/06 is included, but may need some work as I just put in any that may be interesting. Especially which look decent with the DP needs to be tested.

Known limitation: Skyrim's Papyrus VM caps arrays at 128 elements. Since PafIdlesF/PafIdlesM also carry the 13/12 base poses, the practical ceiling is roughly 115 extra female poses and 116 extra male poses. Nothing currently enforces this exceeding it would probably fail silently or truncate rather than crash, but it's worth mentioning.


PAF_MainQuestScript.psc

Create_Idles(Bool ReCreate)

Before: the tail of PafIdlesF (indices 13–XX) was hardcoded string assignments; PafIdlesM had no equivalent tail at all.

After: the base 0–12 (F) / 0–11 (M) assignments are untouched. The tail is built dynamically from the JSON, via the MCM script's new accessors:

Int nExtraF = PFA_MCM.GetExtraIdleCount(False)
Int wantedF = 13 + nExtraF
PafIdlesF = Utility.CreateStringArray(wantedF)
PafIdlesF[0] = "pee1s"
...
PafIdlesF[12] = "PAF_Bendover01"

Int iF = 0
While iF < nExtraF
    PafIdlesF[13 + iF] = PFA_MCM.GetExtraIdleEvent(iF, False)
    iF += 1
EndWhile

Same pattern added for PafIdlesM, offset by 12 instead of 13, which is new as there was no male EX tail before. (Didnt test but same logic so should work)

GetRandomAnimation(bool[] animations)

Before: the function always rolled a base pose first (0–12/0–11), unconditionally, using the existing GetAnimationCount/RandomInt walk. A separate EX branch would then maybe override that pick with one random roll from a fixed RandomInt(11,35) range, but only if that specific roll landed on an enabled entry per GSEnabled.

After: rewritten to build one combined pool... every base pose currently marked True in the passed array, plus every EX pose whose JSON enabled is true and pick uniformly across the whole pool in one roll:

Int baseCount = <count of True entries in animations[]>
Int extraCount = <count of enabled EX entries for this gender>
Int total = baseCount + extraCount
Int pick = Utility.RandomInt(0, total - 1)
; pick < baseCount  -> walk animations[] to the pick-th True entry
; else              -> walk the EX list to the (pick - baseCount)-th enabled entry

The old two-stage design had a real bug once combined with the EX system... if the EX roll happened to land on a disabled pose, it silently fell back to the already-rolled base pose rather than retrying, so base poses stayed reachable even when they were all disabled. Compounding that, the mod's existing GetAnimationCount has its own pre-existing fallback (if count == 0: return animations.length) that treats "every base pose disabled" as "every base pose enabled"... a deliberate-looking failsafe in the original code, but one that meant a fully-disabled base list was never actually working. The rewrite above computes its own base/extra counts directly rather than calling GetAnimationCount, so "zero enabled" now genuinely means zero, for both base and extra poses. GetAnimationCount itself is untouched and still present, just no longer called from this function.


PFA_PAFMCM.psc

JSON load/save (new)

Function LoadExtraIdles()
    Int loaded = JValue.readFromFile("Data/PAF_ExtraIdles.json")
    if  loaded
        JDB.solveObjSetter(".PFA.ExtraIdlesRoot", loaded, True)
    endif
EndFunction

Function SaveExtraIdles()
    Int root = JDB.solveObj(".PFA.ExtraIdlesRoot")
    if  root
        JValue.writeToFile(root, "Data/PAF_ExtraIdles.json")
    endif
EndFunction

The whole parsed JSON tree is kept as a single object under one JDB path (rather than splitting the F/M arrays into separate stored objects) specifically so SaveExtraIdles() can write the entire thing back to disk in one call. JDB (JContainers own persistent key-value store) means this survives across saves without manual JValue.retain/release bookkeeping.

Accessor functions (GetExtraIdleCount, GetExtraIdleEvent, GetExtraIdleEnabled, GetExtraIdleDPExempt, GetExtraIdleLabel) read from this; SetExtraIdleEnabled/SetExtraIdleDPExempt write to it and call SaveExtraIdles() immediately, so MCM toggles and the JSON file stay in sync in both directions. Edit the file and hit Reload, or toggle in-game and the file updates itself.

EnabledEX(Int Animation, Bool forMale = False)

Replaces the old single-parameter version that indexed into GSEnabled[21]. Animation is the same raw style index used throughout the pose system (the value GetRandomAnimation/PlayPeeIdleStart work with directly), 13+ for female extras, 12+ for male. The function subtracts that base offset internally to find the matching JSON entry:

Bool Function EnabledEX(Int Animation, Bool forMale = False)
    Int base = 13
    if  forMale
        base = 12
    endif
    Return GetExtraIdleEnabled(Animation - base, forMale)
EndFunction

IsDPExempt(Int Style, Bool forMale)

Previously converted Style through ConvertIdleElement's positional math into an index in the old 40-entry DPExclusionS list. Now reads the per-pose dpExempt flag straight from JSON, with base poses (below the 13/12 offset) always treated as non-exempt:

Bool Function IsDPExempt(Int Style = 0, Bool forMale = False)
    if  DynamicPoop == 0 || Style < 0
        Return True
    endif
    Int base = 13
    if  forMale
        base = 12
    endif
    if  Style < base
        Return False
    endif
    Return GetExtraIdleDPExempt(Style - base, forMale)
EndFunction

FindExtraIdleStyle(String searchName, Bool forMale) (new)

Backs the Test Idle feature. Accepts a typed name (matches either the event or label field), searches the corresponding JSON list, and returns that same raw style index format (13+/12+) so it can be handed straight to the existing idle-playing functions. Returns -1 if nothing matches. This replaced the old RetrieveDPElement/ConvertIdleElement lookup path, which searched the stale DPExclusionS list and had no knowledge of the new pose names at all.

MCM page layout

The fixed OID_GS0 .. OID_GS20 checkboxes (one hardcoded option per pose, 21 total, female-only) are removed and replaced with a browse/toggle pattern under two new headers, "Extra Idles (Female)" and "Extra Idles (Male)" that follows the same cycle-through-a-list UI pattern already used elsewhere in this script for OID_Paf_Worn:

  • Browse Extra Idle - cycles through whatever is currently loaded from the JSON
  • Enable / Dynamic Pooping - reflect and toggle the currently-browsed pose; changes write back to the JSON immediately
  • Test Idle - plays the currently-browsed pose directly
  • Reload idle list from file - re-reads the JSON and calls PAF_MainQuest.Create_Idles(True) to rebuild PafIdlesF/PafIdlesM live, no game restart needed

Use Extra Animations and the existing Test Idle (typed-name) toggle were moved up onto the Options section, next to the idle-name text field they both depend on.

Legacy code left in place

GSEnabled, DPExclusionS, DPExclusion, CreateGS(), CreateDPExclusion(), RetrieveDPElement(), IsDPExemptConv(), ConvertIdleElement(), ToggleDPExclusion(), ShowDBList() are no longer referenced by the working system, but were left declared rather than deleted:

  • CreateGS() and CreateDPExclusion() are still called once from PFAPages() - they still run and populate their arrays, but nothing downstream reads the results anymore. Harmless, trivial overhead.
  • The rest (ToggleDPExclusion, RetrieveDPElement, IsDPExemptConv, ConvertIdleElement, ShowDBList) are not called from anywhere at all - Papyrus never executes an uncalled function, so they're inert. None of them are properties, so there's no save-compatibility reason to keep them. Could remove that, but left it in to delete as little as possible.

Translation file

Interface/Translations/Paf Fixes and Addons_ENGLISH.txt was extended with keys for all the new MCM text ($PFAExtraIdlesF_, $PFAExtraIdlesM_, $PFABrowseExtraIdle_, $PFADynamicPooping_, $PFATestExtraIdle_, $PFAReloadExtraIdles_, and their Info variants), and one pre-existing gap ($True) was filled in — it was referenced by the mod's own debug page but had no translation entry at all in the original file.


What to probably review

  • Create_Idles and GetRandomAnimation in PAF_MainQuestScript.psc
  • The new JSON accessor block, EnabledEX, IsDPExempt, FindExtraIdleStyle, and the AnimEX page's OnPageReset/state blocks in PFA_PAFMCM.psc
  • Data/PAF_ExtraIdles.json (new)
  • The translation file additions

No existing properties were removed, no changes where made that affect saves (JDB storage is additive), and the base 0–12/0–11 pose behavior is unchanged apart from the GetAnimationCount fallback no longer applying when EX is involved.

Edited by Alpia
Rewritten detailed changes for readability
Posted
22 hours ago, Alpia said:

Perfectly fine to use if you understand what you are doing.

Nice work ! 

I especially like the "Label" custom name. I assume that is what the users will see in the mcm, don't have to see weird event names anymore.

 

I do see at least one hurdle!

Certain functions like DynamicPoop and Anal Vomit require offsets per idle playing.

Originally I created the offsets per idle slot on the array. These offsets would determine positioning and alignments based on the idle at play.

Using custom - user added or edited idles would naturally render the offsets incorrect if the the idle on that slot had changed. 

I just need a method to track user defined idles and a way to establish offset values or a dynamic method at runtime to create them based on the idle at play.

Except the only way I know how is to painstakingly test each induvial idle through trial and error.  I'm sure there is math for this, but is above me. 

If not using the dynamic poop or anal vomit(sick) features then you have no worries.

Otherwise it may break these features to a degree- some idles may work others may not..  I hope I'm wrong.

Posted (edited)
53 minutes ago, Dg75 said:

Nice work ! 

I especially like the "Label" custom name. I assume that is what the users will see in the mcm, don't have to see weird event names anymore.

 

I do see at least one hurdle!

Certain functions like DynamicPoop and Anal Vomit require offsets per idle playing.

Originally I created the offsets per idle slot on the array. These offsets would determine positioning and alignments based on the idle at play.

Using custom - user added or edited idles would naturally render the offsets incorrect if the the idle on that slot had changed. 

I just need a method to track user defined idles and a way to establish offset values or a dynamic method at runtime to create them based on the idle at play.

Except the only way I know how is to painstakingly test each induvial idle through trial and error.  I'm sure there is math for this, but is above me. 

If not using the dynamic poop or anal vomit(sick) features then you have no worries.

Otherwise it may break these features to a degree- some idles may work others may not..  I hope I'm wrong.


Yes its explained in the spoiler with the changes, but hard to explain how a pose looks like with a few words as there isnt much space on a mcm page before things overlap. Still better then just some random number.
image.png.b9a6671c30a6883a6b7a8ee25df8ed75.png

Field Meaning
event The animation event string sent to Debug.SendAnimationEvent. Must match a real event registered by an installed animation mod (FNIS/Nemesis/Pandora or whatever)
label Display name in the MCM. Falls back to event if blank.
enabled Whether this pose is currently eligible to be picked.
dpExempt Whether this pose is excluded from Dynamic Pooping.
   
   
 
Quote

Certain functions like DynamicPoop and Anal Vomit require offsets per idle playing.

Originally I created the offsets per idle slot on the array. These offsets would determine positioning and alignments based on the idle at play.

Using custom - user added or edited idles would naturally render the offsets incorrect if the the idle on that slot had changed. 

I just need a method to track user defined idles and a way to establish offset values or a dynamic method at runtime to create them based on the idle at play.

Except the only way I know how is to painstakingly test each induvial idle through trial and error.  I'm sure there is math for this, but is above me. 

If not using the dynamic poop or anal vomit(sick) features then you have no worries.

Otherwise it may break these features to a degree- some idles may work others may not..  I hope I'm wrong.

 

  Will need to look into it, didnt see any issues with any offset of the dynamic pooping even in odd poses like the jack-o.
  I see the offset you mentioned, the idles without offset would fall back to the last defined offset in PlacePeePuddle. I have to say from all the testing didnt even notice a problem with it other then with the poses with a lot of motion, but that was a problem before already. Its probably because the offset is based on the pee and the distance is so small you dont even notice on most.
Some screenshots (poop warning) that show despite the hardcoded offset that will fail it looks fine
Spoiler

image.png.5d907b7813826c7b32b67d97f6abba9b.pngimage.png.073e2d75581e269b99a48be97459a005.png
image.png.1a9b7725987676259d1c52a16e10ff36.png
image.png.0042dffebc906653cec6b926c72e6467.png
 


 
Edited by Alpia
Posted
55 minutes ago, Alpia said:

didnt see any issues with any offset of the dynamic pooping even in odd poses like the jack-o.

Good. lol maybe the current offsets work for the new idles as well. Sure looks that way in the pics. User can always disable dp if it dont. 

The so called offsets I mention are the idle in question used in conditions to set styleAdj (alt adjustments and offsets to nodes to establish a moveline) 

They are also float values that define direction the butt is facing - current heading per idle

but not all idles needed them, only the awkward ones like kneeling with a twist - butt sideways or paf on back . . 

All I did was take peak in the script work, I look forward to install and testing this out soon when I have more time to do so. 

Thank you. 

 

Posted
30 minutes ago, Dg75 said:

Good. lol maybe the current offsets work for the new idles as well. Sure looks that way in the pics. User can always disable dp if it dont. 

The so called offsets I mention are the idle in question used in conditions to set styleAdj (alt adjustments and offsets to nodes to establish a moveline) 

They are also float values that define direction the butt is facing - current heading per idle

but not all idles needed them, only the awkward ones like kneeling with a twist - butt sideways or paf on back . . 

All I did was take peak in the script work, I look forward to install and testing this out soon when I have more time to do so. 

Thank you. 

 


I will take a look at the offset implementation either way and try to come up with something I have a few ideas I'll try. Cant make any promises, but... what comes to mind...
- Possibly use a skeleton bone (e.g. NPC Pelvis or Anus) as the reference point instead of just actor position + fixed offset. Could probably make a per pose additional offset adjustment possible via the json if it doesnt fit like... "bone": "NPC Pelvis", "forwardOffset": 15.0, "heightOffset": -12.0, "angleOffset": 0.0
- Possibly something to make dynamic poses work, place the poop item, then poop.AttachTo(a_actor, "NPC Pelvis", offsetX, offsetY, offsetZ) so the item sticks to the bone and moves with it, after a short delay (Utility.Wait(1.5)), Detach() so it drops "naturally". Need to try and see if that works and is possible as I imagine it.

Posted (edited)
19 hours ago, Alpia said:


I will take a look at the offset implementation either way and try to come up with something I have a few ideas I'll try. Cant make any promises, but... what comes to mind...
- Possibly use a skeleton bone (e.g. NPC Pelvis or Anus) as the reference point instead of just actor position + fixed offset. Could probably make a per pose additional offset adjustment possible via the json if it doesnt fit like... "bone": "NPC Pelvis", "forwardOffset": 15.0, "heightOffset": -12.0, "angleOffset": 0.0
- Possibly something to make dynamic poses work, place the poop item, then poop.AttachTo(a_actor, "NPC Pelvis", offsetX, offsetY, offsetZ) so the item sticks to the bone and moves with it, after a short delay (Utility.Wait(1.5)), Detach() so it drops "naturally". Need to try and see if that works and is possible as I imagine it.

I have something maybe.. The offsets are hard coded like to the original extra idle array.  In script the pick(chosen idle) is stored into _Style script var and is in 

the case of DynamicPoop and AnalSpray functions acting as a pointer to the idle array element. 

e.g. Bool _styleAdj = ((forFem && (style > 8 && style < 13 || style > 23 && style < 27) || style == 15 || style == 16 || style == 33) || (!forFem && style > 7))

if _styleAdj is true then the function sets things up differently. 

So I have to loose the hardcode bit and instead create a string array to house all the poses I set pre defined for offset. 

In time I can play with any new idles and add them to any corresponding offset list

So if I could get _Style event name - the event name of the chosen idle

I could compare it any offsets string array via .FInd("_StyleEventName"), and if found it sets StyleAdj to true or set a conditional value.

e.g:

String[] ConditionalOffsets  ; I could have this filled with all the StyleAdjustment type poses that I set as needing offset or style adjustments

String[] FloatOffsets  ; may need several to correspond to the varies kinds of offsets used. 

 

String eventName = "GsPoses11" ; I need to retrieve the event name for the chosen Idle to play whatever it be

Bool _styleAdj = (ConditionalOffsets .Find(eventName) >= 0)

 

   this would render same result without the need to hardcode any preset values for pointers.

    

and something similiar to set a particular float value to

 

Anyway, its a start. So yeah these offsets I have to test each idle and see what needed or if it works off defaults but the ones I already did can be 

found and compared to what you have in the .jason or whatever any user edits in it - assuming GsPoses didn't change up the event names 

in the 23/06 version.

 

I'll work on this and see if it'l work out. 

 

Question ?

I'm not at all familiar with jccontainer functions, I'm lazy and never fiddled with it. 

So I wouldn't be ideal to upkeep any future updates to your functions.

But on the contrary I have already updated the PafMain script 

 - just one function in it got updated the CheckWorn, so you may want it included.

so this patch is your mod and all credits go to you as it should. So do you plan on uploading it officially on its own page

or would you rather just have included on pfa's download page. Or I could integrate it into the main mod. 

maybe better to leave it as a patch as more easily keep it updated ?

Edited by Dg75
Posted
On 7/20/2026 at 4:33 AM, Dg75 said:

I did a fix. this with the "Let pfa handle pno" enabled and using pno 1.10.3 new skse functions

Pno pee starts okay but pno's kill function to make it stop doesn't seem to work. The pee lingers for a duration after dressing

Idk if I'm doing something wrong or if its pno bug - there's a mod post on its last page mentioning similar issue.

I'll have to wait and see if theirs a fix before formally updating pfa.

In the meantime I'll upload here what I did if anyone wants to try and see.

 

Only try this for a test and or if you think you might have a solution.

Use mod manager to install/uninstall - and uninstall it for next pfa update as it should have a formal fix

PFA_PNO_1.10.3_testFix.7z 3.02 kB · 2 downloads

I apologize for the inconvenience.
There was an issue with EjectApi.StopEject(key, actor), so I fixed it in version V1.10.5.
It should now stop correctly.

 

Regarding the placement of the excrement, you might be able to utilize the "EjectionFramework" included with pno, as it offers functionality similar to what is needed.

This framework provides the ability to launch spells or projectiles from a specified node.
(In pno, invisible projectiles are fired, and the excrement is placed at the point of impact.)

The definitions for using this feature in pno can be found in the "Defecate" section of `SKSE\Plugins\EjectionFramework\pno.json`.

 

Posted
1 hour ago, orehomu said:

I apologize for the inconvenience.
There was an issue with EjectApi.StopEject(key, actor), so I fixed it in version V1.10.5.
It should now stop correctly.

 

Regarding the placement of the excrement, you might be able to utilize the "EjectionFramework" included with pno, as it offers functionality similar to what is needed.

This framework provides the ability to launch spells or projectiles from a specified node.
(In pno, invisible projectiles are fired, and the excrement is placed at the point of impact.)

The definitions for using this feature in pno can be found in the "Defecate" section of `SKSE\Plugins\EjectionFramework\pno.json`.

 

Thank you ! I'll take a look at it. This may be just what I'm looking for. 

Posted (edited)
18 hours ago, Dg75 said:

AttachTo(a_actor, "NPC Pelvis", offsetX, offsetY, offsetZ)

wasn't aware of this function. Pfa's dynamic poop like paf poop isn't an equipable object, just static 

except the dynamic poop has collisions removed and a dupe has spawn point flipped horizontally 

If AttachTo can make it stick to a node, this would solve the incompatibility with swaying hips or too much motion.

but it has to move down an invisible move line created from the idle offsets mentioned above - sets correct angle and direction of movement.

if its stuck to a node via AttachTo then it can't move ? Unless TranslateTo would unstick it and make it start moving down the line.-  but then 

the swaying motion would still clip rendering the attempt fruitless.

I'll look into Pno's EjectionFramework maybe offers better method.

Edited by Dg75
Posted
On 7/21/2026 at 2:48 AM, Dg75 said:

Anyway, its a start. So yeah these offsets I have to test each idle and see what needed or if it works off defaults but the ones I already did can be 

found and compared to what you have in the .jason or whatever any user edits in it - assuming GsPoses didn't change up the event names 

in the 23/06 version.

 

I'll work on this and see if it'l work out. 

 

Question ?

I'm not at all familiar with jccontainer functions, I'm lazy and never fiddled with it. 

So I wouldn't be ideal to upkeep any future updates to your functions.

But on the contrary I have already updated the PafMain script 

 - just one function in it got updated the CheckWorn, so you may want it included.

so this patch is your mod and all credits go to you as it should. So do you plan on uploading it officially on its own page

or would you rather just have included on pfa's download page. Or I could integrate it into the main mod. 

maybe better to leave it as a patch as more easily keep it updated ?


If you are about to post a update I'll wait till I look into it more. I dont intend to make a extra mod page just for that patch. As mentioned originally if its of use to you, you are free to integrate it. If you think you cant maintain it then its probably better as a optional patch, but since its your mod that is affected I think it is up to you if and how you use that code.
 

On 7/21/2026 at 2:48 AM, Dg75 said:

AttachTo(a_actor, "NPC Pelvis", offsetX, offsetY, offsetZ)
wasn't aware of this function. Pfa's dynamic poop like paf poop isn't an equipable object, just static

It isnt a function that was just me saying I'll be looking if something along those lines exists that could be used, but doesnt seem so. Could only do place the object and update the position multiple times per second, but that doesnt seem like a good idea. So thats off the table and the offset you currently use is probably the most sensible solution unless that ejection framework that was mentioned is of use.


 

Posted (edited)
22 hours ago, Alpia said:


If you are about to post a update I'll wait till I look into it more. I dont intend to make a extra mod page just for that patch. As mentioned originally if its of use to you, you are free to integrate it. If you think you cant maintain it then its probably better as a optional patch, but since its your mod that is affected I think it is up to you if and how you use that code.
 

It isnt a function that was just me saying I'll be looking if something along those lines exists that could be used, but doesnt seem so. Could only do place the object and update the position multiple times per second, but that doesnt seem like a good idea. So thats off the table and the offset you currently use is probably the most sensible solution unless that ejection framework that was mentioned is of use.


 

Kool ! 

I have the DynamicPoop function updated so it wont conflict, I just need to do the same to the AnalSpray Function as both use idle conditions to set values. 

I'll have an update up soon.

 

I noticed in your jason you only have gsposes 23/06 and that only two of the 20/03 originals are added.

EndUser can always add them if wanted. Or maybe add them by default.. I suppose the purpose was to replace the 20/03

so I understand if you prefer not to. Either or - its primary reason it best to leave as optional patch. 

Edited by Dg75

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
×
×
  • Create New...