enderalse/source/scripts/defaultdisplayiteminlistscript.psc

79 lines
2.1 KiB
Plaintext
Raw Normal View History

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