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_CheckEnderalDLL.Run()
|
||||
_00E_Func_CheckJContainers.Run()
|
||||
|
||||
If fPatchVersion == 0.00
|
||||
fPatchVersion = CURRENT_PATCH_VERSION
|
||||
@ -58,7 +57,6 @@ Event OnPlayerLoadGame()
|
||||
|
||||
_00E_Func_CheckSKSE.Run()
|
||||
_00E_Func_CheckEnderalDLL.Run()
|
||||
_00E_Func_CheckJContainers.Run()
|
||||
|
||||
Maintenance()
|
||||
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
|
||||
|
||||
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 bDoneChymikum = false
|
||||
|
||||
Int curScriptVersion = 0
|
||||
Int Property LATEST_SCRIPT_VERSION = 5 AutoReadOnly
|
||||
|
||||
bool bHasJContainers = false
|
||||
|
||||
Potion[] aCreatedPotions
|
||||
string[] aPotionNames
|
||||
string[] aPotionModels
|
||||
|
||||
;=====================================================================================
|
||||
; 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)
|
||||
|
||||
Int i
|
||||
@ -196,10 +219,11 @@ Function _UpdatePotion(Potion item, Int count)
|
||||
|
||||
Potion newPotion = EnderalFunctions.CreatePotion(newEffects, newMagnitudes, newAreas, newDurations, nNewEffects)
|
||||
|
||||
If bHasJContainers && JFormMap.hasKey(RenamedPotions, newPotion) == False
|
||||
_RenamePotion(newPotion, newEffects, nNewEffects, bRemoveTheriantrophistEffects)
|
||||
_SetPotionModel(newPotion, firstTheriantrophistEffect, newEffects[0])
|
||||
EndIf
|
||||
if aCreatedPotions.Find(newPotion) == -1
|
||||
string newName = _RenamePotion(newPotion, newEffects, nNewEffects, bRemoveTheriantrophistEffects)
|
||||
string newModel = _SetPotionModel(newPotion, firstTheriantrophistEffect, newEffects[0])
|
||||
_addNamedPotion(newPotion, newName, newModel)
|
||||
endif
|
||||
|
||||
GoToState("") ; skip OnItemAdded
|
||||
PlayerREF.addItem(newPotion, count, abSilent = true)
|
||||
@ -213,10 +237,11 @@ Function _UpdatePotion(Potion item, Int count)
|
||||
|
||||
EndIf
|
||||
|
||||
if bHasJContainers && JFormMap.hasKey(RenamedPotions, item) == False ; COMMON POTION
|
||||
_RenamePotion(item, potionEffects, nPotionEffects, True)
|
||||
_SetPotionModel(item, None, potionEffects[0])
|
||||
EndIf
|
||||
if aCreatedPotions.Find(item) == -1
|
||||
string newNameC = _RenamePotion(item, potionEffects, nPotionEffects, True)
|
||||
string newModelC = _SetPotionModel(item, None, potionEffects[0])
|
||||
_addNamedPotion(item, newNameC, newModelC)
|
||||
endif
|
||||
|
||||
if bIsTheriantrophistPotion
|
||||
_UpdateNQ11(item)
|
||||
@ -224,7 +249,7 @@ Function _UpdatePotion(Potion item, Int count)
|
||||
|
||||
EndFunction
|
||||
|
||||
Function _RenamePotion(Potion p, MagicEffect[] potionEffects, Int nPotionEffects, Bool bCommonPotion)
|
||||
String Function _RenamePotion(Potion p, MagicEffect[] potionEffects, Int nPotionEffects, Bool bCommonPotion)
|
||||
String name = ""
|
||||
|
||||
If bCommonPotion
|
||||
@ -246,11 +271,10 @@ Function _RenamePotion(Potion p, MagicEffect[] potionEffects, Int nPotionEffects
|
||||
i += 1
|
||||
EndWhile
|
||||
|
||||
JFormMap.setStr(RenamedPotions, p, name)
|
||||
p.setName(name)
|
||||
return name
|
||||
EndFunction
|
||||
|
||||
Function _SetPotionModel(Potion p, MagicEffect firstTheriantrophistEffect, MagicEffect firstEffect)
|
||||
String Function _SetPotionModel(Potion p, MagicEffect firstTheriantrophistEffect, MagicEffect firstEffect)
|
||||
string modelName
|
||||
string modelPath = ""
|
||||
|
||||
@ -321,10 +345,7 @@ Function _SetPotionModel(Potion p, MagicEffect firstTheriantrophistEffect, Magic
|
||||
|
||||
EndIf
|
||||
|
||||
If modelPath != ""
|
||||
p.SetWorldModelPath(modelPath)
|
||||
JFormMap.setStr(ModelChangedPotions, p, modelPath)
|
||||
EndIf
|
||||
return modelPath
|
||||
EndFunction
|
||||
|
||||
Function _UpdateNQ11(Potion newPotion)
|
||||
@ -366,23 +387,6 @@ Function _InitAchemyControl()
|
||||
|
||||
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
|
||||
If curScriptVersion < LATEST_SCRIPT_VERSION
|
||||
Int oldScriptVersion = curScriptVersion
|
||||
@ -392,47 +396,15 @@ Function _InitAchemyControl()
|
||||
RemoveAllInventoryEventFilters()
|
||||
UnregisterForAllMenus()
|
||||
UnregisterForUpdate()
|
||||
_00E_Theriantrophist_Update_12.Run(self)
|
||||
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
|
||||
RegisterForMenu("Crafting Menu")
|
||||
|
||||
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
|
||||
@ -448,10 +420,14 @@ EndEvent
|
||||
|
||||
State InCrafting
|
||||
Event OnItemAdded(Form baseItem, int count, ObjectReference itemRef, ObjectReference source)
|
||||
if ! UI.IsMenuOpen("Crafting Menu")
|
||||
GoToState("")
|
||||
return
|
||||
endif
|
||||
Potion item = baseItem as Potion
|
||||
If item
|
||||
; 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)
|
||||
EndIf
|
||||
EndIf
|
||||
@ -465,7 +441,23 @@ EndEvent
|
||||
|
||||
Event OnPlayerLoadGame()
|
||||
_InitAchemyControl()
|
||||
if bHasJContainers
|
||||
_OnGameLoadJContainers()
|
||||
|
||||
if aCreatedPotions.length == 0
|
||||
return
|
||||
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
|
||||
|
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
|
||||
|
||||
bool function IsDLLLoaded() global
|
||||
return (SKSE.GetPluginVersion("EnderalSE") != -1)
|
||||
int iVer = SKSE.GetPluginVersion("EnderalSE")
|
||||
return iVer > 0
|
||||
endfunction
|
||||
|
Loading…
Reference in New Issue
Block a user