From b9dcca75e0f8928e8bb1e661fa944fb05d40eecd Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Thu, 22 Jan 2026 00:56:19 +0500 Subject: [PATCH 1/9] remove SetVehicle collision hack --- Source/Scripts/sslActorAlias.psc | 13 ------------- Source/Scripts/sslActorLibrary.psc | 3 ++- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/Source/Scripts/sslActorAlias.psc b/Source/Scripts/sslActorAlias.psc index ef1b1374..7a29a7bd 100644 --- a/Source/Scripts/sslActorAlias.psc +++ b/Source/Scripts/sslActorAlias.psc @@ -212,7 +212,6 @@ sslSystemConfig _Config Faction _AnimatingFaction Actor _PlayerRef -Form _xMarker ; Constants String Property STATE_IDLE = "Empty" AutoReadOnly @@ -250,9 +249,6 @@ Actor _killer int _AnimVarIsNPC bool _AnimVarbHumanoidFootIKDisable -; Center -ObjectReference _myMarker - ; Orgasms int _OrgasmCount bool _CanOrgasm @@ -601,12 +597,6 @@ State Paused LockActorImpl() _ActorRef.SetAnimationVariableInt("IsNPC", 0) _ActorRef.SetAnimationVariableBool("bHumanoidFootIKDisable", 1) - If (!sslActorLibrary.HasVehicle(_ActorRef)) - If (!_myMarker) - _myMarker = _ActorRef.PlaceAtMe(_xMarker) - EndIf - _ActorRef.SetVehicle(_myMarker) - EndIf SendDefaultAnimEvent() GoToState(STATE_PLAYING) EndFunction @@ -885,7 +875,6 @@ State Animating UnlockActor() EndFunction Function UnlockActor() - _ActorRef.SetVehicle(none) _ActorRef.SetAnimationVariableInt("IsNPC", _AnimVarIsNPC) _ActorRef.SetAnimationVariableBool("bHumanoidFootIKDisable", _AnimVarbHumanoidFootIKDisable) If (_ActorRef == _PlayerRef) @@ -1112,8 +1101,6 @@ Function Setup() _Thread = GetOwningQuest() as sslThreadModel _AnimatingFaction = _Config.AnimatingFaction _PlayerRef = Game.GetPlayer() - ; _xMarker = Game.GetFormFromFile(0x045A93, "SexLab.esm") ; 0x3B) - _xMarker = Game.GetForm(0x3B) Initialize() EndFunction diff --git a/Source/Scripts/sslActorLibrary.psc b/Source/Scripts/sslActorLibrary.psc index 8f615bdd..86e791e0 100644 --- a/Source/Scripts/sslActorLibrary.psc +++ b/Source/Scripts/sslActorLibrary.psc @@ -259,7 +259,6 @@ EndFunction ; ----------------------------------------------------------------------------- ; ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; -bool Function HasVehicle(Actor akActor) native global Form[] Function UnequipSlots(Actor akActor, int aiSlots) native global String Function PickRandomFxSet(int asType) native global @@ -437,6 +436,8 @@ EndFunction ; ----------------------------------------------------------------------------- ; ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; +bool Function HasVehicle(Actor akActor) native global + Faction property AnimatingFaction hidden Faction Function Get() return Config.AnimatingFaction From ffda8a583a89530444e81affbb871ed73e7a65ec Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Thu, 22 Jan 2026 01:00:05 +0500 Subject: [PATCH 2/9] remove artificial setup delay --- Source/Scripts/sslActorAlias.psc | 6 ------ Source/Scripts/sslSystemConfig.psc | 2 -- 2 files changed, 8 deletions(-) diff --git a/Source/Scripts/sslActorAlias.psc b/Source/Scripts/sslActorAlias.psc index 7a29a7bd..5b5c5912 100644 --- a/Source/Scripts/sslActorAlias.psc +++ b/Source/Scripts/sslActorAlias.psc @@ -415,7 +415,6 @@ State Ready EndFunction Event OnDoPrepare(string asEventName, string asStringArg, float afNumArg, form akPathTo) - float min_delay = sslSystemConfig.GetMinSetupTime() _ActorRef.SetActorValue("Paralysis", 0.0) float interval = 0.05 If(_ActorRef == _PlayerRef) @@ -423,7 +422,6 @@ State Ready If (UI.IsMenuOpen("Dialogue Menu")) UI.InvokeString("Dialogue Menu", "_global.skse.CloseMenu", "Dialogue Menu") While (UI.IsMenuOpen("Dialogue Menu")) - min_delay -= interval Utility.Wait(interval) EndWhile EndIf @@ -441,7 +439,6 @@ State Ready Utility.Wait(2.0) While (distance > target_distance && Math.abs(prev_dist - distance) > 0.5 && fallback_timer > 0) fallback_timer -= interval - min_delay -= interval Utility.Wait(interval) prev_dist = distance distance = _ActorRef.GetDistance(target) @@ -478,9 +475,6 @@ State Ready EndIf _VoiceDelay = _BaseDelay _ExpressionDelay = _BaseDelay * 2 - If (min_delay > 0.0) - Utility.Wait(min_delay) - EndIf __SETUP_DONE = true ; Post Delayed Initialization UpdateBaseEnjoymentCalculations() diff --git a/Source/Scripts/sslSystemConfig.psc b/Source/Scripts/sslSystemConfig.psc index 8518b7b3..77689bd5 100644 --- a/Source/Scripts/sslSystemConfig.psc +++ b/Source/Scripts/sslSystemConfig.psc @@ -35,8 +35,6 @@ SoundCategory property AudioVoice auto ; --- Config Properties --- ; ; ------------------------------------------------------- ; -float Function GetMinSetupTime() native global - int Function GetAnimationCount() native global float[] Function GetEnjoymentFactors() native global float Function GetEnjoymentFactor(String asString) native global From 5d0a268f5f4b897795eef9cdad95e51792c67e0b Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Thu, 22 Jan 2026 01:29:27 +0500 Subject: [PATCH 3/9] fix: bMaleOrgasmEndsScene --- Source/Scripts/sslActorAlias.psc | 4 ++-- Source/Scripts/sslThreadModel.psc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Scripts/sslActorAlias.psc b/Source/Scripts/sslActorAlias.psc index 5b5c5912..7a972733 100644 --- a/Source/Scripts/sslActorAlias.psc +++ b/Source/Scripts/sslActorAlias.psc @@ -1437,14 +1437,14 @@ Function StoreExcitementState(String arg = "") string ActorName = GetActorName() If (arg == "Backup") StorageUtil.SetFloatValue(None, ("EnjBackupTime_" + ActorName), SexLabUtil.GetCurrentGameRealTime()) - StorageUtil.SetIntValue(None, ("LastOrgasmCount_" + ActorName), _OrgasmCount) + ;StorageUtil.SetIntValue(None, ("LastOrgasmCount_" + ActorName), _OrgasmCount) If _FullEnjoyment > 10 StorageUtil.SetIntValue(None, ("LastEnjoyment_" + ActorName), _FullEnjoyment) EndIf ElseIf (arg == "Restore") float TimeSinceEnjBackup = (SexLabUtil.GetCurrentGameRealTime() - StorageUtil.GetFloatValue(None, ("EnjBackupTime_" + ActorName))) If (TimeSinceEnjBackup < 60) - _OrgasmCount = StorageUtil.GetIntValue(None, ("LastOrgasmCount_" + ActorName)) + ;_OrgasmCount = StorageUtil.GetIntValue(None, ("LastOrgasmCount_" + ActorName)) int LastEnjoyment = StorageUtil.GetIntValue(None, ("LastEnjoyment_" + ActorName)) _FullEnjoyment = (LastEnjoyment as float * (1 - (TimeSinceEnjBackup/60))) as int EndIf diff --git a/Source/Scripts/sslThreadModel.psc b/Source/Scripts/sslThreadModel.psc index 94597574..02c4be6a 100644 --- a/Source/Scripts/sslThreadModel.psc +++ b/Source/Scripts/sslThreadModel.psc @@ -2479,7 +2479,7 @@ Function ProcessEnjGameArg(String arg = "", Actor akActor, Actor akPartner, floa ;GameDamageMagicka(PartnerRef, GameModSelfSta) ;for solo/duo scenes, skip to last scene stage if any actor has ran out of stamina or male has orgasmed bool NoStaminaScenario = (Config.NoStaminaEndsScene == 1) && (akActor.GetActorValuePercentage("Stamina") < 0.10) && (GetSubmissives().Length == 0) - bool MaleOrgasmEndScenario = (Config.MaleOrgasmEndsScene == 1) && (GetActorSex(akActor) == 1) && (GetOrgasmCount(akActor) > 0) + bool MaleOrgasmEndScenario = (Config.MaleOrgasmEndsScene == 1) && (GetActorSex(akActor) == 0) && (GetOrgasmCount(akActor) > 0) bool NotEndStageScenario = (GetLegacyStageNum() < GetLegacyStagesCount()) bool SoloDuoScenario = (_Positions.Length == 1 || _Positions.Length == 2) If ((NoStaminaScenario || MaleOrgasmEndScenario) && NotEndStageScenario && SoloDuoScenario) From 4ffe463b4959ca6e8205d7224aa254f27c176f74 Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Thu, 22 Jan 2026 22:16:31 +0500 Subject: [PATCH 4/9] improve enjoyment based early scene end --- Source/Scripts/sslActorAlias.psc | 7 +++++-- Source/Scripts/sslThreadModel.psc | 10 ++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Source/Scripts/sslActorAlias.psc b/Source/Scripts/sslActorAlias.psc index 7a972733..b6db1027 100644 --- a/Source/Scripts/sslActorAlias.psc +++ b/Source/Scripts/sslActorAlias.psc @@ -712,6 +712,8 @@ State Animating If ((_FullEnjoyment > 90) && (_Config.SeparateOrgasms || _Config.InternalEnjoymentEnabled)) DoOrgasm() EndIf + bool NoStaminaEndScenario = (_Config.NoStaminaEndsScene && !_victim && _ActorRef.GetActorValuePercentage("Stamina") < 0.10) + _Thread.EnjBasedSkipToLastStage(NoStaminaEndScenario) If (_LoopLovenseDelay <= 0) If (_ActorRef == _PlayerRef && sslLovense.IsLovenseInstalled()) int lovenseStrength = sslSystemConfig.GetSettingInt("iLovenseStrength") @@ -854,6 +856,7 @@ State Animating If (_OrgasmCount > _Config.MaxNoPainOrgasmMale) _FullEnjoyment -= (_OrgasmCount - _Config.MaxNoPainOrgasmMale) * 20 EndIf + _Thread.EnjBasedSkipToLastStage(_Config.MaleOrgasmEndsScene) Else If (_OrgasmCount > _Config.MaxNoPainOrgasmFemale) _FullEnjoyment -= (_OrgasmCount - _Config.MaxNoPainOrgasmFemale) * 20 @@ -1437,14 +1440,14 @@ Function StoreExcitementState(String arg = "") string ActorName = GetActorName() If (arg == "Backup") StorageUtil.SetFloatValue(None, ("EnjBackupTime_" + ActorName), SexLabUtil.GetCurrentGameRealTime()) - ;StorageUtil.SetIntValue(None, ("LastOrgasmCount_" + ActorName), _OrgasmCount) + StorageUtil.SetIntValue(None, ("LastOrgasmCount_" + ActorName), _OrgasmCount) If _FullEnjoyment > 10 StorageUtil.SetIntValue(None, ("LastEnjoyment_" + ActorName), _FullEnjoyment) EndIf ElseIf (arg == "Restore") float TimeSinceEnjBackup = (SexLabUtil.GetCurrentGameRealTime() - StorageUtil.GetFloatValue(None, ("EnjBackupTime_" + ActorName))) If (TimeSinceEnjBackup < 60) - ;_OrgasmCount = StorageUtil.GetIntValue(None, ("LastOrgasmCount_" + ActorName)) + _OrgasmCount = StorageUtil.GetIntValue(None, ("LastOrgasmCount_" + ActorName)) int LastEnjoyment = StorageUtil.GetIntValue(None, ("LastEnjoyment_" + ActorName)) _FullEnjoyment = (LastEnjoyment as float * (1 - (TimeSinceEnjBackup/60))) as int EndIf diff --git a/Source/Scripts/sslThreadModel.psc b/Source/Scripts/sslThreadModel.psc index 02c4be6a..70eeecd1 100644 --- a/Source/Scripts/sslThreadModel.psc +++ b/Source/Scripts/sslThreadModel.psc @@ -2475,15 +2475,17 @@ Function ProcessEnjGameArg(String arg = "", Actor akActor, Actor akPartner, floa EndIf EndIf EndIf - ;GameDamageMagicka(PartnerRef, GameModSelfSta) +EndFunction + +Function EnjBasedSkipToLastStage(bool abSkip) ;for solo/duo scenes, skip to last scene stage if any actor has ran out of stamina or male has orgasmed - bool NoStaminaScenario = (Config.NoStaminaEndsScene == 1) && (akActor.GetActorValuePercentage("Stamina") < 0.10) && (GetSubmissives().Length == 0) - bool MaleOrgasmEndScenario = (Config.MaleOrgasmEndsScene == 1) && (GetActorSex(akActor) == 0) && (GetOrgasmCount(akActor) > 0) bool NotEndStageScenario = (GetLegacyStageNum() < GetLegacyStagesCount()) bool SoloDuoScenario = (_Positions.Length == 1 || _Positions.Length == 2) - If ((NoStaminaScenario || MaleOrgasmEndScenario) && NotEndStageScenario && SoloDuoScenario) + If (abSkip && NotEndStageScenario && SoloDuoScenario) SkipTo(SexLabRegistry.GetEndingStages(GetActiveScene())[0]) + _StageTimer -= (GetTimer() / 1.25) + UpdateBaseSpeed(0.8) EndIf EndFunction From eff60c1cb8b71d9c32dccf32ee36e8a266e2ba0a Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Fri, 23 Jan 2026 01:10:19 +0500 Subject: [PATCH 5/9] reduce tags dependence for enjoyment --- Interface/Translations/SexLab_CHINESE.txt | 4 +- Interface/Translations/SexLab_CZECH.txt | 4 +- Interface/Translations/SexLab_DANISH.txt | 4 +- Interface/Translations/SexLab_ENGLISH.txt | 4 +- Interface/Translations/SexLab_FINNISH.txt | 4 +- Interface/Translations/SexLab_FRENCH.txt | 4 +- Interface/Translations/SexLab_GERMAN.txt | 4 +- Interface/Translations/SexLab_GREEK.txt | 4 +- Interface/Translations/SexLab_ITALIAN.txt | 4 +- Interface/Translations/SexLab_JAPANESE.txt | 4 +- Interface/Translations/SexLab_NORWEGIAN.txt | 4 +- Interface/Translations/SexLab_POLISH.txt | 4 +- Interface/Translations/SexLab_RUSSIAN.txt | 4 +- Interface/Translations/SexLab_SPANISH.txt | 4 +- Interface/Translations/SexLab_SWEDISH.txt | 4 +- Interface/Translations/SexLab_TURKISH.txt | 4 +- Source/Scripts/sslActorAlias.psc | 13 +- Source/Scripts/sslConfigMenu.psc | 2 +- Source/Scripts/sslSystemConfig.psc | 26 ++- Source/Scripts/sslThreadModel.psc | 182 ++------------------ 20 files changed, 74 insertions(+), 213 deletions(-) diff --git a/Interface/Translations/SexLab_CHINESE.txt b/Interface/Translations/SexLab_CHINESE.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_CHINESE.txt +++ b/Interface/Translations/SexLab_CHINESE.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_CZECH.txt b/Interface/Translations/SexLab_CZECH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_CZECH.txt +++ b/Interface/Translations/SexLab_CZECH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_DANISH.txt b/Interface/Translations/SexLab_DANISH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_DANISH.txt +++ b/Interface/Translations/SexLab_DANISH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_ENGLISH.txt b/Interface/Translations/SexLab_ENGLISH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_ENGLISH.txt +++ b/Interface/Translations/SexLab_ENGLISH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_FINNISH.txt b/Interface/Translations/SexLab_FINNISH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_FINNISH.txt +++ b/Interface/Translations/SexLab_FINNISH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_FRENCH.txt b/Interface/Translations/SexLab_FRENCH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_FRENCH.txt +++ b/Interface/Translations/SexLab_FRENCH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_GERMAN.txt b/Interface/Translations/SexLab_GERMAN.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_GERMAN.txt +++ b/Interface/Translations/SexLab_GERMAN.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_GREEK.txt b/Interface/Translations/SexLab_GREEK.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_GREEK.txt +++ b/Interface/Translations/SexLab_GREEK.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_ITALIAN.txt b/Interface/Translations/SexLab_ITALIAN.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_ITALIAN.txt +++ b/Interface/Translations/SexLab_ITALIAN.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_JAPANESE.txt b/Interface/Translations/SexLab_JAPANESE.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_JAPANESE.txt +++ b/Interface/Translations/SexLab_JAPANESE.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_NORWEGIAN.txt b/Interface/Translations/SexLab_NORWEGIAN.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_NORWEGIAN.txt +++ b/Interface/Translations/SexLab_NORWEGIAN.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_POLISH.txt b/Interface/Translations/SexLab_POLISH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_POLISH.txt +++ b/Interface/Translations/SexLab_POLISH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_RUSSIAN.txt b/Interface/Translations/SexLab_RUSSIAN.txt index 7bc16f8f..71a724d5 100644 --- a/Interface/Translations/SexLab_RUSSIAN.txt +++ b/Interface/Translations/SexLab_RUSSIAN.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the reliance on advanced collision typing capabilities of SexLab P+.\nCollision typing offers real-time info on all interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags from HentaiRim. $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions.\n Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame (automated for NPCs by default). diff --git a/Interface/Translations/SexLab_SPANISH.txt b/Interface/Translations/SexLab_SPANISH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_SPANISH.txt +++ b/Interface/Translations/SexLab_SPANISH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_SWEDISH.txt b/Interface/Translations/SexLab_SWEDISH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_SWEDISH.txt +++ b/Interface/Translations/SexLab_SWEDISH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Interface/Translations/SexLab_TURKISH.txt b/Interface/Translations/SexLab_TURKISH.txt index 869fe6ca..8bdaef1c 100644 --- a/Interface/Translations/SexLab_TURKISH.txt +++ b/Interface/Translations/SexLab_TURKISH.txt @@ -437,8 +437,8 @@ $SSL_EnjoymentSettings Enjoyment Settings # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment $SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_iInterDetectionStrength Interaction Detection Method -$SSL_iInterDetectionStrengthHighlight Select the method relied upon to determine physical interactions among actors during scenes.\n1: Stage Tags (not recommended)\n2: Position Tags (from HentaiRim)\n3: Real-Time Collision Detection (default)\n4: Mixed Method (safest, but not the most accurate) +$SSL_bUsePhysicBasedDetection Enable Collision Detections +$SSL_bUsePhysicBasedDetectionHighlight Toggles the use of advanced collision type-guessing based on relative bone positions and movements.\nCollision typing offers real-time info on the interactions an actor is involved in at any given moment.\nIf disabled, the system will instead rely upon position tags (from HentaiRim). $SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions $SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. diff --git a/Source/Scripts/sslActorAlias.psc b/Source/Scripts/sslActorAlias.psc index b6db1027..03e7db44 100644 --- a/Source/Scripts/sslActorAlias.psc +++ b/Source/Scripts/sslActorAlias.psc @@ -801,7 +801,7 @@ State Animating return EndIf If (_Config.SeparateOrgasms || _Config.InternalEnjoymentEnabled) - If ((_FullEnjoyment > 90 && _FullEnjoyment < 180) && ((time - _lastHoldBack) < FindEdgingTimeWindow())) + If (_Config.GameEnabled && (_FullEnjoyment > 90 && _FullEnjoyment < 180) && ((time - _lastHoldBack) < FindEdgingTimeWindow())) GameRewardTimedEdging() _hasOrgasm = false return @@ -1191,7 +1191,6 @@ float _ContextCheckDelay ; Base bool _CrtMaleHugePP int _ConSubStatus -int _ActorInterInfo float _PainContext float _EnjFactor float _BaseFactor @@ -1221,7 +1220,6 @@ Function ResetEnjoymentVariables() ; Base _CrtMaleHugePP = False _ConSubStatus = _Thread.CONSENT_CONNONSUB - _ActorInterInfo = _Thread.ACTORINT_NONPART _PainContext = 0.0 _EnjFactor = 0.0 _BaseFactor = 0.0 @@ -1257,7 +1255,6 @@ Function UpdateBaseEnjoymentCalculations() _ConSubStatus = _Thread.IdentifyConsentSubStatus() bool SameSexThread = _Thread.SameSexThread() float BestRelation = _Thread.GetBestRelationForScene(_ActorRef, _ConSubStatus) as float - _ActorInterInfo = _Thread.GuessActorInterInfo(_ActorRef, _sex, _victim, _ConSubStatus, SameSexThread) _arousalBase = PapyrusUtil.ClampFloat(SexlabStatistics.GetStatistic(_ActorRef, 17), 0.0, 100.0) _PainContext = CalcContextPain(BestRelation) _EnjFactor = CalcContextEnjFactor(SameSexThread, BestRelation) @@ -1272,7 +1269,7 @@ Function UpdateEffectiveEnjoymentCalculations() return EndIf ; Interactions - _TypeInterStr = _Thread.CreateInteractionString(_ActorRef, _ActorInterInfo) + _TypeInterStr = _Thread.CreateInteractionString(_ActorRef) _InterFactor = _Thread.CalculateInteractionFactor(_ActorRef, _TypeInterStr) ; Enjoyment float EnjEffective = CalcEffectiveEnjoyment() @@ -1505,6 +1502,7 @@ Function GameRegisterEdgeAttempt() _EnjFactor -= 0.03 If (_EnjFactor < 0.0) _FullEnjoyment -= 50 ; penalty for excessive edging spam + _EnjFactor = _BaseFactor/2 EndIf int PenaltyType = _Config.EdgeSpamPunishType If PenaltyType == 1 @@ -1551,9 +1549,8 @@ EndFunction Function DebugBaseCalcVariables() string BaseCalcLog = "[ENJ] EnjFactor: " + _EnjFactor + ", BaseArousal: " + _arousalBase + ", SameSexThread: " + _Thread.SameSexThread()\ + ", Sexuality: " + SexlabStatistics.GetSexuality(_ActorRef) + ", BestRelation: " + _Thread.GetBestRelationForScene(_ActorRef, _ConSubStatus)\ - + ", ConSubStatus: " + _ConSubStatus + ", IsVictim: " + _victim + ", CrtMaleHugePP: " + _CrtMaleHugePP + ", ActorInterInfo: " + _ActorInterInfo\ - + ", VaginalXP: " + SexlabStatistics.GetStatistic(_ActorRef, 2) as int + ", AnalXP: " + SexlabStatistics.GetStatistic(_ActorRef, 3) as int\ - + ", ContextPain: " + _PainContext as int + + ", ConSubStatus: " + _ConSubStatus + ", IsVictim: " + _victim + ", CrtMaleHugePP: " + _CrtMaleHugePP + ", ContextPain: " + _PainContext as int\ + + ", VaginalXP: " + SexlabStatistics.GetStatistic(_ActorRef, 2) as int + ", AnalXP: " + SexlabStatistics.GetStatistic(_ActorRef, 3) as int Log(BaseCalcLog) EndFunction diff --git a/Source/Scripts/sslConfigMenu.psc b/Source/Scripts/sslConfigMenu.psc index 0171f67c..482dc1c6 100644 --- a/Source/Scripts/sslConfigMenu.psc +++ b/Source/Scripts/sslConfigMenu.psc @@ -803,7 +803,7 @@ Function EnjoymentSettings() AddHeaderOption("Primary Settings") AddStateOptionBool("bInternalEnjoymentEnabled", "$SSL_bInternalEnjoymentEnabled") - AddStateOptionSlider("iInterDetectionStrength", "$SSL_iInterDetectionStrength", 4, 1, 4, 1, "{0}") + AddStateOptionBool("bUsePhysicBasedDetection", "$SSL_bUsePhysicBasedDetection") AddStateOptionSlider("fEnjRaiseMultInter", "$SSL_fEnjRaiseMultInter", 1.2, 0, 3, 0.1, "{1}") AddHeaderOption("Game Toggles") diff --git a/Source/Scripts/sslSystemConfig.psc b/Source/Scripts/sslSystemConfig.psc index 77689bd5..c97dbef6 100644 --- a/Source/Scripts/sslSystemConfig.psc +++ b/Source/Scripts/sslSystemConfig.psc @@ -1065,6 +1065,22 @@ endFunction ; --------------------------------------------------------------------------------------- ; ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; +string[] _interTypes + +string[] Property NameAllInteractions hidden + string[] Function Get() + If !_interTypes + ;IMP: order depends on int assigned to interTypes in sslThreadModel; leave both as-is! + string type_names = "pStimulation,aAnimObjFace,pAnimObjFace,pSuckingToes,pGrinding," \ + + "pSkullfuck,aHandJob,aFootJob,aBoobJob,bKissing,aSuckingToes,pFacial,aOral," \ + + "aLickingShaft,aDeepthroat,pVaginal,pAnal,aFacial,aGrinding,pHandJob,pFootJob," \ + + "pBoobJob,pLickingShaft,pOral,pDeepthroat,aSkullfuck,aVaginal,aAnal" + _interTypes = StringUtil.Split(type_names, ",") + EndIf + return _interTypes + EndFunction +EndProperty + ; ----------------------------------------------- ; ; --- MAIN CONFIG --- ; ; ----------------------------------------------- ; @@ -1077,12 +1093,12 @@ bool Property InternalEnjoymentEnabled hidden SetSettingBool("bInternalEnjoymentEnabled", value) EndFunction EndProperty -int Property InterDetectionStrength hidden - int Function Get() - return GetSettingInt("iInterDetectionStrength") +bool Property UsePhysicBasedDetection hidden + bool Function Get() + return GetSettingBool("bUsePhysicBasedDetection") EndFunction - Function Set(int aiSet) - SetSettingInt("iInterDetectionStrength", aiSet) + Function Set(bool value) + SetSettingBool("bUsePhysicBasedDetection", value) EndFunction EndProperty float Property EnjRaiseMultInter hidden diff --git a/Source/Scripts/sslThreadModel.psc b/Source/Scripts/sslThreadModel.psc index 70eeecd1..69689810 100644 --- a/Source/Scripts/sslThreadModel.psc +++ b/Source/Scripts/sslThreadModel.psc @@ -1691,10 +1691,6 @@ Int Property CONSENT_NONCONNONSUB = 1 AutoReadOnly Hidden Int Property CONSENT_CONSUB = 2 AutoReadOnly Hidden Int Property CONSENT_NONCONSUB = 3 AutoReadOnly Hidden -Int Property ACTORINT_NONPART = 0 AutoReadOnly Hidden -Int Property ACTORINT_PASSIVE = 1 AutoReadOnly Hidden -Int Property ACTORINT_ACTIVE = 2 AutoReadOnly Hidden - ;--> actor is getting non-penile stimulation int Property pStimulation = 0 AutoReadOnly Hidden ;pos_crotch is being fingered, fisted, or toys_inserted int Property aAnimObjFace = 1 AutoReadOnly Hidden ;pos_anim_obj is in front of partner's face @@ -1742,39 +1738,6 @@ EndProperty ; --- Interactions Detections --- ; ; -------------------------------------------------- ; -string[] Function NameAllInteractions() global - string[] interTypes = new string[28] - interTypes[0] = "pStimulation" - interTypes[1] = "aAnimObjFace" - interTypes[2] = "pAnimObjFace" - interTypes[3] = "pSuckingToes" - interTypes[4] = "pGrinding" - interTypes[5] = "pSkullfuck" - interTypes[6] = "aHandJob" - interTypes[7] = "aFootJob" - interTypes[8] = "aBoobJob" - interTypes[9] = "bKissing" - interTypes[10] = "aSuckingToes" - interTypes[11] = "pFacial" - interTypes[12] = "aOral" - interTypes[13] = "aLickingShaft" - interTypes[14] = "aDeepthroat" - interTypes[15] = "pVaginal" - interTypes[16] = "pAnal" - interTypes[17] = "aFacial" - interTypes[18] = "aGrinding" - interTypes[19] = "pHandJob" - interTypes[20] = "pFootJob" - interTypes[21] = "pBoobJob" - interTypes[22] = "pLickingShaft" - interTypes[23] = "pOral" - interTypes[24] = "pDeepthroat" - interTypes[25] = "aSkullfuck" - interTypes[26] = "aVaginal" - interTypes[27] = "aAnal" - return interTypes -EndFunction - bool[] Function ListDetectedPhysicsInter(Actor akPosition) ;not relying on GetCollisionActions() to avoid slow papyrus loops and else-ifs If !IsInteractionRegistered() @@ -1811,117 +1774,38 @@ bool[] Function ListDetectedPhysicsInter(Actor akPosition) return phyActive EndFunction -bool[] Function ListDetectedRimTagsInter(Actor akPosition) +bool[] Function ListDetectedPosTagsInter(Actor akPosition) If !HasSceneTag("RimTagged") ;hentairim return Utility.CreateBoolArray(1, False) EndIf - string[] rimTags = SexLabRegistry.GetPositionTags(GetActiveScene(), GetActiveStage(), GetPositionIdx(akPosition)) - bool[] rimActive = Utility.CreateBoolArray(28, False) + string[] posTags = SexLabRegistry.GetPositionTags(GetActiveScene(), GetActiveStage(), GetPositionIdx(akPosition)) + bool[] tagActive = Utility.CreateBoolArray(28, False) + string[] interTypes = Config.NameAllInteractions int i = 0 - int len = rimTags.Length + int len = posTags.Length While (i < len) - string tag = rimTags[i] - If (tag=="kis") - rimActive[bKissing] = true - ElseIf (tag=="sst" || tag=="fst" || tag=="bst") - rimActive[pStimulation] = true - ElseIf (tag=="ssb" || tag=="fsb") - rimActive[aOral] = true - ElseIf (tag=="smf" || tag=="fmf" || tag=="cun") - rimActive[pOral] = true - ElseIf (tag=="shj" || tag=="fhj") - rimActive[pHandJob] = true - ElseIf (tag=="sfj" || tag=="ffj") - rimActive[pFootJob] = true - ElseIf (tag=="stf" || tag=="ftf") - rimActive[pBoobJob] = true - ElseIf tag=="sdv" || tag=="fdv" - rimActive[aVaginal] = true - ElseIf tag=="sda" || tag=="fda" - rimActive[aAnal] = true - ElseIf (tag=="svp" || tag=="fvp" || tag=="sdp" || tag=="fdp" || tag=="scg" || tag=="fcg") - rimActive[pVaginal] = true - ElseIf (tag=="sap" || tag=="fap" || tag=="sdp" || tag=="fdp" || tag=="sac" || tag=="fac") - rimActive[pAnal] = true - EndIf + int tagIdx = interTypes.Find(posTags[i]) + If (tagIdx != -1) + tagActive[tagIdx] = true + EndIf i += 1 EndWhile - return rimActive -EndFunction - -bool[] Function ListDetectedASLTagsInter(int ActorInterInfo) - If HasStageTag("RimTagged") || (ActorInterInfo == ACTORINT_NONPART) - return Utility.CreateBoolArray(1, False) - EndIf - bool stageHJ = HasStageTag("Masturbation") || HasStageTag("HandJob") || HasStageTag("Fingering") - bool stageFJ = HasStageTag("FootJob") || HasStageTag("Feet") - bool stageBJ = HasStageTag("BoobJob") - bool stageGR = HasStageTag("Grinding") - bool stageOR = HasStageTag("Oral") - bool stageVG = HasStageTag("Vaginal") - bool stageAN = HasStageTag("Anal") - ;actor assumed passive/receiving overall is active for some action - bool isActive = (ActorInterInfo == ACTORINT_ACTIVE) - bool isPassive = (ActorInterInfo == ACTORINT_PASSIVE) - If (stageOR||stageHJ||stageFJ||stageBJ) - If isPassive - isPassive = False - isActive = true - ElseIf isActive - isActive = False - isPassive = true - EndIf - EndIf - bool[] aslActive = Utility.CreateBoolArray(28, False) - aslActive[bKissing] = HasStageTag("Kissing") - aslActive[aGrinding] = stageGR && isActive - aslActive[pGrinding] = stageGR && isPassive - aslActive[aHandJob] = stageHJ && isActive - aslActive[pHandJob] = stageHJ && isPassive - aslActive[aFootJob] = stageFJ && isActive - aslActive[pFootJob] = stageFJ && isPassive - aslActive[aBoobJob] = stageBJ && isActive - aslActive[pBoobJob] = stageBJ && isPassive - aslActive[aOral] = stageOR && isActive - aslActive[pOral] = stageOR && isPassive - aslActive[aVaginal] = stageVG && isActive - aslActive[pVaginal] = stageVG && isPassive - aslActive[aAnal] = stageAN && isActive - aslActive[pAnal] = stageAN && isPassive - return aslActive + return tagActive EndFunction ; -------------------------------------------------- ; ; --- Interactions Factors --- ; ; -------------------------------------------------- ; -string Function CreateInteractionString(Actor akPosition, int ActorInterInfo, int iStrength = -1) - If (iStrength == -1) - iStrength = Config.InterDetectionStrength - EndIf - If (iStrength < 0 || iStrength > 4) - iStrength = 4 - EndIf +string Function CreateInteractionString(Actor akPosition) string ret = "..." - string[] interTypes = NameAllInteractions() - If iStrength == 1 - return InterateForInteractionString(interTypes, ListDetectedASLTagsInter(ActorInterInfo)) - ElseIf iStrength == 2 - return InterateForInteractionString(interTypes, ListDetectedRimTagsInter(akPosition)) - ElseIf iStrength == 3 - return InterateForInteractionString(interTypes, ListDetectedPhysicsInter(akPosition)) - ElseIf iStrength == 4 + string[] interTypes = Config.NameAllInteractions + If Config.UsePhysicBasedDetection ret = InterateForInteractionString(interTypes, ListDetectedPhysicsInter(akPosition)) - If !ret - ret = InterateForInteractionString(interTypes, ListDetectedRimTagsInter(akPosition)) - If !ret - ret = InterateForInteractionString(interTypes, ListDetectedASLTagsInter(ActorInterInfo)) - EndIf - EndIf - return ret Else - return ret + ret = InterateForInteractionString(interTypes, ListDetectedPosTagsInter(akPosition)) EndIf + return ret EndFunction float Function CalculateInteractionFactor(Actor akPosition, string InteractionString) @@ -2139,42 +2023,6 @@ EndFunction ; --- Utility Functions --- ; ; -------------------------------------------------- ; -int Function GuessActorInterInfo(Actor akPosition, int ActorSex, bool ActorIsSub, int ConSubStatus, bool SameSexThread) - ;IMP: roles will be reversed for oral/handjob/etc (passive is giving; active is receiving) - int ActorInterInfo = ACTORINT_NONPART - If ConSubStatus > CONSENT_NONCONNONSUB - bool FemDom = HasSceneTag("FemDom") - If !SameSexThread - If (ActorIsSub && !FemDom) || (!ActorIsSub && FemDom) - ActorInterInfo = ACTORINT_PASSIVE - ElseIf (!ActorIsSub && !FemDom) || (ActorIsSub && FemDom) - ActorInterInfo = ACTORINT_ACTIVE - EndIf - Else - If ActorIsSub - ActorInterInfo = ACTORINT_PASSIVE - ElseIf !ActorIsSub - ActorInterInfo = ACTORINT_ACTIVE - EndIf - EndIf - Else - If !SameSexThread - If ActorSex == 1 || ActorSex == 4 - ActorInterInfo = ACTORINT_PASSIVE - Else ; ignoring complexities with futas - ActorInterInfo = ACTORINT_ACTIVE - EndIf - Else - If _Positions.Length > 1 && GetPositionIdx(akPosition) == 0 - ActorInterInfo = ACTORINT_PASSIVE - Else - ActorInterInfo = ACTORINT_ACTIVE - EndIf - EndIf - EndIf - return ActorInterInfo -EndFunction - string Function InterateForInteractionString(string[] interTypes, bool[] interActive) string ret = "" int i = 0 From 56ee571ff5fb2cd3eb408183059c0a8893e949b0 Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Sat, 24 Jan 2026 17:46:10 +0500 Subject: [PATCH 6/9] fix: lock all actors before anim start --- Source/Scripts/sslActorAlias.psc | 17 +++++++++++------ Source/Scripts/sslThreadModel.psc | 11 +++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Source/Scripts/sslActorAlias.psc b/Source/Scripts/sslActorAlias.psc index 03e7db44..c3976ca3 100644 --- a/Source/Scripts/sslActorAlias.psc +++ b/Source/Scripts/sslActorAlias.psc @@ -249,6 +249,8 @@ Actor _killer int _AnimVarIsNPC bool _AnimVarbHumanoidFootIKDisable +bool _ActorLocked + ; Orgasms int _OrgasmCount bool _CanOrgasm @@ -325,6 +327,10 @@ endProperty float _StartedAt float _LastOrgasm +bool Function ActorIsLocked() + return _ActorLocked +EndFunction + ; ------------------------------------------------------- ; ; --- Alias IDLE --- ; ; ------------------------------------------------------- ; @@ -396,8 +402,6 @@ EndFunction Pre animation start. The alias is waiting for the underlying thread to begin the animation /; -bool __SETUP_DONE - State Ready Event OnBeginState() RegisterForModEvent("SSL_PREPARE_Thread" + _Thread.tid, "OnDoPrepare") @@ -448,7 +452,6 @@ State Ready EndIf _ActorRef.SetFactionRank(_AnimatingFaction, 1) _ActorRef.EvaluatePackage() - __SETUP_DONE = false GoToState(STATE_PAUSED) If (asStringArg != "skip") _Thread.PrepareDone() @@ -475,7 +478,6 @@ State Ready EndIf _VoiceDelay = _BaseDelay _ExpressionDelay = _BaseDelay * 2 - __SETUP_DONE = true ; Post Delayed Initialization UpdateBaseEnjoymentCalculations() If (!_Config.DebugMode) @@ -533,10 +535,10 @@ State Paused EndFunction Event OnStartPlaying(string asEventName, string asStringArg, float afNumArg, form akSender) UnregisterForModEvent("SSL_READY_Thread" + _Thread.tid) - While (!__SETUP_DONE) + LockActor() + While (!_Thread.AllActorsLocked()) Utility.Wait(0.05) EndWhile - LockActor() If (_sex <= 2) If (DoUndress) DoUndress = false @@ -593,6 +595,7 @@ State Paused _ActorRef.SetAnimationVariableBool("bHumanoidFootIKDisable", 1) SendDefaultAnimEvent() GoToState(STATE_PLAYING) + _ActorLocked = True EndFunction Function RemoveStrapon() @@ -886,6 +889,7 @@ State Animating EndIf UnlockActorImpl() GoToState(STATE_PAUSED) + _ActorLocked = False EndFunction Function ResetPosition(int aiStripData, int aiPositionGenders) @@ -1118,6 +1122,7 @@ Function Initialize() _hasOrgasm = false _AllowRedress = true ForceOpenMouth = false + _ActorLocked = false ; Integers _sex = -1 _livestatus = 0 diff --git a/Source/Scripts/sslThreadModel.psc b/Source/Scripts/sslThreadModel.psc index 69689810..27da9698 100644 --- a/Source/Scripts/sslThreadModel.psc +++ b/Source/Scripts/sslThreadModel.psc @@ -497,6 +497,17 @@ bool Property IsLocked hidden EndFunction EndProperty +bool Function AllActorsLocked() + int i = 0 + While (i < _Positions.Length) + If (!ActorAlias[i].ActorIsLocked()) + return false + EndIf + i += 1 + EndWhile + return true +EndFunction + ; Every valid state will oerwrite this ; Should this ever be called, then the Thread was in an unspecified state and will be reset int Function GetStatus() From add209ed1e8746f36509543e44a505a85e7ce736 Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Mon, 26 Jan 2026 23:31:12 +0500 Subject: [PATCH 7/9] fix: force advance for acyclic stages --- Source/Scripts/sslThreadModel.psc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/Scripts/sslThreadModel.psc b/Source/Scripts/sslThreadModel.psc index 27da9698..789d38fd 100644 --- a/Source/Scripts/sslThreadModel.psc +++ b/Source/Scripts/sslThreadModel.psc @@ -921,7 +921,7 @@ State Animating Function AnimationStart() If (_animationSyncCount < _Positions.Length) _animationSyncCount += 1 - Log("AnimationStart called " + _animationSyncCount + "/" + (_Positions.Length + 1) + " times") + Log("AnimationStart called " + _animationSyncCount + "/" + (_Positions.Length) + " times") return EndIf Log("AnimationStart fully setup, begin animating") @@ -1086,7 +1086,10 @@ State Animating Endfunction Event OnUpdate() - If (AutoAdvance || _ForceAdvance) + If (_ForceAdvance) + GoToStage(_StageHistory.Length + 1) + return + ElseIf (AutoAdvance) _StageTimer -= ANIMATING_UPDATE_INTERVAL If (_StageTimer <= 0) If !ThreadWaitsForOrgasm() @@ -2343,7 +2346,7 @@ Function EnjBasedSkipToLastStage(bool abSkip) bool SoloDuoScenario = (_Positions.Length == 1 || _Positions.Length == 2) If (abSkip && NotEndStageScenario && SoloDuoScenario) SkipTo(SexLabRegistry.GetEndingStages(GetActiveScene())[0]) - _StageTimer -= (GetTimer() / 1.25) + _StageTimer -= (GetTimer() / 2) UpdateBaseSpeed(0.8) EndIf EndFunction From cdf71d90aae7db3f857d2af6902571c3353526a9 Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Thu, 29 Jan 2026 18:40:37 +0500 Subject: [PATCH 8/9] hasty inputs workaround and some other change --- Source/Scripts/SexLabUtil.psc | 10 ++++++++++ Source/Scripts/sslActorAlias.psc | 8 +++++--- Source/Scripts/sslMatchMakerMain.psc | 2 +- Source/Scripts/sslThreadController.psc | 6 ++++-- Source/Scripts/sslThreadModel.psc | 7 ++++--- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Source/Scripts/SexLabUtil.psc b/Source/Scripts/SexLabUtil.psc index 0c975285..26899203 100644 --- a/Source/Scripts/SexLabUtil.psc +++ b/Source/Scripts/SexLabUtil.psc @@ -152,6 +152,16 @@ string function ActorName(Actor ActorRef) global return ActorRef.GetLeveledActorBase().GetName() endFunction +string[] function ActorNames(Actor[] ActorRefs) global + string[] ret = PapyrusUtil.StringArray(ActorRefs.Length) + int i = 0 + while (i < ActorRefs.Length) + ret[i] = ActorName(ActorRefs[i]) + i += 1 + endwhile + return ret +EndFunction + int Function GetSex(Actor akActor) global return SexLabRegistry.GetSex(akActor, false) EndFunction diff --git a/Source/Scripts/sslActorAlias.psc b/Source/Scripts/sslActorAlias.psc index c3976ca3..48fc1862 100644 --- a/Source/Scripts/sslActorAlias.psc +++ b/Source/Scripts/sslActorAlias.psc @@ -479,7 +479,6 @@ State Ready _VoiceDelay = _BaseDelay _ExpressionDelay = _BaseDelay * 2 ; Post Delayed Initialization - UpdateBaseEnjoymentCalculations() If (!_Config.DebugMode) return EndIf @@ -666,6 +665,7 @@ bool _LovenseAnal State Animating Event OnBeginState() RegisterForModEvent("SSL_ORGASM_Thread" + _Thread.tid, "OnOrgasm") + UpdateBaseEnjoymentCalculations() _LoopLovenseDelay = 0 _LovenseGenital = false _LovenseAnal = false @@ -716,7 +716,9 @@ State Animating DoOrgasm() EndIf bool NoStaminaEndScenario = (_Config.NoStaminaEndsScene && !_victim && _ActorRef.GetActorValuePercentage("Stamina") < 0.10) - _Thread.EnjBasedSkipToLastStage(NoStaminaEndScenario) + If NoStaminaEndScenario + _Thread.EnjBasedSkipToLastStage(true) + EndIf If (_LoopLovenseDelay <= 0) If (_ActorRef == _PlayerRef && sslLovense.IsLovenseInstalled()) int lovenseStrength = sslSystemConfig.GetSettingInt("iLovenseStrength") @@ -888,8 +890,8 @@ State Animating _ActorRef.EvaluatePackage() EndIf UnlockActorImpl() - GoToState(STATE_PAUSED) _ActorLocked = False + GoToState(STATE_PAUSED) EndFunction Function ResetPosition(int aiStripData, int aiPositionGenders) diff --git a/Source/Scripts/sslMatchMakerMain.psc b/Source/Scripts/sslMatchMakerMain.psc index 09452c65..bd72ab00 100644 --- a/Source/Scripts/sslMatchMakerMain.psc +++ b/Source/Scripts/sslMatchMakerMain.psc @@ -87,7 +87,7 @@ Function TriggerSex(Actor[] akPassed) Config.Log("[SexLab Matchmaker] Cannot start animation; invalid actor count") return Else - Config.Log("[SexLab MatchMaker] Starting Scene with Actors: " + akPassed) + Config.Log("[SexLab MatchMaker] Starting Scene with Actors: " + SexLabUtil.ActorNames(akPassed)) EndIf Actor[] sub = new Actor[2] diff --git a/Source/Scripts/sslThreadController.psc b/Source/Scripts/sslThreadController.psc index 60882a83..1f17075f 100644 --- a/Source/Scripts/sslThreadController.psc +++ b/Source/Scripts/sslThreadController.psc @@ -78,7 +78,7 @@ Event MenuEvent(string asEventName, string asStringArg, float afNumArg, form akS ElseIf (asEventName == "SL_AdvanceScene") If (afNumArg) GoToStage(Stage - 1) - Else + ElseIf (GetTimeTotal() > 0.75) PlayNextImpl(asStringArg) EndIf ElseIf (asEventName == "SL_SetSpeed") @@ -97,7 +97,9 @@ Event MenuEvent(string asEventName, string asStringArg, float afNumArg, form akS ElseIf (asEventName == "SL_MoveScene") MoveScene() ElseIf (asEventName == "SL_EndScene") - EndAnimation() + If (GetTimeTotal() > 0.75) + EndAnimation() + EndIf ElseIf (asEventName == "SL_SetAnnotations") UpdateAnnotations(asStringArg) ElseIf (asEventName == "SL_SetOffset") diff --git a/Source/Scripts/sslThreadModel.psc b/Source/Scripts/sslThreadModel.psc index 789d38fd..5ff8e6e8 100644 --- a/Source/Scripts/sslThreadModel.psc +++ b/Source/Scripts/sslThreadModel.psc @@ -1050,7 +1050,6 @@ State Animating Function UpdateTimer(float AddSeconds = 0.0) _StageTimer += AddSeconds - _ForceAdvance = true TryUpdateMenuTimer(_StageTimer) EndFunction @@ -2341,10 +2340,12 @@ Function ProcessEnjGameArg(String arg = "", Actor akActor, Actor akPartner, floa EndFunction Function EnjBasedSkipToLastStage(bool abSkip) - ;for solo/duo scenes, skip to last scene stage if any actor has ran out of stamina or male has orgasmed + if !abSkip + return + EndIf bool NotEndStageScenario = (GetLegacyStageNum() < GetLegacyStagesCount()) bool SoloDuoScenario = (_Positions.Length == 1 || _Positions.Length == 2) - If (abSkip && NotEndStageScenario && SoloDuoScenario) + If (NotEndStageScenario && SoloDuoScenario) SkipTo(SexLabRegistry.GetEndingStages(GetActiveScene())[0]) _StageTimer -= (GetTimer() / 2) UpdateBaseSpeed(0.8) From 69422e4b1890c343e86b932adbf27c71c3be671d Mon Sep 17 00:00:00 2001 From: BabyImpala Date: Fri, 30 Jan 2026 20:34:35 +0500 Subject: [PATCH 9/9] improve: ApplyCumFX() --- Source/Scripts/sslActorAlias.psc | 26 --------------- Source/Scripts/sslThreadModel.psc | 53 +++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/Source/Scripts/sslActorAlias.psc b/Source/Scripts/sslActorAlias.psc index 48fc1862..9fc043ae 100644 --- a/Source/Scripts/sslActorAlias.psc +++ b/Source/Scripts/sslActorAlias.psc @@ -1063,32 +1063,6 @@ Function Redress() EndIf EndFunction -; ------------------------------------------------------- ; -; --- Orgasm FX --- ; -; ------------------------------------------------------- ; - -function ApplyCum() ; NOTE: Temporary? - ; TODO: _Tread.ApplyCumFX(Source = _ActorRef) - - ; Log("START", "ApplyCum") - if _ActorRef && _ActorRef.Is3DLoaded() - Cell ParentCell = _ActorRef.GetParentCell() - - bool vaginalPen = _Thread.IsVaginalComplex(_ActorRef) - bool oralPen = _Thread.IsOralComplex(_ActorRef) - bool analPen = _Thread.IsAnalComplex(_ActorRef) - - If _Config.DebugMode - Log("ApplyCum(): Adding v = " + vaginalPen + " o = " + oralPen + " a = " + analPen) - EndIf - - if (vaginalPen || oralPen || analPen) && ParentCell && ParentCell.IsAttached() - ; thanks a lot for removing ActorLib scrab - (Game.GetFormFromFile(0xD62, "SexLab.esm") as sslActorLibrary).AddCum(_ActorRef, vaginalPen, oralPen, analPen) - endIf - endIf -endFunction - ; ------------------------------------------------------- ; ; --- Initialization --- ; ; ------------------------------------------------------- ; diff --git a/Source/Scripts/sslThreadModel.psc b/Source/Scripts/sslThreadModel.psc index 5ff8e6e8..4ccf41c7 100644 --- a/Source/Scripts/sslThreadModel.psc +++ b/Source/Scripts/sslThreadModel.psc @@ -1572,21 +1572,48 @@ bool Function IsOralComplex(Actor ActorRef) EndFunction Function ApplyCumFX(Actor SourceRef) - ; TODO: If there is no schlong, consider failing silently - If (!Config.UseCum) - return - EndIf + If (!IsCollisionRegistered() || !Config.UseCum) + return + EndIf int i = 0 - while i < _Positions.Length - int otherSex = GetNthPositionSex(i) - - Log("Checking for cum FX: " + i + " " + otherSex) - - if (i != GetPosition(SourceRef)) && (otherSex == 1 || otherSex == 2 || otherSex == 4 || (SameSexThread() && (otherSex == 0 || otherSex == 3))) - ActorAlias[i].ApplyCum() - endIf + While (i < _Positions.Length) + Actor TargetRef = _Positions[i] + If (TargetRef != SourceRef && TargetRef.Is3DLoaded()) + Cell ParentCell = TargetRef.GetParentCell() + If (ParentCell && ParentCell.IsAttached()) + ;variable names are from SourceRef's (male/futa) perspective + ;bool pHandJob_ = HasCollisionAction(CTYPE_HandJob, TargetRef, SourceRef) + ;bool pFootJob_ = HasCollisionAction(CTYPE_FootJob, TargetRef, SourceRef) + ;bool pBoobJob_ = HasCollisionAction(CTYPE_BoobJob, TargetRef, SourceRef) + ;bool aFacial_ = HasCollisionAction(CTYPE_Facial, TargetRef, SourceRef) + ;bool aSkullfuck_ = HasCollisionAction(CTYPE_Skullfuck, TargetRef, SourceRef) + bool pOral_ = HasCollisionAction(CTYPE_Oral, TargetRef, SourceRef) + bool pDeepthroat_ = HasCollisionAction(CTYPE_Deepthroat, TargetRef, SourceRef) + bool pLickingShaft_ = HasCollisionAction(CTYPE_LickingShaft, TargetRef, SourceRef) + bool aVaginal_ = HasCollisionAction(CTYPE_Vaginal, TargetRef, SourceRef) + bool aAnal_ = HasCollisionAction(CTYPE_Anal, TargetRef, SourceRef) + bool any_oral = pOral_ || pDeepthroat_ || pLickingShaft_ + Log("ApplyCumFX(): Source [" + SexLabUtil.ActorName(SourceRef) + "] Target [" + SexLabUtil.ActorName(TargetRef) + "] CumFX_Types [O: " + any_oral + ", V: " + aVaginal_ + ", A: " + aAnal_ + "]") + int aiType = -2 + If (aVaginal_) + aiType = ActorLib.FX_VAGINAL + ElseIf (aAnal_) + aiType = ActorLib.FX_ANAL + ElseIf (any_oral) + aiType = ActorLib.FX_ORAL + EndIf + If (aiType != -2) + ActorLib.AddCumFx(TargetRef, aiType) + Int handle = ModEvent.Create("OnCumFxApplied") + ModEvent.PushForm(handle, TargetRef) + ModEvent.PushForm(handle, SourceRef) + ModEvent.PushInt(handle, aiType) + ModEvent.Send(handle) + EndIf + EndIf + EndIf i += 1 - endWhile + EndWhile EndFunction ; ------------------------------------------------------- ;