79 lines
2.1 KiB
Plaintext
79 lines
2.1 KiB
Plaintext
scriptname defaultDisplayItemInListScript extends ObjectReference
|
|
|
|
Actor property PlayerRef auto
|
|
|
|
FormList property itemsToDisplay auto
|
|
{ The FormList whose item(s) to display. }
|
|
|
|
Message property ItemNotInInventoryMessage auto
|
|
{ The message to display if the item is not in the player's inventory. }
|
|
|
|
Keyword property LinkedMarkerKeyword auto
|
|
{ The keyword of the linked marker reference. }
|
|
|
|
int MAX_3D_CHECK = 30
|
|
|
|
State Busy
|
|
Event OnActivate(ObjectReference akActionRef)
|
|
endEvent
|
|
endState
|
|
|
|
Event OnActivate(ObjectReference akActionRef)
|
|
if akActionRef == PlayerRef
|
|
GoToState("Busy")
|
|
if !IsOneOfItemsOnDisplay()
|
|
; Display the first unique item found in the array, if the player has it.
|
|
int size = itemsToDisplay.GetSize()
|
|
|
|
int i = 0
|
|
bool itemFound = false
|
|
while i < size && !itemFound
|
|
Form item = itemsToDisplay.GetAt(i)
|
|
if PlayerRef.GetItemCount(item) > 0
|
|
DisplayItem(item)
|
|
itemFound = true
|
|
endif
|
|
i += 1
|
|
endWhile
|
|
|
|
if !itemFound
|
|
; If the player doesn't have any of the items, and
|
|
; none of them are already on display, show an error.
|
|
ItemNotInInventoryMessage.Show()
|
|
endif
|
|
endif
|
|
GoToState("")
|
|
endif
|
|
EndEvent
|
|
|
|
function DisplayItem(Form akItem)
|
|
ObjectReference theItem = PlayerRef.DropObject(akItem)
|
|
theItem.BlockActivation()
|
|
PositionItemAndDisablePhysics(theItem)
|
|
theItem.BlockActivation(false)
|
|
endFunction
|
|
|
|
function PositionItemAndDisablePhysics(ObjectReference akItemOnDisplayRef)
|
|
if akItemOnDisplayRef
|
|
int i = 0
|
|
while !akItemOnDisplayRef.Is3DLoaded() && i < MAX_3D_CHECK
|
|
i += 1
|
|
Utility.Wait(0.1)
|
|
endWhile
|
|
|
|
if i < MAX_3D_CHECK
|
|
; Place the item.
|
|
akItemOnDisplayRef.SetMotionType(Motion_Keyframed, false)
|
|
ObjectReference triggerMarker = GetLinkedRef(LinkedMarkerKeyword)
|
|
akItemOnDisplayRef.MoveTo(triggerMarker)
|
|
else
|
|
; We failed to load the 3D for this item, abort.
|
|
PlayerRef.AddItem(akItemOnDisplayRef)
|
|
endif
|
|
endif
|
|
endFunction
|
|
|
|
bool function IsOneOfItemsOnDisplay()
|
|
return Game.FindClosestReferenceOfAnyTypeInListFromRef(itemsToDisplay, GetLinkedRef(LinkedMarkerKeyword), 32.0)
|
|
endFunction
|