Files
2025-09-29 00:52:08 +02:00

270 lines
9.8 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 "cutscene_public.sch"
USING "commands_cutscene.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "script_player.sch"
USING "randomChar_public.sch"
USING "replay_public.sch"
USING "RC_Helper_Functions.sch"
USING "RC_Threat_Public.sch"
USING "initial_scenes_Abigail.sch"
USING "commands_recording.sch"
// MISSION NAME : Abigail1.sc
// AUTHOR :
// DESCRIPTION : Michael meets Abigail which unlocks diving for submarine scraps
g_structRCScriptArgs sRCLauncherDataLocal
// Progression within a stage
ENUM STAGE_PROGRESS
SP_SETUP,
SP_RUNNING,
SP_CLEANUP
ENDENUM
STRUCT CUT_CAMERA_DATA
VECTOR position
VECTOR angles
FLOAT fov
ENDSTRUCT
CONST_INT CAMERA_MICHAEL 0
CONST_INT CAMERA_ABIGAIL 1
CONST_INT MICHAEL_ID 0 // Conversation speaker ID
CONST_INT ABIGAIL_ID 3 // Conversation speaker ID
PED_INDEX pedAbigail
CAMERA_INDEX camCutscene
BOOL bSetupVehicleGen
INT iZodiacHelpTimer
INT iCutsceneStage = 0
BOOL bPlayerCloseToAbigail = FALSE
BOOL bDone1stPersonCameraFlash = FALSE
/// PURPOSE:
/// Safely cleans up the script
PROC Script_Cleanup()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Script Cleanup") #ENDIF
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Stopped NEW_LOAD_SCENE_START") #ENDIF
ENDIF
RC_CLEANUP_LAUNCHER()
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Adds needed contacts, completion %, cleans up and passes script.
PROC Script_Passed()
CPRINTLN(DEBUG_MISSION, "Abigail 1: Passed")
ADD_CONTACT_TO_PHONEBOOK(CHAR_ABIGAIL, MICHAEL_BOOK)
IF NOT bSetupVehicleGen // Ensure Zodiac is setup
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_PROPERTY_MARINA_ZODIAC, TRUE)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_PROPERTY_MARINA_ZODIAC)
bSetupVehicleGen = TRUE
ENDIF
Random_Character_Passed(CP_RAND_C_ABI1)
Script_Cleanup()
ENDPROC
PROC PLAYER_LOCKED_INTO_CUTSCENES()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
IF bPlayerCloseToAbigail = FALSE // Conversation is playing and Dom is doing leadin anim so check for player proximity, see B*1284037
IF IS_ENTITY_ALIVE(pedAbigail)
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedAbigail) < 4 // Player is very near Abigail
OR (GET_ENTITY_SPEED(PLAYER_PED_ID()) > 2 AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedAbigail) < 6) // Player is sprinting and near Abigail
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Player too close to Abigail so setting player control off") #ENDIF
bPlayerCloseToAbigail = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays the mocap cutscene
PROC STAGE_CUTSCENES()
SWITCH iCutsceneStage
CASE 0
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Starting state MST_CUTSCENES") #ENDIF
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
IF IS_ENTITY_ALIVE(pedAbigail)
IF IS_ENTITY_PLAYING_ANIM(pedAbigail, "rcmabigail", "loop_talk")
OR IS_ENTITY_PLAYING_ANIM(pedAbigail, "rcmabigail", "loop_look")
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Lead in is required") #ENDIF
TASK_PLAY_ANIM(pedAbigail, "rcmabigail", "loop_2_cs", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT|AF_HOLD_LAST_FRAME)
REMOVE_CUTSCENE()
RC_PRE_REQUEST_CUTSCENE(TRUE)
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("ABIGAIL_MCS_1_CONCAT", CS_SECTION_2)
iCutsceneStage = 1
ELSE
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Lead in not required") #ENDIF
RC_REQUEST_CUTSCENE("ABIGAIL_MCS_1_CONCAT", TRUE)
iCutsceneStage = 2
ENDIF
ENDIF
BREAK
CASE 1
PLAYER_LOCKED_INTO_CUTSCENES()
IF IS_ENTITY_ALIVE(pedAbigail)
AND IS_ENTITY_PLAYING_ANIM(pedAbigail, "rcmabigail", "loop_2_cs")
AND GET_ENTITY_ANIM_CURRENT_TIME(pedAbigail, "rcmabigail", "loop_2_cs") > 0.99
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Lead in anim has finished") #ENDIF
iCutsceneStage++
ENDIF
BREAK
CASE 2
PLAYER_LOCKED_INTO_CUTSCENES()
IF RC_IS_CUTSCENE_OK_TO_START()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Starting cutscene") #ENDIF
IF IS_ENTITY_ALIVE(pedAbigail)
REGISTER_ENTITY_FOR_CUTSCENE(pedAbigail, "ABIGAIL", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
RC_CLEANUP_LAUNCHER()
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iCutsceneStage++
ENDIF
BREAK
CASE 3
IF IS_CUTSCENE_PLAYING()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Cutscene is now playing") #ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-1608.165894,5246.844238,1.977510>>, <<-1604.420654,5238.246094,4.996789>>, 6.000000, <<-1596.4615, 5232.4551, 2.9794>>, 25.5125)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<-1596.4615, 5232.4551, 2.9794>>, 25.5125)
RC_START_CUTSCENE_MODE(<<-1604.668, 5239.100, 3.01>>)
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0) // B*1436470
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // Just in case screen is faded out
REMOVE_ANIM_DICT("rcmabigail") // Pre-cutscene anims no longer required
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_PROPERTY_MARINA_ZODIAC, TRUE) // Setup vehicle gen at the marina
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_PROPERTY_MARINA_ZODIAC)
bSetupVehicleGen = TRUE
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START(<<-1606.249146,5273.964355,5.199186>>, <<-1.633685,0.000000,-175.274811>>, 300)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Started NEW_LOAD_SCENE_START") #ENDIF
ENDIF
iCutsceneStage++
ENDIF
BREAK
CASE 4
IF IS_CUTSCENE_PLAYING()
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Creating dinghy cam") #ENDIF
camCutscene = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_PARAMS(camCutscene,<<-1606.249146,5273.964355,5.199186>>, <<-1.633685,0.000000,-175.274811>>, 30.166092, 0)
SET_CAM_PARAMS(camCutscene,<<-1605.680664,5274.014160,3.870102>>, <<-2.089875,0.000000,-178.063965>>, 30.166092, 10000)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SHAKE_CAM(camCutscene, "HAND_SHAKE", 0.3)
ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Michael walking after cutscene") #ENDIF
REPLAY_STOP_EVENT()
CLEAR_PED_TASKS(PLAYER_PED_ID())
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<-1606.5344, 5253.9814, 2.9994>>, PEDMOVEBLENDRATIO_WALK)
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), <<-1602.62, 5260.37, 1.41>>, -1)
ENDIF
IF IS_ENTITY_ALIVE(pedAbigail)
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Abigail")
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Abigail walking after cutscene") #ENDIF
CLEAR_PED_TASKS(pedAbigail)
TASK_FOLLOW_NAV_MESH_TO_COORD(pedAbigail, <<-1581.5586, 5198.0137, 3.0091>>, PEDMOVEBLENDRATIO_WALK)
ENDIF
ELSE
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Mocap cutscene finished, starting scripted cutscene") #ENDIF
iZodiacHelpTimer = GET_GAME_TIMER() + 10000
iCutsceneStage++
ENDIF
BREAK
CASE 5
IF bDone1stPersonCameraFlash = FALSE
AND GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
AND GET_GAME_TIMER() > (iZodiacHelpTimer - 300)
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bDone1stPersonCameraFlash = TRUE
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Doing 1st person camera flash") #ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
OR GET_GAME_TIMER() > iZodiacHelpTimer
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Abigail 1: Scripted cutscene finished, passing mission") #ENDIF
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DIVING_HELP")
CLEAR_HELP(TRUE)
ENDIF
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_ALL_CAMS()
RC_END_CUTSCENE_MODE()
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
SAFE_DELETE_PED(pedAbigail) // B*1433754 Delete Abigail after the cutscene
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), <<-1602.62, 5260.37, 1.41>>, 5000)
ENDIF
Script_Passed()
ELIF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DIVING_HELP")
PRINT_HELP_FOREVER("DIVING_HELP")
ENDIF
BREAK
ENDSWITCH
ENDPROC
#IF IS_DEBUG_BUILD
PROC DEBUG_Check_Debug_Keys()
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
Script_Passed()
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
Script_Cleanup()
ENDIF
ENDPROC
#ENDIF
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
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
ASSIGN_PED_INDEX(pedAbigail, sRCLauncherDataLocal.pedID[0])
WHILE(TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_DAS")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
STAGE_CUTSCENES()
ENDWHILE
ENDSCRIPT