enderalse/source/scripts/_00e_a0_myradflightcontrolquest.psc

478 lines
14 KiB
Plaintext

Scriptname _00E_A0_MyradFlightControlQuest extends Quest
Actor Property player auto hidden
Actor Property Myrad auto hidden
Actor Property CameraActor auto hidden
ReferenceAlias Property EVENTleaveFurniture Auto
ReferenceAlias Property EVENTlandingApproach Auto
ReferenceAlias Property EVENTreturnHome Auto
ReferenceAlias Property EVENTreturnHome01 Auto
ReferenceAlias Property EVENTreturnHome02 Auto
ReferenceAlias Property EVENTplayerWalkAway Auto
objectReference Property PlayerGoal Auto hidden
objectReference Property CamSpawn Auto hidden
objectReference Property PlayerLure Auto hidden
objectReference Property Home Auto hidden
objectReference Property FakeSit Auto hidden
Idle Property groundMountDragonIdle Auto
Idle Property IdleWebExit Auto
Idle Property IdleDrunk Auto
Idle Property grounddismountdragonNPC Auto
Idle Property grounddismountdragon Auto
ImpactDataSet Property FXDragonTakeoffImpactSet Auto
ImpactDataSet Property FXDragonLandingImpactSet Auto
ImageSpaceModifier Property IMODfadeOut Auto
ImageSpaceModifier Property IMODpitchBlack Auto
ImageSpaceModifier Property IMODtakeOff Auto
ImageSpaceModifier Property IMODtakeOffDOF Auto
ImageSpaceModifier Property IMODflying Auto
ImageSpaceModifier Property IMODtakeLand Auto
ImageSpaceModifier Property IMODdizzy Auto
Sound Property SFXmyradSoftHowl Auto
Sound Property SFXmyradRoadDistant Auto
Sound Property SFXflyBy Auto
Sound Property SFXwindLP Auto
Sound Property SFXplayerDrop Auto
Explosion Property PuffoffSmoke Auto
Explosion Property PuffoffDragonSmoke Auto
VisualEffect Property CameraFXstart Auto
VisualEffect Property CameraFXstart02 Auto
VisualEffect Property CameraFXloop Auto
GlobalVariable Property MyradIsFlying Auto
GlobalVariable Property FlightRoute Auto
import GAME
import UTILITY
int Property SoundID01 Auto hidden
int Property SoundID02 Auto hidden
Float Property SoundID01volume Auto hidden
Float Property DELAYrefreshCameraFX Auto hidden
Float Property DELAYcinematicEnd Auto hidden
Float Property ReturnAV Auto hidden
bool Property LandingApproach Auto hidden
bool Property Rollercoaster Auto hidden
Event OnINIT()
player = Game.GetForm(0x14) as Actor
ENDevent
Keyword Property LinklandingApproach Auto
Keyword Property LINKlandingCamera Auto
Keyword Property LINKlandingPlayerMarker Auto
Keyword Property LINKlandingMarker Auto
objectReference Property ApproachBoogie Auto hidden
objectReference Property LandingZone Auto hidden
objectReference Property LandingCinematicCamera Auto hidden
objectReference Property LandingCinematicPlayerGoal Auto hidden
;====================================================================
Function CallMyrad(actor INCOMING, int FlightNumber)
;====================================================================
{Called by: any source}
if FlightNumber == 1
RollerCoaster = false
else
RollerCoaster = false
endif
Myrad = INCOMING
ApproachBoogie = Myrad.GetLinkedRef(LinkLandingApproach)
LandingCinematicCamera = Myrad.GetLinkedRef(LINKlandingCamera)
LandingCinematicPlayerGoal = Myrad.GetLinkedRef(LINKlandingPlayerMarker)
CamSpawn = LandingCinematicCamera
PlayerGoal = LandingCinematicPlayerGoal
Home = Myrad.getLinkedRef()
FlightRoute.setValue(FlightNumber)
Myrad.SetHeadTracking(false)
registerForAnimationEvent(Myrad, "DragonLandEffect")
registerForAnimationEvent(Myrad, "DragonForcefulLandEffect")
SFXmyradSoftHowl.play(Myrad)
MyradIsFlying.setValue(50)
; -------------------------- Are-we-sitting-and-flying-at-the-same-time-again???-failsave(TM)
if Myrad.GetFlyingState() != 0 && Myrad.getSitState() != 0
Myrad.setPosition(Myrad.getPositionX(), Myrad.getPositionY(), Myrad.getPositionZ() +256)
debug.sendAnimationEvent(Myrad, "FlyStartHover")
Myrad.SetAllowFlying(false)
Myrad.SetForcedLandingMarker(Home)
Myrad.SetAllowFlying(false)
wait(3)
endif
; -----------------------------------------------------------------------------------------
myrad.evaluatePackage()
EVENTleaveFurniture.forceRefTo(Myrad)
LandingApproach = false
ENDfunction
Function MountMyrad()
{Called by: onActivate, _00E_A0_MyradFlightAliasMyrad}
SetInChargen(true, true, true)
ReturnAV = player.getAv("Health")
player.modAv("health", 1000000)
IMODfadeOut.apply()
wait(1.5)
ForceThirdPerson()
IMODtakeOffDOF.apply()
ForceThirdPerson()
Myrad.PlayIdleWithTarget(groundMountDragonIdle, player)
wait(4)
shakeCamera(afStrength = 1, afDuration = 1)
IMODtakeOff.apply()
SFXmyradSoftHowl.play(Myrad)
SFXflyBy.play(myrad)
wait(1)
shakeCamera(afStrength = 0.5, afDuration = 2)
SFXmyradRoadDistant.play(player)
wait(2.5)
IMODfadeOut.apply()
wait(1.5)
IMODpitchBlack.apply()
IMODflying.apply()
CameraFXstart.Play(myrad, 3)
CameraFXstart02.Play(myrad, 2)
DELAYrefreshCameraFX = getCurrentRealTime() +5
myrad.disable(0)
myrad.SetAllowFlying(true)
myrad.enable(0)
wait(0.2)
myrad.setAlpha(0)
player.setAlpha(0)
wait(0.2)
MyradIsFlying.setValue(100)
EVENTleaveFurniture.clear()
myrad.evaluatePackage()
debug.sendAnimationEvent(player, "IdleCartExitInstant")
player.setAngle(0, 0, player.getHeadingAngle(Myrad)+player.getAngleZ())
wait(0.25)
player.SetAllowFlying(true)
player.SetVehicle(myrad as objectreference)
debug.sendAnimationEvent(player, "IdleCartTravelPlayerEnterInstant")
SetCameraTarget(Myrad)
FadeOutGame(false, true, 0, 3)
IMODtakeOff.apply()
EVENTlandingApproach.forceRefTo(Myrad)
Myrad.evaluatePackage()
registerForUpdate(0.5)
loading()
ENDfunction
bool isLoading
EVENT OnUpdate()
if ! myrad
return
endif
if myrad.GetFlyingState() != 0 && myrad.GetFlyingState() != 4 && isLoading == False
if getCurrentRealTime() > DELAYrefreshCameraFX
CameraFXloop.Play(myrad, 11)
DELAYrefreshCameraFX = getCurrentRealTime() +10
endif
player.translateTo(Myrad.getPositionX() +4096 * Math.sin(Myrad.getAngleZ()), Myrad.getPositionY() +4096 * Math.cos(Myrad.getAngleZ()),Myrad.getPositionZ() +1024,0,0,0, 3000)
elseif myrad.GetFlyingState() == 4
If LandingApproach == false
CameraFXloop.stop(myrad)
registerForAnimationEvent(Myrad, "DragonLandEffect")
registerForAnimationEvent(Myrad, "DragonForcefulLandEffect")
IMODtakeOff.apply()
LandingApproach = true
endif
while SoundID01volume > 0
SoundID01volume = SoundID01volume -(0.025)
Sound.SetInstanceVolume(SoundID01, SoundID01volume)
Sound.SetInstanceVolume(SoundID02, SoundID01volume)
endWhile
elseif myrad.GetFlyingState() == 0
endif
ENDevent
EVENT onAnimationEvent(objectReference deliverator, string eventName)
if (eventName == "DragonLandEffect")
Myrad.PlayImpactEffect(FXDragonTakeoffImpactSet, "NPC Pelvis", 0, 0, -1, 512)
if MyradIsFlying.getValue() == 100
SFXflyBy.play(myrad)
shakeCamera(afStrength = 1, afDuration = 1.5)
IMODtakeLand.apply()
IMODflying.remove()
DismountMyrad()
unregisterForAnimationEvent(Myrad, "DragonLandEffect")
else
shakeCamera(afStrength = 1, afDuration = 0.45)
unregisterForAnimationEvent(Myrad, "DragonLandEffect")
endif
elseIf (eventName == "DragonForcefulLandEffect")
Myrad.PlayImpactEffect(FXDragonLandingImpactSet, "NPC Pelvis", 0, 0, -1, 512)
if MyradIsFlying.getValue() == 100
SFXflyBy.play(myrad)
shakeCamera(afStrength = 1, afDuration = 1.5)
IMODtakeLand.apply()
IMODflying.remove()
DismountMyrad()
unregisterForAnimationEvent(Myrad, "DragonForcefulLandEffect")
else
shakeCamera(afStrength = 1, afDuration = 0.45)
unregisterForAnimationEvent(Myrad, "DragonForcefulLandEffect")
endif
elseIf (eventName == "DragonTakeoffEffect")
Myrad.PlayImpactEffect(FXDragonTakeoffImpactSet, "NPC Tail8", 0, 0, -1, 2048)
shakeCamera(afStrength = 1, afDuration = 0.5)
SFXmyradSoftHowl.play(Myrad)
SFXflyBy.play(myrad)
myrad.placeAtme(PuffoffDragonSmoke)
IMODtakeLand.apply()
unregisterForAnimationEvent(Myrad, "DragonTakeoffEffect")
endif
ENDevent
Function DismountMyrad()
unregisterForUpdate()
if CamSpawn == none
CameraActor = Myrad.placeAtme(game.getForm(0x00032368)) as actor
wait(0.1)
CameraActor.Setposition(Myrad.getPositionX() +500 * Math.sin(Myrad.getAngleZ()), Myrad.getPositionY() +500 * Math.cos(Myrad.getAngleZ()), Myrad.getPositionZ())
else
CameraActor = CamSpawn.placeAtme(game.getForm(0x00032368)) as actor
wait(0.1)
CameraActor.setAngle(CamSpawn.getAngleX(), CamSpawn.getAngleY(), CamSpawn.getAngleZ())
endif
if PlayerGoal == none
PlayerLure = Myrad.placeAtme(game.getForm(0x000bfb04))
wait(0.1)
PlayerLure.Setposition(Myrad.getPositionX() +600 * Math.sin(Myrad.getAngleZ()), Myrad.getPositionY() +600 * Math.cos(Myrad.getAngleZ()), Myrad.getPositionZ())
else
PlayerLure = PlayerGoal.placeAtme(game.getForm(0x000bfb04))
endif
player.SetAllowFlying(false)
player.SetVehicle(none)
registerForAnimationEvent(Myrad, "DragonTakeoffEffect")
Sound.StopInstance(SoundID01)
Sound.StopInstance(SoundID02)
wait(0.5)
IMODfadeOut.apply()
wait(1.5)
IMODpitchBlack.apply()
player.setPosition(Myrad.getPositionX() +150 * Math.sin(Myrad.getAngleZ()), Myrad.getPositionY() +150 * Math.cos(Myrad.getAngleZ()), Myrad.getPositionZ()) ;LZplayerSpawn
debug.sendAnimationEvent(player, "IdleCartExitInstant")
player.setAlpha(1)
Myrad.setAlpha(1)
game.DisablePlayerControls(abMovement = true, abFighting = true, abCamSwitch = true, \
abLooking = true, abSneaking = true, abMenu = true, abActivate = true, abJournalTabs = true)
SetCameraTarget(CameraActor)
wait(0.25)
if RollerCoaster == true
Myrad.SetHeadTracking(true)
Myrad.setLooKAt(player)
PreparePlayerToGetKicked()
else
if CameraActor.hasLOS(player) == 0
CameraActor.setAngle(CameraActor.getAngleX(), CameraActor.getAngleY(), CameraActor.getHeadingAngle(player) + CameraActor.getAngleZ())
endif
FadeOutGame(false, true, 0, 0.5)
IMODpitchBlack.remove()
CameraActor.translateTo(CameraActor.getPositionX(), CameraActor.getPositionY(), CameraActor.getPositionZ() -(64), 0,0, CameraActor.getHeadingAngle(player)+CameraActor.getAngleZ(), 2)
setplayerAiDriven(true)
EVENTplayerWalkAway.forceRefTo(player)
player.evaluatePackage()
checkPos = player.getPositionX()
ForceMovement()
endif
ENDfunction
float checkpos
; ----------------------------------------------------------- Rollercoaster End
function PreparePlayerToGetKicked()
if player.getSitState() == 0
Debug.sendAnimationEvent(player, "IdleWebEnterInstant")
player.setActorValue("Variable03", 5)
wait(0.25)
PreparePlayerToGetKicked()
else
ThrowOffPlayer()
endif
ENDfunction
function ThrowOffPlayer()
if player.playidle(IdleWebExit) == 0
player.playidle(IdleWebExit)
wait (0.15)
ThrowOffPlayer()
else
if CameraActor.hasLOS(player) == 0
CameraActor.setAngle(CameraActor.getAngleX(), CameraActor.getAngleY(), CameraActor.getHeadingAngle(player) + CameraActor.getAngleZ())
endif
SFXplayerDrop.play(player)
FadeOutGame(false, true, 0, 0.5)
IMODpitchBlack.remove()
wait(0.15)
shakeCamera(afStrength = 0.45, afDuration = 0.5)
player.placeAtme(PuffoffSmoke)
player.placeAtme(PuffoffSmoke)
wait(0.15)
CameraActor.translateTo(CameraActor.getPositionX(), CameraActor.getPositionY(), CameraActor.getPositionZ() -(64), 0,0, CameraActor.getHeadingAngle(player)+CameraActor.getAngleZ(), 2)
player.setLooKAt(player)
wait(0.25)
WaitForDropIdleToFinishAndFunctionNamesAreGettingBetter()
endif
ENDfunction
function WaitForDropIdleToFinishAndFunctionNamesAreGettingBetter()
if player.getSitState() == 0
player.setActorValue("Variable03", 0)
GoDizzy()
else
wait(0.25)
WaitForDropIdleToFinishAndFunctionNamesAreGettingBetter()
endif
ENDfunction
function GoDizzy()
if player.playidle(IdleDrunk) == 0
player.playidle(IdleDrunk)
debug.notification("DRUNK")
wait(0.15)
GoDizzy()
else
setplayerAiDriven(true)
EVENTplayerWalkAway.forceRefTo(player)
player.evaluatePackage()
checkPos = player.getPositionX()
ForceMovement()
endif
ENDfunction
; -----------------------------------------------------------
function ForceMovement()
if player.getPositionX() == checkPos
player.evaluatePackage()
wait(0.25)
ForceMovement()
else
if RollerCoaster == true
wait(3)
else
wait(0.5)
Myrad.SetHeadTracking(true)
Myrad.setLooKAt(player)
wait(1.25)
endif
FlightRoute.setValue(0)
MyradIsFlying.setValue(0)
EVENTreturnHome.forceRefTo(Myrad)
Myrad.evaluatePackage()
Myrad.clearLookAt()
wait(0.75)
gotoState("FIN")
if RollerCoaster == true
DELAYcinematicEnd = getCurrentRealTime() +7
else
DELAYcinematicEnd = getCurrentRealTime() +5
endif
registerForUpdate(0.25)
endif
ENDfunction
function Loading()
isLoading = true
player.SetAllowFlying(false)
player.SetVehicle(none)
SetCameraTarget(player)
myrad.disable(0)
wait(0.1)
SFXmyradRoadDistant.play(player)
player.moveTo(ApproachBoogie)
SFXmyradRoadDistant.play(player)
wait(0.1)
game.DisablePlayerControls(abMovement = true, abFighting = true, abCamSwitch = true, \
abLooking = true, abSneaking = true, abMenu = true, abActivate = true, abJournalTabs = true)
SetHudCartMode(true)
Myrad.moveTo(ApproachBoogie)
wait(0.1)
myrad.enable(0)
SetCameraTarget(Myrad)
myrad.setAlpha(0)
myrad.evaluatePackage()
FadeOutGame(false, true, 2, 3.5)
IMODtakeOff.apply()
IMODpitchBlack.remove()
wait(0.2)
myrad.evaluatePackage()
isLoading = false
SoundID01volume = 1
SoundID02 = SFXwindLP.Play(Myrad)
Sound.SetInstanceVolume(SoundID02, SoundID01volume)
ENDfunction
state FIN
Event OnUpdate()
if getCurrentRealTime() > DELAYcinematicEnd || player.getDistance(playerLure) < 200
unregisterforUpdate()
gotoState ("NULL")
IMODfadeOut.apply()
SFXmyradRoadDistant.play(Myrad)
player.ResetHealthAndLimbs()
wait(1.5)
EVENTplayerWalkAway.clear()
player.FORCEAV("health", ReturnAV)
SetCameraTarget(player)
enableplayercontrols()
SetHudCartMode(false)
SetInChargen(false, true, false)
setplayerAiDriven(false)
debug.sendAnimationEvent(player, "IdleCartExitInstant")
EVENTplayerWalkAway.clear()
wait(0.25)
CamSpawn = none
PlayerGoal = none
CameraActor.delete()
PlayerLure.delete()
endif
ENDevent
ENDstate