Jump to content

Recommended Posts

Scriptname StLU_QuestScript extends Quest  

SexLabFramework Property SexLab Auto

Actor Property PlayerRef Auto
Float Property MinSexHours Auto ; 1
Float Property LevelUpCooldownHours Auto ; 1
Int Property LevelUpLimit Auto ; 1
Bool Property RestrictPerkSpendingToSex Auto ; 1
Int Property PerkSpendingLimit Auto ; 1
Bool Property MaintainHealthPercentageOnLevelUp Auto ; 0
Bool Property MaintainMagickaPercentageOnLevelUp Auto ; 0
Bool Property MaintainStaminaPercentageOnLevelUp Auto ; 0

float lockedExp = 0.0
float minSexEndTime
float timeOfLastLevelUp
int lockedPerkPoints = 0

Event OnInit()
    GoToState("")
    timeOfLastLevelUp = -2147483648
EndEvent

Event OnPlayerLoadGame()
    GoToState("")
EndEvent

    Event OnBeginState()
        UnlockPerkPoints(true)
        RegisterForModEvent("HookAnimationStart", "OnAnimationStart")
        RegisterForModEvent("HookAnimationEnding", "OnAnimationEnding")
        RegisterForMenu("StatsMenu")
    EndEvent

    Event OnAnimationStart(int tid, bool HasPlayer)
        float afSexStartTime
        If HasPlayer && !SexLab.IsVictim(tid, playerRef)
            minSexEndTime = afSexStartTime + (MinSexHours - 1.0/1440)/24.0
        EndIf
    EndEvent

    Event OnMenuOpen(string menuName)
        LockExcessExp(true)
        If (RestrictPerkSpendingToSex)
            LockPerkPoints()
        EndIf
    EndEvent

    Event OnMenuClose(string menuName)
        UnlockExcessExp()
        UnlockPerkPoints(true)
    EndEvent

    Event OnAnimationEnding(int tid, bool HasPlayer)
        float currentTime
        float minTimeOfNextLevelUp
        If HasPlayer && !SexLab.IsVictim(tid, playerRef)
            currentTime = Utility.GetCurrentGameTime()
            minTimeOfNextLevelUp = MinTimeOfNextLevelUp()
            return
        EndIf
    
        If (currentTime >= minSexEndTime)
            If (Game.GetPlayerExperience() >= Game.GetExperienceForLevel(PlayerRef.GetLevel()) && currentTime >= minTimeOfNextLevelUp)                
                GoToState("LevellingUp")    
            ElseIf (RestrictPerkSpendingToSex && Game.GetPerkPoints() > 0)
                GoToState("SpendingPerkPoints")
            EndIf            
        EndIf
    EndEvent

    Event OnEndState()
        LockPerkPoints()
        UnregisterForMenu("StatsMenu")
    EndEvent

State SpendingPerkPoints
    Event OnBeginState()
        DisableControls()
        RegisterForMenu("StatsMenu")
        UnlockPerkPoints(false)
        ForceOpenStatsMenu()
    EndEvent

    Event OnMenuOpen(string menuName)
        LockExcessExp(true)
    EndEvent

    Event OnMenuClose(string menuName)
        GoToState("")
    EndEvent

    Event OnEndState()
        ReEnableControls()
        UnlockExcessExp()
        UnregisterForMenu("StatsMenu")
    EndEvent
EndState

float healthPercentage
float magickaPercentage
float staminaPercentage
int levelUpCount = 0

State LevellingUp
    Event OnBeginState()
        timeOfLastLevelUp = MinTimeOfNextLevelUp()
        RegisterForMenu("LevelUp Menu")
        DisableControls()
        ForceOpenStatsMenu()
    EndEvent

    Event OnMenuOpen(string menuName)
        healthPercentage = PlayerRef.GetAVPercentage("Health")
        magickaPercentage = PlayerRef.GetAVPercentage("Magicka")
        staminaPercentage = PlayerRef.GetAVPercentage("Stamina")
        LockExcessExp(false)
    EndEvent

    Event OnMenuClose(string menuName)
        If (MaintainHealthPercentageOnLevelUp)
            DamagePlayerAvToPercentage("Health", healthPercentage)
        EndIf
        If (MaintainMagickaPercentageOnLevelUp)
            DamagePlayerAvToPercentage("Magicka", magickaPercentage)
        EndIf
        If (MaintainStaminaPercentageOnLevelUp)
            DamagePlayerAvToPercentage("Stamina", staminaPercentage)
        EndIf

        levelUpCount += 1
        If (lockedExp < Game.GetExperienceForLevel(PlayerRef.GetLevel()))
            GoToState("SpendingPerkPoints")
        ElseIf (levelUpCount < LevelUpLimit || LevelUpLimit == 0)
            UnlockExcessExpAfterLevelUp(false)
        Else
            GoToState("SpendingPerkPoints")
        EndIf
    EndEvent

    Event OnEndState()
        UnlockExcessExpAfterLevelUp(true)
        LockPerkPoints()
        ReEnableControls()
        levelUpCount = 0
        UnregisterForMenu("LevelUp Menu")
    EndEvent
EndState

Function LockExcessExp(bool preventLevelUp)
    float playerExp = Game.GetPlayerExperience()
    float expToNextLevel = Game.GetExperienceForLevel(PlayerRef.GetLevel())

    If (playerExp >= expToNextLevel)
        lockedExp += playerExp - expToNextLevel + preventLevelUp as int
        Game.SetPlayerExperience(expToNextLevel - preventLevelUp as int)
    EndIf
EndFunction

Function UnlockExcessExp()
    Game.SetPlayerExperience(Game.GetPlayerExperience() + lockedExp)
    lockedExp = 0.0
EndFunction

Function UnlockExcessExpAfterLevelUp(bool preventLevelUp)
    float playerExp = Game.GetPlayerExperience()
    float expToNextLevel = Game.GetExperienceForLevel(PlayerRef.GetLevel())

    If (playerExp + lockedExp >= expToNextLevel)
        lockedExp -= expToNextLevel - playerExp - preventLevelUp as float
        Game.SetPlayerExperience(expToNextLevel - preventLevelUp as float)
    Else
        Game.SetPlayerExperience(playerExp + lockedExp)
        lockedExp = 0.0
    EndIf
EndFunction

Function UnlockPerkPoints(bool all)
    If (!all && RestrictPerkSpendingToSex)
        If (lockedPerkPoints <= PerkSpendingLimit || PerkSpendingLimit == 0)
            Game.ModPerkPoints(lockedPerkPoints)
            lockedPerkPoints = 0
        Else
            Game.ModPerkPoints(PerkSpendingLimit)
            lockedPerkPoints -= PerkSpendingLimit
        EndIf
    Else
        Game.ModPerkPoints(lockedPerkPoints)
        lockedPerkPoints = 0
    EndIf
EndFunction

Function LockPerkPoints()
    lockedPerkPoints += Game.GetPerkPoints()
    Game.SetPerkPoints(0)
EndFunction

Function DamagePlayerAvToPercentage(string value, float percentage)
    float maxValue = PlayerRef.GetActorValue(value)
    float damage = (-1 * percentage + 1) * maxValue
    PlayerRef.DamageActorValue(value, damage)
EndFunction

Function ForceOpenStatsMenu()
    If (UI.IsMenuOpen("StatsMenu"))
        Return
    EndIf

    Utility.Wait(1.0)
    int keyCodeQuickStats = Input.GetMappedKey("Quick Stats")

    If (keyCodeQuickStats != -1.0)
       Input.TapKey(keyCodeQuickStats)
    EndIf
EndFunction

bool wasFastTravelEnabled
bool wasActivateControlsEnabled
bool wasFightingControlsEnabled
bool wasMovementControlsEnabled
bool wasSneakingControlsEnabled

Function DisableControls()
    wasFastTravelEnabled  = Game.IsFastTravelEnabled()
    wasActivateControlsEnabled = Game.IsActivateControlsEnabled()
    wasFightingControlsEnabled = Game.IsFightingControlsEnabled()
    wasMovementControlsEnabled = Game.IsMovementControlsEnabled()
    wasSneakingControlsEnabled = Game.IsSneakingControlsEnabled()
    Game.EnableFastTravel(false)
    Game.DisablePlayerControls(true, true, false, false, true, false, true, false)
EndFunction

Function ReEnableControls()
    If (!Game.IsFastTravelEnabled())
        Game.EnableFastTravel(wasFastTravelEnabled)
    EndIf

    Game.EnablePlayerControls(wasMovementControlsEnabled, wasFightingControlsEnabled, false, false, wasSneakingControlsEnabled, false, wasActivateControlsEnabled, false)
EndFunction

float Function HighestOf(float a, float b)
    If (a > b)
        Return a
    Else
        Return b
    EndIf
EndFunction

float Function GetTimeOfLastLevelUp()
    return timeOfLastLevelUp
EndFunction

float Function MinTimeOfNextLevelUp()
    return HighestOf(minSexEndTime, (timeOfLastLevelUp + LevelUpCooldownHours/24.0) - 1.0/1440)
EndFunction

 


I try to make a mod that only enable level up after sex 

level up is unable before sex but level up is unable after sex either

Link to comment
On 2/10/2024 at 6:39 PM, traison said:

OnAnimationEnding does not take into consideration "lockedExp" and "lockedPerkPoints" when deciding whether to show the menus or not.


Solved. The problem was checking time. when I removed a part of checking time It works. thank you.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more information, see our Privacy Policy & Terms of Use