4
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

216 lines
7.2 KiB

Scriptname _00E_ChestAndDoorLockScript extends ObjectReference
;=====================================================================================
; GOLDBUFF
;=====================================================================================
; 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)
int iGoldMultiplicator = 5
int iCurrentGoldCount
float fPlayerLockpicking
bool bDone
GlobalVariable Property _00E_FS_IsForgottenStoriesActivated Auto
Message Property _00E_FS_LockpickingGoldBuffMSG Auto
MiscObject Property Gold001 Auto
Event OnOpen(ObjectReference akActionRef)
If _00E_FS_IsForgottenStoriesActivated == None ; just in case, all properties in all doors and containers should be filled by now
_00E_FS_IsForgottenStoriesActivated = Game.GetForm(0x0004320E) as GlobalVariable
EndIf
if !bDone && (Self.GetBaseObject().GetType() == 28) && _00E_FS_IsForgottenStoriesActivated.GetValueInt() == 1 ; check if it's a container otherwise the script tries to call this stuff on doors
bDone = True
iCurrentGoldCount = Self.GetItemCount(Gold001)
fPlayerLockpicking = PlayerREF.GetActorValue("Lockpicking")
if iCurrentGoldCount >= 5 && fPlayerLockpicking >= 15
IncrementGold()
EndIf
EndIf
EndEvent
;=====================================================================================
; FUNCTIONS
;=====================================================================================
Function IncrementGold()
float fIncrementPercentage = (fPlayerLockpicking/iGoldMultiplicator)/100
int iGoldBuffAmount = (iCurrentGoldCount*fIncrementPercentage) as Int
Self.AddItem(Gold001, iGoldBuffAmount)
if iGoldBuffAmount > 1
_00E_FS_LockpickingGoldBuffMSG.Show(iGoldBuffAmount as Int)
EndIf
EndFunction
;=====================================================================================
; ORIGINAL SCRIPT
;=====================================================================================
Event OnLoad()
If _00E_FS_IsForgottenStoriesActivated == None ; just in case, all properties in all doors and containers should be filled by now
_00E_FS_IsForgottenStoriesActivated = Game.GetForm(0x0004320E) as GlobalVariable
Gold001 = Game.GetFormFromFile(0x0000000F, "Skyrim.esm") as MiscObject
_00E_FS_LockpickingGoldBuffMSG = Game.GetFormFromFile(0x0001ED74, "Enderal - Forgotten Stories.esm") as Message
_00E_sDoorLocked = Game.GetForm(0x00141570) as Message
_00E_Game_UnlockNeedsSkill = Game.GetForm(0x00042AE0) as Message
EndIf
BlockActivation(True)
EndEvent
Int Property LOCK_LEVEL_NOVICE = 1 AutoReadOnly
Int Property LOCK_LEVEL_APPRENTICE = 25 AutoReadOnly
Int Property LOCK_LEVEL_ADEPT = 50 AutoReadOnly
Int Property LOCK_LEVEL_EXPERT = 75 AutoReadOnly
Int Property LOCK_LEVEL_MASTER = 254 AutoReadOnly
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
If akAggressor != PlayerREF || IsLocked() == False
Return
EndIf
Int projectileLevel = 0
If akProjectile == _00E_UnlockProjectile_Novice
projectileLevel = LOCK_LEVEL_NOVICE
ElseIf akProjectile == _00E_UnlockProjectile_Apprentice
projectileLevel = LOCK_LEVEL_APPRENTICE
ElseIf akProjectile == _00E_UnlockProjectile_Adept
projectileLevel = LOCK_LEVEL_ADEPT
ElseIf akProjectile == _00E_UnlockProjectile_Expert
projectileLevel = LOCK_LEVEL_EXPERT
ElseIf akProjectile == _00E_UnlockProjectile_Master
projectileLevel = LOCK_LEVEL_MASTER
ElseIf akSource
Formlist unlockSpells = Game.GetFormFromFile(0x00044EE4, "Skyrim.esm") as Formlist
If unlockSpells.HasForm(akSource)
If akSource == unlockSpells.GetAt(0) as Explosion
projectileLevel = LOCK_LEVEL_APPRENTICE
ElseIf akSource == unlockSpells.GetAt(1) as Explosion
projectileLevel = LOCK_LEVEL_ADEPT
ElseIf akSource == unlockSpells.GetAt(2) as Explosion
projectileLevel = LOCK_LEVEL_EXPERT
ElseIf akSource == unlockSpells.GetAt(3) as Explosion
projectileLevel = LOCK_LEVEL_MASTER
EndIf
EndIf
EndIf
If projectileLevel > 0
Int lockLevel = self.GetLockLevel()
If lockLevel > LOCK_LEVEL_MASTER
_00E_sDoorLocked.Show()
WPNTG06ControlStaffShootFailM.Play(Self)
ElseIf projectileLevel >= lockLevel
UnlockLock()
EndIf
EndIf
EndEvent
Bool Function _IsInSuntemple()
If _00E_SuntempleLocations
Location curLoc = GetCurrentLocation()
If curLoc && _00E_SuntempleLocations.HasForm(curLoc)
Return True
EndIf
EndIf
Return False
EndFunction
Bool Function _IsInSiege()
Quest qSiegeQuest = Game.GetForm(0x0002EBAD) as Quest
Int siegeStage = qSiegeQuest.GetStage()
Return (siegeStage >= 5 && siegeStage <= 125)
EndFunction
Bool Function _PlayerHasKey()
Key myKey = GetKey()
Return (myKey && PlayerREF.GetItemCount(myKey) > 0)
EndFunction
Event OnActivate(ObjectReference akActionRef)
If akActionRef == PlayerREF
If _IsInSiege() && (Self.GetBaseObject().GetType() != 29 || _IsInSuntemple() == False)
_00E_sDoorLocked.Show()
ElseIf IsActivationBlocked()
If IsLocked() && _PlayerHasKey() == False
Bool bPlayerCanActivate = False
Int iLockLevel = GetLockLevel()
If iLockLevel <= LOCK_LEVEL_APPRENTICE
bPlayerCanActivate = True
ElseIf iLockLevel <= LOCK_LEVEL_ADEPT
bPlayerCanActivate = (PlayerREF.HasPerk(_00E_Class_Trickery_P04b_) || PlayerREF.GetAV("Lockpicking") >= 25)
ElseIf iLockLevel <= LOCK_LEVEL_EXPERT
bPlayerCanActivate = (PlayerREF.HasPerk(_00E_Class_Trickery_P07_) || PlayerREF.GetAV("Lockpicking") >= 50)
ElseIf iLockLevel <= LOCK_LEVEL_MASTER
bPlayerCanActivate = (PlayerREF.HasPerk(_00E_Class_Trickery_P10_) || PlayerREF.GetAV("Lockpicking") >= 75)
Else
bPlayerCanActivate = True
EndIf
If bPlayerCanActivate
Activate(PlayerREF, True)
Else
_00E_Game_UnlockNeedsSkill.Show()
EndIf
Else
BlockActivation(False)
Activate(PlayerREF, True)
EndIf
EndIf
Else
Activate(akActionRef, True)
EndIf
EndEvent
Function UnlockLock()
Self.Lock(False)
_00E_UILockpickingUnlockM.Play(Self)
_00E_Ability_Antimagic_FXSShader.Play(Self)
self.PlaceAtMe(_00E_UnlockLockExplosion, 1)
EndFunction
Formlist Property _00E_SuntempleLocations Auto
Projectile Property _00E_UnlockProjectile_Novice Auto
Projectile Property _00E_UnlockProjectile_Apprentice Auto
Projectile Property _00E_UnlockProjectile_Adept Auto
Projectile Property _00E_UnlockProjectile_Expert Auto
Projectile Property _00E_UnlockProjectile_Master Auto
Message Property _00E_sDoorLocked Auto
Perk Property _00E_Class_Trickery_P04b_ Auto ; Unlock adept locks perk
Perk Property _00E_Class_Trickery_P07_ Auto ; Unlock expert locks
Perk Property _00E_Class_Trickery_P10_ Auto ; Unlock master locks
Sound Property _00E_UILockpickingUnlockM Auto
Sound Property WPNTG06ControlStaffShootFailM Auto
EffectShader Property _00E_Ability_Antimagic_FXSShader Auto
Explosion Property _00E_UnlockLockExplosion Auto
Actor Property PlayerREF Auto
Message Property _00E_Game_UnlockNeedsSkill Auto