Files
gtav-src/script/dev_ng/singleplayer/scripts/RandomChar/Paparazzo/Paparazzo1.sc
T
2025-09-29 00:52:08 +02:00

11904 lines
658 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Paparazzo1.sc
// AUTHOR : Ahron Mason
// DESCRIPTION : Car chase where Franklin drives for a Paparazzi photographer
// named Beverly, so he can get some photos of a celebrity.
//
// *****************************************************************************************
// *****************************************************************************************
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
USING "initial_scenes_Paparazzo.sch" //needed for call to SetupScene_PAPARAZZO_1 to setup scene again when z / p skipping back to start of the mission
USING "lineactivation.sch"
USING "taxi_functions.sch"
USING "commands_recording.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
#ENDIF
//-------------------------------------------------------------------------------------------------------------------------------------------------
// CONSTANTS FOR UBER PLAYBACK
//USING "traffic_default_values.sch" // this must be included before traffic.sch NOTE: when using uber, revert to below Constants instead
// total should not exceed 225
CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 105
CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 70
CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 50
// total should not exceed 12
CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 20
CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 4
CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 5
USING "traffic.sch"
//-------------------------------------------------------------------------------------------------------------------------------------------------
// ENUMS:
//-------------------------------------------------------------------------------------------------------------------------------------------------
/// PURPOSE: Mission stages
ENUM MISSION_STAGE
MISSION_STAGE_INTRO_MOCAP_SCENE, //breaks P skip if this is declared but not in use
MISSION_STAGE_CHASE_CELEB_IN_VEHICLE,
MISSION_STAGE_RIVAL_PAP_JOIN_CHASE,
MISSION_STAGE_STOP_RIVAL_PAP,
MISSION_STAGE_DROP_BEVERLY_OFF,
MISSION_STAGE_END_CUTSCENE,
MISSION_STAGE_MISSION_PASSED,
//Additional stages
MISSION_STAGE_LOSE_THE_COPS,
MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE,
//debug stages
MISSION_STAGE_DEBUG_RECORD_CHASE_ROUTE,
MISSION_STAGE_DEBUG_PLAYBACK_CHASE_ROUTE,
MISSION_STAGE_DEBUG
ENDENUM
/// PURPOSE: each mission stage uses these substages
ENUM SUB_STAGE
SS_SETUP,
SS_UPDATE,
SS_CLEANUP
ENDENUM
/// PURPOSE: fail conditions
ENUM FAILED_REASON_ENUM
FAILED_DEFAULT = 0,
FAILED_CELEB_DIED,
FAILED_CELEB_ESCAPED,
FAILED_PLAYER_ATTACKED_CELEB,
//FAILED_PLAYER_ATTACKED_BEVERLY,
FAILED_BEVERLY_VEHICLE_WRECKED,
FAILED_BEVERLY_DIED,
FAILED_PAP_ESCAPED,
FAILED_LEFT_BEVERLY_BEHIND,
FAILED_BEVERLY_SPOOKED
ENDENUM
/// PURPOSE: States in Beverly taking photos of the celeb state
ENUM PAP1_BEVELRY_TAKE_PHOTO_STATE
PAP1_BTPS_SETUP,
PAP1_BTPS_TAKING_PHOTO,
PAP1_BTPS_SUCCESSFUL_PHOTO,
PAP1_BTPS_SETUP_CHECKING_PHOTO,
PAP1_BTPS_CHECKING_PHOTO,
PAP1_BTPS_FINISHED_CHECKING_PHOTO
ENDENUM
/// PURPOSE: States in the Road Rash style attack
ENUM KNOCKOFF_BIKE_ATTACK_STATE
KBAS_SETUP_ATTACK,
KBAS_CHARGING_ATTACK,
KBAS_RUNNING_ATTACK,
KBAS_SUCCESSFUL_ATTACK,
KBAS_CLEANUP_ATTACK
ENDENUM
/// PURPOSE: Player on Bev's bike states
ENUM PAP1_PLAYER_TRANSPORT_STATE_ENUM
PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV,
PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE,
PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY
ENDENUM
/// PURPOSE: states for Miranda playing her shooting up animations
ENUM PAP1_PED_SHOOTING_UP_PROGRESS
PAP1_PED_SHOOTING_UP_SETUP,
PAP1_PED_SHOOTING_UP_UPDATE,
PAP1_PED_SHOOTING_UP_CLEANUP
ENDENUM
ENUM PAP1_RIVAL_PAP_ON_BIKE_PROGRESS
PAP1_RIVAL_PAP_ON_BIKE_TRIGGER_JOIN_CHASE,
PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA,
PAP1_RIVAL_PAP_ON_BIKE_GO_TO_INITIAL_FLEE_POSITION,
PAP1_RIVAL_PAP_ON_BIKE_WANDER_BEHAVIOUR,
PAP1_RIVAL_PAP_ON_BIKE_CLEANUP
ENDENUM
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :STRUCTS
//-------------------------------------------------------------------------------------------------------------------------------------------------
// used by scripted vehicles on the mission
STRUCT STRUCT_MISSION_VEHICLE
VEHICLE_INDEX vehicle
MODEL_NAMES model
BLIP_INDEX blip
VECTOR vSpawn
FLOAT fSpawnHeading
ENDSTRUCT
//used by scripted peds on the mission
STRUCT STRUCT_MISSION_PED
PED_INDEX ped
MODEL_NAMES model
BLIP_INDEX blip
VECTOR vSpawn
FLOAT fSpawnHeading
ENDSTRUCT
//used by scripted objects on the mission
STRUCT STRUCT_OBJECT
OBJECT_INDEX object
VECTOR vPosition
VECTOR vOffset
VECTOR vRotation
MODEL_NAMES model
ENDSTRUCT
STRUCT PAP1_SHAPE_TEST_CAMERA_AIM
SHAPETEST_INDEX mShapeTest
VECTOR vCheckPos
VECTOR vStartPos
BOOL bActive
#IF IS_DEBUG_BUILD
VECTOR vStartPosDebug
VECTOR vEndPosDebug
#ENDIF
ENDSTRUCT
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :CONSTANTS
//-------------------------------------------------------------------------------------------------------------------------------------------------
CONST_FLOAT CLOSE_ENOUGH_TO_TAKE_PHOTO_DISTANCE 3.5
CONST_FLOAT CLOSE_ENOUGH_FOR_BEVERLY_KNOCK_OFF_DISTANCE 0.8 // 1.2
CONST_FLOAT KNOCKOFF_BIKER_ATTACK_HIT_EXECUTION_ZONE_WIDTH 1.6
CONST_FLOAT BEVERLY_KO_PAP_ZONE_START_ANIM_WIDTH 1.6
CONST_FLOAT PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK 0.93 // 1.0 reduced overall base speed by 7% for imran bug 363264
CONST_FLOAT UBER_PLAYBACK_TIME_RIVAL_PAP_JOIN_CHASE_STAGE 56000.000 //switch stages at this point in the recording
CONST_FLOAT UBER_PLAYBACK_TIME_FOR_TRIGGER_RIVAL_PAP_RECORDING 60550.0 //rival pap trigger time
CONST_FLOAT UBER_PLAYBACK_TIME_STOP_RIVAL_PAP_STAGE 75250.0 //74615.5 //switch stages at this point in the recording
CONST_FLOAT BIKE_TOP_SPEED_MODIFIER -8.0
CONST_FLOAT KO_BIKER_START_ATTACK_HEADING_THRESOLD 0.4
CONST_FLOAT KO_BIKER_EXECUTE_ATTACK_HEADING_THRESOLD 0.5
CONST_FLOAT SHAPE_TEST_PAP1_CAMERA_AIM_PROBE_HIT_DIST 1.3 //half car width 1.5 // size for actual ped position in rear passenger seat
CONST_FLOAT SHAPE_TEST_PAP1_CAMERA_AIM_VIEW_CONE 90.0 // 50.0 increased since this was often cause the check to fail when it looked as though it should register.
CONST_FLOAT PAP1_RIVAL_PAP_END_RECORDING_POINT 21000.0
CONST_FLOAT PAP1_CELEB_CHASE_BLIP_FLASH_PERCENTAGE 0.68 // targets blip flashes when he gets further than this percentage away to CELEB_ESCAPED_DIST
CONST_FLOAT PAP1_RIVAL_PAP_CHASE_BLIP_FLASH_PERCENTAGE 0.65 // targets blip flashes when he gets further than this percentage away to RIVAL_PAP_ESCAPED_DIST
CONST_INT CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD 10 // grace period in frame count for can ped see ped tests
CONST_INT PLAYER_LEFT_BEVERLY_DISTANCE 60
CONST_INT BEVERLY_LEAVE_PLAYER_GROUP_DISTANCE 20
CONST_INT BEVERLY_REJOIN_PLAYER_GROUP_DISTANCE 8
CONST_INT CLOSE_TO_RIVAL_PAP_CAM_CUTSCENE_TRIGGER_DIST 28
CONST_INT CLOSE_ENOUGH_FOR_PLAYER_RIVAL_CONVO 35
CONST_INT CELEB_ESCAPED_DIST 225
CONST_INT RIVAL_PAP_ESCAPED_DIST 220
CONST_INT TOTAL_TOOK_PHOTO_DIALOGUE 6
CONST_INT TOTAL_CHASE_RIVAL_PAP_DIALOGUE 3
CONST_INT TOTAL_BEVERLY_TAKE_PHOTOS_AREAS 2
CONST_INT TOTAL_KNOCK_OFF_BIKER_ZONES 2
CONST_INT TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE 3000
CONST_INT TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE_LONG 10000
CONST_INT TIMER_TILL_RIVAL_PAP_FLEES 6000
CONST_INT DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE 20
CONST_INT DIST_LIMIT_PLAYER_CLOSE_DIST_TO_RIVAL_PAP_IN_CHASE 12
CONST_INT DIST_LIMIT_PLAYER_MEDIUM_DIST_TO_RIVAL_PAP_IN_CHASE 25
CONST_INT DIST_LIMIT_PLAYER_CLOSE_TO_CELEB_IN_CHASE_FOR_DIALOGUE 75
CONST_INT TIME_DELAY_STOP_PLAYER_VEHICLE_RECORDING_FOR_STAGE_SKIP 2000
CONST_INT TIME_DELAY_FOR_REPEATED_BEVERLY_FRUSTRATED_ANIM 3000
CONST_INT KNOCKOFF_BIKER_ATTACK_SIDE_NULL -1
CONST_INT KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT 0
CONST_INT KNOCKOFF_BIKER_ATTACK_SIDE_LEFT 1
CONST_INT FINISH_UBER_RECORDING_EARLY_TIME 80132
CONST_INT CP_PAP1_CHASE_CELEB_IN_VEHICLE 0
CONST_INT CP_PAP1_STOP_RIVAL_PAP 1
CONST_INT CP_PAP1_DROP_BEVERLY_OFF 2
CONST_INT CP_PAP1_MISSION_PASSED 3
CONST_INT Z_SKIP_INTRO 0
CONST_INT Z_SKIP_CHASE_CELEB_IN_VEHICLE 1
CONST_INT Z_SKIP_ENTER_RIVAL_PAP 2
CONST_INT Z_SKIP_STOP_RIVAL_PAP 3
CONST_INT Z_SKIP_DROP_BEVERLY_OFF 4
CONST_INT Z_SKIP_OUTRO 5
CONST_INT Z_SKIP_MISSION_PASSED 6
CONST_INT NUM_PAP1_SHAPE_TESTS 4
CONST_INT SHAPETEST_PAP1_ID_INITIAL_TEST 0
CONST_INT SHAPETEST_PAP1_ID_SECONDARY_TEST 1
CONST_INT GRACE_PERIOD_FRAMES_LAST_SUCCESSFUL_SHAPE_TEST_CAMERA_AIM 8
CONST_INT PAP1_MAX_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE 2
CONST_INT REPLAY_PHOTOS_TAKEN 0 //index to replay array
CONST_INT PAP1_MUSIC_EVENT_START 0 // Music cue
CONST_INT PAP1_MUSIC_EVENT_BIKE 1 // Music cue
CONST_INT PAP1_MUSIC_EVENT_RIVAL 2 // Music cue
CONST_INT PAP1_MUSIC_EVENT_STOP_TO_RADIO 3 // Music cue
CONST_INT PAP1_MUSIC_EVENT_RESET_AUDIO_FLAG 4 // Music cue
CONST_INT PAP1_MUSIC_EVENT_FAIL 5 // Music cue
CONST_INT PAP1_MUSIC_EVENT_MAX 6 // Max number of Music cue
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :VARIABLES:
//-------------------------------------------------------------------------------------------------------------------------------------------------
MISSION_STAGE eMissionStage = MISSION_STAGE_INTRO_MOCAP_SCENE // MISSION_STAGE_INTRO_MOCAP_SCENE MISSION_STAGE_DEBUG MISSION_STAGE_DEBUG_RECORD_CHASE_ROUTE MISSION_STAGE_DEBUG_PLAYBACK_CHASE_ROUTE
MISSION_STAGE eMissionSkipTargetStage //used in mission checkpoint setup and debug stage skipping
SUB_STAGE eSubStage = SS_SETUP
g_structRCScriptArgs sRCLauncherDataLocal
#IF IS_DEBUG_BUILD // stage skipping
CONST_INT MAX_SKIP_MENU_LENGTH 7
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
#ENDIF
BOOL bAreEntitiesHeadingsCompleteOpposite_KO_Biker
BOOL bBeverly_SpottedRivalPap_Anim
BOOL bBeverly_InitialPointAtCeleb_Anim
BOOL bDoDelayForPhotoTaken
BOOL bDoneDialogue_BeverlyTookPhoto[TOTAL_TOOK_PHOTO_DIALOGUE]
BOOL bDoneDialogue_BeverlySayKeepBike
BOOL bDoneDialogue_DropOffBeverly
BOOL bDoneDialogue_DropOffBeverlyAdditionalChat
BOOL bDoneDialogue_InitialChaseDialogue
BOOL bDoneDialogue_InitialGetOnBike
BOOL bDoneDialogue_LoseTheCops_InitialChat
BOOL bDoneDialogue_RivalPapCameraDestroyed
BOOL bDoneDialogue_RivalPapTookPhoto[TOTAL_CHASE_RIVAL_PAP_DIALOGUE]
BOOL bDoneDialogue_FailWarningAttackMiranda
BOOL bDoneDialogue_BeverlyMissedKnockOffAttempt
BOOL bDoneDialogue_BeverlyThrowsPunch
BOOL bDoneDialogue_PlayerPullsWheelie
BOOL bDoneDialogue_MissionFailed
BOOL bDoneDialogue_FranklinRespondToBeverlyBerating
BOOL bDoneHintCamForRival
BOOL bDoneObjective_DropBeverlyOff
BOOL bDoneObjective_GetBackOnBike
BOOL bDoneObjective_GetCloseToCeleb
BOOL bDoneObjective_GetOnBike
BOOL bDoneObjective_LoseTheCops
BOOL bDoneObjective_ReturnToBeverly
BOOL bDoneObjective_StopTheRivalPaparazzi
BOOL bDoneRivalPapFlee
BOOL bDoneRivalPapRemovedFromDialogue
BOOL bDoneRivalPapSurrendered
BOOL bDoneSetupCelebForCleanup
BOOL bDoneSetupRivalPapDriverToActInjured
BOOL bDoneWaitForCameraDestroyedDialogue
BOOL bDone_KnockOff_Biker_SwipeSoundFX
BOOL bDone_ShowSpecialAbilityHelp
BOOL bFinishedStageSkipping = TRUE //used to determine if we are mission replay checkpoint skipping or debug skipping
BOOL bLoadedWorldForStageSkipping = FALSE // flag to say if we haveloaded the world around the player when stage skipping
BOOL bHasBeverlyBeenRemovedFromPlayerGroup
BOOL bHadToFadeOutToLoadMissionAssets
BOOL bHasPlayerGotOnBike_FirstTime
BOOL bPausedDialogue_DropOffBeverly
BOOL bStatTracker_HasBeverlyMissedWithSwing
BOOl bHasPlayerShotRivalPapOffBike
BOOL bUseNewCelebChaseRubberbanding = TRUE // NOTE: not currently reset in INIT_MISSION!
BOOL bHasSetExitStateFromIntroMocapForGameplayCam
BOOL bPlayerNeedsHelmentRestoreAfterOutroMocap
BOOL bRequestedOutroMocap
BOOL bCheckForPlayerHelmetChange
BLIP_INDEX blipIndexDropOffPoint
CAMERA_INDEX camCutsceneFinish
CAMERA_INDEX camCutsceneStart
FAILED_REASON_ENUM eP1_MissionFailedReason
FLOAT fRivalBikeSpeed
FLOAT fCurrentChaseDistanceCeleb
FLOAT fCurrentPlaybackTime
FLOAT fDistance_PlayerToBeverly
FLOAT fDistance_PlayerToRivalPap
FLOAT fKnockOff_Biker_Anim_HitDonePoint
FLOAT fKnockOff_Biker_Anim_HitStartPoint
FLOAT fKnockOff_Biker_Anim_SwipeSFXstartPoint
FLOAT fKnockOff_Biker_Anim_TotalTime
FLOAT fKnockOff_Biker_HitExecutionArea_Length
FLOAT fKnockOff_Biker_InitialAnimSpeed
FLOAT fKnockOff_Biker_StartAnimWidthModifier
FLOAT fKnockOff_Biker_UpdatedAnimSpeed
FLOAT fMainPlaybackSpeed
FLOAT fTimeInRivalPapRecording
INT iCheckChaseSpeedTimer
INT iCheckForCelebtVehicleHornTimer
INT iCelebVehicleHornTime
INT iConsecutiveAimingTimer
INT iDialogueTimer_ChasingCeleb
INT iDialogueTimer_ChasingRivalPaparazzi
INT iDialogueTimer_LoseTheCopsAdditionalChat
INT iDialogueTimer_PlayerOffTheBike
INT iDialogueTimer_BevLeftBehind
INT iDialogueTimer_TakingLongTimeToReachDropOffPoint
INT iDialogueTimer_RivalPapAmbientLines
INT iFrameCountSinceLastSuccessfulShapeTestCameraAim
INT iGoodPhotosTakenCounter
INT iKnockOff_Biker_Attack_AnimSide
INT iKnockOff_Biker_Attack_Side
INT iNumFlashesForRivalCamera
INT iPreLoadRecordingsTimer
INT iRivalPapCameraFlashTimer
INT iRivalTakesPhotosBurst
INT iShapeTestCamerAimIndex_SetupThisFrame
INT iSoundId_BikeAttack_MeleeHit
INT iSoundId_BikeAttack_MeleeSwipe
INT iSoundId_CameraFlash
INT iTimerDelay_Progress_BevTakingPhotos
INT iTimerDelay_RivalPapGestureAnim
INT iTimerIncreaseCelebSpeedForPhotoTaken
INT iTimerTillRepeatBevFrustratedAnim
INT iTimer_DelayStopPlayerVehicleRecording_ForMissionStageSkip
INT iMissionMusicEventTriggerCounter
INT iTimer_DelayResetAudioFlag_AllowScoreAndRadio
INT iTimer_DelayBeverlyInitialTurnToFaceFranklin
INT iTimer_BeverlyBikeNotOnAllWheelsTimer
INT iCounter_BeverlyPhotoBurst
INT iMax_BeverlyPhotoBurst
INT iDelay_BeverlyPhotoBurst
INT iFrameCountBeverlyLastSeenPlayer
INT iStoredPlayerHelmetPropTextureIndex
INT iStoredPlayerHelmetPropIndex
INT iDialogueLines_RivalPapCameraWrecked
INT iScenarioBlockingAreaStage
INT iIntroFocusPushStage
INT iIntroFocusPushTimer
INT iDelayInitialChaseComment
KNOCKOFF_BIKE_ATTACK_STATE eKnockOffBikerAttackState
OBJECT_INDEX objTrafficLightWestBound, objTrafficLightEastBound // used to make the remaining traffic flow out the area
PAP1_BEVELRY_TAKE_PHOTO_STATE eBeverlyTakePhotoState
PAP1_PED_SHOOTING_UP_PROGRESS ePedShootingUpProgress
PAP1_RIVAL_PAP_ON_BIKE_PROGRESS eRivalPapOnBikeProgress
PAP1_PLAYER_TRANSPORT_STATE_ENUM ePlayerTransportState
PAP1_SHAPE_TEST_CAMERA_AIM mShapeTestCameraAim[NUM_PAP1_SHAPE_TESTS]
REL_GROUP_HASH relGroupFriendly
REL_GROUP_HASH relGroupEnemy
SCENARIO_BLOCKING_INDEX scenarioBlockingIntroArea
SCENARIO_BLOCKING_INDEX scenarioBlockingChaseRoute[PAP1_MAX_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE]
STRING sAnimDictName_Pap1Specific = "rcmpaparazzo1ig_2" //contains new pap attack anims, new camera script aim gun task anims, rival pap hit reactions, dialogue on bike anims
STRING sAnimDictName_Pap1HandOverride = "rcmpaparazzo1ig_1" // anim dict containing camera in hand override
STRING sSceneHandle_Franklin = "Franklin"
STRING sSceneHandle_Beverly = "Beverly"
STRING sSceneHandle_BeverlysCamera = "Beverlys_camera"
STRING sSceneHandle_BeverlysCameraFlash = "Camera_Flash"
STRING sSceneHandle_BeverlysVehicle = "PAP_Bike"
STRING sSceneHandle_MirandasVehicle = "Miranda_Car"
STRING sSceneHandle_Miranda = "Miranda"
STRING sSceneHandle_MirandasDriver = "Miranda_Bodyguard"
STRING sAnimNameBeverlyKnockOff = "atk_punch_left_pap"
STRING sAnimSet_BeverlyCameraWeaponMovementOnFoot = "RCM_Paparazzo"
STRING sPap1_AudioBank_CameraFlashSoundFX = "Distant_Camera_Flash"
STRING sPap1_Dialogue_TextBlockName = "PAP1AUD"
STRING sPap1_SoundSetName = "PAPARAZZO_01_SOUNDSET"
STRING sPap1_UberRecordingName = "Pap1U"
structPedsForConversation sDialogue
STRUCT_MISSION_PED sBeverlyPed
STRUCT_MISSION_PED sCelebPed
STRUCT_MISSION_PED sCelebsDriverPed
STRUCT_MISSION_PED sRivalPapPed
STRUCT_MISSION_PED sRivalPapDriverPed
STRUCT_MISSION_VEHICLE sBeverlyVehicle
STRUCT_MISSION_VEHICLE sCelebVehicle
STRUCT_MISSION_VEHICLE sRivalPapVehicle
STRUCT_OBJECT sObjCameraBeverly
STRUCT_OBJECT sObjFlashUnitBeverly
STRUCT_OBJECT sObjCameraRivalPap
STRUCT_OBJECT sObjFlashUnitRivalPap
STRUCT_OBJECT sObjSyringe
TEXT_LABEL_63 tlAnimName_BeverlyPoint = "point_45_left_pap"
TEXT_LABEL_23 tlPausedDialogue_DropOffBeverly = ""
TEXT_LABEL_23 tlDialogueRoot_MissionFailed = ""
TEXT_LABEL_23 tlAnimDict_BeverlyShoutComeOn = "rcmpaparazzo1ig_1_waive"
TEXT_LABEL_23 tlCurrentAnim_BeverlyShoutComeOn = "waive_comeback_f"
TEXT_LABEL_23 tlDialogueRoot_CameraDestroyed = ""
TEXT_LABEL_23 tlOutroMocapName = "PAP_1_MCS_1"
TEXT_LABEL_23 tlRivalPapInjuredAnims = "rcmpaparazzo1"
VECTOR vBevCameraLensOffset
VECTOR vCameraFlashFX_Offset
VECTOR vCelebPosInCarOffset
VECTOR vClearZone_DropOffPoint_Max
VECTOR vClearZone_DropOffPoint_Min
VECTOR vDropOffPoint
VECTOR vKnockOff_Biker_HitExecutionArea_PosFar
VECTOR vKnockOff_Biker_HitExecutionArea_PosNear
VECTOR vKnockOff_Biker_HitExecutionArea_OffsetFar[TOTAL_KNOCK_OFF_BIKER_ZONES]
VECTOR vKnockOff_Biker_HitExecutionArea_OffsetNear[TOTAL_KNOCK_OFF_BIKER_ZONES]
VECTOR vRivalPapCam_CutsceneTriggerPos
VECTOR vRivalPapDriver_InitialFleeDrivePoint
VECTOR vTakePhotoZones_CentrePos[TOTAL_BEVERLY_TAKE_PHOTOS_AREAS]
VECTOR vTakePhotoZones_CentrePosOffset[TOTAL_BEVERLY_TAKE_PHOTOS_AREAS]
VECTOR vPathNodeRequestMin
VECTOR vPathNodeRequestMax
VECTOR vPathNodeRequestStartPosition
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :DEBUG FUNCS / PROCS / WIDGETS
//-------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widgetGroup
BOOL bDebug_PrintMissionInfoToTTY = FALSE //NEEDS TO BE FALSE!!
BOOL bDebug_PrintMissionRubberbandInfoToTTY = FALSE //NEEDS TO BE FALSE!!
BOOL bDebug_SetupMission_DebugStage = FALSE
BOOL bDebug_ResetHintCam = FALSE
BOOL bDebug_UpdateCelebWanderSpeed = FALSE
FLOAT fDebug_CelebWanderSpeed = 30.0
BOOL bDebug_DisplayPhotoArea = FALSE
BOOL bDEbug_DisplayFranklinSpecialAbilityCharge = FALSE
BOOL bDebug_DontKnockThePedsOffTheBike = FALSE //NEEDS TO BE FALSE!!
BOOL bDebug_OverrideKnockOffAnimsForSetup = FALSE
BOOL bDebug_KnockOffAnims_ForcePunch = FALSE
BOOL bDebug_KnockOffAnims_OverrideAnimSpeed = FALSE
BOOL bDebug_KnockOffAnims_OverrideHitTimes = FALSE
BOOL bDebug_KnockOffAnims_OverrideSwipeSFXTime = FALSE
FLOAT fDebug_KnockOff_Biker_AnimSpeed = 1.0
FLOAT fDebug_KnockOff_Biker_Anim_HitStartPoint = 0.4
FLOAT fDebug_KnockOff_Biker_Anim_HitDonePoint = 0.8
FLOAT fDebug_KnockOff_Biker_Anim_SwipeSFXstartPoint = 0.2
BOOL bDebug_DoArmIntersectionTest = FALSE //NEEDS TO BE FALSE!!
//FLOAT fDebug_PelvisRadius = 0.45
VECTOR vDebug_PelvisPosOffsetDriver = << 0.0, 0.15, 0.6 >>
VECTOR vDebug_PelvisPosOffsetPassenger = << 0.0, -0.75, 0.65 >>
//FLOAT fDebug_HandRadius = 0.075
//FLOAT fDebug_ArmRadius = 0.075
BOOL bDebug_ResetKObools = FALSE
BOOL bDebug_TogglePapDriveWander = FALSE
BOOL bDebug_ToggleKnockoffBikerDebugDraws = FALSE //NEEDS TO BE FALSE!!
BOOL bDebug_RivalPapSpawnArea = FALSE
VECTOR vDebug_PositionPlayerFromCar
VECTOR vDebug_PositionOffsetPlayerFromCar = << -1.5, 0.50, 0.00 >>
BOOL bDebug_RespotPlayerPos = FALSE
VECTOR vDebug_CameraOffsetOutro = << -1.0, 0.5, 0.75 >>
VECTOR vDebug_CameraPointAtOffset = << 2.0, 1.0, 0.75 >>
BOOL bDebug_ResetCameraOffsetOutro = FALSE
CAMERA_INDEX camDebugPositioning
BOOL bDebug_Attach_Bev_Camera_To_Beverly = FALSE
BOOL bDebug_Attach_Bev_Flash_Unit_To_Camera = FALSE
BOOL bDebug_Attach_Bev_Camera_To_Player = FALSE
BOOL bDebug_Attach_Pap_Camera_To_Player = FALSE
VECTOR vRivalPapSpawnOffset = << 3.0, -15.0, 0.0 >>
FLOAT fDebug_TakePhotoZone_Radius = 3.5
BOOL bDebug_Test_Put_Ped_On_Back_Bike = FALSE
BOOL bDebug_TestCameraFlash = FALSE
VECTOR vDebug_FlashOffset = << 0.00, 0.00, 0.00 >>
VECTOR vDebug_FlashRotationOffset = << 0.0, 0.0, 0.0 >>
BOOL bDebug_CreateRandomPed = FALSE
BOOL bDebug_UpdatePedHealth = FALSE
INT iDebug_PedHealth = 1000
BOOL bDebug_PrintPedHealth = FALSE
PED_INDEX pedDebug
BOOL bDebug_DisplayPlayerVehicleSpeed = FALSE
BOOL bDebug_CheckLengthOgVehicleRecordings = FALSE
BOOL bDebug_TeleportBeverlyOffBikeSafe = FALSE
BOOL bDebug_ReapplyCameraAnimOnBev = FALSE
FLOAT fDebug_TimeScale = 1.0
BOOL bDebug_SetTimeScale = FALSE
BOOL bDebugPrint_CelebOffset_Y_ToPlayer = FALSE
BOOL bDebug_Test_AreHeadingsSimilar = FALSE
FLOAT fDebug_Test_AreHeadingsSimilar_LowerThreshold = 0.9
FLOAT fDebug_Test_AreHeadingsSimilar_UpperThreshold = 1.1
BOOL bDisplayHeadingCheckTTY = FALSE
BOOL bDebug_BevDoAimCameraAtCelebTask = FALSE //NEEDS TO BE FALSE!!
BOOL bDebug_ApplyBevWeaponMovementClipSet = FALSE
BOOL bDebug_ResetBevWeaponMovementClipSet = FALSE
BOOL bDebug_ForcePlayKOAnimOnBev = FALSE
INT iDebug_KOAnimToForcePlayOnBev = 0
FLOAT fDebug_KOAnimSpeedForcePlayOnBev = 1.0
BOOL bDebug_OverrideBevCameraLensOffset = FALSE
VECTOR vDebug_BevCameraLensOffsetOverride = vBevCameraLensOffset
BOOL bDebug_OverrideProbeHitDist = FALSE
FLOAT fDebug_ProbeHitDistOverride = SHAPE_TEST_PAP1_CAMERA_AIM_PROBE_HIT_DIST
BOOL bDebug_OverrideBevAimCameraViewingCone = FALSE
FLOAT fDebug_BevAimCameraViewingCone = SHAPE_TEST_PAP1_CAMERA_AIM_VIEW_CONE
BOOL bDebug_DisplayShapeTestPap1CameraAim = FALSE //NEEDS TO BE FALSE!!
BOOL bDebug_OverrideCelebPosInCarOffset = FALSE
VECTOR vDebug_vCelebPosInCarOffsetOverride = vCelebPosInCarOffset
FLOAT fDebug_TaskSweepAim_TurnRate = 3.0
BOOL bDebug_OverrideTaskSweepAim_TurnRate = FALSE
VECTOR vDebug_TempPlayerVehicleSetPosition
BOOL bDebug_ApplyPositionValueToPlayerVehicle = FALSE
FLOAT fDebug_TempPlayerVehicleQuatX
FLOAT fDebug_TempPlayerVehicleQuatY
FLOAT fDebug_TempPlayerVehicleQuatZ
FLOAT fDebug_TempPlayerVehicleQuatW
BOOL bDebug_ApplyQuaternionValuesToPlayerVehicle = FALSE
BOOL bDebug_SnapPlayerVehicleToGround = FALSE
BOOL bDebug_PrintPlayerVehicleInfo = FALSE
BOOL bDebug_DisplayInfo_GetSideCoordsIsToEntity = FALSE
BOOL bDebug_BevTempAimLeft = FALSE
BOOL bDebug_GetCurrentGameplayHeadingAndPitch = FALSE
BOOL bDebug_TakeOffHelmet = FALSE
BOOL bDebug_GiveHelmet = FALSE
/// PURPOSE:
/// My debug mission widget groups, which get created in RAG->SCRIPT
PROC SETUP_MISSION_WIDGET()
widgetGroup = START_WIDGET_GROUP("PAPARAZZO 1 WIDGETS")
START_WIDGET_GROUP("GENERAL MISSION STUFF")
ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintMissionInfoToTTY)
ADD_WIDGET_BOOL("TTY Toggle - Print Mission Rubberband only Debug Info", bDebug_PrintMissionRubberbandInfoToTTY)
ADD_WIDGET_BOOL("DEBUG - set mission in debug stage", bDebug_SetupMission_DebugStage)
ADD_WIDGET_BOOL("Print Current Gameplay Cam Heading and Pitch", bDebug_GetCurrentGameplayHeadingAndPitch)
ADD_WIDGET_BOOL("bDEbug_DisplayFranklinSpecialAbilityCharge", bDEbug_DisplayFranklinSpecialAbilityCharge)
ADD_WIDGET_BOOL("bUseNewCelebChaseRubberbanding", bUseNewCelebChaseRubberbanding)
ADD_WIDGET_BOOL("bDebug_DisplayPlayerVehicleSpeed", bDebug_DisplayPlayerVehicleSpeed)
ADD_WIDGET_BOOL("bDebug_Test_Put_Ped_On_Back_Bike", bDebug_Test_Put_Ped_On_Back_Bike)
ADD_WIDGET_BOOL("bDebug_TakeOffHelmet", bDebug_TakeOffHelmet)
ADD_WIDGET_BOOL("bDebug_GiveHelmet", bDebug_GiveHelmet)
ADD_WIDGET_FLOAT_SLIDER("fDebug_CelebWanderSpeed", fDebug_CelebWanderSpeed, 0.0, 100.0, 0.1)
ADD_WIDGET_BOOL("Reset hint camera", bDebug_ResetHintCam)
ADD_WIDGET_BOOL("Display Rival Pap Spawn Area", bDebug_RivalPapSpawnArea)
ADD_WIDGET_VECTOR_SLIDER("vRivalPapSpawnOffset", vRivalPapSpawnOffset, -7000.0, 7000.0, 0.1)
ADD_WIDGET_BOOL("Create debug ped", bDebug_CreateRandomPed)
ADD_WIDGET_BOOL("Update debug peds health", bDebug_UpdatePedHealth)
ADD_WIDGET_INT_SLIDER("set debug peds health", iDebug_PedHealth, 0, 1000, 1)
ADD_WIDGET_BOOL("Print PedHealth", bDebug_PrintPedHealth)
ADD_WIDGET_BOOL("bDebug_CheckLengthOFVehicleRecordings", bDebug_CheckLengthOgVehicleRecordings)
ADD_WIDGET_BOOL("bDebug_TeleportBeverlyOffBikeSafe", bDebug_TeleportBeverlyOffBikeSafe)
ADD_WIDGET_BOOL("reapply camera anim on beverly for test", bDebug_ReapplyCameraAnimOnBev)
ADD_WIDGET_FLOAT_SLIDER("Time Scale adjustment (1.0) is normal speed - ", fDebug_TimeScale, 0.0, 2.0, 0.01)
ADD_WIDGET_BOOL("Apply Time Scale", bDebug_SetTimeScale)
ADD_WIDGET_BOOL("print to TTY celeb offset Y to player", bDebugPrint_CelebOffset_Y_ToPlayer)
ADD_WIDGET_BOOL("bDebug_Test_AreHeadingsSimilar - bev bike and rival bike", bDebug_Test_AreHeadingsSimilar)
ADD_WIDGET_FLOAT_SLIDER("fDebug_Test_AreHeadingsSimilar_LowerThreshold - ", fDebug_Test_AreHeadingsSimilar_LowerThreshold, -360.0, 360.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("fDebug_Test_AreHeadingsSimilar_UpperThreshold - ", fDebug_Test_AreHeadingsSimilar_UpperThreshold, -360.0, 360.0, 0.01)
ADD_WIDGET_BOOL("bDisplayHeadingCheckTTY", bDisplayHeadingCheckTTY)
ADD_WIDGET_BOOL("Debug Display Info Get Side Coords Is To Entity", bDebug_DisplayInfo_GetSideCoordsIsToEntity)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("PHOTO AREA SETUP note: right side only, mirrored in script")
ADD_WIDGET_BOOL("Display Photo Area", bDebug_DisplayPhotoArea)
ADD_WIDGET_VECTOR_SLIDER("OFFSET CENTRE POINT", vTakePhotoZones_CentrePosOffset[0], -7000.0, 7000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("RADIUS", fDebug_TakePhotoZone_Radius, 0.0, 100.0, 0.1)
STOP_WIDGET_GROUP()
/*START_WIDGET_GROUP("KNOCK OFF BIKER AREA SETUP")
START_WIDGET_GROUP("GENERAL")
ADD_WIDGET_BOOL("Toggle pap drive wander", bDebug_TogglePapDriveWander)
ADD_WIDGET_BOOL("Toggle knock off biker debug draws", bDebug_ToggleKnockoffBikerDebugDraws)
ADD_WIDGET_BOOL("Reset KO'd bools ", bDebug_ResetKObools)
ADD_WIDGET_BOOL("Don't knock the bikers off on successful hit", bDebug_DontKnockThePedsOffTheBike)
ADD_WIDGET_BOOL("Do Arm Intersection Test For Knockoff Bikers", bDebug_DoArmIntersectionTest)
ADD_WIDGET_FLOAT_SLIDER("Pelvis Range Override - ", fDebug_PelvisRadius, 0.0, 4.0, 0.0001)
ADD_WIDGET_VECTOR_SLIDER("vDebug_PelvisPosOffsetDriver", vDebug_PelvisPosOffsetDriver, -7000.0, 7000.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("vDebug_PelvisPosOffsetPassenger", vDebug_PelvisPosOffsetPassenger, -7000.0, 7000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Hand Range Override - ", fDebug_HandRadius, 0.0, 4.0, 0.0001)
ADD_WIDGET_FLOAT_SLIDER("Arm Range Override - ", fDebug_ArmRadius, 0.0, 4.0, 0.0001)
ADD_WIDGET_BOOL("Set Beverly to Play the a KO anim", bDebug_ForcePlayKOAnimOnBev)
ADD_WIDGET_INT_SLIDER("Which KO anim for force on Bev", iDebug_KOAnimToForcePlayOnBev, 0, 3, 1)
ADD_WIDGET_FLOAT_SLIDER("Anim speed of forced KO anim on Bev", fDebug_KOAnimSpeedForcePlayOnBev, 0.0, 10.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("KNOCK OFF BIKER HIT EXECUTION AREA - LENGTH", fKnockOff_Biker_HitExecutionArea_Length, 0.0, 100.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("KNOCK OFF BIKER HIT EXECUTION AREA - WidthModifier", fKnockOff_Biker_StartAnimWidthModifier, 0.0, 1000.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("LEFT SIDE")
ADD_WIDGET_VECTOR_SLIDER("LEFT KNOCK OFF BIKER HIT EXECUTION AREA NEAR OFFSET", vKnockOff_Biker_HitExecutionArea_OffsetNear[KNOCKOFF_BIKER_ATTACK_SIDE_LEFT], -7000.0, 7000.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("LEFT KNOCK OFF BIKER HIT EXECUTION AREA FAR OFFSET", vKnockOff_Biker_HitExecutionArea_OffsetFar[KNOCKOFF_BIKER_ATTACK_SIDE_LEFT], -7000.0, 7000.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("RIGHT SIDE")
ADD_WIDGET_VECTOR_SLIDER("RIGHT KNOCK OFF BIKER HIT EXECUTION AREA NEAR OFFSET", vKnockOff_Biker_HitExecutionArea_OffsetNear[KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT], -7000.0, 7000.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("RIGHT KNOCK OFF BIKER HIT EXECUTION AREA FAR OFFSET", vKnockOff_Biker_HitExecutionArea_OffsetFar[KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT], -7000.0, 7000.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("ANIM SETUP")
ADD_WIDGET_BOOL("Override Anims For Setup", bDebug_OverrideKnockOffAnimsForSetup)
ADD_WIDGET_BOOL("Force Punch (false = Force Swipe", bDebug_KnockOffAnims_ForcePunch)
ADD_WIDGET_BOOL("Use following anim speed as override", bDebug_KnockOffAnims_OverrideAnimSpeed)
ADD_WIDGET_FLOAT_SLIDER("Set KO anim speed - ", fDebug_KnockOff_Biker_AnimSpeed, -10.0, 10.0, 0.01)
ADD_WIDGET_BOOL("Use following hit times as override", bDebug_KnockOffAnims_OverrideHitTimes)
ADD_WIDGET_FLOAT_SLIDER("Set KO anim hit start point - ", fDebug_KnockOff_Biker_Anim_HitStartPoint, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Set KO anim hit done point - ", fDebug_KnockOff_Biker_Anim_HitDonePoint, 0.0, 1.0, 0.001)
ADD_WIDGET_BOOL("Use following attack sfx trigger point as override", bDebug_KnockOffAnims_OverrideSwipeSFXTime)
ADD_WIDGET_FLOAT_SLIDER("Set KO anim attack sound fx trigger point - ", fDebug_KnockOff_Biker_Anim_SwipeSFXstartPoint, 0.0, 1.0, 0.001)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()*/
START_WIDGET_GROUP("OUTRO SETUP")
ADD_WIDGET_VECTOR_SLIDER("Position Offset of Player from Beverly car", vDebug_PositionOffsetPlayerFromCar, -4000.0, 4000.0, 0.1)
ADD_WIDGET_BOOL("bDebug_RespotPlayerPos", bDebug_RespotPlayerPos)
ADD_WIDGET_VECTOR_SLIDER("vDebug_CameraOffsetOutro", vDebug_CameraOffsetOutro, -4000.0, 4000.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("vDebug_CameraPointAtOffset", vDebug_CameraPointAtOffset, -4000.0, 4000.0, 0.1)
ADD_WIDGET_BOOL("bDebug_ResetCameraOffsetOutro", bDebug_ResetCameraOffsetOutro)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("CAMERA ATTACHMENT")
ADD_WIDGET_VECTOR_SLIDER("Attach offset of Bev camera", sObjCameraBeverly.vOffset, -4000.0, 4000.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("Attach Rotation of Bev camera", sObjCameraBeverly.vRotation, -4000.0, 4000.0, 0.1)
ADD_WIDGET_BOOL("Re-attach Bev camera to player", bDebug_Attach_Bev_Camera_To_Player)
ADD_WIDGET_BOOL("Re-attach Bev camera to Bev", bDebug_Attach_Bev_Camera_To_Beverly)
ADD_WIDGET_VECTOR_SLIDER("Attach offset of Pap Cam Check Photo Pose", sObjCameraRivalPap.vOffset, -4000.0, 4000.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("Attach Rotation of Pap cam Check Photo Pose", sObjCameraRivalPap.vRotation, -4000.0, 4000.0, 0.1)
ADD_WIDGET_BOOL("Re-attach Pap camera to player", bDebug_Attach_Pap_Camera_To_Player)
ADD_WIDGET_VECTOR_SLIDER("Additional offset for flash", vDebug_FlashOffset, -4000.0, 4000.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("Additional offset for flash Rotation", vDebug_FlashRotationOffset, -4000.0, 4000.0, 0.1)
ADD_WIDGET_BOOL("Test Camera Flash Position", bDebug_TestCameraFlash)
ADD_WIDGET_VECTOR_SLIDER("Attach offset of Bev Flash Unit", sObjFlashUnitBeverly.vOffset, -4000.0, 4000.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("Attach Rotation of Bev flash unit", sObjFlashUnitBeverly.vRotation, -4000.0, 4000.0, 0.1)
ADD_WIDGET_BOOL("Re-attach Bev Flash unit to camera", bDebug_Attach_Bev_Flash_Unit_To_Camera)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("NEW ANIM TESTS")
ADD_WIDGET_BOOL("bDebug_ApplyBevWeaponMovementClipSet - only works in debug state", bDebug_ApplyBevWeaponMovementClipSet)
ADD_WIDGET_BOOL("bDebug_ResetBevWeaponMovementClipSet - only works in debug state", bDebug_ResetBevWeaponMovementClipSet)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("BEV CAMERA AIM TESTS")
ADD_WIDGET_BOOL("Toggle - Set Beverly to do aim camera at celeb task - only works in debug state", bDebug_BevDoAimCameraAtCelebTask)
ADD_WIDGET_BOOL("Toggle - Override Task Sweep Aim Turn Rate", bDebug_OverrideTaskSweepAim_TurnRate)
ADD_WIDGET_FLOAT_SLIDER("fDebug_TaskSweepAim_TurnRate - ", fDebug_TaskSweepAim_TurnRate, 0.0, 100.0, 0.001)
ADD_WIDGET_BOOL("Toggle - Display Debug lines shape test pap 1 camera aim", bDebug_DisplayShapeTestPap1CameraAim)
ADD_WIDGET_BOOL("Toggle - Override Bev Camera Lens Offset", bDebug_OverrideBevCameraLensOffset)
ADD_WIDGET_VECTOR_SLIDER("vDebug_BevCameraLensOffsetOverride - ", vDebug_BevCameraLensOffsetOverride, -4000.0, 4000.0, 0.1)
ADD_WIDGET_BOOL("Toggle - Override Probe Hit Dist", bDebug_OverrideProbeHitDist)
ADD_WIDGET_FLOAT_SLIDER("fDebug_ProbeHitDistOverride - ", fDebug_ProbeHitDistOverride, 0.0, 100.0, 0.001)
ADD_WIDGET_BOOL("Toggle - Override Bev Aim Camera Viewing Cone", bDebug_OverrideBevAimCameraViewingCone)
ADD_WIDGET_FLOAT_SLIDER("fDebug_BevAimCameraViewingCone - ", fDebug_BevAimCameraViewingCone, 0.0, 180.0, 0.001)
ADD_WIDGET_BOOL("Toggle - Override Override Celeb Pos In Car Offset", bDebug_OverrideCelebPosInCarOffset)
ADD_WIDGET_VECTOR_SLIDER("vDebug_vCelebPosInCarOffsetOverride - ", vDebug_vCelebPosInCarOffsetOverride, -4000.0, 4000.0, 0.1)
ADD_WIDGET_BOOL("Debug Bev Temp Aim Left", bDebug_BevTempAimLeft)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Player vehicle positioning stuff")
ADD_WIDGET_VECTOR_SLIDER("Set player vehicle position vector - ", vDebug_TempPlayerVehicleSetPosition, -10000, 10000, 0.0001)
ADD_WIDGET_BOOL("Apply above position to player's vehicle", bDebug_ApplyPositionValueToPlayerVehicle)
ADD_WIDGET_FLOAT_SLIDER("Set player vehicle quaternion X value -", fDebug_TempPlayerVehicleQuatX, -3.0, 3.0, 0.0001)
ADD_WIDGET_FLOAT_SLIDER("Set player vehicle quaternion Y value -", fDebug_TempPlayerVehicleQuatY, -3.0, 3.0, 0.0001)
ADD_WIDGET_FLOAT_SLIDER("Set player vehicle quaternion Z value -", fDebug_TempPlayerVehicleQuatZ, -3.0, 3.0, 0.0001)
ADD_WIDGET_FLOAT_SLIDER("Set player vehicle quaternion W value -", fDebug_TempPlayerVehicleQuatW, -3.0, 3.0, 0.0001)
ADD_WIDGET_BOOL("Apply above quaternion to player's vehicle", bDebug_ApplyQuaternionValuesToPlayerVehicle)
ADD_WIDGET_BOOL("Snap the player's current vehicle to the ground", bDebug_SnapPlayerVehicleToGround)
ADD_WIDGET_BOOL("Print player's current vehicle info, pos, quat and heading", bDebug_PrintPlayerVehicleInfo)
STOP_WIDGET_GROUP()
SET_UBER_PARENT_WIDGET_GROUP(widgetGroup)
STOP_WIDGET_GROUP()
//set the initial values now that the values they are grabbing off have been set
vDebug_BevCameraLensOffsetOverride = vBevCameraLensOffset
vDebug_vCelebPosInCarOffsetOverride = vCelebPosInCarOffset
ENDPROC
/// PURPOSE:
/// updates my mission widgets, based off RAG input
PROC MAINTAIN_MISSION_WIDGETS()
TEXT_LABEL_63 tlTemp
/* // debug fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_0))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PRESSED KEY 0") ENDIF #ENDIF
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
KNOCK_PED_OFF_VEHICLE(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - sBeverlyPed PED KNOCKED OFF THE BIKE") ENDIF #ENDIF
ENDIF
SET_ENTITY_HEALTH(sBeverlyPed.ped, 0)
ENDIF
ENDIF */
IF bDebug_GetCurrentGameplayHeadingAndPitch
FLOAT fTemp_Heading = GET_GAMEPLAY_CAM_RELATIVE_HEADING()
FLOAT fTemp_Pitch = GET_GAMEPLAY_CAM_RELATIVE_PITCH()
OPEN_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "Current Gameplay Cam Relative Heading : "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_FLOAT_TO_DEBUG_FILE(fTemp_Heading)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "Current Gameplay Cam Relative Pitch : "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_FLOAT_TO_DEBUG_FILE(fTemp_Pitch)
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
bDebug_GetCurrentGameplayHeadingAndPitch = FALSE
ENDIF
IF bDEbug_DisplayFranklinSpecialAbilityCharge
INT iTempStatValue
STAT_GET_INT(SP1_SPECIAL_ABILITY, iTempStatValue) // Franklin check Franklin has some charge in his bar
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "FRANKLIN SPEC ABILITY CHARGE IS - ", iTempStatValue) ENDIF #ENDIF
ENDIF
IF bDebug_DisplayPlayerVehicleSpeed
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehTempDebug_ForSpeedCheck = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehTempDebug_ForSpeedCheck)
AND NOT IS_ENTITY_DEAD(vehTempDebug_ForSpeedCheck)
FLOAT fTempDebug_SpeedCheck = GET_ENTITY_SPEED(vehTempDebug_ForSpeedCheck)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "%%%%%% vehTempDebug_ForSpeedCheck = ", fTempDebug_SpeedCheck) ENDIF #ENDIF
IF fTempDebug_SpeedCheck < 34.0
SET_TEXT_COLOUR(255, 216, 0, 255) //yellow - speed slow
ELIF fTempDebug_SpeedCheck > 43.0
SET_TEXT_COLOUR(255, 0, 0, 255) //red - speeding
ELSE
SET_TEXT_COLOUR(0, 255, 0, 255) //green - speed ok
ENDIF
SET_TEXT_SCALE(0.5, 0.5)
DISPLAY_TEXT_WITH_FLOAT(0.45, 0.83, "SPEED: ", fTempDebug_SpeedCheck, 2)
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sCelebVehicle.vehicle)
AND NOT IS_ENTITY_DEAD(sCelebPed.ped)
IF bDebug_Test_Put_Ped_On_Back_Bike
SAFE_DELETE_PED(sRivalPapPed.ped)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehIndexTempPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(vehIndexTempPlayer)
AND NOT DOES_ENTITY_EXIST(sRivalPapPed.ped)
sRivalPapPed.ped = CREATE_PED_INSIDE_VEHICLE(vehIndexTempPlayer, PEDTYPE_MISSION, sRivalPapPed.model, VS_FRONT_RIGHT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRivalPapPed.ped, TRUE)
SET_PED_CAN_BE_TARGETTED(sRivalPapPed.ped, FALSE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_NEVER)
bDebug_Test_Put_Ped_On_Back_Bike = FALSE
ENDIF
ENDIF
ENDIF
IF bDebug_UpdateCelebWanderSpeed
IF NOT IS_ENTITY_DEAD(sCelebsDriverPed.ped)
TASK_VEHICLE_DRIVE_WANDER(sCelebsDriverPed.ped, sCelebVehicle.vehicle, fDebug_CelebWanderSpeed, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS)
bDebug_UpdateCelebWanderSpeed = FALSE
ENDIF
ENDIF
IF bDebug_DisplayPhotoArea
SET_DEBUG_ACTIVE(TRUE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
vTakePhotoZones_CentrePos[0] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vTakePhotoZones_CentrePosOffset[0])
DRAW_DEBUG_SPHERE(vTakePhotoZones_CentrePos[0], fDebug_TakePhotoZone_Radius, 0, 0, 255, 100)
vTakePhotoZones_CentrePos[1] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vTakePhotoZones_CentrePosOffset[1])
DRAW_DEBUG_SPHERE(vTakePhotoZones_CentrePos[1], fDebug_TakePhotoZone_Radius, 0, 0, 255, 100)
ENDIF
IF NOT IS_ENTITY_DEAD(sBeverlyVehicle.vehicle)
AND NOT IS_ENTITY_DEAD(sBeverlyPed.ped)
AND NOT IS_ENTITY_DEAD(sRivalPapVehicle.vehicle)
AND NOT IS_ENTITY_DEAD(sRivalPapPed.ped)
AND NOT IS_ENTITY_DEAD(sRivalPapDriverPed.ped)
IF bDebug_TogglePapDriveWander
IF NOT (WAITING_TO_START_TASK = GET_SCRIPT_TASK_STATUS(sRivalPapDriverPed.ped, SCRIPT_TASK_VEHICLE_DRIVE_WANDER))
AND NOT (PERFORMING_TASK = GET_SCRIPT_TASK_STATUS(sRivalPapDriverPed.ped, SCRIPT_TASK_VEHICLE_DRIVE_WANDER))
FREEZE_ENTITY_POSITION(sRivalPapVehicle.vehicle, FALSE)
TASK_VEHICLE_DRIVE_WANDER(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle, 26.0, DRIVINGMODE_AVOIDCARS)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "WANDER APPLIED TO RIVAL PAP") ENDIF #ENDIF
ELSE
CLEAR_PED_TASKS(sRivalPapDriverPed.ped)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "WANDER CLEARED FROM RIVAL PAP") ENDIF #ENDIF
ENDIF
bDebug_TogglePapDriveWander = FALSE
ENDIF
IF bDebug_ResetKObools
bDebug_ResetKObools = FALSE
ENDIF
IF bDebug_Test_AreHeadingsSimilar
VECTOR vTempBeverlyVehicle, vTempRivalPapVehicle
FLOAT fDotProductVehicles
BOOL bDebug_AreEntitesCompletelyOppositeWay
vTempBeverlyVehicle = GET_ENTITY_FORWARD_VECTOR(sBeverlyVehicle.vehicle)
vTempRivalPapVehicle = GET_ENTITY_FORWARD_VECTOR(sRivalPapVehicle.vehicle)
fDotProductVehicles = DOT_PRODUCT(vTempBeverlyVehicle, vTempRivalPapVehicle)
IF fDotProductVehicles > 0 //facing same 180 heading
bDebug_AreEntitesCompletelyOppositeWay = FALSE
ELSE
bDebug_AreEntitesCompletelyOppositeWay = TRUE
fDotProductVehicles = ABSF(fDotProductVehicles) //turn into a positive value
ENDIF
IF (fDotProductVehicles > fDebug_Test_AreHeadingsSimilar_LowerThreshold
AND fDotProductVehicles < fDebug_Test_AreHeadingsSimilar_UpperThreshold)
IF NOT bDebug_AreEntitesCompletelyOppositeWay
#IF IS_DEBUG_BUILD IF bDisplayHeadingCheckTTY CPRINTLN(DEBUG_MISSION, "DEBUG^^^ - COMPARE HEADINGS ARE SIMILAR BOTH FORWARDS >>>>>>>>>>>>>>>> = ", fDotProductVehicles) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDisplayHeadingCheckTTY CPRINTLN(DEBUG_MISSION, "DEBUG^^^ - COMPARE HEADINGS ARE SIMILAR BOTH BACKWARDS <<<<<<<<<<<<<<< = ", fDotProductVehicles) ENDIF #ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDisplayHeadingCheckTTY CPRINTLN(DEBUG_MISSION, "DEBUG^^^ - COMPARE HEADINGS ARE NOT SIMILAR ------- = ", fDotProductVehicles) ENDIF #ENDIF
ENDIF
ENDIF
IF bDebug_ForcePlayKOAnimOnBev
SWITCH iDebug_KOAnimToForcePlayOnBev
CASE 0
sAnimNameBeverlyKnockOff = "atk_punch_right_pap"
BREAK
CASE 1
sAnimNameBeverlyKnockOff = "atk_swipe_right_pap"
BREAK
CASE 2
sAnimNameBeverlyKnockOff = "atk_punch_left_pap"
BREAK
CASE 3
sAnimNameBeverlyKnockOff = "atk_swipe_left_pap"
BREAK
ENDSWITCH
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
CLEAR_PED_TASKS(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff, NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_HOLD_LAST_FRAME)
ELSE
FLOAT fCurrentAnimPhase
FLOAT fAnimTotalTime
IF HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
fAnimTotalTime = GET_ENTITY_ANIM_TOTAL_TIME(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ DEBUG BEV KNOCKOFF_BIKER_ATTACK fAnimTotalTime at finished = ", fAnimTotalTime) ENDIF #ENDIF
CLEAR_PED_TASKS(sBeverlyPed.ped)
bDebug_ForcePlayKOAnimOnBev = FALSE
ELSE
fCurrentAnimPhase = GET_ENTITY_ANIM_CURRENT_TIME(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ DEBUG BEV KNOCKOFF_BIKER_ATTACK fCurrentAnimPhase = ", fCurrentAnimPhase) ENDIF #ENDIF
fAnimTotalTime = GET_ENTITY_ANIM_TOTAL_TIME(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ DEBUG BEV KNOCKOFF_BIKER_ATTACK fAnimTotalTime = ", fAnimTotalTime) ENDIF #ENDIF
SET_ENTITY_ANIM_SPEED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff, fDebug_KOAnimSpeedForcePlayOnBev)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ DEBUG BEV KNOCKOFF_BIKER_ATTACK - FORCED knock off anim speed set +++") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bDebug_RivalPapSpawnArea
VECTOR vTempRivalPapSpawnArea
vTempRivalPapSpawnArea = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vRivalPapSpawnOffset)
DRAW_DEBUG_SPHERE(vTempRivalPapSpawnArea, 2.0, 0, 255, 0, 100)
ENDIF
IF bDebug_RespotPlayerPos
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vDebug_PositionPlayerFromCar = GET_OFFSET_FROM_COORD_IN_WORLD_COORDS(GET_ENTITY_COORDS(sBeverlyVehicle.vehicle), GET_ENTITY_HEADING(sBeverlyVehicle.vehicle), vDebug_PositionOffsetPlayerFromCar)
GET_GROUND_Z_FOR_3D_COORD(vDebug_PositionPlayerFromCar, vDebug_PositionPlayerFromCar.Z)
SET_ENTITY_COORDS(PLAYER_PED_ID(), vDebug_PositionPlayerFromCar)
IF NOT IS_PED_INJURED(sBeverlyPed.ped)
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sBeverlyPed.ped)
ENDIF
bDebug_RespotPlayerPos = FALSE
ENDIF
ENDIF
IF bDebug_ResetCameraOffsetOutro
VECTOR vDebug_CameraPosition = << 0.0, 0.0, 0.0 >>
IF DOES_ENTITY_EXIST(sBeverlyVehicle.vehicle)
//vDebug_CameraPosition = GET_OFFSET_FROM_COORD_IN_WORLD_COORDS(GET_ENTITY_COORDS(sBeverlyVehicle.vehicle), GET_ENTITY_HEADING(sBeverlyVehicle.vehicle), vDebug_CameraOffsetOutro)
IF NOT DOES_CAM_EXIST(camDebugPositioning)
camDebugPositioning = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
vDebug_CameraPosition = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sBeverlyPed.ped, vDebug_CameraOffsetOutro)
SET_CAM_COORD(camDebugPositioning, vDebug_CameraPosition)
vDebug_CameraPosition = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sBeverlyPed.ped, vDebug_CameraPointAtOffset)
POINT_CAM_AT_COORD(camDebugPositioning, vDebug_CameraPosition)
//ATTACH_CAM_TO_ENTITY(camDebugPositioning, sBeverlyPed.ped, vDebug_CameraOffsetOutro)
//POINT_CAM_AT_ENTITY(camDebugPositioning, sBeverlyPed.ped, vDebug_CameraPointAtOffset)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_CAM_ACTIVE(camDebugPositioning, TRUE)
ELSE
//ATTACH_CAM_TO_ENTITY(camDebugPositioning, sBeverlyVehicle.vehicle, vDebug_CameraOffsetOutro)
//POINT_CAM_AT_ENTITY(camDebugPositioning, sBeverlyPed.ped, vDebug_CameraPointAtOffset)
vDebug_CameraPosition = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sBeverlyPed.ped, vDebug_CameraOffsetOutro)
SET_CAM_COORD(camDebugPositioning, vDebug_CameraPosition)
vDebug_CameraPosition = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sBeverlyPed.ped, vDebug_CameraPointAtOffset)
POINT_CAM_AT_COORD(camDebugPositioning, vDebug_CameraPosition)
ENDIF
bDebug_ResetCameraOffsetOutro = FALSE
ENDIF
ENDIF
IF bDebug_Attach_Bev_Flash_Unit_To_Camera
IF IS_ENTITY_ALIVE(sObjCameraBeverly.object)
IF NOT DOES_ENTITY_EXIST(sObjFlashUnitBeverly.object)
sObjFlashUnitBeverly.object = CREATE_OBJECT(sObjFlashUnitBeverly.model, GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sObjCameraBeverly.object, << 0.0, 0.0, 0.5 >>))
ENDIF
IF NOT IS_ENTITY_DEAD(sObjFlashUnitBeverly.object)
IF IS_ENTITY_ATTACHED(sObjFlashUnitBeverly.object)
DETACH_ENTITY(sObjFlashUnitBeverly.object)
ENDIF
ATTACH_ENTITY_TO_ENTITY(sObjFlashUnitBeverly.object, sObjCameraBeverly.object, 0, sObjFlashUnitBeverly.vOffset, sObjFlashUnitBeverly.vRotation)
bDebug_Attach_Bev_Flash_Unit_To_Camera = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_Attach_Bev_Flash_Unit_To_Camera - DONE") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
IF bDebug_Attach_Bev_Camera_To_Beverly
IF DOES_ENTITY_EXIST(sObjCameraRivalPap.object)
AND NOT IS_ENTITY_DEAD(sObjCameraRivalPap.object)
IF IS_ENTITY_ATTACHED(sObjCameraRivalPap.object)
DETACH_ENTITY(sObjCameraRivalPap.object)
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(sObjCameraBeverly.object)
sObjCameraBeverly.object = CREATE_OBJECT(sObjCameraBeverly.model, GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sBeverlyPed.ped, << 0.0, 0.0, 2.5 >>))
ENDIF
IF NOT IS_ENTITY_DEAD(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED(sObjCameraBeverly.object)
DETACH_ENTITY(sObjCameraBeverly.object)
ENDIF
ENDIF
ATTACH_ENTITY_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped, GET_PED_BONE_INDEX(sBeverlyPed.ped, BONETAG_PH_R_HAND), sObjCameraBeverly.vOffset, sObjCameraBeverly.vRotation)
bDebug_Attach_Bev_Camera_To_Beverly = FALSE
ELIF bDebug_Attach_Bev_Camera_To_Player
IF DOES_ENTITY_EXIST(sObjCameraRivalPap.object)
AND NOT IS_ENTITY_DEAD(sObjCameraRivalPap.object)
IF IS_ENTITY_ATTACHED(sObjCameraRivalPap.object)
DETACH_ENTITY(sObjCameraRivalPap.object)
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(sObjCameraBeverly.object)
sObjCameraBeverly.object = CREATE_OBJECT(sObjCameraBeverly.model, GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(PLAYER_PED_ID(), << 0.0, 0.0, 2.5 >>))
ENDIF
IF NOT IS_ENTITY_DEAD(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED(sObjCameraBeverly.object)
DETACH_ENTITY(sObjCameraBeverly.object)
ENDIF
ENDIF
ATTACH_ENTITY_TO_ENTITY(sObjCameraBeverly.object, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_R_HAND), sObjCameraBeverly.vOffset, sObjCameraBeverly.vRotation)
bDebug_Attach_Bev_Camera_To_Player = FALSE
ELIF bDebug_Attach_Pap_Camera_To_Player
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
AND NOT IS_ENTITY_DEAD(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED(sObjCameraBeverly.object)
DETACH_ENTITY(sObjCameraBeverly.object)
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(sObjCameraRivalPap.object)
sObjCameraRivalPap.object = CREATE_OBJECT(sObjCameraRivalPap.model, GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(PLAYER_PED_ID(), << 0.0, 0.0, 2.5 >>))
ENDIF
IF NOT IS_ENTITY_DEAD(sObjCameraRivalPap.object)
IF IS_ENTITY_ATTACHED(sObjCameraRivalPap.object)
DETACH_ENTITY(sObjCameraRivalPap.object)
ENDIF
ENDIF
ATTACH_ENTITY_TO_ENTITY(sObjCameraRivalPap.object, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_R_HAND), sObjCameraRivalPap.vOffset, sObjCameraRivalPap.vRotation)
bDebug_Attach_Pap_Camera_To_Player = FALSE
ENDIF
IF bDebug_TestCameraFlash
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
//START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_rcpap1_camera", GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_PH_R_HAND, vDebug_FlashOffset), (GET_ENTITY_ROTATION(sObjCameraBeverly.object) + vDebug_FlashRotationOffset))
IF IS_ENTITY_ALIVE(sObjFlashUnitBeverly.object)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_rcpap1_camera", sObjFlashUnitBeverly.object, vDebug_FlashOffset, vDebug_FlashRotationOffset)
ENDIF
IF NOT HAS_SOUND_FINISHED(iSoundId_CameraFlash)
STOP_SOUND(iSoundId_CameraFlash)
ENDIF
IF REQUEST_SCRIPT_AUDIO_BANK(sPap1_AudioBank_CameraFlashSoundFX)
PLAY_SOUND_FROM_COORD(iSoundId_CameraFlash, "CAMERA", GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_PH_R_HAND, vDebug_FlashOffset), sPap1_SoundSetName)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - SWIPE sfx triggered +++") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - SWIPE sfx not triggered, audio bank not loaded!? +++") ENDIF #ENDIF
ENDIF
ENDIF
bDebug_TestCameraFlash = FALSE
ENDIF
IF bDebug_CreateRandomPed
SAFE_DELETE_PED(pedDebug)
PED_INDEX pedIndexPlayer = PLAYER_PED_ID()
REQUEST_MODEL(sRivalPapPed.model)
WHILE NOT HAS_MODEL_LOADED(sRivalPapPed.model)
WAIT(0)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LOADING DEBUG PED MODEL ASSET") ENDIF #ENDIF
ENDWHILE
iDebug_PedHealth = 1000
pedDebug = CREATE_PED(PEDTYPE_MISSION, sRivalPapPed.model, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(pedIndexPlayer, << 3.0, 1.0, 0.0 >>))
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDebug, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(sRivalPapPed.model)
bDebug_CreateRandomPed = FALSE
ENDIF
IF bDebug_UpdatePedHealth
IF DOES_ENTITY_EXIST(pedDebug)
SET_ENTITY_HEALTH(pedDebug, iDebug_PedHealth)
ENDIF
bDebug_UpdatePedHealth = FALSE
ENDIF
IF bDebug_PrintPedHealth
IF DOES_ENTITY_EXIST(pedDebug)
INT iTempPedHealth = GET_ENTITY_HEALTH(pedDebug)
OPEN_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "Debug Ped's Health is - "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_INT_TO_DEBUG_FILE(iTempPedHealth)
SAVE_NEWLINE_TO_DEBUG_FILE()
IF IS_PED_INJURED(pedDebug)
tlTemp = "Debug Ped is classed as INJURED"
ELSE
tlTemp = "Debug Ped is NOT classed as injured"
ENDIF
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Debug peds health is - ", iTempPedHealth) ENDIF #ENDIF
bDebug_PrintPedHealth = FALSE
ENDIF
ENDIF
ENDIF
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehDebug = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(vehDebug)
IF bDebug_ApplyPositionValueToPlayerVehicle
SET_ENTITY_COORDS_NO_OFFSET(vehDebug, vDebug_TempPlayerVehicleSetPosition)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG AZ WIDGETS - UPDATED PLAYER VEHICLE POS") ENDIF #ENDIF
bDebug_ApplyPositionValueToPlayerVehicle = FALSE
ENDIF
IF bDebug_ApplyQuaternionValuesToPlayerVehicle
SET_ENTITY_QUATERNION(vehDebug, fDebug_TempPlayerVehicleQuatX, fDebug_TempPlayerVehicleQuatY, fDebug_TempPlayerVehicleQuatZ, fDebug_TempPlayerVehicleQuatW)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG AZ WIDGETS - UPDATED PLAYER VEHICLE QUATERNION") ENDIF #ENDIF
bDebug_ApplyQuaternionValuesToPlayerVehicle = FALSE
ENDIF
IF bDebug_SnapPlayerVehicleToGround
SET_VEHICLE_ON_GROUND_PROPERLY(vehDebug)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG AZ WIDGETS - PLAYER VEHICLE SET ON GROUND PROPERLY") ENDIF #ENDIF
bDebug_SnapPlayerVehicleToGround = FALSE
ENDIF
IF bDebug_PrintPlayerVehicleInfo
OPEN_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "#Vehicle Position = "
VECTOR vDebug_VehiclePos = GET_ENTITY_COORDS(vehDebug)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_VECTOR_TO_DEBUG_FILE(vDebug_VehiclePos)
SAVE_NEWLINE_TO_DEBUG_FILE()
FLOAT fDebug_VehicleQuaternion_X, fDebug_VehicleQuaternion_Y, fDebug_VehicleQuaternion_Z, fDebug_VehicleQuaternion_W
GET_ENTITY_QUATERNION(vehDebug, fDebug_VehicleQuaternion_X, fDebug_VehicleQuaternion_Y, fDebug_VehicleQuaternion_Z, fDebug_VehicleQuaternion_W)
tlTemp = "Vehicle Quaternion X = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleQuaternion_X)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "Vehicle Quaternion Y = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleQuaternion_Y)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "Vehicle Quaternion Z = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleQuaternion_Z)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "Vehicle Quaternion W = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleQuaternion_W)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "Vehicle Heading = "
FLOAT fDebug_VehicleHeading = GET_ENTITY_HEADING(vehDebug)
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleHeading)
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
bDebug_PrintPlayerVehicleInfo = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG AZ WIDGETS - bDebug_PrintPlayerVehicleInfo done FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
IF bDebug_CheckLengthOgVehicleRecordings
REQUEST_VEHICLE_RECORDING(36, sPap1_UberRecordingName)
REQUEST_VEHICLE_RECORDING(37, sPap1_UberRecordingName)
REQUEST_VEHICLE_RECORDING(38, sPap1_UberRecordingName)
REQUEST_VEHICLE_RECORDING(42, sPap1_UberRecordingName)
REQUEST_VEHICLE_RECORDING(43, sPap1_UberRecordingName)
REQUEST_VEHICLE_RECORDING(46, sPap1_UberRecordingName)
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(36, sPap1_UberRecordingName)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(37, sPap1_UberRecordingName)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(38, sPap1_UberRecordingName)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(42, sPap1_UberRecordingName)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(43, sPap1_UberRecordingName)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(46, sPap1_UberRecordingName)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LOADING RECORDING FOR DEBUG CHECK") ENDIF #ENDIF
WAIT(0)
ENDWHILE
FLOAT fTime
OPEN_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "debug info : total duration of vehicle recordings - "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "[34] recording 36 = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
fTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(36, sPap1_UberRecordingName)
SAVE_FLOAT_TO_DEBUG_FILE(fTime)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "[35] recording 37 = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
fTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(37, sPap1_UberRecordingName)
SAVE_FLOAT_TO_DEBUG_FILE(fTime)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "[36] recording 38 = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
fTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(38, sPap1_UberRecordingName)
SAVE_FLOAT_TO_DEBUG_FILE(fTime)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "[40] recording 42 = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
fTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(42, sPap1_UberRecordingName)
SAVE_FLOAT_TO_DEBUG_FILE(fTime)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "[41] recording 43 = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
fTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(43, sPap1_UberRecordingName)
SAVE_FLOAT_TO_DEBUG_FILE(fTime)
SAVE_NEWLINE_TO_DEBUG_FILE()
tlTemp = "[44] recording 46 = "
SAVE_STRING_TO_DEBUG_FILE(tlTemp)
fTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(46, sPap1_UberRecordingName)
SAVE_FLOAT_TO_DEBUG_FILE(fTime)
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
bDebug_CheckLengthOgVehicleRecordings = FALSE
ENDIF
IF bDebug_TeleportBeverlyOffBikeSafe
IF NOT IS_ENTITY_DEAD(sBeverlyPed.ped)
VECTOR vSafePos
WHILE NOT GET_SAFE_COORD_FOR_PED(GET_ENTITY_COORDS(sBeverlyPed.ped), TRUE, vSafePos)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "finding safe location for respot bev") ENDIF #ENDIF
WAIT(0)
ENDWHILE
SET_ENTITY_COORDS(sBeverlyPed.ped, vSafePos, FALSE)
bDebug_TeleportBeverlyOffBikeSafe = FALSE
ENDIF
ENDIF
IF bDebug_SetTimeScale
SET_TIME_SCALE(fDebug_TimeScale)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG RAG - APPLIED TIME SCALE - ", fDebug_TimeScale) ENDIF #ENDIF
bDebug_SetTimeScale = FALSE
ENDIF
ENDPROC
/// PURPOSE:
/// ovetride the knock off biker anim setup
PROC DEBUG_OVERRIDE_KNOCK_OFF_BIKER_ANIM_SETUP()
IF bDebug_OverrideKnockOffAnimsForSetup
IF bDebug_KnockOffAnims_ForcePunch
IF iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT
sAnimNameBeverlyKnockOff = "atk_punch_left_pap" // anims have been tagged up with wrong direction! So Left - Right and visa versa
ELIF iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_LEFT
sAnimNameBeverlyKnockOff = "atk_punch_right_pap" // anims have been tagged up with wrong direction! So Left - Right and visa versa
ENDIF
ELSE
IF iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT
sAnimNameBeverlyKnockOff = "atk_swipe_left_pap" // anims have been tagged up with wrong direction! So Left - Right and visa versa
ELIF iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_LEFT
sAnimNameBeverlyKnockOff = "atk_swipe_right_pap" // anims have been tagged up with wrong direction! So Left - Right and visa versa
ENDIF
ENDIF
ENDIF
IF bDebug_KnockOffAnims_OverrideAnimSpeed
fKnockOff_Biker_UpdatedAnimSpeed = fDebug_KnockOff_Biker_AnimSpeed
ENDIF
IF bDebug_KnockOffAnims_OverrideHitTimes
fKnockOff_Biker_Anim_HitStartPoint = fDebug_KnockOff_Biker_Anim_HitStartPoint
fKnockOff_Biker_Anim_HitDonePoint = fDebug_KnockOff_Biker_Anim_HitDonePoint
ENDIF
IF bDebug_KnockOffAnims_OverrideSwipeSFXTime
fKnockOff_Biker_Anim_SwipeSFXstartPoint = fDebug_KnockOff_Biker_Anim_SwipeSFXstartPoint
ENDIF
ENDPROC
/// PURPOSE:
/// removes my debug mission widget group
PROC CLEANUP_MISSION_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(widgetGroup)
DELETE_WIDGET_GROUP(widgetGroup)
ENDIF
SET_DEBUG_ACTIVE(FALSE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
ENDPROC
#ENDIF
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :FUNCTIONS AND PROCEEDURES
//-------------------------------------------------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// contains all the data needed for the uber recording
PROC LOAD_UBER_DATA()
// **** UBER RECORDED TRAFFIC ****
TrafficCarPos[0] = <<-269.2346, 272.0872, 90.3265>>
TrafficCarQuatX[0] = -0.0287
TrafficCarQuatY[0] = -0.0274
TrafficCarQuatZ[0] = 0.7214
TrafficCarQuatW[0] = 0.6914
TrafficCarRecording[0] = 3
TrafficCarStartime[0] = 0.0000
TrafficCarModel[0] = Baller
TrafficCarPos[1] = <<-226.7559, 292.0566, 92.0173>>
TrafficCarQuatX[1] = 0.0000
TrafficCarQuatY[1] = 0.0000
TrafficCarQuatZ[1] = 0.9999
TrafficCarQuatW[1] = 0.0119
TrafficCarRecording[1] = 2
TrafficCarStartime[1] = 500.0000
TrafficCarModel[1] = Baller
TrafficCarPos[2] = <<-318.0732, 258.0473, 86.6976>>
TrafficCarQuatX[2] = -0.0322
TrafficCarQuatY[2] = -0.0153
TrafficCarQuatZ[2] = 0.8131
TrafficCarQuatW[2] = 0.5810
TrafficCarRecording[2] = 4
TrafficCarStartime[2] = 500.0000
TrafficCarModel[2] = ninef2
TrafficCarPos[3] = <<-382.6178, 231.0619, 83.6473>>
TrafficCarQuatX[3] = 0.0066
TrafficCarQuatY[3] = -0.0080
TrafficCarQuatZ[3] = -0.6558
TrafficCarQuatW[3] = 0.7548
TrafficCarRecording[3] = 6
TrafficCarStartime[3] = 6072.0000
TrafficCarModel[3] = jackal
//!!! Pos and quaternion will need update as vehicle model had to change, BUFFALO removed from the game !!!
/// !!! ALSO may need re-record if wheels dont sit on the ground now
TrafficCarPos[4] = <<-472.6657, 252.0544, 82.8362>>
TrafficCarQuatX[4] = 0.0018
TrafficCarQuatY[4] = 0.0015
TrafficCarQuatZ[4] = 0.6633
TrafficCarQuatW[4] = 0.7483
TrafficCarRecording[4] = 7
TrafficCarStartime[4] = 9108.0000
TrafficCarModel[4] = buffalo
TrafficCarPos[5] = <<-538.8723, 199.7826, 75.3031>>
TrafficCarQuatX[5] = 0.1322
TrafficCarQuatY[5] = 0.0002
TrafficCarQuatZ[5] = -0.0192
TrafficCarQuatW[5] = 0.9910
TrafficCarRecording[5] = 10
TrafficCarStartime[5] = 11088.0000
TrafficCarModel[5] = tornado
TrafficCarPos[6] = <<-539.8965, 255.4054, 82.4098>>
TrafficCarQuatX[6] = -0.0007
TrafficCarQuatY[6] = -0.0014
TrafficCarQuatZ[6] = 0.9581
TrafficCarQuatW[6] = 0.2865
TrafficCarRecording[6] = 9
TrafficCarStartime[6] = 12750.0000
TrafficCarModel[6] = sentinel
TrafficCarPos[7] = <<-539.5698, 280.9452, 82.5083>>
TrafficCarQuatX[7] = -0.0001
TrafficCarQuatY[7] = -0.0001
TrafficCarQuatZ[7] = 0.9992
TrafficCarQuatW[7] = 0.0409
TrafficCarRecording[7] = 11
TrafficCarStartime[7] = 12850.0000
TrafficCarModel[7] = serrano
TrafficCarPos[8] = <<-633.0772, 271.1177, 81.5183>>
TrafficCarQuatX[8] = -0.0052
TrafficCarQuatY[8] = -0.0044
TrafficCarQuatZ[8] = 0.6509
TrafficCarQuatW[8] = 0.7591
TrafficCarRecording[8] = 13
TrafficCarStartime[8] = 13900.0000
TrafficCarModel[8] = Baller
//edit this one
TrafficCarPos[9] = <<-613.1815, 267.2222, 81.5335>>
TrafficCarQuatX[9] = -0.0084
TrafficCarQuatY[9] = -0.0079
TrafficCarQuatZ[9] = 0.5968
TrafficCarQuatW[9] = 0.8023
TrafficCarRecording[9] = 12
TrafficCarStartime[9] = 14000.0000
TrafficCarModel[9] = tornado
TrafficCarPos[10] = <<-667.2612, 252.6343, 81.1762>>
TrafficCarQuatX[10] = 0.0074
TrafficCarQuatY[10] = -0.0049
TrafficCarQuatZ[10] = -0.5581
TrafficCarQuatW[10] = 0.8298
TrafficCarRecording[10] = 14
TrafficCarStartime[10] = 15048.0000
TrafficCarModel[10] = tornado
TrafficCarPos[11] = <<-775.2990, 210.8092, 75.4151>>
TrafficCarQuatX[11] = -0.0047
TrafficCarQuatY[11] = 0.0035
TrafficCarQuatZ[11] = -0.6623
TrafficCarQuatW[11] = 0.7492
TrafficCarRecording[11] = 16
TrafficCarStartime[11] = 18810.0000
TrafficCarModel[11] = serrano
//!!! Pos and quaternion will need update as vehicle model had to change, BUFFALO removed from the game !!!
/// !!! ALSO may need re-record if wheels dont sit on the ground now
TrafficCarPos[12] = <<-774.7975, 206.4167, 75.4047>>
TrafficCarQuatX[12] = -0.0066
TrafficCarQuatY[12] = 0.0056
TrafficCarQuatZ[12] = -0.6593
TrafficCarQuatW[12] = 0.7518
TrafficCarRecording[12] = 17
TrafficCarStartime[12] = 18876.0000
TrafficCarModel[12] = buffalo
TrafficCarPos[13] = <<-745.6793, 217.5777, 75.4614>>
TrafficCarQuatX[13] = -0.0008
TrafficCarQuatY[13] = 0.0004
TrafficCarQuatZ[13] = -0.5800
TrafficCarQuatW[13] = 0.8146
TrafficCarRecording[13] = 18
TrafficCarStartime[13] = 19074.0000
TrafficCarModel[13] = tornado
TrafficCarPos[14] = <<-805.5899, 219.7039, 75.2721>>
TrafficCarQuatX[14] = -0.0093
TrafficCarQuatY[14] = -0.0083
TrafficCarQuatZ[14] = 0.6901
TrafficCarQuatW[14] = 0.7236
TrafficCarRecording[14] = 19
TrafficCarStartime[14] = 20000.0000
TrafficCarModel[14] = serrano
TrafficCarPos[15] = <<-839.7690, 218.3051, 73.4582>>
TrafficCarQuatX[15] = -0.0132
TrafficCarQuatY[15] = -0.0118
TrafficCarQuatZ[15] = 0.6663
TrafficCarQuatW[15] = 0.7455
TrafficCarRecording[15] = 20
TrafficCarStartime[15] = 20460.0000
TrafficCarModel[15] = emperor
TrafficCarPos[16] = <<-856.8807, 196.2786, 72.6080>>
TrafficCarQuatX[16] = 0.1009
TrafficCarQuatY[16] = -0.0020
TrafficCarQuatZ[16] = -0.0453
TrafficCarQuatW[16] = 0.9939
TrafficCarRecording[16] = 21
TrafficCarStartime[16] = 21400.0000
TrafficCarModel[16] = tornado
TrafficCarPos[17] = <<-858.5552, 173.0333, 67.9306>>
TrafficCarQuatX[17] = 0.1077
TrafficCarQuatY[17] = 0.0013
TrafficCarQuatZ[17] = -0.0262
TrafficCarQuatW[17] = 0.9938
TrafficCarRecording[17] = 22
TrafficCarStartime[17] = 21648.0000
TrafficCarModel[17] = tornado
// will need quat values correcting!!!
TrafficCarPos[18] = <<-867.5400, 233.6300, 73.3800>>
TrafficCarQuatX[18] = 0.0029
TrafficCarQuatY[18] = 0.0017
TrafficCarQuatZ[18] = 0.7365
TrafficCarQuatW[18] = 0.6764
TrafficCarRecording[18] = 15
TrafficCarStartime[18] = 22000.0000
TrafficCarModel[18] = jackal
TrafficCarPos[19] = <<-885.0156, 216.7224, 72.9075>>
TrafficCarQuatX[19] = -0.0254
TrafficCarQuatY[19] = 0.0404
TrafficCarQuatZ[19] = 0.8137
TrafficCarQuatW[19] = -0.5793
TrafficCarRecording[19] = 24
TrafficCarStartime[19] = 22242.0000
TrafficCarModel[19] = tornado
TrafficCarPos[20] = <<-935.3688, 242.8499, 69.7386>>
TrafficCarQuatX[20] = -0.0029
TrafficCarQuatY[20] = 0.0039
TrafficCarQuatZ[20] = 0.8121
TrafficCarQuatW[20] = -0.5835
TrafficCarRecording[20] = 25
TrafficCarStartime[20] = 23562.0000
TrafficCarModel[20] = serrano
TrafficCarPos[21] = <<-1106.0233, 267.2069, 63.9306>>
TrafficCarQuatX[21] = 0.0322
TrafficCarQuatY[21] = -0.0271
TrafficCarQuatZ[21] = 0.7282
TrafficCarQuatW[21] = -0.6841
TrafficCarRecording[21] = 26
TrafficCarStartime[21] = 29367.0000
TrafficCarModel[21] = f620
TrafficCarPos[22] = <<-1146.9456, 244.4222, 66.2596>>
TrafficCarQuatX[22] = -0.0129
TrafficCarQuatY[22] = 0.0093
TrafficCarQuatZ[22] = -0.5717
TrafficCarQuatW[22] = 0.8203
TrafficCarRecording[22] = 27
TrafficCarStartime[22] = 31149.0000
TrafficCarModel[22] = ninef2
//comes out of junction on widing section
TrafficCarPos[23] = <<-1146.5225, 280.7030, 66.1987>>
TrafficCarQuatX[23] = 0.0065
TrafficCarQuatY[23] = -0.0253
TrafficCarQuatZ[23] = 0.9996
TrafficCarQuatW[23] = -0.0069
TrafficCarRecording[23] = 5
TrafficCarStartime[23] = 31553.0000
TrafficCarModel[23] = tornado
TrafficCarPos[24] = <<-1184.5457, 240.2789, 67.3019>>
TrafficCarQuatX[24] = 0.0027
TrafficCarQuatY[24] = -0.0023
TrafficCarQuatZ[24] = -0.6313
TrafficCarQuatW[24] = 0.7755
TrafficCarRecording[24] = 28
TrafficCarStartime[24] = 33000.0000
TrafficCarModel[24] = RapidGT2
TrafficCarPos[25] = <<-1233.5752, 227.3869, 64.6991>>
TrafficCarQuatX[25] = 0.0322
TrafficCarQuatY[25] = -0.0193
TrafficCarQuatZ[25] = -0.6721
TrafficCarQuatW[25] = 0.7395
TrafficCarRecording[25] = 29
TrafficCarStartime[25] = 34317.0000
TrafficCarModel[25] = RapidGT2
// replacement on quiet widing road
TrafficCarPos[26] = <<-1384.7358, 225.2400, 58.3821>>
TrafficCarQuatX[26] = 0.0071
TrafficCarQuatY[26] = -0.0076
TrafficCarQuatZ[26] = 0.9563
TrafficCarQuatW[26] = 0.2922
TrafficCarRecording[26] = 8
TrafficCarStartime[26] = 40977.0000
TrafficCarModel[26] = RapidGT2
TrafficCarPos[27] = <<-1428.7577, 129.0681, 52.6718>>
TrafficCarQuatX[27] = 0.0301
TrafficCarQuatY[27] = -0.0057
TrafficCarQuatZ[27] = -0.1124
TrafficCarQuatW[27] = 0.9932
TrafficCarRecording[27] = 37
TrafficCarStartime[27] = 44235.0000
TrafficCarModel[27] = jackal
TrafficCarPos[28] = <<-1415.9232, -38.1466, 52.6835>>
TrafficCarQuatX[28] = -0.0344
TrafficCarQuatY[28] = -0.0023
TrafficCarQuatZ[28] = 0.1209
TrafficCarQuatW[28] = 0.9921
TrafficCarRecording[28] = 38
TrafficCarStartime[28] = 46875.0000
TrafficCarModel[28] = jackal
TrafficCarPos[29] = <<-1461.8724, -1.2539, 53.1150>>
TrafficCarQuatX[29] = -0.0285
TrafficCarQuatY[29] = 0.0263
TrafficCarQuatZ[29] = -0.6578
TrafficCarQuatW[29] = 0.7522
TrafficCarRecording[29] = 30
TrafficCarStartime[29] = 48436.0000
TrafficCarModel[29] = f620
TrafficCarPos[30] = <<-1483.0806, -3.5968, 54.8590>>
TrafficCarQuatX[30] = -0.0293
TrafficCarQuatY[30] = 0.0225
TrafficCarQuatZ[30] = -0.6524
TrafficCarQuatW[30] = 0.7570
TrafficCarRecording[30] = 32
TrafficCarStartime[30] = 48700.0000
TrafficCarModel[30] = f620
TrafficCarPos[31] = <<-1414.1544, -55.0295, 52.6736>>
TrafficCarQuatX[31] = -0.0002
TrafficCarQuatY[31] = 0.0041
TrafficCarQuatZ[31] = 0.9726
TrafficCarQuatW[31] = -0.2324
TrafficCarRecording[31] = 34
TrafficCarStartime[31] = 50284.0000
TrafficCarModel[31] = RapidGT2
TrafficCarPos[32] = <<-1396.2426, -76.9218, 52.4577>>
TrafficCarQuatX[32] = 0.0020
TrafficCarQuatY[32] = 0.0013
TrafficCarQuatZ[32] = -0.3998
TrafficCarQuatW[32] = 0.9166
TrafficCarRecording[32] = 35
TrafficCarStartime[32] = 51274.0000
TrafficCarModel[32] = RapidGT2
TrafficCarPos[33] = <<-1493.3682, -117.2529, 50.9595>>
TrafficCarQuatX[33] = 0.0127
TrafficCarQuatY[33] = 0.0200
TrafficCarQuatZ[33] = 0.9109
TrafficCarQuatW[33] = 0.4120
TrafficCarRecording[33] = 23
TrafficCarStartime[33] = 55000.0000
TrafficCarModel[33] = RapidGT2
TrafficCarPos[34] = <<-1540.3041, -198.9243, 54.7733>>
TrafficCarQuatX[34] = 0.0290
TrafficCarQuatY[34] = 0.0106
TrafficCarQuatZ[34] = 0.3732
TrafficCarQuatW[34] = 0.9272
TrafficCarRecording[34] = 39
TrafficCarStartime[34] = 56554.0000
TrafficCarModel[34] = f620
TrafficCarPos[35] = <<-1598.0374, -225.2090, 54.4810>>
TrafficCarQuatX[35] = 0.0130
TrafficCarQuatY[35] = -0.0017
TrafficCarQuatZ[35] = -0.2635
TrafficCarQuatW[35] = 0.9646
TrafficCarRecording[35] = 41
TrafficCarStartime[35] = 59722.0000
TrafficCarModel[35] = RapidGT2
TrafficCarPos[36] = <<-1659.9841, -349.6841, 49.2819>>
TrafficCarQuatX[36] = 0.0142
TrafficCarQuatY[36] = -0.0097
TrafficCarQuatZ[36] = -0.4908
TrafficCarQuatW[36] = 0.8711
TrafficCarRecording[36] = 44
TrafficCarStartime[36] = 63220.0000
TrafficCarModel[36] = rocoto
// added on section where rival pap is
TrafficCarPos[37] = <<-1597.3040, -303.3082, 50.0390>>
TrafficCarQuatX[37] = 0.0527
TrafficCarQuatY[37] = 0.0303
TrafficCarQuatZ[37] = 0.3903
TrafficCarQuatW[37] = 0.9187
TrafficCarRecording[37] = 31
TrafficCarStartime[37] = 63577.0000
TrafficCarModel[37] = RapidGT2
TrafficCarPos[38] = <<-1690.8268, -361.6930, 47.9320>>
TrafficCarQuatX[38] = 0.0122
TrafficCarQuatY[38] = -0.0118
TrafficCarQuatZ[38] = -0.6151
TrafficCarQuatW[38] = 0.7883
TrafficCarRecording[38] = 47
TrafficCarStartime[38] = 64012.0000
TrafficCarModel[38] = RapidGT2
TrafficCarPos[39] = <<-1679.7949, -344.0163, 48.5221>>
TrafficCarQuatX[39] = -0.0063
TrafficCarQuatY[39] = -0.0182
TrafficCarQuatZ[39] = 0.7411
TrafficCarQuatW[39] = 0.6711
TrafficCarRecording[39] = 45
TrafficCarStartime[39] = 64150.0000
TrafficCarModel[39] = f620
//!!! Pos and quaternion will need update as vehicle model had to change, matador removed from the game !!!
/// !!! ALSO may need re-record if wheels dont sit on the ground now
TrafficCarPos[40] = <<-1731.0199, -428.0725, 43.3807>>
TrafficCarQuatX[40] = 0.0134
TrafficCarQuatY[40] = 0.0047
TrafficCarQuatZ[40] = -0.3262
TrafficCarQuatW[40] = 0.9452
TrafficCarRecording[40] = 55
TrafficCarStartime[40] = 66572.0000
TrafficCarModel[40] = rocoto
//comes on to sweeping bend where rival pap takes photos
TrafficCarPos[41] = <<-1798.4171, -458.2988, 41.0861>>
TrafficCarQuatX[41] = -0.0036
TrafficCarQuatY[41] = -0.0442
TrafficCarQuatZ[41] = 0.8837
TrafficCarQuatW[41] = -0.4660
TrafficCarRecording[41] = 49
TrafficCarStartime[41] = 68266.0000
TrafficCarModel[41] = f620
//vehicle climbing the bend where rival takes shots
TrafficCarPos[42] = <<-1718.5543, -516.9016, 37.0122>>
TrafficCarQuatX[42] = 0.0053
TrafficCarQuatY[42] = 0.0289
TrafficCarQuatZ[42] = 0.3998
TrafficCarQuatW[42] = 0.9161
TrafficCarRecording[42] = 40
TrafficCarStartime[42] = 69540.0000
TrafficCarModel[42] = f620
//!!! Pos and quaternion will need update as vehicle model had to change, matador removed from the game !!!
/// !!! ALSO may need re-record if wheels dont sit on the ground now
TrafficCarPos[43] = <<-1667.6849, -555.5110, 34.1023>>
TrafficCarQuatX[43] = 0.0205
TrafficCarQuatY[43] = 0.0384
TrafficCarQuatZ[43] = 0.4254
TrafficCarQuatW[43] = 0.9040
TrafficCarRecording[43] = 56
TrafficCarStartime[43] = 73040.0000
TrafficCarModel[43] = rocoto
TrafficCarPos[44] = <<-1647.0862, -565.3936, 32.9925>>
TrafficCarQuatX[44] = -0.0032
TrafficCarQuatY[44] = -0.0033
TrafficCarQuatZ[44] = 0.9523
TrafficCarQuatW[44] = 0.3050
TrafficCarRecording[44] = 50
TrafficCarStartime[44] = 74836.0000
TrafficCarModel[44] = RapidGT2
TrafficCarPos[45] = <<-1606.4623, -607.8560, 31.5569>>
TrafficCarQuatX[45] = 0.0220
TrafficCarQuatY[45] = 0.0106
TrafficCarQuatZ[45] = 0.4308
TrafficCarQuatW[45] = 0.9021
TrafficCarRecording[45] = 51
TrafficCarStartime[45] = 75166.0000
TrafficCarModel[45] = RapidGT2
//on road the pap guy turns onto
TrafficCarPos[46] = <<-1594.0869, -521.4292, 34.9854>>
TrafficCarQuatX[46] = -0.0077
TrafficCarQuatY[46] = -0.0061
TrafficCarQuatZ[46] = 0.8805
TrafficCarQuatW[46] = 0.4739
TrafficCarRecording[46] = 33
TrafficCarStartime[46] = 75476.0000
TrafficCarModel[46] = RapidGT2
TrafficCarPos[47] = <<-1546.9274, -671.7556, 28.4704>>
TrafficCarQuatX[47] = 0.0020
TrafficCarQuatY[47] = -0.0044
TrafficCarQuatZ[47] = 0.9056
TrafficCarQuatW[47] = -0.4241
TrafficCarRecording[47] = 54
TrafficCarStartime[47] = 78004.0000
TrafficCarModel[47] = RapidGT2
// **** UBER RECORDED PARKED CARS ****
ParkedCarPos[0] = <<-283.4568, 251.5497, 88.9099>>
ParkedCarQuatX[0] = 0.0365
ParkedCarQuatY[0] = -0.0067
ParkedCarQuatZ[0] = -0.6704
ParkedCarQuatW[0] = 0.7411
ParkedCarModel[0] = ninef2
ParkedCarPos[1] = <<-339.4699, 293.5367, 85.4549>>
ParkedCarQuatX[1] = 0.0214
ParkedCarQuatY[1] = -0.0196
ParkedCarQuatZ[1] = -0.6993
ParkedCarQuatW[1] = 0.7142
ParkedCarModel[1] = Baller
ParkedCarPos[2] = <<-349.3771, 286.2561, 84.4616>>
ParkedCarQuatX[2] = -0.0255
ParkedCarQuatY[2] = -0.0264
ParkedCarQuatZ[2] = 0.6980
ParkedCarQuatW[2] = 0.7152
ParkedCarModel[2] = emperor
ParkedCarPos[3] = <<-365.4896, 231.2178, 84.2379>>
ParkedCarQuatX[3] = 0.0266
ParkedCarQuatY[3] = 0.0114
ParkedCarQuatZ[3] = -0.6726
ParkedCarQuatW[3] = 0.7394
ParkedCarModel[3] = jackal
ParkedCarPos[4] = <<-438.5490, 254.1521, 82.2881>>
ParkedCarQuatX[4] = -0.0259
ParkedCarQuatY[4] = 0.0162
ParkedCarQuatZ[4] = 0.6577
ParkedCarQuatW[4] = 0.7527
ParkedCarModel[4] = sentinel
ParkedCarPos[5] = <<-1501.3237, -686.0034, 27.1490>>
ParkedCarQuatX[5] = 0.0131
ParkedCarQuatY[5] = 0.0418
ParkedCarQuatZ[5] = 0.4600
ParkedCarQuatW[5] = 0.8869
ParkedCarModel[5] = Mesa
ParkedCarPos[6] = <<-501.7928, 241.8177, 82.6462>>
ParkedCarQuatX[6] = -0.0166
ParkedCarQuatY[6] = -0.0207
ParkedCarQuatZ[6] = 0.7367
ParkedCarQuatW[6] = -0.6758
ParkedCarModel[6] = jackal
ParkedCarPos[7] = <<-488.9706, 270.0654, 82.7035>>
ParkedCarQuatX[7] = -0.0005
ParkedCarQuatY[7] = -0.0128
ParkedCarQuatZ[7] = 0.7263
ParkedCarQuatW[7] = -0.6873
ParkedCarModel[7] = emperor
ParkedCarPos[8] = <<-573.4771, 269.1175, 82.3261>>
ParkedCarQuatX[8] = -0.0337
ParkedCarQuatY[8] = 0.0059
ParkedCarQuatZ[8] = 0.6577
ParkedCarQuatW[8] = 0.7525
ParkedCarModel[8] = RapidGT2
ParkedCarPos[9] = <<-608.2574, 252.1780, 81.3708>>
ParkedCarQuatX[9] = -0.0217
ParkedCarQuatY[9] = -0.0091
ParkedCarQuatZ[9] = 0.7397
ParkedCarQuatW[9] = -0.6725
ParkedCarModel[9] = RapidGT2
ParkedCarPos[10] = <<-684.0115, 237.1335, 80.5793>>
ParkedCarQuatX[10] = 0.0148
ParkedCarQuatY[10] = 0.0140
ParkedCarQuatZ[10] = -0.5278
ParkedCarQuatW[10] = 0.8491
ParkedCarModel[10] = jackal
ParkedCarPos[11] = <<-687.9144, 293.1930, 82.1187>>
ParkedCarQuatX[11] = 0.0060
ParkedCarQuatY[11] = 0.0308
ParkedCarQuatZ[11] = 0.6746
ParkedCarQuatW[11] = 0.7375
ParkedCarModel[11] = ninef2
ParkedCarPos[12] = <<-699.9624, 258.1157, 80.4591>>
ParkedCarQuatX[12] = -0.0385
ParkedCarQuatY[12] = -0.0023
ParkedCarQuatZ[12] = 0.8429
ParkedCarQuatW[12] = 0.5367
ParkedCarModel[12] = jackal
ParkedCarPos[13] = <<-707.4021, 254.6637, 80.0296>>
ParkedCarQuatX[13] = -0.0446
ParkedCarQuatY[13] = 0.0053
ParkedCarQuatZ[13] = 0.8525
ParkedCarQuatW[13] = 0.5207
ParkedCarModel[13] = ninef2
ParkedCarPos[14] = <<-726.7914, 295.4570, 84.4710>>
ParkedCarQuatX[14] = -0.0084
ParkedCarQuatY[14] = 0.0234
ParkedCarQuatZ[14] = 0.7017
ParkedCarQuatW[14] = 0.7120
ParkedCarModel[14] = jackal
ParkedCarPos[15] = <<-727.1002, 245.5221, 77.8995>>
ParkedCarQuatX[15] = -0.0710
ParkedCarQuatY[15] = -0.0493
ParkedCarQuatZ[15] = 0.8491
ParkedCarQuatW[15] = 0.5210
ParkedCarModel[15] = RapidGT2
ParkedCarPos[16] = <<-1248.6432, 253.0192, 63.5542>>
ParkedCarQuatX[16] = -0.0102
ParkedCarQuatY[16] = -0.0354
ParkedCarQuatZ[16] = 0.2844
ParkedCarQuatW[16] = 0.9580
ParkedCarModel[16] = RapidGT2
//!!! Pos and quaternion will need update as vehicle model had to change, matador removed from the game !!!
ParkedCarPos[17] = <<-1480.4155, -610.0646, 30.5239>>
ParkedCarQuatX[17] = -0.0260
ParkedCarQuatY[17] = 0.0011
ParkedCarQuatZ[17] = 0.8868
ParkedCarQuatW[17] = 0.4614
ParkedCarModel[17] = rocoto
//!!! Pos and quaternion will need update as vehicle model had to change, matador removed from the game !!!
ParkedCarPos[18] = <<-1590.7861, -644.4308, 29.8759>>
ParkedCarQuatX[18] = -0.0146
ParkedCarQuatY[18] = -0.0321
ParkedCarQuatZ[18] = 0.8915
ParkedCarQuatW[18] = -0.4517
ParkedCarModel[18] = rocoto
ParkedCarPos[19] = <<-1509.8171, -679.0406, 27.7404>>
ParkedCarQuatX[19] = 0.0124
ParkedCarQuatY[19] = 0.0412
ParkedCarQuatZ[19] = 0.4361
ParkedCarQuatW[19] = 0.8989
ParkedCarModel[19] = Mesa
ParkedCarPos[20] = <<-1288.8661, 266.9813, 63.7359>>
ParkedCarQuatX[20] = 0.0373
ParkedCarQuatY[20] = -0.0101
ParkedCarQuatZ[20] = -0.2742
ParkedCarQuatW[20] = 0.9609
ParkedCarModel[20] = RapidGT2
ParkedCarPos[21] = <<-1608.5123, -630.4704, 30.6462>>
ParkedCarQuatX[21] = -0.0159
ParkedCarQuatY[21] = -0.0320
ParkedCarQuatZ[21] = 0.8810
ParkedCarQuatW[21] = -0.4718
ParkedCarModel[21] = Mesa
ParkedCarPos[22] = <<-1351.0996, 244.0114, 59.8691>>
ParkedCarQuatX[22] = -0.0220
ParkedCarQuatY[22] = -0.0512
ParkedCarQuatZ[22] = 0.9952
ParkedCarQuatW[22] = -0.0810
ParkedCarModel[22] = RapidGT2
ParkedCarPos[23] = <<-1580.1294, -214.9907, 54.3721>>
ParkedCarQuatX[23] = 0.0235
ParkedCarQuatY[23] = 0.0162
ParkedCarQuatZ[23] = -0.3399
ParkedCarQuatW[23] = 0.9400
ParkedCarModel[23] = RapidGT2
ParkedCarPos[24] = <<-1584.4117, -220.3301, 54.2076>>
ParkedCarQuatX[24] = 0.0181
ParkedCarQuatY[24] = 0.0231
ParkedCarQuatZ[24] = -0.3403
ParkedCarQuatW[24] = 0.9399
ParkedCarModel[24] = RapidGT2
ParkedCarPos[25] = <<-1644.8414, -347.8500, 49.4095>>
ParkedCarQuatX[25] = 0.0212
ParkedCarQuatY[25] = 0.0147
ParkedCarQuatZ[25] = -0.4400
ParkedCarQuatW[25] = 0.8976
ParkedCarModel[25] = RapidGT2
//!!! Pos and quaternion will need update as vehicle model had to change, matador removed from the game !!!
ParkedCarPos[26] = <<-1684.9635, -570.7172, 34.4679>>
ParkedCarQuatX[26] = -0.0007
ParkedCarQuatY[26] = -0.0608
ParkedCarQuatZ[26] = 0.8986
ParkedCarQuatW[26] = -0.4345
ParkedCarModel[26] = rocoto
ParkedCarPos[27] = <<-1706.1578, -408.2234, 44.9785>>
ParkedCarQuatX[27] = 0.0492
ParkedCarQuatY[27] = 0.0021
ParkedCarQuatZ[27] = -0.3248
ParkedCarQuatW[27] = 0.9445
ParkedCarModel[27] = RapidGT2
ParkedCarPos[28] = <<-1785.5399, -505.2336, 38.3513>>
ParkedCarQuatX[28] = -0.0003
ParkedCarQuatY[28] = -0.0001
ParkedCarQuatZ[28] = -0.4654
ParkedCarQuatW[28] = 0.8851
ParkedCarModel[28] = RapidGT2
ParkedCarPos[29] = <<-1775.0933, -516.8105, 38.3838>>
ParkedCarQuatX[29] = -0.0029
ParkedCarQuatY[29] = -0.0028
ParkedCarQuatZ[29] = 0.8619
ParkedCarQuatW[29] = 0.5070
ParkedCarModel[29] = RapidGT2
//!!! Pos and quaternion will need update as vehicle model had to change, matador removed from the game !!!
ParkedCarPos[30] = <<-1770.0879, -522.8300, 38.5967>>
ParkedCarQuatX[30] = -0.0029
ParkedCarQuatY[30] = 0.0006
ParkedCarQuatZ[30] = 0.8626
ParkedCarQuatW[30] = 0.5059
ParkedCarModel[30] = rocoto
//!!! Pos and quaternion will need update as vehicle model had to change, matador removed from the game !!!
ParkedCarPos[31] = <<-1700.4822, -560.2477, 35.9312>>
ParkedCarQuatX[31] = -0.0021
ParkedCarQuatY[31] = -0.0624
ParkedCarQuatZ[31] = 0.8919
ParkedCarQuatW[31] = -0.4478
ParkedCarModel[31] = rocoto
//!!! Pos and quaternion will need update as vehicle model had to change, matador removed from the game !!!
ParkedCarPos[32] = <<-1690.1038, -567.1520, 34.9940>>
ParkedCarQuatX[32] = -0.0034
ParkedCarQuatY[32] = -0.0581
ParkedCarQuatZ[32] = 0.8833
ParkedCarQuatW[32] = -0.4651
ParkedCarModel[32] = rocoto
// **** UBER RECORDED SET PIECE CARS ****
// set behind the main car and the player's view to come down the road
SetPieceCarPos[0] = <<-143.9162, 258.2889, 94.5251>>
SetPieceCarQuatX[0] = -0.0303
SetPieceCarQuatY[0] = -0.0223
SetPieceCarQuatZ[0] = 0.6939
SetPieceCarQuatW[0] = 0.7191
SetPieceCarRecording[0] = 57
SetPieceCarStartime[0] = 0.0000
SetPieceCarRecordingSpeed[0] = PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK
SetPieceCarModel[0] = buffalo
// drives up the hill and turns left onto road opposite start point
SetPieceCarPos[1] = <<-219.1163, 226.1757, 88.5679>>
SetPieceCarQuatX[1] = 0.1090
SetPieceCarQuatY[1] = 0.0087
SetPieceCarQuatZ[1] = 0.0041
SetPieceCarQuatW[1] = 0.9940
SetPieceCarRecording[1] = 59
SetPieceCarStartime[1] = 250.0000
SetPieceCarRecordingSpeed[1] = PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK
SetPieceCarModel[1] = jackal
// start, drives up over the hill
SetPieceCarPos[2] = <<-277.7864, 257.1765, 89.5156>>
SetPieceCarQuatX[2] = 0.0246
SetPieceCarQuatY[2] = -0.0264
SetPieceCarQuatZ[2] = -0.6748
SetPieceCarQuatW[2] = 0.7371
SetPieceCarRecording[2] = 58
SetPieceCarStartime[2] = 400.0000
SetPieceCarRecordingSpeed[2] = PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK
SetPieceCarModel[2] = jackal
//moved from traffic car [34]
SetPieceCarPos[3] = <<-1338.0682, 205.2171, 58.2626>>
SetPieceCarQuatX[3] = 0.0094
SetPieceCarQuatY[3] = 0.0224
SetPieceCarQuatZ[3] = -0.6916
SetPieceCarQuatW[3] = 0.7219
SetPieceCarRecording[3] = 36
SetPieceCarStartime[3] = 37978.0000
SetPieceCarRecordingSpeed[3] = PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK
SetPieceCarModel[3] = jackal
//moved from traffic car [40]
SetPieceCarPos[4] = <<-524.0712, 250.7650, 82.5395>>
SetPieceCarQuatX[4] = -0.0022
SetPieceCarQuatY[4] = 0.0037
SetPieceCarQuatZ[4] = 0.7477
SetPieceCarQuatW[4] = -0.6641
SetPieceCarRecording[4] = 42
SetPieceCarStartime[4] = 10151.0000
SetPieceCarRecordingSpeed[4] = PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK
SetPieceCarModel[4] = buffalo
//moved from traffic car [41]
SetPieceCarPos[5] = <<-640.2011, 258.0730, 80.8710>>
SetPieceCarQuatX[5] = -0.0265
SetPieceCarQuatY[5] = -0.0020
SetPieceCarQuatZ[5] = 0.7299
SetPieceCarQuatW[5] = -0.6830
SetPieceCarRecording[5] = 43
SetPieceCarStartime[5] = 13517.0000
SetPieceCarRecordingSpeed[5] = PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK
SetPieceCarModel[5] = buffalo
//moved from traffic car [44]
SetPieceCarPos[6] = <<-1062.9277, 258.7392, 63.7718>>
SetPieceCarQuatX[6] = -0.0022
SetPieceCarQuatY[6] = 0.0060
SetPieceCarQuatZ[6] = 0.7219
SetPieceCarQuatW[6] = -0.6920
SetPieceCarRecording[6] = 46
SetPieceCarStartime[6] = 26981.0000
SetPieceCarRecordingSpeed[6] = PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK
SetPieceCarModel[6] = jackal
ENDPROC
/// PURPOSE:
/// deals with requesting and removing the vehicle recordings
/// used by ther set piece and traffic vehicles in the uber recording
PROC PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK()
IF GET_GAME_TIMER() - iPreLoadRecordingsTimer > 3
INT i = 0
REPEAT COUNT_OF(SetPieceCarID) i
IF SetPieceCarRecording[i] > 0
IF (fCurrentPlaybackTime > (SetPieceCarStartime[i] - 5000.0))
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[i], sPap1_UberRecordingName)
IF NOT DOES_ENTITY_EXIST(SetPieceCarID[i])
REQUEST_MODEL(SetPieceCarModel[i])
ENDIF
ELIF (fCurrentPlaybackTime > (SetPieceCarStartime[i] + 3000.0))
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[i], sPap1_UberRecordingName)
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT COUNT_OF(TrafficCarID) i
IF TrafficCarRecording[i] > 0
IF (fCurrentPlaybackTime > (TrafficCarStartime[i] - 5000.0))
REQUEST_VEHICLE_RECORDING(TrafficCarRecording[i], sPap1_UberRecordingName)
/*IF NOT DOES_ENTITY_EXIST(TrafficCarID[i]) // not sure if i should do this
REQUEST_MODEL(TrafficCarModel[i])
ENDIF*/
ELIF (fCurrentPlaybackTime > (TrafficCarStartime[i] + 3000.0))
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(TrafficCarID[i])
REMOVE_VEHICLE_RECORDING(TrafficCarRecording[i], sPap1_UberRecordingName)
ENDIF
ENDIF
ENDIF
ENDREPEAT
iPreLoadRecordingsTimer = GET_GAME_TIMER()
ENDIF
ENDPROC
/// PURPOSE:
/// Removes all of the vehicle recordings needed for the uber recorder
PROC REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE()
INT iNumTrafficCars = COUNT_OF(TrafficCarID)
INT iNumSetPieceCars = COUNT_OF(SetPieceCarID)
INT i = 0
//celeb vehicle's recording
REMOVE_VEHICLE_RECORDING(1, sPap1_UberRecordingName)
REPEAT iNumTrafficCars i
IF TrafficCarRecording[i] > 0
REMOVE_VEHICLE_RECORDING(TrafficCarRecording[i], sPap1_UberRecordingName)
ENDIF
ENDREPEAT
i = 0
REPEAT iNumSetPieceCars i
IF SetPieceCarRecording[i] > 0
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[i], sPap1_UberRecordingName)
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// taken from traffic.sch for skipping time in recording which isn't part of the uber recording
/// PARAMS:
/// InCar -
/// iRec -
/// fTime -
/// bPlay -
/// bUseAI -
/// bForceUpdate -
/// bSwitchToAIOnPlayerImpact -
/// bSwitchToAIOnAnyImpact -
/// RETURNS:
///
FUNC BOOL PAP1_SET_CAR_AT_PLAYBACK_POSITION(VEHICLE_INDEX &InCar, INT iRec, STRING sRecName, FLOAT fTime, BOOL bPlay, BOOL bUseAI, BOOL bForceUpdate = FALSE,
BOOL bSwitchToAIOnPlayerImpact = FALSE, BOOL bSwitchToAIOnAnyImpact = FALSE)
FLOAT fTemp
IF (iRec > 0)
REQUEST_VEHICLE_RECORDING(iRec, sRecName)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iRec, sRecName)
IF IS_VEHICLE_DRIVEABLE(InCar)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(InCar)
FREEZE_ENTITY_POSITION(InCar, FALSE)
IF (bUseAI)
START_PLAYBACK_RECORDED_VEHICLE_USING_AI(InCar, iRec, sRecName)
ELSE
IF iRec != iDontSwitchThisSetpieceRecordingToAI
AND iRec != iDontSwitchThisSetpieceRecordingToAI2
IF bSwitchToAIOnAnyImpact
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(InCar, iRec, sRecName, ENUM_TO_INT(SWITCH_ON_ANY_VEHICLE_IMPACT) | ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY))
ELIF bSwitchToAIOnPlayerImpact
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(InCar, iRec, sRecName, ENUM_TO_INT(SWITCH_ON_PLAYER_VEHICLE_IMPACT) | ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY))
ELSE
START_PLAYBACK_RECORDED_VEHICLE(InCar, iRec, sRecName)
ENDIF
ELSE
START_PLAYBACK_RECORDED_VEHICLE(InCar, iRec, sRecName)
ENDIF
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(InCar, fTime)
IF bForceUpdate
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(InCar)
ENDIF
RETURN(TRUE)
ENDIF
ELSE
IF (GET_CURRENT_PLAYBACK_FOR_VEHICLE(InCar) = GET_VEHICLE_RECORDING_ID(iRec, sRecName))
fTemp = GET_TIME_POSITION_IN_RECORDING(InCar)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(InCar, (fTime - fTemp))
IF NOT (bPlay)
STOP_PLAYBACK_RECORDED_VEHICLE(InCar)
REQUEST_VEHICLE_RECORDING(iRec, sRecName)
ENDIF
IF bForceUpdate
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(InCar)
ENDIF
RETURN(TRUE)
ELSE
STOP_PLAYBACK_RECORDED_VEHICLE(InCar)
FREEZE_ENTITY_POSITION(InCar, FALSE)
IF (bUseAI)
START_PLAYBACK_RECORDED_VEHICLE_USING_AI(InCar, iRec, sRecName)
ELSE
IF iRec != iDontSwitchThisSetpieceRecordingToAI
AND iRec != iDontSwitchThisSetpieceRecordingToAI2
IF bSwitchToAIOnAnyImpact
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(InCar, iRec, sRecName, ENUM_TO_INT(SWITCH_ON_ANY_VEHICLE_IMPACT) | ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY))
ELIF bSwitchToAIOnPlayerImpact
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(InCar, iRec, sRecName, ENUM_TO_INT(SWITCH_ON_PLAYER_VEHICLE_IMPACT) | ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY))
ELSE
START_PLAYBACK_RECORDED_VEHICLE(InCar, iRec, sRecName)
ENDIF
ELSE
START_PLAYBACK_RECORDED_VEHICLE(InCar, iRec, sRecName)
ENDIF
ENDIF
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(InCar, fTime)
IF bForceUpdate
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(InCar)
ENDIF
RETURN(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN(FALSE)
ENDFUNC
/// PURPOSE:
/// detach an entity, checking for IS_ENTITY_ALIVE
/// PARAMS:
/// entityIndex - entity to detach
PROC SAFE_DETACH_ENTITY(ENTITY_INDEX &entityIndex)
IF IS_ENTITY_ALIVE(entityIndex)
IF IS_ENTITY_ATTACHED(entityIndex)
DETACH_ENTITY(entityIndex)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// remove object from the game
/// PARAMS:
/// objectIndex - object to remove
/// bDelete - if true delete it, else set as no longer needed
PROC SAFE_REMOVE_OBJECT(OBJECT_INDEX &objectIndex, BOOL bDelete = FALSE)
IF bDelete
SAFE_DELETE_OBJECT(objectIndex)
ELSE
SAFE_RELEASE_OBJECT(objectIndex)
ENDIF
ENDPROC
/// PURPOSE:
/// removes vehicle from the world
/// PARAMS:
/// vehIndex - vehicle to be removed
/// bDelete - if true AND player isn't inside it delete it, else set as no longer needed
PROC SAFE_REMOVE_VEHICLE(VEHICLE_INDEX &vehIndex, BOOL bDelete = FALSE)
IF bDelete
SAFE_DELETE_VEHICLE(vehIndex)
ELSE
SAFE_RELEASE_VEHICLE(vehIndex)
ENDIF
ENDPROC
/// PURPOSE:
/// removes ped from the game
/// PARAMS:
/// ped - ped to be removed
/// bDelete - if true delete it, else set as no longer needed
/// bDetach - if true ped will be detached if attached, and no in a vehicle or getting into a vehicle
PROC SAFE_REMOVE_PED(PED_INDEX &ped, BOOL bDelete = FALSE)
IF bDelete
SAFE_DELETE_PED(ped)
ELSE
SAFE_RELEASE_PED(ped)
ENDIF
ENDPROC
/// PURPOSE:
/// teleport a ped to a new location
/// PARAMS:
/// pedIndex - ped to teleport
/// vPosition - position to teleport to
/// fHeading - heading to give the ped at the new location
/// bSnapToGround - if true ped will be positioned at ground level, else drops in a meter above
/// bForcePedAiAndAnimUpdate - if true FORCE_PED_AI_AND_ANIMATION_UPDATE is applied on the ped
PROC SAFE_TELEPORT_PED(PED_INDEX pedIndex, VECTOR vPosition, FLOAT fHeading = 0.0, BOOL bSnapToGround = FALSE, BOOL bForcePedAiAndAnimUpdate = FALSE)
IF IS_ENTITY_ALIVE(pedIndex)
IF bSnapToGround
// getting odd results with this where peds are 1m+ above ground level
/*FLOAT fTempGroundZ
IF GET_GROUND_Z_FOR_3D_COORD(vPosition, fTempGroundZ)
vPosition.Z = fTempGroundZ
ENDIF*/
vPosition.Z = INVALID_WORLD_Z
ENDIF
SET_ENTITY_COORDS(pedIndex, vPosition)
SET_ENTITY_HEADING(pedIndex, fHeading)
IF bForcePedAiAndAnimUpdate
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedIndex)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// teleports a ped out of their vehicle.
/// NOTE: proc waits until GET_SAFE_COORD_FOR_PED returns true
/// PARAMS:
/// pedIndex - ped to Teleport
PROC SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE(PED_INDEX pedIndex)
VECTOR vRespotCoords = << 0.0, 0.0, 0.0 >>
FLOAT fRespotHeading = 0.0
IF IS_ENTITY_ALIVE(pedIndex)
IF IS_PED_SITTING_IN_ANY_VEHICLE(pedIndex)
vRespotCoords = GET_ENTITY_COORDS(pedIndex)
WHILE NOT GET_SAFE_COORD_FOR_PED(vRespotCoords, FALSE, vRespotCoords)
WAIT(0)
vRespotCoords.x += 2.0
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE - looking for safe coords") ENDIF #ENDIF
ENDWHILE
fRespotHeading = GET_ENTITY_HEADING(pedIndex)
SAFE_TELEPORT_PED(pedIndex, vRespotCoords, fRespotHeading, TRUE, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks ped and vehicle are ok before putting the ped in the vehicle
/// If the seat is already occupied by a ped, it gets deleted.
/// PARAMS:
/// pedIndex - ped to put in the vehicle
/// vehIndex - vehicle ped is going into
/// seat - seat ped is to sit in
PROC SAFE_PUT_PED_INTO_VEHICLE(PED_INDEX pedIndex, VEHICLE_INDEX &vehIndex, VEHICLE_SEAT seat = VS_DRIVER)
IF IS_ENTITY_ALIVE(pedIndex)
AND IS_VEHICLE_OK(vehIndex)
IF IS_VEHICLE_SEAT_FREE(vehIndex, seat)
SAFE_SET_PED_INTO_VEHICLE(pedIndex, vehIndex, seat)
ELSE
PED_INDEX pedTemp_AlreadyInSeat = GET_PED_IN_VEHICLE_SEAT(vehIndex, seat) //check the ped we want to put in the vehicle isn't already in the vehicle
IF pedTemp_AlreadyInSeat != pedIndex
IF IS_ENTITY_ALIVE(pedTemp_AlreadyInSeat)
SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE(pedTemp_AlreadyInSeat)
SAFE_PUT_PED_INTO_VEHICLE(pedIndex, vehIndex, seat)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Test for if two coords are within fRange metres of each other
/// PARAMS:
/// v1 - first coord
/// v2 - second coord
/// fRange - distance
/// RETURNS:
/// TRUE if two coords are withing fRange of each other
FUNC BOOL IS_COORD_IN_RANGE_OF_COORD(VECTOR v1, VECTOR v2, FLOAT fRange)
RETURN VDIST2(v1, v2) <= (fRange*fRange)
ENDFUNC
/// PURPOSE:
/// Test for if two coords 2D are within fRange metres of each other
/// PARAMS:
/// v1 - first coord
/// v2 - second coord
/// fRange - distance
/// RETURNS:
/// TRUE if two coords are withing fRange of each other in 2D
FUNC BOOL PAP1_IS_COORD_IN_RANGE_OF_COORD_2D(VECTOR v1, VECTOR v2, FLOAT fRange)
VECTOR vDiff = v2 - v1
RETURN ((vDiff.x * vDiff.x) + (vDiff.y * vDiff.y)) <= (fRange * fRange)
ENDFUNC
/// PURPOSE:
/// Test if Beverly has been consecutively aiming the camera at the celeb for at least the specified time
/// PARAMS:
/// iTimeAmount - the time to have been aiming for
/// RETURNS:
/// TRUE if he has been successfully aiming for iTimeAmount or more
FUNC BOOL HAS_TIME_PASSED_BEV_CONSECUTIVELY_AIMED_CAMERA_AT_CELEB(INT iTimeAmount)
IF iConsecutiveAimingTimer = -1 // if the value hasn't be initial set don't check the timer
RETURN FALSE
ENDIF
RETURN (GET_GAME_TIMER() - iConsecutiveAimingTimer) > iTimeAmount
ENDFUNC
/// PURPOSE:
/// check if iTimeAmount has passed since iTimer was set
/// PARAMS:
/// iTimer - the timer
/// iTimeAmount - the amount of time to check has passed
/// RETURNS:
/// True is the specified amount of time has passed for the specified timer.
FUNC BOOL HAS_TIME_PASSED(INT iTimer, INT iTimeAmount)
RETURN (GET_GAME_TIMER() - iTimer) > iTimeAmount
ENDFUNC
/// PURPOSE:
/// Performs the CAN_PED_SEE_PED check and sets the specified FrameCounter if it returned TRUE
/// counter is used as a grace period for checking the ped has seen the player, as CAN_PED_SEE_PED takes several frames to return
/// PARAMS:
/// pedIndex - the ped to test against the player
/// iFrameCountLastSeenPlayer - the ped's last seen player counter
/// fOverride_PedViewCone - the ped's viewing cone - 170 is the default value
PROC UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(PED_INDEX pedIndex, INT &iFrameCountLastSeenPlayer, FLOAT fOverride_PedViewCone = 170.0)
IF IS_ENTITY_ALIVE(pedIndex)
IF CAN_PED_SEE_PED(pedIndex, PLAYER_PED_ID(), fOverride_PedViewCone)
iFrameCountLastSeenPlayer = GET_FRAME_COUNT()
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER - CAN_PED_SEE_PED returned TRUE so set frame count to : ", iFrameCountLastSeenPlayer) ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Check is the specified frame count has passed using specified timer.
/// PARAMS:
/// iFrameCounterTimer - Frame Count to check.
/// iFrameAmount - Frame Count to check against.
/// RETURNS:
/// True is the specified amount of iFrameAmount has passed for the specified iFrameCounterTimer.
FUNC BOOL HAS_FRAME_COUNTER_PASSED(INT iFrameCounterTimer, INT iFrameAmount)
RETURN (GET_FRAME_COUNT() - iFrameCounterTimer) > iFrameAmount
ENDFUNC
/// PURPOSE:
/// gets which side vCoordsToCheck is to entityIndex
/// Used to decide which attack anim to play, based on which side of the victim the attacking ped is approaching from
/// NOTE: doesn't check entity is alive
/// PARAMS:
/// entityIndex - the entity to check against
/// vEntityCoords - the entities coords
/// vCoordsToCheck - the coords we want to check
/// RETURNS:
/// Int depicting the side of entityIndex the vCoordsToCheck is. 0 = Left side, 1 = Right side, -1 = directly in line
FUNC INT GET_SIDE_COORDS_IS_TO_ENTITY(ENTITY_INDEX entityIndex, VECTOR vEntityCoords, VECTOR vCoordsToCheck)
FLOAT fSide
VECTOR vPlaneNorm
vPlaneNorm = NORMALISE_VECTOR(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityIndex, << 3.0, 0.0, 0.0 >>) - vEntityCoords)
fSide = DOT_PRODUCT(vCoordsToCheck - vEntityCoords, vPlaneNorm)
#IF IS_DEBUG_BUILD
IF bDebug_DisplayInfo_GetSideCoordsIsToEntity
VECTOR vTemp
vTemp = GET_ENTITY_FORWARD_VECTOR(entityIndex) * 60.0
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(entityIndex) + vTemp, GET_ENTITY_COORDS(entityIndex) - vTemp, 255, 0, 0, 150)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_SIDE_COORDS_IS_TO_ENTITY : vEntityCoords = ", vEntityCoords) ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_SIDE_COORDS_IS_TO_ENTITY : vCoordsToCheck = ", vCoordsToCheck) ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_SIDE_COORDS_IS_TO_ENTITY : vPlaneNorm = ", vPlaneNorm) ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_SIDE_COORDS_IS_TO_ENTITY dot returning : ", fSide) ENDIF #ENDIF
ENDIF
#ENDIF
IF (fSide < 0)
#IF IS_DEBUG_BUILD IF bDebug_DisplayInfo_GetSideCoordsIsToEntity DRAW_RECT(0.3, 0.3, 0.2, 0.2, 0, 255, 0, 150) ENDIF #ENDIF // green box
RETURN 0 //left side
ELIF (fSide > 0)
#IF IS_DEBUG_BUILD IF bDebug_DisplayInfo_GetSideCoordsIsToEntity DRAW_RECT(0.3, 0.3, 0.2, 0.2, 0, 0, 255, 150) ENDIF #ENDIF // blue box
RETURN 1 //right side
ENDIF
RETURN -1 // directly in line
ENDFUNC
/// PURPOSE:
/// Checks if two vectors are similair with in the specified thresholds
/// PARAMS:
/// v1 - Vector 1
/// v2 - Vector 2
/// fTolerance - Tolerance factor.
/// RETURNS:
/// TRUE if v1 is within fTolerance of v2.
FUNC BOOL ARE_VECTORS_SIMILIAR_WITHIN_THRESHOLDS(VECTOR v1, VECTOR v2, FLOAT fX_threshold = 0.5, FLOAT fY_threshold = 0.5, FLOAT fZ_threshold = 0.5)
#IF IS_DEBUG_BUILD
VECTOR vTempMin
VECTOR vTempMax
vTempMin = v1 - << fX_threshold, fY_threshold, fZ_threshold >>
vTempMax = v1 + << fX_threshold, fY_threshold, fZ_threshold >>
DRAW_DEBUG_BOX(vTempMin, vTempMax, 0, 255, 0, 150)
vTempMin = v2 - << fX_threshold, fY_threshold, fZ_threshold >>
vTempMax = v2 + << fX_threshold, fY_threshold, fZ_threshold >>
DRAW_DEBUG_BOX(vTempMin, vTempMax, 0, 0, 255, 150)
#ENDIF
IF ABSF(v1.x - v2.x) <= fX_threshold
IF ABSF(v1.y - v2.y) <= fY_threshold
IF ABSF(v1.z - v2.z) <= fZ_threshold
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, DEBUG_MISSION, "ARE_VECTORS_SIMILIAR_WITHIN_THRESHOLDS -> returning true ") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// clear's the specified print if it is displaying
/// PARAMS:
/// sStringToClear - string to test
PROC CLEAR_SPECIFIC_PRINT_FROM_DISPLAYING(STRING sStringToClear)
IF IS_THIS_PRINT_BEING_DISPLAYED(sStringToClear)
CLEAR_THIS_PRINT(sStringToClear)
ENDIF
ENDPROC
/// PURPOSE:
/// clear's the specified help text if it is displaying
/// PARAMS:
/// sStringToClear - string to test
PROC CLEAR_SPECIFIC_HELP_TEXT_FROM_DISPLAYING(STRING sStringToClear, BOOL bClearNow = TRUE)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(sStringToClear)
CLEAR_HELP(bClearNow)
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if a specific conversation root is currently playing
/// also checks against the issue where GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT
/// can return "NULL" the first few frames after CREATE_CONVERSATION has returned true
/// PARAMS:
/// sConversationRoot - the conversation root to test
/// RETURNS:
/// TRUE - if there is an ongoing or queued conversation with a root matching the passed in string or "NULL"
FUNC BOOL IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(STRING sConversationRoot)
TEXT_LABEL_23 tlTempRoot
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
tlTempRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
//if current root matches passed in string return true
IF ARE_STRINGS_EQUAL(tlTempRoot, sConversationRoot)
RETURN TRUE
ENDIF
//if current root matches null, return true
//because if the correct root isn't returned the first frame or so after CREATE_CONVERSATION has return true.
IF ARE_STRINGS_EQUAL(tlTempRoot, "NULL")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if a specific conversation root is currently playing
/// also checks against the issue where GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL
/// can return "NULL" the first few frames after CREATE_CONVERSATION has returned true
/// PARAMS:
/// sConversationLabel - the conversation label to test
/// RETURNS:
/// TRUE - if there is an ongoing or queued conversation with a label matching the passed in string or "NULL"
FUNC BOOL IS_SPECIFIC_CONVERSATION_LABEL_CURRENTLY_PLAYING(STRING sConversationLabel)
TEXT_LABEL_23 tlTempLabel
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
tlTempLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
//if current label matches passed in string return true
IF ARE_STRINGS_EQUAL(tlTempLabel, sConversationLabel)
RETURN TRUE
ENDIF
//if current label matches null, return true
//because if the correct root isn't returned the first frame or so after CREATE_CONVERSATION has return true.
IF ARE_STRINGS_EQUAL(tlTempLabel, "NULL")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Attempts to start dialogue using CREATE_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings
/// PARAMS:
/// YourPedStruct - the mission's conversation struct
/// WhichBlockOfTextToLoad - Thr text block the convo lives in
/// WhichRootLabel - The text root the convo lives in
/// PassedConversationPriority - the priority level of the convo
/// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed
/// ShouldAddToBriefScreen - if the convo should print to the brief screen
/// cloneConversation - ?
/// RETURNS:
/// TRUE if the convo was created successfully
FUNC BOOL PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, enumConversationPriority PassedConversationPriority,
enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN, BOOL cloneConversation = FALSE)
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
IF IS_MESSAGE_BEING_DISPLAYED()
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0
RETURN FALSE
ENDIF
ENDIF
ENDIF
IF CREATE_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen, cloneConversation)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Attempts to start dialogue using CREATE_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings
/// PARAMS:
/// YourPedStruct - the mission's conversation struct
/// WhichBlockOfTextToLoad - Thr text block the convo lives in
/// WhichRootLabel - The text root the convo lives in
/// WhichSpecificLabel - Which line of dialogue to start from
/// PassedConversationPriority - the priority level of the convo
/// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed
/// ShouldAddToBriefScreen - if the convo should print to the brief screen
/// RETURNS:
/// TRUE if the convo was created successfully
FUNC BOOL PAP1_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, STRING WhichSpecificLabel, enumConversationPriority PassedConversationPriority,
enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN)
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
IF IS_MESSAGE_BEING_DISPLAYED()
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0
RETURN FALSE
ENDIF
ENDIF
ENDIF
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, WhichSpecificLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Attempts to start dialogue using PLAY_SINGLE_LINE_FROM_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings
/// PARAMS:
/// YourPedStruct - the mission's conversation struct
/// WhichBlockOfTextToLoad - Thr text block the convo lives in
/// WhichRootLabel - The text root the convo lives in
/// WhichSpecificLabel - the specific line we want to play
/// PassedConversationPriority - the priority level of the convo
/// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed
/// ShouldAddToBriefScreen - if the convo should print to the brief screen
/// RETURNS:
/// TRUE if the convo was created successfully
FUNC BOOL PAP1_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, STRING WhichSpecificLabel, enumConversationPriority PassedConversationPriority,
enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN)
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
IF IS_MESSAGE_BEING_DISPLAYED()
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0
RETURN FALSE
ENDIF
ENDIF
ENDIF
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, WhichSpecificLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// will return the enumSubtitlesState needed to allow a dialogue line to play
/// without subtitles if a message is being displayed
/// RETURNS:
/// enumSubtitlesState
FUNC enumSubtitlesState GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()
IF IS_MESSAGE_BEING_DISPLAYED()
RETURN DO_NOT_DISPLAY_SUBTITLES
ENDIF
RETURN DISPLAY_SUBTITLES
ENDFUNC
/// PURPOSE:
/// trigger ambient speech using PLAY_PED_AMBIENT_SPEECH_WITH_VOICE
/// handles toggling STOP_PED_SPEAKING
/// PARAMS:
/// pedIndex -
/// Context -
/// VoiceName -
/// Params -
PROC PAP1_PLAY_TRIGGER_AMBIENT_SPEECH(PED_INDEX &pedIndex ,STRING Context, STRING VoiceName, SPEECH_PARAMS Params = SPEECH_PARAMS_ADD_BLIP)
IF IS_PED_UNINJURED(pedIndex)
BOOL bTemp = IS_AMBIENT_SPEECH_DISABLED(pedIndex)
IF bTemp
STOP_PED_SPEAKING(pedIndex, FALSE)
ENDIF
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedIndex, Context, VoiceName, Params)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PAP1_PLAY_TRIGGER_AMBIENT_SPEECH - Context : ", Context, " VoiceName : ", VoiceName) ENDIF #ENDIF
IF bTemp
STOP_PED_SPEAKING(pedIndex, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// test the player controls to see if they are trying to interupt the rolling start
/// RETURNS:
/// TRUE if player is using controls
FUNC BOOL CHECK_FOR_PLAYER_INTERUPT_ROLLING_START()
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_FOR_PLAYER_INTERUPT_ROLLING_START - returning TRUE, control pressed ") ENDIF #ENDIF
RETURN TRUE
ENDIF
INT iLx, iLy, iRx, iRy
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLx, iLy, iRx, iRy)
// check for movement controls
IF ABSI(iLx) > 28
OR ABSI(iLy) > 28
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_FOR_PLAYER_INTERUPT_ROLLING_START - returning TRUE, analogue sticks values ") ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// gets the string of the override clipset name Beverly needs to use with TASK_ENTER_VEHICLE
/// PARAMS:
/// bUsingLeftEntry - if entering from the left side
/// RETURNS:
/// STRING value
FUNC STRING GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(BOOL bUsingLeftEntry)
// left side
IF bUsingLeftEntry
RETURN "clipset@rcmpaparazzo1ig_1_ds"
ENDIF
// right side
RETURN "clipset@rcmpaparazzo1ig_1_ps"
ENDFUNC
/// PURPOSE:
/// trigger a music event, whilst first checking it has been prepared (if required)
/// PARAMS:
/// sMusicEvent - the music event name
/// bRequiresPrepare - if TRUE PREPARE_MUSIC_EVENT is setup before the event can be trigger. Check the doc to see if an event needs preloading
/// RETURNS:
/// TRUE if the event is trigger successfully
FUNC BOOL SAFE_TRIGGER_MISSION_MUSIC_EVENT(STRING sMusicEvent, BOOL bRequiresPrepare = FALSE)
IF bRequiresPrepare
IF NOT PREPARE_MUSIC_EVENT(sMusicEvent)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TRIGGER_MISSION_MUSIC_EVENT - returning FALSE, not yet prepared for = ", sMusicEvent) ENDIF #ENDIF
RETURN FALSE
ENDIF
ENDIF
IF TRIGGER_MUSIC_EVENT(sMusicEvent)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TRIGGER_MISSION_MUSIC_EVENT - returning TRUE for = ", sMusicEvent) ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// handles triggering the requested mission music events
/// Since these cues need to be sequental, request event will only trigger if the previous event has triggered
/// PARAMS:
/// iMusicEvent - the event we want to trigger
PROC MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
SWITCH iMissionMusicEventTriggerCounter
CASE PAP1_MUSIC_EVENT_START
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_START")
iMissionMusicEventTriggerCounter = PAP1_MUSIC_EVENT_MAX
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION : ", "PAP1_MUSIC_EVENT_START") ENDIF #ENDIF
ENDIF
BREAK
CASE PAP1_MUSIC_EVENT_BIKE
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_BIKE")
iMissionMusicEventTriggerCounter = PAP1_MUSIC_EVENT_MAX
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION : ", "PAP1_MUSIC_EVENT_BIKE") ENDIF #ENDIF
ENDIF
BREAK
CASE PAP1_MUSIC_EVENT_RIVAL
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_RIVAL")
iMissionMusicEventTriggerCounter = PAP1_MUSIC_EVENT_MAX
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION : ", "PAP1_MUSIC_EVENT_RIVAL - minus prepare") ENDIF #ENDIF
ENDIF
BREAK
CASE PAP1_MUSIC_EVENT_STOP_TO_RADIO
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_STOP_TO_RADIO", TRUE)
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
iMissionMusicEventTriggerCounter = PAP1_MUSIC_EVENT_RESET_AUDIO_FLAG
iTimer_DelayResetAudioFlag_AllowScoreAndRadio = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION : ", "PAP1_MUSIC_EVENT_STOP_TO_RADIO") ENDIF #ENDIF
ENDIF
BREAK
CASE PAP1_MUSIC_EVENT_RESET_AUDIO_FLAG
// reset the audio flag after the delay
IF HAS_TIME_PASSED(iTimer_DelayResetAudioFlag_AllowScoreAndRadio, 5000) // time delay suggested by Rebecca J
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE)
iMissionMusicEventTriggerCounter = PAP1_MUSIC_EVENT_MAX
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION : ", "PAP1_MUSIC_EVENT_RESET_AUDIO_FLAG") ENDIF #ENDIF
ENDIF
BREAK
CASE PAP1_MUSIC_EVENT_FAIL
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_FAIL")
iMissionMusicEventTriggerCounter = PAP1_MUSIC_EVENT_MAX
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION : ", "PAP1_MUSIC_EVENT_FAIL") ENDIF #ENDIF
ENDIF
BREAK
DEFAULT
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Set the music event to be triggered by MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
/// PARAMS:
/// iMusicEvent - the event we want to trigger
PROC SET_MUSIC_EVENT_FOR_TRIGGER(INT iMusicEvent)
iMissionMusicEventTriggerCounter = iMusicEvent
MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENT_FOR_TRIGGER : ", "iMusicEvent = ", iMusicEvent) ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// handles trigger correct music events after a skip has occured. Replay system sets it's own music scene which
/// we can't interupr
/// PARAMS:
/// eCurrentStage - which mission stage we are returning to
PROC SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS(MISSION_STAGE eCurrentStage)
iMissionMusicEventTriggerCounter = PAP1_MUSIC_EVENT_MAX
SWITCH eCurrentStage
CASE MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
FALLTHRU
CASE MISSION_STAGE_STOP_RIVAL_PAP
WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_START")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_RIVAL_PAP_JOIN_CHASE / MISSION_STAGE_STOP_RIVAL_PAP ", "triggering PAP1_START", " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
WAIT(0)
ENDWHILE
WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_BIKE")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_RIVAL_PAP_JOIN_CHASE / MISSION_STAGE_STOP_RIVAL_PAP", "triggering PAP1_BIKE", " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
WAIT(0)
ENDWHILE
IF eCurrentStage = MISSION_STAGE_STOP_RIVAL_PAP
WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_RIVAL")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_STOP_RIVAL_PAP", "triggering PAP1_RIVAL", " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
WAIT(0)
ENDWHILE
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_CHASE")
START_AUDIO_SCENE("PAPARAZZO_01_CHASE")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_RIVAL_PAP_JOIN_CHASE / MISSION_STAGE_STOP_RIVAL_PAP - set audio scene active - ", "PAPARAZZO_01_CHASE") ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DROP_BEVERLY_OFF
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_STOP_TO_RADIO)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_DROP_BEVERLY_OFF - sET_MUSIC_EVENT_FOR_TRIGGER - ", "PAP1_MUSIC_EVENT_STOP_TO_RADIO") ENDIF #ENDIF
BREAK
// ensure no music cues will trigger during outro
CASE MISSION_STAGE_END_CUTSCENE
WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("PAP1_FAIL")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_END_CUTSCENE", "triggering PAP1_FAIL", " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
WAIT(0)
ENDWHILE
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// handles setting up the scenario blocking area during the chase
/// prevent target driving through peds without collision
PROC UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE(FLOAT fLocal_CurrentPlaybackTime)
INT i
SWITCH iScenarioBlockingAreaStage
CASE 0
// set these up straight away to prevent cars coming in near the start
// while hotel building on left as you go down the hill
scenarioBlockingChaseRoute[0] = ADD_SCENARIO_BLOCKING_AREA(<< -332.58029, 207.25702, 80.0 >>, << -281.58356, 257.80222, 95.0 >>)
// right hand side small pull outs on the left past the white hotel
scenarioBlockingChaseRoute[1] = ADD_SCENARIO_BLOCKING_AREA(<< -501.97012, 184.44948, 75.0 >>, << -390.58398, 241.06360, 90.0 >>)
iScenarioBlockingAreaStage++
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
BREAK
CASE 1
// cleanup the first two areas once chase gets past it
IF fLocal_CurrentPlaybackTime > 15000.0
FOR i = 0 TO (PAP1_MAX_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1)
REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i])
ENDFOR
iScenarioBlockingAreaStage++
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// request path nodes using REQUEST_PATH_NODES_IN_AREA_THIS_FRAME
/// PARAMS:
/// vPickupPosition - position pathing from
/// vDestinationPosition - position trying to path to
/// vPathNodeMin - the calculated minimum position we are loading paths
/// vPathNodeMax - the calculated maximum position we are loading paths
/// iExtraDist - used to add leeyway area around the position before the request
PROC PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(VECTOR vPickupPosition, VECTOR vDestinationPosition, VECTOR &vPathNodeMin, VECTOR &vPathNodeMax, INT iExtraDist = 1000)
VECTOR vTempPathNodeMin, vTempPathNodeMax
// determine if this is a new request
// set the area's X values
IF vDestinationPosition.X <= vPickupPosition.X
vTempPathNodeMin.X = vDestinationPosition.X
vTempPathNodeMax.X = vPickupPosition.X
ELSE
vTempPathNodeMin.X = vPickupPosition.X
vTempPathNodeMax.X = vDestinationPosition.X
ENDIF
// set the area's X values
IF vDestinationPosition.Y <= vPickupPosition.Y
vTempPathNodeMin.Y = vDestinationPosition.Y
vTempPathNodeMax.Y = vPickupPosition.Y
ELSE
vTempPathNodeMin.Y = vPickupPosition.Y
vTempPathNodeMax.Y = vDestinationPosition.Y
ENDIF
// extra leeway around the positions
vTempPathNodeMin -= << iExtraDist, iExtraDist, iExtraDist >>
vTempPathNodeMax += << iExtraDist, iExtraDist, iExtraDist >>
//CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), " : PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME -locally generated vector = vMin : ", vTempPathNodeMin, " vMax : ", vTempPathNodeMax,
// " using vPickupPosition : ", vPickupPosition, " : vDestinationPosition : ", vDestinationPosition)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vTempPathNodeMin, vPathNodeMin)
OR NOT ARE_VECTORS_ALMOST_EQUAL(vTempPathNodeMin, vPathNodeMin)
vPathNodeMin = vTempPathNodeMin
vPathNodeMax = vTempPathNodeMax
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), " : PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME - detected new request for - vMin : ", vPathNodeMin, " vMax : ", vPathNodeMax)
ELSE
//CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), " : PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME - detected existing request for - vMin : ", vPathNodeMin, " vMax : ", vPathNodeMax)
ENDIF
REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vPathNodeMin.X, vPathNodeMin.Y, vPathNodeMax.X, vPathNodeMax.Y)
ENDPROC
/// PURPOSE:
/// check if the path nodes are loaded for the area
/// PARAMS:
/// vPathNodeMin - minimum positon
/// vPathNodeMax - maximum position
/// RETURNS:
/// TRUE if ARE_NODES_LOADED_FOR_AREA are TRUE
FUNC BOOL PAP1_ARE_REQUEST_PATH_NODES_LOADED_IN_AREA(VECTOR vPathNodeMin, VECTOR vPathNodeMax)
IF ARE_NODES_LOADED_FOR_AREA(vPathNodeMin.X, vPathNodeMin.Y, vPathNodeMax.X, vPathNodeMax.Y)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PAP1_ARE_REQUEST_PATH_NODES_LOADED_IN_AREA - returning TRUE for - vMin : ", vPathNodeMin, " vMax : ", vPathNodeMax) ENDIF #ENDIF
RETURN TRUE
ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PAP1_ARE_REQUEST_PATH_NODES_LOADED_IN_AREA - returning FALSE for - vMin : ", vPathNodeMin, " vMax : ", vPathNodeMax) ENDIF #ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// checks if the player's current weapon is lethal
/// PARAMS:
/// bIncludeProjectilesCheck - if true, checks for grenades,stickybombs etc
/// bIncludeLeathalMeleeWeapons - if true check includes knife, hammer, crowbar etc
/// bIncludeStunGunAsLethal - added parameter as we now want pool peds to surrender to stun gun attack
/// RETURNS:
/// true - if lethal
FUNC BOOL IS_PLAYER_CURRENT_WEAPON_LETHAL(BOOL bIncludeProjectilesCheck = TRUE, BOOL bIncludeLeathalMeleeWeapons = TRUE, BOOL bIncludeStunGunAsLethal = TRUE)
//different dialogue based on player weapon
WEAPON_TYPE currentPlayerWeapon
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), currentPlayerWeapon)
SWITCH currentPlayerWeapon
CASE WEAPONTYPE_PISTOL
FALLTHRU
CASE WEAPONTYPE_COMBATPISTOL
FALLTHRU
CASE WEAPONTYPE_APPISTOL
FALLTHRU
CASE WEAPONTYPE_DLC_SNSPISTOL
FALLTHRU
CASE WEAPONTYPE_MICROSMG
FALLTHRU
CASE WEAPONTYPE_SMG
FALLTHRU
CASE WEAPONTYPE_ASSAULTRIFLE
FALLTHRU
CASE WEAPONTYPE_CARBINERIFLE
FALLTHRU
CASE WEAPONTYPE_DLC_SPECIALCARBINE
FALLTHRU
CASE WEAPONTYPE_ADVANCEDRIFLE
FALLTHRU
CASE WEAPONTYPE_MG
FALLTHRU
CASE WEAPONTYPE_COMBATMG
FALLTHRU
CASE WEAPONTYPE_PUMPSHOTGUN
FALLTHRU
CASE WEAPONTYPE_SAWNOFFSHOTGUN
FALLTHRU
CASE WEAPONTYPE_ASSAULTSHOTGUN
FALLTHRU
CASE WEAPONTYPE_SNIPERRIFLE
FALLTHRU
CASE WEAPONTYPE_HEAVYSNIPER
FALLTHRU
CASE WEAPONTYPE_REMOTESNIPER
FALLTHRU
CASE WEAPONTYPE_GRENADELAUNCHER
FALLTHRU
CASE WEAPONTYPE_RPG
FALLTHRU
CASE WEAPONTYPE_MINIGUN
RETURN TRUE
ENDSWITCH
IF bIncludeProjectilesCheck
SWITCH currentPlayerWeapon
CASE WEAPONTYPE_GRENADE
FALLTHRU
CASE WEAPONTYPE_STICKYBOMB
FALLTHRU
CASE WEAPONTYPE_MOLOTOV
FALLTHRU
CASE WEAPONTYPE_BZGAS
RETURN TRUE
ENDSWITCH
ENDIF
IF bIncludeLeathalMeleeWeapons
SWITCH currentPlayerWeapon
CASE WEAPONTYPE_KNIFE
FALLTHRU
CASE WEAPONTYPE_HAMMER
FALLTHRU
CASE WEAPONTYPE_CROWBAR
FALLTHRU
CASE WEAPONTYPE_PETROLCAN
FALLTHRU
CASE WEAPONTYPE_DLC_BOTTLE
RETURN TRUE
ENDSWITCH
ENDIF
IF bIncludeStunGunAsLethal
IF currentPlayerWeapon = WEAPONTYPE_STUNGUN
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if the player is intimidating a ped enough that they should react
/// PARAMS:
/// pedIndex - Ped who the player is intimidating
/// iFrameCounter_PedLastSeePlayer - the frame count for the last time the pedIndex could see the player
/// vPlayerCoords - the player's position
/// bReturnForDamage - if true and player has damaged the ped the func will return TRUE
/// bReturnForMelee - if player is seen in melee in close proximity
/// fPlayerDetectionDist - Player is automatically classed as intimidating when shooting or targetting within this range
/// bAimingCloseToPedCounts - if true player aiming close to the ped counts
/// fBulletRadiusCheck - Used for IS_BULLET_IN_AREA check around pedIndex
/// fProjectileRadiusCheck - Used for IS_PROJECTILE_IN_AREA check around pedIndex
/// bVisibleWeaponIsIntimidating - if true and player is seen with weapon drawn func will return true
/// RETURNS:
/// True if bullet is in area around ped, if player is shooting, if player is targetting or free aiming at ped in view or if damaged.
FUNC BOOL IS_PLAYER_INTIMIDATE_SPECIFIC_PED(PED_INDEX pedIndex, INT iFrameCounter_PedLastSeePlayer, VECTOR vPlayerCoords, BOOL bReturnForDamage = TRUE, BOOL bReturnForMelee = TRUE, FLOAT fPlayerDetectionDist = 20.0,
BOOL bAimingCloseToPedCounts = FALSE, FLOAT fBulletRadiusCheck = 8.0, FLOAT fProjectileRadiusCheck = 15.0, BOOL bVisibleWeaponIsIntimidating = FALSE)
IF IS_PED_UNINJURED(pedIndex)
VECTOR vTemp_PedPos = GET_ENTITY_COORDS(pedIndex)
IF IS_BULLET_IN_AREA(vTemp_PedPos, fBulletRadiusCheck, TRUE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - bullet in area around ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCounter_PedLastSeePlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test ped has seen the player in the last 10 frames
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerCoords, fPlayerDetectionDist) //and is with in the range
IF IS_PLAYER_CURRENT_WEAPON_LETHAL()
IF bVisibleWeaponIsIntimidating
// B*1511108 - try to ensure weapon is visible
IF IS_PED_WEAPON_READY_TO_SHOOT(PLAYER_PED_ID())
OR IS_PED_RELOADING(PLAYER_PED_ID())
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing has leathal weapon in view") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing targeting ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_PLAYER_FREE_AIMING(PLAYER_ID())
IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing free aiming at ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF bAimingCloseToPedCounts
IF IS_PED_FACING_PED(PLAYER_PED_ID(), pedIndex, 45.0)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing free aiming around ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_SHOOTING(PLAYER_PED_ID())
//IF IS_PED_FACING_PED(PLAYER_PED_ID(), pedIndex, 45.0)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - player shooting towards Beverly with weapon") ENDIF #ENDIF
RETURN TRUE
//ENDIF
ENDIF
IF bReturnForMelee
IF IS_PED_IN_COMBAT(PLAYER_PED_ID())
OR IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID())
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerCoords, 1.0) //and is with in the range
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - player seen in combat ") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - player seen performing stealth kill") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF bReturnForDamage
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedIndex, PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - ped damaged by player with weapon") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vTemp_PedPos, fProjectileRadiusCheck)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - explosion in area around ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
VECTOR vMin, vMax // is one of the player's projectiles nearby?
vMin = vTemp_PedPos
vMax = vMin
vMin.x= vMin.x - fProjectileRadiusCheck
vMin.y = vMin.y -fProjectileRadiusCheck
vMin.z = vMin.z - fProjectileRadiusCheck
vMax.x = vMax.x + fProjectileRadiusCheck
vMax.y = vMax.y + fProjectileRadiusCheck
vMax.z = vMax.z + fProjectileRadiusCheck
IF IS_PROJECTILE_IN_AREA(vMin, vMax, TRUE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - projectile in area around ped : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Draw the sight cone from a ped
/// PARAMS:
/// vStartPos - positio t o draw from
/// fViewAngle - directiono to draw in
/// angle - the angle of the cone so 180.0 is can see in a half circle
PROC DRAW_VIEW_CONE(VECTOR vStartPos, FLOAT fViewAngle, FLOAT angle = 120.0)
angle /= 2.0
DRAW_DEBUG_LINE(vStartPos, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fViewAngle + angle, <<0, 5, 0>>))
DRAW_DEBUG_LINE(vStartPos, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fViewAngle - angle, <<0, 5, 0>>))
ENDPROC
/// PURPOSE:
/// Setup a shape test for Beverly aiming his camera at the celeb
/// PARAMS:
/// iShapeTestIndex - the shapetest index we will be setting up
/// vStartPos - the position at the front of the camera
/// vStartForward - the cameras forward vector
/// vCheckPos - the celeb's position we want to aim for
/// fViewCone - the cone the celeb pos has to be to allow the test to be setup
/// RETURNS:
/// TRUE if the shapetest is successfully set up
FUNC BOOL SETUP_TEST_DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME(INT iShapeTestIndex, VECTOR vStartPos, VECTOR vStartForward, VECTOR vCheckPos, FLOAT fViewCone = 170.0)
//check the shapetest Index is valid and isn't already active
IF iShapeTestIndex < 0
OR iShapeTestIndex > NUM_PAP1_SHAPE_TESTS
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_TEST_DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "[ERROR] - iShapeTestIndex is out of range RETURN FALSE : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
RETURN FALSE
ELIF mShapeTestCameraAim[iShapeTestIndex].bActive
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_TEST_DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "[ERROR] - iShapeTestIndex is already active RETURN FALSE : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
RETURN FALSE
ENDIF
// check to see if vXCheckPos is behind the vStartPos 's forward vector - if so bail out as the target is celeb is behind the camera
FLOAT fViewLimit = fViewCone / 2.0
IF (fViewCone > 0.0)
VECTOR vNormalisedVec = NORMALISE_VECTOR(vCheckPos - vStartPos)
FLOAT fViewAngle = DOT_PRODUCT(vStartForward, vNormalisedVec)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "fViewAngle = ", fViewAngle) ENDIF #ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "COS(fViewLimit) = ", COS(fViewLimit)) ENDIF #ENDIF
IF fViewAngle <= COS(fViewLimit)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_TEST_DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "RETURN FALSE - vXCheckPos is behind the vStartPos 's forward vector : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
DRAW_VIEW_CONE(vStartPos, fViewAngle, fViewCone)
#IF IS_DEBUG_BUILD IF bDebug_DisplayShapeTestPap1CameraAim DRAW_RECT(0.2, 0.5, 0.6, 0.2, 255, 255, 255, 150) ENDIF #ENDIF
RETURN FALSE // player is behind the ped and can't be seen
ENDIF
ENDIF
VECTOR vTemp = vCheckPos
// extend the line - so we can be sure goes through the point we are interested in
vTemp = (vCheckPos - vStartPos) * 1.25
mShapeTestCameraAim[iShapeTestIndex].mShapeTest = START_SHAPE_TEST_LOS_PROBE(vStartPos, vStartPos + vTemp, SCRIPT_INCLUDE_ALL) // , sCelebVehicle.vehicle) can't do this as it doesn't seem to get through to the celeb in the vehicle
IF mShapeTestCameraAim[iShapeTestIndex].mShapeTest = NULL
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_TEST_DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "[ERROR]: Failed to create shape test - too many shape tests already : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
mShapeTestCameraAim[iShapeTestIndex].mShapeTest = NULL // reset the shapetest
mShapeTestCameraAim[iShapeTestIndex].bActive = FALSE
ELSE
// shapetest has been succesfully created, store the ped
mShapeTestCameraAim[iShapeTestIndex].bActive = TRUE
mShapeTestCameraAim[iShapeTestIndex].vCheckPos = vCheckPos
#IF IS_DEBUG_BUILD
mShapeTestCameraAim[iShapeTestIndex].vStartPosDebug = vStartPos
mShapeTestCameraAim[iShapeTestIndex].vEndPosDebug = vStartPos + vTemp
#ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_TEST_DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "New shape test setup : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks the specified shape test result for Beverly aiming his camera at the celeb
/// PARAMS:
/// iShapeTestIndex - the shape test we want to check
/// iSeeTime - the return time the shape test returned true
/// RETURNS:
/// TRUE if the shape test satisfied the criteria
FUNC BOOL DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME(INT iShapeTestIndex, INT &iSeeTime)
//check the shapetest Index is valid and is active
IF iShapeTestIndex < 0
OR iShapeTestIndex > NUM_PAP1_SHAPE_TESTS
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "[ERROR] - iShapeTestIndex is out of range RETURN FALSE : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
RETURN FALSE
ELIF NOT mShapeTestCameraAim[iShapeTestIndex].bActive
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "[ERROR] - iShapeTestIndex is NOT active RETURN FALSE : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
RETURN FALSE
ENDIF
INT iTempTime
INT iHits
VECTOR vHitPos
VECTOR vNormal
ENTITY_INDEX hitEntity
SHAPETEST_STATUS shapeStatus = GET_SHAPE_TEST_RESULT(mShapeTestCameraAim[iShapeTestIndex].mShapeTest, iHits, vHitPos, vNormal, hitEntity)
IF (shapeStatus = SHAPETEST_STATUS_NONEXISTENT)
// shape test doesn't exist for some reason....reset
mShapeTestCameraAim[iShapeTestIndex].mShapeTest = NULL
mShapeTestCameraAim[iShapeTestIndex].bActive = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "Exit - [SHAPE TEST]: Non Existant ETURN FALSE : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
RETURN FALSE
ELIF (shapeStatus = SHAPETEST_STATUS_RESULTS_NOTREADY)
// shape test isn't ready - try again next frame
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "Exit - [SHAPE TEST]: Isn't Ready ETURN FALSE : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
RETURN FALSE
ENDIF
BOOL bOk = FALSE
FLOAT fProbeHitDist = SHAPE_TEST_PAP1_CAMERA_AIM_PROBE_HIT_DIST
#IF IS_DEBUG_BUILD
IF bDebug_OverrideProbeHitDist
fProbeHitDist = fDebug_ProbeHitDistOverride
ENDIF
#ENDIF
// if we have hits registered check the hit is close enough
// we use vdist2 here instead of get_distance_xx() as it's faster
IF (iHits > 0)
FLOAT fDist = VDIST2(mShapeTestCameraAim[iShapeTestIndex].vCheckPos, vHitPos)
bOk = (fDist <= (fProbeHitDist * fProbeHitDist))
#IF IS_DEBUG_BUILD
IF bDebug_DisplayShapeTestPap1CameraAim
IF (bOk)
DRAW_DEBUG_SPHERE(vHitPos, 0.25, 0, 255, 0, 150)
DRAW_DEBUG_LINE(mShapeTestCameraAim[iShapeTestIndex].vStartPosDebug, vHitPos, 0, 255, 0, 150)
//DRAW_DEBUG_LINE(vHitPos, mShapeTestCameraAim[iShapeTestIndex].vEndPosDebug, 0, 0, 255, 150)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "hit registed in range >>>>>>>>>> : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
ELSE
DRAW_DEBUG_SPHERE(vHitPos, 0.25, 255, 0, 0, 150)
DRAW_DEBUG_LINE(mShapeTestCameraAim[iShapeTestIndex].vStartPosDebug, vHitPos, 255, 0, 0, 150)
//DRAW_DEBUG_LINE(vHitPos, mShapeTestCameraAim[iShapeTestIndex].vEndPosDebug, 0, 0, 255, 150)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "hit registed out of range <<<<<<<<<<<<<<< : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
ENDIF
ENDIF
#ENDIF
// we return the time that we hit
iTempTime = GET_GAME_TIMER()
ELSE
bOk = TRUE
// we return the time that we hit
iTempTime = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
IF bDebug_DisplayShapeTestPap1CameraAim
DRAW_DEBUG_LINE(mShapeTestCameraAim[iShapeTestIndex].vStartPosDebug, mShapeTestCameraAim[iShapeTestIndex].vEndPosDebug, 255, 255, 255, 255)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME : ", "hit registed direct >>>>>>> : iShapeTestIndex = ", iShapeTestIndex) ENDIF #ENDIF
ENDIF
#ENDIF
ENDIF
// we reset the shape test for the last frame
mShapeTestCameraAim[iShapeTestIndex].mShapeTest = NULL
mShapeTestCameraAim[iShapeTestIndex].bActive = FALSE
IF (bOk)
iSeeTime = iTempTime
ENDIF
RETURN bOk
ENDFUNC
/// PURPOSE:
/// Sets all shape test variables to be null
PROC RESET_IS_BEVERLY_AIMING_AT_CELEB_TEST()
INT i
FOR i=0 TO NUM_PAP1_SHAPE_TESTS -1
mShapeTestCameraAim[i].mShapeTest = NULL
mShapeTestCameraAim[i].bActive = FALSE
ENDFOR
iFrameCountSinceLastSuccessfulShapeTestCameraAim = 0
iShapeTestCamerAimIndex_SetupThisFrame = 0
iConsecutiveAimingTimer = -1
ENDPROC
/// PURPOSE:
/// Sets up the shapetests for checking Beverly aiming the camera at the celeb
/// uses multiple shapetests setup on different frames, since a shapetest returns the results on the following frame and can't setup the test again in the return frame
/// Also has a small grace period, so if a shapetest returns false it can keep returning true for a couple of frames, this is needed since I want to check for continuously aiming.
/// PARAMS:
/// vDesiredAimPos - celeb's position
/// RETURNS:
/// TRUE if Beverly is successfully aiming the camera at the celeb
FUNC BOOL IS_BEVERLY_AIMING_CAMERA_AT_CELEB(VECTOR vDesiredAimPos)
IF NOT IS_ENTITY_ALIVE(sObjCameraBeverly.object)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB : ", "[ERROR] : sObjCameraBeverly.object isn't alive RETURN FALSE") ENDIF #ENDIF
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
IF bDebug_OverrideBevCameraLensOffset
vBevCameraLensOffset = vDebug_BevCameraLensOffsetOverride
ENDIF
#ENDIF
VECTOR vCameraLensPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sObjCameraBeverly.object, vBevCameraLensOffset)
VECTOR vCameraForward = GET_ENTITY_FORWARD_VECTOR(sObjCameraBeverly.object)
//for some reason the camera has been setup backwards, so we flip the forward vector results.
vCameraForward.X = vCameraForward.X * -1.0
vCameraForward.Y = vCameraForward.Y * -1.0
vCameraForward.Z = vCameraForward.Z * -1.0
INT iSeeTime = 0
FLOAT fViewingCone = SHAPE_TEST_PAP1_CAMERA_AIM_VIEW_CONE
#IF IS_DEBUG_BUILD
IF bDebug_OverrideBevAimCameraViewingCone
fViewingCone = fDebug_BevAimCameraViewingCone
ENDIF
#ENDIF
#IF IS_DEBUG_BUILD
IF bDebug_DisplayShapeTestPap1CameraAim
DRAW_DEBUG_LINE(vCameraLensPos, vCameraLensPos + vCameraForward, 81, 0, 119, 200)
DRAW_DEBUG_SPHERE(vCameraLensPos, 0.05, 178, 0, 255, 100)
DRAW_DEBUG_SPHERE(vCameraLensPos + vCameraForward, 0.05, 178, 0, 255, 200)
DRAW_DEBUG_SPHERE(vDesiredAimPos, 0.25, 178, 0, 255, 100)
ENDIF
#ENDIF
// ensure only one shapetest can be setup per frame
BOOl bSetupOneProbeTestThisFrame = SETUP_TEST_DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME(iShapeTestCamerAimIndex_SetupThisFrame, vCameraLensPos, vCameraForward, vDesiredAimPos, fViewingCone)
IF bSetupOneProbeTestThisFrame
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB : ", "pre check setup probe ID : ", iShapeTestCamerAimIndex_SetupThisFrame, " Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
IF (iShapeTestCamerAimIndex_SetupThisFrame >= (NUM_PAP1_SHAPE_TESTS - 1))
iShapeTestCamerAimIndex_SetupThisFrame = 0
ELSE
iShapeTestCamerAimIndex_SetupThisFrame++
ENDIF
ENDIF
BOOL bBevIsAimingAtCeleb = FALSE
INT iNumSuccessfulTests = 0
INT i = 0
FOR i = 0 TO (NUM_PAP1_SHAPE_TESTS - 1)
IF DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME(i, iSeeTime)
iNumSuccessfulTests++
ENDIF
ENDFOR
// second attempt to setup a probe test, if one has become null in the test process
IF NOT bSetupOneProbeTestThisFrame
bSetupOneProbeTestThisFrame = SETUP_TEST_DOES_POS_HAVE_CLEAR_LINE_OF_SIGHT_TO_POS_RETURN_TIME(iShapeTestCamerAimIndex_SetupThisFrame, vCameraLensPos, vCameraForward, vDesiredAimPos, fViewingCone)
IF bSetupOneProbeTestThisFrame
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB : ", "post check setup probe ID : ", iShapeTestCamerAimIndex_SetupThisFrame, " Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
IF (iShapeTestCamerAimIndex_SetupThisFrame >= (NUM_PAP1_SHAPE_TESTS - 1))
iShapeTestCamerAimIndex_SetupThisFrame = 0
ELSE
iShapeTestCamerAimIndex_SetupThisFrame++
ENDIF
ENDIF
ENDIF
IF iNumSuccessfulTests > 0
bBevIsAimingAtCeleb = TRUE
IF iConsecutiveAimingTimer = -1 //if initial timer hasn't been set then set start it here
iConsecutiveAimingTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB : ", "iConsecutiveAimingTimer initial time set to = ", iConsecutiveAimingTimer) ENDIF #ENDIF
ENDIF
iFrameCountSinceLastSuccessfulShapeTestCameraAim = 0 // reset this as we had a successful hit
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB : ", "RETURN TRUE, iNumSuccessfulTests = ", iNumSuccessfulTests) ENDIF #ENDIF
ELSE
IF iConsecutiveAimingTimer = -1 //don't set as aiming if we haven't successfully aimed the initial time
bBevIsAimingAtCeleb = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB : ", "RETURN FALSE not done initial aim yet") ENDIF #ENDIF
ELSE
iFrameCountSinceLastSuccessfulShapeTestCameraAim++
IF iFrameCountSinceLastSuccessfulShapeTestCameraAim >= GRACE_PERIOD_FRAMES_LAST_SUCCESSFUL_SHAPE_TEST_CAMERA_AIM
iConsecutiveAimingTimer = -1 // reset the aim timer
bBevIsAimingAtCeleb = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB : ", "RETURN FALSE, iConsecutiveAimingTimer reset to = ", iConsecutiveAimingTimer) ENDIF #ENDIF
ELSE
bBevIsAimingAtCeleb = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB : ", "RETURN TRUE, not aiming however still in the grace period : iFrameCountSinceLastSuccessfulShapeTestCameraAim = ", iFrameCountSinceLastSuccessfulShapeTestCameraAim) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
RETURN bBevIsAimingAtCeleb
ENDFUNC
/// PURPOSE:
/// Set Beverly to Play hurry up anim
/// PARAMS:
/// entityTarget - entity he wants to get to
PROC SET_BEVERLY_PLAY_HURRY_UP_ANIM_TOWARDS_ENTITY(ENTITY_INDEX entityTarget)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF IS_ENTITY_ALIVE(entityTarget)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap")
AND NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap")
IF IS_ENTITY_IN_ARC_2D(sBeverlyPed.ped, entityTarget, 85.0) // only play the anim if the target is infront of Beverly
INT iSide = GET_SIDE_COORDS_IS_TO_ENTITY(sBeverlyVehicle.vehicle, GET_ENTITY_COORDS(sBeverlyVehicle.vehicle), GET_ENTITY_COORDS(entityTarget))
STRING sHurryUpAnim
IF iSide = 1 // RIGHT SIDE
sHurryUpAnim = "hurry_up_right_pap"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_HURRY_UP_ANIM - hurry_up_right_pap set") ENDIF #ENDIF
ELSE
sHurryUpAnim = "hurry_up_left_pap"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_HURRY_UP_ANIM - hurry_up_left_pap set") ENDIF #ENDIF
ENDIF
//CLEAR_PED_TASKS(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sHurryUpAnim, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_HOLD_LAST_FRAME) // AF_HOLD_LAST_FRAME added to fix bug 1095914, AF_UPPERBODY added to fix B*1148188
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_HURRY_UP_ANIM - anim applied") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles Beverly playing the point anims
/// PARAMS:
/// entityTarget - what to point at
/// RETURNS:
/// TRUE if the anim was tasked successfully
FUNC BOOL SET_BEVERLY_PLAY_POINT_ANIM(ENTITY_INDEX entityTarget)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
AND IS_ENTITY_ALIVE(entityTarget)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM -check for playing current anim : ", tlAnimName_BeverlyPoint) ENDIF #ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
VECTOR vBeverly_Forward, vTargetEntity_ToBeverly
vBeverly_Forward = GET_ENTITY_FORWARD_VECTOR(sBeverlyPed.ped)
vBeverly_Forward = NORMALISE_VECTOR(vBeverly_Forward)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM : vBeverly_Forward = ", vBeverly_Forward) ENDIF #ENDIF
vTargetEntity_ToBeverly = GET_ENTITY_COORDS(entityTarget) - GET_ENTITY_COORDS(sBeverlyPed.ped)
vTargetEntity_ToBeverly = NORMALISE_VECTOR(vTargetEntity_ToBeverly)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM : vTargetEntity_ToBeverly = ", vTargetEntity_ToBeverly) ENDIF #ENDIF
FLOAT fAngle
fAngle = DOT_PRODUCT(vBeverly_Forward, vTargetEntity_ToBeverly)
//fAngle = GET_ANGLE_BETWEEN_2D_VECTORS(vBev_Forward.X, vBev_Forward.Y, vRivalPap_ToPlayer.X, vRivalPap_ToPlayer.Y)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM : fAngle = ", fAngle) ENDIF #ENDIF
INT iSide = GET_SIDE_COORDS_IS_TO_ENTITY(sBeverlyVehicle.vehicle, GET_ENTITY_COORDS(sBeverlyVehicle.vehicle), GET_ENTITY_COORDS(entityTarget))
TEXT_LABEL_63 tlTempSide
TEXT_LABEL_63 tlAnimName
IF iSide = 1 // Right side
tlTempSide = "right_pap"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - right anim") ENDIF #ENDIF
ELSE // Left side or inline
tlTempSide = "left_pap"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - left anim") ENDIF #ENDIF
ENDIF
IF fAngle > 0.85 // forward
tlAnimName = "point_fwd_"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - forward anim") ENDIF #ENDIF
ELIF fAngle > 0.2 // in front 45 degree area
tlAnimName = "point_45_"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - 45 degree anim") ENDIF #ENDIF
ELIF fAngle > -0.6 // to the side
tlAnimName = "point_side_"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - side anim") ENDIF #ENDIF
ELSE // behind
tlAnimName = "point_bwd_"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - behind anim") ENDIF #ENDIF
ENDIF
tlAnimName += tlTempSide // add the side to the anim name
tlAnimName_BeverlyPoint = tlAnimName
//CLEAR_PED_TASKS(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_HOLD_LAST_FRAME) // AF_HOLD_LAST_FRAME added to fix bug 1095914
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - anim applied - RETURN TRUE") ENDIF #ENDIF
RETURN TRUE
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - anim already playing - RETURN TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_POINT_ANIM - RETURN FALSE") ENDIF #ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handles Beverly playing come on anims
/// PARAMS:
/// sSpecificAnim - specify an anim to play, otherwise pass NULL for random selected
/// fBlendInDelta - speed to blend the anim in
/// fBlendOutDelta - speed to blend the anim out
/// nTimeToPlay - the time the animation has to play
/// AnimFlags
/// startPhase = which phase in the anim to start from
/// phaseControlled
/// ikFlags
/// RETURNS:
/// TRUE if the anim was tasked successfully
FUNC BOOL SET_BEVERLY_PLAY_COME_ON_ANIM(STRING sSpecificAnim = NULL, FLOAT fBlendInDelta = NORMAL_BLEND_IN, FLOAT fBlendOutDelta = SLOW_BLEND_OUT, INT nTimeToPlay =-1, ANIMATION_FLAGS AnimFlags = AF_DEFAULT, FLOAT startPhase = 0.0, BOOL phaseControlled = FALSE, IK_CONTROL_FLAGS ikFlags = AIK_NONE)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_COME_HERE_ANIM -check for playing current anim : ", tlCurrentAnim_BeverlyShoutComeOn) ENDIF #ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn)
IF IS_STRING_NULL_OR_EMPTY(sSpecificAnim)
// pick a random anim to play
INT iRand = GET_RANDOM_INT_IN_RANGE(0, 4)
IF iRand = 0
sSpecificAnim = "waive_comeback_b"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_COME_HERE_ANIM - set random anim : ", sSpecificAnim) ENDIF #ENDIF
ELIF iRand = 1
sSpecificAnim = "waive_comeback_f"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_COME_HERE_ANIM - set random anim : ", sSpecificAnim) ENDIF #ENDIF
ELIF iRand = 2
sSpecificAnim = "waive_help_a"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_COME_HERE_ANIM - set random anim : ", sSpecificAnim) ENDIF #ENDIF
ELIF iRand = 3
sSpecificAnim = "waive_help_b"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_COME_HERE_ANIM - set random anim : ", sSpecificAnim) ENDIF #ENDIF
ENDIF
ENDIF
IF GET_LENGTH_OF_LITERAL_STRING(sSpecificAnim) > 23
SCRIPT_ASSERT("RC - Pap 1 : SET_BEVERLY_PLAY_COME_ON_ANIM() sSpecificAnim length more than 23 chars")
ENDIF
tlCurrentAnim_BeverlyShoutComeOn = sSpecificAnim
//CLEAR_PED_TASKS(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn, fBlendInDelta, fBlendOutDelta, nTimeToPlay, AnimFlags, startPhase, phaseControlled, ikFlags)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_COME_HERE_ANIM - anim applied : ", tlCurrentAnim_BeverlyShoutComeOn, " : RETURN TRUE") ENDIF #ENDIF
RETURN TRUE
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_COME_HERE_ANIM - anim already playing - RETURN TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_PLAY_COME_HERE_ANIM - RETURN FALSE") ENDIF #ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// set the rival pap playing the gesture anim
/// RETURNS:
/// true if anim was applied successfully, or if anim was already playing
FUNC BOOL SET_RIVAL_PAP_PLAY_GESTURE_ANIM()
IF IS_PED_UNINJURED(sRivalPapPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap")
AND NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap")
IF NOT IS_ENTITY_IN_ARC_2D(sRivalPapPed.ped, PLAYER_PED_ID(), 85.0) // only play the anim if the player is behind the rival pap
INT iSide = GET_SIDE_COORDS_IS_TO_ENTITY(sRivalPapVehicle.vehicle, GET_ENTITY_COORDS(sRivalPapVehicle.vehicle), GET_ENTITY_COORDS(PLAYER_PED_ID()))
STRING sGestureAnim
IF iSide = 1 // RIGHT SIDE
sGestureAnim = "gesture_behind_right_pap"
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_RIVAL_PAP_PLAY_GESTURE_ANIM - gesture_behind_right_pap set") ENDIF #ENDIF
ELSE
sGestureAnim = "gesture_behind_left_pap"
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_RIVAL_PAP_PLAY_GESTURE_ANIM - gesture_behind_left_pap set") ENDIF #ENDIF
ENDIF
//CLEAR_PED_TASKS(sRivalPapPed.ped)
CLEAR_PED_SECONDARY_TASK(sRivalPapPed.ped)
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, sGestureAnim, NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) // , AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_RIVAL_PAP_PLAY_GESTURE_ANIM - anim applied , return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_RIVAL_PAP_PLAY_GESTURE_ANIM - anim already playing , return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// trigger an ambient line of dialogue from the rival pap
/// RETURNS:
/// TRUE if PLAY_PED_AMBIENT_SPEECH_WITH_VOICE was called, still no guaranteed to play
FUNC BOOL PLAY_RIVAL_PAP_AMBIENT_DIALOGUE_LINE()
IF IS_PED_UNINJURED(sRivalPapPed.ped)
IF NOT IS_SCRIPTED_SPEECH_PLAYING(sRivalPapPed.ped)
AND NOT IS_AMBIENT_SPEECH_PLAYING(sRivalPapPed.ped)
// Fuck you, Beverly!
// Get away from me!
// Are you crazy?
// You're a loser!
// Look at yourself, it's tragic!
// Are you this desperate?
// You're not cut out for this, Beverly!
// Stop trying to play with the big boys!
// Touch me and you're dead!
// What is wrong with you?
//code generate the variation when using PLAY_PED_AMBIENT_SPEECH_WITH_VOICE so just pass in the context - "PAP1_RBIKE"
PAP1_PLAY_TRIGGER_AMBIENT_SPEECH(sRivalPapPed.ped, "PAP1_DIAA", "Paparazzo1RivalPap", SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL) // B*1380212 - request to switch speech param from SPEECH_PARAMS_SHOUTED
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAY_RIVAL_PAP_AMBIENT_DIALOGUE_LINE - PAP1_RBIKE aka PAP1_DIAA return TRUE this frame :", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAY_RIVAL_PAP_AMBIENT_DIALOGUE_LINE - scripted or ambient speech in progress return FALSE this frame :", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// sets the initial values for all the variables used on the mission
/// also sets up relationship groups
PROC SET_MISSION_VARIABLES()
INT i
bDoneDialogue_InitialGetOnBike = FALSE
bDoDelayForPhotoTaken = FALSE
bDoneRivalPapFlee = FALSE
bDoneRivalPapSurrendered = FALSE
bDoneDialogue_InitialChaseDialogue = FALSE
FOR i = 0 TO (TOTAL_TOOK_PHOTO_DIALOGUE - 1)
bDoneDialogue_BeverlyTookPhoto[i] = FALSE
ENDFOR
FOR i = 0 TO (TOTAL_CHASE_RIVAL_PAP_DIALOGUE - 1)
bDoneDialogue_RivalPapTookPhoto[i] = FALSE
ENDFOR
bDoneObjective_GetCloseToCeleb = FALSE
bDoneObjective_StopTheRivalPaparazzi = FALSE
bDoneObjective_DropBeverlyOff = FALSE
bDoneObjective_ReturnToBeverly = FALSE
bDoneObjective_GetBackOnBike = FALSE
bDoneObjective_GetOnBike = FALSE
bDoneObjective_LoseTheCops = FALSE
bDoneRivalPapRemovedFromDialogue = FALSE
bDoneDialogue_BeverlySayKeepBike = FALSE
bDoneDialogue_RivalPapCameraDestroyed = FALSE
bDoneDialogue_DropOffBeverly = FALSE
bDoneDialogue_DropOffBeverlyAdditionalChat = FALSE
bDoneDialogue_LoseTheCops_InitialChat = FALSE
bDoneWaitForCameraDestroyedDialogue = FALSE
bDoneSetupCelebForCleanup = FALSE
bDoneHintCamForRival = FALSE
bDoneDialogue_FailWarningAttackMiranda = FALSE
bDoneDialogue_BeverlyMissedKnockOffAttempt = TRUE //needs to be true initially so it can be set to false when it needs to be triggered
bDoneDialogue_BeverlyThrowsPunch = TRUE //needs to be true initially so it can be set to false when it needs to be triggered
bDoneDialogue_PlayerPullsWheelie = FALSE
bDoneDialogue_MissionFailed = TRUE //initialise to TRUE and only set to false when we have dialogue which will need to play
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // initialised to TRUE and only set to false when we want him to say a reply
bHasBeverlyBeenRemovedFromPlayerGroup = FALSE
bPausedDialogue_DropOffBeverly = FALSE
bStatTracker_HasBeverlyMissedWithSwing = FALSE
bHasPlayerShotRivalPapOffBike = FALSE
bHadToFadeOutToLoadMissionAssets = FALSE
bDoneSetupRivalPapDriverToActInjured = FALSE
bDone_KnockOff_Biker_SwipeSoundFX = FALSE
bAreEntitiesHeadingsCompleteOpposite_KO_Biker = FALSE
bDone_ShowSpecialAbilityHelp = FALSE
bHasPlayerGotOnBike_FirstTime = FALSE
bBeverly_SpottedRivalPap_Anim = FALSE
bBeverly_InitialPointAtCeleb_Anim = FALSE
bHasSetExitStateFromIntroMocapForGameplayCam = FALSE
bPlayerNeedsHelmentRestoreAfterOutroMocap = FALSE
bRequestedOutroMocap = FALSE
bCheckForPlayerHelmetChange = FALSE
eP1_MissionFailedReason = FAILED_DEFAULT //used in Script_Failed() to see if a fail reason needs displaying
ePlayerTransportState = PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE
fCurrentChaseDistanceCeleb = 0.0
fRivalBikeSpeed = 45.0
fCurrentPlaybackTime = 0.0
fMainPlaybackSpeed = 1.0 //0.85 //trial to slow if down *
fKnockOff_Biker_UpdatedAnimSpeed = 1.0
fKnockOff_Biker_InitialAnimSpeed = 1.0
fKnockOff_Biker_Anim_TotalTime = 0.0
fTimeInRivalPapRecording = 0.0
fDistance_PlayerToBeverly = 0.0
fKnockOff_Biker_HitExecutionArea_Length = KNOCKOFF_BIKER_ATTACK_HIT_EXECUTION_ZONE_WIDTH
fKnockOff_Biker_StartAnimWidthModifier = 0.8
iCheckForCelebtVehicleHornTimer = 0
iCelebVehicleHornTime = 0
iGoodPhotosTakenCounter = -1
iCheckChaseSpeedTimer = 0
iTimerIncreaseCelebSpeedForPhotoTaken = -1
iNumFlashesForRivalCamera = 0
iRivalTakesPhotosBurst = 0
iRivalPapCameraFlashTimer = 0
iKnockOff_Biker_Attack_Side = KNOCKOFF_BIKER_ATTACK_SIDE_NULL
iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_NULL
iPreLoadRecordingsTimer = 0
iSoundId_BikeAttack_MeleeHit = GET_SOUND_ID()
iSoundId_BikeAttack_MeleeSwipe = GET_SOUND_ID()
iSoundId_CameraFlash = GET_SOUND_ID()
iDialogueTimer_PlayerOffTheBike = 0
iDialogueTimer_BevLeftBehind = 0
iDialogueTimer_TakingLongTimeToReachDropOffPoint = 0
iDialogueTimer_RivalPapAmbientLines = 0
iDialogueTimer_ChasingRivalPaparazzi = 0
iDialogueTimer_ChasingCeleb = 0
iDialogueTimer_LoseTheCopsAdditionalChat = 0
iTimer_DelayStopPlayerVehicleRecording_ForMissionStageSkip = 0
iMissionMusicEventTriggerCounter = PAP1_MUSIC_EVENT_MAX
iTimer_DelayResetAudioFlag_AllowScoreAndRadio = 0
iTimerTillRepeatBevFrustratedAnim = 0
iConsecutiveAimingTimer = -1
iShapeTestCamerAimIndex_SetupThisFrame = 0
iFrameCountSinceLastSuccessfulShapeTestCameraAim = 0
iTimerDelay_Progress_BevTakingPhotos = 0
iTimerDelay_RivalPapGestureAnim = 0
iTimer_DelayBeverlyInitialTurnToFaceFranklin = 0
iTimer_BeverlyBikeNotOnAllWheelsTimer = GET_GAME_TIMER()
iCounter_BeverlyPhotoBurst = 0
iDelay_BeverlyPhotoBurst = 500
iMax_BeverlyPhotoBurst = GET_RANDOM_INT_IN_RANGE(4, 7)
iFrameCountBeverlyLastSeenPlayer = 0
iStoredPlayerHelmetPropTextureIndex = 0
iStoredPlayerHelmetPropIndex = 0
iDialogueLines_RivalPapCameraWrecked = 0
iScenarioBlockingAreaStage = 0
iIntroFocusPushStage = 0
iIntroFocusPushTimer = -1
iDelayInitialChaseComment = 0
eKnockOffBikerAttackState = KBAS_SETUP_ATTACK
eBeverlyTakePhotoState = PAP1_BTPS_SETUP
ePedShootingUpProgress = PAP1_PED_SHOOTING_UP_SETUP
eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_TRIGGER_JOIN_CHASE
tlPausedDialogue_DropOffBeverly = ""
tlDialogueRoot_CameraDestroyed = ""
tlDialogueRoot_MissionFailed = ""
vBevCameraLensOffset = << 0.070, -0.4, 0.0 >>
vCelebPosInCarOffset = << 0.0, -2.4, 0.3 >> // central to car to allow probe test radius to match car width // << 0.35, -2.4, 0.3 >> // correct for the actual position of the celeb in the rear passenger side seat
//used to create areas either side of the celeb vehicle where photos can be taken
vTakePhotoZones_CentrePosOffset[0] = << 3.0, -0.5, 0.0 >>
vTakePhotoZones_CentrePosOffset[1] = << -3.0, -0.5, 0.0 >>
vTakePhotoZones_CentrePos[0] = << 0.0, 0.0, 0.0 >>
vTakePhotoZones_CentrePos[1] = << 0.0, 0.0, 0.0 >>
vPathNodeRequestMin = << 0.0, 0.0, 0.0 >>
vPathNodeRequestMax = << 0.0, 0.0, 0.0 >>
vPathNodeRequestStartPosition = << 0.0, 0.0, 0.0 >> // script checks the << 0.0, 0.0, 0.0 >> status when setting the first time
//new ko position stuff ***
vKnockOff_Biker_HitExecutionArea_OffsetFar[KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT] = << -1.2, 0.4, 1.5 >>
vKnockOff_Biker_HitExecutionArea_OffsetFar[KNOCKOFF_BIKER_ATTACK_SIDE_LEFT] = << 1.2, 0.4, 1.5 >>
vKnockOff_Biker_HitExecutionArea_OffsetNear[KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT] = << 0.0, 0.4, -1.0 >>
vKnockOff_Biker_HitExecutionArea_OffsetNear[KNOCKOFF_BIKER_ATTACK_SIDE_LEFT] = << 0.0, 0.4, -1.0 >>
vKnockOff_Biker_HitExecutionArea_PosFar = << 0.0, 0.0, 0.0 >>
vKnockOff_Biker_HitExecutionArea_PosNear = << 0.0, 0.0, 0.0 >>
vRivalPapCam_CutsceneTriggerPos = << -1467.11, -103.44, 49.87 >>
vRivalPapDriver_InitialFleeDrivePoint = << -924.0120, -142.9705, 36.7612 >> // pos further away - <<-603.5562, -11.5857, 42.4863>>
vDropOffPoint = << -1493.37524, -196.88408, 49.39753 >> // << -1491.551270,-199.071838,49.397408 >>
vCameraFlashFX_Offset = << -0.04, -0.06, 0.0 >>
//NOTE: for use with check photo anim only!
vClearZone_DropOffPoint_Min = << -1525.48, -223.51, 45.0 >>
vClearZone_DropOffPoint_Max = << -1482.88, -184.36, 59.0 >>
tlAnimDict_BeverlyShoutComeOn = "rcmpaparazzo1ig_1_waive"
tlCurrentAnim_BeverlyShoutComeOn = "waive_comeback_f"
sBeverlyVehicle.model = PCJ // GET_NPC_VEH_MODEL(CHAR_BEVERLY) // FAGGIO2 is too slow
sBeverlyVehicle.vSpawn = << -159.56, 275.41, 93.14 >> // pos change to use cutscene << -164.26, 275.12, 92.95 >>
sBeverlyVehicle.fSpawnHeading = 102.75 // pos change to use cutscene 92.32
sBeverlyPed.model = GET_NPC_PED_MODEL(CHAR_BEVERLY)
sBeverlyPed.vSpawn = << -159.49, 276.85, 93.66 >> // pos change to use cutscene
sBeverlyPed.fSpawnHeading = -74.01 // pos change to use cutscene
sCelebVehicle.model = STRETCH
sCelebVehicle.vSpawn = << -177.404144,266.726929,92.407616 >>
sCelebVehicle.fSpawnHeading = 85.4595
sCelebPed.model = U_F_M_MIRANDA
sCelebPed.vSpawn = << 0.0, -170.05, 284.88 >>
sCelebPed.fSpawnHeading = -172.46
sCelebsDriverPed.model = S_M_M_HighSec_01
sRivalPapVehicle.model = PCJ //BATI
sRivalPapVehicle.vSpawn = << -1585.9142, -133.9717, 55.1026 >>
sRivalPapVehicle.fSpawnHeading = 0.0 //unknown
sRivalPapPed.model = U_M_Y_PAPARAZZI
// sRivalPapPed.vSpawn = << -152.6825, 286.6073, 92.7637 >>
// sRivalPapPed.fSpawnHeading = 205.9674
sRivalPapDriverPed.model = U_M_M_RIVALPAP
sObjCameraBeverly.model = PROP_PAP_CAMERA_01
sObjCameraBeverly.vOffset = << 0.0, 0.0, 0.0 >>
sObjCameraBeverly.vRotation = << 0.0, 0.0, 0.0 >>
sObjCameraBeverly.vPosition = << 0.0, 0.0, 0.0 >>
sObjFlashUnitBeverly.model = PROP_FLASH_UNIT
sObjFlashUnitBeverly.vOffset = << 0.107, 0.025, 0.177 >>
sObjFlashUnitBeverly.vRotation = << 0.0, 0.0, 0.0 >>
sObjFlashUnitBeverly.vPosition = << 0.0, 0.0, 0.0 >>
sObjCameraRivalPap.model = PROP_PAP_CAMERA_01
sObjCameraRivalPap.vOffset = << 0.0, 0.0, 0.0 >>
sObjCameraRivalPap.vRotation = << 0.0, 0.0, 0.0 >>
sObjFlashUnitRivalPap.model = PROP_FLASH_UNIT
sObjFlashUnitRivalPap.vOffset = << 0.107, 0.025, 0.177 >>
sObjFlashUnitRivalPap.vRotation = << 0.0, 0.0, 0.0 >>
sObjFlashUnitRivalPap.vPosition = << 0.0, 0.0, 0.0 >>
sObjSyringe.model = PROP_SYRINGE_01
sObjSyringe.vOffset = << 0.0, 0.0, 0.0 >>
sObjSyringe.vRotation = << 0.0, 0.0, 0.0 >>
ADD_RELATIONSHIP_GROUP("ENEMIES", relGroupEnemy)
IF IS_PED_UNINJURED(PLAYER_PED_ID())
relGroupFriendly= GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID()) //ADD_RELATIONSHIP_GROUP("FRIENDLIES", relGroupFriendly)
ENDIF
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupEnemy, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relGroupEnemy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupEnemy, relGroupFriendly)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupFriendly, relGroupEnemy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupFriendly, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, relGroupFriendly)
SET_VEHICLE_MODEL_IS_SUPPRESSED(sBeverlyVehicle.model, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(sCelebVehicle.model, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(sRivalPapVehicle.model, TRUE)
ENDPROC
/// PURPOSE:
/// Initialization of the mission
PROC INIT_MISSION()
SET_MISSION_VARIABLES()
#IF IS_DEBUG_BUILD
SETUP_MISSION_WIDGET() //this needs setting up first to ensure debug print can be displayed when loading assets
// stage skipping
mSkipMenu[Z_SKIP_INTRO].sTxtLabel = "Mocap: PAP_1_RCM"
mSkipMenu[Z_SKIP_CHASE_CELEB_IN_VEHICLE].sTxtLabel = "Chase Miranda"
mSkipMenu[Z_SKIP_ENTER_RIVAL_PAP].sTxtLabel = "Rival pap joins the chase"
mSkipMenu[Z_SKIP_STOP_RIVAL_PAP].sTxtLabel = "Stop the rival paparazzi"
mSkipMenu[Z_SKIP_DROP_BEVERLY_OFF].sTxtLabel = "Drop Beverly off"
mSkipMenu[Z_SKIP_OUTRO].sTxtLabel = "Mocap: PAP_1_MCS_1"
mSkipMenu[Z_SKIP_MISSION_PASSED].sTxtLabel = "Mission Passed"
#ENDIF
SET_WANTED_LEVEL_MULTIPLIER(0.2)
//ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
REGISTER_SCRIPT_WITH_AUDIO()
SET_AGGRESSIVE_HORNS(TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(BUS, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(COACH, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(MULE, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(MULE2, TRUE)
DISABLE_TAXI_HAILING(TRUE) // don't allow taxis on mission
//remove stuff we don't want around the carpark drop off point - vehicles, peds, objects, blood decals
SET_SCENARIO_GROUP_ENABLED("ATTRACT_PAP", FALSE) // vehicle park up chain at the drop off point
SET_ROADS_IN_ANGLED_AREA(<<-1514.624146,-211.543411,46.786194>>, <<-1487.885254,-190.754852,59.494499>>, 25.000000, FALSE, FALSE) // drop off area
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vClearZone_DropOffPoint_Min, vClearZone_DropOffPoint_Max, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(vClearZone_DropOffPoint_Min, vClearZone_DropOffPoint_Max)
CLEAR_AREA(vDropOffPoint, 15.0, TRUE)
CLEAR_AREA_OF_PEDS(vDropOffPoint, 15.0)
CLEAR_AREA_OF_VEHICLES(vDropOffPoint, 15.0)
ENDPROC
/// PURPOSE:
/// handles the assets for the rival pap's arrival
/// PARAMS:
/// bWaitForAssetsToLoad - if true game waits for all requests to be loaded
PROC LOAD_ASSETS_FOR_RIVAL_PAP_ARRIVING(BOOL bWaitForAssetsToLoad = TRUE)
REQUEST_MODEL(sObjCameraRivalPap.model)
REQUEST_MODEL(sObjFlashUnitRivalPap.model)
REQUEST_MODEL(sRivalPapPed.model)
REQUEST_MODEL(sRivalPapDriverPed.model)
REQUEST_MODEL(sRivalPapVehicle.model)
REQUEST_VEHICLE_RECORDING(1, "Pap1RP") //load rival pap's vehicle recording
REQUEST_SCRIPT_AUDIO_BANK("PAPARAZZO_01_A") //road rash attack sfx
IF bWaitForAssetsToLoad
WHILE NOT HAS_MODEL_LOADED(sObjCameraRivalPap.model)
OR NOT HAS_MODEL_LOADED(sObjFlashUnitRivalPap.model)
OR NOT HAS_MODEL_LOADED(sRivalPapPed.model)
OR NOT HAS_MODEL_LOADED(sRivalPapDriverPed.model)
OR NOT HAS_MODEL_LOADED(sRivalPapVehicle.model)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(1, "Pap1RP")
OR NOT REQUEST_SCRIPT_AUDIO_BANK("PAPARAZZO_01_A")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "waiting for asset to load - rival pap ") ENDIF #ENDIF
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
/// PURPOSE:
/// handles all the mission asset requests
/// PARAMS:
/// bWaitForAssetsToLoad - if true game waits for all requests to be loaded
PROC LOAD_MISSION_ASSETS(BOOL bWaitForAssetsToLoad = FALSE)
REQUEST_ADDITIONAL_TEXT("PAP1", MISSION_TEXT_SLOT)
REQUEST_VEHICLE_RECORDING(1, sPap1_UberRecordingName) //main uber recording
REQUEST_SCRIPT_AUDIO_BANK(sPap1_AudioBank_CameraFlashSoundFX) //flash sound fx
REQUEST_MODEL(sBeverlyPed.model) // NOW CREATED IN MOCAP however not getting registered for some reason so keep request for now
REQUEST_MODEL(sBeverlyVehicle.model) // now handled in CREATE_BEVERLYS_BIKE_FOR_MISSION_START()
REQUEST_MODEL(sCelebPed.model)
REQUEST_MODEL(sCelebsDriverPed.model)
REQUEST_MODEL(sCelebVehicle.model)
REQUEST_MODEL(sObjCameraBeverly.model) // NOW CREATED IN MOCAP however not getting registered for some reason so keep request for now
REQUEST_MODEL(sObjFlashUnitBeverly.model) // NOW CREATED IN MOCAP however not getting registered for some reason so keep request for now
REQUEST_PTFX_ASSET() //needed for the camera flash fx
REQUEST_VEHICLE_ASSET(sBeverlyVehicle.model) //entry / exit anims for Beverly's bike...needed otherwise Beverly will warp on/off it
REQUEST_ANIM_DICT(sAnimDictName_Pap1Specific) //contains new pap attack anims, new camera script aim gun task anims, rival pap hit reactions, dialogue on bike anims
REQUEST_ANIM_DICT(sAnimDictName_Pap1HandOverride) // anim dict containing camera in hand override
REQUEST_CLIP_SET(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(TRUE)) // anim clipset containing Bev get on bike left side override
REQUEST_CLIP_SET(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(FALSE)) // anim clipset containing Bev get on bike right side override
REQUEST_ANIM_DICT(tlAnimDict_BeverlyShoutComeOn) // contains Beverly encourage player to hurry up, come on, come back anims
REQUEST_ANIM_SET(sAnimSet_BeverlyCameraWeaponMovementOnFoot) // pap holding camera movement
//wait until loaded
IF bWaitForAssetsToLoad
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(1, sPap1_UberRecordingName)
OR NOT REQUEST_SCRIPT_AUDIO_BANK(sPap1_AudioBank_CameraFlashSoundFX)
OR NOT HAS_MODEL_LOADED(sBeverlyPed.model) // NOW CREATED IN MOCAP however not getting registered for some reason so keep request for now
OR NOT HAS_MODEL_LOADED(sBeverlyVehicle.model)
OR NOT HAS_MODEL_LOADED(sCelebPed.model)
OR NOT HAS_MODEL_LOADED(sCelebsDriverPed.model)
OR NOT HAS_MODEL_LOADED(sCelebVehicle.model)
OR NOT HAS_MODEL_LOADED(sObjCameraBeverly.model) // NOW CREATED IN MOCAP however not getting registered for some reason so keep request for now
OR NOT HAS_MODEL_LOADED(sObjFlashUnitBeverly.model) // NOW CREATED IN MOCAP however not getting registered for some reason so keep request for now
OR NOT HAS_PTFX_ASSET_LOADED()
OR NOT HAS_VEHICLE_ASSET_LOADED(sBeverlyVehicle.model)
OR NOT HAS_ANIM_DICT_LOADED(sAnimDictName_Pap1Specific) //contains new pap attack anims, new camera script aim gun task anims, rival pap hit reactions, dialogue on bike anims
OR NOT HAS_ANIM_DICT_LOADED(sAnimDictName_Pap1HandOverride) // anim dict containing camera in hand override
OR NOT HAS_ANIM_SET_LOADED(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(TRUE)) // anim clipset containing Bev get on bike left side override
OR NOT HAS_ANIM_SET_LOADED(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(FALSE)) // anim clipset containing Bev get on bike right side override
OR NOT HAS_ANIM_DICT_LOADED(tlAnimDict_BeverlyShoutComeOn) // contains Beverly encourage player to hurry up, come on, come back anims
OR NOT HAS_ANIM_SET_LOADED(sAnimSet_BeverlyCameraWeaponMovementOnFoot) // pap holding camera movement
IF bFinishedStageSkipping //don't fade if we are stage skipping
IF NOT IS_SCREEN_FADED_OUT()
SAFE_FADE_SCREEN_OUT_TO_BLACK(0, TRUE)
bHadToFadeOutToLoadMissionAssets = TRUE //stored so I only fade back up if, I faded down
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SCREEN FADED BECAUSE ASSETS WEREN'T LOADED IN TIME") ENDIF #ENDIF
ENDIF
ENDIF
WAIT(0)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "waiting for asset to load ") ENDIF #ENDIF
ENDWHILE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION ASSETS LOADED - GO GO GO ") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// sets up Beverly's bike for the start of the mission.
/// uses the scene setup entity if it's available, else creates a new entity.
/// This has to be done seperately since you can see the bike jump into position during the mocap otherwise.
PROC CREATE_BEVERLYS_BIKE_FOR_MISSION_START()
sBeverlyVehicle.model = BEVERLY_BIKE // get the model handle used in the initial scene, which keeps the model in memory for me
IF NOT DOES_ENTITY_EXIST(sBeverlyVehicle.vehicle)
CLEAR_AREA(sBeverlyVehicle.vSpawn, 2.0, TRUE)
REQUEST_MODEL(sBeverlyVehicle.model) // should already be in memory from the launcher
IF HAS_MODEL_LOADED(sBeverlyVehicle.model)
sBeverlyVehicle.vehicle = CREATE_VEHICLE(sBeverlyVehicle.model, sBeverlyVehicle.vSpawn, sBeverlyVehicle.fSpawnHeading)
ELSE
SCRIPT_ASSERT("PAPARAZZO 1 - CREATE_BEVERLYS_BIKE_FOR_MISSION_START - sBeverlyVehicle.model isnt loaded")
ENDIF
ENDIF
SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[0])
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
SET_VEHICLE_FIXED(sBeverlyVehicle.vehicle)
SET_ENTITY_COORDS(sBeverlyVehicle.vehicle, sBeverlyVehicle.vSpawn)
SET_ENTITY_HEADING(sBeverlyVehicle.vehicle, sBeverlyVehicle.fSpawnHeading)
SET_VEHICLE_DOORS_LOCKED(sBeverlyVehicle.vehicle, VEHICLELOCK_UNLOCKED)
SET_VEHICLE_ON_GROUND_PROPERLY(sBeverlyVehicle.vehicle)
SET_VEHICLE_COLOURS(sBeverlyVehicle.vehicle, 62, 62) //BLUE
SET_VEHICLE_CAN_LEAK_OIL(sBeverlyVehicle.vehicle, FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(sBeverlyVehicle.vehicle, FALSE)
//SET_VEHICLE_TYRES_CAN_BURST(sBeverlyVehicle.vehicle, FALSE)
SET_VEHICLE_STRONG(sBeverlyVehicle.vehicle, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(sBeverlyVehicle.vehicle, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(sBeverlyVehicle.model)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE_BEVERLYS_BIKE_FOR_MISSION_START done") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// sets up the celeb vehicle for the start of in game play
PROC SETUP_CELEB_VEHICLE_FOR_IN_GAME_START()
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
SET_VEHICLE_FIXED(sCelebVehicle.vehicle)
SET_VEHICLE_DOORS_LOCKED(sCelebVehicle.vehicle, VEHICLELOCK_UNLOCKED)
SET_VEHICLE_ENGINE_ON(sCelebVehicle.vehicle, TRUE, TRUE)
SET_VEHICLE_COLOURS(sCelebVehicle.vehicle, 0, 0) //black
SET_VEHICLE_TYRES_CAN_BURST(sCelebVehicle.vehicle, FALSE)
SET_VEHICLE_STRONG(sCelebVehicle.vehicle, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(sCelebVehicle.vehicle, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sCelebVehicle.vehicle, FALSE)
SET_VEHICLE_CAN_LEAK_OIL(sCelebVehicle.vehicle, FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(sCelebVehicle.vehicle, FALSE)
SET_VEHICLE_DOOR_SHUT(sCelebVehicle.vehicle, SC_DOOR_FRONT_LEFT, TRUE)
SET_VEHICLE_DOOR_SHUT(sCelebVehicle.vehicle, SC_DOOR_REAR_RIGHT, TRUE) // Fix B*1134065 - door swinging open (think cutscene doesn't shut it again)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sCelebVehicle.vehicle, SC_DOOR_REAR_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sCelebVehicle.vehicle, SC_DOOR_REAR_RIGHT, FALSE)
SET_ENTITY_COORDS(sCelebVehicle.vehicle, sCelebVehicle.vSpawn)
SET_ENTITY_QUATERNION(sCelebVehicle.vehicle, -0.0362, 0.0042, 0.6776, 0.7345) // ensure update intro mocap where set cutscene exit state
FREEZE_ENTITY_POSITION(sCelebVehicle.vehicle, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CELEB_VEHICLE_FOR_IN_GAME_START done") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// sets up Beverly for the start of in game play
PROC SETUP_BEVERLY_FOR_IN_GAME_START()
IF IS_PED_UNINJURED(sBeverlyPed.ped)
SET_PED_COMPONENT_VARIATION(sBeverlyPed.ped, INT_TO_ENUM(PED_COMPONENT,9), 1, 0, 0) // set Beverly to not have his extra camera around his neck (as per bug 1034768)
// B*1409359 - ensure Beverly won't try to put a helmet on before his baseball cap gets set
SET_PED_HELMET(sBeverlyPed.ped, FALSE)
SET_ENTITY_VISIBLE(sBeverlyPed.ped, TRUE)
SET_PED_CAN_BE_TARGETTED(sBeverlyPed.ped, FALSE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sBeverlyPed.ped, KNOCKOFFVEHICLE_DEFAULT)
ADD_ARMOUR_TO_PED(sBeverlyPed.ped, 100)
SET_ENTITY_LOAD_COLLISION_FLAG(sBeverlyPed.ped, TRUE)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sBeverlyPed.ped ,FALSE)
SET_PED_CONFIG_FLAG(sBeverlyPed.ped, PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_CONFIG_FLAG(sBeverlyPed.ped, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
SET_PED_CONFIG_FLAG(sBeverlyPed.ped, PCF_RunFromFiresAndExplosions, TRUE)
SET_PED_CONFIG_FLAG(sBeverlyPed.ped, PCF_DontEnterVehiclesInPlayersGroup, TRUE) //used to control which vehicles the ped will get into
SET_PED_CONFIG_FLAG(sBeverlyPed.ped, PCF_UseKinematicModeWhenStationary, TRUE) // B*1421480 - anims don't support avoid / bumped anims
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sBeverlyPed.ped, FALSE)
SET_PED_DIES_IN_WATER(sBeverlyPed.ped, TRUE)
SET_PED_DIES_IN_SINKING_VEHICLE(sBeverlyPed.ped, TRUE)
SET_PED_MAX_TIME_IN_WATER(sBeverlyPed.ped, 2.0)
SET_PED_MAX_TIME_UNDERWATER(sBeverlyPed.ped, 2.0)
SET_PED_PATH_PREFER_TO_AVOID_WATER(sBeverlyPed.ped, TRUE)
IF IS_PED_IN_GROUP(sBeverlyPed.ped)
REMOVE_PED_FROM_GROUP(sBeverlyPed.ped)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "*PED GROUP* BEV removed from any group at create ped stage") ENDIF #ENDIF
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sBeverlyPed.ped, relGroupFriendly)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBeverlyPed.ped, TRUE)
ADD_PED_FOR_DIALOGUE(sDialogue, 3, sBeverlyPed.ped, "BEVERLY")
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sBeverlyPed.ped, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_FOR_IN_GAME_START done") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// sets up celeb for the start of in game play
PROC SETUP_CELEB_FOR_IN_GAME_START()
IF IS_PED_UNINJURED(sCelebPed.ped)
SET_PED_CAN_BE_TARGETTED(sCelebPed.ped, FALSE)
ADD_ARMOUR_TO_PED(sCelebPed.ped, 100)
SET_ENTITY_LOAD_COLLISION_FLAG(sCelebPed.ped, TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(sCelebPed.ped, FALSE)
SET_PED_CAN_BE_SHOT_IN_VEHICLE(sCelebPed.ped, FALSE)
SET_PED_CAN_BE_DRAGGED_OUT(sCelebPed.ped, FALSE)
SET_PED_CONFIG_FLAG(sCelebPed.ped, PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_CONFIG_FLAG(sCelebPed.ped, PCF_DontInfluenceWantedLevel, TRUE)
IF IS_PED_IN_GROUP(sCelebPed.ped)
REMOVE_PED_FROM_GROUP(sCelebPed.ped)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sCelebPed.ped, relGroupEnemy)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCelebPed.ped, TRUE)
SET_PED_CONFIG_FLAG(sCelebPed.ped, PCF_GetOutUndriveableVehicle, FALSE) // //stop ped leaving undriveable vehicle
SET_PED_CONFIG_FLAG(sCelebPed.ped, PCF_GetOutBurningVehicle, FALSE) // //stop ped leaving undriveable vehicle
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_CELEB_FOR_IN_GAME_START done") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// sets up celeb driver for the start of in game play
PROC SETUP_CELEB_DRIVER_FOR_IN_GAME_START()
IF IS_PED_UNINJURED(sCelebsDriverPed.ped)
SET_PED_CAN_BE_TARGETTED(sCelebsDriverPed.ped, FALSE)
ADD_ARMOUR_TO_PED(sCelebsDriverPed.ped, 100)
SET_PED_SUFFERS_CRITICAL_HITS(sCelebsDriverPed.ped, FALSE)
SET_PED_CAN_BE_SHOT_IN_VEHICLE(sCelebsDriverPed.ped, FALSE)
SET_PED_CAN_BE_DRAGGED_OUT(sCelebsDriverPed.ped, FALSE)
SET_PED_CONFIG_FLAG(sCelebsDriverPed.ped, PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_CONFIG_FLAG(sCelebsDriverPed.ped, PCF_DontInfluenceWantedLevel, TRUE)
IF IS_PED_IN_GROUP(sCelebsDriverPed.ped)
REMOVE_PED_FROM_GROUP(sCelebsDriverPed.ped)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sCelebsDriverPed.ped, relGroupEnemy)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCelebsDriverPed.ped, TRUE)
SET_PED_CONFIG_FLAG(sCelebsDriverPed.ped, PCF_GetOutUndriveableVehicle, FALSE) // //stop ped leaving undriveable vehicle
SET_PED_CONFIG_FLAG(sCelebsDriverPed.ped, PCF_GetOutBurningVehicle, FALSE) // //stop ped leaving undriveable vehicle
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_CELEB_DRIVER_FOR_IN_GAME_START done") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// deals with creating the peds, vehicles, objects etc
PROC CREATE_ENTITIES_FOR_MISSION_START()
IF IS_PED_UNINJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(sDialogue, 1, PLAYER_PED_ID(), "FRANKLIN")
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE)
ENDIF
//Beverly
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[0]) // Remove temporary RC character BEVERLY
IF NOT DOES_ENTITY_EXIST(sBeverlyPed.ped)
sBeverlyPed.ped = CREATE_PED(PEDTYPE_MISSION, sBeverlyPed.model, sBeverlyPed.vSpawn, sBeverlyPed.fSpawnHeading)
CPRINTLN(DEBUG_MISSION, "created beverly in script, not mocap ~~~~~ FC = ", GET_FRAME_COUNT())
SETUP_BEVERLY_FOR_IN_GAME_START()
ENDIF
// Setup Beverly's camera and flash unit
IF IS_PED_UNINJURED(sBeverlyPed.ped)
SAFE_DELETE_OBJECT(sRCLauncherDataLocal.objID[0]) // remove camera from initial scene
IF NOT DOES_ENTITY_EXIST(sObjCameraBeverly.object)
sObjCameraBeverly.vPosition = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sBeverlyPed.ped, << 0.0, 0.0, 2.5 >>)
sObjCameraBeverly.object = CREATE_OBJECT(sObjCameraBeverly.model, sObjCameraBeverly.vPosition)
CPRINTLN(DEBUG_MISSION, "CREATE_ENTITIES_FOR_MISSION_START - ObjCameraBeverly.object - created in script not mocap FC = ", GET_FRAME_COUNT())
ENDIF
IF NOT DOES_ENTITY_EXIST(sObjFlashUnitBeverly.object)
sObjFlashUnitBeverly.vPosition = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sBeverlyPed.ped, << 0.0, 0.0, 2.5 >>)
sObjFlashUnitBeverly.object = CREATE_OBJECT(sObjFlashUnitBeverly.model, sObjFlashUnitBeverly.vPosition)
CPRINTLN(DEBUG_MISSION, "CREATE_ENTITIES_FOR_MISSION_START - sObjFlashUnitBeverly.object - created in script not mocap FC = ", GET_FRAME_COUNT())
ENDIF
IF IS_ENTITY_ALIVE(sObjCameraBeverly.object)
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(sObjFlashUnitBeverly.object, sObjCameraBeverly.object)
ATTACH_ENTITY_TO_ENTITY(sObjFlashUnitBeverly.object, sObjCameraBeverly.object, 0, sObjFlashUnitBeverly.vOffset, sObjFlashUnitBeverly.vRotation)
CPRINTLN(DEBUG_MISSION, "CREATE_ENTITIES_FOR_MISSION_START - sObjFlashUnitBeverly.object - ATTACHED to sObjCameraBeverly.object in script not mocap FC = ", GET_FRAME_COUNT())
ENDIF
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped)
ATTACH_ENTITY_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped, GET_PED_BONE_INDEX(sBeverlyPed.ped, BONETAG_PH_R_HAND), sObjCameraBeverly.vOffset, sObjCameraBeverly.vRotation)
CPRINTLN(DEBUG_MISSION, "CREATE_ENTITIES_FOR_MISSION_START - sObjCameraBeverly.object - ATTACHED to sBeverlyPed.ped in script not mocap FC = ", GET_FRAME_COUNT())
ENDIF
SET_ENTITY_VISIBLE(sObjCameraBeverly.object, TRUE) //ADDED TO STOP VISIBLE SPAWNING IN ...GETS TURNED BACK ON IN MOCAP INTRO
ENDIF
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(sObjCameraBeverly.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sObjFlashUnitBeverly.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sBeverlyPed.model)
// Setup Celeb's Vehicle
SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[1]) // celeb vehicle from initial setup
IF NOT DOES_ENTITY_EXIST(sCelebVehicle.vehicle)
CLEAR_AREA(sCelebVehicle.vSpawn, 2.0, TRUE)
sCelebVehicle.vehicle = CREATE_VEHICLE(sCelebVehicle.model, sCelebVehicle.vSpawn, sCelebVehicle.fSpawnHeading)
CPRINTLN(DEBUG_MISSION, "created Miranda's vehicle in script, not mocap FC = ", GET_FRAME_COUNT())
SETUP_CELEB_VEHICLE_FOR_IN_GAME_START()
ENDIF
// Setup Celeb ped and Celeb's driver
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF NOT DOES_ENTITY_EXIST(sCelebPed.ped)
sCelebPed.ped = CREATE_PED_INSIDE_VEHICLE(sCelebVehicle.vehicle, PEDTYPE_MISSION, sCelebPed.model, VS_BACK_RIGHT)
CPRINTLN(DEBUG_MISSION, "created Miranda's in script, not mocap FC = ", GET_FRAME_COUNT())
SETUP_CELEB_FOR_IN_GAME_START()
ENDIF
IF NOT DOES_ENTITY_EXIST(sCelebsDriverPed.ped)
sCelebsDriverPed.ped = CREATE_PED_INSIDE_VEHICLE(sCelebVehicle.vehicle, PEDTYPE_MISSION, sCelebsDriverPed.model)
CPRINTLN(DEBUG_MISSION, "created Miranda's driver in script, not mocap FC = ", GET_FRAME_COUNT())
SETUP_CELEB_DRIVER_FOR_IN_GAME_START()
ENDIF
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(sCelebVehicle.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sCelebPed.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sCelebsDriverPed.model)
//back up fade in, if we had to fade out during loading of assets
IF bFinishedStageSkipping //however, don't fade if we are stage skipping
IF bHadToFadeOutToLoadMissionAssets
IF NOT IS_SCREEN_FADED_IN()
AND NOT IS_SCREEN_FADING_IN()
SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SCREEN FADED IN BY MY SCRIPT RATHER THAN MOCAP END ^^^^^^^^^^^") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// make Miranda's vehicle sound it's horn when the player is close or hits it
/// PARAMS:
/// fChaseDistance - dist player from Miranda's vehicle
PROC MANAGE_CELEB_VEHICLE_USING_HORN(FLOAT fChaseDistance)
IF HAS_TIME_PASSED(iCheckForCelebtVehicleHornTimer, iCelebVehicleHornTime)
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF fChaseDistance < 4.0 // area close around Miranda's vehicle
OR IS_ENTITY_TOUCHING_ENTITY(sCelebVehicle.vehicle, sBeverlyVehicle.vehicle)
iCelebVehicleHornTime = GET_RANDOM_INT_IN_RANGE(1500, 3500)
START_VEHICLE_HORN(sCelebVehicle.vehicle, iCelebVehicleHornTime, GET_HASH_KEY("HELDDOWN"))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CELEB_VEHICLE_USING_HORN - triggered, length = ", iCelebVehicleHornTime) ENDIF #ENDIF
iCelebVehicleHornTime += 4000 // long wait before horn can be triggered again
iCheckForCelebtVehicleHornTimer = GET_GAME_TIMER()
EXIT
ENDIF
ENDIF
//don't do this check every frame
iCelebVehicleHornTime = 250
iCheckForCelebtVehicleHornTimer = GET_GAME_TIMER()
ENDIF
ENDPROC
/// PURPOSE:
/// Handles Miranda shooting up in the back of the limo
/// PARAMS:
/// pedIndex - the ped who will be playing the anims (miranda)
PROC MANAGE_PED_SHOOTING_UP(PED_INDEX pedIndex)
IF IS_PED_UNINJURED(pedIndex)
SWITCH ePedShootingUpProgress
CASE PAP1_PED_SHOOTING_UP_SETUP
REQUEST_MODEL(sObjSyringe.model)
IF HAS_MODEL_LOADED(sObjSyringe.model)
IF NOT DOES_ENTITY_EXIST(sObjSyringe.object)
sObjSyringe.vPosition = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(pedIndex, << 0.0, 0.0, 2.5 >>)
sObjSyringe.object = CREATE_OBJECT(sObjSyringe.model, sObjSyringe.vPosition)
ATTACH_ENTITY_TO_ENTITY(sObjSyringe.object, pedIndex, GET_PED_BONE_INDEX(pedIndex, BONETAG_PH_R_HAND), sObjSyringe.vOffset, sObjSyringe.vRotation)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_PED_SHOOTING_UP - syringe attached") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sObjSyringe.object)
SET_ENTITY_VISIBLE(sObjSyringe.object, TRUE)
SET_ENTITY_INVINCIBLE(sObjSyringe.object, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(sObjSyringe.model)
REQUEST_ANIM_DICT("rcmpaparazzo1ig_4") //ped shooting up in vehicle anim
ePedShootingUpProgress = PAP1_PED_SHOOTING_UP_UPDATE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_PED_SHOOTING_UP - PAP1_PED_SHOOTING_UP_SETUP - done") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_PED_SHOOTING_UP_UPDATE
IF NOT IS_ENTITY_PLAYING_ANIM(pedIndex, "rcmpaparazzo1ig_4", "miranda_shooting_up")
REQUEST_ANIM_DICT("rcmpaparazzo1ig_4") //ped shooting up in vehicle anim
IF HAS_ANIM_DICT_LOADED("rcmpaparazzo1ig_4")
TASK_PLAY_ANIM(pedIndex, "rcmpaparazzo1ig_4", "miranda_shooting_up", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
REMOVE_ANIM_DICT("rcmpaparazzo1ig_4") //ped shooting up in vehicle anim
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_PED_SHOOTING_UP - PAP1_PED_SHOOTING_UP_UPDATE - anim applied") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_PED_SHOOTING_UP_CLEANUP
IF NOT IS_ENTITY_PLAYING_ANIM(pedIndex, "rcmpaparazzo1ig_4", "miranda_shooting_up")
STOP_ANIM_TASK(pedIndex, "rcmpaparazzo1ig_4", "miranda_shooting_up")
ENDIF
REMOVE_ANIM_DICT("rcmpaparazzo1ig_4") //ped shooting up in vehicle anim
SAFE_REMOVE_OBJECT(sObjSyringe.object, FALSE)
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// If the player uses the special ability
/// prior to the point I want to display the help text for it then turn off the bool for displaying the help text
PROC CHECK_PLAYER_USED_SPECIAL_ABILITY()
IF NOT bDone_ShowSpecialAbilityHelp
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
CLEAR_SPECIFIC_HELP_TEXT_FROM_DISPLAYING("PAP1_H2") // ~s~Hold ~INPUT_VEH_SPECIAL_ABILITY_FRANKLIN~ to activate overdrive mode, this will focus Franklin and improve his reflexes.~s~
IF IS_PC_VERSION()
CLEAR_SPECIFIC_HELP_TEXT_FROM_DISPLAYING("PAP1_H2_KM") // ~s~Press ~INPUT_SPECIAL_ABILITY~ to activate Franklin's special ability.~s~
ENDIF
bDone_ShowSpecialAbilityHelp = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_PLAYER_USED_SPECIAL_ABILITY - help text bool set TRUE") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// NEW uses UPDATE_CURRENT_PLAYBACK_SPEED_WITH_SMOOTHING and CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR
/// Rubberbands the chase speed of Franklin to Miranda's limo
/// NOTE: having to override the standard uber recording behaviour a bit as the player needs to be able to get along side Miranda comfortably
/// PARAMS:
/// fCurrentChaseSpeed - the main chase speed which is to be updated
/// fChaseDistance - the current dist between Franklin and Miranda's limo
PROC NEW_UPDATE_CELEB_CHASE_SPEED(FLOAT &fCurrentChaseSpeed, FLOAT fChaseDistance)
//uber recording
FLOAT fDesiredPlaybackSpeed = fCurrentChaseSpeed
FLOAT fLosingTriggerDist = (CELEB_ESCAPED_DIST / 100) * (PAP1_CELEB_CHASE_BLIP_FLASH_PERCENTAGE * 100) // point where the flashing blip kicks in for escaping
FLOAT fAccel = 0.1
//IF bHasPlayerGotOnBike_FirstTime = FALSE
// fDesiredPlaybackSpeed = 0.55
// #IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - player not on the bike first time <, fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
//don't slow down when the rival pap peals off as we need to maintain speed here
IF fCurrentPlaybackTime > 78000.0
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
9.5, 18.0, 125.0, (fLosingTriggerDist + 50), 50.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.85, 0.7, 1.25, TRUE, ABSF(BIKE_TOP_SPEED_MODIFIER), 15.0, TRUE)
fAccel = 0.07
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - fCurrentPlaybackTime > 78000.0 >, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
//speed up towards the end of the chase to get back in front before the rival pap turns up
ELIF fCurrentPlaybackTime > 54000.0
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
9.5, 17.0, 32.0, fLosingTriggerDist, 30.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.7, 0.5, 1.25, TRUE, (ABSF(BIKE_TOP_SPEED_MODIFIER) + 5), 20.0, TRUE)
fAccel = 0.045
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - fCurrentPlaybackTime > 54000.0 >, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
//begin speed up towards the end of the chase to get back in front before the rival pap turns up
ELIF fCurrentPlaybackTime > 52500.0
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
6.5, 12.0, 32.0, fLosingTriggerDist, 30.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.7, 0.5, 1.15, TRUE, (ABSF(BIKE_TOP_SPEED_MODIFIER) + 2.5), 20.0, TRUE)
fAccel = 0.045
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - fCurrentPlaybackTime > 52500.0 >, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
//begin speeding up towards the end of the chase to get back in front before the rival pap turns up
ELIF fCurrentPlaybackTime > 51000.0
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
3.5, 6.0, 32.0, fLosingTriggerDist, 30.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.7, 0.5, 1.05, TRUE, (ABSF(BIKE_TOP_SPEED_MODIFIER)), 18.0, TRUE)
fAccel = 0.040
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - fCurrentPlaybackTime > 51000.0, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
// take it really slow at the start of the chase to allow player time to get on the bike and catch up
ELIF fCurrentPlaybackTime < 7000.0
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
3.0, 8.0, 22.0, fLosingTriggerDist, 30.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.6, 0.5, 1.25, TRUE, 0, 10.0, TRUE)
fAccel = 0.075
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - fCurrentPlaybackTime < 7000.0 >, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
//if however the player trying to do the chase in a different vehicle dont slow down
ELIF ePlayerTransportState <> PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV
OR fChaseDistance > ((CELEB_ESCAPED_DIST / 100) * (PAP1_CELEB_CHASE_BLIP_FLASH_PERCENTAGE * 100)) // same time the chase blip will kick in
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
10.0, 20.0, 150.0, fLosingTriggerDist, 30.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.7, 0.5, 1.2, TRUE, ABSF(BIKE_TOP_SPEED_MODIFIER), 20.0, TRUE)
fAccel = 0.45
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - player not on bev bike or dist from miranda is escape warning , BUT player in veh not bev's, so not slowed <, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
ELSE
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
0.0, 0.2, 5.0, fLosingTriggerDist, 30.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.6, 0.5, 1.2, TRUE, ABSF(BIKE_TOP_SPEED_MODIFIER), 20.0, TRUE)
fAccel = 0.45
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - player not on bev bike or dist from miranda is escape warning, so slowed, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
ENDIF
// speed boost directly after Beverly has taken a photo (during his check photo state)
ELIF bDoDelayForPhotoTaken
AND (GET_GAME_TIMER() - iTimerIncreaseCelebSpeedForPhotoTaken > 2500) // 3500)
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
5.0, 10.0, 18.0, fLosingTriggerDist, 30.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.6, 0.4, 1.2, TRUE, ABSF(BIKE_TOP_SPEED_MODIFIER), 15.0, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - Bev took a photo boost >, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
//just maintain the speed if really close together (attempt to allow the player to get
// alongside the celeb's vehicle so Beverly can take a photo) normal uber calculating wants the player behind the main car)
ELIF fChaseDistance < 4.0
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
0.0, 0.5, 6.0, fLosingTriggerDist, 50.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.6, 0.4, 1.1, TRUE, ABSF(BIKE_TOP_SPEED_MODIFIER), 15.0, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - Player really close so just maintain current speed <>, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
ELSE
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sBeverlyVehicle.vehicle, sCelebVehicle.vehicle,
0.0, 0.5, 6.0, fLosingTriggerDist, 30.0, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
0.7, 0.5, 1.1, TRUE, ABSF(BIKE_TOP_SPEED_MODIFIER), 15.0, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - default values <>, cal fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed) ENDIF #ENDIF
ENDIF
UPDATE_CURRENT_PLAYBACK_SPEED_WITH_SMOOTHING(fCurrentChaseSpeed, fDesiredPlaybackSpeed, fAccel)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "NEW_UPDATE_CELEB_CHASE_SPEED - fAccel = ", fAccel, " playback speed is = ", fCurrentChaseSpeed, " frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Rubberbands the chase speed of Franklin to Miranda's limo
/// NOTE: having to override the standard uber recording behaviour a bit as the player needs to be able to get along side Miranda comfortably
/// PARAMS:
/// fCurrentChaseSpeed - the main chase speed which is to be updated
/// fChaseDistance - the current dist between Franklin and Miranda's limo
PROC UPDATE_CELEB_CHASE_SPEED(FLOAT &fCurrentChaseSpeed, FLOAT fChaseDistance)
//uber recording
FLOAT fDesiredPlaybackSpeed = fCurrentChaseSpeed
FLOAT fMinDist = 0.0
FLOAT fIdealDist = 0.2
FLOAT fSlowDownDist = 12.0 //3.0
FLOAT fMaxPlaybackSpeedMultiplier = 1.0
FLOAT fAirResistanceMultiplier = 1.0
FLOAT fCatchupSpeedMultiplier = 0.7
BOOL bDoAirResistance = TRUE
IF bHasPlayerGotOnBike_FirstTime = FALSE
fDesiredPlaybackSpeed = 0.55
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - player hasn't got on the bike first, so needing to slow the whole thing down loads") ENDIF #ENDIF
//speed up towards the end of the chase to get back in front before the rival pap turns up
ELIF fCurrentPlaybackTime > 53000.0
fMinDist = 9.5
fIdealDist = 18.0 //15.0
fSlowDownDist = 32.0 //30.0
fMaxPlaybackSpeedMultiplier = 1.3 //1.2
CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
fMinDist, fIdealDist, fSlowDownDist,
fMaxPlaybackSpeedMultiplier, fAirResistanceMultiplier, fCatchupSpeedMultiplier, bDoAirResistance)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - fast for catch up to rival pap") ENDIF #ENDIF
//if however the player trying to do the chase in a different vehicle dont slow down
ELIF ePlayerTransportState <> PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV
OR fChaseDistance > ((CELEB_ESCAPED_DIST / 100) * (PAP1_CELEB_CHASE_BLIP_FLASH_PERCENTAGE * 100)) // same time the chase blip will kick in
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
fMinDist = 10.0
fIdealDist = 20.0
fSlowDownDist = 150.0
fMaxPlaybackSpeedMultiplier = 1.2
CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
fMinDist, fIdealDist, fSlowDownDist,
fMaxPlaybackSpeedMultiplier, fAirResistanceMultiplier, fCatchupSpeedMultiplier, bDoAirResistance)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - player not on bev bike or dist from miranda is escape warning, BUT player in veh not bev's, so not slowed") ENDIF #ENDIF
ELSE
CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
fMinDist, fIdealDist, fSlowDownDist,
fMaxPlaybackSpeedMultiplier, fAirResistanceMultiplier, fCatchupSpeedMultiplier, bDoAirResistance)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - player not on bev bike or dist from miranda is escape warning, so slowed") ENDIF #ENDIF
IF fChaseDistance > 100.0
fDesiredPlaybackSpeed = 0.25
ENDIF
IF fChaseDistance > 40.0
IF fDesiredPlaybackSpeed > 0.5
fDesiredPlaybackSpeed = 0.5
ENDIF
ENDIF
ENDIF
// speed boost directly after Beverly has taken a photo (during his check photo state)
ELIF bDoDelayForPhotoTaken
AND (GET_GAME_TIMER() - iTimerIncreaseCelebSpeedForPhotoTaken > 2500) // 3500)
fMaxPlaybackSpeedMultiplier = 1.0
fIdealDist = 0.6 //3.0
fSlowDownDist = 18.0 //12.0
fAirResistanceMultiplier = 5.0
CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
fMinDist, fIdealDist, fSlowDownDist,
fMaxPlaybackSpeedMultiplier, fAirResistanceMultiplier, fCatchupSpeedMultiplier, bDoAirResistance)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - Bev took a photo boost") ENDIF #ENDIF
//just maintain the speed if really close together (attempt to allow the player to get
// alongside the celeb's vehicle so Beverly can take a photo) normal uber calculating wants the player behind the main car)
ELIF fChaseDistance < 4.0
fDesiredPlaybackSpeed = fDesiredPlaybackSpeed
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - Player really close so just maintain current speed") ENDIF #ENDIF
//Start of the chase...slowed to accommidate player putting the helmet on.
ELIF fCurrentPlaybackTime < 11000.0
//change the catch up multipler
fAirResistanceMultiplier = 2.0
fCatchupSpeedMultiplier = 0.6
CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
fMinDist, fIdealDist, fSlowDownDist,
fMaxPlaybackSpeedMultiplier, fAirResistanceMultiplier, fCatchupSpeedMultiplier, bDoAirResistance)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - slow section for start of the chase to compensate player putting helmet on") ENDIF #ENDIF
// TEMP gradule change back to defaults
ELIF fCurrentPlaybackTime < 15000.0
//change the catch up multipler
fAirResistanceMultiplier = 1.66
fCatchupSpeedMultiplier = 0.633
CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
fMinDist, fIdealDist, fSlowDownDist,
fMaxPlaybackSpeedMultiplier, fAirResistanceMultiplier, fCatchupSpeedMultiplier, bDoAirResistance)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - slow section for start of the chase gradual return ") ENDIF #ENDIF
// TEMP gradule change back to defaults
ELIF fCurrentPlaybackTime < 20000.0
//change the catch up multipler
fAirResistanceMultiplier = 1.33
fCatchupSpeedMultiplier = 0.666
CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
fMinDist, fIdealDist, fSlowDownDist,
fMaxPlaybackSpeedMultiplier, fAirResistanceMultiplier, fCatchupSpeedMultiplier, bDoAirResistance)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - slow section for start of the chase gradual return 2") ENDIF #ENDIF
// default values
ELSE
CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK,
fMinDist, fIdealDist, fSlowDownDist,
fMaxPlaybackSpeedMultiplier, fAirResistanceMultiplier, fCatchupSpeedMultiplier, bDoAirResistance)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - calculated default") ENDIF #ENDIF
ENDIF
fCurrentChaseSpeed = fDesiredPlaybackSpeed
//UPDATE_CURRENT_PLAYBACK_SPEED_WITH_SMOOTHING(fCurrentChaseSpeed, fDesiredPlaybackSpeed)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_CELEB_CHASE_SPEED - playback speed is - ", fCurrentChaseSpeed) ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Calculates the speed the rival pap's vehicle needs to be driving at
/// RETURNS:
/// fReturnedSpeed
FUNC FLOAT GET_UPDATED_CHASE_SPEED_FOR_RIVAL_PAP_VEHICLE()
FLOAT fReturnedSpeed
FLOAT fIncreaseSpeedRange = 8.0
FLOAT fDecreaseSpeedRange = 90.0
//VECTOR vBeverlyPos = GET_ENTITY_COORDS(sBeverlyPed.ped)
//VECTOR vBeverlyOffsetFromRivalPap = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sRivalPapPed.ped, vBeverlyPos)
//INFO FROM PHIL - don't go below 25.0 speed for bikes as they will slow too much.
//if however the player trying to do the chase in a different vehicle dont slow down
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "not slowing down as player is in alternative vehicle") ENDIF #ENDIF
fReturnedSpeed = 45.0
RETURN fReturnedSpeed
//ELIF (vBeverlyOffsetFromRivalPap.Y > CLOSE_ENOUGH_FOR_BEVERLY_KNOCK_OFF_DISTANCE)
ELIF eKnockOffBikerAttackState = KBAS_RUNNING_ATTACK
fReturnedSpeed = GET_ENTITY_SPEED(sRivalPapVehicle.vehicle) // GET_ENTITY_SPEED(sBeverlyVehicle.vehicle)
fReturnedSpeed += 0.2
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_CHASE_SPEED_FOR_RIVAL_PAP_VEHICLE - > KBAS_RUNNING_ATTACK so maintain rival pap speed = ", fReturnedSpeed, " >>>>>>>>>>>>>") ENDIF #ENDIF
ELIF fDistance_PlayerToRivalPap < fIncreaseSpeedRange
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SPEED STABLISED ==================") ENDIF #ENDIF
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
fReturnedSpeed = GET_ENTITY_SPEED(sBeverlyVehicle.vehicle)
IF fReturnedSpeed < 26.0
fReturnedSpeed = 26.0
ENDIF
ENDIF
//fReturnedSpeed = 26.5
ELIF fDistance_PlayerToRivalPap > ((RIVAL_PAP_ESCAPED_DIST / 100) * (PAP1_RIVAL_PAP_CHASE_BLIP_FLASH_PERCENTAGE * 100)) // same time the chase blip will kick in
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SPEED DECREASE DRAMATICALLY <<<<<<<<<<<<<<") ENDIF #ENDIF
fReturnedSpeed = 10.0
ELIF fDistance_PlayerToRivalPap > fDecreaseSpeedRange
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SPEED DECREASE <<<<<<<<<<<<<<") ENDIF #ENDIF
fReturnedSpeed = 18.0
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SPEED NORMALISED <<<<<<<<<<<<<<") ENDIF #ENDIF
fReturnedSpeed = 26.0
ENDIF
RETURN fReturnedSpeed
ENDFUNC
/// PURPOSE:
/// rubberbanding whilst chasing rival pap on the bike
PROC MONITOR_RIVAL_PAP_CHASE_SPEED()
//don't do this every frame
IF (GET_GAME_TIMER() - iCheckChaseSpeedTimer > 0)
fRivalBikeSpeed = GET_UPDATED_CHASE_SPEED_FOR_RIVAL_PAP_VEHICLE()
SET_DRIVE_TASK_CRUISE_SPEED(sRivalPapDriverPed.ped, fRivalBikeSpeed)
iCheckChaseSpeedTimer = GET_GAME_TIMER()
ENDIF
ENDPROC
/// PURPOSE:
/// Check if Beverly is in position to start taking a photo
/// PARAMS:
/// iReturningSideForTakingPhoto - side of the target Beverly is to take the photo from
/// RETURNS:
/// TRUE if Bev is inside either the left or right zone
FUNC BOOL IS_BEVERLY_IN_A_START_TAKE_PHOTO_AREA()
FLOAT fDistFromCelebVehiclesSideForPhoto[TOTAL_BEVERLY_TAKE_PHOTOS_AREAS]
vTakePhotoZones_CentrePos[0] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vTakePhotoZones_CentrePosOffset[0])
fDistFromCelebVehiclesSideForPhoto[0] = VDIST(GET_ENTITY_COORDS(sBeverlyVehicle.vehicle), vTakePhotoZones_CentrePos[0])
vTakePhotoZones_CentrePos[1] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vTakePhotoZones_CentrePosOffset[1])
fDistFromCelebVehiclesSideForPhoto[1] = VDIST(GET_ENTITY_COORDS(sBeverlyVehicle.vehicle), vTakePhotoZones_CentrePos[1])
//DRAW_DEBUG_SPHERE(vTakePhotoZones_CentrePos[0], CLOSE_ENOUGH_TO_TAKE_PHOTO_DISTANCE, 0, 0, 255, 120)
//DRAW_DEBUG_SPHERE(vTakePhotoZones_CentrePos[1], CLOSE_ENOUGH_TO_TAKE_PHOTO_DISTANCE, 0, 0, 255, 120)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "dist from left is = ", fDistFromCelebVehiclesSideForPhoto[0]) ENDIF #ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "dist from right is = ", fDistFromCelebVehiclesSideForPhoto[1]) ENDIF #ENDIF
IF (fDistFromCelebVehiclesSideForPhoto[0] < CLOSE_ENOUGH_TO_TAKE_PHOTO_DISTANCE)
//left side
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Bev inside Start Photo Anim Left Zone") ENDIF #ENDIF
RETURN TRUE
ELIF (fDistFromCelebVehiclesSideForPhoto[1] < CLOSE_ENOUGH_TO_TAKE_PHOTO_DISTANCE)
//right side
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Bev inside Start Photo Anim Right Zone") ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Check if Beverly is in in the specified taking photo zone
/// PARAMS:
/// iSideTakingPhoto - which zone to test Bev is in
/// RETURNS:
/// TRUE if Bev is inside the specified zone
FUNC BOOL IS_BEVERLY_IN_TAKE_PHOTO_AREA(INT iSideTakingPhoto)
FLOAT fDistFromCelebVehiclesSideForPhoto
vTakePhotoZones_CentrePos[iSideTakingPhoto] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vTakePhotoZones_CentrePosOffset[iSideTakingPhoto])
fDistFromCelebVehiclesSideForPhoto = VDIST(GET_ENTITY_COORDS(sBeverlyVehicle.vehicle), vTakePhotoZones_CentrePos[iSideTakingPhoto])
IF (fDistFromCelebVehiclesSideForPhoto < CLOSE_ENOUGH_TO_TAKE_PHOTO_DISTANCE)
RETURN TRUE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Bev inside take Photo area") ENDIF #ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Check if Beverly is is uninjured and sat on any bike
/// RETURNS:
/// TRUE if Bev is uninjured, on any bike and sitting in any vehicle
FUNC BOOL IS_BEVERLY_OK_AND_SAT_ON_ANY_BIKE()
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF (IS_PED_ON_ANY_BIKE(sBeverlyPed.ped) AND IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped))
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// common setup which needs to be done when switching over to check the photos state
/// moved here since this is called in multiple locations and needs to be kept in sync
PROC SETUP_CHECK_SUCCESSFUL_PHOTO()
//if we reach the last slot there isn't any dialogue, so just allow photos to carry on being taken
IF iGoodPhotosTakenCounter < (TOTAL_TOOK_PHOTO_DIALOGUE - 1)
iGoodPhotosTakenCounter++
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(PAP1_PICTURES_SNAPPED)
KILL_ANY_CONVERSATION()
iTimerIncreaseCelebSpeedForPhotoTaken = GET_GAME_TIMER() //used for rubberbanding
iTimerDelay_Progress_BevTakingPhotos = GET_GAME_TIMER()
iCounter_BeverlyPhotoBurst = 0 // reset these ready for next attempt
iMax_BeverlyPhotoBurst = GET_RANDOM_INT_IN_RANGE(6, 11) // reset these ready for next attempt
iDelay_BeverlyPhotoBurst = GET_RANDOM_INT_IN_RANGE(250, 750) // reset these ready for next attempt - amount of time Bev has to be consecutively aiming at the celeb to take the a photo
ENDPROC
/// PURPOSE:
/// Handles Beverly taking photos of the celeb during the car chase
PROC MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE()
IF NOT IS_BEVERLY_OK_AND_SAT_ON_ANY_BIKE()
//Reset if Bev isn't ok to take a photo
eBeverlyTakePhotoState = PAP1_BTPS_SETUP
iCounter_BeverlyPhotoBurst = 0 // reset these ready for next attempt
iMax_BeverlyPhotoBurst = GET_RANDOM_INT_IN_RANGE(6, 11) // reset these ready for next attempt
iDelay_BeverlyPhotoBurst = GET_RANDOM_INT_IN_RANGE(250, 750) // reset these ready for next attempt - amount of time Bev has to be consecutively aiming at the celeb to take the a photo
ELSE
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
#IF IS_DEBUG_BUILD
IF bDebug_OverrideCelebPosInCarOffset
vCelebPosInCarOffset = vDebug_vCelebPosInCarOffsetOverride
ENDIF
#ENDIF
VECTOR vCelebPos
vCelebPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vCelebPosInCarOffset)
SWITCH eBeverlyTakePhotoState
CASE PAP1_BTPS_SETUP
BOOL bSafeToStartTakingPhotos
bSafeToStartTakingPhotos = TRUE
// don't start taking a photo if we are playing a hurry up anim already
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap")
// make sure the anim has completed (has the hold last frame flag
IF NOT HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap")
bSafeToStartTakingPhotos = FALSE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap")
// make sure the anim has completed (has the hold last frame flag
IF NOT HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap")
bSafeToStartTakingPhotos = FALSE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
// make sure the anim has completed (has the hold last frame flag
IF NOT HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
bSafeToStartTakingPhotos = FALSE
ENDIF
ENDIF
/* ^^^ bev alt anim during Franklin helmet anim change
// don't take photos is Beverly is currently set back for Franklin putting on his helmet
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still")
bSafeToStartTakingPhotos = FALSE
ENDIF*/
IF bSafeToStartTakingPhotos
IF IS_BEVERLY_IN_A_START_TAKE_PHOTO_AREA()
//IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_GENERAL_SWEEP) // SCRIPT_TASK_AIM_GUN_SCRIPTED) // SCRIPT_TASK_DRIVE_BY)
//CLEAR_PED_TASKS(sBeverlyPed.ped)
FLOAT fTaskSweepAim_TurnRate
fTaskSweepAim_TurnRate = 3.0 // default is 1.0, 2.0 would be twice as fast, etc
#IF IS_DEBUG_BUILD IF bDebug_OverrideTaskSweepAim_TurnRate fTaskSweepAim_TurnRate = fDebug_TaskSweepAim_TurnRate ENDIF #ENDIF
TASK_SWEEP_AIM_POSITION(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "sweep_low", "sweep_med", "sweep_high", -1, vCelebPos, fTaskSweepAim_TurnRate)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_SETUP - task sweep set") ENDIF #ENDIF
RESET_IS_BEVERLY_AIMING_AT_CELEB_TEST()
// stop the get me alongside the car dialogue if we are switching to taking photos
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_CHASE06")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
iTimerDelay_Progress_BevTakingPhotos = GET_GAME_TIMER()
eBeverlyTakePhotoState = PAP1_BTPS_TAKING_PHOTO
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_SETUP going to PAP1_BTPS_TAKING_PHOTO") ENDIF #ENDIF
//ENDIF
ELSE
/* ^^^ bev alt anim during Franklin helmet anim change - original to swap out*/
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - reset Bev to idle pose") ENDIF #ENDIF
ENDIF
/* ^^^ swap out end */
/* ^^^ bev alt anim during Franklin helmet anim change
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "veh@bike@sport@front@base", "put_on_helmet") // B*1422622 - Franklin's put on helmet animation cause him to clip through Beverly
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - eset Bev to idle pose") ENDIF #ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still")
REQUEST_ANIM_DICT("veh@bike@sport@rear@base")
IF HAS_ANIM_DICT_LOADED("veh@bike@sport@rear@base")
TASK_PLAY_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - applied still on bike anim whilst player puts on helmet") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - requestin anim dict for still idle - veh@bike@sport@rear@base for player puts on helmet") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF*/
ENDIF
ENDIF
IF NOT IS_PED_HEADTRACKING_PED(sBeverlyPed.ped, sCelebPed.ped)
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, sCelebPed.ped, -1, SLF_FAST_TURN_RATE)
ENDIF
BREAK
CASE PAP1_BTPS_TAKING_PHOTO
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
//tasking isn't being preformed so revert back to setup state
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - reset Bev to idle pose") ENDIF #ENDIF
ENDIF
eBeverlyTakePhotoState = PAP1_BTPS_SETUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_TAKING_PHOTO going to PAP1_BTPS_SETUP sweep task wasn't being performed") ENDIF #ENDIF
ELSE
UPDATE_TASK_SWEEP_AIM_POSITION(sBeverlyPed.ped, vCelebPos)
INT iTimeDelay_ForRaisingCameraIntoPosition
iTimeDelay_ForRaisingCameraIntoPosition = 750
IF HAS_TIME_PASSED(iTimerDelay_Progress_BevTakingPhotos, iTimeDelay_ForRaisingCameraIntoPosition) //delay for raising camera up ...where intro anim should be
IF NOT IS_BEVERLY_IN_A_START_TAKE_PHOTO_AREA()
// bit of leeyway for being outside the area
INT iTimeDelay_ForCancelPhotoAttemptIfOutsideArea
iTimeDelay_ForCancelPhotoAttemptIfOutsideArea = 1250
IF HAS_TIME_PASSED(iTimerDelay_Progress_BevTakingPhotos, iTimeDelay_ForCancelPhotoAttemptIfOutsideArea) //delay for cancel attempt if outside the photo area
// if he successfully took a few photos then switch to checking the camera, else reset
IF iCounter_BeverlyPhotoBurst >= iMax_BeverlyPhotoBurst
SETUP_CHECK_SUCCESSFUL_PHOTO()
eBeverlyTakePhotoState = PAP1_BTPS_SUCCESSFUL_PHOTO
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_TAKING_PHOTO going to PAP1_BTPS_SUCCESSFUL_PHOTO - Bev dropped out photo area but has already took some photos") ENDIF #ENDIF
ELSE
//camera raised but bev no longer in photo area, so cancel
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - reset Bev to idle pose") ENDIF #ENDIF
ENDIF
eBeverlyTakePhotoState = PAP1_BTPS_SETUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_TAKING_PHOTO going to PAP1_BTPS_SETUP left photo area") ENDIF #ENDIF
ENDIF
ENDIF
ELSE IS_BEVERLY_AIMING_CAMERA_AT_CELEB(vCelebPos)
IF HAS_TIME_PASSED_BEV_CONSECUTIVELY_AIMED_CAMERA_AT_CELEB(iDelay_BeverlyPhotoBurst)
#IF IS_DEBUG_BUILD IF bDebug_DisplayShapeTestPap1CameraAim DRAW_RECT(0.3, 0.3, 0.2, 0.2, 0, 255, 0, 150) ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - bev has been consecutively aiming for at least this period of time = ", iDelay_BeverlyPhotoBurst) ENDIF #ENDIF
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
IF IS_ENTITY_ALIVE(sObjFlashUnitBeverly.object)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_rcpap1_camera", sObjFlashUnitBeverly.object, vCameraFlashFX_Offset, << 0.0, 0.0, 0.0 >>) // B*1706190 - no roration offset, uses parent
ENDIF
IF NOT HAS_SOUND_FINISHED(iSoundId_CameraFlash)
STOP_SOUND(iSoundId_CameraFlash)
ENDIF
IF REQUEST_SCRIPT_AUDIO_BANK(sPap1_AudioBank_CameraFlashSoundFX)
PLAY_SOUND_FROM_COORD(iSoundId_CameraFlash, "CAMERA", GET_PED_BONE_COORDS(sBeverlyPed.ped, BONETAG_PH_R_HAND, vCameraFlashFX_Offset), sPap1_SoundSetName)
ENDIF
ENDIF
iConsecutiveAimingTimer = -1 // reset the timer used to detect how long Bev has been continuously aiming at the celeb successfully. used with iDelay_BeverlyPhotoBurst
iFrameCountSinceLastSuccessfulShapeTestCameraAim = 0 // reset the grace period frame counter
iDelay_BeverlyPhotoBurst = GET_RANDOM_INT_IN_RANGE(250, 750) // setup the delay time for the next photo to be trigger
iCounter_BeverlyPhotoBurst++
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_TAKING_PHOTO iCounter_BeverlyPhotoBurst incremented to : ", iCounter_BeverlyPhotoBurst, "frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
// only switch to check photos state if he's successfully taken a burst of photos
IF iCounter_BeverlyPhotoBurst >= iMax_BeverlyPhotoBurst
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_LOW)
SETUP_CHECK_SUCCESSFUL_PHOTO()
eBeverlyTakePhotoState = PAP1_BTPS_SUCCESSFUL_PHOTO
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_TAKING_PHOTO going to PAP1_BTPS_SUCCESSFUL_PHOTO") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_BTPS_SUCCESSFUL_PHOTO
IF IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
UPDATE_TASK_SWEEP_AIM_POSITION(sBeverlyPed.ped, vCelebPos)
ENDIF
INT iTimeDelay_ForLoweringCameraIntoPosition
iTimeDelay_ForLoweringCameraIntoPosition = 500
IF HAS_TIME_PASSED(iTimerDelay_Progress_BevTakingPhotos, iTimeDelay_ForLoweringCameraIntoPosition)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
//CLEAR_PED_TASKS(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_TAKING_PHOTO resetting to idle anim for successful photo") ENDIF #ENDIF
ELSE
INT iTimeDelay_StartCheckingPhotoAnim
iTimeDelay_StartCheckingPhotoAnim = 1000 // 1000 after reset idle anim
IF HAS_TIME_PASSED(iTimerDelay_Progress_BevTakingPhotos, iTimeDelay_StartCheckingPhotoAnim)
//check photos anim sequence - intro loop and outro
TASK_CLEAR_LOOK_AT(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_intro_pap", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY | AF_HOLD_LAST_FRAME)
eBeverlyTakePhotoState = PAP1_BTPS_SETUP_CHECKING_PHOTO
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_SUCCESSFUL_PHOTO going to PAP1_BTPS_SETUP_CHECKING_PHOTO") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_BTPS_SETUP_CHECKING_PHOTO
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_intro_pap")
//animation isn't playing so revert back to setup state
eBeverlyTakePhotoState = PAP1_BTPS_SETUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_SETUP_CHECKING_PHOTO going to PAP1_BTPS_SETUP anim was not playing") ENDIF #ENDIF
ELSE
SET_ENTITY_ANIM_SPEED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_intro_pap", 1.4)
IF HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_intro_pap")
TASK_CLEAR_LOOK_AT(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_loop_pap", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY | AF_LOOPING)
eBeverlyTakePhotoState = PAP1_BTPS_CHECKING_PHOTO
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_SUCCESSFUL_PHOTO going to PAP1_BTPS_SETUP_CHECKING_PHOTO") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_BTPS_CHECKING_PHOTO
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_loop_pap")
//animation isn't playing so revert back to setup state
eBeverlyTakePhotoState = PAP1_BTPS_SETUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_CHECKING_PHOTO going to PAP1_BTPS_SETUP anim was not playing") ENDIF #ENDIF
ELSE
IF bDoneDialogue_BeverlyTookPhoto[iGoodPhotosTakenCounter] // loop the checking photo anim until Bev has delivery his checking photo dialogue
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "delay next photo taking finished!") ENDIF #ENDIF
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_outro_pap", NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_HOLD_LAST_FRAME)
eBeverlyTakePhotoState = PAP1_BTPS_FINISHED_CHECKING_PHOTO
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_CHECKING_PHOTO going to PAP1_BTPS_FINISHED_CHECKING_PHOTO") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_BTPS_FINISHED_CHECKING_PHOTO
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_outro_pap")
//animation isn't playing so revert back to setup state
eBeverlyTakePhotoState = PAP1_BTPS_SETUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_FINISHED_CHECKING_PHOTO going to PAP1_BTPS_SETUP anim was not playing") ENDIF #ENDIF
ELSE
SET_ENTITY_ANIM_SPEED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_outro_pap", 1.4)
IF HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "lookatcam_outro_pap")
//setup the idle task once the check camera anims are done
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
eBeverlyTakePhotoState = PAP1_BTPS_SETUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE - PAP1_BTPS_FINISHED_CHECKING_PHOTO going to PAP1_BTPS_SETUP") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
//Handles removal of celeb when away from the player
//used when the buer recording has finished
//and the player should be chasing the rival instead
PROC CLEANUP_CELEB_WHEN_AWAY_FROM_THE_PLAYER()
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), sCelebVehicle.vehicle, 120.0)
IF IS_ENTITY_OCCLUDED(sCelebVehicle.vehicle)
IF IS_PED_UNINJURED(sCelebPed.ped)
SET_ENTITY_LOAD_COLLISION_FLAG(sCelebPed.ped, FALSE)
ENDIF
SAFE_REMOVE_PED(sCelebPed.ped, TRUE)
SAFE_REMOVE_PED(sCelebsDriverPed.ped, TRUE)
SAFE_REMOVE_VEHICLE(sCelebVehicle.vehicle, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Give the celeb driver a driving sequence to perform after the uber recording
PROC SETUP_CELEB_DRIVERS_BEHAVIOUR_WHEN_UBER_RECORDING_FINISHES()
IF IS_PED_UNINJURED(sCelebsDriverPed.ped)
SEQUENCE_INDEX seqIndex_CelebtDriverForCleanup
OPEN_SEQUENCE_TASK(seqIndex_CelebtDriverForCleanup)
TASK_VEHICLE_MISSION_PED_TARGET(NULL, sCelebVehicle.vehicle, PLAYER_PED_ID(), MISSION_FLEE, 80.0, DRIVINGMODE_PLOUGHTHROUGH, 500.0, -1.0)
//TASK_VEHICLE_MISSION_COORS_TARGET(NULL, sCelebVehicle.vehicle, << -1259.2776, -1048.7726, 7.4445 >>, MISSION_GOTO, 65.00, DRIVINGMODE_PLOUGHTHROUGH, -1, -1) these trigger assert since the goto coord is outside of the loaded nodes
//TASK_VEHICLE_MISSION_COORS_TARGET(NULL, sCelebVehicle.vehicle, << 412.9179, 267.1376, 102.0397 >>, MISSION_GOTO, 65.00, DRIVINGMODE_PLOUGHTHROUGH, -1, -1)
//TASK_VEHICLE_DRIVE_WANDER(NULL, sCelebVehicle.vehicle, 75.0, DRIVINGMODE_AVOIDCARS)
SET_SEQUENCE_TO_REPEAT(seqIndex_CelebtDriverForCleanup, REPEAT_FOREVER)
CLOSE_SEQUENCE_TASK(seqIndex_CelebtDriverForCleanup)
TASK_PERFORM_SEQUENCE(sCelebsDriverPed.ped, seqIndex_CelebtDriverForCleanup)
CLEAR_SEQUENCE_TASK(seqIndex_CelebtDriverForCleanup)
SET_PED_KEEP_TASK(sCelebsDriverPed.ped, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the dialogue when chasing the celeb whilst player and bev are on the bike
PROC MANAGE_DIALOGUE_DURING_CHASE_CELEB()
IF eBeverlyTakePhotoState = PAP1_BTPS_CHECKING_PHOTO
IF NOT bDoneDialogue_BeverlyTookPhoto[iGoodPhotosTakenCounter]
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION() // _DO_NOT_FINISH_LAST_LINE() B*1573394 - don't cut off ongoing dialogue just finish the current line - photo check lowe waits on no convo and bDoneDialogue_BeverlyTookPhoto set so should be fine
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "aTTEMPTED TO KILL THE CONVO FOR THE PHOTO TAKEN DIALOGUE") ENDIF #ENDIF
ELSE
IF NOT bDoneDialogue_BeverlyTookPhoto[iGoodPhotosTakenCounter]
IF iGoodPhotosTakenCounter < (TOTAL_TOOK_PHOTO_DIALOGUE - 1) // the additional index is used to keep photos checking (without dialogue).
TEXT_LABEL_15 tl15_CheckPhotoRoot
tl15_CheckPhotoRoot = "PAP1_SNAP"
SWITCH iGoodPhotosTakenCounter //only trigger once this value has been set.
CASE 0
tl15_CheckPhotoRoot += "01"
// I don't believe it! She's slamming a speedball in there, man! This is journalistic gold!
BREAK
CASE 1
tl15_CheckPhotoRoot += "02"
// Man, they don't call her the Silicone Slattern for nothing. She looks like a blood hound in a wind tunnel. I love her
// No wonder this whole town's in therapy.
BREAK
CASE 2
tl15_CheckPhotoRoot += "05" // rejigged after speaking with Mike (highly unlikely following two convos will trigger in time)
// We done yet?
// No, she still looks too good. I want the prisoner of war shot. That's where the big zeros are.
BREAK
CASE 3
tl15_CheckPhotoRoot += "03"
// Oh yes, we have sideboob. We're historians, crusaders of truth, my friend!
// We're two stalkers on a motorbike.
BREAK
CASE 4
tl15_CheckPhotoRoot += "04"
// She's still shooting up in there! Amazing. Wait, is that...?
// No, thought I'd had muff for a second. Open the curtains to the fun tunnel, Miranda!
BREAK
ENDSWITCH
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, tl15_CheckPhotoRoot, CONV_PRIORITY_MEDIUM)
bDoneDialogue_BeverlyTookPhoto[iGoodPhotosTakenCounter] = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDoneDialogue_BeverlyTookPhoto[iGoodPhotosTakenCounter] = ", iGoodPhotosTakenCounter, " tl15_CheckPhotoRoo= ", tl15_CheckPhotoRoot) ENDIF #ENDIF
ENDIF
ELSE
bDoneDialogue_BeverlyTookPhoto[iGoodPhotosTakenCounter] = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDoneDialogue_BeverlyTookPhoto[iGoodPhotosTakenCounter] = ", iGoodPhotosTakenCounter, " no dialogue so skipped") ENDIF #ENDIF
ENDIF
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this so Franklin doesn't give a response in the wrong place
ENDIF
ENDIF
ENDIF
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER() //reset the dialogue counter for additional dialogue, so he does say it straight after successful photo dialogue
ELIF eBeverlyTakePhotoState != PAP1_BTPS_SUCCESSFUL_PHOTO //don't do any dialogue in the gap where a successful photo was taken and we are waiting for the check photo anim
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("PAP1_01") // Drive alongside Miranda's ~b~car.~s~ //*commented out for new display message check with subtitle profile settings
IF NOT bDoneDialogue_PlayerPullsWheelie
// currently the only thing remotely close to a is_bike_pulling_wheelie check, potentially use with IS_ENTITY_IN_AIR()
// but in this instance i think the dialogue will work with airbourne as well
IF NOT IS_VEHICLE_ON_ALL_WHEELS(sBeverlyVehicle.vehicle)
IF HAS_TIME_PASSED(iTimer_BeverlyBikeNotOnAllWheelsTimer, 500) //make sure player has been pulling wheelie for a decent chunk of time
// random dialogue, so only one line will be selected
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_PPW1", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Christ, are you trying to kill me.
// Less of the crazy driving, man.
// You'll give me a heart attack!
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this so Franklin can't respond to this one
bDoneDialogue_PlayerPullsWheelie = TRUE
ENDIF
ENDIF
ELSE
iTimer_BeverlyBikeNotOnAllWheelsTimer = GET_GAME_TIMER()
ENDIF
ELSE
// reset the dialogue so it can trigger agains
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_PPW1")
AND IS_VEHICLE_ON_ALL_WHEELS(sBeverlyVehicle.vehicle)
iTimer_BeverlyBikeNotOnAllWheelsTimer = GET_GAME_TIMER()
bDoneDialogue_PlayerPullsWheelie = FALSE
ENDIF
ENDIF
// Franklin crashes the bike
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_CRASH")
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_CHASE02")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(sBeverlyVehicle.vehicle)
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(sCelebVehicle.vehicle, sBeverlyVehicle.vehicle)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CHASE02", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Don't ram her off the road, man!
// Oh yeah, real subtle!
// Not that close!
bDoneDialogue_FranklinRespondToBeverlyBerating = FALSE // reset this so Franklin can respond
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE_CELEB - crash bike into Miranda dialogue triggered - PAP1_CHASE02") ENDIF #ENDIF
ENDIF
ELSE
// random selected lines
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CRASH", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// You idiot!
// For Christ's sake!
// Are you blind?
// Can't you drive!?
// Is it that hard?
// No! You moron!
// You have gotta be kidding me!
bDoneDialogue_FranklinRespondToBeverlyBerating = FALSE // reset this so Franklin can respond
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE_CELEB - crash bike dialogue triggered - PAP1_CRASH") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER()
ELSE
//only do this dialogue if we aren't so close to the limo that we are attempting a photo
IF eBeverlyTakePhotoState = PAP1_BTPS_SETUP
IF NOT bDoneDialogue_FranklinRespondToBeverlyBerating // reset this to ensure Franklin doesn't say something straight away
IF (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RESP", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Yeah, yeah, I got it.
// Maybe if you shut up for a second.
// What do you think I'm doin'?
// Fuck, I know, I'm tryin'!
// Are you always this annoying?
// I get the idea, homie.
// You really ain't helpin'.
// We might do better if you shut the fuck up.
// I heard you the first time.
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER()
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LCHASING RIVAL PAP - Franklin Response dialogue triggered - PAP1_RESP") ENDIF #ENDIF
ENDIF
ELSE
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // bypass response if we are out range of each other
ENDIF
ELSE
// Franklin drives into a ped
IF (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) >= 0) // looks to be initially set to -1 so need to check from 0
AND (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) < 500)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_HITPED", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// It's okay, they're fine.
// That's it, no prisoners!
// Collateral damage, don't worry about it.
// Good, if they get in the way, take them down!
// Move next time!
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER()
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING CELEB - drove into ped dialogue - PAP1_HITPED") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF HAS_TIME_PASSED(iDialogueTimer_ChasingCeleb, TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE)
//different dialogue depending on how far away from the celeb we are
//Check if the player is behind or infront of the celeb
VECTOR vPlayerPosOffsetFromCeleb = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sCelebVehicle.vehicle, GET_ENTITY_COORDS(PLAYER_PED_ID()))
#IF IS_DEBUG_BUILD
IF bDebugPrint_CelebOffset_Y_ToPlayer
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "dialogue checker - y offset = ", vPlayerPosOffsetFromCeleb.y) ENDIF #ENDIF
ENDIF
#ENDIF
IF vPlayerPosOffsetFromCeleb.y < 2.0//Player behind celeb
IF (fCurrentChaseDistanceCeleb < DIST_LIMIT_PLAYER_CLOSE_TO_CELEB_IN_CHASE_FOR_DIALOGUE)
// alterative dialogue if he's already took one successful photo - B*1050501
IF iGoodPhotosTakenCounter = -1
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CHASE06", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING CELEB GET CLOSE DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER()
// Get closer, man.
// Get me right next to her car door.
// You got to get me alongside her car.
// Get up alongside her, so I can take the shot.
// Get me real close so I can zoom in on her new tits.
// Can you get me at the side of her?
// Come on man, get me in close.
// I can't take the shot from here, go closer.
// Come on, come on! Closer, closer!
IF (GET_RANDOM_INT_IN_RANGE(0, 6) = 0) // 20% chance of playing the anim
SET_BEVERLY_PLAY_HURRY_UP_ANIM_TOWARDS_ENTITY(sCelebPed.ped)
ENDIF
IF (GET_RANDOM_INT_IN_RANGE(0, 6) <= 1) // 40% chance of Franklin responding
bDoneDialogue_FranklinRespondToBeverlyBerating = FALSE // reset this so Franklin can respond
ENDIF
ENDIF
ELSE
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CHASE08", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING CELEB GET CLOSE DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER()
// Go again.
// I need some more.
// More, more!
// I need more shots.
IF (GET_RANDOM_INT_IN_RANGE(0, 6) = 0) // 20% chance of playing the anim
SET_BEVERLY_PLAY_HURRY_UP_ANIM_TOWARDS_ENTITY(sCelebPed.ped)
ENDIF
ENDIF
ENDIF
ELSE
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_HURRY", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) // used to be PAP1_CHASE04
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING CELEB FAR DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER()
// Faster! Go! Go!
// We need the shot! Hurry!
// Can't this go any faster?
// Do not let her go!
IF (GET_RANDOM_INT_IN_RANGE(0, 3) < 2) // 66% chance of playing the anim
SET_BEVERLY_PLAY_HURRY_UP_ANIM_TOWARDS_ENTITY(sCelebPed.ped)
ENDIF
IF (GET_RANDOM_INT_IN_RANGE(0, 6) <= 4) // 80% chance of Franklin responding
bDoneDialogue_FranklinRespondToBeverlyBerating = FALSE // reset this so Franklin can respond
ENDIF
ENDIF
ENDIF
ELSE //Player ahead of celeb
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CHASE07", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "$$$ Player ahead of celeb in chase") ENDIF #ENDIF
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER()
// Hey, slow down she's behind us.
// Man, hit the brakes, we are too far ahead.
// Let Miranda catch up.
// Go easy on the gas, we're too far in front.
// I can't take the shot from here.
IF (GET_RANDOM_INT_IN_RANGE(0, 6) <= 3) // 60% chance of Franklin responding
bDoneDialogue_FranklinRespondToBeverlyBerating = FALSE // reset this so Franklin can respond
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// if Beverly is in the process of taking photos
ELIF eBeverlyTakePhotoState = PAP1_BTPS_TAKING_PHOTO
IF HAS_TIME_PASSED(iDialogueTimer_ChasingCeleb, GET_RANDOM_INT_IN_RANGE(250, 750)) // increase chance of this dialogue triggering
// we are two dialogue roots for this, so randomly pick dialogue from either
INT iRandomDialogueRoot = GET_RANDOM_INT_IN_RANGE(0, 3)
TEXT_LABEL_23 tlRoot
IF iRandomDialogueRoot = 0
tlRoot = "PAP1_PHOTO"
// The fans have a right to know! Everything!
// It's in the public interest! You homewrecker!
// Aroooo! Show us your marriage busting muff, Miranda! You bitch!
// You are an angel! An angel!
// Homewrecker! Harlot!
// Hey, here! Here! Here! Here, you bitch!
// You ruined his life! Now make my day!
ELIF iRandomDialogueRoot = 1
tlRoot = "PAP1_PHOTO2"
// Yeah. Yeah. Yeah. Oh Yeah! Yeah! Oh yeah, gimme more! Gimme more!
// Oh, you're human, you bitch!
// Nothing special about you.
// She's a goddess, she's a whore!
// I love her, I hate her!
ELSE
tlRoot = "PAP1_FIDGET"
// C'mon. C'mon. C'mon. You ruined Mark Fostenburg's wife's life!
// Homewrecker!
// Open it up, you cow.
// Give me something, anything. Stop pretending to cry!
// I love you, Miranda!
// You know you want it, Cowan!
// You're a fucking mess! Look at you!
// Well done on the rehab! Not!
// You don't a look a day over forty five!
ENDIF
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, tlRoot, CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE_CELEB - bev taking photos triggered") ENDIF #ENDIF
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this so Franklin doesn't give a response in the wrong place
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
//ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the dialogue during drop Beverly off at next stakeout
PROC MANAGE_DIALOGUE_DURING_DROP_BEVERLY_OFF()
// IF NOT IS_THIS_PRINT_BEING_DISPLAYED("PAP1_05") //*commented out for new display message check with subtitle profile settings
IF NOT bDoneDialogue_BeverlySayKeepBike
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF bPausedDialogue_DropOffBeverly
IF PAP1_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DROP", tlPausedDialogue_DropOffBeverly, CONV_PRIORITY_MEDIUM)
bPausedDialogue_DropOffBeverly = FALSE // reset flag
bDoneDialogue_BeverlySayKeepBike = TRUE
ENDIF
ELSE
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DROP", CONV_PRIORITY_MEDIUM)
// There's a small parking lot by the Café Redemption courtyard in Morningwood.
// Drop me there, and you can keep the bike, because I look after my people.
// I know when a ride's hot. If this is your bike, I'm the fuckin' pope, homie.
// Okay, okay, don't ruin the vibe.
bDoneDialogue_BeverlySayKeepBike = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT bDoneDialogue_DropOffBeverly
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF bPausedDialogue_DropOffBeverly
//alternative dialogue based for no photos taken during chase
IF iGoodPhotosTakenCounter = -1
//failed dialogue
IF PAP1_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DOFF05", tlPausedDialogue_DropOffBeverly, CONV_PRIORITY_MEDIUM)
bPausedDialogue_DropOffBeverly = FALSE // reset flag
bDoneDialogue_DropOffBeverly = TRUE
ENDIF
ELSE
//successful dialogue
IF PAP1_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DOFF04", tlPausedDialogue_DropOffBeverly, CONV_PRIORITY_MEDIUM)
bPausedDialogue_DropOffBeverly = FALSE // reset flag
bDoneDialogue_DropOffBeverly = TRUE
ENDIF
ENDIF
ELSE
//alternative dialogue based for no photos taken during chase
IF iGoodPhotosTakenCounter = -1
//failed dialogue
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DOFF05", CONV_PRIORITY_MEDIUM)
// You've probably cost me this year's Showbiz Photography Award.
// Not one damn photo.
// Fingers crossed this next stakeout goes better.
bDoneDialogue_DropOffBeverly = TRUE
ENDIF
ELSE
//successful dialogue
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DOFF04", CONV_PRIORITY_MEDIUM)
// I think I got a decent shot of Miranda back there.
// So we're splitting the cash you get for the photo fifty-fifty, right?
// Err, yeah sure.
bDoneDialogue_DropOffBeverly = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELIF NOT bDoneDialogue_DropOffBeverlyAdditionalChat
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF bPausedDialogue_DropOffBeverly
IF PAP1_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DOFF02", tlPausedDialogue_DropOffBeverly, CONV_PRIORITY_MEDIUM)
bPausedDialogue_DropOffBeverly = FALSE // reset flag
bDoneDialogue_DropOffBeverlyAdditionalChat = TRUE
ENDIF
ELSE
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DOFF02", CONV_PRIORITY_MEDIUM)
// I probably shouldn't talk, but this is one messed up line of work you're in.
// It's about staying true to yourself.
// With muff shots.
// Miranda Cowan's thirty nine years old - we just made her day, man.
// They want it, the little whores, they court it. It's a beautiful, abusive relationship.
// Whose day you making next?
// Samantha Muldoon, the singer. I got a tip-off she's buying a North Korean baby on the black market.
// The holy grail of adoption contraband. This could define my career.
bDoneDialogue_DropOffBeverlyAdditionalChat = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//Play bev comment about taking along time to reach drop off - setup as random dialogue in DialogueStar
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer_TakingLongTimeToReachDropOffPoint = GET_GAME_TIMER()
ELSE
IF NOT bDoneDialogue_PlayerPullsWheelie
// currently the only thing remotely close to a is_bike_pulling_wheelie check, potentially use with IS_ENTITY_IN_AIR()
// but in this instance i think the dialogue will work with airbourne as well
IF NOT IS_VEHICLE_ON_ALL_WHEELS(sBeverlyVehicle.vehicle)
IF HAS_TIME_PASSED(iTimer_BeverlyBikeNotOnAllWheelsTimer, 500) //make sure player has been pulling wheelie for a decent chunk of time
// random dialogue, so only one line will be selected
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_PPW1", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Christ, you're gonna kill us.
// You're a fucking lunatic.
// Are you trying to give me a heart attack?
// Is that supposed to impress me?
bDoneDialogue_PlayerPullsWheelie = TRUE
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this so Franklin can't respond to this one
iDialogueTimer_TakingLongTimeToReachDropOffPoint = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
iTimer_BeverlyBikeNotOnAllWheelsTimer = GET_GAME_TIMER()
ENDIF
ELSE
// reset the dialogue bool once the current conversation has finished
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_PPW1")
AND IS_VEHICLE_ON_ALL_WHEELS(sBeverlyVehicle.vehicle)
bDoneDialogue_PlayerPullsWheelie = FALSE
iTimer_BeverlyBikeNotOnAllWheelsTimer = GET_GAME_TIMER()
ENDIF
ENDIF
// Franklin drives into a ped
IF (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) >= 0) // looks to be initially set to -1 so need to check from 0
AND (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) < 500)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_HITPED", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// It's okay, they're fine.
// That's it, no prisoners!
// Collateral damage, don't worry about it.
// Good, if they get in the way, take them down!
// Move next time!
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DROP OFF BEV - drove into ped dialogue - PAP1_HITPED") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF (GET_GAME_TIMER() - iDialogueTimer_TakingLongTimeToReachDropOffPoint > (TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE_LONG + GET_RANDOM_INT_IN_RANGE(1, 2500)))
AND (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_DOFF03", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// We better get a move on. I should have been there twenty minutes ago.
// How is this taking so long? I'm gonna miss my chance.
// If we don't get there soon, Samantha will be long gone.
iDialogueTimer_TakingLongTimeToReachDropOffPoint = GET_GAME_TIMER()
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TAKING A LONG TIME TO REACH DROP OFF DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
// Franklin crashes the bike
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_CRASH")
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(sBeverlyVehicle.vehicle)
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//ENDIF
// random selected lines
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CRASH", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// You idiot!
// For Christ's sake!
// Are you blind?
// Can't you drive!?
// Is it that hard?
// No! You moron!
// You have gotta be kidding me!
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DROP OFF BEV - crash biek dialogue triggered - PAP1_CRASH") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//ENDIF
ENDPROC
/// PURPOSE:
/// Updates the common functions used in the uber chase
/// PARAMS:
/// bControlChaseHintCam - set the hint cam to focus on the uber chase vehicle
/// bOverrideRubberbanding - when true the normal rubberbanding tests are ignored
/// fRubberbandingOverrideSpeed - the speed to apply on all vehicles in the uber recording, only works if bOverrideRubberbanding is true
PROC UPDATE_PAP1_UBER_CHASE_FUNCS_THIS_FRAME(BOOL bControlChaseHintCam = TRUE, BOOL bOverrideRubberbanding = FALSE, FLOAT fRubberbandingOverrideSpeed = 1.0)
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
AND IS_VEHICLE_OK(sBeverlyVehicle.vehicle) // added to fix bug 1071498 - caused by CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR using player vehicle instead of player
fCurrentChaseDistanceCeleb = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCelebVehicle.vehicle))
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
fCurrentPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sCelebVehicle.vehicle)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CURRENT PLAYBACK TIME = ", fCurrentPlaybackTime) ENDIF #ENDIF
IF bOverrideRubberbanding
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase speed - bOverrideRubberbanding true. Value = ", fRubberbandingOverrideSpeed) ENDIF #ENDIF
fMainPlaybackSpeed = fRubberbandingOverrideSpeed
ELSE
IF bUseNewCelebChaseRubberbanding
NEW_UPDATE_CELEB_CHASE_SPEED(fMainPlaybackSpeed, fCurrentChaseDistanceCeleb)
ELSE
UPDATE_CELEB_CHASE_SPEED(fMainPlaybackSpeed, fCurrentChaseDistanceCeleb)
ENDIF
ENDIF
SET_PLAYBACK_SPEED(sCelebVehicle.vehicle, fMainPlaybackSpeed)
PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK()
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn?
IF fCurrentPlaybackTime < 1500.0
CREATE_ALL_WAITING_UBER_CARS() // ensure cars spawn in at the start
ENDIF
UPDATE_UBER_PLAYBACK(sCelebVehicle.vehicle, fMainPlaybackSpeed)
IF bControlChaseHintCam
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sCelebVehicle.vehicle)
ENDIF
MANAGE_CELEB_VEHICLE_USING_HORN(fCurrentChaseDistanceCeleb)
UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE(fCurrentPlaybackTime)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// creates the rival pap, his camera, his driver and his bike
PROC CREATE_RIVAL_PAP_FOR_ENTRANCE()
IF NOT DOES_ENTITY_EXIST(sRivalPapVehicle.vehicle)
CLEAR_AREA(sRivalPapVehicle.vSpawn, 2.0, TRUE)
sRivalPapVehicle.vehicle = CREATE_VEHICLE(sRivalPapVehicle.model, sRivalPapVehicle.vSpawn)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "rival pap bike created") ENDIF #ENDIF
ENDIF
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
SET_ENTITY_QUATERNION(sRivalPapVehicle.vehicle, 0.0329, -0.0200, 0.9542, -0.2968)
SET_VEHICLE_ENGINE_ON(sRivalPapVehicle.vehicle, TRUE, TRUE)
SET_VEHICLE_COLOURS(sRivalPapVehicle.vehicle, 0, 0)
SET_VEHICLE_TYRES_CAN_BURST(sRivalPapVehicle.vehicle, FALSE)
SET_VEHICLE_CAN_LEAK_OIL(sRivalPapVehicle.vehicle, FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(sRivalPapVehicle.vehicle, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(sRivalPapVehicle.model)
IF IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_CHASE")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sRivalPapVehicle.vehicle, "PAPARAZZO_1_PAP_BIKE_GROUP")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE_RIVAL_PAP_FOR_ENTRANCE added rivap pap vehicle to mix group - ", "PAPARAZZO_1_PAP_BIKE_GROUP") ENDIF #ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
IF NOT DOES_ENTITY_EXIST(sRivalPapDriverPed.ped)
sRivalPapDriverPed.ped = CREATE_PED_INSIDE_VEHICLE(sRivalPapVehicle.vehicle, PEDTYPE_MISSION, sRivalPapDriverPed.model, VS_DRIVER)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "rival pap driver created") ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRivalPapDriverPed.ped, TRUE)
SET_PED_CAN_BE_TARGETTED(sRivalPapDriverPed.ped, FALSE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapDriverPed.ped, KNOCKOFFVEHICLE_NEVER)
SET_PED_HELMET(sRivalPapDriverPed.ped, TRUE)
GIVE_PED_HELMET(sRivalPapDriverPed.ped, TRUE)
SET_PED_CONFIG_FLAG(sRivalPapDriverPed.ped, PCF_DontInfluenceWantedLevel, TRUE)
/*
IF IS_PED_IN_GROUP(sRivalPapDriverPed.ped)
REMOVE_PED_FROM_GROUP(sRivalPapDriverPed.ped)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sRivalPapDriverPed.ped, relGroupEnemy)
*/
SET_MODEL_AS_NO_LONGER_NEEDED(sRivalPapDriverPed.model)
ENDIF
IF NOT DOES_ENTITY_EXIST(sRivalPapPed.ped)
sRivalPapPed.ped = CREATE_PED_INSIDE_VEHICLE(sRivalPapVehicle.vehicle, PEDTYPE_MISSION, sRivalPapPed.model, VS_FRONT_RIGHT)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "rival pap create") ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sRivalPapPed.ped)
SET_PED_HELMET(sRivalPapPed.ped, FALSE) // B*1296026
//setup variation which doesn't have camera prop around the neck
SET_PED_COMPONENT_VARIATION(sRivalPapPed.ped, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(sRivalPapPed.ped, INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(sRivalPapPed.ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(sRivalPapPed.ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(sRivalPapPed.ped, INT_TO_ENUM(PED_COMPONENT,9), 0, 0, 0) //(task) //for camera prop swap to 1, 0, 0) //(task)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRivalPapPed.ped, TRUE)
SET_PED_CAN_BE_TARGETTED(sRivalPapPed.ped, FALSE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_NEVER)
SET_ENTITY_LOAD_COLLISION_FLAG(sRivalPapPed.ped, TRUE)
SET_PED_CONFIG_FLAG(sRivalPapPed.ped, PCF_DontInfluenceWantedLevel, TRUE)
ADD_PED_FOR_DIALOGUE(sDialogue, 4, sRivalPapPed.ped, "Paparazzo1RivalPap")
/*
IF IS_PED_IN_GROUP(sRivalPapPed.ped)
REMOVE_PED_FROM_GROUP(sRivalPapPed.ped)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sRivalPapPed.ped, relGroupEnemy)
*/
IF NOT DOES_ENTITY_EXIST(sObjCameraRivalPap.object)
sObjCameraRivalPap.object = CREATE_OBJECT(sObjCameraRivalPap.model, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sRivalPapPed.ped, << 0.0, 0.0, 2.5 >>))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE_RIVAL_PAP_FOR_ENTRANCE - sObjCameraRivalPap.object - created in script not mocap FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(sObjFlashUnitRivalPap.object)
sObjFlashUnitRivalPap.vPosition = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sRivalPapPed.ped, << 0.0, 0.0, 2.5 >>)
sObjFlashUnitRivalPap.object = CREATE_OBJECT(sObjFlashUnitRivalPap.model, sObjFlashUnitRivalPap.vPosition)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE_RIVAL_PAP_FOR_ENTRANCE - sObjFlashUnitRivalPap.object - created in script not mocap FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sObjCameraRivalPap.object)
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(sObjFlashUnitRivalPap.object, sObjCameraRivalPap.object)
ATTACH_ENTITY_TO_ENTITY(sObjFlashUnitRivalPap.object, sObjCameraRivalPap.object, 0, sObjFlashUnitRivalPap.vOffset, sObjFlashUnitRivalPap.vRotation)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE_RIVAL_PAP_FOR_ENTRANCE - sObjFlashUnitRivalPap.object - ATTACHED to sObjCameraRivalPap.object in script not mocap FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(sObjCameraRivalPap.object, sRivalPapPed.ped)
ATTACH_ENTITY_TO_ENTITY(sObjCameraRivalPap.object, sRivalPapPed.ped, GET_PED_BONE_INDEX(sRivalPapPed.ped, BONETAG_PH_R_HAND), sObjCameraRivalPap.vOffset, sObjCameraRivalPap.vRotation)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE_RIVAL_PAP_FOR_ENTRANCE - sObjCameraBeverly.object - ATTACHED to sBeverlyPed.ped in script not mocap FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
SET_MODEL_AS_NO_LONGER_NEEDED(sRivalPapPed.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sObjCameraRivalPap.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sObjFlashUnitRivalPap.model)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// set the particle fx to start and the sound fx for rival taking a photo
PROC SET_RIVAL_PAP_TAKE_PHOTO_THIS_FRAME()
IF IS_ENTITY_ALIVE(sRivalPapPed.ped)
IF DOES_ENTITY_EXIST(sObjCameraRivalPap.object)
IF IS_ENTITY_ALIVE(sObjFlashUnitRivalPap.object)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_rcpap1_camera", sObjFlashUnitRivalPap.object, vCameraFlashFX_Offset, << 0.0, 0.0, 0.0 >>) // B*1706190 - no roration offset, uses parent
ENDIF
IF NOT HAS_SOUND_FINISHED(iSoundId_CameraFlash)
STOP_SOUND(iSoundId_CameraFlash)
ENDIF
IF REQUEST_SCRIPT_AUDIO_BANK(sPap1_AudioBank_CameraFlashSoundFX)
PLAY_SOUND_FROM_COORD(iSoundId_CameraFlash, "CAMERA", GET_PED_BONE_COORDS(sRivalPapPed.ped, BONETAG_PH_R_HAND, vCameraFlashFX_Offset), sPap1_SoundSetName)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_RIVAL_PAP_TAKE_PHOTO_THIS_FRAME : done this frame : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles the Rival pap taking photos of Miranda
PROC MANAGE_RIVAL_TAKING_PHOTOS(FLOAT fRivalPapPlaybackTime)
FLOAT fRivalPapTaskSweepAim_TurnRate = 3.0 // default is 1.0, 2.0 would be twice as fast, etc
VECTOR vAimCameraPos
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
vAimCameraPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vCelebPosInCarOffset)
ENDIF
SWITCH iRivalTakesPhotosBurst
CASE 0
IF fRivalPapPlaybackTime >= 0.0 //1200.0
IF NOT IsPedPerformingTask(sRivalPapPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
TASK_LOOK_AT_COORD(sRivalPapPed.ped, vAimCameraPos, -1)
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "sweep_low", "sweep_med", "sweep_high", -1, vAimCameraPos, fRivalPapTaskSweepAim_TurnRate)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "**MANAGE_RIVAL_TAKING_PHOTOS : ", " RIVAL SNAP =+= CASE ", iRivalTakesPhotosBurst,
"sweep task applied at fRivalPapPlaybackTime : ", fRivalPapPlaybackTime) ENDIF #ENDIF
ELSE
UPDATE_TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, vAimCameraPos)
IF (GET_GAME_TIMER() - iRivalPapCameraFlashTimer > 1000)
IF iNumFlashesForRivalCamera < 3
IF IS_ENTITY_ALIVE(sRivalPapPed.ped)
SET_RIVAL_PAP_TAKE_PHOTO_THIS_FRAME()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "FLASH NUMBER - ", iRivalTakesPhotosBurst) ENDIF #ENDIF
iRivalPapCameraFlashTimer = GET_GAME_TIMER() - 550 // make repeat flashes quicker
iNumFlashesForRivalCamera++
IF iNumFlashesForRivalCamera >= 3
iNumFlashesForRivalCamera = 0
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
iRivalTakesPhotosBurst++
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took round of snaps [][][] : case++ ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
IF NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle") //revert to idle anims
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took idle anim applied : case = ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap") // wait for the take photo anim to finish first
IF HAS_ENTITY_ANIM_FINISHED(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap")
iRivalTakesPhotosBurst++
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "left gesture anim finished playing : case++ ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ELSE
SET_ENTITY_ANIM_SPEED(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap", 1.25)
ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap") // wait for the take photo anim to finish first
IF HAS_ENTITY_ANIM_FINISHED(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap")
iRivalTakesPhotosBurst++
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "right gesture anim finished playing : case++ ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ELSE
SET_ENTITY_ANIM_SPEED(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap", 1.25)
ENDIF
ELSE
// set the gesture anim to play
IF (GET_GAME_TIMER() - iRivalPapCameraFlashTimer > 1000)
SET_RIVAL_PAP_PLAY_GESTURE_ANIM()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", " set gesture anim playing : ") ENDIF #ENDIF
ELSE
IF NOT IsPedPerformingTask(sRivalPapPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
TASK_LOOK_AT_COORD(sRivalPapPed.ped, vAimCameraPos, -1)
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "sweep_low", "sweep_med", "sweep_high", -1, vAimCameraPos, fRivalPapTaskSweepAim_TurnRate)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "**MANAGE_RIVAL_TAKING_PHOTOS : ", " RIVAL SNAP CASE ", iRivalTakesPhotosBurst,
"sweep task applied at fRivalPapPlaybackTime : ", fRivalPapPlaybackTime) ENDIF #ENDIF
ELSE
UPDATE_TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, vAimCameraPos)
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF fRivalPapPlaybackTime >= 4500.0 //6100.0
IF NOT IsPedPerformingTask(sRivalPapPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
TASK_LOOK_AT_COORD(sRivalPapPed.ped, vAimCameraPos, -1)
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "sweep_low", "sweep_med", "sweep_high", -1, vAimCameraPos, fRivalPapTaskSweepAim_TurnRate)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", " RIVAL SNAP =+= CASE ", iRivalTakesPhotosBurst,
"sweep task applied at fRivalPapPlaybackTime : ", fRivalPapPlaybackTime) ENDIF #ENDIF
ELSE
UPDATE_TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, vAimCameraPos)
IF (GET_GAME_TIMER() - iRivalPapCameraFlashTimer > 1200)
IF iNumFlashesForRivalCamera < 4
IF IS_ENTITY_ALIVE(sRivalPapPed.ped)
SET_RIVAL_PAP_TAKE_PHOTO_THIS_FRAME()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "FLASH NUMBER - ", iRivalTakesPhotosBurst) ENDIF #ENDIF
iRivalPapCameraFlashTimer = GET_GAME_TIMER() - 500 // make repeat flashes quicker
iNumFlashesForRivalCamera++
IF iNumFlashesForRivalCamera >= 4
iNumFlashesForRivalCamera = 0
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
iRivalTakesPhotosBurst++
SET_RIVAL_PAP_PLAY_GESTURE_ANIM()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took round of snaps [][][][] : case++ ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
IF NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle") //revert to idle anims
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took idle anim applied : case = ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF fRivalPapPlaybackTime >= 9000.0 //10100.0
IF NOT IsPedPerformingTask(sRivalPapPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
TASK_LOOK_AT_COORD(sRivalPapPed.ped, vAimCameraPos, -1)
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "sweep_low", "sweep_med", "sweep_high", -1, vAimCameraPos, fRivalPapTaskSweepAim_TurnRate)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", " RIVAL SNAP =+= CASE ", iRivalTakesPhotosBurst,
"sweep task applied at fRivalPapPlaybackTime : ", fRivalPapPlaybackTime) ENDIF #ENDIF
ELSE
UPDATE_TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, vAimCameraPos)
IF (GET_GAME_TIMER() - iRivalPapCameraFlashTimer > 1200)
IF iNumFlashesForRivalCamera < 3
IF IS_ENTITY_ALIVE(sRivalPapPed.ped)
SET_RIVAL_PAP_TAKE_PHOTO_THIS_FRAME()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "FLASH NUMBER - ", iRivalTakesPhotosBurst) ENDIF #ENDIF
iRivalPapCameraFlashTimer = GET_GAME_TIMER() - 500 // make repeat flashes quicker
iNumFlashesForRivalCamera++
IF iNumFlashesForRivalCamera >= 3
iNumFlashesForRivalCamera = 0
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
iRivalTakesPhotosBurst++
SET_RIVAL_PAP_PLAY_GESTURE_ANIM()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took round of snaps [][][][] : case++ ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
IF NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle") //revert to idle anims
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took idle anim applied : case = ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE 4
// don't take photos after this point
IF fRivalPapPlaybackTime >= 17000.0 //13500.0
IF IsPedPerformingTask(sRivalPapPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
CLEAR_PED_TASKS(sRivalPapPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "cleared ped sweep task : case = ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle") //revert to idle anims
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took idle anim applied : case = ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
iRivalTakesPhotosBurst++
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap photo taking timed out : case++ ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ELIF fRivalPapPlaybackTime >= 13000.0 //13500.0
IF NOT IsPedPerformingTask(sRivalPapPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
TASK_LOOK_AT_COORD(sRivalPapPed.ped, vAimCameraPos, -1)
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "sweep_low", "sweep_med", "sweep_high", -1, vAimCameraPos, fRivalPapTaskSweepAim_TurnRate)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", " RIVAL SNAP =+= CASE ", iRivalTakesPhotosBurst,
"sweep task applied at fRivalPapPlaybackTime : ", fRivalPapPlaybackTime) ENDIF #ENDIF
ELSE
UPDATE_TASK_SWEEP_AIM_POSITION(sRivalPapPed.ped, vAimCameraPos)
IF (GET_GAME_TIMER() - iRivalPapCameraFlashTimer > 1200)
IF iNumFlashesForRivalCamera < 3
IF IS_ENTITY_ALIVE(sRivalPapPed.ped)
SET_RIVAL_PAP_TAKE_PHOTO_THIS_FRAME()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "FLASH NUMBER - ", iRivalTakesPhotosBurst) ENDIF #ENDIF
iRivalPapCameraFlashTimer = GET_GAME_TIMER() - 500
iNumFlashesForRivalCamera++
IF iNumFlashesForRivalCamera >= 3
iNumFlashesForRivalCamera = 0
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
iRivalTakesPhotosBurst++
SET_RIVAL_PAP_PLAY_GESTURE_ANIM()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took round of snaps [][][][] : case++ ",
iRivalTakesPhotosBurst, " fRivalPapPlaybackTime = ", fRivalPapPlaybackTime) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iRivalPapCameraFlashTimer = GET_GAME_TIMER()
IF NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle") //revert to idle anims
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap took idle anim applied : case = ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
DEFAULT
IF IsPedPerformingTask(sRivalPapPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
CLEAR_PED_TASKS(sRivalPapPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "cleared ped sweep task : case = ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle") //revert to idle anims
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_RIVAL_TAKING_PHOTOS : ", "rival pap idle anim applied : case = ", iRivalTakesPhotosBurst) ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Play the sfx for successful hit during knock off bike attack
PROC PLAY_KNOCK_OFF_BIKER_ATTACK_HIT_SOUND()
//hit sound sfx
IF NOT HAS_SOUND_FINISHED(iSoundId_BikeAttack_MeleeSwipe)
STOP_SOUND(iSoundId_BikeAttack_MeleeSwipe)
ENDIF
//swipe sound sfx
IF REQUEST_SCRIPT_AUDIO_BANK("PAPARAZZO_01_A")
PLAY_SOUND_FROM_ENTITY(iSoundId_BikeAttack_MeleeHit, "HIT", sBeverlyPed.ped, sPap1_SoundSetName)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HIT sfx triggered") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HIT sfx not triggered, audio bank not loaded!? ") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Used to decide if the attacker has moved ahead or behind of the est victims position.
/// This is used to determine if we should speed up or slow down the attack anim to compensate.
/// PARAMS:
/// vVictimForwardVector -
/// vVictimCoords -
/// vAttackerCoords -
/// bFlipResultsForEntitiesHeadingInOppositeDirections - if TRUE returned results will be flipped
/// RETURNS:
/// Int depicting the forward side of the victim the attack is. < 0 = behind, > 0 = infront, 0 = in line
FUNC FLOAT GET_FORWARD_SIDE_ATTACKER_IS_TO_VICTIM(VECTOR vVictimForwardPos, VECTOR vVictimCoords, VECTOR vAttackerCoords, BOOL bFlipResultsForEntitiesHeadingInOppositeDirections = TRUE)
FLOAT fSide = DOT_PRODUCT(vAttackerCoords - vVictimCoords, vVictimForwardPos)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_FORWARD_SIDE_ATTACKER_IS_TO_VICTIM returning - ", fSide) ENDIF #ENDIF
IF (fSide < 0)
IF bFlipResultsForEntitiesHeadingInOppositeDirections
RETURN ABSF(fSide) //forward side = infront (convert to positive value)
ELSE
RETURN fSide //forward side = behind
ENDIF
ELIF (fSide > 0)
IF bFlipResultsForEntitiesHeadingInOppositeDirections
RETURN fSide * -1 //forward side = behind (convert to negative value)
ELSE
RETURN fSide //forward side = infront
ENDIF
ENDIF
RETURN 0.0 //forward side - in line
ENDFUNC
/// PURPOSE:
/// Check if the pedIndexAttacker is estimated to reach the range needed to start the knock off bike attack anim
/// PARAMS:
/// pedIndexAttacker - ped attacking
/// vAttackerCoords - attacking ped's coords
/// vehIndexVictim - victim's vehicle
/// vVictimCoords - victim's vehicle's coords
/// fTimeTillHitStartPoint - the selected knock off biker anim's time to reach the successful attack start point
/// RETURNS:
/// TRUE if the pedIndexAttacker can reach the start attack range.
FUNC BOOL IS_PED_IN_RANGE_FOR_START_KNOCKOFF_BIKER_ATTACK(PED_INDEX pedIndexAttacker, VECTOR vAttackerCoords, VEHICLE_INDEX vehIndexVictim, VECTOR vVictimCoords, FLOAT fTimeTillHitStartPoint)
VECTOR vNewVictimCoords = vVictimCoords + (GET_ENTITY_VELOCITY(vehIndexVictim) * fTimeTillHitStartPoint)
VECTOR vNewAttackerCoords = vAttackerCoords + (GET_ENTITY_VELOCITY(pedIndexAttacker) * fTimeTillHitStartPoint)
FLOAT fVictimHeading = GET_ENTITY_HEADING(vehIndexVictim)
#IF IS_DEBUG_BUILD
IF bDebug_ToggleKnockoffBikerDebugDraws
DRAW_DEBUG_SPHERE(vNewVictimCoords, 0.2, 0, 200, 0, 50)
DRAW_DEBUG_SPHERE(vNewAttackerCoords, 0.2, 0, 0, 200, 50)
ENDIF
#ENDIF
//modify the X value of the far offset based off distance, this stop attacker swinging if in line but out to the side
//but also allows attacker to wind up if their predicted isn't really close whilst far away
VECTOR vKnockOff_Biker_ExecuteArea_OffsetFar = vKnockOff_Biker_HitExecutionArea_OffsetFar[iKnockOff_Biker_Attack_Side]
VECTOR vKnockOff_Biker_ExecuteArea_OffsetNear = vKnockOff_Biker_HitExecutionArea_OffsetNear[iKnockOff_Biker_Attack_Side]
FLOAT fX = vKnockOff_Biker_HitExecutionArea_OffsetFar[iKnockOff_Biker_Attack_Side].X / 2 //in the middle of the Hit Execution area
FLOAT fY = vKnockOff_Biker_HitExecutionArea_OffsetFar[iKnockOff_Biker_Attack_Side].Y // This value is the middle point of the execution area in the Y value
VECTOR vDesiredOffset_FromVictim = << fX, fY, 0.0 >> //in the middle of the Hit Execution area
VECTOR vDesiredPos_AttackHitPoint = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vVictimCoords, fVictimHeading, vDesiredOffset_FromVictim)
#IF IS_DEBUG_BUILD IF bDebug_ToggleKnockoffBikerDebugDraws DRAW_DEBUG_SPHERE(vDesiredPos_AttackHitPoint, 0.25, 200, 100, 200, 70) ENDIF #ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_RANGE_FOR_START_KNOCKOFF_BIKER_ATTACK - vDesiredPos_AttackHitPoint for start attack = ", vDesiredPos_AttackHitPoint) ENDIF #ENDIF
VECTOR vVictimForwardPos = GET_ENTITY_FORWARD_VECTOR(vehIndexVictim)
FLOAT fFowardDistanceFromDesiredHitPos = GET_FORWARD_SIDE_ATTACKER_IS_TO_VICTIM(vVictimForwardPos, vDesiredPos_AttackHitPoint, vAttackerCoords, bAreEntitiesHeadingsCompleteOpposite_KO_Biker)
IF fFowardDistanceFromDesiredHitPos < ((fKnockOff_Biker_HitExecutionArea_Length / 2) * -1) //if attacker is behind victim, further than execute hit area
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_RANGE_FOR_START_KNOCKOFF_BIKER_ATTACK - vKnockOff_Biker_ExecuteArea_OffsetFar.X pre modify = ", vKnockOff_Biker_ExecuteArea_OffsetFar.X) ENDIF #ENDIF
FLOAT fNewX = vKnockOff_Biker_ExecuteArea_OffsetFar.X
IF iKnockOff_Biker_Attack_Side = KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT // need to convert to positive value, as right side will be negative
fNewX = ABSF(fNewX)
ENDIF
fFowardDistanceFromDesiredHitPos = ABSF(fFowardDistanceFromDesiredHitPos)
fNewX += ((fFowardDistanceFromDesiredHitPos / fKnockOff_Biker_StartAnimWidthModifier) * TIMESTEP())
IF fNewX > 7.0 //upper cap
fNewX = 7.0
ENDIF
IF iKnockOff_Biker_Attack_Side = KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT // need to convert to negative value, as right side will be negative
fNewX *= -1
ENDIF
vKnockOff_Biker_ExecuteArea_OffsetFar.X = fNewX
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_RANGE_FOR_START_KNOCKOFF_BIKER_ATTACK - vKnockOff_Biker_ExecuteArea_OffsetFar.X after modifier = ", vKnockOff_Biker_ExecuteArea_OffsetFar.X) ENDIF #ENDIF
ENDIF
vKnockOff_Biker_HitExecutionArea_PosNear = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vNewVictimCoords, fVictimHeading, vKnockOff_Biker_ExecuteArea_OffsetNear)
vKnockOff_Biker_HitExecutionArea_PosFar = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vNewVictimCoords, fVictimHeading, vKnockOff_Biker_ExecuteArea_OffsetFar)
//test if the attacker's predicted point is inside the area for executing the hit
#IF IS_DEBUG_BUILD IF bDebug_ToggleKnockoffBikerDebugDraws IS_POINT_IN_ANGLED_AREA(vNewAttackerCoords, vKnockOff_Biker_HitExecutionArea_PosNear, vKnockOff_Biker_HitExecutionArea_PosFar, fKnockOff_Biker_HitExecutionArea_Length, TRUE, TRUE) ENDIF #ENDIF //just to display area in debug
IF IS_POINT_IN_ANGLED_AREA(vNewAttackerCoords, vKnockOff_Biker_HitExecutionArea_PosNear, vKnockOff_Biker_HitExecutionArea_PosFar, fKnockOff_Biker_HitExecutionArea_Length, FALSE, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_ToggleKnockoffBikerDebugDraws DRAW_RECT(0.85, 0.7, 0.05, 0.05, 0, 255, 0, 150) ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_RANGE_FOR_START_KNOCKOFF_BIKER_ATTACK - returning - TRUE") ENDIF #ENDIF
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD IF bDebug_ToggleKnockoffBikerDebugDraws DRAW_RECT(0.85, 0.7, 0.05, 0.05, 255, 0, 0, 150) ENDIF #ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_RANGE_FOR_START_KNOCKOFF_BIKER_ATTACK - returning - FALSE") ENDIF #ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// track if the attack has moved further ahead or behind the projected positin to land a successful attack
/// PARAMS:
/// pedIndexAttacker - ped attacking
/// vAttackerCoords - attacking ped's coords
/// vehIndexVictim - victim's vehicle
/// vVictimCoords - victim's vehicle's coords
/// fTimeTillDesiredAnimHitPoint - amount of time till we reach the desired anim hit point
/// RETURNS:
/// Int depicting the forward side of the victim the attack is. < 0 = behind, > 0 = infront, 0 = in line
FUNC FLOAT GET_PED_UPDATED_FORWARD_SIDE_TO_KNOCKOFF_BIKER_ATTACK_HIT_POINT(PED_INDEX pedIndexAttacker, VECTOR vAttackerCoords, VEHICLE_INDEX vehIndexVictim, VECTOR vVictimCoords, FLOAT fTimeTillDesiredAnimHitPoint)
VECTOR vNewVictimCoords = vVictimCoords + (GET_ENTITY_VELOCITY(vehIndexVictim) * fTimeTillDesiredAnimHitPoint)
VECTOR vNewAttackerCoords = vAttackerCoords + (GET_ENTITY_VELOCITY(pedIndexAttacker) * fTimeTillDesiredAnimHitPoint)
#IF IS_DEBUG_BUILD
IF bDebug_ToggleKnockoffBikerDebugDraws
//DRAW_DEBUG_SPHERE(vNewVictimCoords, 0.2, 0, 200, 0, 50)
//DRAW_DEBUG_SPHERE(vNewAttackerCoords, 0.2, 0, 0, 200, 50)
ENDIF
#ENDIF
#IF IS_DEBUG_BUILD
FLOAT fVictimHeading = GET_ENTITY_HEADING(vehIndexVictim)
FLOAT fX = vKnockOff_Biker_HitExecutionArea_OffsetFar[iKnockOff_Biker_Attack_Side].X / 2 //in the middle of the Hit Execution area
FLOAT fY = vKnockOff_Biker_HitExecutionArea_OffsetFar[iKnockOff_Biker_Attack_Side].Y // This value is the middle point of the execution area in the Y value
VECTOR vDesiredOffset_FromVictim = << fX, fY, 0.0 >> //in the middle of the Hit Execution area
VECTOR vDesiredPos_AttackHitPoint = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vNewVictimCoords, fVictimHeading, vDesiredOffset_FromVictim)
#ENDIF
#IF IS_DEBUG_BUILD IF bDebug_ToggleKnockoffBikerDebugDraws DRAW_DEBUG_SPHERE(vDesiredPos_AttackHitPoint, 0.25, 200, 100, 200, 70) ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_PED_UPDATED_RANGE_TO_KNOCKOFF_BIKER_ATTACK_HIT_POINT - vDesiredPos_AttackHitPoint = ", vDesiredPos_AttackHitPoint) ENDIF #ENDIF
VECTOR vVictimForwardPos = GET_ENTITY_FORWARD_VECTOR(vehIndexVictim)
//RETURN GET_FORWARD_SIDE_ATTACKER_IS_TO_VICTIM(vVictimForwardPos, vDesiredPos_AttackHitPoint, vNewAttackerCoords, bAreEntitiesHeadingsCompleteOpposite_KO_Biker) // vNewVictimCoords, vNewAttackerCoords, bAreEntitiesHeadingsCompleteOpposite_KO_Biker)
RETURN GET_FORWARD_SIDE_ATTACKER_IS_TO_VICTIM(vVictimForwardPos, vNewVictimCoords, vNewAttackerCoords, bAreEntitiesHeadingsCompleteOpposite_KO_Biker)
ENDFUNC
/// PURPOSE:
/// Used in Knock off biker attack. The total anim time appears to be constant, regardless of the anim speed
/// so this recalculates the anim phase's time taking into account the anim speed
/// PARAMS:
/// fAnimPhase - phase of the anim, must be between 0.0 and 1.0 to be valid
/// fTotalAnimTime -
/// fAnimSpeed -
/// RETURNS:
/// Time in milliseconds
FUNC FLOAT GET_ANIM_TIME_FROM_ANIM_PHASE(FLOAT fAnimPhase, FLOAT fTotalAnimTime, FLOAT fAnimSpeed)
IF fAnimPhase < 0.0
OR fAnimPhase > 1.0
SCRIPT_ASSERT("Paparazzo 1 - GET_ANIM_TIME_FROM_ANIM_PHASE - invalid anim phase")
ENDIF
IF fAnimSpeed < 0.0
SCRIPT_ASSERT("Paprazzo 1 - GET_ANIM_TIME_FROM_ANIM_PHASE - invalid anim speed")
ENDIF
RETURN ((fAnimPhase * fTotalAnimTime) * fAnimSpeed)
ENDFUNC
/// PURPOSE:
/// Test to see if the given ped's arm or hand is intersecting the given victim ped's body
/// uses ped bone positions with simple VDIST2 test followed by Z diff test
/// PARAMS:
/// vehIndexVictim - vehicle to base checks off
/// vehIndexAttacker - vehicle to base updated position checks off
/// bHasPassenger - test for ped passenger on bike aswell
/// RETURNS:
/// TRUE if attacking peds hand or arm is within range to be classed as intersecting the peds on the bike
FUNC BOOL IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK(PED_INDEX pedIndexAttacker, VEHICLE_INDEX vehIndexAttacker, VEHICLE_INDEX vehIndexVictim, BOOL bHasPassenger = FALSE, OBJECT_INDEX objIndexAttackerWeapon = NULL)
IF NOT IS_ENTITY_ALIVE(pedIndexAttacker)
RETURN FALSE
ENDIF
IF NOT IS_ENTITY_ALIVE(vehIndexAttacker)
RETURN FALSE
ENDIF
IF NOT IS_ENTITY_ALIVE(vehIndexVictim)
RETURN FALSE
ENDIF
VECTOR vAttackerHandPos
VECTOR vAttackerArmPos
VECTOR vAttackerWeaponPos
IF iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_LEFT
vAttackerHandPos = GET_PED_BONE_COORDS(pedIndexAttacker, BONETAG_PH_L_HAND, << 0.0, 0.0, 0.0 >>) // potentially need to be using BONETAG_PH_L_HAND
vAttackerArmPos = GET_PED_BONE_COORDS(pedIndexAttacker, BONETAG_L_FOREARM, << 0.0, 0.0, 0.0 >>)
ELIF iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT
vAttackerHandPos = GET_PED_BONE_COORDS(pedIndexAttacker, BONETAG_PH_R_HAND, << 0.0, 0.0, 0.0 >>) // potentially need to be using NETAG_PH_R_HAND
vAttackerArmPos = GET_PED_BONE_COORDS(pedIndexAttacker, BONETAG_R_FOREARM, << 0.0, 0.0, 0.0 >>)
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN FALSE - invalid attacking arm") ENDIF #ENDIF
RETURN FALSE
ENDIF
// ped bone coords are behind on update, when travelling at speed, so having to calculate expected position based off velocity staying roughly since last frame
VECTOR vVelocity = GET_ENTITY_VELOCITY(vehIndexAttacker)
FLOAT fTime = GET_FRAME_TIME()
VECTOR vPredictedPos
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "Velocity = ", vVelocity, " Time = ", fTime) ENDIF #ENDIF
vPredictedPos = vVelocity * fTime
vAttackerHandPos += vPredictedPos
vAttackerArmPos += vPredictedPos
VECTOR vPelvisPosOffset
VECTOR vEstimatedVictimPelvisPos
FLOAT fHeightMaxCap
FLOAT fHeightMinCap
FLOAT fHeightMaxCapDiff
FLOAT fPelvisRadius = 0.425
FLOAT fHandRadius = 0.08 // 0.075 good representation, although increased to try and make hit chance better
FLOAT fArmRadius = 0.08 // 0.075 good representation, although increased to try and make hit chance better
FLOAT fWeaponRadius = 0.8 // 0.075 good representation, although increased to try and make hit chance better
//Driver
vPelvisPosOffset = << 0.0, 0.15, 0.4 >> // << 0.0, 0.15, 0.6 >> lowered Z as can look like it hit when motorbike is pitched
#IF IS_DEBUG_BUILD
IF bDebug_DoArmIntersectionTest
vPelvisPosOffset = vDebug_PelvisPosOffsetDriver
ENDIF
#ENDIF
vEstimatedVictimPelvisPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehIndexVictim, vPelvisPosOffset)
fHeightMaxCapDiff = 0.6
fHeightMaxCap = vEstimatedVictimPelvisPos.z + fHeightMaxCapDiff // additional height grabbed in game
fHeightMinCap = vEstimatedVictimPelvisPos.z
IF IS_ENTITY_ALIVE(objIndexAttackerWeapon)
vAttackerWeaponPos = GET_ENTITY_COORDS(objIndexAttackerWeapon)
vAttackerWeaponPos += vPredictedPos
ENDIF
#IF IS_DEBUG_BUILD
IF bDebug_DoArmIntersectionTest
//fPelvisRadius = fDebug_PelvisRadius
DRAW_DEBUG_SPHERE(vEstimatedVictimPelvisPos, fPelvisRadius, 50, 255, 0, 120)
DRAW_DEBUG_CROSS(<< vEstimatedVictimPelvisPos.X, vEstimatedVictimPelvisPos.Y, fHeightMinCap >>, 0, 255, 0, 200)
DRAW_DEBUG_CROSS(<< vEstimatedVictimPelvisPos.X, vEstimatedVictimPelvisPos.Y, fHeightMaxCap >>, 1.0, 0, 255, 0, 200)
//fHandRadius = fDebug_HandRadius
DRAW_DEBUG_SPHERE(vAttackerHandPos, fHandRadius, 0, 0, 255, 120)
//fArmRadius = fDebug_ArmRadius
DRAW_DEBUG_SPHERE(vAttackerArmPos, fArmRadius, 0, 0, 255, 120)
IF IS_ENTITY_ALIVE(objIndexAttackerWeapon)
DRAW_DEBUG_SPHERE(vAttackerWeaponPos, fWeaponRadius, 0, 255, 100, 100)
ENDIF
ENDIF
#ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(vAttackerHandPos, vEstimatedVictimPelvisPos, FALSE) < (fPelvisRadius + fHandRadius)
IF vAttackerHandPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerHandPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - hand hits driver") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(vAttackerArmPos, vEstimatedVictimPelvisPos, FALSE) < (fPelvisRadius + fArmRadius)
IF vAttackerArmPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerArmPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - arm hits driver") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(objIndexAttackerWeapon)
IF IS_ENTITY_IN_RANGE_COORDS(objIndexAttackerWeapon, vEstimatedVictimPelvisPos, (fPelvisRadius + fWeaponRadius))
IF vAttackerWeaponPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerWeaponPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - weapon hits driver") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// Passenger
IF bHasPassenger
vPelvisPosOffset = << 0.0, -0.55, 0.45 >> // << 0.0, -0.55, 0.65 >> lowered Z as can look like it hit when motorbike is pitched
#IF IS_DEBUG_BUILD
IF bDebug_DoArmIntersectionTest
vPelvisPosOffset = vDebug_PelvisPosOffsetPassenger
ENDIF
#ENDIF
vEstimatedVictimPelvisPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehIndexVictim, vPelvisPosOffset)
fHeightMaxCapDiff = 0.85
fHeightMaxCap = vEstimatedVictimPelvisPos.z + fHeightMaxCapDiff // additional height grabbed in game
fHeightMinCap = vEstimatedVictimPelvisPos.z
#IF IS_DEBUG_BUILD
IF bDebug_DoArmIntersectionTest
//fPelvisRadius = fDebug_PelvisRadius
DRAW_DEBUG_SPHERE(vEstimatedVictimPelvisPos, fPelvisRadius, 50, 255, 0, 120)
DRAW_DEBUG_CROSS(<< vEstimatedVictimPelvisPos.X, vEstimatedVictimPelvisPos.Y, fHeightMinCap >>, 1.0, 0, 255, 0, 200)
DRAW_DEBUG_CROSS(<< vEstimatedVictimPelvisPos.X, vEstimatedVictimPelvisPos.Y, fHeightMaxCap >>, 1.0, 0, 255, 0, 200)
ENDIF
#ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(vAttackerHandPos, vEstimatedVictimPelvisPos, FALSE) < (fPelvisRadius + fHandRadius)
IF vAttackerHandPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerHandPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - hand hits passenger") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(vAttackerArmPos, vEstimatedVictimPelvisPos, FALSE) < (fPelvisRadius + fArmRadius)
IF vAttackerArmPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerArmPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - arm hits passenger") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(objIndexAttackerWeapon)
IF IS_ENTITY_IN_RANGE_COORDS(objIndexAttackerWeapon, vEstimatedVictimPelvisPos, (fPelvisRadius + fWeaponRadius))
IF vAttackerWeaponPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerWeaponPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - weapon hits passenger") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// additional check area between the driver and passenger where detection would slip through
vPelvisPosOffset = << 0.0, -0.35, 0.42 >> // pos, mid between driver and passenger
#IF IS_DEBUG_BUILD
IF bDebug_DoArmIntersectionTest
vPelvisPosOffset = vDebug_PelvisPosOffsetPassenger
ENDIF
#ENDIF
vEstimatedVictimPelvisPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehIndexVictim, vPelvisPosOffset)
fHeightMaxCapDiff = 0.85
fHeightMaxCap = vEstimatedVictimPelvisPos.z + fHeightMaxCapDiff // additional height grabbed in game
fHeightMinCap = vEstimatedVictimPelvisPos.z
#IF IS_DEBUG_BUILD
IF bDebug_DoArmIntersectionTest
//fPelvisRadius = fDebug_PelvisRadius
DRAW_DEBUG_SPHERE(vEstimatedVictimPelvisPos, fPelvisRadius, 50, 150, 0, 100)
DRAW_DEBUG_CROSS(<< vEstimatedVictimPelvisPos.X, vEstimatedVictimPelvisPos.Y, fHeightMinCap >>, 1.0, 0, 150, 0, 200)
DRAW_DEBUG_CROSS(<< vEstimatedVictimPelvisPos.X, vEstimatedVictimPelvisPos.Y, fHeightMaxCap >>, 1.0, 0, 150, 0, 200)
ENDIF
#ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(vAttackerHandPos, vEstimatedVictimPelvisPos, FALSE) < (fPelvisRadius + fHandRadius)
IF vAttackerHandPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerHandPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - hand hits section between driver and passenger") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(vAttackerArmPos, vEstimatedVictimPelvisPos, FALSE) < (fPelvisRadius + fArmRadius)
IF vAttackerArmPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerArmPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - arm hits section between driver and passenger") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(objIndexAttackerWeapon)
IF IS_ENTITY_IN_RANGE_COORDS(objIndexAttackerWeapon, vEstimatedVictimPelvisPos, (fPelvisRadius + fWeaponRadius))
IF vAttackerWeaponPos.z <= fHeightMaxCap // test hand height is below est victim head height
IF vAttackerWeaponPos.z >= fHeightMinCap //test hand height is heigher est victim pelvis height
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK : ", "RETURN TRUE - weapon hits hits section between driver and passenger") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Check if the ped is ok to perform the attack///
/// PARAMS:
/// pedIndex - to test
/// RETURNS:
/// TRUE - if the ped exists, is not injured and
/// If player ped, checks for phone being on screen and
/// Checks the ped is sitting on a vehicle and on a bike
FUNC BOOL IS_PED_OK_TO_PERFORM_KNOCKOFF_BIKER_ATTACK(PED_INDEX pedIndex)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF pedIndex = PLAYER_PED_ID()
IF IS_PHONE_ONSCREEN()
RETURN FALSE
ENDIF
ENDIF
IF (IS_PED_ON_ANY_BIKE(pedIndex) AND IS_PED_SITTING_IN_ANY_VEHICLE(pedIndex))
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Tests if two given entitie's (entityIndex01, entityIndex02) headings are either similiar or completely opposite
/// NOTE: doesn't check entities exist or if they are alive
/// PARAMS:
/// entityIndex01 - First entity
/// entityIndex02 - Second entity to test against
/// fThreshold - 1.0 represents both entities facing the exact same way. 0.0 is at 90degree angle
/// bHeadingsAreCompleteOpposite - returning bool to know if the entities are completely opposite
/// RETURNS:
/// TRUE - if entities headings are similar or completely opposite within the threshold
FUNC BOOL ARE_ENTITIES_HEADINGS_SIMILAR_OR_COMPLETE_OPPOSITE_WITHIN_THRESHOLD(ENTITY_INDEX entityIndex01, ENTITY_INDEX entityIndex02, FLOAT fThreshold, BOOL &bHeadingsAreCompleteOpposite)
VECTOR v1, v2
FLOAT f1
FLOAT fUpperThreshold
fUpperThreshold = 1.0 //upper threshold is always 1.0
v1 = GET_ENTITY_FORWARD_VECTOR(entityIndex01)
v2 = GET_ENTITY_FORWARD_VECTOR(entityIndex02)
f1 = DOT_PRODUCT(v1, v2)
IF f1 > 0 //facing same 180 heading
bHeadingsAreCompleteOpposite = FALSE
ELSE
bHeadingsAreCompleteOpposite = TRUE
f1 = ABSF(f1) //turn into a positive value
ENDIF
IF (f1 > fThreshold
AND f1 < fUpperThreshold)
IF NOT bHeadingsAreCompleteOpposite
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "^^^ - COMPARE HEADINGS ARE SIMILAR BOTH FORWARDS >>>>>>>>>>>>>>>> = ", f1) ENDIF #ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "^^^ - COMPARE HEADINGS ARE SIMILAR BOTH BACKWARDS >>>>>>>>>>>>>>>> = ", f1) ENDIF #ENDIF
ENDIF
RETURN TRUE
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "^^^ - COMPARE HEADINGS ARE NOT SIMILAR ------- = ", f1) ENDIF #ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handles ped performing knock off biker attack
/// PARAMS:
/// pedIndexAttacker - ped to perform attack
/// vehIndexVictim - vehicle to be attacked
/// objIndexAttackerWeapon - weapon to specify for attack
PROC MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK(PED_INDEX pedIndexAttacker, VEHICLE_INDEX vehIndexVictim, OBJECT_INDEX objIndexAttackerWeapon = NULL)
IF NOT IS_PED_OK_TO_PERFORM_KNOCKOFF_BIKER_ATTACK(pedIndexAttacker)
//reset if ped is not ok for the attack
eKnockOffBikerAttackState = KBAS_SETUP_ATTACK
ELSE
IF IS_VEHICLE_OK(vehIndexVictim)
VECTOR vAttackerCoords = GET_ENTITY_COORDS(pedIndexAttacker)
VECTOR vVictimCoords = GET_ENTITY_COORDS(vehIndexVictim)
//FLOAT fTimeAttackReachVictim
FLOAT fDesiredAnimHitTime
SWITCH eKnockOffBikerAttackState
CASE KBAS_SETUP_ATTACK
IF NOT IS_ENTITY_PLAYING_ANIM(pedIndexAttacker, sAnimDictName_Pap1Specific, "idle")
// reset Beverly's idle anim
BOOL bSafeToResetIdleAnim
bSafeToResetIdleAnim = TRUE
// don't start taking a photo if we are playing a hurry up anim already
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap")
// make sure the anim has completed (has the hold last frame flag
IF NOT HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap")
bSafeToResetIdleAnim = FALSE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap")
// make sure the anim has completed (has the hold last frame flag
IF NOT HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap")
bSafeToResetIdleAnim = FALSE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
// make sure the anim has completed (has the hold last frame flag
IF NOT HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
bSafeToResetIdleAnim = FALSE
ENDIF
ENDIF
IF bSafeToResetIdleAnim
TASK_PLAY_ANIM(pedIndexAttacker, sAnimDictName_Pap1Specific, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY) // !! needs to stay normal blends otherwise throughs timings out for hit
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - RESET BEVERLY TO IDLE POSE") ENDIF #ENDIF
ENDIF
ENDIF
//decide which side the attack is to the victim
iKnockOff_Biker_Attack_Side = GET_SIDE_COORDS_IS_TO_ENTITY(vehIndexVictim, vVictimCoords, vAttackerCoords)
//reject attack if angle between entities is too big
IF ARE_ENTITIES_HEADINGS_SIMILAR_OR_COMPLETE_OPPOSITE_WITHIN_THRESHOLD(pedIndexAttacker, vehIndexVictim,
KO_BIKER_START_ATTACK_HEADING_THRESOLD, bAreEntitiesHeadingsCompleteOpposite_KO_Biker)
//flip the attack side if entities are facing opposite directions
IF bAreEntitiesHeadingsCompleteOpposite_KO_Biker
IF iKnockOff_Biker_Attack_Side = KNOCKOFF_BIKER_ATTACK_SIDE_LEFT
iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "flipped iKnockOff_Biker_Attack_AnimSide to KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT") ENDIF #ENDIF
ELIF iKnockOff_Biker_Attack_Side = KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT
iKnockOff_Biker_Attack_AnimSide = KNOCKOFF_BIKER_ATTACK_SIDE_LEFT
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "flipped iKnockOff_Biker_Attack_AnimSide to KNOCKOFF_BIKER_ATTACK_SIDE_LEFT") ENDIF #ENDIF
ENDIF
ELSE
iKnockOff_Biker_Attack_AnimSide = iKnockOff_Biker_Attack_Side
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "iKnockOff_Biker_Attack_AnimSide set same as iKnockOff_Biker_Attack_Side") ENDIF #ENDIF
ENDIF
// attacker is directly inslide with the victim
IF iKnockOff_Biker_Attack_Side = KNOCKOFF_BIKER_ATTACK_SIDE_NULL
EXIT //setup a check to see which side of the victim the target ped is heading towards? Just abort for now
ENDIF
// setup the anim info
SWITCH iKnockOff_Biker_Attack_AnimSide
CASE KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT
//33.3 % chance of punch anim, else swipe. Swipe is a better anim so more likely to play
IF (GET_RANDOM_INT_IN_RANGE(0, 3) = 0)
sAnimNameBeverlyKnockOff = "atk_punch_left_pap" // anims have been tagged up with wrong direction! So Left - Right and visa versa
fKnockOff_Biker_InitialAnimSpeed = 1.0
fKnockOff_Biker_Anim_HitStartPoint = 0.21 // 0.25
fKnockOff_Biker_Anim_HitDonePoint = 0.4 // 0.33
fKnockOff_Biker_Anim_SwipeSFXstartPoint = 0.2
fKnockOff_Biker_Anim_TotalTime = 1599.999878
ELSE // 66.6 % chance of swipe anim
sAnimNameBeverlyKnockOff = "atk_swipe_left_pap" // anims have been tagged up with wrong direction! So Left - Right and visa versa
fKnockOff_Biker_InitialAnimSpeed = 1.0
fKnockOff_Biker_Anim_HitStartPoint = 0.235 // 0.28
fKnockOff_Biker_Anim_HitDonePoint = 0.38 // 0.33
fKnockOff_Biker_Anim_SwipeSFXstartPoint = 0.25
fKnockOff_Biker_Anim_TotalTime = 1933.333130
ENDIF
BREAK
CASE KNOCKOFF_BIKER_ATTACK_SIDE_LEFT
//33.3 % chance of punch anim, else swipe. Swipe is a better anim so more likely to play
IF (GET_RANDOM_INT_IN_RANGE(0, 3) = 0)
sAnimNameBeverlyKnockOff = "atk_punch_right_pap" // anims have been tagged up with wrong direction! So Left - Right and visa versa
fKnockOff_Biker_InitialAnimSpeed = 1.0
fKnockOff_Biker_Anim_HitStartPoint = 0.27 // 0.3
fKnockOff_Biker_Anim_HitDonePoint = 0.45 // 0.36
fKnockOff_Biker_Anim_SwipeSFXstartPoint = 0.25
fKnockOff_Biker_Anim_TotalTime = 1366.666748
ELSE // 66.6 % chance of swipe anim
sAnimNameBeverlyKnockOff = "atk_swipe_right_pap" // anims have been tagged up with wrong direction! So Left - Right and visa versa
fKnockOff_Biker_InitialAnimSpeed = 1.0
fKnockOff_Biker_Anim_HitStartPoint = 0.24 // 0.28
fKnockOff_Biker_Anim_HitDonePoint = 0.38 // 0.33
fKnockOff_Biker_Anim_SwipeSFXstartPoint = 0.25
fKnockOff_Biker_Anim_TotalTime = 1799.999878
ENDIF
BREAK
DEFAULT
SCRIPT_ASSERT("RC - PAP 1 - invalid side for KO - iKnockOff_Biker_Attack_AnimSide")
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
DEBUG_OVERRIDE_KNOCK_OFF_BIKER_ANIM_SETUP()
#ENDIF
//calculate the desired time it should take to land the hit
fDesiredAnimHitTime = GET_ANIM_TIME_FROM_ANIM_PHASE(fKnockOff_Biker_Anim_HitStartPoint, fKnockOff_Biker_Anim_TotalTime, fKnockOff_Biker_InitialAnimSpeed)
fDesiredAnimHitTime = fDesiredAnimHitTime / 1000 // convert from milliseconds
//check if the attacker is close enough to begin the attack given the time it will take to land the hit
IF IS_PED_IN_RANGE_FOR_START_KNOCKOFF_BIKER_ATTACK(pedIndexAttacker, vAttackerCoords, vehIndexVictim, vVictimCoords, fDesiredAnimHitTime)
fKnockOff_Biker_UpdatedAnimSpeed = fKnockOff_Biker_InitialAnimSpeed
TASK_PLAY_ANIM(pedIndexAttacker, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff, FAST_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_HOLD_LAST_FRAME)
bDoneDialogue_BeverlyThrowsPunch = FALSE // setup dialogue for punching to play
bDone_KnockOff_Biker_SwipeSoundFX = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_SETUP_ATTACK going to KBAS_RUNNING_ATTACK with ", sAnimNameBeverlyKnockOff, " +++") ENDIF #ENDIF
eKnockOffBikerAttackState = KBAS_RUNNING_ATTACK
ELSE
bDoneDialogue_BeverlyThrowsPunch = TRUE // reset the dialogue for throwing punch (true by default)
ENDIF
ENDIF
BREAK
CASE KBAS_RUNNING_ATTACK
// swing ended unsuccessfully (something went wrong since he was tasked to hold the last frame of the anim
IF NOT IS_ENTITY_PLAYING_ANIM(pedIndexAttacker, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
bStatTracker_HasBeverlyMissedWithSwing = TRUE
bDoneDialogue_BeverlyMissedKnockOffAttempt = FALSE //reset the failed knock off dialogue so it can trigger
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - Ped not playing attack anim so - KBAS_SETUP_ATTACK +++") ENDIF #ENDIF
eKnockOffBikerAttackState = KBAS_SETUP_ATTACK
ELSE
// swing ended unsuccessfully
IF HAS_ENTITY_ANIM_FINISHED(pedIndexAttacker, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
bDoneDialogue_BeverlyMissedKnockOffAttempt = FALSE //reset the failed knock off dialogue so it can trigger
bStatTracker_HasBeverlyMissedWithSwing = TRUE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - Ped attack anim finished so - KBAS_SETUP_ATTACK +++") ENDIF #ENDIF
eKnockOffBikerAttackState = KBAS_SETUP_ATTACK
ELSE
// swing anim is playing
FLOAT fCurrentAnimPhase
fCurrentAnimPhase = GET_ENTITY_ANIM_CURRENT_TIME(pedIndexAttacker, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
//constain to correct anim phase time since it can initial throw -1
IF fCurrentAnimPhase >= 0.0 AND fCurrentAnimPhase <= 1.0
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - attack anim current phase = ", fCurrentAnimPhase) ENDIF #ENDIF
FLOAT fDesiredAnimHitPhase
FLOAT fAnimPhaseDiff // Tweak 1 added 23/01/2013 so I can test fDesiredAnimHitPhase again at the end of this block for
fDesiredAnimHitPhase = ((fKnockOff_Biker_Anim_HitStartPoint + fKnockOff_Biker_Anim_HitDonePoint) / 2)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - desired hit phase =", fDesiredAnimHitPhase) ENDIF #ENDIF
//only change the speed if we haven't reached end of the hit point phase
IF fCurrentAnimPhase < fKnockOff_Biker_Anim_HitDonePoint // Tweak 1 fDesiredAnimHitPhase changed 23/01/2013 - changed because it could still land past fDesiredAnimHitPhase, so we should still try to land it Problems with below convertions then
fAnimPhaseDiff = fDesiredAnimHitPhase - fCurrentAnimPhase
// is the animation past the desired anim hit point or not? if so value will need converting from a negative
IF fCurrentAnimPhase > fDesiredAnimHitPhase
fAnimPhaseDiff = ABSF(fAnimPhaseDiff)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - desired hit phase minus the current phase = ", fDesiredAnimHitPhase) ENDIF #ENDIF
fDesiredAnimHitTime = GET_ANIM_TIME_FROM_ANIM_PHASE(fAnimPhaseDiff, fKnockOff_Biker_Anim_TotalTime, fKnockOff_Biker_UpdatedAnimSpeed)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - desired hit time =", fDesiredAnimHitTime) ENDIF #ENDIF
// track if the attack has moved ahead of the projected hit point
FLOAT fUpdatedForwardSide
fUpdatedForwardSide = GET_PED_UPDATED_FORWARD_SIDE_TO_KNOCKOFF_BIKER_ATTACK_HIT_POINT(pedIndexAttacker, vAttackerCoords, vehIndexVictim, vVictimCoords, fDesiredAnimHitTime)
// flip the results if the current anim phase is past the desired anim hit point Tweak 1 added 23/01/2013 added so i can check if the anim was past the desired hit zone
IF fCurrentAnimPhase > fDesiredAnimHitPhase
IF fUpdatedForwardSide < 0.0 // attack is behind of projected hit point
fUpdatedForwardSide = 1.0
ELIF fUpdatedForwardSide > 0.0 // attack is now ahead of projected hit point
fUpdatedForwardSide = -1.0
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - fCurrentAnimPhase > fDesiredAnimHitPhase so fUpdatedForwardSide flipped to ", fUpdatedForwardSide, " frame_count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
FLOAT fNewAnimSpeed
IF fUpdatedForwardSide < 0.0 // attack is behind of projected hit point so slow down anim
fNewAnimSpeed = fKnockOff_Biker_UpdatedAnimSpeed * 0.90
ELIF fUpdatedForwardSide > 0.0 // attack is now ahead of projected hit point so speed up anim
fNewAnimSpeed = fKnockOff_Biker_UpdatedAnimSpeed * 1.10
ELSE
fNewAnimSpeed = fKnockOff_Biker_UpdatedAnimSpeed // attacker is in line with projected hit point
ENDIF
IF fNewAnimSpeed < (fKnockOff_Biker_InitialAnimSpeed + 0.4) //only change the speed if it's with in the thresholds
AND fNewAnimSpeed > (fKnockOff_Biker_InitialAnimSpeed - 0.4)
fKnockOff_Biker_UpdatedAnimSpeed = fNewAnimSpeed
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - anim speed updated to = ", fKnockOff_Biker_UpdatedAnimSpeed) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
// set the updated anim speed
SET_ENTITY_ANIM_SPEED(pedIndexAttacker, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff, fKnockOff_Biker_UpdatedAnimSpeed)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - attack anim speed set = ", fKnockOff_Biker_UpdatedAnimSpeed) ENDIF #ENDIF
//swipe sound sfx
IF NOT bDone_KnockOff_Biker_SwipeSoundFX
IF (fCurrentAnimPhase >= fKnockOff_Biker_Anim_SwipeSFXstartPoint)
IF REQUEST_SCRIPT_AUDIO_BANK("PAPARAZZO_01_A")
PLAY_SOUND_FROM_ENTITY(iSoundId_BikeAttack_MeleeSwipe, "SWING", sBeverlyPed.ped, sPap1_SoundSetName)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - SWIPE sfx triggered +++") ENDIF #ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - SWIPE sfx not triggered, audio bank not loaded!? +++") ENDIF #ENDIF
ENDIF
bDone_KnockOff_Biker_SwipeSoundFX = TRUE
ENDIF
ENDIF
//can only successfully land the attack if the anim phase is whilst the arm is swinging out
IF (fCurrentAnimPhase >= fKnockOff_Biker_Anim_HitStartPoint)
AND (fCurrentAnimPhase <= fKnockOff_Biker_Anim_HitDonePoint)
//IF IS_PED_IN_KNOCKOFF_BIKER_ATTACK_HIT_AREA(pedIndexAttacker, vehIndexVictim)
IF IS_PED_ARM_INTERSECTING_FOR_KNOCKOFF_BIKER_ATTACK(pedIndexAttacker, sBeverlyVehicle.vehicle, vehIndexVictim, TRUE, objIndexAttackerWeapon)
BOOL bLocal_AreEntitiesHeadingCompleteOpposite
IF ARE_ENTITIES_HEADINGS_SIMILAR_OR_COMPLETE_OPPOSITE_WITHIN_THRESHOLD(pedIndexAttacker, vehIndexVictim,
KO_BIKER_EXECUTE_ATTACK_HEADING_THRESOLD, bLocal_AreEntitiesHeadingCompleteOpposite)
IF bAreEntitiesHeadingsCompleteOpposite_KO_Biker = bLocal_AreEntitiesHeadingCompleteOpposite
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - going to KBAS_SUCCESSFUL_ATTACK +++") ENDIF #ENDIF
eKnockOffBikerAttackState = KBAS_SUCCESSFUL_ATTACK
#IF IS_DEBUG_BUILD
IF bDebug_DontKnockThePedsOffTheBike
PLAY_KNOCK_OFF_BIKER_ATTACK_HIT_SOUND()
DRAW_RECT(0.2, 0.5, 0.2, 0.4, 250, 250, 250, 100)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK : ", "successful hit DEBUG don't knock off, anim phase is = ", fCurrentAnimPhase, " frame_count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
eKnockOffBikerAttackState = KBAS_RUNNING_ATTACK
EXIT
ENDIF
#ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - Attack failed as headings have completely changed +++") ENDIF #ENDIF
ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - KBAS_RUNNING_ATTACK - Attack failed as headings comparison is not withing threshold +++") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE KBAS_SUCCESSFUL_ATTACK
VECTOR vKnockoffForce
VECTOR vKnockoffForceOffset
vKnockoffForceOffset = <<0.0,0.21,0.0>>
SWITCH iKnockOff_Biker_Attack_Side
CASE KNOCKOFF_BIKER_ATTACK_SIDE_RIGHT
IF bAreEntitiesHeadingsCompleteOpposite_KO_Biker
vKnockoffForce = << 2.0, 0.0, -4.0 >>
ELSE
vKnockoffForce = << -2.0, 0.0, -4.0 >>
ENDIF
BREAK
CASE KNOCKOFF_BIKER_ATTACK_SIDE_LEFT
IF bAreEntitiesHeadingsCompleteOpposite_KO_Biker
vKnockoffForce = << 2.0, 0.0, -4.0 >>
ELSE
vKnockoffForce = << -2.0, 0.0, -4.0 >>
ENDIF
BREAK
DEFAULT
SCRIPT_ASSERT("RC - PAP 1 - invalid side for KO - iKnockOff_Biker_Attack_Side inside KBAS_SUCCESSFUL_ATTACK")
BREAK
ENDSWITCH
IF IS_PED_ON_ANY_BIKE(sRivalPapPed.ped)
IF CAN_KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
APPLY_FORCE_TO_ENTITY(sRivalPapPed.ped, APPLY_TYPE_IMPULSE, vKnockoffForce, vKnockoffForceOffset,
GET_PED_RAGDOLL_BONE_INDEX(sRivalPapPed.ped, RAGDOLL_HEAD), TRUE, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - Rival pap knocked off bike +++") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - Rival pap NOT knocked off bike CAN_KNOCK_PED_OFF_VEHICLE was FALSE +++") ENDIF #ENDIF
ENDIF
ENDIF
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
IF IS_PED_ON_ANY_BIKE(sRivalPapDriverPed.ped)
IF CAN_KNOCK_PED_OFF_VEHICLE(sRivalPapDriverPed.ped)
KNOCK_PED_OFF_VEHICLE(sRivalPapDriverPed.ped)
APPLY_FORCE_TO_ENTITY(sRivalPapDriverPed.ped, APPLY_TYPE_IMPULSE, vKnockoffForce, vKnockoffForceOffset,
GET_PED_RAGDOLL_BONE_INDEX(sRivalPapDriverPed.ped, RAGDOLL_HEAD), TRUE, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - Rival paps Driver knocked off bike +++") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - Rival pap Driver NOT knocked off bike CAN_KNOCK_PED_OFF_VEHICLE was FALSE +++") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bStatTracker_HasBeverlyMissedWithSwing
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(PAP1_TAKEN_OUT_IN_ONE_SWING)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "+++ MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK - Rival paps knocked off bike, going to - KBAS_CLEANUP_ATTACK +++") ENDIF #ENDIF
eKnockOffBikerAttackState = KBAS_CLEANUP_ATTACK
BREAK
CASE KBAS_CLEANUP_ATTACK
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles updating rival pap's anims after taking photos
PROC UPDATE_RIVAL_PAP_ANIMS_AFTER_PHOTOS()
IF IS_PED_UNINJURED(sRivalPapPed.ped)
// make sure idle anim is reapplyed
IF IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap")
IF HAS_ENTITY_ANIM_FINISHED(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap")
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_RIVAL_PAP_ANIMS_AFTER_PHOTOS : applied idle from gesture_behind_left_pap") ENDIF #ENDIF
ELSE
SET_ENTITY_ANIM_SPEED(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap", 1.25)
ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap")
IF HAS_ENTITY_ANIM_FINISHED(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap")
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_RIVAL_PAP_ANIMS_AFTER_PHOTOS : applied idle from gesture_behind_right_pap") ENDIF #ENDIF
ELSE
SET_ENTITY_ANIM_SPEED(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap", 1.25)
ENDIF
ELIF NOT IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) // | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_RIVAL_PAP_ANIMS_AFTER_PHOTOS : applied idle as it wasn't playing!") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the rival pap joining the uber rocording and driving behaviour when the recording ends
PROC UPDATE_RIVAL_PAP_ON_BIKE()
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
AND IS_PED_UNINJURED(sRivalPapDriverPed.ped)
AND IS_PED_SITTING_IN_VEHICLE(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle)
AND IS_PED_UNINJURED(sRivalPapPed.ped)
AND IS_PED_SITTING_IN_VEHICLE(sRivalPapPed.ped, sRivalPapVehicle.vehicle)
SWITCH eRivalPapOnBikeProgress
CASE PAP1_RIVAL_PAP_ON_BIKE_TRIGGER_JOIN_CHASE
IF fCurrentPlaybackTime >= UBER_PLAYBACK_TIME_FOR_TRIGGER_RIVAL_PAP_RECORDING
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle, 1, "Pap1RP")
SET_PLAYBACK_SPEED(sRivalPapVehicle.vehicle, fMainPlaybackSpeed)
MANAGE_RIVAL_TAKING_PHOTOS(fTimeInRivalPapRecording)
vPathNodeRequestStartPosition = << 0.0, 0.0, 0.0 >> // reset so the new request can be setup in PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA
eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_TRIGGER_JOIN_CHASE done") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
SET_PLAYBACK_SPEED(sRivalPapVehicle.vehicle, fMainPlaybackSpeed)
fTimeInRivalPapRecording = GET_TIME_POSITION_IN_RECORDING(sRivalPapVehicle.vehicle)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RIVAL PAP playback time = ", fTimeInRivalPapRecording) ENDIF #ENDIF
MANAGE_RIVAL_TAKING_PHOTOS(fTimeInRivalPapRecording)
IF fTimeInRivalPapRecording > PAP1_RIVAL_PAP_END_RECORDING_POINT //just before end
PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vPathNodeRequestStartPosition, vRivalPapDriver_InitialFleeDrivePoint, vPathNodeRequestMin, vPathNodeRequestMax)
IF PAP1_ARE_REQUEST_PATH_NODES_LOADED_IN_AREA(vPathNodeRequestMin, vPathNodeRequestMax)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle)
ENDIF
REMOVE_VEHICLE_RECORDING(1, "pap1RP")
MODIFY_VEHICLE_TOP_SPEED(sRivalPapVehicle.vehicle, BIKE_TOP_SPEED_MODIFIER) //match beverly's vehicle top speed
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_RIVAL_PAP_ON_BIKE - RIVAL PAP BIKE TOP SPEED MODIFY SET") ENDIF #ENDIF
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
MODIFY_VEHICLE_TOP_SPEED(sBeverlyVehicle.vehicle, 0.0) //RESET ped'S BIKE TOP SPEED MODIFIER
ENDIF
//remove camera flash assets at this point
REMOVE_PTFX_ASSET()
RELEASE_NAMED_SCRIPT_AUDIO_BANK(sPap1_AudioBank_CameraFlashSoundFX)
TASK_VEHICLE_MISSION_COORS_TARGET(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle, vRivalPapDriver_InitialFleeDrivePoint, MISSION_GOTO, fRivalBikeSpeed, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_UseStringPullingAtJunctions, -1, -1) // B*1533294 - DF_UseStringPullingAtJunctions
SET_PED_KEEP_TASK(sRivalPapDriverPed.ped, TRUE)
iDialogueTimer_RivalPapAmbientLines = GET_GAME_TIMER()
iTimerDelay_RivalPapGestureAnim = GET_GAME_TIMER()
IF NOT bDoneRivalPapRemovedFromDialogue
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // take rival pap out of dialogue struct so he can use ambient trigger dialogue during knock off stage
bDoneRivalPapRemovedFromDialogue = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA - bDoneRivalPapRemovedFromDialogue = TRUE") ENDIF #ENDIF
ENDIF
eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_GO_TO_INITIAL_FLEE_POSITION
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA done - recording stopped early by me") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA - waiting on path nodes to load for early exit") ENDIF #ENDIF
ENDIF
// begin requesting the path nodes for the pap drive task
ELIF (fTimeInRivalPapRecording > (PAP1_RIVAL_PAP_END_RECORDING_POINT - 6000.0))
IF ARE_VECTORS_ALMOST_EQUAL(vPathNodeRequestStartPosition, << 0.0, 0.0, 0.0 >>)
vPathNodeRequestStartPosition = GET_ENTITY_COORDS(sRivalPapVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - set vPathNodeRequestStartPosition for path node loading ", vPathNodeRequestStartPosition)
ENDIF
PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vPathNodeRequestStartPosition, vRivalPapDriver_InitialFleeDrivePoint, vPathNodeRequestMin, vPathNodeRequestMax)
ENDIF
ELSE
IF ARE_VECTORS_ALMOST_EQUAL(vPathNodeRequestStartPosition, << 0.0, 0.0, 0.0 >>)
vPathNodeRequestStartPosition = GET_ENTITY_COORDS(sRivalPapVehicle.vehicle)
ENDIF
PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vPathNodeRequestStartPosition, vRivalPapDriver_InitialFleeDrivePoint, vPathNodeRequestMin, vPathNodeRequestMax)
IF PAP1_ARE_REQUEST_PATH_NODES_LOADED_IN_AREA(vPathNodeRequestMin, vPathNodeRequestMax)
REMOVE_VEHICLE_RECORDING(1, "pap1RP")
MODIFY_VEHICLE_TOP_SPEED(sRivalPapVehicle.vehicle, BIKE_TOP_SPEED_MODIFIER) //match beverly's vehicle top speed
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_RIVAL_PAP_ON_BIKE - RIVAL PAP BIKE TOP SPEED MODIFY SET") ENDIF #ENDIF
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
MODIFY_VEHICLE_TOP_SPEED(sBeverlyVehicle.vehicle, 0.0) //RESET ped'S BIKE TOP SPEED MODIFIER
ENDIF
//remove camera flash assets at this point
REMOVE_PTFX_ASSET()
RELEASE_NAMED_SCRIPT_AUDIO_BANK(sPap1_AudioBank_CameraFlashSoundFX)
TASK_VEHICLE_MISSION_COORS_TARGET(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle, vRivalPapDriver_InitialFleeDrivePoint, MISSION_GOTO, fRivalBikeSpeed, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_UseStringPullingAtJunctions, -1, -1) // B*1533294 - DF_UseStringPullingAtJunctions
SET_PED_KEEP_TASK(sRivalPapDriverPed.ped, TRUE)
iDialogueTimer_RivalPapAmbientLines = GET_GAME_TIMER()
iTimerDelay_RivalPapGestureAnim = GET_GAME_TIMER()
IF NOT bDoneRivalPapRemovedFromDialogue
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // take rival pap out of dialogue struct so he can use ambient trigger dialogue during knock off stage
bDoneRivalPapRemovedFromDialogue = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA - bDoneRivalPapRemovedFromDialogue = TRUE") ENDIF #ENDIF
ENDIF
eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_GO_TO_INITIAL_FLEE_POSITION
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA done - recording ended unexpectedly (probably by uber recording ending") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA - waiting on path nodes to load for recording ended (robably by uber recording ending") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_RIVAL_PAP_ON_BIKE_GO_TO_INITIAL_FLEE_POSITION
IF IsPedPerformingTask(sRivalPapDriverPed.ped, SCRIPT_TASK_VEHICLE_MISSION)
// need to request the path nodes each frame
//PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vPathNodeRequestStartPosition, vRivalPapDriver_InitialFleeDrivePoint, vPathNodeRequestMin, vPathNodeRequestMax)
//IF NOT PAP1_ARE_REQUEST_PATH_NODES_LOADED_IN_AREA(vPathNodeRequestMin, vPathNodeRequestMax)
// TASK_VEHICLE_DRIVE_WANDER(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle, fRivalBikeSpeed, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_UseStringPullingAtJunctions) // B*1533294 - DF_UseStringPullingAtJunctions
// eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_WANDER_BEHAVIOUR
// #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_GO_TO_INITIAL_FLEE_POSITION path node not loaded so quit early") ENDIF #ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(sRivalPapDriverPed.ped, vRivalPapDriver_InitialFleeDrivePoint, 65.0)
TASK_VEHICLE_DRIVE_WANDER(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle, fRivalBikeSpeed, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_UseStringPullingAtJunctions) // B*1533294 - DF_UseStringPullingAtJunctions
eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_WANDER_BEHAVIOUR
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_GO_TO_INITIAL_FLEE_POSITION done") ENDIF #ENDIF
ENDIF
ELSE
TASK_VEHICLE_DRIVE_WANDER(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle, fRivalBikeSpeed, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_UseStringPullingAtJunctions) // B*1533294 - DF_UseStringPullingAtJunctions
eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_WANDER_BEHAVIOUR
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_GO_TO_INITIAL_FLEE_POSITION done - TASK_VEHICLE_MISSION_COORS_TARGET task ended unexpectedly") ENDIF #ENDIF
ENDIF
MONITOR_RIVAL_PAP_CHASE_SPEED()
IF fDistance_PlayerToRivalPap < 22.0
IF HAS_TIME_PASSED(iTimerDelay_RivalPapGestureAnim, GET_RANDOM_INT_IN_RANGE(6000, 10000))
IF fDistance_PlayerToRivalPap > 4.0 // don't do the gesture if the player is closing in for the knock off
IF SET_RIVAL_PAP_PLAY_GESTURE_ANIM()
iTimerDelay_RivalPapGestureAnim = GET_GAME_TIMER()
IF HAS_TIME_PASSED(iDialogueTimer_RivalPapAmbientLines, 500)
IF PLAY_RIVAL_PAP_AMBIENT_DIALOGUE_LINE()
iDialogueTimer_RivalPapAmbientLines = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_TIME_PASSED(iDialogueTimer_RivalPapAmbientLines, GET_RANDOM_INT_IN_RANGE(3000, 5000))
IF PLAY_RIVAL_PAP_AMBIENT_DIALOGUE_LINE()
iDialogueTimer_RivalPapAmbientLines = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
UPDATE_RIVAL_PAP_ANIMS_AFTER_PHOTOS()
BREAK
CASE PAP1_RIVAL_PAP_ON_BIKE_WANDER_BEHAVIOUR
IF NOT IsPedPerformingTask(sRivalPapDriverPed.ped, SCRIPT_TASK_VEHICLE_DRIVE_WANDER)
TASK_VEHICLE_DRIVE_WANDER(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle, fRivalBikeSpeed, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_UseStringPullingAtJunctions) // B*1533294 - DF_UseStringPullingAtJunctions
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - PAP1_RIVAL_PAP_ON_BIKE_WANDER_BEHAVIOUR reapplied - TASK_VEHICLE_DRIVE_WANDER") ENDIF #ENDIF
ENDIF
MONITOR_RIVAL_PAP_CHASE_SPEED()
IF fDistance_PlayerToRivalPap < 22.0
IF HAS_TIME_PASSED(iTimerDelay_RivalPapGestureAnim, GET_RANDOM_INT_IN_RANGE(6000, 10000))
IF fDistance_PlayerToRivalPap > 4.0 // don't do the gesture if the player is closing in for the knock off
IF SET_RIVAL_PAP_PLAY_GESTURE_ANIM()
iTimerDelay_RivalPapGestureAnim = GET_GAME_TIMER()
IF HAS_TIME_PASSED(iDialogueTimer_RivalPapAmbientLines, 500)
IF PLAY_RIVAL_PAP_AMBIENT_DIALOGUE_LINE()
iDialogueTimer_RivalPapAmbientLines = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_TIME_PASSED(iDialogueTimer_RivalPapAmbientLines, GET_RANDOM_INT_IN_RANGE(3000, 5000))
IF PLAY_RIVAL_PAP_AMBIENT_DIALOGUE_LINE()
iDialogueTimer_RivalPapAmbientLines = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
UPDATE_RIVAL_PAP_ANIMS_AFTER_PHOTOS()
BREAK
ENDSWITCH
ELSE
IF eRivalPapOnBikeProgress <> PAP1_RIVAL_PAP_ON_BIKE_CLEANUP
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle)
ENDIF
MODIFY_VEHICLE_TOP_SPEED(sRivalPapVehicle.vehicle, BIKE_TOP_SPEED_MODIFIER) //match beverly's vehicle top speed
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RIVAL PAP BIKE TOP SPEED MODIFY SET") ENDIF #ENDIF
ENDIF
REMOVE_VEHICLE_RECORDING(1, "pap1RP")
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
MODIFY_VEHICLE_TOP_SPEED(sBeverlyVehicle.vehicle, 0.0) //RESET ped'S BIKE TOP SPEED MODIFIER
ENDIF
IF IS_PED_UNINJURED(sRivalPapPed.ped)
IF IS_AMBIENT_SPEECH_PLAYING(sRivalPapPed.ped)
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(sRivalPapPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_RIVAL_PAP_ON_BIKE - cleanup set stopped rival pap ambient speech") ENDIF #ENDIF
ENDIF
ENDIF
//remove camera flash assets at this point
REMOVE_PTFX_ASSET()
RELEASE_NAMED_SCRIPT_AUDIO_BANK(sPap1_AudioBank_CameraFlashSoundFX)
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
AND IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
AND IS_PED_SITTING_IN_VEHICLE(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle)
TASK_VEHICLE_DRIVE_WANDER(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle, 55.0, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_UseStringPullingAtJunctions) // B*1533294 - DF_UseStringPullingAtJunctions
SET_PED_KEEP_TASK(sRivalPapDriverPed.ped, TRUE)
ENDIF
eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "eRivalPapOnBikeProgress - set PAP1_RIVAL_PAP_ON_BIKE_CLEANUP") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Make the rival pap's driver behaviour when he's been knocked off the bike
PROC SET_RIVAL_PAP_DRIVER_INJURED_WHEN_OFF_THE_BIKE()
IF NOT bDoneSetupRivalPapDriverToActInjured
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapDriverPed.ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRivalPapDriverPed.ped, FALSE)
IF (GET_ENTITY_HEALTH(sRivalPapDriverPed.ped) > 50)
SET_ENTITY_HEALTH(sRivalPapDriverPed.ped, 50)
ENDIF
SET_PED_INJURED_ON_GROUND_BEHAVIOUR(sRivalPapDriverPed.ped, 30000)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "** Rival pap driver set to injured behaviour on the ground **") ENDIF #ENDIF
bDoneSetupRivalPapDriverToActInjured = TRUE
ENDIF
ELSE
bDoneSetupRivalPapDriverToActInjured = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handle the rival pap's behaviour when he's been knocked off the bike
PROC UPDATE_RIVAL_PAP_BEHAVIOUR_AFTER_CRASH()
IF IS_PED_UNINJURED(sRivalPapPed.ped)
IF NOT bDoneRivalPapSurrendered
//Setup rival pap's flee behaviour when he falls off the bike
IF NOT bDoneRivalPapFlee
IF IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap")
STOP_ANIM_TASK(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_left_pap")
ELIF IS_ENTITY_PLAYING_ANIM(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap")
STOP_ANIM_TASK(sRivalPapPed.ped, sAnimDictName_Pap1Specific, "gesture_behind_right_pap")
ENDIF
IF NOT IS_PED_RAGDOLL(sRivalPapPed.ped) //added to stop is ped touching ped firing straight away when the rival pap is off his bike
CLEAR_PED_TASKS(sRivalPapPed.ped)
SET_PED_COMBAT_MOVEMENT(sRivalPapPed.ped, CM_WILLRETREAT)
SET_PED_FLEE_ATTRIBUTES(sRivalPapPed.ped, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sRivalPapPed.ped, FA_USE_VEHICLE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sRivalPapPed.ped, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sRivalPapPed.ped, CA_ALWAYS_FIGHT, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sRivalPapPed.ped, CA_ALWAYS_FLEE, TRUE)
SET_PED_CAN_BE_TARGETTED(sRivalPapPed.ped, TRUE)
SET_PED_AS_ENEMY(sRivalPapPed.ped, TRUE) // B*1535622 - makes sure HUD elements are set for enemy ped
IF (GET_ENTITY_HEALTH(sRivalPapPed.ped) >= 137) // fatigued threshold (now 137.5) set lower to get different flee anims
SET_ENTITY_HEALTH(sRivalPapPed.ped, 136)
ENDIF
// health lowering doesn't work on it's own - having to use clipset
REQUEST_ANIM_DICT(tlRivalPapInjuredAnims)
IF HAS_ANIM_DICT_LOADED(tlRivalPapInjuredAnims)
SET_PED_ALTERNATE_MOVEMENT_ANIM(sRivalPapPed.ped, AAT_IDLE, tlRivalPapInjuredAnims, "idle")
SET_PED_ALTERNATE_MOVEMENT_ANIM(sRivalPapPed.ped, AAT_WALK, tlRivalPapInjuredAnims, "walk")
SET_PED_ALTERNATE_MOVEMENT_ANIM(sRivalPapPed.ped, AAT_RUN, tlRivalPapInjuredAnims, "run")
CPRINTLN(DEBUG_MISSION, "UPDATE_RIVAL_PAP_BEHAVIOUR_AFTER_CRASH - set rival pap alt move anims for injured : FC = ", GET_FRAME_COUNT())
ENDIF
SET_PED_MAX_MOVE_BLEND_RATIO(sRivalPapPed.ped, PEDMOVEBLENDRATIO_RUN)
//TASK_SMART_FLEE_PED(sRivalPapPed.ped, PLAYER_PED_ID(), 75.0, -1, TRUE)
TASK_REACT_AND_FLEE_PED(sRivalPapPed.ped, PLAYER_PED_ID()) // B*1508246 - having to set this because TASK_SMART_FLEE_PED can't calculate his route quickly unless really low, but once he reaches the dist he stops which looks crap
SET_PED_KEEP_TASK(sRivalPapPed.ped, TRUE)
iDialogueTimer_ChasingRivalPaparazzi = GET_GAME_TIMER() // set for use with random lines "PAP1_RIVLINE
bDoneRivalPapFlee = TRUE
ENDIF
ELSE
SET_PED_MAX_MOVE_BLEND_RATIO(sRivalPapPed.ped, PEDMOVEBLENDRATIO_RUN) // see B*1071719 - need to be called each frame otherwise it resets.
//Extra dialogue if the player is still around as rival pap flees
IF iDialogueLines_RivalPapCameraWrecked < 6
IF IS_ENTITY_IN_RANGE_COORDS(sRivalPapPed.ped, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 25.0)
IF NOT IS_AMBIENT_SPEECH_PLAYING(sRivalPapPed.ped)
IF NOT IS_PED_RAGDOLL(sRivalPapPed.ped)
INT iTimeDelay = 750
IF iDialogueLines_RivalPapCameraWrecked > 0
GET_RANDOM_INT_IN_RANGE(2500, 4000)
ENDIF
IF HAS_TIME_PASSED(iDialogueTimer_ChasingRivalPaparazzi, iTimeDelay)
//make sure removed for dialogue struct for ambient dialogue
IF NOT bDoneRivalPapRemovedFromDialogue
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // "RIVALPAP"
bDoneRivalPapRemovedFromDialogue = TRUE
ENDIF
//code generate the variation when using PLAY_PED_AMBIENT_SPEECH_WITH_VOICE so just pass in the context - "PAP1_RIVLINE"
PAP1_PLAY_TRIGGER_AMBIENT_SPEECH(sRivalPapPed.ped, "PAP1_DQAA", "Paparazzo1RivalPap", SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL) // B*1380212 - request to switch speech param from SPEECH_PARAMS_SHOUTED
// You're a disgrace to the industry!
// I'll make sure you never work in this town again!
// Sabotage, that's all you've got! You're pathetic!
// Everyone in Vinewood knows you're a joke!
// Get the fuck away from me, I'm done with you.
// You're a failure. I made six figures last year!
CPRINTLN(DEBUG_MISSION, "UPDATE_RIVAL_PAP_BEHAVIOUR_AFTER_CRASH - triggered rival pap ambient flee speech : PAP1_RIVLINE aka PAP1_DQAA : FC = ", GET_FRAME_COUNT())
IF NOT IS_PED_HEADTRACKING_PED(sRivalPapPed.ped, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sRivalPapPed.ped, PLAYER_PED_ID(), 3000)
ENDIF
iDialogueTimer_ChasingRivalPaparazzi = GET_GAME_TIMER() // set for use with random lines "PAP1_RIVLINE
iDialogueLines_RivalPapCameraWrecked++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles Beverly dialogue during rival pap chase player, setup in D* as random dialogue
PROC MANAGE_ADDITIONAL_DIALOGUE_FOR_CHASING_RIVAL_PAP()
// Beverly throws a punch
IF NOT bDoneDialogue_BeverlyThrowsPunch
// extra check to make sure we don't cancel the dialogue for this if it's already on going
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_PUNCH")
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_RPAP05") // cancel this if the missed attempt dialogue has already kicked in
bDoneDialogue_BeverlyThrowsPunch = TRUE
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_PUNCH", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Hack! Hack! Hack! You hack!
// You filthy panty sniffer!
// Die you sick bastard!
// You're scum! Scum!
bDoneDialogue_BeverlyThrowsPunch = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bDoneDialogue_BeverlyMissedKnockOffAttempt // bool set in
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_PUNCH") // wait for the punch dialogue to playout first
// extra check to make sure we don't cancel the dialogue for this if it's already on going
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_RPAP05")
bDoneDialogue_BeverlyMissedKnockOffAttempt = TRUE
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NOT bDoneDialogue_BeverlyMissedKnockOffAttempt
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RPAP05", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Damn, missed him.
// Nearly!
// Next time, Madison, I swear!
// So close!
// Slippery son of a bitch.
// Come on!
// Are you kidding me?
// You backstabbing shit!
bDoneDialogue_BeverlyMissedKnockOffAttempt = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bDoneDialogue_PlayerPullsWheelie
// currently the only thing remotely close to a is_bike_pulling_wheelie check, potentially use with IS_ENTITY_IN_AIR()
// but in this instance i think the dialogue will work with airbourne as well
IF NOT IS_VEHICLE_ON_ALL_WHEELS(sBeverlyVehicle.vehicle)
IF HAS_TIME_PASSED(iTimer_BeverlyBikeNotOnAllWheelsTimer, 500) //make sure player has been pulling wheelie for a decent chunk of time
// random dialogue, so only one line will be selected
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_PPW1", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Christ, you're gonna kill us.
// You're a fucking lunatic.
// Are you trying to give me a heart attack?
// Is that supposed to impress me?
bDoneDialogue_PlayerPullsWheelie = TRUE
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this so Franklin can't respond to this one
iDialogueTimer_TakingLongTimeToReachDropOffPoint = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
iTimer_BeverlyBikeNotOnAllWheelsTimer = GET_GAME_TIMER()
ENDIF
ELSE
// reset the dialogue bool once the current conversation has finished
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_PPW1")
AND IS_VEHICLE_ON_ALL_WHEELS(sBeverlyVehicle.vehicle)
bDoneDialogue_PlayerPullsWheelie = FALSE
iTimer_BeverlyBikeNotOnAllWheelsTimer = GET_GAME_TIMER()
ENDIF
ENDIF
// Franklin crashes the bike
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_CRASH")
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(sBeverlyVehicle.vehicle)
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
AND NOT IS_ENTITY_TOUCHING_ENTITY(sRivalPapVehicle.vehicle, sBeverlyVehicle.vehicle)
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//ENDIF
// random selected lines
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CRASH", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// You idiot!
// For Christ's sake!
// Are you blind?
// Can't you drive!?
// Is it that hard?
// No! You moron!
// You have gotta be kidding me!
bDoneDialogue_FranklinRespondToBeverlyBerating = FALSE // reset this so Franklin can respond
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING RIVAL PAP - crash biek dialogue triggered - PAP1_CRASH") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer_ChasingRivalPaparazzi = GET_GAME_TIMER()
ELSE
IF NOT bDoneDialogue_FranklinRespondToBeverlyBerating // reset this to ensure Franklin doesn't say something straight away
IF (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RESP", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Yeah, yeah, I got it.
// Maybe if you shut up for a second.
// What do you think I'm doin'?
// Fuck, I know, I'm tryin'!
// Are you always this annoying?
// I get the idea, homie.
// You really ain't helpin'.
// We might do better if you shut the fuck up.
// I heard you the first time.
iDialogueTimer_ChasingRivalPaparazzi = GET_GAME_TIMER()
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LCHASING RIVAL PAP - Franklin Response dialogue triggered - PAP1_RESP") ENDIF #ENDIF
ENDIF
ELSE
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // bypass response if we are out range of each other
ENDIF
ELSE
// Franklin drives into a ped
IF (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) >= 0) // looks to be initially set to -1 so need to check from 0
AND (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) < 500)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_HITPED", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// It's okay, they're fine.
// That's it, no prisoners!
// Collateral damage, don't worry about it.
// Good, if they get in the way, take them down!
// Move next time!
iDialogueTimer_ChasingRivalPaparazzi = GET_GAME_TIMER()
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING RIVAL PAP - drove into ped dialogue - PAP1_HITPED") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF (GET_GAME_TIMER() - iDialogueTimer_ChasingRivalPaparazzi > (TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE + GET_RANDOM_INT_IN_RANGE(1, 2500)))
//different dialogue depending on how far away from the rival pap we are
IF (fDistance_PlayerToRivalPap < DIST_LIMIT_PLAYER_CLOSE_DIST_TO_RIVAL_PAP_IN_CHASE)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RIVAL", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING RIVAL PAP CLOSE DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
iDialogueTimer_ChasingRivalPaparazzi = GET_GAME_TIMER()
// I saw her first!
// This crusty old boot is mine!
// Have some professional courtesy!
// Vultures! All of you! She's an angel!
// I'll slit your throat, Madison!
// Have some self-respect!
// How do you sleep at night!?
ENDIF
ELIF (fDistance_PlayerToRivalPap < DIST_LIMIT_PLAYER_MEDIUM_DIST_TO_RIVAL_PAP_IN_CHASE)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RPAP08", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING RIVAL PAP MEDIUM DIST DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
iDialogueTimer_ChasingRivalPaparazzi = GET_GAME_TIMER()
// Get me in close and I'll drag him off!
// Get alongside them!
// Go in closer so I can reach across.
// Let's get right up in his face!
// How can I bitchslap him from here?
// Come on, I wanna look that bastard in the eye!
IF (GET_RANDOM_INT_IN_RANGE(0,2) = 0)
bDoneDialogue_FranklinRespondToBeverlyBerating = FALSE // make Franklin respond every now and then
ENDIF
ENDIF
ELSE
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RPAP07", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASING RIVAL PAP FAR DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
iDialogueTimer_ChasingRivalPaparazzi = GET_GAME_TIMER()
// He's not taking my glory, not again!
// He's getting away, come on!
// Come on, can't you go any faster!?
// Whatever you do, don't lose them.
// Crank the gas, come on!
IF IS_ENTITY_ALIVE(sRivalPapPed.ped)
IF (GET_RANDOM_INT_IN_RANGE(0, 3) < 2) // 66% chance of playing the anim
SET_BEVERLY_PLAY_HURRY_UP_ANIM_TOWARDS_ENTITY(sRivalPapPed.ped)
ENDIF
ENDIF
IF (GET_RANDOM_INT_IN_RANGE(0,2) = 0)
bDoneDialogue_FranklinRespondToBeverlyBerating = FALSE // make Franklin respond every now and then
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles triggering the relevant convo for rival pap being knocked off his bike
/// RETURNS:
/// TRUE if convo was triggered
FUNC BOOL TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION()
// retrigger from specific line if it was paused
IF bPausedDialogue_DropOffBeverly
IF PAP1_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, tlDialogueRoot_CameraDestroyed, tlPausedDialogue_DropOffBeverly, CONV_PRIORITY_MEDIUM)
bPausedDialogue_DropOffBeverly = FALSE // reset flag
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION : restarted convo from specific line : ", tlPausedDialogue_DropOffBeverly) ENDIF #ENDIF
RETURN TRUE
ENDIF
ELSE
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_PUNCH") // wait for the punch dialogue to playout first
//ALTERNATIVE CONVO - if Beverly failed to take any photos, or if he Bev didn't knock him off, or if the player shoot him off
// Bev didn't perform the attack which knocked him off
IF eKnockOffBikerAttackState <> KBAS_CLEANUP_ATTACK
IF IS_PED_UNINJURED(sRivalPapPed.ped) // B* 1349592 - ensure pap is dead since new dialogue references him as killed
bHasPlayerShotRivalPapOffBike = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION : bHasPlayerShotRivalPapOffBike = FALSE rival pap still alive") ENDIF #ENDIF
ENDIF
// player killed him / shot him off
IF bHasPlayerShotRivalPapOffBike
tlDialogueRoot_CameraDestroyed = "PAP1_URP03"
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, tlDialogueRoot_CameraDestroyed, CONV_PRIORITY_MEDIUM)
// Jesus, you didn't have to kill the guy!
// This is from the fool tryin' to punch him off a moving motorbike.
// Well, it's done now. A terrible accident, but life must go on.
// And I'm already late for my next stake-out. Let's get the hell out of here.
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION : return TRUE player kill convo : ", tlDialogueRoot_CameraDestroyed) ENDIF #ENDIF
RETURN TRUE
ENDIF
ELSE
// he fell off due to crash
tlDialogueRoot_CameraDestroyed = "PAP1_URP02"
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, tlDialogueRoot_CameraDestroyed, CONV_PRIORITY_MEDIUM)
// He fell off! What an amateur.
// Uh-oh! Looks like you wrecked your camera, Madison!
// Okay, buddy, let's get out of here. I'm already late for another stakeout.
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION : return TRUE fell off in crash convo : ", tlDialogueRoot_CameraDestroyed) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ELIF iGoodPhotosTakenCounter = -1
//failed to take any photos dialogue
tlDialogueRoot_CameraDestroyed = "PAP1_URP01"
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, tlDialogueRoot_CameraDestroyed, CONV_PRIORITY_MEDIUM)
// Yeah, I downloaded your photos to the fucking road, Madison! Now grow up and get a boy's name!
// This way neither of us got any photos. It's only fair.
// Okay, buddy, let's get out of here. I'm already late for another stake-out.
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION : return TRUE no photos taken convo : ", tlDialogueRoot_CameraDestroyed) ENDIF #ENDIF
RETURN TRUE
ENDIF
ELSE
//successful took some photos dialogue
tlDialogueRoot_CameraDestroyed = "PAP1_RPAP04"
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, tlDialogueRoot_CameraDestroyed, CONV_PRIORITY_MEDIUM)
// Yeah, I downloaded your photos to the fucking road, Madison! Now grow up and get a boy's name!
// Okay, buddy, let's get out of here. I'm already late for another stake-out.
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION : return TRUE successful photos taken convo : ", tlDialogueRoot_CameraDestroyed) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// handles cleanup of Beverly's animations whilst on foot
PROC MANAGE_CLEANUP_OF_BEVERLY_ON_FOOT_ANIMATIONS()
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
OR IS_PED_RAGDOLL(sBeverlyPed.ped)
OR IS_ENTITY_IN_WATER(sBeverlyPed.ped)
OR IS_PED_GETTING_UP(sBeverlyPed.ped)
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn)
STOP_ANIM_TASK(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLEANUP_OF_BEVERLY_ON_FOOT_ANIMATIONS - stopped anim due to ragdoll/water/ get in vehicle") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle") //default on bike anim
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLEANUP_OF_BEVERLY_ON_FOOT_ANIMATIONS - stopped idle anim due to ragdoll/water/ get in vehicle") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// cleanup beverly on bike anims
/// NOTE: doesn't check Beverly is off the bike or that the entities are alive
PROC CLEANUP_BEVERLY_ON_BIKE_ANIMS(FLOAT fBlendOutTime = FAST_BLEND_OUT)
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", fBlendOutTime)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_BEVERLY_ON_BIKE_ANIMS : anim stopped BEVERLY idle ", fBlendOutTime, " not sat on bike- FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap") //remove chat on bike anim when convo is finished
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap", fBlendOutTime)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_BEVERLY_ON_BIKE_ANIMS : anim stopped BEVERLY dialog_pap ", fBlendOutTime, " - not sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap") // don't clear the catch up anims
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap", fBlendOutTime)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_BEVERLY_ON_BIKE_ANIMS : anim stopped BEVERLY hurry_up_left_pap ", fBlendOutTime, " - not sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap", fBlendOutTime)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_BEVERLY_ON_BIKE_ANIMS : anim stopped BEVERLY hurry_up_right_pap ", fBlendOutTime, " - not sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint, fBlendOutTime)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_BEVERLY_ON_BIKE_ANIMS : anim stopped BEVERLY tlAnimName_BeverlyPoint", fBlendOutTime, " not sat on bike- FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// set Beverly to be part of player's group
/// NOTE: doesn't check Bev exists or is uninjured
PROC SET_BEVERLY_FOLLOW_PLAYER()
IF NOT IS_PED_GROUP_MEMBER(sBeverlyPed.ped, GET_PLAYER_GROUP(PLAYER_ID()))
SET_PED_AS_GROUP_MEMBER(sBeverlyPed.ped, GET_PLAYER_GROUP(PLAYER_ID()))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_FOLLOW_BEVERLY : set as group memeber") ENDIF #ENDIF
ENDIF
IF IS_PED_IN_GROUP(sBeverlyPed.ped)
SET_PED_CONFIG_FLAG(sBeverlyPed.ped, PCF_DontEnterVehiclesInPlayersGroup, TRUE) //used to control which vehicles the ped will get into
SET_GROUP_FORMATION(GET_PLAYER_GROUP(PLAYER_ID()), FORMATION_LOOSE)
SET_GROUP_FORMATION_SPACING(GET_PLAYER_GROUP(PLAYER_ID()), 1.5)
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(sBeverlyPed.ped, VS_FRONT_RIGHT)
CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_FOLLOW_BEVERLY : done : formation setting 1.5 *")
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_BEVERLY_FOLLOW_BEVERLY : failed Bev not in a group!") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles Beverly being tasked to get on his bike
/// uses specific anim overrides
PROC TASK_BEVERLY_TO_GET_ON_HIS_BIKE()
BOOL bUseLeftEntry = TRUE
ENTER_EXIT_VEHICLE_FLAGS iEnterFlags = ECF_USE_LEFT_ENTRY
IF (GET_SIDE_COORDS_IS_TO_ENTITY(sBeverlyVehicle.vehicle, GET_ENTITY_COORDS(sBeverlyVehicle.vehicle, FALSE), GET_ENTITY_COORDS(sBeverlyPed.ped, FALSE)) = 1)
bUseLeftEntry = FALSE
iEnterFlags = ECF_USE_RIGHT_ENTRY
ENDIF
// attempt to enter the prefered side
IF IS_ENTRY_POINT_FOR_SEAT_CLEAR(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT, TRUE, bUseLeftEntry)
REQUEST_CLIP_SET(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(bUseLeftEntry))
IF HAS_ANIM_SET_LOADED(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(bUseLeftEntry))
TASK_ENTER_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, iEnterFlags, GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(bUseLeftEntry))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TASK_BEVERLY_TO_GET_ON_HIS_BIKE set 1st choice bUseLeftEntry = ", bUseLeftEntry, " : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TASK_BEVERLY_TO_GET_ON_HIS_BIKE failed clipset not loaded 1st choice bUseLeftEntry = ", bUseLeftEntry, " : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
// back up attempt to enter from opposite side
IF bUseLeftEntry
bUseLeftEntry = FALSE
iEnterFlags = ECF_USE_RIGHT_ENTRY
ELSE
bUseLeftEntry = TRUE
iEnterFlags = ECF_USE_LEFT_ENTRY
ENDIF
IF IS_ENTRY_POINT_FOR_SEAT_CLEAR(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT, TRUE, bUseLeftEntry)
REQUEST_CLIP_SET(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(bUseLeftEntry))
IF HAS_ANIM_SET_LOADED(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(bUseLeftEntry))
TASK_ENTER_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, iEnterFlags, GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(bUseLeftEntry))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TASK_BEVERLY_TO_GET_ON_HIS_BIKE set 2nd choice bUseLeftEntry = ", bUseLeftEntry, " : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TASK_BEVERLY_TO_GET_ON_HIS_BIKE failed clipset not loaded 2nd choice bUseLeftEntry = ", bUseLeftEntry, " : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles Bevrly turning to face the player and playing a frustrated anim
/// NOTE: doesn't check Bev exists or is uninjured
PROC UPDATE_BEVERLY_PLAY_FRUSTRATED_ON_FOOT_ANIM(BOOL bForceThisFrame = FALSE)
IF NOT IS_ENTITY_IN_WATER(sBeverlyPed.ped)
AND NOT IS_PED_RAGDOLL(sBeverlyPed.ped)
AND NOT IS_PED_GETTING_UP(sBeverlyPed.ped)
AND IS_PED_ON_FOOT(sBeverlyPed.ped)
//play a frustrated anim that the player has left him
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn)
IF NOT IS_PED_FACING_PED(sBeverlyPed.ped, PLAYER_PED_ID(), 45.0)
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
TASK_TURN_PED_TO_FACE_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1)
ENDIF
ELSE
IF HAS_TIME_PASSED(iTimerTillRepeatBevFrustratedAnim, TIME_DELAY_FOR_REPEATED_BEVERLY_FRUSTRATED_ANIM)
OR bForceThisFrame
IF SET_BEVERLY_PLAY_COME_ON_ANIM()
iTimerTillRepeatBevFrustratedAnim = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_BEVERLY_PLAY_FRUSTRATED_ON_FOOT_ANIM - anim applied") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iTimerTillRepeatBevFrustratedAnim = GET_GAME_TIMER()
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// checks to see if Bev should be removed from the player's group
/// NOTE: doesn't check entities exist or are alive
/// RETURNS:
/// TRUE if reason to remove Bev from player group is detected
FUNC BOOL SHOULD_BEVERLY_BE_REMOVED_FROM_PLAYER_GROUP()
// player got in the wrong vehicle
IF (IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SHOULD_BEVERLY_BE_REMOVED_FROM_PLAYER_GROUP : return TRUE player in wrong vehicle") ENDIF #ENDIF
RETURN TRUE
ENDIF
// player left Beverly behind
IF (fDistance_PlayerToBeverly >= BEVERLY_LEAVE_PLAYER_GROUP_DISTANCE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SHOULD_BEVERLY_BE_REMOVED_FROM_PLAYER_GROUP : return TRUE player left Beverly behind ") ENDIF #ENDIF
RETURN TRUE
ENDIF
// player in water
IF IS_ENTITY_IN_WATER(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SHOULD_BEVERLY_BE_REMOVED_FROM_PLAYER_GROUP : return TRUE player in water ") ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// checks to see if Bev should join the player's group
/// NOTE: doesn't check entities exist or are alive
/// RETURNS:
/// TRUE if reasons to join player group are fulfilled
FUNC BOOL SHOULD_BEVERLY_JOIN_PLAYER_GROUP()
// player got in the wrong vehicle
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SHOULD_BEVERLY_JOIN_PLAYER_GROUP : return FALSE player not sitting on Bev bike ") ENDIF #ENDIF
RETURN FALSE
ENDIF
ENDIF
// player in water
IF IS_ENTITY_IN_WATER(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SHOULD_BEVERLY_JOIN_PLAYER_GROUP : return FALSE player in water ") ENDIF #ENDIF
RETURN FALSE
ENDIF
// player out of rejoin rangge
IF (fDistance_PlayerToBeverly > BEVERLY_REJOIN_PLAYER_GROUP_DISTANCE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SHOULD_BEVERLY_JOIN_PLAYER_GROUP : return FALSE player not in range to rejoin") ENDIF #ENDIF
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// perform cleanup needed for leaving the specified player transport state
/// PARAMS:
/// eStateToCleanup - the state to cleanup
PROC CLEANUP_PLAYER_TRANSPORT_STATE(PAP1_PLAYER_TRANSPORT_STATE_ENUM eStateToCleanup)
SWITCH eStateToCleanup
CASE PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV
SWITCH eMissionStage
CASE MISSION_STAGE_DROP_BEVERLY_OFF
CLEAR_SPECIFIC_PRINT_FROM_DISPLAYING("PAP1_05") // Take Beverly to his next ~y~stakeout.~s~
SAFE_REMOVE_BLIP(blipIndexDropOffPoint)
//used to restart the convo, once the player gets back on the bike and Beverly is also on the bike.
IF bDoneDialogue_DropOffBeverlyAdditionalChat
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_DOFF02")
bPausedDialogue_DropOffBeverly = TRUE
bDoneDialogue_DropOffBeverlyAdditionalChat = FALSE
tlPausedDialogue_DropOffBeverly = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
ENDIF
ELIF bDoneDialogue_DropOffBeverly
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_DOFF05")
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_DOFF04")
bPausedDialogue_DropOffBeverly = TRUE
bDoneDialogue_DropOffBeverly = FALSE
tlPausedDialogue_DropOffBeverly = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
ENDIF
ELIF bDoneDialogue_BeverlySayKeepBike
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_DROP")
bPausedDialogue_DropOffBeverly = TRUE
bDoneDialogue_BeverlySayKeepBike = FALSE
tlPausedDialogue_DropOffBeverly = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
ENDIF
ELIF bDoneDialogue_RivalPapCameraDestroyed
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(tlDialogueRoot_CameraDestroyed) // don't kill Beverly camera destroyed dialogue
bPausedDialogue_DropOffBeverly = TRUE
bDoneDialogue_RivalPapCameraDestroyed = FALSE
tlPausedDialogue_DropOffBeverly = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - MISSION_STAGE_DROP_BEVERLY_OFF stored ongoing camera destroyed convo FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
OR IS_PED_RAGDOLL(sBeverlyPed.ped)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // B*1521607 - stop instantly if crashing the bike
ELSE
KILL_ANY_CONVERSATION()
ENDIF
BREAK
CASE MISSION_STAGE_LOSE_THE_COPS
CLEAR_SPECIFIC_PRINT_FROM_DISPLAYING("PAP1_09") // Lose the cops.
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
OR IS_PED_RAGDOLL(sBeverlyPed.ped)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // B*1521607 - stop instantly if crashing the bike
ELSE
KILL_ANY_CONVERSATION()
ENDIF
BREAK
DEFAULT
eBeverlyTakePhotoState = PAP1_BTPS_SETUP //reset Beverly taking photos state
IF IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
CLEAR_PED_TASKS(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - cleared BEVERLY task SCRIPT_TASK_GENERAL_SWEEP FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
CLEAR_SPECIFIC_PRINT_FROM_DISPLAYING("PAP1_01") // Drive alongside Miranda's ~b~car.~s~
SAFE_REMOVE_BLIP(sCelebPed.blip)
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
OR IS_PED_RAGDOLL(sBeverlyPed.ped)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // B*1521607 - stop instantly if crashing the bike
ELSE
KILL_ANY_CONVERSATION()
ENDIF
bDoneDialogue_BeverlyMissedKnockOffAttempt = TRUE //reset this dialogue to done so it doesn't try to trigger as soon as we get back on the bike
bDoneDialogue_BeverlyThrowsPunch = TRUE
//Extra stuff to cleanup if its in the destroy rival pap cam stage
IF eMissionStage = MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
OR eMissionStage = MISSION_STAGE_STOP_RIVAL_PAP
SAFE_REMOVE_BLIP(sCelebPed.blip)
SAFE_REMOVE_BLIP(sRivalPapPed.blip)
CLEAR_SPECIFIC_PRINT_FROM_DISPLAYING("PAP1_03") //Chase after ~r~Tobias.~w~
CLEAR_SPECIFIC_HELP_TEXT_FROM_DISPLAYING("PAP1_H1")
ENDIF
BREAK
ENDSWITCH
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle") //setup the idle on bike pose
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap") //remove chat on bike anim when convo is finished
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap", REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - anim stopped BEVERLY dialog_pap REALLY_SLOW_BLEND_OUT- still sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap") // don't clear the catch up anims
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_left_pap", REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - anim stopped BEVERLY hurry_up_left_pap REALLY_SLOW_BLEND_OUT- still sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "hurry_up_right_pap", REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - anim stopped BEVERLY hurry_up_right_pap REALLY_SLOW_BLEND_OUT- still sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint, REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - anim stopped BEVERLY tlAnimName_BeverlyPoint REALLY_SLOW_BLEND_OUT- still sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - anim stopped BEVERLY cam_pos_hand_override INSTANT_BLEND_OUT - still sat on bike with WEAPON CLIPSET RESET FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
/* ^^^ bev alt anim during Franklin helmet anim change
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still")
STOP_ANIM_TASK(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - anim stopped BEVERLY veh@bike@sport@rear@base still INSTANT_BLEND_OUT - still sat on bike with WEAPON CLIPSET RESET FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF */
ENDIF
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - anim set BEVERLY idle SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT- still sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
SET_PED_RESET_FLAG(sBeverlyPed.ped, PRF_DisableInVehicleActions, TRUE) // B*1480880 - stop bev clipping during reverse anims
ELSE
CLEANUP_BEVERLY_ON_BIKE_ANIMS()
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped,sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
//TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV - anim NOT set BEVERLY cam_pos_hand_override bev GETTING ON BIKE - cam_pos_hand_override INSTANT_BLEND_IN getting on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
ENDIF
/* fail attempt to use the cam override anim on Bev prior to him starting the custom get_in anims
but this failed on anim playing check maybe because they are from a clipset?
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ds", "get_in")
AND NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ps", "get_in")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - bev GETTING ON BIKE - RESET_PED_MOVEMENT_CLIPSET & applied cam_pos_hand_override FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ds", "get_in")
OR IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ps", "get_in")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
STOP_ENTITY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - bev GETTING ON BIKE - stopped cam_pos_hand_override anim for get_in anims FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "here") // ok so this isn't working because checking if Bev is playing one of the get_in anims isn't returning when it should do.. maybe because its actually a clipset?
ENDIF
ENDIF
ELSE
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
ENDIF*/
TASK_CLEAR_LOOK_AT(sBeverlyPed.ped)
ENDIF
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
BREAK
CASE PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE
TASK_CLEAR_LOOK_AT(sBeverlyPed.ped)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
CLEAR_SPECIFIC_PRINT_FROM_DISPLAYING("PAP1_06") // Get back on Beverly's ~b~motorbike.~s~
CLEAR_SPECIFIC_PRINT_FROM_DISPLAYING("PAP1_10") // Get on Beverly's ~b~motorbike.~s~
SAFE_REMOVE_BLIP(sBeverlyVehicle.blip)
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_IG5") // stop get back on the bike dialogue instantly
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_FALL")
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_CRASH")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
KILL_ANY_CONVERSATION()
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE - anim set BEVERLY idle SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT- sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY
TASK_CLEAR_LOOK_AT(sBeverlyPed.ped)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
SAFE_REMOVE_BLIP(sBeverlyPed.blip)
CLEAR_SPECIFIC_PRINT_FROM_DISPLAYING("PAP1_08") //Return to ~b~Beverly.~s~
KILL_ANY_CONVERSATION()
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY - anim set BEVERLY idle SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT- sat on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANUP_PLAYER_TRANSPORT_STATE - done for eStateToCleanup : ", eStateToCleanup) ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Get updated the players Transport state
/// RETURNS:
/// returns the current player transport state enum
FUNC PAP1_PLAYER_TRANSPORT_STATE_ENUM GET_UPDATED_PLAYER_TRANSPORT_STATE()
//IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle) // changed to use this to fix bug 938762 - Strange animation when getting off the bike.
RETURN PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_PLAYER_TRANSPORT_STATE - ePlayerTransportState = PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE") ENDIF #ENDIF
//ELIF NOT IS_PED_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
ELIF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
RETURN PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_PLAYER_TRANSPORT_STATE - ePlayerTransportState = PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY") ENDIF #ENDIF
ELSE
RETURN PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_PLAYER_TRANSPORT_STATE - ePlayerTransportState = PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV") ENDIF #ENDIF
ENDIF
ENDFUNC
/// PURPOSE:
/// Handle the mission flow for when the player and Beverly are on the bike.
/// moved this code here to improve readability as MANAGE_PLAYER_AND_BEVERLY() had became pretty big
PROC MANAGE_FLOW_FOR_PLAYER_AND_BEVERLY_ON_BIKE()
SWITCH eMissionStage
CASE MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
IF NOT DOES_BLIP_EXIST(sCelebPed.blip)
sCelebPed.blip = CREATE_PED_BLIP(sCelebPed.ped, TRUE, TRUE)
SET_BLIP_SCALE(sCelebPed.blip, 1.0) //TEMP: cars need bigger blips but the new rc_helpers_function - CREATE_PED_BLIP doesn't handle it.
ELSE
IF IS_PED_SITTING_IN_ANY_VEHICLE(sCelebPed.ped)
SET_BLIP_SCALE(sCelebPed.blip, 1.0)
ENDIF
UPDATE_CHASE_BLIP(sCelebPed.blip, sCelebPed.ped, CELEB_ESCAPED_DIST, PAP1_CELEB_CHASE_BLIP_FLASH_PERCENTAGE)
ENDIF
IF NOT bDoneDialogue_InitialChaseDialogue
/* ^^^ bev alt anim during Franklin helmet anim change - original to swap out */
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
iDelayInitialChaseComment = GET_GAME_TIMER() // allow this anim to kick in before the point anim
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "set Bev to idle pose - whilst waiting for initial chase dialogue to trigger") ENDIF #ENDIF
ELSE
IF HAS_TIME_PASSED(iDelayInitialChaseComment, 500)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CHASE01", CONV_PRIORITY_MEDIUM)
// Go, go! Get us right up alongside that limo.
bBeverly_InitialPointAtCeleb_Anim = SET_BEVERLY_PLAY_POINT_ANIM(sCelebPed.ped)
bDoneDialogue_InitialChaseDialogue = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE - bDoneDialogue_InitialChaseDialogue done") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
/* ^^^ swap out end */
/* ^^^ bev alt anim during Franklin helmet anim change
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
AND NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still")
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "veh@bike@sport@front@base", "put_on_helmet")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_CHASE_CELEB_IN_VEHICLEset Bev to idle pose - whilst waiting for initial chase dialogue to trigger") ENDIF #ENDIF
ELSE
REQUEST_ANIM_DICT("veh@bike@sport@rear@base")
IF HAS_ANIM_DICT_LOADED("veh@bike@sport@rear@base")
TASK_PLAY_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE - applied still on bike anim whilst player puts on helmet") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE - requestin anim dict for still idle - veh@bike@sport@rear@base for player puts on helmet") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
// delay for player putting on helmet
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "veh@bike@sport@front@base", "put_on_helmet")
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CHASE01", CONV_PRIORITY_MEDIUM)
// Go, go! Get us right up alongside that limo.
bBeverly_InitialPointAtCeleb_Anim = SET_BEVERLY_PLAY_POINT_ANIM(sCelebPed.ped)
bDoneDialogue_InitialChaseDialogue = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE - bDoneDialogue_InitialChaseDialogue done") ENDIF #ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE - bDoneDialogue_InitialChaseDialogue delayed for player putting on helmet") ENDIF #ENDIF
ENDIF
ENDIF */
ELIF NOT bDoneObjective_GetCloseToCeleb
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), sCelebPed.ped)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sCelebPed.ped, -1, SLF_FAST_TURN_RATE)
ENDIF
IF NOT IS_PED_HEADTRACKING_PED(sBeverlyPed.ped, sCelebPed.ped)
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, sCelebPed.ped, -1, SLF_FAST_TURN_RATE)
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint) // wait for point anim to finish
// make sure the anim has completed (has the hold last frame flag
IF HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "set Bev to idle pose - whilst setting initial objective") ENDIF #ENDIF
ENDIF
ELSE
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "set Bev to idle pose - whilst setting initial objective") ENDIF #ENDIF
ENDIF
ENDIF
PRINT_NOW("PAP1_01", DEFAULT_GOD_TEXT_TIME, 1) //Drive close to ~r~Miranda~w~ so Beverly can get take some photos.
iDialogueTimer_ChasingCeleb = GET_GAME_TIMER() // delay first comment from Beverly
bDoneObjective_GetCloseToCeleb = TRUE
ELSE
// make Bev point at the celeb in the limo
IF NOT bBeverly_InitialPointAtCeleb_Anim
IF SET_BEVERLY_PLAY_POINT_ANIM(sCelebPed.ped)
bBeverly_InitialPointAtCeleb_Anim = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bBeverly_InitialPointAtCeleb_Anim done") ENDIF #ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint) // wait for point anim to finish
// make sure the anim has completed (has the hold last frame flag
IF HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "set Bev to idle pose - whilst waiting for initial chase dialogue to finish") ENDIF #ENDIF
ENDIF
ELSE
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "set Bev to idle pose - whilst waiting for initial chase dialogue to finish") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
ELSE
MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE()
MANAGE_DIALOGUE_DURING_CHASE_CELEB()
IF NOT IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), sCelebPed.ped)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sCelebPed.ped, -1, SLF_FAST_TURN_RATE)
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
IF NOT DOES_BLIP_EXIST(sCelebPed.blip)
sCelebPed.blip = CREATE_PED_BLIP(sCelebPed.ped, TRUE, TRUE)
SET_BLIP_SCALE(sCelebPed.blip, 1.0) //TEMP: cars need bigger blips but the new rc_helpers_function - CREATE_PED_BLIP doesn't handle it.
ELSE
IF IS_PED_SITTING_IN_ANY_VEHICLE(sCelebPed.ped)
SET_BLIP_SCALE(sCelebPed.blip, 1.0)
ENDIF
UPDATE_CHASE_BLIP(sCelebPed.blip, sCelebPed.ped, CELEB_ESCAPED_DIST, PAP1_CELEB_CHASE_BLIP_FLASH_PERCENTAGE)
ENDIF
// new rival pap dialogue first
IF NOT bDoneDialogue_RivalPapTookPhoto[0]
IF fTimeInRivalPapRecording > 1000.0 //moment rival appears
IF fDistance_PlayerToRivalPap < 120.0 //only play if the player is close enough to see the rival arrive
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RP1", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Fuck you Beverly, this one's mine!
bDoneDialogue_RivalPapTookPhoto[0] = TRUE
ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DELAY RIVAL PAP ARRIVE DIALOGUE, BEVERLY NOT CLOSE ENOUGH") ENDIF #ENDIF
ENDIF
ENDIF
ELIF NOT bDoneDialogue_RivalPapTookPhoto[1] //This gets set to true in the Stage_Skip proc, when skipping the stage
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_RP1") // Fuck you Beverly, this is my exclusive!
IF fTimeInRivalPapRecording > 1000.0 //moment rival begins taking photos
IF fDistance_PlayerToRivalPap < 120.0 //only play if the player is close enough to see the rival arrive
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RP2", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_LOWEST)
// No, no, it's that bottom-feeder Madison!
// Shit, he's getting the money shots! Where's your dignity!?
// Forget Miranda, we can't let him steal my exclusive.
// Get alongside him and I'll knock the weasel off.
bDoneDialogue_RivalPapTookPhoto[1] = TRUE
ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DELAY bEVERL RIVAL PAP ARRIVE DIALOGUE, BEVERLY NOT CLOSE ENOUGH") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
TEXT_LABEL_31 tlTempRoot
tlTempRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT bBeverly_SpottedRivalPap_Anim
AND IS_SCRIPTED_CONVERSATION_ONGOING() // B*1555893 - make sure convo is playing out before triggering (not being built)
AND ARE_STRINGS_EQUAL(tlTempRoot, "PAP1_RP2")
IF SET_BEVERLY_PLAY_POINT_ANIM(sRivalPapPed.ped)
bBeverly_SpottedRivalPap_Anim = TRUE
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint) // wait for point anim to finish
// make sure the anim has completed (has the hold last frame flag
IF HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, tlAnimName_BeverlyPoint)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY) // keep these slow bend out for hit timings
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "set Bev to idle pose") ENDIF #ENDIF
ENDIF
ELSE
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY) // keep these slow bend out for hit timings
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "set Bev to idle pose") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "BEV FINISHED SPOTTED RIVAL PAP DIALOGUE SO GO TO SS_CLEANUP") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sRivalPapPed.ped)
IF NOT IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), sRivalPapPed.ped)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sRivalPapPed.ped, -1, SLF_FAST_TURN_RATE)
ENDIF
IF NOT IS_PED_HEADTRACKING_PED(sBeverlyPed.ped, sRivalPapPed.ped)
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, sRivalPapPed.ped, -1, SLF_FAST_TURN_RATE)
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_STOP_RIVAL_PAP
IF NOT bDoneObjective_StopTheRivalPaparazzi
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
SET_VEHICLE_TYRES_CAN_BURST(sRivalPapVehicle.vehicle, TRUE)
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
AND IS_PED_SITTING_IN_VEHICLE(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRivalPapDriverPed.ped, TRUE)
SET_PED_CAN_BE_TARGETTED(sRivalPapDriverPed.ped, TRUE)
SET_PED_AS_ENEMY(sRivalPapDriverPed.ped, TRUE) // B*1535622 - makes sure HUD elements are set for enemy ped
SET_ENTITY_IS_TARGET_PRIORITY(sRivalPapDriverPed.ped, TRUE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapDriverPed.ped, KNOCKOFFVEHICLE_HARD) // swapped to hard as trial for B*1050458
SET_PED_FLEE_ATTRIBUTES(sRivalPapDriverPed.ped, FA_CAN_SCREAM | FA_WANDER_AT_END | FA_LOOK_FOR_CROWDS | FA_USE_COVER | FA_PREFER_PAVEMENTS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sRivalPapDriverPed.ped, FA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sRivalPapDriverPed.ped, CA_ALWAYS_FLEE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sRivalPapDriverPed.ped, CA_FLEE_WHILST_IN_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sRivalPapDriverPed.ped, CA_AGGRESSIVE, FALSE)
ENDIF
IF IS_PED_UNINJURED(sRivalPapPed.ped)
AND IS_PED_SITTING_IN_VEHICLE(sRivalPapPed.ped, sRivalPapVehicle.vehicle)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRivalPapPed.ped, TRUE)
SET_PED_CAN_BE_TARGETTED(sRivalPapPed.ped, TRUE)
SET_PED_AS_ENEMY(sRivalPapPed.ped, TRUE) // B*1535622 - makes sure HUD elements are set for enemy ped
SET_ENTITY_IS_TARGET_PRIORITY(sRivalPapPed.ped, TRUE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_HARD) // swapped to hard as trial for B*1050458
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RIVAL PAP PED HAS BEEN SETUP FOR IDLE ANIMS ON BIKE") ENDIF #ENDIF
ENDIF
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_RIVAL)
ENDIF
PRINT_NOW("PAP1_03", DEFAULT_GOD_TEXT_TIME, 1) //Stop the ~r~rival paparazzi.~s~
PRINT_HELP("PAP1_H1") // Drive next to the rival paparazzi so Beverly can knock him off.~s~
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_PAP1_STOP_RIVAL_PAP, "Stop the rival paparazzi") // 2nd Mission replay checkpoint TEMP POINT NEEDS OWN STAGE SETTING UP
g_replay.iReplayInt[REPLAY_PHOTOS_TAKEN] = iGoodPhotosTakenCounter // store the global variale used to setup the state on a replay
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REPLAY CHECKPOINT SET - stop rival pap ^^^") ENDIF #ENDIF
bDoneObjective_StopTheRivalPaparazzi = TRUE
ENDIF
ELSE
MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK(sBeverlyPed.ped, sRivalPapVehicle.vehicle) //, FALSE, sObjCameraBeverly.object)
IF NOT bDoneDialogue_RivalPapTookPhoto[2]
// change this initial dialogue to remind player to chase rival pap if he's still going after celeb
IF fCurrentChaseDistanceCeleb < fDistance_PlayerToRivalPap
AND IS_PED_UNINJURED(sRivalPapPed.ped)
AND NOT IS_PED_FACING_PED(PLAYER_PED_ID(), sRivalPapPed.ped, 90.0)
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("PAP1_03") //*commented out for new display message check with subtitle profile settings
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CONT", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// I said leave Miranda, she can wait!
// No, no, no, get after that motorbike!
// What are you doing? We can't let that hack get away!
bDoneDialogue_RivalPapTookPhoto[2] = TRUE
ENDIF
//ENDIF
ELSE
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("PAP1_03") //*commented out for new display message check with subtitle profile settings
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RPAP02", CONV_PRIORITY_MEDIUM)
//Stay on that bastard.
bDoneDialogue_RivalPapTookPhoto[2] = TRUE
ENDIF
//ENDIF
ENDIF
ELSE
//special ability help text
IF NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
IF NOT bDone_ShowSpecialAbilityHelp
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("PAP1_H1") // Drive next to the rival paparazzi so Beverly can knock him off.~s~
INT iTempStatValue
STAT_GET_INT(SP1_SPECIAL_ABILITY, iTempStatValue) // Franklin check Franklin has some charge in his bar
IF iTempStatValue > 0 // 30 is full for some reason
IF fDistance_PlayerToRivalPap < 60.0
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("PAP1_H2_KM") // ~s~Press ~INPUT_SPECIAL_ABILITY~ to activate Franklin's special ability.~s~
ELSE
PRINT_HELP("PAP1_H2") // ~s~Hold ~INPUT_VEH_SPECIAL_ABILITY_FRANKLIN~ to activate overdrive mode, this will focus Franklin and improve his reflexes.~s~
ENDIF
bDone_ShowSpecialAbilityHelp = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_STOP_RIVAL_PAP - special ability help set to print PAP1_H2") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
CLEAR_SPECIFIC_HELP_TEXT_FROM_DISPLAYING("PAP1_H2") // ~s~Hold ~INPUT_VEH_SPECIAL_ABILITY_FRANKLIN~ to activate overdrive mode, this will focus Franklin and improve his reflexes.~s~
IF IS_PC_VERSION()
CLEAR_SPECIFIC_HELP_TEXT_FROM_DISPLAYING("PAP1_H2_KM") // ~s~Hold ~INPUT_VEH_SPECIAL_ABILITY_FRANKLIN~ to activate overdrive mode, this will focus Franklin and improve his reflexes.~s~
ENDIF
bDone_ShowSpecialAbilityHelp = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_STOP_RIVAL_PAP - special ability help cleared / toggled don't print") ENDIF #ENDIF
ENDIF
MANAGE_ADDITIONAL_DIALOGUE_FOR_CHASING_RIVAL_PAP()
ENDIF
ENDIF
IF bDoneObjective_StopTheRivalPaparazzi
IF NOT DOES_BLIP_EXIST(sRivalPapPed.blip)
sRivalPapPed.blip = CREATE_PED_BLIP(sRivalPapPed.ped, TRUE, FALSE)
IF DOES_BLIP_EXIST(sRivalPapPed.blip)
SET_BLIP_SCALE(sRivalPapPed.blip, 1.0) //TEMP: cars need bigger blips but the new rc_helpers_function - CREATE_PED_BLIP doesn't handle it.
ENDIF
ELSE
IF IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapPed.ped)
SET_BLIP_SCALE(sRivalPapPed.blip, 1.0)
ENDIF
UPDATE_CHASE_BLIP(sRivalPapPed.blip, sRivalPapPed.ped, RIVAL_PAP_ESCAPED_DIST, PAP1_RIVAL_PAP_CHASE_BLIP_FLASH_PERCENTAGE)
ENDIF
SAFE_REMOVE_BLIP(sCelebPed.blip)
ELSE
IF NOT DOES_BLIP_EXIST(sCelebPed.blip)
sCelebPed.blip = CREATE_PED_BLIP(sCelebPed.ped, TRUE, TRUE)
IF DOES_BLIP_EXIST(sCelebPed.blip)
SET_BLIP_SCALE(sCelebPed.blip, 1.0) //TEMP: cars need bigger blips but the new rc_helpers_function - CREATE_PED_BLIP doesn't handle it.
ENDIF
ELSE
IF IS_PED_SITTING_IN_ANY_VEHICLE(sCelebPed.ped)
SET_BLIP_SCALE(sCelebPed.blip, 1.0)
ENDIF
UPDATE_CHASE_BLIP(sCelebPed.blip, sCelebPed.ped, CELEB_ESCAPED_DIST, PAP1_CELEB_CHASE_BLIP_FLASH_PERCENTAGE)
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sRivalPapPed.ped)
IF NOT IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), sRivalPapPed.ped)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sRivalPapPed.ped, -1, SLF_FAST_TURN_RATE)
ENDIF
IF NOT IS_PED_HEADTRACKING_PED(sBeverlyPed.ped, sRivalPapPed.ped)
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, sRivalPapPed.ped, -1, SLF_FAST_TURN_RATE)
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DROP_BEVERLY_OFF
IF NOT bDoneDialogue_RivalPapCameraDestroyed
IF TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION()
bDoneDialogue_RivalPapCameraDestroyed = TRUE
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(blipIndexDropOffPoint)
blipIndexDropOffPoint = CREATE_COORD_BLIP(vDropOffPoint)
vPathNodeRequestStartPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vPathNodeRequestStartPosition, vDropOffPoint, vPathNodeRequestMin, vPathNodeRequestMax)
ELSE
// don't keep requesting once they loaded ...since this is only used to make the gps route appear faster
IF NOT ARE_VECTORS_ALMOST_EQUAL(vPathNodeRequestStartPosition, << 0.0, 0.0, 0.0 >>)
PAP1_REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vPathNodeRequestStartPosition, vDropOffPoint, vPathNodeRequestMin, vPathNodeRequestMax)
IF PAP1_ARE_REQUEST_PATH_NODES_LOADED_IN_AREA(vPathNodeRequestMin, vPathNodeRequestMax)
vPathNodeRequestStartPosition = << 0.0, 0.0, 0.0 >>
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_DROP_BEVERLY_OFF - nodes loaded so reset vPathNodeRequestStartPosition") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bDoneWaitForCameraDestroyedDialogue
// have to use this to load in the blip GPS for the drop off point
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CPRINTLN(DEBUG_MISSION, "STAGE_DROP_BEVERLY_OFF bDoneWaitForCameraDestroyedDialogue TRUE ")
bDoneWaitForCameraDestroyedDialogue = TRUE
ENDIF
ELIF NOT bDoneObjective_DropBeverlyOff
PRINT_NOW("PAP1_05", DEFAULT_GOD_TEXT_TIME, 1) // Take Beverly to his next ~y~stakeout.~s~
bDoneObjective_DropBeverlyOff = TRUE
ELSE
MANAGE_DIALOGUE_DURING_DROP_BEVERLY_OFF()
ENDIF
ENDIF
//cleanup knock off anim if it's finished
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
IF HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff, SLOW_BLEND_OUT)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "cleared Beverly KO anim from Drop Off Beverly - appled on bike idle") ENDIF #ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //if player and bev are chatting play chat on bike anims
FLOAT fAnimStartPhase
fAnimStartPhase = GET_RANDOM_FLOAT_IN_RANGE(0, 1)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap") //setup the idle on bike pose
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY, fAnimStartPhase)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "%anim set BEVERLY dialog_pap at phase - ", fAnimStartPhase) ENDIF #ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle") //setup the idle on bike pose
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap") //remove chat on bike anim when convo is finished
//STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap", REALLY_SLOW_BLEND_OUT)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "%%%%% anim stopped BEVERLY dialog_pap - REALLY_SLOW_BLEND_IN %%%%%%") ENDIF #ENDIF
ELSE
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESET BEVERLY TO IDLE POSE") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_LOSE_THE_COPS
IF NOT bDoneDialogue_RivalPapCameraDestroyed
IF TRIGGER_KNOCKED_RIVAL_OFF_BIKE_CONVERSATION()
bDoneDialogue_RivalPapCameraDestroyed = TRUE
ENDIF
ELIF NOT bDoneWaitForCameraDestroyedDialogue
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CPRINTLN(DEBUG_MISSION, "STAGE_DROP_BEVERLY_OFF bDoneWaitForCameraDestroyedDialogue TRUE ")
bDoneWaitForCameraDestroyedDialogue = TRUE
ENDIF
ELIF NOT bDoneDialogue_LoseTheCops_InitialChat
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_LTC01", CONV_PRIORITY_MEDIUM)
// Oh shit, it's the cops. Get rid of them.
// 5-0, man! They're on to me! Lose them!
bDoneDialogue_LoseTheCops_InitialChat = TRUE
ENDIF
//ELIF NOT IS_THIS_PRINT_BEING_DISPLAYED("PAP1_09") // don't do if Lose the cops objective is currently being displayed //*commented out for new display message check with subtitle profile settings
ELIF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_LTC01") //don't play if initial cops dialogue is playing
IF NOT bDoneObjective_LoseTheCops
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "lose cops objective displayed ^^^^^^ +++++ ^^^^^") ENDIF #ENDIF
PRINT_NOW("PAP1_09", DEFAULT_GOD_TEXT_TIME, 1) // Lose the cops.
iDialogueTimer_LoseTheCopsAdditionalChat = GET_GAME_TIMER() //reset the timer for additional dialogue
bDoneObjective_LoseTheCops = TRUE
ELSE
//Play bev comment about losing the cops, setup in D* as random dialogue
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer_LoseTheCopsAdditionalChat = GET_GAME_TIMER()
ELSE
IF NOT bDoneDialogue_FranklinRespondToBeverlyBerating // reset this to ensure Franklin doesn't say something straight away
IF (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_RESP", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Yeah, yeah, I got it.
// Maybe if you shut up for a second.
// What do you think I'm doin'?
// Fuck, I know, I'm tryin'!
// Are you always this annoying?
// I get the idea, homie.
// You really ain't helpin'.
// We might do better if you shut the fuck up.
// I heard you the first time.
iDialogueTimer_LoseTheCopsAdditionalChat = GET_GAME_TIMER()
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // bypass response if we are out range of each other
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LOSE THE COPS ADDITONAL DIALOGUE TRIGGERED - Franklin Response - PAP1_RESP") ENDIF #ENDIF
ENDIF
ELSE
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // bypass response if we are out range of each other
ENDIF
ELSE
// Franklin drives into a ped
IF (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) >= 0) // looks to be initially set to -1 so need to check from 0
AND (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) < 500)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_HITPED", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// It's okay, they're fine.
// That's it, no prisoners!
// Collateral damage, don't worry about it.
// Good, if they get in the way, take them down!
// Move next time!
iDialogueTimer_LoseTheCopsAdditionalChat = GET_GAME_TIMER()
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LOSE THE COPS - drove into ped dialogue - PAP1_HITPED") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF (GET_GAME_TIMER() - iDialogueTimer_LoseTheCopsAdditionalChat > TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE_LONG)
AND (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE)
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_LTC02", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Go, go! I'm not going down for this!
// So, I should probably tell you, this isn't one hundred percent legal.
// Come on, lose them already!
// Hit the gas, man! They're still on us.
// You gotta get rid of them. I'm in breach of my restraining order!
// If we get caught, I'm saying you kidnapped me.
iDialogueTimer_LoseTheCopsAdditionalChat = GET_GAME_TIMER()
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // B*1573363 - don't allow Franklin to respond
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LOSE THE COPS ADDITONAL DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//cleanup knock off anim if it's finished
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
IF HAS_ENTITY_ANIM_FINISHED(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff)
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, sAnimNameBeverlyKnockOff, SLOW_BLEND_OUT)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "cleared Beverly KO anim from Drop Off Beverly - appled on bike idle") ENDIF #ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //if player and bev are chatting play chat on bike anims
FLOAT fAnimStartPhase
fAnimStartPhase = GET_RANDOM_FLOAT_IN_RANGE(0, 1)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap") //setup the idle on bike pose
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY, fAnimStartPhase)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "%anim set BEVERLY dialog_pap at phase - ", fAnimStartPhase) ENDIF #ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle") //setup the idle on bike pose
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap") //remove chat on bike anim when convo is finished
//STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "dialog_pap", REALLY_SLOW_BLEND_OUT)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "%%%%% anim stopped BEVERLY dialog_pap - REALLY_SLOW_BLEND_IN %%%%%%") ENDIF #ENDIF
ELSE
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY) // NORMAL_BLEND_IN
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESET BEVERLY TO IDLE POSE") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
/* ^^^ bev alt anim during Franklin helmet anim change
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "veh@bike@sport@front@base", "put_on_helmet") // B*1422622 - Franklin's put on helmet animation cause him to clip through Beverly
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_AND_BEVERLY_ON_BIKE - eset Bev to idle pose") ENDIF #ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still")
REQUEST_ANIM_DICT("veh@bike@sport@rear@base")
IF HAS_ANIM_DICT_LOADED("veh@bike@sport@rear@base")
TASK_PLAY_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_AND_BEVERLY_ON_BIKE - applied still on bike anim whilst player puts on helmet") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_AND_BEVERLY_ON_BIKE - requestin anim dict for still idle - veh@bike@sport@rear@base for player puts on helmet") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF */
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
IF NOT IS_ENTITY_VISIBLE(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped)
SET_ENTITY_VISIBLE(sObjCameraBeverly.object, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_AND_BEVERLY_ON_BIKE - reset Bev camera Visible FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
SET_PED_RESET_FLAG(sBeverlyPed.ped, PRF_DisableInVehicleActions, TRUE) // B*1480880 - stop bev clipping during reverse anims
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_AND_BEVERLY_ON_BIKE ON BIKE - stopped cam override anim as Bev on the bike") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handle the mission flow for when the player is off Beverly's bike
/// moved this code here to improve readability as MANAGE_PLAYER_AND_BEVERLY() had became pretty big
PROC MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE()
IF NOT DOES_BLIP_EXIST(sBeverlyVehicle.blip)
sBeverlyVehicle.blip = CREATE_VEHICLE_BLIP(sBeverlyVehicle.vehicle)
ENDIF
IF NOT bDoneObjective_GetBackOnBike
IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle, TRUE)
// don't print the objective if the player is in the process of getting onto the bike
ELSE
PRINT_NOW("PAP1_06", DEFAULT_GOD_TEXT_TIME, 1) // Get back on Beverly's ~b~motorbike.~s~
bDoneObjective_GetBackOnBike = TRUE
ENDIF
ELSE //IF NOT IS_THIS_PRINT_BEING_DISPLAYED("PAP1_06") // Get back on Beverly's ~b~motorbike.~s~ //*commented out for new display message check with subtitle profile settings
//Play bev comment about getting back on the bike, setup in D* as random dialogue
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer_PlayerOffTheBike = GET_GAME_TIMER()
ELSE
IF (GET_GAME_TIMER() - iDialogueTimer_PlayerOffTheBike > TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE)
IF (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE)
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
// can only play specifc lines after this point since some don't fit when you aren't chasing miranda
IF eMissionStage = MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_IG5", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Come on! Come on!
// This is the opportunity of a lifetime!
// Miranda Cowan, man! This is immense!
// What are you waiting for? This is important!
// Oh my God, if she gets away, I will lose my shit!!!
iDialogueTimer_PlayerOffTheBike = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - GET BACK ON THE BIKE DIALOGUE TRIGGERED - PAP1_IG5") ENDIF #ENDIF
ENDIF
ELSE
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_FALL", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Back on the bike, man. We're gonna lose her!
// You're fine, get back on. We've gotta get after them!
// Come on, let's go again! We can still catch them.
iDialogueTimer_PlayerOffTheBike = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - GET BACK ON THE BIKE DIALOGUE TRIGGERED - PAP1_FALL") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
// having to use alternative for rest of mission stages since PAP1_IG5 and PAP1_FALL references Miranda
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_CRASH", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// You idiot!
// For Christ's sake!
// Are you blind?
// Is it that hard?
// No! You moron!
// You have gotta be kidding me!
iDialogueTimer_PlayerOffTheBike = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - GET BACK ON THE BIKE DIALOGUE alternative dialogue - PAP1_CRASH") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bHasBeverlyBeenRemovedFromPlayerGroup
IF SHOULD_BEVERLY_BE_REMOVED_FROM_PLAYER_GROUP()
IF IS_PED_GROUP_MEMBER(sBeverlyPed.ped, PLAYER_GROUP_ID())
IF NOT IS_PED_RAGDOLL(sBeverlyPed.ped) // B*1441191 - apparently calls the REMOVE_PED_FROM_GROUP need to delay for ragdoll since it will clear immediately causing ped to snap up
REMOVE_PED_FROM_GROUP(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - *PED GROUP* BEV removed from group Left Behind - PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - *PED GROUP* BEV Unable to remove on first call PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE") ENDIF #ENDIF
ENDIF
ENDIF
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
CLEAR_PED_TASKS(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - BEV - cleared tasks as getting in vehicle when removed from player group") ENDIF #ENDIF
ENDIF
UPDATE_BEVERLY_PLAY_FRUSTRATED_ON_FOOT_ANIM(TRUE)
bHasBeverlyBeenRemovedFromPlayerGroup = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE bHasBeverlyBeenRemovedFromPlayerGroup = TRUE") ENDIF #ENDIF
ELSE
IF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle, TRUE)
// B*1521660 - cancel enter task if player is being a dick
FLOAT fBikeSpeed = GET_ENTITY_SPEED(sBeverlyVehicle.vehicle)
IF fBikeSpeed < 1.75
AND IS_ENTITY_IN_RANGE_ENTITY(sBeverlyPed.ped, sBeverlyVehicle.vehicle, 8.0)
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_ENTER_VEHICLE)
TASK_BEVERLY_TO_GET_ON_HIS_BIKE()
ENDIF
ELSE
IF IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_ENTER_VEHICLE)
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
CLEAR_PED_TASKS(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY cleared enter vehicle task : speed was ", fBikeSpeed) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_ENTER_VEHICLE)
CLEAR_PED_TASKS(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY bev TASK_ENTER_VEHICLE cleared : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
CLEANUP_BEVERLY_ON_BIKE_ANIMS()
// B*1338882 - player not given enough time to get back on the bike to rejoin chase
IF eMissionStage = MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
OR eMissionStage = MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
OR eMissionStage = MISSION_STAGE_STOP_RIVAL_PAP
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_ENTER_VEHICLE)
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBeverlyPed.ped, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 2.0) // B*1898752 - don't override speed if Beverly is right next to player
SET_PED_MIN_MOVE_BLEND_RATIO(sBeverlyPed.ped, 1.5) // group behaviour automatically makes ped walk slowing to get in a vehicle, i need it to be faster
ENDIF
ENDIF
SET_PED_RESET_FLAG(sBeverlyPed.ped, PRF_UseFastEnterExitVehicleRates, TRUE) // to improve slowness getting in vehicles
ENDIF
ENDIF
ENDIF
ELSE
IF SHOULD_BEVERLY_JOIN_PLAYER_GROUP()
CLEAR_PED_TASKS(sBeverlyPed.ped)
SET_BEVERLY_FOLLOW_PLAYER()
//play Bev comment about player leaving him behind
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_PRTB01", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - Bev comment about player leaving him triggered ]]]") ENDIF #ENDIF
// Where the hell did you go?
// I thought you'd bailed on me, man!
// Get your head in the game!
// There you are, Christ, stay with me!
// I thought we were a team here.
// We don't have time to mess around.
ENDIF
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE bHasBeverlyBeenRemovedFromPlayerGroup = FALSE") ENDIF #ENDIF
bHasBeverlyBeenRemovedFromPlayerGroup = FALSE
ELSE
// having to keep checking this here now because of // B*1441191
IF IS_PED_IN_GROUP(sBeverlyPed.ped)
IF NOT IS_PED_RAGDOLL(sBeverlyPed.ped) // B*1441191 - apparently calls the REMOVE_PED_FROM_GROUP need to delay for ragdoll since it will clear immediately causing ped to snap up
REMOVE_PED_FROM_GROUP(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - *PED GROUP* BEV removed from group *on further attempts after ragdoll initial check* - PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE") ENDIF #ENDIF
ENDIF
ENDIF
UPDATE_BEVERLY_PLAY_FRUSTRATED_ON_FOOT_ANIM()
//Play bev comment about leaving him behind, setup in D* as random dialogue
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer_BevLeftBehind = GET_GAME_TIMER()
ELSE
IF (GET_GAME_TIMER() - iDialogueTimer_BevLeftBehind > TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE)
IF (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE + 10) // larger range to give this the chance to play
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_IG6", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "BEV LEFT BEHIND DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
iDialogueTimer_BevLeftBehind = GET_GAME_TIMER()
// Don't leave me here!
// Do you know who I am?
// You're walking away from fame, man!
// I make reputations! I break reputations!
// Wait, this is your chance to make a difference!
// Do you want to be a nobody your whole life?
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_HEADTRACKING_PED(sBeverlyPed.ped, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1)
ENDIF
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE() // technically covered by above look at task but added to show usage.
IF NOT IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), sBeverlyPed.ped)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sBeverlyPed.ped, -1)
ENDIF
MANAGE_CLEANUP_OF_BEVERLY_ON_FOOT_ANIMATIONS()
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
SET_PED_RESET_FLAG(sBeverlyPed.ped, PRF_DisableInVehicleActions, TRUE) // B*1480880 - stop bev clipping during reverse anims
RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - bEV ON BIKE - stopped cam override anim as Bev on the bike") ENDIF #ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - bEV ON BIKE - applied idle on bike anim FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped,sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
//TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - anim NOT set BEVERLY cam_pos_hand_override bev GETTING ON BIKE - cam_pos_hand_override INSTANT_BLEND_IN getting on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
IF IS_PED_GETTING_UP(sBeverlyPed.ped)
OR IS_PED_RAGDOLL(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped,sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - applied cam_pos_hand_override INSTANT_BLEND_IN getting UP FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - playing cam_pos_hand_override anim apparently FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
IF IS_ENTITY_VISIBLE(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped)
SET_ENTITY_VISIBLE(sObjCameraBeverly.object, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - hidden Bev camera for ragdoll / getting up FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
ELSE
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
STOP_ENTITY_ANIM(sBeverlyPed.ped, "cam_pos_hand_override", sAnimDictName_Pap1HandOverride, NORMAL_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - stopped cam_pos_hand_override NORMAL_BLEND_OUT not getting UP bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
IF NOT IS_ENTITY_VISIBLE(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped)
SET_ENTITY_VISIBLE(sObjCameraBeverly.object, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - reset Bev camera Visible FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
ENDIF
ENDIF
/* fail attempt to use the cam override anim on Bev prior to him starting the custom get_in anims
but this failed on anim playing check maybe because they are from a clipset?
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ds", "get_in")
AND NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ps", "get_in")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - bev GETTING ON BIKE - RESET_PED_MOVEMENT_CLIPSET & applied cam_pos_hand_override FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ds", "get_in")
OR IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ps", "get_in")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
STOP_ENTITY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - bev GETTING ON BIKE - stopped cam_pos_hand_override anim for get_in anims FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "here") // ok so this isn't working because checking if Bev is playing one of the get_in anims isn't returning when it should do.. maybe because its actually a clipset?
ENDIF
ENDIF
ELSE
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
ENDIF*/
ENDIF
ENDPROC
/// PURPOSE:
/// Handle the mission flow for when the player and Beverly are on the bike.
/// moved this code here to improve readability as MANAGE_PLAYER_AND_BEVERLY() had became pretty big
PROC MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY()
// Blip Beverly up when he's off the bike
IF NOT DOES_BLIP_EXIST(sBeverlyPed.blip)
sBeverlyPed.blip = CREATE_PED_BLIP(sBeverlyPed.ped, TRUE, TRUE)
ENDIF
IF NOT bHasBeverlyBeenRemovedFromPlayerGroup
IF SHOULD_BEVERLY_BE_REMOVED_FROM_PLAYER_GROUP()
IF IS_PED_GROUP_MEMBER(sBeverlyPed.ped, PLAYER_GROUP_ID())
IF NOT IS_PED_RAGDOLL(sBeverlyPed.ped) // B*1441191 - apparently calls the REMOVE_PED_FROM_GROUP need to delay for ragdoll since it will clear immediately causing ped to snap up
REMOVE_PED_FROM_GROUP(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - *PED GROUP* BEV removed from group Left Behind - PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - *PED GROUP* BEV Unable to remove on first call PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY") ENDIF #ENDIF
ENDIF
ENDIF
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
CLEAR_PED_TASKS(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - bev cleared tasks as getting in vehicle when removed from player group") ENDIF #ENDIF
ENDIF
UPDATE_BEVERLY_PLAY_FRUSTRATED_ON_FOOT_ANIM(TRUE)
bHasBeverlyBeenRemovedFromPlayerGroup = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY bHasBeverlyBeenRemovedFromPlayerGroup = TRUE") ENDIF #ENDIF
ELSE
IF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
// B*1521660 - cancel enter task if player is being a dick
FLOAT fBikeSpeed = GET_ENTITY_SPEED(sBeverlyVehicle.vehicle)
IF fBikeSpeed < 1.75
AND IS_ENTITY_IN_RANGE_ENTITY(sBeverlyPed.ped, sBeverlyVehicle.vehicle, 8.0)
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_ENTER_VEHICLE)
TASK_BEVERLY_TO_GET_ON_HIS_BIKE()
ENDIF
ELSE
IF IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_ENTER_VEHICLE)
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
CLEAR_PED_TASKS(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY cleared enter vehicle task : speed was ", fBikeSpeed) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
CLEANUP_BEVERLY_ON_BIKE_ANIMS()
// B*1338882 - player not given enough time to get back on the bike to rejoin chase
IF eMissionStage = MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
OR eMissionStage = MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
OR eMissionStage = MISSION_STAGE_STOP_RIVAL_PAP
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_ENTER_VEHICLE)
SET_PED_MIN_MOVE_BLEND_RATIO(sBeverlyPed.ped, 1.5) // group behaviour automatically makes ped walk slowing to get in a vehicle, i need it to be faster
ENDIF
SET_PED_RESET_FLAG(sBeverlyPed.ped, PRF_UseFastEnterExitVehicleRates, TRUE) // to improve slowness getting in vehicles
ENDIF
ENDIF
ENDIF
ELSE
IF SHOULD_BEVERLY_JOIN_PLAYER_GROUP()
CLEAR_PED_TASKS(sBeverlyPed.ped)
SET_BEVERLY_FOLLOW_PLAYER()
//play Bev comment about player leaving him behind
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_PRTB01", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - Bev comment about player leaving him triggered ]]]") ENDIF #ENDIF
// Where the hell did you go?
// I thought you'd bailed on me, man!
// Get your head in the game!
// There you are, Christ, stay with me!
// I thought we were a team here.
// We don't have time to mess around.
ENDIF
ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY bHasBeverlyBeenRemovedFromPlayerGroup = FALSE") ENDIF #ENDIF
bHasBeverlyBeenRemovedFromPlayerGroup = FALSE
ELSE
// having to keep checking this here now because of // B*1441191
IF IS_PED_GROUP_MEMBER(sBeverlyPed.ped, PLAYER_GROUP_ID())
IF NOT IS_PED_RAGDOLL(sBeverlyPed.ped) // B*1441191 - apparently calls the REMOVE_PED_FROM_GROUP need to delay for ragdoll since it will clear immediately causing ped to snap up
REMOVE_PED_FROM_GROUP(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - *PED GROUP* BEV removed from group *on further attempts after ragdoll initial check* - PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY") ENDIF #ENDIF
ENDIF
ENDIF
IF NOT bDoneObjective_ReturnToBeverly
PRINT_NOW("PAP1_08", DEFAULT_GOD_TEXT_TIME, 1) //Return to ~b~Beverly.~s~
bDoneObjective_ReturnToBeverly = TRUE
ENDIF
UPDATE_BEVERLY_PLAY_FRUSTRATED_ON_FOOT_ANIM()
//Play bev comment about leaving him behind, setup in D* as random dialogue
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer_BevLeftBehind = GET_GAME_TIMER()
ELSE
IF (GET_GAME_TIMER() - iDialogueTimer_BevLeftBehind > TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE)
IF (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE + 15) // larger range to give this the chance to play
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_IG6", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "BEV LEFT BEHIND DIALOGUE TRIGGERED ]]]") ENDIF #ENDIF
iDialogueTimer_BevLeftBehind = GET_GAME_TIMER()
// Don't leave me here!
// Do you know who I am?
// You're walking away from fame, man!
// I make reputations! I break reputations!
// Wait, this is your chance to make a difference!
// Do you want to be a nobody your whole life?
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_HEADTRACKING_PED(sBeverlyPed.ped, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1)
ENDIF
IF NOT IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), sBeverlyPed.ped)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sBeverlyPed.ped, -1)
ENDIF
MANAGE_CLEANUP_OF_BEVERLY_ON_FOOT_ANIMATIONS()
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
SET_PED_RESET_FLAG(sBeverlyPed.ped, PRF_DisableInVehicleActions, TRUE) // B*1480880 - stop bev clipping during reverse anims
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - bEV ON BIKE - stopped cam override anim as Bev on the bike") ENDIF #ENDIF
ENDIF
/* ^^^ bev alt anim during Franklin helmet anim change - change out */
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - bEV ON BIKE - applied idle on bike anim") ENDIF #ENDIF
ENDIF
/* ^^^ change out end */
/* ^^^ bev alt anim during Franklin helmet anim change
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "veh@bike@sport@front@base", "put_on_helmet") // B*1422622 - Franklin's put on helmet animation cause him to clip through Beverly
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - bEV ON BIKE - applied idle on bike anim") ENDIF #ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still")
REQUEST_ANIM_DICT("veh@bike@sport@rear@base")
IF HAS_ANIM_DICT_LOADED("veh@bike@sport@rear@base")
TASK_PLAY_ANIM(sBeverlyPed.ped, "veh@bike@sport@rear@base", "still", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - bEV ON BIKE - applied still on bike anim whilst player puts on helmet") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - bEV ON BIKE - requestin anim dict for still idle - veh@bike@sport@rear@base for player puts on helmet") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF */
ELSE
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped,sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
//TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - anim NOT set BEVERLY cam_pos_hand_override bev GETTING ON BIKE - cam_pos_hand_override INSTANT_BLEND_IN getting on bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
IF IS_PED_GETTING_UP(sBeverlyPed.ped)
OR IS_PED_RAGDOLL(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped,sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - applied cam_pos_hand_override INSTANT_BLEND_IN getting UP FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - playing cam_pos_hand_override anim apparently FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
IF IS_ENTITY_VISIBLE(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped)
SET_ENTITY_VISIBLE(sObjCameraBeverly.object, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - hidden Bev camera for ragdoll / getting up FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
ELSE
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
STOP_ENTITY_ANIM(sBeverlyPed.ped, "cam_pos_hand_override", sAnimDictName_Pap1HandOverride, NORMAL_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - stopped cam_pos_hand_override NORMAL_BLEND_OUT not getting UP bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
IF NOT IS_ENTITY_VISIBLE(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped)
SET_ENTITY_VISIBLE(sObjCameraBeverly.object, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE - reset Bev camera Visible FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
ENDIF
ENDIF
/* fail attempt to use the cam override anim on Bev prior to him starting the custom get_in anims
but this failed on anim playing check maybe because they are from a clipset?
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ds", "get_in")
AND NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ps", "get_in")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - bev GETTING ON BIKE - RESET_PED_MOVEMENT_CLIPSET & applied cam_pos_hand_override FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ds", "get_in")
OR IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_1_ps", "get_in")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
STOP_ENTITY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - bev GETTING ON BIKE - stopped cam_pos_hand_override anim for get_in anims FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "here") // ok so this isn't working because checking if Bev is playing one of the get_in anims isn't returning when it should do.. maybe because its actually a clipset?
ENDIF
ENDIF
ELSE
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
ENDIF*/
ENDIF
ENDPROC
/// PURPOSE:
/// Handles player and Beverly
PROC MANAGE_PLAYER_AND_BEVERLY()
PAP1_PLAYER_TRANSPORT_STATE_ENUM eNewPlayerTransportState
eNewPlayerTransportState = GET_UPDATED_PLAYER_TRANSPORT_STATE()
IF eNewPlayerTransportState <> ePlayerTransportState // if state has changed
CLEANUP_PLAYER_TRANSPORT_STATE(ePlayerTransportState) // cleanup the current state
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_PLAYER_AND_BEVERLY - state change - ", ePlayerTransportState, " -> ", eNewPlayerTransportState) ENDIF #ENDIF
ePlayerTransportState = eNewPlayerTransportState // set the new state
ENDIF
SWITCH ePlayerTransportState
CASE PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV
MANAGE_FLOW_FOR_PLAYER_AND_BEVERLY_ON_BIKE()
BREAK
CASE PAP1_PLAYER_TRANSPORT_STATE_OFF_THE_BIKE
MANAGE_FLOW_FOR_PLAYER_OFF_THE_BIKE()
BREAK
CASE PAP1_PLAYER_TRANSPORT_STATE_WAIT_FOR_BEVERLY
MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY()
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// requests the assets for the outro mocap cutscene entities so SET_CUTSCENE_PED_COMPONENT_VARIATION_... can be called
PROC SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
// B*1521921 - manually set player's components to ensure helmet appears if player is wearing it
// if variation was set when player had no helmet, need to check for helmet being put on after this point inoder to reload cutscene for updated variations
IF NOT IS_PED_WEARING_HELMET(PLAYER_PED_ID())
bCheckForPlayerHelmetChange = TRUE
CPRINTLN(DEBUG_MISSION, "SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - player wasn't wearing helmet - Frame Count : ", GET_FRAME_COUNT())
ELSE
bCheckForPlayerHelmetChange = FALSE
CPRINTLN(DEBUG_MISSION, "SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - player wearing helmet - Frame Count : ", GET_FRAME_COUNT())
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sSceneHandle_Franklin, PLAYER_PED_ID(), GET_ENTITY_MODEL(PLAYER_PED_ID()), CBF_MASKS|CBF_HEADSETS|CBF_PARACHUTES)
CPRINTLN(DEBUG_MISSION, "SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED player - Frame Count : ", GET_FRAME_COUNT())
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sBeverlyPed.ped)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(sSceneHandle_Beverly, sBeverlyPed.ped)
CPRINTLN(DEBUG_MISSION, "SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED bev - Frame Count : ", GET_FRAME_COUNT())
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles requesting mocap on player approach and releasing outro mocap if player moves away
/// Also sets the player variation by calling SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
PROC MANAGE_OUTRO_MOCAP_LOADING()
IF IS_COORD_IN_RANGE_OF_COORD(GET_ENTITY_COORDS(PLAYER_PED_ID()), vDropOffPoint, DEFAULT_CUTSCENE_LOAD_DIST)
IF NOT IS_PLAYER_CHANGING_CLOTHES()
REQUEST_CUTSCENE(tlOutroMocapName)
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
bRequestedOutroMocap = TRUE
ENDIF
ELSE
IF bRequestedOutroMocap
IF NOT IS_COORD_IN_RANGE_OF_COORD(GET_ENTITY_COORDS(PLAYER_PED_ID()), vDropOffPoint, DEFAULT_CUTSCENE_UNLOAD_DIST)
IF HAS_CUTSCENE_LOADED()
REMOVE_CUTSCENE()
bRequestedOutroMocap = FALSE
bCheckForPlayerHelmetChange = FALSE
CPRINTLN(DEBUG_MISSION, "MANAGE_OUTRO_MOCAP_LOADING - unloaded ", tlOutroMocapName, " Frame Count : ", GET_FRAME_COUNT())
ENDIF
ELSE
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
ENDIF
ENDIF
ENDIF
// B*1521921 - have to bin off the mocap if requested to start over
IF bRequestedOutroMocap
IF bCheckForPlayerHelmetChange // this is only set to true when the cutscene variations are set so we know if can be binned off and start again
IF IS_PED_WEARING_HELMET(PLAYER_PED_ID())
REMOVE_CUTSCENE()
bRequestedOutroMocap = FALSE
bCheckForPlayerHelmetChange = FALSE
CPRINTLN(DEBUG_MISSION, "MANAGE_OUTRO_MOCAP_LOADING - unloaded ", tlOutroMocapName, " helmet change!!! Frame Count : ", GET_FRAME_COUNT())
ENDIF
ENDIF
IF IS_PLAYER_CHANGING_CLOTHES()
REMOVE_CUTSCENE()
bRequestedOutroMocap = FALSE
CPRINTLN(DEBUG_MISSION, "MANAGE_OUTRO_MOCAP_LOADING - unloaded ", tlOutroMocapName, " player changing clothes! Frame Count : ", GET_FRAME_COUNT())
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Changes the mission's current stage
/// PARAMS:
/// msStage - Mission stage to switch to
PROC SET_STAGE(MISSION_STAGE msStage)
eMissionStage = msStage
eSubStage = SS_SETUP
ENDPROC
//-------------------------------------------------------------------------------------------------------------------------------------------------
// Script Terminated Functions
//-------------------------------------------------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Removes all the assets loaded by the mission, used in mission cleanup and reset mission functions.
/// PARAMS:
/// bClearTextSlots - if TRUE CLEAR_ADDITIONAL_TEXT on MISSION_TEXT_SLOT
PROC UNLOAD_ALL_MISSION_ASSETS(BOOL bClearTextSlots = TRUE)
REMOVE_ANIM_DICT(sAnimDictName_Pap1Specific)
REMOVE_ANIM_DICT(tlAnimDict_BeverlyShoutComeOn)
REMOVE_ANIM_DICT(sAnimDictName_Pap1HandOverride) // anim dict containing camera in hand override
REMOVE_ANIM_SET(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(TRUE)) // anim clipset containing Bev get on bike left side override
REMOVE_ANIM_SET(GET_BEVERLY_ENTER_VEHICLE_CLIPSET_NAME(FALSE)) // anim clipset containing Bev get on bike right side override
REMOVE_ANIM_DICT(tlRivalPapInjuredAnims)
REMOVE_ANIM_DICT("rcmpaparazzo1ig_4") // ped shooting up in vehicle anim
REMOVE_ANIM_SET(sAnimSet_BeverlyCameraWeaponMovementOnFoot) // pap holding camera movement
REMOVE_PTFX_ASSET()
RELEASE_SOUND_ID(iSoundId_BikeAttack_MeleeHit)
RELEASE_SOUND_ID(iSoundId_BikeAttack_MeleeSwipe)
RELEASE_SOUND_ID(iSoundId_CameraFlash)
RELEASE_SCRIPT_AUDIO_BANK()
UNREGISTER_SCRIPT_WITH_AUDIO()
//uber recording stuff
REMOVE_VEHICLE_RECORDING(1, "Pap1RP")
REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE()
CLEANUP_UBER_PLAYBACK()
REMOVE_VEHICLE_RECORDING(1, "Pap1PV") //Special case recording for player vehicle, requested and used when skipping to stop rival pap stage
SET_MODEL_AS_NO_LONGER_NEEDED(sBeverlyPed.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sBeverlyVehicle.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sCelebPed.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sCelebsDriverPed.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sCelebVehicle.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sRivalPapPed.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sRivalPapDriverPed.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sRivalPapVehicle.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sObjCameraBeverly.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sObjFlashUnitBeverly.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sObjCameraRivalPap.model)
SET_MODEL_AS_NO_LONGER_NEEDED(sObjFlashUnitRivalPap.model)
REMOVE_VEHICLE_ASSET(sBeverlyVehicle.model) //entry / exit animations for Beverly's bike
IF bClearTextSlots
CLEAR_ADDITIONAL_TEXT(MISSION_TEXT_SLOT, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Deletes all of the blips used in the mission, checking if they exist.
PROC DELETE_ALL_MISSION_BLIPS()
SAFE_REMOVE_BLIP(sCelebPed.blip)
SAFE_REMOVE_BLIP(sCelebVehicle.blip)
SAFE_REMOVE_BLIP(sRivalPapPed.blip)
SAFE_REMOVE_BLIP(sRivalPapVehicle.blip)
SAFE_REMOVE_BLIP(blipIndexDropOffPoint)
ENDPROC
/// PURPOSE:
/// Deletes all of the mission entities checking if they exist
/// Used in Mission Failed, when faded out.
/// PARAMS:
/// bDelete - if true all entities will be deleted, else released
PROC CLEANUP_ALL_MISSION_ENTITIES(BOOL bDelete = FALSE)
CPRINTLN(DEBUG_MISSION, "CLEANUP_ALL_MISSION_ENTITIES() ~~~~~ called bDelete = ", bDelete)
SAFE_REMOVE_OBJECT(sObjSyringe.object, bDelete)
// B*1493509 - don't detach on release
IF DOES_ENTITY_EXIST(sObjFlashUnitBeverly.object)
ONLY_CLEAN_UP_OBJECT_WHEN_OUT_OF_RANGE(sObjFlashUnitBeverly.object)
ENDIF
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
ONLY_CLEAN_UP_OBJECT_WHEN_OUT_OF_RANGE(sObjCameraBeverly.object)
ENDIF
IF DOES_ENTITY_EXIST(sObjCameraRivalPap.object)
ONLY_CLEAN_UP_OBJECT_WHEN_OUT_OF_RANGE(sObjCameraRivalPap.object)
ENDIF
IF DOES_ENTITY_EXIST(sObjFlashUnitRivalPap.object)
ONLY_CLEAN_UP_OBJECT_WHEN_OUT_OF_RANGE(sObjFlashUnitRivalPap.object)
ENDIF
IF DOES_ENTITY_EXIST(objTrafficLightWestBound)
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objTrafficLightWestBound, TLO_NONE) // release control of the traffic lights
ENDIF
SAFE_REMOVE_OBJECT(objTrafficLightWestBound, FALSE) // don't delete the traffic lights grabbed from the world
IF DOES_ENTITY_EXIST(objTrafficLightEastBound)
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objTrafficLightEastBound, TLO_NONE) // release control of the traffic lights
ENDIF
SAFE_REMOVE_OBJECT(objTrafficLightEastBound, FALSE) // don't delete the traffic lights grabbed from the world
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF IS_PED_GROUP_MEMBER(sBeverlyPed.ped, PLAYER_GROUP_ID())
// B*1580046 - to help
SET_PED_CAN_TELEPORT_TO_GROUP_LEADER(sBeverlyPed.ped, PLAYER_GROUP_ID(), FALSE)
SET_PED_NEVER_LEAVES_GROUP(sBeverlyPed.ped, FALSE)
IF NOT IS_PED_RAGDOLL(sBeverlyPed.ped) // B*1441191 - apparently calls the REMOVE_PED_FROM_GROUP need to delay for ragdoll since it will clear immediately causing ped to snap up
REMOVE_PED_FROM_GROUP(sBeverlyPed.ped)
CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - *PED GROUP* BEV removed from group Left Behind - CLEANUP_ALL_MISSION_ENTITIES")
ELSE
SET_ENTITY_HEALTH(sBeverlyPed.ped, 0)
CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - *PED GROUP* BEV Unable to remove ragdoll so set his health to 0! CLEANUP_ALL_MISSION_ENTITIES")
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "MANAGE_FLOW_FOR_WAIT_FOR_BEVERLY - *PED GROUP* BEV not in player group CLEANUP_ALL_MISSION_ENTITIES")
ENDIF
RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
SET_ENTITY_LOAD_COLLISION_FLAG(sBeverlyPed.ped, FALSE)
SET_PED_KEEP_TASK(sBeverlyPed.ped, TRUE)
ENDIF
SAFE_REMOVE_PED(sBeverlyPed.ped, bDelete)
IF IS_PED_UNINJURED(sCelebPed.ped)
SET_ENTITY_LOAD_COLLISION_FLAG(sCelebPed.ped, FALSE)
SET_PED_KEEP_TASK(sCelebPed.ped, TRUE)
ENDIF
SAFE_REMOVE_PED(sCelebPed.ped, bDelete)
IF IS_PED_UNINJURED(sCelebsDriverPed.ped)
SET_PED_KEEP_TASK(sCelebsDriverPed.ped, TRUE)
ENDIF
SAFE_REMOVE_PED(sCelebsDriverPed.ped, bDelete)
IF IS_PED_UNINJURED(sRivalPapPed.ped)
SET_ENTITY_LOAD_COLLISION_FLAG(sRivalPapPed.ped, FALSE)
SET_PED_KEEP_TASK(sRivalPapPed.ped, TRUE)
ENDIF
SAFE_REMOVE_PED(sRivalPapPed.ped, bDelete)
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
SET_PED_KEEP_TASK(sRivalPapDriverPed.ped, TRUE)
ENDIF
SAFE_REMOVE_PED(sRivalPapDriverPed.ped, bDelete)
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
SET_VEHICLE_CAN_LEAK_OIL(sBeverlyVehicle.vehicle, TRUE)
SET_VEHICLE_CAN_LEAK_PETROL(sBeverlyVehicle.vehicle, TRUE)
MODIFY_VEHICLE_TOP_SPEED(sBeverlyVehicle.vehicle, 0.0)
SET_VEHICLE_STRONG(sBeverlyVehicle.vehicle, FALSE)
ENDIF
SAFE_REMOVE_VEHICLE(sBeverlyVehicle.vehicle, bDelete)
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
FREEZE_ENTITY_POSITION(sCelebVehicle.vehicle, FALSE)
SET_VEHICLE_CAN_LEAK_OIL(sCelebVehicle.vehicle, TRUE)
SET_VEHICLE_CAN_LEAK_PETROL(sCelebVehicle.vehicle, TRUE)
SET_DISABLE_PRETEND_OCCUPANTS(sCelebVehicle.vehicle, TRUE)
ENDIF
SAFE_REMOVE_VEHICLE(sCelebVehicle.vehicle, bDelete)
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
SET_VEHICLE_CAN_LEAK_OIL(sRivalPapVehicle.vehicle, TRUE)
SET_VEHICLE_CAN_LEAK_PETROL(sRivalPapVehicle.vehicle, TRUE)
SET_DISABLE_PRETEND_OCCUPANTS(sRivalPapVehicle.vehicle, TRUE)
MODIFY_VEHICLE_TOP_SPEED(sRivalPapVehicle.vehicle, 0.0)
ENDIF
SAFE_REMOVE_VEHICLE(sRivalPapVehicle.vehicle, bDelete)
ENDPROC
/// PURPOSE:
/// Mission cleanup
/// PARAMS:
/// bDeleteAll - if TRUE all entities are deleted, else released
/// bClearTextSlots - if TRUE CLEAR_ADDITIONAL_TEXT on MISSION_TEXT_SLOT
PROC MISSION_CLEANUP(BOOL bDeleteAll = FALSE, BOOL bClearTextSlots = TRUE)
INT i
CLEAR_PRINTS()
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(TRUE)
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
KILL_ANY_CONVERSATION()
SET_WANTED_LEVEL_MULTIPLIER(1.0)
DISABLE_CELLPHONE(FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_TIME_SCALE(1)
RC_END_CUTSCENE_MODE()
SET_AGGRESSIVE_HORNS(FALSE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(BUS, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(COACH, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(MULE, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(MULE2, FALSE)
DISABLE_TAXI_HAILING(FALSE)
//intro area
CLEAR_PED_NON_CREATION_AREA()
REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingIntroArea)
FOR i = 0 TO (PAP1_MAX_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1)
REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i])
ENDFOR
SET_SCENARIO_GROUP_ENABLED("ATTRACT_PAP", TRUE) // vehicle park up chain at the drop off point
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-1514.624146,-211.543411,46.786194>>, <<-1487.885254,-190.754852,59.494499>>, 25.000000) // drop off area
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vClearZone_DropOffPoint_Min, vClearZone_DropOffPoint_Max, TRUE)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-116.820381,261.006592,101.028191>>, <<-206.292038,266.383789,86.079262>>, 15.000000)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-190.01993, 260.10822, 85.0>>, <<-131.57199, 285.80911, 102.0>>, TRUE)
//SET_ROADS_BACK_TO_ORIGINAL(<< -227.98399, 209.28452, 75.96078 >>, << -210.06294, 244.48195, 99.00089 >>) //across road on hill junction (done since i have an uber car coming up straight after mocap
SET_ROADS_BACK_TO_ORIGINAL(<< -272.71304, 209.47295, 75.91507 >>, << -166.00862, 270.97842, 99.37162 >>) // major area covering the junction where I want the cars to move from
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PED_UNINJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_DontTakeOffHelmet, FALSE)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF DOES_CAM_EXIST(camCutsceneStart)
DESTROY_CAM(camCutsceneStart)
ENDIF
IF DOES_CAM_EXIST(camCutsceneFinish)
DESTROY_CAM(camCutsceneFinish)
ENDIF
IF IS_ENTITY_ALIVE(sCelebVehicle.vehicle)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sCelebVehicle.vehicle)
ENDIF
IF IS_ENTITY_ALIVE(sRivalPapVehicle.vehicle)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sRivalPapVehicle.vehicle)
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_INTRO")
STOP_AUDIO_SCENE("PAPARAZZO_01_INTRO")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_CHASE")
STOP_AUDIO_SCENE("PAPARAZZO_01_CHASE")
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_FAIL)
ENDIF
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE) // reset to default value
WAIT_FOR_CUTSCENE_TO_STOP()
SET_PLAYER_PED_DATA_IN_CUTSCENES() // B*1521921 - reset to default
REMOVE_PED_FOR_DIALOGUE(sDialogue, 1) // "FRANKLIN"
REMOVE_PED_FOR_DIALOGUE(sDialogue, 3) // "BEVERLY"
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // "RIVALPAP"
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
DELETE_ALL_MISSION_BLIPS()
REMOVE_RELATIONSHIP_GROUP(relGroupEnemy)
// REMOVE_RELATIONSHIP_GROUP(relGroupFriendly) no longer do this inorder to fix B*511728
CLEANUP_ALL_MISSION_ENTITIES(bDeleteAll)
SET_VEHICLE_MODEL_IS_SUPPRESSED(sBeverlyVehicle.model, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(sCelebVehicle.model, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(sRivalPapVehicle.model, FALSE)
UNLOAD_ALL_MISSION_ASSETS(bClearTextSlots)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE("act_cinema") // B* 1546752 - Restart cinema world brain.
#IF IS_DEBUG_BUILD
CLEANUP_MISSION_WIDGETS()
SET_DEBUG_ACTIVE(FALSE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
#ENDIF
CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - done")
ENDPROC
/// PURPOSE:
/// Handles call to MISSION_CLEANUP and terminates the thread
PROC Script_Cleanup()
// Ensure launcher is terminated
RC_CLEANUP_LAUNCHER()
// If the mission was triggered then additional mission cleanup will be required.
IF (Random_Character_Cleanup_If_Triggered())
PRINTSTRING("...Random Character Script was triggered so additional cleanup required") PRINTNL()
MISSION_CLEANUP()
ENDIF
//Cleanup the scene created by the launcher
RC_CleanupSceneEntities(sRCLauncherDataLocal)
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Mission Passed
PROC Script_Passed()
CPRINTLN(DEBUG_MISSION, "Script_Passed()")
SAFE_FADE_SCREEN_IN_FROM_BLACK()
ADD_CONTACT_TO_PHONEBOOK(CHAR_BEVERLY, FRANKLIN_BOOK)
// CREDIT_BANK_ACCOUNT(CHAR_FRANKLIN, BAAC_UNLOGGED_SMALL_ACTION, 500, FALSE, TRUE) // Initially requested on B*1237043 - Removed on request as B*1317037
Random_Character_Passed(CP_RAND_C_PAP1)
Script_Cleanup()
ENDPROC
/// PURPOSE:
/// updates the reason for mission failed
/// in order of most important fail reason so if multiple fails conditions have been set, we use the most important
PROC UPDATE_FAIL_REASON()
IF DOES_ENTITY_EXIST(sBeverlyPed.ped)
IF IS_ENTITY_DEAD(sBeverlyPed.ped)
OR IS_PED_INJURED(sBeverlyPed.ped)
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_BEVERLY_DIED")
eP1_MissionFailedReason = FAILED_BEVERLY_DIED
EXIT
ELSE
//if we have already failed for spooking Beverly, don't do the check again
IF eP1_MissionFailedReason = FAILED_BEVERLY_SPOOKED
EXIT
ENDIF
IF IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID()) // unfortunately have to do this otherwise falling off the bike clases as damaging Beverly
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sBeverlyPed.ped)
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_BEVERLY_SPOOKED - PLAYER DAMAGED BEV")
eP1_MissionFailedReason = FAILED_BEVERLY_SPOOKED
EXIT
ENDIF
ENDIF
// don't allow the mission to fail if the player is shooting whilst Beverly is on the bike with him
IF ePlayerTransportState != PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sBeverlyPed.ped, iFrameCountBeverlyLastSeenPlayer)
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBeverlyPed.ped, iFrameCountBeverlyLastSeenPlayer, GET_ENTITY_COORDS(PLAYER_PED_ID()), FALSE, FALSE)
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_BEVERLY_SPOOKED")
eP1_MissionFailedReason = FAILED_BEVERLY_SPOOKED
EXIT
ENDIF
ENDIF
ENDIF
ENDIF
//if we have already failed for killing the celeb, don't do the check again
IF eP1_MissionFailedReason = FAILED_CELEB_DIED
EXIT
ENDIF
//if the player has been damaging Miranda's vehicle, when it becomes undriveable, blow it up to speed up the mission failed.
//if the player is shooting at it, fail for attacking miranda
IF DOES_ENTITY_EXIST(sCelebVehicle.vehicle)
IF NOT IS_VEHICLE_DRIVEABLE(sCelebVehicle.vehicle)
EXPLODE_VEHICLE(sCelebVehicle.vehicle, TRUE)
IF IS_PED_UNINJURED(sCelebPed.ped)
EXPLODE_PED_HEAD(sCelebPed.ped)
ENDIF
IF IS_PED_UNINJURED(sCelebsDriverPed.ped)
EXPLODE_PED_HEAD(sCelebsDriverPed.ped)
ENDIF
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_CELEB_DIED")
eP1_MissionFailedReason = FAILED_CELEB_DIED
EXIT
ELSE
// Suggestion from Dave not to fail whilst rival pap is close by
IF eMissionStage = MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
or eMissionStage = MISSION_STAGE_DROP_BEVERLY_OFF
BOOL bAttackedCeleb = FALSE
BOOL bBlockShootLines = FALSE
// test for damaging celeb vehicle
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sCelebVehicle.vehicle, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sCelebVehicle.vehicle, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
CLEAR_ENTITY_LAST_WEAPON_DAMAGE(sCelebVehicle.vehicle)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sCelebVehicle.vehicle) // reset the damage check
bAttackedCeleb = TRUE
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - Franklin damaged celeb vehicle this frame FC :", GET_FRAME_COUNT())
ENDIF
ENDIF
//B* 1355878 - test for projectile being thrown by player
IF IS_PED_SHOOTING(PLAYER_PED_ID()) // less expensive check
VECTOR vLocal_CelebCoords = GET_ENTITY_COORDS(sCelebVehicle.vehicle)
IF IS_PROJECTILE_IN_AREA((vLocal_CelebCoords - << 5.0, 5.0, 5.0 >>), (vLocal_CelebCoords + << 5.0, 5.0, 5.0 >>), TRUE)
bAttackedCeleb = TRUE
bBlockShootLines = TRUE
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - Franklin player fired projectile at celeb vehicle this frame FC :", GET_FRAME_COUNT())
ENDIF
ENDIF
IF bAttackedCeleb
IF NOT bDoneDialogue_FailWarningAttackMiranda
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
// B*1312880 - don't display subtitles if objective is on screen
// B*1509531 - block shoot reference lines for projectiles
IF bBlockShootLines
IF PAP1_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_PSW", "PAP1_PSW_01", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Hey, what the fuck are you doing?
bDoneDialogue_FailWarningAttackMiranda = TRUE
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE //reset this so he doesn't respond after this comment
eBeverlyTakePhotoState = PAP1_BTPS_SETUP // reset Beverly taking photos state
ENDIF
ELSE
// random line
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_PSW", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Hey, what the fuck are you doing?
// That's not what I meant by shooting!
// Are you trying to get the cops on us?
// Who the hell are you shooting at?
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE //reset this so he doesn't respond after this comment
bDoneDialogue_FailWarningAttackMiranda = TRUE
eBeverlyTakePhotoState = PAP1_BTPS_SETUP // reset Beverly taking photos state
ENDIF
ENDIF
ELSE
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_PSW")
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_PLAYER_ATTACKED_CELEB VEHICLE")
eP1_MissionFailedReason = FAILED_PLAYER_ATTACKED_CELEB
EXIT
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//check for player leaving Beverly behind
IF bHasBeverlyBeenRemovedFromPlayerGroup
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF fDistance_PlayerToBeverly > PLAYER_LEFT_BEVERLY_DISTANCE
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_LEFT_BEVERLY_BEHIND")
eP1_MissionFailedReason = FAILED_LEFT_BEVERLY_BEHIND
EXIT
ENDIF
ENDIF
ENDIF
IF (eMissionStage > MISSION_STAGE_INTRO_MOCAP_SCENE)
IF (eMissionStage <> MISSION_STAGE_END_CUTSCENE)
IF DOES_ENTITY_EXIST(sBeverlyVehicle.vehicle)
IF IS_ENTITY_DEAD(sBeverlyVehicle.vehicle)
OR IS_ENTITY_IN_WATER(sBeverlyVehicle.vehicle)
OR NOT IS_VEHICLE_DRIVEABLE(sBeverlyVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_BEVERLY_VEHICLE_WRECKED")
eP1_MissionFailedReason = FAILED_BEVERLY_VEHICLE_WRECKED
EXIT
ENDIF
IF IS_VEHICLE_TYRE_BURST(sBeverlyVehicle.vehicle, SC_WHEEL_BIKE_FRONT)
IF IS_VEHICLE_TYRE_BURST(sBeverlyVehicle.vehicle, SC_WHEEL_BIKE_REAR)
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_BEVERLY_VEHICLE_WRECKED - wheels burst")
eP1_MissionFailedReason = FAILED_BEVERLY_VEHICLE_WRECKED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//if one of these fails has already been set, don't worry about retesting it
IF eP1_MissionFailedReason = FAILED_CELEB_ESCAPED
OR eP1_MissionFailedReason = FAILED_PAP_ESCAPED
EXIT
ENDIF
IF eMissionStage = MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
OR eMissionStage = MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
OR eMissionStage = MISSION_STAGE_STOP_RIVAL_PAP
IF NOT bDoneObjective_StopTheRivalPaparazzi // fail for losing celeb, up to "stop rival pap objective, then switch to losing rival pap fail
IF IS_PED_UNINJURED(sCelebPed.ped)
IF fCurrentChaseDistanceCeleb > CELEB_ESCAPED_DIST
//AND NOT IS_ENTITY_ON_SCREEN(sCelebPed.ped)
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_CELEB_ESCAPED")
eP1_MissionFailedReason = FAILED_CELEB_ESCAPED
EXIT
ENDIF
ENDIF
ELSE
IF IS_PED_UNINJURED(sRivalPapPed.ped)
IF IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapPed.ped)
IF fDistance_PlayerToRivalPap > RIVAL_PAP_ESCAPED_DIST
//AND NOT IS_ENTITY_OCCLUDED(sRivalPapPed.ped)
CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_PAP_ESCAPED")
eP1_MissionFailedReason = FAILED_PAP_ESCAPED
EXIT
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// cycles through the conditions to see if the player has failed
PROC MISSION_FAILED_CHECKS()
// don't allow mission failed checks during stage skips
IF bFinishedStageSkipping
IF eMissionStage != MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE // don't do the checks if we are already in the waiting for fade during fail stage
AND eMissionStage != MISSION_STAGE_INTRO_MOCAP_SCENE
AND eMissionStage != MISSION_STAGE_END_CUTSCENE
AND eMissionStage != MISSION_STAGE_MISSION_PASSED
UPDATE_FAIL_REASON()
IF eP1_MissionFailedReason <> FAILED_DEFAULT
SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles everything which needs to happen after END_REPLAY_SETUP() has been called
/// PARAMS:
/// eCurrentStage - which mission stage we are returning to
PROC REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY(MISSION_STAGE eReturnToStage)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SWITCH eReturnToStage
CASE MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
// B*1399624 - When failing the car chase in Paparazzo 1 Beverly spawns on the street instead of standing next to the motorbike
IF IS_PED_UNINJURED(sBeverlyPed.ped)
SET_ENTITY_COORDS_NO_OFFSET(sBeverlyPed.ped, sBeverlyPed.vSpawn)
SET_ENTITY_HEADING(sBeverlyPed.ped, sBeverlyPed.fSpawnHeading)
//CLEAR_PED_TASKS_IMMEDIATELY(sBeverlyPed.ped)
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
SET_BEVERLY_PLAY_COME_ON_ANIM("waive_comeback_f", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0.589, TRUE) // exact frame the mocap exit state ends with - real frame is 0.593
FORCE_PED_AI_AND_ANIMATION_UPDATE(sBeverlyPed.ped)
CPRINTLN(DEBUG_MISSION, "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : MISSION_STAGE_CHASE_CELEB_IN_VEHICLE : Bev respotted for skip FC = ", GET_FRAME_COUNT())
ENDIF
BREAK
CASE MISSION_STAGE_STOP_RIVAL_PAP
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
SAFE_TELEPORT_ENTITY(sBeverlyVehicle.vehicle, << -1736.5334, -508.0815, 37.9800 >>, 192.10) //Correct pos for vehicle recording
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : MISSION_STAGE_STOP_RIVAL_PAP ", "set player on bike for replay ****** ", " FC : ", GET_FRAME_COUNT())
ENDIF
// make sure Bev is playing anim ready
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT)
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY) // keep these slow bend out for hit timings
FORCE_PED_AI_AND_ANIMATION_UPDATE(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : MISSION_STAGE_STOP_RIVAL_PAP ", "set Bev to idle on bike pose") ENDIF #ENDIF
ENDIF
ENDIF
// Added because info from Matt, uber recording isn't updated each frame in the skip because of waits so ambient traffic could appear.
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0) // to help with Bev bike snap on fade up makes sure player is on the bike before playback kicks in
ENDIF
fMainPlaybackSpeed = 1.0 // Set the main play back speed to 1.0 for the skip
fCurrentChaseDistanceCeleb = 10 //reset to stop failed for escape triggering
fDistance_PlayerToRivalPap = 10
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 1, sPap1_UberRecordingName)
SET_PLAYBACK_SPEED(sCelebVehicle.vehicle, fMainPlaybackSpeed)
//FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sCelebVehicle.vehicle)
ELSE
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : MISSION_STAGE_STOP_RIVAL_PAP : unpaused celeb vehicle playback for skip FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, UBER_PLAYBACK_TIME_STOP_RIVAL_PAP_STAGE)
SET_UBER_PLAYBACK_TO_TIME_NOW(sCelebVehicle.vehicle, UBER_PLAYBACK_TIME_STOP_RIVAL_PAP_STAGE)
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn?
PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK()
CREATE_ALL_WAITING_UBER_CARS() //might help with some traffic failing to spawn?
UPDATE_UBER_PLAYBACK(sCelebVehicle.vehicle, fMainPlaybackSpeed)
ENDIF
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
PAP1_SET_CAR_AT_PLAYBACK_POSITION(sRivalPapVehicle.vehicle, 1, "Pap1RP", (UBER_PLAYBACK_TIME_STOP_RIVAL_PAP_STAGE - UBER_PLAYBACK_TIME_FOR_TRIGGER_RIVAL_PAP_RECORDING),
TRUE, FALSE, TRUE)
SET_PLAYBACK_SPEED(sRivalPapVehicle.vehicle, fMainPlaybackSpeed)
eRivalPapOnBikeProgress = PAP1_RIVAL_PAP_ON_BIKE_CHASING_AFTER_MIRANDA
iRivalTakesPhotosBurst = 4 // skip along the rival pap taking photos progress
ENDIF
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
SET_ENTITY_QUATERNION(sBeverlyVehicle.vehicle, 0.2702, 0.0882, 0.8814, -0.3772) //Correct quaternion for vehicle recording
PAP1_SET_CAR_AT_PLAYBACK_POSITION(sBeverlyVehicle.vehicle, 1, "Pap1PV", 250, TRUE, FALSE, TRUE)
SET_PLAYBACK_SPEED(sRivalPapVehicle.vehicle, fMainPlaybackSpeed)
// Added because info from Matt, uber recording isn't updated each frame in the skip because of waits so ambient traffic could appear.
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200, FALSE)
// Added because info from Matt, uber recording isn't updated each frame in the skip because of waits so ambient traffic could appear.
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : MISSION_STAGE_STOP_RIVAL_PAP : done FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
BREAK
CASE MISSION_STAGE_DROP_BEVERLY_OFF
SAFE_TELEPORT_ENTITY(sBeverlyVehicle.vehicle, <<-1586.6477, -533.9604, 34.4623>>, 307.1855)
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
SET_VEHICLE_ON_GROUND_PROPERLY(sBeverlyVehicle.vehicle)
ENDIF
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : MISSION_STAGE_DROP_BEVERLY_OFF ", "set player on bike for replay ****** ", " FC : ", GET_FRAME_COUNT())
ENDIF
// make sure Bev is playing anim ready
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT)
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_DROP_BEVERLY_OFF : MISSION_STAGE_STOP_RIVAL_PAP ", "set Bev to idle on bike pose") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 35.0, TRUE) // stop cars crashing straight into player when fade up
WAIT(0) // to help with Bev bike snap on fade up makes sure player is on the bike before playback kicks in
fCurrentChaseDistanceCeleb = 10 //reset to stop failed for escape triggering
fDistance_PlayerToRivalPap = 10
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : MISSION_STAGE_DROP_BEVERLY_OFF : done FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
BREAK
CASE MISSION_STAGE_END_CUTSCENE
SAFE_TELEPORT_ENTITY(sBeverlyVehicle.vehicle, vDropOffPoint, 221.0758)
RC_REQUEST_MID_MISSION_CUTSCENE(tlOutroMocapName) // can't use RC_REQUEST_CUTSCENE in this instance, as it causes bug 1000899
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_DROP_BEVERLY_OFF : ", "RC_REQUEST_MID_MISSION_CUTSCENE : PAP_1_MCS_1 ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
WHILE NOT RC_IS_CUTSCENE_OK_TO_START(TRUE)
RC_REQUEST_MID_MISSION_CUTSCENE(tlOutroMocapName) // can't use RC_REQUEST_CUTSCENE in this instance, as it causes bug 1000899
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_DROP_BEVERLY_OFF : ", "waiting on HAS_CUTSCENE_LOADED : PAP_1_MCS_1 ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
WAIT(0)
ENDWHILE
BREAK
ENDSWITCH
IF eReturnToStage != MISSION_STAGE_INTRO_MOCAP_SCENE
AND eReturnToStage != MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
IF IS_PED_UNINJURED(sBeverlyPed.ped)
SET_BEVERLY_FOLLOW_PLAYER()
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// skip the current stage in the mission flow
PROC SKIP_STAGE()
IF IS_PED_UNINJURED(PLAYER_PED_ID())
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
KILL_ANY_CONVERSATION()
CLEAR_PRINTS()
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
ENDIF
SWITCH eMissionStage
CASE MISSION_STAGE_INTRO_MOCAP_SCENE
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_INTRO_MOCAP_SCENE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
// if he hasn't got his helmet yet force it here, then config flags handles him not removing it till mission passed
IF NOT IS_PED_WEARING_HELMET(PLAYER_PED_ID())
GIVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE : ", "player helmet set ", " FC : ", GET_FRAME_COUNT())
ENDIF
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT)
ENDIF
ENDIF
SET_VEHICLE_ENGINE_ON(sBeverlyVehicle.vehicle, TRUE, TRUE) // make sure the engine is running
ENDIF
bHasPlayerGotOnBike_FirstTime = TRUE // set the flag as it's used by the chase rubberbanding
fCurrentChaseDistanceCeleb = 10 //reset to stop failed for escape triggering
IF NOT IS_REPLAY_BEING_SET_UP()
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE : ", "set player on bike NONE replay ****** ", " FC : ", GET_FRAME_COUNT())
ENDIF
ENDIF
SAFE_TELEPORT_ENTITY(sBeverlyVehicle.vehicle, << -1434.5149, -67.2538, 51.6780 >>, 130.5866)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
LOAD_ASSETS_FOR_RIVAL_PAP_ARRIVING()
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// do this after the wait for world to load
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 1, sPap1_UberRecordingName)
ENDIF
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, (UBER_PLAYBACK_TIME_RIVAL_PAP_JOIN_CHASE_STAGE))
SET_UBER_PLAYBACK_TO_TIME_NOW(sCelebVehicle.vehicle, UBER_PLAYBACK_TIME_RIVAL_PAP_JOIN_CHASE_STAGE)
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn?
PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK()
CREATE_ALL_WAITING_UBER_CARS() //might help with some traffic failing to spawn?
UPDATE_UBER_PLAYBACK(sCelebVehicle.vehicle, fMainPlaybackSpeed)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE : ", "celeb vehicle paused", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
// Added because info from Matt, uber recording isn't updated each frame in the skip because of waits so ambient traffic could appear.
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200, FALSE)
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_CHASE_CELEB_IN_VEHICLE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
IF eSubStage = SS_UPDATE
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT)
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
PAUSE_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_RIVAL_PAP_JOIN_CHASE : ", "celeb vehicle pause playback for skip", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
SKIP_TO_END_AND_STOP_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_RIVAL_PAP_JOIN_CHASE : ", "rival vehicle skip to end and stopped playback for skip", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
//Special recording for the player vehicle and load scene just for skipping to stop rival pap stage
IF eMissionSkipTargetStage = MISSION_STAGE_STOP_RIVAL_PAP
REQUEST_VEHICLE_RECORDING(1, "Pap1PV")
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(1, "Pap1PV")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_RIVAL_PAP_JOIN_CHASE : ", "loading vehicle rec for player to start stop rival pap stage", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
WAIT(0)
ENDWHILE
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP()
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_RIVAL_PAP_JOIN_CHASE : ", "set player on bike NONE replay ****** ", " FC : ", GET_FRAME_COUNT())
ENDIF
ENDIF
// moves player on bike to correct spot for load scene
SAFE_TELEPORT_ENTITY(sBeverlyVehicle.vehicle, << -1736.5334, -508.0815, 37.9800 >>, 192.10) //Correct pos for vehicle recording
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_STOP_RIVAL_PAP
WAIT_FOR_WORLD_TO_LOAD(<<-1727.6035, -524.8994, 36.6081>>, 75.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_RIVAL_PAP_JOIN_CHASE : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
bDoneDialogue_RivalPapTookPhoto[0] = TRUE //skip the rival pap spotted dialogue
bDoneDialogue_RivalPapTookPhoto[1] = TRUE //skip the rival pap spotted dialogue
iRivalTakesPhotosBurst = 4 //set to stop all flashing
iNumFlashesForRivalCamera = 0 //set to stop all flashing
fMainPlaybackSpeed = 1.0 // Set the main play back speed to 1.0 for the skip
fCurrentChaseDistanceCeleb = 10 //reset to stop failed for escape triggering
fDistance_PlayerToRivalPap = 10
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_RIVAL_PAP_JOIN_CHASE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_STOP_RIVAL_PAP
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT)
ENDIF
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sBeverlyVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sBeverlyVehicle.vehicle)
REMOVE_VEHICLE_RECORDING(1, "Pap1PV")
ENDIF
WAIT(0) //allow chance for vehicle recording to stop on player's bike
ENDIF
// stop the celebs recording (so it kills the uber recording)
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
ENDIF
ENDIF
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle)
ENDIF
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP()
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STOP_RIVAL_PAP : ", "set player on bike NONE replay ****** ", " FC : ", GET_FRAME_COUNT())
ENDIF
ENDIF
// moves player on bike to correct spot for load scene
SAFE_TELEPORT_ENTITY(sBeverlyVehicle.vehicle, <<-1586.6477, -533.9604, 34.4623>>, 307.1855)
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
SET_VEHICLE_ON_GROUND_PROPERLY(sBeverlyVehicle.vehicle)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_DROP_BEVERLY_OFF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STOP_RIVAL_PAP : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SAFE_TELEPORT_ENTITY(sRivalPapVehicle.vehicle, << -1594.5171, -537.8604, 34.2018 >>, 307.7577)
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
AND IS_PED_UNINJURED(sRivalPapPed.ped)
CLEAR_PED_TASKS(sRivalPapPed.ped)
CLEAR_PED_TASKS(sRivalPapDriverPed.ped)
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
SET_VEHICLE_ON_GROUND_PROPERLY(sRivalPapVehicle.vehicle)
IF NOT IS_PED_SITTING_IN_VEHICLE(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle)
ENDIF
IF NOT IS_PED_SITTING_IN_VEHICLE(sRivalPapPed.ped, sRivalPapVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(sRivalPapPed.ped, sRivalPapVehicle.vehicle, VS_FRONT_RIGHT)
ENDIF
WHILE NOT IS_PED_SITTING_IN_VEHICLE(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle)
OR NOT IS_PED_SITTING_IN_VEHICLE(sRivalPapPed.ped, sRivalPapVehicle.vehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STOP_RIVAL_PAP : ", "waiting for rival and driver to be on the bike", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
WAIT(0)
ENDWHILE
ENDIF
ENDIF
IF IS_PED_UNINJURED(sRivalPapPed.ped)
STOP_PED_SPEAKING(sRivalPapPed.ped, TRUE) // B*1493561 - hide grunts
DISABLE_PED_PAIN_AUDIO(sRivalPapPed.ped, TRUE) // B*1493561 - hide grunts
IF IS_PED_IN_ANY_VEHICLE(sRivalPapPed.ped)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_EASY)
IF CAN_KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
APPLY_FORCE_TO_ENTITY(sRivalPapPed.ped, APPLY_TYPE_IMPULSE, << 2.0, 0.0, -4.0 >>, <<0.0,0.21,0.0>>,
GET_PED_RAGDOLL_BONE_INDEX(sRivalPapPed.ped, RAGDOLL_HEAD), TRUE, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_STOP_RIVAL_PAP : MISSION_STAGE_DROP_BEVERLY_OFF : Rival paps knocked off bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_STOP_RIVAL_PAP : MISSION_STAGE_DROP_BEVERLY_OFF : Rival pap NOT knocked off bike CAN_KNOCK_PED_OFF_VEHICLE was FALSE FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
SET_ENTITY_HEALTH(sRivalPapPed.ped, 0)
ENDIF
ENDIF
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
STOP_PED_SPEAKING(sRivalPapDriverPed.ped, TRUE) // B*1493561 - hide grunts
DISABLE_PED_PAIN_AUDIO(sRivalPapDriverPed.ped, TRUE) // B*1493561 - hide grunts
IF IS_PED_IN_ANY_VEHICLE(sRivalPapDriverPed.ped)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapDriverPed.ped, KNOCKOFFVEHICLE_EASY)
IF CAN_KNOCK_PED_OFF_VEHICLE(sRivalPapDriverPed.ped)
KNOCK_PED_OFF_VEHICLE(sRivalPapDriverPed.ped)
APPLY_FORCE_TO_ENTITY(sRivalPapDriverPed.ped, APPLY_TYPE_IMPULSE, << 2.0, 0.0, -4.0 >>, <<0.0,0.21,0.0>>,
GET_PED_RAGDOLL_BONE_INDEX(sRivalPapDriverPed.ped, RAGDOLL_HEAD), TRUE, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_STOP_RIVAL_PAP : MISSION_STAGE_DROP_BEVERLY_OFF : Rival pap Driver knocked off bike FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_STOP_RIVAL_PAP : MISSION_STAGE_DROP_BEVERLY_OFF : Rival pap Driver NOT knocked off bike CAN_KNOCK_PED_OFF_VEHICLE was FALSE FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
SET_ENTITY_HEALTH(sRivalPapDriverPed.ped, 0)
ENDIF
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
APPLY_FORCE_TO_ENTITY(sRivalPapVehicle.vehicle, APPLY_TYPE_IMPULSE, << 2.0, 1.0, -4.0 >>, <<0.0,0.21,0.0>>, 0, TRUE, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_STOP_RIVAL_PAP : MISSION_STAGE_DROP_BEVERLY_OFF : Rival pap Vehicle impulse force applied FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
WAIT(750) // Needed for B*1493561 - allow some time for the peds to fall off the bike
fCurrentChaseDistanceCeleb = 10 //reset to stop failed for escape triggering
fDistance_PlayerToRivalPap = 10
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STOP_RIVAL_PAP : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DROP_BEVERLY_OFF
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF NOT IS_PED_SITTING_IN_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT)
ENDIF
ENDIF
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP()
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_DROP_BEVERLY_OFF : ", "set player on bike NONE replay ****** ", " FC : ", GET_FRAME_COUNT())
ENDIF
SAFE_TELEPORT_ENTITY(sBeverlyVehicle.vehicle, vDropOffPoint, 221.0758)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_END_CUTSCENE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_DROP_BEVERLY_OFF : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
bDoneDialogue_RivalPapCameraDestroyed = TRUE
bDoneWaitForCameraDestroyedDialogue = TRUE
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_DROP_BEVERLY_OFF : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_END_CUTSCENE
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_END_CUTSCENE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_LOSE_THE_COPS
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_LOSE_THE_COPS : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
DEFAULT
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Jumps to the stage selected
/// PARAMS:
/// eNewStage - stage to jump to
PROC JUMP_TO_STAGE(MISSION_STAGE eNewStage)
IF eMissionStage = eNewStage // skip current stage
IF IS_REPLAY_BEING_SET_UP()
END_REPLAY_SETUP(NULL, VS_DRIVER, FALSE) // player set onto bike handled by REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY
ENDIF
REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY(eMissionStage) // specific setup which must come after END_REPLAY_SETUP
SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS(eMissionStage)
// B*1481353 - don't fade back in here when skipping to mocap (let the mocap stage handle it)
IF eMissionStage = MISSION_STAGE_END_CUTSCENE
RC_END_Z_SKIP(DEFAULT, FALSE)
// don't reset the gameplay cams if we are coming out of the mocap
ELIF eMissionStage = MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
RC_END_Z_SKIP(FALSE)
ELSE
RC_END_Z_SKIP()
ENDIF
bFinishedStageSkipping = TRUE
bLoadedWorldForStageSkipping = FALSE
// ensure we are fully faded in if we have skipped to the mission passed stage, since the mission passed GUI doesn't display if not (seems to need a frame wait too)
IF eMissionStage = MISSION_STAGE_MISSION_PASSED
SAFE_FADE_SCREEN_IN_FROM_BLACK()
ENDIF
ELSE
SKIP_STAGE()
ENDIF
ENDPROC
/// PURPOSE:
/// Reset the mission, cleanups the current state and set's the mission up again
/// //USED by the mission replay checkpoint setup and Debug skips
PROC RESET_MISSION()
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_FAIL)
ENDIF
MISSION_CLEANUP(TRUE, FALSE)
#IF IS_DEBUG_BUILD // should really only get called in debug build
//set the initial scene back up
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_PAPARAZZO_1(sRCLauncherDataLocal)
CPRINTLN(DEBUG_MISSION, " RESET_MISSION - waiting on SetupScene_PAPARAZZO_1 ~~~~~")
WAIT(0)
ENDWHILE
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SETUP_AREA_FOR_MISSION(RC_PAPARAZZO_1, FALSE) // need to turn this off in this instance since launcher cleanup won't get called to do it
#ENDIF
//re do mission initialization
INIT_MISSION()
SET_STAGE(MISSION_STAGE_INTRO_MOCAP_SCENE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESET_MISSION - done") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Perform a Z skip. Used by the mission checkpoints and the debug Z skip function
/// PARAMS:
/// iNewStage - Mission stage we want to skip to
/// bResetMission - used when we go backwards in mission flow. If false we also don't stop the active cutscene in RC_START_Z_SKIP, instead handled in SKIP_STAGE to fix bug 1006740
PROC DO_Z_SKIP(INT iNewStage, BOOL bResetMission = FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DO_Z_SKIP with parameters - iNewStage = ", iNewStage, " bResetMission = ", bResetMission) ENDIF #ENDIF
RC_START_Z_SKIP(bResetMission, FALSE) // ensure z skip doesn't remove player's helmet!
IF bResetMission
RESET_MISSION()
ENDIF
eMissionSkipTargetStage = INT_TO_ENUM(MISSION_STAGE, iNewStage)
bFinishedStageSkipping = FALSE
IF IS_REPLAY_BEING_SET_UP()
bLoadedWorldForStageSkipping = TRUE
ELSE
bLoadedWorldForStageSkipping = FALSE
ENDIF
// load world for the mission start area if we are resetting the mission to the intro mocap. Moved here from script skip stage to fix bug 1006740 - mocap exit states not getting set as game is waiting on world to load before getting to check
// basically if you press CROSS to confirm which stage in the z menu, it skipped the mocap but couldn't sent exit states as it was waiting for world to load first.
IF NOT IS_REPLAY_BEING_SET_UP()
IF eMissionSkipTargetStage = MISSION_STAGE_INTRO_MOCAP_SCENE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-152.36, 279.07, 93.8134>>, -30.0) // moved back to start area
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DO_Z_SKIP - LOADED WORLD ready at mission start area framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DO_Z_SKIP") ENDIF #ENDIF
JUMP_TO_STAGE(eMissionSkipTargetStage)
ENDPROC
//-------------------------------------------------------------------------------------------------------------------------------------------------
// DEBUG - J,P and Z skip stuff
//-------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// check for debug S, F, P and J skips
PROC DEBUG_Check_Debug_Keys()
INT iNewStage
// Check for Pass
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
WAIT_FOR_CUTSCENE_TO_STOP()
IF IS_PED_UNINJURED(sBeverlyPed.ped)
CLEAR_PED_TASKS(sBeverlyPed.ped)
ENDIF
IF IS_PED_UNINJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_FAIL)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "S SKIP") ENDIF #ENDIF
Script_Passed()
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
WAIT_FOR_CUTSCENE_TO_STOP()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "F SKIP") ENDIF #ENDIF
SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE)
ENDIF
// Check for Skip forward
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
SWITCH eMissionStage
CASE MISSION_STAGE_LOSE_THE_COPS
iNewStage = ENUM_TO_INT(MISSION_STAGE_DROP_BEVERLY_OFF)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PRE STAGE, FROM LOSE COPS int now = ", iNewStage) ENDIF #ENDIF
BREAK
DEFAULT
iNewStage = ENUM_TO_INT(eMissionStage) + 1
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "J SKIP : ", "new stage = ", iNewStage) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, FALSE)
ENDIF
// Check for Skip backwards
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
SWITCH eMissionStage
CASE MISSION_STAGE_LOSE_THE_COPS
iNewStage = ENUM_TO_INT(MISSION_STAGE_DROP_BEVERLY_OFF)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PRE STAGE, FROM LOSE COPS int now = ", iNewStage) ENDIF #ENDIF
BREAK
DEFAULT
iNewStage = ENUM_TO_INT(eMissionStage)-1
BREAK
ENDSWITCH
IF iNewStage > -1
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "P SKIP : ", "new stage = ", iNewStage) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, TRUE)
ENDIF
ENDIF
// Z skip menu
IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, iNewStage)
// if we are skipping forward in the mission stages, just J skip rather than a full mission reset
IF (eMissionStage = MISSION_STAGE_LOSE_THE_COPS) // additional stages dealt seperately since they sit at the end of the MISSION_STAGE enum
IF iNewStage = ENUM_TO_INT(MISSION_STAGE_END_CUTSCENE) // trying to z skip past lose cops so don't reset mission
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", FALSE) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, FALSE)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", TRUE) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, TRUE)
ENDIF
ELIF (iNewStage <= ENUM_TO_INT(eMissionStage))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", TRUE) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, TRUE)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", FALSE) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, FALSE)
ENDIF
ENDIF
ENDPROC
#ENDIF
/// PURPOSE:
/// setups up the scenario blocking area, and clear areas needed when the mocap starts
/// Also performs the player vehicle resolves for the intro
PROC SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP()
// set the road changes up before the resolve vehicle checks
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-190.01993, 260.10822, 85.0>>, <<-131.57199, 285.80911, 102.0>>, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<-190.01993, 260.10822, 85.0>>, <<-131.57199, 285.80911, 102.0>>)
SET_ROADS_IN_ANGLED_AREA(<<-116.820381,261.006592,101.028191>>, <<-206.292038,266.383789,86.079262>>, 15.000000, TRUE, FALSE) // disable road nodes in front of the chase start area (near side of the road)
//SET_ROADS_IN_AREA(<< -227.98399, 209.28452, 75.96078 >>, << -210.06294, 244.48195, 99.00089 >>) //across road on hill junction (done since i have an uber car coming up straight after mocap
SET_ROADS_IN_AREA(<< -272.71304, 209.47295, 75.91507 >>, << -166.00862, 270.97842, 99.37162 >>, FALSE) // major area covering the junction where I want the cars to move from
CPRINTLN(DEBUG_MISSION, "DOES SNAPSHOT VEHICLE EXIST = ", DOES_ENTITY_EXIST(g_startSnapshot.mVehicleIndex))
VECTOR vPlayerLastVehicleRespotPosition = << -139.92, 276.95, 94.10 >>
FLOAT fPlayerLastVehicleRespotHeading = 178.24
VECTOR vRespotPosSizeLimit = << 4.5, 11.5, 20.0 >> // GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()
// Beverly position
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-153.917435,283.676300,91.763824>>, <<-147.120819,283.598938,96.901680>>, 7.0,
vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading, vRespotPosSizeLimit, TRUE, FALSE) // setVehicleAsVehGen parameter should no longer be used - SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN to handle it
// car park outside the resturant
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-180.003601,277.143250,91.162712>>, <<-147.960114,276.252960,96.102898>>, 9.0,
vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading, vRespotPosSizeLimit, TRUE, FALSE) // setVehicleAsVehGen parameter should no longer be used - SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN to handle it
// stretch position leading to first set of lights
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-204.188965,271.303528,89.886497>>, <<-170.883987,267.556366,95.117683>>, 12.0,
vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading, vRespotPosSizeLimit, TRUE, FALSE) // setVehicleAsVehGen parameter should no longer be used - SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN to handle it
VEHICLE_INDEX vehPlayerLast = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_OK(vehPlayerLast)
SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayerLast) // B*1397345 - veh seen dropping into position during mocap
CPRINTLN(DEBUG_MISSION, "SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP - set player last veh on ground properly framecount : ", GET_FRAME_COUNT())
ENDIF
// set the vehicle the player triggered the mission in to regenerate
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(vRespotPosSizeLimit, FALSE)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading, FALSE)
CPRINTLN(DEBUG_MISSION, "SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP - vehicle gen setup framecount : ", GET_FRAME_COUNT())
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP - vehicle to big to setup vehicle gen! framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
// clear intro cutscene
SET_PED_NON_CREATION_AREA(<< -191.42, 269.87, 91.10 >>, << -135.91, 296.20, 100.42 >>)
scenarioBlockingIntroArea = ADD_SCENARIO_BLOCKING_AREA(<< -191.42, 269.87, 91.10 >>, << -135.91, 296.20, 100.42 >>)
CLEAR_AREA_OF_PEDS(<< -151.66, 285.51, 92.76 >>, 20.0)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<-116.820381,261.006592,101.028191>>, <<-206.292038,266.383789,86.079262>>, 15.000000, FALSE, FALSE, FALSE, TRUE, TRUE) // near side of the main road
CLEAR_AREA_OF_VEHICLES(<< -162.42995, 279.91364, 92.71819 >>, 26.0) //carpark
CLEAR_AREA_OF_VEHICLES(<< -221.89508, 225.77153, 87.77625 >>, 20.0, TRUE) //across road on hill junction (done since i have an uber car coming up straight after mocap
//larger area for skipping since we are faded down anyway
IF NOT bFinishedStageSkipping
CLEAR_AREA_OF_VEHICLES(<< -162.42995, 279.91364, 92.71819 >>, 200, TRUE)
ENDIF
// try to make any lingering traffic flow out of the area
objTrafficLightWestBound = GET_CLOSEST_OBJECT_OF_TYPE(<< -237.65, 274.52, 91.00 >>, 10.0, prop_traffic_01a)
objTrafficLightEastBound = GET_CLOSEST_OBJECT_OF_TYPE(<< -205.82, 248.14, 91.01 >>, 10.0, prop_traffic_01a)
IF DOES_ENTITY_EXIST(objTrafficLightWestBound)
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objTrafficLightWestBound, TLO_GREEN) // make the remaining traffic flow out the area
ENDIF
IF DOES_ENTITY_EXIST(objTrafficLightEastBound)
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objTrafficLightEastBound, TLO_GREEN) // make the remaining traffic flow out the area
ENDIF
ENDPROC
/// PURPOSE:
/// wait until Beverly's animation match the start pose for the intro mocap
/// RETURNS:
/// TRUE when anim phase matches or player gets really close proximity
FUNC BOOL IS_BEVERLY_READY_TO_START_INTRO_MOCAP()
STRING sAnimDict_BeverlyIdles = "rcmpaparazzo1beckon"
FLOAT fCurrentPhase
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[0])
IF IS_ENTITY_PLAYING_ANIM(sRCLauncherDataLocal.pedID[0], sAnimDict_BeverlyIdles, "pap_idle_01")
//fCurrentPhase = GET_ENTITY_ANIM_CURRENT_TIME(sRCLauncherDataLocal.pedID[0], sAnimDict_BeverlyIdles, "pap_idle_01")
//IF fCurrentPhase < 0.05
//OR fCurrentPhase > 0.98
CPRINTLN(DEBUG_MISSION, "IS_EVERLY_READY_TO_START_INTRO_MOCAP : return TRUE : Beverly reach suitable time in anim pap_idle_01 : framecount : ", GET_FRAME_COUNT())
RETURN TRUE
//ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sRCLauncherDataLocal.pedID[0], sAnimDict_BeverlyIdles, "pap_idle_action_01")
fCurrentPhase = GET_ENTITY_ANIM_CURRENT_TIME(sRCLauncherDataLocal.pedID[0], sAnimDict_BeverlyIdles, "pap_idle_action_01")
IF fCurrentPhase < 0.198
OR fCurrentPhase > 0.957
CPRINTLN(DEBUG_MISSION, "IS_EVERLY_READY_TO_START_INTRO_MOCAP : return TRUE : Beverly reach suitable time in anim pap_idle_action_01 : framecount : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sRCLauncherDataLocal.pedID[0], sAnimDict_BeverlyIdles, "pap_idle_02")
//fCurrentPhase = GET_ENTITY_ANIM_CURRENT_TIME(sRCLauncherDataLocal.pedID[0], sAnimDict_BeverlyIdles, "pap_idle_02")
//IF fCurrentPhase < 0.008
//OR fCurrentPhase > 0.99
CPRINTLN(DEBUG_MISSION, "IS_EVERLY_READY_TO_START_INTRO_MOCAP : return TRUE : Beverly reach suitable time in anim pap_idle_02 : framecount : ", GET_FRAME_COUNT())
RETURN TRUE
//ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sRCLauncherDataLocal.pedID[0], sAnimDict_BeverlyIdles, "pap_idle_action_02")
fCurrentPhase = GET_ENTITY_ANIM_CURRENT_TIME(sRCLauncherDataLocal.pedID[0], sAnimDict_BeverlyIdles, "pap_idle_action_02")
IF fCurrentPhase < 0.027
OR fCurrentPhase > 0.942
CPRINTLN(DEBUG_MISSION, "IS_EVERLY_READY_TO_START_INTRO_MOCAP : return TRUE : Beverly reach suitable time in anim pap_idle_action_02 : framecount : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "IS_EVERLY_READY_TO_START_INTRO_MOCAP : return TRUE : Beverly not playing any of the idle anims! : framecount : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// handles the focus push when arriving to trigger the cutscene
/// basically a gives player cam a hint to focus on Beverly and gets player walking over there
/// RETURNS:
/// TRUE if it's done
FUNC BOOL HAS_INTRO_FOCUS_PUSH_FINSHED()
// setup the hint camera or just turn to face if close already
IF iIntroFocusPushStage = 0
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0], 6.5) // don't trigger if we are close
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], (<<0, 0, 0>>), TRUE, -1, DEFAULT_INTERP_IN_TIME)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.37)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.7) // over left shoulder // -0.01) over right shoulder
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.1) //-0.05)
SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(0.0)
SET_GAMEPLAY_HINT_FOV(35.0)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
iIntroFocusPushTimer = GET_GAME_TIMER()
ELSE
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0])
CPRINTLN(DEBUG_MISSION, " HAS_INTRO_FOCUS_PUSH_FINSHED() : turn to face task only")
ENDIF
iIntroFocusPushTimer = -1
ENDIF
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0], 4000)
ENDIF
iIntroFocusPushStage++
CPRINTLN(DEBUG_MISSION, " HAS_INTRO_FOCUS_PUSH_FINSHED() : iIntroFocusPushStage++ =", iIntroFocusPushStage)
// wait for the timer to finsh
ELIF iIntroFocusPushStage = 1
IF iIntroFocusPushTimer = -1
OR (GET_GAME_TIMER() - iIntroFocusPushTimer) > (DEFAULT_INTERP_IN_TIME + 1000) // hint needs to remain for a second (takes 3 seconds to interpolate)
RETURN TRUE
ENDIF
ENDIF
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK) // wants him to walk at this point
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check if push in and wait for bev anims should be skipped
/// and cutscene should just trigger asap
/// RETURNS:
/// TRUE if Player gets too close to Bev or if replay /repeat play is being setup
FUNC BOOL SHOULD_INTRO_CUTSCENE_TRIGGER_IMMEDIATELY()
// allow this to go through regardless if a repeat play is being setup
IF IS_REPLAY_IN_PROGRESS()
OR IS_REPEAT_PLAY_ACTIVE()
OR IS_REPLAY_BEING_SET_UP()
OR NOT bFinishedStageSkipping
CPRINTLN(DEBUG_MISSION, "HAS_INTRO_FOCUS_PUSH_FINSHED : return TRUE : repeat play / replay active : framecount : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
// B*1426354 - area around Beverly where who'd expect the cutscene to kick in
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-150.362885,287.136047,91.135529>>, <<-150.419830,282.028625,97.263824>>, 6.500000)
CPRINTLN(DEBUG_MISSION, "HAS_INTRO_FOCUS_PUSH_FINSHED : return TRUE : player reached cutscene trigger area : framecount : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//-------------------------------------------------------------------------------------------------------------------------------------------------
// Mission Stages
//-------------------------------------------------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Franklin meets Beverly. Beverly spots a celebrity Miranda leaving a resturant
/// Beverly ask's Franklin to help him get some shots of Miranda
PROC STAGE_INTRO_MOCAP_SCENE()
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) //to stop vehicles blocking parking space during mocap
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) // reduce the vehicle density during the mocap
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
// don't request the mocap if we are skipping past this stage
IF NOT bFinishedStageSkipping
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-152.3902, 279.5714, 92.8134>>, 106.6662 ) // match mocap finished position and heading
// load world if target stage is the next stage
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE : SS_SETUP - bFinishedStageSkipping - LOADED WORLD ready for next stage after mocap framecount : ", GET_FRAME_COUNT())
ENDIF
ENDIF
ENDIF
ENDIF
// Remove temporary RC character BEVERLY and his camera
SAFE_DELETE_OBJECT(sRCLauncherDataLocal.objID[0])
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[0])
SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP()
IF NOT IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_INTRO")
START_AUDIO_SCENE("PAPARAZZO_01_INTRO")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SS_SETUP set audio scene active - ", "PAPARAZZO_01_INTRO") ENDIF #ENDIF
ENDIF
LOAD_MISSION_ASSETS(TRUE)
CREATE_BEVERLYS_BIKE_FOR_MISSION_START() // have to do this here, since it can be seen during the mocap cutscene otherwise
CREATE_ENTITIES_FOR_MISSION_START()
IF NOT IS_REPLAY_BEING_SET_UP()
IF IS_PED_UNINJURED(sBeverlyPed.ped)
//CLEAR_PED_TASKS_IMMEDIATELY(sBeverlyPed.ped)
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
SET_BEVERLY_PLAY_COME_ON_ANIM("waive_comeback_f", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0.589, TRUE) // exact frame the mocap exit state ends with - real frame is 0.593
FORCE_PED_AI_AND_ANIMATION_UPDATE(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE FOR SKIP - sBeverlyPed.ped - set skipped mocap exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// match cutscene exit state
IF NOT IS_REPLAY_BEING_SET_UP()
//FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK, 3000)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE FOR SKIP simulate player gait NON replay *** FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sBeverlyPed.ped, -1)
IF NOT IS_REPLAY_BEING_SET_UP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(11.7337) // match end of mocap
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-7.2753)
ENDIF
CPRINTLN(DEBUG_MISSION, "INTRO MOCAP SETUP DONE FOR SKIP - GOING TO SS_CLEANUP")
eSubStage = SS_CLEANUP
ELSE
// handled by player_ped_public.sch
/*IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
//SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(sSceneHandle_Franklin, PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED player set this frame : ", GET_FRAME_COUNT())
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED player failed this frame : ", GET_FRAME_COUNT())
ENDIF
ENDIF*/
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) // beverly launcher ped
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(sSceneHandle_Beverly, sRCLauncherDataLocal.pedID[0])
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED bev") ENDIF #ENDIF
ENDIF
ENDIF
RC_PLAYER_TRIGGER_SCENE_LOCK_IN() // need to prevent player interfering with Beverly whilst he's getting ready for the mocap to trigger
IF HAS_INTRO_FOCUS_PUSH_FINSHED()
AND IS_BEVERLY_READY_TO_START_INTRO_MOCAP()
OR SHOULD_INTRO_CUTSCENE_TRIGGER_IMMEDIATELY()
RC_REQUEST_CUTSCENE("PAP_1_RCM") // unable to do this prior to IS_BEVERLY_READY_TO_START_INTRO_MOCAP because it takes away player control
IF RC_IS_CUTSCENE_OK_TO_START(TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sSceneHandle_Franklin, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(sBeverlyPed.ped, sSceneHandle_Beverly, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sBeverlyPed.model)
REGISTER_ENTITY_FOR_CUTSCENE(sObjCameraBeverly.object, sSceneHandle_BeverlysCamera, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sObjCameraBeverly.model)
REGISTER_ENTITY_FOR_CUTSCENE(sObjFlashUnitBeverly.object, sSceneHandle_BeverlysCameraFlash, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sObjFlashUnitBeverly.model)
REGISTER_ENTITY_FOR_CUTSCENE(sCelebVehicle.vehicle, sSceneHandle_MirandasVehicle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sCelebVehicle.model)
REGISTER_ENTITY_FOR_CUTSCENE(sCelebPed.ped, sSceneHandle_Miranda, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sCelebPed.model)
REGISTER_ENTITY_FOR_CUTSCENE(sCelebsDriverPed.ped, sSceneHandle_MirandasDriver, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sCelebsDriverPed.model)
SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) // backup fade in, mainly for repeat play purposes.
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
START_CUTSCENE()
WAIT(0) //needed because cutscene doesn't start straight away, causing player to see vehicles getting removed.
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
// Remove temporary RC character BEVERLY and his camera
SAFE_DELETE_OBJECT(sRCLauncherDataLocal.objID[0])
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[0])
RC_CLEANUP_LAUNCHER() // ensure called same frame as mission blocking area are setup
RC_START_CUTSCENE_MODE(<< -149.75, 285.81, 93.67 >>, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) //has to be after start_cutscene and wait(0)
SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP()
IF NOT IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_INTRO")
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
START_AUDIO_SCENE("PAPARAZZO_01_INTRO")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SS_SETUP set audio scene active - ", "PAPARAZZO_01_INTRO") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SS_SETUP skipped for replay audio scene - ", "PAPARAZZO_01_INTRO") ENDIF #ENDIF
ENDIF
ENDIF
CREATE_BEVERLYS_BIKE_FOR_MISSION_START() // have to do this here, since it can be seen during the mocap cutscene otherwise
LOAD_MISSION_ASSETS(FALSE) // call to start requesting assets need for mocap end
CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SS_SETUP done")
eSubStage = SS_UPDATE
ENDIF
ELSE
REQUEST_CUTSCENE("PAP_1_RCM") // unable to use RC_REQUEST_CUTSCENE prior to IS_BEVERLY_READY_TO_START_INTRO_MOCAP because it takes away player control
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE, DEFAULT, FALSE)
ENDIF
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
// Get handle to Beverly's camera in the mocap
IF NOT DOES_ENTITY_EXIST(sObjCameraBeverly.object)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_BeverlysCamera))
sObjCameraBeverly.object = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_BeverlysCamera))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ObjCameraBeverly.object - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// Get handle to Beverly's flash unit in the mocap
IF NOT DOES_ENTITY_EXIST(sObjFlashUnitBeverly.object)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_BeverlysCameraFlash))
sObjFlashUnitBeverly.object = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_BeverlysCameraFlash))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sObjFlashUnitBeverly.object - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// Get handle to celeb vehicle in the mocap
IF NOT DOES_ENTITY_EXIST(sCelebVehicle.vehicle)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_MirandasVehicle))
sCelebVehicle.vehicle = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_MirandasVehicle))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sCelebVehicle.vehicle - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// Get handle to Celeb ped in the mocap
IF NOT DOES_ENTITY_EXIST(sCelebPed.ped)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_Miranda))
sCelebPed.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_Miranda))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sCelebPed.ped - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// Get handle to Celeb Driver ped in the mocap
IF NOT DOES_ENTITY_EXIST(sCelebsDriverPed.ped)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_MirandasDriver))
sCelebsDriverPed.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_MirandasDriver))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sCelebsDriverPed.ped - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// Get handle to Beverly in the mocap
IF NOT DOES_ENTITY_EXIST(sBeverlyPed.ped)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_Beverly))
sBeverlyPed.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_Beverly))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sBeverlyPed.ped - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// Set exit state for Beverly, his camera and flash unit
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Beverly)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
// set Beverly's correct position if the cutscene was skipped
IF WAS_CUTSCENE_SKIPPED()
AND IS_SCREEN_FADED_OUT()
SET_ENTITY_COORDS_NO_OFFSET(sBeverlyPed.ped, sBeverlyPed.vSpawn)
SET_ENTITY_HEADING(sBeverlyPed.ped, sBeverlyPed.fSpawnHeading)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - cutscene skipped, set Bev pos and heading FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sObjFlashUnitBeverly.object)
AND IS_ENTITY_ALIVE(sObjCameraBeverly.object)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_BeverlysCameraFlash)
ATTACH_ENTITY_TO_ENTITY(sObjFlashUnitBeverly.object, sObjCameraBeverly.object, 0, sObjFlashUnitBeverly.vOffset, sObjFlashUnitBeverly.vRotation)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sObjFlashUnitBeverly.object - set mocap exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_BeverlysCamera)
ATTACH_ENTITY_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped, GET_PED_BONE_INDEX(sBeverlyPed.ped, BONETAG_PH_R_HAND), sObjCameraBeverly.vOffset, sObjCameraBeverly.vRotation)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ObjCameraBeverly.object - set mocap exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
SETUP_BEVERLY_FOR_IN_GAME_START()
//CLEAR_PED_TASKS_IMMEDIATELY(sBeverlyPed.ped)
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
//TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1) moved the setup of next state
SET_BEVERLY_PLAY_COME_ON_ANIM("waive_comeback_f", INSTANT_BLEND_IN) // exact frame the mocap exit state ends with - real frame is 0.593
FORCE_PED_AI_AND_ANIMATION_UPDATE(sBeverlyPed.ped)
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_DO_NOTHING, FALSE, FAUS_CUTSCENE_EXIT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sBeverlyPed.ped - set mocap exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// Set exit state for Celeb, Driver and Celeb vehicle
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_PED_UNINJURED(sCelebPed.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Miranda)
IF NOT IS_PED_SITTING_IN_VEHICLE(sCelebPed.ped, sCelebVehicle.vehicle)
CLEAR_PED_TASKS_IMMEDIATELY(sCelebPed.ped)
SET_PED_INTO_VEHICLE(sCelebPed.ped, sCelebVehicle.vehicle, VS_BACK_RIGHT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sCelebPed.ped set into vehicle on exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
SETUP_CELEB_FOR_IN_GAME_START() // done after are tasks get cleared above
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sCelebPed.ped - set mocap exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
IF IS_PED_UNINJURED(sCelebsDriverPed.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_MirandasDriver)
IF NOT IS_PED_SITTING_IN_VEHICLE(sCelebsDriverPed.ped, sCelebVehicle.vehicle)
CLEAR_PED_TASKS_IMMEDIATELY(sCelebsDriverPed.ped)
SET_PED_INTO_VEHICLE(sCelebsDriverPed.ped, sCelebVehicle.vehicle, VS_DRIVER)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sCelebsDriverPed.ped set into vehicle on exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
SETUP_CELEB_DRIVER_FOR_IN_GAME_START() // done after are tasks get cleared above
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sCelebsDriverPed.ped - set mocap exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_MirandasVehicle)
SETUP_CELEB_VEHICLE_FOR_IN_GAME_START()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sCelebVehicle.vehicle - set mocap exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// Set exit state for Franklin
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Franklin)
IF IS_PED_UNINJURED(PLAYER_PED_ID())
IF WAS_CUTSCENE_SKIPPED()
AND IS_SCREEN_FADED_OUT()
//SET_ENTITY_COORDS_NO_OFFSET(PLAYER_PED_ID(), <<-152.4410, 279.5606, 92.8229>>)
//SET_ENTITY_HEADING(PLAYER_PED_ID(), 89.9099)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) // 5.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) //-16.0)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - cutscene skipped, set Player pos and heading FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
//FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK, 3000)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sBeverlyPed.ped, -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Franklin - set mocap exit state FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
bHasSetExitStateFromIntroMocapForGameplayCam = TRUE // stop setting the gameplay cam now.
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - bHasSetExitStateFromIntroMocapForGameplayCam set TRUE by can set exit state for Franklin FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
// unfortunately the only way to ensure the mocap camera blends out to gameplay cam at a sensible position is to spam this until the player's character exit state has fired
IF NOT bHasSetExitStateFromIntroMocapForGameplayCam
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) // 5.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) //-16.0)
ENDIF
IF WAS_CUTSCENE_SKIPPED()
AND IS_SCREEN_FADED_OUT()
REPLAY_STOP_EVENT()
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Camera - set mocap skipped values FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
CLEAR_AREA_OF_VEHICLES(<< -162.42995, 279.91364, 92.71819 >>, 200) //larger area for skipping since we are faded down anyway
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Clear cars - skipped over the mocap FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF NOT IS_CUTSCENE_PLAYING()
CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - mocap cutscene finished FC = ", GET_FRAME_COUNT())
LOAD_MISSION_ASSETS(TRUE)
CREATE_ENTITIES_FOR_MISSION_START()
//backup screen fade in, but not if we are skipping
IF bFinishedStageSkipping
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE)
ENDIF
eSubStage = SS_CLEANUP
ELSE
// B*1385066 - prevent cutscene skip during blend out
IF GET_CUTSCENE_TIME() >= 102000
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
ENDIF
IF DOES_ENTITY_EXIST(objTrafficLightWestBound)
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objTrafficLightWestBound, TLO_GREEN) // make the remaining traffic flow out the area
ENDIF
IF DOES_ENTITY_EXIST(objTrafficLightEastBound)
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objTrafficLightEastBound, TLO_GREEN) // make the remaining traffic flow out the area
ENDIF
LOAD_MISSION_ASSETS()
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - mocap progress Time : ", GET_CUTSCENE_TIME(), " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
ELSE
REPLAY_STOP_EVENT()
IF HAS_CUTSCENE_LOADED()
REMOVE_CUTSCENE()
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
IF bFinishedStageSkipping //only do this if we aren't stage skipping
RC_END_CUTSCENE_MODE()
ENDIF
IF DOES_ENTITY_EXIST(objTrafficLightWestBound)
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objTrafficLightWestBound, TLO_NONE) // release control of the traffic lights
ENDIF
SAFE_REMOVE_OBJECT(objTrafficLightWestBound, FALSE) // don't delete the traffic lights grabbed from the world
IF DOES_ENTITY_EXIST(objTrafficLightEastBound)
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objTrafficLightEastBound, TLO_NONE) // release control of the traffic lights
ENDIF
SAFE_REMOVE_OBJECT(objTrafficLightEastBound, FALSE) // don't delete the traffic lights grabbed from the world
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
SET_STAGE(MISSION_STAGE_CHASE_CELEB_IN_VEHICLE)
CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SS_CLEANUP done")
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Beverly takes photos of Miranda from the back of a motorbike
/// which Franklin is driving.
PROC STAGE_CHASE_CELEB_IN_VEHICLE()
MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
AND IS_PED_UNINJURED(sCelebsDriverPed.ped)
AND IS_PED_UNINJURED(sCelebPed.ped)
// B*1490105 - make sure ambient cars don't pull out on the player here (area isn't visible when we delete down the main road)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<-416.352783,222.045761,77.410965>>, <<-284.300873,233.325439,89.963669>>, 80.000000)
//Setup Uber Playback
INITIALISE_UBER_PLAYBACK(sPap1_UberRecordingName, 1, FALSE)
LOAD_UBER_DATA()
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
switch_SetPieceCar_to_ai_on_collision = TRUE
allow_veh_to_stop_on_any_veh_impact = TRUE
fUberPlaybackDensitySwitchOffRange = 285.0
//fPlaybackCarStreamingDistance = 160.0 // 120.0 // is default
traffic_block_vehicle_colour(true, traffic_black)
SET_RELEASED_DRIVERS_TO_EXIT_VEHICLES_ON_FLEE(TRUE) // B* 1490105 - stop peds driving the uber cars interfering with uber chase because of reaction to player shooting
PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK()
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UBER RECORDING KICKED OFF") ENDIF #ENDIF
FREEZE_ENTITY_POSITION(sCelebVehicle.vehicle, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 1, sPap1_UberRecordingName)
//PAUSE_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
//FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sCelebVehicle.vehicle)
//SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 0.1)
//SET_UBER_PLAYBACK_TO_TIME_NOW(sCelebVehicle.vehicle, 0.1)
//UNPAUSE_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sCelebVehicle.vehicle)
//#IF IS_DEBUG_BUILD DISPLAY_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, RDM_WHOLELINE) #ENDIF
CREATE_ALL_WAITING_UBER_CARS()
fMainPlaybackSpeed = 0.5
SET_PLAYBACK_SPEED(sCelebVehicle.vehicle, fMainPlaybackSpeed)
UPDATE_UBER_PLAYBACK(sCelebVehicle.vehicle, fMainPlaybackSpeed)
ENDIF
ENDIF
IF IS_PED_UNINJURED(sCelebPed.ped)
SET_PED_COMBAT_ATTRIBUTES(sCelebPed.ped, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sCelebPed.ped, CA_CAN_TAUNT_IN_VEHICLE, TRUE)
ENDIF
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_DontTakeOffHelmet, TRUE) // fixes multiple helmet issues plus lets player drive off quicker when falling off
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
MODIFY_VEHICLE_TOP_SPEED(sBeverlyVehicle.vehicle, BIKE_TOP_SPEED_MODIFIER)
ENDIF
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sCelebVehicle.vehicle, "PAPARAZZO_1_LIMO_GROUP")
iTimer_DelayBeverlyInitialTurnToFaceFranklin = GET_GAME_TIMER()
//B*1520472 - give player 20% boost if he has 15% or less
INT iTempStatValue
STAT_GET_INT(SP1_SPECIAL_ABILITY, iTempStatValue) // Franklin check Franklin has some charge in his bar (returns seconds, 30 being full)
IF iTempStatValue < 4.5 // 15 %
SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), 0.2, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE - special ability boost needed current value = ", iTempStatValue) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE - special ability boost NOT needed current value = ", iTempStatValue) ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sBeverlyPed.ped)
IF NOT IS_PED_HEADTRACKING_PED(sBeverlyPed.ped, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE - SS_SETUP : tasked Bev to look at player ^^^") ENDIF #ENDIF
ENDIF
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_START)
ENDIF
SET_PLAYER_PED_DATA_IN_CUTSCENES(FALSE, TRUE) // B*1521921 - manually set the player's cutscene variation for the outro to ensure helmet appears if needed
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_LOWEST)
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE - SS_SETUP done")
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
AND IS_VEHICLE_OK(sCelebVehicle.vehicle)
AND IS_PED_UNINJURED(sCelebPed.ped)
AND IS_PED_UNINJURED(sCelebsDriverPed.ped)
AND IS_PED_UNINJURED(sBeverlyPed.ped)
// only request the rival pap assets when the chase gets close to the spawn point
IF IS_ENTITY_IN_RANGE_COORDS(sCelebVehicle.vehicle, sRivalPapVehicle.vSpawn, 250.0)
LOAD_ASSETS_FOR_RIVAL_PAP_ARRIVING(FALSE) //request assets for rival pap section early
ENDIF
fDistance_PlayerToBeverly = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sBeverlyPed.ped)) // used in several functions
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "dist between player and beverly = ", fDistance_PlayerToBeverly) ENDIF #ENDIF
UPDATE_PAP1_UBER_CHASE_FUNCS_THIS_FRAME()
IF NOT bHasPlayerGotOnBike_FirstTime //slower speed whilst player hasn't got on the bike for the first time
IF NOT DOES_BLIP_EXIST(sBeverlyVehicle.blip)
sBeverlyVehicle.blip = CREATE_VEHICLE_BLIP(sBeverlyVehicle.vehicle)
ENDIF
IF NOT bDoneDialogue_InitialGetOnBike
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF HAS_TIME_PASSED(iTimer_DelayBeverlyInitialTurnToFaceFranklin, 500) // note also used to delay initial AI for Bev
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_BBF1", CONV_PRIORITY_MEDIUM)
// Let's go! You drive, I'll get the shot.
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1)
bDoneDialogue_InitialGetOnBike = TRUE
ENDIF
ENDIF
ELIF NOT bDoneObjective_GetOnBike
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
VEHICLE_INDEX vehTemp
IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
vehTemp = GET_VEHICLE_PED_IS_ENTERING(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle, TRUE) // bug fix 1042233
AND (sBeverlyVehicle.vehicle != vehTemp)
PRINT_NOW("PAP1_10", DEFAULT_GOD_TEXT_TIME, 1) // Get on Beverly's ~b~motorbike.~s~
ENDIF
iDialogueTimer_PlayerOffTheBike = GET_GAME_TIMER() // set this here for his random lines
bDoneObjective_GetOnBike = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE - done initial get on bike objective") ENDIF #ENDIF
ENDIF
ENDIF
//Play bev comment about getting on the bike, setup in D* as random dialogue taken from MANAGE_PLAYER_AND_BEVERLY()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer_PlayerOffTheBike = GET_GAME_TIMER()
ELSE
IF bDoneDialogue_InitialGetOnBike // wait for the initial dialogue
IF (GET_GAME_TIMER() - iDialogueTimer_PlayerOffTheBike > 1000) // really short delay
IF (fDistance_PlayerToBeverly < DIST_LIMIT_PLAYER_TO_BEVERLY_OK_FOR_DIALOGUE)
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
// allow comment without subtitle if
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, "PAP1_IG5", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Come on! Come on!
// This is the opportunity of a lifetime!
// Miranda Cowan, man! This is immense!
// What are you waiting for? This is important!
// Oh my God, if she gets away, I will lose my shit!!!
iDialogueTimer_PlayerOffTheBike = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE - GET ON THE BIKE DIALOGUE TRIGGERED - PAP1_IG5") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
OR IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle, TRUE)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
SAFE_REMOVE_BLIP(sBeverlyVehicle.blip)
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn)
STOP_ANIM_TASK(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn, REALLY_SLOW_BLEND_OUT)
ENDIF
TASK_CLEAR_LOOK_AT(sBeverlyPed.ped)
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
SET_BEVERLY_FOLLOW_PLAYER()
// stop the dialogue about getting on the bike if it's playing
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("PAP1_IG5")
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_BIKE)
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_INTRO")
STOP_AUDIO_SCENE("PAPARAZZO_01_INTRO")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE - SS_UPDATE stopped active audio scene ", "PAPARAZZO_01_INTRO") ENDIF #ENDIF
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_CHASE")
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
START_AUDIO_SCENE("PAPARAZZO_01_CHASE")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SS_SETUP set audio scene active - ", "PAPARAZZO_01_CHASE") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SS_SETUP skiped for replay audio scene active - ", "PAPARAZZO_01_CHASE") ENDIF #ENDIF
ENDIF
ENDIF
bHasPlayerGotOnBike_FirstTime = TRUE
ELSE
IF NOT IS_PED_HEADTRACKING_PED(sBeverlyPed.ped, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1)
ENDIF
IF IS_ENTITY_IN_RANGE_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), 4.5)
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn)
// STOP_ENTITY_ANIM(sBeverlyPed.ped, tlCurrentAnim_BeverlyShoutComeOn, tlAnimDict_BeverlyShoutComeOn, SLOW_BLEND_OUT)
// #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE Bev shout anim stopped for player proximity") ENDIF #ENDIF
ELSE
IF NOT IS_PED_FACING_PED(sBeverlyPed.ped, PLAYER_PED_ID(), 45.0)
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
TASK_TURN_PED_TO_FACE_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE Bev set to turn to Franklin") ENDIF #ENDIF
ENDIF
ENDIF
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
ENDIF
ELSE
IF HAS_TIME_PASSED(iTimer_DelayBeverlyInitialTurnToFaceFranklin, 250) // note also used to delay initial dialogue from Bev
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, tlAnimDict_BeverlyShoutComeOn, tlCurrentAnim_BeverlyShoutComeOn)
IF NOT IS_PED_FACING_PED(sBeverlyPed.ped, PLAYER_PED_ID(), 45.0)
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
TASK_TURN_PED_TO_FACE_ENTITY(sBeverlyPed.ped, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE Bev set to turn to Franklin") ENDIF #ENDIF
ENDIF
ELSE
IF HAS_TIME_PASSED(iTimerTillRepeatBevFrustratedAnim, TIME_DELAY_FOR_REPEATED_BEVERLY_FRUSTRATED_ANIM)
IF SET_BEVERLY_PLAY_COME_ON_ANIM("", NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT)
iTimerTillRepeatBevFrustratedAnim = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE Bev set to play come here anim") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
ELSE
iTimerTillRepeatBevFrustratedAnim = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
MANAGE_PLAYER_AND_BEVERLY()
ENDIF
MANAGE_PED_SHOOTING_UP(sCelebPed.ped)
//celeb reached trigger point in uber recording for rival pap to join in
IF fCurrentPlaybackTime >= UBER_PLAYBACK_TIME_RIVAL_PAP_JOIN_CHASE_STAGE
CPRINTLN(DEBUG_MISSION, "celeb REACHED TRIGGER POINT IN REOCORDING FOR RIVAL PAP CAM")
eSubStage = SS_CLEANUP
EXIT
ENDIF
//check to see if the player or has reached the rival pap area before the celeb
//DRAW_DEBUG_SPHERE(vRivalPapCam_CutsceneTriggerPos, CLOSE_TO_RIVAL_PAP_CAM_CUTSCENE_TRIGGER_DIST, 0, 0, 255, 120)
IF(GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vRivalPapCam_CutsceneTriggerPos) < CLOSE_TO_RIVAL_PAP_CAM_CUTSCENE_TRIGGER_DIST)
CPRINTLN(DEBUG_MISSION, "PLAYER CLOSE TO RIVAL PAP CAM TRIGGER AREA")
eSubStage = SS_CLEANUP
ENDIF
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "chase celeb cleanup") #ENDIF
UPDATE_PAP1_UBER_CHASE_FUNCS_THIS_FRAME()
//get this requested early
REQUEST_MODEL(sRivalPapVehicle.model)
SET_STAGE(MISSION_STAGE_RIVAL_PAP_JOIN_CHASE)
CPRINTLN(DEBUG_MISSION, "STAGE_CHASE_CELEB_IN_VEHICLE - SS_CLEANUP done")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Point where the rival pap joins in the chase
/// //Rival pap gets some good photos of Miranda
PROC STAGE_RIVAL_PAP_JOIN_CHASE()
VECTOR vPlayerPos
MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
IF NOT bDoneHintCamForRival
UPDATE_PAP1_UBER_CHASE_FUNCS_THIS_FRAME()
ELSE
UPDATE_PAP1_UBER_CHASE_FUNCS_THIS_FRAME(FALSE) //don't do chase hint cam for CELEB if we have switch to following the rival pap
ENDIF
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this to ensure Franklin doesn't say something straight away
LOAD_ASSETS_FOR_RIVAL_PAP_ARRIVING()
CREATE_RIVAL_PAP_FOR_ENTRANCE()
IF IS_PED_UNINJURED(sBeverlyPed.ped)
AND IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
//revert pap to idle anim
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
ENDIF
ENDIF
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - SS_SETUP done")
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
IF IS_PED_UNINJURED(sBeverlyPed.ped)
fDistance_PlayerToBeverly = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sBeverlyPed.ped)) // used in several functions
IF NOT IS_PED_UNINJURED(sRivalPapPed.ped)
//Rival is a dead to advance to next stage
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRivalPapPed.ped, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRivalPapPed.ped, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
bHasPlayerShotRivalPapOffBike = TRUE
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRivalPapPed.ped) // reset the damage check
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - rival pap dead - bHasPlayerShotRivalPapOffBike = TRUE")
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - rival pap dead - damaged by weapon check returned FALSE")
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - rival pap dead - entity damaged by player check returned FALSE")
ENDIF
eSubStage = SS_CLEANUP
ELIF NOT IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapPed.ped)
//rival pap has been knocked off the bike, so advance to next stage
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRivalPapPed.ped, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRivalPapPed.ped, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
bHasPlayerShotRivalPapOffBike = TRUE
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRivalPapPed.ped) // reset the damage check
SET_ENTITY_HEALTH(sRivalPapPed.ped, 0) // if the player shot him off the bike - make sure he dies from getting knocked off
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - rival pap knocked off - bHasPlayerShotRivalPapOffBike = TRUE")
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - rival pap knocked off - damaged by weapon check returned FALSE")
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - rrival pap knocked off - entity damaged by player check returned FALSE")
ENDIF
// extra check to see if the player shot the driver off
IF NOT bHasPlayerShotRivalPapOffBike
IF NOT IS_PED_UNINJURED(sRivalPapDriverPed.ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRivalPapDriverPed.ped, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRivalPapDriverPed.ped, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
bHasPlayerShotRivalPapOffBike = TRUE
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRivalPapDriverPed.ped) // reset the damage check
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - rival dead or off bike - but detected DRIVER dead by - bHasPlayerShotRivalPapOffBike = TRUE")
ENDIF
ENDIF
ELIF NOT IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapDriverPed.ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRivalPapDriverPed.ped, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRivalPapDriverPed.ped, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
bHasPlayerShotRivalPapOffBike = TRUE
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRivalPapDriverPed.ped) // reset the damage check
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - rival dead or off bike - but detected DRIVER of bike by - bHasPlayerShotRivalPapOffBike = TRUE")
ENDIF
ENDIF
ENDIF
ENDIF
eSubStage = SS_CLEANUP
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "dist between player and beverly = ", fDistance_PlayerToBeverly) ENDIF #ENDIF
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
fDistance_PlayerToRivalPap = VDIST(vPlayerPos, GET_ENTITY_COORDS(sRivalPapPed.ped))
UPDATE_RIVAL_PAP_ON_BIKE()
//celeb reached trigger point in uber recording where rival pap begins to peal off
//can also switch state if the spotted dialogue has finished early
IF fCurrentPlaybackTime >= UBER_PLAYBACK_TIME_STOP_RIVAL_PAP_STAGE
CPRINTLN(DEBUG_MISSION, " STAGE_RIVAL_PAP_JOIN_CHASE : celeb REACHED TRIGGER POINT IN REOCORDING FOR RIVAL PAP TO PEAL OFF, switch to STOP RIVAL PAP")
eSubStage = SS_CLEANUP
EXIT
ENDIF
// force rival off the bike if his driver has come off when he;s still on
IF NOT IS_PED_UNINJURED(sRivalPapDriverPed.ped)
IF IS_PED_ON_ANY_BIKE(sRivalPapPed.ped)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_EASY)
IF CAN_KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
CPRINTLN(DEBUG_MISSION, " STAGE_RIVAL_PAP_JOIN_CHASE : Rival pap knocked off bike in script - driver was injured")
ENDIF
ENDIF
ELIF NOT IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapDriverPed.ped)
SET_ENTITY_HEALTH(sRivalPapDriverPed.ped, 0) // kill him off if he fell off
IF IS_PED_ON_ANY_BIKE(sRivalPapPed.ped)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_EASY)
IF CAN_KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
CPRINTLN(DEBUG_MISSION, " STAGE_RIVAL_PAP_JOIN_CHASE : Rival pap knocked off bike in script - driver wasn't on bike")
ENDIF
ENDIF
ENDIF
ENDIF
//maintain chase hint cam switch over CELEB focus cam is handled in UPDATE_PAP1_UBER_CHASE_FUNCS_THIS_FRAME()
IF NOT bDoneHintCamForRival
IF fTimeInRivalPapRecording > 1000.0 //fTimeInRivalPapRecording is set in UPDATE_RIVAL_PAP_ON_BIKE()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
bDoneHintCamForRival = TRUE
ENDIF
ELSE
CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sRivalPapPed.ped)
ENDIF
MANAGE_PLAYER_AND_BEVERLY()
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
IF bFinishedStageSkipping //don't do this if we are skipping
UPDATE_RIVAL_PAP_ON_BIKE() //this will handle rival pap driver continuing to drive on his own if he's alive on the bike and also stop the bike recording if no driver
ENDIF
IF IS_PED_UNINJURED(sRivalPapPed.ped)
CONTROL_PED_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, sRivalPapPed.ped)
ENDIF
SET_STAGE(MISSION_STAGE_STOP_RIVAL_PAP)
CPRINTLN(DEBUG_MISSION, "STAGE_RIVAL_PAP_JOIN_CHASE - SS_CLEANUP done")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Player given objective to stop the rival paparazzi
/// Beverly tells player to drive along side the rival pap so he can knock him off in road rash style attack
PROC STAGE_STOP_RIVAL_PAP()
VECTOR vPlayerPos
MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
MANAGE_OUTRO_MOCAP_LOADING()
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_STOP_RIVAL_PAP - SS_SETUP ^^^^^^^^") ENDIF #ENDIF
UPDATE_PAP1_UBER_CHASE_FUNCS_THIS_FRAME(FALSE)
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this to ensure Franklin doesn't say something straight away
//check if he was rival was already killed or knocked off the bike in previous stage
IF NOT IS_PED_UNINJURED(sRivalPapPed.ped)
//Rival is a dead to advance to next stage
eSubStage = SS_CLEANUP
ELIF NOT IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapPed.ped)
//rival pap has been knocked off the bike, so advance to next stage
eSubStage = SS_CLEANUP
ELSE
UPDATE_RIVAL_PAP_ON_BIKE()
CONTROL_PED_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, sRivalPapPed.ped)
iTimer_DelayStopPlayerVehicleRecording_ForMissionStageSkip = GET_GAME_TIMER() //used to stop the player vehicle recording which is set when skipping to stage
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_STOP_RIVAL_PAP - SS_SETUP done")
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
//cleanup Player vehicle recording - only requested and used when skipping to stop rival pap stage
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sBeverlyVehicle.vehicle)
IF CHECK_FOR_PLAYER_INTERUPT_ROLLING_START()
OR HAS_TIME_PASSED(iTimer_DelayStopPlayerVehicleRecording_ForMissionStageSkip, TIME_DELAY_STOP_PLAYER_VEHICLE_RECORDING_FOR_STAGE_SKIP)
STOP_PLAYBACK_RECORDED_VEHICLE(sBeverlyVehicle.vehicle)
REMOVE_VEHICLE_RECORDING(1, "Pap1PV") //Special case recording for player vehicle, requested and used when skipping to stop rival pap stage
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER VEHICLE RECORDING STOPPED!!!") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_UNINJURED(sBeverlyPed.ped)
fDistance_PlayerToBeverly = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sBeverlyPed.ped)) // used in several functions
//uber recording
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
UPDATE_PAP1_UBER_CHASE_FUNCS_THIS_FRAME(FALSE)
IF NOT bDoneSetupCelebForCleanup
IF fCurrentPlaybackTime >= FINISH_UBER_RECORDING_EARLY_TIME
//cleanup uber recording
STOP_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
CLEANUP_UBER_PLAYBACK()
REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE()
REMOVE_VEHICLE_RECORDING(1 , sPap1_UberRecordingName)
SETUP_CELEB_DRIVERS_BEHAVIOUR_WHEN_UBER_RECORDING_FINISHES()
//added in attempt to populate roads better
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.6)
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.3)
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.6)
SET_VEHICLE_POPULATION_BUDGET(3)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDoneSetupCelebForCleanup - done early - STAGE_STOP_RIVAL_PAP update") ENDIF #ENDIF
bDoneSetupCelebForCleanup = TRUE
ENDIF
ENDIF
ELSE
// keep updating the dist check as we need it for dialogue - still chasing celeb instead of rival pap
IF IS_ENTITY_ALIVE(sCelebVehicle.vehicle)
fCurrentChaseDistanceCeleb = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCelebVehicle.vehicle))
ENDIF
IF NOT bDoneSetupCelebForCleanup
//cleanup uber recording
CLEANUP_UBER_PLAYBACK()
REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE()
REMOVE_VEHICLE_RECORDING(1 , sPap1_UberRecordingName)
//added in attempt to populate roads better
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.6)
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.3)
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.6)
SET_VEHICLE_POPULATION_BUDGET(3)
SETUP_CELEB_DRIVERS_BEHAVIOUR_WHEN_UBER_RECORDING_FINISHES()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDoneSetupCelebForCleanup - done - STAGE_STOP_RIVAL_PAP update") ENDIF #ENDIF
bDoneSetupCelebForCleanup = TRUE
ELSE
CLEANUP_CELEB_WHEN_AWAY_FROM_THE_PLAYER()
ENDIF
ENDIF
ENDIF
// maintain the overrides each frame
IF bDoneSetupCelebForCleanup
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.6)
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.3)
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.6)
ENDIF
IF NOT IS_PED_UNINJURED(sRivalPapPed.ped)
//Rival is a dead to advance to next stage
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRivalPapPed.ped, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRivalPapPed.ped, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
bHasPlayerShotRivalPapOffBike = TRUE
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRivalPapPed.ped) // reset the damage check
CPRINTLN(DEBUG_MISSION, "STAGE_STOP_RIVAL_PAP - rival pap dead - bHasPlayerShotRivalPapOffBike = TRUE")
ENDIF
ENDIF
eSubStage = SS_CLEANUP
ELIF NOT IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapPed.ped)
//rival pap has been knocked off the bike, so advance to next stage
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRivalPapPed.ped, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRivalPapPed.ped, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
bHasPlayerShotRivalPapOffBike = TRUE
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRivalPapPed.ped) // reset the damage check
SET_ENTITY_HEALTH(sRivalPapPed.ped, 0) // if the player shot him off the bike - make sure he dies from getting knocked off
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_STOP_RIVAL_PAP - rival pap off bike - bHasPlayerShotRivalPapOffBike = TRUE") ENDIF #ENDIF
ENDIF
ENDIF
// extra check to see if the player shot the driver off
IF NOT bHasPlayerShotRivalPapOffBike
IF NOT IS_PED_UNINJURED(sRivalPapDriverPed.ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRivalPapDriverPed.ped, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRivalPapDriverPed.ped, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
bHasPlayerShotRivalPapOffBike = TRUE
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRivalPapDriverPed.ped) // reset the damage check
CPRINTLN(DEBUG_MISSION, "STAGE_STOP_RIVAL_PAP - rival dead or off bike - but detected DRIVER dead by - bHasPlayerShotRivalPapOffBike = TRUE")
ENDIF
ENDIF
ELIF NOT IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapDriverPed.ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRivalPapDriverPed.ped, PLAYER_PED_ID(), FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRivalPapDriverPed.ped, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
bHasPlayerShotRivalPapOffBike = TRUE
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRivalPapDriverPed.ped) // reset the damage check
CPRINTLN(DEBUG_MISSION, "STAGE_STOP_RIVAL_PAP - rival dead or off bike - but detected DRIVER of bike by - bHasPlayerShotRivalPapOffBike = TRUE")
ENDIF
ENDIF
ENDIF
ENDIF
eSubStage = SS_CLEANUP
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "dist between player and beverly = ", fDistance_PlayerToBeverly) ENDIF #ENDIF
CONTROL_PED_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, sRivalPapPed.ped)
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
fDistance_PlayerToRivalPap = VDIST(vPlayerPos, GET_ENTITY_COORDS(sRivalPapPed.ped))
UPDATE_RIVAL_PAP_ON_BIKE()
// force rival off the bike if his driver has come off when he;s still on
IF NOT IS_PED_UNINJURED(sRivalPapDriverPed.ped)
IF IS_PED_ON_ANY_BIKE(sRivalPapPed.ped)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_EASY)
IF CAN_KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
CPRINTLN(DEBUG_MISSION, " STAGE_STOP_RIVAL_PAP : Rival pap knocked off bike in script - driver was injured")
ENDIF
ENDIF
ELIF NOT IS_PED_SITTING_IN_ANY_VEHICLE(sRivalPapDriverPed.ped)
SET_ENTITY_HEALTH(sRivalPapDriverPed.ped, 0) // kill him off if he fell off
IF IS_PED_ON_ANY_BIKE(sRivalPapPed.ped)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_EASY)
IF CAN_KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
KNOCK_PED_OFF_VEHICLE(sRivalPapPed.ped)
CPRINTLN(DEBUG_MISSION, " STAGE_STOP_RIVAL_PAP : Rival pap knocked off bike in script - driver wasn't on bike")
ENDIF
ENDIF
ENDIF
ENDIF
MANAGE_PLAYER_AND_BEVERLY()
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
//cleanup Player vehicle recording - only requested and used when skipping to stop rival pap stage
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sBeverlyVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sBeverlyVehicle.vehicle)
REMOVE_VEHICLE_RECORDING(1, "Pap1PV") //Special case recording for player vehicle, requested and used when skipping to stop rival pap stage
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF DOES_ENTITY_EXIST(sObjFlashUnitRivalPap.object)
IF IS_ENTITY_ATTACHED(sObjFlashUnitRivalPap.object)
DETACH_ENTITY(sObjFlashUnitRivalPap.object)
APPLY_FORCE_TO_ENTITY(sObjFlashUnitRivalPap.object, APPLY_TYPE_EXTERNAL_IMPULSE, << 0.0, 0.0, -1.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, TRUE)
ENDIF
//SAFE_REMOVE_OBJECT(sObjFlashUnitRivalPap.object) //they get removed too quick with this in
ENDIF
IF DOES_ENTITY_EXIST(sObjCameraRivalPap.object)
IF IS_ENTITY_ATTACHED(sObjCameraRivalPap.object)
DETACH_ENTITY(sObjCameraRivalPap.object)
APPLY_FORCE_TO_ENTITY(sObjCameraRivalPap.object, APPLY_TYPE_EXTERNAL_IMPULSE, << 0.0, 0.0, -1.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, TRUE)
ENDIF
//SAFE_REMOVE_OBJECT(sObjCameraRivalPap.object) //they get removed too quick with this in
ENDIF
//this needs to match section in SS_UPDATE
IF NOT bDoneSetupCelebForCleanup
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
ENDIF
SETUP_CELEB_DRIVERS_BEHAVIOUR_WHEN_UBER_RECORDING_FINISHES()
CLEANUP_UBER_PLAYBACK()
REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE()
//main car recording
REMOVE_VEHICLE_RECORDING(1 , sPap1_UberRecordingName)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDoneSetupCelebForCleanup - done - STAGE_STOP_RIVAL_PAP cleanup") ENDIF #ENDIF
bDoneSetupCelebForCleanup = TRUE
ENDIF
ENDIF
// clean up the blocking area from earlier in the chase (stops global limit being pushed up)
INT i
FOR i = 0 TO (PAP1_MAX_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1)
REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i])
ENDFOR
SET_VEHICLE_POPULATION_BUDGET(3) //reset
UPDATE_RIVAL_PAP_ON_BIKE() //this will handle rival pap driver continuing to drive on his own if he's alive on the bike and also stop the bike recording if no driver
SAFE_REMOVE_BLIP(sCelebPed.blip)
SAFE_REMOVE_BLIP(sRivalPapPed.blip)
SAFE_REMOVE_BLIP(sBeverlyPed.blip)
SAFE_REMOVE_BLIP(sBeverlyVehicle.blip)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
//SAFE_REMOVE_PED(sRivalPapDriverPed.ped) //they get removed too quick with this in
//SAFE_REMOVE_VEHICLE(sRivalPapVehicle.vehicle) //they get removed too quick with this in
IF NOT IS_PED_UNINJURED(sRivalPapPed.ped)
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // "RIVALPAP"
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("PAP1_03")
CLEAR_THIS_PRINT("PAP1_03") //Chase after ~r~Tobias.~w~
ENDIF
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("PAP1_H1")
CLEAR_HELP()
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips
AND bFinishedStageSkipping
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_STOP_TO_RADIO)
ENDIF
IF IS_ENTITY_ALIVE(sCelebVehicle.vehicle)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sCelebVehicle.vehicle)
ENDIF
IF IS_ENTITY_ALIVE(sRivalPapVehicle.vehicle)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sRivalPapVehicle.vehicle)
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_01_CHASE")
STOP_AUDIO_SCENE("PAPARAZZO_01_CHASE")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_STOP_RIVAL_PAP - SS_CLEANUP - stop active audio scene - ", "PAPARAZZO_01_CHASE") ENDIF #ENDIF
ENDIF
SET_STAGE(MISSION_STAGE_DROP_BEVERLY_OFF)
CPRINTLN(DEBUG_MISSION, "STAGE_STOP_RIVAL_PAP - SS_CLEANUP done - heading to MISSION_STAGE_DROP_BEVERLY_OFF")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Franklin has to take Beverly to his next stakeout
PROC STAGE_DROP_BEVERLY_OFF()
MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
MANAGE_OUTRO_MOCAP_LOADING()
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_DROP_BEVERLY_OFF - SS_SETUP ^^^^^^^^") ENDIF #ENDIF
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_PAP1_DROP_BEVERLY_OFF, "Drop Beverley off", TRUE) // 3rd Mission replay checkpoint
IF IS_PED_UNINJURED(sRivalPapPed.ped)
SET_ENTITY_LOAD_COLLISION_FLAG(sRivalPapPed.ped, FALSE)
ENDIF
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
IF IS_PED_UNINJURED(sBeverlyPed.ped)
TASK_CLEAR_LOOK_AT(sBeverlyPed.ped)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_LOWEST)
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this to ensure Franklin doesn't say something straight away
SET_WANTED_LEVEL_MULTIPLIER(0.8) //raise this back up after the chase section
vPathNodeRequestStartPosition = << 0.0, 0.0, 0.0 >> // reset ready for next request for drop off gps route
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0, REPLAY_IMPORTANCE_LOWEST) // B*1841676 - record taking out the rival paparazzo
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_DROP_BEVERLY_OFF - SS_SETUP done")
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
IF IS_PED_UNINJURED(sBeverlyPed.ped)
fDistance_PlayerToBeverly = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sBeverlyPed.ped)) // used in several functions
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "dist between player and beverly = ", fDistance_PlayerToBeverly) ENDIF #ENDIF
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
//Don't allow the wanted level to drop this frame, as we need it to test in the cleanup
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
CPRINTLN(DEBUG_MISSION, "STAGE_DROP_BEVERLY_OFF - SS_UPDATE - player got wanted rating")
eSubStage = SS_CLEANUP
ELSE
MANAGE_PLAYER_AND_BEVERLY()
IF ePlayerTransportState = PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV
// make sure Beverly has said drop me off before advancing
IF bDoneDialogue_RivalPapCameraDestroyed
AND bDoneWaitForCameraDestroyedDialogue
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDropOffPoint, << 4.0, 4.0, LOCATE_SIZE_HEIGHT >>, TRUE, TRUE, TM_IN_VEHICLE) // used to use LOCATE_SIZE_ANY_MEANS for x and y but Les Bug * 1078339
AND IS_ENTITY_AT_COORD(sBeverlyPed.ped, vDropOffPoint, << 4.0, 4.0, LOCATE_SIZE_HEIGHT >>)
CPRINTLN(DEBUG_MISSION, "STAGE_DROP_BEVERLY_OFF - SS_UPDATE - player and bev at drop off location")
eSubStage = SS_CLEANUP
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
CLEANUP_CELEB_WHEN_AWAY_FROM_THE_PLAYER()
ENDIF
UPDATE_RIVAL_PAP_BEHAVIOUR_AFTER_CRASH()
SET_RIVAL_PAP_DRIVER_INJURED_WHEN_OFF_THE_BIKE()
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
SAFE_REMOVE_BLIP(blipIndexDropOffPoint)
SAFE_REMOVE_BLIP(sBeverlyPed.blip)
SAFE_REMOVE_BLIP(sBeverlyVehicle.blip)
// clear drop off objective
IF IS_THIS_PRINT_BEING_DISPLAYED("PAP1_05") // Take Beverly to his next ~y~stakeout.~s~
CLEAR_THIS_PRINT("PAP1_05")
ENDIF
//check which stage to go to next
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
KILL_ANY_CONVERSATION()
SET_STAGE(MISSION_STAGE_LOSE_THE_COPS)
CPRINTLN(DEBUG_MISSION, "STAGE_DROP_BEVERLY_OFF - SS_CLEANUP done - heading to MISSION_STAGE_LOSE_THE_COPS")
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) // B*1521637 - dive off bike for cutscene
SET_STAGE(MISSION_STAGE_END_CUTSCENE)
CPRINTLN(DEBUG_MISSION, "STAGE_DROP_BEVERLY_OFF - SS_CLEANUP done - heading to MISSION_STAGE_END_CUTSCENE")
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// player gets a wanted level during drop of Beverly stage
/// Wanted level must be cleared before dropping Beverly off
PROC STAGE_LOSE_THE_COPS()
MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
MANAGE_OUTRO_MOCAP_LOADING()
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_LOSE_THE_COPS - SS_SETUP ^^^^^^^^") ENDIF #ENDIF
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
IF IS_PED_UNINJURED(sBeverlyPed.ped)
TASK_CLEAR_LOOK_AT(sBeverlyPed.ped)
ENDIF
bDoneObjective_LoseTheCops = FALSE //reset lose the cops objective
bDoneDialogue_FranklinRespondToBeverlyBerating = TRUE // reset this to ensure Franklin doesn't say something straight away
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_LOSE_THE_COPS - SS_SETUP")
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
IF IS_PED_UNINJURED(sBeverlyPed.ped)
fDistance_PlayerToBeverly = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sBeverlyPed.ped)) // used in several functions
MANAGE_PLAYER_AND_BEVERLY()
IF ePlayerTransportState = PAP1_PLAYER_TRANSPORT_STATE_ON_THE_BIKE_WITH_BEV
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
CPRINTLN(DEBUG_MISSION, "STAGE_LOSE_THE_COPS - SS_UPDATE - Player lost his wanted rating so going to cleanup")
eSubStage = SS_CLEANUP
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
CLEANUP_CELEB_WHEN_AWAY_FROM_THE_PLAYER()
ENDIF
UPDATE_RIVAL_PAP_BEHAVIOUR_AFTER_CRASH()
SET_RIVAL_PAP_DRIVER_INJURED_WHEN_OFF_THE_BIKE()
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
IF IS_THIS_PRINT_BEING_DISPLAYED("PAP1_09")
CLEAR_THIS_PRINT("PAP1_09") // Lose the cops.
ENDIF
KILL_ANY_CONVERSATION() // B*1526224 - allow ongoing dialogue line to finish
SET_STAGE(MISSION_STAGE_DROP_BEVERLY_OFF)
CPRINTLN(DEBUG_MISSION, "STAGE_LOSE_THE_COPS - SS_CLEANUP")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Franklin drops Beverly off at his next stakeout MOCAP
PROC STAGE_END_CUTSCENE_MOCAP()
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
// don't request the mocap if we are skipping past this stage
IF NOT bFinishedStageSkipping
IF IS_REPLAY_BEING_SET_UP()
IF IS_ENTITY_ALIVE(sBeverlyVehicle.vehicle)
SET_ENTITY_VISIBLE(sBeverlyVehicle.vehicle, TRUE)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
CPRINTLN(DEBUG_MISSION, "INTRO MOCAP SETUP DONE FOR SKIP - set player into veh for NON replay ****** ")
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
CPRINTLN(DEBUG_MISSION, "INTRO MOCAP SETUP DONE FOR SKIP - GOING TO SS_CLEANUP")
eSubStage = SS_CLEANUP
ELSE
MANAGE_OUTRO_MOCAP_LOADING()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE,DEFAULT,FALSE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) // B*1521637 - dive off bike for cutscene
IF RC_IS_CUTSCENE_OK_TO_START(TRUE)
// Store the player's helmet status at this point to restore after the mocap
IF IS_PED_WEARING_HELMET(PLAYER_PED_ID())
iStoredPlayerHelmetPropIndex = GET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD)
iStoredPlayerHelmetPropTextureIndex = GET_PED_PROP_TEXTURE_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD)
bPlayerNeedsHelmentRestoreAfterOutroMocap = TRUE
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - stored player helmet details for restore after mocap ",
" prop ID = ", iStoredPlayerHelmetPropIndex, " prop tex ID = ", iStoredPlayerHelmetPropTextureIndex, " : Frame Count : ", GET_FRAME_COUNT())
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - player not wearing helmet - Frame Count : ", GET_FRAME_COUNT())
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sSceneHandle_Franklin, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF IS_ENTITY_ALIVE(sObjCameraBeverly.object) // Think this has to be detached bofore i register Beverly for the cutscene
IF IS_ENTITY_ATTACHED(sObjCameraBeverly.object)
DETACH_ENTITY(sObjCameraBeverly.object) // having to do this otherwise the camera is visibly offset in the wrong place...possilby where beverly ig is still
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - sObjCameraBeverly.object detached") ENDIF #ENDIF
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(sObjCameraBeverly.object, sSceneHandle_BeverlysCamera, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_ENTITY_ALIVE(sBeverlyPed.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sBeverlyPed.ped, sSceneHandle_Beverly, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_ENTITY_ALIVE(sBeverlyVehicle.vehicle)
REGISTER_ENTITY_FOR_CUTSCENE(sBeverlyVehicle.vehicle, sSceneHandle_BeverlysVehicle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0, REPLAY_IMPORTANCE_LOWEST)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOWEST)
START_CUTSCENE()
WAIT(0) //needed because cutscene doesn't start straight away, causing player to see vehicles getting removed.
SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) // //B*1481353 - when skipping to mocap (let the mocap stage handle fade in) tried just before START_CUTSCENE but issue still occured
RC_START_CUTSCENE_MODE(vDropOffPoint, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE) // don't need to worry about player vehicle resolve since he'll be on bev's bike
//cutscene area
CLEAR_ANGLED_AREA_OF_VEHICLES(<<-1493.301025,-198.539536,47.397526>>, <<-1492.846191,-185.493973,52.481934>>, 6.000000, TRUE) // tighter area check for B*1159709
CLEAR_AREA_OF_PEDS(vDropOffPoint, 4.0)
CLEAR_AREA(vDropOffPoint, 4.0, TRUE, TRUE) // leave car gens as per B*1159709
SET_RADIO_TO_STATION_NAME("OFF") // B*1530475 - turn radio off
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(sBeverlyVehicle.model) // B*2057708 - new command from first person changes
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - SS_SETUP * - Frame Count : ", GET_FRAME_COUNT())
ENDIF
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_ALIVE(sBeverlyVehicle.vehicle)
// setup Franklin's exit state
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Franklin)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
//SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle, VS_DRIVER)
CPRINTLN(DEBUG_MISSION, "****** STAGE_END_CUTSCENE_MOCAP - ", " set exit state for Franklin put on the bike in ss_update Frame Count : ", GET_FRAME_COUNT())
ENDIF
//SET_RADIO_TO_STATION_NAME("OFF") // B*1530475 - turn radio off
// Restore the player's helmet status
IF NOT IS_PED_WEARING_HELMET(PLAYER_PED_ID())
IF bPlayerNeedsHelmentRestoreAfterOutroMocap
SET_PED_HELMET_PROP_INDEX(PLAYER_PED_ID(), iStoredPlayerHelmetPropIndex)
SET_PED_HELMET_TEXTURE_INDEX(PLAYER_PED_ID(), iStoredPlayerHelmetPropTextureIndex)
GIVE_PED_HELMET(PLAYER_PED_ID(), FALSE, DEFAULT, iStoredPlayerHelmetPropTextureIndex)
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - set exit state for Franklin : restored helmet - ",
" prop ID = ", iStoredPlayerHelmetPropIndex, " prop tex ID = ", iStoredPlayerHelmetPropTextureIndex, " : Frame Count : ", GET_FRAME_COUNT())
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - set exit state for Franklin : unable to restore helmet, bPlayerNeedsHelmentRestoreAfterOutroMocap was false : Frame Count : ", GET_FRAME_COUNT())
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - !! player wearing helmet on exit state! so unable to restore - Frame Count : ", GET_FRAME_COUNT())
ENDIF
//FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_DO_NOTHING, FALSE, FAUS_CUTSCENE_EXIT)
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - bHasSetExitStateFromOutroMocapForGameplayCam set +++++ TRUE by can set exit state for Franklin FC = ", GET_FRAME_COUNT())
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", " set exit state for Franklin FALSE this frame Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
// setup Beverly's bike exit state
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_BeverlysVehicle)
SET_VEHICLE_ON_GROUND_PROPERLY(sBeverlyVehicle.vehicle)
SET_VEHICLE_BRAKE_LIGHTS(sBeverlyVehicle.vehicle, FALSE) // B*1554464 - brake light flashes for a few frames for some reason
//FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sBeverlyVehicle.vehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", " set exit state for Beverly's * bike done Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
// unfortunately the only way to ensure the mocap camera blends out to gameplay cam at a sensible position is to spam this until the player's character exit state has fired
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
IF NOT IS_CUTSCENE_PLAYING()
IF IS_ENTITY_ALIVE(sBeverlyVehicle.vehicle)
SET_VEHICLE_BRAKE_LIGHTS(sBeverlyVehicle.vehicle, FALSE) // B*1554464 - brake light flashes for a few frames for some reason
ENDIF
eSubStage = SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", " SS_UPDATE * done Frame Count : ", GET_FRAME_COUNT())
ELSE
// B*1385066 - prevent cutscene skip during blend out
IF GET_CUTSCENE_TIME() >= 26500
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
ENDIF
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
ELSE
REPLAY_STOP_EVENT()
IF HAS_CUTSCENE_LOADED()
REMOVE_CUTSCENE()
ENDIF
IF bFinishedStageSkipping //only do this if we aren't stage skipping
RC_END_CUTSCENE_MODE()
ENDIF
IF IS_ENTITY_ALIVE(sBeverlyPed.ped)
SET_ENTITY_COORDS_NO_OFFSET(sBeverlyPed.ped, << -1478.2562, -183.1669, 47.8236 >>)
SAFE_REMOVE_OBJECT(sObjFlashUnitBeverly.object, TRUE)
SAFE_REMOVE_OBJECT(sObjCameraBeverly.object, TRUE)
SAFE_REMOVE_PED(sBeverlyPed.ped, TRUE)
ENDIF
IF IS_ENTITY_ALIVE(sBeverlyVehicle.vehicle)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle, VS_DRIVER)
//FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "****** STAGE_END_CUTSCENE_MOCAP - ", "SS_CLEANUP frank put on bike as wasn't already! frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
SET_VEHICLE_BRAKE_LIGHTS(sBeverlyVehicle.vehicle, FALSE) // B*1554464 - brake light flashes for a few frames for some reason
//SET_RADIO_TO_STATION_NAME("OFF") // B*1530475 - turn radio off
ENDIF
SET_PLAYER_PED_DATA_IN_CUTSCENES() // B*1521921 - reset to default
SET_STAGE(MISSION_STAGE_MISSION_PASSED)
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - SS_CLEANUP")
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Mission has already failed at this point, but this handles
/// having to update the fail reason if the player does something more
/// serious during the fade.
PROC STAGE_MISSION_FAILED_WAIT_FOR_FADE()
STRING sFailReason = NULL
MANAGE_TRIGGER_MUSIC_EVENTS_DURING_MISSION()
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
CLEAR_PRINTS()
CLEAR_HELP()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
ENDIF
DELETE_ALL_MISSION_BLIPS()
//setup mission failed dialogue if needed
IF eP1_MissionFailedReason = FAILED_PLAYER_ATTACKED_CELEB
bDoneDialogue_MissionFailed = FALSE
// Leave Miranda alone, you bastard!
tlDialogueRoot_MissionFailed = "PAP1_FAIL2"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - set fail dialogue for attacked celeb") ENDIF #ENDIF
ELIF eP1_MissionFailedReason = FAILED_BEVERLY_SPOOKED
bDoneDialogue_MissionFailed = FALSE
// Leave Miranda alone, you bastard!
tlDialogueRoot_MissionFailed = "PAP1_FAIL2"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - set fail dialogue for Beverly spooked") ENDIF #ENDIF
ELIF eP1_MissionFailedReason = FAILED_CELEB_ESCAPED
OR eP1_MissionFailedReason = FAILED_PAP_ESCAPED
bDoneDialogue_MissionFailed = FALSE
// For fuck sake, we lost them.
tlDialogueRoot_MissionFailed = "PAP1_FAIL1"
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - set fail dialogue for losing celeb / pap") ENDIF #ENDIF
ENDIF
//implemented to ensure Beverly gets off the bike to prevent bug 212968
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SEQUENCE_INDEX seqIndex
//Setup Beverly for mission failed
IF IS_PED_UNINJURED(sBeverlyPed.ped)
//Make Beverly flee the player if fail reason
IF eP1_MissionFailedReason = FAILED_LEFT_BEVERLY_BEHIND
OR eP1_MissionFailedReason = FAILED_PLAYER_ATTACKED_CELEB
//OR eP1_MissionFailedReason = FAILED_PLAYER_ATTACKED_BEVERLY
OR eP1_MissionFailedReason = FAILED_BEVERLY_SPOOKED
OR eP1_MissionFailedReason = FAILED_CELEB_DIED
// removal of ped group moved with in here as believe to be cause of bug 1178569
// having to keep checking this here now because of // B*1441191
IF IS_PED_GROUP_MEMBER(sBeverlyPed.ped, PLAYER_GROUP_ID())
IF NOT IS_PED_RAGDOLL(sBeverlyPed.ped) // B*1441191 - apparently calls the REMOVE_PED_FROM_GROUP need to delay for ragdoll since it will clear immediately causing ped to snap up
REMOVE_PED_FROM_GROUP(sBeverlyPed.ped)
CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP - *PED GROUP* BEV removed from group - STAGE_MISSION_FAILED_WAIT_FOR_FADE")
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP - *PED GROUP* BEV Uanble to remove due to ragdoll - STAGE_MISSION_FAILED_WAIT_FOR_FADE")
ENDIF
ENDIF
// B*1441207 - make Bev drop his camera if he's on the bike when he beings to flee
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
OR IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
IF IS_ENTITY_ALIVE(sObjCameraBeverly.object)
IF IS_ENTITY_ATTACHED_TO_ENTITY(sObjCameraBeverly.object, sBeverlyPed.ped)
DETACH_ENTITY(sObjCameraBeverly.object)
CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP - BEV camera detached because he's on / getting on the bike")
// B*1521559 - clear his holding camera anim if it's getting detached
CLEANUP_BEVERLY_ON_BIKE_ANIMS(NORMAL_BLEND_OUT)
ENDIF
ENDIF
ENDIF
SET_PED_FLEE_ATTRIBUTES(sBeverlyPed.ped, FA_USE_VEHICLE, FALSE)
/*OPEN_SEQUENCE_TASK(seqIndex)
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
OR IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR | ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
ENDIF
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 100.0, -1)
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(sBeverlyPed.ped, seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)*/
TASK_SMART_FLEE_PED(sBeverlyPed.ped, PLAYER_PED_ID(), 50.0, -1) // lower from 100m to help with latency - shouldn't stop at 50 as game will have faded out by then
SET_PED_KEEP_TASK(sBeverlyPed.ped, TRUE)
CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP - SET BEVERLY UP TO FLEE PLAYER IN FAILED SETUP $$$")
ENDIF
ENDIF
//Setup Miranda, and her driver for mission failed
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
ENDIF
ENDIF
IF IS_PED_UNINJURED(sCelebPed.ped)
IF NOT IS_PED_IN_ANY_VEHICLE(sCelebPed.ped)
OPEN_SEQUENCE_TASK(seqIndex)
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 50.0, -1) // lower from 100m to help with latency - shouldn't stop at 50 as game will have faded out by then
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(sCelebPed.ped, seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
ENDIF
SET_PED_KEEP_TASK(sCelebPed.ped, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET celeb UP TO FLEE PLAYER IN FAILED SETUP $$$") ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sCelebsDriverPed.ped)
SET_PED_FLEE_ATTRIBUTES(sCelebsDriverPed.ped, FA_USE_VEHICLE, TRUE)
SET_PED_FLEE_ATTRIBUTES(sCelebsDriverPed.ped, FA_PREFER_PAVEMENTS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sCelebsDriverPed.ped, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sCelebsDriverPed.ped, FA_LOOK_FOR_CROWDS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sCelebsDriverPed.ped, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
AND IS_PED_SITTING_IN_VEHICLE(sCelebsDriverPed.ped, sCelebVehicle.vehicle)
OPEN_SEQUENCE_TASK(seqIndex)
TASK_VEHICLE_MISSION_PED_TARGET(NULL, sCelebVehicle.vehicle, PLAYER_PED_ID(), MISSION_FLEE, 80.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 500.0, -1.0)
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(sCelebsDriverPed.ped, seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET celeb DRIVER UP TO FLEE PLAYER whilst in car IN FAILED SETUP $$$") ENDIF #ENDIF
ELSE
OPEN_SEQUENCE_TASK(seqIndex)
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 50.0, -1) // lower from 100m to help with latency - shouldn't stop at 50 as game will have faded out by then
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(sCelebsDriverPed.ped, seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET celeb DRIVER UP TO FLEE PLAYER whilst on foot IN FAILED SETUP $$$") ENDIF #ENDIF
ENDIF
SET_PED_KEEP_TASK(sCelebsDriverPed.ped, TRUE)
ENDIF
//Setup rival pap and driver behaviour for mission failed
BOOL bDoRivalPapNeedSettingUpToFlee
bDoRivalPapNeedSettingUpToFlee = FALSE
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle)
bDoRivalPapNeedSettingUpToFlee = TRUE
ENDIF
ENDIF
IF IS_PED_UNINJURED(sRivalPapPed.ped)
IF bDoRivalPapNeedSettingUpToFlee
IF NOT IS_PED_IN_ANY_VEHICLE(sRivalPapPed.ped)
OPEN_SEQUENCE_TASK(seqIndex)
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 50.0, -1) // lower from 100m to help with latency - shouldn't stop at 50 as game will have faded out by then
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(sRivalPapPed.ped, seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
ENDIF
ENDIF
SET_PED_KEEP_TASK(sRivalPapPed.ped, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET RIVAL PAP UP TO FLEE PLAYER IN FAILED SETUP $$$") ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
SET_PED_FLEE_ATTRIBUTES(sRivalPapDriverPed.ped, FA_USE_VEHICLE, TRUE)
SET_PED_FLEE_ATTRIBUTES(sRivalPapDriverPed.ped, FA_PREFER_PAVEMENTS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sRivalPapDriverPed.ped, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sRivalPapDriverPed.ped, FA_LOOK_FOR_CROWDS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sRivalPapDriverPed.ped, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
AND IS_PED_SITTING_IN_VEHICLE(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle)
OPEN_SEQUENCE_TASK(seqIndex)
TASK_VEHICLE_MISSION_PED_TARGET(NULL, sRivalPapVehicle.vehicle, PLAYER_PED_ID(), MISSION_FLEE, 80.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 500.0, -1.0)
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(sRivalPapDriverPed.ped, seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
ELSE
OPEN_SEQUENCE_TASK(seqIndex)
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 50.0, -1) // lower from 100m to help with latency - shouldn't stop at 50 as game will have faded out by then
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(sRivalPapDriverPed.ped, seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
ENDIF
SET_PED_KEEP_TASK(sRivalPapDriverPed.ped, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET RIVAL DRIVER UP TO FLEE PLAYER IN FAILED SETUP $$$") ENDIF #ENDIF
ENDIF
ENDIF
SET_MUSIC_EVENT_FOR_TRIGGER(PAP1_MUSIC_EVENT_FAIL)
// set the fail reason
SWITCH eP1_MissionFailedReason
CASE FAILED_DEFAULT
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Default") ENDIF #ENDIF
BREAK
CASE FAILED_CELEB_DIED
sFailReason = "PAP1_F1" //~r~Miranda Died.~w~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Miranda DIED") ENDIF #ENDIF
BREAK
CASE FAILED_CELEB_ESCAPED
sFailReason = "PAP1_F2" //~r~Miranda Escaped.~w~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Miranda ESCAPED") ENDIF #ENDIF
BREAK
CASE FAILED_PLAYER_ATTACKED_CELEB
sFailReason = "PAP1_F7" //~w~Franklin attacked Miranda.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: You attacked Miranda") ENDIF #ENDIF
BREAK
/*CASE FAILED_PLAYER_ATTACKED_BEVERLY
sFailReason = "PAP1_F8" //~w~Beverly was injured.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: You attacked Miranda") ENDIF #ENDIF
BREAK*/
CASE FAILED_BEVERLY_VEHICLE_WRECKED
sFailReason = "PAP1_F3" //~r~Beverly's Vehicle was Wrecked.~w~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: BEVERLY VEHICLE WAS WRECKED") ENDIF #ENDIF
BREAK
CASE FAILED_BEVERLY_DIED
sFailReason = "PAP1_F4" //~r~Beverly Died.~w~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: BEVERLY DIED") ENDIF #ENDIF
BREAK
CASE FAILED_PAP_ESCAPED
sFailReason = "PAP1_F5" //~w~The rival paparazzo escaped.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Marco ESCAPED") ENDIF #ENDIF
BREAK
CASE FAILED_LEFT_BEVERLY_BEHIND
sFailReason = "PAP1_F6" //~w~Beverly was abandoned.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Beverly was left behind.") ENDIF #ENDIF
BREAK
CASE FAILED_BEVERLY_SPOOKED
sFailReason = "PAP1_F9" //~w~Beverly was spooked.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Beverly was spooked.") ENDIF #ENDIF
BREAK
ENDSWITCH
//Check if fail reason needs to be displayed
IF eP1_MissionFailedReason = FAILED_DEFAULT
RANDOM_CHARACTER_FAILED()
ELSE
RANDOM_CHARACTER_FAILED_WITH_REASON(sFailReason)
ENDIF
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP done")
BREAK
// ------------------------------------------
CASE SS_UPDATE
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
// Do a check here to see if we need to warp the player at all
// (only set the fail warp locations if we can't leave the player where he was)
//---- Do any specific cleanup here----
CLEANUP_ALL_MISSION_ENTITIES(TRUE)
CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - SS_CLEANUP done")
Script_Cleanup()
ELSE
// not finished fading out
IF IS_PED_UNINJURED(sBeverlyPed.ped)
// mission failed dialogue (if setup)
IF NOT bDoneDialogue_MissionFailed
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
// pap 1 has no recorded flee dialogue and ambient speech isn't working so using pap 2 dialogue
IF eP1_MissionFailedReason = FAILED_BEVERLY_SPOOKED
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "PAP2AUD", "PAP2_FLEE", CONV_PRIORITY_AMBIENT_HIGH, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) // B*1521584 - needs to be this priorty as it's not from PAP1AUD text
bDoneDialogue_MissionFailed = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - bDoneDialogue_MissionFailed - true") ENDIF #ENDIF
ENDIF
//STOP_PED_SPEAKING(sBeverlyPed.ped, FALSE)
//PLAY_PED_AMBIENT_SPEECH(sBeverlyPed.ped, "GENERIC_SHOCKED_HIGH", SPEECH_PARAMS_FORCE_NORMAL)
ELSE
IF PAP1_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sPap1_Dialogue_TextBlockName, tlDialogueRoot_MissionFailed, CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
bDoneDialogue_MissionFailed = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - bDoneDialogue_MissionFailed - true") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
// having to keep checking this here now because of // B*1441191
IF IS_PED_GROUP_MEMBER(sBeverlyPed.ped, PLAYER_GROUP_ID())
IF NOT IS_PED_RAGDOLL(sBeverlyPed.ped) // B*1441191 - apparently calls the REMOVE_PED_FROM_GROUP need to delay for ragdoll since it will clear immediately causing ped to snap up
REMOVE_PED_FROM_GROUP(sBeverlyPed.ped)
CPRINTLN(DEBUG_MISSION, "STAGE_MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP - *PED GROUP* BEV removed from group - STAGE_MISSION_FAILED_WAIT_FOR_FADE - SS_UPDATE")
ENDIF
ENDIF
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped) // need to keep clipset's updating otherwise you get an assert - B*846177
SET_PED_RESET_FLAG(sBeverlyPed.ped, PRF_DisableInVehicleActions, TRUE) // B*1480880 - stop bev clipping during reverse anims
RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE BEV ON BIKE - AnimSet_BeverlyCameraWeaponMovementOnBike- done") ENDIF #ENDIF
ELSE
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE BEV ON BIKE - AnimSet_BeverlyCameraWeaponMovementOnBike- done") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
//-------------------------------------------------------------------------------------------------------------------------------------------------
// DEBUG STAGES
//-------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
PROC DEBUG_STAGE_RECORD_CHASE_ROUTE()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
LOAD_MISSION_ASSETS(TRUE)
CREATE_ENTITIES_FOR_MISSION_START()
SET_CLOCK_TIME(10, 0, 0)
SAFE_REMOVE_PED(sCelebsDriverPed.ped, TRUE)
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
SET_VEHICLE_DOORS_LOCKED(sCelebVehicle.vehicle, VEHICLELOCK_UNLOCKED)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sCelebVehicle.vehicle, TRUE)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sCelebVehicle.vehicle)
SET_VEHICLE_ENGINE_ON(sCelebVehicle.vehicle, TRUE, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
REQUEST_VEHICLE_RECORDING(1, sPap1_UberRecordingName)
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(1, sPap1_UberRecordingName)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LOADED THE VEHICLE RECORDING 1 PAP1U") ENDIF #ENDIF
WAIT(0)
ENDWHILE
INIT_UBER_RECORDING(sPap1_UberRecordingName)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
eSubStage = SS_UPDATE
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
// for uber recording
UPDATE_UBER_RECORDING()
//this is for when you have already made the recording without traffic...play back the recording and press start recording in the uber playback.
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 1, sPap1_UberRecordingName)
//SET_PLAYBACK_SPEED(sCelebVehicle.vehicle, 0.85) was used to re-record the main car slower
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK OF RECORDING STARTED") ENDIF #ENDIF
ENDIF
ELIF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO) // setup stop and reset
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
DISPLAY_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, RDM_WHOLELINE)
ENDIF
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RECORD CHASE ROUTE CLEANUP") ENDIF #ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC DEBUG_STAGE_PLAYBACK_CHASE_ROUTE()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
INT iMainCarrecID = 1
VECTOR vPos[4]
FLOAT fTime
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
LOAD_MISSION_ASSETS(TRUE)
CREATE_ENTITIES_FOR_MISSION_START()
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
//SAFE_REMOVE_PED(sCelebsDriverPed.ped, TRUE)
IF IS_PED_UNINJURED(sCelebPed.ped)
SAFE_PUT_PED_INTO_VEHICLE(sCelebPed.ped, sCelebVehicle.vehicle, VS_FRONT_RIGHT)
//SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sCelebVehicle.vehicle, VS_DRIVER)
ENDIF
SET_ENTITY_COLLISION(sCelebVehicle.vehicle, FALSE)
ENDIF
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
//SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle, VS_DRIVER)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
SAFE_PUT_PED_INTO_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT)
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
//for uber playback
INITIALISE_UBER_PLAYBACK(sPap1_UberRecordingName, iMainCarrecID)
LOAD_UBER_DATA()
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK()
//switch_SetPieceCar_to_ai_on_collision = true
traffic_block_vehicle_colour(true, traffic_black)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, iMainCarrecID, sPap1_UberRecordingName)
DISPLAY_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, RDM_WHOLELINE)
//444
//SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 1000.0)
//PAUSE_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
ENDIF
/*
// for single recording
REQUEST_MODEL(sRivalPapVehicle.model)
//the rival rec
REQUEST_VEHICLE_RECORDING(1, "Pap1RP")
WHILE NOT HAS_MODEL_LOADED(sRivalPapVehicle.model)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(1, "Pap1RP")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LOADED BIKE MODEL") ENDIF #ENDIF
WAIT(0)
ENDWHILE
IF NOT DOES_ENTITY_EXIST(sRivalPapVehicle.vehicle)
sRivalPapVehicle.vehicle = CREATE_VEHICLE(sRivalPapVehicle.model, <<-1565.0560, -172.2702, 54.9314>>)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(sRivalPapVehicle.model)
IF DOES_ENTITY_EXIST(sRivalPapVehicle.vehicle)
AND NOT IS_ENTITY_DEAD(sRivalPapVehicle.vehicle)
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sRivalPapVehicle.vehicle)
ENDIF
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, iMainCarrecID, sPap1_UberRecordingName)
DISPLAY_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, RDM_WHOLELINE)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 60550.0)
PAUSE_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
ENDIF
ENDIF
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle, iMainCarrecID, "Pap1RP")
DISPLAY_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle, RDM_WHOLELINE)
//SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle, 60500.0)
PAUSE_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle)
ENDIF
ENDIF
*/
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK CHASE ROUTE SETUP DONE") ENDIF #ENDIF
eSubStage = SS_UPDATE
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(0.0)
SET_GAMEPLAY_CAM_MOTION_BLUR_SCALING_THIS_UPDATE(0.0)
//for uber playback
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
fTime = GET_TIME_POSITION_IN_RECORDING(sCelebVehicle.vehicle)
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn?
CREATE_ALL_WAITING_UBER_CARS() //might help with some traffic failing to spawn?
PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK()
//CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sCelebVehicle.vehicle, PLAYER_PED_ID(), fMainPlaybackSpeed, PAP1_DEFAULT_CHASE_SPEED_FOR_UBER_PLAYBACK, 5, 20, 100, 2, 1)
SET_PLAYBACK_SPEED(sCelebVehicle.vehicle, 1.0)
UPDATE_UBER_PLAYBACK(sCelebVehicle.vehicle, 1.0)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
vPos[0] = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iMainCarrecID, fTime + 500.0, sPap1_UberRecordingName)
vPos[1] = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iMainCarrecID, fTime + 1000.0, sPap1_UberRecordingName)
vPos[2] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, <<-1.7329, 6.4243, 0.1649>>)
vPos[3] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, <<-1.7329, 12.4243, 0.1649>>)
DRAW_DEBUG_SPHERE(vPos[0], 0.5, 0, 255, 0, 128)
DRAW_DEBUG_SPHERE(vPos[1], 0.5, 0, 255, 0, 128)
DRAW_DEBUG_SPHERE(vPos[2], 1.0, 0, 0, 255, 128)
DRAW_DEBUG_SPHERE(vPos[3], 1.0, 0, 0, 255, 128)
// quit early
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
CLEANUP_UBER_PLAYBACK(TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK CHASE ROUTE STOPPED so cleaned up and reset") ENDIF #ENDIF
eSubStage = SS_SETUP
ENDIF
ELSE
//for uber playback
CLEANUP_UBER_PLAYBACK(TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK CHASE ROUTE ENDED so c;eaned up") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
ENDIF
/*
// for single recording
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
AND IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HORN)
SET_TIME_SCALE(0.5)
ELIF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle)
ELIF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 1, sPap1_UberRecordingName)
ENDIF
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 60550.0)
PAUSE_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle, 1, "Pap1RP")
ENDIF
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle, 0.1)
PAUSE_PLAYBACK_RECORDED_VEHICLE(sRivalPapVehicle.vehicle)
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sRivalPapVehicle.vehicle)
fTempTime = GET_TIME_POSITION_IN_RECORDING(sRivalPapVehicle.vehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "current rec time rival pap - ", fTempTime) ENDIF #ENDIF
ENDIF
ENDIF
*/
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK CHASE ROUTE - CLEANUP use d pad left to reset") ENDIF #ENDIF
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO) // setup stop and reset
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK CHASE ROUTE CLEANUP reset recording") ENDIF #ENDIF
eSubStage = SS_SETUP
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC DEBUG_STAGE_DEBUG_STATE()
SWITCH eSubStage
// -------------------------------------------------------------------------------------
CASE SS_SETUP
bDebug_PrintMissionInfoToTTY = TRUE
SET_DEBUG_ACTIVE(TRUE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
LOAD_MISSION_ASSETS(TRUE)
CREATE_BEVERLYS_BIKE_FOR_MISSION_START()
//// celeb vehicle from initial setup
IF (DOES_ENTITY_EXIST(sRCLauncherDataLocal.vehID[1]))
DELETE_VEHICLE(sRCLauncherDataLocal.vehID[1])
ENDIF
CREATE_ENTITIES_FOR_MISSION_START()
//SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sCelebVehicle.vehicle)
REQUEST_ANIM_DICT(sAnimDictName_Pap1HandOverride)
WHILE NOT HAS_ANIM_DICT_LOADED(sAnimDictName_Pap1HandOverride)
WAIT(0)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "WAITING FOR ANIM DIC TO LOAD - rcmpaparazzo1IG_1") ENDIF #ENDIF
ENDWHILE
/*
IF DOES_ENTITY_EXIST(sObjCameraBeverly.object)
SET_ENTITY_VISIBLE(sObjCameraBeverly.object, TRUE)
ENDIF
IF IS_ENTITY_ALIVE(sBeverlyPed.ped)
SET_ENTITY_VISIBLE(sBeverlyPed.ped, TRUE)
ENDIF
SAFE_REMOVE_PED(sCelebsDriverPed.ped, TRUE)
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
IF IS_PED_UNINJURED(sCelebPed.ped)
SAFE_PUT_PED_INTO_VEHICLE(sCelebPed.ped, sCelebVehicle.vehicle, VS_BACK_RIGHT)
ENDIF
//SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sCelebVehicle.vehicle, VS_DRIVER)
ENDIF
//SAFE_TELEPORT_ENTITY(sCelebVehicle.vehicle, << -156.6, 260.1, 93.0 >>, 263.0)
*/
//SAFE_TELEPORT_PED(PLAYER_PED_ID(), << -155.8644, 277.6098, 92.7736 >>, 103.3885, TRUE)
//SAFE_TELEPORT_PED(sBeverlyPed.ped, << -166.5576, 275.3646, 92.3437 >>, 273.0, TRUE)
IF IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
AND IS_PED_UNINJURED(sBeverlyPed.ped)
CLEAR_PED_TASKS(sBeverlyPed.ped)
SET_BEVERLY_FOLLOW_PLAYER()
SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sBeverlyVehicle.vehicle, VS_DRIVER)
SAFE_PUT_PED_INTO_VEHICLE(sBeverlyPed.ped, sBeverlyVehicle.vehicle, VS_FRONT_RIGHT)
//IF IS_PED_UNINJURED(sBeverlyPed.ped)
// SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
//ENDIF
SET_VEHICLE_ENGINE_ON(sBeverlyVehicle.vehicle, TRUE, TRUE)
//GIVE_WEAPON_TO_PED(sBeverlyPed.ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE, TRUE) //giving him this instead as camera weapon doesn't work!
//SET_PED_CURRENT_WEAPON_VISIBLE(sBeverlyPed.ped, TRUE)
//SET_PED_CAN_SWITCH_WEAPON(sBeverlyPed.ped, FALSE)
//SET_PED_TARGET_LOSS_RESPONSE(sBeverlyPed.ped, TLR_NEVER_LOSE_TARGET)
//SET_PED_COMBAT_ATTRIBUTES(sBeverlyPed.ped, CA_DO_DRIVEBYS, FALSE) // need to be false otherwise they clash!
//SET_PED_SHOOT_RATE(sBeverlyPed.ped, 100)
//SET_PED_FIRING_PATTERN(sBeverlyPed.ped, FIRING_PATTERN_FULL_AUTO)
//SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, "RCM_Paparazzo")
//SET_PED_CONFIG_FLAG(sBeverlyPed.ped, PCF_ForcedAim, TRUE)
//SET_PED_CONFIG_FLAG(sBeverlyPed.ped, PCF_IsAimingGun, TRUE)
//TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ApplyBevWeaponMovementClipSet- done") ENDIF #ENDIF
ENDIF
/*
IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
SET_VEHICLE_DOORS_LOCKED(sCelebVehicle.vehicle, VEHICLELOCK_UNLOCKED)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sCelebVehicle.vehicle, TRUE)
ENDIF
*/
LOAD_ASSETS_FOR_RIVAL_PAP_ARRIVING(TRUE)
CREATE_RIVAL_PAP_FOR_ENTRANCE()
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
FREEZE_ENTITY_POSITION(sRivalPapVehicle.vehicle, TRUE)
ENDIF
IF IS_PED_UNINJURED(sRivalPapPed.ped)
AND NOT DOES_BLIP_EXIST(sRivalPapPed.blip)
sRivalPapPed.blip = CREATE_PED_BLIP(sRivalPapPed.ped, TRUE, FALSE)
SET_BLIP_SCALE(sRivalPapPed.blip, 1.0) //TEMP: cars need bigger blips but the new rc_helpers_function - CREATE_PED_BLIP doesn't handle it.
ENDIF
IF IS_PED_UNINJURED(sRivalPapPed.ped)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapPed.ped, KNOCKOFFVEHICLE_DEFAULT)
ENDIF
IF IS_PED_UNINJURED(sRivalPapDriverPed.ped)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(sRivalPapDriverPed.ped, KNOCKOFFVEHICLE_DEFAULT)
ENDIF
SAFE_TELEPORT_ENTITY(sRivalPapVehicle.vehicle, << -156.6, 260.1, 93.0 >>, 263.0)
/*IF IS_VEHICLE_OK(sCelebVehicle.vehicle)
AND IS_PED_UNINJURED(sCelebsDriverPed.ped)
AND IS_PED_UNINJURED(sCelebPed.ped)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
START_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, 1, sPap1_UberRecordingName)
#IF IS_DEBUG_BUILD DISPLAY_PLAYBACK_RECORDED_VEHICLE(sCelebVehicle.vehicle, RDM_WHOLELINE) #ENDIF
fMainPlaybackSpeed = 0.5
SET_PLAYBACK_SPEED(sCelebVehicle.vehicle, fMainPlaybackSpeed)
ENDIF
ENDIF*/
SAFE_FADE_SCREEN_IN_FROM_BLACK(0, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
eSubStage = SS_UPDATE
BREAK
// -------------------------------------------------------------------------------------
CASE SS_UPDATE
IF bDebug_TakeOffHelmet
REMOVE_PLAYER_HELMET(PLAYER_ID(), FALSE)
SET_PED_HELMET(PLAYER_PED_ID(), FALSE)
bDebug_TakeOffHelmet = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Frank bDebug_TakeOffHelmet frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF bDebug_GiveHelmet
GIVE_PED_HELMET(PLAYER_PED_ID())
SET_PED_HELMET(PLAYER_PED_ID(), TRUE)
bDebug_GiveHelmet = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Frank bDebug_GiveHelmet frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
/*
IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_CRASH_HELMET)
AND NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_BIKE_HELMET) // P1 = franklin
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Frank doesn't have helmet on frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Frank HAS helmet on frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
*/
//MANAGE_PED_SHOOTING_UP(sCelebPed.ped)
IF IS_PED_UNINJURED(sBeverlyPed.ped)
AND IS_VEHICLE_OK(sBeverlyVehicle.vehicle)
//MANAGE_BEVERLY_TAKING_PHOTOS_DURING_CHASE()
//MANAGE_DIALOGUE_DURING_CHASE_CELEB()
//MANAGE_PED_DOING_KNOCKOFF_BIKER_ATTACK(sBeverlyPed.ped, sRivalPapVehicle.vehicle, sObjCameraBeverly.object)
IF IS_VEHICLE_OK(sRivalPapVehicle.vehicle)
AND IS_PED_UNINJURED(sRivalPapDriverPed.ped)
AND IS_PED_SITTING_IN_VEHICLE(sRivalPapDriverPed.ped, sRivalPapVehicle.vehicle)
AND IS_PED_UNINJURED(sRivalPapPed.ped)
AND IS_PED_SITTING_IN_VEHICLE(sRivalPapPed.ped, sRivalPapVehicle.vehicle)
IF bDebug_TogglePapDriveWander
MONITOR_RIVAL_PAP_CHASE_SPEED()
ENDIF
/*VECTOR vBev_Forward, vRivalPap_ToBeverly
vBev_Forward = GET_ENTITY_FORWARD_VECTOR(sBeverlyPed.ped)
vBev_Forward = NORMALISE_VECTOR(vBev_Forward)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "vBev_Forward = ", vBev_Forward) ENDIF #ENDIF
vRivalPap_ToBeverly = GET_ENTITY_COORDS(sRivalPapPed.ped) - GET_ENTITY_COORDS(sBeverlyPed.ped)
vRivalPap_ToBeverly = NORMALISE_VECTOR(vRivalPap_ToBeverly)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "vRivalPap_ToBeverly = ", vRivalPap_ToBeverly) ENDIF #ENDIF
FLOAT fAngle
fAngle = DOT_PRODUCT(vBev_Forward, vRivalPap_ToBeverly)
//fAngle = GET_ANGLE_BETWEEN_2D_VECTORS(vBev_Forward.X, vBev_Forward.Y, vRivalPap_ToPlayer.X, vRivalPap_ToPlayer.Y)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_ANGLE_BETWEEN_2D_VECTORS bev and rival pa : fAngle = ", fAngle) ENDIF #ENDIF*/
//IF HAS_TIME_PASSED(iTimerDelay_RivalPapGestureAnim, GET_RANDOM_INT_IN_RANGE(6000, 10000))
// fDistance_PlayerToRivalPap = 10.0
// IF fDistance_PlayerToRivalPap > 5.0
// AND fDistance_PlayerToRivalPap < 25.0
//IF SET_RIVAL_PAP_PLAY_GESTURE_ANIM()
//iTimerDelay_RivalPapGestureAnim = GET_GAME_TIMER()
//ENDIF
// ENDIF
//ENDIF
//GET_SIDE_COORDS_IS_TO_ENTITY(sBeverlyVehicle.vehicle, GET_ENTITY_COORDS(sBeverlyVehicle.vehicle), GET_ENTITY_COORDS(sRivalPapPed.ped))
//SET_BEVERLY_PLAY_POINT_ANIM(sRivalPapPed.ped)
//SET_BEVERLY_PLAY_HURRY_UP_ANIM_TOWARDS_ENTITY(sRivalPapPed.ped)
ENDIF
IF IS_PED_ON_ANY_BIKE(sBeverlyPed.ped)
//SET_CURRENT_PED_WEAPON(sBeverlyPed.ped, WEAPONTYPE_PISTOL, TRUE)
//RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
ENDIF
IF IS_PED_UNINJURED(sCelebPed.ped)
AND IS_VEHICLE_OK(sCelebVehicle.vehicle)
AND IS_PED_UNINJURED(sCelebsDriverPed.ped)
IF bDebug_BevDoAimCameraAtCelebTask
#IF IS_DEBUG_BUILD
IF bDebug_OverrideCelebPosInCarOffset
vCelebPosInCarOffset = vDebug_vCelebPosInCarOffsetOverride
ENDIF
#ENDIF
VECTOR vCelebPos
vCelebPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, vCelebPosInCarOffset)
#IF IS_DEBUG_BUILD
IF bDebug_BevTempAimLeft
vCelebPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, << -8.0, 0.0, 0.0>>)
ELSE
//vCelebPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sCelebVehicle.vehicle, << 8.0, 0.0, 0.0>>)
ENDIF
#ENDIF
#IF IS_DEBUG_BUILD IF bDebug_DisplayShapeTestPap1CameraAim DRAW_DEBUG_SPHERE(vCelebPos, fDebug_ProbeHitDistOverride, 0, 225, 225, 150) ENDIF #ENDIF
IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_GENERAL_SWEEP) // SCRIPT_TASK_AIM_GUN_SCRIPTED) // SCRIPT_TASK_DRIVE_BY)
//IF Playing anim, stop anim task
//TASK_AIM_GUN_SCRIPTED_WITH_TARGET(sBeverlyPed.ped, sCelebPed.ped, << 0.0, 0.0, 0.0 >>, SCRIPTED_GUN_TASK_BIKE)
//CLEAR_PED_TASKS(sBeverlyPed.ped)
FLOAT fTaskSweepAim_TurnRate
fTaskSweepAim_TurnRate = 3.0 // default is 1.0, 2.0 would be twice as fast, etc
#IF IS_DEBUG_BUILD IF bDebug_OverrideTaskSweepAim_TurnRate fTaskSweepAim_TurnRate = fDebug_TaskSweepAim_TurnRate ENDIF #ENDIF
TASK_SWEEP_AIM_POSITION(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "sweep_low", "sweep_med", "sweep_high", -1, vCelebPos, fTaskSweepAim_TurnRate)
RESET_IS_BEVERLY_AIMING_AT_CELEB_TEST()
iTimerDelay_Progress_BevTakingPhotos = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_BevDoAimCameraAtCelebTask - TASK_SWEEP_AIM_POSITION : fTaskSweepAim_TurnRate = ", fTaskSweepAim_TurnRate) ENDIF #ENDIF
ELSE
UPDATE_TASK_SWEEP_AIM_POSITION(sBeverlyPed.ped, vCelebPos)
IF HAS_TIME_PASSED(iTimerDelay_Progress_BevTakingPhotos, 1000)
IF IS_BEVERLY_AIMING_CAMERA_AT_CELEB(vCelebPos)
INT iAmountTimeSteadyCameraForShot
iAmountTimeSteadyCameraForShot = 500
IF HAS_TIME_PASSED_BEV_CONSECUTIVELY_AIMED_CAMERA_AT_CELEB(iAmountTimeSteadyCameraForShot)
#IF IS_DEBUG_BUILD IF bDebug_DisplayShapeTestPap1CameraAim DRAW_RECT(0.3, 0.5, 0.2, 0.4, 0, 255, 0, 150) ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_BEVERLY_AIMING_CAMERA_AT_CELEB - bev has been consecutively aiming for at least this period of time = ", iAmountTimeSteadyCameraForShot) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_GENERAL_SWEEP)
CLEAR_PED_TASKS(sBeverlyPed.ped)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_BevDoAimCameraAtCelebTask - TASK_SWEEP_AIM_ENTITY CLEARED") ENDIF #ENDIF
ENDIF
// IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_2", "idle")
// CLEAR_PED_TASKS(sBeverlyPed.ped)
// TASK_PLAY_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_2", "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
// ENDIF
// IF NOT IsPedPerformingTask(sBeverlyPed.ped, SCRIPT_TASK_PLAY_ANIM) // SCRIPT_TASK_AIM_GUN_SCRIPTED) // SCRIPT_TASK_DRIVE_BY)
// //CLEAR_PED_TASKS(sBeverlyPed.ped)
// TASK_PLAY_ANIM(sBeverlyPed.ped, "rcmpaparazzo1ig_2", "idle_d", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
// #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_BevDoAimCameraAtCelebTask - on bike idle anim applied") ENDIF #ENDIF
// ENDIF
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sCelebVehicle.vehicle)
fCurrentPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sCelebVehicle.vehicle)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CURRENT PLAYBACK TIME = ", fCurrentPlaybackTime) ENDIF #ENDIF
fCurrentChaseDistanceCeleb = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCelebVehicle.vehicle))
fMainPlaybackSpeed = 0.55
//UPDATE_CELEB_CHASE_SPEED(fMainPlaybackSpeed)
SET_PLAYBACK_SPEED(sCelebVehicle.vehicle, fMainPlaybackSpeed)
ENDIF
ENDIF
IF bDebug_ApplyBevWeaponMovementClipSet
IF IS_PED_SITTING_IN_ANY_VEHICLE(sBeverlyPed.ped)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ApplyBevWeaponMovementClipSet ON BIKE - stopped cam override anim") ENDIF #ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ApplyBevWeaponMovementClipSet ON BIKE - applied idle on bike anim") ENDIF #ENDIF
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ApplyBevWeaponMovementClipSet ON BIKE - AnimSet_BeverlyCameraWeaponMovementOnBike- done") ENDIF #ENDIF
ELSE
IF IS_PED_GETTING_INTO_A_VEHICLE(sBeverlyPed.ped)
IF NOT IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
RESET_PED_MOVEMENT_CLIPSET(sBeverlyPed.ped)
//TASK_PLAY_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ApplyBevWeaponMovementClipSet GETTING ON BIKE - cam_pos_hand_override wasn't playing so NOT applied") ENDIF #ENDIF
ENDIF
ELSE
SET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped, sAnimSet_BeverlyCameraWeaponMovementOnFoot)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ApplyBevWeaponMovementClipSet OFF BIKE - sAnimSet_BeverlyCameraWeaponMovementOnFoot- done") ENDIF #ENDIF
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ApplyBevWeaponMovementClipSet OFF BIKE - stopped idle on bike anim") ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ApplyBevWeaponMovementClipSet OFF BIKE - stopped cam override anim") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
//bDebug_ApplyBevWeaponMovementClipSet = FALSE
ENDIF
IF bDebug_ResetBevWeaponMovementClipSet
RESET_PED_WEAPON_MOVEMENT_CLIPSET(sBeverlyPed.ped)
IF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1Specific, "idle", REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ResetBevWeaponMovementClipSet - stopped idle on bike anim") ENDIF #ENDIF
ELIF IS_ENTITY_PLAYING_ANIM(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override")
STOP_ANIM_TASK(sBeverlyPed.ped, sAnimDictName_Pap1HandOverride, "cam_pos_hand_override", REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ResetBevWeaponMovementClipSet - stopped cam override anim") ENDIF #ENDIF
ENDIF
bDebug_ResetBevWeaponMovementClipSet = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_ResetBevWeaponMovementClipSet - done") ENDIF #ENDIF
ENDIF
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
ENDIF
BREAK
// -------------------------------------------------------------------------------------
CASE SS_CLEANUP
BREAK
ENDSWITCH
ENDPROC
#ENDIF
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
// Setup callback when player is killed, arrested or goes to multiplayer
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU))
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
Random_Character_Failed()
Script_Cleanup()
ENDIF
/*IF IS_REPLAY_IN_PROGRESS() // Set up the initial scene for replays
g_bSceneAutoTrigger = TRUE
//set the initial scene back up
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_PAPARAZZO_1(sRCLauncherDataLocal)
CPRINTLN(DEBUG_MISSION, " IS_REPLAY_IN_PROGRESS - waiting on SetupScene_PAPARAZZO_1")
WAIT(0)
ENDWHILE
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SETUP_AREA_FOR_MISSION(RC_PAPARAZZO_1, FALSE) // need to turn this off in this instance since launcher cleanup won't get called to do it
g_bSceneAutoTrigger = FALSE
ENDIF*/
INIT_MISSION()
IF IS_REPLAY_IN_PROGRESS() // handle replay checkpoints
INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
IF g_bShitskipAccepted = TRUE
iReplayStage++ // player is skipping this stage
ENDIF
SWITCH iReplayStage
CASE CP_PAP1_CHASE_CELEB_IN_VEHICLE
START_REPLAY_SETUP(<<-152.3902, 279.5714, 92.8134>>, 106.6662, FALSE) // match mocap finished position and heading
bDoneDialogue_InitialGetOnBike = TRUE //don't play this dialogue on a replay as we want to start with the objective displayed
DO_Z_SKIP(Z_SKIP_CHASE_CELEB_IN_VEHICLE) // skip the mocap intro
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "start chase in progress")
BREAK
CASE CP_PAP1_STOP_RIVAL_PAP
START_REPLAY_SETUP(<< -1736.5334, -508.0815, 37.9800 >>, 192.10, FALSE)
DO_Z_SKIP(Z_SKIP_STOP_RIVAL_PAP)
iGoodPhotosTakenCounter = g_replay.iReplayInt[REPLAY_PHOTOS_TAKEN] //set from the global value from the previous play through
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "stop rival pap in progress")
BREAK
CASE CP_PAP1_DROP_BEVERLY_OFF
START_REPLAY_SETUP(<<-1586.6477, -533.9604, 34.4623>>, 307.1855, FALSE)
DO_Z_SKIP(Z_SKIP_DROP_BEVERLY_OFF)
bDoneDialogue_RivalPapCameraDestroyed = TRUE //set this dialogue to have already played, because they want the skip to be at the objective instead
iGoodPhotosTakenCounter = g_replay.iReplayInt[REPLAY_PHOTOS_TAKEN] //set from the global value from the previous play through
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "drop bev off in progress")
BREAK
CASE CP_PAP1_MISSION_PASSED
START_REPLAY_SETUP(vDropOffPoint, 221.0758, FALSE)
DO_Z_SKIP(Z_SKIP_OUTRO)
iGoodPhotosTakenCounter = g_replay.iReplayInt[REPLAY_PHOTOS_TAKEN] //set from the global value from the previous play through
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "mission passed in progress (show outro mocap first)")
BREAK
DEFAULT
SCRIPT_ASSERT("RC - PAP 1 : Replay checkpoint * - starting mission from invalid checkpoint")
BREAK
ENDSWITCH
ENDIF
//#IF IS_DEBUG_BUILD SET_PROFILING_OF_THIS_SCRIPT(TRUE) #ENDIF
WHILE(TRUE) // Loop within here until the mission passes or fails
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_P")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
MISSION_FAILED_CHECKS()
CHECK_PLAYER_USED_SPECIAL_ABILITY()
// Fix B*1121745 - swap over to call everyframe commands
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SET_ALL_NEUTRAL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SWITCH eMissionStage
CASE MISSION_STAGE_INTRO_MOCAP_SCENE
STAGE_INTRO_MOCAP_SCENE()
BREAK
CASE MISSION_STAGE_CHASE_CELEB_IN_VEHICLE
STAGE_CHASE_CELEB_IN_VEHICLE()
BREAK
CASE MISSION_STAGE_RIVAL_PAP_JOIN_CHASE
STAGE_RIVAL_PAP_JOIN_CHASE()
BREAK
CASE MISSION_STAGE_STOP_RIVAL_PAP
STAGE_STOP_RIVAL_PAP()
BREAK
CASE MISSION_STAGE_DROP_BEVERLY_OFF
STAGE_DROP_BEVERLY_OFF()
BREAK
CASE MISSION_STAGE_LOSE_THE_COPS
STAGE_LOSE_THE_COPS()
BREAK
CASE MISSION_STAGE_END_CUTSCENE
STAGE_END_CUTSCENE_MOCAP()
BREAK
CASE MISSION_STAGE_MISSION_PASSED
Script_Passed()
BREAK
CASE MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE
STAGE_MISSION_FAILED_WAIT_FOR_FADE()
BREAK
CASE MISSION_STAGE_DEBUG_RECORD_CHASE_ROUTE // debug stage
#IF IS_DEBUG_BUILD
DEBUG_STAGE_RECORD_CHASE_ROUTE()
#ENDIF
BREAK
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE_ROUTE // debug stage
#IF IS_DEBUG_BUILD
DEBUG_STAGE_PLAYBACK_CHASE_ROUTE()
#ENDIF
BREAK
CASE MISSION_STAGE_DEBUG // debug stage
#IF IS_DEBUG_BUILD
DEBUG_STAGE_DEBUG_STATE()
#ENDIF
BREAK
ENDSWITCH
ENDIF
// if we are skipping through the mission stages, for a checkpoint / debug skip
IF bFinishedStageSkipping = FALSE
JUMP_TO_STAGE(eMissionSkipTargetStage)
ENDIF
#IF IS_DEBUG_BUILD
MAINTAIN_MISSION_WIDGETS()
//This is here so it can use the debug skipping functions
IF bDebug_SetupMission_DebugStage
RC_START_Z_SKIP(TRUE, FALSE)
RESET_MISSION()
SET_STAGE(MISSION_STAGE_DEBUG)
RC_END_Z_SKIP()
IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - mission setup in debug stage.") ENDIF
bDebug_SetupMission_DebugStage = FALSE
ENDIF
// not skipping stages, check for debug keys as long as we aren't in fail state
IF bFinishedStageSkipping = TRUE
IF eMissionStage <> MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE
DEBUG_Check_Debug_Keys()
ENDIF
ENDIF
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT