Scriptname _00E_FS_SleightOfHand_HiddenSlotSC extends ObjectReference ; This script sets up the sleight of hand loot of a chest upon activating it ;===================================================================================== ; EVENTS ;===================================================================================== Event OnActivate(ObjectReference akActionRef) If _00E_FS_IsForgottenStoriesActivated.GetValueInt() == 1 && !Self.IsLocked() && akActionRef == PlayerREF If !bSetUp SetUpHiddenSlot() EndIf Utility.Wait(0.5) If bFoundTreasure && !bDone OpenHiddenSlot() EndIf EndIf EndEvent Event OnMenuClose(String MenuName) containterToFill.RemoveAllItems(Self as ObjectReference, true, false) UnregisterForMenu("ContainerMenu") EndEvent ;===================================================================================== ; FUNCTIONS ;===================================================================================== Function OpenHiddenSlot() bDone = True UILockpickingCylinderTurnM.Play(PlayerREF) messageToShow.Show() If bOwned containterToFill.SetFactionOwner(SleightOfHandOwnerFaction) Else containterToFill.SetFactionOwner(none) Endif RegisterForMenu("ContainerMenu") containterToFill.Activate(PlayerREF, True) If sTreasureSize == "Big" UIEnchantingLearnEffectM.Play(PlayerREF) Levelsystem.GiveEP(iRewardEXPBigSlot) If _00E_HiddenSlotAchievementUnlocked.GetValueInt() == 0 && _00E_AchievementsEnabled.GetValueInt() == 1 _00E_HiddenSlotAchievementUnlocked.SetValueInt(1) Steam.UnlockAchievement("END_HIDDEN_SLOT_01") EndIf EndIf EndFunction Function SetUpHiddenSlot() bSetUp = True if DoesContainerHaveHiddenSlot() bFoundTreasure = True sTreasureSize = GetSlotSize() iHiddenSlotTier = GetHiddenSlotTier() iFormlistIndexOffset = 8*(iHiddenSlotTier - 1) iFormlistIndex if sTreasureSize == "Small" containterToFill = _00E_FS_SleightOfHand_HiddenSlot_SmallSlotREF iFormlistIndex = Utility.RandomInt(0, 2) + iFormlistIndexOffset Elseif sTreasureSize == "Medium" containterToFill = _00E_FS_SleightOfHand_HiddenSlot_MediumSlotREF iFormlistIndex = Utility.RandomInt(3, 5) + iFormlistIndexOffset Elseif sTreasureSize == "Big" containterToFill = _00E_FS_SleightOfHand_HiddenSlot_BigSlotREF iFormlistIndex = Utility.RandomInt(6, 7) + iFormlistIndexOffset EndIf bOwned = GetOwner() hiddenSlotFormlist = _00E_FS_HiddenSlotRewardFormlists.GetAt(iFormlistIndex) as Formlist AddItemsToContainer(hiddenSlotFormlist) EndIf EndFunction Function AddItemsToContainer(Formlist itemsToAdd) containterToFill.RemoveAllItems() if sTreasureSize == "Big" if !(itemsToAdd.HasForm(_00E_FS_SleightOfHand_HiddenSlotUsedMarker)) itemsToAdd.AddForm(_00E_FS_SleightOfHand_HiddenSlotUsedMarker) Else iFormlistIndex = Utility.RandomInt(3, 5) + iFormlistIndexOffset itemsToAdd = _00E_FS_HiddenSlotRewardFormlists.GetAt(iFormlistIndex) as Formlist messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound EndIf EndIf int iIndex = itemsToAdd.GetSize() - 1 while iIndex >= 0 Form formToAdd = itemsToAdd.GetAt(iIndex) if formToAdd == Gold001 containterToFill.AddItem(itemsToAdd.GetAt(iIndex), iHiddenSlotTier*5) Else containterToFill.AddItem(itemsToAdd.GetAt(iIndex), 1) EndIf iIndex -= 1 endwhile EndFunction bool Function DoesContainerHaveHiddenSlot() float fHiddenSlotChance = Utility.RandomInt(0, 100) iPlayerPickpocketSkill = PlayerREF.GetActorValue("Pickpocket") as Int ; raised the divider from 2 to 2.5, maybe we should raise it even further ; otherwise too much loot might be given away float fPlayerChance = iPlayerPickpocketSkill/2.5 If fPlayerChance < 15 fPlayerChance = 15 EndIf If fHiddenSlotChance <= fPlayerChance Return True Else Return False EndIf EndFunction int Function GetHiddenSlotTier() iPlayerLevel = PlayerLevel.GetValueInt() if iPlayerLevel >= iTierCap_1 && iPlayerLevel < iTierCap_2 Return 1 Elseif iPlayerLevel >= iTierCap_2 && iPlayerLevel < iTierCap_3 Return 2 Elseif iPlayerLevel >= iTierCap_3 && iPlayerLevel < iTierCap_4 Return 3 Elseif iPlayerLevel >= iTierCap_4 && iPlayerLevel < iTierCap_5 Return 4 Else Return 5 EndIf EndFunction string Function GetSlotSize() ; This calculates whether the hidden slot will be filled with a small, a regular, or a rare reward int iSlotSize = Utility.RandomInt(1, 100) if iSlotSize <= iBigSlotChance && PlayerREF.GetAV("Pickpocket") >= 75 messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sBigSlotFound Return "Big" Elseif (iSlotSize > iBigSlotChance) && (iSlotSize <= (iMediumSlotChance + iBigSlotChance)) && PlayerREF.GetAV("Pickpocket") >= 50 messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound Return "Medium" Else messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sSmallSlotFound Return "Small" EndIf EndFunction bool Function GetOwner() ContainerParentCell = Self.GetParentCell() If Self.GetActorOwner() bOwned = true EndIf If !bOwned && ContainerParentCell.GetActorOwner() bOwned = true EndIf If !bOwned && ContainerParentCell.GetFactionOwner() bOwned = true EndIf Return bOwned EndFunction ;===================================================================================== ; PROPERTIES ;===================================================================================== bool bFoundTreasure bool bDone bool bSetUp bool bOwned int iPlayerPickpocketSkill int iPlayerLevel int iHiddenSlotTier int iFormlistIndexOffset int iFormlistIndex int iRewardEXPBigSlot = 50 ; These integers determine at which levels player can access the different tiers int iTierCap_1 = 0 int iTierCap_2 = 15 int iTierCap_3 = 25 int iTierCap_4 = 35 int iTierCap_5 = 45 ; These integers determine the likelihood of the different slot sizes int iSmallSlotChance = 50 int iMediumSlotChance = 35 int iBigSlotChance = 15 String sTreasureSize ; This formlist will be filled with the formlist containing the items that will actually be added into the container Formlist hiddenSlotFormlist Message messageToShow ObjectReference containterToFill Cell ContainerParentCell _00E_QuestFunctions Property Levelsystem Auto Actor Property PlayerREF Auto GlobalVariable Property _00E_FS_IsForgottenStoriesActivated Auto GlobalVariable Property PlayerLevel Auto GlobalVariable Property _00E_AchievementsEnabled Auto GlobalVariable Property _00E_HiddenSlotAchievementUnlocked Auto ; These REFs simply provide the containers that will be filled when finding a secret slot ObjectReference Property _00E_FS_SleightOfHand_HiddenSlot_SmallSlotREF Auto ObjectReference Property _00E_FS_SleightOfHand_HiddenSlot_MediumSlotREF Auto ObjectReference Property _00E_FS_SleightOfHand_HiddenSlot_BigSlotREF Auto MiscObject Property Gold001 Auto MiscObject Property _00E_FS_SleightOfHand_HiddenSlotUsedMarker Auto Sound Property UILockpickingCylinderTurnM Auto Sound Property UIEnchantingLearnEffectM Auto Message Property _00E_FS_SleightOfHand_HiddenSlot_sSmallSlotFound Auto Message Property _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound Auto Message Property _00E_FS_SleightOfHand_HiddenSlot_sBigSlotFound Auto ; This contains all formlists with items for the rewards.For every tier, there are nine different treasures to be found, three in small and medium category, two in big. Formlist Property _00E_FS_HiddenSlotRewardFormlists Auto Faction Property SleightOfHandOwnerFaction Auto