grandpoopbear Posted August 15, 2025 Posted August 15, 2025 Maybe I've been overlooking something important here for the past few hours cause I'm dead tired. I updated to 135 after using 133 and 134 successfully for about a week, and now there's no SLT Sexlab tab in MCM. It only has SL Triggers and SL Core. I tried a fresh installation of 135 and also tried to go back to 134. No dice for either of them. Reset SL Triggers also does nothing on either of those versions. Tell me there's something I can do about this? It was a really good mod, why did I have to poke the bear by updating. >.<
hextun Posted August 15, 2025 Author Posted August 15, 2025 22 minutes ago, grandpoopbear said: Maybe I've been overlooking something important here for the past few hours cause I'm dead tired. I updated to 135 after using 133 and 134 successfully for about a week, and now there's no SLT Sexlab tab in MCM. It only has SL Triggers and SL Core. I tried a fresh installation of 135 and also tried to go back to 134. No dice for either of them. Reset SL Triggers also does nothing on either of those versions. Tell me there's something I can do about this? It was a really good mod, why did I have to poke the bear by updating. >.< try this. Remove the mod, launch, save, reinstall the mod, load the save. Not sure why the quest wouldn't launch (as that is what drives the extensions) but for some reason it seems they aren't talking to each other.
aoF_6sSQ Posted August 16, 2025 Posted August 16, 2025 (edited) 14 hours ago, hextun said: So, I gotta say, I hadn't expect to deal with this. First, the answer: SLTR (and the original SLT) use an ActiveMagicEffect (i.e. the effect from a custom spell) to run each script. When the script finishes, the effect ends. But the MGEF records are not flagged with "No Death Dispel" which means on death, they will be removed. You mention, however, trying to run the script *after* using the kill command. If you're doing this via the console (i.e. 'slt run "scriptname"), make sure it says it is running the script on the player. If not, use 'prid player' before running the slt run command to make sure the player is selected. And even then, I have to say... I had not considered the possibility of someone wanting to run anything on the player's cold corpse. I have to be honest, I'm not sure if a spell cast in this case is even *supposed* to work. But I'll take a look at the issue. And if you're wondering how we got here, remember that SLT started off primarily as a method of running scripts related specifically to SexLab scenes, where one is not usually concerned with death or responding to it or in spite of it. And until now, that architecture seemed entirely reasonable. Would you mind telling me how you keep the game running (i.e. without the fade to black/restart) once the player is dead, long enough to expect the script to run? I mean, I'm not really even sure how to begin testing this. I used "prid player" before the slt run command, the console print the output which said send request to run on PC. Quote Would you mind telling me how you keep the game running (i.e. without the fade to black/restart) once the player is dead, long enough to expect the script to run? I mean, I'm not really even sure how to begin testing this. I used https://www.nexusmods.com/skyrimspecialedition/mods/46449 to extend the death timer to test the script. I write this script for player's cold corpse, cuz i want to achieve the feature like in Dancing Penis. I will try to flag the "No Death Dispel", and see what happen, thanks for your reply. Edit: After modifying the flag and script, I can confirm the script work fine on dead npc only, PC seems won't accept any spell after dead? Edited August 16, 2025 by aoF_6sSQ
hextun Posted August 16, 2025 Author Posted August 16, 2025 15 hours ago, hextun said: try this. Remove the mod, launch, save, reinstall the mod, load the save. Not sure why the quest wouldn't launch (as that is what drives the extensions) but for some reason it seems they aren't talking to each other. 15 hours ago, grandpoopbear said: Maybe I've been overlooking something important here for the past few hours cause I'm dead tired. I updated to 135 after using 133 and 134 successfully for about a week, and now there's no SLT Sexlab tab in MCM. It only has SL Triggers and SL Core. I tried a fresh installation of 135 and also tried to go back to 134. No dice for either of them. Reset SL Triggers also does nothing on either of those versions. Tell me there's something I can do about this? It was a really good mod, why did I have to poke the bear by updating. >.< I'm dissatisfied with my response here. I have had this happen to me to before during testing and shook it off by restarting (as I was typically in a test cycle). Honestly, I need to revisit the extension registration implementation as I now think it is way overcomplicated and likely what is causing the problem, intermittent though it may be. I will stabilize the extension startup for next release.
hextun Posted August 16, 2025 Author Posted August 16, 2025 6 hours ago, aoF_6sSQ said: I used "prid player" before the slt run command, the console print the output which said send request to run on PC. I used https://www.nexusmods.com/skyrimspecialedition/mods/46449 to extend the death timer to test the script. I write this script for player's cold corpse, cuz i want to achieve the feature like in Dancing Penis. I will try to flag the "No Death Dispel", and see what happen, thanks for your reply. Edit: After modifying the flag and script, I can confirm the script work fine on dead npc only, PC seems won't accept any spell after dead? Okay, I've mulled it over, pulled the Enhanced Death Cam source code from github to see what is going on (https://github.com/powerof3/EnhancedDeathCamera), and I think this is a fundamental flaw/problem/result of the design of SLTR, that is, using Spells and Spell effects to execute scripts. The following is based on a combination of investigation and speculation. Mostly, what I am not 100% sure of are the hard rules regarding post-player death. But judging by the EDC code on github, where what they appear to be doing is modifying camera modes and states, I don't see anything to suggest they are extending actual play time, where spells could still be cast. When any actor except the Player dies, the game is still running normally, even if, due to a mod, you are put into the killcam mode, because that's just a camera state and different from the actual player state. However, when the player dies, a lot more happens than for any other actor; part of that is to go into a potential post-death cam scene, which Enhanced Death Camera takes control of, but that doesn't mean that normal game processing activity is necessarily happening. So when the player dies, by the time SLTR has a chance to respond, the player is already dead, the game is already in the "well, that sucks, let's see how it went down" mode and as far as I can tell no amount of coaxing is going to get it to e.g. cast spells. Now... that's not to say it's impossible to do anything at that point, but I am saying that SLTR as currently written cannot. I'll give some thought as to how I might be able to do things post-death, but I don't get the impression the game engine really wants you/me to be able to do that.
grandpoopbear Posted August 16, 2025 Posted August 16, 2025 12 hours ago, hextun said: try this. Remove the mod, launch, save, reinstall the mod, load the save. Not sure why the quest wouldn't launch (as that is what drives the extensions) but for some reason it seems they aren't talking to each other. I spent a bit of time on this. I'm not sure why I did yesterday to break it, but I was dead tired. After uninstalling, making a new save, and re-installing and running Loot it hasn't been a problem since in a dozen or so hours, and I've been tweaking it. Properly three options in the MCM as it's supposed to be and even the new features, like the extra command slot. Thanks for the reply; this mod is quite good. Also, I realized a few hours ago that the sltscripts reload in real-time, meaning I can test them without restarting Skyrim. What a useful option. Thanks again. 1
aoF_6sSQ Posted August 16, 2025 Posted August 16, 2025 2 hours ago, hextun said: Okay, I've mulled it over, pulled the Enhanced Death Cam source code from github to see what is going on (https://github.com/powerof3/EnhancedDeathCamera), and I think this is a fundamental flaw/problem/result of the design of SLTR, that is, using Spells and Spell effects to execute scripts. The following is based on a combination of investigation and speculation. Mostly, what I am not 100% sure of are the hard rules regarding post-player death. But judging by the EDC code on github, where what they appear to be doing is modifying camera modes and states, I don't see anything to suggest they are extending actual play time, where spells could still be cast. When any actor except the Player dies, the game is still running normally, even if, due to a mod, you are put into the killcam mode, because that's just a camera state and different from the actual player state. However, when the player dies, a lot more happens than for any other actor; part of that is to go into a potential post-death cam scene, which Enhanced Death Camera takes control of, but that doesn't mean that normal game processing activity is necessarily happening. So when the player dies, by the time SLTR has a chance to respond, the player is already dead, the game is already in the "well, that sucks, let's see how it went down" mode and as far as I can tell no amount of coaxing is going to get it to e.g. cast spells. Now... that's not to say it's impossible to do anything at that point, but I am saying that SLTR as currently written cannot. I'll give some thought as to how I might be able to do things post-death, but I don't get the impression the game engine really wants you/me to be able to do that. Thanks for the explanation, i will keep tracking for the future updates😉
hextun Posted August 17, 2025 Author Posted August 17, 2025 New release, 0.136. Yes, we're entering the brave old world of semantic versioning and yes, we are still at a 0.x version. But close... soooo close. Unfortunately, I cannot guarantee this one is save game compatible; I mean, I literally moved quests out into new .esp files. But I have had EXCELLENT success doing the uninstall/load/save/reinstall method, even excluding use of ReSaver. First, the biggest most obvious change: I for one welcome our new FOMOD overlords. I had been mulling it over anyway, but the question of SexLab vs SexLab P+ compatibility kept bothering me; surely with such a bug change, something would have to change on my end. And it turns out that there were, in fact, a couple of things I was doing that were not right, not least of which being some reliance on SLSO overrides in SexLab API calls. Frabjous day. So I have broken SL and SLP+ compat out separately and currently there are only minor differences, but now I feel more comfortable adding SL functionality because I know I can make sure I am targeting the correct API. I did rather unceremoniously dump all other SL related stuff into a "SexLab Dependent" library, but that's for future me to figure out. Screw that guy. In setting up the FOMOD it also let me (made me, at knife point) fix up my builds to perhaps make it easier to add more such modular additions in the future, and also solved one of my problems: best way to make add-ons visible and available? THROW 'EM IN THE FOMOD BY GOLLY (just watched Superman 2025 and golly it was fun). Let's see... in other news: - did some work with extension registration and it should be much simpler and much less fail-prone (knocks on wood, throws salt over the shoulder, turns around widdershins thrice and calls out to the forest spirits, foisting the sacrificial chicken into the air for appeasement) - there was a bug in the Cell change functionality. Like... many bugs. An infestation if you will. Sprayed it down with Raid and wiped it clean. Should be good now. - there were some OStim specific variables and functions that had the same name as the SL variants because I, at the time, assumed OStim and SexLab were an either/or thing; seems you can have both so I've split out the namespace - removed sla_get_actor_hours_since_last_sex; GetActorHoursSinceLastSex only exists for OSLAroused, not for SexLabAroused
hextun Posted August 17, 2025 Author Posted August 17, 2025 Coming in the next release: sl_startsex Varies slightly between versions because of the variance in tag specification and bed/furniture allowance. Question: what other SexLab functions are you looking for? For the API is vast and much remains to be bound. For example: - Various TreatAsMale/Female/Futa(P+ only) functions to force Actors to be treated as the indicated sex (seems mid-low useful) - Actor validation/forbiddence/allowance - is an actor valid for a SL scene? do you want to forbid/allow them to participate in SL scenes? (this seems low useful to me) - FindAvailableActor (multiple variations on this) (seems mid-high useful) - cum fx (count, apply) (could see mid-high usefulness here if you wanted to tie actions to cum levels as checked periodically?) Note also: there are a lot of bits and bobs that have been deprecated in P+. At the moment, for example, sl_animname in P+ is implemented using legacy/deprecated functions because no matching functionality exists (or, based on a brief exchange I had, is ever likely to exist) in the new architecture. So once that door closes, for example, sl_animname goes away for P+ compatibility. As a result, if a suggestion comes up for a P+ feature but it requires legacy functions to access, I'll be hesitant.
Fraying9981 Posted August 17, 2025 Posted August 17, 2025 (edited) 1 hour ago, hextun said: Coming in the next release: sl_startsex Varies slightly between versions because of the variance in tag specification and bed/furniture allowance. Question: what other SexLab functions are you looking for? For the API is vast and much remains to be bound. For example: - Various TreatAsMale/Female/Futa(P+ only) functions to force Actors to be treated as the indicated sex (seems mid-low useful) - Actor validation/forbiddence/allowance - is an actor valid for a SL scene? do you want to forbid/allow them to participate in SL scenes? (this seems low useful to me) - FindAvailableActor (multiple variations on this) (seems mid-high useful) - cum fx (count, apply) (could see mid-high usefulness here if you wanted to tie actions to cum levels as checked periodically?) Note also: there are a lot of bits and bobs that have been deprecated in P+. At the moment, for example, sl_animname in P+ is implemented using legacy/deprecated functions because no matching functionality exists (or, based on a brief exchange I had, is ever likely to exist) in the new architecture. So once that door closes, for example, sl_animname goes away for P+ compatibility. As a result, if a suggestion comes up for a P+ feature but it requires legacy functions to access, I'll be hesitant. if i understand correctly, sl_startsex would trigger sex scenes start based on world conditions. you can do something even better than this mod below, already amazing. I have faith in you What I find great in this mod: consensual/non consensual logic probability based system with multiple parameters gender specific settings scene types location based settings (which you already have) Ideas of improvement: player specific settings (in SMM player is mixed with followers which is not ideal as it can directly interrupt your gameplay by triggering a scene with you; the reason for this is not design philosophy but probably rather that the mod author was already busy with all the other options and took a shortcut) sex scene triggers combat option (no sex in public) since SLT is more customizable: define sequences for sex: for example in the case of non con, sequence #1 is groping, sequence #2 is the real thing take/give items after sex (already in SLT) store a list of actors (hall of fame/felony list) Edited August 17, 2025 by Fraying9981
hextun Posted August 18, 2025 Author Posted August 18, 2025 13 hours ago, Fraying9981 said: if i understand correctly, sl_startsex would trigger sex scenes start based on world conditions. you can do something even better than this mod below, already amazing. I have faith in you What I find great in this mod: consensual/non consensual logic probability based system with multiple parameters gender specific settings scene types location based settings (which you already have) Ideas of improvement: player specific settings (in SMM player is mixed with followers which is not ideal as it can directly interrupt your gameplay by triggering a scene with you; the reason for this is not design philosophy but probably rather that the mod author was already busy with all the other options and took a shortcut) sex scene triggers combat option (no sex in public) since SLT is more customizable: define sequences for sex: for example in the case of non con, sequence #1 is groping, sequence #2 is the real thing take/give items after sex (already in SLT) store a list of actors (hall of fame/felony list) Hah, good point, I guess I didn't really say what sl_startsex is exactly. Here's the SexLab doc-header: ; sltname sl_startsex ; sltgrup SexLab ; sltdesc Starts a SexLab scene and returns the threadid ; sltargs Form[] list: actors: Form[] list containing the Actors to be in the scene, limited to 5 ; sltargs Form: submissive: Form (Actor) to be the submissive in the scene; specify 'none' if no submissive to be set; must also be in the actors list ; sltargs string: tags: (From the SexLabFramework source) AnimationTags [OPTIONAL], is the list of tags the animation has to have. You can add more than one tag by separating them by commas "," (Example: "Oral, Aggressive, FemDom"), the animations will be collected if they have at least one of the specified tags. ; sltargs bool: allowBed: true to allow bed use, false otherwise ; sltsamp sl_startsex $actorList none "Oral, Anal" false ; sltsamp ; starts a sex scene with the given actor list, no victims, oral or anal tagged only, with no beds allowed ; sltsamp sl_startsex $actorList $actorList[0] "Vaginal" true ; sltsamp ; starts a sex scene with the given actor list, the first on the list being the submissive, vaginal tagged only, beds allowed And the SexLab P+ version doc-header: ; sltname sl_startsex ; sltgrup SexLab P+ ; sltdesc Starts a SexLab scene and returns the threadid ; sltargs Form[] list: actors: Form[] list containing the Actors to be in the scene, limited to 5 ; sltargs Form: submissive: Form (Actor) to be the submissive in the scene; specify 'none' if no submissive to be set; must also be in the actors list ; sltargs string: tags: (From the SexLabFramework source) Requested animation tags (may be empty). Supported prefixes: '-' to disable a tag, '~' for OR-conjunctions ; sltargs Example: "~A, B, ~C, -D" <=> Animation has tag B, does NOT have tag D and has EITHER tag A or C ; sltargs int: furniture: 0 - Disable, 1 - Allow, 2 - Prefer ; sltsamp sl_startsex $actorList none "Oral, Anal" 0 ; sltsamp ; starts a sex scene with the given actor list, no victims, oral or anal tagged, with no beds allowed ; sltsamp sl_startsex $actorList $actorList[0] "Vaginal" 1 ; sltsamp ; starts a sex scene with the given actor list, the first on the list being the submissive, vaginal tagged, beds allowed but not necessarily preferred Slight difference regarding tags and bed/furniture. Both use lists (this actual function, StartSex, was what first spiked my drive to implement lists, funnily enough; this request has been on the list for awhile). It's a new SLTScript function that will allow you to initiate a SexLab scene by providing: - the list of Actors - an optional submissive - a single string containing zero (i.e. empty string) or more tag designations (like Oral, Anal) but as you can see the formatting changed between versions - an indicator for bed/furniture use (also changed between SexLab versions) Note that this does no validation: if you pick an actor already in a scene, your call won't work. There are other APIs to help find and validate potential SexLab scene actors, and of course you can use SLTScript to do some of the checks already (i.e. sl_isin). Thus me talking about maybe adding those APIs as well. In fact, in this next release I will be updating the SexLab P+ version to eliminate as many of the deprecated API usages as I can. Currently the only one I haven't been able to convert is sl_animname. SexLab P+ took a philosophy of isolating a developer from needing to work directly with animations; as a result, while you can still get the animation name, that's only until they remove access to the now deprecated approach needed to obtain it. Also, the return values of some functions differ. Docs are updated to reflect this. Anyhow, yup, slap this bad boy into an SLTScript and you can trigger it however you like. On to your idea: I love the mini-game (mini-mod?) idea. I'll point out that SRM is a great mod, one that is in one of my test modlists. There are also a number of mods that will initiate sex, including the SexLab P+ Matchmaker. But yes, especially now that I'm thinking about an SLTScript function to try to force combat, one could create a single set of SLTScripts that can encapsulate much of the logic of many mods. It's been mentioned upstream to have a place where users can share scripts. I'll go further and say that if anyone has an implementation of an addon for SLTR (like these mini-mods or the PetCollarGame mini-game), post it here. I'll give it a look and we (anyone) can discuss it. I'll be happy to help, but a big part of me working to build up a scripting engine is to encourage others to create scripts as well. If it looks like something I'd be willing to take on and support, I'll include it in the github repo, in the extern/add-ons or extern/libraries folder, where I keep things like add-ons (e.g. test scripts, the PetCollar game, or any other mini-mod/mini-game I end up including) and libraries (e.g. the extensions and function libraries that either add integration with mods like SexLab and OStim to support triggers, or that just add new SLTScript functions, like the sexlab-dependencies library and the adult-general library). At that point it would be my obligation to support going forward and would be available in the FOMOD for installation. I would, of course, include attribution if desired. Back to your idea; conceptually: - any settings needed can be accessed via json_* calls and thus persisted (and editable out of game) via json in something like the commandstore folder - sl_startsex accepts an optional 'submissive' parameter, matching the SexLab API; thus con/non-con - I expect this would be using something like the Timer trigger, so probability would just be using rnd_int or rnd_float in script - defining sequences for scene: the SexLab (not P+, but it supports lists of "scenes" and "stages" I think, but I still haven't figured out how to work with them) API supports this, but at the moment I had only implemented the equivalent of the quickstart call, which is solely tag driven; i.e. "just play something that runs Oral or Vaginal". As opposed "okay, start with this foreplay scene, but let's extend with a second foreplay scene, now add these three and this finisher". Or is that not what you were looking at? - I need to review the function library with regard to functions to find nearby actors; now that lists are available, that should open up new options - depending on what you want to have happen, you could have multiple smaller scripts all set to trigger on specific events/filters: on cell change, location change, on hit, sex start, orgasm - in those short scripts you do calculations and update flags - these would be best used only for tracking specific transitions (i.e. you get an increased chance at amory as a werewolf; on transition, increase player's initiation percent by 10, and during nighttime by an additional 10 (two global variables in this case)) - then one script set to run on a timer - can do the baseline time based checks (i.e. if current stamina is < 25% max, decrease amory chance; this would last until the next timer run, which would be more coarse than most mods like SLD) - you could work around the 1 minute granularity by creating a script that is designed to run indefinitely, launched on session start, that checks a global at start and exits if it's found (to prevent multiple copies running) - have it sit in sub-minute util_wait loop updating flags - be careful not to make the loop to short to prevent thrashing - I mean, leaving an SLTRScript to run indefinitely without a wait timer somewhere in there just feels not great; like do you really need that high of a frequency of an update? - SexLabDisparity does a LOT to optimze here for example - how many indents will he use? - this many - checks flags and behaves accordingly - CHALLENGE: no UI/MCM for configuration; no UI for in-game display beyond simple message notification (no HUD for example) - CHALLENGE: overall design; conceptually SLTR has all (or at least is close to having all) of the pieces, but the approach I outlined above was my bleary morning thoughts; it may be an awful approach and there are lot of moving parts to consider; probably - CHALLENGE: performance concerns - e.g.: if you place a timer set to run every minute and it's doing enough processing to last beyond 1 minute, you're likely going to have a bad time @Fraying9981, what are your thoughts?
hextun Posted August 19, 2025 Author Posted August 19, 2025 Btw, something I recently thought of long enough to document to remind myself later and here we are so here we go. I store (most) data simply as strings and do translation to/from various types, keeping note of the expected type for the variable. For Forms that means I use the FormID and then resolve for it when/if needed. Not ideal but gets the job done. Except if your load order changes such that the FormID of a long-term stored (think a global or target variable) Form (like an Actor, a Weapon, or Armor) may no longer be valid. Note that I'm not talking about the FormID strings you are using in your SLTScripts (except for you folks crazy enough to use raw integers; I get it); instead, say you do something like: set $targetActor $system.partner1 if $someCondition set $targetActor $system.partner2 endif What I store is the FormID of $targetActor. Then later, at the point in time I need that form back: somePapyrusClass.APapyrusFunctionThatWantsAnActor( cmdPrimary.ResolveForm(param[1]) as Actor ) That's fine until it's not; if the FormID of the actor changes between saves because you modified your load order, then the resolve will fail later on. The bad news is I will need to go through and modify the internals to store a Form as the more portable version, "modname:relative formid", and that's going to be slower than just grabbing the formid. The good news is the resolve calls accept all valid FormID string types, not just a stored integer FormID, so there's no risk that changing the stored type will cause a failure. In fact, it means that the logic can be drop-in replaced without having to worry about any stored Form variables because as (or if) they are updated, they would be converted to the portable format. But it does mean that if you drop it in expecting to now be load order change safe, you are, but only for variables that have been saved since you updated. Any existing (Form) variables in your save would still be sensitive to a load order change. Using the reset option should clear all stored variables, but again, that will wipe existing state if you are in a mini-game, for example, resetting it back to default values. I'm guessing this wouldn't be a big deal to most, but it will cause surprises.
HardRaine Posted August 20, 2025 Posted August 20, 2025 (edited) I tested this mod out on one profile, as it looks promising. After testing it, I am not ready to commit all of my profiles to this yet. However, this mod breaks the original SL Triggers on every one of my remaining profiles. So I need help cleaning up the mess left behind, so I can return to using the original. Steps taken... 1. disabled SL Triggers Redux, re-enabled Sl Triggers. *Broken* 2. removed SL Triggers Redux. removed SL Triggers. Re-downloaded, and re-installed SL Triggers. *Broken* 3. Redid my bashed patches. *Broken* 4. examined data/SKE folder for remnants, and found nothing obvious. At this point, I need help in understanding what I have to do to get the original to run again. I use it extensively on all of my profiles as a naughty skill trainer. I don't wanna lose that capability. Any help would be appreciated. Update: fixed it. Not sure how, but changing Triggers stalled the Experience mod, and it blocked any skill gains. Reset Experience settings. Reset SL Trigger settings (and trigger definitions), and everything runs again. Edited August 20, 2025 by HardRaine
nopse0 Posted August 20, 2025 Posted August 20, 2025 (edited) How do I initialize a variable, which may get assigned an Actor or not, e.g. if I have something like this util_getrndactor 750 1 actor_isvalid $system.actor if $$ = 0 more actor_isguard $system.actor if $$ = 0 more set $guard $system.actor ... #and then later: actor_isvalid $guard if $$ = 0 end2 actor_modcrimegold $guard $crimegold How do I initialize $guard, if "set $guard $system.actor" is not executed, with "0" ? or is there a special None keyword ? Edit: Think I found it myself, "$system.none" is what I am searching Edited August 21, 2025 by nopse0
hextun Posted August 21, 2025 Author Posted August 21, 2025 16 hours ago, HardRaine said: I tested this mod out on one profile, as it looks promising. After testing it, I am not ready to commit all of my profiles to this yet. However, this mod breaks the original SL Triggers on every one of my remaining profiles. So I need help cleaning up the mess left behind, so I can return to using the original. Steps taken... 1. disabled SL Triggers Redux, re-enabled Sl Triggers. *Broken* 2. removed SL Triggers Redux. removed SL Triggers. Re-downloaded, and re-installed SL Triggers. *Broken* 3. Redid my bashed patches. *Broken* 4. examined data/SKE folder for remnants, and found nothing obvious. At this point, I need help in understanding what I have to do to get the original to run again. I use it extensively on all of my profiles as a naughty skill trainer. I don't wanna lose that capability. Any help would be appreciated. Update: fixed it. Not sure how, but changing Triggers stalled the Experience mod, and it blocked any skill gains. Reset Experience settings. Reset SL Trigger settings (and trigger definitions), and everything runs again. Sorry you had the problem; thankful you came back to post the update.
hextun Posted August 21, 2025 Author Posted August 21, 2025 11 hours ago, nopse0 said: How do I initialize a variable, which may get assigned an Actor or not, e.g. if I have something like this util_getrndactor 750 1 actor_isvalid $system.actor if $$ = 0 more actor_isguard $system.actor if $$ = 0 more set $guard $system.actor ... #and then later: actor_isvalid $guard if $$ = 0 end2 actor_modcrimegold $guard $crimegold How do I initialize $guard, if "set $guard $system.actor" is not executed, with "0" ? or is there a special None keyword ? Edit: Think I found it myself, "$system.none" is what I am searching Yup, that would do it. And I wanted to mention, 'none' is also available as a literal (added after I had added $system.none).
HardRaine Posted August 21, 2025 Posted August 21, 2025 (edited) 7 hours ago, hextun said: Sorry you had the problem; thankful you came back to post the update. I have your mod on my watchlist and have been following its development since early on. I wish you the highest level of success! What you are attempting is not easy... Once you are a little further down the road, I intend to use it heavily to redefine how my vampire profiles operate, and perform (which I'm rebuilding/modernizing now); then move it into the others. Why? I wanna become a vampire by fighting (and/or fucking) ancient vampires. Not by saying; "Timeout, Bob. Damn it, I need to drink a vampire potion. Then I'm gonna kick your ass in 3 days! You just wait, buddy!" That's such lame BS... and you, one day soon, are going to help me do this much better! You just don't know it yet... *giggles* Blood Ballets coming to a town near you. Soon! Edited August 21, 2025 by HardRaine 1
nopse0 Posted August 22, 2025 Posted August 22, 2025 19 hours ago, hextun said: Yup, that would do it. And I wanted to mention, 'none' is also available as a literal (added after I had added $system.none). Btw., in case someone is interested, this is my personal version of "Sex is crime" (SexLab). I had the problem, that when the crimegold gets above 1000 gold, guards try to forcegreet you, but since you cannot react while still in the sex scene, they get aggressive and kill you, and you can do nothing against this, because you are in a scene. This version solves this. It must be executed in the "Begin" event. set $crimegold 0 set $guard $system.none [more] util_wait 0.3 sl_isin $system.self if $$ = false end util_getrndactor 750 1 actor_isvalid $system.actor if $$ = false more sl_isin $system.actor if $$ = true more ; actor_haslos $system.actor $system.self ; if $$ = false more rnd_int 10 100 set $0 $$ inc $crimegold $0 msg_notify "Someone saw you having sex in public! " msg_notify "This may cost you " $0 " crime gold, if a guard is near." actor_isguard $system.actor if $$ = false more set $guard $system.actor goto more [end] if $crimegold = 0 end2 actor_isvalid $guard if $$ = false end2 msg_notify "You are fined " $crimegold " gold for sex crimes!" actor_modcrimegold $guard $crimegold [end2]
nopse0 Posted August 22, 2025 Posted August 22, 2025 (edited) SLTR worked fine for me for a day, or so, but now it's totally screwed up. It doesn't execute my scripts anymore, the only thing I see in the log is "initialScriptName<...>) reported success". I disabled everything (including the "Top o' the Hour to ya!" thing) , and then enabled one little trigger again, which robs 10-500 gold from the player when a sex scene ends: rnd_int 10 500 set $0 $$ item_remove $system.self "skyrim.esm:15" $0 0 msg_notify "You were robbed by " $0 " gold !" and the only thing I see in the log is this (if I enable full logging, before I saw a trace of each executed script line, but now, nothing, only "signalled success") : [2025-08-22 16:09:23.643] [log] [debug] [sl_triggers.cpp:717] SexLab: checking trigger(trigger003.json) [2025-08-22 16:09:23.694] [log] [debug] [sl_triggers.cpp:717] SexLab: actorCount(2) / theSelf([Actor < (00000014)>]) actorRaceType(theSelf)=>(1) / theOther([WIDeadBodyCleanupScript < (0001A6BD)>]) actorRaceType(theOther)=>(2) [2025-08-22 16:09:23.744] [log] [debug] [sl_triggers.cpp:717] SexLab: doRun(True) running scripts [2025-08-22 16:09:23.762] [log] [debug] [sl_triggers.cpp:717] Main.StartCommand targetForm([Actor < (00000014)>]) initialScriptName(Rob gold (10-500)) [2025-08-22 16:09:23.779] [log] [debug] [sl_triggers.cpp:717] Main.StartCommandWithThreadId targetForm([Actor < (00000014)>]) initialScriptName(Rob gold (10-500)) requestId(2318) threadId(2319) [2025-08-22 16:09:23.795] [log] [debug] [sl_triggers.cpp:717] Calling sl_triggers_internal.StartScript(target=<[Actor < (00000014)>]>, initialScriptName=<Rob gold (10-500)>) [2025-08-22 16:09:23.829] [log] [debug] [sl_triggers.cpp:717] sl_triggers_internal.StartScript(target=<[Actor < (00000014)>]>, initialScriptName=<Rob gold (10-500)>) reported success and I got a "Top o' the Hour to ya!" notification at the end of the sex scene, even though the time was 16:09, and I had deleted the Top-of-the-hour feature. Log shows this: [2025-08-22 16:09:23.829] [log] [debug] [sl_triggers.cpp:717] sl_triggers_internal.StartScript(target=<[Actor < (00000014)>]>, initialScriptName=<Rob gold (10-500)>) reported success [2025-08-22 16:09:23.862] [log] [debug] [sl_triggers.cpp:717] Cmd.OnEffectStart [2025-08-22 16:09:23.879] [log] [debug] [sl_triggers.cpp:717] SexLab: actorCount(2) / theSelf([WIDeadBodyCleanupScript < (0001A6BD)>]) actorRaceType(theSelf)=>(2) / theOther([Actor < (00000014)>]) actorRaceType(theOther)=>(1) [2025-08-22 16:09:23.896] [log] [debug] [sl_triggers.cpp:717] SexLab: doRun(False) due to ATTR_PARTNER_RACE [2025-08-22 16:09:23.913] [log] [debug] [sl_triggers.cpp:717] Main.GetExtensions: FormListCount(2) instensions.Length(2) [2025-08-22 16:09:23.963] [log] [debug] [sl_triggers.cpp:717] SLTR:()[1]: scriptfilename(Greetings) rawtokens: (1),(1),(2),(0),(msg_notify),("Top o' the Hour to ya!") [2025-08-22 16:09:23.980] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.slt_Frame_Push: scriptname:Greetings.sltscript: totalLines:1: [2025-08-22 16:09:24.048] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.OnUpdate: before starting threadid(1631) RunningScriptCount is :8 [2025-08-22 16:09:24.064] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.OnUpdate: starting threadid(1631) RunningScriptCount is :9 [2025-08-22 16:09:24.081] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript [2025-08-22 16:09:24.098] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: isExecuting and hasValidFrame [2025-08-22 16:09:24.115] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: lineNum(1) startidx(0) endidx(1) currentScriptName(Greetings.sltscript) initialScriptName(Greetings.sltscript) cmdLine(msg_notify), ("Top o' the Hour to ya!") [2025-08-22 16:09:24.132] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: RunCommandLine values before: for cmdLine(msg_notify), ("Top o' the Hour to ya!"): currentLine(0) totalLines(1) currentScriptName(Greetings.sltscript) initialScriptName(Greetings.sltscript) [2025-08-22 16:09:24.148] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunCommandLine [2025-08-22 16:09:24.165] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve token(msg_notify) [2025-08-22 16:09:24.199] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: InternalResolve: UNRESOLVED: CustomResolveUnresolvedResult to token(msg_notify) [2025-08-22 16:09:24.216] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: Resolve(msg_notify) => [msg_notify] [2025-08-22 16:09:24.233] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: RunOperationOnActor(msg_notify), ("Top o' the Hour to ya!") [2025-08-22 16:09:24.266] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve token("Top o' the Hour to ya!") [2025-08-22 16:09:24.284] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve returning literal STRING (Top o' the Hour to ya!) [2025-08-22 16:09:24.300] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve token("Top o' the Hour to ya!") [2025-08-22 16:09:24.317] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve returning literal STRING (Top o' the Hour to ya!) [2025-08-22 16:09:24.351] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: Top o' the Hour to ya! [2025-08-22 16:09:24.418] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: RunCommandLine result: (CLRR_ADVANCE:1) for cmdLine(msg_notify), ("Top o' the Hour to ya!"): currentLine(0) totalLines(1) currentScriptName(Greetings.sltscript) initialScriptName(Greetings.sltscript) [2025-08-22 16:09:24.435] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: CLRR_ADVANCE; incrementing currentLine [2025-08-22 16:09:24.452] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: Left while loop; currentLine(1) totalLines(1) currentScriptName(Greetings.sltscript) initialScriptName(Greetings.sltscript) [2025-08-22 16:09:24.469] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.OnUpdate: before ending threadid(1631) RunningScriptCount is :9 [2025-08-22 16:09:24.485] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.OnUpdate: ending threadid(1631) RunningScriptCount is :8 [2025-08-22 16:09:33.409] [log] [debug] [sl_triggers.cpp:717] SexLab: checking trigger(trigger003.json) The Papyrus log shows nothing unusual at that time, just a few [08/22/2025 - 04:09:33PM] Error: Cannot call HasKeyword() on a None object, aborting function call stack: [sl_TriggersMain (FE05A83F)].sl_triggersmain.ActorRaceType() - "sl_TriggersMain.psc" Line ? [sl_triggersExtensionSexLab (FE05B800)].sl_triggersExtensionSexLab.ActorRaceType() - "sl_triggersExtension.psc" Line ? [sl_triggersExtensionSexLab (FE05B800)].sl_triggersExtensionSexLab.HandleSexLabCheckEvents() - "sl_triggersExtensionSexLab.psc" Line ? [sl_triggersExtensionSexLab (FE05B800)].sl_triggersExtensionSexLab.OnSexLabEnd() - "sl_triggersExtensionSexLab.psc" Line ? [08/22/2025 - 04:09:33PM] WARNING: Assigning None to a non-object variable named "::temp443" but I think that's normal, I also get these when SLTR is working (probably some missing None checks). Maybe this has to do with that I installed some new mods, "Atlas Map Markers" and "Atlas Map Markers Overhauled", though I don't understand how this can influence such simple things, I don't reference anything SLTR external (except "Skyrim.esm:15", but this shouldn't have changed). Any idea how this can be fixed ? Edit: I reinstalled SLTR-Redux (with clean save), but still the same, "doRun(true)", "reported success", but nothing happens, I don't understand this. I see in the console, that I have an inactive effect "sl_triggers_MGEF_PlayerInSameCell", should this be active ? Ps: Reset also didn't help. I attached the whole log file (very short) Hm, after having a superficial look at the sources, I think that the StorageUtil data is corrupt, the function "SLT.DequeueScriptForTarget" shouldn't return the script 'Greeting', I dont use this. Doesn't the "Reset" MCM button clear all StorageUtil data ? Edit: I found a solution. I simply added a "StorageUtil.ClearAllObjPrefix(Game.GetPlayer(), "SLTR:")" to the "DoInMemoryReset()" function. This way all queued commands for the player actor are deleted. Maybe sometimes the "Top of the hour" timer gets out of control and floods the command queue with the Greetings command, or maybe this is a concurrency problem or so, don't know, but anyway, I am happy that SLTR is working for me again (because it's quite a powerful tool, and makes a lot of things possible). But I would recommend, not to use the "Top of the hour" timer thing. Function DoInMemoryReset() if bDebugMsg SLTDebugMsg("Main: Sending SLT Reset event and clearing StorageUtil for SLTR objects") endif IsResetting = true StorageUtil.ClearAllObjPrefix(Game.GetPlayer(), "SLTR:") ; Clear all frame and thread contexts SendModEvent(EVENT_SLT_RESET()) EndFunction sl-triggers.log Edited August 23, 2025 by nopse0 1
hextun Posted August 23, 2025 Author Posted August 23, 2025 (edited) 20 hours ago, nopse0 said: SLTR worked fine for me for a day, or so, but now it's totally screwed up. It doesn't execute my scripts anymore, the only thing I see in the log is "initialScriptName<...>) reported success". I disabled everything (including the "Top o' the Hour to ya!" thing) , and then enabled one little trigger again, which robs 10-500 gold from the player when a sex scene ends: rnd_int 10 500 set $0 $$ item_remove $system.self "skyrim.esm:15" $0 0 msg_notify "You were robbed by " $0 " gold !" and the only thing I see in the log is this (if I enable full logging, before I saw a trace of each executed script line, but now, nothing, only "signalled success") : [2025-08-22 16:09:23.643] [log] [debug] [sl_triggers.cpp:717] SexLab: checking trigger(trigger003.json) [2025-08-22 16:09:23.694] [log] [debug] [sl_triggers.cpp:717] SexLab: actorCount(2) / theSelf([Actor < (00000014)>]) actorRaceType(theSelf)=>(1) / theOther([WIDeadBodyCleanupScript < (0001A6BD)>]) actorRaceType(theOther)=>(2) [2025-08-22 16:09:23.744] [log] [debug] [sl_triggers.cpp:717] SexLab: doRun(True) running scripts [2025-08-22 16:09:23.762] [log] [debug] [sl_triggers.cpp:717] Main.StartCommand targetForm([Actor < (00000014)>]) initialScriptName(Rob gold (10-500)) [2025-08-22 16:09:23.779] [log] [debug] [sl_triggers.cpp:717] Main.StartCommandWithThreadId targetForm([Actor < (00000014)>]) initialScriptName(Rob gold (10-500)) requestId(2318) threadId(2319) [2025-08-22 16:09:23.795] [log] [debug] [sl_triggers.cpp:717] Calling sl_triggers_internal.StartScript(target=<[Actor < (00000014)>]>, initialScriptName=<Rob gold (10-500)>) [2025-08-22 16:09:23.829] [log] [debug] [sl_triggers.cpp:717] sl_triggers_internal.StartScript(target=<[Actor < (00000014)>]>, initialScriptName=<Rob gold (10-500)>) reported success and I got a "Top o' the Hour to ya!" notification at the end of the sex scene, even though the time was 16:09, and I had deleted the Top-of-the-hour feature. Log shows this: [2025-08-22 16:09:23.829] [log] [debug] [sl_triggers.cpp:717] sl_triggers_internal.StartScript(target=<[Actor < (00000014)>]>, initialScriptName=<Rob gold (10-500)>) reported success [2025-08-22 16:09:23.862] [log] [debug] [sl_triggers.cpp:717] Cmd.OnEffectStart [2025-08-22 16:09:23.879] [log] [debug] [sl_triggers.cpp:717] SexLab: actorCount(2) / theSelf([WIDeadBodyCleanupScript < (0001A6BD)>]) actorRaceType(theSelf)=>(2) / theOther([Actor < (00000014)>]) actorRaceType(theOther)=>(1) [2025-08-22 16:09:23.896] [log] [debug] [sl_triggers.cpp:717] SexLab: doRun(False) due to ATTR_PARTNER_RACE [2025-08-22 16:09:23.913] [log] [debug] [sl_triggers.cpp:717] Main.GetExtensions: FormListCount(2) instensions.Length(2) [2025-08-22 16:09:23.963] [log] [debug] [sl_triggers.cpp:717] SLTR:()[1]: scriptfilename(Greetings) rawtokens: (1),(1),(2),(0),(msg_notify),("Top o' the Hour to ya!") [2025-08-22 16:09:23.980] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.slt_Frame_Push: scriptname:Greetings.sltscript: totalLines:1: [2025-08-22 16:09:24.048] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.OnUpdate: before starting threadid(1631) RunningScriptCount is :8 [2025-08-22 16:09:24.064] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.OnUpdate: starting threadid(1631) RunningScriptCount is :9 [2025-08-22 16:09:24.081] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript [2025-08-22 16:09:24.098] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: isExecuting and hasValidFrame [2025-08-22 16:09:24.115] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: lineNum(1) startidx(0) endidx(1) currentScriptName(Greetings.sltscript) initialScriptName(Greetings.sltscript) cmdLine(msg_notify), ("Top o' the Hour to ya!") [2025-08-22 16:09:24.132] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: RunCommandLine values before: for cmdLine(msg_notify), ("Top o' the Hour to ya!"): currentLine(0) totalLines(1) currentScriptName(Greetings.sltscript) initialScriptName(Greetings.sltscript) [2025-08-22 16:09:24.148] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunCommandLine [2025-08-22 16:09:24.165] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve token(msg_notify) [2025-08-22 16:09:24.199] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: InternalResolve: UNRESOLVED: CustomResolveUnresolvedResult to token(msg_notify) [2025-08-22 16:09:24.216] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: Resolve(msg_notify) => [msg_notify] [2025-08-22 16:09:24.233] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: RunOperationOnActor(msg_notify), ("Top o' the Hour to ya!") [2025-08-22 16:09:24.266] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve token("Top o' the Hour to ya!") [2025-08-22 16:09:24.284] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve returning literal STRING (Top o' the Hour to ya!) [2025-08-22 16:09:24.300] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve token("Top o' the Hour to ya!") [2025-08-22 16:09:24.317] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: InternalResolve returning literal STRING (Top o' the Hour to ya!) [2025-08-22 16:09:24.351] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: Top o' the Hour to ya! [2025-08-22 16:09:24.418] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: RunCommandLine result: (CLRR_ADVANCE:1) for cmdLine(msg_notify), ("Top o' the Hour to ya!"): currentLine(0) totalLines(1) currentScriptName(Greetings.sltscript) initialScriptName(Greetings.sltscript) [2025-08-22 16:09:24.435] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: CLRR_ADVANCE; incrementing currentLine [2025-08-22 16:09:24.452] [log] [info] [sl_triggers.cpp:725] SLTR:(Greetings.sltscript)[1]: Cmd.RunScript: Left while loop; currentLine(1) totalLines(1) currentScriptName(Greetings.sltscript) initialScriptName(Greetings.sltscript) [2025-08-22 16:09:24.469] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.OnUpdate: before ending threadid(1631) RunningScriptCount is :9 [2025-08-22 16:09:24.485] [log] [debug] [sl_triggers.cpp:717] SLTR:(Greetings.sltscript)[1]: Cmd.OnUpdate: ending threadid(1631) RunningScriptCount is :8 [2025-08-22 16:09:33.409] [log] [debug] [sl_triggers.cpp:717] SexLab: checking trigger(trigger003.json) The Papyrus log shows nothing unusual at that time, just a few [08/22/2025 - 04:09:33PM] Error: Cannot call HasKeyword() on a None object, aborting function call stack: [sl_TriggersMain (FE05A83F)].sl_triggersmain.ActorRaceType() - "sl_TriggersMain.psc" Line ? [sl_triggersExtensionSexLab (FE05B800)].sl_triggersExtensionSexLab.ActorRaceType() - "sl_triggersExtension.psc" Line ? [sl_triggersExtensionSexLab (FE05B800)].sl_triggersExtensionSexLab.HandleSexLabCheckEvents() - "sl_triggersExtensionSexLab.psc" Line ? [sl_triggersExtensionSexLab (FE05B800)].sl_triggersExtensionSexLab.OnSexLabEnd() - "sl_triggersExtensionSexLab.psc" Line ? [08/22/2025 - 04:09:33PM] WARNING: Assigning None to a non-object variable named "::temp443" but I think that's normal, I also get these when SLTR is working (probably some missing None checks). Maybe this has to do with that I installed some new mods, "Atlas Map Markers" and "Atlas Map Markers Overhauled", though I don't understand how this can influence such simple things, I don't reference anything SLTR external (except "Skyrim.esm:15", but this shouldn't have changed). Any idea how this can be fixed ? Edit: I reinstalled SLTR-Redux (with clean save), but still the same, "doRun(true)", "reported success", but nothing happens, I don't understand this. I see in the console, that I have an inactive effect "sl_triggers_MGEF_PlayerInSameCell", should this be active ? Ps: Reset also didn't help. I attached the whole log file (very short) Hm, after having a superficial look at the sources, I think that the StorageUtil data is corrupt, the function "SLT.DequeueScriptForTarget" shouldn't return the script 'Greeting', I dont use this. Doesn't the "Reset" MCM button clear all StorageUtil data ? Edit: I found a solution. I simply added a "StorageUtil.ClearAllObjPrefix(Game.GetPlayer(), "SLTR:")" to the "DoInMemoryReset()" function. This way all queued commands for the player actor are deleted. Maybe sometimes the "Top of the hour" timer gets out of control and floods the command queue with the Greetings command, or maybe this is a concurrency problem or so, don't know, but anyway, I am happy that SLTR is working for me again (because it's quite a powerful tool, and makes a lot of things possible). But I would recommend, not to use the "Top of the hour" timer thing. Function DoInMemoryReset() if bDebugMsg SLTDebugMsg("Main: Sending SLT Reset event and clearing StorageUtil for SLTR objects") endif IsResetting = true StorageUtil.ClearAllObjPrefix(Game.GetPlayer(), "SLTR:") ; Clear all frame and thread contexts SendModEvent(EVENT_SLT_RESET()) EndFunction sl-triggers.log 5.55 kB · 1 download I'll have a look. Thank you for the detailed reporting. Folks, that's what happens when you open the thread late at night, see a highly detailed problematic bug report, nope the fuck out with the intent to respond in the morning, wake up and just slap out a "looking at it" response... all without actually reading the latest update. @nopse0: I'm still going to look for what might have caused your original issue, but thank you for sleuthing out the problem with DoInMemoryReset. Specifically that I'm not clearing out StorageUtil storage on all the Actors, including the Player. There is an OnSLTReset event handler that clears out for self; I'll probably move the call there (since it responds to the event that gets fired at the end of DoInMemoryReset) and look at clearing everything else. Thank you for that. PPS - I think the answer will actually be to replace the call to ClearAllObjPrefix in OnSLTReset: StorageUtil.ClearAllObjPrefix(self, "SLTR:") With a call to ClearAllPrefix, which will remove for anything stored with that prefix. StorageUtil.ClearAllPrefix("SLTR:") Edited August 23, 2025 by hextun code updates
hextun Posted August 24, 2025 Author Posted August 24, 2025 (edited) v0.137 is posted but, it is NOT savegame compatible, in spite of the CHANGELOG. That was... a mistake. You can safely remove the mod, save, reinstall the new version, continue, with no problems. While Alias support was added, there's not yet anything actually taking advantage of. yet. So why join in now? One minor integration: nff_getfollowers, returns a Form[] containing the list of Actors that Nether's Follower Framework considers followers And a bunch of SexLab API functions: sl_sexstart sl_find_available_partners sl_is_valid_actor sl_validate_actor sl_getversion sl_getversionstring sl_isactive sl_allow_actor sl_forbid_actor sl_is_forbidden sl_get_skill (SexLab)/sl_get_statistic (SexLab P+) See the wiki for more details on each. Also, credit to @nopse0 for the StorageUtil issue in SLTR Reset. Edited August 24, 2025 by hextun
hextun Posted August 25, 2025 Author Posted August 25, 2025 I'm considering adding OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) as an event handler for trigger purposes. For simple cases it works great. The problem is when you transfer a lot of items, like if you move to a new player house, bump up your carry weight to 10,000, and take all from that chest... you know.. THAT chest... the one with EVERYTHING in it. It's going to try to spin up a script instance for each line item. Got 200 ingredients? Get ready for SLTR attempting to run 200 scripts (or 1 script 200 times). It's going to have problems, if only because it's capped at 30 simultaneous scripts per Actor. So those 200 scripts will presumably get queued up, and if they're quick, okay, but... that is still a lot of stuff going on. I've not come up with a great way to avoid this problem. I can try to scoop up the events and then instead try to run a single script for adding multiple items (so instead of taking 5 items and getting 1 script run per item, you take 5 items and get 1 script for all 5, then have to have logic to go through the list of items to see if any of them match your item you are watching for). I dislike it because it adds complexity, both to the handling and the scripts themselves, but haven't come up with a better way yet. Thoughts? Is "I'm moving houses" a reasonably remote enough corner case not to think too much about it? Or "I'm looting QASmoke, oops"?
foreveraloneguy Posted August 25, 2025 Posted August 25, 2025 I've dug through some threads on this, but I'm not able to find an example similar to what I'm trying to do. And that is to create scripts that trigger off sex events and apply morphs based on the tags. So if the tag includes oral, then increase the lip size a bit up to some limit, or if vaginal increase the breast morphs, ideally via pushing an even to SLIF, but applying morphs directly would also work. So can someone point me to an example or examples of these types of scripts?
hextun Posted August 25, 2025 Author Posted August 25, 2025 56 minutes ago, foreveraloneguy said: I've dug through some threads on this, but I'm not able to find an example similar to what I'm trying to do. And that is to create scripts that trigger off sex events and apply morphs based on the tags. So if the tag includes oral, then increase the lip size a bit up to some limit, or if vaginal increase the breast morphs, ideally via pushing an even to SLIF, but applying morphs directly would also work. So can someone point me to an example or examples of these types of scripts? The answer is "no, but you've given me something to work on, check back in". The long answer isn't really much longer. (oh my god I lied terribly I am so sorry) No, I don't have some key functions: the NiOverride chiefmost (but I'll come back to that), but also not familiar with SLIF integration. But, You can definitely set up a trigger for sex scene start, and depending on the who you want to apply SLTScripts to for morphing, you can configure the filters to help narrow down who might get your SLTScript run on them. Spoiler There are definitely going to be some conditions that you can't use the filters to configure for, and I'm open to suggestions on how to approach making the filtering more flexible but still performant on the back-end, but for now basically imagine the filters as "first pass, high speed, selection criteria" that at least tries to get things narrowed down. So for SexLab Start events, the event comes in for literally anything SexLab tracks, including creatures. So if it's for just the Player, that's easy enough, "Player Relationship:= Player". You could pre-filter by "Gender:= (Any|Male|Female)" (and I should add the remaining options for each version of SexLab now that the two are supported separately) You would presumably want "Race:= Humanoid" (, and man, I really need to add in the actual default Skyrim races. But for now you're picking more of a Race type := (Any|Humanoid|Undead|Creature)). As you can see, if you *want* creatures, right now it's all or nothing. So if you only want *some* creatures, you'll need to add to your SLTScript to account for it. There's a "SL Tags= (Any|Anal|Oral|Vaginal)", but if you want combinations, or to use other tags, you'll need to leave this "Any" and use the "sl_hastag" command in your SLTScript. Look over the filter options and remember it's a bunch of "must meet this criteria AND everything else" to select what to run the script on, when the filters say to run the script. I said I'd come back to the NiOverride functions. I recently added some NiOverride bindings that were graciously donated by @Nevropath but I hadn't expanded on that. I'll have a look as doing so should be relatively straightforward on my end in terms of, say, complexity. My main concern is scale. If I can hit a few key functions that accomplish a lot, that's a big win for (and everyone). The recent 'sl_startsex' additions, for example, are wrappers around the quick start functions for the SexLab API. I added Alias support because at first I was going to try to support the queries necessary to fetch sslAnimations. Purgatory is having implemented functional Alias support structures and literally nothing to use them with. Because I wanted to get "hey, start sex" out into SLTScript form and worry about customized approaches later. Easier committed to now that I have the foundational support necessary for integrations. But each binding is it's own thing. For now anyway. If you have some API suggestions (i.e. actual API targets in the NiOverride interface), I'm open for consideration. If nothing else it would help me with an area of focus to start with. Anyhow, check back soon; I'll still be looking into some options for integration. 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