zzuhz Posted July 25, 2025 Posted July 25, 2025 (edited) Background: The Sexlab Version I'm using is V1.63 I have Sexlab SurvivalV0.685 installed I have Expressive Facial Animation, Expressive Facegen Morphs SE, Mfg Fix installed(And tried both load before Sexlab or after it on the left) I've tried enable or disable auto refresh expressions in Sexlab MCM, didn't work I had AHegaoTongue installed, but I uninstalled it according to this post: I'm using a High Poly Head (KLH_FemaleHeadNord), but switching to a normal head didn't resolve the issue. Issue: When I use mfg phonneme 0 100 (I forgot the exact console command) the character will open its mouth When I go into Sexlab MCM-Expression and choose any expression then test it on my PC, there will be a pop up saying "do you wish to test it with open mouth" (Something like that, my Skyrim default language is not English), then after choosing it and exit the MCM, the expression will be shown normally and the mouth will open just fine. The problem is when the animations were triggered in-game, then the PC won't open its mouth, even it's an oral animation. I've been pulling my hair the whole afternoon and at this point, I've officially run out of ideas. I have no clues on what leads to this and don't know how I can get any. Please help! Edited July 25, 2025 by zzuhz Forgot to add some context
traison Posted July 25, 2025 Posted July 25, 2025 This has been posted before: https://www.loverslab.com/topic/205114-mouth-not-opening-during-sex-scenes/ More recently someone claimed disabling SL expressions might fix it, but that to me seems like you're just trading one problem for another. 1
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 I have a grim suspicion that this might have something to do with Sexlab Survival since I can manually open/close pc's mouth during the animation and the Sexlab MCM expression test... But I don't know if this is actually the cause and, if it is, how to fix it.
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 11 minutes ago, traison said: This has been posted before: https://www.loverslab.com/topic/205114-mouth-not-opening-during-sex-scenes/ More recently someone claimed disabling SL expressions might fix it, but that to me seems like you're just trading one problem for another. Thank you for your reply. I've come across this post as well, but for me the sslBaseVoice.psc and sslBaseVoice.pex were all not rewritten by any other mods, they're all just vanilla Sexlab untouched file. And as for what Mr. anjenthedog has mentioned in that post, I don't think there are any other mods in my pack that are fiddling with that fiddle with idle expressions... I don't know if I'm using a "newer" version of Sexlab as it didn't have any "beta" suffix, but for me, controlling the percentage of mouth opening is all that my Sexlab provided. Lastly, I had run 3 experiments with enabling both expressions and vocalizations or enabling one of them, but it didn't resolve the issue. Lastly, I don't have mfg oparco command installed, and I tried moving my mfg fix before or after Sexlab and Random Emotions in the left ranking, but both didn't work out.
traison Posted July 25, 2025 Posted July 25, 2025 If you want a list of mods that could be involved, search through all pex files in all mods for "SetPhonemeModifier". Remember that pex files can be inside BSA archives as well, and tools like Notepad++ can't search within them if they're packed. I've made a utility that can do it. It's available upon request. Keep in mind though that (AFAIK) the SL function that's supposed to open the lips for moans does not work properly. I rewrote mine, as I said in that thread I linked, but my rewrite is specifically made for my own mods so it wouldn't be directly compatible with what you're doing there.
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 3 minutes ago, traison said: If you want a list of mods that could be involved, search through all pex files in all mods for "SetPhonemeModifier". Remember that pex files can be inside BSA archives as well, and tools like Notepad++ can't search within them if they're packed. I've made a utility that can do it. It's available upon request. Keep in mind though that (AFAIK) the SL function that's supposed to open the lips for moans does not work properly. I rewrote mine, as I said in that thread I linked, but my rewrite is specifically made for my own mods so it wouldn't be directly compatible with what you're doing there. A utility that can scan all pex files in a mod pack?! That's HUGE! I mean, I'd love to use it but I'm not sure what to do after getting all the files related to this "Modifier", should I change anything? As far as I understood from your reply, it's an SL function that controls the lips for moaning, and presumably opening and closing during animations (Are they the same function), and this function is bugged in various circumstances(Which depends on the mod pack composition), and what I should do is identify the cause and rewrite that function(Based on my circumstance)? Is that accurate?
traison Posted July 25, 2025 Posted July 25, 2025 23 minutes ago, zzuhz said: A utility that can scan all pex files in a mod pack?! More like it can search for a string in practicaly any file in Skyrim. Pex files, despite being compiled, can be searched because the compiler doesn't mangle function names. 24 minutes ago, zzuhz said: I mean, I'd love to use it but I'm not sure what to do after getting all the files related to this "Modifier", should I change anything? When you have the pex file name, you query your mod manager for which mod is providing that file. As for what you do then that's up to you: Look for a patch or alternative. Remove the mod. Fix the mod yourself. I'll send a link in a PM. 25 minutes ago, zzuhz said: As far as I understood from your reply, it's an SL function that controls the lips for moaning, and presumably opening and closing during animations (Are they the same function), and this function is bugged in various circumstances(Which depends on the mod pack composition), and what I should do is identify the cause and rewrite that function(Based on my circumstance)? It's been years since I patched that function, but the way I remember it was that it's way overly complicated and in general didn't work or was unreliable. Since I had already made another mod to manage expressions at this point, I decided to simplify it and just have it open and close the mouth for moans. So if you were to use my code as-is you'd lose out on all the expressions and what not. Also from what I remember it's not dependant on other mods (other than mfgfix), it's just not that good at doing its thing.
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 (edited) 16 minutes ago, traison said: More like it can search for a string in practicaly any file in Skyrim. Pex files, despite being compiled, can be searched because the compiler doesn't mangle function names. When you have the pex file name, you query your mod manager for which mod is providing that file. As for what you do then that's up to you: Look for a patch or alternative. Remove the mod. Fix the mod yourself. I'll send a link in a PM. It's been years since I patched that function, but the way I remember it was that it's way overly complicated and in general didn't work or was unreliable. Since I had already made another mod to manage expressions at this point, I decided to simplify it and just have it open and close the mouth for moans. So if you were to use my code as-is you'd lose out on all the expressions and what not. Also from what I remember it's not dependant on other mods (other than mfgfix), it's just not that good at doing its thing. OK I'll see what I can do once I search for the file, thanks a lot! (Also, sorry if this is elementary, but since the whole mod pack was running in a virtual file system compiled by MO2, how can I go through all the mods at once?) Edited July 25, 2025 by zzuhz
traison Posted July 25, 2025 Posted July 25, 2025 25 minutes ago, zzuhz said: Also, sorry if this is elementary, but since the whole mod pack was running in a virtual file system compiled by MO2, how can I go through all the mods at once? By running the tools you need for the search through MO2.
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 8 minutes ago, traison said: By running the tools you need for the search through MO2. So... The scan just completed, and it looks like this: Please just ignore the Chinese characters, so according to this result, I have now located 2 suspicious mods, which are SLS and Mfg Fix, and Mfg fix goes lower on ranking than SLS... And as I found them and came across this tool called Champollion, I now opened the MfgConsoleFunc.psc (This is the first mod I decided to look into) And asaI opened it I got blown away... All of these make no sense to me... Where should I start? How can I know whether it's problematic or not?
traison Posted July 25, 2025 Posted July 25, 2025 Mfg fix is the one that provides the function, you're looking for one that's applying mouth phonemes and thus conflicting with SL's moans, i.e. a script that calls SetPhonemeModifier.
traison Posted July 25, 2025 Posted July 25, 2025 I think what I'd do in your case is download SL version 166 and copy its MoveLipsEx function and see if its a drop-in replacement for the MoveLips function in 163. With any luck these issues have been fixed without the function signature changing.
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 4 minutes ago, traison said: I think what I'd do in your case is download SL version 166 and copy its MoveLipsEx function and see if its a drop-in replacement for the MoveLips function in 163. With any luck these issues have been fixed without the function signature changing. That sounds bold, but very creative! Think I'll try it, thanks! But will this cause any scripting issues? I mean I can't afford update the whole SL into version 166 since I have too many mods depending on this specific version... Worst case I just change it back?
traison Posted July 25, 2025 Posted July 25, 2025 10 minutes ago, zzuhz said: But will this cause any scripting issues? Not if the function signature and argument names are the same. If they're different you can always change all places where its called from, I doubt there's that many of them, but then it's no longer a copy-paste job.
traison Posted July 25, 2025 Posted July 25, 2025 (edited) Had a look at the sources for 166 and 163 BETA 9. It's a drop-in replacement, despite the signatures being different. Replace MoveLips with the function below, and compile the script. Remember to start a new game before testing with the edited script. Not tested. Spoiler ; MoveLipsEx copied from SexLab Framework 166 and renamed to MoveLips to be compatible with 163. function MoveLips(Actor ActorRef, Sound SoundRef = none, float Strength = 1.0, int SoundCut = 0, float MoveTime = 0.2, int Phoneme = 1, int MinValue = 20, int MaxValue = 50, bool IsFixedValue = false, bool UseMFG = false) global if !ActorRef return endIf float SavedP int p = Phoneme if p < 0 || p > 15 p = 0 float[] Phonemes = new float[32] int i ; Get Phonemes while i <= 15 Phonemes[i] = sslBaseExpression.GetPhoneme(ActorRef, i) ; 0.0 - 1.0 if Phonemes[i] >= Phonemes[p] ; seems to be required to prevet issues p = i endIf i += 1 endWhile SavedP = Phonemes[p] else SavedP = sslBaseExpression.GetPhoneme(ActorRef, p) endIf int MinP = MinValue int MaxP = MaxValue if !IsFixedValue float ReferenceP = SavedP if ReferenceP > (1.0 - (0.2 * Strength)) ReferenceP = (1.0 - (0.2 * Strength)) endIf MinP = ((ReferenceP * 100) - (MinP * Strength)) as int MaxP = ((ReferenceP * 100) + (MaxP * Strength)) as int endIf if MinP < 0 MinP = 0 elseIf MinP > 90 MinP = 90 endIf if (MaxP - MinP) < 10 MaxP = MinP + 10 endIf ; if ((SavedP * 100) - MinP) > 2 ; TransitDown(ActorRef, (SavedP * 100) as int, MinP) ; endIf if UseMFG MfgConsoleFunc.SetPhonemeModifier(ActorRef, 0, p, MinP) else ActorRef.SetExpressionPhoneme(p, (MinP as float)*0.01) endIf Utility.Wait(0.1) int Instance = -1 if SoundCut != -1 && SoundRef != none Instance = SoundRef.Play(ActorRef) endIf ; TransitUp(ActorRef, MinP, MaxP) if UseMFG MfgConsoleFunc.SetPhonemeModifier(ActorRef, 0, p, MaxP) else ActorRef.SetExpressionPhoneme(p, (MaxP as float)*0.01) endIf if SoundCut == -1 && SoundRef != none SoundRef.PlayAndWait(ActorRef) else Utility.Wait(MoveTime) endIf ; if (MaxP - (SavedP * 100)) > 2 ; TransitDown(ActorRef, MaxP, (SavedP * 100) as int) ; endIf ; Utility.Wait(0.1) if UseMFG MfgConsoleFunc.SetPhonemeModifier(ActorRef, 0, p, (SavedP*100) as int) else ActorRef.SetExpressionPhoneme(p, SavedP as float) endIf if SoundCut == 1 && Instance != -1 Sound.StopInstance(Instance) endIf Utility.Wait(0.2) ; Debug.Trace("SEXLAB - MoveLipsEx("+ActorRef+", "+SoundRef+", "+Strength+") -- SavedP:"+SavedP+", MinP:"+MinP+", MaxP:"+MaxP) endFunction Edited July 25, 2025 by traison
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 5 minutes ago, traison said: Not if the function signature and argument names are the same. If they're different you can always change all places where its called from, I doubt there's that many of them, but then it's no longer a copy-paste job. So I just downloaded and compared the sslBaseVoice.psc file in both V163 and V166 of Sexlab... Sadly they're identical...
traison Posted July 25, 2025 Posted July 25, 2025 1 minute ago, zzuhz said: Sadly they're identical... I assume 163 is different from 163 BETA 9 then. If that's the case then there's no easy way out of this. Gonna have to figure out what's wrong with that function and fix it properly.
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 6 minutes ago, traison said: Had a look at the sources for 166 and 163 BETA 9. It's a drop-in replacement, despite the signatures being different. Replace MoveLips with the function below, and compile the script. Remember to start a new game before testing with the edited script. Not tested. Reveal hidden contents ; MoveLipsEx copied from SexLab Framework 166 and renamed to MoveLips to be compatible with 163. function MoveLips(Actor ActorRef, Sound SoundRef = none, float Strength = 1.0, int SoundCut = 0, float MoveTime = 0.2, int Phoneme = 1, int MinValue = 20, int MaxValue = 50, bool IsFixedValue = false, bool UseMFG = false) global if !ActorRef return endIf float SavedP int p = Phoneme if p < 0 || p > 15 p = 0 float[] Phonemes = new float[32] int i ; Get Phonemes while i <= 15 Phonemes[i] = sslBaseExpression.GetPhoneme(ActorRef, i) ; 0.0 - 1.0 if Phonemes[i] >= Phonemes[p] ; seems to be required to prevet issues p = i endIf i += 1 endWhile SavedP = Phonemes[p] else SavedP = sslBaseExpression.GetPhoneme(ActorRef, p) endIf int MinP = MinValue int MaxP = MaxValue if !IsFixedValue float ReferenceP = SavedP if ReferenceP > (1.0 - (0.2 * Strength)) ReferenceP = (1.0 - (0.2 * Strength)) endIf MinP = ((ReferenceP * 100) - (MinP * Strength)) as int MaxP = ((ReferenceP * 100) + (MaxP * Strength)) as int endIf if MinP < 0 MinP = 0 elseIf MinP > 90 MinP = 90 endIf if (MaxP - MinP) < 10 MaxP = MinP + 10 endIf ; if ((SavedP * 100) - MinP) > 2 ; TransitDown(ActorRef, (SavedP * 100) as int, MinP) ; endIf if UseMFG MfgConsoleFunc.SetPhonemeModifier(ActorRef, 0, p, MinP) else ActorRef.SetExpressionPhoneme(p, (MinP as float)*0.01) endIf Utility.Wait(0.1) int Instance = -1 if SoundCut != -1 && SoundRef != none Instance = SoundRef.Play(ActorRef) endIf ; TransitUp(ActorRef, MinP, MaxP) if UseMFG MfgConsoleFunc.SetPhonemeModifier(ActorRef, 0, p, MaxP) else ActorRef.SetExpressionPhoneme(p, (MaxP as float)*0.01) endIf if SoundCut == -1 && SoundRef != none SoundRef.PlayAndWait(ActorRef) else Utility.Wait(MoveTime) endIf ; if (MaxP - (SavedP * 100)) > 2 ; TransitDown(ActorRef, MaxP, (SavedP * 100) as int) ; endIf ; Utility.Wait(0.1) if UseMFG MfgConsoleFunc.SetPhonemeModifier(ActorRef, 0, p, (SavedP*100) as int) else ActorRef.SetExpressionPhoneme(p, SavedP as float) endIf if SoundCut == 1 && Instance != -1 Sound.StopInstance(Instance) endIf Utility.Wait(0.2) ; Debug.Trace("SEXLAB - MoveLipsEx("+ActorRef+", "+SoundRef+", "+Strength+") -- SavedP:"+SavedP+", MinP:"+MinP+", MaxP:"+MaxP) endFunction Wait... How come they're different for you!?! Sorry my brain is kinda overloaded right now, wdym by drop-in replacement despite the signatures being different? (What signatures? If that refers to function/variable name then wasn't it kinda bad?) And by compile the script you mean...? I thought I just need to edit the psc file and then ctrl+S then it's done, no?
zzuhz Posted July 25, 2025 Author Posted July 25, 2025 2 minutes ago, traison said: I assume 163 is different from 163 BETA 9 then. If that's the case then there's no easy way out of this. Gonna have to figure out what's wrong with that function and fix it properly. Gotchu, given the complexity I guess I'll stick with manually opening the mouth using SLS hotkey... Thank you so much, I learned so much!
traison Posted July 25, 2025 Posted July 25, 2025 4 minutes ago, zzuhz said: wdym by drop-in replacement despite the signatures being different? function MoveLips(Actor ActorRef, Sound SoundRef = none, float Strength = 1.0) global function MoveLips(Actor ActorRef, Sound SoundRef = none, float Strength = 1.0, int SoundCut = 0, float MoveTime = 0.2, int Phoneme = 1, int MinValue = 20, int MaxValue = 50, bool IsFixedValue = false, bool UseMFG = false) global With the new (longer) signature, the old code that calls MoveLips with 3 arguments will still work because the new arguments have default values assigned to them. So, signature is diffrerent, but compatible. 6 minutes ago, zzuhz said: And by compile the script you mean...? Using the CK to compile sslBaseVoice.psc to sslBaseVoice.pex. 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