From 6db4016f9bf650435dc5884cf1fd93617f501269 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Wed, 22 Jun 2022 15:20:07 +0200 Subject: [PATCH] Added support for bookshelves --- Artifact Tracker.esp | Bin 6643 -> 6715 bytes SKSE/Plugins/ArtifactTrackerFunctions.dll | Bin 413696 -> 413696 bytes Scripts/ETR_TrackFoundItems.pex | Bin 4463 -> 5013 bytes Scripts/ETR_TrackStoredItems.pex | Bin 4396 -> 5035 bytes .../src/Functions/ArtifactTracker.h | 2 +- Source/Scripts/ETR_TrackFoundItems.psc | 16 + Source/Scripts/ETR_TrackStoredItems.psc | 20 + .../PlayerBookShelfContainerScript.psc | 621 ++++++++++++++++++ 8 files changed, 658 insertions(+), 1 deletion(-) create mode 100644 Source/Scripts/PlayerBookShelfContainerScript.psc diff --git a/Artifact Tracker.esp b/Artifact Tracker.esp index 52c78497eb1eff37b40ec16640dfefdbeb8bb85f..a2669f059180aaa9f2b5e00f4d565b4d1ffb14d4 100644 GIT binary patch delta 249 zcmextyxU}g8dDDMMvbXlyq+bgx#5{58NvCbDZ!ghaq%&s3Qa!6Wx834*MJd=a1UPt zE0Z?MWIhow#@~}wMf4c|P7V=qpDZXUHTkHh!{p5(a+5!aNlexjRbk>_n7me0VsfBp z3{WamS%M)TC$TcM$SFTRJ2)dXC(SuOuOu-uFSUq~k%8g=|K}%pCrgT{iE%J+LRAK( dra`1c7#Jo8h{l3#0Gh5sgi#Eexx`;G0RSMXRBHeL delta 228 zcmdmO^4WNT8WT6iMvbXlyqP7bx#gK98O8afDaD&laq%&s3Qa!6Wx834*MJd=a1UPt zE7N1<$$TPWjGHH`is&(Jog5cSLRyHyH6$qBEx$A`#W61>xFo+QHHDFpf#Lsu z#>wx*G^F{#@}5B3i;*Q+IT)BH?-7%ltSzd-$UeDJEOxT6sKn%JVh)p8#Y89DiK#+F fML8J)auO?3i-JYdS%pj6Rf`T9u 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 diff --git a/Scripts/ETR_TrackFoundItems.pex b/Scripts/ETR_TrackFoundItems.pex index a98ec13accc507f9cdbaa0fa3f10a5ab9c13356e..f272f6d5613a474fec39ab838298d88a78f7a695 100644 GIT binary patch literal 5013 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 YWAOiBo413X*m=v)?~^t^iiI}uf5=dnHvj+t literal 4463 zcmc&$>rx!Y75;kJWtTe(h>H+n$<0n;%YcMHo7gfSE(?g2xyTpUk%!#|28J1!nPu5T ziF0+8lT?yN$TQ>#Qu&#O$Rp%;%2g@l>+YG^l`Q?vo?_;l)2Gj^zth9lAO8JcZ7B%w zcks7={{tf{dpl3}e5-Q0>ebw8DU@fyt@EIQ&XsD_tNB6ADWF%z{H?m}7Vr#%uh>SH zxiuN?hE^!ivF3%IVcW}Y$+biDm)%E>)sX&{XI0m%GpRINUd0M+&s{#Y+#`vuvinfF zwPnW(ByweU|GcWa_0R<~+mUD9rL3Z>;<;5@ZL=J-AKTTcbkVyb52Y{Nid=MTE5Nm4 zQ6;G>+6_HlR-ay4K5~bif9BXhh=CS^ZCTf=-L{Fi%w~jWEAf$ctRQ?KgK*h%L(6uh zkG}H3iL8W4Kn%q;rQnhD1A3R-nO^cd2l;~?8B{E{WuYrlt$S=j_Fys8%xJO5ZtOMA zrD@Z;R|}-hDtjs$b7*$KJ3W46_Ty%=)PGlYf z2EN$@^d%PNB+-#%gZACfx7{PWv08I03KNC!*a{223~Rm{P>_X6%_lIzLZG3UEfx(h z)7zd)q!x?n{g~KD2hur2r**ny1yTVAX@wSaS+lSaKk)4|Bvb%+s%+b&J)mPM>w9d}d&C|Era4W6t z8eqE?ea7Sf1bd#EJY@I0Mc=m?Xy1{S(ho7&YP9NmXUPFYJ94UqZFL6@?z?`owCJ?& zy@=(YZikg)sld#NJbn2TLQi8mIF}VRKvpAk=UiDg@b2{76}M{mZqHp}6xT@6NlznU zc)U(@563EE(!k+1`l9iPuWF1a#JHE7D9>-KsQ0Sv5VIIi&@!`@7gEO zXUOrhC6H1dM8&klOj=1}T9*O3aFaAiDkL<8DZShdOyG@#-o%^u0e(n&i}W_>7U`XY zW})ad?qCjgNh(ej%-~(Trv+wo9}h??SS6LPflbmj9+5uKw2Qr0&_4F@nDh}oj_4CS zA$=Or=df@I*?w{y39G`vYL9fz+Y{c{B3wo`gRR8bre$Oybc z$>iP9v`J$cGsIe+Xd5Kn2GPzVy++LCG0&9+^2*0OuFMS!+)*AT`vm3$1}O4C$f=b% zwbI^W)V%`pTxH;*z_`GIS`<`reTd?ambpta8EQu|;Bz>mlKoLLS&_cao!Tl-^HH_W zm1quZ3qr!duQjSFK8#5L*(;B6g(n$op6Mid_oKo-@ z{hWUtxL`g$^9d00zk@vgJIJF>{)+Dg$6GaPf{rc(&KdZkCGdG9MuBN@VFF*!-j4$N zR9)&K%sKs3Ac$+KlPA7v0(Dwlkt4q7=1LpH(Q-UenrNlMm$D2?&?5&n8KGa8Nd4G9P^EXLW4L2TBr3ZV^zge3uqF($2@Wj%><0ap&tS^S1uc|Ylst2bwf(nWg)vDL9Ns?a{~-cfF2 zyygW8g?abhMpdFwEzriQRaHfPES&bZy3;5ZRNdR8y1nALRYzjkHRRVE`nu>^P%Fw; zZbgmN96P{3%?`qwDhOwSyUGuoAXILM>{T_(xZ0Bykj=+ctrnRQq}tva7c@~Lw|t`!Y-6Aa_9RPM)&6}=+BvnQb?s5< z^r?35$`!-^?F7)3xa#<(oA*MBzOU8+Z6+@3jQtX5&l;d3*@I}2o%39U(aDBekwz

1@2z*k|zcV&N7sx*AIJ3;B~xSnIPaZUmWb3SG+ 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 TTK9o20~bw6tEWwSMbG~NGtV81 diff --git a/Source/ArtifactTrackerDLL/src/Functions/ArtifactTracker.h b/Source/ArtifactTrackerDLL/src/Functions/ArtifactTracker.h index 27fd2fb..856c028 100644 --- a/Source/ArtifactTrackerDLL/src/Functions/ArtifactTracker.h +++ b/Source/ArtifactTrackerDLL/src/Functions/ArtifactTracker.h @@ -214,7 +214,7 @@ namespace Papyrus::ArtifactTracker const auto baseObj = a_ref->GetBaseObject(); if (baseObj->formType == RE::FormType::Container || (baseObj->formType == RE::FormType::NPC && !a_ref->IsDisabled() && baseObj->As()->GetRace()->formID == 0x0010760A)) { - if (a_excludeContainers->HasForm(a_ref->formID)) { + if (a_excludeContainers->HasForm(a_ref->formID) || baseObj->formID == 0xDC9E7) { // skip persistent and PlayerBookShelfContainer continue; } diff --git a/Source/Scripts/ETR_TrackFoundItems.psc b/Source/Scripts/ETR_TrackFoundItems.psc index d7bd417..0a43371 100644 --- a/Source/Scripts/ETR_TrackFoundItems.psc +++ b/Source/Scripts/ETR_TrackFoundItems.psc @@ -8,6 +8,7 @@ FormList Property ETR_ItemsStored Auto FormList Property ETR_PersistentStorageList Auto Container Property ETR_CellStorageContainer Auto +Container Property PlayerBookShelfContainer Auto Keyword Property LocTypePlayerHouse Auto @@ -86,6 +87,21 @@ Event OnUpdate() return endif bRescanHome = false + + ObjectReference bookShelf + if lastDestContainer && lastDestContainer.GetBaseObject() == PlayerBookShelfContainer + bookShelf = lastDestContainer + endif + + if bookShelf && bookShelf as PlayerBookShelfContainerScript + int iLimit = 10 + while iLimit >= 0 && (bookShelf as PlayerBookShelfContainerScript).GetState() == "PlacingBooks" + Debug.Notification("Waiting for shelf update") + iLimit -= 1 + Utility.wait(0.5) + endwhile + endif + ObjectReference cellStorage = ETR_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer) ETR_Functions.SyncCellStorage(cellStorage, ETR_PersistentStorageList) if ! bRescanPersistent diff --git a/Source/Scripts/ETR_TrackStoredItems.psc b/Source/Scripts/ETR_TrackStoredItems.psc index 7ee7ab5..2f57c9c 100644 --- a/Source/Scripts/ETR_TrackStoredItems.psc +++ b/Source/Scripts/ETR_TrackStoredItems.psc @@ -8,6 +8,7 @@ FormList Property ETR_ItemsStored Auto FormList Property ETR_PersistentStorageList Auto Container Property ETR_CellStorageContainer Auto +Container Property PlayerBookShelfContainer Auto Keyword Property LocTypePlayerHouse Auto @@ -77,11 +78,30 @@ Event OnUpdate() lastSourceContainer = None return endif + bRescanHome = false + + ObjectReference bookShelf + if lastDestContainer && lastDestContainer.GetBaseObject() == PlayerBookShelfContainer + bookShelf = lastDestContainer + elseif lastSourceContainer && lastSourceContainer.GetBaseObject() == PlayerBookShelfContainer + bookShelf = lastSourceContainer + endif + + if bookShelf && bookShelf as PlayerBookShelfContainerScript + int iLimit = 10 + while iLimit >= 0 && (bookShelf as PlayerBookShelfContainerScript).GetState() == "PlacingBooks" + Debug.Notification("Waiting for shelf update") + iLimit -= 1 + Utility.wait(0.5) + endwhile + endif + ObjectReference cellStorage = ETR_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer) ETR_Functions.SyncCellStorage(cellStorage, ETR_PersistentStorageList) endif if bRescanPersistent + bRescanPersistent = false ETR_ItemsStored.Revert() Form[] aContainers = ETR_PersistentStorageList.ToArray() diff --git a/Source/Scripts/PlayerBookShelfContainerScript.psc b/Source/Scripts/PlayerBookShelfContainerScript.psc new file mode 100644 index 0000000..a8beb03 --- /dev/null +++ b/Source/Scripts/PlayerBookShelfContainerScript.psc @@ -0,0 +1,621 @@ +Scriptname PlayerBookShelfContainerScript extends ObjectReference + +import debug +import utility + +Form Property LItemBookClutter Auto +{Clutter item list to fill the shelf with} + +Keyword Property BookShelfBook01 Auto +Keyword Property BookShelfBook02 Auto +Keyword Property BookShelfBook03 Auto +Keyword Property BookShelfBook04 Auto +Keyword Property BookShelfBook05 Auto +Keyword Property BookShelfBook06 Auto +Keyword Property BookShelfBook07 Auto +Keyword Property BookShelfBook08 Auto +Keyword Property BookShelfBook09 Auto +Keyword Property BookShelfBook10 Auto +Keyword Property BookShelfBook11 Auto +Keyword Property BookShelfBook12 Auto +Keyword Property BookShelfBook13 Auto +Keyword Property BookShelfBook14 Auto +Keyword Property BookShelfBook15 Auto +Keyword Property BookShelfBook16 Auto +Keyword Property BookShelfBook17 Auto +Keyword Property BookShelfBook18 Auto +Keyword Property BookShelfTrigger01 Auto +Keyword Property BookShelfTrigger02 Auto +Keyword Property BookShelfTrigger03 Auto +Keyword Property BookShelfTrigger04 Auto +{List of required Keywords} + +ObjectReference Property BookMarker01 Auto Hidden +ObjectReference Property BookMarker02 Auto Hidden +ObjectReference Property BookMarker03 Auto Hidden +ObjectReference Property BookMarker04 Auto Hidden +ObjectReference Property BookMarker05 Auto Hidden +ObjectReference Property BookMarker06 Auto Hidden +ObjectReference Property BookMarker07 Auto Hidden +ObjectReference Property BookMarker08 Auto Hidden +ObjectReference Property BookMarker09 Auto Hidden +ObjectReference Property BookMarker10 Auto Hidden +ObjectReference Property BookMarker11 Auto Hidden +ObjectReference Property BookMarker12 Auto Hidden +ObjectReference Property BookMarker13 Auto Hidden +ObjectReference Property BookMarker14 Auto Hidden +ObjectReference Property BookMarker15 Auto Hidden +ObjectReference Property BookMarker16 Auto Hidden +ObjectReference Property BookMarker17 Auto Hidden +ObjectReference Property BookMarker18 Auto Hidden +ObjectReference Property BookShelfTrigger01Ref Auto Hidden +ObjectReference Property BookShelfTrigger02Ref Auto Hidden +ObjectReference Property BookShelfTrigger03Ref Auto Hidden +ObjectReference Property BookShelfTrigger04Ref Auto Hidden + +Int Property MaxBooksAllowed Auto Hidden +{Max books allowed on this partciular shelf} + +Int Property CurrentBookAmount Auto Hidden +{The current amount of books placed on the shelf} + +Form Property EmptyForm Auto Hidden +{Null Form} + +ObjectReference Property EmptyRef Auto Hidden +{Null Ref} + +Form Property CurrentBookForm Auto Hidden +{Book Form we are working with at any one time} + +ObjectReference Property CurrentBookRef Auto Hidden +{Book Ref we are working with at any one time} + +Form Property PlacedBook01 Auto Hidden +Form Property PlacedBook02 Auto Hidden +Form Property PlacedBook03 Auto Hidden +Form Property PlacedBook04 Auto Hidden +Form Property PlacedBook05 Auto Hidden +Form Property PlacedBook06 Auto Hidden +Form Property PlacedBook07 Auto Hidden +Form Property PlacedBook08 Auto Hidden +Form Property PlacedBook09 Auto Hidden +Form Property PlacedBook10 Auto Hidden +Form Property PlacedBook11 Auto Hidden +Form Property PlacedBook12 Auto Hidden +Form Property PlacedBook13 Auto Hidden +Form Property PlacedBook14 Auto Hidden +Form Property PlacedBook15 Auto Hidden +Form Property PlacedBook17 Auto Hidden +Form Property PlacedBook16 Auto Hidden +Form Property PlacedBook18 Auto Hidden +{List of Placed Book Forms} + +ObjectReference Property PlacedBook01Ref Auto Hidden +ObjectReference Property PlacedBook02Ref Auto Hidden +ObjectReference Property PlacedBook03Ref Auto Hidden +ObjectReference Property PlacedBook04Ref Auto Hidden +ObjectReference Property PlacedBook05Ref Auto Hidden +ObjectReference Property PlacedBook06Ref Auto Hidden +ObjectReference Property PlacedBook07Ref Auto Hidden +ObjectReference Property PlacedBook08Ref Auto Hidden +ObjectReference Property PlacedBook09Ref Auto Hidden +ObjectReference Property PlacedBook10Ref Auto Hidden +ObjectReference Property PlacedBook11Ref Auto Hidden +ObjectReference Property PlacedBook12Ref Auto Hidden +ObjectReference Property PlacedBook13Ref Auto Hidden +ObjectReference Property PlacedBook14Ref Auto Hidden +ObjectReference Property PlacedBook15Ref Auto Hidden +ObjectReference Property PlacedBook17Ref Auto Hidden +ObjectReference Property PlacedBook16Ref Auto Hidden +ObjectReference Property PlacedBook18Ref Auto Hidden +{List of Placed Book Refs} + +Bool Property AlreadyLoaded = FALSE Auto Hidden +{Whether this scritp has already went through it's OnCellLoad() Event} + +Bool Property BlockBooks = FALSE Auto Hidden +{Used for when you can't place any more books} + +Message Property BookShelfFirstActivateMESSAGE Auto +{Display message when the player activates a bookshelf for the first time. Only displays once.} + +Message Property BookShelfNoMoreRoomMESSAGE Auto +{Displayed message for when the amount of books the player is placing excedes the shelf limit.} + +Message Property BookShelfNotABookMESSAGE Auto +{Message displayed when the player places a non book form in the container.} + +Message Property BookShelfRoomLeftMESSAGE Auto +{Notification that tells the player how much room is left on the shelf upon first activating it.} + +GlobalVariable Property BookShelfGlobal Auto +{Global showing whether or not the player has ever activated a bookshelf} + + +EVENT OnCellLoad() + if AlreadyLoaded == FALSE + ;Trace("BOOKCASE - Running OnCellLoad()") + ; Get all the book markers + BookMarker01 = GetLinkedRef(BookShelfBook01) + BookMarker02 = GetLinkedRef(BookShelfBook02) + BookMarker03 = GetLinkedRef(BookShelfBook03) + BookMarker04 = GetLinkedRef(BookShelfBook04) + BookMarker05 = GetLinkedRef(BookShelfBook05) + BookMarker06 = GetLinkedRef(BookShelfBook06) + BookMarker07 = GetLinkedRef(BookShelfBook07) + BookMarker08 = GetLinkedRef(BookShelfBook08) + BookMarker09 = GetLinkedRef(BookShelfBook09) + BookMarker10 = GetLinkedRef(BookShelfBook10) + BookMarker11 = GetLinkedRef(BookShelfBook11) + BookMarker12 = GetLinkedRef(BookShelfBook12) + BookMarker13 = GetLinkedRef(BookShelfBook13) + BookMarker14 = GetLinkedRef(BookShelfBook14) + BookMarker15 = GetLinkedRef(BookShelfBook15) + BookMarker16 = GetLinkedRef(BookShelfBook16) + BookMarker17 = GetLinkedRef(BookShelfBook17) + BookMarker18 = GetLinkedRef(BookShelfBook18) + BookShelfTrigger01Ref = (GetLinkedRef(BookShelfTrigger01) as PlayerBookShelfTriggerSCRIPT) + BookShelfTrigger02Ref = (GetLinkedRef(BookShelfTrigger02) as PlayerBookShelfTriggerSCRIPT) + BookShelfTrigger03Ref = (GetLinkedRef(BookShelfTrigger03) as PlayerBookShelfTriggerSCRIPT) + BookShelfTrigger04Ref = (GetLinkedRef(BookShelfTrigger04) as PlayerBookShelfTriggerSCRIPT) + ; Count how many books can be placed on this shelf + CountMaxBooks() + + AlreadyLoaded = TRUE + endif +endEVENT + + + +EVENT OnActivate(ObjectReference akActionRef) + ; Removing all items from container as a precaution + ;Trace("BOOKCASE - I've been ACTIVATED!") + BlockActivate() + ;Trace("BOOKCASE - Blocking activate on all books") + ;Trace("BOOKCASE - BookShelfTrigger01Ref = " + BookShelfTrigger01Ref) + BookShelfRoomLeftMESSAGE.Show((MaxBooksAllowed - CurrentBookAmount)) + ;debug.Notification("You can place " + (MaxBooksAllowed - CurrentBookAmount) + " more books on this shelf.") + + if (BookShelfGlobal.GetValue() == 0) + BookShelfFirstActivateMESSAGE.Show() + BookShelfGlobal.SetValue(1) + endif + ;CurrentBookAmount = 0 + + if BookShelfTrigger01Ref + ;Trace("BOOKCASE - Setting FIRST trigger to GoToState IgnoreBooks") + BookShelfTrigger01Ref.GoToState("IgnoreBooks") + endif + if BookShelfTrigger02Ref + ;Trace("BOOKCASE - Setting SECOND trigger to GoToState IgnoreBooks") + BookShelfTrigger02Ref.GoToState("IgnoreBooks") + endif + if BookShelfTrigger03Ref + ;Trace("BOOKCASE - Setting THIRD trigger to GoToState IgnoreBooks") + BookShelfTrigger03Ref.GoToState("IgnoreBooks") + endif + if BookShelfTrigger04Ref + ;Trace("BOOKCASE - Setting FOURTH trigger to GoToState IgnoreBooks") + BookShelfTrigger04Ref.GoToState("IgnoreBooks") + endif + + Wait(0.25) + ; The following will fire when the player leaves inventory + ;Trace("BOOKCASE - Out of Inventory so placing all the books") + UpdateBooks() + + if BookShelfTrigger01Ref + ;Trace("BOOKCASE - Setting FIRST trigger to GoToState WaitForBooks") + BookShelfTrigger01Ref.GoToState("WaitForBooks") + endif + if BookShelfTrigger02Ref + ;Trace("BOOKCASE - Setting SECOND trigger to GoToState WaitForBooks") + BookShelfTrigger02Ref.GoToState("WaitForBooks") + endif + if BookShelfTrigger03Ref + ;Trace("BOOKCASE - Setting THIRD trigger to GoToState WaitForBooks") + BookShelfTrigger03Ref.GoToState("WaitForBooks") + endif + if BookShelfTrigger04Ref + ;Trace("BOOKCASE - Setting FOURTH trigger to GoToState WaitForBooks") + BookShelfTrigger04Ref.GoToState("WaitForBooks") + endif +endEVENT + + +Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) + if (akBaseItem as Book) + if BlockBooks == FALSE + ; If the item is a book find the corresponding book reference and remove it. + ;Trace("BOOKCASE - Form being Removed " + akBaseItem + " is a Book! Remove it from the list") + RemoveBooks(akBaseItem, aiItemCount) + CurrentBookAmount = CurrentBookAmount - aiItemCount + else + BlockBooks = FALSE + endif + endif +endEvent + + +Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) + ;Trace("BOOKCASE - Adding " + akBaseItem + " to the Book Container") + + if (akBaseItem as Book) + ; If the item being added is a book then check to see if there is room in on the shelf. + ;Trace("BOOKCASE - Form being Added " + akBaseItem + " is a Book!") + if ((aiItemCount + CurrentBookAmount) <= MaxBooksAllowed) + ; There's room on teh shelf, manage the book placement + ;Trace("BOOKCASE - " + CurrentBookAmount + "/" + MaxBooksAllowed + " There is room for another book, lets place it on the shelf.") + AddBooks(akBaseItem, aiItemCount) + CurrentBookAmount = CurrentBookAmount + aiItemCount + else + ; There is no room on the shelf. Tell the player this and give him his book back. + ;Trace("BOOKCASE - " + CurrentBookAmount + "/" + MaxBooksAllowed + " There's no more room for books on this shelf.") + utility.waitMenuMode(0) + ;MessageBox("You can't place that many books on this shelf") + BookShelfNoMoreRoomMESSAGE.Show() + ;Trace("BOOKCASE - Remove it from this container...") + BlockBooks = TRUE + self.RemoveItem(akBaseItem, aiItemCount, true, Game.GetPlayer()) + ;Trace("BOOKCASE - ...and give it back to the player") + endif + else + ; The item placed in the container isn't a book, so give the player back and tell him only books are allowed. + ;Trace("BOOKCASE - Form " + akBaseItem + " is NOT a Book!") + ;Trace("BOOKCASE - Since the placed item wasn't a book remove it from the container...") + + self.RemoveItem(akBaseItem, aiItemCount, true, Game.GetPlayer()) + ;Trace("BOOKCASE - ...and give it back to the player") + + ;(Game.GetPlayer()).AddItem(akBaseItem, aiItemCount, True) + utility.WaitMenuMode(0) + ;MessageBox("You can only place books on this shelf") + BookShelfNotABookMESSAGE.Show() + endif + +endEvent + +Function BlockActivate() + if Placedbook01Ref + PlacedBook01Ref.BlockActivation(TRUE) + endif + if Placedbook02Ref + PlacedBook02Ref.BlockActivation(TRUE) + endif + if Placedbook03Ref + PlacedBook03Ref.BlockActivation(TRUE) + endif + if Placedbook04Ref + PlacedBook04Ref.BlockActivation(TRUE) + endif + if Placedbook05Ref + PlacedBook05Ref.BlockActivation(TRUE) + endif + if Placedbook06Ref + PlacedBook06Ref.BlockActivation(TRUE) + endif + if Placedbook07Ref + PlacedBook07Ref.BlockActivation(TRUE) + endif + if Placedbook08Ref + PlacedBook08Ref.BlockActivation(TRUE) + endif + if Placedbook09Ref + PlacedBook09Ref.BlockActivation(TRUE) + endif + if Placedbook10Ref + PlacedBook10Ref.BlockActivation(TRUE) + endif + if Placedbook11Ref + PlacedBook11Ref.BlockActivation(TRUE) + endif + if Placedbook12Ref + PlacedBook12Ref.BlockActivation(TRUE) + endif + if Placedbook13Ref + PlacedBook13Ref.BlockActivation(TRUE) + endif + if Placedbook14Ref + PlacedBook14Ref.BlockActivation(TRUE) + endif + if Placedbook15Ref + PlacedBook15Ref.BlockActivation(TRUE) + endif + if Placedbook16Ref + PlacedBook16Ref.BlockActivation(TRUE) + endif + if Placedbook17Ref + PlacedBook17Ref.BlockActivation(TRUE) + endif + if Placedbook18Ref + PlacedBook18Ref.BlockActivation(TRUE) + endif + ;Trace("BOOKCASE - All book activation has been blocked") +endFunction + +Function UnBlockActivate() + if Placedbook01Ref + PlacedBook01Ref.BlockActivation(FALSE) + endif + if Placedbook02Ref + PlacedBook02Ref.BlockActivation(FALSE) + endif + if Placedbook03Ref + PlacedBook03Ref.BlockActivation(FALSE) + endif + if Placedbook04Ref + PlacedBook04Ref.BlockActivation(FALSE) + endif + if Placedbook05Ref + PlacedBook05Ref.BlockActivation(FALSE) + endif + if Placedbook06Ref + PlacedBook06Ref.BlockActivation(FALSE) + endif + if Placedbook07Ref + PlacedBook07Ref.BlockActivation(FALSE) + endif + if Placedbook08Ref + PlacedBook08Ref.BlockActivation(FALSE) + endif + if Placedbook09Ref + PlacedBook09Ref.BlockActivation(FALSE) + endif + if Placedbook10Ref + PlacedBook10Ref.BlockActivation(FALSE) + endif + if Placedbook11Ref + PlacedBook11Ref.BlockActivation(FALSE) + endif + if Placedbook12Ref + PlacedBook12Ref.BlockActivation(FALSE) + endif + if Placedbook13Ref + PlacedBook13Ref.BlockActivation(FALSE) + endif + if Placedbook14Ref + PlacedBook14Ref.BlockActivation(FALSE) + endif + if Placedbook15Ref + PlacedBook15Ref.BlockActivation(FALSE) + endif + if Placedbook16Ref + PlacedBook16Ref.BlockActivation(FALSE) + endif + if Placedbook17Ref + PlacedBook17Ref.BlockActivation(FALSE) + endif + if Placedbook18Ref + PlacedBook18Ref.BlockActivation(FALSE) + endif + ;Trace("BOOKCASE - All book activation has been UNblocked") +endFunction + + +Function RemoveBooks(Form BookBase, Int BookAmount) + ; Find an empty book form and place the new book there + While BookAmount > 0 + if PlacedBook01 == BookBase + ;Trace("BOOKCASE - PlacedBook01 matches, Removing this book") + PlacedBook01 = EmptyForm + elseif PlacedBook02 == BookBase + ;Trace("BOOKCASE - PlacedBook02 matches, Removing this book") + PlacedBook02 = EmptyForm + elseif PlacedBook03 == BookBase + ;Trace("BOOKCASE - PlacedBook03 matches, Removing this book") + PlacedBook03 = EmptyForm + elseif PlacedBook04 == BookBase + ;Trace("BOOKCASE - PlacedBook04 matches, Removing this book") + PlacedBook04 = EmptyForm + elseif PlacedBook05 == BookBase + ;Trace("BOOKCASE - PlacedBook05 matches, Removing this book") + PlacedBook05 = EmptyForm + elseif PlacedBook06 == BookBase + ;Trace("BOOKCASE - PlacedBook06 matches, Removing this book") + PlacedBook06 = EmptyForm + elseif PlacedBook07 == BookBase + ;Trace("BOOKCASE - PlacedBook07 matches, Removing this book") + PlacedBook07 = EmptyForm + elseif PlacedBook08 == BookBase + ;Trace("BOOKCASE - PlacedBook08 matches, Removing this book") + PlacedBook08 = EmptyForm + elseif PlacedBook09 == BookBase + ;Trace("BOOKCASE - PlacedBook09 matches, Removing this book") + PlacedBook09 = EmptyForm + elseif PlacedBook10 == BookBase + ;Trace("BOOKCASE - PlacedBook10 matches, Removing this book") + PlacedBook10 = EmptyForm + elseif PlacedBook11 == BookBase + ;Trace("BOOKCASE - PlacedBook11 matches, Removing this book") + PlacedBook11 = EmptyForm + elseif PlacedBook12 == BookBase + ;Trace("BOOKCASE - PlacedBook12 matches, Removing this book") + PlacedBook12 = EmptyForm + elseif PlacedBook13 == BookBase + ;Trace("BOOKCASE - PlacedBook13 matches, Removing this book") + PlacedBook13 = EmptyForm + elseif PlacedBook14 == BookBase + ;Trace("BOOKCASE - PlacedBook14 matches, Removing this book") + PlacedBook14 = EmptyForm + elseif PlacedBook15 == BookBase + ;Trace("BOOKCASE - PlacedBook15 matches, Removing this book") + PlacedBook15 = EmptyForm + elseif PlacedBook16 == BookBase + ;Trace("BOOKCASE - PlacedBook16 matches, Removing this book") + PlacedBook16 = EmptyForm + elseif PlacedBook17 == BookBase + ;Trace("BOOKCASE - PlacedBook17 matches, Removing this book") + PlacedBook17 = EmptyForm + elseif PlacedBook18 == BookBase + ;Trace("BOOKCASE - PlacedBook18 matches, Removing this book") + PlacedBook18 = EmptyForm + endif + + BookAmount = BookAmount - 1 + + endWhile +endFunction + +Function AddBooks(Form BookBase, Int BookAmount) + ; Find an empty book form and place the new book there + While BookAmount > 0 + if PlacedBook01 == EmptyForm + ;Trace("BOOKCASE - PlacedBook01 is empty, placing book there") + PlacedBook01 = BookBase + elseif PlacedBook02 == EmptyForm + ;Trace("BOOKCASE - PlacedBook02 is empty, placing book there") + PlacedBook02 = BookBase + elseif PlacedBook03 == EmptyForm + ;Trace("BOOKCASE - PlacedBook03 is empty, placing book there") + PlacedBook03 = BookBase + elseif PlacedBook04 == EmptyForm + ;Trace("BOOKCASE - PlacedBook04 is empty, placing book there") + PlacedBook04 = BookBase + elseif PlacedBook05 == EmptyForm + ;Trace("BOOKCASE - PlacedBook05 is empty, placing book there") + PlacedBook05 = BookBase + elseif PlacedBook06 == EmptyForm + ;Trace("BOOKCASE - PlacedBook06 is empty, placing book there") + PlacedBook06 = BookBase + elseif PlacedBook07 == EmptyForm + ;Trace("BOOKCASE - PlacedBook07 is empty, placing book there") + PlacedBook07 = BookBase + elseif PlacedBook08 == EmptyForm + ;Trace("BOOKCASE - PlacedBook08 is empty, placing book there") + PlacedBook08 = BookBase + elseif PlacedBook09 == EmptyForm + ;Trace("BOOKCASE - PlacedBook09 is empty, placing book there") + PlacedBook09 = BookBase + elseif PlacedBook10 == EmptyForm + ;Trace("BOOKCASE - PlacedBook10 is empty, placing book there") + PlacedBook10 = BookBase + elseif PlacedBook11 == EmptyForm + ;Trace("BOOKCASE - PlacedBook11 is empty, placing book there") + PlacedBook11 = BookBase + elseif PlacedBook12 == EmptyForm + ;Trace("BOOKCASE - PlacedBook12 is empty, placing book there") + PlacedBook12 = BookBase + elseif PlacedBook13 == EmptyForm + ;Trace("BOOKCASE - PlacedBook13 is empty, placing book there") + PlacedBook13 = BookBase + elseif PlacedBook14 == EmptyForm + ;Trace("BOOKCASE - PlacedBook14 is empty, placing book there") + PlacedBook14 = BookBase + elseif PlacedBook15 == EmptyForm + ;Trace("BOOKCASE - PlacedBook15 is empty, placing book there") + PlacedBook15 = BookBase + elseif PlacedBook16 == EmptyForm + ;Trace("BOOKCASE - PlacedBook16 is empty, placing book there") + PlacedBook16 = BookBase + elseif PlacedBook17 == EmptyForm + ;Trace("BOOKCASE - PlacedBook17 is empty, placing book there") + PlacedBook17 = BookBase + elseif PlacedBook18 == EmptyForm + ;Trace("BOOKCASE - PlacedBook18 is empty, placing book there") + PlacedBook18 = BookBase + endif + + BookAmount = BookAmount - 1 + + endWhile +endFunction + + +Function CountMaxBooks() + ; Checks how many books can be placed on this shelf + if BookMarker01 == EmptyRef + MaxBooksAllowed = 0 + elseif BookMarker02 == EmptyRef + MaxBooksAllowed = 1 + elseif BookMarker03 == EmptyRef + MaxBooksAllowed = 2 + elseif BookMarker04 == EmptyRef + MaxBooksAllowed = 3 + elseif BookMarker05 == EmptyRef + MaxBooksAllowed = 4 + elseif BookMarker06 == EmptyRef + MaxBooksAllowed = 5 + elseif BookMarker07 == EmptyRef + MaxBooksAllowed = 6 + elseif BookMarker08 == EmptyRef + MaxBooksAllowed = 7 + elseif BookMarker09 == EmptyRef + MaxBooksAllowed = 8 + elseif BookMarker10 == EmptyRef + MaxBooksAllowed = 9 + elseif BookMarker11 == EmptyRef + MaxBooksAllowed = 10 + elseif BookMarker12 == EmptyRef + MaxBooksAllowed = 11 + elseif BookMarker13 == EmptyRef + MaxBooksAllowed = 12 + elseif BookMarker14 == EmptyRef + MaxBooksAllowed = 13 + elseif BookMarker15 == EmptyRef + MaxBooksAllowed = 14 + elseif BookMarker16 == EmptyRef + MaxBooksAllowed = 15 + elseif BookMarker17 == EmptyRef + MaxBooksAllowed = 16 + elseif BookMarker18 == EmptyRef + MaxBooksAllowed = 17 + elseif BookMarker18 + MaxBooksAllowed = 18 + endif + ;Trace("BOOKCASE - " + MaxBooksAllowed + " books can be placed on this shelf") +endFunction + + +ObjectReference Function UpdateSingleBook(Form TargetBook, ObjectReference PlacedBookRef, ObjectReference TargetMarker) + ObjectReference retVal ; We return the book we placed (or None) + ; Note - it would be more efficient to move the book to its home position if the desired + ; book matches the placed book, but MoveTo doesn't work correctly with multi-part dynamic + ; objects. So we sidestep the issue by always deleting and placing + if PlacedBookRef + PlacedBookRef.Disable() + PlacedBookRef.Delete() + endIf + if TargetBook + retVal = TargetMarker.PlaceAtMe(TargetBook) + retVal.BlockActivation() + endIf + return retVal +EndFunction + + +Function UpdateBooks() + GoToState("PlacingBooks") ; Future calls should not mess with this stuff + + PlacedBook01Ref = UpdateSingleBook(PlacedBook01, PlacedBook01Ref, BookMarker01) + PlacedBook02Ref = UpdateSingleBook(PlacedBook02, PlacedBook02Ref, BookMarker02) + PlacedBook03Ref = UpdateSingleBook(PlacedBook03, PlacedBook03Ref, BookMarker03) + PlacedBook04Ref = UpdateSingleBook(PlacedBook04, PlacedBook04Ref, BookMarker04) + PlacedBook05Ref = UpdateSingleBook(PlacedBook05, PlacedBook05Ref, BookMarker05) + + PlacedBook06Ref = UpdateSingleBook(PlacedBook06, PlacedBook06Ref, BookMarker06) + PlacedBook07Ref = UpdateSingleBook(PlacedBook07, PlacedBook07Ref, BookMarker07) + PlacedBook08Ref = UpdateSingleBook(PlacedBook08, PlacedBook08Ref, BookMarker08) + PlacedBook09Ref = UpdateSingleBook(PlacedBook09, PlacedBook09Ref, BookMarker09) + PlacedBook10Ref = UpdateSingleBook(PlacedBook10, PlacedBook10Ref, BookMarker10) + + PlacedBook11Ref = UpdateSingleBook(PlacedBook11, PlacedBook11Ref, BookMarker11) + PlacedBook12Ref = UpdateSingleBook(PlacedBook12, PlacedBook12Ref, BookMarker12) + PlacedBook13Ref = UpdateSingleBook(PlacedBook13, PlacedBook13Ref, BookMarker13) + PlacedBook14Ref = UpdateSingleBook(PlacedBook14, PlacedBook14Ref, BookMarker14) + PlacedBook15Ref = UpdateSingleBook(PlacedBook15, PlacedBook15Ref, BookMarker15) + + PlacedBook16Ref = UpdateSingleBook(PlacedBook16, PlacedBook16Ref, BookMarker16) + PlacedBook17Ref = UpdateSingleBook(PlacedBook17, PlacedBook17Ref, BookMarker17) + PlacedBook18Ref = UpdateSingleBook(PlacedBook18, PlacedBook18Ref, BookMarker18) + + UnBlockActivate() ; Allow the player to mess with them + GoToState("") ; Now allow books to be updated again +EndFunction + +State PlacingBooks + Function UpdateBooks() + ; Already updating books, so ignore + EndFunction +EndState + \ No newline at end of file