//╒═════════════════════════════════════════════════════════════════════════════╕ //│ Author: Ste Kerrigan Date: 15/03/11 │ //╞═════════════════════════════════════════════════════════════════════════════╡ //│ │ //│ FBI4 Mission Intro Cutscene Script │ //│ │ //╘═════════════════════════════════════════════════════════════════════════════╛ //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 "clearmissionarea.sch" USING "commands_script.sch" USING "commands_graphics.sch" USING "commands_camera.sch" USING "commands_cutscene.sch" USING "flow_public_core_override.sch" USING "flow_help_public.sch" USING "script_misc.sch" USING "replay_public.sch" USING "RC_helper_functions.sch" USING "commands_recording.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" USING "shared_debug.sch" CONST_INT MAX_SKIP_MENU_LENGTH 1 INT i_debug_jump_stage MissionStageMenuTextStruct s_skip_menu[MAX_SKIP_MENU_LENGTH] #ENDIF // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Template.sc // AUTHOR : Ste Kerrigan // DESCRIPTION : // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** //---------------------- // CHECKPOINTS //---------------------- //----------------------- // CONSTANTS //----------------------- ENUM MISSION_PED_ENUM ANDREAS = 0, DAVE, STEVE, MIKE, TREV, FRANK, NUM_PEDS ENDENUM ENUM MISSION_CAR_ENUM MIKE_CAR = 0, FRANK_CAR, TREV_CAR, GENERIC_CAR, NUM_CARS ENDENUM /// -------------------------------------------------- /// ENUMS /// ------------------------------------------- /// PURPOSE: Mission states ENUM MISSION_STATE MS_SET_UP = 0, //0 MS_INTRO, //1 MS_LEAVE_AREA, MS_FAILED //3 ENDENUM /// PURPOSE: /// Internal state machine states for mission state ENUM STAGE_STATES SS_INIT, SS_ACTIVE, SS_CLEANUP, SS_SKIPPED ENDENUM /// PURPOSE: Mission requirements used for loading /// and creating mission assets ENUM MISSION_REQ RQ_NONE, RQ_TEXT, RQ_CUTSCENE, RQ_MIKE, RQ_FRANK, RQ_TREV, RQ_STEVE, RQ_ANDREAS, RQ_DAVE, RQ_DAVES_PHONE, RQ_MIKE_CAR, RQ_FRANK_CAR, RQ_TREV_CAR ENDENUM /// PURPOSE: Fail reason enums for picking correct fail reason ENUM FAILED_REASONS FR_NONE, FR_MIKE_KILLED, FR_MIKE_THREATENED ENDENUM ENUM MIKE_STATES MSS_NULL, MSS_WAIT_SMOKE, MSS_SMOKE, MSS_WAIT_PHONE, MSS_PHONE, MSS_IDLE ENDENUM MIKE_STATES eMikeState = MSS_NULL ///MISSION PED STATES MISSION_STATE eMissionState = MS_SET_UP //track what MISSION stage we are at STAGE_STATES eState = SS_INIT //Internal state tracking for mission stages enumCharacterList eStartedPlayer //***************************************************************************** // :STRUCTS: //***************************************************************************** //**************************************************************************************************** // : MISSION FLOW VARIABLES : //**************************************************************************************************** //mission flow INT iMissionState = 0 //Used in skips and checkpoints BOOL bJumpSkip = FALSE //flag for if current MISSION state should clean up and move to the next state //Fail vars STRING sFailReason = NULL //String to display when mission is failed //Cutscene BOOL bLoadingFinCutscene = FALSE //ScriptCamera CAMERA_INDEX camMain //Script camera used in place holder cutscenes VECTOR vSafeVec = <<0,0,0>> //safe vector used when a proper position isnt needed //PEDS PED_INDEX piPeds[NUM_PEDS] VEHICLE_INDEX viCars[NUM_CARS] //Object OBJECT_INDEX oiDavesPhone INT iMissionTimer = -1 INT iDialogueTimer = -1 INT iMikeTimer = -1 structPedsForConversation s_conversation_peds //conversation struct /// ===============| DIALOGUE |====================== /// PURPOSE: /// Resets all variables used in flow PROC RESET_ALL() ENDPROC BOOL bRegisteredFrank = FALSE BOOL bRegisteredTrev = FALSE /// /// /// DEBUG ONLY MISSION STUFF ------------------------------------------------------------ /// /// #IF IS_DEBUG_BUILD BOOL bShowDebugText = TRUE WIDGET_GROUP_ID widgetGroup BOOL bForceFail = FALSE /// PURPOSE: /// Prints a string to a TTY Channel /// PARAMS: /// s - The string to print /// ddc - The debug channel to print to PROC SK_PRINT(String s, DEBUG_CHANNELS ddc = DEBUG_MISSION) IF bShowDebugText CPRINTLN(ddc, s) PRINTNL() PRINTNL() ENDIF ENDPROC /// PURPOSE: /// Prints a string and an int to a TTY Channel /// PARAMS: /// s - The string to print /// i - the int to print /// ddc - the debug channel to print to PROC SK_PRINT_INT(String s, INT i, DEBUG_CHANNELS ddc = DEBUG_MISSION) IF bShowDebugText CPRINTLN(ddc, s,i) PRINTNL() PRINTNL() ENDIF ENDPROC /// PURPOSE: /// Prints a string and a Float to a TTY Channel /// PARAMS: /// s - the string to print /// f - the float to print /// ddc - the debug channel PROC SK_PRINT_FLOAT(String s, FLOAT f, DEBUG_CHANNELS ddc = DEBUG_MISSION) IF bShowDebugText CPRINTLN(ddc, s,f) PRINTNL() PRINTNL() ENDIF ENDPROC /// PURPOSE: /// Sets up a widget for this mission PROC SETUP_FOR_RAGE_WIDGETS() widgetGroup = START_WIDGET_GROUP("CURRENT Mission Widgets") START_WIDGET_GROUP("Debug") ADD_WIDGET_BOOL("Toggle Debug spew", bShowDebugText) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Force Mission Fail") ADD_WIDGET_BOOL("Force Fail", bForceFail) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() ENDPROC /// PURPOSE: /// Deletes the mission widget PROC CLEANUP_OBJECT_WIDGETS() IF DOES_WIDGET_GROUP_EXIST(widgetGroup) DELETE_WIDGET_GROUP(widgetGroup) ENDIF ENDPROC /// PURPOSE: /// Checks for any updates needed for the widgets PROC UPDATE_RAG_WIDGETS() IF bForceFail eMissionState = MS_FAILED eState = SS_INIT bForceFail = FALSE ENDIF ENDPROC #ENDIF /// /// /// GENERAL HELP FUNCTIONS /// /// /// PURPOSE: /// Set a peds position and heading safely ie check its ok then move it and set its heading /// PARAMS: /// index - The ped to move /// pos - The position to move it to /// dir - The Heading to set PROC SET_PED_POS(PED_INDEX index, VECTOR pos, FLOAT dir) IF IS_PED_UNINJURED(index) CLEAR_PED_TASKS(index) ENDIF SAFE_TELEPORT_ENTITY(index, pos, dir) ENDPROC /// PURPOSE: /// Requests a model and waits for it to load /// PARAMS: /// _modname - The name of the model to load /// _debugstring - used to debug /// i - used to debug /// RETURNS: /// TRUE when the model is loaded FUNC BOOL REQUEST_AND_CHECK_MODEL(MODEL_NAMES _modname, STRING _debugstring, INT i = 0) REQUEST_MODEL(_modname) IF NOT Is_String_Null_Or_Empty(_debugstring) AND i <> -1 #IF IS_DEBUG_BUILD SK_PRINT_INT(_debugstring, i) #ENDIF ENDIF IF HAS_MODEL_LOADED(_modname) #IF IS_DEBUG_BUILD SK_PRINT("MODEL LOADED") #ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Unloads a model - Sets it as no longer needed /// PARAMS: /// _modname - The model to unload PROC UNLOAD_MODEL(MODEL_NAMES _modname, BOOL bCheckLoaded = TRUE) IF bCheckLoaded IF HAS_MODEL_LOADED(_modname) SET_MODEL_AS_NO_LONGER_NEEDED(_modname) ENDIF ELSE SET_MODEL_AS_NO_LONGER_NEEDED(_modname) ENDIF ENDPROC /// PURPOSE: /// Spawns a ped and returns true if it was succesful. Requests the model and unloads it /// PARAMS: /// pedindex - The PED_INDEX to write the newly create ped to /// model - The model to load and use to create the ped /// pos - The position the ped should be created /// dir - The heading the ped should have when created /// bUnloadAfterSpawn - If true we unload the model after spawning the ped /// bFreeze - if true we freeze the ped after spawning /// bTempEvents - if true we block temp events /// bTargetable - if false we set the ped to not be targetted /// RETURNS: /// TRUE if the ped was created FUNC BOOL SPAWN_PED(PED_INDEX &pedindex, MODEL_NAMES model, VECTOR pos, FLOAT dir, BOOL bUnloadAfterSpawn = TRUE, BOOL bFreeze = FALSE, BOOL bTempEvents = TRUE, BOOL bTargetable = TRUE) IF NOT DOES_ENTITY_EXIST(pedindex) IF REQUEST_AND_CHECK_MODEL(model,"Loading") pedindex = CREATE_PED(PEDTYPE_MISSION, model, pos, dir) //SET_PED_DEFAULT_COMPONENT_VARIATION(pedindex) IF IS_PED_UNINJURED(pedindex) #IF IS_DEBUG_BUILD SK_PRINT("PED CREATED !") #ENDIF IF bFreeze FREEZE_ENTITY_POSITION(pedindex, TRUE) ENDIF IF bTempEvents SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedindex, bTempEvents) ENDIF IF NOT bTargetable SET_PED_CAN_BE_TARGETTED(pedindex, bTargetable) ENDIF IF bUnloadAfterSpawn UNLOAD_MODEL(model) ENDIF RETURN TRUE ENDIF ENDIF ELSE IF IS_PED_UNINJURED(pedindex) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Spawns a vehicle and returns true if it was succesful - why does the is mission entity check return true /// no matter what the out come of said check? /// PARAMS: /// vehicleindex - The VEHICLE_INDEX to write the newly create vehicle to /// model - The model to load and use to create the vehicle /// pos - The position the vehicle should be created /// dir - The heading the vehicle should have when created /// RETURNS: /// TRUE if the vehicle was created FUNC BOOL SPAWN_VEHICLE(VEHICLE_INDEX &vehicleindex, MODEL_NAMES model, VECTOR pos, FLOAT dir, BOOL bUnloadAfterSpawn = TRUE) IF NOT DOES_ENTITY_EXIST(vehicleindex) IF REQUEST_AND_CHECK_MODEL(model,"Loading") vehicleindex = CREATE_VEHICLE(model, pos, dir) IF DOES_ENTITY_EXIST(vehicleindex) IF NOT IS_ENTITY_A_MISSION_ENTITY(vehicleindex) SET_ENTITY_AS_MISSION_ENTITY(vehicleindex) ENDIF SET_VEHICLE_MODEL_IS_SUPPRESSED(model, TRUE) SET_VEHICLE_ON_GROUND_PROPERLY(vehicleindex) IF bUnloadAfterSpawn UNLOAD_MODEL(model) ENDIF RETURN TRUE ENDIF ENDIF ELSE IF IS_VEHICLE_OK(vehicleindex) SET_ENTITY_COORDS(vehicleindex, pos) SET_ENTITY_HEADING(vehicleindex, dir) ENDIF IF NOT IS_ENTITY_A_MISSION_ENTITY(vehicleindex) SET_ENTITY_AS_MISSION_ENTITY(vehicleindex) RETURN TRUE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Spawns a ped inside a vehicle /// PARAMS: /// pedindex - The index to write the newly created ped back to (ref) /// Car - The vehicle to create the ped in /// modelName - The model of the ped to create /// seat - the seat to create the ped in /// bUnloadAfterSpawn - should we unload the ped model after creation /// RETURNS: /// TRUE if the ped was spawned correctly FUNC BOOL SPAWN_PED_IN_VEHICLE(PED_INDEX &pedindex, VEHICLE_INDEX Car, MODEL_NAMES modelName, VEHICLE_SEAT seat = VS_DRIVER, BOOL bUnloadAfterSpawn = TRUE) IF IS_VEHICLE_OK(Car) IF NOT DOES_ENTITY_EXIST(pedindex) IF REQUEST_AND_CHECK_MODEL(modelName,"Loading") pedindex = CREATE_PED_INSIDE_VEHICLE(Car, PEDTYPE_MISSION, modelName, seat) IF DOES_ENTITY_EXIST(pedindex) IF bUnloadAfterSpawn UNLOAD_MODEL(modelName) ENDIF RETURN TRUE ENDIF ENDIF ELSE RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF RETURN FALSE ENDFUNC ///----------------------------------------------------------------------------------- /// MISSION FUNCTIONS ///----------------------------------------------------------------------------------- PROC REQUEST_VARIATIONS() IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() #IF IS_DEBUG_BUILD SK_PRINT("CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY") #ENDIF switch get_current_player_ped_enum() case CHAR_MICHAEL IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) ENDIF break case CHAR_FRANKLIN IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[MIKE]) AND IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[TREV]) AND IS_PED_UNINJURED(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", g_sTriggerSceneAssets.ped[MIKE]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("trevor", g_sTriggerSceneAssets.ped[TREV]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID()) ENDIF break case CHAR_TREVOR IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[MIKE]) AND IS_PED_UNINJURED(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("trevor", PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", g_sTriggerSceneAssets.ped[MIKE]) ENDIF break ENDSWITCH IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[ANDREAS]) AND IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[DAVE]) AND IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[STEVE]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Andreas_Sanchez", g_sTriggerSceneAssets.ped[ANDREAS]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Dave_FBI", g_sTriggerSceneAssets.ped[DAVE]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("steve_FBI", g_sTriggerSceneAssets.ped[STEVE]) ENDIF ENDIF ENDPROC /// PURPOSE: /// Turn off the ambient services PROC SERVICES_TOGGLE(BOOL bOn) //Wanted ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, bOn) ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, bOn) ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, bOn) ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, bOn) ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, bOn) IF bOn SET_WANTED_LEVEL_MULTIPLIER(1.0) SET_MAX_WANTED_LEVEL(5) ELSE SET_MAX_WANTED_LEVEL(0) SET_WANTED_LEVEL_MULTIPLIER(0) ENDIF ENDPROC // ----------------------------------------------------------------------------------------------------------- // Script Fail // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Called when the player has failed /// deletes blips and clears the screen of text and conversations are ended /// PARAMS: /// fail - An Enum of the fail reason used in a switch statment to pick the correct text to display PROC MISSION_FAILED(FAILED_REASONS fail = FR_NONE) CLEAR_PRINTS() KILL_ANY_CONVERSATION() SWITCH fail CASE FR_NONE BREAK CASE FR_MIKE_KILLED sFailReason = "CMN_MDIED" BREAK CASE FR_MIKE_THREATENED sFailReason = "INT_THREAT" BREAK ENDSWITCH eMissionState = MS_FAILED eState = SS_INIT ENDPROC ///----------------------------------------------------------------------------------- /// STATE MACHINES ///----------------------------------------------------------------------------------- /// PURPOSE: /// Sets up a stage requirment via a switch using an ENUM /// Stage requirements include the hunter the saleform or the mission text etc. /// PARAMS: /// missionReq - The Enum of the required mission element e.g. RQ_TEXT /// pos - The position the thing is spawned at - if no position is required the use vSafeVec /// If spawning multiple things at once then have the postions already in the switch statement /// as calling this func multiple times wont work as well with the other function that calls it /// dir - This is the heading or direction you want the thing to face when spawned. Defaults to /// 0.0 /// RETURNS: /// TRUE when the thing required is created/loaded/setup or whatever. /// FUNC BOOL SETUP_STAGE_REQUIREMENTS(MISSION_REQ missionReq,VECTOR pos, FLOAT dir=0.0) SWITCH missionReq CASE RQ_NONE IF ARE_VECTORS_ALMOST_EQUAL(pos, vSafeVec) AND dir = 0.0 RETURN TRUE ENDIF BREAK CASE RQ_CUTSCENE IF NOT IS_REPLAY_IN_PROGRESS() IF HAS_CUTSCENE_LOADED() #IF IS_DEBUG_BUILD SK_PRINT("HAS_CUTSCENE_LOADED()") #ENDIF RETURN TRUE ENDIF IF eStartedPlayer = CHAR_FRANKLIN REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("FBI_4_INT", cs_section_4|cs_section_5| cs_section_6|CS_SECTION_7) ELIF eStartedPlayer = CHAR_TREVOR REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("FBI_4_INT", cs_section_3 | cs_section_4| cs_section_5| cs_section_6|CS_SECTION_7) ELSE REQUEST_CUTSCENE("FBI_4_INT") ENDIF ELSE RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("HAS_CUTSCENE_LOADED() FAILED") #ENDIF BREAK CASE RQ_MIKE IF eStartedPlayer = CHAR_MICHAEL RETURN TRUE ENDIF IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[3]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[3], TRUE, TRUE) piPeds[MIKE] = g_sTriggerSceneAssets.ped[3] IF IS_PED_UNINJURED(piPeds[MIKE]) #IF IS_DEBUG_BUILD SK_PRINT("RQ_MIKE") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_MIKE FAILED") #ENDIF ELSE IF CREATE_PLAYER_PED_ON_FOOT(piPeds[MIKE], CHAR_MICHAEL, <<1982.1981, 3818.9526, 31.4232>>, 215.9222, FALSE) RETURN TRUE ENDIF ENDIF BREAK CASE RQ_FRANK // IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[FRANK]) // SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[FRANK], TRUE, TRUE) // piPeds[FRANK] = g_sTriggerSceneAssets.ped[FRANK] // // IF IS_PED_UNINJURED(piPeds[FRANK]) // #IF IS_DEBUG_BUILD // SK_PRINT("RQ_FRANK") // #ENDIF RETURN TRUE // ENDIF // // #IF IS_DEBUG_BUILD // SK_PRINT("RQ_FRANK FAILED") // #ENDIF // ENDIF BREAK CASE RQ_TREV IF eStartedPlayer = CHAR_MICHAEL RETURN TRUE ELIF eStartedPlayer = CHAR_TREVOR RETURN TRUE ENDIF IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[4]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[4], TRUE, TRUE) piPeds[TREV] = g_sTriggerSceneAssets.ped[4] IF IS_PED_UNINJURED(piPeds[TREV]) #IF IS_DEBUG_BUILD SK_PRINT("RQ_TREV") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_TREV FAILED") #ENDIF ELSE IF CREATE_PLAYER_PED_ON_FOOT(piPeds[TREV], CHAR_TREVOR, <<1982.1981, 3818.9526, 31.4232>>, 215.9222, FALSE) RETURN TRUE ENDIF ENDIF BREAK CASE RQ_STEVE IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[2]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[2], TRUE, TRUE) piPeds[STEVE] = g_sTriggerSceneAssets.ped[2] IF IS_PED_UNINJURED(piPeds[STEVE]) SET_PED_PROP_INDEX(piPeds[STEVE], ANCHOR_EYES, 0) #IF IS_DEBUG_BUILD SK_PRINT("RQ_STEVE") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_STEVE FAILED") #ENDIF ENDIF BREAK CASE RQ_ANDREAS IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[0]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[0], TRUE, TRUE) piPeds[ANDREAS] = g_sTriggerSceneAssets.ped[0] IF IS_PED_UNINJURED(piPeds[ANDREAS]) #IF IS_DEBUG_BUILD SK_PRINT("RQ_ANDREAS") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_ANDREAS FAILED") #ENDIF ENDIF BREAK CASE RQ_DAVE IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[1]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[1], TRUE, TRUE) piPeds[DAVE] = g_sTriggerSceneAssets.ped[1] IF IS_PED_UNINJURED(piPeds[DAVE]) #IF IS_DEBUG_BUILD SK_PRINT("RQ_DAVE") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_DAVE FAILED") #ENDIF ENDIF BREAK CASE RQ_DAVES_PHONE IF eStartedPlayer != CHAR_MICHAEL RETURN TRUE ENDIF IF IS_ENTITY_ALIVE(g_sTriggerSceneAssets.object[0]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.object[0], TRUE, TRUE) oiDavesPhone = g_sTriggerSceneAssets.object[0] IF IS_ENTITY_ALIVE(oiDavesPhone) #IF IS_DEBUG_BUILD SK_PRINT("RQ_DAVES_PHONE") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_DAVES_PHONE FAILED") #ENDIF ENDIF BREAK CASE RQ_MIKE_CAR // IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0]) // SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE) // viCars[MIKE_CAR] = g_sTriggerSceneAssets.veh[0] // // IF IS_VEHICLE_OK(viCars[MIKE_CAR]) // #IF IS_DEBUG_BUILD // SK_PRINT("RQ_MIKE_CAR") // #ENDIF // RETURN TRUE // ENDIF // // #IF IS_DEBUG_BUILD // SK_PRINT("RQ_MIKE_CAR FAILED") // #ENDIF // ELSE // #IF IS_DEBUG_BUILD // SK_PRINT("RQ_MIKE_CAR") // #ENDIF RETURN TRUE // ENDIF BREAK CASE RQ_FRANK_CAR IF CREATE_PLAYER_VEHICLE(viCars[FRANK_CAR], CHAR_FRANKLIN, <<1379.6998, -2056.0024, 50.9983>>, 231.3996) #IF IS_DEBUG_BUILD SK_PRINT("RQ_FRANK_CAR") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_FRANK_CAR FAILED") #ENDIF BREAK CASE RQ_TREV_CAR IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[1]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[1], TRUE, TRUE) viCars[TREV_CAR] = g_sTriggerSceneAssets.veh[1] IF IS_VEHICLE_OK(viCars[TREV_CAR]) #IF IS_DEBUG_BUILD SK_PRINT("RQ_TREV_CAR") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_TREV_CAR FAILED") #ENDIF ELSE #IF IS_DEBUG_BUILD SK_PRINT("RQ_TREV_CAR") #ENDIF RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL DO_SETUP_FOR_AGENTS() IF SETUP_STAGE_REQUIREMENTS(RQ_STEVE, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_ANDREAS, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_DAVE, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_DAVES_PHONE, vSafeVec) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL DO_SETUP_FOR_PLAYER_MIKE() IF CREATE_PLAYER_PED_ON_FOOT(piPeds[TREV], CHAR_TREVOR, <<1377.1952, -2103.5322, 53.4723>>, 215.9222, FALSE, FALSE) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL DO_SETUP_FOR_PLAYER_TREV() IF SETUP_STAGE_REQUIREMENTS(RQ_MIKE, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_MIKE_CAR, vSafeVec) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL DO_SETUP_FOR_PLAYER_FRANK() IF SETUP_STAGE_REQUIREMENTS(RQ_MIKE, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_TREV, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_MIKE_CAR, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_TREV_CAR, vSafeVec) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PICK_AND_LOAD_FOR_PLAYER() SWITCH GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) CASE CHAR_MICHAEL IF DO_SETUP_FOR_PLAYER_MIKE() RETURN TRUE ENDIF BREAK CASE CHAR_FRANKLIN IF DO_SETUP_FOR_PLAYER_FRANK() RETURN TRUE ENDIF BREAK CASE CHAR_TREVOR IF DO_SETUP_FOR_PLAYER_TREV() RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC SWITCH_PLAYER_TO_TREV() IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR SELECTOR_PED_STRUCT sSelector sSelector.pedID[SELECTOR_PED_TREVOR] = piPeds[TREV] sSelector.pedID[SELECTOR_PED_MICHAEL] = piPeds[MIKE] sSelector.pedID[SELECTOR_PED_FRANKLIN] = piPeds[FRANK] IF eStartedPlayer != CHAR_TREVOR MAKE_SELECTOR_PED_SELECTION(sSelector, SELECTOR_PED_TREVOR) IF TAKE_CONTROL_OF_SELECTOR_PED(sSelector, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS) #IF IS_DEBUG_BUILD SK_PRINT("TAKE_CONTROL_OF_SELECTOR_PED(sSelector)") #ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Used to setup a mission stage(or state if you call it that) Uses a switch statement to pick which /// set of SETUP_STAGE_REQUIREMENTS() to call. It checks to see if all the stage requirements are /// setup and then does any other setup needed. such as setting the players position or switching a /// bool to true or false etc. /// Handles setting up stuff needed after a Z or p skip first then the normal setup takes place /// PARAMS: /// eStage - The mission state/stage that needs setting up /// bJumped - Wether or not the state/stage has been jumped to using Z or P skips /// RETURNS: /// TRUE if everything required for a stage is loaded properly FUNC BOOL SETUP_MISSION_STAGE(MISSION_STATE eStage, BOOL bJumped = FALSE) SWITCH eStage CASE MS_SET_UP IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions bJumpSkip = FALSE // everything has been setup that is not key to this stage but is required to carry the mission on from this stage so reset the jump flag RC_END_Z_SKIP() ELSE IF SETUP_STAGE_REQUIREMENTS(RQ_CUTSCENE, vSafeVec) IF NOT IS_REPLAY_IN_PROGRESS() IF DO_SETUP_FOR_AGENTS() AND PICK_AND_LOAD_FOR_PLAYER() SET_MODEL_AS_NO_LONGER_NEEDED(GET_PLAYER_PED_MODEL(CHAR_TREVOR)) SET_MODEL_AS_NO_LONGER_NEEDED(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)) SET_MODEL_AS_NO_LONGER_NEEDED(GET_PLAYER_PED_MODEL(CHAR_MICHAEL)) #IF IS_DEBUG_BUILD SK_PRINT("MS_SET_UP") #ENDIF MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FBI_4_INTRO) RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF ELSE RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_SET_UP, FAILED") #ENDIF BREAK CASE MS_INTRO IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions IF SETUP_MISSION_STAGE(MS_SET_UP) bJumpSkip = FALSE // everything has been setup that is not key to this stage but is required to carry the mission on from this stage so reset the jump flag RC_END_Z_SKIP() ENDIF ELSE REQUEST_ADDITIONAL_TEXT("FBIINT", MISSION_TEXT_SLOT) IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) IF eStartedPlayer != CHAR_TREVOR REQUEST_MODEL(BODHI2) REQUEST_MODEL(BAGGER) IF HAS_MODEL_LOADED(BODHI2) AND HAS_MODEL_LOADED(BAGGER) RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF ELSE REQUEST_MODEL(BAGGER) IF HAS_MODEL_LOADED(BAGGER) RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_INTRO, FAILED") #ENDIF BREAK CASE MS_LEAVE_AREA IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR IF CREATE_PLAYER_PED_ON_FOOT(piPeds[TREV], CHAR_TREVOR, <<1377.1952, -2103.5322, 53.4723>>, 215.9222, FALSE, FALSE) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<1423.14331, -2040.78406, 45.99826>>, <<1345.54712, -2093.60181, 120.02565>>, 79.30, <<1399.7205, -2057.4124, 50.9981>>, 324.4025 , GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL piPeds[MIKE] = PLAYER_PED_ID() SWITCH_PLAYER_TO_TREV() SET_PED_POS(piPeds[MIKE], <<1391.7767, -2071.4766, 50.9982>>, 35.6553) ELSE piPeds[FRANK] = PLAYER_PED_ID() SWITCH_PLAYER_TO_TREV() WHILE NOT CREATE_PLAYER_PED_ON_FOOT(piPeds[MIKE], CHAR_MICHAEL, <<1391.7767, -2071.4766, 50.9982>>, 35.6553, FALSE, FALSE) WAIT(0) ENDWHILE ENDIF MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FBI_4_INTRO) ENDIF ELSE WHILE NOT CREATE_PLAYER_PED_ON_FOOT(piPeds[MIKE], CHAR_MICHAEL, <<1391.7767, -2071.4766, 50.9982>>, 35.6553, FALSE, FALSE) WAIT(0) ENDWHILE ENDIF IF CREATE_PLAYER_VEHICLE(viCars[TREV_CAR], CHAR_TREVOR, <<1382.499878,-2068.988037,51.967495>>, 13.785377) REQUEST_ADDITIONAL_TEXT("FBIINT", MISSION_TEXT_SLOT) IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) bJumpSkip = FALSE // everything has been setup that is not key to this stage but is required to carry the mission on from this stage so reset the jump flag END_REPLAY_SETUP(viCars[TREV_CAR]) RC_END_Z_SKIP() ENDIF ENDIF ELSE RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_LEAVE_AREA, FAILED") #ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // =========================================================================================================== // Termination // =========================================================================================================== // ----------------------------------------------------------------------------------------------------------- // Script Cleanup // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Standard delete all function used the wait for fail state /// Safe deletes all peds, props and vehicles PROC DELETE_ALL() INT i FOR i = ENUM_TO_INT(ANDREAS) TO ENUM_TO_INT(FRANK) IF piPeds[i] != PLAYER_PED_ID() #IF IS_DEBUG_BUILD SK_PRINT_INT("DELETED === ", i) #ENDIF SAFE_DELETE_PED(piPeds[i]) ENDIF ENDFOR FOR i = ENUM_TO_INT(MIKE_CAR) TO (ENUM_TO_INT(NUM_CARS)-1) #IF IS_DEBUG_BUILD SK_PRINT_INT("DELETED VEHICLE === ", i) #ENDIF IF ENUM_TO_INT(TREV_CAR) <> i SAFE_DELETE_VEHICLE(viCars[i]) ELSE SAFE_RELEASE_VEHICLE(viCars[i]) ENDIF ENDFOR ENDPROC PROC RELEASE_ALL() INT i FOR i = ENUM_TO_INT(ANDREAS) TO ENUM_TO_INT(FRANK) IF piPeds[i] != PLAYER_PED_ID() #IF IS_DEBUG_BUILD SK_PRINT_INT("RELEASED === ", i) #ENDIF SAFE_RELEASE_PED(piPeds[i]) ENDIF ENDFOR FOR i = ENUM_TO_INT(MIKE_CAR) TO (ENUM_TO_INT(NUM_CARS)-1) #IF IS_DEBUG_BUILD SK_PRINT_INT("RELEASED VEHICLE === ", i) #ENDIF SAFE_RELEASE_VEHICLE(viCars[i]) ENDFOR ENDPROC /// PURPOSE: /// Deletes all mission entities and any other clean up /// This is used to clear the mission when P or Z skipping PROC CLEANUP(BOOL bDelAll = TRUE) IF bDelAll #IF IS_DEBUG_BUILD SK_PRINT("CLEANUP = DEL ALL") #ENDIF ELSE #IF IS_DEBUG_BUILD SK_PRINT("CLEANUP = RELEASE ") #ENDIF ENDIF KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CLEAR_PRINTS() WAIT_FOR_CUTSCENE_TO_STOP() SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) IF bDelAll DELETE_ALL() ELSE RELEASE_ALL() ENDIF IF DOES_CAM_EXIST(camMain) RENDER_SCRIPT_CAMS(FALSE,FALSE) DESTROY_CAM(camMain) ENDIF ENDPROC /// PURPOSE: /// Cleans up mission entities, releases the entity to be cleaned up by population /// and will give a suitable task to the peds before clean up PROC Script_Cleanup() SERVICES_TOGGLE(TRUE) SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(TRUE) SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), FALSE) CLEANUP(FALSE) TERMINATE_THIS_THREAD() ENDPROC //*************************************** // :MISSION FLOW FUNC: //*************************************** //PURPOSE: Advances or reverses the mission stage PROC NEXT_STAGE( BOOL bReverse = FALSE) iMissionState = ENUM_TO_INT(eMissionState) IF NOT bReverse eMissionState = INT_TO_ENUM(MISSION_STATE, (iMissionState + 1)) ELSE IF iMissionState > 0 eMissionState = INT_TO_ENUM(MISSION_STATE, (iMissionState - 1)) ENDIF ENDIF eState = SS_INIT ENDPROC // ----------------------------------------------------------------------------------------------------------- // Script Pass // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Pass function calls cleanup and termination /// if the player debug passes this function warps him to the end /// of the chasem, it will then complete PROC Script_Passed(BOOL paramSeamlessMissionPass = FALSE, BOOL paramHidePassScreen = FALSE) CLEAR_PRINTS() KILL_ANY_CONVERSATION() Mission_Flow_Mission_Passed(paramSeamlessMissionPass, paramHidePassScreen) Script_Cleanup() ENDPROC // ----------------------------------------------------------------------------------------------------------- // Script Fail // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Waits for the screen to fade out then updates failed reason PROC FAILED_WAIT_FOR_FADE() SWITCH eState CASE SS_INIT CLEAR_PRINTS() CLEAR_HELP() #IF IS_DEBUG_BUILD SK_PRINT("Init fail") #ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(sFailReason) MISSION_FLOW_MISSION_FAILED_WITH_REASON(sFailReason) ELSE MISSION_FLOW_MISSION_FAILED() ENDIF eState = SS_ACTIVE BREAK CASE SS_ACTIVE 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) // #IF IS_DEBUG_BUILD SK_PRINT("Failed") #ENDIF DELETE_ALL() Script_Cleanup() ELSE #IF IS_DEBUG_BUILD SK_PRINT("waiting fail screen") #ENDIF // not finished fading out // you may want to handle dialogue etc here. ENDIF BREAK ENDSWITCH ENDPROC //------------------------------------------------------------------------------------ // MISSION STATES //------------------------------------------------------------------------------------ /// PURPOSE: /// Jumps the mission to a specific stage /// PARAMS: /// stage - The state to jump to PROC JUMP_TO_STAGE(MISSION_STATE stage) RC_START_Z_SKIP() bJumpSkip = TRUE //Tells the mission stage setup function that we have just jumped and special setup is required eMissionState = stage IF eMissionState = MS_SET_UP #IF IS_DEBUG_BUILD SK_PRINT("eMission state = MSS_SETUP GOING TO INTRO ") #ENDIF eMissionState = MS_SET_UP ENDIF // bLoadingFinCutscene = FALSE eState = SS_INIT CLEANUP() //delete everything ENDPROC ///PURPOSE: /// Initiate the mission and load the things needed /// for the immediate gameplay /// The skip menu is initialsed here /// And if a replay is being done then we init and load assests for the check point PROC INITMISSION() SWITCH eState CASE SS_INIT //DO_SCREEN_FADE_OUT(0) // #IF IS_DEBUG_BUILD // SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE (TRUE) // #ENDIF #IF IS_DEBUG_BUILD SK_PRINT("INIT MISSION - THIS WILL LOOP") #ENDIF IF SETUP_MISSION_STAGE(eMissionState) #IF IS_DEBUG_BUILD s_skip_menu[0].sTxtLabel = "MS_INTRO" #ENDIF IF IS_VEHICLE_OK(viCars[TREV_CAR]) SET_VEHICLE_DOORS_LOCKED(viCars[TREV_CAR], VEHICLELOCK_UNLOCKED) ENDIF SERVICES_TOGGLE(FALSE) IF IS_REPLAY_IN_PROGRESS() JUMP_TO_STAGE(MS_LEAVE_AREA) ELSE IF IS_REPEAT_PLAY_ACTIVE() SAFE_FADE_SCREEN_IN_FROM_BLACK() ENDIF eState = SS_CLEANUP ENDIF ENDIF BREAK CASE SS_CLEANUP #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP INIT MISSION") #ENDIF NEXT_STAGE() BREAK ENDSWITCH ENDPROC PROC REG_PEDS_FOR_SCENE() IF IS_PED_UNINJURED(piPeds[ANDREAS]) AND IS_PED_UNINJURED(piPeds[DAVE]) AND IS_PED_UNINJURED(piPeds[STEVE]) REGISTER_ENTITY_FOR_CUTSCENE(piPeds[ANDREAS], "Andreas_Sanchez", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) REGISTER_ENTITY_FOR_CUTSCENE(piPeds[DAVE], "Dave_FBI", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) REGISTER_ENTITY_FOR_CUTSCENE(piPeds[STEVE], "steve_FBI", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) IF IS_ENTITY_ALIVE(oiDavesPhone) REGISTER_ENTITY_FOR_CUTSCENE(oiDavesPhone, "DaveNortons_Phone", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF ENDIF SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_MICHAEL piPeds[MIKE] = PLAYER_PED_ID() REGISTER_ENTITY_FOR_CUTSCENE(piPeds[FRANK], "Franklin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)) IF IS_PED_UNINJURED(piPeds[TREV]) REGISTER_ENTITY_FOR_CUTSCENE(piPeds[TREV], "trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR)) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(viCars[TREV_CAR], "trevors_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, BODHI2, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT) BREAK CASE CHAR_FRANKLIN IF IS_PED_UNINJURED(piPeds[MIKE]) AND IS_PED_UNINJURED(piPeds[TREV]) AND IS_VEHICLE_OK(viCars[TREV_CAR]) REGISTER_ENTITY_FOR_CUTSCENE(piPeds[MIKE], "michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) REGISTER_ENTITY_FOR_CUTSCENE(piPeds[TREV], "trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) piPeds[FRANK] = PLAYER_PED_ID() // IF NOT IS_ENTITY_A_MISSION_ENTITY(piPeds[FRANK]) // SET_ENTITY_AS_MISSION_ENTITY(piPeds[FRANK], TRUE, TRUE) // ENDIF REGISTER_ENTITY_FOR_CUTSCENE(viCars[TREV_CAR], "trevors_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, BODHI2, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT) ENDIF BREAK CASE CHAR_TREVOR IF IS_PED_UNINJURED(piPeds[MIKE]) REGISTER_ENTITY_FOR_CUTSCENE(piPeds[MIKE], "michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_MICHAEL)) REGISTER_ENTITY_FOR_CUTSCENE(piPeds[FRANK], "Franklin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)) IF IS_VEHICLE_OK(GET_PLAYERS_LAST_VEHICLE()) enumCharacterList playercar playercar = GET_PLAYER_PED_PERSONAL_VEHICLE_BELONGS_TO(GET_PLAYERS_LAST_VEHICLE()) IF playercar = CHAR_TREVOR viCars[TREV_CAR]= GET_PLAYERS_LAST_VEHICLE() #IF IS_DEBUG_BUILD SK_PRINT("Vehicle is owned by TREV") #ENDIF SET_ENTITY_AS_MISSION_ENTITY(viCars[TREV_CAR], TRUE, TRUE) REGISTER_ENTITY_FOR_CUTSCENE(viCars[TREV_CAR], "trevors_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, BODHI2, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT) ELSE REGISTER_ENTITY_FOR_CUTSCENE(viCars[TREV_CAR], "trevors_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, BODHI2, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT) ENDIF ELSE REGISTER_ENTITY_FOR_CUTSCENE(viCars[TREV_CAR], "trevors_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, BODHI2, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT) ENDIF ENDIF BREAK ENDSWITCH ENDPROC PROC MARK_START_CAR_AS_VEH_GEN(VECTOR pos, FLOAT dir) VEHICLE_INDEX veh = GET_PLAYERS_LAST_VEHICLE() IF DOES_ENTITY_EXIST(veh) IF IS_VEHICLE_DRIVEABLE(veh) CPRINTLN(DEBUG_MISSION, "Setting snapshop vehicle as vehicle get for prep ", GET_THIS_SCRIPT_NAME()) SET_MISSION_VEHICLE_GEN_VEHICLE(veh, pos, dir) ELSE CPRINTLN(DEBUG_MISSION, " vehicle not drivable ", GET_THIS_SCRIPT_NAME()) ENDIF ELSE CPRINTLN(DEBUG_MISSION, "vehicle doesnt exist ", GET_THIS_SCRIPT_NAME()) ENDIF ENDPROC /// PURPOSE: /// State for the mocap at the safe PROC MOCAP_INTRO() INT iCutTime = GET_CUTSCENE_TIME() IF eState = SS_ACTIVE IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() AND bLoadingFinCutscene AND NOT bJumpSkip AND iCutTime < 157323 #IF IS_DEBUG_BUILD SK_PRINT_INT("Player skiped cutscene at time = ", iCutTime) #ENDIF // eState = SS_SKIPPED ELSE IF GET_CUTSCENE_TIME() > 157323 SET_CUTSCENE_CAN_BE_SKIPPED(FALSE) #IF IS_DEBUG_BUILD SK_PRINT_INT("cutscene at time = ", iCutTime) #ENDIF ENDIF ENDIF ENDIF //Load everything for the next stage while the cutscene is playing IF NOT bLoadingFinCutscene IF SETUP_MISSION_STAGE(MS_INTRO, bJumpSkip) bLoadingFinCutscene = TRUE //loading done ENDIF ENDIF SWITCH eState CASE SS_INIT CLEAR_PRINTS() IF CAN_PLAYER_START_CUTSCENE(TRUE) #IF IS_DEBUG_BUILD SK_PRINT("CAN_PLAYER_START_CUTSCENE(TRUE)") #ENDIF IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF IS_PED_UNINJURED(piPeds[STEVE]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("steve_FBI", piPeds[STEVE]) SET_CUTSCENE_PED_PROP_VARIATION("steve_FBI", ANCHOR_EYES, 0) ENDIF IF IS_PED_UNINJURED(piPeds[FRANK]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", piPeds[FRANK]) ENDIF IF IS_PED_UNINJURED(piPeds[TREV]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("trevor", piPeds[TREV]) ENDIF IF IS_PED_UNINJURED(piPeds[MIKE]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("michael", piPeds[MIKE]) ENDIF ENDIF IF RC_IS_CUTSCENE_OK_TO_START() #IF IS_DEBUG_BUILD SK_PRINT("RC_IS_CUTSCENE_OK_TO_START()") #ENDIF REG_PEDS_FOR_SCENE() START_CUTSCENE(CUTSCENE_PLAYER_FP_FLASH_TREVOR) SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(GET_PLAYER_VEH_MODEL(CHAR_TREVOR)) IF IS_VEHICLE_OK(viCars[TREV_CAR]) SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(viCars[TREV_CAR]) ENDIF WAIT(0) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.5) SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) VECTOR vRespotVeh, vLargeRespotVeh FLOAT fRespotVeh, fLargeRespotVeh vLargeRespotVeh = <<1368.7412, -2068.1438, 51.0552>> fLargeRespotVeh = 163.6238 SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_MICHAEL IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) vRespotVeh = <<1388.0695, -2057.9080, 50.9983>> fRespotVeh = 263.5418 RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<1423.14331, -2040.78406, 45.99826>>, <<1345.54712, -2093.60181, 120.02565>>, 79.30, vRespotVeh, fRespotVeh , GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) MARK_START_CAR_AS_VEH_GEN(vRespotVeh, fRespotVeh) ELSE RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<1423.14331, -2040.78406, 45.99826>>, <<1345.54712, -2093.60181, 120.02565>>, 79.30, vLargeRespotVeh, fLargeRespotVeh) MARK_START_CAR_AS_VEH_GEN(vLargeRespotVeh, fLargeRespotVeh) ENDIF viCars[MIKE_CAR] = GET_PLAYERS_LAST_VEHICLE() IF IS_VEHICLE_OK(viCars[MIKE_CAR]) SET_ENTITY_AS_MISSION_ENTITY(viCars[MIKE_CAR]) ENDIF BREAK CASE CHAR_FRANKLIN IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) vRespotVeh = <<1379.6998, -2056.0024, 50.9983>> fRespotVeh = 231.3996 RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<1423.14331, -2040.78406, 45.99826>>, <<1345.54712, -2093.60181, 120.02565>>, 79.30, vRespotVeh, fRespotVeh , GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) // MARK_START_CAR_AS_VEH_GEN(vRespotVeh, fRespotVeh) ELSE RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<1423.14331, -2040.78406, 45.99826>>, <<1345.54712, -2093.60181, 120.02565>>, 79.30, vLargeRespotVeh, fLargeRespotVeh) // MARK_START_CAR_AS_VEH_GEN(vLargeRespotVeh, fLargeRespotVeh) ENDIF viCars[FRANK_CAR] = GET_PLAYERS_LAST_VEHICLE() IF IS_VEHICLE_OK(viCars[FRANK_CAR]) SET_ENTITY_AS_MISSION_ENTITY(viCars[FRANK_CAR]) ENDIF BREAK CASE CHAR_TREVOR IF NOT IS_VEHICLE_OK(viCars[TREV_CAR]) IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) vRespotVeh = <<1382.499878,-2068.988037,51.967495>> fRespotVeh = 13.785377 RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<1423.14331, -2040.78406, 45.99826>>, <<1345.54712, -2093.60181, 120.02565>>, 79.30, vLargeRespotVeh, fLargeRespotVeh , GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) // MARK_START_CAR_AS_VEH_GEN(vRespotVeh, fRespotVeh) ELSE RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<1423.14331, -2040.78406, 45.99826>>, <<1345.54712, -2093.60181, 120.02565>>, 79.30, vLargeRespotVeh, fLargeRespotVeh) // MARK_START_CAR_AS_VEH_GEN(vLargeRespotVeh, fLargeRespotVeh) ENDIF // viCars[TREV_CAR] = GET_PLAYERS_LAST_VEHICLE() // IF IS_VEHICLE_OK(viCars[TREV_CAR]) // SET_ENTITY_AS_MISSION_ENTITY(viCars[TREV_CAR]) // ENDIF ENDIF BREAK ENDSWITCH RC_START_CUTSCENE_MODE(<<-1046.6174, -516.3990, 35.0386>>) SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) #IF IS_DEBUG_BUILD SK_PRINT("INIT MOCAP_INTRO") #ENDIF eState = SS_ACTIVE ENDIF ENDIF BREAK CASE SS_ACTIVE SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0) SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.1) IF eStartedPlayer != CHAR_FRANKLIN IF NOT bRegisteredFrank IF NOT IS_PED_UNINJURED(piPeds[FRANK]) IF DOES_CUTSCENE_ENTITY_EXIST("Franklin") IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")) #IF IS_DEBUG_BUILD SK_PRINT("GET_CUTSCENE_SECTION_PLAYING REGISTERED FRANK") #ENDIF piPeds[FRANK] = GET_PED_INDEX_FROM_ENTITY_INDEX( GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")) ENDIF ENDIF ENDIF IF GET_CUTSCENE_SECTION_PLAYING() = 4 bRegisteredFrank = SETUP_STAGE_REQUIREMENTS(RQ_FRANK_CAR, vSafeVec) ENDIF ENDIF ENDIF IF IS_PED_UNINJURED(piPeds[TREV]) SWITCH_PLAYER_TO_TREV() ENDIF IF NOT IS_VEHICLE_OK(viCars[TREV_CAR]) IF NOT bRegisteredTrev IF DOES_CUTSCENE_ENTITY_EXIST("trevors_car") IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("trevors_car")) viCars[TREV_CAR] = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX( GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("trevors_car")) SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(viCars[TREV_CAR]) #IF IS_DEBUG_BUILD SK_PRINT("GET_CUTSCENE_SECTION_PLAYING REGISTERED TREV") #ENDIF bRegisteredTrev = TRUE ENDIF ENDIF ENDIF ELSE IF NOT bRegisteredTrev IF IS_VEHICLE_OK(viCars[TREV_CAR]) bRegisteredTrev = TRUE SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(viCars[TREV_CAR]) ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Andreas_Sanchez") #IF IS_DEBUG_BUILD SK_PRINT("ANDREAS' EXIT STATE") #ENDIF SAFE_DELETE_PED(piPeds[ANDREAS]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Dave_FBI") #IF IS_DEBUG_BUILD SK_PRINT("DAVEs EXIT STATE") #ENDIF SAFE_DELETE_PED(piPeds[DAVE]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("steve_FBI") #IF IS_DEBUG_BUILD SK_PRINT("STEVEs EXIT STATE") #ENDIF SAFE_DELETE_PED(piPeds[STEVE]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("DaveNortons_Phone") #IF IS_DEBUG_BUILD SK_PRINT("DaveNortons_Phone EXIT STATE") #ENDIF SAFE_DELETE_OBJECT(oiDavesPhone) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") #IF IS_DEBUG_BUILD SK_PRINT("Michael's EXIT STATE") #ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") #IF IS_DEBUG_BUILD SK_PRINT("Trevor's EXIT STATE") #ENDIF IF IS_VEHICLE_OK(viCars[TREV_CAR]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), viCars[TREV_CAR]) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) SET_VEHICLE_DOOR_SHUT(viCars[TREV_CAR], SC_DOOR_FRONT_LEFT) ENDIF // SAFE_DELETE_VEHICLE(viCars[TREV_CAR]) // DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_TREVOR) // SAFE_DELETE_PED(piPeds[TREV]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") #IF IS_DEBUG_BUILD SK_PRINT("Franklin's EXIT STATE") #ENDIF IF NOT bRegisteredFrank IF DOES_CUTSCENE_ENTITY_EXIST("Franklin") IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")) #IF IS_DEBUG_BUILD SK_PRINT("GET_CUTSCENE_SECTION_PLAYING REGISTERED FRANK") #ENDIF piPeds[FRANK] = GET_PED_INDEX_FROM_ENTITY_INDEX( GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")) ENDIF ENDIF ENDIF SAFE_DELETE_PED(piPeds[FRANK]) ENDIF IF iCutTime >= 166500 SAFE_DELETE_VEHICLE(viCars[FRANK_CAR]) DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_FRANKLIN) ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() #IF IS_DEBUG_BUILD SK_PRINT("CAMERA's EXIT STATE") #ENDIF IF eStartedPlayer != CHAR_TREVOR PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS") ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE) ENDIF // SET_GAMEPLAY_CAM_RELATIVE_HEADING(-40.8422) // SET_GAMEPLAY_CAM_RELATIVE_PITCH(-2.8838) ENDIF IF NOT IS_CUTSCENE_PLAYING() AND bLoadingFinCutscene SET_CUTSCENE_CAN_BE_SKIPPED(TRUE) eState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP STOP_GAMEPLAY_HINT() IF iMissionTimer = -1 iMissionTimer = GET_GAME_TIMER() ELIF ( GET_GAME_TIMER() - iMissionTimer) > 1000 bLoadingFinCutscene = FALSE RC_END_CUTSCENE_MODE() #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP MOCAP_INTRO") #ENDIF NEXT_STAGE() ENDIF BREAK CASE SS_SKIPPED #IF IS_DEBUG_BUILD SK_PRINT("SKIPPED") #ENDIF IF IS_CUTSCENE_PLAYING() IF NOT bRegisteredTrev IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("trevors_car") IF DOES_CUTSCENE_ENTITY_EXIST("trevors_car") IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("trevors_car")) #IF IS_DEBUG_BUILD SK_PRINT("GET_CUTSCENE_SECTION_PLAYING REGISTERED TREV") #ENDIF viCars[TREV_CAR] = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX( GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("trevors_car")) ENDIF ENDIF ENDIF ENDIF IF NOT bRegisteredFrank IF DOES_CUTSCENE_ENTITY_EXIST("Franklin") IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")) #IF IS_DEBUG_BUILD SK_PRINT("GET_CUTSCENE_SECTION_PLAYING REGISTERED FRANK") #ENDIF piPeds[FRANK] = GET_PED_INDEX_FROM_ENTITY_INDEX( GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")) bRegisteredFrank = TRUE ENDIF ENDIF ENDIF ELSE SAFE_DELETE_VEHICLE(viCars[FRANK_CAR]) DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_FRANKLIN) IF bRegisteredFrank SAFE_DELETE_PED(piPeds[FRANK]) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING(-27.6467) SET_GAMEPLAY_CAM_RELATIVE_PITCH(-5.1166) eState = SS_CLEANUP ENDIF BREAK ENDSWITCH ENDPROC FUNC BOOL HAS_PLAYER_BUMPED_MIKE() IF IS_ENTITY_TOUCHING_ENTITY(piPeds[MIKE], PLAYER_PED_ID()) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC START_NEW_SCENARIO(STRING rio, MIKE_STATES state) CLEAR_PED_TASKS(piPeds[MIKE]) IF NOT IS_STRING_NULL_OR_EMPTY(rio) TASK_START_SCENARIO_IN_PLACE(piPeds[MIKE], rio, 1000, TRUE) ENDIF eMikeState = state iMikeTimer = -1 ENDPROC PROC WAIT_TO_UPDATE(INT iStateTime, STRING rio, MIKE_STATES state) IF iMikeTimer != -1 IF (GET_GAME_TIMER() - iMikeTimer) > iStateTime START_NEW_SCENARIO(rio, state) ENDIF ELSE iMikeTimer = GET_GAME_TIMER() ENDIF ENDPROC PROC MIKE_STATE() IF iDialogueTimer = -1 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iDialogueTimer = GET_GAME_TIMER() ENDIF ELSE IF (GET_GAME_TIMER() - iDialogueTimer) > 12000 IF CREATE_CONVERSATION(s_conversation_peds, "FBIPRAU", "FBI4_INT_M", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES) iDialogueTimer = -1 ENDIF ENDIF ENDIF SWITCH eMikeState CASE MSS_WAIT_SMOKE WAIT_TO_UPDATE(2000, "WORLD_HUMAN_SMOKING", MSS_SMOKE) BREAK CASE MSS_SMOKE WAIT_TO_UPDATE(40000, "", MSS_WAIT_PHONE) BREAK CASE MSS_WAIT_PHONE WAIT_TO_UPDATE(6000, "WORLD_HUMAN_STAND_MOBILE", MSS_PHONE) BREAK CASE MSS_PHONE WAIT_TO_UPDATE(40000, "", MSS_IDLE) BREAK CASE MSS_IDLE WAIT_TO_UPDATE(6000, "WORLD_HUMAN_STAND_IMPATIENT", MSS_WAIT_SMOKE) BREAK ENDSWITCH ENDPROC PROC LEAVE_AREA() SWITCH eState CASE SS_INIT IF SETUP_MISSION_STAGE(eMissionState, bJumpSkip) #IF IS_DEBUG_BUILD SK_PRINT("INIT LEAVE_AREA") #ENDIF iMissionTimer = GET_GAME_TIMER() IF IS_PED_UNINJURED(piPeds[MIKE]) ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, piPeds[MIKE], "MICHAEL") START_NEW_SCENARIO("WORLD_HUMAN_SMOKING", MSS_SMOKE) SET_PED_PRIMARY_LOOKAT(piPeds[MIKE], PLAYER_PED_ID()) ENDIF eState = SS_ACTIVE ENDIF BREAK CASE SS_ACTIVE IF IS_PED_UNINJURED(piPeds[MIKE]) MIKE_STATE() IF HAS_PLAYER_BUMPED_MIKE() IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(piPeds[MIKE]) TASK_SMART_FLEE_PED(piPeds[MIKE], PLAYER_PED_ID(), 500, -1) SET_PED_KEEP_TASK(piPeds[MIKE], TRUE) MISSION_FAILED(FR_MIKE_THREATENED) EXIT ENDIF ENDIF IF IS_BULLET_IN_AREA(<<1393.96460, -2070.81079, 50.99826>>, 18.48) OR IS_PROJECTILE_IN_AREA(<<1402.48901, -2056.89648, 50.0>>, <<1389.38367, -2082.86694, 61>>) OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piPeds[MIKE], PLAYER_PED_ID()) SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(piPeds[MIKE]) TASK_SMART_FLEE_PED(piPeds[MIKE], PLAYER_PED_ID(), 500, -1) SET_PED_KEEP_TASK(piPeds[MIKE], TRUE) MISSION_FAILED(FR_MIKE_THREATENED) EXIT ENDIF ENDIF IF NOT IS_THIS_PRINT_BEING_DISPLAYED("INT_LEAVE") PRINT_NOW("INT_LEAVE", 60000, 0) ENDIF IF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), <<1392.9344, -2072.4121, 50.9982>>, 180) eState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP LEAVE_AREA") #ENDIF Script_Passed() BREAK CASE SS_SKIPPED RC_END_Z_SKIP() eState = SS_CLEANUP BREAK ENDSWITCH ENDPROC ///DEBUG KEYS #IF IS_DEBUG_BUILD /// PURPOSE: Check for Forced Pass or Fail PROC DEBUG_Check_Debug_Keys() // Check for Pass IF eState = SS_ACTIVE IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) KILL_ANY_CONVERSATION() CLEAR_PRINTS() WAIT_FOR_CUTSCENE_TO_STOP() Script_Passed() ENDIF // Check for Fail IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) KILL_ANY_CONVERSATION() CLEAR_PRINTS() WAIT_FOR_CUTSCENE_TO_STOP() MISSION_FAILED(FR_NONE) ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) KILL_ANY_CONVERSATION() CLEAR_PRINTS() WAIT_FOR_CUTSCENE_TO_STOP() RC_START_Z_SKIP() eState = SS_SKIPPED ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) AND eMissionState <> MS_SET_UP //Work out which stage we want to reach based on the current stage iMissionState = ENUM_TO_INT(eMissionState) IF iMissionState > 0 MISSION_STATE e_stage = INT_TO_ENUM(MISSION_STATE, iMissionState - 1) JUMP_TO_STAGE(e_stage) ENDIF ENDIF IF LAUNCH_MISSION_STAGE_MENU(s_skip_menu, i_debug_jump_stage) #IF IS_DEBUG_BUILD SK_PRINT_INT("Z DEBUG Initial pick = ", i_debug_jump_stage) #ENDIF // IF i_debug_jump_stage >= 3 // SWITCH i_debug_jump_stage // CASE 3 //MS_RETURN_TO_STUDIO // i_debug_jump_stage = 4 // BREAK // // CASE 4 //MS_OUTRO // i_debug_jump_stage = 5 // BREAK // // ENDSWITCH // ELSE i_debug_jump_stage++ // ENDIF SK_PRINT_INT("Z DEBUG ACTUAL STATE = ", i_debug_jump_stage) MISSION_STATE e_stage = INT_TO_ENUM(MISSION_STATE, i_debug_jump_stage) JUMP_TO_STAGE(e_stage) ENDIF ENDIF ENDPROC #ENDIF PROC CHECK_MIKE_ALIVE() IF NOT IS_PED_UNINJURED(piPeds[MIKE]) MISSION_FAILED(FR_MIKE_KILLED) ENDIF ENDPROC /// PURPOSE: /// Holds functions that moniter for the player failing PROC CHECK_FOR_FAIL() IF NOT bJumpSkip AND eMissionState <> MS_FAILED IF eMissionState > MS_INTRO CHECK_MIKE_ALIVE() ENDIF ENDIF ENDPROC SCRIPT 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)) IF GET_CAUSE_OF_MOST_RECENT_FORCE_CLEANUP() != FORCE_CLEANUP_FLAG_PLAYER_KILLED_OR_ARRESTED PRINTSTRING("FORCE CLEAN UP") PRINTNL() sFailReason = NULL Mission_Flow_Mission_Force_Cleanup() Script_Cleanup() ELSE IF eMissionState != MS_FAILED PRINTSTRING("Silent pass mission player was killed or was arrested") PRINTNL() Script_Passed(TRUE, TRUE) ELSE PRINTSTRING("FORCE CLEAN UP") PRINTNL() sFailReason = NULL Mission_Flow_Mission_Force_Cleanup() Script_Cleanup() ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD SETUP_FOR_RAGE_WIDGETS() #ENDIF eStartedPlayer = GET_CURRENT_PLAYER_PED_ENUM() IF IS_REPLAY_IN_PROGRESS() START_REPLAY_SETUP(<<1377.1952, -2103.5322, 53.4723>>, 215.9222) ENDIF // Loop within here until the mission passes or fails WHILE(TRUE) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BPINT") IF IS_PED_UNINJURED(PLAYER_PED_ID()) CHECK_FOR_FAIL() SWITCH eMissionState CASE MS_SET_UP INITMISSION() BREAK CASE MS_INTRO MOCAP_INTRO() BREAK CASE MS_LEAVE_AREA LEAVE_AREA() BREAK CASE MS_FAILED FAILED_WAIT_FOR_FADE() BREAK ENDSWITCH IF eMissionState <> MS_FAILED #IF IS_DEBUG_BUILD // Check debug completion/failure DEBUG_Check_Debug_Keys() UPDATE_RAG_WIDGETS() #ENDIF ENDIF ENDIF WAIT(0) ENDWHILE // Script should never reach here. Always terminate with cleanup function. ENDSCRIPT