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 !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) _00E_EPHandler.GiveEP(iRewardEXPBigSlot) If _00E_HiddenSlotAchievementUnlocked.GetValueInt() == 0 _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.GetActorValue("Pickpocket") >= 75 messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sBigSlotFound Return "Big" Elseif (iSlotSize > iBigSlotChance) && (iSlotSize <= (iMediumSlotChance + iBigSlotChance)) && PlayerREF.GetActorValue("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 Actor Property PlayerREF Auto GlobalVariable Property PlayerLevel 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