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