98 lines
3.7 KiB
Plaintext
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 |