enderalse/source/scripts/defaultnpcruntotrig.psc

83 lines
2.5 KiB
Plaintext

scriptName defaultNPCrunToTRIG extends objectReference
{Linked NPC(s) on defaultMasterPackage will check out their linked runToWhenTriggered ref(s)}
bool property runToPatrol auto
{Always run to patrol? (regardless of Player stealth.) DEFAULT: False}
bool property walkToPatrol auto
{Always run to patrol? (regardless of Player stealth.) DEFAULT: False}
bool ranOnce
actor NPC
actor player
bool playerSneaky
EVENT onLoad()
player = (Game.GetForm(0x14) as Actor)
NPC = getLinkedRef() as actor
endEVENT
EVENT onTriggerEnter(objectReference actronaut)
; trigger only on player entering
if actronaut == player && ranOnce == FALSE
ranOnce = TRUE
triggerNPC()
endif
endEVENT
EVENT onActivate(objectReference actronaut)
; including activate event support so we can trigger this from a door/lever/etc activated by player
if ranOnce == FALSE
ranOnce = TRUE
triggerNPC()
endif
endEVENT
;======================================
; This function is the meat. Declaring here so we can call from either event type
FUNCTION triggerNPC()
if stealthCheck()
; player is sneaking and has better sneak, so WALK to the patrol
; variable04 helps the package stack along via stack conditions in defaultMasterPackage
NPC.setActorValue("variable04", 1)
elseif !stealthCheck()
; player wasn't sneaking or failed check, so RUN there.
NPC.setActorValue("variable04", 2)
endif
; politely ask NPC to evp package stack and realize he needs to build a path
NPC.evaluatePackage()
; set var04 to an invalid to avoid retracing steps
utility.wait(5)
NPC.setActorValue("variable04",3)
endFUNCTION
;=====================================
; Breaking stealth check into separate function in case this needs changes
bool FUNCTION stealthCheck()
; a very basic stealth check for run/walk check
; TRUE return = player is "sneaky" so walk
; FALSE retrun = player isn't sneaky, so run
; first, an error checker
if runToPatrol == TRUE && walkToPatrol == TRUE
; debug.trace("ERROR: Run/Walk properties mutually exclusive. Setting both to false on "+self)
runToPatrol = FALSE
walkToPatrol = FALSE
endif
; return quickly if user has explicity chosen behavior
if runToPatrol == TRUE
return FALSE
elseif walkToPatrol == TRUE
return TRUE
endif
if (Game.GetForm(0x14) as Actor).getActorValue("Sneak") >= NPC.getActorValue("Sneak") && player.isSneaking() == TRUE
; player is sneaking and has higher skill than NPC, so walk
return FALSE
else
; player is either not sneaky or worse at it than NPC
return TRUE
endif
endFUNCTION