1
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1010 lines
36 KiB

Scriptname PlayerBookShelfContainerScript extends ObjectReference
{This script has been overhauled to fix several issues listed in USLEEP 3.0.1 - Bug #19515. This overhaul was contributed by Adria.}
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
; Check if this shelf has already been messed up by vanilla bug, and issue a warning in a log.
; Actual healing process will trigger when all books are removed from the display shelf.
;if !(CurrentBookAmount >= 0 && CurrentBookAmount <= MaxBooksAllowed && CurrentBookAmount == NumBooksOnShelf())
; Trace("BookShelfFix - An inconsistent bookshelf " + self + " found in " + self.GetCurrentLocation() + ", fix will be applied when you pull out all the books from the shelf.")
;endif
endEVENT
EVENT OnActivate(ObjectReference akActionRef)
; Removing all items from container as a precaution
;Trace("BOOKCASE - I've been ACTIVATED!")
;USLEEP 3.0.1 - Bug #19515
CleanInvalidPlacedBooks()
CurrentBookAmount = NumBooksOnShelf()
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
;USLEEP 3.0.1 - Bug #19515
; When display shelf becomes empty, reset it to fix corrupted shelves
if NumBooksOnShelf() == 0
RemoveAllItems(akTransferTo = Game.GetPlayer(), abRemoveQuestItems = true) ; make sure all the books are transfered into player's inventory
ClearDisplayShelf()
Wait(0.25) ; wait until RemoveAllItems() is (hopefully) done
CurrentBookAmount = 0
;Trace("BookShelfFix - Cleaned up bookshelf " + self + ". This is not an error.")
endif
;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 the removed book form(s) and remove it from the display
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
;USLEEP 3.0.1 - Bug #19515 added form ID check here.
if PlacedBookRef && PlacedBookRef.GetFormID()
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
;
; ;USLEEP 3.0.1 - Bug #19515: Everything past this point is new stuff to support fixing the bookshelf containers.
;
Function PickUp(ObjectReference BookRef)
;Trace("BookShelfFix " + self + " PickUp() - " + BookRef + ", Base = " + BookRef.GetBaseObject())
if (BookRef && BookRef.GetBaseObject() as Book)
; Remove a display book first
if RemoveBookByRef(BookRef)
GoToState("PickingUp")
; Then remove a book in container
self.RemoveItem(BookRef.GetBaseObject(), 1)
Wait(0.25) ; wait for OnItemRemoved() event to fire
GoToState("")
endif
endIf
EndFunction
State PickingUp
; Used when a book has been picked up directly from the display
Event OnBeginState() ; You Shall Not Pass!
self.BlockActivation(True)
BlockActivate()
;Trace("BookShelfFix " + self + " PickingUp State - Entered State")
EndEvent
Event OnActivate(ObjectReference akActionRef)
EndEvent
Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
;Trace("BookShelfFix " + self + " PickingUp State - Item " + akBaseItem + " removed from shelf inventory")
CurrentBookAmount -= aiItemCount
EndEvent
Event OnEndState()
;Trace("BookShelfFix " + self + " PickingUp State - Leaving State")
UnblockActivate()
self.BlockActivation(False)
EndEvent
EndState
Bool Function RemoveBookByRef(ObjectReference BookRef)
; If the book had been picked up directly, and if there were multiple copies of it on the shelf,
; we need to determine the exact location of the book rather than the first copy in a list.
; Returns True if BookRef has been successfully dismembered from the list or False when the book was missing
if !BookRef
return False
endif
int BookRefID = BookRef.GetFormID()
; These references could be a derivative of ObjectReference such as DefaultSetStageOnPlayerAcquireItem
; and would never match even if they were cast into ObjectReference, so compare their FormIDs rather than comparing them directly.
if PlacedBook01Ref && PlacedBook01Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook01 matches, Removing this book")
PlacedBook01 = EmptyForm
PlacedBook01Ref = EmptyRef
elseif PlacedBook02Ref && PlacedBook02Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook02 matches, Removing this book")
PlacedBook02 = EmptyForm
PlacedBook02Ref = EmptyRef
elseif PlacedBook03Ref && PlacedBook03Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook03 matches, Removing this book")
PlacedBook03 = EmptyForm
PlacedBook03Ref = EmptyRef
elseif PlacedBook04Ref && PlacedBook04Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook04 matches, Removing this book")
PlacedBook04 = EmptyForm
PlacedBook04Ref = EmptyRef
elseif PlacedBook05Ref && PlacedBook05Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook05 matches, Removing this book")
PlacedBook05 = EmptyForm
PlacedBook05Ref = EmptyRef
elseif PlacedBook06Ref && PlacedBook06Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook06 matches, Removing this book")
PlacedBook06 = EmptyForm
PlacedBook06Ref = EmptyRef
elseif PlacedBook07Ref && PlacedBook07Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook07 matches, Removing this book")
PlacedBook07 = EmptyForm
PlacedBook07Ref = EmptyRef
elseif PlacedBook08Ref && PlacedBook08Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook08 matches, Removing this book")
PlacedBook08 = EmptyForm
PlacedBook08Ref = EmptyRef
elseif PlacedBook09Ref && PlacedBook09Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook09 matches, Removing this book")
PlacedBook09 = EmptyForm
PlacedBook09Ref = EmptyRef
elseif PlacedBook10Ref && PlacedBook10Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook10 matches, Removing this book")
PlacedBook10 = EmptyForm
PlacedBook10Ref = EmptyRef
elseif PlacedBook11Ref && PlacedBook11Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook11 matches, Removing this book")
PlacedBook11 = EmptyForm
PlacedBook11Ref = EmptyRef
elseif PlacedBook12Ref && PlacedBook12Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook12 matches, Removing this book")
PlacedBook12 = EmptyForm
PlacedBook12Ref = EmptyRef
elseif PlacedBook13Ref && PlacedBook13Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook13 matches, Removing this book")
PlacedBook13 = EmptyForm
PlacedBook13Ref = EmptyRef
elseif PlacedBook14Ref && PlacedBook14Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook14 matches, Removing this book")
PlacedBook14 = EmptyForm
PlacedBook14Ref = EmptyRef
elseif PlacedBook15Ref && PlacedBook15Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook15 matches, Removing this book")
PlacedBook15 = EmptyForm
PlacedBook15Ref = EmptyRef
elseif PlacedBook16Ref && PlacedBook16Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook16 matches, Removing this book")
PlacedBook16 = EmptyForm
PlacedBook16Ref = EmptyRef
elseif PlacedBook17Ref && PlacedBook17Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook17 matches, Removing this book")
PlacedBook17 = EmptyForm
PlacedBook17Ref = EmptyRef
elseif PlacedBook18Ref && PlacedBook18Ref.GetFormID() == BookRefID
;Trace("BookShelfFix RemoveBookByRef() - PlacedBook18 matches, Removing this book")
PlacedBook18 = EmptyForm
PlacedBook18Ref = EmptyRef
else
return False
endif
return True
EndFunction
Int Function NumBooksOnShelf()
; Count number of books displayed on shelf (not ones kept in inventory)
int bookCnt = 0
Form[] PlacedBookAr = new Form[18]
PlacedBookAr[0] = PlacedBook01
PlacedBookAr[1] = PlacedBook02
PlacedBookAr[2] = PlacedBook03
PlacedBookAr[3] = PlacedBook04
PlacedBookAr[4] = PlacedBook05
PlacedBookAr[5] = PlacedBook06
PlacedBookAr[6] = PlacedBook07
PlacedBookAr[7] = PlacedBook08
PlacedBookAr[8] = PlacedBook09
PlacedBookAr[9] = PlacedBook10
PlacedBookAr[10] = PlacedBook11
PlacedBookAr[11] = PlacedBook12
PlacedBookAr[12] = PlacedBook13
PlacedBookAr[13] = PlacedBook14
PlacedBookAr[14] = PlacedBook15
PlacedBookAr[15] = PlacedBook16
PlacedBookAr[16] = PlacedBook17
PlacedBookAr[17] = PlacedBook18
int i = 0
while (i < MaxBooksAllowed && i < 18)
if PlacedBookAr[i]
bookCnt += 1
endif
i += 1
endwhile
; Note that number of books in inventory could NOT match this number due to bugs in vanilla script
return bookCnt
EndFunction
Function ClearDisplayShelf()
; Clear BaseID row for display shelf and give back any books in incorrect slots to player
ObjectReference player = Game.GetPlayer()
;Trace("BookShelfFix - ClearDisplayShelf()")
if (MaxBooksAllowed < 1 && PlacedBook01)
player.AddItem(PlacedBook01, 1, true)
endif
if (MaxBooksAllowed < 2 && PlacedBook02)
player.AddItem(PlacedBook02, 1, true)
endif
if (MaxBooksAllowed < 3 && PlacedBook03)
player.AddItem(PlacedBook03, 1, true)
endif
if (MaxBooksAllowed < 4 && PlacedBook04)
player.AddItem(PlacedBook04, 1, true)
endif
if (MaxBooksAllowed < 5 && PlacedBook05)
player.AddItem(PlacedBook05, 1, true)
endif
if (MaxBooksAllowed < 6 && PlacedBook06)
player.AddItem(PlacedBook06, 1, true)
endif
if (MaxBooksAllowed < 7 && PlacedBook07)
player.AddItem(PlacedBook07, 1, true)
endif
if (MaxBooksAllowed < 8 && PlacedBook08)
player.AddItem(PlacedBook08, 1, true)
endif
if (MaxBooksAllowed < 9 && PlacedBook09)
player.AddItem(PlacedBook09, 1, true)
endif
if (MaxBooksAllowed < 10 && PlacedBook10)
player.AddItem(PlacedBook10, 1, true)
endif
if (MaxBooksAllowed < 11 && PlacedBook11)
player.AddItem(PlacedBook11, 1, true)
endif
if (MaxBooksAllowed < 12 && PlacedBook12)
player.AddItem(PlacedBook12, 1, true)
endif
if (MaxBooksAllowed < 13 && PlacedBook13)
player.AddItem(PlacedBook13, 1, true)
endif
if (MaxBooksAllowed < 14 && PlacedBook14)
player.AddItem(PlacedBook14, 1, true)
endif
if (MaxBooksAllowed < 15 && PlacedBook15)
player.AddItem(PlacedBook15, 1, true)
endif
if (MaxBooksAllowed < 16 && PlacedBook16)
player.AddItem(PlacedBook16, 1, true)
endif
if (MaxBooksAllowed < 17 && PlacedBook17)
player.AddItem(PlacedBook17, 1, true)
endif
if (MaxBooksAllowed < 18 && PlacedBook18)
player.AddItem(PlacedBook18, 1, true)
endif
PlacedBook01 = EmptyForm
PlacedBook02 = EmptyForm
PlacedBook03 = EmptyForm
PlacedBook04 = EmptyForm
PlacedBook05 = EmptyForm
PlacedBook06 = EmptyForm
PlacedBook07 = EmptyForm
PlacedBook08 = EmptyForm
PlacedBook09 = EmptyForm
PlacedBook10 = EmptyForm
PlacedBook11 = EmptyForm
PlacedBook12 = EmptyForm
PlacedBook13 = EmptyForm
PlacedBook14 = EmptyForm
PlacedBook15 = EmptyForm
PlacedBook16 = EmptyForm
PlacedBook17 = EmptyForm
PlacedBook18 = EmptyForm
EndFunction
Function CleanInvalidPlacedBooks()
; Clean invalid (nonexistent) forms off PlacedBook**. Invalid forms may be resulted in removed mods.
; Cleaning them will prevent them from eating up PlacedBook slots permanently.
if !(PlacedBook01 && PlacedBook01.GetFormID()) ; nonexistent forms are still cast into True, but their ID are always 0
PlacedBook01 = EmptyForm
endif
if !(PlacedBook02 && PlacedBook02.GetFormID())
PlacedBook02 = EmptyForm
endif
if !(PlacedBook03 && PlacedBook03.GetFormID())
PlacedBook03 = EmptyForm
endif
if !(PlacedBook04 && PlacedBook04.GetFormID())
PlacedBook04 = EmptyForm
endif
if !(PlacedBook05 && PlacedBook05.GetFormID())
PlacedBook05 = EmptyForm
endif
if !(PlacedBook06 && PlacedBook06.GetFormID())
PlacedBook06 = EmptyForm
endif
if !(PlacedBook07 && PlacedBook07.GetFormID())
PlacedBook07 = EmptyForm
endif
if !(PlacedBook08 && PlacedBook08.GetFormID())
PlacedBook08 = EmptyForm
endif
if !(PlacedBook09 && PlacedBook09.GetFormID())
PlacedBook09 = EmptyForm
endif
if !(PlacedBook10 && PlacedBook10.GetFormID())
PlacedBook10 = EmptyForm
endif
if !(PlacedBook11 && PlacedBook11.GetFormID())
PlacedBook11 = EmptyForm
endif
if !(PlacedBook12 && PlacedBook12.GetFormID())
PlacedBook12 = EmptyForm
endif
if !(PlacedBook13 && PlacedBook13.GetFormID())
PlacedBook13 = EmptyForm
endif
if !(PlacedBook14 && PlacedBook14.GetFormID())
PlacedBook14 = EmptyForm
endif
if !(PlacedBook15 && PlacedBook15.GetFormID())
PlacedBook15 = EmptyForm
endif
if !(PlacedBook16 && PlacedBook16.GetFormID())
PlacedBook16 = EmptyForm
endif
if !(PlacedBook17 && PlacedBook17.GetFormID())
PlacedBook17 = EmptyForm
endif
if !(PlacedBook18 && PlacedBook18.GetFormID())
PlacedBook18 = EmptyForm
endif
EndFunction
;USSEP 4.1.5 Bug #13862 - Added to reset all bookshelf form and reference pointers after the chest has been dumped by the prefabs script.
Function USSEP_ClearAllBookForms()
PlacedBook01 = EmptyForm
PlacedBook02 = EmptyForm
PlacedBook03 = EmptyForm
PlacedBook04 = EmptyForm
PlacedBook05 = EmptyForm
PlacedBook06 = EmptyForm
PlacedBook07 = EmptyForm
PlacedBook08 = EmptyForm
PlacedBook09 = EmptyForm
PlacedBook10 = EmptyForm
PlacedBook11 = EmptyForm
PlacedBook12 = EmptyForm
PlacedBook13 = EmptyForm
PlacedBook14 = EmptyForm
PlacedBook15 = EmptyForm
PlacedBook16 = EmptyForm
PlacedBook17 = EmptyForm
PlacedBook18 = EmptyForm
PlacedBook01Ref = EmptyRef
PlacedBook02Ref = EmptyRef
PlacedBook03Ref = EmptyRef
PlacedBook04Ref = EmptyRef
PlacedBook05Ref = EmptyRef
PlacedBook06Ref = EmptyRef
PlacedBook07Ref = EmptyRef
PlacedBook08Ref = EmptyRef
PlacedBook09Ref = EmptyRef
PlacedBook10Ref = EmptyRef
PlacedBook11Ref = EmptyRef
PlacedBook12Ref = EmptyRef
PlacedBook13Ref = EmptyRef
PlacedBook14Ref = EmptyRef
PlacedBook15Ref = EmptyRef
PlacedBook16Ref = EmptyRef
PlacedBook17Ref = EmptyRef
PlacedBook18Ref = EmptyRef
EndFunction