Refactored _00E_Theriantrophist_AlchemyControl to use vanilla arrays, removed JContainers requirement
This commit is contained in:
parent
3923bfcfe5
commit
0c8c29a779
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
scripts/_00e_theriantrophist_update_12.pex
Normal file
BIN
scripts/_00e_theriantrophist_update_12.pex
Normal file
Binary file not shown.
Binary file not shown.
@ -1,13 +0,0 @@
|
|||||||
Scriptname _00E_Func_CheckJContainers Hidden
|
|
||||||
|
|
||||||
Function Run() global
|
|
||||||
|
|
||||||
Int SKSEVer = SKSE.GetVersion()
|
|
||||||
|
|
||||||
if (SKSEVer == 0 || (SKSE.GetPluginVersion("JContainers64") == -1) && (SKSE.GetPluginVersion("JContainersVR") == -1))
|
|
||||||
; JContainers is only required for lycanthropy, so we just nag users without preventing playing without it
|
|
||||||
Utility.wait(2.0)
|
|
||||||
Debug.MessageBox("JContainers is not loaded! The game will not run properly. Verify integrity of your files or reinstall JContainers.")
|
|
||||||
endif
|
|
||||||
|
|
||||||
EndFunction
|
|
@ -23,7 +23,6 @@ Event OnInit()
|
|||||||
|
|
||||||
_00E_Func_CheckSKSE.Run()
|
_00E_Func_CheckSKSE.Run()
|
||||||
_00E_Func_CheckEnderalDLL.Run()
|
_00E_Func_CheckEnderalDLL.Run()
|
||||||
_00E_Func_CheckJContainers.Run()
|
|
||||||
|
|
||||||
If fPatchVersion == 0.00
|
If fPatchVersion == 0.00
|
||||||
fPatchVersion = CURRENT_PATCH_VERSION
|
fPatchVersion = CURRENT_PATCH_VERSION
|
||||||
@ -58,7 +57,6 @@ Event OnPlayerLoadGame()
|
|||||||
|
|
||||||
_00E_Func_CheckSKSE.Run()
|
_00E_Func_CheckSKSE.Run()
|
||||||
_00E_Func_CheckEnderalDLL.Run()
|
_00E_Func_CheckEnderalDLL.Run()
|
||||||
_00E_Func_CheckJContainers.Run()
|
|
||||||
|
|
||||||
Maintenance()
|
Maintenance()
|
||||||
If GetState() != "RealPlayer" ; Post-1.2.5.0 version update
|
If GetState() != "RealPlayer" ; Post-1.2.5.0 version update
|
||||||
|
@ -77,41 +77,64 @@ Int Property NoAlchemistPotionDurationLimitInSeconds = 90 Autoreadonly Hidden
|
|||||||
|
|
||||||
_00E_FS_NQ11_Functions Property FS_NQ11 Auto
|
_00E_FS_NQ11_Functions Property FS_NQ11 Auto
|
||||||
|
|
||||||
Int Property RenamedPotions Hidden
|
|
||||||
Int Function Get()
|
|
||||||
Int result = JMap.getObj(JDB.root(), "EnderalFS.RenamedPotions")
|
|
||||||
if (result == 0)
|
|
||||||
result = JFormMap.object()
|
|
||||||
JMap.setObj(JDB.root(), "EnderalFS.RenamedPotions", result)
|
|
||||||
EndIf
|
|
||||||
return result
|
|
||||||
EndFunction
|
|
||||||
EndProperty
|
|
||||||
|
|
||||||
Int Property ModelChangedPotions Hidden
|
|
||||||
Int Function Get()
|
|
||||||
Int result = JMap.getObj(JDB.root(), "EnderalFS.ModelChangedPotions")
|
|
||||||
If (result == 0)
|
|
||||||
result = JFormMap.object()
|
|
||||||
JMap.setObj(JDB.root(), "EnderalFS.ModelChangedPotions", result)
|
|
||||||
EndIf
|
|
||||||
return result
|
|
||||||
EndFunction
|
|
||||||
EndProperty
|
|
||||||
|
|
||||||
bool bDoneDarkBlood = false
|
bool bDoneDarkBlood = false
|
||||||
bool bDoneChymikum = false
|
bool bDoneChymikum = false
|
||||||
|
|
||||||
Int curScriptVersion = 0
|
Int curScriptVersion = 0
|
||||||
Int Property LATEST_SCRIPT_VERSION = 5 AutoReadOnly
|
Int Property LATEST_SCRIPT_VERSION = 5 AutoReadOnly
|
||||||
|
|
||||||
bool bHasJContainers = false
|
Potion[] aCreatedPotions
|
||||||
|
string[] aPotionNames
|
||||||
|
string[] aPotionModels
|
||||||
|
|
||||||
;=====================================================================================
|
;=====================================================================================
|
||||||
; FUNCTIONS
|
; FUNCTIONS
|
||||||
;=====================================================================================
|
;=====================================================================================
|
||||||
|
|
||||||
|
function _addNamedPotion(Potion aPotion, string sName, string sModel)
|
||||||
|
|
||||||
|
if ! aPotion || sName == ""
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
aPotion.SetName(sName)
|
||||||
|
if sModel != ""
|
||||||
|
aPotion.SetWorldModelPath(sModel)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if aCreatedPotions.length == 0
|
||||||
|
aCreatedPotions = new Potion[128]
|
||||||
|
aPotionNames = new string[128]
|
||||||
|
aPotionModels = new string[128]
|
||||||
|
endif
|
||||||
|
|
||||||
|
int i = aCreatedPotions.Find(aPotion)
|
||||||
|
|
||||||
|
if i == -1
|
||||||
|
i = aCreatedPotions.Find(none)
|
||||||
|
if i > -1
|
||||||
|
aCreatedPotions[i] = aPotion
|
||||||
|
aPotionNames[i] = sName
|
||||||
|
aPotionModels[i] = sModel
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
aPotionNames[i] = sName
|
||||||
|
aPotionModels[i] = sModel
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function _removeNamedPotion(Potion aPotion)
|
||||||
|
if aPotion
|
||||||
|
int i = aCreatedPotions.Find(aPotion)
|
||||||
|
if i > -1
|
||||||
|
aCreatedPotions[i] = None
|
||||||
|
aPotionNames[i] = ""
|
||||||
|
aPotionModels[i] = ""
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
Function _UpdatePotion(Potion item, Int count)
|
Function _UpdatePotion(Potion item, Int count)
|
||||||
|
|
||||||
Int i
|
Int i
|
||||||
@ -196,10 +219,11 @@ Function _UpdatePotion(Potion item, Int count)
|
|||||||
|
|
||||||
Potion newPotion = EnderalFunctions.CreatePotion(newEffects, newMagnitudes, newAreas, newDurations, nNewEffects)
|
Potion newPotion = EnderalFunctions.CreatePotion(newEffects, newMagnitudes, newAreas, newDurations, nNewEffects)
|
||||||
|
|
||||||
If bHasJContainers && JFormMap.hasKey(RenamedPotions, newPotion) == False
|
if aCreatedPotions.Find(newPotion) == -1
|
||||||
_RenamePotion(newPotion, newEffects, nNewEffects, bRemoveTheriantrophistEffects)
|
string newName = _RenamePotion(newPotion, newEffects, nNewEffects, bRemoveTheriantrophistEffects)
|
||||||
_SetPotionModel(newPotion, firstTheriantrophistEffect, newEffects[0])
|
string newModel = _SetPotionModel(newPotion, firstTheriantrophistEffect, newEffects[0])
|
||||||
EndIf
|
_addNamedPotion(newPotion, newName, newModel)
|
||||||
|
endif
|
||||||
|
|
||||||
GoToState("") ; skip OnItemAdded
|
GoToState("") ; skip OnItemAdded
|
||||||
PlayerREF.addItem(newPotion, count, abSilent = true)
|
PlayerREF.addItem(newPotion, count, abSilent = true)
|
||||||
@ -213,10 +237,11 @@ Function _UpdatePotion(Potion item, Int count)
|
|||||||
|
|
||||||
EndIf
|
EndIf
|
||||||
|
|
||||||
if bHasJContainers && JFormMap.hasKey(RenamedPotions, item) == False ; COMMON POTION
|
if aCreatedPotions.Find(item) == -1
|
||||||
_RenamePotion(item, potionEffects, nPotionEffects, True)
|
string newNameC = _RenamePotion(item, potionEffects, nPotionEffects, True)
|
||||||
_SetPotionModel(item, None, potionEffects[0])
|
string newModelC = _SetPotionModel(item, None, potionEffects[0])
|
||||||
EndIf
|
_addNamedPotion(item, newNameC, newModelC)
|
||||||
|
endif
|
||||||
|
|
||||||
if bIsTheriantrophistPotion
|
if bIsTheriantrophistPotion
|
||||||
_UpdateNQ11(item)
|
_UpdateNQ11(item)
|
||||||
@ -224,7 +249,7 @@ Function _UpdatePotion(Potion item, Int count)
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function _RenamePotion(Potion p, MagicEffect[] potionEffects, Int nPotionEffects, Bool bCommonPotion)
|
String Function _RenamePotion(Potion p, MagicEffect[] potionEffects, Int nPotionEffects, Bool bCommonPotion)
|
||||||
String name = ""
|
String name = ""
|
||||||
|
|
||||||
If bCommonPotion
|
If bCommonPotion
|
||||||
@ -246,11 +271,10 @@ Function _RenamePotion(Potion p, MagicEffect[] potionEffects, Int nPotionEffects
|
|||||||
i += 1
|
i += 1
|
||||||
EndWhile
|
EndWhile
|
||||||
|
|
||||||
JFormMap.setStr(RenamedPotions, p, name)
|
return name
|
||||||
p.setName(name)
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function _SetPotionModel(Potion p, MagicEffect firstTheriantrophistEffect, MagicEffect firstEffect)
|
String Function _SetPotionModel(Potion p, MagicEffect firstTheriantrophistEffect, MagicEffect firstEffect)
|
||||||
string modelName
|
string modelName
|
||||||
string modelPath = ""
|
string modelPath = ""
|
||||||
|
|
||||||
@ -321,10 +345,7 @@ Function _SetPotionModel(Potion p, MagicEffect firstTheriantrophistEffect, Magic
|
|||||||
|
|
||||||
EndIf
|
EndIf
|
||||||
|
|
||||||
If modelPath != ""
|
return modelPath
|
||||||
p.SetWorldModelPath(modelPath)
|
|
||||||
JFormMap.setStr(ModelChangedPotions, p, modelPath)
|
|
||||||
EndIf
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function _UpdateNQ11(Potion newPotion)
|
Function _UpdateNQ11(Potion newPotion)
|
||||||
@ -366,23 +387,6 @@ Function _InitAchemyControl()
|
|||||||
|
|
||||||
GoToState("")
|
GoToState("")
|
||||||
|
|
||||||
int iSKSEVer = SKSE.GetVersion()
|
|
||||||
|
|
||||||
if iSKSEVer < 2
|
|
||||||
bHasJContainers = false
|
|
||||||
Debug.Trace("SKSE is not loaded, _00E_Theriantrophist_AlchemyControl is disabled")
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
bHasJContainers = ( (SKSE.GetPluginVersion("JContainers64") != -1) || (SKSE.GetPluginVersion("JContainersVR") != -1) ) && JContainers.isInstalled()
|
|
||||||
|
|
||||||
if ! bHasJContainers && ! EnderalFunctions.IsDLLLoaded()
|
|
||||||
; Both required components are missing, do not update version and disable everything
|
|
||||||
UnregisterForAllMenus()
|
|
||||||
Debug.Trace("JContainers and fs.dll are not loaded, _00E_Theriantrophist_AlchemyControl is disabled.")
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
; Version update
|
; Version update
|
||||||
If curScriptVersion < LATEST_SCRIPT_VERSION
|
If curScriptVersion < LATEST_SCRIPT_VERSION
|
||||||
Int oldScriptVersion = curScriptVersion
|
Int oldScriptVersion = curScriptVersion
|
||||||
@ -392,47 +396,15 @@ Function _InitAchemyControl()
|
|||||||
RemoveAllInventoryEventFilters()
|
RemoveAllInventoryEventFilters()
|
||||||
UnregisterForAllMenus()
|
UnregisterForAllMenus()
|
||||||
UnregisterForUpdate()
|
UnregisterForUpdate()
|
||||||
|
_00E_Theriantrophist_Update_12.Run(self)
|
||||||
EndIf
|
EndIf
|
||||||
EndIf
|
EndIf
|
||||||
|
|
||||||
if ! bHasJContainers
|
|
||||||
Debug.Trace("JContainers is not loaded, renaming and changing potion models is disabled")
|
|
||||||
endif
|
|
||||||
|
|
||||||
; Re-register menu listener to stay resilient to co-save deletion or corruption
|
; Re-register menu listener to stay resilient to co-save deletion or corruption
|
||||||
RegisterForMenu("Crafting Menu")
|
RegisterForMenu("Crafting Menu")
|
||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function _OnGameLoadJContainers()
|
|
||||||
|
|
||||||
Potion k
|
|
||||||
Potion previousKey
|
|
||||||
|
|
||||||
Int potionNames = RenamedPotions
|
|
||||||
k = JFormMap.nextKey(potionNames, previousKey = None, endKey = None) as Potion
|
|
||||||
while k != None
|
|
||||||
; Forget items that are no longer in the inventory
|
|
||||||
if PlayerREF.GetItemCount(k) == 0 && _00E_SecureChest_HostChestREF.GetItemCount(k) == 0
|
|
||||||
JFormMap.removeKey(RenamedPotions, k)
|
|
||||||
JFormMap.removeKey(ModelChangedPotions, k)
|
|
||||||
k = JFormMap.nextKey(potionNames, previousKey, endKey = None) as Potion
|
|
||||||
else
|
|
||||||
previousKey = k
|
|
||||||
k.setName(JFormMap.getStr(potionNames, k))
|
|
||||||
k = JFormMap.nextKey(potionNames, k, endKey = None) as Potion
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
Int potionModels = ModelChangedPotions
|
|
||||||
k = JFormMap.nextKey(potionModels, previousKey = None, endKey = None) as Potion
|
|
||||||
while k != None
|
|
||||||
k.SetWorldModelPath(JFormMap.getStr(potionModels, k))
|
|
||||||
k = JFormMap.nextKey(potionModels, k, endKey = None) as Potion
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
EndFunction
|
|
||||||
|
|
||||||
|
|
||||||
;=====================================================================================
|
;=====================================================================================
|
||||||
; EVENTS
|
; EVENTS
|
||||||
@ -448,10 +420,14 @@ EndEvent
|
|||||||
|
|
||||||
State InCrafting
|
State InCrafting
|
||||||
Event OnItemAdded(Form baseItem, int count, ObjectReference itemRef, ObjectReference source)
|
Event OnItemAdded(Form baseItem, int count, ObjectReference itemRef, ObjectReference source)
|
||||||
|
if ! UI.IsMenuOpen("Crafting Menu")
|
||||||
|
GoToState("")
|
||||||
|
return
|
||||||
|
endif
|
||||||
Potion item = baseItem as Potion
|
Potion item = baseItem as Potion
|
||||||
If item
|
If item
|
||||||
; Ignore not-custom potions (with FormID not starting with 0xFF) or already registered potions
|
; Ignore not-custom potions (with FormID not starting with 0xFF) or already registered potions
|
||||||
If (Math.LogicalAnd(item.GetFormID(), 0xFF000000) == 0xFF000000) && (!bHasJContainers || JFormMap.hasKey(RenamedPotions, item) == False)
|
If (Math.LogicalAnd(item.GetFormID(), 0xFF000000) == 0xFF000000) && aCreatedPotions.Find(item) == -1
|
||||||
_UpdatePotion(item, count)
|
_UpdatePotion(item, count)
|
||||||
EndIf
|
EndIf
|
||||||
EndIf
|
EndIf
|
||||||
@ -465,7 +441,23 @@ EndEvent
|
|||||||
|
|
||||||
Event OnPlayerLoadGame()
|
Event OnPlayerLoadGame()
|
||||||
_InitAchemyControl()
|
_InitAchemyControl()
|
||||||
if bHasJContainers
|
|
||||||
_OnGameLoadJContainers()
|
if aCreatedPotions.length == 0
|
||||||
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
int i = 0
|
||||||
|
while i < 128
|
||||||
|
if aCreatedPotions[i]
|
||||||
|
if PlayerREF.GetItemCount(aCreatedPotions[i]) == 0 && _00E_SecureChest_HostChestREF.GetItemCount(aCreatedPotions[i]) == 0
|
||||||
|
_removeNamedPotion(aCreatedPotions[i])
|
||||||
|
else
|
||||||
|
aCreatedPotions[i].SetName(aPotionNames[i])
|
||||||
|
if aPotionModels[i] != ""
|
||||||
|
aCreatedPotions[i].SetWorldModelPath(aPotionModels[i])
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
i += 1
|
||||||
|
endwhile
|
||||||
EndEvent
|
EndEvent
|
||||||
|
19
source/scripts/_00e_theriantrophist_update_12.psc
Normal file
19
source/scripts/_00e_theriantrophist_update_12.psc
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
scriptname _00E_Theriantrophist_Update_12 Hidden
|
||||||
|
|
||||||
|
function Run(_00E_Theriantrophist_AlchemyControl PlayerAlias) global
|
||||||
|
|
||||||
|
Potion k
|
||||||
|
int potionNames = JMap.getObj(JDB.root(), "EnderalFS.RenamedPotions")
|
||||||
|
int potionModels = JMap.getObj(JDB.root(), "EnderalFS.ModelChangedPotions")
|
||||||
|
|
||||||
|
if potionNames > 0
|
||||||
|
k = JFormMap.nextKey(potionNames, previousKey = None, endKey = None) as Potion
|
||||||
|
while k != None
|
||||||
|
PlayerAlias._addNamedPotion(k, JFormMap.getStr(potionNames, k), JFormMap.getStr(potionModels, k))
|
||||||
|
k = JFormMap.nextKey(potionNames, k, endKey = None) as Potion
|
||||||
|
endwhile
|
||||||
|
JFormMap.clear(potionNames)
|
||||||
|
JFormMap.clear(potionModels)
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
@ -9,5 +9,6 @@ ObjectReference function GetCurrentContainer() native global
|
|||||||
int function GetNewGameCount() native global
|
int function GetNewGameCount() native global
|
||||||
|
|
||||||
bool function IsDLLLoaded() global
|
bool function IsDLLLoaded() global
|
||||||
return (SKSE.GetPluginVersion("EnderalSE") != -1)
|
int iVer = SKSE.GetPluginVersion("EnderalSE")
|
||||||
|
return iVer > 0
|
||||||
endfunction
|
endfunction
|
||||||
|
Loading…
Reference in New Issue
Block a user