135 lines
4.3 KiB
Plaintext
135 lines
4.3 KiB
Plaintext
Scriptname ResourceFurnitureScript extends ObjectReference Conditional
|
|
{script for furniture which the player can use to get resources}
|
|
|
|
|
|
formlist Property requiredItemList Auto
|
|
{required for player to use - optional}
|
|
|
|
Message Property FailureMessage Auto
|
|
{Message to say why you can't use this without RequiredWeapon}
|
|
|
|
MiscObject Property Resource Auto
|
|
{what you get from using this furniture}
|
|
|
|
int Property ResourceCount = 1 Auto
|
|
{how many resources you get per use}
|
|
|
|
int property MaxResourcePerActivation = 6 auto
|
|
{How many times can this object be used before the player has to re-activate?}
|
|
|
|
int counter
|
|
; count up how many resources have been gathered on this go.
|
|
|
|
faction property CurrentFollowerFaction auto
|
|
{Used to handle player followers using the furniture object}
|
|
|
|
objectReference property NPCfollower auto hidden
|
|
{hidden property to track followers who used this}
|
|
|
|
Event OnLoad()
|
|
BlockActivation(true)
|
|
endEvent
|
|
|
|
Event OnUnload()
|
|
; safety measure
|
|
UnregisterForEvents(game.getplayer())
|
|
if NPCfollower
|
|
UnregisterForEvents(NPCfollower)
|
|
endif
|
|
endEvent
|
|
|
|
auto STATE normal
|
|
Event OnActivate(ObjectReference akActionRef)
|
|
gotoState("busy")
|
|
; debug.trace(self + "OnActivate")
|
|
if akActionRef == Game.GetPlayer() || (akActionRef as actor).isInFaction(CurrentFollowerFaction)
|
|
; debug.trace("akActionRef is either player or a follower")
|
|
if (akActionRef as actor) != game.getPlayer()
|
|
; debug.trace("It's a follower - store in NPCfollower property")
|
|
; if not the player, must be the follower
|
|
NPCfollower = akActionRef
|
|
endif
|
|
bool allowActivation = true
|
|
; check if player has required item
|
|
if requiredItemList
|
|
if akActionRef.GetItemCount(requiredItemList) == 0
|
|
if akActionRef == game.getPlayer()
|
|
; only require the axe item for the player
|
|
allowActivation = false
|
|
; debug.trace("allowActivation = "+allowActivation)
|
|
FailureMessage.Show()
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
if allowActivation
|
|
RegisterForEvents(akActionRef)
|
|
; debug.trace(self + "player/follower activation START")
|
|
Activate(akActionRef, true)
|
|
; debug.trace(self + "player/follower activation END")
|
|
endif
|
|
else
|
|
; ;debug.trace(self + "non-follower NPC activation START")
|
|
; just activate it
|
|
Activate(akActionRef, true)
|
|
; ;debug.trace(self + "non-follower NPC activation END")
|
|
endif
|
|
gotoState("normal")
|
|
endEvent
|
|
endState
|
|
|
|
STATE busy
|
|
; do nothing
|
|
endState
|
|
|
|
Event OnAnimationEvent(ObjectReference akSource, string asEventName)
|
|
; debug.trace(self + ": animation event received=" + asEventName)
|
|
if asEventName == "AddToInventory"
|
|
akSource.AddItem(Resource, ResourceCount)
|
|
; increment counter by however many items we just received
|
|
; debug.trace("Pre-add counter = "+counter)
|
|
counter = (counter + resourceCount)
|
|
; debug.trace("Post-add counter = "+counter)
|
|
if counter >= MaxResourcePerActivation
|
|
; if we've bagged our limit, kick the player out. Reset timer for next activation
|
|
; debug.trace("Woodpile - player has gotten "+counter+" logs this go. Kicking out.")
|
|
counter = 0
|
|
(akSource as actor).PlayIdle(IdleWoodchopExit)
|
|
unregisterForEvents(akSource)
|
|
endif
|
|
elseif asEventName == "IdleFurnitureExit"
|
|
; debug.trace("Resource Object Unregistering: "+self)
|
|
; reset the counter if I exit manually
|
|
counter = 0
|
|
UnregisterForEvents(akSource)
|
|
endif
|
|
endEvent
|
|
|
|
bool isRegisteredForEvents = false
|
|
|
|
function RegisterForEvents(objectReference whoToRegister)
|
|
; centralize this
|
|
isRegisteredForEvents = true
|
|
RegisterForAnimationEvent(whoToRegister, "AddToInventory")
|
|
RegisterForAnimationEvent(whoToRegister, "SoundPlay . NPCHumanWoodChop")
|
|
RegisterForAnimationEvent(whoToRegister, "IdleFurnitureExit")
|
|
endFunction
|
|
|
|
function UnregisterForEvents(objectReference whoToUnregister)
|
|
; centralize this
|
|
|
|
; It is perfectly safe to unregister for events you never registered for, however
|
|
; this function is called as part of OnUnload, and if this object isn't persistent
|
|
; then it may be deleted by the time OnUnload runs, and these function calls will
|
|
; fail. Since RegisterForAnimationEvent persists us, we know it will be safe to
|
|
; call Unregister if we've previously Registered, even if called as a part of
|
|
; OnUnload
|
|
if isRegisteredForEvents
|
|
isRegisteredForEvents = false
|
|
UnRegisterForAnimationEvent(whoToUnregister, "AddToInventory")
|
|
UnRegisterForAnimationEvent(whoToUnregister, "IdleFurnitureExit")
|
|
endif
|
|
endFunction
|
|
|
|
Idle Property IdleWoodchopExit Auto
|