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

883 lines
32 KiB
Python
Executable File

//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 "CompletionPercentage_public.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "cutscene_public.sch"
USING "script_player.sch"
USING "randomChar_public.sch"
USING "RC_Helper_Functions.sch"
USING "initial_scenes_Paparazzo.sch"
USING "commands_recording.sch"
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Paparazzo3.sc
// AUTHOR : Ben.Hinchliffe
// DESCRIPTION : Player meets Beverly in a bin.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//*************************************************************************************************************************************************
// :ENUMS:
//*************************************************************************************************************************************************
// Mission stages
ENUM eRC_SubState
SS_SETUP = 0,
SS_UPDATE,
SS_CLEANUP
ENDENUM
// Mission state
ENUM MISSION_STAGE
MS_INIT = -2,
MS_LEAD_IN = -1,
MS_INTRO = 0,
MS_LEADOUT,
MS_FAIL
ENDENUM
//*************************************************************************************************************************************************
// :CONSTANTS:
//*************************************************************************************************************************************************
CONST_INT BEV 0
CONST_INT CP_AFTER_MOCAP 0 // Checkpoint
CONST_INT OBJ_DUMPSTER 0
CONST_INT OBJ_LIDL 0 // Changed to be index in this script's object array not launcher's
CONST_INT OBJ_LIDR 1 // Changed to be index in this script's object array not launcher's
CONST_INT OBJ_CAM 3 // Bev's camera
//*************************************************************************************************************************************************
// :VARIABLES:
//*************************************************************************************************************************************************
MISSION_STAGE missionStage = MS_INIT
eRC_SubState m_eSubState = SS_SETUP
g_structRCScriptArgs sRCLauncherDataLocal
REL_GROUP_HASH relGroupPlayer
OBJECT_INDEX dumpsterBlue
OBJECT_INDEX dumpsterGreen
OBJECT_INDEX dumpsterLids[2]
MODEL_NAMES modDumpL = PROP_CS_DUMPSTER_LIDL
MODEL_NAMES modDumpR = PROP_CS_DUMPSTER_LIDR
MODEL_NAMES modDumpGreen = PROP_CS_DUMPSTER_01A
MODEL_NAMES modDumpBlue = PROP_DUMPSTER_02A
STRING dumpLidLSceneHandle = "Dumpster_Lid_L"
STRING dumpLidRSceneHandle = "Dumpster_Lid_R"
STRING dumpGreenSceneHandle = "PAP_Dumpster"
STRING dumpBlueSceneHandle = "PAP_Dumpster_blue"
STRING sSceneHandle_Franklin = "Franklin"
STRING leadInOutAnimDict = "rcmpaparazzo_3leadinoutpap_3_rcm"
STRING sSceneHandleBev = "Beverley"
structPedsForConversation conversation
BOOL bLeadInConv = FALSE
BOOL bLeadOutConv = FALSE
INT iSyncSceneLeadIn
INT iSyncSceneLeadInIdle
INT iSyncSceneLeadOut
// Use fixed coordinates for the sync scene
VECTOR vecSyncSceneCoords = << -260.614014, 292.105988, 91.126999 >>
VECTOR vecSyncSceneRotation = << 0.000072,-2.500116,89.639977 >>
INT iSoundId_CameraFlash
VECTOR vCameraFlashFX_Offset = << 0.070, -0.130, 0.070 >>
STRING sAudioBank_CameraFlashSoundFX = "Distant_Camera_Flash"
STRING sCamSoundSetName = "PAPARAZZO_01_SOUNDSET"
BOOL bFlashDone
STRING sFailReason = "DEFAULT"
// ===========================================================================================================
// Termination
// ===========================================================================================================
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Safely cleans up the script
PROC Script_Cleanup()
// Ensure launcher is terminated
RC_CLEANUP_LAUNCHER()
IF (Random_Character_Cleanup_If_Triggered())
CPRINTLN(DEBUG_MISSION, "...Random Character Script was triggered so additional cleanup required")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_03_SCENE")
STOP_AUDIO_SCENE("PAPARAZZO_03_SCENE")
ENDIF
RELEASE_SOUND_ID(iSoundId_CameraFlash)
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDL])
FREEZE_ENTITY_POSITION(dumpsterLids[OBJ_LIDL], TRUE)
ENDIF
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDR])
FREEZE_ENTITY_POSITION(dumpsterLids[OBJ_LIDR], TRUE)
ENDIF
SAFE_RELEASE_OBJECT(dumpsterLids[OBJ_LIDL])
SAFE_RELEASE_OBJECT(dumpsterLids[OBJ_LIDR])
SAFE_RELEASE_OBJECT(dumpsterBlue)
SAFE_RELEASE_OBJECT(dumpsterGreen)
REMOVE_ANIM_DICT(leadInOutAnimDict)
REMOVE_PTFX_ASSET()
REMOVE_PED_FOR_DIALOGUE(conversation, ENUM_TO_INT(CHAR_FRANKLIN))
REMOVE_PED_FOR_DIALOGUE(conversation, 3)
CLEAR_ADDITIONAL_TEXT(MISSION_TEXT_SLOT, TRUE)
CLEAR_PRINTS()
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[BEV])
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE)
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Sets the mission stage, and reset the sub state
/// PARAMS:
/// MISSION_STAGE eNewStage = new main stage
PROC SET_STAGE(MISSION_STAGE eNewStage)
missionstage = eNewStage
m_eSubState = SS_SETUP
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Pass
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Adds needed contacts, completion %, cleans up and passes script.
PROC Script_Passed()
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Mission passed")
ADD_CONTACT_TO_PHONEBOOK(CHAR_BEVERLY, FRANKLIN_BOOK, FALSE)
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[BEV]) //Bev will be inside the closed dumpster now, so delete him
Random_Character_Passed()
Script_Cleanup()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Fail
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Sets the fail reason, and goes to the fail stage
/// PARAMS:
/// sFail - the fail reason
PROC SET_MISSION_FAILED(STRING sFail)
STOP_SCRIPTED_CONVERSATION(FALSE)
CLEAR_PRINTS()
IF missionStage <> MS_FAIL
sFailReason = sFail
SET_STAGE(MS_FAIL)
ENDIF
ENDPROC
/// PURPOSE:
/// Safely fails and cleans up the script
PROC Script_Failed()
Random_Character_Failed()
Script_Cleanup()
ENDPROC
/// PURPOSE:
/// Checks if conditions are met that will fail the mission, for example if Barry is scared away
/// Plays a fail conversation if needed
/// RETURNS:
/// TRUE if mission has failed, else return FALSE
FUNC BOOL FAIL_CHECKS()
IF NOT IS_ENTITY_ALIVE(PLAYER_PED_ID())
RETURN TRUE
ELIF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[BEV])
IF IS_ENTITY_DEAD(sRCLauncherDataLocal.pedID[BEV])
SET_MISSION_FAILED("P3BEVDEAD") // Bev died.
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: FAIL HURT BEV")
RETURN TRUE
ELIF (GET_PED_MAX_HEALTH(sRCLauncherDataLocal.pedID[BEV]) > GET_ENTITY_HEALTH(sRCLauncherDataLocal.pedID[BEV]))
SET_MISSION_FAILED("P3BEVHURT") // Bev was injured
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: FAIL HURT BEV")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Fails and cleans up the mission correctly
PROC STAGE_FAIL()
SWITCH m_eSubState
CASE SS_SETUP
IF ARE_STRINGS_EQUAL(sFailReason,"DEFAULT")
Random_Character_Failed()
ELSE
Random_Character_Failed_With_Reason(sFailReason, TRUE)
ENDIF
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
Script_Cleanup()
ENDIF
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// MISSION FUNCTIONS & PROCEDURES
// ===========================================================================================================
/// PURPOSE:
/// Do we need to resolve the mission start vehicle to a location that is further away?
/// RETURNS:
/// TRUE if the vehicle is not a concern (small enough or doesn't exist)
FUNC BOOL IS_RC_PLAYER_VEHICLE_UNDER_SIZE_LIMIT()
VECTOR vecVehicleSizes[2], vecMaxVehicleSize
VEHICLE_INDEX vehTmp = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(vehTmp)
GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(vehTmp), vecVehicleSizes[0], vecVehicleSizes[1])
vecMaxVehicleSize = GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()
IF vecVehicleSizes[1].x - vecVehicleSizes[0].x > vecMaxVehicleSize.x
RETURN FALSE
ENDIF
IF vecVehicleSizes[1].y - vecVehicleSizes[0].y > vecMaxVehicleSize.y
RETURN FALSE
ENDIF
IF vecVehicleSizes[1].z - vecVehicleSizes[0].z > vecMaxVehicleSize.z
RETURN FALSE
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Create leadout as soon as cutscene has finished, or on checkpoint
PROC CREATE_LEADOUT()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[BEV]) AND DOES_ENTITY_EXIST(dumpsterGreen)
iSyncSceneLeadOut = CREATE_SYNCHRONIZED_SCENE(vecSyncSceneCoords, vecSyncSceneRotation)
TASK_SYNCHRONIZED_SCENE(sRCLauncherDataLocal.pedID[BEV], iSyncSceneLeadOut, leadInOutAnimDict, "leadout_pap_3_rcm_beverly", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_EXPLOSION)
// Dumpster
IF DOES_ENTITY_EXIST(dumpsterGreen)
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterGreen, iSyncSceneLeadOut, "leadout_pap_3_rcm_dumpster", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
ENDIF
// Dumpster lid (left)
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDL])
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterLids[OBJ_LIDL], iSyncSceneLeadOut, "leadout_pap_3_rcm_lid_l", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
ENDIF
// Dumpster lid (right)
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDR])
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterLids[OBJ_LIDR], iSyncSceneLeadOut, "leadout_pap_3_rcm_lid_r", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
ENDIF
// Skip a few frames so lids don't pop
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLeadOut, 0.02)
ENDIF
bLeadOutConv = FALSE
ENDPROC
/// PURPOSE:
/// Triggers the visual and sound effect for taking a picture
PROC BevTakePhoto()
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[OBJ_CAM])
AND NOT bFlashDone
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Camera exists")
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_rcpap1_camera", GET_PED_BONE_COORDS(sRCLauncherDataLocal.pedID[BEV], BONETAG_PH_R_HAND, vCameraFlashFX_Offset), GET_ENTITY_ROTATION(sRCLauncherDataLocal.objID[OBJ_CAM]))
IF NOT HAS_SOUND_FINISHED(iSoundId_CameraFlash)
STOP_SOUND(iSoundId_CameraFlash)
ENDIF
IF REQUEST_SCRIPT_AUDIO_BANK(sAudioBank_CameraFlashSoundFX)
PLAY_SOUND_FROM_COORD(iSoundId_CameraFlash, "CAMERA", GET_PED_BONE_COORDS(sRCLauncherDataLocal.pedID[BEV], BONETAG_PH_R_HAND, vCameraFlashFX_Offset), sCamSoundSetName)
bFlashDone = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Resets certain locations etc
PROC RestartCheckpoint()
RC_START_Z_SKIP()
CREATE_LEADOUT()
SET_STAGE(MS_LEADOUT)
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), <<-258.8661, 292.7882, 90.5764>>, 153.0393)
RC_END_Z_SKIP()
ENDPROC
/// PURPOSE:
/// Sets up important initial parts of mission
PROC INIT()
bLeadInConv = FALSE
// Get the PLAYER relationship group
IF IS_PED_UNINJURED(PLAYER_PED_ID())
relGroupPlayer = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID())
ENDIF
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[BEV])
SET_PED_RELATIONSHIP_GROUP_HASH(sRCLauncherDataLocal.pedID[BEV], relGroupPlayer)
SET_PED_CONFIG_FLAG(sRCLauncherDataLocal.pedID[BEV], PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
SET_PED_KEEP_TASK(sRCLauncherDataLocal.pedID[BEV], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[BEV], TRUE)
ENDIF
// Grab the entities
IF NOT DOES_ENTITY_EXIST(dumpsterBlue)
dumpsterBlue = GET_CLOSEST_OBJECT_OF_TYPE(<< -261.19, 292.22, 90.79 >>, 10.0, modDumpBlue)
SET_CAN_CLIMB_ON_ENTITY(dumpsterBlue, FALSE)
ENDIF
IF NOT DOES_ENTITY_EXIST(dumpsterGreen)
ASSIGN_OBJECT_INDEX(dumpsterGreen, sRCLauncherDataLocal.objID[OBJ_DUMPSTER])
ENDIF
IF NOT DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDL])
ASSIGN_OBJECT_INDEX(dumpsterLids[OBJ_LIDL], sRCLauncherDataLocal.objID[1])
ENDIF
IF NOT DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDR])
ASSIGN_OBJECT_INDEX(dumpsterLids[OBJ_LIDR], sRCLauncherDataLocal.objID[2])
ENDIF
ADD_PED_FOR_DIALOGUE(conversation, ENUM_TO_INT(CHAR_FRANKLIN), PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(conversation, 3, sRCLauncherDataLocal.pedID[BEV], "BEVERLY")
// Request text
REQUEST_ADDITIONAL_TEXT("PAP3", MISSION_TEXT_SLOT)
// Animation dictionary
REQUEST_ANIM_DICT(leadInOutAnimDict)
// Particles
REQUEST_PTFX_ASSET()
WHILE NOT HAS_ANIM_DICT_LOADED(leadInOutAnimDict)
OR NOT HAS_PTFX_ASSET_LOADED()
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
WAIT(0)
ENDWHILE
iSoundId_CameraFlash = GET_SOUND_ID()
IF IS_REPLAY_IN_PROGRESS()
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Replay in progress")
SWITCH GET_REPLAY_MID_MISSION_STAGE()
CASE CP_AFTER_MOCAP
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: CP_AFTER_MOCAP replay")
RestartCheckpoint()
BREAK
DEFAULT
SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected")
BREAK
ENDSWITCH
ELSE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sSceneHandle_Franklin, PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: STAGE_END_CUTSCENE_MOCAP - SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE player")
ENDIF
ENDIF
SET_STAGE(MS_LEAD_IN)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles head tracking between Franklin and Beverly
PROC UPDATE_HEAD_TRACKING()
IF IS_PLAYER_PLAYING(PLAYER_ID())
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[BEV])
SET_IK_TARGET(sRCLauncherDataLocal.pedID[BEV], IK_PART_HEAD, PLAYER_PED_ID(), ENUM_TO_INT(BONETAG_HEAD), <<0,0,0>>, ITF_DEFAULT)
SET_IK_TARGET(PLAYER_PED_ID(), IK_PART_HEAD, sRCLauncherDataLocal.pedID[BEV], ENUM_TO_INT(BONETAG_HEAD), <<0,0,0>>, ITF_DEFAULT)
ENDIF
ENDPROC
/// PURPOSE:
/// Do focus push in first person only
PROC DO_FOCUS_PUSH()
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[BEV], (<<0, 0, 0>>), TRUE, -1, 1500, DEFAULT_INTERP_OUT_TIME)
ENDIF
ENDPROC
/// PURPOSE:
/// Plays the lead in then triggers the mocap
PROC LEAD_IN()
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
UPDATE_HEAD_TRACKING()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Start - SETUP LEAD_IN")
IF NOT IS_AUDIO_SCENE_ACTIVE("PAPARAZZO_03_SCENE")
START_AUDIO_SCENE("PAPARAZZO_03_SCENE")
ENDIF
bFlashDone = FALSE
RC_REQUEST_CUTSCENE("PAP_3_RCM")
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[BEV]) AND DOES_ENTITY_EXIST(dumpsterGreen)
// Create synchronised scene
iSyncSceneLeadIn = CREATE_SYNCHRONIZED_SCENE(GET_ENTITY_COORDS(dumpsterGreen), GET_ENTITY_ROTATION(dumpsterGreen))
TASK_SYNCHRONIZED_SCENE(sRCLauncherDataLocal.pedID[BEV], iSyncSceneLeadIn, leadInOutAnimDict, "leadin_pap_3_rcm_beverly", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
// Dumpster
IF DOES_ENTITY_EXIST(dumpsterGreen)
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterGreen, iSyncSceneLeadIn, "leadin_pap_3_rcm_dumpster", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
ENDIF
// Dumpster lid (left)
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDL])
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterLids[OBJ_LIDL], iSyncSceneLeadIn, "leadin_pap_3_rcm_lid_l", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
ENDIF
// Dumpster lid (right)
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDR])
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterLids[OBJ_LIDR], iSyncSceneLeadIn, "leadin_pap_3_rcm_lid_r", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
ENDIF
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Done lead-in animation")
RC_END_CUTSCENE_MODE()
m_eSubState = SS_UPDATE
ENDIF
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: End - SETUP LEAD_IN")
BREAK
CASE SS_UPDATE
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[BEV]) AND DOES_ENTITY_EXIST(dumpsterGreen)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLeadIn)
IF (GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLeadIn) > 0.99)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLeadInIdle)
CPRINTLN(DEBUG_MISSION, "Setting up the idle synch scene")
iSyncSceneLeadInIdle = CREATE_SYNCHRONIZED_SCENE(GET_ENTITY_COORDS(dumpsterGreen), GET_ENTITY_ROTATION(dumpsterGreen))
TASK_SYNCHRONIZED_SCENE(sRCLauncherDataLocal.pedID[BEV], iSyncSceneLeadInIdle, leadInOutAnimDict, "idle_01_pap_3_rcm_beverly", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sRCLauncherDataLocal.pedID[BEV])
// Dumpster
IF DOES_ENTITY_EXIST(dumpsterGreen)
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterGreen, iSyncSceneLeadInIdle, "idle_01_pap_3_rcm_dumpster", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(dumpsterGreen)
ENDIF
// Dumpster lid (left)
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDL])
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterLids[OBJ_LIDL], iSyncSceneLeadInIdle, "idle_01_pap_3_rcm_lid_l", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(dumpsterLids[OBJ_LIDL])
ENDIF
// Dumpster lid (right)
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDR])
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterLids[OBJ_LIDR], iSyncSceneLeadInIdle, "idle_01_pap_3_rcm_lid_r", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(dumpsterLids[OBJ_LIDR])
ENDIF
ENDIF
ENDIF
IF (GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLeadIn) > 0.3)
IF NOT bLeadInConv
bLeadInConv = CREATE_CONVERSATION(conversation, "PAP3AU", "PAP3_RCM_LI", CONV_PRIORITY_HIGH)
ENDIF
ENDIF
IF(GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLeadIn) > 0.3)
BevTakePhoto()
ENDIF
IF (GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLeadIn) > 0.05)
DO_FOCUS_PUSH()
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Beverly not playing leadin anim anymore - skip to cutscene for safety")
DO_FOCUS_PUSH()
m_eSubState = SS_CLEANUP
ENDIF
IF bLeadInConv
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Beverly not conversing anymore - skip to cutscene")
m_eSubState = SS_CLEANUP
ENDIF
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: CLEANUP LEAD_IN")
DO_FOCUS_PUSH()
SET_STAGE(MS_INTRO)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Plays the intro mocap and then passes the mission
PROC INTRO()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Init MS_INTRO")
DO_FOCUS_PUSH()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sSceneHandle_Franklin, PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE player")
ENDIF
ENDIF
IF RC_IS_CUTSCENE_OK_TO_START()
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: MS_INTRO cutscene ok to start")
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[BEV])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[BEV], sSceneHandleBev, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sSceneHandle_Franklin, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDL])
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: lidl exists")
REGISTER_ENTITY_FOR_CUTSCENE(dumpsterLids[OBJ_LIDL], dumpLidLSceneHandle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY, modDumpL)
ELSE
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: lidl doesn't exist")
REGISTER_ENTITY_FOR_CUTSCENE(dumpsterLids[OBJ_LIDL], dumpLidLSceneHandle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, modDumpL)
ENDIF
IF DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDR])
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: lidr exists")
REGISTER_ENTITY_FOR_CUTSCENE(dumpsterLids[OBJ_LIDR], dumpLidRSceneHandle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY, modDumpR)
ELSE
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: lidr doesn't exist")
REGISTER_ENTITY_FOR_CUTSCENE(dumpsterLids[OBJ_LIDR], dumpLidRSceneHandle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, modDumpR)
ENDIF
IF DOES_ENTITY_EXIST(dumpsterBlue)
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: dumpsterBlue exists")
REGISTER_ENTITY_FOR_CUTSCENE(dumpsterBlue, dumpBlueSceneHandle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY, modDumpBlue)
ELSE
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: dumpsterBlue doesn't exist")
REGISTER_ENTITY_FOR_CUTSCENE(dumpsterBlue, dumpBlueSceneHandle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, modDumpBlue)
ENDIF
IF DOES_ENTITY_EXIST(dumpsterGreen)
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: dumpsterGreen exists")
REGISTER_ENTITY_FOR_CUTSCENE(dumpsterGreen, dumpGreenSceneHandle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY, modDumpGreen)
ELSE
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: dumpsterBlue doesn't exist")
REGISTER_ENTITY_FOR_CUTSCENE(dumpsterGreen, dumpGreenSceneHandle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, modDumpGreen)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_LOWEST)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
// Cleanup launcher to remove lead-in blip
RC_CLEANUP_LAUNCHER()
// Start mocap scene
START_CUTSCENE()
WAIT(0)
// B*1988959 - handle unusually large vehicles
IF IS_RC_PLAYER_VEHICLE_UNDER_SIZE_LIMIT()
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-262.08163,292.330,90.000>>, <<-254.652,292.335,93.500>>, 5.0, <<-257.08, 285.27, 90.43>>, 12.52)
ELSE
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<< -254.8715, 316.4631, 88.6055 >>, << -255.2926, 270.6087, 103.2327 >>, 30.0, <<-239.7607, 267.4757, 91.0999>>, 86.5)
ENDIF
RC_START_CUTSCENE_MODE(<< -259.3334, 291.8268, 90.5229 >>)
SAFE_DELETE_OBJECT(sRCLauncherDataLocal.objID[OBJ_CAM])
m_eSubState = SS_UPDATE// Monitor cutscene
ENDIF
BREAK
CASE SS_UPDATE
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT(TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandleBev)
iSyncSceneLeadOut = CREATE_SYNCHRONIZED_SCENE(vecSyncSceneCoords, vecSyncSceneRotation)
TASK_SYNCHRONIZED_SCENE(sRCLauncherDataLocal.pedID[BEV], iSyncSceneLeadOut, leadInOutAnimDict, "leadout_pap_3_rcm_beverly", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_EXPLOSION)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sRCLauncherDataLocal.pedID[BEV])
CPRINTLN(DEBUG_MISSION, "Set exit state on beverley")
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Franklin)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-258.8661, 292.7882, 90.5764>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 153.0417)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT DOES_ENTITY_EXIST(dumpsterGreen)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(dumpGreenSceneHandle, modDumpGreen))
dumpsterGreen = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(dumpGreenSceneHandle, modDumpGreen))
ENDIF
ELIF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLeadOut)
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(dumpGreenSceneHandle)
SET_ENTITY_COORDS(dumpsterGreen, vecSyncSceneCoords, FALSE)
SET_ENTITY_ROTATION(dumpsterGreen, vecSyncSceneRotation, EULER_YXZ, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterGreen, iSyncSceneLeadOut, "leadout_pap_3_rcm_dumpster", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(dumpsterGreen)
CPRINTLN(DEBUG_MISSION, "Set exit state on dumpsterGreen")
ENDIF
IF NOT DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDL])
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(dumpLidLSceneHandle))
dumpsterLids[OBJ_LIDL] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(dumpLidLSceneHandle, modDumpL))
ENDIF
ELIF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLeadOut)
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(dumpLidLSceneHandle)
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterLids[OBJ_LIDL], iSyncSceneLeadOut, "leadout_pap_3_rcm_lid_l", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(dumpsterLids[OBJ_LIDL])
CPRINTLN(DEBUG_MISSION, "Set exit state on dumpLidLSceneHandle")
ENDIF
IF NOT DOES_ENTITY_EXIST(dumpsterLids[OBJ_LIDR])
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(dumpLidRSceneHandle))
dumpsterLids[OBJ_LIDR] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(dumpLidRSceneHandle, modDumpR))
ENDIF
ELIF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLeadOut)
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(dumpLidRSceneHandle)
PLAY_SYNCHRONIZED_ENTITY_ANIM(dumpsterLids[OBJ_LIDR], iSyncSceneLeadOut, "leadout_pap_3_rcm_lid_r", leadInOutAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(dumpsterLids[OBJ_LIDR])
CPRINTLN(DEBUG_MISSION, "Set exit state on dumpLidRSceneHandle")
ENDIF
IF NOT DOES_ENTITY_EXIST(dumpsterBlue)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(dumpBlueSceneHandle))
dumpsterBlue = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(dumpBlueSceneHandle, modDumpBlue))
ENDIF
ELIF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLeadOut)
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(dumpBlueSceneHandle)
SET_ENTITY_COORDS(dumpsterBlue, <<-261.113159,294.195557,90.686119>>, FALSE)
SET_ENTITY_ROTATION(dumpsterBlue, <<-0.604164,-2.332095,89.8831>>, EULER_YXZ, FALSE)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(dumpsterBlue)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_LOWEST)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
DISPLAY_RADAR(TRUE)
ENDIF
IF HAS_CUTSCENE_FINISHED()
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Cutscene finished")
m_eSubState = SS_CLEANUP
ENDIF
BREAK
ENDSWITCH
// Need to create leadout RIGHT NOW - previous flow allowed a two frame gap
IF m_eSubState = SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: Cleaning up MS_INTRO")
RC_END_CUTSCENE_MODE()
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
SET_STAGE(MS_LEADOUT)
ENDIF
ENDPROC
/// PURPOSE:
/// plays lead out
PROC LEADOUT()
UPDATE_HEAD_TRACKING()
IF NOT HAS_PLAYER_THREATENED_PED(sRCLauncherDataLocal.pedID[BEV])
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Paparazzo 3: LEADOUT - setup")
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[BEV])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[BEV], TRUE)
ENDIF
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF NOT bLeadOutConv
bLeadOutConv = CREATE_CONVERSATION(conversation, "PAP3AU", "PAP3_RCM_LO", CONV_PRIORITY_HIGH)
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLeadOut)
IF(GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLeadOut) >= 1.0)
m_eSubState = SS_CLEANUP
ENDIF
ELSE
m_eSubState = SS_CLEANUP
ENDIF
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "LEADOUT - cleanup")
Script_Passed()
BREAK
ENDSWITCH
ELSE
missionStage = MS_FAIL
m_eSubState = SS_SETUP
sFailReason = "P3BEVSCARED"
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Check for Forced Pass or Fail
PROC DEBUG_Check_Debug_Keys()
// check for P skip- restart intro
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
WAIT_FOR_CUTSCENE_TO_STOP()
RC_START_Z_SKIP()
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[BEV]) // Delete Beverly
SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[BEV]) // Delete Initial Scene car
SAFE_DELETE_OBJECT(sRCLauncherDataLocal.objID[OBJ_CAM])
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_PAPARAZZO_3(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
SET_STAGE(MS_INIT)
RC_END_Z_SKIP()
ENDIF
// Check for Pass (j skip passes as mission is just a cut-scene)
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) OR (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
WAIT_FOR_CUTSCENE_TO_STOP()
Script_Passed()
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
WAIT_FOR_CUTSCENE_TO_STOP()
Random_Character_Failed()
Script_Cleanup()
ENDIF
ENDPROC
#ENDIF
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
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
eInitialSceneStage = IS_REQUEST_SCENE
g_bSceneAutoTrigger = TRUE
WHILE NOT SetupScene_PAPARAZZO_3(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
VEHICLE_INDEX vTmp
CREATE_VEHICLE_FOR_REPLAY(vTmp, <<-257.08, 285.27, 90.43>>, 12.52, FALSE, FALSE, FALSE, FALSE, FALSE)
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
g_bSceneAutoTrigger = FALSE
ENDIF
// Loop within here until the mission passes or fails
WHILE(TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_PTP")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
IF missionStage = MS_FAIL
STAGE_FAIL()
ELSE
IF NOT FAIL_CHECKS() //if not failed mission
SWITCH missionStage
CASE MS_INIT
INIT()
BREAK
CASE MS_LEAD_IN
LEAD_IN()
BREAK
CASE MS_INTRO
INTRO()
BREAK
CASE MS_LEADOUT
LEADOUT()
BREAK
ENDSWITCH
ENDIF
ENDIF
// Check debug keys
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT