104 lines
3.5 KiB
Plaintext
104 lines
3.5 KiB
Plaintext
Scriptname defaultQuestRespawnScript extends Quest
|
|
{simple script to respawn aliases}
|
|
|
|
import Utility
|
|
import debug
|
|
|
|
; Respawn markers
|
|
ObjectReference Property RespawnMarker1 Auto
|
|
|
|
ObjectReference Property RespawnMarker2 Auto
|
|
|
|
ObjectReference Property RespawnMarker3 Auto
|
|
|
|
ObjectReference Property RespawnMarkerFailsafe Auto
|
|
{this is where I will respawn if player has LOS
|
|
on other respawn points}
|
|
|
|
|
|
int Property startStage = 0 Auto
|
|
{Quest stage that needs to be set for respawning
|
|
to start}
|
|
|
|
int Property doneStage = 0 Auto
|
|
{Respawning will stop if this stage is set}
|
|
|
|
|
|
int Property respawnTimeMin = 5 Auto
|
|
{min time between death and respawn}
|
|
|
|
int Property respawnTimeMax = 10 Auto
|
|
{max time between death and respawn}
|
|
|
|
int Property respawnPool = 0 Auto
|
|
{how many NPCs can be respawned?
|
|
0 = infinite
|
|
}
|
|
|
|
int respawnCount = 0
|
|
;how many NPCs have been respawned?
|
|
|
|
|
|
; this will always respawn (ignores all the checks and waits)
|
|
; (this is what TryToRespawn calls when ready to respawn)
|
|
function Respawn(ReferenceAlias aliasToRespawn)
|
|
; respawn me and force me into my alias
|
|
; totally unnecessary but nice randomization of which point to choose
|
|
int startingRoll = RandomInt(1, 3)
|
|
; traceConditional(self + " rolling for respawn spot... " + startingRoll, debugFlag.value)
|
|
ObjectReference marker
|
|
if startingRoll == 1
|
|
marker = GetRespawnMarker(RespawnMarker1, RespawnMarker2, RespawnMarker3)
|
|
elseif startingRoll == 2
|
|
marker = GetRespawnMarker(RespawnMarker2, RespawnMarker3, RespawnMarker1)
|
|
else
|
|
marker = GetRespawnMarker(RespawnMarker3, RespawnMarker1, RespawnMarker2)
|
|
endif
|
|
; traceConditional(self + " respawning at " + marker, debugFlag.value)
|
|
|
|
; only respawn if current alias is actually dead
|
|
if aliasToRespawn.GetActorReference().IsDead()
|
|
aliasToRespawn.ForceRefTo(marker.PlaceAtMe( aliasToRespawn.GetActorReference().GetActorBase() ) )
|
|
; traceConditional(self + " Respawn done", debugFlag.value)
|
|
else
|
|
; traceConditional(self + " Didn't respawn - current actor isn't dead!", debugFlag.value)
|
|
endif
|
|
endFunction
|
|
|
|
; call this when you want to try to respawn
|
|
function TryToRespawn(ReferenceAlias aliasToRespawn)
|
|
; traceConditional(self + " Respawn called by " + aliasToRespawn, debugFlag.value)
|
|
if ( startStage == 0 || (startStage > 0 && IsStageDone(startStage)) ) && ( doneStage == 0 || ( doneStage > 0 && !IsStageDone(doneStage) ) ) && ( respawnPool == 0 || (respawnPool > 0 && respawnCount < respawnPool ) )
|
|
respawnCount = respawnCount + 1
|
|
; wait for respawn time
|
|
; traceConditional(self + " Waiting to respawn...", debugFlag.value)
|
|
Wait( RandomInt(respawnTimeMin, respawnTimeMax) )
|
|
; traceConditional(self + " Finding a respawn spot", debugFlag.value)
|
|
if (aliasToRespawn as defaultAliasRespawnScript).bRespawningOn
|
|
Respawn(aliasToRespawn)
|
|
else
|
|
; traceConditional(self + " Didn't respawn " + aliasToRespawn + " - current actor no longer set to respawn", debugFlag.value)
|
|
endif
|
|
endif
|
|
endFunction
|
|
|
|
ObjectReference function GetRespawnMarker(ObjectReference marker1, ObjectReference marker2, ObjectReference marker3)
|
|
; find a spot the player can't see
|
|
actor playerActor = (Game.GetForm(0x14) as Actor) as actor
|
|
|
|
if marker1 && playerActor.HasLOS(marker1) == False
|
|
return marker1
|
|
elseif marker2 && playerActor.HasLOS(marker2) == False
|
|
return marker2
|
|
elseif marker3 && playerActor.HasLOS(marker3) == False
|
|
return marker3
|
|
else
|
|
return RespawnMarkerFailsafe
|
|
endif
|
|
|
|
endFunction
|
|
|
|
GlobalVariable Property debugFlag Auto
|
|
{optional - set a global to turn on debug trace
|
|
messages}
|