enderalse/scripts/source/_00e_fs_dismantle_workbench.psc

98 lines
3.7 KiB
Plaintext

Scriptname _00E_FS_Dismantle_Workbench extends ObjectReference
{lets the player melt down items to one of its base components, extends the crafting classes}
; properties
Actor Property PlayerREF Auto
FormList Property _00E_DismantleList Auto
FormList Property _00E_DismantleItemList Auto
FormList Property _00E_DismantleResetList Auto
Message Property _00E_CheckForDismantlingMSG Auto
Keyword Property CraftingSmelterDismantling Auto
Keyword Property InvisibleDismantling Auto
Perk Property _00E_Class_Phasmalist_P04_A_ArcaneBreakdown Auto
; events
Event OnInit()
BlockActivation()
EndEvent
Event OnActivate(ObjectReference akActionRef)
If Self.IsActivationBlocked()
RegisterForMenu("Crafting Menu")
; GenerateMeltDownList() is relatively slow due to using formlists hence we notify the player that something is calculated in the background
_00E_CheckForDismantlingMSG.Show()
GenerateMeltDownList()
Self.Activate(PlayerREF, true)
EndIf
Endevent
Event OnMenuClose(String MenuName)
If menuName == ("Crafting Menu")
UnregisterForMenu("Crafting Menu")
ResetMeltDownList()
; only enable the player controls after everything is reset properly
Game.EnablePlayerControls()
EndIf
EndEvent
; functions
Function GenerateMeltDownList()
; this function is responsible for filling a list based on the items in the players inventory which can be melted down to crafting material
Int iTotalItemCount = PlayerREF.GetNumItems()
Int iItemCount = 0
Form ItemToCheck
Bool bPlayerHasArcaneBreakdown = PlayerREF.HasPerk(_00E_Class_Phasmalist_P04_A_ArcaneBreakdown)
Form equippedItemLeft = PlayerRef.GetEquippedObject(0)
Form equippedItemRight = PlayerRef.GetEquippedObject(1)
While iItemCount < iTotalItemCount
ItemToCheck = PlayerREF.GetNthForm(iItemCount)
If (ItemToCheck as Armor) != None ; armor
;checks the item if it's equipped and if it's either enchanted or if the player has the perk to dismantle enchantmented items
If ItemToCheck != equippedItemRight && ItemToCheck != equippedItemLeft && PlayerREF.IsEquipped(ItemToCheck) == False
If bPlayerHasArcaneBreakdown || (ItemToCheck as Armor).GetEnchantment() == None
AddItemToDismantleList(ItemToCheck)
EndIf
EndIf
ElseIf (ItemToCheck as Weapon) != None ; weapon
;checks the item if it's equipped and if it's either enchanted or if the player has the perk to dismantle enchantmented items
; Note: IsEquipped does not work for any stuff in the left hand when dual wielding
If ItemToCheck != equippedItemRight && ItemToCheck != equippedItemLeft
If bPlayerHasArcaneBreakdown || (ItemToCheck as Weapon).GetEnchantment() == None
AddItemToDismantleList(ItemToCheck)
EndIf
EndIf
EndIf
iItemCount += 1
EndWhile
EndFunction
Function AddItemToDismantleList(Form itemToAdd)
; if the item passes the checks, we need to set the workbenchkeyword of the respective constructible object so it gets displayed properly in the menu
; it also adds it to the reset list so the keyword gets set back to the default one after exiting the menu
Int iFoundAtIndex = _00E_DismantleItemList.Find(itemToAdd)
If iFoundAtIndex >= 0
ConstructibleObject recipe = _00E_DismantleList.GetAt(iFoundAtIndex) as ConstructibleObject
recipe.SetWorkBenchKeyword(CraftingSmelterDismantling)
_00E_DismantleResetList.AddForm(recipe)
EndIf
EndFunction
Function ResetMeltDownList()
; this function resets the workbenchkeyword back to default
Int iTotalRecipesToReset = _00E_DismantleResetList.GetSize()
Int iRecipesToReset = iTotalRecipesToReset
While iRecipesToReset > 0
iRecipesToReset -= 1
(_00E_DismantleResetList.GetAt(iRecipesToReset) as ConstructibleObject).SetWorkBenchKeyword(InvisibleDismantling)
EndWhile
_00E_DismantleResetList.Revert()
EndFunction