1

Delayed processing of items moved to a container (WIP)

This commit is contained in:
Eddoursul 2022-06-18 13:17:10 +02:00
parent fcc0924c1f
commit 7330fca50a
3 changed files with 91 additions and 60 deletions

Binary file not shown.

Binary file not shown.

View File

@ -7,6 +7,7 @@ FormList Property ETR_ItemsFound Auto
FormList Property ETR_ItemsStored Auto FormList Property ETR_ItemsStored Auto
FormList Property ETR_PersistentStorageList Auto FormList Property ETR_PersistentStorageList Auto
FormList Property ETR_ExcludeFromNew Auto FormList Property ETR_ExcludeFromNew Auto
FormList Property ETR_ExcludeFromCellItems Auto
Container Property ETR_CellStorageContainer Auto Container Property ETR_CellStorageContainer Auto
@ -14,6 +15,9 @@ Keyword Property LocTypePlayerHouse Auto
bool bAtHome = false bool bAtHome = false
int iFollowerIndex = 0 int iFollowerIndex = 0
bool bUpdateFollowers = false
bool bSyncStorage = false
bool bUpdateLists = false
event OnInit() event OnInit()
@ -27,34 +31,81 @@ EndEvent
Event OnLocationChange(Location akOldLoc, Location akNewLoc) Event OnLocationChange(Location akOldLoc, Location akNewLoc)
bAtHome = akNewLoc && akNewLoc.HasKeyword(LocTypePlayerHouse) bAtHome = akNewLoc && akNewLoc.HasKeyword(LocTypePlayerHouse)
RegisterForSingleUpdate(3.0) ; wait until followers load into the location
endEvent
Event OnUpdate()
;Debug.Notification("Follower index: " + iFollowerIndex)
int iCurrentFollowers = 0; int iCurrentFollowers = 0;
Actor[] aFollowers = Eddoursul_Functions.GetPlayerFollowers() Actor[] aFollowers = Eddoursul_Functions.GetPlayerFollowers()
int i = aFollowers.length int i = aFollowers.length
while i > 0 while i > 0
i -= 1 i -= 1
if ! aFollowers[i].IsDead() && ! aFollowers[i].IsDisabled()
iCurrentFollowers += aFollowers[i].GetFormID() iCurrentFollowers += aFollowers[i].GetFormID()
;Debug.Notification("Follower ID: " + aFollowers[i].GetFormID())
endif
endwhile endwhile
;Debug.Notification("New follower index: " + iCurrentFollowers) if iCurrentFollowers != iFollowerIndex
; If the list of followers has changed, rebuild ETR_ItemsFound and ETR_ItemsNew
iFollowerIndex = iCurrentFollowers
bUpdateFollowers = true
RegisterForSingleUpdate(3.0) ; wait until followers load into the location
endif
if iCurrentFollowers == iFollowerIndex endEvent
Event OnUpdate()
Actor[] aFollowers
int i
if bUpdateLists
if Utility.IsInMenuMode()
RegisterForSingleUpdate(1.0)
return return
endif endif
; If the list of followers has changed, rebuild ETR_ItemsFound and ETR_ItemsNew bUpdateLists = false
iFollowerIndex = iCurrentFollowers bUpdateFollowers = false
if bSyncStorage
bSyncStorage = false
ObjectReference cellStorage = Eddoursul_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer)
Eddoursul_Functions.SyncCellStorage(cellStorage, ETR_ExcludeFromCellItems)
endif
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(ETR_PersistentStorageList, ETR_ItemsStored, 26, None, ETR_ExcludeFromCellItems)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(ETR_PersistentStorageList, ETR_ItemsStored, 41, None, ETR_ExcludeFromCellItems)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(ETR_PersistentStorageList, ETR_ItemsStored, 27, None, ETR_ExcludeFromCellItems)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(ETR_PersistentStorageList, ETR_ItemsStored, 32, None, ETR_ExcludeFromCellItems)
ETR_ItemsFound.Revert()
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(PlayerRef, ETR_ItemsFound, 26, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(PlayerRef, ETR_ItemsFound, 41, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(PlayerRef, ETR_ItemsFound, 27, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(PlayerRef, ETR_ItemsFound, 32, None, ETR_ExcludeFromNew, false, false, false)
aFollowers = Eddoursul_Functions.GetPlayerFollowers()
i = aFollowers.length
while i > 0
i -= 1
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 26, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 41, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 27, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 32, None, ETR_ExcludeFromNew, false, false, false)
endwhile
ETR_ItemsNew.Revert()
Eddoursul_Functions.AddAllFormsToList(ETR_ItemsNew, 26, None, ETR_ExcludeFromNew) ; armor
Eddoursul_Functions.AddAllFormsToList(ETR_ItemsNew, 41, None, ETR_ExcludeFromNew) ; weapons
Eddoursul_Functions.AddAllFormsToList(ETR_ItemsNew, 27, None, ETR_ExcludeFromNew) ; books
Eddoursul_Functions.AddAllFormsToList(ETR_ItemsNew, 32, None, ETR_ExcludeFromNew) ; misc items
return
endif
if bUpdateFollowers
bUpdateFollowers = false
Debug.Notification("Team changed, updating lists") Debug.Notification("Team changed, updating lists")
@ -64,15 +115,14 @@ Event OnUpdate()
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(PlayerRef, ETR_ItemsFound, 27, None, ETR_ExcludeFromNew, false, false, false) Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(PlayerRef, ETR_ItemsFound, 27, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(PlayerRef, ETR_ItemsFound, 32, None, ETR_ExcludeFromNew, false, false, false) Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(PlayerRef, ETR_ItemsFound, 32, None, ETR_ExcludeFromNew, false, false, false)
aFollowers = Eddoursul_Functions.GetPlayerFollowers()
i = aFollowers.length i = aFollowers.length
while i > 0 while i > 0
i -= 1 i -= 1
if ! aFollowers[i].IsDead() && ! aFollowers[i].IsDisabled()
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 26, None, ETR_ExcludeFromNew, false, false, false) Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 26, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 41, None, ETR_ExcludeFromNew, false, false, false) Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 41, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 27, None, ETR_ExcludeFromNew, false, false, false) Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 27, None, ETR_ExcludeFromNew, false, false, false)
Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 32, None, ETR_ExcludeFromNew, false, false, false) Eddoursul_Functions.AddItemsOfTypeAndKeywordToList(aFollowers[i], ETR_ItemsFound, 32, None, ETR_ExcludeFromNew, false, false, false)
endif
endwhile endwhile
ETR_ItemsNew.Revert() ETR_ItemsNew.Revert()
@ -81,43 +131,24 @@ Event OnUpdate()
Eddoursul_Functions.AddAllFormsToList(ETR_ItemsNew, 27, None, ETR_ExcludeFromNew) ; books Eddoursul_Functions.AddAllFormsToList(ETR_ItemsNew, 27, None, ETR_ExcludeFromNew) ; books
Eddoursul_Functions.AddAllFormsToList(ETR_ItemsNew, 32, None, ETR_ExcludeFromNew) ; misc items Eddoursul_Functions.AddAllFormsToList(ETR_ItemsNew, 32, None, ETR_ExcludeFromNew) ; misc items
endif
EndEvent EndEvent
event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
if akDestContainer if akDestContainer
if akDestContainer as Actor bSyncStorage = bAtHome
if (akDestContainer as Actor).IsPlayerTeammate() bUpdateLists = true
; Keep follower items marked as found RegisterForSingleUpdate(1.0)
return elseif bAtHome && akItemReference
endif
elseif ETR_PersistentStorageList.HasForm(akDestContainer)
ETR_ItemsFound.RemoveAddedForm(akBaseItem) ETR_ItemsFound.RemoveAddedForm(akBaseItem)
ETR_ItemsStored.AddForm(akBaseItem) ETR_ItemsStored.AddForm(akBaseItem)
return Eddoursul_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer).AddItem(akBaseItem, 1, true)
elseif bAtHome && akDestContainer.GetParentCell() != PlayerRef.GetParentCell()
return
endif
endif
if bAtHome && (akDestContainer || Eddoursul_Functions.HasRefInCell(akBaseItem, None, true, ETR_PersistentStorageList))
ETR_ItemsFound.RemoveAddedForm(akBaseItem)
ETR_ItemsStored.AddForm(akBaseItem)
ObjectReference cellStorage = Eddoursul_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer)
if cellStorage.GetItemCount(akBaseItem) == 0
cellStorage.AddItem(akBaseItem, 1, true)
endif
elseif PlayerRef.GetItemCount(akBaseItem) == 0 && Eddoursul_Functions.GetItemCountInActors(Eddoursul_Functions.GetPlayerFollowers(), akBaseItem) == 0 elseif PlayerRef.GetItemCount(akBaseItem) == 0 && Eddoursul_Functions.GetItemCountInActors(Eddoursul_Functions.GetPlayerFollowers(), akBaseItem) == 0
ETR_ItemsFound.RemoveAddedForm(akBaseItem) ETR_ItemsFound.RemoveAddedForm(akBaseItem)
ETR_ItemsStored.RemoveAddedForm(akBaseItem)
ETR_ItemsNew.AddForm(akBaseItem) ETR_ItemsNew.AddForm(akBaseItem)
endif endif
endevent endevent