Guest Posted February 10, 2024 Posted February 10, 2024 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
traison Posted February 10, 2024 Posted February 10, 2024 OnAnimationEnding does not take into consideration "lockedExp" and "lockedPerkPoints" when deciding whether to show the menus or not.
Guest Posted February 14, 2024 Posted February 14, 2024 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.
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