Scarlet Queen Posted June 23 Posted June 23 (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 June 23 by Scarlet Queen
Dg75 Posted June 29 Author Posted June 29 (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 June 29 by Dg75
Dg75 Posted June 29 Author Posted June 29 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 !
redrootcat Posted June 30 Posted June 30 I have a suggestion: could you add a settings export function to the MCM?
Scarlet Queen Posted June 30 Posted June 30 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
Dg75 Posted July 3 Author Posted July 3 (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 July 3 by Dg75
Scarlet Queen Posted July 3 Posted July 3 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!
Betaccca Posted July 16 Posted July 16 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
Alpia Posted July 17 Posted July 17 (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 July 17 by Alpia
Dg75 Posted July 17 Author Posted July 17 (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 July 19 by Dg75
Dg75 Posted July 17 Author Posted July 17 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.
Dg75 Posted July 19 Author Posted July 19 (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 July 19 by Dg75
Alpia Posted July 19 Posted July 19 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.
Dg75 Posted July 19 Author Posted July 19 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
Alpia Posted July 19 Posted July 19 (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: Open (or create) the file Data/PAF_ExtraIdles.json. 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) In the MCM -> AnimEX (Animations) page, click Reload Extra Idles. (Load on game load so only needed when life editing the json) 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 Monday at 11:48 AM by Alpia Rewritten detailed changes for readability
Dg75 Posted Monday at 09:33 PM Author Posted Monday at 09:33 PM 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.
Alpia Posted Monday at 09:55 PM Posted Monday at 09:55 PM (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. 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 Edited Monday at 10:41 PM by Alpia
Dg75 Posted Monday at 11:04 PM Author Posted Monday at 11:04 PM 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. 1
Alpia Posted Monday at 11:47 PM Posted Monday at 11:47 PM 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.
Dg75 Posted Tuesday at 12:48 AM Author Posted Tuesday at 12:48 AM (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 Tuesday at 07:23 PM by Dg75
orehomu Posted Tuesday at 05:06 PM Posted Tuesday at 05:06 PM 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`.
Dg75 Posted Tuesday at 06:54 PM Author Posted Tuesday at 06:54 PM 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.
Dg75 Posted Tuesday at 07:02 PM Author Posted Tuesday at 07:02 PM (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 Tuesday at 07:17 PM by Dg75
Alpia Posted Wednesday at 01:43 AM Posted Wednesday at 01:43 AM 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.
Dg75 Posted Wednesday at 08:36 PM Author Posted Wednesday at 08:36 PM (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 Thursday at 12:17 AM by Dg75 1
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now