296 lines
8.9 KiB
Plaintext
296 lines
8.9 KiB
Plaintext
Scriptname _00E_ContainerBonusControl extends Quest Hidden
|
|
; This script sets up the sleight of hand loot of a chest upon activating it
|
|
|
|
int function _GetScriptVersion() Global
|
|
return 2
|
|
endFunction
|
|
|
|
;=====================================================================================
|
|
; FUNCTIONS
|
|
;=====================================================================================
|
|
|
|
function OnOpenContainer(ObjectReference targetContainer)
|
|
|
|
; Lockpicking menu
|
|
while targetContainer.IsLocked() && Utility.IsInMenuMode()
|
|
Utility.WaitMenuMode(1.0)
|
|
endwhile
|
|
|
|
; Game mode and still locked
|
|
if targetContainer.IsLocked()
|
|
return
|
|
endif
|
|
|
|
; Wait for it to open
|
|
int i
|
|
while i < 20 && targetContainer.GetOpenState() == 2 && ! Utility.IsInMenuMode()
|
|
Utility.WaitMenuMode(0.1)
|
|
i += 1
|
|
endwhile
|
|
|
|
; Leave if we are not in the container menu yet
|
|
if SKSE.GetVersion()
|
|
if ! UI.IsMenuOpen("ContainerMenu")
|
|
return
|
|
endif
|
|
elseif ! Utility.IsInMenuMode()
|
|
return
|
|
endif
|
|
|
|
if targetContainer.GetItemCount(_00E_HiddenSlotChecked)
|
|
return
|
|
endif
|
|
|
|
targetContainer.AddItem(_00E_HiddenSlotChecked, 1, true)
|
|
|
|
if targetContainer.GetItemCount(Gold001) >= 5
|
|
IncrementGold(targetContainer)
|
|
endif
|
|
|
|
if _00E_ChestsWithHiddenSlots.HasForm(targetContainer.GetBaseObject())
|
|
OpenHiddenSlot(targetContainer)
|
|
endif
|
|
|
|
endfunction
|
|
|
|
Function IncrementGold(ObjectReference targetContainer)
|
|
|
|
int iGoldMultiplicator = _00E_GoldMult.GetValue() as int
|
|
|
|
if iGoldMultiplicator <= 0
|
|
iGoldMultiplicator = 5
|
|
endif
|
|
|
|
float fIncrementPercentage = ( PlayerREF.GetActorValue("Lockpicking") / iGoldMultiplicator ) / 100
|
|
int iGoldBuffAmount = ( targetContainer.GetItemCount(Gold001) * fIncrementPercentage ) as Int
|
|
|
|
if iGoldBuffAmount <= 0
|
|
return
|
|
endif
|
|
|
|
targetContainer.AddItem(Gold001, iGoldBuffAmount)
|
|
|
|
if iGoldBuffAmount > 1
|
|
_00E_FS_LockpickingGoldBuffMSG.Show(iGoldBuffAmount as Int)
|
|
EndIf
|
|
|
|
EndFunction
|
|
|
|
function OpenHiddenSlot(ObjectReference currentContainer, bool bLootMenu = false)
|
|
|
|
if ! SetUpHiddenSlot(currentContainer)
|
|
return
|
|
endif
|
|
|
|
UILockpickingCylinderTurnM.Play(PlayerREF)
|
|
messageToShow.Show()
|
|
|
|
if bLootMenu
|
|
containerToFill.RemoveAllItems(currentContainer, true, true)
|
|
else
|
|
; Open hidden container after the original one closes
|
|
Utility.Wait(0.1)
|
|
|
|
If IsOwned(currentContainer)
|
|
containerToFill.SetFactionOwner(SleightOfHandOwnerFaction)
|
|
Else
|
|
containerToFill.SetFactionOwner(none)
|
|
Endif
|
|
|
|
containerToFill.lastContainer = currentContainer
|
|
containerToFill.Activate(PlayerREF, false)
|
|
endif
|
|
|
|
If containerToFill == _00E_FS_SleightOfHand_HiddenSlot_BigSlotREF
|
|
_00E_EPHandler.GiveEP(_00E_BigHiddenSlotExpReward.GetValue() as int)
|
|
If _00E_HiddenSlotAchievementUnlocked.GetValueInt() == 0
|
|
UIEnchantingLearnEffectM.Play(PlayerREF)
|
|
_00E_HiddenSlotAchievementUnlocked.SetValueInt(1)
|
|
Steam.UnlockAchievement("END_HIDDEN_SLOT_01")
|
|
EndIf
|
|
EndIf
|
|
|
|
endfunction
|
|
|
|
bool function SetUpHiddenSlot(ObjectReference aContainer)
|
|
|
|
if ! DoesContainerHaveHiddenSlot()
|
|
return false
|
|
EndIf
|
|
|
|
messageToShow = GetSlotMessage()
|
|
int iHiddenSlotTier = GetHiddenSlotTier()
|
|
|
|
int iFormlistIndexOffset = 8*(iHiddenSlotTier - 1)
|
|
int iFormlistIndex
|
|
|
|
if messageToShow == _00E_FS_SleightOfHand_HiddenSlot_sSmallSlotFound
|
|
|
|
containerToFill = _00E_FS_SleightOfHand_HiddenSlot_SmallSlotREF as _00E_HiddenSlotContainer
|
|
iFormlistIndex = Utility.RandomInt(0, 2) + iFormlistIndexOffset
|
|
|
|
Elseif messageToShow == _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound
|
|
|
|
containerToFill = _00E_FS_SleightOfHand_HiddenSlot_MediumSlotREF as _00E_HiddenSlotContainer
|
|
iFormlistIndex = Utility.RandomInt(3, 5) + iFormlistIndexOffset
|
|
|
|
Elseif messageToShow == _00E_FS_SleightOfHand_HiddenSlot_sBigSlotFound
|
|
|
|
containerToFill = _00E_FS_SleightOfHand_HiddenSlot_BigSlotREF as _00E_HiddenSlotContainer
|
|
iFormlistIndex = Utility.RandomInt(6, 7) + iFormlistIndexOffset
|
|
|
|
EndIf
|
|
|
|
Formlist hiddenSlotFormlist = _00E_FS_HiddenSlotRewardFormlists.GetAt(iFormlistIndex) as Formlist
|
|
AddItemsToContainer(hiddenSlotFormlist, iFormlistIndexOffset, iHiddenSlotTier)
|
|
|
|
return true
|
|
|
|
EndFunction
|
|
|
|
Function AddItemsToContainer(Formlist itemsToAdd, int iFormlistIndexOffset, int iHiddenSlotTier)
|
|
|
|
containerToFill.RemoveAllItems()
|
|
|
|
if containerToFill == _00E_FS_SleightOfHand_HiddenSlot_BigSlotREF
|
|
|
|
if ! itemsToAdd.HasForm(_00E_FS_SleightOfHand_HiddenSlotUsedMarker)
|
|
itemsToAdd.AddForm(_00E_FS_SleightOfHand_HiddenSlotUsedMarker)
|
|
Else
|
|
int iFormlistIndex = Utility.RandomInt(3, 5) + iFormlistIndexOffset
|
|
itemsToAdd = _00E_FS_HiddenSlotRewardFormlists.GetAt(iFormlistIndex) as Formlist
|
|
messageToShow = _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound
|
|
EndIf
|
|
|
|
EndIf
|
|
|
|
containerToFill.AddItem(itemsToAdd, 1, true)
|
|
|
|
if itemsToAdd.HasForm(Gold001)
|
|
containerToFill.AddItem(Gold001, iHiddenSlotTier * 5 - 1, true)
|
|
endif
|
|
|
|
EndFunction
|
|
|
|
bool Function DoesContainerHaveHiddenSlot()
|
|
|
|
float fHiddenSlotChance = Utility.RandomInt(0, 100)
|
|
|
|
int 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
|
|
|
|
return (fHiddenSlotChance <= fPlayerChance)
|
|
|
|
EndFunction
|
|
|
|
int Function GetHiddenSlotTier()
|
|
|
|
int 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
|
|
|
|
Message Function GetSlotMessage()
|
|
|
|
; 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
|
|
return _00E_FS_SleightOfHand_HiddenSlot_sBigSlotFound
|
|
|
|
Elseif (iSlotSize > iBigSlotChance) && (iSlotSize <= (iMediumSlotChance + iBigSlotChance)) && PlayerREF.GetActorValue("Pickpocket") >= 50
|
|
return _00E_FS_SleightOfHand_HiddenSlot_sMediumSlotFound
|
|
|
|
Else
|
|
return _00E_FS_SleightOfHand_HiddenSlot_sSmallSlotFound
|
|
|
|
EndIf
|
|
|
|
EndFunction
|
|
|
|
bool Function IsOwned(ObjectReference aContainer)
|
|
|
|
If aContainer.GetActorOwner()
|
|
return true
|
|
EndIf
|
|
|
|
Cell ContainerParentCell = aContainer.GetParentCell()
|
|
|
|
return ContainerParentCell.GetActorOwner() || ContainerParentCell.GetFactionOwner()
|
|
|
|
EndFunction
|
|
|
|
;=====================================================================================
|
|
; PROPERTIES
|
|
;=====================================================================================
|
|
|
|
; 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
|
|
|
|
; This formlist will be filled with the formlist containing the items that will actually be added into the container
|
|
Message messageToShow
|
|
_00E_HiddenSlotContainer containerToFill
|
|
|
|
Actor Property PlayerRef Auto
|
|
ActorBase Property Player Auto
|
|
|
|
GlobalVariable Property PlayerLevel Auto
|
|
GlobalVariable Property _00E_HiddenSlotAchievementUnlocked Auto
|
|
GlobalVariable Property _00E_BigHiddenSlotExpReward Auto
|
|
|
|
; Use this to control how much the lockpicking skill increments the gold found in chest. When changing, remember to change in _00E_LootContainer.psc as well!
|
|
; Current calculation: Gold in chest*((Lockpicking/iGoldMultiplicator)/100)
|
|
GlobalVariable Property _00E_GoldMult 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
|
|
MiscObject Property _00E_HiddenSlotChecked 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
|
|
FormList Property _00E_ChestsWithHiddenSlots Auto
|
|
|
|
Faction Property SleightOfHandOwnerFaction Auto
|
|
|
|
Message Property _00E_FS_LockpickingGoldBuffMSG Auto
|