//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_audio.sch" USING "commands_camera.sch" USING "commands_pad.sch" USING "commands_vehicle.sch" USING "commands_path.sch" USING "commands_ped.sch" USING "commands_physics.sch" USING "commands_script.sch" USING "commands_task.sch" USING "CompletionPercentage_public.sch" using "dialogue_public.sch" USING "flow_public_core_override.sch" USING "flow_public_GAME.sch" using "ped_component_public.sch" USING "player_ped_public.sch" USING "replay_public.sch" USING "script_blips.sch" USING "script_heist.sch" USING "script_ped.sch" USING "selector_public.sch" USING "flow_special_event_checks.sch" USING "RC_Area_public.sch" USING "RC_helper_functions.sch" USING "RC_threat_public.sch" USING "taxi_functions.sch" USING "chase_hint_cam.sch" USING "commands_recording.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" USING "shared_debug.sch" CONST_INT MAX_SKIP_MENU_LENGTH 6 INT i_debug_jump_stage MissionStageMenuTextStruct s_skip_menu[MAX_SKIP_MENU_LENGTH] #ENDIF // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Template.sc // AUTHOR : Ste Kerrigan // DESCRIPTION : // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** //---------------------- // CHECKPOINTS //---------------------- CONST_INT CP_KILLEDROCO 1 //following beverly down the road //----------------------- // CONSTANTS //----------------------- //POLY TEST CONST CONST_INT MAX_POLY_TEST_VERTS 8 //poly test //Ambient encounter speech CONST_INT MAX_AMBIENT_CONV_LINES 8 /// -------------------------------------------------- /// ENUMS /// ------------------------------------------- /// PURPOSE: Mission states ENUM MISSION_STATE MS_SET_UP = 0, //0 MS_INTRO, //1 MS_CHASE, //2 MS_LEAVE_AREA, //3 MS_PHONE_CALL, //4 MS_RETURN_TO_STUDIO, //5 MS_OUTRO, //6 MS_FAILED //7 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_INTRO, RQ_ROCO, RQ_GUN_MAN, RQ_SOLOMON, RQ_PLAYER_CAR, RQ_WAYPOINT, RQ_CAR_ROCO, RQ_INJURED_CLIP ENDENUM /// PURPOSE: Fail reason enums for picking correct fail reason ENUM FAILED_REASONS FR_NONE, FR_ROCO_ESCAPED, FR_SOLOMON_KILLED ENDENUM ENUM ABM_CONV_STATES ACS_START_LINE, ACS_WAIT_LINE_FIN, ACS_PICK_NEXT_LINE, ACS_FIN ENDENUM ENUM ROCO_STATES RS_NULL, RS_BURNOUT, RS_BURNOUT_GOTO, RS_GO_TO_GATE, RS_FLEE_IN_CAR, RS_FLEE_ON_FOOT, RS_FIGHT, RS_DRIVING_DOWN_PEIR ENDENUM ENUM GUNMAN_STATES GS_NULL, GS_PERFORMING_DRIVEBY, GS_WAITING, GS_COMBAT_ONFOOT ENDENUM ENUM COP_MONITOR CM_MONITER, CM_INIT_WANTED, CM_LOSING_WANTED ENDENUM ENUM CAMERA_CUT CC_INIT, CC_START, CC_WAIT, CC_END ENDENUM ///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 COP_MONITOR eCopMonitor = CM_MONITER ROCO_STATES eRocoState = RS_NULL GUNMAN_STATES eGunmanState = GS_NULL CAMERA_CUT eCamCut = CC_INIT //***************************************************************************** // :STRUCTS: //***************************************************************************** /// PURPOSE: Holds data used to create a ped /// Contains ped specific variables for the /// perception system STRUCT MYPED PED_INDEX id VECTOR vPos FLOAT fDir MODEL_NAMES Mod = DUMMY_MODEL_FOR_SCRIPT BLIP_INDEX blip ENDSTRUCT /// PURPOSE: Holds data for creating a /// vehicle in an encounter STRUCT MYVEHICLE VEHICLE_INDEX id VECTOR vPos FLOAT fDir MODEL_NAMES Mod = DUMMY_MODEL_FOR_SCRIPT ENDSTRUCT /// PURPOSE: holds data for createing an /// object in an encounter STRUCT MYOBJECT OBJECT_INDEX id VECTOR vPos VECTOR vRot MODEL_NAMES Mod = DUMMY_MODEL_FOR_SCRIPT ENDSTRUCT STRUCT AMBIENT_DIALOGUE_LINE STRING sConvLine PED_INDEX ped STRING sVoice INT iStartTime = 0 INT iLineTime = 0 BOOL bDone = FALSE ENDSTRUCT STRUCT AMBIENT_DIALOGUE_CONV AMBIENT_DIALOGUE_LINE mConvLine[MAX_AMBIENT_CONV_LINES] INT iIndex = 0 ABM_CONV_STATES eAmbConv = ACS_START_LINE BOOL bIsRandom = FALSE //Doesnt do anything yet ENDSTRUCT /// PURPOSE: Holds a string and a int /// String is used to play a conversation /// the int is used to expire a bit in a bit field /// STRUCT DIALOGUE_HOLDER STRING sConv INT iExpireBit ENDSTRUCT TEST_POLY mAreaCheck1 //Poly area 1 TEST_POLY mAreaCheck2 //Poly area 2 //**************************************************************************************************** // : 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 //GOD TEXT STRING sGodText = "SOL2" BOOL bObjectiveShown = FALSE //Has an objective been shown //BLIPs BLIP_INDEX biBlip //Mission blip - mainly used for go to objectives //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 VECTOR vDropOffLoc = <<-1011.5279, -480.0313, 38.9757>> VECTOR vDropOffGPSLoc = << -1016.13, -481.69, 38.9757 >> VECTOR vPositionToLeave = vSafeVec BOOL bStartedDriveBys = FALSE INT iMissionTimer = -1 INT iCutsceneDelay = -1 ///MISSION PED VARS SCRIPT AI BOOL bFailConvSet = FALSE BOOL bTriggeredReplayRecord = FALSE BOOL bRoccoBlipedInVehicle = FALSE BOOL bVehStatsGrabbed //PD - adding this to monitor damage and speed watch on latest player's car BOOL bPlayerStatsGrabbed //PD - adding this so I can throw the player damage wtch into the main body BOOL bIsCustomGPSRouteActive = FALSE // needed to make gps route go inside Studio for return stage BOOL bRocoSpeadUp = FALSE BOOL bCleanedupSolomon = FALSE BOOL bCleanedupPlayerCar = FALSE INT iSolomonChatDelay = -1 INT iDelayCall = -1 INT iDelayChaseSpeech = -1 INT iReplayStage = 0 ///==============| GOD TEXT BOOLS |============ ///===============| models |=================== /// ===============| START VECTORS |============== /// ==============| START HEADINGS |=============== /// ==============| PED INDICES |================ MYPED mRocco MYPED mGunMan MYVEHICLE mCarRoco MYVEHICLE mPlayerCar PED_INDEX piSolomon /// ==============| OBJECT OBJECT_INDEX oiCone SCENARIO_BLOCKING_INDEX sbiMovieSetScenarioBlocker /// ==============| VEHICLE INDICES |=========== /// ===============| GROUPS |======================== REL_GROUP_HASH HASH_SOLOMON //Relationship /// ===============| DIALOGUE |====================== STRING sTextBlock = "SOL2AUD" //The Dialogue block for the mission structPedsForConversation s_conversation_peds //conversation struct CHASE_HINT_CAM_STRUCT localChaseHintCamStruct STRING sInitialRoots = "PHONECALL" STRING sYesRoots = "PHONEYES" STRING sNoRoots = "PHONENO" BOOL bKilledRoccoConv = FALSE BOOL bKilledGunManConv = FALSE BOOL bSolCallDone = FALSE BOOL bMikeShout = FALSE BOOL bTriggeredVehicleMusic = FALSE BOOL bExpireGunmanShout = FALSE //Used for tracking an interupted conversation //TEXT_LABEL_23 sResumeRoot = "NONE" //TEXT_LABEL_23 sResumeLine = "NONE" /// PURPOSE: /// Resets all variables used in flow PROC RESET_ALL() bKilledRoccoConv = FALSE bSolCallDone = FALSE bMikeShout = FALSE bIsCustomGPSRouteActive = FALSE bRocoSpeadUp = FALSE bLoadingFinCutscene = FALSE bStartedDriveBys = FALSE bTriggeredVehicleMusic = FALSE bKilledGunManConv = FALSE bRoccoBlipedInVehicle = FALSE eCamCut = CC_INIT iDelayCall = -1 bFailConvSet = FALSE ENDPROC /// /// /// 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 /// PURPOSE: /// Draws an angled area /// PARAMS: /// vec1 - first point of the area /// vec2 - second point of the area /// width - the width of the area // PROC DRAW_DEBUG_LOCATE_SPECIAL(VECTOR vec1, VECTOR vec2, FLOAT width) // // VECTOR vBottom[2] // VECTOR vTop[2] // // vBottom[0] = vec1 // vBottom[1] = vec2 // // vTop[0] = vec1 // vTop[1] = vec2 // // IF vec1.z > vec2.z // vBottom[0].z = vec2.z // vBottom[1].z = vec2.z // vTop[0].z = vec1.z // vTop[1].z = vec1.z // ELSE // vBottom[0].z = vec1.z // vBottom[1].z = vec1.z // vTop[0].z = vec2.z // vTop[1].z = vec2.z // ENDIF // // VECTOR fwd = NORMALISE_VECTOR(vBottom[1] - vBottom[0]) // normalize to get distance // VECTOR side = <<-fwd.y, fwd.x, fwd.z>> // VECTOR w = side * (width / 2.0) // // // Bottom points // VECTOR c1 = vBottom[0] - w // base left // VECTOR c2 = vBottom[0] + w // base right // VECTOR c3 = vBottom[1] + w // top rt // VECTOR c4 = vBottom[1] - w // top lt // // // Top points // VECTOR d1 = vTop[0] - w // base left // VECTOR d2 = vTop[0] + w // base right // VECTOR d3 = vTop[1] + w // top rt // VECTOR d4 = vTop[1] - w // top lt // // // Draw bottom lines // DRAW_DEBUG_LINE(c1, c2, 128, 0, 128) // DRAW_DEBUG_LINE(c2, c3, 128, 0, 128) // DRAW_DEBUG_LINE(c3, c4, 128, 0, 128) // DRAW_DEBUG_LINE(c4, c1, 128, 0, 128) // // Draw top lines // DRAW_DEBUG_LINE(d1, d2, 128, 0, 128) // DRAW_DEBUG_LINE(d2, d3, 128, 0, 128) // DRAW_DEBUG_LINE(d3, d4, 128, 0, 128) // DRAW_DEBUG_LINE(d4, d1, 128, 0, 128) // // Draw uprights // DRAW_DEBUG_LINE(c1, d1, 128, 0, 128) // DRAW_DEBUG_LINE(c2, d2, 128, 0, 128) // DRAW_DEBUG_LINE(c3, d3, 128, 0, 128) // DRAW_DEBUG_LINE(c4, d4, 128, 0, 128) // // 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: /// Adds a blip to a location safly checking to see that its not in existance before creatinging it /// PARAMS: /// blipIn - The blip index to write the newly created blip to /// pos - the position to set the blip at /// route - should the blip have a GPS route PROC ADD_BLIP_LOCATION(BLIP_INDEX &blipIn, VECTOR pos, BOOL route = TRUE) IF NOT DOES_BLIP_EXIST(blipIn) blipIn = CREATE_COORD_BLIP(pos, BLIPPRIORITY_MED, route) ENDIF ENDPROC /// PURPOSE: /// Adds blip to Peds first checking that the blip doesnt exist then if the ped is ok. Also can set the ped to be enemy blip or not /// PARAMS: /// blipIn - The blip index to write the newly created blip to /// pedindex - The ped to add the blip to /// bFriendly - Is the ped an enemy if TRUE the blip is blue PROC ADD_SAFE_BLIP_TO_PED(BLIP_INDEX &blipIn, PED_INDEX pedindex, BOOL bFriendly = FALSE, BOOL bCritical = TRUE) IF NOT DOES_BLIP_EXIST(blipIn) blipIn = CREATE_PED_BLIP(pedindex, bCritical, bFriendly) ENDIF ENDPROC /// PURPOSE: /// Adds blip to vehicle checking blip doesnt exist then that the vehicle does /// PARAMS: /// blipIn - The blip index to write the newly created blip to /// vhc - The vehicle to add the blip to /// benemy - Is the vehicle an enemy if false the blip is blue PROC ADD_SAFE_BLIP_TO_VEHICLE(BLIP_INDEX &blipIn, VEHICLE_INDEX vhc, BOOL bFriendly = FALSE) IF NOT DOES_BLIP_EXIST(blipIn) blipIn = CREATE_VEHICLE_BLIP(vhc, bFriendly) ENDIF 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_HEADING(vehicleindex, dir) SET_ENTITY_COORDS(vehicleindex, pos) SET_VEHICLE_ON_GROUND_PROPERLY(vehicleindex) FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vehicleindex) 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 /// PURPOSE: /// Spawns an object. And activates its physics /// PARAMS: /// objectindex - The OBJECT_INDEX to write the newly create object to /// model - The model to load and use to create the object /// pos - The position the object should be created /// dir - The heading the object should have when created /// RETURNS: /// TRUE if the object was created FUNC BOOL SPAWN_OBJECT(OBJECT_INDEX &objectindex, MODEL_NAMES model, VECTOR pos, FLOAT dir = 0.0, BOOL bUnloadAfterSpawn = TRUE) IF NOT DOES_ENTITY_EXIST(objectindex) IF REQUEST_AND_CHECK_MODEL(model,"Loading") objectindex = CREATE_OBJECT(model, pos) IF DOES_ENTITY_EXIST(objectindex) SET_ENTITY_HEADING(objectindex, dir) ACTIVATE_PHYSICS(objectindex) IF bUnloadAfterSpawn UNLOAD_MODEL(model) ENDIF RETURN TRUE ENDIF ENDIF ELSE RETURN TRUE ENDIF RETURN FALSE ENDFUNC //PURPOSE: /// PURPOSE: /// Checkes to see if a ped is in a given vehicle, also does alive checks. /// Returns TRUE if the given ped is in the given vehicle and they are all alive and well /// PARAMS: /// ped - Ped to check /// veh - The vehicle to check they are in /// RETURNS: /// TRUE if the ped is in the vehicle and they are both alive and well FUNC BOOL IS_SAFE_PED_IN_VEHICLE(PED_INDEX ped, VEHICLE_INDEX veh) IF veh != NULL IF IS_VEHICLE_OK(veh) IF IS_PED_UNINJURED(ped) IF IS_PED_IN_VEHICLE(ped,veh) RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Prints objective to the screen if the objective hasnt already been printed /// Checks and expired bObjectiveShown /// PARAMS: /// objstr - The text key to print PROC PRINT_OBJ(String objstr) IF NOT bObjectiveShown PRINT_NOW(objstr, DEFAULT_GOD_TEXT_TIME,0) bObjectiveShown = TRUE ENDIF ENDPROC /// PURPOSE: /// Print a warning God text string and expires a bool when the warning has been shown /// PARAMS: /// WarnObj - the text key of the wanrning /// expire - the bool to change PROC PRINT_WARNING_OBJ(STRING WarnObj, BOOL &expire) IF NOT expire PRINT_NOW(WarnObj, DEFAULT_GOD_TEXT_TIME,0) expire = TRUE ENDIF ENDPROC /// PURPOSE: /// Spawns and sets up the ped with a debug name /// PARAMS: /// index - The PED_INDEX to write the newly created ped to /// pos - The postion to create the ped at /// fDir - The heading to give the new ped /// modelName - The model to create the ped with /// i - Debug number for Debug name /// _name - The Debug name /// RETURNS: /// TRUE if the ped was created FUNC BOOL SETUP_PED(PED_INDEX &index, VECTOR pos, FLOAT fDir, MODEL_NAMES modelName, INT i, STRING _name) IF SPAWN_PED(index, modelName, pos, fDir) #IF IS_DEBUG_BUILD SK_PRINT("SPAWNED") #ENDIF IF IS_PED_UNINJURED(index) TEXT_LABEL tDebugName = _name tDebugName += i #IF IS_DEBUG_BUILD SK_PRINT(tDebugName) #ENDIF SET_PED_NAME_DEBUG(index, tDebugName) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Gets the heading between to vectors /// PARAMS: /// V1 - First vector /// V2 - Second vector /// RETURNS: /// FLOAT - the heading between the two FUNC FLOAT GET_HEADING_BETWEEN_VECTORS(VECTOR V1, VECTOR V2) RETURN GET_HEADING_FROM_VECTOR_2D(V2.x-V1.x,V2.y-V1.y) ENDFUNC ///----------------------------------------------------------------------------------- /// MISSION FUNCTIONS ///----------------------------------------------------------------------------------- /// PURPOSE: /// Tells a ped to leave a specified vehicle /// performs dead checks on the ped and vehicle /// PARAMS: /// ped - The ped to leave the vechicle /// veh - The vehicle said ped is leaving PROC GIVE_LEAVE_VEHICLE_ORDER(PED_INDEX ped, VEHICLE_INDEX veh) IF IS_VEHICLE_OK(veh) IF IS_PED_UNINJURED(ped) TASK_LEAVE_VEHICLE(ped, veh) ENDIF ENDIF ENDPROC /// PURPOSE: /// Tells a ped to enter a specified vehicle /// performs dead checks on the ped and vehicle /// PARAMS: /// ped - The ped to leave the vechicle /// veh - The vehicle said ped is leaving /// seat - Seate the ped should enter the car from PROC GIVE_ENTER_VEHICLE_ORDER(PED_INDEX ped, VEHICLE_INDEX veh, VEHICLE_SEAT seat = VS_DRIVER) IF IS_VEHICLE_OK(veh) IF IS_PED_UNINJURED(ped) TASK_ENTER_VEHICLE(ped, veh, DEFAULT_TIME_BEFORE_WARP, seat) ENDIF ENDIF ENDPROC /// PURPOSE: /// Gives a ped in vehicle a waypoint task /// PARAMS: /// ped - The ped to give the task to /// waypoint - The name of the waypoint rec to give the ped PROC GIVE_WAYPOINT_TASK(PED_INDEX ped, STRING waypoint, INT iStartPoint = 0 , EWAYPOINT_FOLLOW_FLAGS eFollow = EWAYPOINT_DEFAULT) IF IS_PED_UNINJURED(ped) FREEZE_ENTITY_POSITION(ped, FALSE) IF IS_VEHICLE_OK(mCarRoco.id) AND GET_IS_WAYPOINT_RECORDING_LOADED(waypoint) TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(ped, mCarRoco.id, waypoint, DRIVINGMODE_AVOIDCARS_RECKLESS, iStartPoint, eFollow) ENDIF ENDIF ENDPROC PROC GIVE_NAVMESH_TASK(PED_INDEX ped, VECTOR vGoto, FLOAT moveBlend = PEDMOVEBLENDRATIO_WALK, INT warpTime = DEFAULT_TIME_BEFORE_WARP) IF IS_PED_UNINJURED(ped) FREEZE_ENTITY_POSITION(ped, FALSE) CLEAR_PED_TASKS(ped) TASK_FOLLOW_NAV_MESH_TO_COORD(ped, vGoto, moveBlend, warpTime) ENDIF ENDPROC /// PURPOSE: /// Gives a ped an attack order after the player has been spotted /// Only called when the player fails the mission for getting spotted or attacking a ped /// and possibly when the player has completed the sex scene section /// PARAMS: /// ped - The ped to give the order to PROC GIVE_PED_ATTACK_ORDER(PED_INDEX ped) IF IS_PED_UNINJURED(ped) IF NOT IsPedPerformingTask(ped, SCRIPT_TASK_COMBAT) FREEZE_ENTITY_POSITION(ped, FALSE) CLEAR_PED_TASKS(ped) TASK_COMBAT_PED(ped, PLAYER_PED_ID()) SET_PED_KEEP_TASK(ped, TRUE) ENDIF ENDIF ENDPROC /// PURPOSE: /// Tells a ped to smart flee 200m from the player /// Checks to see if the task is already being performed /// Checks the ped is alive /// PARAMS: /// ped - the ped to flee PROC GIVE_PED_FLEE_ORDER(PED_INDEX ped, BOOL bClearTasks = TRUE) IF IS_PED_UNINJURED(ped) IF NOT IsPedPerformingTask(ped, SCRIPT_TASK_SMART_FLEE_PED) FREEZE_ENTITY_POSITION(ped, FALSE) IF bClearTasks CLEAR_PED_TASKS(ped) ENDIF SET_PED_FLEE_ATTRIBUTES(ped, FA_USE_VEHICLE, FALSE) TASK_SMART_FLEE_PED(ped, PLAYER_PED_ID(), 550, -1, TRUE) SET_PED_KEEP_TASK(ped, TRUE) ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks that 2 entities are at the same height - within /// 1.5m /// PARAMS: /// e1 - first entity /// e2 - second entity /// RETURNS: /// TRUE if the entities are at the same height FUNC BOOL ARE_ENTITYS_AT_SAME_HEIGHT(ENTITY_INDEX e1, ENTITY_INDEX e2) VECTOR vE1 = GET_ENTITY_COORDS(e1) VECTOR vE2 = GET_ENTITY_COORDS(e2) FLOAT fDiff = ABSF(vE1.z - vE2.z) //want the absolute difference so it doesnt matter which entitys height was taken away first IF fDiff <= 1.5 RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks that the player is with in range of the hunter used when playing dialogue /// PARAMS: /// distance - The distance the player must be with in - defaults to 10.0 /// RETURNS: /// TRUE if the player is with in the distance FUNC BOOL IS_IN_CONV_DISTANCE(PED_INDEX ped, FLOAT distance = 10.0) IF ped = NULL RETURN TRUE ENDIF IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(ped) // #IF IS_DEBUG_BUILD SK_PRINT_FLOAT(" DISTANCE BETWEEN CONVO === ", GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ped, FALSE))#ENDIF IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ped, FALSE) <= distance AND ARE_ENTITYS_AT_SAME_HEIGHT(ped, PLAYER_PED_ID()) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Creates a conversation and then displays an objective /// Expires a bool when the conversation has been created /// assume the player is talking to another ped /// kills the conversation if its started and the peds are too far away /// PARAMS: /// ped - the ped the conversation is with - pass in NULL if i doesnt matter where the other ped is in relation to the player /// bExpire - The bool to expire when the conversation has been created (ref) /// sConvo - the string of the conversation to play /// sObj - the text key for the obj /// distance - the distance the player and ped need to be in before the convostation happens PROC DO_CONVO_WITH_OBJ(PED_INDEX ped, BOOL &bExpire, STRING sConvo, STRING sObj, FLOAT distance = 10.0) IF NOT bObjectiveShown // #IF IS_DEBUG_BUILD SK_PRINT(sConvo) #ENDIF // #IF IS_DEBUG_BUILD SK_PRINT(" NOT bObjectiveShown") #ENDIF // IF NOT bExpire // #IF IS_DEBUG_BUILD SK_PRINT("NOT bExpire") #ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_SCREEN_FADED_IN() IF IS_IN_CONV_DISTANCE(ped, distance) bExpire = CREATE_CONVERSATION(s_conversation_peds, sTextBlock, sConvo, CONV_PRIORITY_MEDIUM) ENDIF ENDIF ELSE IF NOT IS_IN_CONV_DISTANCE(ped, distance) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 PRINT_OBJ(sObj) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Creates a conversation and then displays an objective /// And then creates another conversation /// Expires a bool when each of the conversation have been created /// assume the player is talking to another ped /// kills the conversation if its started and the peds are too far away /// PARAMS: /// ped - the ped the conversation is with - pass in NULL if i doesnt matter where the other ped is in relation to the player /// bExpire - The expiry bool for the first conversation (ref) /// bExpireAfterConv - bool for the second conversation (ref) /// sConvo - the string of the 1st conversation to play /// sConvToPlayAfterObj - the string 2nd of the conversation to play /// sObj - the text key for the obj /// distance - the distance the player and ped need to be in before the convostation happens PROC DO_TWO_CONVO_WITH_OBJ(PED_INDEX ped, BOOL &bExpire, BOOL &bExpireAfterConv, STRING sConvo, STRING sConvToPlayAfterObj, STRING sObj, FLOAT distance = 10.0) IF NOT bObjectiveShown // #IF IS_DEBUG_BUILD SK_PRINT(" NOT bObjectiveShown") #ENDIF IF NOT bExpire // #IF IS_DEBUG_BUILD SK_PRINT(sConvo) #ENDIF // #IF IS_DEBUG_BUILD SK_PRINT("NOT bExpire") #ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_SCREEN_FADED_IN() IF IS_IN_CONV_DISTANCE(ped, distance) bExpire = CREATE_CONVERSATION(s_conversation_peds, sTextBlock, sConvo, CONV_PRIORITY_MEDIUM) ENDIF ENDIF ELSE IF NOT IS_IN_CONV_DISTANCE(ped, distance) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 PRINT_OBJ(sObj) ENDIF ENDIF ELSE IF NOT IS_THIS_PRINT_BEING_DISPLAYED(sObj) OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 IF NOT IS_STRING_NULL_OR_EMPTY(sConvToPlayAfterObj) IF NOT bExpireAfterConv IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF IS_IN_CONV_DISTANCE(ped, distance) bExpireAfterConv = CREATE_CONVERSATION(s_conversation_peds, sTextBlock, sConvToPlayAfterObj, CONV_PRIORITY_MEDIUM) ENDIF ENDIF ELSE IF NOT IS_IN_CONV_DISTANCE(ped, distance) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ENDIF ELSE bExpireAfterConv = TRUE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Creates a conversation then expires a bool when the conversation has been created /// PARAMS: /// ped - the ped the conversation is with - pass in NULL if i doesnt matter where the other ped is in relation to the player /// bExpire - The expiry bool for the first conversation (ref) /// sConvo - the string of the conversation to play /// distance - the distance the player and ped need to be in before the convostation happens /// RETURNS: /// true when the bool is expired FUNC BOOL DO_CONVO(PED_INDEX ped, BOOL &bExpire, STRING sConvo, FLOAT distance = 10.0, enumConversationPriority priority = CONV_PRIORITY_MEDIUM) IF NOT bExpire IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_SCREEN_FADED_IN() IF IS_IN_CONV_DISTANCE(ped, distance) bExpire = CREATE_CONVERSATION(s_conversation_peds, sTextBlock, sConvo, priority) ENDIF ENDIF ELSE IF NOT IS_IN_CONV_DISTANCE(ped, distance) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ENDIF RETURN bExpire ENDFUNC PROC CONTROL_ABM_CONV(AMBIENT_DIALOGUE_CONV &conv) SWITCH conv.eAmbConv CASE ACS_START_LINE IF IS_PED_UNINJURED(conv.mConvLine[conv.iIndex].ped) PLAY_PED_AMBIENT_SPEECH_WITH_VOICE_NATIVE(conv.mConvLine[conv.iIndex].ped, conv.mConvLine[conv.iIndex].sConvLine, conv.mConvLine[conv.iIndex].sVoice, "SPEECH_PARAMS_STANDARD") conv.mConvLine[conv.iIndex].iStartTime = GET_GAME_TIMER() #IF IS_DEBUG_BUILD SK_PRINT("ACS_START_LINE === ") #ENDIF #IF IS_DEBUG_BUILD SK_PRINT(conv.mConvLine[conv.iIndex].sConvLine) #ENDIF conv.eAmbConv = ACS_WAIT_LINE_FIN ENDIF BREAK CASE ACS_WAIT_LINE_FIN IF (GET_GAME_TIMER() - conv.mConvLine[conv.iIndex].iStartTime) > conv.mConvLine[conv.iIndex].iLineTime conv.mConvLine[conv.iIndex].bDone = TRUE conv.iIndex++ #IF IS_DEBUG_BUILD SK_PRINT_INT("NEXT INDEX ===", conv.iIndex) #ENDIF conv.eAmbConv = ACS_PICK_NEXT_LINE ENDIF BREAK CASE ACS_PICK_NEXT_LINE #IF IS_DEBUG_BUILD SK_PRINT("ACS_PICK_NEXT_LINE") #ENDIF IF NOT conv.bIsRandom IF NOT ARE_STRINGS_EQUAL("END", conv.mConvLine[conv.iIndex].sConvLine) conv.eAmbConv = ACS_START_LINE ELSE conv.eAmbConv = ACS_FIN ENDIF ELSE //not implemented ENDIF BREAK ENDSWITCH 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) TRIGGER_MUSIC_EVENT("SOL2_FAIL") SAFE_REMOVE_BLIP(biBlip) // B*1911335 - needs custom route to navigate player inside the studio IF bIsCustomGPSRouteActive SET_GPS_MULTI_ROUTE_RENDER(FALSE) CLEAR_GPS_MULTI_ROUTE() bIsCustomGPSRouteActive = FALSE #IF IS_DEBUG_BUILD SK_PRINT(" bIsCustomGPSRouteActive cleaned up") #ENDIF ENDIF SAFE_REMOVE_BLIP(mRocco.blip) SAFE_REMOVE_BLIP(mGunMan.blip) IF NOT bFailConvSet CLEAR_PRINTS() KILL_ANY_CONVERSATION() ENDIF SWITCH fail CASE FR_NONE BREAK CASE FR_ROCO_ESCAPED sFailReason = "SOL2_FGOTAWAY" IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, "SOL2_MLT", CONV_PRIORITY_MEDIUM) bFailConvSet = TRUE ENDIF BREAK CASE FR_SOLOMON_KILLED sFailReason = "SOL2_FSOLDEAD" BREAK ENDSWITCH eMissionState = MS_FAILED eState = SS_INIT ENDPROC ///----------------------------------------------------------------------------------- /// STATE MACHINES ///----------------------------------------------------------------------------------- /// PURPOSE: /// Sets the mission check point PROC SET_CHECKPOINT() SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_KILLEDROCO, "Phone call", TRUE) #IF IS_DEBUG_BUILD SK_PRINT("Set checkpoint to CP_KILLEDROCO") #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 /// PURPOSE: /// Loads a scene around a point used to the player /// seeing the map stream in when starting a replay or debug skipping /// PARAMS: /// pos - the position to stream the scene around at /// rad - the radius of the scene to load PROC LOAD_SCENE_SKIP(VECTOR pos, FLOAT rad) NEW_LOAD_SCENE_START_SPHERE(pos, rad) INT i_load_scene_timer = GET_GAME_TIMER() WHILE (NOT IS_NEW_LOAD_SCENE_LOADED()) AND (GET_GAME_TIMER() - i_load_scene_timer < 12000) WAIT(0) ENDWHILE NEW_LOAD_SCENE_STOP() ENDPROC /// PURPOSE: /// Adds peds for dialogue based off the Mission state PROC ADD_PEDS_FOR_DIALOGUE() ENDPROC PROC CREATE_RELATIONSHIP_GROUP() #IF IS_DEBUG_BUILD SK_PRINT("CREATE_RELATIONSHIP_GROUP") #ENDIF ADD_RELATIONSHIP_GROUP("SolomonREL", HASH_SOLOMON) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, HASH_SOLOMON, RELGROUPHASH_PLAYER) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, HASH_SOLOMON) IF IS_PED_UNINJURED(piSolomon) SET_PED_RELATIONSHIP_GROUP_HASH(piSolomon, HASH_SOLOMON) ENDIF ENDPROC /// 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_TEXT IF ARE_STRINGS_EQUAL(sGodText, "NONE") AND ARE_STRINGS_EQUAL(sTextBlock, "NONE") #IF IS_DEBUG_BUILD SK_PRINT("RQ_TEXT NOT INITIALISED sGodText AND sTextBlock = NONE") #ENDIF RETURN TRUE ENDIF REQUEST_ADDITIONAL_TEXT(sGodText, MISSION_TEXT_SLOT) IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) #IF IS_DEBUG_BUILD SK_PRINT("RQ_TEXT") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("TEXT FAILED") #ENDIF BREAK CASE RQ_CUTSCENE_INTRO IF NOT HAS_CUTSCENE_LOADED() RC_REQUEST_CUTSCENE("SOL_2_INT_ALT1") ELSE RETURN TRUE ENDIF BREAK CASE RQ_CAR_ROCO IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE) mCarRoco.id = g_sTriggerSceneAssets.veh[0] IF IS_VEHICLE_OK(mCarRoco.id) SET_VEHICLE_MODEL_IS_SUPPRESSED(mCarRoco.Mod, TRUE) SET_VEHICLE_COLOUR_COMBINATION(mCarRoco.id, 4) #IF IS_DEBUG_BUILD SK_PRINT("RQ_CAR_ROCO") #ENDIF RETURN TRUE ENDIF ELSE IF SPAWN_VEHICLE(mCarRoco.id, mCarRoco.Mod, mCarRoco.vPos, mCarRoco.fDir) SET_VEHICLE_MODEL_IS_SUPPRESSED(mCarRoco.Mod, TRUE) SET_VEHICLE_COLOUR_COMBINATION(mCarRoco.id, 4) #IF IS_DEBUG_BUILD SK_PRINT("RQ_CAR_ROCO") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_CAR_ROCO FAILED") #ENDIF ENDIF BREAK CASE RQ_PLAYER_CAR IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[1]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[1], TRUE, TRUE) mPlayerCar.id = g_sTriggerSceneAssets.veh[1] IF IS_VEHICLE_OK(mPlayerCar.id) SET_VEHICLE_COLOUR_COMBINATION(mPlayerCar.id, 1) SET_VEHICLE_MODEL_IS_SUPPRESSED(mPlayerCar.Mod, TRUE) REQUEST_VEHICLE_ASSET(mPlayerCar.Mod) #IF IS_DEBUG_BUILD SK_PRINT("RQ_PLAYER_CAR") #ENDIF RETURN TRUE ENDIF ELSE IF SPAWN_VEHICLE(mPlayerCar.id, mPlayerCar.Mod, mPlayerCar.vPos, mPlayerCar.fDir) SET_VEHICLE_COLOUR_COMBINATION(mPlayerCar.id, 1) SET_VEHICLE_MODEL_IS_SUPPRESSED(mPlayerCar.Mod, TRUE) REQUEST_VEHICLE_ASSET(mPlayerCar.Mod) #IF IS_DEBUG_BUILD SK_PRINT("RQ_PLAYER_CAR") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_PLAYER_CAR FAILED") #ENDIF ENDIF BREAK CASE RQ_ROCO IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[0]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[0], TRUE, TRUE) mRocco.id = g_sTriggerSceneAssets.ped[0] IF IS_PED_UNINJURED(mRocco.id) STOP_PED_SPEAKING(mRocco.id, TRUE) SET_PED_CONFIG_FLAG(mRocco.id, PCF_AllowToBeTargetedInAVehicle, FALSE) ADD_PED_FOR_DIALOGUE(s_conversation_peds, 3, mRocco.id, "ROCCO") #IF IS_DEBUG_BUILD SK_PRINT("RQ_ROCO") #ENDIF SET_PED_PLAYS_HEAD_ON_HORN_ANIM_WHEN_DIES_IN_VEHICLE(mRocco.id, TRUE) SET_PED_MODEL_IS_SUPPRESSED(IG_ROCCOPELOSI, TRUE) RETURN TRUE ENDIF ELSE IF SPAWN_PED(mRocco.id, mRocco.Mod, mRocco.vPos, mRocco.fDir) STOP_PED_SPEAKING(mRocco.id, TRUE) SET_PED_CONFIG_FLAG(mRocco.id, PCF_AllowToBeTargetedInAVehicle, FALSE) ADD_PED_FOR_DIALOGUE(s_conversation_peds, 3, mRocco.id, "ROCCO") #IF IS_DEBUG_BUILD SK_PRINT("RQ_ROCO") #ENDIF SET_PED_PLAYS_HEAD_ON_HORN_ANIM_WHEN_DIES_IN_VEHICLE(mRocco.id, TRUE) SET_PED_MODEL_IS_SUPPRESSED(mRocco.Mod, TRUE) RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_ROCO FAILED") #ENDIF ENDIF BREAK CASE RQ_GUN_MAN IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[1]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[1], TRUE, TRUE) mGunMan.id = g_sTriggerSceneAssets.ped[1] IF IS_PED_UNINJURED(mGunMan.id) STOP_PED_SPEAKING(mGunMan.id, TRUE) SET_PED_CONFIG_FLAG(mGunMan.id, PCF_AllowToBeTargetedInAVehicle, FALSE) ADD_PED_FOR_DIALOGUE(s_conversation_peds, 4, mGunMan.id, "GIANNI") #IF IS_DEBUG_BUILD SK_PRINT("RQ_GUN_MAN") #ENDIF GIVE_WEAPON_TO_PED(mGunMan.id, WEAPONTYPE_PISTOL, INFINITE_AMMO) SET_PED_MODEL_IS_SUPPRESSED(mGunMan.Mod, TRUE) SET_PED_ACCURACY(mGunMan.id, 30) RETURN TRUE ENDIF ELSE IF SPAWN_PED(mGunMan.id, mGunMan.Mod, mGunMan.vPos, mGunMan.fDir) STOP_PED_SPEAKING(mGunMan.id, TRUE) SET_PED_CONFIG_FLAG(mGunMan.id, PCF_AllowToBeTargetedInAVehicle, FALSE) GIVE_WEAPON_TO_PED(mGunMan.id, WEAPONTYPE_PISTOL, INFINITE_AMMO) ADD_PED_FOR_DIALOGUE(s_conversation_peds, 4, mGunMan.id, "GIANNI") #IF IS_DEBUG_BUILD SK_PRINT("RQ_GUN_MAN") #ENDIF SET_PED_ACCURACY(mGunMan.id, 30) SET_PED_MODEL_IS_SUPPRESSED(mGunMan.Mod, TRUE) RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_GUN_MAN FAILED") #ENDIF ENDIF BREAK CASE RQ_SOLOMON IF IS_PED_UNINJURED(g_sTriggerSceneAssets.ped[2]) SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[2], TRUE, TRUE) piSolomon = g_sTriggerSceneAssets.ped[2] IF IS_PED_UNINJURED(piSolomon) STOP_PED_SPEAKING(piSolomon, TRUE) SET_PED_CAN_BE_TARGETTED(piSolomon, FALSE) SET_ENTITY_PROOFS(piSolomon, TRUE, FALSE, FALSE, FALSE, TRUE) #IF IS_DEBUG_BUILD SK_PRINT("RQ_SOLOMON") #ENDIF RETURN TRUE ENDIF ELSE IF SPAWN_PED(piSolomon, IG_SOLOMON, <<-1031.94, -544.25, 35.29>>, 40.97) STOP_PED_SPEAKING(piSolomon, TRUE) SET_PED_DEFAULT_COMPONENT_VARIATION(piSolomon) #IF IS_DEBUG_BUILD SK_PRINT("RQ_SOLOMON") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_SOLOMON FAILED") #ENDIF ENDIF BREAK CASE RQ_WAYPOINT REQUEST_WAYPOINT_RECORDING("Sol1Roco1") IF GET_IS_WAYPOINT_RECORDING_LOADED("Sol1Roco1") #IF IS_DEBUG_BUILD SK_PRINT("RQ_WAYPOINT") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_WAYPOINT FAILED") #ENDIF BREAK CASE RQ_INJURED_CLIP REQUEST_ANIM_SET("move_injured_generic") IF HAS_ANIM_SET_LOADED("move_injured_generic") #IF IS_DEBUG_BUILD SK_PRINT("RQ_INJURED_CLIP") #ENDIF RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("RQ_INJURED_CLIP FAILED") #ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC TELL_ROCO_BURNOUT(FLOAT StartSpeed = 5.0, FLOAT StartCruise = 10.0) IF IS_VEHICLE_OK(mCarRoco.id) AND IS_PED_UNINJURED(mRocco.id) SET_VEHICLE_ENGINE_ON(mCarRoco.id, TRUE, TRUE) SET_VEHICLE_FORWARD_SPEED(mCarRoco.id, StartSpeed) SET_ENTITY_LOAD_COLLISION_FLAG(mRocco.id, TRUE) TASK_VEHICLE_DRIVE_TO_COORD(mRocco.id, mCarRoco.id, <<-1106.3654, -579.0142, 31.1366>>, StartCruise, DRIVINGSTYLE_ACCURATE, DUMMY_MODEL_FOR_SCRIPT, DRIVINGMODE_AVOIDCARS|DF_UseStringPullingAtJunctions|DF_UseSwitchedOffNodes, 2, 0.5) SET_VEHICLE_TYRES_CAN_BURST(mCarRoco.id, FALSE) iMissionTimer = GET_GAME_TIMER() eRocoState = RS_BURNOUT 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) ADD_PEDS_FOR_DIALOGUE() 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_TEXT, vSafeVec) IF NOT IS_REPLAY_IN_PROGRESS() IF SETUP_STAGE_REQUIREMENTS(RQ_ROCO, mRocco.vPos, mRocco.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_GUN_MAN, mGunMan.vPos, mGunMan.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_CAR_ROCO, mCarRoco.vPos, mCarRoco.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_SOLOMON, mCarRoco.vPos, mCarRoco.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_PLAYER_CAR, mPlayerCar.vPos, mPlayerCar.fDir) MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_SOLOMON_2) bCleanedupSolomon = FALSE bCleanedupPlayerCar = FALSE IF IS_PED_UNINJURED(mRocco.id) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mRocco.id) ENDIF IF IS_PED_UNINJURED(mGunMan.id) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mGunMan.id) ENDIF RC_REQUEST_CUTSCENE("SOL_2_INT_ALT1") #IF IS_DEBUG_BUILD SK_PRINT("MS_SET_UP") #ENDIF RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF ELSE #IF IS_DEBUG_BUILD SK_PRINT(" Replay is active just loaded text MS_SET_UP") #ENDIF RETURN TRUE 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 RESET_ALL() IF SETUP_STAGE_REQUIREMENTS(RQ_CUTSCENE_INTRO, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_ROCO, mRocco.vPos, mRocco.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_GUN_MAN, mGunMan.vPos, mGunMan.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_CAR_ROCO, mCarRoco.vPos, mCarRoco.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_INJURED_CLIP, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_SOLOMON, mCarRoco.vPos, mCarRoco.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_WAYPOINT, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_PLAYER_CAR, mPlayerCar.vPos, mPlayerCar.fDir) SET_VEHICLE_COLOUR_COMBINATION(mPlayerCar.id, 1) #IF IS_DEBUG_BUILD SK_PRINT("MS_INTRO") #ENDIF bCleanedupSolomon = FALSE bCleanedupPlayerCar = FALSE IF NOT IS_REPLAY_IN_PROGRESS() WAIT_FOR_WORLD_TO_LOAD( mRocco.vPos, 75 ) ENDIF IF IS_PED_UNINJURED(mRocco.id) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mRocco.id) ENDIF IF IS_PED_UNINJURED(mGunMan.id) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mGunMan.id) ENDIF 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 IF SETUP_STAGE_REQUIREMENTS(RQ_INJURED_CLIP, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_WAYPOINT, vSafeVec) RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_INTRO, FAILED") #ENDIF BREAK CASE MS_CHASE IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions IF SETUP_STAGE_REQUIREMENTS(RQ_ROCO, mRocco.vPos, mRocco.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_GUN_MAN, mGunMan.vPos, mGunMan.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_CAR_ROCO, mCarRoco.vPos, mCarRoco.fDir) AND SPAWN_VEHICLE(mPlayerCar.id, mPlayerCar.Mod, mPlayerCar.vPos, mPlayerCar.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_INJURED_CLIP, vSafeVec) AND SETUP_STAGE_REQUIREMENTS(RQ_SOLOMON, mCarRoco.vPos, mCarRoco.fDir) AND SETUP_STAGE_REQUIREMENTS(RQ_WAYPOINT, vSafeVec) SET_VEHICLE_COLOUR_COMBINATION(mPlayerCar.id, 1) bCleanedupSolomon = FALSE bCleanedupPlayerCar = FALSE RESET_ALL() IF IS_PED_UNINJURED(piSolomon) SET_PED_MOVEMENT_CLIPSET(piSolomon, "move_injured_generic") TASK_FOLLOW_NAV_MESH_TO_COORD(piSolomon, vDropOffLoc, PEDMOVEBLENDRATIO_WALK, 60000) ENDIF IF IS_PED_UNINJURED(mRocco.id) SET_PED_INTO_VEHICLE(mRocco.id, mCarRoco.id) ENDIF IF IS_PED_UNINJURED(mGunMan.id) SET_PED_INTO_VEHICLE(mGunMan.id, mCarRoco.id, VS_FRONT_RIGHT) ENDIF SET_ENTITY_COORDS(mCarRoco.id, <<-1106.3654, -579.0142, 31.1366>>, TRUE, TRUE) SET_ENTITY_HEADING(mCarRoco.id, 114.9979) IF NOT IS_REPLAY_IN_PROGRESS() WAIT_FOR_WORLD_TO_LOAD( <<-1036.3180, -546.2224, 34.1445>>, 75) SET_PED_POS(PLAYER_PED_ID(), <<-1038.9562, -547.5014, 34.0505>>, 125.2668) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() ENDIF IF NOT IS_REPLAY_BEING_SET_UP() IF IS_PED_UNINJURED(mRocco.id) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mRocco.id) ENDIF IF IS_PED_UNINJURED(mGunMan.id) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mGunMan.id) ENDIF sbiMovieSetScenarioBlocker = ADD_SCENARIO_BLOCKING_AREA_FROM_POSITION_AND_RADIUS(<<-1176.52490, -550.91449, 27.73062>>, 15) CLEAR_AREA_OF_PEDS(<<-1176.52490, -550.91449, 27.73062>>, 9.22) 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 FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_RUN, FALSE) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_RUN) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1, "DEFAULT_ACTION") FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) TELL_ROCO_BURNOUT() RC_END_Z_SKIP() ELSE END_REPLAY_SETUP() ENDIF ENDIF ELSE RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_PHONE_CALL, 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 bCleanedupSolomon = TRUE bCleanedupPlayerCar = FALSE IF NOT IS_REPLAY_BEING_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() ELSE END_REPLAY_SETUP() ENDIF ELSE RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_PHONE_CALL, FAILED") #ENDIF BREAK CASE MS_PHONE_CALL IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions IF SPAWN_VEHICLE(mPlayerCar.id, mPlayerCar.Mod, <<-1198.4720, -604.7609, 25.4568>>, 41.5163) SET_VEHICLE_COLOUR_COMBINATION(mPlayerCar.id, 1) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE, -1, "DEFAULT_ACTION") bCleanedupSolomon = TRUE bCleanedupPlayerCar = FALSE IF NOT IS_REPLAY_IN_PROGRESS() WAIT_FOR_WORLD_TO_LOAD( <<-1198.9615, -597.6102, 25.9498>>, 75) SET_PED_POS(PLAYER_PED_ID(), <<-1198.9615, -597.6102, 25.9498>>, 138.1940) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() ENDIF IF NOT IS_REPLAY_BEING_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() ELSE END_REPLAY_SETUP() ENDIF ENDIF ELSE RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_PHONE_CALL, FAILED") #ENDIF BREAK CASE MS_RETURN_TO_STUDIO IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE, -1, "DEFAULT_ACTION") bCleanedupSolomon = TRUE IF NOT IS_REPLAY_BEING_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() ELSE END_REPLAY_SETUP() ENDIF ELSE RETURN TRUE //all mission stage requirements set up return true and activate stage ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_RETURN_TO_STUDIO, FAILED") #ENDIF BREAK CASE MS_OUTRO IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions SET_INTERIOR_DISABLED( INTERIOR_V_58_SOL_OFFICE, FALSE) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE, -1, "DEFAULT_ACTION") SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() IF NOT IS_REPLAY_BEING_SET_UP() SET_PED_POS(PLAYER_PED_ID(), <<-1017.7021, -484.0121, 36.0903>>, 114.1774) WAIT_FOR_WORLD_TO_LOAD( <<-1017.7021, -484.0121, 36.0903>>, 75) ENDIF bCleanedupSolomon = TRUE #IF IS_DEBUG_BUILD SK_PRINT("Loading outro in skip setup") #ENDIF IF NOT IS_REPLAY_BEING_SET_UP() ELSE END_REPLAY_SETUP() ENDIF REQUEST_CUTSCENE("sol_2_ext_concat") WHILE NOT HAS_CUTSCENE_LOADED() IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID()) ENDIF #IF IS_DEBUG_BUILD SK_PRINT("Loading outro in skip setup") #ENDIF WAIT(0) ENDWHILE 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 RETURN TRUE ENDIF #IF IS_DEBUG_BUILD SK_PRINT("MS_OUTRO, FAILED") #ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Sits in the NEXT_STAGE() function and moniters for assest that /// should be unloaded based on the mission state /// PARAMS: /// state - the current state we should evaluate PROC MONITER_UNLOAD_ASSETS(MISSION_STATE state) SWITCH state CASE MS_SET_UP BREAK ENDSWITCH ENDPROC // =========================================================================================================== // Termination // =========================================================================================================== // ----------------------------------------------------------------------------------------------------------- // Script Cleanup // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Unloads all models PROC UNLOAD_ALL_MODELS() ENDPROC /// PURPOSE: /// Unloads all waypoints PROC UNLOAD_ALL_WAYPOINTS() REMOVE_WAYPOINT_RECORDING("Sol1Roco1") ENDPROC /// PURPOSE: /// Unloads all anims PROC UNLOAD_ANIMS() REMOVE_VEHICLE_ASSET(mPlayerCar.Mod) ENDPROC /// PURPOSE: /// Unload all vehicle recordings PROC UNLOAD_ALL_CAR_RECS() ENDPROC /// PURPOSE: /// Deletes any blips that are valid PROC REMOVE_BLIPS() SAFE_REMOVE_BLIP(biBlip) SAFE_REMOVE_BLIP(mRocco.blip) SAFE_REMOVE_BLIP(mGunMan.blip) ENDPROC /// PURPOSE: /// Standard delete all function used the wait for fail state /// Safe deletes all peds, props and vehicles PROC DELETE_ALL() SAFE_DELETE_PED(mRocco.id) SAFE_DELETE_PED(mGunMan.id) SAFE_DELETE_PED(piSolomon) SAFE_DELETE_VEHICLE(mCarRoco.id) SAFE_DELETE_VEHICLE(mPlayerCar.id) SAFE_RELEASE_OBJECT(oiCone) //grabbed from the world so cant be deleted ENDPROC PROC RELEASE_ALL() SAFE_RELEASE_PED(mRocco.id) SAFE_RELEASE_PED(piSolomon, TRUE, TRUE) SAFE_RELEASE_PED(mGunMan.id, TRUE, TRUE) SAFE_RELEASE_VEHICLE(mCarRoco.id) SAFE_RELEASE_VEHICLE(mPlayerCar.id) SAFE_RELEASE_OBJECT(oiCone) 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) // B*1911335 - needs custom route to navigate player inside the studio IF bIsCustomGPSRouteActive SET_GPS_MULTI_ROUTE_RENDER(FALSE) CLEAR_GPS_MULTI_ROUTE() bIsCustomGPSRouteActive = FALSE #IF IS_DEBUG_BUILD SK_PRINT(" bIsCustomGPSRouteActive cleaned up") #ENDIF ENDIF REMOVE_BLIPS() UNLOAD_ALL_MODELS() UNLOAD_ALL_WAYPOINTS() UNLOAD_ANIMS() UNLOAD_ALL_CAR_RECS() REMOVE_RELATIONSHIP_GROUP(HASH_SOLOMON) IF IS_PED_UNINJURED(PLAYER_PED_ID()) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE, -1, "DEFAULT_ACTION") ENDIF IF bDelAll DELETE_ALL() ELSE RELEASE_ALL() ENDIF SET_GPS_MULTI_ROUTE_RENDER(FALSE) DISABLE_TAXI_HAILING(FALSE) REMOVE_SCENARIO_BLOCKING_AREA(sbiMovieSetScenarioBlocker) IF DOES_CAM_EXIST(camMain) RENDER_SCRIPT_CAMS(FALSE,FALSE) DESTROY_CAM(camMain) ENDIF ENDPROC PROC TOGGLE_PLAYER_SAFE_FOR_CAMERA_CUT(BOOL bOn) IF bOn CPRINTLN(DEBUG_MISSION, "Replay Controller is setting player as invincible.") IF NOT IS_PED_DEAD_OR_DYING(PLAYER_PED_ID()) SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE) IF NOT NETWORK_IS_GAME_IN_PROGRESS() SET_PED_CAN_BE_SHOT_IN_VEHICLE(PLAYER_PED_ID(), FALSE) // this command is SP only ENDIF SET_ENTITY_CAN_BE_DAMAGED(PLAYER_PED_ID(), FALSE) SET_ENTITY_PROOFS(PLAYER_PED_ID(), TRUE, TRUE, TRUE, TRUE, TRUE) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(PLAYER_PED_ID()) CLEAR_ENTITY_LAST_WEAPON_DAMAGE(PLAYER_PED_ID()) ENDIF SET_MAX_WANTED_LEVEL(0) IF IS_PLAYER_PLAYING(PLAYER_ID()) AND NOT IS_PLAYER_DEAD(PLAYER_ID()) #IF IS_DEBUG_BUILD SK_PRINT("Wanted level cleared ") #ENDIF CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) ENDIF ELSE IF NOT IS_PED_DEAD_OR_DYING(PLAYER_PED_ID()) SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE) IF NOT NETWORK_IS_GAME_IN_PROGRESS() SET_PED_CAN_BE_SHOT_IN_VEHICLE(PLAYER_PED_ID(), TRUE) // this command is SP only ENDIF SET_ENTITY_CAN_BE_DAMAGED(PLAYER_PED_ID(), TRUE) SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE) ENDIF SET_MAX_WANTED_LEVEL(5) 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() // CLEAR_ADDITIONAL_TEXT(MISSION_DIALOGUE_TEXT_SLOT,TRUE) SERVICES_TOGGLE(TRUE) SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(TRUE) SET_VEHICLE_MODEL_IS_SUPPRESSED(mCarRoco.Mod, FALSE) SET_VEHICLE_MODEL_IS_SUPPRESSED(mPlayerCar.Mod, FALSE) SET_PED_MODEL_IS_SUPPRESSED(mGunMan.Mod, FALSE) SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) IF IS_AUDIO_SCENE_ACTIVE("SOL_2_CAR_CHASE") STOP_AUDIO_SCENE("SOL_2_CAR_CHASE") ENDIF KILL_CHASE_HINT_CAM(localChaseHintCamStruct) // IF NOT IS_AUDIO_SCENE_ACTIVE("SOL_2_FOCUS_CAM") // START_AUDIO_SCENE("SOL_2_FOCUS_CAM") // ENDIF SET_INTERIOR_DISABLED( INTERIOR_V_58_SOL_OFFICE, TRUE) IF IS_REPEAT_PLAY_ACTIVE() SUPPRESS_RESTRICTED_AREA_WANTED_LEVEL(AC_MOVIE_STUDIO, FALSE) ENDIF TOGGLE_PLAYER_SAFE_FOR_CAMERA_CUT(FALSE) CLEANUP(FALSE) TERMINATE_THIS_THREAD() ENDPROC //*************************************** // :MISSION FLOW FUNC: //*************************************** //PURPOSE: Advances or reverses the mission stage PROC NEXT_STAGE( BOOL bReverse = FALSE) MONITER_UNLOAD_ASSETS(eMissionState) 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 bObjectiveShown = FALSE 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() CLEAR_PRINTS() KILL_ANY_CONVERSATION() Mission_Flow_Mission_Passed() Script_Cleanup() ENDPROC // ----------------------------------------------------------------------------------------------------------- // Script Fail // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Checks to see if the player fail reason needs updating /// Ranked in order of importance with most important at the top PROC UPDATE_FAIL() ENDPROC //PROC SET_FAIL_WARP() // MISSION_FLOW_SET_FAIL_WARP_LOCATION(<< 758.9492, -973.7745, 24.3280 >>, 179.8099) // SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<< 758.9210, -977.2075, 24.3189 >>, 282.4565) //ENDPROC /// PURPOSE: /// Waits for the screen to fade out then updates failed reason PROC FAILED_WAIT_FOR_FADE() SWITCH eState CASE SS_INIT IF bFailConvSet IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() bFailConvSet = FALSE ENDIF ELSE CLEAR_PRINTS() CLEAR_HELP() REMOVE_BLIPS() IF NOT IS_STRING_NULL_OR_EMPTY(sFailReason) MISSION_FLOW_MISSION_FAILED_WITH_REASON(sFailReason) ELSE MISSION_FLOW_MISSION_FAILED() ENDIF eState = SS_ACTIVE ENDIF 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) // DELETE_ALL() Script_Cleanup() ELSE // 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 bObjectiveShown = FALSE eState = SS_INIT IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) VECTOR vPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) // get out of vehicle SET_ENTITY_COORDS(PLAYER_PED_ID(), vPos) ENDIF ENDIF ENDIF CLEANUP() //delete everything ENDPROC /// PURPOSE: /// Fills an new MYPED /// PARAMS: /// pos - position the ped is spawned at /// dir - the heading it faces /// mod - the model used to create it /// RETURNS: /// a newly initialised MYPED FUNC MYPED FILL_PED(VECTOR pos, FLOAT dir, MODEL_NAMES mod) MYPED mTempPed mTempPed.vPos = pos mTempPed.fDir = dir mTempPed.Mod = mod RETURN mTempPed ENDFUNC /// PURPOSE: /// Fills a new MYVEHICLE /// PARAMS: /// pos - the position the vehicle is spawned at /// dir - the heading it faces /// mod - the model used to create it /// RETURNS: /// A newly initialised MYVEHICLE FUNC MYVEHICLE FILL_VEHICLE(VECTOR pos, FLOAT dir, MODEL_NAMES mod) MYVEHICLE mTempVeh mTempVeh.vPos = pos mTempVeh.fDir = dir mTempVeh.Mod = mod RETURN mTempVeh ENDFUNC /// PURPOSE: /// Fills a new MYOBJECT /// PARAMS: /// pos - the position the object is spawned at /// rot - the rotation the object is spawned with /// mod - the model used to create the object /// RETURNS: /// A newly initialised MYOBJECT FUNC MYOBJECT FILL_OBJECT(VECTOR pos, VECTOR rot, MODEL_NAMES mod) MYOBJECT mTempObj mTempObj.vPos = pos mTempObj.vRot = rot mTempObj.Mod = mod RETURN mTempObj ENDFUNC /// PURPOSE: /// Adds points to a poly /// PARAMS: /// polys - The points to be added to the poly /// count - the number of points to be added to the poly PROC POPULATE_POLY_CHECKS(VECTOR &polys[], INT count = MAX_POLY_TEST_VERTS) OPEN_TEST_POLY(mAreaCheck1) INT i FOR i = 0 TO (count-1) ADD_TEST_POLY_VERT(mAreaCheck1, polys[i]) ENDFOR CLOSE_TEST_POLY(mAreaCheck1) COPY_EXPANDED_POLY(mAreaCheck2, mAreaCheck1, 50) ENDPROC /// PURPOSE: /// Creates a poly check area using a local array PROC CREATE_POLY_CHECKS() VECTOR polys[MAX_POLY_TEST_VERTS] polys[0] = << -1063.24060, -473.99036, 37.17500 >> polys[1] = << -1022.24738, -548.65704, 35.35321 >> polys[2] = << -1174.41553, -628.83820, 22.34404 >> polys[3] = << -1241.92639, -550.53107, 28.28967 >> POPULATE_POLY_CHECKS(polys, 4) ENDPROC /// PURPOSE: /// Fill in a new dialogue holder /// PARAMS: /// sConv - the coversation lable to store in this holder /// iExpireBit - the bit that will be used to expire the conversation /// RETURNS: /// a newly initialised DIALOGUE_HOLDER FUNC DIALOGUE_HOLDER FILL_DIALOGUE(STRING sConv, INT iExpireBit) DIALOGUE_HOLDER TempDial TempDial.sConv = sConv TempDial.iExpireBit = iExpireBit RETURN TempDial ENDFUNC PROC POPULATE_VEHICLES() mCarRoco = FILL_VEHICLE(<<-1041.64, -545.08, 34.81>>, 116.57, FUGITIVE) mPlayerCar = FILL_VEHICLE(<<-1046.1864, -554.2908, 33.4636>>, 101.5845, BALLER2) ENDPROC PROC POPULATE_PEDS() mRocco = FILL_PED(<<-1032.97, -544.14, 35.30>>, -103.17, IG_ROCCOPELOSI) mGunMan = FILL_PED(<<-1031.72, -543.42, 35.26>>, 110.43, U_M_Y_GUIDO_01) //G_M_Y_AZTECA_01 U_M_Y_GUIDO_01 ENDPROC /// PURPOSE: /// Initialises all variables and structs PROC POPULATE_STUFF() POPULATE_VEHICLES() POPULATE_PEDS() CREATE_POLY_CHECKS() ADD_CONTACT_TO_PHONEBOOK (CHAR_SOLOMON, MICHAEL_BOOK) ENDPROC /// PURPOSE: /// Sets the Game world time after a replay/shit skip PROC SET_TIME_FOR_REPLAY() IF g_bShitskipAccepted ELSE ENDIF 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" s_skip_menu[1].sTxtLabel = "MS_CHASE" s_skip_menu[2].sTxtLabel = "MS_PHONE_CALL" s_skip_menu[3].sTxtLabel = "MS_LEAVE_AREA" s_skip_menu[4].sTxtLabel = "MS_RETURN_TO_STUDIO" s_skip_menu[5].sTxtLabel = "MS_OUTRO" #ENDIF // ADD_RELATIONSHIP_GROUP("MYFRIEND", HASH_FRIENDS) SERVICES_TOGGLE(FALSE) IF IS_REPLAY_IN_PROGRESS() iReplayStage = GET_REPLAY_MID_MISSION_STAGE() IF g_bShitskipAccepted = TRUE iReplayStage++ // player is skipping this stage ENDIF SWITCH iReplayStage CASE 0 JUMP_TO_STAGE(MS_CHASE) BREAK CASE CP_KILLEDROCO JUMP_TO_STAGE(MS_PHONE_CALL) BREAK CASE 3 JUMP_TO_STAGE(MS_OUTRO) BREAK ENDSWITCH ELSE IF IS_REPEAT_PLAY_ACTIVE() SET_PED_POS(PLAYER_PED_ID(), <<-1036.3180, -546.2224, 34.0824>>, 103.5358) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() WAIT_FOR_WORLD_TO_LOAD( <<-1036.3180, -546.2224, 34.1445>>, 75) SUPPRESS_RESTRICTED_AREA_WANTED_LEVEL(AC_MOVIE_STUDIO, TRUE) bJumpSkip = TRUE 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 MONITOR_ROCCO_SPEED() IF eRocoState > RS_GO_TO_GATE AND eRocoState <> RS_FLEE_ON_FOOT AND eRocoState <> RS_DRIVING_DOWN_PEIR IF IS_VEHICLE_OK(mCarRoco.id) IF NOT bRocoSpeadUp IF IS_ENTITY_IN_RANGE_ENTITY(mRocco.id, PLAYER_PED_ID(), 120) TASK_VEHICLE_MISSION_PED_TARGET(mRocco.id, mCarRoco.id, PLAYER_PED_ID(), MISSION_FLEE, 50, DRIVINGMODE_AVOIDCARS_RECKLESS|DF_UseStringPullingAtJunctions, 200, 2) bRocoSpeadUp = TRUE ENDIF ELSE IF NOT IS_ENTITY_IN_RANGE_ENTITY(mRocco.id, PLAYER_PED_ID(), 145) TASK_VEHICLE_MISSION_PED_TARGET(mRocco.id, mCarRoco.id, PLAYER_PED_ID(), MISSION_FLEE, 35, DRIVINGMODE_AVOIDCARS_RECKLESS|DF_UseStringPullingAtJunctions, 200, 2) bRocoSpeadUp = FALSE ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks to see if the mRoutedVehicle car has burst tyres /// RETURNS: /// TRUE if the mRoutedVehicle car has burst tyres. FUNC BOOL HAS_PLAYER_BURST_ROCCO_TYRES() INT i INT iDamagedTyres = 0 FOR i = (ENUM_TO_INT(SC_WHEEL_CAR_FRONT_LEFT)) TO (ENUM_TO_INT(SC_WHEEL_CAR_REAR_RIGHT)) IF IS_VEHICLE_TYRE_BURST(mCarRoco.id, INT_TO_ENUM(SC_WHEEL_LIST, i)) iDamagedTyres++ ENDIF ENDFOR IF iDamagedTyres >= 2 CPRINTLN(DEBUG_MISSION, "ROCCO vehicle damaged out tryes: ", iDamagedTyres) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Monitors the hunters car for damage and plays hunter dialogue if appropriate. FUNC BOOL MONITER_PLAYER_DAMAGING_ROCCO_CAR() IF IS_VEHICLE_OK(mCarRoco.id) AND IS_PED_UNINJURED(PLAYER_PED_ID()) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mCarRoco.id, PLAYER_PED_ID()) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(mCarRoco.id) IF HAS_PLAYER_BURST_ROCCO_TYRES() OR GET_ENTITY_HEALTH(mCarRoco.id) < 450.0 OR GET_VEHICLE_ENGINE_HEALTH(mCarRoco.id) < 450.0 OR GET_VEHICLE_PETROL_TANK_HEALTH(mCarRoco.id) < 450.0 OR IS_VEHICLE_STUCK_TIMER_UP(mCarRoco.id, VEH_STUCK_ON_ROOF, ROOF_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(mCarRoco.id, VEH_STUCK_JAMMED, ROOF_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(mCarRoco.id, VEH_STUCK_HUNG_UP, ROOF_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(mCarRoco.id, VEH_STUCK_ON_SIDE, ROOF_TIME) CPRINTLN(DEBUG_MISSION, "ROCCO vehicle damaged out values to follow: ") CPRINTLN(DEBUG_MISSION, "vehicle damaged out Health: ", GET_ENTITY_HEALTH(mCarRoco.id)) CPRINTLN(DEBUG_MISSION, "vehicle damaged out Engine: ", GET_VEHICLE_ENGINE_HEALTH(mCarRoco.id)) CPRINTLN(DEBUG_MISSION, "vehicle damaged out Tank: ", GET_VEHICLE_PETROL_TANK_HEALTH(mCarRoco.id)) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC PROC MONITOR_DAMAGE() IF IS_VEHICLE_OK(mCarRoco.id) IF MONITER_PLAYER_DAMAGING_ROCCO_CAR() GIVE_PED_FLEE_ORDER(mRocco.id) eRocoState = RS_FLEE_ON_FOOT ENDIF ELSE GIVE_PED_FLEE_ORDER(mRocco.id) eRocoState = RS_FLEE_ON_FOOT ENDIF ENDPROC PROC MONITOR_ROCCO_BLIP() IF IS_VEHICLE_OK(mCarRoco.id) IF IS_PED_IN_VEHICLE(mRocco.id, mCarRoco.id, TRUE) IF DOES_BLIP_EXIST(mRocco.blip) IF NOT bRoccoBlipedInVehicle SAFE_REMOVE_BLIP(mRocco.blip) ENDIF ELSE IF NOT bRoccoBlipedInVehicle ADD_SAFE_BLIP_TO_VEHICLE(mRocco.blip, mCarRoco.id) bRoccoBlipedInVehicle = TRUE ENDIF ENDIF ELSE IF DOES_BLIP_EXIST(mRocco.blip) IF bRoccoBlipedInVehicle SAFE_REMOVE_BLIP(mRocco.blip) bRoccoBlipedInVehicle = FALSE ENDIF ELSE ADD_SAFE_BLIP_TO_PED(mRocco.blip, mRocco.id) ENDIF ENDIF ELSE IF DOES_BLIP_EXIST(mRocco.blip) IF bRoccoBlipedInVehicle SAFE_REMOVE_BLIP(mRocco.blip) bRoccoBlipedInVehicle = FALSE ENDIF ELSE ADD_SAFE_BLIP_TO_PED(mRocco.blip, mRocco.id) ENDIF ENDIF ENDPROC PROC MONITOR_ROCCO_ENTER_PEIR() IF eRocoState <> RS_DRIVING_DOWN_PEIR IF IS_ENTITY_IN_ANGLED_AREA(mRocco.id, <<-1737.93518, -1125.93896, 12.01733>>, <<-1751.79639, -1114.70862, 16.01720>>, 8.77) IF IS_VEHICLE_OK(mCarRoco.id) TASK_VEHICLE_MISSION_COORS_TARGET(mRocco.id, mCarRoco.id, <<-1844.91626, -1224.45081, 12.01705>>, MISSION_GOTO, 50, DRIVINGMODE_AVOIDCARS|DF_UseSwitchedOffNodes, 5, 2) eRocoState = RS_DRIVING_DOWN_PEIR ENDIF ENDIF ENDIF ENDPROC PROC ROCO_STATE() IF IS_PED_UNINJURED(mRocco.id) MONITOR_ROCCO_BLIP() MONITOR_ROCCO_ENTER_PEIR() MONITOR_ROCCO_SPEED() SWITCH eRocoState CASE RS_BURNOUT IF (GET_GAME_TIMER() - iMissionTimer) > 250 IF IS_VEHICLE_OK(mCarRoco.id) SET_VEHICLE_BURNOUT(mCarRoco.id, FALSE) ENDIF iMissionTimer = -1 eRocoState = RS_BURNOUT_GOTO ENDIF BREAK CASE RS_BURNOUT_GOTO IF IS_VEHICLE_OK(mCarRoco.id) IF IS_PED_IN_VEHICLE(mRocco.id, mCarRoco.id) IF IS_ENTITY_IN_RANGE_COORDS(mRocco.id, <<-1106.3654, -579.0142, 31.1366>>, 8) //TASK_VEHICLE_DRIVE_TO_COORD(mRocco.id, mCarRoco.id, <<-1216.03638, -579.46979, 26.22016>>, 15, DRIVINGSTYLE_ACCURATE, DUMMY_MODEL_FOR_SCRIPT, DF_UseStringPullingAtJunctions|DF_UseSwitchedOffNodes, 5, 0.5) GIVE_WAYPOINT_TASK(mRocco.id, "Sol1Roco1", 0, EWAYPOINT_START_FROM_CLOSEST_POINT|EWAYPOINT_USE_TIGHTER_TURN_SETTINGS) //VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED() eRocoState = RS_GO_TO_GATE ENDIF ELSE REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) GIVE_PED_FLEE_ORDER(mRocco.id) // IF DOES_BLIP_EXIST(mRocco.blip) // SET_BLIP_SCALE(mRocco.blip, BLIP_SIZE_PED) // ENDIF eRocoState = RS_FLEE_ON_FOOT ENDIF ENDIF BREAK CASE RS_GO_TO_GATE IF IS_VEHICLE_OK(mCarRoco.id) IF IS_PED_IN_VEHICLE(mRocco.id, mCarRoco.id) // IF IS_ENTITY_IN_RANGE_COORDS(mRocco.id, <<-1216.03638, -579.46979, 26.22016>>, 6) IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(mCarRoco.id) IF GET_VEHICLE_WAYPOINT_PROGRESS(mCarRoco.id) > 54 // TASK_VEHICLE_MISSION_PED_TARGET(mRocco.id, mCarRoco.id, PLAYER_PED_ID(), MISSION_FLEE, 35, DRIVINGMODE_AVOIDCARS_RECKLESS|DF_UseStringPullingAtJunctions, 550, 2) SET_VEHICLE_TYRES_CAN_BURST(mCarRoco.id, TRUE) eRocoState = RS_FLEE_IN_CAR ENDIF ENDIF ELSE GIVE_PED_FLEE_ORDER(mRocco.id) // IF DOES_BLIP_EXIST(mRocco.blip) // SET_BLIP_SCALE(mRocco.blip, BLIP_SIZE_PED) // ENDIF eRocoState = RS_FLEE_ON_FOOT ENDIF ENDIF BREAK CASE RS_FLEE_IN_CAR MONITOR_DAMAGE() IF IS_VEHICLE_OK(mCarRoco.id) IF NOT IS_PED_IN_VEHICLE(mRocco.id, mCarRoco.id) OR IS_ENTITY_UPSIDEDOWN(mCarRoco.id) REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) GIVE_PED_FLEE_ORDER(mRocco.id) // IF DOES_BLIP_EXIST(mRocco.blip) // SET_BLIP_SCALE(mRocco.blip, BLIP_SIZE_PED) // ENDIF // eRocoState = RS_FLEE_ON_FOOT ENDIF ELSE GIVE_PED_FLEE_ORDER(mRocco.id) // IF DOES_BLIP_EXIST(mRocco.blip) // SET_BLIP_SCALE(mRocco.blip, BLIP_SIZE_PED) // ENDIF eRocoState = RS_FLEE_ON_FOOT ENDIF BREAK CASE RS_FLEE_ON_FOOT IF IS_PED_IN_ANY_VEHICLE(mRocco.id) AND NOT IsPedPerformingTask(mRocco.id, SCRIPT_TASK_LEAVE_ANY_VEHICLE) TASK_LEAVE_ANY_VEHICLE(mRocco.id) ELSE GIVE_PED_FLEE_ORDER(mRocco.id, FALSE) ENDIF BREAK CASE RS_FIGHT BREAK CASE RS_DRIVING_DOWN_PEIR IF IS_ENTITY_IN_RANGE_COORDS(mRocco.id, <<-1844.91626, -1224.45081, 12.01705>>, 6) GIVE_PED_FLEE_ORDER(mRocco.id) // IF DOES_BLIP_EXIST(mRocco.blip) // SET_BLIP_SCALE(mRocco.blip, BLIP_SIZE_PED) // ENDIF eRocoState = RS_FLEE_ON_FOOT ENDIF BREAK ENDSWITCH IF eRocoState <> RS_FLEE_ON_FOOT IF IS_PED_BEING_JACKED(mRocco.id) GIVE_PED_FLEE_ORDER(mRocco.id) // IF DOES_BLIP_EXIST(mRocco.blip) // SET_BLIP_SCALE(mRocco.blip, BLIP_SIZE_PED) // ENDIF eRocoState = RS_FLEE_ON_FOOT ENDIF ENDIF ELSE IF IS_PED_UNINJURED(mGunMan.id) AND DOES_ENTITY_EXIST(mRocco.id) IF IS_ENTITY_IN_RANGE_ENTITY(mRocco.id, mGunMan.id, 10) AND IS_ENTITY_IN_RANGE_ENTITY(mGunMan.id, PLAYER_PED_ID(), 10) ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(s_conversation_peds, sTextBlock, "SOL2_GRK", CONV_PRIORITY_MEDIUM) ENDIF ENDIF SAFE_REMOVE_BLIP(mRocco.blip) SAFE_RELEASE_PED(mRocco.id) ENDIF ENDPROC /// PURPOSE: /// State for the mocap at the safe PROC MOCAP_INTRO() IF eState = SS_ACTIVE IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() AND bLoadingFinCutscene AND NOT bJumpSkip #IF IS_DEBUG_BUILD SK_PRINT_INT("Player skiped cutscene at time = ", GET_CUTSCENE_TIME()) #ENDIF // eState = SS_SKIPPED ENDIF ENDIF //Load everything for the next stage while the cutscene is playing IF NOT bLoadingFinCutscene SET_CUTSCENE_CAN_BE_SKIPPED(FALSE) IF SETUP_MISSION_STAGE(MS_INTRO, bJumpSkip) SET_CUTSCENE_CAN_BE_SKIPPED(TRUE) bLoadingFinCutscene = TRUE //loading done ENDIF ENDIF ROCO_STATE() SWITCH eState CASE SS_INIT IF NOT bJumpSkip SAFE_REMOVE_BLIP(biBlip) 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() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) ENDIF IF RC_IS_CUTSCENE_OK_TO_START() #IF IS_DEBUG_BUILD SK_PRINT("RC_IS_CUTSCENE_OK_TO_START()") #ENDIF IF IS_PED_UNINJURED(piSolomon) AND IS_VEHICLE_OK(mCarRoco.id) AND IS_PED_UNINJURED(mRocco.id) AND IS_PED_UNINJURED(mGunMan.id) REGISTER_ENTITY_FOR_CUTSCENE(piSolomon, "Soloman", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, CS_SOLOMON) REGISTER_ENTITY_FOR_CUTSCENE(mCarRoco.id, "getaway_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) REGISTER_ENTITY_FOR_CUTSCENE(mRocco.id, "Rocco", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) REGISTER_ENTITY_FOR_CUTSCENE(mGunMan.id, "Rocco_Goon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF // IF IS_REPEAT_PLAY_ACTIVE() // SAFE_FADE_SCREEN_IN_FROM_BLACK() // ENDIF START_CUTSCENE() REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_TheBalladOfRocco") REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) WAIT(0) STOP_GAMEPLAY_HINT(TRUE) sbiMovieSetScenarioBlocker = ADD_SCENARIO_BLOCKING_AREA_FROM_POSITION_AND_RADIUS(<<-1176.52490, -550.91449, 27.73062>>, 15) CLEAR_AREA_OF_PEDS(<<-1176.52490, -550.91449, 27.73062>>, 9.22) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1026.33521, -539.10645, 100.62094>>, <<-1143.49854, -596.59631, 20.25008>>, 36.78, <<-1050.4880, -511.0545, 35.0386>>, 159.3100 , GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1164.44482, -542.15021, 100.08894>>, <<-1214.17761, -581.91797, 22.32694>>, 83.46, <<-1050.4880, -511.0545, 35.0386>>, 159.3100 , GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<-1050.4880, -511.0545, 35.0386>>, 159.3100) 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 ENDIF BREAK CASE SS_ACTIVE IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") #IF IS_DEBUG_BUILD SK_PRINT("CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(Michael)") #ENDIF SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1, "DEFAULT_ACTION") FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_RUN, FALSE, FAUS_CUTSCENE_EXIT, TRUE) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_RUN) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Rocco") IF IS_PED_UNINJURED(mRocco.id) AND IS_VEHICLE_OK(mCarRoco.id) SET_PED_INTO_VEHICLE(mRocco.id, mCarRoco.id) #IF IS_DEBUG_BUILD SK_PRINT("CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(Rocco)") #ENDIF FORCE_PED_AI_AND_ANIMATION_UPDATE(mRocco.id) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Rocco_Goon") IF IS_PED_UNINJURED(mGunMan.id) AND IS_VEHICLE_OK(mCarRoco.id) SET_PED_INTO_VEHICLE(mGunMan.id, mCarRoco.id, VS_FRONT_RIGHT) #IF IS_DEBUG_BUILD SK_PRINT("CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(Rocco_Goon)") #ENDIF FORCE_PED_AI_AND_ANIMATION_UPDATE(mGunMan.id) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("getaway_car") IF IS_VEHICLE_OK(mCarRoco.id) IF NOT WAS_CUTSCENE_SKIPPED() #IF IS_DEBUG_BUILD SK_PRINT("CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(getaway_car)") #ENDIF TELL_ROCO_BURNOUT() ELSE // B*1689771 - removed IF NOT IS_SCREEN_FADED_OUT() check as screen might not be fully faded out so this wasn't getting set. #IF IS_DEBUG_BUILD SK_PRINT("skipped cutscene rocco car warp exit state") #ENDIF SET_ENTITY_COORDS(mCarRoco.id, <<-1106.3654, -579.0142, 31.1366>>, TRUE, TRUE) SET_ENTITY_HEADING(mCarRoco.id, 114.9979) eRocoState = RS_BURNOUT_GOTO ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() // SET_GAMEPLAY_CAM_RELATIVE_HEADING(7.3137) // SET_GAMEPLAY_CAM_RELATIVE_PITCH(-4.2223) ENDIF IF NOT IS_CUTSCENE_PLAYING() AND bLoadingFinCutscene eState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP bLoadingFinCutscene = FALSE RC_END_CUTSCENE_MODE() IF IS_PED_UNINJURED(piSolomon) SET_PED_MOVEMENT_CLIPSET(piSolomon, "move_injured_generic") TASK_FOLLOW_NAV_MESH_TO_COORD(piSolomon, vDropOffLoc, 0.2, 60000) ENDIF REPLAY_STOP_EVENT() NEXT_STAGE() //advance stage #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP MOCAP_INTRO") #ENDIF BREAK CASE SS_SKIPPED #IF IS_DEBUG_BUILD SK_PRINT("SS_SKIPPED MOCAP_INTRO") #ENDIF IF IS_PED_UNINJURED(mRocco.id) AND IS_VEHICLE_OK(mCarRoco.id) IF NOT IS_PED_IN_VEHICLE(mRocco.id, mCarRoco.id) SET_PED_INTO_VEHICLE(mRocco.id, mCarRoco.id) FORCE_PED_AI_AND_ANIMATION_UPDATE(mRocco.id) ENDIF ENDIF IF IS_PED_UNINJURED(mGunMan.id) AND IS_VEHICLE_OK(mCarRoco.id) IF NOT IS_PED_IN_VEHICLE(mGunMan.id, mCarRoco.id) SET_PED_INTO_VEHICLE(mGunMan.id, mCarRoco.id, VS_FRONT_RIGHT) FORCE_PED_AI_AND_ANIMATION_UPDATE(mGunMan.id) ENDIF ENDIF IF IS_VEHICLE_OK(mCarRoco.id) #IF IS_DEBUG_BUILD SK_PRINT("warp rocco") #ENDIF SET_ENTITY_COORDS(mCarRoco.id, <<-1106.3654, -579.0142, 31.1366>>, TRUE, TRUE) SET_ENTITY_HEADING(mCarRoco.id, 114.9979) eRocoState = RS_BURNOUT_GOTO ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() // SET_GAMEPLAY_CAM_RELATIVE_PITCH(-4.2781) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_RUN, FALSE, FAUS_CUTSCENE_EXIT ) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_RUN) eState = SS_CLEANUP BREAK ENDSWITCH ENDPROC PROC GUNMAN_STATE() IF IS_PED_UNINJURED(mGunMan.id) IF eMissionState = MS_PHONE_CALL IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mGunMan.id, 200) IF NOT IS_ENTITY_ON_SCREEN(mGunMan.id) SAFE_REMOVE_BLIP(mGunMan.blip) SAFE_RELEASE_PED(mGunMan.id) ENDIF ENDIF ENDIF IF eGunmanState <> GS_COMBAT_ONFOOT IF NOT IS_PED_IN_ANY_VEHICLE(mGunman.id) TASK_COMBAT_PED(mGunMan.id, PLAYER_PED_ID()) ADD_SAFE_BLIP_TO_PED(mGunMan.blip, mGunMan.id) eGunmanState = GS_COMBAT_ONFOOT ENDIF IF NOT IS_PED_UNINJURED(mRocco.id) TASK_COMBAT_PED(mGunMan.id, PLAYER_PED_ID()) ADD_SAFE_BLIP_TO_PED(mGunMan.blip, mGunMan.id) eGunmanState = GS_COMBAT_ONFOOT ELSE IF NOT IS_PED_IN_ANY_VEHICLE(mRocco.id) TASK_COMBAT_PED(mGunMan.id, PLAYER_PED_ID()) ADD_SAFE_BLIP_TO_PED(mGunMan.blip, mGunMan.id) eGunmanState = GS_COMBAT_ONFOOT ENDIF ENDIF ENDIF SWITCH eGunmanState CASE GS_PERFORMING_DRIVEBY IF NOT IsPedPerformingTask(mGunMan.id, SCRIPT_TASK_DRIVE_BY) eGunmanState = GS_WAITING ENDIF BREAK CASE GS_WAITING IF NOT bStartedDriveBys IF NOT IS_POINT_IN_POLY_2D(mAreaCheck1, GET_ENTITY_COORDS(PLAYER_PED_ID())) AND NOT IS_POINT_IN_POLY_2D(mAreaCheck1, GET_ENTITY_COORDS(mGunMan.id)) bStartedDriveBys = TRUE ENDIF ELSE IF IS_ENTITY_IN_RANGE_ENTITY(mGunMan.id, PLAYER_PED_ID(), 20) TASK_DRIVE_BY(mGunMan.id, PLAYER_PED_ID(), NULL, vSafeVec, 35, 65) ENDIF ENDIF BREAK CASE GS_COMBAT_ONFOOT IF NOT bExpireGunmanShout IF NOT IS_PED_IN_ANY_VEHICLE(mGunMan.id) DO_CONVO(mGunMan.id, bExpireGunmanShout, "SOL2_GSG", 20) ENDIF ENDIF BREAK ENDSWITCH ELSE IF NOT bKilledGunManConv DO_CONVO(NULL, bKilledGunManConv, "SOL2_MKT") IF IS_PED_UNINJURED(mRocco.id) AND DOES_ENTITY_EXIST(mGunMan.id) IF IS_ENTITY_IN_RANGE_ENTITY(mGunMan.id, mRocco.id, 10) AND IS_ENTITY_IN_RANGE_ENTITY(mRocco.id, PLAYER_PED_ID(), 10) ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(s_conversation_peds, sTextBlock, "SOL2_GGK", CONV_PRIORITY_MEDIUM) ENDIF ENDIF ENDIF SAFE_REMOVE_BLIP(mGunMan.blip) SAFE_RELEASE_PED(mGunMan.id) ENDIF ENDPROC PROC SETUP_DYNAMIC_MIXING() IF NOT IS_AUDIO_SCENE_ACTIVE("SOL_2_CAR_CHASE") IF eMissionState = MS_CHASE IF IS_VEHICLE_OK(mCarRoco.id) AND IS_PED_UNINJURED(mRocco.id) AND IS_PED_IN_VEHICLE(mRocco.id, mCarRoco.id) ADD_ENTITY_TO_AUDIO_MIX_GROUP(mCarRoco.id, "SOL_2_ROCCOS_CAR") START_AUDIO_SCENE("SOL_2_CAR_CHASE") ENDIF ENDIF ELSE IF IS_PED_UNINJURED(mRocco.id) IF IS_VEHICLE_OK(mCarRoco.id) IF NOT IS_PED_IN_ANY_VEHICLE(mRocco.id) REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(mCarRoco.id) ENDIF ENDIF ELSE IF iMissionTimer <> -1 IF (GET_GAME_TIMER() - iMissionTimer) > 2000 IF IS_VEHICLE_OK(mCarRoco.id) REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(mCarRoco.id) STOP_AUDIO_SCENE("SOL_2_CAR_CHASE") ENDIF ENDIF ELSE iMissionTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF IF NOT IS_AUDIO_SCENE_ACTIVE("SOL_2_FOCUS_CAM") IF IS_GAMEPLAY_HINT_ACTIVE() START_AUDIO_SCENE("SOL_2_FOCUS_CAM") ENDIF ELSE IF NOT IS_GAMEPLAY_HINT_ACTIVE() STOP_AUDIO_SCENE("SOL_2_FOCUS_CAM") ENDIF ENDIF // IF eMissionState = MS_CHASE // IF IS_AUDIO_SCENE_ACTIVE("SOL_2_CAR_CHASE") // IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) // IF IS_VEHICLE_OK(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) // ADD_ENTITY_TO_AUDIO_MIX_GROUP(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), "SOL_2_ROCCOS_CAR") // ENDIF // ELSE // IF IS_PED_UNINJURED(mRocco.id) // IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) // REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(GET_PLAYERS_LAST_VEHICLE()) // ENDIF // ELSE // REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(GET_PLAYERS_LAST_VEHICLE()) // ENDIF // ENDIF // ENDIF // ENDIF ENDPROC FUNC FLOAT GET_SAFE_DISTANCE_BETWEEN_SOL_PLAYER() IF IS_PED_UNINJURED(piSolomon) RETURN GET_DISTANCE_BETWEEN_ENTITIES(piSolomon, PLAYER_PED_ID()) ENDIF RETURN 50.0 ENDFUNC PROC MONITOR_CHASE_SPEECH() IF iDelayChaseSpeech != -1 IF GET_SAFE_DISTANCE_BETWEEN_SOL_PLAYER() > 20 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mRocco.id, 30) IF (GET_GAME_TIMER() - iDelayChaseSpeech) > 5000 IF GET_RANDOM_BOOL() IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, "SOL2_CHASE", CONV_PRIORITY_MEDIUM) iDelayChaseSpeech = -1 ENDIF ELSE IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, "SOL2_RGOA", CONV_PRIORITY_MEDIUM) iDelayChaseSpeech = -1 ENDIF ENDIF ENDIF ELIF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mRocco.id, 365.0) AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mRocco.id, 480.0) IF (GET_GAME_TIMER() - iDelayChaseSpeech) > 5000 IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, "SOL2_LOSE", CONV_PRIORITY_MEDIUM) iDelayChaseSpeech = -1 ENDIF ENDIF ELIF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mRocco.id, 260.0) AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mRocco.id, 365.0) AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mRocco.id, 480.0) IF (GET_GAME_TIMER() - iDelayChaseSpeech) > 12000 IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, "SOL2_MLC", CONV_PRIORITY_MEDIUM) iDelayChaseSpeech = -1 ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iDelayChaseSpeech = GET_GAME_TIMER() ENDIF ENDIF ENDPROC PROC MONITOR_CLEANUP_SOLOMON_AND_PLAYER_CAR() IF NOT bCleanedupSolomon IF IS_PED_UNINJURED(piSolomon) IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piSolomon, 100) bCleanedupSolomon = TRUE SAFE_DELETE_PED(piSolomon) ELSE IF NOT IS_PED_UNINJURED(mRocco.id) IF NOT IS_ENTITY_ON_SCREEN(piSolomon) bCleanedupSolomon = TRUE SAFE_DELETE_PED(piSolomon) ENDIF ELSE IF eState = SS_ACTIVE IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piSolomon, 15) IF iSolomonChatDelay = -1 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iSolomonChatDelay = GET_GAME_TIMER() ENDIF ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF (GET_GAME_TIMER() - iSolomonChatDelay) > 15000 AND NOT IS_MESSAGE_BEING_DISPLAYED() IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, "SOL2_GO", CONV_PRIORITY_MEDIUM) iSolomonChatDelay = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bCleanedupPlayerCar IF IS_VEHICLE_OK(mPlayerCar.id) IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mPlayerCar.id, 100) SAFE_DELETE_VEHICLE(mPlayerCar.id) ELSE IF NOT IS_VEHICLE_OK(mPlayerCar.id) SAFE_RELEASE_VEHICLE(mPlayerCar.id) ENDIF ENDIF ENDIF ENDIF ENDPROC PROC MONITOR_LOAD_OUTRO() IF eMissionState = MS_CHASE IF IS_POINT_IN_POLY_2D(mAreaCheck1, GET_ENTITY_COORDS(PLAYER_PED_ID())) REQUEST_CUTSCENE("sol_2_ext_concat") IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) SET_INTERIOR_DISABLED( INTERIOR_V_58_SOL_OFFICE, FALSE) ENDIF ELSE IF HAS_CUTSCENE_LOADED() REMOVE_CUTSCENE() SET_INTERIOR_DISABLED( INTERIOR_V_58_SOL_OFFICE, TRUE) ENDIF ENDIF ELSE IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vDropOffLoc, DEFAULT_CUTSCENE_LOAD_DIST) REQUEST_CUTSCENE("sol_2_ext_concat") IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) ENDIF ELIF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vDropOffLoc, (DEFAULT_CUTSCENE_UNLOAD_DIST)) IF HAS_CUTSCENE_LOADED() REMOVE_CUTSCENE() ENDIF ENDIF ENDIF ENDPROC PROC CHASE() SETUP_DYNAMIC_MIXING() SWITCH eState CASE SS_INIT IF SETUP_MISSION_STAGE(eMissionState, bJumpSkip) ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL") ADD_PED_FOR_DIALOGUE(s_conversation_peds, 5, piSolomon, "SOLOMON") // DO_CONVO_WITH_OBJ(NULL, bMikeShout, "STOPROCCO", "SOL2_KILL") DISABLE_TAXI_HAILING() #IF IS_DEBUG_BUILD SK_PRINT("INIT CHASE") #ENDIF IF IS_ENTITY_ALIVE(oiCone) SET_ENTITY_VISIBLE(oiCone, FALSE) SET_ENTITY_COLLISION(oiCone, FALSE) #IF IS_DEBUG_BUILD SK_PRINT("platform alive it shall be released") #ENDIF ELSE oiCone = GET_CLOSEST_OBJECT_OF_TYPE(<<-1172.76685, -555.19043, 27.75178 >>, 6, PROP_ROADCONE02A) //B*754248 ENDIF eGunmanState = GS_WAITING IF IS_REPLAY_IN_PROGRESS() TRIGGER_MUSIC_EVENT("SOL2_RESTART1") ELSE TRIGGER_MUSIC_EVENT("SOL2_START") ENDIF IF DO_CONVO(NULL, bMikeShout, "STOPROCCO") SETTIMERA(0) #IF IS_DEBUG_BUILD SK_PRINT("BMIKE SHOUT") #ENDIF CREATE_RELATIONSHIP_GROUP() SET_INSTANCE_PRIORITY_HINT( INSTANCE_HINT_DRIVING) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1, "DEFAULT_ACTION") CLEAR_HD_AREA() REPLAY_RECORD_BACK_FOR_TIME(1.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) eState = SS_ACTIVE ENDIF ENDIF BREAK CASE SS_ACTIVE SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) MONITOR_CLEANUP_SOLOMON_AND_PLAYER_CAR() ROCO_STATE() GUNMAN_STATE() MONITOR_LOAD_OUTRO() IF NOT bTriggeredVehicleMusic IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) TRIGGER_MUSIC_EVENT("SOL2_CAR") bTriggeredVehicleMusic = TRUE ENDIF ENDIF IF TIMERA() < 1250 SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_RUN) ELSE RESET_PLAYER_INPUT_GAIT(PLAYER_ID()) ENDIF IF NOT IS_PED_UNINJURED(mRocco.id) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) IF NOT bKilledRoccoConv IF DO_CONVO(NULL, bKilledRoccoConv, "SOL2_MKT") IF PREPARE_MUSIC_EVENT("SOL2_STOP") #IF IS_DEBUG_BUILD SK_PRINT("TRIGGER_MUSIC_EVENT(SOL2_STOP)") #ENDIF TRIGGER_MUSIC_EVENT("SOL2_STOP") ENDIF vPositionToLeave = GET_ENTITY_COORDS(PLAYER_PED_ID()) // IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_VEHICLE_OK(mCarRoco.id) IF DOES_ENTITY_EXIST(mRocco.id) IF IS_PED_IN_VEHICLE(mRocco.id, mCarRoco.id) START_VEHICLE_HORN(mCarRoco.id, 6000, HASH("HELDDOWN")) ENDIF ENDIF ENDIF // ENDIF SAFE_REMOVE_BLIP(mRocco.blip) ENDIF ENDIF IF NOT bTriggeredReplayRecord IF bKilledRoccoConv AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() REPLAY_RECORD_BACK_FOR_TIME(8.0, 5.0, REPLAY_IMPORTANCE_HIGHEST) bTriggeredReplayRecord = TRUE ENDIF ENDIF IF NOT IS_PED_UNINJURED(mGunman.id) AND bKilledGunManConv AND bKilledRoccoConv SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) eState = SS_CLEANUP ENDIF ELSE MONITOR_CHASE_SPEECH() UPDATE_CHASE_BLIP(mRocco.blip, mRocco.id, 550, 0.65) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT_OBJ("SOL2_KILL") ENDIF CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, mRocco.id ) ENDIF BREAK CASE SS_CLEANUP // B*1908366 - if we are heading to the cutscene, ensure we don't jump to the next stage instead IF iCutsceneDelay != -1 IF (GET_GAME_TIMER() - iCutsceneDelay) > 1000 eState = SS_INIT eMissionState = MS_OUTRO #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP CHASE - heading to MS_OUTRO") #ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP CHASE") #ENDIF IF PREPARE_MUSIC_EVENT("SOL2_STOP") #IF IS_DEBUG_BUILD SK_PRINT("TRIGGER_MUSIC_EVENT(SOL2_STOP)") #ENDIF TRIGGER_MUSIC_EVENT("SOL2_STOP") ENDIF SET_GPS_MULTI_ROUTE_RENDER(FALSE) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE, -1, "DEFAULT_ACTION") IF IS_POINT_IN_POLY_2D(mAreaCheck1, GET_ENTITY_COORDS(PLAYER_PED_ID())) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iCutsceneDelay = GET_GAME_TIMER() SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_REENABLE_CONTROL_ON_DEATH) SAFE_FADE_SCREEN_OUT_TO_BLACK() ENDIF ELSE NEXT_STAGE() ENDIF ENDIF BREAK CASE SS_SKIPPED // SET_PED_POS(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mStealCar.id, <<-5,0,0>>), 0) vPositionToLeave = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF IS_PED_UNINJURED(mRocco.id) EXPLODE_PED_HEAD(mRocco.id) ENDIF IF IS_PED_UNINJURED(mGunMan.id) EXPLODE_PED_HEAD(mGunMan.id) ENDIF SAFE_RELEASE_PED(mRocco.id) SAFE_REMOVE_BLIP(mRocco.blip) SAFE_REMOVE_BLIP(mGunMan.blip) SAFE_RELEASE_PED(mGunMan.id) RC_END_Z_SKIP() eState = SS_ACTIVE BREAK ENDSWITCH ENDPROC PROC LEAVE_AREA() SETUP_DYNAMIC_MIXING() 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() eState = SS_ACTIVE ENDIF BREAK CASE SS_ACTIVE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (GET_GAME_TIMER() - iMissionTimer) > 3000 PRINT_OBJ("SOL2_LEAVEA") ENDIF IF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vPositionToLeave, 60) eState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP LEAVE_AREA") #ENDIF NEXT_STAGE() BREAK CASE SS_SKIPPED RC_END_Z_SKIP() eState = SS_CLEANUP BREAK ENDSWITCH ENDPROC PROC PHONE_CALL_DECISION() SETUP_DYNAMIC_MIXING() SWITCH eState CASE SS_INIT SET_CHECKPOINT() IF SETUP_MISSION_STAGE(eMissionState, bJumpSkip) #IF IS_DEBUG_BUILD SK_PRINT("INIT STEAL_VAN") #ENDIF ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL") ADD_PED_FOR_DIALOGUE(s_conversation_peds, 5, NULL, "SOLOMON") eState = SS_ACTIVE ENDIF BREAK CASE SS_ACTIVE IF NOT bSolCallDone IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF iDelayCall != -1 IF (GET_GAME_TIMER() - iDelayCall) > 2000 IF PLAYER_CALL_CHAR_CELLPHONE_WITH_REPLIES(s_conversation_peds, CHAR_SOLOMON, sTextBlock, sInitialRoots, CONV_PRIORITY_MEDIUM, "SOL2_PHONE", sYesRoots, sNoRoots) bSolCallDone = TRUE ENDIF ENDIF ELSE iDelayCall = GET_GAME_TIMER() ENDIF ENDIF ELSE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() TEXT_LABEL_23 sRoot sRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT() IF ARE_STRINGS_EQUAL(sRoot, sYesRoots) eState = SS_CLEANUP // ELIF ARE_STRINGS_EQUAL(sRoot, sNoRoots) // REGISTER_TEXT_MESSAGE_FROM_CHARACTER_TO_PLAYER(CT_FLOW, BIT_MICHAEL, CHAR_SOLOMON, "SOL2_PASS", TXTMSG_UNLOCKED, TXTMSG_NOT_CRITICAL, 60000) // Script_Passed() ENDIF ELSE REGISTER_TEXT_MESSAGE_FROM_CHARACTER_TO_PLAYER(TEXT_SOL2_END, CT_FLOW, BIT_MICHAEL, CHAR_SOLOMON, 60000, 10000) Script_Passed() ENDIF ENDIF BREAK CASE SS_CLEANUP #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP STEAL_VAN") #ENDIF SAFE_REMOVE_BLIP(biBlip) NEXT_STAGE() BREAK CASE SS_SKIPPED RC_END_Z_SKIP() eState = SS_CLEANUP BREAK ENDSWITCH ENDPROC PROC MONITER_PLAYER_WANTED() SWITCH eCopMonitor CASE CM_MONITER IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 eCopMonitor = CM_INIT_WANTED ENDIF BREAK CASE CM_INIT_WANTED SAFE_REMOVE_BLIP(biBlip) // B*1911335 - needs custom route to navigate player inside the studio IF bIsCustomGPSRouteActive SET_GPS_MULTI_ROUTE_RENDER(FALSE) CLEAR_GPS_MULTI_ROUTE() bIsCustomGPSRouteActive = FALSE #IF IS_DEBUG_BUILD SK_PRINT(" bIsCustomGPSRouteActive cleaned up") #ENDIF ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CLEAR_PRINTS() PRINT_NOW("LOSE_WANTED", DEFAULT_GOD_TEXT_TIME, 0) eCopMonitor = CM_LOSING_WANTED ENDIF BREAK CASE CM_LOSING_WANTED IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 CLEAR_PRINTS() eCopMonitor = CM_MONITER ENDIF BREAK ENDSWITCH ENDPROC FUNC BOOL CAMERA_CUT_STATES() SWITCH eCamCut CASE CC_INIT TOGGLE_PLAYER_SAFE_FOR_CAMERA_CUT(TRUE) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(),PEDMOVE_WALK) TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(),<<-1011.15521, -479.77164, 38.97575>>,PEDMOVE_WALK,DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_FINAL_HEADING, 0.2) DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() CPRINTLN(DEBUG_MISSION,"eCamCut -> CC_START") eCamCut = CC_START BREAK // B*2050595 - need to cut to scripted cam 1 frame after first call to DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() CASE CC_START camMain = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED,<<-1017.0,-483.5,40.7>>,<<49.6,-0,-78.9>>,50) SHAKE_CAM(camMain,"hand_shake",0.5) SET_CAM_ACTIVE(camMain,TRUE) RENDER_SCRIPT_CAMS(TRUE, TRUE, 3500, TRUE, TRUE) iMissionTimer = GET_GAME_TIMER() CPRINTLN(DEBUG_MISSION,"eCamCut -> CC_WAIT") eCamCut = CC_WAIT BREAK CASE CC_WAIT SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(),PEDMOVE_WALK) IF (GET_GAME_TIMER() - iMissionTimer) > 4000 CPRINTLN(DEBUG_MISSION,"eCamCut -> CC_END") eCamCut = CC_END ENDIF BREAK CASE CC_END CPRINTLN(DEBUG_MISSION,"eCamCut = CC_END RETURN TRUE") RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC RETURN_TO_STUDIO() SETUP_DYNAMIC_MIXING() SWITCH eState CASE SS_INIT IF SETUP_MISSION_STAGE(eMissionState, bJumpSkip) #IF IS_DEBUG_BUILD SK_PRINT("INIT RETURN_TO_STUDIO") #ENDIF DISABLE_TAXI_HAILING(FALSE) SET_INTERIOR_DISABLED( INTERIOR_V_58_SOL_OFFICE, FALSE) SERVICES_TOGGLE(TRUE) eState = SS_ACTIVE ENDIF BREAK CASE SS_ACTIVE MONITER_PLAYER_WANTED() MONITOR_LOAD_OUTRO() IF eCopMonitor = CM_MONITER OR eCamCut != CC_INIT // if the camera cut has trigger we need to ensure it will complete // IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDropOffLoc, <>, FALSE) IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vDropOffLoc, LOCATE_SIZE_ON_FOOT_ONLY) OR eCamCut != CC_INIT // if the camera cut has trigger we need to ensure it will complete IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF STOP_MY_VEHICLE(5,6) IF CAMERA_CUT_STATES() eState = SS_CLEANUP ENDIF ENDIF ELSE IF CAMERA_CUT_STATES() eState = SS_CLEANUP ENDIF ENDIF ELSE IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDropOffLoc, <>, TRUE) ADD_BLIP_LOCATION(biBlip, vDropOffLoc, FALSE) // gps route handled below // B*1911335 - needs custom route to navigate player inside the studio IF bIsCustomGPSRouteActive = FALSE START_GPS_MULTI_ROUTE(HUD_COLOUR_YELLOW) ADD_POINT_TO_GPS_MULTI_ROUTE(vDropOffGPSLoc) SET_GPS_MULTI_ROUTE_RENDER(TRUE) #IF IS_DEBUG_BUILD SK_PRINT("bIsCustomGPSRouteActive set") #ENDIF bIsCustomGPSRouteActive = TRUE ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT_OBJ("SOL2_GOTOSTU") ENDIF ENDIF ENDIF BREAK CASE SS_CLEANUP #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP RETURN_TO_STUDIO") #ENDIF SAFE_REMOVE_BLIP(biBlip) // B*1911335 - needs custom route to navigate player inside the studio IF bIsCustomGPSRouteActive SET_GPS_MULTI_ROUTE_RENDER(FALSE) CLEAR_GPS_MULTI_ROUTE() bIsCustomGPSRouteActive = FALSE #IF IS_DEBUG_BUILD SK_PRINT(" bIsCustomGPSRouteActive cleaned up") #ENDIF ENDIF NEXT_STAGE() BREAK CASE SS_SKIPPED REQUEST_CUTSCENE("sol_2_ext_concat") WHILE NOT HAS_CUTSCENE_LOADED() WAIT(0) ENDWHILE SET_PED_POS(PLAYER_PED_ID(), vDropOffLoc, 0) eState = SS_ACTIVE RC_END_Z_SKIP() BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Checks whether the model is under an allowed size /// PARAMS: /// vAllowableSize - how large the vehicle is allowed to be /// bUseDefaultSize - just use the default size check? (ok for most average vehicles) /// RETURNS: /// TRUE if the vehicle is of allowable size. FALSE otherwise FUNC BOOL IS_PLAYER_VEHICLE_MODEL_UNDER_SIZE_LIMIT() IF NOT IS_VEHICLE_OK(mPlayerCar.id) RETURN FALSE ENDIF MODEL_NAMES eMod = GET_ENTITY_MODEL(mPlayerCar.id) IF eMod = DUMMY_MODEL_FOR_SCRIPT RETURN FALSE // no vehicle available ENDIF VECTOR vVehicleSizeMin, vVehicleSizeMax VECTOR vAllowableSize = GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR() GET_MODEL_DIMENSIONS(eMod, vVehicleSizeMin, vVehicleSizeMax) IF vVehicleSizeMax.x - vVehicleSizeMin.x > vAllowableSize.x RETURN FALSE // vehicle too large ELIF vVehicleSizeMax.y - vVehicleSizeMin.y > vAllowableSize.y RETURN FALSE // vehicle too large ELIF vVehicleSizeMax.z - vVehicleSizeMin.z > vAllowableSize.z RETURN FALSE // vehicle too large ENDIF RETURN TRUE // vehicle is under the size limit ENDFUNC PROC MOCAP_OUTRO() IF eState = SS_ACTIVE IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() AND bLoadingFinCutscene AND NOT bJumpSkip eState = SS_SKIPPED ENDIF ENDIF //Load everything for the next stage while the cutscene is playing IF NOT bLoadingFinCutscene IF SETUP_MISSION_STAGE(MS_OUTRO, bJumpSkip) bLoadingFinCutscene = TRUE //loading done ENDIF ENDIF SWITCH eState CASE SS_INIT SAFE_REMOVE_BLIP(biBlip) // B*1911335 - needs custom route to navigate player inside the studio IF bIsCustomGPSRouteActive SET_GPS_MULTI_ROUTE_RENDER(FALSE) CLEAR_GPS_MULTI_ROUTE() bIsCustomGPSRouteActive = FALSE #IF IS_DEBUG_BUILD SK_PRINT(" bIsCustomGPSRouteActive cleaned up") #ENDIF ENDIF IF CAN_PLAYER_START_CUTSCENE(TRUE) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) ENDIF IF RC_IS_CUTSCENE_OK_TO_START() IF PREPARE_MUSIC_EVENT("SOL2_STOP") #IF IS_DEBUG_BUILD SK_PRINT("TRIGGER_MUSIC_EVENT(SOL2_STOP)") #ENDIF TRIGGER_MUSIC_EVENT("SOL2_STOP") ENDIF START_CUTSCENE() WAIT(0) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_TheBalladOfRocco") REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) SAFE_FADE_SCREEN_IN_FROM_BLACK(500) RENDER_SCRIPT_CAMS(FALSE, FALSE) mPlayerCar.id = GET_PLAYERS_LAST_VEHICLE() ADD_TO_CLOCK_TIME(2,0,0) IF IS_PLAYER_VEHICLE_MODEL_UNDER_SIZE_LIMIT() RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1009.55701, -483.55057, 45.05663>>, <<-1066.98389, -514.54846, 29.91063>>, 42.12, <<-1024.2708, -485.3149, 35.9804>>, 208.2410 , GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) ELSE RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-1009.55701, -483.55057, 45.05663>>, <<-1066.98389, -514.54846, 29.91063>>, 42.12, <<-1030.7389, -496.2591, 35.6675>>, 295.7484) ENDIF RC_START_CUTSCENE_MODE(vDropOffLoc) IF IS_SCREEN_FADED_OUT() IF NOT IS_SCREEN_FADING_IN() SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME,FALSE) ENDIF ENDIF #IF IS_DEBUG_BUILD SK_PRINT("INIT MOCAP_OUTRO") #ENDIF eState = SS_ACTIVE ENDIF ENDIF BREAK CASE SS_ACTIVE IF CAN_SET_EXIT_STATE_FOR_CAMERA() TOGGLE_PLAYER_SAFE_FOR_CAMERA_CUT(FALSE) // SET_GAMEPLAY_CAM_RELATIVE_HEADING() // SET_GAMEPLAY_CAM_RELATIVE_PITCH() ENDIF IF NOT IS_CUTSCENE_PLAYING() AND bLoadingFinCutscene eState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP REPLAY_STOP_EVENT() bLoadingFinCutscene = FALSE RC_END_CUTSCENE_MODE() Script_Passed() #IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP MOCAP_OUTRO") #ENDIF BREAK CASE SS_SKIPPED IF WAS_CUTSCENE_SKIPPED() SET_PED_POS(PLAYER_PED_ID(), <<-1017.7021, -484.0121, 36.0903>>, 114.1774) ENDIF eState = SS_ACTIVE // RC_END_Z_SKIP() 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() DELETE_ALL() WAIT_FOR_CUTSCENE_TO_STOP() CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_PED_POS(PLAYER_PED_ID(), <<-1017.7021, -484.0121, 36.0903>>, 114.1774) 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_ROCO_DISTANCE() IF IS_PED_UNINJURED(mRocco.id) IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mRocco.id, 550) MISSION_FAILED(FR_ROCO_ESCAPED) ENDIF ENDIF ENDPROC PROC CHECK_SOLOMON_ALIVE() IF NOT bCleanedupSolomon IF NOT IS_PED_UNINJURED(piSolomon) MISSION_FAILED(FR_SOLOMON_KILLED) ENDIF 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_ROCO_DISTANCE() CHECK_SOLOMON_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)) PRINTSTRING("FORCE CLEAN UP") PRINTNL() sFailReason = NULL // SET_FAIL_WARP() TRIGGER_MUSIC_EVENT("SOL2_FAIL") Mission_Flow_Mission_Force_Cleanup() Script_Cleanup() ENDIF #IF IS_DEBUG_BUILD SETUP_FOR_RAGE_WIDGETS() #ENDIF POPULATE_STUFF() IF IS_REPLAY_IN_PROGRESS() VECTOR pos FLOAT dir iReplayStage = GET_REPLAY_MID_MISSION_STAGE() IF g_bShitskipAccepted = TRUE iReplayStage++ // player is skipping this stage ENDIF SWITCH iReplayStage CASE 0 pos = <<-1038.9562, -547.5014, 34.0505>> dir = 125.2668 BREAK CASE CP_KILLEDROCO pos = <<-1198.9615, -597.6102, 25.9498>> dir = 138.1940 BREAK CASE 3 pos = <<-1017.7021, -484.0121, 36.0903>> dir = 114.1774 BREAK ENDSWITCH START_REPLAY_SETUP(pos, dir) ENDIF // Loop within here until the mission passes or fails WHILE(TRUE) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_TBOR") IF IS_PED_UNINJURED(PLAYER_PED_ID()) CHECK_FOR_FAIL() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH eMissionState CASE MS_SET_UP INITMISSION() BREAK CASE MS_INTRO MOCAP_INTRO() BREAK CASE MS_CHASE CHASE() BREAK CASE MS_LEAVE_AREA LEAVE_AREA() BREAK CASE MS_PHONE_CALL PHONE_CALL_DECISION() BREAK CASE MS_RETURN_TO_STUDIO RETURN_TO_STUDIO() BREAK CASE MS_OUTRO MOCAP_OUTRO() BREAK CASE MS_FAILED FAILED_WAIT_FOR_FADE() BREAK ENDSWITCH IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF NOT bVehStatsGrabbed VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vehTemp, SOL2_CAR_DAMAGE) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vehTemp, SOL2_MAX_SPEED) bVehStatsGrabbed = TRUE ENDIF ELSE IF bVehStatsGrabbed INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL, SOL2_CAR_DAMAGE) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL, SOL2_MAX_SPEED) bVehStatsGrabbed = FALSE ENDIF ENDIF IF NOT bPlayerStatsGrabbed IF IS_PLAYER_PLAYING(PLAYER_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), SOL2_DAMAGE) bPlayerStatsGrabbed = TRUE ENDIF ENDIF IF eMissionState <> MS_FAILED IF eMissionState >= MS_SET_UP AND NOT bJumpSkip ENDIF #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