Jump to content

Recommended Posts

Posted
7 hours ago, Gooberissimo said:

If I do 

slt run "Give Gold(10")

slt sends a request, however this fails and I get this in the logs

"[2025-09-30 20:44:23.604] [log] [error] [core.cpp:115] No available magic effects to apply script: Give Gold(10)
[2025-09-30 20:44:24.692] [log] [warning] [core.h:290] No available magic effects in pool for target eeee
[2025-09-30 20:44:24.692] [log] [error] [core.cpp:115] No available magic effects to apply script: Give Gold(10)
[2025-09-30 20:44:25.779] [log] [warning] [core.h:290] No available magic effects in pool for target eeee
[2025-09-30 20:44:25.779] [log] [error] [core.cpp:115] No available magic effects to apply script: Give Gold(10)
[2025-09-30 20:44:25.796] [log] [warning] [sl_triggers.cpp:737] Reattempted script(Give Gold(10)) for Actor([Actor < (00000014)>]) attempts(6.000000) - giving up"

 

What can I do?

 

I also tried to run this on an extremely stripped down mo2 profile and still the same no available magic effects in pool error.

 

I suspect I know the problem, but first, can you confirm whether you have "powerofthree's Tweaks" installed? https://www.nexusmods.com/skyrimspecialedition/mods/51073

 

I have had an undocumented dependency for awhile and that mod is responsible for making sure all editorIDs are present at runtime. I look up the MGEF records by editorID; that's the only reason I can think of for that error to be occurring.

 

I will update the README to reflect the corrected dependency.

Posted

v0.970 is out, kinda small update:

 

Savegame compatible
Reminder: Note that logging output is all sent to <My Documents>\My Games\Skyrim Special Edition\SKSE\sl-triggers.log 
    (or whichever folder you have your SKSE logs directed to)
enhancement: sl-triggers.dll now logs when a requested formID is referencing a mod that is not found
enhancement: improved 'Function Library Development' documentation
enhancement: sl_triggers.AddKeywordToForm(Form, Keyword)
enhancement: sl_triggers.RemoveKeywordFromFrom(Form, Keyword)
enhancement: new SLTScript commands:
    form_addkeyword $form $keyword
    form_removekeyword $form $keyword
    keyword_get $keyword_string

Posted
On 9/29/2025 at 9:32 PM, hextun said:

 

You answered your first question: that's only the SLTScript, you would need to set up a trigger to run it or run it from the console.

 

The log output indicates that it determined the actor was an Imperial and attempted to find an item in "cum alchemy.esp" with formID 0x2ec38 (191544) but was not able to.

 

Do you have Cum Alchemy installed and is the .esp named "cum alchemy.esp"? If not, that is the problem. If so, you'd have to determine whether the Imperial cum is still located with formID 0x2ec38 (in xedit; and this is relative... so if cumalchemy was installed at mod index 0x2b, then the full in-game formID would be 0x2b02ec38).

Sorry for the late reply.

Thanks for the info! I looked around in xedit.

I think I found the problem. Cum Alchemy Remastered has normal esp version and ESPFE version. I installed the ESPFE version. so the form id is not matching.
Can you provide a ESPFE version of the script?

Appreciate your hard work! keep it up!

Posted

Hey guys, there's a legacy script that plays an animation after sex.  I set mine up to play a crying animation but what I really want is to play a wounded animation so Skyrim women don't just walk away after sex as if nothing happened.  My only issue is that I can't find the name of the vanilla wounded animations to use.  Just wondering if someone has already made something like this and can direct me to the names of the animation files that could fit.

Posted (edited)

Hi folks,

 

I'm trying to build a relatively simple config to check on equip or unequip of any armor item (that part's working!) whether the player has the Heavy Bondage Script effect. Details of this effect:

 

Quote

 

editor ID zad_effHeavyBondage

base form ID 1E07BFBB

base defined in: Devious Devices - Integration.esm )

 

 

The goal is to implement an ad hoc deviously helpless lite, that makes enemies see the player as not worth fighting if they're completely helpless.

 

Here's the script I have so far:

 

set $actorName resultfrom actor_name $system.self
if actor_isaffectedby $system.self "Devious Devices - Integration.esm:507835"
;if actor_isaffectedby $system.self "Devious Devices - Integration.esm:0x07BFBB"
	msg_notify $"{$actorName} is helpless."  
	actor_setfactionrank $system.self "Skyrim.esm:0x0AA784" 1000
else
	msg_notify $"{$actorName} is no longer helpless."
	actor_setfactionrank $system.self "Skyrim.esm:0x0AA784" -1
endif

 

Most of it seems to work - I see the messages, they capture the player name fine, and even the faction works (although it's admittedly a bit dodgy to use the prisoner faction in this way, as it might interfere with other, similar implementations). Unfortunately the actor_isaffectedby check appears not to work, despite my best efforts, either with hex or decimal values; it always triggers the else flow.

 

Can anyone shed light into why this might be? I've tried several permutations but overall feel as though the issue must be that actor_isaffectedby isn't behaving as I expect it to, as it won't even properly detect baseline skyrim effects. 

 

Thanks,

Edited by sedoacsltwwloqrddi
correcting the commented hex value
Posted

I've tried the following to test different interpretations of the value in various hex and non-hex iterations, but it just reliably returns false, even when i can confirm it's targeting the right object and that the object has an effect with this value

 

set $DDI1 resultfrom actor_isaffectedby $system.self "Devious Devices - Integration.esm:0x07BFBB"
msg_console "DDI1: " $DDI1

set $DDI2 resultfrom actor_isaffectedby $system.self "0x07BFBB|Devious Devices - Integration.esm"
msg_console "DDI2: " $DDI2

set $DDI3 resultfrom actor_isaffectedby $system.self "507835|Devious Devices - Integration.esm"
msg_console "DDI3: " $DDI3

set $DDI4 resultfrom actor_isaffectedby $system.self "503824315|Devious Devices - Integration.esm"
msg_console "DDI4: " $DDI4

 

Weirdly it also seems to be calling each of them twice, but within sequence, (that is, DDI1, DDI1, DDI2, DDI2, DDI3, DDI3, DDI4, DDI4), leading me to believe that the act of setting the result is somehow printing to console as well.

Posted
4 hours ago, Edzio said:

Sorry for the late reply.

Thanks for the info! I looked around in xedit.

I think I found the problem. Cum Alchemy Remastered has normal esp version and ESPFE version. I installed the ESPFE version. so the form id is not matching.
Can you provide a ESPFE version of the script?

Appreciate your hard work! keep it up!

 

What is the mod filename (i.e. is it still "cum alchemy.esp"?)

 

Just need the filename and the formIDs. :)  

Posted
2 hours ago, sedoacsltwwloqrddi said:

Hi folks,

 

I'm trying to build a relatively simple config to check on equip or unequip of any armor item (that part's working!) whether the player has the Heavy Bondage Script effect. Details of this effect:

 

 

The goal is to implement an ad hoc deviously helpless lite, that makes enemies see the player as not worth fighting if they're completely helpless.

 

Here's the script I have so far:

 

set $actorName resultfrom actor_name $system.self
if actor_isaffectedby $system.self "Devious Devices - Integration.esm:507835"
;if actor_isaffectedby $system.self "Devious Devices - Integration.esm:0x07BFBB"
	msg_notify $"{$actorName} is helpless."  
	actor_setfactionrank $system.self "Skyrim.esm:0x0AA784" 1000
else
	msg_notify $"{$actorName} is no longer helpless."
	actor_setfactionrank $system.self "Skyrim.esm:0x0AA784" -1
endif

 

Most of it seems to work - I see the messages, they capture the player name fine, and even the faction works (although it's admittedly a bit dodgy to use the prisoner faction in this way, as it might interfere with other, similar implementations). Unfortunately the actor_isaffectedby check appears not to work, despite my best efforts, either with hex or decimal values; it always triggers the else flow.

 

Can anyone shed light into why this might be? I've tried several permutations but overall feel as though the issue must be that actor_isaffectedby isn't behaving as I expect it to, as it won't even properly detect baseline skyrim effects. 

 

Thanks,

 

1 hour ago, sedoacsltwwloqrddi said:

I've tried the following to test different interpretations of the value in various hex and non-hex iterations, but it just reliably returns false, even when i can confirm it's targeting the right object and that the object has an effect with this value

 

set $DDI1 resultfrom actor_isaffectedby $system.self "Devious Devices - Integration.esm:0x07BFBB"
msg_console "DDI1: " $DDI1

set $DDI2 resultfrom actor_isaffectedby $system.self "0x07BFBB|Devious Devices - Integration.esm"
msg_console "DDI2: " $DDI2

set $DDI3 resultfrom actor_isaffectedby $system.self "507835|Devious Devices - Integration.esm"
msg_console "DDI3: " $DDI3

set $DDI4 resultfrom actor_isaffectedby $system.self "503824315|Devious Devices - Integration.esm"
msg_console "DDI4: " $DDI4

 

Weirdly it also seems to be calling each of them twice, but within sequence, (that is, DDI1, DDI1, DDI2, DDI2, DDI3, DDI3, DDI4, DDI4), leading me to believe that the act of setting the result is somehow printing to console as well.

 

I just released v0.971 to fix this; a bug which causes actor_isaffectedby to fail. Thank you for pointing it out to me. It's been there since v18 (i.e. one of the absolute earliest changes I made after forking), so my apologies to everyone who has tried it, seen it fail, wondered why it failed, and quit using it.

 

I've tested it this time to make sure it works. 

 

Also, point of note, in your first version of your script, this construct:

 

if actor_isaffectedby $system.self "Devious Devices - Integration.esm:507835"

 

isn't valid syntax. :(  I would like to make things even more syntactically sugary, and not having 'if <function call>' is equally annoying to me as the developer. :/

 

So, you'd have to do something like:

 

set $DDI resultfrom actor_isaffectedby $system.self "Devious Devices - Integration.esm:507835"
if $DDI

which you had switched to in the second block. :) I just wanted to mention it in case anyone else saw the code later on and thought it might be valid.

Posted
2 hours ago, sedoacsltwwloqrddi said:

I've tried the following to test different interpretations of the value in various hex and non-hex iterations, but it just reliably returns false, even when i can confirm it's targeting the right object and that the object has an effect with this value

 

set $DDI1 resultfrom actor_isaffectedby $system.self "Devious Devices - Integration.esm:0x07BFBB"
msg_console "DDI1: " $DDI1

set $DDI2 resultfrom actor_isaffectedby $system.self "0x07BFBB|Devious Devices - Integration.esm"
msg_console "DDI2: " $DDI2

set $DDI3 resultfrom actor_isaffectedby $system.self "507835|Devious Devices - Integration.esm"
msg_console "DDI3: " $DDI3

set $DDI4 resultfrom actor_isaffectedby $system.self "503824315|Devious Devices - Integration.esm"
msg_console "DDI4: " $DDI4

 

Weirdly it also seems to be calling each of them twice, but within sequence, (that is, DDI1, DDI1, DDI2, DDI2, DDI3, DDI3, DDI4, DDI4), leading me to believe that the act of setting the result is somehow printing to console as well.

 

Also, also... when you say "calling them twice", what do you mean?

 

In the block you've shown, I would expect to see output like:

 

DDI1: false

DDI2: false

DDI3: false

DDI4: false

 

Are you saying you got:

 

DDI1: false

DDI1: false

DDI2: false

DDI2: false

DDI3: false

DDI3: false

DDI4: false

DDI4: false

 

Or am I misunderstanding?

Posted
35 minutes ago, hextun said:

 

Also, also... when you say "calling them twice", what do you mean?

 

In the block you've shown, I would expect to see output like:

 

DDI1: false

DDI2: false

DDI3: false

DDI4: false

 

Are you saying you got:

 

DDI1: false

DDI1: false

DDI2: false

DDI2: false

DDI3: false

DDI3: false

DDI4: false

DDI4: false

 

Or am I misunderstanding?

 

That's correct, and exactly matches what I'm getting. I've tried removing the msg_console to see if the assignment function was printing to console for some reason, but can confirm that it doesn't - each msg_console line alone seems to be printing twice, although I'm not yet certain why.

 

Thank you so much for your thoughtful comments - I'll update my script accordingly and let you know what I find. 

Posted
On 10/1/2025 at 4:20 AM, hextun said:

 

I suspect I know the problem, but first, can you confirm whether you have "powerofthree's Tweaks" installed? https://www.nexusmods.com/skyrimspecialedition/mods/51073

 

I have had an undocumented dependency for awhile and that mod is responsible for making sure all editorIDs are present at runtime. I look up the MGEF records by editorID; that's the only reason I can think of for that error to be occurring.

 

I will update the README to reflect the corrected dependency.

Oop, seems like that was it

Posted
1 hour ago, hextun said:

 

Also, also... when you say "calling them twice", what do you mean?

 

In the block you've shown, I would expect to see output like:

 

DDI1: false

DDI2: false

DDI3: false

DDI4: false

 

Are you saying you got:

 

DDI1: false

DDI1: false

DDI2: false

DDI2: false

DDI3: false

DDI3: false

DDI4: false

DDI4: false

 

Or am I misunderstanding?

 

Did some more testing here - this only does duplicates for the Equipping trigger. I have mine set up with everything as Any except when equipping an item.

 

I suspect what may be happening is specific to the way Devious Devices handles equipping and unequipping armbinders - I think it's running functions that would ordinarily remove or re-equip either clothes my character would have worn or that would be obscured by an armbinder, and that despite those not existing it's causing the value to trigger like crazy.

 

I'll see if I can set the filter to be pickier about what it's triggering on. It looks like your script is fine. And I am seeing TRUE sometimes now, although the noise makes it difficult to diagnose exactly what's going on.

Posted
3 hours ago, hextun said:

 

What is the mod filename (i.e. is it still "cum alchemy.esp"?)

 

Just need the filename and the formIDs. :)  

The file name is the same. 'Cum Alchemy.esp'


I downloaded1190904793_CumAlchemyRemasteredv1.6.6ESPFE.7z from the mod page.
The form IDs are like this.
image.png.23a69a306621f7917fefca4ffab5a74e.png

image.png.305d49b2c218e52d1cabd0019feac0c2.png

Thanks for helping out!

Posted
6 hours ago, sedoacsltwwloqrddi said:

 

Did some more testing here - this only does duplicates for the Equipping trigger. I have mine set up with everything as Any except when equipping an item.

 

I suspect what may be happening is specific to the way Devious Devices handles equipping and unequipping armbinders - I think it's running functions that would ordinarily remove or re-equip either clothes my character would have worn or that would be obscured by an armbinder, and that despite those not existing it's causing the value to trigger like crazy.

 

I'll see if I can set the filter to be pickier about what it's triggering on. It looks like your script is fine. And I am seeing TRUE sometimes now, although the noise makes it difficult to diagnose exactly what's going on.

 

Could be interesting to use these request variables:

 

$request.core.equipped_item.base_form Form - (Added by SLTR Core) (for Player Equipment Change) the base Form for the item that was equipped/unequipped
$request.core.equipped_item.object_reference ObjectReference - (Added by SLTR Core) (for Player Equipment Change) the ObjectReference from the original event; typically only available for unique items (e.g. artifacts)

 

to see, in each script instance, what it's being handed. Unless an item (or hidden/script item) is being equipped twice, each script instance, I would think, would at minimum have a unique $request.core.equipped_item.object_reference

Posted (edited)
5 hours ago, Edzio said:

The file name is the same. 'Cum Alchemy.esp'


I downloaded1190904793_CumAlchemyRemasteredv1.6.6ESPFE.7z from the mod page.
The form IDs are like this.
image.png.23a69a306621f7917fefca4ffab5a74e.png

image.png.305d49b2c218e52d1cabd0019feac0c2.png

Thanks for helping out!

 

So... that's a lot. :)

 

Tell you what... if you convert the CreatureVials.sltscript and HumanVials.sltscript to use the new FormIDs, I'll happily bundle it all up and add it to the .. club (man I hate that name... it's just a script-hole... not a.. club).

 

For example, "Dried Cum" would be "cum alchemy.esp:0x44800". The current script still uses the decimal format, but why bother when hex works and xedit displays it?

 

For that matter, I should probably grab some of the other little mini-bundles and conversions I've put out and consolidate them there.

Edited by hextun
Posted (edited)
5 hours ago, hextun said:

 

Could be interesting to use these request variables:

 

$request.core.equipped_item.base_form Form - (Added by SLTR Core) (for Player Equipment Change) the base Form for the item that was equipped/unequipped
$request.core.equipped_item.object_reference ObjectReference - (Added by SLTR Core) (for Player Equipment Change) the ObjectReference from the original event; typically only available for unique items (e.g. artifacts)

 

to see, in each script instance, what it's being handed. Unless an item (or hidden/script item) is being equipped twice, each script instance, I would think, would at minimum have a unique $request.core.equipped_item.object_reference

 

This is fascinating - I found a workaround that I think is somewhat more elegant at the moment, but I hadn't found these in your documentation. After some more rooting around I've found them in Scripts - opens up a lot more potential customization. Once I've got this working I'll post my scripts here so anyone else can try them out (although some of my intent is very specific to my mod setup).

 

I love how thorough your documentation is. 

 

I'm working on a slightly different paradigm than the equip/unequip detection now, and found another function behaving not as I expect. Specifically, on "player hit or is hit" event, with "player being attacked", the $request.core.player_on_hit.attacker returns a form. Which is well and fine, but I'm not certain how to get from a form to an actor. Is this intended? If so, do you know how I can get from a form to an actor to e.g. start a SL scene? 

 

Context / Overall intention:

Spoiler

- When a player changes locations, check if they're restrained. If they are, add them to the prisoner faction and let the player know they're helpless. If not, remove them from the prisoner faction and let the player know they're no longer helpless.

- If a player in the prisoner faction attacks someone, remove their helpless flag.

- If a player is attacked, but is restrained, re-add their helpless flag and stop combat. 

 

The above all works surprisingly well, however I'd like to add a sexlab phase to "if a player is attacked", to reflect a frustrated captor punishing their belligerent captive, and also to encourage the actual player to not abuse this set of functions to clear a dungeon without consequence, but $request.core.player_on_hit.attacker doesn't seem to be usable as an actor for the purposes of sl_startsex. Is there a better way to do this?

 

Actual error being thrown;

Spoiler

[2025-10-03 08:39:39.648] [log] [warning] [sl_triggers.cpp:755] SLTR:(HelplessProtection.sltscript)[4]: Cmd.ResolveActor: ResolveForm() returned ([ActorBase < (00000007)>]) but was not an Actor; unable to convert
[2025-10-03 08:39:39.682] [log] [warning] [sl_triggers.cpp:755] SLTR:(HelplessProtection.sltscript)[5]: Cmd.ResolveActor: ResolveForm() returned ([ActorBase < (FF001F38)>]) but was not an Actor; unable to convert

 

Edit: From your section on forms here I suspect what's happening is that the resolveActor function doesn't see the returned form as potential actors, but I'm not certain why that might be. I believe the 00000007 form is the player - it could be a mismatch between base form and current form...

 

Edit 2: I found a workaround using your wonderful tutorial for sl_find_available_partners, although it does sometimes pick someone who wasn't the original aggressor. Is there a way to make sl_find_available_partners search for 'up to' the requirements, instead of just returning the mandatory actors if it can't find more? I suppose I could make a loop and pass the current set as required each iteration.

 

Thanks,

Edited by sedoacsltwwloqrddi
Posted
16 hours ago, Gooberissimo said:

Oop, seems like that was it

 

No need for an "oops" on your part; my bad for not properly reporting the dependencies.

 

I suppose I should go ahead and set the dependencies up in the FOMOD.

Posted
4 hours ago, sedoacsltwwloqrddi said:

 

This is fascinating - I found a workaround that I think is somewhat more elegant at the moment, but I hadn't found these in your documentation. After some more rooting around I've found them in Scripts - opens up a lot more potential customization. Once I've got this working I'll post my scripts here so anyone else can try them out (although some of my intent is very specific to my mod setup).

 

I love how thorough your documentation is. 

 

I'm working on a slightly different paradigm than the equip/unequip detection now, and found another function behaving not as I expect. Specifically, on "player hit or is hit" event, with "player being attacked", the $request.core.player_on_hit.attacker returns a form. Which is well and fine, but I'm not certain how to get from a form to an actor. Is this intended? If so, do you know how I can get from a form to an actor to e.g. start a SL scene? 

 

Context / Overall intention:

  Reveal hidden contents

- When a player changes locations, check if they're restrained. If they are, add them to the prisoner faction and let the player know they're helpless. If not, remove them from the prisoner faction and let the player know they're no longer helpless.

- If a player in the prisoner faction attacks someone, remove their helpless flag.

- If a player is attacked, but is restrained, re-add their helpless flag and stop combat. 

 

The above all works surprisingly well, however I'd like to add a sexlab phase to "if a player is attacked", to reflect a frustrated captor punishing their belligerent captive, and also to encourage the actual player to not abuse this set of functions to clear a dungeon without consequence, but $request.core.player_on_hit.attacker doesn't seem to be usable as an actor for the purposes of sl_startsex. Is there a better way to do this?

 

Actual error being thrown;

  Reveal hidden contents

[2025-10-03 08:39:39.648] [log] [warning] [sl_triggers.cpp:755] SLTR:(HelplessProtection.sltscript)[4]: Cmd.ResolveActor: ResolveForm() returned ([ActorBase < (00000007)>]) but was not an Actor; unable to convert
[2025-10-03 08:39:39.682] [log] [warning] [sl_triggers.cpp:755] SLTR:(HelplessProtection.sltscript)[5]: Cmd.ResolveActor: ResolveForm() returned ([ActorBase < (FF001F38)>]) but was not an Actor; unable to convert

 

Edit: From your section on forms here I suspect what's happening is that the resolveActor function doesn't see the returned form as potential actors, but I'm not certain why that might be. I believe the 00000007 form is the player - it could be a mismatch between base form and current form...

 

Edit 2: I found a workaround using your wonderful tutorial for sl_find_available_partners, although it does sometimes pick someone who wasn't the original aggressor. Is there a way to make sl_find_available_partners search for 'up to' the requirements, instead of just returning the mandatory actors if it can't find more? I suppose I could make a loop and pass the current set as required each iteration.

 

Thanks,

 

First, thank you for the kind words!

 

$request.core.player_on_hit.attacker is a Form, but isn't it an Actor?

TL;DR - It's an Actor stored in a Form variable; using it with functions expecting an Actor will automatically cast the Form back to Actor.

 

SLTScript only knows "Forms", but all that means is that "it's not an int, a string, a bool, an Alias, a [Label], ..." etc. Since an Actor->ObjectReference->Form, you can store an Actor in a Form variable. And in fact, I really mostly internally just have the FormID (except briefly when returning values, for efficiency). Then, during calls to e.g. ResolveActor(), what it's doing is fetching the Form and casting to Actor. Same with ResolveObjRef(). For other types, when a function needs it, they do ResolveForm() and cast (i.e. actor_isaffectedby; requires SPEL and MGEF records (Spell and MagicEffect).

 

So when I document that "$request.core.player_on_hit.attacker" is of type "Form", all I'm saying is "it's not an int, or a string, this is the all new 2025 Form". If you pass that variable to something expects an Actor, an ObjectReference, or a Form, it will work. Pass it to anything else and the function in question will either silently fail (i.e. pretend you sent an invalid Form-based thing, which you would have) or, if I've properly coded it, print a message to the log telling you it couldn't resolve X from Y and *then* fail.

 

In truth, all I'm doing is taking the Actor or ObjectReference that I received during event handling and stuffing it into a Form variable.

 

All of which to say, you can safely ignore the fact that it is documented as a Form and just use variables where you think they should go. 

 

Player FormID

The base FormID for the Player is 0x7; the FormID of the PlayerRef is 0x14. 0x7 is an ActorBase while ResolveActor is, of course, looking for an Actor.

 

And I have a bug in sl-triggers.dll that is storing the baseobject instead of the actual object.

 

Thank you for pointing this out; I'll be putting out a fix soon. :)

 

sl_find_available_partners

So, this SLTR function is a wrapper around the SexLabFramework API function, FindAvailablePartners:

 

Spoiler
;/* FindAvailablePartners
* * Searches within a given area for multiple SexLab valid actors
* * 
* * @param: Actor[] Positions - A list of actors, where at least one is specified (the other items can be set to None)
* * @param: int TotalActors - The desired total number of actors you want in the return array.
* * @param: int Males [OPTIONAL] - From the TotalActors amount, you want at least this many males.
* * @param: int Females [OPTIONAL] - From the TotalActors amount, you want at least this many females.
* * @param: float Radius [OPTIONAL] - The distance from the center point to search.
* * @return: Actor[] - A list of valid actors, the length of the list is the same as the Positions parameter, then number of valid actors can be less than this value.
*/;
Actor[] function FindAvailablePartners(Actor[] Positions, int TotalActors, int Males = -1, int Females = -1, float Radius = 10000.0)
	return ThreadLib.FindAvailablePartners(Positions, TotalActors, Males, Females, Radius)
endFunction

 

 

Note that in the SexLab P+ this function is deprecated, but still being used by SLTR. In any event, that's it. I don't have any more control over it than what you see here, which I tried to pass along the same interface.

 

Note that SexLabFramework.psc has a number of functions, including multiple functions related to finding, filtering, and sorting partners. If you see some that could resolve your problem (i.e. I just haven't exposed enough of the API) let me know and I can look into adding the binding.

 

Posted

Okay, 0.972 posted, (pinging @sedoacsltwwloqrddi) fixing population of $request.core.player_on_hit.attacker and $request.core.player_on_hit.target, to populate them with the original ObjectReference and not just the BaseForm. :)

 

 

Posted

Okay, there was a multi-minute window during which the FOMOD contained a copy of sl-triggers.dll with kinda spammy output (I was using for debugging) related to the Player On Hit trigger. I have replaced the FOMOD with a quietened .dll, but on the off chance you have a copy and don't want it, just obtain a new copy of 0.972 :/

 

Posted
1 hour ago, hextun said:

Okay, 0.972 posted, (pinging @sedoacsltwwloqrddi) fixing population of $request.core.player_on_hit.attacker and $request.core.player_on_hit.target, to populate them with the original ObjectReference and not just the BaseForm. :)

 

 

Amazing, thank you. I think the workaround ended up being fine / just as useful, but this will be fantastic for more specific use cases, i.e. any case where I want something specifically to happen to the attacker, or where the player isn't the target. I'm amazed at how flexible this all is; it's like a much less brittle / easier to work with version of native skyrim scripting that I don't even have to reload my game to test.

Posted (edited)
20 hours ago, hextun said:

 

So... that's a lot. :)

 

Tell you what... if you convert the CreatureVials.sltscript and HumanVials.sltscript to use the new FormIDs, I'll happily bundle it all up and add it to the .. club (man I hate that name... it's just a script-hole... not a.. club).

 

For example, "Dried Cum" would be "cum alchemy.esp:0x44800". The current script still uses the decimal format, but why bother when hex works and xedit displays it?

 

For that matter, I should probably grab some of the other little mini-bundles and conversions I've put out and consolidate them there.

So, I've changed the creature and human slscript to the new form id from the json files provided in the ESPFE version.
It is working so far. some of the trigger options in the MCM does not give vial. I don't know if I understood the options well.
For example: if I set Player Relationship to Partner Player and Sex to male. No vial is given. (Note: Ostim options for this same config works for human and gives vial. But It only gives Mysterious Vial not race specific!)
Atleast it worked for Sexlab after tinkering with the options. Also gives specific vials for different race. Just not for Ostim. Ostim always gives Mysterious Vial regardless of race.
These are the trigger options I'm using.
Untitled.jpg.0d0ad28e81f17b9588633be95d9e0145.jpg

 

However I saw this error in the error log. It triggers for creature script i think.
[2025-10-04 12:59:26.178] [log] [warning] [util.cpp:517] GetForm: data(dragonborn.esm:67221051) appears valid, but dataHandler->LookupForm() returned nullptr
[2025-10-04 12:59:26.178] [log] [error] [util.cpp:582] Form not found (dragonborn.esm:67221051)
[2025-10-04 12:59:26.218] [log] [error] [sl_triggers.cpp:747] SLTR:(CreatureVials.sltscript)[3]: Form not found (dragonborn.esm:67221051)

I have checked in your slscript and Cum Alchemy json files for creature. It includes this line
Json---
      ["actor_getgender", "$partner"],
      ["if", "$$", "!=", "2", "end"],
      ["actor_infaction", "$partner", "dragonborn.esm:67221051"],

slscript---
actor_getgender $system.partner
if $$ !=  2 [end]
actor_infaction $system.partner "dragonborn.esm:67221051"

I haven't found anything in xEdit with this form id.
Any suggestions?

Edit: I think these error is shown when Ostim is used.
[2025-10-04 13:08:31.824] [log] [warning] [sl_triggers.cpp:755] SLTR:(HumanVials.sltscript)[4]: actor_race: Unable to resolve actor token($system.partner)
[2025-10-04 13:09:14.933] [log] [warning] [sl_triggers.cpp:755] SLTR:(HumanVials.sltscript)[4]: actor_race: Unable to resolve actor token($system.partner)
 

Edited scripts are in the zip file.

Cum Alchemy slscript ESPFE.zip

Edited by Edzio
Posted

I´m sure this is very easy to do, but not for someone like me. I´m looking for a simple way to implement an SL trigger that applies a tattoo if the partner in a scene is a certain race. (not creature/human/undead, but breton/nord/redguard) the apply tattoo part with the help of rate tats I understand, but the first part I´m struggling with.
I´m not looking for a way to filter out of a list or rnd.
just a simple "if partner in SL scene has race x, then apply tattoo" command. 

 

Posted
1 hour ago, Tiff199191925 said:

I´m sure this is very easy to do, but not for someone like me. I´m looking for a simple way to implement an SL trigger that applies a tattoo if the partner in a scene is a certain race. (not creature/human/undead, but breton/nord/redguard) the apply tattoo part with the help of rate tats I understand, but the first part I´m struggling with.
I´m not looking for a way to filter out of a list or rnd.
just a simple "if partner in SL scene has race x, then apply tattoo" command. 

 

 

Important note! This template targets $system.self as opposed to what you want, $system.partner. One line change, top of the script. You'll need to insert your race specific code where appropriate further down. Happy coding!

Posted (edited)
On 10/4/2025 at 2:04 AM, Edzio said:

So, I've changed the creature and human slscript to the new form id from the json files provided in the ESPFE version.
It is working so far. some of the trigger options in the MCM does not give vial. I don't know if I understood the options well.
For example: if I set Player Relationship to Partner Player and Sex to male. No vial is given. (Note: Ostim options for this same config works for human and gives vial. But It only gives Mysterious Vial not race specific!)
Atleast it worked for Sexlab after tinkering with the options. Also gives specific vials for different race. Just not for Ostim. Ostim always gives Mysterious Vial regardless of race.
These are the trigger options I'm using.
Untitled.jpg.0d0ad28e81f17b9588633be95d9e0145.jpg

 

However I saw this error in the error log. It triggers for creature script i think.
[2025-10-04 12:59:26.178] [log] [warning] [util.cpp:517] GetForm: data(dragonborn.esm:67221051) appears valid, but dataHandler->LookupForm() returned nullptr
[2025-10-04 12:59:26.178] [log] [error] [util.cpp:582] Form not found (dragonborn.esm:67221051)
[2025-10-04 12:59:26.218] [log] [error] [sl_triggers.cpp:747] SLTR:(CreatureVials.sltscript)[3]: Form not found (dragonborn.esm:67221051)

I have checked in your slscript and Cum Alchemy json files for creature. It includes this line
Json---
      ["actor_getgender", "$partner"],
      ["if", "$$", "!=", "2", "end"],
      ["actor_infaction", "$partner", "dragonborn.esm:67221051"],

slscript---
actor_getgender $system.partner
if $$ !=  2 [end]
actor_infaction $system.partner "dragonborn.esm:67221051"

I haven't found anything in xEdit with this form id.
Any suggestions?

Edit: I think these error is shown when Ostim is used.
[2025-10-04 13:08:31.824] [log] [warning] [sl_triggers.cpp:755] SLTR:(HumanVials.sltscript)[4]: actor_race: Unable to resolve actor token($system.partner)
[2025-10-04 13:09:14.933] [log] [warning] [sl_triggers.cpp:755] SLTR:(HumanVials.sltscript)[4]: actor_race: Unable to resolve actor token($system.partner)
 

Edited scripts are in the zip file.

Cum Alchemy slscript ESPFE.zip 1.64 kB · 1 download

 

So, the 67221051 came from the original, and apparently included the mod index but excluded the highest order bits. Anyhow, I'm a dumbass that forgot that since po3 is a requirement for SLTR, you have access to editorIDs. Because of the regularity of the labels and editorIDs, I was able to (hopefully correctly) convert all of the values to appropriate editorIDs. This means it should now be functional for either ESP or ESL versions.

 

As for SexLab vs OStim, I was able to alter HumanVials.sltscript so that it checks for the existence of both $system.partner and $system.ostim.partner and uses the first it finds that is set. Unfortunately CreatureVials.stlscript relies on a SexLab dependent feature of actor_race to retrieve the race of creatures, so without SexLab installed, I don't think that script will work. Mind you, with both OStim and SexLab installed, an OStim scene would work with it. I need to investigate this and see how to obtain parity here.

 

Anyhow, here's the latest converted scripts. Let me know how they work; if they do, I'll post them to the script-hole.

 

 

 

 

You can also find an updated "Give Vial" script (to use editorIDs and thus work with ESP or ESPFE) here:

 

 

 

Edited by hextun
fixed the script links to point to the club

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   1 member

×
×
  • Create New...