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
|