Refactored _00E_Theriantrophist_AlchemyControl to use vanilla arrays, removed JContainers requirement

This commit is contained in:
Eddoursul 2022-08-01 19:48:43 +02:00
parent 3923bfcfe5
commit 0c8c29a779
10 changed files with 107 additions and 110 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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

View 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

View File

@ -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