83 lines
2.5 KiB
Plaintext
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
|