enderalse/source/scripts/mineorefurnitureenderal.psc

219 lines
6.7 KiB
Plaintext

Scriptname MineOreFurnitureEnderal extends ObjectReference Conditional
{script for furniture which the player can use to get resources}
objectReference property lastActivateRef auto Hidden
{tracks the last triggeringRef}
bool property isRegisteredForEvents = false auto hidden
{bool to track if this is registered for events}
bool property canBeActivated = true auto hidden
idle property PickaxeExit auto
bool property playerIsLeavingFurniture = false auto hidden
Actor Property PlayerREF Auto
;===================================================================
;;EVENT BLOCK
;===================================================================
Event OnLoad()
BlockActivation(true)
If !PlayerREF ; Just in case
PlayerREF = Game.GetForm(0x14) as Actor
EndIf
if isFurnitureInUse()
goToState("busy")
endif
endEvent
Event OnUnload()
; safety measures
If !PlayerREF ; Just in case
PlayerREF = Game.GetForm(0x14) as Actor
EndIf
UnregisterForEvents()
lastActivateRef = None
playerIsLeavingFurniture = False
endEvent
Event OnAnimationEvent(ObjectReference akSource, string asEventName)
; debug.trace(self + ": animation event received = " + asEventName)
;if the animation event we've recieved is addToInventory activate our mineOreVein with
;the furniture as the activator to tell it to pay out ore
if asEventName == "AddToInventory"
;PlayerREF.AddItem(Resource, ResourceCount)
lastActivateRef.activate(self)
endif
if asEventName == "IdleFurnitureExit" || asEventName == "IdlePickaxeExit" || asEventName == "IdlePickaxeFloorExit" || asEventName == "IdlePickaxeTableExit"
UnregisterForEvents(True)
endif
endEvent
;===================================================================
;;STATE BLOCK
;===================================================================
auto STATE normal
event onBeginState()
canBeActivated = true
; debug.Trace(self + " is in state normal")
endEvent
Event OnActivate(ObjectReference akActionRef)
if canBeActivated
; gotoState must be before canBeActivated = False because onBeginState in "busy" resets the flag
gotoState("busy")
canBeActivated = False
; debug.trace(self + ", normal: OnActivate by " + akActionRef)
if akActionRef == PlayerREF && !isFurnitureInUse()
; debug.trace(self + ", normal: was activated by the player in state normal, furniture not in use")
RegisterForEvents()
Activate(akActionRef, true)
elseif akActionRef == PlayerREF
; debug.Trace(self + ", normal: has been activated by the player while in use")
;just activate it
;goToState("busy")
Activate(akActionRef, true)
; debug.trace(self + ", normal: NPC activation END")
else
;goToState("busy")
Activate(akActionRef, true)
; debug.trace(self + ", normal: NPC (other) activation END")
endif
canBeActivated = true
endif
endEvent
endState
STATE busy
; do nothing
event onBeginState()
canBeActivated = True
endEvent
event onActivate(objectReference akActionRef)
If isFurnitureInUse()
If canBeActivated
canBeActivated = False
; debug.Trace(self + ", busy: has recieved activation in busy state from " + akActionRef)
if isRegisteredForEvents
if lastActivateRef && akActionRef == lastActivateRef
; debug.Trace(self + ", busy: is trying to kick player out of furniture")
; PlayerREF.PlayIdle(PickaxeExit)
; Activate(PlayerREF, true)
playerIsLeavingFurniture = True
goToState("reseting")
elseif akActionRef == PlayerREF
; debug.Trace(self + ", busy: player is trying to leave furniture")
; PlayerREF.PlayIdle(PickaxeExit)
; Activate(PlayerREF, true)
playerIsLeavingFurniture = True
goToState("reseting")
endif
elseif akActionRef == PlayerREF
; debug.trace(self + ", busy: player is trying to leave furniture, not registered for events")
Activate(PlayerREF, true)
else
; debug.trace(self + ", busy: player is trying to leave furniture, not registered for events")
;Activate(akActivator, true)
endif
canBeActivated = true
EndIf
Else ; not in use
If akActionRef == PlayerREF
; debug.trace(self + ", busy: activated by the player, furniture not in use")
RegisterForEvents()
Activate(akActionRef, true)
endif
EndIf
endEvent
endState
state reseting
event onBeginState()
; debug.Trace(self + ", reseting: onBeginState START")
if playerIsLeavingFurniture
playerIsLeavingFurniture = false
PlayerREF.PlayIdle(PickaxeExit)
else
UnregisterForEvents(True)
endif
;Activate(PlayerREF, true)
;UnregisterForEvents()
endEvent
event onActivate(objectReference akActionRef)
; UnregisterForEvents()
endEvent
endState
state Depleted
event onBeginState()
isRegisteredForEvents = True ; Force unregister
UnregisterForEvents()
endEvent
event onActivate(objectReference akActionRef)
; debug.Trace(self + ": has recieved activation in state Depleted from " + akActionRef)
endEvent
endState
;===================================================================
;;FUNCTION BLOCK
;===================================================================
function goToDepletedState()
goToState("Depleted")
endFunction
function RegisterForEvents()
; centralize this
if !isRegisteredForEvents
isRegisteredForEvents = True
RegisterForAnimationEvent(PlayerREF, "AddToInventory")
RegisterForAnimationEvent(PlayerREF, "IdlePickaxeExit")
RegisterForAnimationEvent(PlayerREF, "IdlePickaxeFloorExit")
RegisterForAnimationEvent(PlayerREF, "IdlePickaxeTableExit")
RegisterForAnimationEvent(PlayerREF, "IdleFurnitureExit")
endif
endFunction
function UnregisterForEvents(Bool bNotifyLastActivateRef = False)
; 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
; debug.Trace(self + " is attempting to unregister for anim events")
if isRegisteredForEvents
isRegisteredForEvents = false
UnRegisterForAnimationEvent(PlayerREF, "AddToInventory")
UnRegisterForAnimationEvent(PlayerREF, "IdlePickaxeExit")
UnRegisterForAnimationEvent(PlayerREF, "IdlePickaxeFloorExit")
UnRegisterForAnimationEvent(PlayerREF, "IdlePickaxeTableExit")
UnRegisterForAnimationEvent(PlayerREF, "IdleFurnitureExit")
If bNotifyLastActivateRef && lastActivateRef
(lastActivateRef as MineOreEnderal).OnFurnitureExit()
EndIf
; debug.Trace(self + " should be unregistered for anim events")
endif
gotoState("normal")
canBeActivated = True
endFunction