//╒═════════════════════════════════════════════════════════════════════════════╕ //│ Author: Paul Davies Date: 15/09/2010 │ //╞═════════════════════════════════════════════════════════════════════════════╡ //│ │ //│ │ //│ FAMILY 2 │ //│ │ //│ │ //╘═════════════════════════════════════════════════════════════════════════════╛ //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 "commands_camera.sch" USING "commands_pad.sch" USING "commands_script.sch" USING "flow_public_core_override.sch" USING "script_blips.sch" USING "select_mission_stage.sch" USING "player_ped_public.sch" USING "dialogue_public.sch" USING "chase_hint_cam.sch" USING "commands_interiors.sch" USING "locates_public.sch" USING "replay_public.sch" USING "commands_cutscene.sch" USING "cutscene_public.sch" USING "mission_stat_public.sch" USING "CompletionPercentage_public.sch" USING "vehicle_gen_public.sch" USING "clearmissionarea.sch" USING "timeLapse.sch" USING "flow_public_game.sch" USING "buddy_head_track_public.sch" USING "player_ped_scenes.sch" USING "commands_recording.sch" USING "taxi_functions.sch" USING "push_in_public.sch" //╞═══════════╡ENUMS ╞═══════════════════════════════════════════════════════╡ CONST_INT NUM_OF_SELECTABLE_STAGES 11 CONST_FLOAT WARP_REFRESH_DISTANCE 400.0 //20 CONST_FLOAT WARP_ALLOWED_DISTANCE 225.0 //15 CONST_FLOAT MIN_DIST_BETWEEN_WARP_POINTS 100.0 // 10 CONST_FLOAT MIN_DIST_PLAYER_TO_WARP 225.0 // 15 CONST_INT MIN_TIME_OCCLUDED 1000 CONST_INT MIN_TIME_BETWEEN_WARPS 2000 ENUM MISSION_STAGE_FLAG stage_pre_intro = -1, stage_intro = 0, stage_drive_to_venice, stage_hire_bike, stage_bike_ride, stage_telltale, stage_go_to_yacht, stage_rescue, stage_speedophile_chase, stage_drive_to_beach, stage_finish, go_to_end, stage_lose_cops, stage_test ENDENUM MISSION_STAGE_FLAG current_mission_stage = stage_pre_intro MISSION_STAGE_FLAG mission_stages[NUM_OF_SELECTABLE_STAGES] MISSION_STAGE_FLAG eSavedStage ENUM CREATION_STATE ON_FOOT, IN_BIKE, IN_CAR, IN_Seashark ENDENUM ENUM VEH_TYPE BIKE = 0, JIMMY_BIKE, CAR, SEA_SHARK ENDENUM ENUM FAM2_CHASE_SECTION_ENUM FAM2_CHASE_OPEN_SEA = 0, FAM2_CHASE_TUNNELS, FAM2_CHASE_CANALS, FAM2_CHASE_CANALS_CATCH_UP, FAM2_CHASE_CANALS_SINGLE_CHASER, FAM2_CHASE_MARINA, FAM2_CHASE_LOSE_PEDS, FAM2_CHASE_SEEK_AND_DESTROY, FAM2_CHASE_INVALID ENDENUM FAM2_CHASE_SECTION_ENUM eCurrentChaseSection = FAM2_CHASE_OPEN_SEA FAM2_CHASE_SECTION_ENUM ePreviousChaseSection = FAM2_CHASE_OPEN_SEA FAM2_CHASE_SECTION_ENUM eHighestSection = FAM2_CHASE_OPEN_SEA INT iSectionsHit ENUM CANAL_SECTION FAM2_CS_BOTTOM = 0, FAM2_CS_TOP, FAM2_CS_LEFT, FAM2_CS_MIDDLE, FAM2_CS_RIGHT, FAM2_CS_NUMBER_OF_SECTIONS, FAM2_CS_INVALID ENDENUM CANAL_SECTION eCurrentCanalSection = FAM2_CS_BOTTOM CANAL_SECTION ePreviousCanalSection = FAM2_CS_INVALID #IF IS_DEBUG_BUILD INT iStageHolder MissionStageMenuTextStruct skipMenuOptions[NUM_OF_SELECTABLE_STAGES] MISSION_STAGE_FLAG selected_stage WIDGET_GROUP_ID parent_widget WIDGET_GROUP_ID chase_widget WIDGET_GROUP_ID wave_widget TEXT_WIDGET_ID twChaseSection TEXT_WIDGET_ID twCanalSection TEXT_WIDGET_ID twPrevCanalSection FLOAT fRecordingTime FLOAT fSectionTime FLOAT fSectionProgressTime FLOAT fSectionProgress INT iClosestPoint INT iBreak BOOL bRun BOOL bDebugMenuCutsceneSelection = FALSE #ENDIF REL_GROUP_HASH rgChasers structTimelapse sTimelapse //╞═════════╡CONSTANTS ╞═══════════════════════════════════════════════════════╡ CONST_FLOAT NUMBER_HEIGHT 2.0 CONST_FLOAT NUMBER_RATIO 0.4 CONST_FLOAT VARIABLE_PLAYBACK_DISTANCE 25.0 CONST_FLOAT SINCOS45 0.707106 CONST_INT MAX_BIKE_NODES 100 //╞═════════╡INDECES ╞═══════════════════════════════════════════════════════╡ PED_INDEX pedTracy PED_INDEX pedJimmy PED_INDEX pedBikeGuy PED_INDEX pedBoatDancer[4] VEHICLE_INDEX vehPlayerSeashark VEHICLE_INDEX vehPlayerBike VEHICLE_INDEX vehJimmyBike VEHICLE_INDEX vehPlayerCar VEHICLE_INDEX vehBikes[5] VEHICLE_INDEX vehTraceyCar VEHICLE_INDEX vehMikesCar VEHICLE_INDEX vehChasers[2] PED_INDEX pedChasers[2] BLIP_INDEX blipChasers[2] BLIP_INDEX blipDest BLIP_INDEX blipPornBoat BLIP_INDEX blipBuddy BLIP_INDEX blipPlayerVeh OBJECT_INDEX objMP3Dock OBJECT_INDEX objFitTest OBJECT_INDEX objChair OBJECT_INDEX objDoorL OBJECT_INDEX objDoorR CAMERA_INDEX camIGIntro CAMERA_INDEX camRescueOutro INTERIOR_INSTANCE_INDEX intMikeMansion REL_GROUP_HASH rghBuds //╞═════════╡VARIABLES ╞═══════════════════════════════════════════════════════╡ //BOOL bChaserComponentsGrabbed //INT iChaserComponents[NUMBER_OF_PED_COMP_TYPES][2] BOOL bWaterComponentsGrabbed INT iWaterComponents[NUMBER_OF_PED_COMP_TYPES][2] BOOL bMovingStart = FALSE VECTOR v_jimmy_end_pos = <<-1614.5256, -1137.8818, 0.9178>> VECTOR vFinalDest = <<-1626.04578, -1137.16504, 0.47598>> VECTOR vPlayerStartCoords = <<-805.4391, 175.6440, 75.7407>> FLOAT fPlayerHeading = 336.1657 VECTOR vJimmyCoords = <<-804.3638, 178.5257, 75.7407>> FLOAT fJimmyHeading = 14.3431 VECTOR vPlayerOnPierPosition = <<-1862.5293, -1211.2534, 12.0170>> FLOAT fPlayerOnPierHeading = 45.6064 VECTOR v_car_start_coords = <<-823.2707, 181.5663, 70.6967>> FLOAT f_car_start = 136.7262 VECTOR v_Seashark_start_coords = <<-2019.921143,-1030.525269, 0.001>> VECTOR vSeasharkChaseStartCoords = <<-2008.7224, -1033.1538, 0>> FLOAT fSeasharkChaseStartCoords = 280.6858 VECTOR v_car_stop = <<-1072.7997, -1703.9238, 3.5140>> FLOAT f_car_stop = 181.9476 VECTOR v_bike_guy_pos = <<-1105.9325, -1695.8932, 3.3731>> VECTOR v_player_bike_start = <<-1106.255493,-1694.976929, 3.3742>> FLOAT f_player_bike_start = 122.547714 //telltale cutscene marks and headings VECTOR v_TT_player_bike_mark = <<-1866.950806,-1208.529297,12.630510>> VECTOR v_TT_jimmy_bike_mark = <<-1865.153076,-1210.693726,12.606791>> FLOAT f_TT_player_bike_mark = 54.539898 FLOAT f_TT_jimmy_bike_mark = 65.012039 VECTOR vBeachPos1 = <<-1627.997803,-1143.906006,-0.612126>> VECTOR vBeachPos2 = <<-1608.709839,-1116.124878,7.893201>> FLOAT fBeachWidth = 45.000000 VECTOR vTheAbsoluteEndPos1 = <<-1084.215820,-1707.051636,-6.638385>> VECTOR vTheAbsoluteEndPos2 = <<-967.234436,-1829.366333,40.314407>> FLOAT fTheAbsoluteEndWidth = 116.000000 VECTOR vRaceFinish = <<-1851.92004, -1217.77734, 12.01752>> FLOAT f_bike_guy_heading = 332.3918 FLOAT f_jimmy_end_heading = 113.3809 FLOAT f_Seashark_heading = -107.750221 FLOAT fJazzTime FLOAT fPlayerGroundTime BOOL bPlayerGroundingChecked BOOL bChaserGroundingChecked BOOL bShowStaminaHelp = TRUE BOOL bReplaySetupRequired STRING s_jimmy_bike_rec = "fam2" STRING sJimmyStairRoute = "fam2stairs" INT i_jimmy_bike_rec = 2 INT iStageProgress = 0 INT iBikeTutStage = 0 INT iCurrentDriveConv INT iLastConvFinish INT iSavedStage = 0 INT iCurrentJimmyTarget = 4 INT iJimmyChoice = 4 INT iMikeChoice = 1 INT iTimeGetBackOnPrinted = 0 INT iLastJimmyShout = -1 INT iLastMeleeShout = -1 INT iJimmyWalkStage = -1 INT iRunTime = 900 BOOL b_stage_ready = FALSE BOOL b_skip = FALSE BOOL bPlayFullFinalCut = TRUE //BOOL bClothesHaveChanged = FALSE BOOL bBlipParkingSpace = FALSE BOOL bGoBackToJimmyPrinted = FALSE BOOL bGoBackToTracyPrinted = FALSE BOOL b_cutscene_request = FALSE BOOL bCutsceneComponentsSet BOOL bJimmyWon BOOL bJimmyFinished BOOL bShowGodText BOOL bMoreSeatsPrinted INT iCurrentConvStage = 0 BOOL bPlayerDone INT iTimeOfLastMichaelLine = 0 INT iTimeLastBumpCheck INT iTimeLastBumpLine INT iTimeLastCheatLine INT iChaseStage BOOL bKilledOne BOOL bKillLineDone BOOL bKilledBoth BOOL bShooting BOOL bShootLineDone BOOL bShouldFireMikeTakeoverLine BOOL bShouldFireJimmyTakeoverLine BOOL bJimmyPierLine BOOL bPlayerHasCheated BOOL bPlayerHasBumpedJimmy STRING sFinalCut = "family_2_mcs_4" STRING sConvBlock = "FAM2AUD" BOOL bGoBackPrinted = FALSE INT iTimeGoBackPrinted = 0 // for final bit on the pier INT iFinalScene CAMERA_INDEX camFinal OBJECT_INDEX objCig VEHICLE_INDEX vehEndBike VECTOR v_back_of_the_boat = <<-2030.40906, -1039.46301, -23.59287>> VECTOR vOutlet = <<-1797.8530, -982.6022, 0>> VECTOR vMarinaFinish = << -934.5598, -1360.5444, 0 >> FLOAT fMarinaFinish = 288.2051 VECTOR vBikeRoutePath[MAX_BIKE_NODES] VECTOR vLeftDoorPos = <<-816.7160, 179.0980, 72.8274>> VECTOR vRightDoorPos = <<-816.1068, 177.5108, 72.8274>> VECTOR vReplayCoords FLOAT fReplayHeading BOOL bTraceySpotsJimmy BOOL bMikeCompAcquired = FALSE SEQUENCE_INDEX seqTurnTask PUSH_IN_DATA pushInData PROC FADE_IN(INT iTime = 500) IF NOT IS_SCREEN_FADED_IN() DO_SCREEN_FADE_IN(iTime) WHILE NOT IS_SCREEN_FADED_IN() WAIT(0) ENDWHILE ENDIF ENDPROC PROC FADE_OUT(INT iTime = 500) IF NOT IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_OUT(iTime) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE ENDIF ENDPROC SCENARIO_BLOCKING_INDEX sbiBikeArea BOOL bBlockAreaBike SCENARIO_BLOCKING_INDEX sbiMarina SCENARIO_BLOCKING_INDEX sbiBeach //---------------------------------------------------- God text stuff STRUCT TEXT_HOLDER STRING label BOOL played ENDSTRUCT FUNC TEXT_HOLDER CREATE_TEXT_HOLDER(STRING text) TEXT_HOLDER returnGT returnGT.label = text returnGT.played = FALSE return returnGT ENDFUNC TEXT_HOLDER gtFollowJimmy TEXT_HOLDER gtGetBackInBike TEXT_HOLDER gtGetBackInSeashark TEXT_HOLDER gtLoseCops //TEXT_HOLDER dhSeashark BOOL bBeenOnBike = FALSE PROC PRINT_GOD_TEXT(TEXT_HOLDER >) IF NOT gt.played IF NOT IS_STRING_NULL(gt.label) PRINT_NOW(gt.label, DEFAULT_GOD_TEXT_TIME, 1) gt.played = TRUE ENDIF ENDIF ENDPROC PROC PRINT_HELP_TEXT(TEXT_HOLDER &help_text) IF NOT help_text.played IF NOT IS_STRING_NULL(help_text.label) PRINT_HELP(help_text.label) help_text.played = TRUE ENDIF ENDIF ENDPROC STRING subGroupID = sConvBlock structPedsForConversation sSpeech PROC PLAY_DIALOGUE(TEXT_HOLDER &dialogue) IF NOT dialogue.played CREATE_CONVERSATION(sSpeech, sConvBlock, dialogue.label, CONV_PRIORITY_VERY_HIGH) dialogue.played = TRUE ENDIF ENDPROC FUNC BOOL IS_THIS_CONVERSATION_PLAYING(STRING sRoot) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() TEXT_LABEL txtRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT() IF ARE_STRINGS_EQUAL(sRoot, txtRoot) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC INIT_TEXT() gtFollowJimmy = CREATE_TEXT_HOLDER("FM2_GOTOL") gtGetBackInBike = CREATE_TEXT_HOLDER("FM2_GETON") gtGetBackInSeashark = CREATE_TEXT_HOLDER("FM2_BKIN") gtLoseCops = CREATE_TEXT_HOLDER("FM2_COPS") // dhSeashark = CREATE_TEXT_HOLDER("FAM2_JSKI2") ENDPROC BOOL in_car_conv_started = FALSE BOOL in_car_conv_on_hold = FALSE TEXT_LABEL_23 sConvResumeLabel = "" // //PROC MANAGE_VEHICLE_CONVERSATION(PED_INDEX ped, STRING label, VEHICLE_INDEX veh) // IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), veh) // AND NOT IS_PED_INJURED(ped) // AND IS_PED_IN_VEHICLE(ped, veh) // IF NOT in_car_conv_started // CREATE_CONVERSATION(sSpeech, subGroupID, label, CONV_PRIORITY_HIGH) // println("in car conv started") // in_car_conv_on_hold = FALSE // in_car_conv_started = TRUE // ENDIF // IF in_car_conv_on_hold // println("in car conv resumed") // CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sSpeech, subGroupID, label, sConvResumeLabel, CONV_PRIORITY_HIGH) // in_car_conv_on_hold = FALSE // ENDIF // ENDIF // IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), veh) // OR (NOT IS_PED_INJURED(ped) AND NOT IS_PED_IN_VEHICLE(ped, veh)) // IF NOT in_car_conv_on_hold // sConvResumeLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() // KILL_FACE_TO_FACE_CONVERSATION() // println("in car conv on hold with label ", sConvResumeLabel) // in_car_conv_on_hold = TRUE // ENDIF // ENDIF //ENDPROC // //PROC MANAGE_DISTANCE_CONVERSATION(STRING label, FLOAT fMinDist, VECTOR vTalkerPos) // IF VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTalkerPos) < fMinDist // IF NOT in_car_conv_started // IF CREATE_CONVERSATION(sSpeech, subGroupID, label, CONV_PRIORITY_HIGH) // in_car_conv_on_hold = FALSE // in_car_conv_started = TRUE // ENDIF // ENDIF // IF in_car_conv_on_hold // IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sSpeech, subGroupID, label, sConvResumeLabel, CONV_PRIORITY_HIGH) // in_car_conv_on_hold = FALSE // ENDIF // ENDIF // ENDIF // IF VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTalkerPos) > fMinDist // IF NOT in_car_conv_on_hold // sConvResumeLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() // KILL_FACE_TO_FACE_CONVERSATION() // in_car_conv_on_hold = TRUE // ENDIF // ENDIF //ENDPROC PROC MANAGE_CONVERSATION(STRING label, BOOL bCanTalk) IF bCanTalk IF NOT in_car_conv_started IF CREATE_CONVERSATION(sSpeech, subGroupID, label, CONV_PRIORITY_HIGH) in_car_conv_on_hold = FALSE in_car_conv_started = TRUE ENDIF ENDIF IF in_car_conv_on_hold IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sSpeech, subGroupID, label, sConvResumeLabel, CONV_PRIORITY_HIGH) in_car_conv_on_hold = FALSE ENDIF ENDIF ENDIF IF NOT bCanTalk IF NOT in_car_conv_on_hold sConvResumeLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() KILL_FACE_TO_FACE_CONVERSATION() in_car_conv_on_hold = TRUE ENDIF ENDIF ENDPROC BOOL bPlayerInFrontLastFrame INT iTimeLastOvertake INT iTimeLastJimmyLine PROC MANAGE_JIMMY_BIKE_CONV(FLOAT fProgDiff, FLOAT fDistFromTrack, BOOL bPlayerInFront) fProgDiff = ABSF(fProgDiff) FLOAT fDistToJimmy = VDIST(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) AND NOT IS_PED_INJURED(pedJimmy) SWITCH iCurrentConvStage CASE 0 bShouldFireMikeTakeoverLine = FALSE bShouldFireJimmyTakeoverLine = FALSE bJimmyPierLine = FALSE bPlayerHasCheated = FALSE bPlayerHasBumpedJimmy = FALSE iTimeLastBumpCheck = 0 iTimeLastBumpLine = 0 iTimeLastCheatLine = 0 IF bPlayerInFront AND fProgDiff > 15000 bPlayerHasCheated = TRUE ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) IF fDistToJimmy < 35 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_PIER", CONV_PRIORITY_HIGH) SETTIMERA(0) iCurrentConvStage++ ENDIF ELSE iCurrentConvStage++ ENDIF ENDIF BREAK CASE 1 IF TIMERA() > 2000 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) SETTIMERA(0) CLEAR_PRINTS() PRINT_GOD_TEXT(gtFollowJimmy) iCurrentConvStage++ ENDIF ENDIF BREAK CASE 2 IF TIMERA()>1000 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) IF fDistToJimmy < 35 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_RACEM", CONV_PRIORITY_HIGH) iCurrentConvStage++ ENDIF ENDIF ELSE IF TIMERA() > 15000 iCurrentConvStage++ ENDIF ENDIF BREAK CASE 3 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND fDistToJimmy < 35 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_TRIA", CONV_PRIORITY_HIGH) iCurrentConvStage++ ENDIF ENDIF BREAK CASE 4 IF bPlayerInFront DRAW_DEBUG_TEXT_2D("Player in front", <<0.01, 0.68, 0>>) ELSE DRAW_DEBUG_TEXT_2D("Jimmy in front", <<0.01, 0.68, 0>>) ENDIF IF bShouldFireMikeTakeoverLine DRAW_DEBUG_TEXT_2D("Michael take over line should fire", <<0.01, 0.7, 0>>) ENDIF IF bShouldFireJimmyTakeoverLine DRAW_DEBUG_TEXT_2D("Jimmy take over line should fire", <<0.01, 0.72, 0>>) ENDIF IF bPlayerHasCheated DRAW_DEBUG_TEXT_2D("bPlayerHasCheated", <<0.01, 0.74, 0>>) ENDIF IF bPlayerHasBumpedJimmy DRAW_DEBUG_TEXT_2D("bPlayerHasBumpedJimmy", <<0.01, 0.76, 0>>) ENDIF IF bPlayerInFront <> bPlayerInFrontLastFrame iTimeLastOvertake = GET_GAME_TIMER() IF bPlayerInFront bShouldFireMikeTakeoverLine = TRUE bShouldFireJimmyTakeoverLine = FALSE iTimeOfLastMichaelLine = GET_GAME_TIMER() - 10000 ELSE bShouldFireMikeTakeoverLine = FALSE bShouldFireJimmyTakeoverLine = TRUE iTimeOfLastMichaelLine = GET_GAME_TIMER() - 10000 ENDIF ENDIF IF bShouldFireJimmyTakeoverLine IF (GET_GAME_TIMER() - iTimeLastOvertake) < 4000 AND fDistToJimmy < 30 AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_STUFF", CONV_PRIORITY_HIGH) bShouldFireJimmyTakeoverLine = FALSE ENDIF ELSE bShouldFireJimmyTakeoverLine = FALSE ENDIF ENDIF IF bShouldFireMikeTakeoverLine IF (GET_GAME_TIMER() - iTimeLastOvertake) < 4000 AND fDistToJimmy < 30 AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_PASS", CONV_PRIORITY_HIGH) bShouldFireMikeTakeoverLine = FALSE ENDIF ELSE bShouldFireMikeTakeoverLine = FALSE ENDIF ENDIF IF NOT bPlayerHasCheated AND NOT bPlayerHasBumpedJimmy IF bPlayerInFront IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF (GET_GAME_TIMER() - iTimeLastJimmyLine) > 10000 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND fDistToJimmy < 35 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_ROFF", CONV_PRIORITY_HIGH) iTimeLastJimmyLine = GET_GAME_TIMER() ENDIF ENDIF ELIF (GET_GAME_TIMER() - iTimeLastJimmyLine) < 5000 AND (GET_GAME_TIMER() - iTimeOfLastMichaelLine) > 10000 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND fDistToJimmy < 40 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_FRONT", CONV_PRIORITY_HIGH) iTimeOfLastMichaelLine = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ELSE IF (GET_GAME_TIMER() - iTimeLastJimmyLine) > 10000 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND fDistToJimmy < 35 AND NOT bPlayerInFront IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_CLOSE", CONV_PRIORITY_HIGH) iTimeLastJimmyLine = GET_GAME_TIMER() ENDIF ENDIF ELIF (GET_GAME_TIMER() - iTimeLastJimmyLine) < 5000 AND (GET_GAME_TIMER() - iTimeOfLastMichaelLine) > 10000 PRINTLN("Can do FAM2_BEH") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND fDistToJimmy < 40 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_BEH", CONV_PRIORITY_HIGH) iTimeOfLastMichaelLine = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF IF fDistToJimmy < 5 AND (GET_GAME_TIMER() - iTimeLastBumpCheck) > 1000 AND (GET_GAME_TIMER() - iTimeLastBumpLine) > 10000 IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) AND IS_ENTITY_TOUCHING_ENTITY(vehPlayerBike, vehJimmyBike) bPlayerHasBumpedJimmy = TRUE ENDIF iTimeLastBumpCheck = GET_GAME_TIMER() ENDIF IF (GET_GAME_TIMER() - iTimeLastCheatLine) > 10000 IF NOT bPlayerHasCheated IF fDistFromTrack > 50 bPlayerHasCheated = TRUE ENDIF ENDIF ENDIF ELIF bPlayerHasCheated IF fDistToJimmy < 35 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_CHEAT", CONV_PRIORITY_HIGH) iTimeLastCheatLine = GET_GAME_TIMER() bPlayerHasCheated = FALSE ENDIF ENDIF ELIF bPlayerHasBumpedJimmy IF fDistToJimmy < 35 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_HIT", CONV_PRIORITY_HIGH) iTimeLastBumpLine = GET_GAME_TIMER() bPlayerHasBumpedJimmy = FALSE ENDIF ENDIF ENDIF IF NOT bJimmyPierLine IF IS_ENTITY_IN_ANGLED_AREA(pedJimmy, <<-1545.975464,-937.182190,10.332039>>, <<-1556.067627,-928.880615,16.722149>>, 3.750000) AND fDistToJimmy < 35 iCurrentConvStage++ iTimeOfLastMichaelLine = GET_GAME_TIMER() bJimmyPierLine = TRUE ENDIF ENDIF BREAK CASE 5 IF fDistToJimmy < 35 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_JEND", CONV_PRIORITY_HIGH) iTimeOfLastMichaelLine = GET_GAME_TIMER() iCurrentConvStage++ ENDIF ENDIF IF (GET_GAME_TIMER() - iTimeOfLastMichaelLine) > 5000 iCurrentConvStage = 4 ENDIF BREAK CASE 6 IF fDistToJimmy < 35 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_ROFF", CONV_PRIORITY_HIGH) iCurrentConvStage = 4 ENDIF ENDIF IF (GET_GAME_TIMER() - iTimeOfLastMichaelLine) > 5000 iCurrentConvStage = 4 ENDIF BREAK ENDSWITCH bPlayerInFrontLastFrame = bPlayerInFront ENDIF ENDPROC PROC DO_NO_STAMINA_HELP_TEXT IF bShowStaminaHelp IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() IF GET_PLAYER_SPRINT_TIME_REMAINING(PLAYER_ID()) <= 5.0 IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_NO_STAMINA) PRINT_HELP("AM_H_NOSTAM") SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_NO_STAMINA) ENDIF ENDIF ENDIF ENDIF ENDPROC //------------------------------------------------------------------- PROC DO_QUICK_WARP(VECTOR vPos, FLOAT fHead, BOOL bWarpPlayer = TRUE) IF NOT IS_REPLAY_BEING_SET_UP() SET_FOCUS_POS_AND_VEL(vPos, <<0,0,0>>) NEW_LOAD_SCENE_START(vPos, <>, 25) SETTIMERA(0) INT iTimeNow = GET_GAME_TIMER() WHILE NOT IS_NEW_LOAD_SCENE_LOADED() AND (GET_GAME_TIMER() - iTimeNow) < 12000 WAIT(0) ENDWHILE IF bWarpPlayer SET_ENTITY_COORDS(PLAYER_PED_ID(), vPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fHead) ENDIF CLEAR_FOCUS() NEW_LOAD_SCENE_STOP() ENDIF ENDPROC INT iBikeBlockedTimer //fails checks for a given vehicle FUNC BOOL MISSION_VEHICLE_FAIL_CHECKS(VEHICLE_INDEX VEHICLE, BOOL &bStuck) IF DOES_ENTITY_EXIST(VEHICLE) IF IS_VEHICLE_DRIVEABLE(VEHICLE) // IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), VEHICLE) IF IS_VEHICLE_STUCK_TIMER_UP(VEHICLE, VEH_STUCK_ON_ROOF, ROOF_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(VEHICLE, VEH_STUCK_JAMMED, JAMMED_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(VEHICLE, VEH_STUCK_HUNG_UP, HUNG_UP_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(VEHICLE, VEH_STUCK_ON_SIDE, SIDE_TIME) IF IS_VEHICLE_STUCK_TIMER_UP(VEHICLE, VEH_STUCK_ON_ROOF, ROOF_TIME) PRINTLN("@@@@@@@@ VEH_STUCK_ON_ROOF @@@@@@@@") ENDIF IF IS_VEHICLE_STUCK_TIMER_UP(VEHICLE, VEH_STUCK_JAMMED, JAMMED_TIME) PRINTLN("@@@@@@@@ VEH_STUCK_JAMMED @@@@@@@@") ENDIF IF IS_VEHICLE_STUCK_TIMER_UP(VEHICLE, VEH_STUCK_HUNG_UP, HUNG_UP_TIME) PRINTLN("@@@@@@@@ VEH_STUCK_HUNG_UP @@@@@@@@") ENDIF IF IS_VEHICLE_STUCK_TIMER_UP(VEHICLE, VEH_STUCK_ON_SIDE, SIDE_TIME) PRINTLN("@@@@@@@@ VEH_STUCK_ON_SIDE @@@@@@@@") ENDIF bStuck = TRUE RETURN TRUE ENDIF IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), VEHICLE, TRUE) AND NOT IS_ENTRY_POINT_FOR_SEAT_CLEAR(PLAYER_PED_ID(), VEHICLE, VS_DRIVER, TRUE) PRINTLN("@@@@@@@@ IS_ENTRY_POINT_FOR_SEAT_CLEAR | iBikeBlockedTimer: ", iBikeBlockedTimer, " | iBikeBlockedTimer more than 5000?: ", GET_GAME_TIMER() - iBikeBlockedTimer, " @@@@@@@@") IF iBikeBlockedTimer = 0 iBikeBlockedTimer = GET_GAME_TIMER() ELIF GET_GAME_TIMER() - iBikeBlockedTimer >= 5000 bStuck = TRUE RETURN TRUE ENDIF ELSE iBikeBlockedTimer = 0 ENDIF // ENDIF ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_BUDDY_ABANDONED(PED_INDEX buddy, FLOAT abandon_distance = 150.0) IF DOES_ENTITY_EXIST(buddy) IF IS_ENTITY_A_PED(buddy) IF NOT IS_PED_INJURED(buddy) IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(buddy)) > abandon_distance RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC PROC PRE_STREAM_CUTSCENE_AT_DISTANCE(STRING scene, VECTOR location, FLOAT distance, BOOL &checkSwitch) IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), location) < distance AND NOT checkSwitch PRINTLN("REQUESTING SCENE, ", scene) REQUEST_CUTSCENE(scene) checkSwitch = TRUE ENDIF ENDPROC FUNC FLOAT SMART_CLAMP(FLOAT value, FLOAT limit1, FLOAT limit2) FLOAT min, max IF limit1 <= limit2 min = limit1 max = limit2 ELSE min = limit2 max = limit1 ENDIF RETURN CLAMP(value, min, max) ENDFUNC //-------------------------------------------------- Vector functions FUNC VECTOR ROTATE_2D_VECTOR_ABOUT_ORIGIN(VECTOR v, FLOAT angle) VECTOR return_vector //rotate around z return_vector.x = (v.x * cos(angle)) - (v.y * sin(angle)) return_vector.y = (v.x * sin(angle)) + (v.y * cos(angle)) return_vector.z = v.z RETURN return_vector ENDFUNC FUNC FLOAT GET_VECTOR_MAGNITUDE(VECTOR vVector) RETURN SQRT((vVector.x * vVector.x) + (vVector.y * vVector.y) + (vVector.z * vVector.z)) ENDFUNC FUNC VECTOR GET_NORMALISED_VERSION_OF_VECTOR(VECTOR vVector) FLOAT magnitude = GET_VECTOR_MAGNITUDE(vVector) IF vVector.x <> 0 vVector.x = (vVector.x / magnitude) ENDIF IF vVector.y <> 0 vVector.y = (vVector.y / magnitude) ENDIF IF vVector.z <> 0 vVector.z = (vVector.z /magnitude) ENDIF RETURN vVector ENDFUNC FUNC FLOAT GET_ANGLE_BETWEEN_TWO_VECTORS(VECTOR vVectorA, VECTOR vVectorB) FLOAT return_angle vVectorA = NORMALISE_VECTOR(vVectorA) vVectorB = NORMALISE_VECTOR(vVectorB) return_angle = (ATAN2(vVectorB.y, vVectorB.x) - ATAN2(vVectorA.y, vVectorA.x)) IF return_angle > 180 return_angle = (return_angle - 360) ELIF return_angle < -180 return_angle = (return_angle + 360) ENDIF RETURN return_angle ENDFUNC PROC SET_VECTOR_MAGNITUDE(VECTOR &v, FLOAT m) VECTOR n = NORMALISE_VECTOR(v) n.x = n.x * m n.y = n.y * m n.z = n.z * m v = n ENDPROC FUNC VECTOR GET_VECTOR_FROM_DIRECTION_AND_MAGNITUDE(VECTOR v, FLOAT m) VECTOR n = NORMALISE_VECTOR(v) n.x = n.x * m n.y = n.y * m n.z = n.z * m RETURN n ENDFUNC //------------------------------------------------------------------- //-------------------------------------------------------- Line stuff STRUCT LINESTRUCT VECTOR p1 VECTOR p2 // VECTOR middle ENDSTRUCT FUNC LINESTRUCT CREATE_LINE(VECTOR v1, VECTOR v2) LINESTRUCT line line.p1 = v1 line.p2 = v2 // line.middle.x = line.p1.x + ((line.p2.x - line.p1.x)/2) // line.middle.y = line.p1.y + ((line.p2.y - line.p1.y)/2) // line.middle.z = line.p1.z + ((line.p2.z - line.p1.z)/2) RETURN line ENDFUNC FUNC BOOL IS_POINT_BEHIND_LINE(VECTOR O, LINESTRUCT &line) FLOAT test_val test_val = (line.p2.x - line.p1.x) * (O.y - line.p1.y) - (line.p2.y - line.p1.y) * (O.x - line.p1.x) IF test_val >= 0 RETURN FALSE ELSE RETURN TRUE ENDIF ENDFUNC FUNC BOOL DO_LINES_INTERSECT(VECTOR a1, VECTOR a2, VECTOR b1, VECTOR b2, VECTOR &vIntersectPoint) //does not work, I think it's the vMags vIntersectPoint = <<0,0,0>> VECTOR A = a2 - a1 //r VECTOR B = b2 - b1 //s FLOAT t = VMAG(CROSS_PRODUCT(b1 - a1,B))/ VMAG(CROSS_PRODUCT(A,B)) FLOAT u = VMAG(CROSS_PRODUCT(b1 - a1,A))/ VMAG(CROSS_PRODUCT(A,B)) IF t > 0 AND t < 1 AND u > 0 AND u < 1 println("u is ", u, " t is ", t) vIntersectPoint = a1 + (A*t) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC FLOAT MIN(FLOAT a, FLOAT b) IF ab RETURN a ELSE RETURN b ENDIF ENDFUNC FUNC BOOL DO_LINES_INTERSECT2(VECTOR p1, VECTOR p2, VECTOR p3, VECTOR p4, VECTOR &vIntersectPoint) // Store the values for fast access and easy // equations-to-code conversion FLOAT x1 = p1.x FLOAT x2 = p2.x FLOAT x3 = p3.x FLOAT x4 = p4.x FLOAT y1 = p1.y FLOAT y2 = p2.y FLOAT y3 = p3.y FLOAT y4 = p4.y float d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4) // If d is zero, there is no intersection IF d = 0 RETURN FALSE ENDIF // Get the x and y FLOAT fPre = (x1*y2 - y1*x2) FLOAT fPost = (x3*y4 - y3*x4) float x = ( fPre * (x3 - x4) - (x1 - x2) * fPost ) / d float y = ( fPre * (y3 - y4) - (y1 - y2) * fPost ) / d // Check if the x and y coordinates are within both lines IF x < min(x1, x2) OR x > max(x1, x2) OR x < min(x3, x4) OR x > max(x3, x4) RETURN FALSE ENDIF IF y < min(y1, y2) OR y > max(y1, y2) OR y < min(y3, y4) OR y > max(y3, y4) RETURN FALSE ENDIF // Return the point of intersection vIntersectPoint.x = x vIntersectPoint.y = y vIntersectPoint.z = p1.z return TRUE ENDFUNC FUNC BOOL IS_POINT_BEHIND_LINE2(VECTOR O, VECTOR p1, VECTOR p2) RETURN ((p2.x - p1.x) * (O.y - p1.y) - (p2.y - p1.y) * (O.x - p1.x)) >= 0 ENDFUNC FUNC VECTOR GET_NORMAL_OF_LINE(LINESTRUCT &line) VECTOR normal_from_origin VECTOR point_of_normal VECTOR middle_of_line FLOAT gradient_of_normal middle_of_line.x = line.p1.x + ((line.p2.x - line.p1.x)/2) middle_of_line.y = line.p1.y + ((line.p2.y - line.p1.y)/2) middle_of_line.z = line.p1.z + ((line.p2.z - line.p1.z)/2) gradient_of_normal = -1/((line.p2.y - line.p1.y)/(line.p2.x - line.p1.x)) normal_from_origin.x = 1 normal_from_origin.y = gradient_of_normal * normal_from_origin.x normal_from_origin.z = 0 normal_from_origin = GET_NORMALISED_VERSION_OF_VECTOR(normal_from_origin) point_of_normal = middle_of_line + normal_from_origin IF IS_POINT_BEHIND_LINE(point_of_normal, line) point_of_normal = middle_of_line - normal_from_origin ENDIF RETURN point_of_normal ENDFUNC FUNC BOOL DOES_VEHICLE_FIT_AT_TARGET_POSITION_AND_ROTATION(VEHICLE_INDEX veh, VEHICLE_INDEX vehTarget, OBJECT_INDEX objTest, VECTOR vPosition, VECTOR vRotation) BOOL bRet IF DOES_ENTITY_EXIST(objTest) VECTOR vFront, vBack VECTOR vDimMin, vDimMax VECTOR vPlayerDimMin, vPlayerDimMax GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(veh), vDimMin, vDimMax) GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(vehTarget), vPlayerDimMin, vPlayerDimMax) FLOAT fHeight = ABSF(vDimMax.z - vDimMin.z) FLOAT fWidth = ABSF(vDimMax.x - vDimMin.x) FLOAT fLength = ABSF(vDimMax.y - vDimMin.y) FLOAT fRad FLOAT fBump IF fWidth > fHeight fRad = fWidth/2 fBump = fRad - absf(vDimMin.z) ELSE fRad = fLength/2 fBump = fRad - absf(vDimMin.x) ENDIF VECTOR vCoord vCoord.z += vPlayerDimMin.z - vDimMin.z SET_ENTITY_COORDS(objTest, vPosition) SET_ENTITY_ROTATION(objTest, vRotation) vFront = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objTest, <<0,fLength/2 - fRad*0.75,fBump*1.25>> + vCoord) vBack = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objTest, <<0,-fLength/2 + fRad*0.75,fBump*1.25>> + vCoord) INT iHitResults VECTOR vReturnPosition VECTOR vReturnNormal ENTITY_INDEX hitEntity SHAPETEST_INDEX ShapeTestCapsuleIndex = START_SHAPE_TEST_CAPSULE(vBack, vFront, fRad, SCRIPT_INCLUDE_MOVER | SCRIPT_INCLUDE_OBJECT | SCRIPT_INCLUDE_VEHICLE, PLAYER_PED_ID()) IF GET_SHAPE_TEST_RESULT(ShapeTestCapsuleIndex, iHitResults, vReturnPosition, vReturnNormal, hitEntity) != SHAPETEST_STATUS_RESULTS_READY #IF IS_DEBUG_BUILD PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shape test results not ready.") #ENDIF ENDIF IF ( iHitResults != 0 ) #IF IS_DEBUG_BUILD PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shape test capsule hitting something.") #ENDIF bRet = FALSE ELSE bRet = TRUE ENDIF #IF IS_DEBUG_BUILD INT iGreen INT iRed IF bRet iGreen = 255 ELSE iRed = 255 ENDIF DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_VECTOR(vDimMin), <<0.8, 0.3, 0>>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_VECTOR(vDimMax), <<0.8, 0.32, 0>>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(fHeight), <<0.8, 0.34, 0>>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(fWidth), <<0.8, 0.36, 0>>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(fLength), <<0.8, 0.38, 0>>) DRAW_DEBUG_SPHERE(vFront, 0.05, iRed, iGreen, 0) DRAW_DEBUG_SPHERE(vFront, fRad, iRed, iGreen, 0, 100) DRAW_DEBUG_SPHERE(vBack, 0.05, iRed, iGreen, 0) DRAW_DEBUG_SPHERE(vBack, fRad, iRed, iGreen, 0, 100) DRAW_DEBUG_LINE(vBack-<<0, 0, fRad>>, vFront-<<0, 0, fRad>>, iRed, iGreen, 0, 100) DRAW_DEBUG_LINE(vBack+<<0, 0, fRad>>, vFront+<<0, 0, fRad>>, iRed, iGreen, 0, 100) #ENDIF ENDIF RETURN bRet ENDFUNC //INFO: Warps a vehicle to a point that the target vehicle has already been at. //PARAM NOTES: vehWarper - The vehicle that will warp // vehTarget - The vehicle that the warping vehicle is following // vWarpTarget - The current position that the warper will warp to // vWarpRot - The rotation at the warp position // iTimeOfLastWarp - The last time the warper warped // iLastSpotted - The last time the warper was seen on screen // fDistToRefreshTarget - The distance the target vehicle will be from the last warp target before it places a new warp target. // fMinWarpDist - The minimum distance the warper will be from the warp point to warrant warping // fMinDistTargetToWarpPoint - The minimum distance the Warp point must be from the target vehicle to allow the warper to warp. // iMinTime - The minimum time between warping // iMinOccludeTime - the minimum time the warping vehicle must be occluded before a warp is allowed //PURPOSE: WARP_VEHICLE_TO_CHASE_TARGET warps a vehicle to a point that the targte vehicle has already been so that it can carry on chasing the target. // A slight rewrite of RUN_VEHICLE_WARP_CHECK_BASED_ON_TARGET_VEHICLE that's a bit cheaper and uses the PROC WARP_VEHICLE_TO_CHASE_TARGET(VEHICLE_INDEX vehWarper, VEHICLE_INDEX vehTarget, VECTOR &vWarpTarget, VECTOR &vWarpRot, INT &iTimeOfLastWarp, INT &iLastSpotted, FLOAT fDistToRefreshTarget = 20.0, FLOAT fMinWarpDist = 20.0, FLOAT fMinDistTargetToWarpPoint = 15.0, INT iMinTime = 3000, INT iMinOccludeTime = 2000) PRINTLN("WARP CHECK 1") IF DOES_ENTITY_EXIST(vehTarget) AND IS_VEHICLE_DRIVEABLE(vehTarget) PRINTLN("WARP CHECK 2") //check the vehicle being chased is far enough away from the current warp location to refresh the warp location IF VDIST2(GET_ENTITY_COORDS(vehTarget), vWarpTarget) > fDistToRefreshTarget*fDistToRefreshTarget PRINTLN("WARP CHECK 3") IF DOES_VEHICLE_FIT_AT_TARGET_POSITION_AND_ROTATION(vehWarper, vehTarget, objFitTest, GET_ENTITY_COORDS(vehTarget), GET_ENTITY_ROTATION(vehTarget)) PRINTLN("WARP CHECK 4") vWarpTarget = GET_ENTITY_COORDS(vehTarget) vWarpRot = GET_ENTITY_ROTATION(vehTarget) ENDIF ENDIF #IF IS_DEBUG_BUILD DRAW_DEBUG_SPHERE(vWarpTarget, 0.5, 0, 0, 255, 100) #ENDIF IF NOT IS_VECTOR_ZERO(vWarpTarget) AND vWarpTarget.z < 1 PRINTLN("WARP CHECK 5") IF DOES_ENTITY_EXIST(vehWarper) AND IS_VEHICLE_DRIVEABLE(vehWarper) PRINTLN("WARP CHECK 6") IF NOT IS_ENTITY_OCCLUDED(vehWarper) PRINTLN("WARP CHECK 7") iLastSpotted = GET_GAME_TIMER() ELSE PRINTLN("WARP CHECK 8") IF (GET_GAME_TIMER() - iLastSpotted) > iMinOccludeTime AND (GET_GAME_TIMER() - iTimeOfLastWarp) > iMinTime PRINTLN("WARP CHECK 9") //Check that the warping vehicle is far enough away from the warp point IF VDIST2(GET_ENTITY_COORDS(vehWarper), vWarpTarget) > fMinWarpDist*fMinWarpDist //check that warping will place the warping vehicle closer to it's target AND VDIST2(GET_ENTITY_COORDS(vehWarper), vWarpTarget) < VDIST2(GET_ENTITY_COORDS(vehWarper), GET_ENTITY_COORDS(vehTarget)) //check the target vehicle is far enough away from the warp location to allow the warping vehicle to go there AND VDIST2(GET_ENTITY_COORDS(vehtarget), vWarpTarget) > fMinDistTargetToWarpPoint*fMinDistTargetToWarpPoint AND DOES_VEHICLE_FIT_AT_TARGET_POSITION_AND_ROTATION(vehWarper, vehTarget, objFitTest, vWarpTarget, vWarpRot) PRINTLN("WARP CHECK 10") IF NOT IS_SPHERE_VISIBLE(vWarpTarget, 3.0) IF NOT IS_SPHERE_VISIBLE(vWarpTarget, 3.0) PRINTLN("WARP CHECK 11") CLEAR_AREA_OF_PEDS(vWarpTarget, 3.0) CLEAR_AREA_OF_VEHICLES(vWarpTarget, 3.0) SET_ENTITY_COORDS(vehWarper, vWarpTarget) SET_ENTITY_ROTATION(vehWarper, vWarpRot) SET_VEHICLE_FORWARD_SPEED(vehWarper, CLAMP(GET_ENTITY_SPEED(vehTarget), 10.0, GET_ENTITY_SPEED(vehTarget))) SET_VEHICLE_ENGINE_ON(vehWarper, TRUE, TRUE) iTimeOfLastWarp = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC STRUCT WARP_TARGET VECTOR vPosition VECTOR vRotation FLOAT fSpeed ENDSTRUCT WARP_TARGET chaserWarpTarget[2] INT iChaserLastWarp[2] INT iChaserLastSeen[2] //VECTOR vChaserWarpTargetPosition[2] //VECTOR vChaserWarpTargetRotation[2] PROC MANAGE_CHASER_WARPING() IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) INT i FOR i = 0 TO 1 IF IS_VEHICLE_DRIVEABLE(vehChasers[i]) AND NOT IS_PED_INJURED(pedChasers[i]) AND IS_PED_SITTING_IN_VEHICLE(pedChasers[i], vehChasers[i]) VECTOR vWarperCoords = GET_ENTITY_COORDS(vehChasers[i]) VECTOR vTargetCoords = GET_ENTITY_COORDS(vehPlayerSeashark) //first check to see if a warp point can be set //don't set a warp point if the player is too close to either warp points IF VDIST2(vTargetCoords, chaserWarpTarget[0].vPosition) > MIN_DIST_BETWEEN_WARP_POINTS AND VDIST2(vTargetCoords, chaserWarpTarget[1].vPosition) > MIN_DIST_BETWEEN_WARP_POINTS //Set a warp point if the player is far enough from the last version of that warp point IF VDIST2(vTargetCoords, chaserWarpTarget[i].vPosition) > WARP_REFRESH_DISTANCE //if the chasing vehicle will fit at this warp point then set the warp point. IF DOES_VEHICLE_FIT_AT_TARGET_POSITION_AND_ROTATION(vehChasers[i], vehPlayerSeashark, objFitTest, vTargetCoords, GET_ENTITY_ROTATION(vehPlayerSeashark)) chaserWarpTarget[i].vPosition = vTargetCoords chaserWarpTarget[i].vRotation = GET_ENTITY_ROTATION(vehPlayerSeashark) chaserWarpTarget[i].fSpeed = VMAG(GET_ENTITY_VELOCITY(vehChasers[i])) ENDIF ENDIF ENDIF //Then check if a warp point can be warped to. IF NOT IS_VECTOR_ZERO(chaserWarpTarget[i].vPosition) AND chaserWarpTarget[i].vPosition.z < 1 IF NOT IS_ENTITY_OCCLUDED(vehChasers[i]) iChaserLastSeen[i] = GET_GAME_TIMER() ELSE IF (GET_GAME_TIMER() - iChaserLastSeen[i]) > MIN_TIME_OCCLUDED AND (GET_GAME_TIMER() - iChaserLastWarp[i]) > MIN_TIME_BETWEEN_WARPS IF NOT IS_SPHERE_VISIBLE(chaserWarpTarget[i].vPosition, 3.0) AND NOT IS_SPHERE_VISIBLE(vWarperCoords, 3.0) FLOAT fDistToOtherChaser = 99.0 INT iOtherGuy = 0 IF i = 0 iOtherGuy = 1 ENDIF IF IS_VEHICLE_DRIVEABLE(vehChasers[iOtherGuy]) fDistToOtherChaser = VDIST(GET_ENTITY_COORDS(vehChasers[iOtherGuy]), chaserWarpTarget[i].vPosition) ENDIF //Check that the warping vehicle is far enough away from the warp point IF VDIST2(vWarperCoords, vTargetCoords) > WARP_ALLOWED_DISTANCE //check that warping will place the warping vehicle closer to it's target AND VDIST2(vWarperCoords, chaserWarpTarget[i].vPosition) < VDIST2(vWarperCoords, vTargetCoords) //check the target vehicle is far enough away from the warp location to allow the warping vehicle to go there AND VDIST2(vTargetCoords, chaserWarpTarget[i].vPosition) > MIN_DIST_PLAYER_TO_WARP AND fDistToOtherChaser > 5.0 AND DOES_VEHICLE_FIT_AT_TARGET_POSITION_AND_ROTATION(vehChasers[i], vehPlayerSeashark, objFitTest, chaserWarpTarget[i].vPosition, chaserWarpTarget[i].vRotation) CLEAR_AREA_OF_PEDS(chaserWarpTarget[i].vPosition, 3.0) CLEAR_AREA_OF_VEHICLES(chaserWarpTarget[i].vPosition, 3.0) SET_ENTITY_COORDS(vehChasers[i], chaserWarpTarget[i].vPosition) SET_ENTITY_ROTATION(vehChasers[i], chaserWarpTarget[i].vRotation) SET_VEHICLE_FORWARD_SPEED(vehChasers[i], chaserWarpTarget[i].fSpeed + 5.0) TASK_VEHICLE_CHASE(pedChasers[i], PLAYER_PED_ID()) SET_VEHICLE_ENGINE_ON(vehChasers[i], TRUE, TRUE) iChaserLastWarp[i] = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD DRAW_DEBUG_SPHERE(chaserWarpTarget[i].vPosition, 3, 0, 255, 0, 50) DRAW_DEBUG_TEXT(GET_STRING_FROM_FLOAT(chaserWarpTarget[i].fSpeed), chaserWarpTarget[i].vPosition + <<0,0,1>>, 0, 255, 0) DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(GET_GAME_TIMER() - iChaserLastWarp[i]), chaserWarpTarget[i].vPosition + <<0,0,1.5>>, 0, 255, 0) #ENDIF ENDIF ENDFOR ENDIF ENDPROC FUNC BOOL CREATE_CHASER(INT iChaser, BOOL bPreCutscene = FALSE) REQUEST_MODEL(SEASHARK) REQUEST_MODEL(CSB_PORNDUDES) IF HAS_MODEL_LOADED(SEASHARK) AND HAS_MODEL_LOADED(CSB_PORNDUDES) IF NOT DOES_ENTITY_EXIST(vehChasers[iChaser]) VECTOR vPos FLOAT fHead IF iChaser = 0 IF bPreCutscene vPos = <<-2023.6400, -1047.0404, 0.6916>> fHead = -108.0000 ELSE vPos = <<-2024.7164, -1046.3866, 0.0>> fHead = -108.9627 ENDIF ELSE IF bPreCutscene vPos = <<-2027.4000, -1045.8800, 0.6916>> fHead = -108.0000 ELSE vPos = <<-2021.2002, -1046.9255, 0.0>> fHead = -84.5780 ENDIF ENDIF FLOAT fHeight IF GET_WATER_HEIGHT(vPos, fHeight) vPos.z = fHeight vehChasers[iChaser] = CREATE_VEHICLE(SEASHARK, vPos, fHead) IF iChaser = 0 SET_VEHICLE_COLOUR_COMBINATION(vehChasers[iChaser], 3) ELSE SET_VEHICLE_COLOUR_COMBINATION(vehChasers[iChaser], 1) ENDIF SET_BOAT_LOW_LOD_ANCHOR_DISTANCE(vehChasers[iChaser], 100) SET_BOAT_ANCHOR(vehChasers[iChaser], bPreCutscene) PRINTLN("Created seashark ", iChaser) ENDIF ENDIF IF DOES_ENTITY_EXIST(vehChasers[iChaser]) AND IS_VEHICLE_DRIVEABLE(vehChasers[iChaser]) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehChasers[iChaser], TRUE) SET_ENTITY_PROOFS(vehChasers[iChaser], FALSE, FALSE, FALSE, TRUE, TRUE) SET_VEHICLE_DOORS_LOCKED(vehChasers[iChaser], VEHICLELOCK_LOCKOUT_PLAYER_ONLY) IF bPreCutscene SET_VEHICLE_ENGINE_ON(vehChasers[iChaser], FALSE, TRUE) ELSE SET_VEHICLE_ENGINE_ON(vehChasers[iChaser], TRUE, TRUE) ENDIF SET_CAN_CLIMB_ON_ENTITY(vehChasers[iChaser], FALSE) ENDIF IF NOT DOES_ENTITY_EXIST(pedChasers[iChaser]) AND IS_VEHICLE_DRIVEABLE(vehChasers[iChaser]) IF NOT bPreCutscene pedChasers[iChaser] = CREATE_PED_INSIDE_VEHICLE(vehChasers[iChaser], PEDTYPE_MISSION, CSB_PORNDUDES) ELSE pedChasers[iChaser] = CREATE_PED(PEDTYPE_MISSION, CSB_PORNDUDES, <<-2068.0266, -1024.3993, 10.9101>> + <>) ENDIF ENDIF IF DOES_ENTITY_EXIST(pedChasers[iChaser]) AND NOT IS_PED_INJURED(pedChasers[iChaser]) AND DOES_ENTITY_EXIST(vehChasers[iChaser]) AND IS_VEHICLE_DRIVEABLE(vehChasers[iChaser]) IF NOT bPreCutscene FREEZE_ENTITY_POSITION(pedChasers[iChaser], FALSE) IF NOT IS_PED_IN_VEHICLE(pedChasers[iChaser], vehChasers[iChaser]) SET_PED_INTO_VEHICLE(pedChasers[iChaser], vehChasers[iChaser]) ENDIF ELSE FREEZE_ENTITY_POSITION(pedChasers[iChaser], TRUE) ENDIF SET_RAGDOLL_BLOCKING_FLAGS(pedChasers[iChaser], RBF_BULLET_IMPACT) SET_ENTITY_PROOFS(pedChasers[iChaser], FALSE, FALSE, FALSE, TRUE, TRUE) GIVE_WEAPON_TO_PED(pedChasers[iChaser], WEAPONTYPE_PISTOL, INFINITE_AMMO) SET_PED_COMBAT_ATTRIBUTES(pedChasers[iChaser], CA_LEAVE_VEHICLES, FALSE) SET_PED_COMBAT_ATTRIBUTES(pedChasers[iChaser], CA_USE_VEHICLE, TRUE) SET_PED_COMBAT_ABILITY(pedChasers[iChaser], CAL_POOR) SET_PED_COMBAT_RANGE(pedChasers[iChaser], CR_FAR) SET_PED_ACCURACY(pedChasers[iChaser], 0) SET_PED_SHOOT_RATE(pedChasers[iChaser], 15) SET_ENTITY_LOAD_COLLISION_FLAG(pedChasers[iChaser], TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedChasers[iChaser], TRUE) SET_PED_CAN_BE_DRAGGED_OUT(pedChasers[iChaser], FALSE) SET_PED_CAN_BE_SHOT_IN_VEHICLE(pedChasers[iChaser], TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(pedChasers[iChaser], rgChasers) SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(pedChasers[iChaser], FALSE) IF iChaser = 0 SET_PED_COMPONENT_VARIATION(pedChasers[iChaser], PED_COMP_HEAD, 2, 0) SET_PED_COMPONENT_VARIATION(pedChasers[iChaser], PED_COMP_TORSO, 2, 0) SET_PED_COMPONENT_VARIATION(pedChasers[iChaser], PED_COMP_LEG, 2, 0) SET_PED_PROP_INDEX(pedChasers[iChaser], ANCHOR_HEAD, 0, 0) ELSE SET_PED_COMPONENT_VARIATION(pedChasers[iChaser], PED_COMP_HEAD, 1, 0) SET_PED_COMPONENT_VARIATION(pedChasers[iChaser], PED_COMP_TORSO, 1, 0) SET_PED_COMPONENT_VARIATION(pedChasers[iChaser], PED_COMP_LEG, 1, 0) SET_PED_PROP_INDEX(pedChasers[iChaser], ANCHOR_EYES, 1, 0) ENDIF #IF IS_DEBUG_BUILD TEXT_LABEL_23 sTemp = "Chaser " sTemp += iChaser SET_PED_NAME_DEBUG(pedChasers[iChaser], sTemp) #ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(pedChasers[iChaser]) AND DOES_ENTITY_EXIST(vehChasers[iChaser]) AND NOT IS_PED_INJURED(pedChasers[iChaser]) AND IS_VEHICLE_DRIVEABLE(vehChasers[iChaser]) AND (IS_PED_IN_VEHICLE(pedChasers[iChaser], vehChasers[iChaser]) OR bPreCutscene) RETURN TRUE #IF IS_DEBUG_BUILD ELSE IF NOT DOES_ENTITY_EXIST(pedChasers[iChaser]) PRINTLN("ped ", iChaser, " doesn't exist") ENDIF IF IS_PED_INJURED(pedChasers[iChaser]) PRINTLN("ped ", iChaser, " is injured") ENDIF IF NOT DOES_ENTITY_EXIST(vehChasers[iChaser]) PRINTLN("veh ", iChaser, " doesn't exist") ENDIF IF NOT IS_VEHICLE_DRIVEABLE(vehChasers[iChaser]) PRINTLN("veh ", iChaser, " is broke") ENDIF IF NOT bPreCutscene IF IS_VEHICLE_DRIVEABLE(vehChasers[iChaser]) AND NOT IS_PED_INJURED(pedChasers[iChaser]) AND NOT IS_PED_IN_VEHICLE(pedChasers[iChaser], vehChasers[iChaser]) IF NOT DOES_ENTITY_EXIST(pedChasers[iChaser]) PRINTLN("ped ", iChaser, " is not in vehicle") ENDIF ENDIF ENDIF #ENDIF ENDIF RETURN FALSE ENDFUNC INT iBlockingObj PROC MANAGE_BLOCKING_AREAS(BOOL bForceCleanup = FALSE) IF NOT bBlockAreaBike AND NOT bForceCleanup IF current_mission_stage < stage_go_to_yacht sbiBikeArea= ADD_SCENARIO_BLOCKING_AREA(<< -1120.2920, -1681.0181, 13.2740 >>, << -1081.2887, -1706.5221, 1.5344 >>) SET_ROADS_IN_ANGLED_AREA(<<-1082.087646,-1714.032959,3.285254>>, <<-1107.201050,-1681.870239,14.290073>>, 37.500000, FALSE, FALSE) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-1112.610718,-1697.382690,5.919011>> - <<42.688000,30.000000,2.750000>>, <<-1112.610718,-1697.382690,5.919011>> + <<42.688000,30.000000,2.750000>>, FALSE) iBlockingObj = ADD_NAVMESH_BLOCKING_OBJECT(<<-1107.517, -1692.887, 4.374>>, <<4.161, 13.858, 4.5>>, DEG_TO_RAD(36.0244), FALSE, BLOCKING_OBJECT_WANDERPATH) //SET_PED_PATHS_IN_AREA(<<-1106.888672,-1694.244507,4.373740>> + <<2.500000,2.500000,1.000000>>, <<-1106.888672,-1694.244507,4.373740>> - <<2.500000,2.500000,1.000000>>, FALSE) //SET_PED_PATHS_IN_AREA(<<-1108.548828,-1691.397339,4.374632>> + <<2.500000,2.500000,1.000000>>, <<-1108.548828,-1691.397339,4.374632>> - <<2.500000,2.500000,1.000000>>, FALSE) bBlockAreaBike = TRUE ENDIF ELSE IF current_mission_stage >= stage_go_to_yacht OR bForceCleanup REMOVE_SCENARIO_BLOCKING_AREA(sbiBikeArea) SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-1082.087646,-1714.032959,3.285254>>, <<-1107.201050,-1681.870239,14.290073>>, 37.500000) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-1112.610718,-1697.382690,5.919011>> - <<42.688000,30.000000,2.750000>>, <<-1112.610718,-1697.382690,5.919011>> + <<42.688000,30.000000,2.750000>>, TRUE) IF DOES_NAVMESH_BLOCKING_OBJECT_EXIST(iBlockingObj) REMOVE_NAVMESH_BLOCKING_OBJECT(iBlockingObj) ENDIF //SET_PED_PATHS_IN_AREA(<<-1106.888672,-1694.244507,4.373740>> + <<2.500000,2.500000,1.000000>>, <<-1106.888672,-1694.244507,4.373740>> - <<2.500000,2.500000,1.000000>>, TRUE) //SET_PED_PATHS_IN_AREA(<<-1108.548828,-1691.397339,4.374632>> + <<2.500000,2.500000,1.000000>>, <<-1108.548828,-1691.397339,4.374632>> - <<2.500000,2.500000,1.000000>>, TRUE) bBlockAreaBike = FALSE ENDIF ENDIF ENDPROC FUNC BOOL SETUP_CLOTHES(BOOL bTopless = FALSE, BOOL bWait = FALSE) IF bTopless PRELOAD_OUTFIT(PLAYER_PED_ID(), OUTFIT_P0_BARECHEST_SHORTS) PRINTLN("PRE LOADING OUTFIT_P0_BARECHEST_SHORTS") IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(PLAYER_PED_ID()) OR NOT bWait SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BARECHEST_SHORTS, FALSE) PRINTLN("SETTING OUTFIT OUTFIT_P0_BARECHEST_SHORTS") RELEASE_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID()) // SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL) RETURN TRUE ENDIF ELSE PRELOAD_OUTFIT(PLAYER_PED_ID(), OUTFIT_P0_YOGA_FLIP_FLOPS) PRINTLN("PRE LOADING OUTFIT_P0_YOGA_FLIP_FLOPS") IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(PLAYER_PED_ID()) OR NOT bWait SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA_FLIP_FLOPS, FALSE) PRINTLN("SETTING OUTFIT OUTFIT_P0_YOGA_FLIP_FLOPS") RELEASE_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID()) // SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC //╞═════════╡SCRIPT TERMINATION PROC Mission_Cleanup() IF DOES_ENTITY_EXIST(pedJimmy) AND NOT IS_PED_INJURED(pedJimmy) CLEAR_PED_TASKS(pedJimmy) ENDIF IF DOES_ENTITY_EXIST(pedTracy) AND NOT IS_PED_INJURED(pedTracy) CLEAR_PED_TASKS(pedTracy) ENDIF DISABLE_TAXI_HAILING(FALSE) SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE, TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_01_SC , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_02_GS , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_03_DT , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_04_CS , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_05_GSD , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_06_VC , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_07_PB , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_01_SM , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_03_H , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_04_HW , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_05_GOH , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_01_BH , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_02_B , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_03_MW , FALSE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_A_01_VB , FALSE) KILL_ANY_CONVERSATION() SET_VEHICLE_AS_NO_LONGER_NEEDED(vehPlayerSeashark) SET_PED_AS_NO_LONGER_NEEDED(pedJimmy) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehPlayerBike) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehJimmyBike) SET_PED_AS_NO_LONGER_NEEDED(pedTracy) // DISABLE_VEHICLE_GEN_ON_MISSION(FALSE) SET_WANTED_LEVEL_MULTIPLIER(1) ASSISTED_MOVEMENT_REMOVE_ROUTE("Family5d") SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(TRUE) SET_ROADS_BACK_TO_ORIGINAL(<<-1057.899048,-1682.938599,5.785122>> + <<29.000000,30.000000,4.000000>>, <<-1057.899048,-1682.938599,5.785122>> - <<29.000000,30.000000,4.000000>>) SET_PED_PATHS_BACK_TO_ORIGINAL(<<-1329.113037,-1325.827026,5.753020>> + <<13.250000,44.000000,2.500000>>, <<-1329.113037,-1325.827026,5.753020>> - <<13.250000,44.000000,2.500000>>) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-1112.912964,-1688.035034,6.373647>> + <<22.750000,24.750000,3.500000>>, <<-1112.912964,-1688.035034,6.373647>> - <<22.750000,24.750000,3.500000>>, TRUE) SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", TRUE) SET_PED_PATHS_BACK_TO_ORIGINAL(<<-1106.888672,-1694.244507,4.373740>> + <<2.500000,2.500000,1.000000>>, <<-1106.888672,-1694.244507,4.373740>> - <<2.500000,2.500000,1.000000>>) SET_PED_PATHS_BACK_TO_ORIGINAL(<<-1108.548828,-1691.397339,4.374632>> + <<2.500000,2.500000,1.000000>>, <<-1108.548828,-1691.397339,4.374632>> - <<2.500000,2.500000,1.000000>>) IF DOES_ENTITY_EXIST(objDoorL) SET_OBJECT_AS_NO_LONGER_NEEDED(objDoorL) ENDIF IF DOES_ENTITY_EXIST(objDoorR) SET_OBJECT_AS_NO_LONGER_NEEDED(objDoorR) ENDIF IF DOES_CAM_EXIST(camIGIntro) DESTROY_CAM(camIGIntro) ENDIF SET_MAX_WANTED_LEVEL(5) #IF IS_DEBUG_BUILD IF DOES_WIDGET_GROUP_EXIST(wave_widget) DELETE_WIDGET_GROUP(wave_widget) ENDIF IF DOES_WIDGET_GROUP_EXIST(chase_widget) DELETE_WIDGET_GROUP(chase_widget) ENDIF IF DOES_WIDGET_GROUP_EXIST(parent_widget) DELETE_WIDGET_GROUP(parent_widget) ENDIF #ENDIF MANAGE_BLOCKING_AREAS(TRUE) REMOVE_FORCED_OBJECT(<<-1105.2411, -1697.0247, 3.3678>>, 2, PROP_TABLE_03_CHR) SET_AUDIO_FLAG("AvoidMissionCompleteDelay", FALSE) TERMINATE_THIS_THREAD() ENDPROC PROC Mission_Passed() TRIGGER_MUSIC_EVENT("FAM2_STOP") IF DOES_ENTITY_EXIST(vehPlayerCar) SET_MISSION_VEHICLE_GEN_VEHICLE(vehPlayerCar, <<-1060.5181, -1691.8796, 3.5097>>, 185.4265) ENDIF SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) Mission_Flow_Mission_Passed() Mission_Cleanup() ENDPROC PROC Mission_Failed(STRING print_me) TRIGGER_MUSIC_EVENT("FAM2_STOP") IF ARE_STRINGS_EQUAL(print_me, "FM2_JSPOOK") PRINTLN("Jimmy spook is fail reason") IF IS_ENTITY_ON_FIRE(pedJimmy) PRINTLN("Set to jimmy injured") print_me = "FM2_JIMHIT" ENDIF PRINTLN(" onward to fail") ENDIF MISSION_FLOW_MISSION_FAILED_WITH_REASON(print_me) IF ARE_STRINGS_EQUAL(print_me, "FM2_TSPOOK") OR ARE_STRINGS_EQUAL(print_me, "FM2_JSPOOK") IF DOES_ENTITY_EXIST(pedTracy) IF IS_PED_GROUP_MEMBER(pedTracy, GET_PLAYER_GROUP(PLAYER_ID())) REMOVE_PED_FROM_GROUP(pedTracy) ENDIF TASK_SMART_FLEE_PED(pedTracy, PLAYER_PED_ID(), 500, 60000) ENDIF IF DOES_ENTITY_EXIST(pedJimmy) IF IS_PED_GROUP_MEMBER(pedJimmy, GET_PLAYER_GROUP(PLAYER_ID())) REMOVE_PED_FROM_GROUP(pedJimmy) ENDIF TASK_SMART_FLEE_PED(pedJimmy, PLAYER_PED_ID(), 500, 60000) ENDIF ENDIF WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP() //Maintain anything that could look weird during fade out (e.g. enemies walking off). WAIT(0) ENDWHILE IF current_mission_stage = stage_drive_to_venice VEHICLE_INDEX vehTemp IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) PRINTLN("PLAYER IS IN VEHICLE") ELSE vehTemp = GET_LAST_DRIVEN_VEHICLE() PRINTLN("PLAYER IS NOT IN VEHICLE") ENDIF BOOL bNpcVeh = FALSE IF DOES_ENTITY_EXIST(vehTemp) AND IS_VEHICLE_DRIVEABLE(vehTemp) IF IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(vehTemp) INT iVeh REPEAT NUM_NPC_VEHICLE_IDS iVeh IF DOES_ENTITY_EXIST(g_viCreatedNPCVehicleIDs[iVeh]) PRINTLN("Player veh is NPC veh") bNpcVeh = TRUE iVeh = NUM_NPC_VEHICLE_IDS ENDIF ENDREPEAT ENDIF IF NOT IS_VEHICLE_MODEL(vehTemp, TAXI) AND NOT bNpcVeh IF VDIST(GET_ENTITY_COORDS(vehTemp), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 50 IF GET_PLAYER_PED_PERSONAL_VEHICLE_BELONGS_TO(vehTemp) != CHAR_MICHAEL SEND_VEHICLE_DATA_TO_IMPOUND_USING_VEHICLE(vehTemp) PRINTLN("SETTING PLAYER VEH to impound") ENDIF ENDIF ENDIF ENDIF ENDIF REMOVE_IPL("smboat") INT iTemp FOR iTemp = 0 TO 1 IF DOES_BLIP_EXIST(blipChasers[iTemp]) REMOVE_BLIP(blipChasers[iTemp]) ENDIF IF DOES_ENTITY_EXIST(pedChasers[iTemp]) DELETE_PED(pedChasers[iTemp]) ENDIF IF DOES_ENTITY_EXIST(vehChasers[iTemp]) DELETE_VEHICLE(vehChasers[iTemp]) ENDIF ENDFOR IF current_mission_stage >= stage_go_to_yacht AND current_mission_stage != stage_lose_cops WHILE NOT SETUP_CLOTHES(TRUE, TRUE) WAIT(0) ENDWHILE MISSION_FLOW_SET_FAIL_WARP_LOCATION(vPlayerOnPierPosition, fPlayerOnPierHeading) ENDIF IF DOES_ENTITY_EXIST(pedJimmy) DELETE_PED(pedJimmy) ENDIF IF DOES_ENTITY_EXIST(pedTracy) DELETE_PED(pedTracy) ENDIF // check if we need to respawn the player in a different position, // if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here // IF DOES_ENTITY_EXIST(vehPlayerSeashark) // //SET_VEHICLE_AS_NO_LONGER_NEEDED(vehPlayerSeashark) // DELETE_VEHICLE(vehPlayerSeashark) // ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehPlayerBike) ENDIF IF IS_VEHICLE_DRIVEABLE(vehJimmyBike) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehJimmyBike) ENDIF // RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, bClothesHaveChanged) MISSION_CLEANUP() // must only take 1 frame and terminate the thread ENDPROC PROC SET_PED_AS_BUDDY(PED_INDEX ped) IF NOT IS_PED_INJURED(ped) SET_PED_CAN_BE_DRAGGED_OUT(ped, FALSE) SET_PED_CAN_BE_TARGETTED(ped, FALSE) SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(ped, FALSE) SET_PED_CONFIG_FLAG(ped, PCF_OpenDoorArmIK, TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(ped, FALSE) SET_PED_NEVER_LEAVES_GROUP(ped, TRUE) SET_PED_DIES_IN_WATER(ped, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(ped, rghBuds) PRINTLN("\n\n\n SETTING PED AS BUDDY \n\n") ENDIF ENDPROC //------------------------------------------------------------------- //-------------------------------------------------------- Boat stuff INT iCreateJimmyStage = 0 FUNC BOOL CREATE_JIMMY(VECTOR vPos, FLOAT fHead) SWITCH iCreateJimmyStage CASE 0 IF CREATE_NPC_PED_ON_FOOT(pedJimmy, CHAR_JIMMY, <<-808.0422, 168.5755, 75.7504>>, 244.0649) iCreateJimmyStage++ ENDIF BREAK CASE 1 IF NOT IS_PED_INJURED(pedJimmy) // SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_BERD, 2, 0) // SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_TORSO, 5, 0) // SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_LEG, 3, 0) // SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_FEET, 4, 0) // SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_DECL, 2, 0) PRINTLN("VARIATIONS FOR JIMMY REQUESTED") SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_BERD, 0, 0) SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_TORSO, 0, 0) SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_LEG, 0, 0) SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_FEET, 0, 0) SET_PED_PRELOAD_VARIATION_DATA(pedJimmy, PED_COMP_DECL, 0, 0) iCreateJimmyStage++ ENDIF BREAK CASE 2 IF NOT IS_PED_INJURED(pedJimmy) IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(pedJimmy) // SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_BERD, 2, 0) // SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_TORSO, 5, 0) // SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_LEG, 3, 0) // SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_FEET, 4, 0) // SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_DECL, 2, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_BERD, 0, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_TORSO, 0, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_LEG, 0, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_FEET, 0, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_DECL, 0, 0) RELEASE_PED_PRELOAD_VARIATION_DATA(pedJimmy) SET_ENTITY_COORDS(pedJimmy, vPos) SET_ENTITY_HEADING(pedJimmy, fHead) SET_PED_AS_BUDDY(pedJimmy) RELEASE_PED_PRELOAD_VARIATION_DATA(pedJimmy) PRINTLN("VARIATIONS SET JIMMY IS READY") iCreateJimmyStage=0 RETURN TRUE ENDIF ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC INT iCreateTraceyStage = 0 FUNC BOOL CREATE_TRACEY(VECTOR vPos, FLOAT fHead) SWITCH iCreateTraceyStage CASE 0 IF CREATE_NPC_PED_ON_FOOT(pedTracy, CHAR_TRACEY, <<-808.0422, 168.5755, 75.7504>>, 244.0649) iCreateTraceyStage++ ENDIF BREAK CASE 1 IF NOT IS_PED_INJURED(pedTracy) SET_PED_PRELOAD_VARIATION_DATA(pedTracy, PED_COMP_HAIR, 3, 0) //(berd) SET_PED_PRELOAD_VARIATION_DATA(pedTracy, PED_COMP_TORSO, 4, 0) //(uppr) SET_PED_PRELOAD_VARIATION_DATA(pedTracy, PED_COMP_LEG, 4, 0) //(lowr) SET_PED_PRELOAD_VARIATION_DATA(pedTracy, PED_COMP_FEET, 2, 0) //(feet) SET_PED_PRELOAD_PROP_DATA(pedTracy, ANCHOR_HEAD, 0, 0) SET_PED_PRELOAD_PROP_DATA(pedTracy, ANCHOR_EYES, 1, 0) iCreateTraceyStage++ ENDIF BREAK CASE 2 IF NOT IS_PED_INJURED(pedTracy) IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(pedTracy) SET_PED_COMPONENT_VARIATION(pedTracy, PED_COMP_HAIR, 3, 0, 0) //(berd) SET_PED_COMPONENT_VARIATION(pedTracy, PED_COMP_TORSO, 4, 0, 0) //(uppr) SET_PED_COMPONENT_VARIATION(pedTracy, PED_COMP_LEG, 4, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(pedTracy, PED_COMP_FEET, 2, 0, 0) //(feet) SET_PED_PROP_INDEX(pedTracy, ANCHOR_HEAD, 0, 0) SET_PED_PROP_INDEX(pedTracy, ANCHOR_EYES, 1, 0) SET_ENTITY_COORDS(pedTracy, vPos) SET_ENTITY_HEADING(pedTracy, fHead) SET_PED_AS_BUDDY(pedTracy) RELEASE_PED_PRELOAD_VARIATION_DATA(pedTracy) RELEASE_PED_PRELOAD_PROP_DATA(pedTracy) iCreateTraceyStage=0 RETURN TRUE ENDIF ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC CREATE_BUDDY_IN_VEHICLE(PED_INDEX &ped, enumCharacterList CHAR, VEHICLE_INDEX &veh, VEHICLE_SEAT vs = VS_FRONT_RIGHT) IF IS_VEHICLE_DRIVEABLE(veh) IF NOT DOES_ENTITY_EXIST(ped) VECTOR vTemp FLOAT fTemp vTemp = GET_ENTITY_COORDS(veh) fTemp = GET_ENTITY_HEADING(veh) IF CHAR = CHAR_TRACEY WHILE NOT CREATE_TRACEY(vTemp, fTemp) WAIT(0) ENDWHILE ELSE WHILE NOT CREATE_JIMMY(vTemp, fTemp) WAIT(0) ENDWHILE ENDIF ELSE IF NOT IS_PED_INJURED(ped) AND IS_VEHICLE_DRIVEABLE(veh) IF NOT IS_PED_IN_VEHICLE(ped, veh) SET_PED_INTO_VEHICLE(ped, veh, vs) ENDIF ENDIF ENDIF ENDIF ENDPROC PROC CREATE_BUDDY_ON_FOOT(PED_INDEX &ped, enumCharacterList CHAR, VECTOR position, FLOAT heading) IF NOT DOES_ENTITY_EXIST(ped) IF CHAR = CHAR_TRACEY WHILE NOT CREATE_TRACEY(position, heading) WAIT(0) ENDWHILE ELSE WHILE NOT CREATE_JIMMY(position, heading) WAIT(0) ENDWHILE ENDIF IF NOT IS_PED_INJURED(ped) CLEAR_PED_TASKS(ped) ENDIF ELSE IF NOT IS_PED_INJURED(ped) SET_ENTITY_COORDS(ped, position) SET_ENTITY_HEADING(ped, heading) ENDIF ENDIF ENDPROC FUNC BOOL CREATE_MP3_DOCK() IF NOT DOES_ENTITY_EXIST(objMP3Dock) REQUEST_MODEL(PROP_MP3_DOCK) IF HAS_MODEL_LOADED(PROP_MP3_DOCK) objMP3Dock = CREATE_OBJECT(PROP_MP3_DOCK, <<-2032.538940,-1032.350342,5.421927>>) ENDIF ENDIF IF DOES_ENTITY_EXIST(objMP3Dock) SET_ENTITY_COORDS(objMP3Dock, <<-2032.538940,-1032.350342,5.421927>>) SET_ENTITY_ROTATION(objMP3Dock, <<-0.000000,0.000000,66.552299>>) ENDIF RETURN DOES_ENTITY_EXIST(objMP3Dock) ENDFUNC INT iDancingSceneStage INT iDancingSceneIndex PROC MANAGE_DANCING_SCENE() INT i SWITCH iDancingSceneStage CASE 0 IF current_mission_stage = stage_go_to_yacht AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), << -2033.821, -1031.864, 4.890 >>) < 250*250 REQUEST_MODEL(CSB_PORNDUDES) REQUEST_MODEL(A_F_Y_BEACH_01) REQUEST_ANIM_DICT("missfam2leadinoutmcs3") IF HAS_MODEL_LOADED(CSB_PORNDUDES) AND HAS_MODEL_LOADED(A_F_Y_BEACH_01) AND HAS_ANIM_DICT_LOADED("missfam2leadinoutmcs3") AND CREATE_TRACEY(<<-2033.23, -1032.27, 4.89>>, 0) IF NOT IS_PED_INJURED(pedTracy) pedBoatDancer[0] = CREATE_PED(PEDTYPE_MISSION, CSB_PORNDUDES, <<-2032.69, -1031.36, 5.59>>) SET_PED_LOD_MULTIPLIER(pedBoatDancer[0], 1.75) pedBoatDancer[1] = CREATE_PED(PEDTYPE_MISSION, CSB_PORNDUDES, <<-2034.42, -1032.71, 5.54>>) pedBoatDancer[2] = CREATE_PED(PEDTYPE_MISSION, A_F_Y_BEACH_01, <<-2033.32, -1031.07, 5.54>>) pedBoatDancer[3] = CREATE_PED(PEDTYPE_MISSION, A_F_Y_BEACH_01, <<-2034.48, -1031.60, 5.48>>) iDancingSceneIndex = CREATE_SYNCHRONIZED_SCENE(<< -2033.821, -1031.864, 4.890 >>, << -0.000, 0.000, -4.400 >>) TASK_SYNCHRONIZED_SCENE(pedBoatDancer[0], iDancingSceneIndex, "missfam2leadinoutmcs3", "onboat_leadin_pornguy_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) TASK_SYNCHRONIZED_SCENE(pedBoatDancer[1], iDancingSceneIndex, "missfam2leadinoutmcs3", "onboat_leadin_pornguy_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) TASK_SYNCHRONIZED_SCENE(pedBoatDancer[2], iDancingSceneIndex, "missfam2leadinoutmcs3", "onboat_leadin_porngal_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) TASK_SYNCHRONIZED_SCENE(pedBoatDancer[3], iDancingSceneIndex, "missfam2leadinoutmcs3", "onboat_leadin_porngal_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) TASK_SYNCHRONIZED_SCENE(pedTracy, iDancingSceneIndex, "missfam2leadinoutmcs3", "onboat_leadin_tracy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) SET_PED_COMPONENT_VARIATION(pedBoatDancer[0], PED_COMP_HEAD, 0, 0) SET_PED_COMPONENT_VARIATION(pedBoatDancer[0], PED_COMP_TORSO, 0, 0) SET_PED_COMPONENT_VARIATION(pedBoatDancer[0], PED_COMP_LEG, 0, 0) SET_PED_PROP_INDEX(pedBoatDancer[0], ANCHOR_EYES, 0, 0) SET_PED_COMPONENT_VARIATION(pedBoatDancer[1], PED_COMP_HEAD, 2, 0) SET_PED_COMPONENT_VARIATION(pedBoatDancer[1], PED_COMP_TORSO, 2, 0) SET_PED_COMPONENT_VARIATION(pedBoatDancer[1], PED_COMP_LEG, 2, 0) SET_PED_PROP_INDEX(pedBoatDancer[1], ANCHOR_HEAD, 0, 0) SET_SYNCHRONIZED_SCENE_LOOPED(iDancingSceneIndex, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(CSB_PORNDUDES) SET_MODEL_AS_NO_LONGER_NEEDED(A_F_Y_BEACH_01) SET_MODEL_AS_NO_LONGER_NEEDED(IG_TRACYDISANTO) iDancingSceneStage++ ENDIF ENDIF ENDIF BREAK CASE 1 PRE_STREAM_CUTSCENE_AT_DISTANCE("family_2_mcs_3", << -2033.821, -1031.864, 4.890 >>, DEFAULT_CUTSCENE_LOAD_DIST, b_cutscene_request) IF b_cutscene_request IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() REQUEST_VEHICLE_RECORDING(1, "famtwoplayer") PRINTLN("SETTING components from player") SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(pedBoatDancer[0]) AND NOT IS_PED_INJURED(pedBoatDancer[0]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Guy_on_sofa", pedBoatDancer[0]) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[1]) AND NOT IS_PED_INJURED(pedBoatDancer[1]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Man_getting_wood", pedBoatDancer[1]) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[2]) AND NOT IS_PED_INJURED(pedBoatDancer[2]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Girl_on_sofa", pedBoatDancer[2]) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[3]) AND NOT IS_PED_INJURED(pedBoatDancer[3]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Girl_being_chatted_up", pedBoatDancer[3]) ENDIF IF DOES_ENTITY_EXIST(pedTracy) AND NOT IS_PED_INJURED(pedTracy) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Tracy", pedTracy) ENDIF ENDIF ENDIF IF b_cutscene_request IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), << -2033.821, -1031.864, 4.890 >>) > DEFAULT_CUTSCENE_UNLOAD_DIST*DEFAULT_CUTSCENE_UNLOAD_DIST b_cutscene_request = FALSE REMOVE_CUTSCENE() ENDIF ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), << -2033.821, -1031.864, 4.890 >>) > 275*275 OR (current_mission_stage <> stage_go_to_yacht AND current_mission_stage <> stage_rescue) IF current_mission_stage <> stage_rescue BOOL bAllOffScreen bAllOffScreen = TRUE REPEAT COUNT_OF(pedBoatDancer) i IF NOT IS_PED_INJURED(pedBoatDancer[i]) IF NOT IS_ENTITY_OCCLUDED(pedBoatDancer[i]) bAllOffScreen = FALSE ENDIF ENDIF ENDREPEAT IF NOT IS_PED_INJURED(pedTracy) IF NOT IS_ENTITY_OCCLUDED(pedTracy) bAllOffscreen = FALSE ENDIF ENDIF IF bAllOffScreen REPEAT COUNT_OF(pedBoatDancer) i IF DOES_ENTITY_EXIST(pedBoatDancer[i]) CLEAR_PED_TASKS_IMMEDIATELY(pedBoatDancer[i]) DELETE_PED(pedBoatDancer[i]) PRINTLN("Deleting dancer ped ", i) ENDIF ENDREPEAT ENDIF iDancingSceneStage = 0 ENDIF ENDIF BREAK ENDSWITCH ENDPROC //------------------------------------------------------------------- //---------------------------------------------------- Misc functions INT iBikeShopStage FUNC BOOL SETUP_BIKE_SHOP(BOOL bAfterBikeHire = FALSE) REQUEST_MODEL(U_M_M_BIKEHIRE_01) REQUEST_MODEL(CRUISER) REQUEST_MODEL(BMX) REQUEST_MODEL(SCORCHER) REQUEST_MODEL(TRIBIKE) IF HAS_MODEL_LOADED(U_M_M_BIKEHIRE_01) AND HAS_MODEL_LOADED(CRUISER) AND HAS_MODEL_LOADED(BMX) AND HAS_MODEL_LOADED(SCORCHER) AND HAS_MODEL_LOADED(TRIBIKE) IF iMikeChoice <> 0 OR NOT bAfterbikeHire IF NOT DOES_ENTITY_EXIST(vehBikes[0]) vehBikes[0] = CREATE_VEHICLE(SCORCHER, <<-1106.8845, -1692.2295, 4.0189>>) //scorcher ENDIF IF IS_VEHICLE_DRIVEABLE(vehBikes[0]) SET_ENTITY_COORDS_NO_OFFSET(vehBikes[0], <<-1106.8845, -1692.2295, 4.0189>>) SET_ENTITY_QUATERNION(vehBikes[0], -0.0504, -0.0723, -0.4427, 0.8923) SET_VEHICLE_COLOUR_COMBINATION(vehBikes[0], 2) ENDIF ENDIF IF iJimmyChoice <> 1 AND iMikeChoice <> 1 OR NOT bAfterbikeHire IF NOT DOES_ENTITY_EXIST(vehBikes[1]) vehBikes[1] = CREATE_VEHICLE(CRUISER, <<-1108.3959, -1690.3990, 3.9549>>) // cruiser ENDIF IF IS_VEHICLE_DRIVEABLE(vehBikes[1]) SET_ENTITY_COORDS_NO_OFFSET(vehBikes[1], <<-1108.3959, -1690.3990, 3.9549>>) SET_ENTITY_QUATERNION(vehBikes[1], -0.0466, -0.0740, -0.4628, 0.8822) SET_VEHICLE_COLOUR_COMBINATION(vehBikes[1], 1) ENDIF ENDIF IF iMikeChoice <> 2 OR NOT bAfterbikeHire IF NOT DOES_ENTITY_EXIST(vehBikes[2]) vehBikes[2] = CREATE_VEHICLE(BMX, <<-1109.4050, -1688.7036, 3.7501>>) ENDIF IF IS_VEHICLE_DRIVEABLE(vehBikes[2]) SET_ENTITY_COORDS_NO_OFFSET(vehBikes[2], <<-1109.4050, -1688.7036, 3.7501>>) SET_ENTITY_QUATERNION(vehBikes[2], 0.0178, 0.0525, -0.4469, 0.8929) ENDIF ENDIF IF iMikeChoice <> 3 OR NOT bAfterbikeHire IF NOT DOES_ENTITY_EXIST(vehBikes[3]) vehBikes[3] = CREATE_VEHICLE(TRIBIKE, <<-1111.0010, -1686.6287, 3.9705>>) ENDIF IF IS_VEHICLE_DRIVEABLE(vehBikes[3]) SET_ENTITY_COORDS_NO_OFFSET(vehBikes[3], <<-1111.0010, -1686.6287, 3.9705>>) SET_ENTITY_QUATERNION(vehBikes[3], -0.0563, -0.0702, -0.5377, 0.8383) ENDIF ENDIF IF iJimmyChoice <> 4 AND iMikeChoice <> 4 OR NOT bAfterbikeHire IF NOT DOES_ENTITY_EXIST(vehBikes[4]) vehBikes[4] = CREATE_VEHICLE(CRUISER, <<-1105.6056, -1693.9800, 3.9518>>) //cruiser ENDIF IF IS_VEHICLE_DRIVEABLE(vehBikes[4]) SET_ENTITY_COORDS_NO_OFFSET(vehBikes[4], <<-1105.6056, -1693.9800, 3.9518>>) SET_ENTITY_QUATERNION(vehBikes[4], -0.0437, -0.0759, -0.4104, 0.9077) SET_VEHICLE_COLOUR_COMBINATION(vehBikes[4], 0) FREEZE_ENTITY_POSITION(vehBikes[4], TRUE) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(pedBikeGuy) pedBikeGuy = CREATE_PED(PEDTYPE_MISSION, U_M_M_BIKEHIRE_01, v_bike_guy_pos, f_bike_guy_heading) ENDIF CLEAR_PED_TASKS_IMMEDIATELY(pedBikeGuy) SET_PED_COMBAT_ATTRIBUTES(pedBikeGuy, CA_ALWAYS_FLEE, TRUE) SET_PED_FLEE_ATTRIBUTES(pedBikeGuy, FA_DISABLE_HANDS_UP, TRUE) SET_PED_FLEE_ATTRIBUTES(pedBikeGuy, FA_DISABLE_COWER, TRUE) ADD_PED_FOR_DIALOGUE(sSpeech, 4, pedBikeGuy, "FAM2BIKEHIRE") SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedBikeGuy, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(pedBikeGuy, RELGROUPHASH_HATES_PLAYER) SET_PED_CAN_BE_TARGETTED(pedBikeGuy, FALSE) SET_PED_SHOULD_IGNORE_SCENARIO_EXIT_COLLISION_CHECKS(pedBikeGuy, TRUE) INT iTemp REPEAT COUNT_OF(vehBikes) iTemp IF DOES_ENTITY_EXIST(vehBikes[iTemp]) SET_ENTITY_PROOFS(vehBikes[iTemp], TRUE, TRUE, TRUE, TRUE, TRUE) ENDIF ENDREPEAT ENDIF BOOL bReturn #IF IS_DEBUG_BUILD IF NOT DOES_ENTITY_EXIST(vehBikes[0]) println("vehBikes[0] doesn't exist") ENDIF IF NOT DOES_ENTITY_EXIST(vehBikes[1]) println("vehBikes[1] doesn't exist") ENDIF IF NOT DOES_ENTITY_EXIST(vehBikes[2]) println("vehBikes[2] doesn't exist") ENDIF IF NOT DOES_ENTITY_EXIST(vehBikes[3]) println("vehBikes[3] doesn't exist") ENDIF IF NOT DOES_ENTITY_EXIST(vehBikes[4]) println("vehBikes[4] doesn't exist") ENDIF IF NOT DOES_ENTITY_EXIST(pedBikeGuy) println("pedBikeGuy doesn't exist") ENDIF #ENDIF IF bAfterBikeHire BOOL bDone = TRUE INT i REPEAT COUNT_OF(vehBikes) i IF i <> iMikeChoice AND i <> iJimmyChoice IF NOT DOES_ENTITY_EXIST(vehBikes[i]) bDone = FALSE ENDIF ENDIF ENDREPEAT bReturn = bDone ELSE bReturn = DOES_ENTITY_EXIST(vehBikes[0]) AND DOES_ENTITY_EXIST(vehBikes[1]) AND DOES_ENTITY_EXIST(vehBikes[2]) AND DOES_ENTITY_EXIST(vehBikes[3]) AND DOES_ENTITY_EXIST(vehBikes[4]) AND DOES_ENTITY_EXIST(pedBikeGuy) ENDIF RETURN bReturn ENDFUNC PROC CLEANUP_BIKE_SHOP() IF DOES_ENTITY_EXIST(pedBikeGuy) DELETE_PED(pedBikeGuy) ENDIF INT iTemp REPEAT COUNT_OF(vehBikes) iTemp IF DOES_ENTITY_EXIST(vehBikes[iTemp]) DELETE_VEHICLE(vehBikes[iTemp]) ENDIF ENDREPEAT SET_MODEL_AS_NO_LONGER_NEEDED(TRIBIKE) SET_MODEL_AS_NO_LONGER_NEEDED(BMX) SET_MODEL_AS_NO_LONGER_NEEDED(CRUISER) SET_MODEL_AS_NO_LONGER_NEEDED(SCORCHER) SET_MODEL_AS_NO_LONGER_NEEDED(U_M_M_BIKEHIRE_01) ENDPROC FLOAT fAimTime PROC CHECK_FOR_RENTAL_STAND_INTERFERENCE() VEHICLE_INDEX vehTemp BOOL bInterference = FALSE BOOL bBikesHit = FALSE BOOL bWAntedFail = FALSE INT iTemp IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE()) vehTemp = GET_PLAYERS_LAST_VEHICLE() ENDIF ENDIF IF DOES_ENTITY_EXIST(vehTemp) AND IS_VEHICLE_DRIVEABLE(vehTemp) AND NOT IS_VEHICLE_MODEL(vehTemp, SCORCHER) AND NOT IS_VEHICLE_MODEL(vehTemp, CRUISER) AND NOT IS_VEHICLE_MODEL(vehTemp, TRIBIKE) AND NOT IS_VEHICLE_MODEL(vehTemp, BMX) IF ABSF(GET_ENTITY_SPEED(vehTemp)) > 2 IF IS_ENTITY_AT_COORD(vehTemp, <<-1106.308960,-1693.715454,5.123790>>,<<6.250000,7.000000,3.250000>>) REPEAT COUNT_OF(vehBikes) iTemp IF IS_VEHICLE_DRIVEABLE(vehBikes[iTemp]) IF IS_ENTITY_TOUCHING_ENTITY(vehBikes[iTemp], vehTemp) bBikesHit = TRUE ENDIF ENDIF ENDREPEAT ENDIF ENDIF ENDIF IF bInterference OR bBikesHit REPEAT COUNT_OF(vehBikes) iTemp IF IS_VEHICLE_DRIVEABLE(vehBikes[iTemp]) FREEZE_ENTITY_POSITION(vehBikes[iTemp], FALSE) APPLY_FORCE_TO_ENTITY(vehBikes[iTemp], APPLY_TYPE_FORCE, <<0,0,-0.001>>, <<0,0,0>>, 0, TRUE, TRUE, TRUE) ENDIF ENDREPEAT IF NOT IS_PED_INJURED(pedBikeGuy) IF bBikesHit Mission_Failed("FM2_BIKES") ENDIF ENDIF ENDIF //check for fail if you disrupt the scene at all BOOL bDisruptFail = FALSE IF NOT IS_PED_INJURED(pedBikeGuy) IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(pedBikeGuy), 20) OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(pedBikeGuy), 20) OR IS_PROJECTILE_IN_AREA(GET_ENTITY_COORDS(pedBikeGuy)+<<20,20,20>>, GET_ENTITY_COORDS(pedBikeGuy)-<<20,20,20>>) OR IS_PED_FLEEING(pedBikeGuy) OR (current_mission_stage = stage_hire_bike AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), v_bike_guy_pos, <<40,40,20>>)) bDisruptFail = TRUE ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedBikeGuy)) < 10*10 IF CAN_PED_SEE_HATED_PED(pedBikeGuy, PLAYER_PED_ID()) IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN | WF_INCLUDE_PROJECTILE ) AND IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), pedBikeGuy) fAimTime += GET_FRAME_TIME() IF fAimTime > 0.5 bDisruptFail = TRUE ENDIF ELSE IF fAimTime > 0 fAimTime -= GET_FRAME_TIME()*2.0 ELIF fAimTime <> 0.0 fAimTime = 0.0 ENDIF ENDIF ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedBikeGuy, PLAYER_PED_ID()) OR IS_PED_RAGDOLL(pedBikeGuy) bDisruptFail = TRUE ENDIF ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedBikeGuy)) < 400 AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 bWAntedFail = TRUE bDisruptFail = TRUE ENDIF // #IF IS_DEBUG_BUILD // DRAW_DEBUG_TEXT(GET_STRING_FROM_FLOAT(fAimTime), GET_ENTITY_COORDS(pedBikeGuy) + <<0,0,1>>) // #ENDIF ENDIF IF bDisruptFail REPEAT COUNT_OF(vehBikes) iTemp IF DOES_ENTITY_EXIST(vehBikes[iTemp]) FREEZE_ENTITY_POSITION(vehbikes[iTemp], FALSE) ENDIF ENDREPEAT IF NOT IS_PED_INJURED(pedBikeGuy) AND NOT IS_PED_FLEEING(pedBikeGuy) AND IS_PED_USING_ANY_SCENARIO(pedBikeGuy) SET_PED_SHOULD_PLAY_FLEE_SCENARIO_EXIT(pedBikeGuy, GET_ENTITY_COORDS(pedBikeGuy) + GET_ENTITY_FORWARD_VECTOR(pedBikeGuy)) TASK_SMART_FLEE_PED(pedBikeGuy, PLAYER_PED_ID(), 200, -1) ENDIF IF IS_VEHICLE_DRIVEABLE(vehJimmyBike) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike) STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) ENDIF ENDIF IF current_mission_stage = stage_drive_to_venice OR current_mission_stage = stage_hire_bike OR (current_mission_stage = stage_bike_ride AND IS_ENTITY_AT_ENTITY(pedjimmy, pedBikeGuy, <<30,30,30>>)) OR current_mission_stage = stage_lose_cops IF NOT IS_PED_INJURED(pedJimmy) SET_PED_FLEE_ATTRIBUTES(pedJimmy, FA_USE_VEHICLE, FALSE) TASK_SMART_FLEE_PED(pedJimmy, PLAYER_PED_ID(), 200, 20000) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(pedBikeGuy) AND (IS_ENTITY_DEAD(pedBikeGuy) OR IS_PED_INJURED(pedBikeGuy)) IF current_mission_stage < stage_bike_ride OR current_mission_stage = stage_bike_ride AND IS_ENTITY_AT_ENTITY(pedjimmy, pedBikeGuy, <<30,30,30>>) OR current_mission_stage = stage_lose_cops MISSION_FAILED("FM2_BGHIT") ENDIF ELSE IF (NOT IS_PED_INJURED(pedBikeGuy) AND IS_PED_FLEEING(pedBikeGuy) AND current_mission_stage < stage_bike_ride) OR fAimTime > 0.5 OR bWAntedFail Mission_Failed("FM2_BGRUN") ELIF NOT IS_PED_INJURED(pedJimmy) AND IS_PED_FLEEING(pedJimmy) PRINTLN("JIMMY SPOOK 1") Mission_Failed("FM2_JSPOOK") ENDIF ENDIF IF DOES_ENTITY_EXIST(vehTemp) vehTemp = NULL ENDIF ENDPROC BOOL bChairFrozen PROC MANAGE_BIKE_SHOP() SWITCH iBikeShopStage CASE 0 IF current_mission_stage < stage_bike_ride OR (current_mission_stage = stage_lose_cops AND eSavedStage < stage_bike_ride) IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_bike_guy_pos) < 200*200 #IF IS_DEBUG_BUILD PRINTLN("\n\nBike hire debug: WITHIN BIKE HIRE RANGE\n\n") #ENDIF iBikeShopStage++ ENDIF ENDIF BREAK CASE 1 BOOL bAfterHire bAfterHire = FALSE IF (current_mission_stage > stage_hire_bike AND current_mission_stage != stage_lose_cops) OR (current_mission_stage = stage_lose_cops AND eSavedStage > stage_hire_bike) bAfterHire = TRUE ENDIF IF SETUP_BIKE_SHOP(bAfterHire) #IF IS_DEBUG_BUILD PRINTLN("\n\nBike hire debug: BIKE HIRE SET UP\n\n") #ENDIF fAimTime = 0.0 iBikeShopStage++ ENDIF BREAK CASE 2 IF NOT bChairFrozen IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1105.2411, -1697.0247, 3.3678>>, 2, PROP_TABLE_03_CHR) OBJECT_INDEX objTemp objTemp = GET_CLOSEST_OBJECT_OF_TYPE(<<-1105.2411, -1697.0247, 3.3678>>, 2, PROP_TABLE_03_CHR) SET_ENTITY_PROOFS(objTemp, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) FREEZE_ENTITY_POSITION(objTemp, TRUE) bChairFrozen = TRUE ENDIF ENDIF IF NOT IS_PED_INJURED(pedBikeGuy) IF NOT IS_PED_FLEEING(pedBikeGuy) IF NOT IS_PED_USING_SCENARIO(pedBikeGuy, "PROP_HUMAN_SEAT_CHAIR") SET_ENTITY_COORDS(pedBikeGuy, v_bike_guy_pos) IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(v_bike_guy_pos, "PROP_HUMAN_SEAT_CHAIR", 2, TRUE) TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedBikeGuy, <<-1105.2411, -1697.0247, 3.3678>>, 2) ENDIF ENDIF ENDIF ENDIF INT iTemp REPEAT COUNT_OF(vehBikes) iTemp IF DOES_ENTITY_EXIST(vehBikes[iTemp]) AND IS_VEHICLE_DRIVEABLE(vehBikes[iTemp]) IF current_mission_stage <= stage_hire_bike IF VDIST2(GET_ENTITY_COORDS(vehBikes[iTemp]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 9 DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT) ENDIF ENDIF IF current_mission_stage < stage_hire_bike IF GET_VEHICLE_DOOR_LOCK_STATUS(vehBikes[iTemp]) != VEHICLELOCK_LOCKED SET_VEHICLE_DOORS_LOCKED(vehBikes[iTemp], VEHICLELOCK_LOCKED) ENDIF ELSE IF GET_VEHICLE_DOOR_LOCK_STATUS(vehBikes[iTemp]) = VEHICLELOCK_LOCKED SET_VEHICLE_DOORS_LOCKED(vehBikes[iTemp], VEHICLELOCK_UNLOCKED) ENDIF ENDIF ENDIF ENDREPEAT CHECK_FOR_RENTAL_STAND_INTERFERENCE() IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_bike_guy_pos) > 210*210 #IF IS_DEBUG_BUILD PRINTLN("\n\nBike hire debug: BIKE HIRE CLEANING UP\n\n") #ENDIF CLEANUP_BIKE_SHOP() iBikeShopStage = 0 ENDIF BREAK ENDSWITCH ENDPROC PROC SETUP_VEHICLE(VEH_TYPE veh, VECTOR position, FLOAT heading) SWITCH veh CASE CAR IF NOT DOES_ENTITY_EXIST(vehPlayerCar) WHILE NOT CREATE_PLAYER_VEHICLE(vehPlayerCar, CHAR_MICHAEL, position, heading) WAIT(0) ENDWHILE SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehPlayerCar, SC_DOOR_FRONT_LEFT, FALSE) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehPlayerCar, SC_DOOR_FRONT_RIGHT, FALSE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehPlayerCar, TRUE) SET_VEHICLE_NAME_DEBUG(vehPlayerCar, "Mike's Car") ELSE IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) SET_ENTITY_COORDS(vehPlayerCar, position) SET_ENTITY_HEADING(vehPlayerCar, heading) ENDIF ENDIF BREAK CASE SEA_SHARK IF NOT DOES_ENTITY_EXIST(vehPlayerSeashark) REQUEST_MODEL(SEASHARK) WHILE NOT HAS_MODEL_LOADED(SEASHARK) WAIT(0) ENDWHILE vehPlayerSeashark = CREATE_VEHICLE(SEASHARK, position, heading) SET_VEHICLE_NAME_DEBUG(vehPlayerSeashark, "Mike's Seashark") SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, FALSE, TRUE) SET_VEHICLE_COLOUR_COMBINATION(vehPlayerSeashark, 1) SET_VEH_RADIO_STATION(vehPlayerSeashark, "OFF") INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vehPlayerSeashark, FAM2_FASTEST_SPEED) ELSE IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_ENTITY_COORDS(vehPlayerSeashark, position) SET_ENTITY_HEADING(vehPlayerSeashark, heading) ENDIF ENDIF BREAK CASE JIMMY_BIKE IF NOT DOES_ENTITY_EXIST(vehJimmyBike) // REQUEST_MODEL(CRUISER) // WHILE NOT HAS_MODEL_LOADED(CRUISER) // WAIT(0) // ENDWHILE REQUEST_MODEL(CRUISER) WHILE NOT HAS_MODEL_LOADED(CRUISER) WAIT(0) ENDWHILE vehJimmyBike = CREATE_VEHICLE(CRUISER, position, heading) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehJimmyBike, FALSE) SET_VEHICLE_NAME_DEBUG(vehJimmyBike, "Jimmy's Bike") SET_VEHICLE_COLOUR_COMBINATION(vehJimmyBike, 0) ELSE IF IS_VEHICLE_DRIVEABLE(vehJimmyBike) SET_ENTITY_COORDS(vehJimmyBike, position) SET_ENTITY_HEADING(vehJimmyBike, heading) ENDIF ENDIF BREAK CASE BIKE IF NOT DOES_ENTITY_EXIST(vehPlayerBike) REQUEST_MODEL(CRUISER) WHILE NOT HAS_MODEL_LOADED(CRUISER) WAIT(0) ENDWHILE vehPlayerBike = CREATE_VEHICLE(CRUISER, position, heading) SET_VEHICLE_NAME_DEBUG(vehPlayerBike, "Mike's Bike") SET_ENTITY_PROOFS(vehPlayerBike, FALSE, TRUE, FALSE, FALSE,FALSE) SET_VEHICLE_TYRES_CAN_BURST(vehPlayerBike, FALSE) SET_VEHICLE_COLOUR_COMBINATION(vehPlayerBike, 1) ELSE IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) SET_ENTITY_COORDS(vehPlayerBike, position) SET_ENTITY_HEADING(vehPlayerBike, heading) ENDIF ENDIF BREAK ENDSWITCH ENDPROC FUNC BOOL IS_PED_GROUPED(PED_INDEX ped) IF IS_PED_GROUP_MEMBER(ped, GET_PLAYER_GROUP(PLAYER_ID())) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), ped, <<50,50,50>>) // PRINTLN("GROUP CHECK 1 TRUE") //REMOVE_PED_FROM_GROUP(ped) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) OR GET_CAN_PED_BE_GRABBED_BY_SCRIPT(pedJImmy, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) REMOVE_PED_FROM_GROUP(ped) #IF IS_DEBUG_BUILD //PRINTLN("REMOVE JIMMY FROM GROUP!!") #ENDIF ELSE #IF IS_DEBUG_BUILD //PRINTLN("GET_CAN_PED_BE_GRABBED_BY_SCRIPT, returned FALSE") #ENDIF ENDIF ENDIF RETURN TRUE ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), ped, g_vAnyMeansLocate) SET_PED_AS_GROUP_MEMBER(ped, GET_PLAYER_GROUP(PLAYER_ID())) ENDIF ENDIF IF GET_CAN_PED_BE_GRABBED_BY_SCRIPT(ped, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) //PRINTLN("GET_CAN_PED_BE_GRABBED_BY_SCRIPT(pedJImmy, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE)") ENDIF IF GET_CAN_PED_BE_GRABBED_BY_SCRIPT(ped, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE) //PRINTLN("GET_CAN_PED_BE_GRABBED_BY_SCRIPT(pedJImmy, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE)") ENDIF RETURN FALSE ENDFUNC FUNC BOOL CHILD_ABUSE(PED_INDEX child) IF DOES_ENTITY_EXIST(child) AND NOT IS_PED_INJURED(child) //IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(child, PLAYER_PED_ID()) IF IS_ENTITY_ON_FIRE(child) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL CREATE_WATER_PED() IF NOT DOES_ENTITY_EXIST(pedBoatDancer[0]) REQUEST_MODEL(CSB_PORNDUDES) IF HAS_MODEL_LOADED(CSB_PORNDUDES) pedBoatDancer[0] = CREATE_PED(PEDTYPE_MISSION, CSB_PORNDUDES, <<-2028.3362, -1026.3871, 0.0897>>, 222.4424) IF bWaterComponentsGrabbed INT iTemp REPEAT COUNT_OF(PED_COMPONENT) iTemp SET_PED_COMPONENT_VARIATION(pedBoatDancer[0], INT_TO_ENUM(PED_COMPONENT, iTemp), iWaterComponents[iTemp][0], iWaterComponents[iTemp][1]) ENDREPEAT ENDIF SET_PED_DIES_IN_WATER(pedBoatDancer[0], FALSE) SET_PED_COMBAT_ATTRIBUTES(pedBoatDancer[0], CA_ALWAYS_FLEE, TRUE) SET_PED_LOD_MULTIPLIER(pedBoatDancer[0], 1.75) // SET_PED_RELATIONSHIP_GROUP_HASH(pedBoatDancer[0], rgChasers) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedBoatDancer[0], TRUE) TASK_LOOK_AT_ENTITY(pedBoatDancer[0], PLAYER_PED_ID(), -1, SLF_EXTEND_YAW_LIMIT, SLF_LOOKAT_HIGH) ENDIF ENDIF RETURN DOES_ENTITY_EXIST(pedBoatDancer[0]) ENDFUNC FUNC BOOL IS_SEASHARK_GROUNDED(VEHICLE_INDEX &veh, FLOAT &fGroundTime, BOOL &bGroundCheck) bGroundCheck = TRUE IF NOT IS_ENTITY_DEAD(veh) IF NOT IS_ENTITY_IN_WATER(veh) AND GET_ENTITY_SPEED(veh) < 2 fGroundTime+=GET_FRAME_TIME() PRINTLN(fGroundTime) RETURN fGroundTime > 3.0 ELSE fGroundTime = 0 ENDIF ENDIF RETURN FALSE ENDFUNC //------------------------------------------------------------------- //------------------------------------------------------- Stage inits PROC SET_ALL_SCRIPT_VARS_TO_DEFAULT() b_cutscene_request = FALSE in_car_conv_started = FALSE in_car_conv_on_hold = FALSE sConvResumeLabel = "" iCurrentDriveConv = 0 bGoBackToJimmyPrinted = FALSE bGoBackToTracyPrinted = FALSE SETTIMERA(0) SETTIMERB(0) ENDPROC PROC REMOVE_ALL_SCRIPT_BLIPS REMOVE_BLIP(blipPlayerVeh) REMOVE_BLIP(blipPornBoat) REMOVE_BLIP(blipBuddy) REMOVE_BLIP(blipPlayerVeh) REMOVE_BLIP(blipDest) ENDPROC FUNC INT GET_PLAYABLE_STAGE_INDEX(MISSION_STAGE_FLAG stage) INT iTemp REPEAT COUNT_OF(mission_stages) iTemp IF mission_stages[iTemp] = stage RETURN iTemp ENDIF ENDREPEAT RETURN -1 ENDFUNC FUNC BOOL PRE_INIT_ASSETS(MISSION_STAGE_FLAG stage) INT iTemp MODEL_NAMES stage_models[10] REPEAT COUNT_OF(stage_models) iTemp stage_models[iTemp] = DUMMY_MODEL_FOR_SCRIPT ENDREPEAT INT stage_recs[3] REPEAT COUNT_OF(stage_recs) iTemp stage_recs[iTemp] = 0 ENDREPEAT SWITCH stage CASE stage_intro //stage_models[0] = IG_JIMMYDISANTO BREAK CASE stage_drive_to_venice stage_models[0] = IG_JIMMYDISANTO stage_models[1] = TAILGATER stage_models[2] = CRUISER stage_models[3] = GET_NPC_VEH_MODEL(CHAR_TRACEY, VEHICLE_TYPE_CAR) BREAK CASE stage_hire_bike stage_models[0] = IG_JIMMYDISANTO stage_models[1] = TAILGATER stage_models[2] = U_M_M_BIKEHIRE_01 stage_models[3] = CRUISER stage_recs[0] = i_jimmy_bike_rec stage_recs[1] = 1 BREAK CASE stage_bike_ride stage_models[0] = IG_JIMMYDISANTO stage_models[1] = TAILGATER stage_models[2] = U_M_M_BIKEHIRE_01 stage_models[3] = CRUISER stage_recs[0] = i_jimmy_bike_rec stage_recs[1] = 1 BREAK CASE stage_telltale stage_models[0] = IG_JIMMYDISANTO stage_models[1] = CRUISER BREAK CASE stage_go_to_yacht stage_models[0] = IG_JIMMYDISANTO stage_models[1] = CRUISER stage_models[2] = SEASHARK stage_models[3] = A_M_Y_MUSCLBEAC_01 BREAK CASE stage_rescue stage_models[0] = SEASHARK stage_models[1] = IG_TRACYDISANTO BREAK CASE stage_speedophile_chase stage_models[0] = SEASHARK stage_models[1] = IG_TRACYDISANTO stage_models[2] = CSB_PORNDUDES stage_models[3] = IG_JIMMYDISANTO BREAK CASE stage_drive_to_beach stage_models[0] = SEASHARK stage_models[1] = IG_TRACYDISANTO stage_models[2] = IG_JIMMYDISANTO BREAK CASE stage_finish stage_models[0] = SEASHARK stage_models[1] = IG_TRACYDISANTO stage_models[2] = IG_JIMMYDISANTO BREAK ENDSWITCH BOOL bLoaded = TRUE REPEAT COUNT_OF(stage_models) iTemp IF stage_models[iTemp] <> DUMMY_MODEL_FOR_SCRIPT REQUEST_MODEL(stage_models[iTemp]) IF NOT HAS_MODEL_LOADED(stage_models[iTemp]) bLoaded = FALSE ENDIF ENDIF ENDREPEAT REPEAT COUNT_OF(stage_recs) iTemp IF stage_recs[iTemp] <> 0 REQUEST_VEHICLE_RECORDING(stage_recs[iTemp], "fam2") IF NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(stage_recs[iTemp], "fam2") bLoaded = FALSE ENDIF ENDIF ENDREPEAT RETURN bLoaded ENDFUNC STRUCT AMBIENT_BOAT_STRUCT VEHICLE_INDEX m_Veh PED_INDEX m_Ped INT m_iStage INT m_iRec VECTOR m_vTriggerPoint BOOL bOnRecording ENDSTRUCT AMBIENT_BOAT_STRUCT sMarinaBoats[2] FUNC BOOL CREATE_AMBIENT_BOAT_FOR_CHASE(INT iBoatIndex, MODEL_NAMES paramBoatModel, VECTOR paramCoords) REQUEST_MODEL(paramBoatModel) REQUEST_MODEL(A_M_Y_GENSTREET_01) REQUEST_VEHICLE_RECORDING(iBoatIndex + 1, "fam2amb") IF HAS_MODEL_LOADED(paramBoatModel) AND HAS_MODEL_LOADED(A_M_Y_GENSTREET_01) AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iBoatIndex + 1, "fam2amb") sMarinaBoats[iBoatIndex].m_Veh = CREATE_VEHICLE(paramBoatModel, paramCoords) sMarinaBoats[iBoatIndex].m_Ped = CREATE_PED_INSIDE_VEHICLE(sMarinaBoats[iBoatIndex].m_Veh, PEDTYPE_MISSION, A_M_Y_GENSTREET_01) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sMarinaBoats[iBoatIndex].m_Ped, TRUE) START_PLAYBACK_RECORDED_VEHICLE(sMarinaBoats[iBoatIndex].m_Veh, iBoatIndex+1, "fam2amb") SET_VEHICLE_DOORS_LOCKED(sMarinaBoats[iBoatIndex].m_Veh, VEHICLELOCK_LOCKED) SET_MODEL_AS_NO_LONGER_NEEDED(paramBoatModel) SET_MODEL_AS_NO_LONGER_NEEDED(A_M_Y_GENSTREET_01) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC CLEANUP_AMBIENT_BOATS(BOOL bForceDelete = FALSE) INT iTemp REPEAT COUNT_OF(sMarinaBoats) iTemp IF DOES_ENTITY_EXIST(sMarinaBoats[iTemp].m_Ped) IF NOT bForceDelete SET_PED_AS_NO_LONGER_NEEDED(sMarinaBoats[iTemp].m_Ped) ELSE DELETE_PED(sMarinaBoats[iTemp].m_Ped) ENDIF ENDIF IF DOES_ENTITY_EXIST(sMarinaBoats[iTemp].m_Veh) IF NOT bForceDelete SET_VEHICLE_AS_NO_LONGER_NEEDED(sMarinaBoats[iTemp].m_Veh) ELSE DELETE_VEHICLE(sMarinaBoats[iTemp].m_Veh) ENDIF ENDIF REMOVE_VEHICLE_RECORDING(iTemp+1, "fam2amb") ENDREPEAT ENDPROC STRUCT AMBIENT_BOAT_TRIGGER VECTOR m_vStart VECTOR m_vTriggerSize VECTOR m_vTarget FLOAT m_fHeading ENDSTRUCT FUNC AMBIENT_BOAT_TRIGGER GET_TRIGGER_INFO_FOR_AMBIENT_BOAT(INT iBoatIndex) AMBIENT_BOAT_TRIGGER sReturnTrigger SWITCH iBoatIndex CASE 0 sReturnTrigger.m_vStart = <<-935.5378, -1633.7369, 0.3306>> sReturnTrigger.m_vTriggerSize = <<62.750000,48.750000,11.000000>> sReturnTrigger.m_vTarget = <<-997.8688, -1383.0035, 0.4060>> sReturnTrigger.m_fHeading = 314.1291 BREAK CASE 1 sReturnTrigger.m_vStart = <<-928.3334, -1359.1943, 0.3531>> sReturnTrigger.m_vTriggerSize = <<28.250000,34.750000,11.000000>> sReturnTrigger.m_vTarget = <<-723.3589, -1350.0933, 0.3208>> sReturnTrigger.m_fHeading = 294.1011 BREAK ENDSWITCH RETURN sReturnTrigger ENDFUNC PROC INIT_MARINA_BOATS() sMarinaBoats[0].m_vTriggerPoint = <<-857.031433,-1415.792114,1.034999>> sMarinaBoats[0].m_iStage = 0 sMarinaBoats[1].m_vTriggerPoint = <<-1037.352417,-1272.711060,-6.625715>> sMarinaBoats[1].m_iStage = 0 ENDPROC PROC MANAGE_AMBIENT_MARINA_BOATS() INT iTemp REPEAT COUNT_OF(sMarinaBoats) iTemp SWITCH sMarinaBoats[iTemp].m_iStage CASE 0 IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), sMarinaBoats[iTemp].m_vTriggerPoint) < 50*50 AMBIENT_BOAT_TRIGGER ambTrigger ambTrigger = GET_TRIGGER_INFO_FOR_AMBIENT_BOAT(iTemp) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), sMarinaBoats[iTemp].m_vTriggerPoint, ambTrigger.m_vTriggerSize) IF CREATE_AMBIENT_BOAT_FOR_CHASE(iTemp, SQUALO, ambTrigger.m_vStart) REPLAY_RECORD_BACK_FOR_TIME(2.0, 8.0, REPLAY_IMPORTANCE_HIGH) sMarinaBoats[iTemp].m_iStage++ ENDIF ENDIF #IF IS_DEBUG_BUILD DRAW_DEBUG_BOX(sMarinaBoats[iTemp].m_vTriggerPoint - ambTrigger.m_vTriggerSize, sMarinaBoats[iTemp].m_vTriggerPoint + ambTrigger.m_vTriggerSize, 1, 0, 255, 0) DRAW_DEBUG_SPHERE(ambTrigger.m_vStart, 2, 255, 0, 0) DRAW_DEBUG_LINE(sMarinaBoats[iTemp].m_vTriggerPoint + <<0,0,2>>, ambTrigger.m_vStart + <<0,0,2>>, 255, 0, 0) DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(iTemp), ambTrigger.m_vStart + <<0,0,1.8>>) #ENDIF ENDIF #IF IS_DEBUG_BUILD DRAW_DEBUG_SPHERE(sMarinaBoats[iTemp].m_vTriggerPoint, 1, 0, 255, 0) DRAW_DEBUG_LINE(sMarinaBoats[iTemp].m_vTriggerPoint, sMarinaBoats[iTemp].m_vTriggerPoint + <<0,0,2>>, 0, 255, 0) DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(iTemp), sMarinaBoats[iTemp].m_vTriggerPoint + <<0,0,1.8>>) #ENDIF BREAK CASE 1 IF NOT IS_PED_INJURED(sMarinaBoats[iTemp].m_Ped) AND IS_VEHICLE_DRIVEABLE(sMarinaBoats[iTemp].m_Veh) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMarinaBoats[iTemp].m_Veh) AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sMarinaBoats[iTemp].m_Veh) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sMarinaBoats[iTemp].m_Veh, <<5,5,5>>) OR (IS_VEHICLE_DRIVEABLE(vehChasers[0]) AND IS_ENTITY_AT_ENTITY(vehChasers[0], sMarinaBoats[iTemp].m_Veh, <<5,5,5>>)) OR (IS_VEHICLE_DRIVEABLE(vehChasers[1]) AND IS_ENTITY_AT_ENTITY(vehChasers[1], sMarinaBoats[iTemp].m_Veh, <<5,5,5>>)) SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER(sMarinaBoats[iTemp].m_Veh, 5000, DRIVINGMODE_AVOIDCARS, TRUE) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(sMarinaBoats[iTemp].m_Veh) AND DOES_ENTITY_EXIST(sMarinaBoats[iTemp].m_Ped) AND ( //Has ped finished driving to target (NOT IS_PED_INJURED(sMarinaBoats[iTemp].m_Ped) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMarinaBoats[iTemp].m_veh)) //is the ped or the boat damaged OR IS_PED_INJURED(sMarinaBoats[iTemp].m_Ped) OR NOT IS_VEHICLE_DRIVEABLE(sMarinaBoats[iTemp].m_Veh) ) IF VDIST2(GET_ENTITY_COORDS(sMarinaBoats[iTemp].m_Ped), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100*100 AND VDIST2(GET_ENTITY_COORDS(sMarinaBoats[iTemp].m_Veh), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100*100 SET_PED_AS_NO_LONGER_NEEDED(sMarinaBoats[iTemp].m_Ped) SET_VEHICLE_AS_NO_LONGER_NEEDED(sMarinaBoats[iTemp].m_Veh) ENDIF ENDIF BREAK ENDSWITCH ENDREPEAT ENDPROC PROC SET_WATER_CALM(BOOL bCalm, FLOAT iFade = 1.0) IF bCalm // WATER_OVERRIDE_FADE_IN(iFade) // // WATER_OVERRIDE_SET_OCEANNOISEMINAMPLITUDE(0.25) // WATER_OVERRIDE_SET_OCEANWAVEAMPLITUDE(0.1) // WATER_OVERRIDE_SET_OCEANWAVEMINAMPLITUDE(0.05) // WATER_OVERRIDE_SET_OCEANWAVEMAXAMPLITUDE(0.15) // // WATER_OVERRIDE_SET_SHOREWAVEAMPLITUDE(0.2) // WATER_OVERRIDE_SET_SHOREWAVEMINAMPLITUDE(0.05) // WATER_OVERRIDE_SET_SHOREWAVEMAXAMPLITUDE(0.4) // // WATER_OVERRIDE_SET_RIPPLEBUMPINESS(0.25) // WATER_OVERRIDE_SET_RIPPLEDISTURB(0.5) // WATER_OVERRIDE_SET_RIPPLEMAXBUMPINESS(0.4) // WATER_OVERRIDE_SET_RIPPLEMINBUMPINESS(0.125) // // WATER_OVERRIDE_SET_STRENGTH(0.5) WATER_OVERRIDE_FADE_IN(iFade) WATER_OVERRIDE_SET_OCEANNOISEMINAMPLITUDE(0.35) WATER_OVERRIDE_SET_OCEANWAVEAMPLITUDE(0.3) WATER_OVERRIDE_SET_OCEANWAVEMINAMPLITUDE(0.25) WATER_OVERRIDE_SET_OCEANWAVEMAXAMPLITUDE(0.35) WATER_OVERRIDE_SET_SHOREWAVEAMPLITUDE(0.4) WATER_OVERRIDE_SET_SHOREWAVEMINAMPLITUDE(0.25) WATER_OVERRIDE_SET_SHOREWAVEMAXAMPLITUDE(0.55) WATER_OVERRIDE_SET_RIPPLEBUMPINESS(0.45) WATER_OVERRIDE_SET_RIPPLEDISTURB(0.5) WATER_OVERRIDE_SET_RIPPLEMAXBUMPINESS(0.6) WATER_OVERRIDE_SET_RIPPLEMINBUMPINESS(0.25) WATER_OVERRIDE_SET_STRENGTH(0.75) ELSE WATER_OVERRIDE_FADE_OUT(iFade) ENDIF ENDPROC //╞═════════╡STAT WATCHING FLOAT fDriveToVeniceCarHealth //BOOL bDriveToVeniceTopSpeedCheck = FALSE BOOL bBikeRidePlayerOnBike = FALSE BOOL bBikeRideWindowOpen = FALSE BOOL bBikeRideWindowClosed = FALSE BOOL bBikeHireChoiceMade = FALSE BOOL bGoToYachtWindowOpen = FALSE BOOL bGoToYachtWindowClosed = FALSE BOOL bLoseSeasharkWindowOpen = FALSE BOOL bLoseSeasharkWindowClosed = FALSE BOOL bStatsInitialised = FALSE PROC WATCH_STATS_FOR_MISSION() IF NOT bStatsInitialised fDriveToVeniceCarHealth = 0 // bDriveToVeniceTopSpeedCheck = FALSE bBikeRidePlayerOnBike = FALSE bBikeRideWindowOpen = FALSE bBikeRideWindowClosed = FALSE bBikeHireChoiceMade = FALSE bGoToYachtWindowOpen = FALSE bGoToYachtWindowClosed = FALSE bLoseSeasharkWindowOpen = FALSE bLoseSeasharkWindowClosed = FALSE bStatsInitialised = TRUE ENDIF SWITCH current_mission_stage CASE stage_drive_to_venice IF DOES_ENTITY_EXIST(vehPlayerCar) AND IS_VEHICLE_DRIVEABLE(vehPlayerCar) // IF NOT bDriveToVeniceTopSpeedCheck // IF GET_ENTITY_SPEED(vehPlayerCar) >= GET_VEHICLE_ESTIMATED_MAX_SPEED(vehPlayerCar) // PRINTLN("\n\n\n\nStat Increment: FAM2_MAX_CAR_SPEED\n\n\n\n\n") // INFORM_MISSION_STATS_OF_INCREMENT(FAM2_MAX_CAR_SPEED) // bDriveToVeniceTopSpeedCheck = TRUE // ENDIF // ELSE // IF GET_ENTITY_SPEED(vehPlayerCar) < GET_VEHICLE_ESTIMATED_MAX_SPEED(vehPlayerCar) // bDriveToVeniceTopSpeedCheck = FALSE // ENDIF // ENDIF IF fDriveToVeniceCarHealth > GET_ENTITY_HEALTH(vehPlayerCar)+GET_VEHICLE_ENGINE_HEALTH(vehPlayerCar) PRINTLN("\n\n\n\n\Stat Increment: FAM2_CAR_DAMAGE\n\n\n\n\n") INFORM_MISSION_STATS_OF_INCREMENT(FAM2_CAR_DAMAGE) ENDIF fDriveToVeniceCarHealth = GET_ENTITY_HEALTH(vehPlayerCar)+GET_VEHICLE_ENGINE_HEALTH(vehPlayerCar) ELSE fDriveToVeniceCarHealth = 0 ENDIF BREAK CASE stage_hire_bike IF NOT bBikeHireChoiceMade IF DOES_ENTITY_EXIST(vehPlayerBike) AND IS_VEHICLE_DRIVEABLE(vehPlayerBike) IF IS_VEHICLE_MODEL(vehPlayerBike, TRIBIKE) INFORM_MISSION_STATS_OF_INCREMENT(FAM2_CHOICES, 0, TRUE) PRINTLN("\n\n\n\n\Stat Increment: FAM2_CHOICES TRIALS \n\n\n\n\n") ENDIF IF IS_VEHICLE_MODEL(vehPlayerBike, BMX) INFORM_MISSION_STATS_OF_INCREMENT(FAM2_CHOICES, 1, TRUE) PRINTLN("\n\n\n\n\Stat Increment: FAM2_CHOICES BMX \n\n\n\n\n") ENDIF IF IS_VEHICLE_MODEL(vehPlayerBike, CRUISER) INFORM_MISSION_STATS_OF_INCREMENT(FAM2_CHOICES, 2, TRUE) PRINTLN("\n\n\n\n\Stat Increment: FAM2_CHOICES CRUISER \n\n\n\n\n") ENDIF IF IS_VEHICLE_MODEL(vehPlayerBike, SCORCHER) INFORM_MISSION_STATS_OF_INCREMENT(FAM2_CHOICES, 3, TRUE) PRINTLN("\n\n\n\n\Stat Increment: FAM2_CHOICES SCORCHER \n\n\n\n\n") ENDIF bBikeHireChoiceMade = TRUE ENDIF ENDIF BREAK CASE stage_bike_ride IF NOT bBikeRideWindowOpen INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FAM2_CYCLING_TIME) PRINTLN("\n\n\n\n\Stat Window open: FAM2_CYCLING_TIME \n\n\n\n\n") bBikeRideWindowOpen = TRUE ELSE IF NOT bBikeRideWindowClosed IF bPlayerDone PRINTLN("\n\n\n\n\Stat Window closed: FAM2_CYCLING_TIME \n\n\n\n\n") INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() bBikeRideWindowClosed = TRUE ENDIF ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) IF NOT bBikeRidePlayerOnBike IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) bBikeRidePlayerOnBike = TRUE ENDIF ELSE IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF IS_PED_RAGDOLL(PLAYER_PED_ID()) INFORM_MISSION_STATS_OF_INCREMENT(FAM2_FELL_OFF_BIKE) PRINTLN("\n\n\n\n\Stat Increment: FAM2_FELL_OFF_BIKE \n\n\n\n\n") ENDIF bBikeRidePlayerOnBike = FALSE ENDIF ENDIF ENDIF BREAK CASE stage_go_to_yacht IF NOT bGoToYachtWindowOpen INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FAM2_FAST_SWIM) PRINTLN("\n\n\n\n\Stat Window Open: FAM2_FAST_SWIM \n\n\n\n\n") bGoToYachtWindowOpen = TRUE ELSE IF NOT bGoToYachtWindowClosed IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-2022.823975,-1045.761963,1.449759>>, <<-2018.303589,-1032.236328,4.478201>>, 8.000000) INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() PRINTLN("\n\n\n\n\Stat Window Closed: FAM2_FAST_SWIM \n\n\n\n\n") bGoToYachtWindowClosed = TRUE ENDIF ENDIF ENDIF BREAK CASE stage_speedophile_chase IF NOT bLoseSeasharkWindowOpen IF DOES_BLIP_EXIST(blipChasers[0]) INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FAM2_LOSE_JETSKI) PRINTLN("\n\n\n\n\Stat Window Open: FAM2_LOSE_JETSKI \n\n\n\n\n") bLoseSeasharkWindowOpen = TRUE ENDIF ELSE IF NOT bLoseSeasharkWindowClosed IF (NOT DOES_ENTITY_EXIST(pedChasers[0]) AND NOT DOES_ENTITY_EXIST(vehChasers[0])) OR IS_PED_INJURED(pedChasers[0]) PRINTLN("\n\n\n\n\Stat Window Closed: FAM2_LOSE_JETSKI \n\n\n\n\n") INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() bLoseSeasharkWindowClosed = TRUE ENDIF ENDIF ENDIF FALLTHRU ENDSWITCH ENDPROC //╞═════════╡END OF STAT WATCHING PROC DO_GENERIC_MISSION_STAGE_INIT() SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", TRUE) CLEAR_GPS_MULTI_ROUTE() IF current_mission_stage <> stage_speedophile_chase REMOVE_ANIM_DICT("missfam2_tracy_jetski") ENDIF SET_WANTED_LEVEL_MULTIPLIER(0.6) REMOVE_SCENARIO_BLOCKING_AREA(sbiMarina) REMOVE_SCENARIO_BLOCKING_AREA(sbiBeach) IF (current_mission_stage <> stage_go_to_yacht AND current_mission_stage <> stage_drive_to_beach) OR b_skip CLEAR_PRINTS() ENDIF ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE) ENABLE_DISPATCH_SERVICE(DT_POLICE_VEHICLE_REQUEST, TRUE) ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE) ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE) ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, TRUE) ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, TRUE) ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE) SET_ALL_SCRIPT_VARS_TO_DEFAULT() REMOVE_ALL_SCRIPT_BLIPS() INIT_TEXT() IF current_mission_stage < stage_rescue AND DOES_ENTITY_EXIST(pedTracy) DELETE_PED(pedTracy) ENDIF IF current_mission_stage = stage_bike_ride OR current_mission_stage = stage_speedophile_chase SET_MAX_WANTED_LEVEL(0) ELSE SET_MAX_WANTED_LEVEL(5) ENDIF IF DOES_ENTITY_EXIST(objChair) DELETE_OBJECT(objChair) ENDIF IF NOT IS_PED_INJURED(pedJimmy) IF IS_PED_GROUP_MEMBER(pedJimmy, GET_PLAYER_GROUP(PLAYER_ID())) REMOVE_PED_FROM_GROUP(pedJimmy) ENDIF ENDIF IF NOT IS_PED_INJURED(pedTracy) IF IS_PED_GROUP_MEMBER(pedTracy, GET_PLAYER_GROUP(PLAYER_ID())) REMOVE_PED_FROM_GROUP(pedTracy) ENDIF ENDIF IF b_skip INT iTemp FOR iTemp = 0 TO 1 IF DOES_BLIP_EXIST(blipChasers[iTemp]) REMOVE_BLIP(blipChasers[iTemp]) ENDIF IF DOES_ENTITY_EXIST(pedChasers[iTemp]) DELETE_PED(pedChasers[iTemp]) ENDIF IF DOES_ENTITY_EXIST(vehChasers[iTemp]) DELETE_VEHICLE(vehChasers[iTemp]) ENDIF ENDFOR PRINTLN("DELETING CHASERS 3") CLEANUP_AMBIENT_BOATS(TRUE) SET_PED_WALLA_DENSITY(0.0, 0.0) IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_DRIVE_TO_BEACH") STOP_AUDIO_SCENE("FAMILY_2_DRIVE_TO_BEACH") ENDIF IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_BIKE_RACE_JIMMY") STOP_AUDIO_SCENE("FAMILY_2_BIKE_RACE_JIMMY") ENDIF IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_DIVE_INTO_WATER") STOP_AUDIO_SCENE("FAMILY_2_DIVE_INTO_WATER") ENDIF IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_SWIM_TO_YACHT") STOP_AUDIO_SCENE("FAMILY_2_SWIM_TO_YACHT") ENDIF IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_JETSKI_CHASE") STOP_AUDIO_SCENE("FAMILY_2_JETSKI_CHASE") ENDIF IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_JETSKI_GO_TO_BEACH") STOP_AUDIO_SCENE("FAMILY_2_JETSKI_GO_TO_BEACH") ENDIF TRIGGER_MUSIC_EVENT("FAM2_STOP") CLEAR_PRINTS() CLEAR_HELP() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CLEANUP_BIKE_SHOP() IF IS_CUTSCENE_ACTIVE() STOP_CUTSCENE() REMOVE_CUTSCENE() WHILE IS_CUTSCENE_ACTIVE() WAIT(0) ENDWHILE ENDIF IF IS_VEHICLE_DRIVEABLE(vehJimmyBike) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike) STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) ENDIF ENDIF IF current_mission_stage < stage_telltale IF DOES_ENTITY_EXIST(vehPlayerBike) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehPlayerBike) ENDIF ENDIF IF current_mission_stage != stage_intro END_SRL() ENDIF REMOVE_ANIM_DICT("missfam2ig_3") bStatsInitialised = FALSE ENDIF IF current_mission_stage > stage_go_to_yacht bShowStaminaHelp = FALSE ENDIF IF current_mission_stage <> stage_bike_ride REMOVE_ANIM_DICT("veh@bicycle@mountain_f@front@base") ENDIF WHILE NOT PRE_INIT_ASSETS(current_mission_stage) PRINTSTRING("WAITING ON STAGE ASSETS\n") WAIT(0) ENDWHILE IF NOT IS_PED_INJURED(pedJimmy) SET_PED_CONFIG_FLAG(pedJimmy, PCF_UseKinematicModeWhenStationary, TRUE) ENDIF IF current_mission_stage = stage_hire_bike SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "stage_hire_bike", FALSE, FALSE, NULL, TRUE) ELIF current_mission_stage = stage_bike_ride SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "stage_hire_bike", FALSE, FALSE, NULL, FALSE) ELIF current_mission_stage = stage_telltale OR current_mission_stage = stage_go_to_yacht OR current_mission_stage = stage_rescue PRINTLN("SETTING REPLAY AND GRABBING BIKE") SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "stage_go_to_yacht", FALSE, FALSE, NULL, TRUE) ELIF current_mission_stage = stage_speedophile_chase SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "stage_speedophile_chase") ELIF current_mission_stage = stage_drive_to_beach SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(4, "stage_drive_to_beach", TRUE) IF IS_BIT_SET(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_TUNNELS)) SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(5, "stage_drive_to_beach", TRUE) ENDIF IF IS_BIT_SET(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_CANALS)) SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(6, "stage_drive_to_beach", TRUE) ENDIF IF IS_BIT_SET(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_MARINA)) SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(7, "stage_drive_to_beach", TRUE) ENDIF IF IS_BIT_SET(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_LOSE_PEDS)) SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(8, "stage_drive_to_beach", TRUE) ENDIF ENDIF iStageProgress = 0 iSavedStage = 0 IF current_mission_stage > stage_bike_ride CLEANUP_BIKE_SHOP() REMOVE_VEHICLE_RECORDING(1, s_jimmy_bike_rec) REMOVE_VEHICLE_RECORDING(2, s_jimmy_bike_rec) ENDIF ENDPROC PROC SETUP_FOR_MISSION_STAGE() DO_GENERIC_MISSION_STAGE_INIT() IF NOT IS_REPLAY_BEING_SET_UP() IF current_mission_stage >= stage_telltale IF NOT IS_IPL_ACTIVE("smboat") REQUEST_IPL("smBoat") ENDIF ELSE IF IS_IPL_ACTIVE("smboat") REMOVE_IPL("smBoat") ENDIF ENDIF ENDIF SWITCH current_mission_stage CASE stage_intro IF b_skip PRINTLN("SKIPPING IN INTRO") DO_QUICK_WARP(<<-803.2507, 172.9356, 71.8447>>, 108.7350) WHILE NOT SETUP_CLOTHES(FALSE, TRUE) WAIT(0) ENDWHILE REQUEST_WAYPOINT_RECORDING(sJimmyStairRoute) WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(sJimmyStairRoute) WAIT(0) ENDWHILE WHILE NOT IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(<<-803.2507, 172.9356, 71.8447>>)) WAIT(0) ENDWHILE CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, << -809.6773, 171.1910, 75.7409 >>, 138.7408) ENDIF BREAK CASE stage_drive_to_venice bGoBackPrinted = FALSE iTimeGoBackPrinted = 0 SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE) IF NOT IS_PED_INJURED(pedJimmy) SET_PED_AS_BUDDY(pedJimmy) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() ASSISTED_MOVEMENT_REQUEST_ROUTE("Mansion_1") IF b_skip IF DOES_ENTITY_EXIST(vehPlayerCar) DELETE_VEHICLE(vehPlayerCar) ENDIF IF DOES_ENTITY_EXIST(vehTraceyCar) DELETE_VEHICLE(vehTraceyCar) ENDIF IF DOES_ENTITY_EXIST(vehMikesCar) DELETE_VEHICLE(vehMikesCar) ENDIF WHILE NOT CREATE_PLAYER_VEHICLE(vehMikesCar, CHAR_MICHAEL, v_car_start_coords, f_car_start, TRUE, VEHICLE_TYPE_CAR) WAIT(0) ENDWHILE IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehPlayerCar, TRUE) ENDIF WHILE NOT SETUP_CLOTHES(FALSE, TRUE) WAIT(0) ENDWHILE REQUEST_WAYPOINT_RECORDING(sJimmyStairRoute) WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(sJimmyStairRoute) WAIT(0) ENDWHILE DO_QUICK_WARP(vPlayerStartCoords, fPlayerHeading) IF NOT IS_PED_INJURED(pedJimmy) CLEAR_PED_TASKS_IMMEDIATELY(pedJimmy) ENDIF CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, vJimmyCoords, fJimmyHeading) BOOL bJimmyStreamed bJimmyStreamed = FALSE WHILE NOT bJimmyStreamed IF NOT IS_PED_INJURED(pedJimmy) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedJimmy) bJimmyStreamed = TRUE ENDIF ENDIF WAIT(0) ENDWHILE println("setting motion state here 3") IF NOT IS_REPLAY_BEING_SET_UP() FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK) SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK) ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayerCar) APPLY_FORCE_TO_ENTITY(vehPlayerCar, APPLY_TYPE_FORCE, <<0,0,0.1>>, <<0,0,0>>,0, TRUE, TRUE, FALSE) SET_ENTITY_QUATERNION(vehPlayerCar, -0.0062,-0.0656,0.9462,0.3169) ENDIF SETTIMERA(0) BREAK CASE stage_hire_bike SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE) IF DOES_ENTITY_EXIST(vehMikesCar) IF (DOES_ENTITY_EXIST(vehPlayerCar) AND vehPlayerCar != vehMikesCar) OR NOT DOES_ENTITY_EXIST(vehPlayerCar) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehMikesCar) ENDIF ENDIF IF DOES_ENTITY_EXIST(vehTraceyCar) IF (DOES_ENTITY_EXIST(vehPlayerCar) AND vehPlayerCar != vehTraceyCar) OR NOT DOES_ENTITY_EXIST(vehPlayerCar) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehTraceyCar) ENDIF ENDIF IF b_Skip WHILE NOT SETUP_CLOTHES(FALSE, TRUE) WAIT(0) ENDWHILE IF NOT DOES_ENTITY_EXIST(vehPlayerCar) SETUP_VEHICLE(CAR, v_car_stop, f_car_stop) ENDIF IF NOT IS_ENTITY_DEAD(vehPlayerCar) SET_ENTITY_COORDS(vehPlayerCar, v_car_stop) SET_ENTITY_HEADING(vehPlayerCar, f_car_stop) SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayerCar) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPlayerCar, VS_DRIVER) CREATE_BUDDY_IN_VEHICLE(pedJimmy, CHAR_JIMMY, vehPlayerCar) IF NOT IS_ENTITY_DEAD(vehPlayerCar)//[MF] Fix for assert in B* 1769983 SET_ENTITY_COORDS_NO_OFFSET(vehPlayerCar, <<-1072.7998, -1703.9235, 4.1380>>) SET_ENTITY_QUATERNION(vehPlayerCar, 0.0123, -0.0057, 0.9998, -0.0169) ENDIF ENDIF SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1081.7975, -1699.4921, 3.5179>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 91.1321) IF NOT IS_PED_INJURED(pedJimmy) SET_ENTITY_COORDS(pedJimmy, <<-1085.2488, -1703.1886, 3.4167>>) SET_ENTITY_HEADING(pedJimmy, 327.7033) ENDIF IF DOES_ENTITY_EXIST(vehPlayerBike) DELETE_VEHICLE(vehPlayerBike) ENDIF IF DOES_ENTITY_EXIST(vehJimmyBike) DELETE_VEHICLE(vehJimmyBike) ENDIF WHILE NOT SETUP_BIKE_SHOP() PRINTLN("SETTING UP BIKE SHOP") WAIT(0) ENDWHILE CLEAR_AREA(v_bike_guy_pos, 10, TRUE) DO_QUICK_WARP(<<-1081.7975, -1699.4921, 3.5179>>, 91.1321) bShowGodText = TRUE bMovingStart = TRUE ENDIF BREAK CASE stage_bike_ride iBikeTutStage = 0 SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE) PRINTSTRING("STARTING BIKE RIDE INIT\n") bGoBackPrinted = FALSE iTimeGoBackPrinted = 0 IF b_skip WHILE NOT SETUP_BIKE_SHOP(TRUE) WAIT(0) ENDWHILE DO_QUICK_WARP(v_player_bike_start, f_player_bike_start) WHILE NOT SETUP_CLOTHES(FALSE, TRUE) WAIT(0) ENDWHILE SETUP_VEHICLE(BIKE, <<-1103.9978, -1691.6907, 3.3147>>, 255.7254) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) SETUP_VEHICLE(JIMMY_BIKE, <<-1100.8270, -1695.7578, 3.3089>>, 245.1632) CREATE_BUDDY_IN_VEHICLE(pedJimmy, CHAR_JIMMY, vehJimmyBike, VS_DRIVER) REQUEST_VEHICLE_RECORDING(i_jimmy_bike_rec, s_jimmy_bike_rec) REQUEST_VEHICLE_RECORDING(1, s_jimmy_bike_rec) REQUEST_ANIM_DICT("veh@bicycle@mountain_f@front@base") WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(i_jimmy_bike_rec, s_jimmy_bike_rec) OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(1, s_jimmy_bike_rec) OR NOT HAS_ANIM_DICT_LOADED("veh@bicycle@mountain_f@front@base") WAIT(0) ENDWHILE BOOL bJimmyStreamed bJimmyStreamed = FALSE IF NOT IS_PED_INJURED(pedJimmy) WHILE NOT bJimmyStreamed WAIT(0) IF NOT IS_PED_INJURED(pedJimmy) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedJimmy) SET_PED_IN_VEHICLE_CONTEXT(pedJimmy, GET_HASH_KEY("MISS_FAMILY2_JIMMY_BICYCLE")) bJimmyStreamed = TRUE ENDIF ENDIF ENDWHILE ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() ENDIF in_car_conv_started = FALSE in_car_conv_on_hold = FALSE sConvResumeLabel = "" BREAK CASE stage_telltale IF b_Skip WHILE NOT SETUP_CLOTHES(FALSE, TRUE) WAIT(0) ENDWHILE #IF IS_DEBUG_BUILD IF bDebugMenuCutsceneSelection IF NOT IS_CUTSCENE_ACTIVE() IF NOT bJimmyWon REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("family_2_mcs_2", CS_SECTION_2 | CS_SECTION_3) ELSE REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("family_2_mcs_2", CS_SECTION_1 | CS_SECTION_3) ENDIF ENDIF bDebugMenuCutsceneSelection = FALSE WHILE CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() WAIT(0) ENDWHILE SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) ENDIF #ENDIF DO_QUICK_WARP(v_TT_jimmy_bike_mark, f_TT_jimmy_bike_mark) SETUP_VEHICLE(JIMMY_BIKE, v_TT_jimmy_bike_mark, f_TT_jimmy_bike_mark) SETUP_VEHICLE(BIKE, v_TT_player_bike_mark, f_TT_player_bike_mark) CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, <<-1859.0718, -1217.3331, 12.0174>>, 24.6128) ENDIF BREAK CASE stage_go_to_yacht SETUP_VEHICLE(SEA_SHARK, v_Seashark_start_coords, f_Seashark_heading) IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_BOAT_ANCHOR(vehPlayerSeashark, TRUE) ENDIF iLastJimmyShout = -1 IF b_Skip WHILE NOT SETUP_CLOTHES(TRUE, TRUE) WAIT(0) ENDWHILE DO_QUICK_WARP(vPlayerOnPierPosition, fPlayerOnPierHeading) CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, <<-1859.0718, -1217.3331, 12.0174>>, 24.6128) SETUP_VEHICLE(JIMMY_BIKE, v_TT_jimmy_bike_mark, f_TT_jimmy_bike_mark) SETUP_VEHICLE(BIKE, v_TT_player_bike_mark, f_TT_player_bike_mark) IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) SET_ENTITY_COORDS_NO_OFFSET(vehPlayerBike, <<-1867.5173, -1209.1207, 12.5769>>) SET_ENTITY_QUATERNION(vehPlayerBike, 0.0501, -0.0721, 0.4606, 0.8833) ENDIF IF IS_VEHICLE_DRIVEABLE(vehJimmyBike) SET_ENTITY_COORDS_NO_OFFSET(vehJimmyBike, <<-1858.6306, -1214.6611, 12.5761>>) SET_ENTITY_QUATERNION(vehJimmyBike, 0.0568, -0.0661, 0.6354, 0.7672) ENDIF ENDIF BREAK CASE stage_rescue WHILE NOT SETUP_CLOTHES(TRUE, TRUE) WAIT(0) ENDWHILE IF b_skip DO_QUICK_WARP(<< -2059.9348, -1026.1090, 9.7454 >>, 71.3421) ENDIF IF NOT DOES_ENTITY_EXIST(vehPlayerSeashark) SETUP_VEHICLE(SEA_SHARK, v_Seashark_start_coords, f_Seashark_heading) ENDIF WHILE NOT CREATE_CHASER(0, TRUE) WAIT(0) ENDWHILE WHILE NOT CREATE_CHASER(1, TRUE) WAIT(0) ENDWHILE WHILE NOT CREATE_MP3_DOCK() WAIT(0) ENDWHILE CREATE_BUDDY_ON_FOOT(pedTracy, CHAR_TRACEY, << -2059.9348, -1026.1090, 9.7454 >>, 71.3421) CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, v_jimmy_end_pos, f_jimmy_end_heading) BREAK CASE stage_speedophile_chase PRINTLN("REPLAY - Entered setup for stage speedophile chase") iStageProgress = 0 sbiMarina = ADD_SCENARIO_BLOCKING_AREA(<<-919.216919,-1509.856934,-10.772810>> + <<232.000000,231.000000,13.250000>>, <<-919.216919,-1509.856934,-10.772810>> - <<232.000000,231.000000,13.250000>>) sbiBeach = ADD_SCENARIO_BLOCKING_AREA(<<-2055.107910,-888.841370,-12.186346>> + <<246.000000,250.000000,14.500000>>, <<-2055.107910,-888.841370,-12.186346>> + <<246.000000,250.000000,14.500000>>, FALSE, TRUE, FALSE, TRUE) INIT_MARINA_BOATS() IF b_skip SET_WATER_CALM(TRUE, 0.0) PRINTLN("REPLAY - Entered setup for skip to stage speedophile chase") WHILE NOT SETUP_CLOTHES(TRUE, TRUE) PRINTLN("REPLAY - Setting up clothes") WAIT(0) ENDWHILE DO_QUICK_WARP(v_Seashark_start_coords, f_Seashark_heading) // new chase change SETUP_VEHICLE(SEA_SHARK, v_Seashark_start_coords, f_Seashark_heading) SETUP_VEHICLE(SEA_SHARK, vSeasharkChaseStartCoords, fSeasharkChaseStartCoords) CREATE_BUDDY_IN_VEHICLE(pedTracy, CHAR_TRACEY, vehPlayerSeashark) BOOL bTraceyLoaded bTraceyLoaded = FALSE WHILE NOT bTraceyLoaded PRINTLN("REPLAY - Loading Tracey") IF NOT IS_PED_INJURED(pedTracy) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedTracy) bTraceyLoaded = TRUE PRINTLN("REPLAY - Finished loading Tracey") ENDIF ENDIF WAIT(0) ENDWHILE IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, TRUE, TRUE) ENDIF SET_VEHICLE_FORWARD_SPEED(vehPlayerSeashark, 17) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) TRIGGER_MUSIC_EVENT("FAM2_CHASE_RT") ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_VEHICLE_DOORS_LOCKED(vehPlayerSeashark, VEHICLELOCK_UNLOCKED) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) ENDIF IF NOT IS_PED_INJURED(pedTracy) IF NOT IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) SET_PED_INTO_VEHICLE(pedTracy, vehPlayerSeashark, VS_FRONT_RIGHT) ENDIF ENDIF ENDIF CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, <<-1611.5950, -1121.0092, 1.5440>>, 42.8275) BREAK CASE stage_drive_to_beach iStageProgress = 0 CLEANUP_AMBIENT_BOATS() SETTIMERA(0) IF b_skip WHILE NOT SETUP_CLOTHES(TRUE, TRUE) WAIT(0) ENDWHILE DO_QUICK_WARP(vMarinaFinish, fMarinaFinish) SETUP_VEHICLE(SEA_SHARK, vMarinaFinish, fMarinaFinish) CREATE_BUDDY_IN_VEHICLE(pedTracy, CHAR_TRACEY, vehPlayerSeashark) BOOL bTraceyLoaded bTraceyLoaded = FALSE WHILE NOT bTraceyLoaded IF NOT IS_PED_INJURED(pedTracy) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedTracy) bTraceyLoaded = TRUE ENDIF ENDIF WAIT(0) ENDWHILE IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) ENDIF IF NOT IS_PED_INJURED(pedTracy) IF NOT IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) SET_PED_INTO_VEHICLE(pedTracy, vehPlayerSeashark, VS_FRONT_RIGHT) ENDIF ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_VEHICLE_FORWARD_SPEED(vehPlayerSeashark, 10) SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, TRUE, TRUE) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_VEHICLE_FORWARD_SPEED(vehPlayerSeashark, 10) ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_VEHICLE_DOORS_LOCKED(vehPlayerSeashark, VEHICLELOCK_UNLOCKED) ENDIF IF NOT IS_PED_INJURED(pedJImmy) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedJimmy, TRUE) ENDIF BREAK CASE stage_finish IF b_skip PRINTLN("SKIPPED TO FINAL SCENE") WHILE NOT SETUP_CLOTHES(TRUE, TRUE) WAIT(0) ENDWHILE SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1623.5543, -1132.1362, 0.8638>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 107.3556) IF NOT IS_REPLAY_BEING_SET_UP() NEW_LOAD_SCENE_START_SPHERE(<<-1624.9271, -1136.7485, 1.0450>>, 200, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE) SETTIMERA(0) INT iTimeNow iTimeNow = GET_GAME_TIMER() WHILE NOT IS_NEW_LOAD_SCENE_LOADED() AND (GET_GAME_TIMER() - iTimeNow) < 10000 PRINTLN("LOADING AREA AROUND FINAL SCENE") WAIT(0) ENDWHILE NEW_LOAD_SCENE_STOP() ENDIF CREATE_BUDDY_ON_FOOT(pedTracy, CHAR_TRACEY, v_jimmy_end_pos + <<0,1,0>>, 0) CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, v_jimmy_end_pos, f_jimmy_end_heading) SETUP_VEHICLE(SEA_SHARK, v_Seashark_start_coords, f_Seashark_heading) ENDIF BREAK CASE go_to_end BREAK ENDSWITCH IF current_mission_stage = stage_speedophile_chase PRINTLN("REPLAY - current stage is speedo chase") ELSE PRINTLN("REPLAY - current stage is NOT speedo chase!!") ENDIF IF IS_REPLAY_BEING_SET_UP() SWITCH current_mission_stage CASE stage_drive_to_venice FALLTHRU CASE stage_hire_bike FALLTHRU CASE stage_telltale FALLTHRU CASE stage_rescue END_REPLAY_SETUP() BREAK CASE stage_go_to_yacht END_REPLAY_SETUP() BREAK CASE stage_speedophile_chase PRINTLN("REPLAY - Ending replay for seashark chase") END_REPLAY_SETUP(vehPlayerSeashark) BREAK CASE stage_drive_to_beach FALLTHRU CASE stage_finish END_REPLAY_SETUP(vehPlayerSeashark) BREAK ENDSWITCH ELSE PRINTLN("REPLAY - Replay is NOT being set up") ENDIF IF DOES_ENTITY_EXIST(pedJimmy) IF NOT IS_PED_INJURED(pedJimmy) IF NOT DOES_ENTITY_EXIST(sSpeech.PedInfo[1].Index) ADD_PED_FOR_DIALOGUE(sSpeech, 1, pedJimmy, "JIMMY") ENDIF ENDIF ELSE IF DOES_ENTITY_EXIST(sSpeech.PedInfo[1].Index) REMOVE_PED_FOR_DIALOGUE(sSpeech, 1) ENDIF ENDIF IF DOES_ENTITY_EXIST(pedTracy) IF NOT IS_PED_INJURED(pedTracy) IF sSpeech.PedInfo[2].Index = NULL ADD_PED_FOR_DIALOGUE(sSpeech, 2, pedTracy, "TRACEY") ENDIF ENDIF ELSE IF sSpeech.PedInfo[2].Index <> NULL REMOVE_PED_FOR_DIALOGUE(sSpeech, 2) ENDIF ENDIF IF current_mission_stage <> stage_finish SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ENDIF CLEAR_PRINTS() IF b_skip AND current_mission_stage <> stage_speedophile_chase CLEAR_PED_WETNESS(PLAYER_PED_ID()) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() ENDIF b_stage_ready = TRUE b_skip = FALSE PRINTSTRING("DELETE_VEHICLE_GEN_VEHICLES_IN_AREA\n") //DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(vJimmyCoords, 1000) ENDPROC PROC GO_TO_STAGE(MISSION_STAGE_FLAG stage) b_stage_ready = FALSE current_mission_stage = stage ENDPROC PROC CHECK_FOR_FAIL() IF DOES_ENTITY_EXIST(pedJimmy) IF IS_PED_INJURED(pedJimmy) MISSION_FAILED("FM2_JIMDED") ENDIF IF CHILD_ABUSE(pedJimmy) MISSION_FAILED("FM2_JIMHIT") ENDIF ENDIF IF DOES_ENTITY_EXIST(pedTracy) IF IS_PED_INJURED(pedTracy) MISSION_FAILED("FM2_TRADED") ENDIF IF CHILD_ABUSE(pedTracy) MISSION_FAILED("FM2_TRAHIT") ENDIF ENDIF IF current_mission_stage = stage_bike_ride BOOL bStuck = FALSE IF MISSION_VEHICLE_FAIL_CHECKS(vehPlayerBike, bStuck) PRINTLN("FAIL B") IF NOT bStuck MISSION_FAILED("FM2_BIKDED") ELSE MISSION_FAILED("FM2_BIKSTU") ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) IF IS_VEHICLE_TYRE_BURST(vehPlayerBike, SC_WHEEL_BIKE_FRONT) OR IS_VEHICLE_TYRE_BURST(vehPlayerBike, SC_WHEEL_BIKE_REAR) PRINTLN("FAIL A") MISSION_FAILED("FM2_BIKDED") ENDIF ENDIF IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-2109.599121,-998.324280,-11.185677>>,<<167.000000,122.500000,32.250000>>) MISSION_FAILED("FM2_JIMAB") ENDIF ENDIF IF current_mission_stage = stage_drive_to_venice IF IS_BUDDY_ABANDONED(pedJimmy, 300) MISSION_FAILED("FM2_JIMAB") ENDIF ENDIF IF current_mission_stage = stage_speedophile_chase IF IS_BUDDY_ABANDONED(pedTracy, 100) MISSION_FAILED("FM2_TRAAB") ENDIF ENDIF IF current_mission_stage = stage_drive_to_beach IF IS_BUDDY_ABANDONED(pedTracy) MISSION_FAILED("FM2_TRAAB") ENDIF ENDIF IF NOT IS_PED_INJURED(pedJimmy) IF ( IS_EXPLOSION_IN_AREA(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(pedJimmy)+<<25,25,25>>, GET_ENTITY_COORDS(pedJimmy)-<<25,25,25>>) AND NOT IS_EXPLOSION_IN_AREA(EXP_TAG_DIR_WATER_HYDRANT, GET_ENTITY_COORDS(pedJimmy)+<<25,25,25>>, GET_ENTITY_COORDS(pedJimmy)-<<25,25,25>>) ) OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(pedJimmy), 25.0) PRINTLN("JIMMY SPOOK 2") Mission_Failed("FM2_JSPOOK") ENDIF ENDIF ENDPROC PROC BLIP_MANAGER(VEHICLE_INDEX veh, VECTOR destination, BOOL bBike = FALSE) IF IS_VEHICLE_DRIVEABLE(veh) AND DOES_ENTITY_EXIST(veh) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), veh) IF NOT DOES_BLIP_EXIST(blipPlayerVeh) CLEAR_PRINTS() IF bBike IF bBeenOnBike PRINT_GOD_TEXT(gtGetBackInBike) ENDIF ENDIF blipPlayerVeh = CREATE_BLIP_FOR_VEHICLE(veh) ENDIF IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) ENDIF ELSE bBeenOnBike = TRUE IF NOT DOES_BLIP_EXIST(blipDest) CLEAR_PRINTS() blipDest = CREATE_BLIP_FOR_COORD(destination, TRUE) ENDIF IF DOES_BLIP_EXIST(blipPlayerVeh) REMOVE_BLIP(blipPlayerVeh) ENDIF ENDIF ENDIF ENDPROC PROC BLIP_MANAGER_FOR_COORD(VEHICLE_INDEX &veh, BLIP_INDEX &vehBlip, VECTOR coord, BLIP_INDEX &coordBlip, TEXT_HOLDER &getBackIn) IF IS_VEHICLE_DRIVEABLE(veh) AND DOES_ENTITY_EXIST(veh) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), veh) IF NOT DOES_BLIP_EXIST(vehBlip) CLEAR_PRINTS() IF NOT getBackIn.played iTimeGetBackOnPrinted = GET_GAME_TIMER() PRINT_GOD_TEXT(getBackIn) ENDIF vehBlip = CREATE_BLIP_FOR_VEHICLE(veh) ENDIF IF DOES_BLIP_EXIST(coordBlip) REMOVE_BLIP(coordBlip) ENDIF ELSE IF NOT DOES_BLIP_EXIST(coordBlip) coordBlip = CREATE_BLIP_FOR_COORD(coord, TRUE) ENDIF IF DOES_BLIP_EXIST(vehBlip) CLEAR_PRINTS() REMOVE_BLIP(vehBlip) ENDIF ENDIF ENDIF ENDPROC //╞═════════╡MISSION STAGE PROCEDURES PROC FAM2_INITIALISE() // bClothesHaveChanged = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_01_SC , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_02_GS , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_03_DT , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_04_CS , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_05_GSD , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_06_VC , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_07_PB , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_01_SM , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_03_H , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_04_HW , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_05_GOH , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_01_BH , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_02_B , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_03_MW , TRUE) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_A_01_VB , TRUE) PRE_INIT_ASSETS(stage_intro) #IF IS_DEBUG_BUILD skipMenuOptions[0].sTxtLabel = "family_2_int" skipMenuOptions[1].sTxtLabel = "Drive to Venice Beach" skipMenuOptions[2].sTxtLabel = "hire bikes" skipMenuOptions[3].sTxtLabel = "Bike ride" skipMenuOptions[4].sTxtLabel = "family_2_mcs_2 jimmy wins" skipMenuOptions[5].sTxtLabel = "family_2_mcs_2 mike wins" skipMenuOptions[6].sTxtLabel = "Swim to the yacht" skipMenuOptions[7].sTxtLabel = "family_2_mcs_3" skipMenuOptions[8].sTxtLabel = "Speedophile chase" skipMenuOptions[9].sTxtLabel = "Drive the Speedophile back to the beach" skipMenuOptions[10].sTxtLabel = "family_2_mcs_4" #ENDIF mission_stages[0] = stage_intro mission_stages[1] = stage_drive_to_venice mission_stages[2] = stage_hire_bike mission_stages[3] = stage_bike_ride mission_stages[4] = stage_telltale mission_stages[5] = stage_telltale mission_stages[6] = stage_go_to_yacht mission_stages[7] = stage_rescue mission_stages[8] = stage_speedophile_chase mission_stages[9] = stage_drive_to_beach mission_stages[10] = stage_finish REQUEST_ADDITIONAL_TEXT("FAMILY2", MISSION_TEXT_SLOT) REQUEST_ADDITIONAL_TEXT(sConvBlock, MISSION_DIALOGUE_TEXT_SLOT) REQUEST_WAYPOINT_RECORDING("fam2Stairs") DISABLE_TAXI_HAILING(TRUE) INIT_TEXT() IF IS_PLAYER_PLAYING(PLAYER_ID()) IF Is_Replay_In_Progress() REMOVE_CUTSCENE() SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE, DEFAULT, DEFAULT, TRUE, FALSE) FADE_OUT() SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY") // SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL) BOOL bToCut INT iStage = GET_REPLAY_MID_MISSION_STAGE() IF g_bShitskipAccepted = TRUE IF iStage = 1 OR iStage = 2 bToCut = TRUE ENDIF IF iStage < 4 IF iStage = 3 iStage = 8 ELSE iStage++ ENDIF ELSE iStage=9 ENDIF ENDIF IF iStage > 8 WHILE NOT SETUP_CLOTHES(TRUE, TRUE) WAIT(0) ENDWHILE vReplayCoords = <<-1623.5543, -1132.1362, 0.8638>> fReplayHeading = 107.3556 REQUEST_MODEL(SEASHARK) WHILE NOT HAS_MODEL_LOADED(SEASHARK) WAIT(0) ENDWHILE vehPlayerSeashark = CREATE_VEHICLE(SEASHARK, <<-1490.0714, -1406.3827, 1.1279>>, -94.2926) SET_ENTITY_COORDS_NO_OFFSET(vehPlayerSeashark, <<-1490.0714, -1406.3827, 1.1279>>) SET_ENTITY_ROTATION(vehPlayerSeashark, <<2.7893, 9.6258, -94.2926>>) SET_ENTITY_QUATERNION(vehPlayerSeashark, -0.0780, -0.0393, 0.7289, -0.6790) APPLY_FORCE_TO_ENTITY(vehPlayerSeashark, APPLY_TYPE_FORCE, <<0,0,-0.01>>, <<0,0,0>>, 0, TRUE, TRUE, FALSE) GO_TO_STAGE(stage_finish) b_skip = TRUE ELSE SWITCH iStage CASE 0 bReplaySetupRequired = TRUE GO_TO_STAGE(stage_drive_to_venice) CLEAR_AREA(v_car_start_coords, 100, TRUE) PRINTLN(" \n\n\nCLEARING AREA AROUND START\n\n\n") vReplayCoords = vPlayerStartCoords fReplayHeading = fPlayerHeading BREAK CASE 1 bReplaySetupRequired = TRUE CREATE_VEHICLE_FOR_REPLAY(vehPlayerCar, v_car_stop, f_car_stop, FALSE, FALSE, FALSE, FALSE, TRUE) SET_ENTITY_COORDS(PLAYER_PED_ID(), v_bike_guy_pos + <<1,1,0>>) CLEAR_AREA(v_bike_guy_pos, 100, TRUE) WHILE NOT SETUP_BIKE_SHOP() WAIT(0) ENDWHILE GO_TO_STAGE(stage_hire_bike) vReplayCoords = <<-1081.7975, -1699.4921, 3.5179>> fReplayHeading = 91.1321 BREAK CASE 2 bReplaySetupRequired = TRUE IF bToCut vReplayCoords = v_TT_jimmy_bike_mark fReplayHeading = f_TT_jimmy_bike_mark REQUEST_IPL("smBoat") WHILE NOT IS_IPL_ACTIVE("smboat") WAIT(0) ENDWHILE GO_TO_STAGE(stage_telltale) ELSE IF GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() = SCORCHER OR GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() = BMX OR GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() = CRUISER OR GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() = TRIBIKE OR GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() = TRIBIKE2 OR GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() = TRIBIKE3 CREATE_VEHICLE_FOR_REPLAY(vehPlayerBike, v_TT_player_bike_mark, f_TT_player_bike_mark) ENDIF vReplayCoords = vPlayerOnPierPosition fReplayHeading = fPlayerOnPierHeading GO_TO_STAGE(stage_go_to_yacht) ENDIF BREAK CASE 3 bReplaySetupRequired = TRUE CLEAR_AREA_OF_VEHICLES(v_Seashark_start_coords, 100, TRUE) CLEAR_AREA_OF_PEDS(v_Seashark_start_coords, 100) IF bToCut vReplayCoords = <<-2018.7909, -1033.8073, 1.4462>> fReplayHeading = 71.2179 GO_TO_STAGE(stage_rescue) ELSE PRINTLN("REPLAY - Skipping to speedo chase") vReplayCoords = vSeasharkChaseStartCoords fReplayHeading = fSeasharkChaseStartCoords GO_TO_STAGE(stage_speedophile_chase) ENDIF BREAK CASE 4 vMarinaFinish = <<-1937.5155, -1031.9191, 0>> fMarinaFinish = 288.2051 SET_BIT(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_OPEN_SEA)) CLEAR_AREA(vMarinaFinish, 500, TRUE) GO_TO_STAGE(stage_drive_to_beach) BREAK CASE 5 vMarinaFinish = <<-1693.7485, -936.2038, 0>> fMarinaFinish = 293.6241 SET_BIT(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_TUNNELS)) CLEAR_AREA(vMarinaFinish, 500, TRUE) GO_TO_STAGE(stage_drive_to_beach) BREAK CASE 6 vMarinaFinish = <<-1198.6477, -992.5767, 0>> fMarinaFinish = 209.2130 SET_BIT(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_CANALS)) CLEAR_AREA(vMarinaFinish, 500, TRUE) GO_TO_STAGE(stage_drive_to_beach) BREAK CASE 7 vMarinaFinish = <<-966.1338, -1365.7760, 0>> fMarinaFinish = 279.4431 SET_BIT(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_MARINA)) CLEAR_AREA(vMarinaFinish, 500, TRUE) GO_TO_STAGE(stage_drive_to_beach) BREAK CASE 8 vMarinaFinish = <<-832.9591, -1506.5366, 0>> fMarinaFinish = 151.4369 SET_BIT(iSectionsHit, ENUM_TO_INT(FAM2_CHASE_LOSE_PEDS)) CLEAR_AREA(vMarinaFinish, 500, TRUE) GO_TO_STAGE(stage_drive_to_beach) BREAK ENDSWITCH IF istage >= 4 bReplaySetupRequired = TRUE vReplayCoords = vMarinaFinish fReplayHeading = fMarinaFinish ENDIF b_skip = TRUE ENDIF PRINTLN("REPLAY - Starting replay setup for speedo chase") START_REPLAY_SETUP(vReplayCoords, fReplayHeading, FALSE) ENDIF CLEAR_PED_WETNESS(PLAYER_PED_ID()) ADD_PED_FOR_DIALOGUE(sSpeech, 0, PLAYER_PED_ID(), "MICHAEL") SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), FAM2_DAMAGE) ENDIF DISABLE_VEHICLE_GEN_ON_MISSION(TRUE) CREATE_FORCED_OBJECT(<<-1105.2411, -1697.0247, 3.3678>>, 2, PROP_TABLE_03_CHR, TRUE) SET_VEHICLE_MODEL_IS_SUPPRESSED(TAILGATER, TRUE) SET_VEHICLE_MODEL_IS_SUPPRESSED(BMX, TRUE) SET_PED_MODEL_IS_SUPPRESSED(U_M_M_BIKEHIRE_01, TRUE) SET_CREATE_RANDOM_COPS(FALSE) SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), TRUE) ASSISTED_MOVEMENT_REQUEST_ROUTE("Family5d") SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(FALSE) SET_WANTED_LEVEL_MULTIPLIER(0.6) // SET_ROADS_IN_ANGLED_AREA( <<-1179.264771,-1776.414307,2.908462>>, <<-1031.640991,-1654.376465,15.983815>>, 20.000000, FALSE, FALSE) SET_ROADS_IN_AREA(<<-1057.899048,-1682.938599,5.785122>> + <<29.000000,30.000000,4.000000>>, <<-1057.899048,-1682.938599,5.785122>> - <<29.000000,30.000000,4.000000>>, FALSE) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-1112.912964,-1688.035034,6.373647>> + <<22.750000,24.750000,3.500000>>, <<-1112.912964,-1688.035034,6.373647>> - <<22.750000,24.750000,3.500000>>, FALSE) ADD_RELATIONSHIP_GROUP("chasing_peds", rgChasers) ADD_RELATIONSHIP_GROUP("buddies", rghBuds) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rgChasers, RELGROUPHASH_PLAYER) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, rgChasers) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_COP, rgChasers) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rgChasers, RELGROUPHASH_COP) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, rghBuds, rgChasers) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, rgChasers, rghBuds) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rghBuds, RELGROUPHASH_PLAYER) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, rghBuds) IF IS_REPEAT_PLAY_ACTIVE() PRINTLN("FAMILY 2 Triggered repeat play") IF NOT IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_OUT(500) ENDIF WHILE NOT SETUP_CLOTHES(FALSE, TRUE) PRINTLN("SETTING MIKE'S CLOTHES FOR REPEAT PLAY") WAIT(0) ENDWHILE WHILE NOT CREATE_JIMMY(vJimmyCoords, fJimmyHeading) PRINTLN("CREATING JIMMY FOR REPEAT PLAY") WAIT(0) ENDWHILE IF NOT IS_REPLAY_BEING_SET_UP() GO_TO_STAGE(stage_intro) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-803.2507, 172.9356, 71.8447>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 108.7350) SET_CLOCK_TIME(10,0,0) ENDIF REMOVE_CUTSCENE() ENDIF ENDPROC BOOL bStartConv INT iLastWantedLine BOOL bLostConv PROC LOSE_THE_COPS() IF current_mission_stage <> STAGE_LOSE_COPS eSavedStage = current_mission_stage current_mission_stage = STAGE_LOSE_COPS IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) ENDIF IF DOES_BLIP_EXIST(blipPornBoat) REMOVE_BLIP(blipPornBoat) ENDIF IF DOES_BLIP_EXIST(blipBuddy) REMOVE_BLIP(blipBuddy) ENDIF IF DOES_BLIP_EXIST(blipPlayerVeh) REMOVE_BLIP(blipPlayerVeh) ENDIF IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT in_car_conv_on_hold sConvResumeLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() KILL_FACE_TO_FACE_CONVERSATION() in_car_conv_on_hold = TRUE bStartConv = FALSE bLostConv = FALSE iLastWantedLine = GET_GAME_TIMER() ENDIF ENDIF ENDIF IF eSavedStage = stage_drive_to_venice CHECK_FOR_RENTAL_STAND_INTERFERENCE() IF NOT IS_PED_INJURED(pedJimmy) IF VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 25*25 IF NOT bStartConv AND NOT IS_MESSAGE_BEING_DISPLAYED() AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_WANTED", CONV_PRIORITY_HIGH) iLastWantedLine = GET_GAME_TIMER() bStartConv = TRUE ENDIF ELSE IF GET_GAME_TIMER() - iLastWantedLine > 15000 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_LOSE", CONV_PRIORITY_HIGH) iLastWantedLine = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF IF IS_PED_GROUPED(pedJimmy) IF DOES_BLIP_EXIST(blipBuddy) REMOVE_BLIP(blipBuddy) ENDIF ELSE IF NOT DOES_BLIP_EXIST(blipBuddy) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() blipBuddy = CREATE_BLIP_FOR_PED(pedJimmy) ELSE IF NOT bGoBackToJimmyPrinted AND NOT IS_MESSAGE_BEING_DISPLAYED() PRINT("FM2_JIMGB", DEFAULT_GOD_TEXT_TIME, 1) bGoBackToJimmyPrinted = TRUE ENDIF IF IS_BUDDY_ABANDONED(pedJimmy, 300) MISSION_FAILED("FM2_JIMAB") ENDIF ENDIF ENDIF ENDIF ELIF eSavedStage = stage_drive_to_beach IF NOT IS_PED_INJURED(pedTracy) IF IS_PED_GROUPED(pedTracy) IF DOES_BLIP_EXIST(blipBuddy) REMOVE_BLIP(blipBuddy) ENDIF ELSE IF NOT DOES_BLIP_EXIST(blipBuddy) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() blipBuddy = CREATE_BLIP_FOR_PED(pedTracy) ELSE IF NOT bGoBackToTracyPrinted AND NOT IS_MESSAGE_BEING_DISPLAYED() PRINT("FM2_TRAGB", DEFAULT_GOD_TEXT_TIME, 1) bGoBackToTracyPrinted = TRUE ENDIF IF IS_BUDDY_ABANDONED(pedTracy, 300) MISSION_FAILED("FM2_TRAAB") ENDIF ENDIF ENDIF ENDIF IF NOT bLostConv bLostConv = TRUE ENDIF ELSE IF NOT bLostConv bLostConv = TRUE ENDIF ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT_GOD_TEXT(gtLoseCops) ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 IF NOT bLostConv IF eSavedStage = stage_drive_to_venice IF NOT IS_PED_INJURED(pedJimmy) IF VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 25*25 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_LOSTCOP", CONV_PRIORITY_HIGH) bLostConv = TRUE ENDIF ENDIF ENDIF ENDIF ELSE current_mission_stage = eSavedStage gtLoseCops.played = FALSE CLEAR_PRINTS() ENDIF ENDIF ENDPROC #IF IS_DEBUG_BUILD PROC JSKIP() SWITCH current_mission_stage CASE stage_go_to_yacht IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), << -2011.6843, -1043.1763, -0.6223 >>) > 20.0 SET_ENTITY_COORDS(PLAYER_PED_ID(), << -2002.1965, -1057.2301, -0.5896 >> ) SET_ENTITY_HEADING(PLAYER_PED_ID(), 40.3391) ELSE GO_TO_STAGE(stage_rescue) b_skip = TRUE ENDIF BREAK DEFAULT IF GET_PLAYABLE_STAGE_INDEX(current_mission_stage) >= 0 AND GET_PLAYABLE_STAGE_INDEX(current_mission_stage) < (NUM_OF_SELECTABLE_STAGES -1) GO_TO_STAGE(mission_stages[GET_PLAYABLE_STAGE_INDEX(current_mission_stage)+1]) b_skip = TRUE ENDIF BREAK ENDSWITCH ENDPROC PROC PSKIP() IF GET_PLAYABLE_STAGE_INDEX(current_mission_stage) > 0 AND GET_PLAYABLE_STAGE_INDEX(current_mission_stage) < NUM_OF_SELECTABLE_STAGES GO_TO_STAGE(mission_stages[GET_PLAYABLE_STAGE_INDEX(current_mission_stage)-1]) b_skip = TRUE ENDIF ENDPROC PROC DEBUG_CUTSCENE_CONTROL(BOOL bForceEnd = FALSE) IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END() STOP_CUTSCENE() WHILE IS_CUTSCENE_ACTIVE() WAIT(0) ENDWHILE ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P) OR bForceEnd STOP_CUTSCENE() INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END() WHILE IS_CUTSCENE_ACTIVE() PRINTLN("STUCK HERE") WAIT(0) ENDWHILE SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) IF NOT bForceEnd IF current_mission_stage > stage_intro PSKIP() ENDIF ENDIF ENDIF ENDPROC #ENDIF INT iRadioConvStage = 0 INT iPedsKilled = 0 BOOL bRadioChat = FALSE BOOL bMeleeFlag PROC MANAGE_DRIVE_DIALOGUE() BOOL bCanPlay IF NOT IS_PED_IN_ANY_VEHICLE(pedJimmy) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID()))<15*15 AND IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), pedJimmy, <<15,15,1>>) AND NOT IS_PLAYER_IN_ANY_SHOP() bCanPlay = TRUE ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerCar) AND IS_PED_IN_VEHICLE(pedJimmy, vehPlayerCar) AND NOT IS_PLAYER_IN_ANY_SHOP() bCanPlay = TRUE ENDIF IF NOT bRadioChat IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerCar) AND IS_PED_IN_VEHICLE(pedJimmy, vehPlayerCar) IF iRadioConvStage = 0 IF ARE_STRINGS_EQUAL(GET_RADIO_STATION_NAME(GET_PLAYER_RADIO_STATION_INDEX()), "RADIO_01_CLASS_ROCK") fJazzTime += GET_FRAME_TIME() PRINTLN("ON JAZZ STATION") ENDIF IF fJazzTime > 7 bRadioChat = TRUE ENDIF ELIF iRadioConvStage = 4 IF GET_PLAYER_RADIO_STATION_INDEX() <> 8 iRadioConvStage++ bRadioChat = TRUE ENDIF ENDIF ENDIF ELSE IF NOT IS_VEHICLE_DRIVEABLE(vehPlayerCar) OR (IS_VEHICLE_DRIVEABLE(vehPlayerCar) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerCar)) OR (IS_VEHICLE_DRIVEABLE(vehPlayerCar) AND NOT IS_PED_IN_VEHICLE(pedJimmy, vehPlayerCar)) bRadioChat = FALSE ENDIF ENDIF IF VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedJimmy)) < 15 IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID()) IF NOT bMeleeFlag IF GET_GAME_TIMER() - iLastJimmyShout > 7500 bMeleeFlag = TRUE bCanPlay = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF IF bMeleeFlag bCanPlay = FALSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINTLN("JIMMY MELEE LINE!") PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedTracy, "GENERIC_SHOCKED_MED", "Jimmy", SPEECH_PARAMS_FORCE) iLastMeleeShout = GET_GAME_TIMER() bMeleeFlag = FALSE ENDIF ENDIF PRINTLN("iCurrentDriveConv = ", iCurrentDriveConv, ", iRadioConvStage = ", iRadioConvStage, " sConvResumeLabel = ", sConvResumeLabel, " in_car_conv_started = ", in_car_conv_started, " in_car_conv_on_hold = ", in_car_conv_on_hold) IF NOT bRadioChat IF iCurrentDriveConv < 7 AND NOT ARE_STRINGS_EQUAL(sConvResumeLabel, "FAM2_DRIV2") IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerCar) AND GET_PED_IN_VEHICLE_SEAT(vehPlayerCar) = PLAYER_PED_ID() IF GET_ENTITY_SPEED(vehPlayerCar) > 30 IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(vehPlayerCar) KILL_FACE_TO_FACE_CONVERSATION() in_car_conv_on_hold = FALSE in_car_conv_started = FALSE sConvResumeLabel = "" iCurrentDriveConv = 7 ENDIF ENDIF IF g_MissionStatTrackingArray[5].ivalue - iPedsKilled > 3 KILL_FACE_TO_FACE_CONVERSATION() in_car_conv_on_hold = FALSE in_car_conv_started = FALSE sConvResumeLabel = "" iCurrentDriveConv = 7 ENDIF ENDIF ENDIF SWITCH iCurrentDriveConv CASE 0 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_BEACH", CONV_PRIORITY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(1.0, 7.0) fJazzTime = 0.0 iPedsKilled = g_MissionStatTrackingArray[5].ivalue iCurrentDriveConv++ in_car_conv_on_hold = FALSE in_car_conv_started = FALSE iLastConvFinish = GET_GAME_TIMER() sConvResumeLabel = "" ENDIF BREAK CASE 1 IF (GET_GAME_TIMER() - iLastConvFinish) > 2000 IF NOT DOES_BLIP_EXIST(blipDest) blipDest = CREATE_BLIP_FOR_COORD(v_bike_guy_pos) ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT("FM2_BK2BIKE", DEFAULT_GOD_TEXT_TIME, 1) iLastConvFinish = GET_GAME_TIMER() iCurrentDriveConv++ ENDIF ENDIF ENDIF BREAK CASE 2 IF ((GET_GAME_TIMER() - iLastConvFinish) > 2000 AND GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) OR GET_GAME_TIMER() - iLastConvFinish > 6000 iCurrentDriveConv++ ENDIF BREAK CASE 3 IF IS_REPLAY_IN_PROGRESS() MANAGE_CONVERSATION("FAM2_WALK", bCanPlay) ELSE MANAGE_CONVERSATION("FAM2_WALK2", bCanPlay) ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT in_car_conv_on_hold AND in_car_conv_started fJazzTime = 0.0 iCurrentDriveConv++ in_car_conv_on_hold = FALSE in_car_conv_started = FALSE sConvResumeLabel = "" iLastConvFinish = GET_GAME_TIMER() ENDIF BREAK CASE 4 IF (GET_GAME_TIMER() - iLastConvFinish) > 3000 iCurrentDriveConv++ ENDIF BREAK CASE 5 IF IS_REPLAY_IN_PROGRESS() MANAGE_CONVERSATION("FAM2_DRIVB", bCanPlay) ELSE MANAGE_CONVERSATION("FAM2_DRIVE", bCanPlay) ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT in_car_conv_on_hold AND in_car_conv_started iCurrentDriveConv++ in_car_conv_on_hold = FALSE in_car_conv_started = FALSE sConvResumeLabel = "" iLastConvFinish = GET_GAME_TIMER() ENDIF BREAK CASE 6 //WAITING IN THIS STAGE UNLESS MIKE DRIVES BAD AND TRIGGERS CASE 7 BREAK CASE 7 IF NOT IS_PED_IN_ANY_VEHICLE(pedJimmy) OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) bCanPlay = FALSE ENDIF MANAGE_CONVERSATION("FAM2_DRIV2", bCanPlay) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT in_car_conv_on_hold AND in_car_conv_started iCurrentDriveConv++ in_car_conv_on_hold = FALSE in_car_conv_started = FALSE sConvResumeLabel = "" ENDIF BREAK ENDSWITCH ELSE SWITCH iRadioConvStage CASE 0 IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() sConvResumeLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() KILL_FACE_TO_FACE_CONVERSATION() in_car_conv_on_hold = TRUE ENDIF iRadioConvStage++ BREAK CASE 1 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_JAZZ", CONV_PRIORITY_HIGH) SETTIMERB(0) iRadioConvStage++ ENDIF BREAK CASE 2 IF TIMERB() > 1000 SET_RADIO_TO_STATION_INDEX(8) // FREEZE_RADIO_STATION(GET_RADIO_STATION_NAME(8)) SETTIMERB(0) iRadioConvStage++ ENDIF BREAK CASE 3 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_JAZZ2", CONV_PRIORITY_HIGH) SETTIMERB(0) iRadioConvStage++ ENDIF ENDIF BREAK CASE 4 bRadioChat = FALSE //just waits for next part. BREAK CASE 5 IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_THIS_CONVERSATION_PLAYING("FAM2_JAZZ") AND NOT IS_THIS_CONVERSATION_PLAYING("FAM2_JAZZ2") TEXT_LABEL_23 sTemp sTemp = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() IF NOT IS_STRING_NULL_OR_EMPTY(sTemp) AND NOT ARE_STRINGS_EQUAL("NULL", sTemp) sConvResumeLabel = sTemp ENDIF KILL_FACE_TO_FACE_CONVERSATION() in_car_conv_on_hold = TRUE ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_JAZZ3", CONV_PRIORITY_HIGH) SETTIMERB(0) iRadioConvStage++ ENDIF ENDIF BREAK CASE 6 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_JAZZ4", CONV_PRIORITY_HIGH) SETTIMERB(0) iRadioConvStage++ ENDIF ENDIF BREAK CASE 7 bRadioChat = FALSE BREAK ENDSWITCH ENDIF PRINTLN("@@@@@@@@ Radio debug FAM iCurrentDriveConv: ", iCurrentDriveConv, " iRadioConvStage: ", iRadioConvStage, " bRadioChat: ", bRadioChat, " sConvResumeLabel: ", sConvResumeLabel, " fJazzTime: ", fJazzTime, " @@@@@@@@@@@@") ENDPROC BOOL bPlayerHasLeftHouse = FALSE PROC GO_TO_VENICE() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NOT DOES_ENTITY_EXIST(objChair) IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPlayerStartCoords) < 50*50 REQUEST_MODEL(PROP_CS_OFFICE_CHAIR) IF HAS_MODEL_LOADED(PROP_CS_OFFICE_CHAIR) objChair = CREATE_OBJECT(PROP_CS_OFFICE_CHAIR, <<-809.4098, 172.7913, 75.7732>>) SET_ENTITY_QUATERNION(objChair, 0.0000, 0.0000, 0.3857, 0.9226) SET_MODEL_AS_NO_LONGER_NEEDED(PROP_CS_OFFICE_CHAIR) ENDIF ENDIF ELSE IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPlayerStartCoords) > 75*75 AND IS_ENTITY_OCCLUDED(objChair) DELETE_OBJECT(objChair) ENDIF ENDIF ENDIF MANAGE_DRIVE_DIALOGUE() IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_bike_guy_pos) < 1000 SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.5) ENDIF IF NOT IS_PED_INJURED(pedJimmy) IF NOT IS_PED_IN_ANY_VEHICLE(pedJimmy) SET_PED_RESET_FLAG(pedJimmy, PRF_SearchForClosestDoor, TRUE) ENDIF SWITCH iStageProgress CASE 0 bPlayerHasLeftHouse = FALSE IF NOT DOES_ENTITY_EXIST(vehMikesCar) CREATE_PLAYER_VEHICLE(vehMikesCar, CHAR_MICHAEL, v_car_start_coords, f_car_start, TRUE, VEHICLE_TYPE_CAR) ELSE IF IS_VEHICLE_DRIVEABLE(vehMikesCar) SET_ENTITY_COORDS(vehMikesCar, v_car_start_coords) SET_ENTITY_HEADING(vehMikesCar, f_car_start) ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehMikesCar, TRUE) ENDIF IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(pedJimmy) TASK_FOLLOW_WAYPOINT_RECORDING(pedJimmy, sJimmyStairRoute, 0, EWAYPOINT_START_FROM_CLOSEST_POINT) ENDIF bBlipParkingSpace = FALSE bGoBackToJimmyPrinted = FALSE DO_SCREEN_FADE_IN(500) SET_INITIAL_PLAYER_STATION("RADIO_01_CLASS_ROCK") IF DOES_ENTITY_EXIST(pedJimmy) AND NOT IS_ENTITY_VISIBLE(pedJimmy) SET_ENTITY_VISIBLE(pedJimmy, TRUE) ENDIF //FREEZE_RADIO_STATION("RADIO_01_CLASS_ROCK") IF bReplaySetupRequired FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK) bReplaySetupRequired = FALSE ENDIF iStageProgress++ BREAK CASE 1 IF NOT DOES_ENTITY_EXIST(vehPlayerCar) CREATE_NPC_VEHICLE(vehTraceyCar, CHAR_TRACEY, <<-812.4639, 159.7855, 71.0588>>, 113.1515, TRUE, VEHICLE_TYPE_CAR) ENDIF IF NOT DOES_ENTITY_EXIST(vehMikesCar) CREATE_PLAYER_VEHICLE(vehMikesCar, CHAR_MICHAEL, v_car_start_coords, f_car_start, TRUE, VEHICLE_TYPE_CAR) ENDIF IF DOES_ENTITY_EXIST(vehTraceyCar) AND DOES_ENTITY_EXIST(vehMikesCar) iStageProgress++ ENDIF BREAK CASE 2 IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(pedJimmy) AND NOT IS_PED_IN_GROUP(pedJimmy) IF GET_PED_WAYPOINT_PROGRESS(pedJimmy) > 13 IF DOES_ENTITY_EXIST(vehMikesCar) AND IS_VEHICLE_DRIVEABLE(vehMikesCar) TASK_ENTER_VEHICLE(pedJimmy, vehMikesCar, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK) ELIF DOES_ENTITY_EXIST(vehPlayerCar) AND IS_VEHICLE_DRIVEABLE(vehPlayerCar) TASK_ENTER_VEHICLE(pedJimmy, vehPlayerCar, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK) ENDIF REMOVE_WAYPOINT_RECORDING(sJimmyStairRoute) ENDIF ENDIF // IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(pedJimmy) // AND NOT IS_PED_IN_ANY_VEHICLE(pedJimmy, TRUE) // IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK // IF DOES_ENTITY_EXIST(vehMikesCar) // TASK_ENTER_VEHICLE(pedJimmy, vehMikesCar, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK) // ELIF DOES_ENTITY_EXIST(vehPlayerCar) // TASK_ENTER_VEHICLE(pedJimmy, vehMikesCar, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVE_RUN) // ENDIF // REMOVE_WAYPOINT_RECORDING(sJimmyStairRoute) // ENDIF // ENDIF IF NOT bPlayerHasLeftHouse IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-818.154114,177.643127,75.127777>>, <<-819.791138,176.999146,70.625862>>, 3.250000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-795.150085,176.543396,74.135185>>, <<-795.530334,177.550110,71.835182>>, 2.500000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-793.730225,181.551041,74.135185>>, <<-792.538513,182.000153,71.835182>>, 2.500000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-802.401917,167.616302,79.107170>>, <<-801.433594,165.463943,76.072403>>, 2.500000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.890747,185.845673,71.431641>>, <<-807.430603,187.241699,74.226456>>, 1.750000) bPlayerHasLeftHouse = TRUE ENDIF ENDIF BOOL bInCarJimmyIsHeadingFor bInCarJimmyIsHeadingFor = FALSE IF (IS_VEHICLE_DRIVEABLE(vehMikesCar) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehMikesCar)) OR NOT DOES_ENTITY_EXIST(vehMikesCar) bInCarJimmyIsHeadingFor = TRUE ENDIF IF (VDIST(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 15 OR (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))) AND bPlayerHasLeftHouse IF NOT bInCarJimmyIsHeadingFor CLEAR_PED_TASKS(pedJimmy) ENDIF SET_PED_AS_GROUP_MEMBER(pedJimmy, GET_PLAYER_GROUP(PLAYER_ID())) SET_PED_GROUP_MEMBER_PASSENGER_INDEX(pedJimmy, VS_FRONT_RIGHT) iStageProgress++ ENDIF BREAK CASE 3 IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(pedJimmy) IF GET_PED_WAYPOINT_PROGRESS(pedJimmy) > 13 IF DOES_ENTITY_EXIST(vehMikesCar) AND IS_VEHICLE_DRIVEABLE(vehMikesCar) TASK_ENTER_VEHICLE(pedJimmy, vehMikesCar, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK) ELIF DOES_ENTITY_EXIST(vehPlayerCar) AND IS_VEHICLE_DRIVEABLE(vehPlayerCar) TASK_ENTER_VEHICLE(pedJimmy, vehPlayerCar, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK) FORCE_PED_MOTION_STATE(pedJimmy, MS_ON_FOOT_WALK) ENDIF REMOVE_WAYPOINT_RECORDING(sJimmyStairRoute) ENDIF ENDIF IF IS_PED_GROUPED(pedJimmy) IF NOT DOES_ENTITY_EXIST(vehPlayerCar) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) AND GET_PED_IN_VEHICLE_SEAT(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) = PLAYER_PED_ID() vehPlayerCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) SET_ENTITY_AS_MISSION_ENTITY(vehPlayerCar, TRUE, TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehPlayerCar, TRUE) REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGH) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vehPlayerCar, FAM2_MAX_CAR_SPEED) ENDIF ELSE //set the destination blip to park up if in vehicle, or stragiht to the rental place of on foot. IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerCar) bBlipParkingSpace = TRUE ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerCar) AND IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) vehPlayerCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) SET_ENTITY_AS_MISSION_ENTITY(vehPlayerCar, TRUE, TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehPlayerCar, TRUE) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vehPlayerCar, FAM2_MAX_CAR_SPEED) ENDIF ELSE SET_VEHICLE_AS_NO_LONGER_NEEDED(vehPlayerCar) ENDIF ENDIF IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) bBlipParkingSpace = FALSE ENDIF IF bBlipParkingSpace IF DOES_BLIP_EXIST(blipDest) IF NOT ARE_VECTORS_EQUAL(GET_BLIP_COORDS(blipDest), v_car_stop) REMOVE_BLIP(blipDest) ENDIF ELSE blipDest = CREATE_BLIP_FOR_COORD(v_car_stop, TRUE) ENDIF ELSE IF DOES_BLIP_EXIST(blipDest) IF NOT ARE_VECTORS_EQUAL(GET_BLIP_COORDS(blipDest), <<-1103.2129, -1695.1508, 3.3416>>) REMOVE_BLIP(blipDest) ENDIF ELSE blipDest = CREATE_BLIP_FOR_COORD(<<-1103.2129, -1695.1508, 3.3416>>, FALSE) ENDIF ENDIF IF bBlipParkingSpace IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) AND IS_ENTITY_AT_COORD(vehPlayerCar, v_car_stop, <<3,3,LOCATE_SIZE_HEIGHT>>, TRUE) AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerCar) REMOVE_BLIP(blipDest) iStageProgress++ ENDIF ELSE IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-1103.2129, -1695.1508, 3.3416>>, <<6,6,LOCATE_SIZE_HEIGHT>>, TRUE) GO_TO_STAGE(stage_hire_bike) ENDIF ENDIF IF DOES_BLIP_EXIST(blipBuddy) CLEAR_PRINTS() REMOVE_BLIP(blipBuddy) ENDIF ELSE IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) ENDIF IF NOT DOES_BLIP_EXIST(blipBuddy) CLEAR_PRINTS() IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() sConvResumeLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() KILL_FACE_TO_FACE_CONVERSATION() in_car_conv_on_hold = TRUE ENDIF KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF NOT bGoBackToJimmyPrinted PRINT("FM2_JIMGB", DEFAULT_GOD_TEXT_TIME, 1) ENDIF blipBuddy = CREATE_BLIP_FOR_PED(pedJimmy) ENDIF ENDIF IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), FALSE) AND IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) AND GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) = 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT bMoreSeatsPrinted PRINT("FM2_BIGGERV", DEFAULT_GOD_TEXT_TIME, 1) bMoreSeatsPrinted = TRUE ENDIF ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND bMoreSeatsPrinted CLEAR_PRINTS() bMoreSeatsPrinted = FALSE ENDIF ENDIF BREAK CASE 4 IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehPlayerCar, 4, 1) IF IS_PED_IN_VEHICLE(pedJimmy, vehPlayerCar) IF IS_PHONE_ONSCREEN() HANG_UP_AND_PUT_AWAY_PHONE(TRUE) ENDIF KILL_FACE_TO_FACE_CONVERSATION() TASK_LOOK_AT_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehPlayerCar, <<10,5,0>>), 20000, SLF_EXTEND_YAW_LIMIT, SLF_LOOKAT_HIGH) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_HIRE1", CONV_PRIORITY_HIGH) in_car_conv_on_hold = FALSE TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), pedJimmy, 30000, SLF_EXTEND_YAW_LIMIT) SEQUENCE_INDEX seqJimmy OPEN_SEQUENCE_TASK(seqJimmy) TASK_LEAVE_VEHICLE(NULL, vehPlayerCar) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1102.1871, -1697.8910, 3.3562>>, PEDMOVEBLENDRATIO_WALK) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(seqJimmy) TASK_PERFORM_SEQUENCE(pedJimmy, seqJimmy) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) REMOVE_PED_FROM_GROUP(pedJimmy) CLEAR_SEQUENCE_TASK(seqJimmy) REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGHEST) iStageProgress=8 ENDIF ENDIF ELSE REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGH) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL, FAM2_MAX_CAR_SPEED) GO_TO_STAGE(stage_hire_bike) ENDIF ENDIF ENDIF BREAK CASE 5 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_HIRE1", CONV_PRIORITY_HIGH) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), pedJimmy, 20000, SLF_EXTEND_YAW_LIMIT, SLF_LOOKAT_HIGH) SETTIMERA(0) iStageProgress=8 ENDIF BREAK CASE 8 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL, FAM2_MAX_CAR_SPEED) GO_TO_STAGE(stage_hire_bike) // ENDIF BREAK ENDSWITCH IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerCar) IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_2_DRIVE_TO_BEACH") START_AUDIO_SCENE("FAMILY_2_DRIVE_TO_BEACH") ENDIF ELSE IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_DRIVE_TO_BEACH") STOP_AUDIO_SCENE("FAMILY_2_DRIVE_TO_BEACH") ENDIF ENDIF ENDIF ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 LOSE_THE_COPS() ENDIF ENDPROC PROC BIKE_TUTORIAL() IF DOES_ENTITY_EXIST(vehPlayerBike) AND IS_VEHICLE_DRIVEABLE(vehPlayerBike) SWITCH iBikeTutStage CASE 0 IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) AND NOT IS_BROWSER_OPEN() IF NOT IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL) PRINT_HELP("FM2_BIKE1") ELSE PRINT_HELP("FM2_BIKE1_KM") ENDIF iBikeTutStage++ ENDIF BREAK CASE 1 IF NOT IS_PC_VERSION() IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE1") AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) AND NOT IS_BROWSER_OPEN() PRINT_HELP("FM2_BIKE2") iBikeTutStage++ ENDIF ELSE IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE1") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE1_KM") AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) AND NOT IS_BROWSER_OPEN() PRINT_HELP("FM2_BIKE2") iBikeTutStage++ ENDIF ENDIF BREAK CASE 2 IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE2") AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) AND NOT IS_BROWSER_OPEN() IF IS_VEHICLE_MODEL(vehPlayerBike, BMX) OR IS_VEHICLE_MODEL(vehPlayerBike, SCORCHER) PRINT_HELP("FM2_BIKE3") ENDIF iBikeTutStage++ ENDIF BREAK // CASE 3 // IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE3") // AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) // AND NOT IS_BROWSER_OPEN() // IF NOT IS_VEHICLE_MODEL(vehPlayerBike, TRIBIKE) // AND NOT IS_VEHICLE_MODEL(vehPlayerBike, CRUISER) // PRINT_HELP("FM2_WHEELIE") // ENDIF // iBikeTutStage++ // ENDIF // BREAK CASE 3 IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE2") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE3") AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) AND NOT IS_BROWSER_OPEN() PRINT_HELP("FM2_BIKE4") iBikeTutStage++ ENDIF BREAK ENDSWITCH IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) OR IS_BROWSER_OPEN() IF IS_PC_VERSION() IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE1_KM") CLEAR_HELP() ENDIF ENDIF IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE1") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE2") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE3") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_BIKE4") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_WHEELIE") CLEAR_HELP() ENDIF ENDIF ENDIF ENDPROC //BOOL bResentmentConv = FALSE BOOL bCHooseBikeText = FALSE BOOL bJimmyBikeFree = FALSE BOOL bJimmySentForBike = FALSE BOOL bChoiceLinePlayed = FALSE INT iTimeMovingStarted PROC DO_IN_GAME_BIKE_HIRE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SET_ALL_NEUTRAL_RANDOM_PEDS_FLEE_THIS_FRAME (PLAYER_ID()) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.4) INT iTemp IF iStageProgress <> 1000 IF VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 50*50 iSavedStage = iStageProgress iStageProgress = 1000 ENDIF ENDIF IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_DRIVE_TO_BEACH") IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) STOP_AUDIO_SCENE("FAMILY_2_DRIVE_TO_BEACH") ENDIF ENDIF IF bMovingStart AND iStageProgress > 1 IF GET_GAME_TIMER() - iTimeMovingStarted < 2000 SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ELSE bMovingStart = FALSE ENDIF ENDIF IF NOT IS_PED_INJURED(pedJimmy) AND NOT IS_PED_INJURED(pedBikeGuy) SWITCH iStageProgress CASE 0 bBeenOnBike = FALSE REMOVE_PED_FROM_GROUP(pedJimmy) REQUEST_VEHICLE_RECORDING(i_jimmy_bike_rec, s_jimmy_bike_rec) REQUEST_ANIM_DICT("veh@bicycle@mountain_f@front@base") iStageProgress++ iJimmyChoice = 0 iMikeChoice = 0 iCurrentJimmyTarget = 4 bChoiceLinePlayed = FALSE iTimeMovingStarted = GET_GAME_TIMER() SET_WANTED_LEVEL_MULTIPLIER(0.3) IF bReplaySetupRequired iStageProgress = -1 ENDIF BREAK CASE -1 MANAGE_BIKE_SHOP() // IF NOT DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1105.2411, -1697.0247, 3.3678>>, 0.5, PROP_TABLE_03_CHR) // IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1105.2411, -1697.0247, 3.3678>>, 10, PROP_TABLE_03_CHR) // OBJECT_INDEX objTemp // objTemp = GET_CLOSEST_OBJECT_OF_TYPE(<<-1105.2411, -1697.0247, 3.3678>>, 10, PROP_TABLE_03_CHR, TRUE) // SET_ENTITY_AS_MISSION_ENTITY(objTemp, TRUE, TRUE) // DELETE_OBJECT(objTemp) // ENDIF // OBJECT_INDEX objTempChair // REQUEST_MODEL(PROP_TABLE_03_CHR) // objTempChair = CREATE_OBJECT(PROP_TABLE_03_CHR, <<-1105.2411, -1697.0247, 3.3678>>) // SET_ENTITY_QUATERNION(objTempChair, 0.0000, 0.0000, 0.8708, 0.4917) // ENDIF IF NOT IS_PED_INJURED(pedBikeGuy) AND DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1105.2411, -1697.0247, 3.3678>>, 2, PROP_TABLE_03_CHR) AND IS_PED_USING_SCENARIO(pedBikeGuy, "PROP_HUMAN_SEAT_CHAIR") PRINTLN("pedbikeguy is alive") bReplaySetupRequired = FALSE iStageProgress = 1 ENDIF BREAK CASE 1 blipDest = CREATE_BLIP_FOR_COORD(v_bike_guy_pos) IF bShowGodText PRINT("FM2_BK2BIKE", DEFAULT_GOD_TEXT_TIME, 1) SETTIMERA(0) ENDIF TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), pedJimmy, 40000, SLF_EXTEND_YAW_LIMIT) TASK_LOOK_AT_ENTITY(pedJimmy, PLAYER_PED_ID(), 40000, SLF_EXTEND_YAW_LIMIT) // bResentmentConv = FALSE bChooseBikeText = FALSE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() TEXT_LABEL_23 sConv sConv = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT() IF NOT ARE_STRINGS_EQUAL("FAM2_HIRE1", sConv) PRINTLN("FAM2_HIRE1 is not the currently playing label killing conv") KILL_FACE_TO_FACE_CONVERSATION() ELSE PRINTLN("FAM2_HIRE1 is the currently playing label NOT killing conv") ENDIF ENDIF bJimmySentForBike = FALSE IF IS_SCREEN_FADED_OUT() FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK) ENDIF iStageProgress++ BREAK CASE 2 IF g_bPlayerIsInTaxi PRINTLN("Player is in taxi") WHILE g_bPlayerIsInTaxi PRINTLN("Waiting for taxi to finish") WAIT(0) ENDWHILE ENDIF PRINTLN("DOING SPECIFIC FADE FOR BIKE HIRE") IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(1000) ENDIF IF IS_PED_IN_ANY_VEHICLE(pedJimmy, TRUE) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) AND IS_PED_IN_VEHICLE(pedJimmy, vehPlayerCar) TASK_LEAVE_VEHICLE(pedJimmy, vehPlayerCar) ELSE TASK_LEAVE_ANY_VEHICLE(pedJimmy) ENDIF ENDIF ELSE SETTIMERB(0) iStageProgress++ ENDIF BREAK CASE 3 IF NOT IS_PED_INJURED(pedJimmy) AND TIMERA() > 3000 IF NOT IS_PED_FACING_PED(pedJimmy, PLAYER_PED_ID(), 60) IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK CLEAR_PED_TASKS(pedJimmy) TASK_LOOK_AT_ENTITY(pedJimmy, PLAYER_PED_ID(), -1, SLF_WIDEST_YAW_LIMIT) OPEN_SEQUENCE_TASK(seqTurnTask) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, SLF_WIDEST_YAW_LIMIT) CLOSE_SEQUENCE_TASK(seqTurnTask) TASK_PERFORM_SEQUENCE(pedJimmy, seqTurnTask) CLEAR_SEQUENCE_TASK(seqTurnTask) ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK IF NOT IS_PED_INJURED(pedJimmy) TASK_LOOK_AT_ENTITY(pedJimmy, PLAYER_PED_ID(), -1, SLF_WIDEST_YAW_LIMIT) ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(pedBikeGuy) IF VDIST(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(pedBikeGuy)) > VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedBikeGuy)) + 0.3 OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1099.755737,-1700.726074,3.349046>>, <<-1111.517456,-1683.961792,5.340389>>, 7.250000) OR TIMERA() > 6000 CLEAR_PED_TASKS(pedJimmy) iStageProgress++ ENDIF ENDIF ENDIF BREAK CASE 4 IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1099.755737,-1700.726074,3.349046>>, <<-1111.517456,-1683.961792,5.340389>>, 7.250000) IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) FREEZE_ENTITY_POSITION(vehPlayerCar, FALSE) ENDIF SEQUENCE_INDEX seqGoToBikeGuy OPEN_SEQUENCE_TASK(seqGoToBikeGuy) IF IS_PED_IN_ANY_VEHICLE(pedJimmy) TASK_LEAVE_ANY_VEHICLE(NULL) ENDIF TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1102.1871, -1697.8910, 3.3562>>, PEDMOVEBLENDRATIO_RUN) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(seqGoToBikeGuy) TASK_PERFORM_SEQUENCE(pedJimmy, seqGoToBikeGuy) CLEAR_SEQUENCE_TASK(seqGoToBikeGuy) SET_PED_MAX_MOVE_BLEND_RATIO(pedJimmy, PEDMOVEBLENDRATIO_WALK) iStageProgress++ ENDIF BREAK CASE 5 SET_PED_MAX_MOVE_BLEND_RATIO(pedJimmy, PEDMOVEBLENDRATIO_WALK) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1099.755737,-1700.726074,3.349046>>, <<-1111.517456,-1683.961792,5.340389>>, 7.250000) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_HIRE3", CONV_PRIORITY_HIGH) CLEAR_PRINTS() TASK_LOOK_AT_ENTITY(pedBikeGuy, PLAYER_PED_ID(), 30000) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), pedBikeGuy, 10000) REMOVE_BLIP(blipDest) SETTIMERA(0) iStageProgress++ ENDIF ELSE iStageProgress++ ENDIF ENDIF BREAK //in this stage we wait for Jimmy to get on a bike. CASE 6 IF IS_VEHICLE_DRIVEABLE(vehBikes[iCurrentJimmyTarget]) AND NOT IS_PED_IN_VEHICLE(pedJimmy, vehBikes[iCurrentJimmyTarget]) IF NOT IS_VEHICLE_SEAT_FREE(vehBikes[iCurrentJimmyTarget]) IF bJimmySentForBike CLEAR_PED_TASKS(pedJimmy) bJimmySentForBike = FALSE ENDIF IF iCurrentJimmyTarget = 4 iCurrentJimmyTarget = 1 ELIF iCurrentJimmyTarget = 1 iCurrentJimmyTarget = 4 ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(vehPlayerBike) SET_PED_MAX_MOVE_BLEND_RATIO(pedJimmy, PEDMOVEBLENDRATIO_WALK) ENDIF REQUEST_ANIM_DICT("veh@bicycle@mountain_f@front@base") IF HAS_ANIM_DICT_LOADED("veh@bicycle@mountain_f@front@base") IF IS_VEHICLE_DRIVEABLE(vehBikes[iCurrentJimmyTarget]) IF NOT bJimmySentForBike AND (IS_ENTITY_IN_ANGLED_AREA(pedJimmy, <<-1099.755737,-1700.726074,3.349046>>, <<-1111.517456,-1683.961792,5.340389>>, 9.250000) OR NOT IS_ENTITY_IN_ANGLED_AREA(vehBikes[iCurrentJimmyTarget], <<-1099.755737,-1700.726074,3.349046>>, <<-1111.517456,-1683.961792,5.340389>>, 9.250000)) SEQUENCE_INDEX seqGetOnBike OPEN_SEQUENCE_TASK(seqGetOnBike) TASK_ENTER_VEHICLE(NULL, vehBikes[iCurrentJimmyTarget], DEFAULT_TIME_NEVER_WARP, VS_DRIVER, PEDMOVEBLENDRATIO_RUN) TASK_STAND_STILL(NULL, 2000) TASK_VEHICLE_DRIVE_TO_COORD(NULL, vehBikes[iCurrentJimmyTarget], <<-1099.6821, -1694.0726, 3.2758>>, 5, DRIVINGSTYLE_ACCURATE, CRUISER, DRIVINGMODE_AVOIDCARS | DF_StopForPeds, 2.0, 3.0) CLOSE_SEQUENCE_TASK(seqGetOnBike) TASK_PERFORM_SEQUENCE(pedJimmy, seqGetOnBike) CLEAR_SEQUENCE_TASK(seqGetOnBike) bJimmySentForBike = TRUE ENDIF ENDIF ELSE PRINTLN("loading anim veh@bicycle@mountain_f@front@base") ENDIF IF NOT DOES_ENTITY_EXIST(vehJimmyBike) REPEAT COUNT_OF(vehBikes) iTemp IF DOES_ENTITY_EXIST(vehBikes[iTemp]) AND IS_VEHICLE_DRIVEABLE(vehBikes[iTemp]) IF IS_PED_SITTING_IN_VEHICLE(pedJimmy, vehBikes[iTemp]) vehJimmyBike = vehBikes[iTemp] SET_PED_IN_VEHICLE_CONTEXT(pedJimmy, GET_HASH_KEY("MISS_FAMILY2_JIMMY_BICYCLE")) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehJimmyBike, FALSE) DEBIT_BANK_ACCOUNT(CHAR_MICHAEL, BAAC_UNLOGGED_SMALL_ACTION, 20) PRINTLN("Debitting account for jimmy bike") IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_JBIKE", CONV_PRIORITY_HIGH) ENDIF SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(pedJimmy, KNOCKOFFVEHICLE_NEVER) iJimmyChoice = iTemp FREEZE_ENTITY_POSITION(vehJimmyBike, FALSE) ENDIF ENDIF ENDREPEAT ELSE IF NOT IS_PED_IN_ANY_VEHICLE(pedJimmy) PRINTLN("JIMMY SPOOK 3") MISSION_FAILED("FM2_JSPOOK") ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(vehPlayerBike) REPEAT COUNT_OF(vehBikes) iTemp IF IS_VEHICLE_DRIVEABLE(vehBikes[iTemp]) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehBikes[iTemp], TRUE) vehPlayerBike = vehBikes[iTemp] DEBIT_BANK_ACCOUNT(CHAR_MICHAEL, BAAC_UNLOGGED_SMALL_ACTION, 20) PRINTLN("Debitting account for player bike") FREEZE_ENTITY_POSITION(vehBikes[iTemp], FALSE) CLEAR_PRINTS() iMikeChoice = iTemp IF VDIST(GET_ENTITY_COORDS(pedJimmy), <<-1108.6643, -1691.6234, 3.3746>>) > 5 AND NOT IS_PED_IN_ANY_VEHICLE(pedJimmy) AND bJimmySentForBike bJimmySentForBike = FALSE ENDIF ENDIF ENDIF ENDREPEAT IF NOT bCHooseBikeText IF TIMERA() > 1000 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 PRINT_NOW("FM2_CHSEBIKE", DEFAULT_GOD_TEXT_TIME, 1) bCHooseBikeText = TRUE ENDIF ENDIF ENDIF ELSE IF NOT bChoiceLinePlayed IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_HIRE4", CONV_PRIORITY_HIGH) bChoiceLinePlayed = TRUE ENDIF ENDIF IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) vehPlayerBike = NULL ENDIF ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND DOES_ENTITY_EXIST(vehJimmyBike) AND DOES_ENTITY_EXIST(vehPlayerBike) AND IS_VEHICLE_DRIVEABLE(vehJimmyBike) AND IS_VEHICLE_DRIVEABLE(vehPlayerBike) AND IS_PED_SITTING_IN_VEHICLE(pedJimmy, vehJimmyBike) vehbikes[iMikeChoice] = NULL vehbikes[iJimmyChoice] = NULL REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_HIGH) iStageProgress++ ENDIF BREAK CASE 7 IF TIMERA() > 3000 GO_TO_STAGE(stage_bike_ride) ENDIF BREAK CASE 1000 IF NOT DOES_BLIP_EXIST(blipBuddy) IF NOT bGoBackToJimmyPrinted CLEAR_PRINTS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() PRINT("FM2_JIMGB", DEFAULT_GOD_TEXT_TIME, 1) ENDIF blipBuddy = CREATE_BLIP_FOR_PED(pedJimmy) ENDIF IF DOES_BLIP_EXIST(blipDest) IF GET_BLIP_ALPHA(blipDest) <> 0 SET_BLIP_ALPHA(blipDest, 0) ENDIF ENDIF IF VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 20*20 OR (NOT IS_PED_INJURED(pedBikeGuy) AND VDIST2(GET_ENTITY_COORDS(pedBikeGuy), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 30*30) iStageProgress = iSavedStage IF DOES_BLIP_EXIST(blipDest) IF GET_BLIP_ALPHA(blipDest) <> 255 SET_BLIP_ALPHA(blipDest, 255) ENDIF ENDIF IF DOES_BLIP_EXIST(blipBuddy) REMOVE_BLIP(blipBuddy) ENDIF ENDIF IF VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 150*150 Mission_Failed("FM2_JIMAB") ENDIF BREAK ENDSWITCH IF NOT bJimmyBikeFree IF IS_VEHICLE_DRIVEABLE(vehJimmyBike) AND NOT IS_PED_INJURED(pedJimmy) AND IS_PED_IN_VEHICLE(pedJimmy, vehJimmyBike) FREEZE_ENTITY_POSITION(vehJimmyBike, FALSE) bJimmyBikeFree = TRUE ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(vehPlayerBike) AND IS_VEHICLE_DRIVEABLE(vehPlayerBike) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_2_BIKE_RACE_JIMMY") START_AUDIO_SCENE("FAMILY_2_BIKE_RACE_JIMMY") ENDIF ENDIF ENDPROC //Builds an array of vectors for a car recording path PROC BUILD_PATH_FOR_RECORDING(VECTOR &path[], INT FileNumber, STRING pRecordingName) REQUEST_VEHICLE_RECORDING(FileNumber, pRecordingName) IF HAS_VEHICLE_RECORDING_BEEN_LOADED(FileNumber, pRecordingName) FLOAT duration = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(FileNumber, pRecordingName) FLOAT route_segment = duration/(COUNT_OF(path)-1) INT iTemp REPEAT COUNT_OF(path) iTemp path[iTemp] = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(FileNumber, route_segment*iTemp, pRecordingName) ENDREPEAT ENDIF ENDPROC #IF IS_DEBUG_BUILD PROC DRAW_PATH(VECTOR &vPath[]) INT iTemp FOR iTemp = 0 TO COUNT_OF(vPath) - 1 DRAW_DEBUG_LINE(vPath[iTemp], vPath[iTemp]+<<0,0,2>>) IF iTemp > 0 DRAW_DEBUG_LINE(vPath[iTemp]+<<0,0,1>>, vPath[iTemp-1]+<<0,0,1>>, 0, 0, 255) ENDIF ENDFOR ENDPROC #ENDIF FUNC FLOAT GET_TIME_POSITION_IN_RECORDING_FROM_POSITION(VECTOR point, INT iRecNumber, STRING sRecName, VECTOR &route[]) IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iRecNumber, sRecName) INT iTemp, iTemp2 //three closest nodes, seeded at 0, 1 and 2 to prevent stacking on 0 INT iClosestNodes[3] iClosestNodes[0] = COUNT_OF(route) - 1 iClosestNodes[1] = COUNT_OF(route) - 2 iClosestNodes[2] = COUNT_OF(route) - 3 //Cycle through all points REPEAT COUNT_OF(route) iTemp //get distance to current point FLOAT fDistX = ABSF(point.x - route[iTemp].x) FLOAT fDistY = ABSF(point.y - route[iTemp].y) FLOAT fDist = fDistX + fDistY //cycle through current three closest points and get distance to all to figure furthest FLOAT fFurthest = 0.0 INT iFurthest = 0 REPEAT COUNT_OF(iClosestNodes) iTemp2 IF iTemp <> iClosestNodes[iTemp2] FLOAT fTempDistX = ABSF(point.x - route[iClosestNodes[iTemp2]].x) FLOAT fTempDistY = ABSF(point.y - route[iClosestNodes[iTemp2]].y) FLOAT fTempDist = fTempDistX + fTempDistY IF fTempDist > fFurthest iFurthest = iTemp2 fFurthest = fTempDist ENDIF ENDIF ENDREPEAT //if this points distance is closer than the furthest in the set of three closest nodes then replace it with this node. IF fDist < fFurthest iClosestNodes[iFurthest] = iTemp ENDIF ENDREPEAT #IF IS_DEBUG_BUILD REPEAT COUNT_OF(iClosestNodes) iTemp2 //DRAW_DEBUG_SPHERE(route[iClosestNodes[iTemp2]]+<<0,0,0.3*iTemp2+0.3>>, 0.1, 255,0,0) ENDREPEAT #ENDIF //now we have the three closest points check line positions to see which line is closest FLOAT fClosestDist = 999999 INT iClosestLineStart VECTOR vClosestPoint REPEAT COUNT_OF(iClosestNodes) iTemp VECTOR vTemp1 VECTOR vTemp2 //get the distnace to the line either side of the nearest point, wrapping to start and end point if necessary. IF iClosestNodes[iTemp] > 0 vTemp1 = GET_CLOSEST_POINT_ON_LINE(point, route[iClosestNodes[iTemp]], route[iClosestNodes[iTemp]-1]) ELSE vTemp1 = route[0] ENDIF IF iClosestNodes[iTemp] < COUNT_OF(route)-2 vTemp2 = GET_CLOSEST_POINT_ON_LINE(point, route[iClosestNodes[iTemp]], route[iClosestNodes[iTemp]+1]) ELSE vTemp2 = route[COUNT_OF(route)-1] ENDIF //Check which line is closer VECTOR vClosest BOOL bAhead = FALSE //this is a flag to show that the player is ahead of the current closest point IF VDIST2(point, vTemp1) < VDIST2(point, vTemp2) vClosest = vTemp1 ELSE bAhead = TRUE vClosest = vTemp2 ENDIF //check if the closest point to the line from the current closest node is closer than the current closest IF VDIST2(point, vClosest) < fClosestDist IF bAhead iClosestLineStart = iClosestNodes[iTemp] ELSE iClosestLineStart = iClosestNodes[iTemp] - 1 ENDIF fClosestDist = VDIST2(point, vClosest) vClosestPoint = vClosest ENDIF ENDREPEAT iClosestLineStart = CLAMP_INT(iClosestLineStart, 0, COUNT_OF(route)-2) FLOAT fTimePerNode = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iRecNumber, sRecName)/(COUNT_OF(route)-1) FLOAT fCurrentLineProg = (VDIST(route[iClosestLineStart], vClosestPoint)/VDIST(route[iClosestLineStart], route[iClosestLineStart+1]))*fTimePerNode #IF IS_DEBUG_BUILD //DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(VDIST(route[iClosestLineStart], vClosestPoint)/VDIST(route[iClosestLineStart], route[iClosestLineStart+1])), <<0.5, 0.9, 0>>) //DRAW_DEBUG_SPHERE(vClosestPoint + <<0.2,0,0>>, 0.1, 255, 0, 255) #ENDIF RETURN fCurrentLineProg + (iClosestLineStart*fTimePerNode) ELSE RETURN 0.0 ENDIF ENDFUNC BOOL bForcedPlayback = FALSE BOOL bStickToPathStrict = FALSE FLOAT fPlayerProg FLOAT fJimmyProg PROC KEEP_JIMMY_ON_REC_PATH() IF NOT IS_PED_INJURED(pedJimmy) AND IS_VEHICLE_DRIVEABLE(vehJimmyBike) IF IS_PED_IN_VEHICLE(pedJimmy, vehJimmyBike) fPlayerProg = GET_TIME_POSITION_IN_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), i_jimmy_bike_rec, s_jimmy_bike_rec, vBikeRoutePath) fJimmyProg = GET_TIME_POSITION_IN_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(vehJimmyBike), i_jimmy_bike_rec, s_jimmy_bike_rec, vBikeRoutePath) IF NOT bForcedPlayback IF NOT bStickToPathStrict PRINTLN("AVOIDING PEDS") IF IS_ENTITY_IN_ANGLED_AREA(pedJimmy, <<-1572.473755,-994.666687,2.017392>>, <<-1515.634155,-926.809143,29.122761>>, 100.000000) OR IS_ENTITY_IN_ANGLED_AREA(pedJimmy, <<-1382.942139,-1442.318970,3.013994>>, <<-1367.638184,-1471.879272,8.426488>>, 22.250000) IF IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vehJimmyBike) OR IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike) STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) ENDIF START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehJimmyBike, i_jimmy_bike_rec, s_jimmy_bike_rec, 15, DRIVINGMODE_PLOUGHTHROUGH) bStickToPathStrict = TRUE ENDIF ELSE PRINTLN("PLOUGHING THROUGH") IF NOT IS_ENTITY_IN_ANGLED_AREA(pedJimmy, <<-1572.473755,-994.666687,2.017392>>, <<-1515.634155,-926.809143,29.122761>>, 100.000000) AND NOT IS_ENTITY_IN_ANGLED_AREA(pedJimmy, <<-1382.942139,-1442.318970,3.013994>>, <<-1367.638184,-1471.879272,8.426488>>, 22.250000) IF IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vehJimmyBike) OR IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike) STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) ENDIF START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehJimmyBike, i_jimmy_bike_rec, s_jimmy_bike_rec, 15, DRIVINGMODE_AVOIDCARS | DF_SteerAroundPeds | DF_DontSteerAroundPlayerPed) bStickToPathStrict = FALSE ENDIF ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedJimmy)) > 100*100 AND fJimmyProg > 10 AND (HAS_VEHICLE_RECORDING_BEEN_LOADED(i_jimmy_bike_rec, s_jimmy_bike_rec) AND fJimmyProg < GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(i_jimmy_bike_rec, s_jimmy_bike_rec) - 10) IF IS_ENTITY_OCCLUDED(pedJimmy) AND IS_ENTITY_OCCLUDED(vehJimmyBike) AND NOT IS_SPHERE_VISIBLE(GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(i_jimmy_bike_rec, fJimmyProg, s_jimmy_bike_rec), 4) SET_ENTITY_COLLISION(vehJimmyBike, FALSE) STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) START_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike, i_jimmy_bike_rec, s_jimmy_bike_rec) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike, fJimmyProg) bForcedPlayback = TRUE ENDIF ENDIF ELSE IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedJimmy)) < 95*95 IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike) SET_ENTITY_COLLISION(vehJimmyBike, TRUE) SET_PLAYBACK_TO_USE_AI(vehJimmyBike, DRIVINGMODE_AVOIDCARS | DF_SteerAroundPeds | DF_DontSteerAroundPlayerPed) bForcedPlayback = FALSE ENDIF ENDIF ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK TASK_ENTER_VEHICLE(pedJimmy, vehJimmyBike) ENDIF ENDIF ENDIF ENDPROC FLOAT fPlayerDistanceFromTrack //BOOL bJimmyFinalMoveTask INT iJimmyBreatheTime INT iCurrentBikePathNode = -1 VECTOR vBikeGPSNodes[4] PROC BUILD_CUSTOM_GPS_ROUTE(VECTOR &vRoute[], INT &iCurrentClosest) INT i = 0 INT iClosestNode = -1 FLOAT fClosestDist = 0.0 VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) //Get the closest node to the player REPEAT (COUNT_OF(vRoute) - 1) i FLOAT fDist = VDIST2(vPlayerPos, vRoute[i]) IF iClosestNode = -1 OR fDist < fClosestDist iClosestNode = i fClosestDist = fDist ENDIF #IF IS_DEBUG_BUILD IF i = iCurrentClosest DRAW_DEBUG_SPHERE(vRoute[i], 10, 0, 255, 0, 100) ELSE DRAW_DEBUG_SPHERE(vRoute[i], 10, 0, 0, 255, 100) ENDIF #ENDIF ENDREPEAT //If the closest node is closer to the next node than the player then it's the first node in the route, otherwise it's the next node. IF VDIST2(vPlayerPos, vRoute[iClosestNode+1]) < VDIST2(vRoute[iClosestNode], vRoute[iClosestNode+1]) iClosestNode = iClosestNode + 1 ENDIF IF iCurrentClosest != iClosestNode IF iCurrentClosest >= 0 AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vRoute[iCurrentClosest]) > 5*5 CLEAR_GPS_MULTI_ROUTE() //Build the route starting from the node calculated above. START_GPS_MULTI_ROUTE(HUD_COLOUR_OBJECTIVE_ROUTE) FOR i = iClosestNode TO COUNT_OF(vRoute) - 1 ADD_POINT_TO_GPS_MULTI_ROUTE(vRoute[i]) ENDFOR ADD_POINT_TO_GPS_MULTI_ROUTE(vRoute[COUNT_OF(vRoute) - 1]) SET_GPS_MULTI_ROUTE_RENDER(TRUE) PRINTLN("GPS DEBUG: Refreshing GPS route") ENDIF PRINTLN("GPS DEBUG: Updating GPS closest node") iCurrentClosest = iClosestNode ENDIF ENDPROC INT iShootCount = 0 INT iLastShootTime BOOL bRecentShot = FALSE BOOL bGoBackToPath = FALSE VECTOR vPlayerPathPoint FLOAT fPlayerBikePathProg FUNC BOOL HAS_PLAYER_SPOOKED_JIMMY_WITH_SHOOTING(BOOL ¶mShootCheck, INT ¶mShootCount, INT ¶mShootTime) IF DOES_ENTITY_EXIST(pedJimmy) IF NOT paramShootCheck //IF (IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN) AND IS_PED_SHOOTING(PLAYER_PED_ID()) AND IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), pedJimmy, <<30, 30, 30>>)) IF IS_PED_SHOOTING(PLAYER_PED_ID()) OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(pedJimmy), 10) paramShootCheck = TRUE ENDIF ELSE IF GET_GAME_TIMER() - paramShootTime > 200 paramShootCount++ #IF IS_DEBUG_BUILD PRINTLN(paramShootCount) #ENDIF paramShootTime = GET_GAME_TIMER() paramShootCheck = FALSE ENDIF ENDIF IF paramShootCount > 0 AND NOT paramShootCheck AND GET_GAME_TIMER() - paramShootTime > 1000 #IF IS_DEBUG_BUILD PRINTLN(paramShootCount) #ENDIF paramShootCount-- ENDIF WEAPON_TYPE playerwep GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), playerwep) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND GET_GAME_TIMER() - iLastMeleeShout > 7500 PRINTLN("Jimmy MELEE LINE!") PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedJimmy, "GENERIC_SHOCKED_MED", "Jimmy", SPEECH_PARAMS_FORCE) iLastMeleeShout = GET_GAME_TIMER() ENDIF IF paramShootCount > 5 OR IS_PROJECTILE_TYPE_IN_AREA(GET_ENTITY_COORDS(pedJimmy)+<<10,10,5>>, GET_ENTITY_COORDS(pedJimmy)-<<10,10,5>>, WEAPONTYPE_GRENADE) OR IS_PROJECTILE_TYPE_IN_AREA(GET_ENTITY_COORDS(pedJimmy)+<<10,10,5>>, GET_ENTITY_COORDS(pedJimmy)-<<10,10,5>>, WEAPONTYPE_GRENADELAUNCHER) OR IS_PROJECTILE_TYPE_IN_AREA(GET_ENTITY_COORDS(pedJimmy)+<<10,10,5>>, GET_ENTITY_COORDS(pedJimmy)-<<10,10,5>>, WEAPONTYPE_GRENADELAUNCHER_SMOKE) OR IS_PROJECTILE_TYPE_IN_AREA(GET_ENTITY_COORDS(pedJimmy)+<<10,10,5>>, GET_ENTITY_COORDS(pedJimmy)-<<10,10,5>>, WEAPONTYPE_RPG) OR IS_PROJECTILE_TYPE_IN_AREA(GET_ENTITY_COORDS(pedJimmy)+<<10,10,5>>, GET_ENTITY_COORDS(pedJimmy)-<<10,10,5>>, WEAPONTYPE_MOLOTOV) OR IS_PROJECTILE_TYPE_IN_AREA(GET_ENTITY_COORDS(pedJimmy)+<<10,10,5>>, GET_ENTITY_COORDS(pedJimmy)-<<10,10,5>>, WEAPONTYPE_BZGAS) OR IS_EXPLOSION_IN_AREA(EXP_TAG_STICKYBOMB, GET_ENTITY_COORDS(pedJimmy)+<<10,10,2>>, GET_ENTITY_COORDS(pedJimmy)-<<10,10,2>>) OR (IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(vehJimmyBike, playerwep)) PRINTLN("JIMMY SPOOK 4") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC BIKE_RIDE2() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.7) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) IF IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), CRUISER) OR IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), SCORCHER) OR IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), TRIBIKE) OR IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), TRIBIKE2) OR IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), TRIBIKE3) OR IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), BMX) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehPlayerBike) vehPlayerBike = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) INT iTemp REPEAT COUNT_OF(vehBikes) iTemp IF vehBikes[iTemp] = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) vehBikes[iTemp] = NULL ENDIF ENDREPEAT SET_ENTITY_AS_MISSION_ENTITY(vehPlayerBike) ENDIF ENDIF IF DOES_ENTITY_EXIST(vehPlayerCar) AND IS_VEHICLE_DRIVEABLE(vehPlayerCar) IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehPlayerCar)) > 1000 AND IS_ENTITY_OCCLUDED(vehPlayerCar) AND NOT IS_SPHERE_VISIBLE(v_car_stop, 5) IF VDIST2(v_car_stop, GET_ENTITY_COORDS(vehPlayerCar)) < 625 SET_MISSION_VEHICLE_GEN_VEHICLE(vehPlayerCar, v_car_stop + <<0,0,1>>, f_car_stop, VEHGEN_MISSION_VEH, FALSE) CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MISSION_VEH) ENDIF DELETE_VEHICLE(vehPlayerCar) ENDIF ENDIF IF NOT IS_PED_INJURED(pedJimmy) AND IS_VEHICLE_DRIVEABLE(vehJimmyBike) AND IS_VEHICLE_DRIVEABLE(vehPlayerBike) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1308.714600,-1310.135254,-22.620132>>, <<-1171.371948,-1261.148438,47.989761>>, 250.000000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1348.925171,-1155.041260,-20.531912>>, <<-1163.359619,-1143.442871,34.684460>>, 142.250000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1386.384766,-1054.306030,-16.121284>>, <<-1245.289429,-965.991455,32.391251>>, 142.250000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1462.164063,-972.099915,-20.403019>>, <<-1332.719849,-833.943481,45.988754>>, 227.250000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1178.163330,-1629.206299,1.873874>>, <<-1315.888306,-1365.294434,25.025532>>, 173.750000) SET_IGNORE_NO_GPS_FLAG(TRUE) ELSE SET_IGNORE_NO_GPS_FLAG(FALSE) ENDIF IF DOES_ENTITY_EXIST(vehPlayerBike) AND IS_VEHICLE_DRIVEABLE(vehPlayerBike) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_2_BIKE_RACE_JIMMY") START_AUDIO_SCENE("FAMILY_2_BIKE_RACE_JIMMY") ENDIF ENDIF SWITCH iStageProgress CASE 0 fPlayerDistanceFromTrack = 0 // bJimmyFinalMoveTask = FALSE SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(pedJimmy, KNOCKOFFVEHICLE_NEVER) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike) STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) ENDIF blipBuddy = CREATE_BLIP_FOR_VEHICLE(vehJimmyBike) SET_BLIP_NAME_FROM_TEXT_FILE(blipBuddy, "BLIP_280") TASK_LOOK_AT_ENTITY(pedJimmy, PLAYER_PED_ID(), -1) bPlayerDone = FALSE iCurrentConvStage = 0 bJimmyWon = FALSE bJimmyFinished = FALSE iJimmyBreatheTime = 0 iCurrentBikePathNode = COUNT_OF(vBikeGPSNodes) -1 iShootCount = 0 bGoBackToPath = FALSE vBikeGPSNodes[0] = <<-1266.2878, -1689.5608, 3.4691>> vBikeGPSNodes[1] = <<-1345.0573, -1263.8895, 3.8977>> vBikeGPSNodes[2] = <<-1564.5465, -928.2069, 12.0173>> vBikeGPSNodes[3] = vRaceFinish SET_PED_PATHS_IN_AREA(<<-1329.113037,-1325.827026,5.753020>> + <<13.250000,44.000000,2.500000>>, <<-1329.113037,-1325.827026,5.753020>> - <<13.250000,44.000000,2.500000>>, FALSE) SET_SCENARIO_PEDS_SPAWN_IN_SPHERE_AREA(<< -1361.5677, -1207.0526, 3.4492 >>, 10, 0) SET_SCENARIO_PEDS_SPAWN_IN_SPHERE_AREA(<< -1396.3402, -1059.0491, 3.2013 >>, 15, 0) SET_ENTITY_LOAD_COLLISION_FLAG(pedJimmy,TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedJimmy, TRUE) SET_ENTITY_LOAD_COLLISION_FLAG(vehJimmyBike, TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehJimmyBike, TRUE) BUILD_PATH_FOR_RECORDING(vBikeRoutePath, i_jimmy_bike_rec, s_jimmy_bike_rec) iStageProgress++ SET_PED_WALLA_DENSITY(0.5, 0.5) FADE_IN() //disable dispatch services ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE) ENABLE_DISPATCH_SERVICE(DT_POLICE_VEHICLE_REQUEST, FALSE) ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE) ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE) ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, FALSE) ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, FALSE) ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE) REQUEST_IPL("smboat") BREAK CASE 1 IF IS_PED_IN_VEHICLE(pedJimmy, vehJimmyBike) TASK_VEHICLE_DRIVE_TO_COORD(pedJimmy, vehJimmyBike, <<-1092.3923, -1708.0920, 3.2771>>, 7, DRIVINGSTYLE_NORMAL, CRUISER, DRIVINGMODE_AVOIDCARS | DF_StopForPeds, 3.0, 4.0) iStageProgress++ ELSE IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK TASK_ENTER_VEHICLE(pedJimmy, vehJimmyBike, DEFAULT_TIME_NEVER_WARP, VS_DRIVER, PEDMOVEBLENDRATIO_SPRINT) ENDIF ENDIF BREAK CASE 2 IF IS_ENTITY_AT_COORD(vehJimmyBike, <<-1092.3923, -1708.0920, 3.2771>>, <<4,4,4>>) CLEAR_PED_TASKS(pedJimmy) START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehJimmyBike, i_jimmy_bike_rec, s_jimmy_bike_rec, 15, DRIVINGMODE_AVOIDCARS | DF_SteerAroundPeds | DF_DontSteerAroundPlayerPed) iStageProgress++ ENDIF BREAK CASE 3 fPlayerBikePathProg = GET_TIME_POSITION_IN_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), i_jimmy_bike_rec, s_jimmy_bike_rec, vBikeRoutePath) vPlayerPathPoint = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(i_jimmy_bike_rec, fPlayerBikePathProg, s_jimmy_bike_rec) fPlayerDistanceFromTrack = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPlayerPathPoint) #IF IS_DEBUG_BUILD DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPlayerPathPoint, 0, 255, 0) DRAW_DEBUG_SPHERE(vPlayerPathPoint, 0.4, 0, 255, 0) DRAW_DEBUG_TEXT_ABOVE_COORDS(vPlayerPathPoint, GET_STRING_FROM_FLOAT(fPlayerBikePathProg), 2.0) #ENDIF IF bGoBackToPath IF fPlayerDistanceFromTrack < 75 REMOVE_BLIP(blipDest) bGoBackToPath = FALSE ENDIF IF NOT bGoBackPrinted PRINT_NOW("FM2_RIDEBK", DEFAULT_GOD_TEXT_TIME, 1) iTimeGoBackPrinted = GET_GAME_TIMER() bGoBackPrinted = TRUE ENDIF IF fPlayerDistanceFromTrack > 300 Mission_Failed("FM2_RACEFAIL") ENDIF ELSE IF (GET_GAME_TIMER() - iTimeGoBackPrinted) > 20000 bGoBackPrinted = FALSE ENDIF IF DOES_BLIP_EXIST(blipPlayerVeh) IF DOES_BLIP_EXIST(blipBuddy) REMOVE_BLIP(blipBuddy) ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehPlayerBike)) > 150*150 Mission_Failed("FM2_BIKLOST") ENDIF ELSE IF NOT bJimmyWon IF NOT DOES_BLIP_EXIST(blipBuddy) blipBuddy = CREATE_BLIP_FOR_VEHICLE(vehJimmyBike) SET_BLIP_NAME_FROM_TEXT_FILE(blipBuddy, "BLIP_280") ENDIF ENDIF ENDIF IF fPlayerDistanceFromTrack > 150 REMOVE_BLIP(blipDest) REMOVE_BLIP(blipBuddy) CLEAR_GPS_MULTI_ROUTE() iCurrentBikePathNode = COUNT_OF(vBikeGPSNodes) - 1 bGoBackToPath = TRUE ENDIF ENDIF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), pedJimmy, <<15,15,10>>) AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF (GET_GAME_TIMER() - iJimmyBreatheTime) > GET_RANDOM_INT_IN_RANGE(1200, 1400) PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedJimmy, "BREATHING", "JIMMY_NORMAL") #IF IS_DEBUG_BUILD PRINTLN("BREATHING") #ENDIF iJimmyBreatheTime = GET_GAME_TIMER() ENDIF ENDIF IF IS_EXPLOSION_IN_AREA(EXP_TAG_STICKYBOMB, GET_ENTITY_COORDS(pedJimmy) + <<3,3,3>>, GET_ENTITY_COORDS(pedJimmy) - <<3,3,3>>) OR IS_EXPLOSION_IN_AREA(EXP_TAG_GRENADE, GET_ENTITY_COORDS(pedJimmy) + <<3,3,3>>, GET_ENTITY_COORDS(pedJimmy) - <<3,3,3>>) OR IS_EXPLOSION_IN_AREA(EXP_TAG_GRENADELAUNCHER, GET_ENTITY_COORDS(pedJimmy) + <<3,3,3>>, GET_ENTITY_COORDS(pedJimmy) - <<3,3,3>>) OR IS_EXPLOSION_IN_AREA(EXP_TAG_ROCKET, GET_ENTITY_COORDS(pedJimmy) + <<3,3,3>>, GET_ENTITY_COORDS(pedJimmy) - <<3,3,3>>) OR IS_EXPLOSION_IN_AREA(EXP_TAG_CAR, GET_ENTITY_COORDS(pedJimmy) + <<3,3,3>>, GET_ENTITY_COORDS(pedJimmy) - <<3,3,3>>) OR IS_EXPLOSION_IN_AREA(EXP_TAG_BIKE, GET_ENTITY_COORDS(pedJimmy) + <<3,3,3>>, GET_ENTITY_COORDS(pedJimmy) - <<3,3,3>>) OR IS_EXPLOSION_IN_AREA(EXP_TAG_PROGRAMMABLEAR, GET_ENTITY_COORDS(pedJimmy) + <<3,3,3>>, GET_ENTITY_COORDS(pedJimmy) - <<3,3,3>>) SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(pedJimmy, KNOCKOFFVEHICLE_EASY) ENDIF IF bJimmyWon IF NOT b_cutscene_request PRINTLN("\n\n\n PLAYING JIMMY WINS CUTSCENE \n\n\n") REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("family_2_mcs_2", CS_SECTION_1 | CS_SECTION_3) bCutsceneComponentsSet = FALSE b_cutscene_request = TRUE ENDIF IF b_cutscene_request AND NOT bCutsceneComponentsSet PRINTLN("Jimmy has finished") IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() PRINTLN("SETTING components from player jimmy win") SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) bCutsceneComponentsSet = TRUE ENDIF ENDIF IF IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<-1811.905518,-1195.154175,11.767201>>, <<-1846.905518,-1237.279419,19.517199>>, 21.250000) OR IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<-1816.365234,-1234.039429,7.017199>>, <<-1859.196655,-1241.141235,22.870972>>, 57.750000) OR IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<-1856.623291,-1201.831787,7.017204>>, <<-1859.196655,-1241.141235,22.870972>>, 57.750000) IF bCutsceneComponentsSet REMOVE_BLIP(blipDest) REMOVE_BLIP(blipBuddy) REPLAY_RECORD_BACK_FOR_TIME(12.0, 5.0, REPLAY_IMPORTANCE_HIGHEST) GO_TO_STAGE(stage_telltale) ENDIF ENDIF ELSE KEEP_JIMMY_ON_REC_PATH() IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPlayerOnPierPosition) < 100*100 IF NOT b_cutscene_request REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("family_2_mcs_2", CS_SECTION_2 | CS_SECTION_3) b_cutscene_request = TRUE ELSE IF NOT bCutsceneComponentsSet AND CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() PRINTLN("SETTING components from player") SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) bCutsceneComponentsSet = TRUE ENDIF ENDIF ENDIF IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vRaceFinish, g_vAnyMeansLocate, TRUE) REMOVE_BLIP(blipDest) REMOVE_BLIP(blipBuddy) PRINTLN("\n\n\n PLAYING MIKE WINS CUTSCENE \n\n\n") iStageProgress++ ENDIF ENDIF ENDIF BREAK CASE 4 IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehPlayerBike, 30,1) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) TASK_LOOK_AT_COORD(PLAYER_PED_ID(), <<-1823.1949, -1213.5262, 12.1520>>, -1, SLF_DEFAULT, SLF_LOOKAT_HIGH) TASK_LEAVE_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) iStageProgress++ ENDIF BREAK CASE 5 IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) AND NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) SETTIMERA(0) iStageProgress++ ENDIF BREAK CASE 6 IF TIMERA() > 800 REPLAY_RECORD_BACK_FOR_TIME(12.0, 5.0, REPLAY_IMPORTANCE_HIGHEST) GO_TO_STAGE(stage_telltale) ENDIF BREAK ENDSWITCH IF NOT IS_PED_INJURED(pedJimmy) AND IS_VEHICLE_DRIVEABLE(vehJimmyBike) IF HAS_PLAYER_SPOOKED_JIMMY_WITH_SHOOTING(bRecentShot, iShootCount, iLastShootTime) Mission_Failed("FM2_JSPOOK") ENDIF IF NOT bJimmyFinished IF iStageProgress < 4 FLOAT distance_between_peds fPlayerProg = GET_TIME_POSITION_IN_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), i_jimmy_bike_rec, s_jimmy_bike_rec, vBikeRoutePath) fJimmyProg = GET_TIME_POSITION_IN_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(pedJimmy), i_jimmy_bike_rec, s_jimmy_bike_rec, vBikeRoutePath) distance_between_peds = fJimmyProg - fPlayerProg MANAGE_JIMMY_BIKE_CONV(distance_between_peds, fPlayerDistanceFromTrack, fPlayerProg > fJimmyProg) IF IS_ENTITY_AT_COORD(pedJimmy, vRaceFinish, g_vAnyMeansLocate, FALSE) SET_ENTITY_COLLISION(vehJimmyBike, TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedJimmy, TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehJimmyBike, TRUE) IF NOT bJimmyWon REMOVE_CUTSCENE() b_cutscene_request = FALSE bJimmyWon = TRUE ENDIF bJimmyFinished = TRUE ENDIF ELSE IF NOT bJimmyWon AND IS_ENTITY_IN_ANGLED_AREA(pedJimmy, <<-1806.987427,-1191.762207,-42.982376>>, <<-1854.439697,-1247.811401,30.481899>>, 90.000000) AND VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 36 REMOVE_BLIP(blipDest) REMOVE_BLIP(blipBuddy) GO_TO_STAGE(stage_telltale) ENDIF ENDIF ENDIF IF bJimmyFinished OR (iStageProgress >= 4 AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike)) IF IS_PED_IN_VEHICLE(pedJimmy, vehJimmyBike) IF NOT IS_ENTITY_OCCLUDED(pedJimmy) AND VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 50*50 IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike) STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) ENDIF ELSE STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) FREEZE_ENTITY_POSITION(vehJimmyBike, TRUE) ENDIF ENDIF ENDIF ENDIF IF iStageProgress < 4 AND iStageProgress > 0 IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) AND DOES_ENTITY_EXIST(vehPlayerBike) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerBike) IF NOT DOES_BLIP_EXIST(blipPlayerVeh) CLEAR_PRINTS() IF bBeenOnBike PRINT_GOD_TEXT(gtGetBackInBike) ENDIF blipPlayerVeh = CREATE_BLIP_FOR_VEHICLE(vehPlayerBike) ENDIF IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) iCurrentBikePathNode = COUNT_OF(vBikeGPSNodes) - 1 CLEAR_GPS_MULTI_ROUTE() ENDIF IF DOES_BLIP_EXIST(blipBuddy) REMOVE_BLIP(blipBuddy) ENDIF ELSE bBeenOnBike = TRUE IF bGoBackToPath IF NOT DOES_BLIP_EXIST(blipDest) FLOAT fBLipTime = CLAMP(fPlayerBikePathProg+ 10000.0, 20000.0, GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(i_jimmy_bike_rec, s_jimmy_bike_rec)) blipDest = CREATE_BLIP_FOR_COORD(GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(i_jimmy_bike_rec, fBLipTime, s_jimmy_bike_rec), TRUE) ELSE //VECTOR vCurrentBlipCoords = GET_BLIP_COORDS(blipDest) //SET_BLIP_COORDS(blipDest, vCurrentBlipCoords + (vPlayerPathPoint - vCurrentBlipCoords)/10.0) ENDIF ELSE IF NOT DOES_BLIP_EXIST(blipDest) CLEAR_PRINTS() blipDest = CREATE_BLIP_FOR_COORD(vRaceFinish, FALSE) ENDIF BUILD_CUSTOM_GPS_ROUTE(vBikeGPSNodes, iCurrentBikePathNode) ENDIF IF DOES_BLIP_EXIST(blipPlayerVeh) REMOVE_BLIP(blipPlayerVeh) ENDIF ENDIF ENDIF // BLIP_MANAGER(vehPlayerBike, vRaceFinish, TRUE, FALSE) ENDIF ENDIF BIKE_TUTORIAL() #IF IS_DEBUG_BUILD FLOAT fTempHeight = 0.06 DRAW_DEBUG_TEXT_2D("BIKE RIDE DEBUG", <<0.02, fTempHeight, 0>>) fTempHeight+= 0.02 DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iStageProgress), <<0.02, fTempHeight, 0>>) fTempHeight+= 0.02 #ENDIF ENDPROC //BOOL bSwimHelp[5] //INT iHelpTimes[5] //BOOL bHelpUsed[5] //BOOL bHelpCleared[5] STRING sSwimHelps[6] //BOOL bUnderwaterHelpCleared = FALSE //BOOL bSurfaceHelpCleared = FALSE INT iJimmyShoutStage = 0 INT iCurrentJimmyShoutAnim INT iLastAnimCheck STRING sJimmyShoutAnims[3] // //BOOL bDrownHelpNeeded = FALSE //BOOL bDrownHelpShown = FALSE BOOL bNearYachtPlayed = FALSE BOOL bLoadStreamDone = FALSE BOOL bMikeRun = FALSE INT iTimeOfGodText BOOL bPlayerSeaSharkLocked BOOL bSwimToYachtASCanStart ENUM FAM2_SWIM_HELP_STAGE SWIMHELP_SURFACE_SWIMMING = 0, SWIMHELP_SURFACE_DIVE, SWIMHELP_UNDERWATER_SWIMMING, SWIMHELP_UNDERWATER_MOVE, SWIMHELP_STATS, SWIMHELP_DROWN ENDENUM FAM2_SWIM_HELP_STAGE eSwimHelpStage FAM2_SWIM_HELP_STAGE ePreviousSwimHelpStage BOOL bCurrentHelpShown BOOL bCurrentHelpUsed BOOL bCurrentHelpCleared FLOAT fCurrentHelpPrintTime INT iSwimHelpBits FUNC BOOL PRINT_SWIM_HELP(STRING sHelpString, BOOL bForever = FALSE) IF IS_HELP_MESSAGE_BEING_DISPLAYED() AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(sHelpString) CLEAR_HELP() ELSE IF bForever PRINT_HELP_FOREVER(sHelpString) ELSE PRINT_HELP(sHelpString) ENDIF ENDIF IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(sHelpString) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_SWIM_HELP_BEING_USED(FAM2_SWIM_HELP_STAGE eSwimHelp) SWITCH eSwimHelp CASE SWIMHELP_UNDERWATER_SWIMMING CASE SWIMHELP_SURFACE_SWIMMING IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_SPRINT) AND GET_ENTITY_SPEED(PLAYER_PED_ID()) > 4 RETURN TRUE ENDIF BREAK CASE SWIMHELP_SURFACE_DIVE IF IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) RETURN TRUE ENDIF BREAK CASE SWIMHELP_UNDERWATER_MOVE IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_MOVE_LR) OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_MOVE_UD) RETURN TRUE ENDIF BREAK CASE SWIMHELP_DROWN IF NOT IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL IS_THIS_HELP_RELEVANT(FAM2_SWIM_HELP_STAGE eSwimHelp) IF IS_PED_SWIMMING(PLAYER_PED_ID()) IF IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) IF eSwimHelp = SWIMHELP_DROWN OR eSwimHelp = SWIMHELP_UNDERWATER_MOVE OR eSwimHelp = SWIMHELP_UNDERWATER_SWIMMING OR eSwimHelp = SWIMHELP_STATS RETURN TRUE ENDIF ELSE IF eSwimHelp = SWIMHELP_SURFACE_DIVE OR eSwimHelp = SWIMHELP_SURFACE_SWIMMING OR eSwimHelp = SWIMHELP_STATS RETURN TRUE ENDIF ENDIF ELSE RETURN FALSE ENDIF RETURN FALSE ENDFUNC PROC RUN_SWIM_HELP() ePreviousSwimHelpStage = eSwimHelpStage IF IS_PED_SWIMMING(PLAYER_PED_ID()) IF IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) IF NOT IS_BIT_SET(iSwimHelpBits, ENUM_TO_INT(SWIMHELP_DROWN)) AND GET_PLAYER_UNDERWATER_TIME_REMAINING(PLAYER_ID()) <= 5.0 IF eSwimHelpStage != SWIMHELP_DROWN eSwimHelpStage = SWIMHELP_DROWN ENDIF ELSE IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() IF NOT IS_BIT_SET(iSwimHelpBits, ENUM_TO_INT(SWIMHELP_UNDERWATER_SWIMMING)) IF eSwimHelpStage != SWIMHELP_UNDERWATER_SWIMMING eSwimHelpStage = SWIMHELP_UNDERWATER_SWIMMING ENDIF ELIF NOT IS_BIT_SET(iSwimHelpBits, ENUM_TO_INT(SWIMHELP_UNDERWATER_MOVE)) IF eSwimHelpStage != SWIMHELP_UNDERWATER_MOVE eSwimHelpStage = SWIMHELP_UNDERWATER_MOVE ENDIF ELIF NOT IS_BIT_SET(iSwimHelpBits, ENUM_TO_INT(SWIMHELP_STATS)) IF eSwimHelpStage != SWIMHELP_STATS eSwimHelpStage = SWIMHELP_STATS ENDIF ENDIF ENDIF ENDIF ELSE IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() IF NOT IS_BIT_SET(iSwimHelpBits, ENUM_TO_INT(SWIMHELP_SURFACE_SWIMMING)) IF eSwimHelpStage != SWIMHELP_SURFACE_SWIMMING eSwimHelpStage = SWIMHELP_SURFACE_SWIMMING ENDIF ELIF NOT IS_BIT_SET(iSwimHelpBits, ENUM_TO_INT(SWIMHELP_SURFACE_DIVE)) IF eSwimHelpStage != SWIMHELP_SURFACE_DIVE eSwimHelpStage = SWIMHELP_SURFACE_DIVE ENDIF ELIF NOT IS_BIT_SET(iSwimHelpBits, ENUM_TO_INT(SWIMHELP_STATS)) IF eSwimHelpStage != SWIMHELP_STATS eSwimHelpStage = SWIMHELP_STATS ENDIF ENDIF ENDIF ENDIF ENDIF IF eSwimHelpStage != ePreviousSwimHelpStage bCurrentHelpUsed = FALSE bCurrentHelpShown = FALSE bCurrentHelpCleared = FALSE fCurrentHelpPrintTime = 0.0 ENDIF IF NOT bCurrentHelpShown //Check for stages where first person mode shouldn't display help text IF eSwimHelpStage != SWIMHELP_SURFACE_DIVE AND eSwimHelpStage != SWIMHELP_UNDERWATER_SWIMMING AND eSwimHelpStage != SWIMHELP_UNDERWATER_MOVE IF PRINT_SWIM_HELP(sSwimHelps[eSwimHelpStage], FALSE) bCurrentHelpShown = TRUE ENDIF ELSE if GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) != CAM_VIEW_MODE_FIRST_PERSON //Third person print as normal IF PRINT_SWIM_HELP(sSwimHelps[eSwimHelpStage], FALSE) bCurrentHelpShown = TRUE ENDIF ELSE //First person skip over help text stage bCurrentHelpShown = TRUE ENDIF ENDIF ELSE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(sSwimHelps[eSwimHelpStage]) fCurrentHelpPrintTime += GET_FRAME_TIME() IF fCurrentHelpPrintTime > 2.0 OR NOT IS_THIS_HELP_RELEVANT(eSwimHelpStage) IF NOT IS_BIT_SET(iSwimHelpBits, ENUM_TO_INT(eSwimHelpStage)) SET_BIT(iSwimHelpBits, ENUM_TO_INT(eSwimHelpStage)) ENDIF IF NOT bCurrentHelpUsed AND IS_THIS_HELP_RELEVANT(eSwimHelpStage) IF IS_SWIM_HELP_BEING_USED(eSwimHelpStage) bCurrentHelpUsed = TRUE ENDIF ELSE IF NOT bCurrentHelpCleared CLEAR_HELP(FALSE) bCurrentHelpCleared = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC INT iTurtleStage PED_INDEX piTurtle PROC UPDATE_TURTLE() VECTOR vPlayerCoords PRINTLN("iTurtleStage:", iTurtleStage) SWITCH iTurtleStage CASE 0 REQUEST_MODEL(A_C_STINGRAY) iTurtleStage++ BREAK CASE 1 IF HAS_MODEL_LOADED(A_C_STINGRAY) iTurtleStage++ ENDIF BREAK CASE 2 vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF vPlayerCoords.z < 1.0 piTurtle = CREATE_PED(PEDTYPE_MISSION, A_C_STINGRAY, <<-1885.4974, -1189.8828, -8.2945>>, -136.1128) TASK_GO_STRAIGHT_TO_COORD(piTurtle, GET_ENTITY_COORDS(PLAYER_PED_ID()), PEDMOVE_WALK) iTurtleStage++ ENDIF BREAK CASE 3 IF GET_DISTANCE_BETWEEN_ENTITIES(piTurtle, PLAYER_PED_ID()) > 20.0 OR GET_SCRIPT_TASK_STATUS(piTurtle, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) = FINISHED_TASK SET_MODEL_AS_NO_LONGER_NEEDED(A_C_STINGRAY) SET_PED_AS_NO_LONGER_NEEDED(piTurtle) iTurtleStage++ ENDIF BREAK ENDSWITCH ENDPROC PROC GO_TO_YACHT() UPDATE_TURTLE() IF (DOES_ENTITY_EXIST(vehPlayerSeashark) AND NOT IS_VEHICLE_DRIVEABLE(vehPlayerSeashark)) OR (DOES_ENTITY_EXIST(vehChasers[0]) AND NOT IS_VEHICLE_DRIVEABLE(vehChasers[0])) OR (DOES_ENTITY_EXIST(vehChasers[1]) AND NOT IS_VEHICLE_DRIVEABLE(vehChasers[1])) Mission_Failed("FM2_TSPOOK") ENDIF IF NOT DOES_ENTITY_EXIST(objMP3Dock) CREATE_MP3_DOCK() ENDIF INT j REPEAT COUNT_OF(vehChasers) j IF NOT DOES_ENTITY_EXIST(vehChasers[j]) CREATE_CHASER(j, TRUE) ENDIF ENDREPEAT BOOL bPartyStarted = FALSE REPEAT COUNT_OF(pedBoatDancer) j IF DOES_ENTITY_EXIST(pedBoatDancer[j]) IF IS_PED_INJURED(pedBoatDancer[j]) OR IS_ENTITY_DEAD(pedBoatDancer[j]) Mission_Failed("FM2_TSPOOK") ENDIF bPartyStarted = TRUE ENDIF ENDREPEAT IF bPartyStarted IF IS_BULLET_IN_AREA(<< -2033.821, -1031.864, 4.890 >>, 5) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_ROCKET, << -2033.821, -1031.864, 4.890 >>, 10) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_GRENADE, << -2033.821, -1031.864, 4.890 >>, 10) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_GRENADELAUNCHER, << -2033.821, -1031.864, 4.890 >>, 10) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_SMOKE_GRENADE, << -2033.821, -1031.864, 4.890 >>, 10) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_SMOKE_GRENADE_LAUNCHER, << -2033.821, -1031.864, 4.890 >>, 10) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_MOLOTOV, << -2033.821, -1031.864, 4.890 >>, 10) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_BOAT, << -2033.821, -1031.864, 4.890 >>, 10) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_STICKYBOMB, << -2033.821, -1031.864, 4.890 >>, 10) OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(<< -2033.821, -1031.864, 4.890 >>, WEAPONTYPE_SMOKEGRENADE, 5, TRUE) OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(<< -2033.821, -1031.864, 4.890 >>, WEAPONTYPE_RPG, 5, TRUE) OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(<< -2033.821, -1031.864, 4.890 >>, WEAPONTYPE_GRENADE, 5, TRUE) OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(<< -2033.821, -1031.864, 4.890 >>, WEAPONTYPE_GRENADELAUNCHER, 5, TRUE) OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(<< -2033.821, -1031.864, 4.890 >>, WEAPONTYPE_GRENADELAUNCHER_SMOKE, 5, TRUE) OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(<< -2033.821, -1031.864, 4.890 >>, WEAPONTYPE_SMOKEGRENADE, 5, TRUE) OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(<< -2033.821, -1031.864, 4.890 >>, WEAPONTYPE_BZGAS, 5, TRUE) OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(<< -2033.821, -1031.864, 4.890 >>, WEAPONTYPE_MOLOTOV, 5, TRUE) OR (IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), << -2033.821, -1031.864, 4.890 >> - <<30,30,30>>, << -2033.821, -1031.864, 4.890 >> + <<30,30,30>>, FALSE) AND NOT IS_PED_CURRENT_WEAPON_SILENCED(PLAYER_PED_ID())) Mission_Failed("FM2_TSPOOK") ENDIF ENDIF IF NOT DOES_BLIP_EXIST(blipDest) blipDest = CREATE_BLIP_FOR_COORD(<< -2034.37, -1032.23, 4.88 >>) SET_BLIP_COLOUR(blipDest, BLIP_COLOUR_BLUE) SET_BLIP_SCALE(blipDest, BLIP_SIZE_VEHICLE) SET_BLIP_NAME_FROM_TEXT_FILE(blipDest, "FM2_YACHTL") ENDIF SWITCH iStageProgress CASE 0 IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_DIVOFF") PRINT_HELP("FM2_DIVOFF") ENDIF REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_STOP", CONV_PRIORITY_HIGH) INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FAM2_FAST_SWIM) PRE_INIT_ASSETS(stage_rescue) SETTIMERA(0) // PC swimming help. This isn't ideal to switch it here, as it won't switch if the player // changes control during the swimming section, but it would be too problematic to // incorporate a special case into this custom help code. Steve R LDS. IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL) sSwimHelps[SWIMHELP_UNDERWATER_SWIMMING ] = "FM2_USWIM1_KM" sSwimHelps[SWIMHELP_SURFACE_SWIMMING ] = "FM2_SWIM_KM" ELSE //First person mode if GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON sSwimHelps[SWIMHELP_UNDERWATER_SWIMMING ] = "FM2_SWIM_FP" sSwimHelps[SWIMHELP_SURFACE_SWIMMING ] = "FM2_SWIM_FP" ELSE //Third person sSwimHelps[SWIMHELP_UNDERWATER_SWIMMING ] = "FM2_USWIM1" sSwimHelps[SWIMHELP_SURFACE_SWIMMING ] = "FM2_SWIM" ENDIF ENDIF sSwimHelps[SWIMHELP_UNDERWATER_MOVE ] = "FM2_USWIM2" sSwimHelps[SWIMHELP_SURFACE_DIVE ] = "FM2_DIVE" sSwimHelps[SWIMHELP_STATS ] = "FM2_STAT1" sSwimHelps[SWIMHELP_DROWN ] = "FM2_DROWN" sJimmyShoutAnims[0] = "shouting_jimmy_idle_a" sJimmyShoutAnims[1] = "shouting_jimmy_idle_b" sJimmyShoutAnims[2] = "shouting_jimmy_idle_c" bNearYachtPlayed = FALSE iStageProgress++ iLastJimmyShout = -1 iTimeOfGodText = -1 iJimmyShoutStage = -1 bLoadStreamDone = FALSE bSwimToYachtASCanStart = FALSE bPlayerSeaSharkLocked = FALSE b_cutscene_request = FALSE REQUEST_ANIM_DICT("missfam2ig_3") SET_WANTED_LEVEL_MULTIPLIER(0.1) IF bReplaySetupRequired iStageProgress = -1 ENDIF bMikeRun = TRUE BREAK CASE -1 REQUEST_IPL("smboat") WHILE NOT IS_IPL_ACTIVE("smBoat") WAIT(0) ENDWHILE IF IS_SCREEN_FADED_OUT() PRINTLN("FAMILY 2 CUT EXIT - RUN B") FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_SPRINT, FALSE) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_SPRINT, iRunTime) ENDIF iStageProgress = 1 bReplaySetupRequired = FALSE BREAK CASE 1 IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(500) ENDIF IF bMikeRun SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_SPRINT) IF TIMERA() < 1000 OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-1871.083374,-1203.116089,13.016579>>, <<2.500000,2.500000,3.000000>>) bMikeRun = FALSE ENDIF ENDIF IF iTimeOfGodText = -1 AND (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) PRINT("FM2_YACHT", DEFAULT_GOD_TEXT_TIME, 1) iTimeOfGodText = GET_GAME_TIMER() ENDIF FLOAT fDistToJimmy fDistToJimmy = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedJimmy)) IF HAS_ANIM_DICT_LOADED("missfam2ig_3") IF VDIST(GET_ENTITY_COORDS(pedJimmy), <<-1859.2643, -1216.7756, 13.0174>>) > 3 IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> PERFORMING_TASK CLEAR_PED_TASKS(pedJimmy) iJimmyShoutStage = 0 TASK_FOLLOW_NAV_MESH_TO_COORD(pedJimmy, <<-1859.2643, -1216.7756, 13.0174>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS) ENDIF ELSE IF fDistToJimmy < 30*30 IF NOT IS_PED_FACING_PED(pedJimmy, PLAYER_PED_ID(), 10) IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> PERFORMING_TASK AND IS_ENTITY_PLAYING_ANIM(pedJimmy, "missfam2ig_3", "shouting_jimmy_base") CLEAR_PED_TASKS(pedJimmy) TASK_TURN_PED_TO_FACE_ENTITY(pedJimmy, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(pedJimmy, PLAYER_PED_ID(), -1) iJimmyShoutStage = 0 ENDIF ELSE SWITCH iJimmyShoutStage CASE -1 REQUEST_ANIM_DICT("missfam2ig_3") IF HAS_ANIM_DICT_LOADED("missfam2ig_3") iJimmyShoutStage = 0 ENDIF BREAK CASE 0 IF GET_GAME_TIMER() - iLastAnimCheck > 1000 IF NOT IS_ENTITY_PLAYING_ANIM(pedJimmy, "missfam2ig_3", "shouting_jimmy_base") TASK_PLAY_ANIM(pedJimmy, "missfam2ig_3", "shouting_jimmy_base", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_SECONDARY | AF_UPPERBODY) ELSE iJimmyShoutStage++ ENDIF iLastAnimCheck = GET_GAME_TIMER() ENDIF BREAK CASE 1 IF ((GET_GAME_TIMER() - iTimeOfGodText)> 5000 OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND fDistToJimmy < 30*30 AND (iLastJimmyShout = -1 OR (GET_GAME_TIMER() - iLastJimmyShout) > 10000) CLEAR_PED_TASKS(pedJimmy) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_STOP", CONV_PRIORITY_HIGH) TASK_PLAY_ANIM(pedJimmy, "missfam2ig_3", sJimmyShoutAnims[iCurrentJimmyShoutAnim], SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY) iLastJimmyShout = GET_GAME_TIMER() iJimmyShoutStage++ ENDIF ENDIF BREAK CASE 2 IF GET_GAME_TIMER() - iLastJimmyShout > 1000 IF NOT IS_ENTITY_PLAYING_ANIM(pedJimmy, "missfam2ig_3", sJimmyShoutAnims[iCurrentJimmyShoutAnim]) CLEAR_PED_TASKS(pedJimmy) iCurrentJimmyShoutAnim++ IF iCurrentJimmyShoutAnim >= COUNT_OF(sJimmyShoutAnims) iCurrentJimmyShoutAnim = 0 ENDIF iJimmyShoutStage = 0 ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDIF ENDIF IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_2_DIVE_INTO_WATER") IF IS_PED_DIVING(PLAYER_PED_ID()) START_AUDIO_SCENE("FAMILY_2_DIVE_INTO_WATER") ENDIF ENDIF IF IS_ENTITY_IN_WATER(PLAYER_PED_ID()) OR VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_back_of_the_boat) < 100 VECTOR vTemp vTemp = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF vTemp.z < 2 IF DOES_ENTITY_EXIST(pedJimmy) SET_PED_AS_NO_LONGER_NEEDED(pedJimmy) ENDIF IF DOES_ENTITY_EXIST(vehPlayerBike) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehPlayerBike) ENDIF IF DOES_ENTITY_EXIST(vehJimmyBike) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehJimmyBike) ENDIF ENDIF IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_DIVE_INTO_WATER") STOP_AUDIO_SCENE("FAMILY_2_DIVE_INTO_WATER") ENDIF iStageProgress++ SETTIMERA(0) IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_DIVOFF") CLEAR_HELP(FALSE) ENDIF REMOVE_ANIM_DICT("missfam2ig_3") TRIGGER_MUSIC_EVENT("FAM2_SPLASH") ENDIF BREAK CASE 2 IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_DIVOFF") AND TIMERA() > 3000 SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", TRUE) REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) iStageProgress++ ENDIF BREAK CASE 3 IF NOT bLoadStreamDone IF LOAD_STREAM("FAM2_BOAT_PARTY_MASTER") PRINTLN("FAM2_BOAT_PARTY_MASTER loaded") PLAY_STREAM_FROM_POSITION(<<-2032.5988, -1032.6392, 4.8831>>) bLoadStreamDone = TRUE ELSE PRINTLN("FAM2_BOAT_PARTY_MASTER loading") ENDIF ENDIF RUN_SWIM_HELP() IF IS_PED_SWIMMING(PLAYER_PED_ID()) IF IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) IF NOT bSwimToYachtASCanStart bSwimToYachtASCanStart = TRUE ENDIF ELSE IF bSwimToYachtASCanStart IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_2_SWIM_TO_YACHT") START_AUDIO_SCENE("FAMILY_2_SWIM_TO_YACHT") ENDIF ENDIF ENDIF ENDIF IF (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-2033.124146,-1042.981323,0>>, <<-2028.862915,-1028.328369,8.974350>>, 18.250000) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-2017.999146,-1035.053223,5.946373>>, <<-2023.154419,-1033.718994,1.287564>>, 3.250000)) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_ENTITY_IN_WATER(PLAYER_PED_ID()) STOP_STREAM() IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_SWIM_TO_YACHT") STOP_AUDIO_SCENE("FAMILY_2_SWIM_TO_YACHT") ENDIF REPLAY_RECORD_BACK_FOR_TIME(5.0, 4.0, REPLAY_IMPORTANCE_HIGH) GO_TO_STAGE(stage_rescue) ENDIF IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-2030.859985,-1035.416504,7.882243>>, <<-2006.246582,-1043.832275,-1.481001>>, 21.250000) PRINTLN("TRIGGERING NEAR BOAT IN VEHICLE") TRIGGER_MUSIC_EVENT("FAM2_NEAR_YACHT") bNearYachtPlayed = TRUE iStageProgress++ ENDIF IF NOT bNearYachtPlayed IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-2017.1554, -1040.2144, 1.4499>>) < 20*20 AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) PRINTLN("TRIGGERING NEAR BOAT") TRIGGER_MUSIC_EVENT("FAM2_NEAR_YACHT") bNearYachtPlayed = TRUE //PRINT_HELP("FM2_LADDERS") ENDIF ENDIF BREAK CASE 4 IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE) STOP_STREAM() IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_SWIM_TO_YACHT") STOP_AUDIO_SCENE("FAMILY_2_SWIM_TO_YACHT") ENDIF REPLAY_RECORD_BACK_FOR_TIME(0.0, 8.0, REPLAY_IMPORTANCE_HIGH) GO_TO_STAGE(stage_rescue) ENDIF ENDIF BREAK ENDSWITCH IF HAS_PLAYER_SPOOKED_JIMMY_WITH_SHOOTING(bRecentShot, iShootCount, iLastShootTime) Mission_Failed("FM2_JSPOOK") ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 IF DOES_ENTITY_EXIST(pedJimmy) AND VDIST(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 30 Mission_Failed("FM2_JSPOOK") ELSE LOSE_THE_COPS() ENDIF ENDIF IF NOT bPlayerSeaSharkLocked IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_VEHICLE_DOORS_LOCKED(vehPlayerSeashark, VEHICLELOCK_LOCKOUT_PLAYER_ONLY) bPlayerSeaSharkLocked = TRUE ENDIF ENDIF IF IS_ENTITY_IN_WATER(PLAYER_PED_ID()) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) ENDIF IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_back_of_the_boat)>500*500 Mission_Failed("FM2_TRAAB") ENDIF //quick check to see if the player has pushed jimmy off the pier IF NOT IS_PED_INJURED(pedJimmy) VECTOR vTempCoord = GET_ENTITY_COORDS(pedJimmy) FLOAT fTempZ = vTempCoord.z IF fTempZ < 10 Mission_Failed("FM2_JIMHIT") ENDIF ENDIF ENDPROC PROC DO_GET_BACK_ON_REMINDER() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND GET_GAME_TIMER() - iTimeGetBackOnPrinted > 5000 IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND NOT IS_PED_INJURED(pedTracy) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) AND IS_ENTITY_IN_WATER(vehPlayerSeashark) AND GET_VEHICLE_PED_IS_ENTERING(PLAYER_PED_ID()) != vehPlayerSeashark AND VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedTracy)) < 35 AND NOT IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) AND gtGetBackInSeashark.played IF (GET_GAME_TIMER() - iTimeOfLastMichaelLine) > 6000 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_GETOFF", CONV_PRIORITY_HIGH) PRINTLN("GET BACK ON REMINDER FIRED") iTimeOfLastMichaelLine = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDPROC INT iConvStage = 0 FLOAT fWhineTime = 0 PROC DRIVE_BACK() BOOL bCanTalk BOOL bDone SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) IF NOT IS_PED_INJURED(pedTracy) // IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 // MISSION_FAILED("FM2_TSPOOK") // ENDIF IF VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_back_of_the_boat) < 10 DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) ENDIF IF iStageProgress < 100 IF IS_SEASHARK_GROUNDED(vehPlayerSeashark, fPlayerGroundTime, bPlayerGroundingChecked) OR NOT IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) iStageProgress = 100 ENDIF ENDIF IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_2_JETSKI_GO_TO_BEACH") START_AUDIO_SCENE("FAMILY_2_JETSKI_GO_TO_BEACH") ENDIF SWITCH iStageProgress CASE 0 IF /*NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND*/ (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(500) ENDIF //IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_TALK1", CONV_PRIORITY_HIGH) IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_2_JETSKI_GO_TO_BEACH") START_AUDIO_SCENE("FAMILY_2_JETSKI_GO_TO_BEACH") ENDIF gtGetBackInSeashark.played = FALSE // IF DOES_ENTITY_EXIST(pedJimmy) // PRINTLN("Jimmy exists, deleting Jimmy") // DELETE_PED(pedJimmy) // ELSE // PRINTLN("Jimmy does not exist in stage 0") // ENDIF iConvStage = 0 fWhineTime = 0 iJimmyWalkStage = 0 b_cutscene_request = FALSE iStageProgress++ //ENDIF IF bReplaySetupRequired iStageProgress = -1 ENDIF ENDIF BREAK CASE -1 REQUEST_IPL("smboat") WHILE NOT IS_IPL_ACTIVE("smBoat") REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_DaddysLittleGirl") WAIT(0) ENDWHILE iStageProgress = 1 BREAK CASE 1 BLIP_MANAGER_FOR_COORD(vehPlayerSeashark, blipPlayerVeh, vFinalDest, blipDest, gtGetBackInSeashark) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST) TASK_CLEAR_LOOK_AT(pedTracy) SET_ENTITY_PROOFS(vehPlayerSeashark, FALSE, FALSE,FALSE,FALSE,FALSE) SET_WANTED_LEVEL_MULTIPLIER(0.2) IF NOT bReplaySetupRequired PRINT_NOW("FM2_DRIVE", 5000, 1) ENDIF SETTIMERA(0) IF bReplaySetupRequired iStageProgress = -2 ELSE iStageProgress++ ENDIF ENDIF BREAK CASE -2 BLIP_MANAGER_FOR_COORD(vehPlayerSeashark, blipPlayerVeh, vFinalDest, blipDest, gtGetBackInSeashark) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_TALK1", CONV_PRIORITY_HIGH) bReplaySetupRequired = FALSE iStageProgress = -3 ENDIF BREAK CASE -3 BLIP_MANAGER_FOR_COORD(vehPlayerSeashark, blipPlayerVeh, vFinalDest, blipDest, gtGetBackInSeashark) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() SETTIMERA(0) PRINT_NOW("FM2_DRIVE", 5000, 1) iStageProgress = 2 ENDIF BREAK CASE 2 IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) PRINTLN("Timer A ", TIMERA()) IF TIMERA() > 5000 OR (TIMERA() > 2000 AND GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT IS_PED_HEADTRACKING_PED(pedTracy, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(pedTracy, PLAYER_PED_ID(), -1, SLF_WIDEST_YAW_LIMIT) ENDIF iTimeOfLastMichaelLine = GET_GAME_TIMER() bTraceySpotsJimmy = FALSE bMikeCompAcquired = FALSE in_car_conv_started = FALSE in_car_conv_on_hold = FALSE iStageProgress++ ENDIF ENDIF BLIP_MANAGER_FOR_COORD(vehPlayerSeashark, blipPlayerVeh, vFinalDest, blipDest, gtGetBackInSeashark) ENDIF BREAK CASE 3 bCanTalk = IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) SWITCH iConvStage CASE 0 IF NOT bKilledOne AND NOT bKilledBoth IF IS_REPLAY_IN_PROGRESS() MANAGE_CONVERSATION("FAM2_TALK2", bCanTalk) ELSE MANAGE_CONVERSATION("FAM2_TALK2b", bCanTalk) ENDIF ELSE MANAGE_CONVERSATION("FAM2_KILTALK", bCanTalk) ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND NOT in_car_conv_on_hold in_car_conv_started = FALSE in_car_conv_on_hold = FALSE TASK_CLEAR_LOOK_AT(pedTracy) iConvStage++ ENDIF BREAK CASE 1 IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_jimmy_end_pos) > 100*100 IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND GET_ENTITY_SPEED(vehPlayerSeashark) < 5// OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_jimmy_end_pos) > 400*400) fWhineTime += GET_FRAME_TIME() ELSE IF fWhineTime > 0 fWhineTime -= GET_FRAME_TIME()*5 ENDIF ENDIF ENDIF IF fWhineTime > 10.0 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_GOBACK", CONV_PRIORITY_HIGH) fWhineTime = 0 ENDIF ENDIF IF NOT bKilledOne AND NOT bKilledBoth //MANAGE_CONVERSATION(dhSeashark.label, bCanTalk) ENDIF BREAK ENDSWITCH DO_GET_BACK_ON_REMINDER() IF NOT IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) IF GET_SCRIPT_TASK_STATUS(pedTracy, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK TASK_ENTER_VEHICLE(pedTracy, vehPlayerSeashark, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT) ENDIF ENDIF IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) IF NOT IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) IF NOT DOES_BLIP_EXIST(blipBuddy) CLEAR_PRINTS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF NOT bGoBackToTracyPrinted PRINT("FM2_WAIT2", DEFAULT_GOD_TEXT_TIME, 1) bGoBackToTracyPrinted = TRUE ENDIF blipBuddy = CREATE_BLIP_FOR_PED(pedTracy) ENDIF IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) ENDIF ELSE IF DOES_BLIP_EXIST(blipBuddy) REMOVE_BLIP(blipBuddy) ENDIF ENDIF IF IS_SEASHARK_GROUNDED(vehPlayerSeashark, fPlayerGroundTime, bPlayerGroundingChecked) IF VDIST(GET_ENTITY_COORDS(vehPlayerSeashark), vFinalDest) < 50 bDone = TRUE ENDIF ENDIF IF (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vBeachPos1, vBeachPos2, fBeachWidth) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vFinalDest+<<0,0,0.3>>, <<1,1,2.5>>, TRUE)) AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) bDone = TRUE ENDIF IF bDone //SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) REMOVE_BLIP(blipDest) bPlayFullFinalCut = TRUE iStageProgress++ ENDIF ENDIF IF NOT bDone IF IS_SEASHARK_GROUNDED(vehPlayerSeashark, fPlayerGroundTime, bPlayerGroundingChecked) OR NOT IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) iStageProgress = 100 ELSE IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_jimmy_end_pos) < 10000 IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) IF GET_ENTITY_HEIGHT_ABOVE_GROUND(pedTracy) < 2.0 iStageProgress = 100 ENDIF ENDIF ENDIF ENDIF ENDIF IF iStageProgress < 100 BLIP_MANAGER_FOR_COORD(vehPlayerSeashark, blipPlayerVeh, vFinalDest, blipDest, gtGetBackInSeashark) ENDIF BREAK CASE 4 PRINTLN("BRINGING SEASHARK TO HALT") KILL_FACE_TO_FACE_CONVERSATION() IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehPlayerSeashark, 5, 1) OR NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) KILL_FACE_TO_FACE_CONVERSATION() PRINTLN("SEASHARK HALTED") SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) iStageProgress++ ENDIF BREAK CASE 5 PRINTLN("WAITING ON CONV STATUS TO BE FREE") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() REPLAY_RECORD_BACK_FOR_TIME(4.0, 3.0, REPLAY_IMPORTANCE_HIGHEST) GO_TO_STAGE(stage_finish) ENDIF BREAK //a little transition to on foot CASE 100 IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_jimmy_end_pos) < POW(100,2) IF NOT IS_PED_INJURED(pedJimmy) CLEAR_HELP() sConvResumeLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() in_car_conv_on_hold = TRUE REMOVE_BLIP(blipDest) sFinalCut = "family_2_mcs_4p2" PRINTLN("@@@@@@@@@@ CUTSCENE sFinalCut = family_2_mcs_4p2 @@@@@@@@@@@") b_cutscene_request = FALSE bMikeCompAcquired = FALSE REMOVE_CUTSCENE() REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("family_2_mcs_4", CS_SECTION_2) PRINTLN("@@@@@@@@@@ CUTSCENE REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(family_2_mcs_4, CS_SECTION_2) @@@@@@@@@@@") SETTIMERA(0) IF DOES_BLIP_EXIST(blipPlayerVeh) REMOVE_BLIP(blipPlayerVeh) ENDIF blipDest = CREATE_BLIP_FOR_PED(pedJimmy) PRINT_NOW("FM2_ONFOOT", DEFAULT_GOD_TEXT_TIME, 1) IF NOT IS_PED_GROUP_MEMBER(pedTracy, GET_PLAYER_GROUP(PLAYER_ID())) SET_PED_AS_GROUP_MEMBER(pedTracy, GET_PLAYER_GROUP(PLAYER_ID())) SET_PED_GROUP_MEMBER_PASSENGER_INDEX(pedTracy, VS_FRONT_RIGHT) ENDIF bGoBackToTracyPrinted = FALSE iStageProgress++ ENDIF ELSE IF IS_ENTITY_DEAD(vehPlayerSeashark) Mission_Failed("FM2_SKIDED") ELSE Mission_Failed("FM2_SKIGRN") ENDIF ENDIF BREAK CASE 101 IF NOT IS_PED_INJURED(pedJimmy) IF IS_PED_GROUPED(pedTracy) IF NOT DOES_BLIP_EXIST(blipDest) blipDest = CREATE_BLIP_FOR_PED(pedJimmy) ENDIF IF DOES_BLIP_EXIST(blipBuddy) REMOVE_BLIP(blipBuddy) ENDIF IF VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedJimmy)) < 30 SETTIMERA(0) iStageProgress++ ENDIF ELSE IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) ENDIF IF NOT DOES_BLIP_EXIST(blipBuddy) IF NOT bGoBackToTracyPrinted PRINT("FM2_TRAGB", DEFAULT_GOD_TEXT_TIME, 1) ENDIF blipBuddy = CREATE_BLIP_FOR_PED(pedTracy) ENDIF ENDIF ENDIF IF NOT bKilledOne AND NOT bKilledBoth bCanTalk = FALSE IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF NOT IS_PED_IN_ANY_VEHICLE(pedTracy) AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedTracy)) < 20*20 bCanTalk = TRUE ENDIF ELSE IF IS_PED_IN_ANY_VEHICLE(pedTracy) AND GET_VEHICLE_PED_IS_IN(pedTracy) = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) bCanTalk = TRUE ENDIF ENDIF // MANAGE_CONVERSATION(dhSeashark.label, bCanTalk) ENDIF BREAK CASE 102 IF TIMERA() > 1000 bPlayFullFinalCut = FALSE iStageProgress++ ENDIF BREAK CASE 103 KILL_FACE_TO_FACE_CONVERSATION() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() GO_TO_STAGE(stage_finish) ENDIF BREAK ENDSWITCH IF iStageProgress > 0 PRE_INIT_ASSETS(stage_finish) ENDIF PRE_STREAM_CUTSCENE_AT_DISTANCE(sFinalCut, v_jimmy_end_pos, DEFAULT_CUTSCENE_LOAD_DIST, b_cutscene_request) PRINTLN("@@@@@@@@@@ CUTSCENE PRE_STREAM_CUTSCENE_AT_DISTANCE @@@@@@@@@@@") IF b_cutscene_request IF NOT bMikeCompAcquired IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) PRINTLN("@@@@@@@@@@ CUTSCENE SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(Tracy, pedTracy) @@@@@@@@@@@") SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Tracy", pedTracy) SET_CUTSCENE_PED_PROP_VARIATION("Tracy", ANCHOR_EYES, 1, 0) SET_CUTSCENE_PED_PROP_VARIATION("Tracy", ANCHOR_HEAD, 0, 0) bMikeCompAcquired = TRUE ENDIF ENDIF ENDIF IF IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID()) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND GET_GAME_TIMER() - iLastMeleeShout > 7500 PRINTLN("TRACEY MELEE LINE!") PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedTracy, "GENERIC_SHOCKED_MED", "Tracey", SPEECH_PARAMS_FORCE) iLastMeleeShout = GET_GAME_TIMER() ENDIF ENDIF IF NOT IS_PED_INJURED(pedJimmy) IF NOT bTraceySpotsJimmy IF NOT IS_PED_INJURED(pedTracy) IF VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID()))<75*75 AND VDIST2(GET_ENTITY_COORDS(pedTracy), GET_ENTITY_COORDS(PLAYER_PED_ID()))<15*15 KILL_FACE_TO_FACE_CONVERSATION() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_SEES", CONV_PRIORITY_HIGH) bTraceySpotsJimmy = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF SWITCH iJimmyWalkStage CASE 0 IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_jimmy_end_pos) < 90000 IF NOT IS_SPHERE_VISIBLE(v_jimmy_end_pos, 5) CLEAR_AREA(v_jimmy_end_pos, 4, TRUE) IF NOT DOES_ENTITY_EXIST(pedJimmy) CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, v_jimmy_end_pos, f_jimmy_end_heading) ENDIF iJimmyWalkStage = 2 ELSE IF NOT DOES_ENTITY_EXIST(pedJimmy) CREATE_BUDDY_ON_FOOT(pedJimmy, CHAR_JIMMY, <<-1611.5950, -1121.0092, 1.5440>>, 42.8275)//<<-1609.8441, -1123.1035, 1.3758>>, 42.8275) ENDIF iJimmyWalkStage++ ENDIF ENDIF BREAK CASE 1 IF NOT IS_PED_INJURED(pedJimmy) PRINTLN("Jimmy tasked to coords") SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedJimmy, TRUE) TASK_FOLLOW_NAV_MESH_TO_COORD(pedJimmy, v_jimmy_end_pos, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, f_jimmy_end_heading) iJimmyWalkStage ++ ENDIF BREAK CASE 2 IF NOT IS_PED_INJURED(pedJimmy) AND IS_ENTITY_AT_COORD(pedJimmy, v_jimmy_end_pos, g_vOnFootLocate) IF VDIST2(GET_ENTITY_COORDS(pedJimmy), GET_ENTITY_COORDS(PLAYER_PED_ID())) PERFORMING_TASK CLEAR_PED_TASKS(pedJimmy) TASK_LOOK_AT_ENTITY(pedJimmy, PLAYER_PED_ID(), -1, SLF_WIDEST_YAW_LIMIT) OPEN_SEQUENCE_TASK(seqTurnTask) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, SLF_WIDEST_YAW_LIMIT) CLOSE_SEQUENCE_TASK(seqTurnTask) TASK_PERFORM_SEQUENCE(pedJimmy, seqTurnTask) CLEAR_SEQUENCE_TASK(seqTurnTask) ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(pedJimmy, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK IF NOT IS_PED_INJURED(pedJimmy) TASK_LOOK_AT_ENTITY(pedJimmy, PLAYER_PED_ID(), -1, SLF_WIDEST_YAW_LIMIT) ENDIF ENDIF ENDIF ENDIF ENDIF BREAK ENDSWITCH PRINTLN("Jimmy walk stage is: ", iJimmyWalkStage) IF current_mission_stage <> stage_drive_to_beach IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_JETSKI_GO_TO_BEACH") STOP_AUDIO_SCENE("FAMILY_2_JETSKI_GO_TO_BEACH") ENDIF ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 LOSE_THE_COPS() ENDIF ENDIF ENDPROC //*********************************************************************************************************************************************** // SPEEDO CHASE //*********************************************************************************************************************************************** VECTOR vOpenSeaBounds[4] VECTOR vTunnelBounds[6] VECTOR vCanalBounds[6] VECTOR vMarinaBounds[5] VECTOR vFinalBounds[4] VECTOR vCanalsPathPos1[5] VECTOR vCanalsPathPos2[5] FLOAT fCanalsPathWidth[5] VECTOR vOpenWaterPath1[4] VECTOR vOpenWaterPath2[4] VECTOR vTunnelPath1[15] VECTOR vTunnelPath2[15] VECTOR vMarinaPath1[8] VECTOR vMarinaPath2[8] VECTOR vCurrentCanalPath[2][8] VECTOR vAltCanalPath[8] VECTOR vFinalPath1[6] VECTOR vFinalPath2[6] BOOL bChaserPlaybackForced[2] BOOL bForward BOOL bPlayerBehind[2] BOOL bChaserLost[2] BOOL bEndForced BOOL bCanLosePeds BOOL bCanalCatchupDone INT iLastForwardsCheck BOOL bVehicleBlips[2] INT iTraceyPanicTimer INT iSeaSharkHelpStage INT iTimeSeasharkHelpShown BOOL bSeasharkHelpShown BOOL bSeasharkHelpCleared FLOAT fPresstime FLOAT fGlobalSpeedVal = 0 BOOL bPlayerShouldDie = FALSE BOOL bPlayerIdleInCanals = FALSE BOOL bPedsSetToKillPlayer = FALSE FLOAT fKillTime = 0 FUNC BOOL IS_CHASER_BEHIND_TRACEY(INT iIndex) IF NOT IS_PED_INJURED(pedChasers[iIndex]) AND NOT IS_PED_INJURED(pedTracy) VECTOR vTowardsChaser = GET_ENTITY_COORDS(pedChasers[iIndex]) - GET_ENTITY_COORDS(pedTracy) VECTOR vTraceyForwards = GET_ENTITY_FORWARD_VECTOR(pedTracy) IF ABSF(GET_ANGLE_BETWEEN_2D_VECTORS(vTraceyForwards.x, vTraceyForwards.y, vTowardsChaser.x, vTowardsChaser.y)) >= 60.0 RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC INT iLastChaserLine PROC DO_TRACY_PANIC_LINES(STRING sTraceyRoot, STRING sMichaelRoot, INT iTimer = 8000) IF iLastChaserLine > iTraceyPanicTimer iTimer = 3000 ENDIF IF (GET_GAME_TIMER() - iTraceyPanicTimer) > iTimer AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) INT iWhoSpeaks = GET_RANDOM_INT_IN_RANGE(1, 3) IF NOT IS_PED_INJURED(pedChasers[0]) AND IS_VEHICLE_DRIVEABLE(vehChasers[0]) AND IS_ENTITY_AT_ENTITY(vehChasers[0], vehPlayerSeashark, <<20,20,5>>) AND iLastChaserLine < iTraceyPanicTimer iWhoSpeaks = GET_RANDOM_INT_IN_RANGE(1, 6) ENDIF PRINTLN("Line in is ", iWhoSpeaks, " Chaser timer: ", iLastChaserLine, " Tracey timer: ", iTraceyPanicTimer) IF iWhoSpeaks = 1 AND bKilledOne iWhoSpeaks = 2 ENDIF IF iWhoSpeaks = 1 AND NOT IS_STRING_NULL_OR_EMPTY(sMichaelRoot) IF CREATE_CONVERSATION(sSpeech, sConvBlock, sMichaelRoot, CONV_PRIORITY_HIGH) PRINTLN("MIKE LINE") iTraceyPanicTimer = GET_GAME_TIMER() ENDIF ELIF iWhoSpeaks = 2 IF ARE_STRINGS_EQUAL(sTraceyRoot, "FAM2_TSHOUT") IF IS_CHASER_BEHIND_TRACEY(0) INT iRand iRand = GET_RANDOM_INT_IN_RANGE(0, 4) SWITCH iRand CASE 0 TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_e", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1) BREAK CASE 1 TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_f", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1) BREAK CASE 2 TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_g", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1) BREAK CASE 3 TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_h", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1) BREAK ENDSWITCH ENDIF ENDIF IF bKilledOne IF NOT ARE_STRINGS_EQUAL(sTraceyRoot, "FAM2_ONE") sTraceyRoot = "FAM2_ONE" ENDIF ENDIF IF CREATE_CONVERSATION(sSpeech, sConvBlock, sTraceyRoot, CONV_PRIORITY_HIGH) PRINTLN("TRACEY LINE") iTraceyPanicTimer = GET_GAME_TIMER() ENDIF ELIF iWhoSpeaks >= 3 IF DOES_ENTITY_EXIST(sSpeech.PedInfo[7].Index) AND NOT IS_PED_INJURED(sSpeech.PedInfo[7].Index) IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_BGUY2", CONV_PRIORITY_HIGH) PRINTLN("CHASER LINE") iLastChaserLine = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDPROC PROC DO_EXCITING_NEAR_BULLET_MISS_ON_PED(PED_INDEX pedToMiss, PED_INDEX sourceOfBullets, INT &iControlTimer, VECTOR sourceOffset, INT timeBetweenBullets = 60, FLOAT minXrange = -3.9, FLOAT maxXrange = -1.0, FLOAT minYRange = -2.9, FLOAT maxYrange = 3.9) //Fire bullets at the player as from the bad guy... INT currentBulletTime = GET_GAME_TIMER() VECTOR bulletHit VECTOR bulletOrigin IF ((currentBulletTime - iControlTimer) > timeBetweenBullets) IF NOT IS_ENTITY_DEAD(pedToMiss) AND NOT IS_ENTITY_DEAD(sourceOfBullets) bulletHit = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(pedToMiss, <>) bulletOrigin = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sourceOfBullets, sourceOffset) GET_GROUND_Z_FOR_3D_COORD(bulletHit, bulletHit.z) SHOOT_SINGLE_BULLET_BETWEEN_COORDS(bulletOrigin, bulletHit, 1) iControlTimer = currentBulletTime ENDIF ENDIF ENDPROC FLOAT fLostTimes[2] PROC MANAGE_CHASER_BLIPS(INT iIndex) IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) IF NOT DOES_BLIP_EXIST(blipChasers[iIndex]) IF NOT IS_PED_INJURED(pedChasers[iIndex]) IF IS_VEHICLE_DRIVEABLE(vehChasers[iIndex]) AND IS_PED_IN_VEHICLE(pedChasers[iIndex], vehChasers[iIndex]) blipChasers[iIndex] = CREATE_BLIP_FOR_COORD(GET_ENTITY_COORDS(vehChasers[iIndex])) SET_BLIP_NAME_FROM_TEXT_FILE(blipChasers[iIndex], "FM2_PURSUER") SET_BLIP_COLOUR(blipChasers[iIndex], BLIP_COLOUR_RED) SET_BLIP_PRIORITY(blipChasers[iIndex], BLIPPRIORITY_HIGHEST) bVehicleBlips[iIndex] = TRUE ELSE blipChasers[iIndex] = CREATE_BLIP_FOR_PED(pedChasers[iIndex], TRUE) bVehicleBlips[iIndex] = FALSE ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(pedChasers[iIndex]) IF IS_VEHICLE_DRIVEABLE(vehChasers[iIndex]) AND IS_PED_IN_VEHICLE(pedChasers[iIndex], vehChasers[iIndex]) IF bVehicleBlips[iIndex] VECTOR vBlipPosition = GET_BLIP_COORDS(blipChasers[iIndex]) VECTOR vVehiclePosition = GET_ENTITY_COORDS(vehChasers[iIndex]) vBlipPosition.X = vBlipPosition.X + ((vVehiclePosition.X - vBlipPosition.X) / 25.0) vBlipPosition.Y = vBlipPosition.Y + ((vVehiclePosition.Y - vBlipPosition.Y) / 25.0) vBlipPosition.Z = vBlipPosition.Z + ((vVehiclePosition.Z - vBlipPosition.Z) / 25.0) SET_BLIP_COORDS(blipChasers[iIndex], vBlipPosition) ELSE REMOVE_BLIP(blipChasers[iIndex]) ENDIF ELSE IF bVehicleBlips[iIndex] REMOVE_BLIP(blipChasers[iIndex]) ENDIF ENDIF ELSE IF DOES_BLIP_EXIST(blipChasers[iIndex]) REMOVE_BLIP(blipChasers[iIndex]) ENDIF ENDIF ENDIF ELSE IF DOES_BLIP_EXIST(blipChasers[iIndex]) REMOVE_BLIP(blipChasers[iIndex]) ENDIF ENDIF ENDPROC FUNC BOOL CHECK_IF_CHASER_HAS_BEEN_LOST(INT iChaser, FLOAT fLostDist = 100.0, FLOAT fMaxLostTime = 5.0) IF NOT IS_PED_INJURED(pedChasers[iChaser]) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) FLOAT fDist = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedChasers[iChaser])) IF (fDist > fLostDist*fLostDist AND IS_ENTITY_OCCLUDED(pedChasers[iChaser])) OR fDist > 300*300 IF fDist > 300*300 fLostTimes[iChaser] += GET_FRAME_TIME()*10 ENDIF fLostTimes[iChaser] += GET_FRAME_TIME() ELSE IF fLostTimes[iChaser] > 0 fLostTimes[iChaser] -= GET_FRAME_TIME() * 3 ELSE fLostTimes[iChaser] = 0 ENDIF ENDIF ENDIF PRINTLN("LOST TIME IS ", fLostTimes[iChaser]) #IF IS_DEBUG_BUILD DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(fLostTimes[iChaser]), <<0.08,0.04,0>>) #ENDIF IF fLostTimes[iChaser] > fMaxLostTime RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL ARE_TRACY_AND_PLAYER_ON_SEASHARK() IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND NOT IS_PED_INJURED(pedTracy) IF IS_PED_SITTING_IN_VEHICLE(pedTracy, vehPlayerSeashark) AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC RUN_SEASHARK_HELP() IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SWITCH iSeaSharkHelpStage CASE 0 IF NOT bSeasharkHelpShown PRINT_HELP("FM2_JSHLP1", 12000) iTimeSeasharkHelpShown = GET_GAME_TIMER() bSeasharkHelpShown = TRUE ENDIF IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE) fPresstime += GET_FRAME_TIME() ENDIF IF fPresstime > 3.0 OR GET_GAME_TIMER() - iTimeSeasharkHelpShown > 10000 fPresstime = 0.0 iSeaSharkHelpStage++ ENDIF BREAK CASE 1 IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_JSHLP1") IF NOT bSeasharkHelpCleared CLEAR_HELP(FALSE) bSeasharkHelpCleared = TRUE ENDIF ELSE iTimeSeasharkHelpShown = GET_GAME_TIMER() iSeaSharkHelpStage++ ENDIF BREAK CASE 2 IF GET_GAME_TIMER() - iTimeSeasharkHelpShown > 2000 bSeasharkHelpShown = FALSE bSeasharkHelpCleared = FALSE iSeaSharkHelpStage++ ENDIF BREAK CASE 3 IF NOT bSeasharkHelpShown PRINT_HELP("FM2_JSHLP2", 12000) iTimeSeasharkHelpShown = GET_GAME_TIMER() bSeasharkHelpShown = TRUE ENDIF IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE) fPresstime += GET_FRAME_TIME() ENDIF IF fPresstime > 1.0 OR GET_GAME_TIMER() - iTimeSeasharkHelpShown > 10000 iSeaSharkHelpStage++ ENDIF BREAK CASE 4 IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_JSHLP2") IF NOT bSeasharkHelpCleared bSeasharkHelpCleared = TRUE CLEAR_HELP(FALSE) ENDIF ELSE iSeaSharkHelpStage++ ENDIF BREAK CASE 5 IF GET_GAME_TIMER() - iTimeSeasharkHelpShown > 2000 bSeasharkHelpShown = FALSE bSeasharkHelpCleared = FALSE iSeaSharkHelpStage++ ENDIF BREAK CASE 6 IF NOT bSeasharkHelpShown PRINT_HELP("FM2_JSHLP3", 12000) iTimeSeasharkHelpShown = GET_GAME_TIMER() bSeasharkHelpShown = TRUE ENDIF IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE) fPresstime += GET_FRAME_TIME() ENDIF IF fPresstime > 2.0 OR GET_GAME_TIMER() - iTimeSeasharkHelpShown > 7500 fPresstime = 0.0 iSeaSharkHelpStage++ ENDIF BREAK CASE 7 IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_JSHLP3") IF NOT bSeasharkHelpCleared CLEAR_HELP(FALSE) bSeasharkHelpCleared = TRUE ENDIF ELSE iTimeSeasharkHelpShown = GET_GAME_TIMER() iSeaSharkHelpStage++ ENDIF BREAK ENDSWITCH ELSE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_JSHLP1") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_JSHLP2") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FM2_JSHLP3") CLEAR_HELP() ENDIF ENDIF ENDPROC FUNC BOOL IS_POINT_IN_2D_BOUNDS(VECTOR vPoint, VECTOR &vBounds[], BOOL bReport = FALSE) IF COUNT_OF(vBounds) < 3 SCRIPT_ASSERT("Calling IS_POINT_IN_BOUNDS() with a vector array of size < 3") ENDIF BOOL bRet = TRUE IF NOT IS_POINT_BEHIND_LINE2(vPoint, vBounds[0], vBounds[COUNT_OF(vBounds)-1]) IF bReport PRINTLN("Point is not behind final line") ENDIF bRet = FALSE ENDIF INT iTemp REPEAT COUNT_OF(vBounds)-1 iTemp IF NOT IS_POINT_BEHIND_LINE2(vPoint, vBounds[iTemp+1], vBounds[iTemp]) IF bReport PRINTLN("Point is not behind line", iTemp) ENDIF bRet = FALSE ENDIF ENDREPEAT RETURN bRet ENDFUNC PROC INIT_CHASE_BOUNDS() vOpenSeaBounds[0] = <<-2033.7400, -1004.7763, 1>> // to the left of the yacht facing tunnel vOpenSeaBounds[1] = <<-1801.4323, -975.5541, 1>> // the left hand side of the tunnel facing tunnel from yacht vOpenSeaBounds[2] = <<-1796.2546, -988.1660, 1>> // the right hand side of the tunnel facing tunnel from yacht vOpenSeaBounds[3] = <<-2012.2445, -1073.7762, 1>> // to the right of the yacht facing tunnel vTunnelBounds[5] = <<-1241.1379, -933.0004, 1>> // right of tunnel exit leaving tunnel vTunnelBounds[4] = <<-1227.2028, -924.2169, 1>> // left of tunnel exit leaving tunnel vTunnelBounds[3] = <<-1240.0150, -751.6861, 1>> // far left of the tunnel 2 vTunnelBounds[2] = <<-1431.8754, -747.5580, 1>> // far left of the tunnel vTunnelBounds[1] = vOpenSeaBounds[1] //Border point vTunnelBounds[0] = vOpenSeaBounds[2] //Border point vCanalBounds[0] = <<-988.3516, -908.0377, 1>> // Top Left of canals vCanalBounds[1] = <<-866.9206, -1116.0399, 1>> // Top right of canals vCanalBounds[2] = <<-978.9424, -1351.0541, 1>> // left of canal exit heading into marina vCanalBounds[3] = <<-1007.6198, -1362.3158, 1>> // right of canal exit heading into marina vCanalBounds[4] = vTunnelBounds[5] //Border point vCanalBounds[5] = vTunnelBounds[4] //Border point vMarinaBounds[0] = vCanalBounds[3] //Border point vMarinaBounds[1] = vCanalBounds[2] //Border point vMarinaBounds[2] = <<-844.5858, -1302.0059, 4.1001>> //far left top corner of marina vMarinaBounds[3] = <<-768.9856, -1524.3383, 4.9800>> // central top of marina vMarinaBounds[4] = <<-1052.3737, -1553.3130, 13.0317>> // central bottom of marina vFinalBounds[0] = vMarinaBounds[4] //Border point vFinalBounds[1] = vMarinaBounds[3] //Border point vFinalBounds[2] = <<-1165.8938, -1923.1788, 2.5698>> //left of river mouth vFinalBounds[3] = <<-1226.9473, -1873.5306, 4.8338>> //right of river mouth ENDPROC FUNC FAM2_CHASE_SECTION_ENUM GET_CURRENT_CHASE_ENUM() IF IS_POINT_IN_2D_BOUNDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vOpenSeaBounds) RETURN FAM2_CHASE_OPEN_SEA ENDIF IF IS_POINT_IN_2D_BOUNDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTunnelBounds) RETURN FAM2_CHASE_TUNNELS ENDIF IF IS_POINT_IN_2D_BOUNDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCanalBounds) IF NOT IS_PED_INJURED(pedChasers[0]) AND NOT IS_ENTITY_DEAD(pedChasers[0]) RETURN FAM2_CHASE_CANALS ELIF bCanalCatchupDone RETURN FAM2_CHASE_CANALS_SINGLE_CHASER ELSE RETURN FAM2_CHASE_CANALS_CATCH_UP ENDIF ENDIF IF IS_POINT_IN_2D_BOUNDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMarinaBounds) RETURN FAM2_CHASE_MARINA ENDIF IF IS_POINT_IN_2D_BOUNDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFinalBounds) RETURN FAM2_CHASE_LOSE_PEDS ENDIF RETURN FAM2_CHASE_SEEK_AND_DESTROY ENDFUNC #IF IS_DEBUG_BUILD PROC DRAW_CHASE_BOUNDS(VECTOR &vBounds[], BOOL bActiveArea) INT r,b IF bActiveArea r = 255 b = 0 ELSE r = 0 b = 255 ENDIF INT iTemp REPEAT COUNT_OF(vBounds)-1 iTemp DRAW_DEBUG_LINE(<>, <>, r,0,b) IF r = 255 DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(iTemp), <>) ENDIF ENDREPEAT DRAW_DEBUG_LINE(<>, <>, r,0,b) IF r = 255 DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(COUNT_OF(vBounds)-1), <>) ENDIF ENDPROC PROC DRAW_ALL_CHASE_BOUNDS() FAM2_CHASE_SECTION_ENUM eStage = GET_CURRENT_CHASE_ENUM() DRAW_CHASE_BOUNDS(vOpenSeaBounds, eStage = FAM2_CHASE_OPEN_SEA) DRAW_CHASE_BOUNDS(vTunnelBounds, eStage = FAM2_CHASE_TUNNELS) DRAW_CHASE_BOUNDS(vCanalBounds, eStage = FAM2_CHASE_CANALS) DRAW_CHASE_BOUNDS(vMarinaBounds, eStage = FAM2_CHASE_MARINA) DRAW_CHASE_BOUNDS(vFinalBounds, eStage = FAM2_CHASE_LOSE_PEDS) ENDPROC FUNC STRING GET_STRING_FROM_CHASE_STAGE(FAM2_CHASE_SECTION_ENUM eStage) SWITCH eStage CASE FAM2_CHASE_OPEN_SEA RETURN "FAM2_CHASE_OPEN_SEA" BREAK CASE FAM2_CHASE_TUNNELS RETURN "FAM2_CHASE_TUNNELS" BREAK CASE FAM2_CHASE_CANALS RETURN "FAM2_CHASE_CANALS" BREAK CASE FAM2_CHASE_MARINA RETURN "FAM2_CHASE_MARINA" BREAK CASE FAM2_CHASE_SEEK_AND_DESTROY RETURN "FAM2_CHASE_SEEK_AND_DESTROY" BREAK CASE FAM2_CHASE_LOSE_PEDS RETURN "FAM2_CHASE_LOSE_PEDS" BREAK ENDSWITCH RETURN "INVALID SECTION" ENDFUNC #ENDIF FUNC BOOL INIT_RECORDING_PATHS() REQUEST_VEHICLE_RECORDING(101, "famtwo") REQUEST_VEHICLE_RECORDING(102, "famtwo") REQUEST_VEHICLE_RECORDING(201, "famtwo") REQUEST_VEHICLE_RECORDING(202, "famtwo") REQUEST_VEHICLE_RECORDING(301, "famtwo") REQUEST_VEHICLE_RECORDING(302, "famtwo") REQUEST_VEHICLE_RECORDING(1, "famtwoCanalsAlt") REQUEST_VEHICLE_RECORDING(1, "famtwoplayer") IF HAS_VEHICLE_RECORDING_BEEN_LOADED(101, "famtwo") AND HAS_VEHICLE_RECORDING_BEEN_LOADED(102, "famtwo") AND HAS_VEHICLE_RECORDING_BEEN_LOADED(201, "famtwo") AND HAS_VEHICLE_RECORDING_BEEN_LOADED(202, "famtwo") AND HAS_VEHICLE_RECORDING_BEEN_LOADED(301, "famtwo") AND HAS_VEHICLE_RECORDING_BEEN_LOADED(302, "famtwo") AND HAS_VEHICLE_RECORDING_BEEN_LOADED(1, "famtwoCanalsAlt") BUILD_PATH_FOR_RECORDING(vOpenWaterPath1, 101, "famtwo") BUILD_PATH_FOR_RECORDING(vOpenWaterPath2, 102, "famtwo") BUILD_PATH_FOR_RECORDING(vTunnelPath1, 201, "famtwo") BUILD_PATH_FOR_RECORDING(vTunnelPath2, 202, "famtwo") BUILD_PATH_FOR_RECORDING(vMarinaPath1, 301, "famtwo") BUILD_PATH_FOR_RECORDING(vMarinaPath2, 302, "famtwo") BUILD_PATH_FOR_RECORDING(vFinalPath1, 401, "famtwo") BUILD_PATH_FOR_RECORDING(vFinalPath2, 402, "famtwo") BUILD_PATH_FOR_RECORDING(vAltCanalPath, 1, "famtwoCanalsAlt") RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC INT GET_CLOSEST_PATH_SECTION(VECTOR point, VECTOR &vPath[]) INT iTemp INT iClosest FLOAT closest_distance = 999999 REPEAT COUNT_OF(vPath)-1 iTemp IF VDIST2(GET_CLOSEST_POINT_ON_LINE(point, vPath[iTemp], vPath[iTemp+1]), point) < closest_distance iClosest = itemp closest_distance = VDIST2(GET_CLOSEST_POINT_ON_LINE(point, vPath[iTemp], vPath[iTemp+1]), point) ENDIF ENDREPEAT RETURN iClosest ENDFUNC FUNC FLOAT GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(VECTOR point, INT iRecNumber, STRING sRecName, VECTOR &route[], BOOL bUpdateDisplay = FALSE) INT iClosestPathSection = GET_CLOSEST_PATH_SECTION(point, route) FLOAT fTimePerNode = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iRecNumber, sRecName)/(COUNT_OF(route)-1) FLOAT fCurrentLineProg = GET_RATIO_OF_CLOSEST_POINT_ON_LINE(point, route[iClosestPathSection], route[iClosestPathSection+1]) * fTimePerNode IF bUpdateDisplay #IF IS_DEBUG_BUILD fRecordingTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iRecNumber, sRecName) fSectionTime = fTimePerNode fSectionProgressTime = fCurrentLineProg fSectionProgress = GET_RATIO_OF_CLOSEST_POINT_ON_LINE(point, route[iClosestPathSection], route[iClosestPathSection+1]) iClosestPoint = iClosestPathSection VECTOR vPoint = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iRecNumber, fCurrentLineProg + (iClosestPathSection*fTimePerNode)-0.1, sRecName) DRAW_DEBUG_SPHERE(vPoint + <<0,0,1>>, 0.2, 0, 255, 0) #ENDIF ENDIF RETURN fCurrentLineProg + (iClosestPathSection*fTimePerNode)-0.1 ENDFUNC PROC KEEP_CHASER_ON_PATH(INT iIndex, VECTOR &vPath[], INT iRec, STRING sRec, BOOL bStopPlaybackOnSight = FALSE, BOOL bSlowForCorners = FALSE) IF NOT IS_PED_INJURED(pedChasers[iIndex]) AND NOT IS_ENTITY_DEAD(pedChasers[iIndex]) AND DOES_ENTITY_EXIST(vehChasers[iIndex]) AND IS_VEHICLE_DRIVEABLE(vehChasers[iIndex]) AND IS_PED_IN_VEHICLE(pedChasers[iIndex], vehChasers[iIndex]) AND IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) FLOAT fPathProg = GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(vehChasers[iIndex]), iRec, sRec, vPath) FLOAT fPlayerProgOnPath = GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), iRec, sRec, vPath) VECTOR vProgPos = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iRec, fPathProg, sRec) VECTOR vPlayerProgPos = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iRec, fPlayerProgOnPath, sRec) IF NOT bChaserPlaybackForced[iIndex] IF NOT bPedsSetToKillPlayer IF fPathProg < fPlayerProgOnPath //if the chaser is behind the player on the recording AND NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(vehChasers[iIndex]), 3) //and they can't be seen and neither can their recording position AND NOT IS_SPHERE_VISIBLE(vProgPos, 3) AND VDIST2(vPlayerProgPos, GET_ENTITY_COORDS(vehchasers[iIndex])) > 5*5 PRINTLN("@@@@@@@@@@@ REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME @@@@@@@@@@@") REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[iIndex]) START_PLAYBACK_RECORDED_VEHICLE(vehChasers[iIndex], iRec, sRec) SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(vehChasers[iIndex], <<0,0,0.1>>) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChasers[iIndex], CLAMP(fPathProg + (iIndex*0.5), 0, 999999)) bChaserPlaybackForced[iIndex] = TRUE ENDIF ENDIF IF eCurrentChaseSection <> FAM2_CHASE_CANALS bPlayerBehind[iIndex] = fPathProg > fPlayerProgOnPath ELSE bPlayerBehind[iIndex] = FALSE ENDIF ELSE FLOAT fDistToPlayer = VDIST2(vPlayerProgPos, vProgPos) FLOAT fDistToOtherChaser = 999999 IF NOT IS_ENTITY_DEAD(vehChasers[0]) AND NOT IS_ENTITY_DEAD(vehChasers[1]) fDistToOtherChaser = VDIST2(GET_ENTITY_COORDS(vehChasers[0]), GET_ENTITY_COORDS(vehChasers[1])) #IF IS_DEBUG_BUILD IF fDistToOtherChaser < 1.5 * 1.5 DRAW_DEBUG_LINE(GET_ENTITY_COORDS(vehChasers[0]), GET_ENTITY_COORDS(vehChasers[1]), 255, 0, 0) ELSE DRAW_DEBUG_LINE(GET_ENTITY_COORDS(vehChasers[0]), GET_ENTITY_COORDS(vehChasers[1]), 0, 255, 0) ENDIF #ENDIF ENDIF IF (IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(vehChasers[iIndex]), 3) AND (fDistToPlayer < 5*5 OR bStopPlaybackOnSight)) OR fDistToPlayer < 3*3 OR fPathProg > fPlayerProgOnPath OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[iIndex]) OR fDistToOtherChaser < 1.5*1.5 IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[iIndex]) SET_PLAYBACK_TO_USE_AI(vehChasers[iIndex], DRIVINGMODE_PLOUGHTHROUGH) ELSE START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehChasers[iIndex], iRec, sRec, 20, DRIVINGMODE_PLOUGHTHROUGH) ENDIF IF bSlowForCorners AND (fPathProg > 0.85 OR fPathProg < 0.15) //SET_VEHICLE_FORWARD_SPEED(vehChasers[iIndex], CLAMP(get_entity_SPEED(vehChasers[iIndex]), 0, 5)) ELSE //SET_VEHICLE_FORWARD_SPEED(vehChasers[iIndex], CLAMP(get_entity_SPEED(vehChasers[iIndex]), 0, GET_ENTITY_SPEED(PLAYER_PED_ID()))) ENDIF TASK_VEHICLE_CHASE(pedChasers[iIndex], PLAYER_PED_ID()) bChaserPlaybackForced[iIndex] = FALSE ELSE FLOAT fVariableDist = 40 FLOAT FMaxSpeed IF bSlowForCorners AND (fPathProg > 0.8 OR fPathProg < 0.2) FMaxSpeed = 1.0 SET_PLAYBACK_SPEED(vehChasers[iIndex], CLAMP(VDIST(GET_ENTITY_COORDS(vehChasers[iIndex]), GET_ENTITY_COORDS(PLAYER_PED_ID()))*(FMaxSpeed/fVariableDist)*fGlobalSpeedVal, 0.2, FMaxSpeed)) ELSE FMaxSpeed = 1.3 SET_PLAYBACK_SPEED(vehChasers[iIndex], CLAMP(VDIST(GET_ENTITY_COORDS(vehChasers[iIndex]), GET_ENTITY_COORDS(PLAYER_PED_ID()))*(FMaxSpeed/fVariableDist)*fGlobalSpeedVal, 0.8, FMaxSpeed)) ENDIF ENDIF ENDIF ELSE IF DOES_ENTITY_EXIST(vehChasers[iIndex]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[iIndex]) STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[iIndex]) ENDIF ENDIF ENDIF ENDPROC PROC INIT_CANAL_PATHS() vCanalsPathPos1[0] = <<-1237.273926,-923.970032,5.135533>> vCanalsPathPos2[0] = <<-985.134827,-1359.680176,-7.479084>> fCanalsPathWidth[0] = 23.000000 vCanalsPathPos1[1] = <<-1003.907837,-914.453613,-1.611186>> vCanalsPathPos2[1] = <<-880.547668,-1124.601807,6.150022>> fCanalsPathWidth[1] = 29.000000 vCanalsPathPos1[2] = <<-1169.471313,-1027.086670,5.785080>> vCanalsPathPos2[2] = <<-1003.960571,-932.328430,-2.993861>> fCanalsPathWidth[2] = 29.000000 vCanalsPathPos1[3] = <<-1116.554321,-1119.791016,5.784778>> vCanalsPathPos2[3] = <<-950.776062,-1023.822815,-1.496439>> fCanalsPathWidth[3] = 29.000000 vCanalsPathPos1[4] = <<-1062.390869,-1213.473755,-2.315868>> vCanalsPathPos2[4] = <<-897.308472,-1116.901001,4.925530>> fCanalsPathWidth[4] = 29.000000 ENDPROC FUNC CANAL_SECTION GET_CURRENT_CANAL_SECTION() CANAL_SECTION eCounter REPEAT FAM2_CS_NUMBER_OF_SECTIONS eCounter IF IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), vCanalsPathPos1[eCounter], vCanalsPathPos2[eCounter], fCanalsPathWidth[eCounter]) RETURN eCounter ENDIF ENDREPEAT RETURN FAM2_CS_INVALID ENDFUNC FUNC BOOL IS_PLAYER_HEADING_FORWARD_IN_CANAL_SECTION(CANAL_SECTION eSection) VECTOR vPlayerForward = GET_ENTITY_FORWARD_VECTOR(PLAYER_PED_ID()) VECTOR vSectionForward = NORMALISE_VECTOR(vCanalsPathPos2[eSection] - vCanalsPathPos1[eSection]) RETURN ABSF(GET_ANGLE_BETWEEN_2D_VECTORS(vSectionForward.x, vSectionForward.y, vPlayerForward.x, vPlayerForward.y)) < 90 ENDFUNC FUNC STRING GET_CANAL_SECTION_RECORDING_NAME(CANAL_SECTION eSection) SWITCH eSection CASE FAM2_CS_BOTTOM RETURN "famtwoCanalsbottom" BREAK CASE FAM2_CS_TOP RETURN "famtwoCanalstop" BREAK CASE FAM2_CS_LEFT RETURN "famtwoCanalsLeft" BREAK CASE FAM2_CS_MIDDLE RETURN "famtwoCanalsMiddle" BREAK CASE FAM2_CS_RIGHT RETURN "famtwoCanalsRight" BREAK ENDSWITCH RETURN "famtwoCanalsbottom" ENDFUNC FUNC BOOL HAVE_ALL_CANAL_PATHS_LOADED() BOOL bAllLoaded = TRUE CANAL_SECTION eCounter REPEAT FAM2_CS_NUMBER_OF_SECTIONS eCounter REQUEST_VEHICLE_RECORDING(1, GET_CANAL_SECTION_RECORDING_NAME(eCounter)) REQUEST_VEHICLE_RECORDING(2, GET_CANAL_SECTION_RECORDING_NAME(eCounter)) IF NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(1, GET_CANAL_SECTION_RECORDING_NAME(eCounter)) OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(2, GET_CANAL_SECTION_RECORDING_NAME(eCounter)) bAllLoaded = FALSE ENDIF ENDREPEAT RETURN bAllLoaded ENDFUNC PROC KEEP_CHASER_ON_PATH_IN_CANALS(INT iIndex) IF bForward KEEP_CHASER_ON_PATH(iIndex, vCurrentCanalPath[0], 1, GET_CANAL_SECTION_RECORDING_NAME(ePreviousCanalSection), FALSE, TRUE) ELSE KEEP_CHASER_ON_PATH(iIndex, vCurrentCanalPath[1], 2, GET_CANAL_SECTION_RECORDING_NAME(ePreviousCanalSection), FALSE, TRUE) ENDIF IF GET_GAME_TIMER() - iLastForwardsCheck > 500 bForward = IS_PLAYER_HEADING_FORWARD_IN_CANAL_SECTION(ePreviousCanalSection) iLastForwardsCheck = GET_GAME_TIMER() ENDIF #IF IS_DEBUG_BUILD DRAW_PATH(vCurrentCanalPath[0]) DRAW_PATH(vCurrentCanalPath[1]) #ENDIF ENDPROC PROC RUN_CHASERS() INT iIndex REPEAT 2 iIndex IF NOT IS_PED_INJURED(pedchasers[iIndex]) IF NOT IS_PED_IN_ANY_VEHICLE(pedchasers[iIndex]) AND IS_ENTITY_IN_WATER(pedchasers[iIndex]) AND VDIST2(GET_ENTITY_COORDS(pedchasers[iIndex]), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100 EXPLODE_PED_HEAD(pedchasers[iIndex]) ENDIF ENDIF ENDREPEAT SWITCH eCurrentChaseSection CASE FAM2_CHASE_OPEN_SEA IF TIMERB() > 5000 KEEP_CHASER_ON_PATH(0, vOpenWaterPath1, 101, "famtwo", TRUE) KEEP_CHASER_ON_PATH(1, vOpenWaterPath2, 102, "famtwo", TRUE) ENDIF IF TIMERB() < 2000 DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PHONE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_UD) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_LR) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND) ENDIF IF fGlobalSpeedVal < 1.0 fGlobalSpeedVal += 0.01 ELSE fGlobalSpeedVal = 1 ENDIF #IF IS_DEBUG_BUILD DRAW_PATH(vOpenWaterPath1) DRAW_PATH(vOpenWaterPath2) #ENDIF BREAK CASE FAM2_CHASE_TUNNELS KEEP_CHASER_ON_PATH(0, vTunnelPath1, 201, "famtwo") KEEP_CHASER_ON_PATH(1, vTunnelPath2, 202, "famtwo") #IF IS_DEBUG_BUILD GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), 201, "famtwo", vTunnelPath1, TRUE) DRAW_PATH(vTunnelPath1) DRAW_PATH(vTunnelPath2) #ENDIF BREAK CASE FAM2_CHASE_CANALS eCurrentCanalSection = GET_CURRENT_CANAL_SECTION() IF eCurrentCanalSection != FAM2_CS_INVALID IF eCurrentCanalSection != ePreviousCanalSection BUILD_PATH_FOR_RECORDING(vCurrentCanalPath[0], 1, GET_CANAL_SECTION_RECORDING_NAME(eCurrentCanalSection)) BUILD_PATH_FOR_RECORDING(vCurrentCanalPath[1], 2, GET_CANAL_SECTION_RECORDING_NAME(eCurrentCanalSection)) IF DOES_ENTITY_EXIST(vehChasers[0]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[0]) STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[0]) ENDIF ENDIF IF DOES_ENTITY_EXIST(vehChasers[1]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[1]) STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[1]) ENDIF ENDIF ENDIF ePreviousCanalSection = eCurrentCanalSection ENDIF KEEP_CHASER_ON_PATH_IN_CANALS(0) #IF IS_DEBUG_BUILD DRAW_DEBUG_TEXT_ABOVE_COORDS(GET_ENTITY_COORDS(vehPlayerSeashark), GET_STRING_FROM_FLOAT(GET_ENTITY_SPEED(vehPlayerSeashark)), 1.5) #ENDIF IF NOT bPlayerIdleInCanals IF NOT IS_ENTITY_DEAD(vehChasers[0]) IF (VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehChasers[0]))) < 10*10 AND GET_ENTITY_SPEED(vehPlayerSeashark) < 7 bPlayerIdleInCanals = TRUE ENDIF ENDIF IF NOT IS_ENTITY_DEAD(vehChasers[1]) IF (VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehChasers[1]))) < 10*10 AND GET_ENTITY_SPEED(vehPlayerSeashark) < 7 bPlayerIdleInCanals = TRUE ENDIF ENDIF ELSE IF GET_ENTITY_SPEED(vehPlayerSeashark) > 10 bPlayerIdleInCanals = FALSE ENDIF ENDIF IF eCurrentCanalSection = FAM2_CS_BOTTOM IF NOT IS_ENTITY_DEAD(vehChasers[1]) IF GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(vehChasers[1]), 1, "famtwoCanalsAlt", vAltCanalPath) > GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1, "famtwoCanalsAlt", vAltCanalPath) bPlayerBehind[1] = TRUE ENDIF ENDIF IF NOT IS_ENTITY_DEAD(vehChasers[0]) IF GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(vehChasers[0]), 1, "famtwoCanalsAlt", vAltCanalPath) > GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1, "famtwoCanalsAlt", vAltCanalPath) bPlayerBehind[0] = TRUE ENDIF ENDIF KEEP_CHASER_ON_PATH(1, vAltCanalPath, 1, "famtwoCanalsAlt") ELSE IF NOT IS_PED_INJURED(pedChasers[1]) VECTOR vWaitTarget IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1061.247314,-1027.520386,-1.839872>>, <<-1158.562134,-864.583618,17.985117>>, 250.000000) vWaitTarget = <<-1191.4796, -1002.4274, 0>> ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1061.247314,-1027.520386,-1.839872>>, <<-1006.939270,-1120.255981,6.144058>>, 250.000000) vWaitTarget = <<-1137.6525, -1097.1637, 0>> ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-900.011719,-1305.718018,15.900065>>, <<-1006.939270,-1120.255981,-8.855943>>, 250.000000) vWaitTarget = <<-1083.9927, -1189.7032, 0>> ENDIF IF NOT IS_VECTOR_ZERO(vWaitTarget) IF NOT IS_ENTITY_AT_COORD(vehChasers[1], vWaitTarget, <<2.5,2.5,2>>) VECTOR vMax VECTOR vMin vMax = <<-1114.952271,-1082.671021,-1.599754>>+<<81.250000,133.250000,17.750000>> vMin = <<-1114.952271,-1082.671021,-1.599754>> - <<81.250000,133.250000,17.750000>> IF REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vMin.x, vMin.y, vMax.x, vMax.y) IF GET_SCRIPT_TASK_STATUS(pedChasers[1], SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) <> PERFORMING_TASK TASK_VEHICLE_DRIVE_TO_COORD(pedChasers[1], vehChasers[1], vWaitTarget, 10, DRIVINGSTYLE_ACCURATE, SEASHARK, DRIVINGMODE_PLOUGHTHROUGH, 1, 3) ENDIF ENDIF IF NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(vehChasers[1]), 2) AND NOT IS_SPHERE_VISIBLE(vWaitTarget, 2) SET_ENTITY_COORDS(vehChasers[1], vWaitTarget) SET_ENTITY_HEADING(vehChasers[1], 214) ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE FAM2_CHASE_CANALS_CATCH_UP IF NOT IS_PED_INJURED(pedChasers[1]) AND NOT IS_ENTITY_DEAD(pedChasers[1]) AND IS_VEHICLE_DRIVEABLE(vehChasers[1]) AND IS_PED_IN_VEHICLE(pedChasers[1], vehChasers[1]) AND IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) IF GET_SCRIPT_TASK_STATUS(pedChasers[1], SCRIPT_TASK_VEHICLE_CHASE) <> PERFORMING_TASK AND GET_SCRIPT_TASK_STATUS(pedChasers[1], SCRIPT_TASK_VEHICLE_CHASE) <> DORMANT_TASK TASK_VEHICLE_CHASE(pedChasers[1], PLAYER_PED_ID()) ENDIF ENDIF IF IS_ENTITY_AT_ENTITY(pedChasers[1], PLAYER_PED_ID(), <<10, 10, 5>>) bCanalCatchupDone = TRUE ENDIF ENDIF BREAK CASE FAM2_CHASE_CANALS_SINGLE_CHASER eCurrentCanalSection = GET_CURRENT_CANAL_SECTION() IF eCurrentCanalSection != FAM2_CS_INVALID IF eCurrentCanalSection != ePreviousCanalSection BUILD_PATH_FOR_RECORDING(vCurrentCanalPath[0], 1, GET_CANAL_SECTION_RECORDING_NAME(eCurrentCanalSection)) BUILD_PATH_FOR_RECORDING(vCurrentCanalPath[1], 2, GET_CANAL_SECTION_RECORDING_NAME(eCurrentCanalSection)) IF DOES_ENTITY_EXIST(vehChasers[1]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[1]) STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[1]) ENDIF ENDIF ENDIF ePreviousCanalSection = eCurrentCanalSection ENDIF KEEP_CHASER_ON_PATH_IN_CANALS(1) IF NOT bPlayerIdleInCanals IF (VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehChasers[0])) < 10*10 OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehChasers[1])) < 10*10) AND GET_ENTITY_SPEED(vehPlayerSeashark) < 7 bPlayerIdleInCanals = TRUE ENDIF ELSE IF GET_ENTITY_SPEED(vehPlayerSeashark) > 10 bPlayerIdleInCanals = FALSE ENDIF ENDIF BREAK CASE FAM2_CHASE_MARINA KEEP_CHASER_ON_PATH(0, vMarinaPath1, 301, "famtwo") KEEP_CHASER_ON_PATH(1, vMarinaPath2, 302, "famtwo") #IF IS_DEBUG_BUILD GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), 301, "famtwo", vMarinaPath1, TRUE) DRAW_PATH(vMarinaPath1) DRAW_PATH(vMarinaPath2) #ENDIF BREAK CASE FAM2_CHASE_LOSE_PEDS IF NOT bEndForced KEEP_CHASER_ON_PATH(0, vFinalPath1, 401, "famtwo", TRUE) KEEP_CHASER_ON_PATH(1, vFinalPath2, 402, "famtwo", TRUE) IF NOT bPedsSetToKillPlayer IF fGlobalSpeedVal > 0.1 fGlobalSpeedVal -= 0.01 ELSE fGlobalSpeedVal = 0.1 ENDIF #IF IS_DEBUG_BUILD GET_TIME_POSITION_IN_SHORT_RECORDING_FROM_POSITION(GET_ENTITY_COORDS(PLAYER_PED_ID()), 401, "famtwo", vFinalPath1, TRUE) DRAW_PATH(vFinalPath1) DRAW_PATH(vFinalPath2) #ENDIF ENDIF IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vTheAbsoluteEndPos1, vTheAbsoluteEndPos2, fTheAbsoluteEndWidth, FALSE) INT i REPEAT COUNT_OF(pedChasers) i IF NOT IS_PED_INJURED(pedChasers[i]) CLEAR_PED_TASKS(pedChasers[i]) TASK_VEHICLE_MISSION_COORS_TARGET(pedChasers[i], vehChasers[i], <<-901.3011, -1359.9370, 0>>, MISSION_GOTO_RACING, 20, DRIVINGMODE_PLOUGHTHROUGH, 3, 3, TRUE) ENDIF ENDREPEAT bEndForced = TRUE ENDIF ENDIF BREAK ENDSWITCH MANAGE_CHASER_BLIPS(0) MANAGE_CHASER_BLIPS(1) #IF IS_DEBUG_BUILD DRAW_ALL_CHASE_BOUNDS() #ENDIF IF eCurrentChaseSection = FAM2_CHASE_LOSE_PEDS OR eCurrentChaseSection = FAM2_CHASE_SEEK_AND_DESTROY OR bEndForced IF NOT bCanLosePeds bCanLosePeds = TRUE ENDIF ELSE IF bCanLosePeds bCanLosePeds = FALSE ENDIF ENDIF ENDPROC PROC CHECK_FOR_LOSING_CHASERS() INT iTemp IF bCanLosePeds FLOAT fLoseTime FLOAT fLoseDist IF bEndForced fLoseTime = 3.0 fLoseDist = 50 ELSE IF eCurrentChaseSection = FAM2_CHASE_SEEK_AND_DESTROY fLoseTime = 5.0 fLoseDist = 250 ELSE fLoseTime = 5.0 fLoseDist = 100 ENDIF ENDIF REPEAT COUNT_OF(pedChasers) iTemp IF CHECK_IF_CHASER_HAS_BEEN_LOST(iTemp,fLoseDist, fLoseTime) bChaserLost[iTemp] = TRUE DELETE_PED(pedChasers[iTemp]) DELETE_VEHICLE(vehChasers[iTemp]) IF DOES_BLIP_EXIST(blipChasers[iTemp]) REMOVE_BLIP(blipChasers[iTemp]) ENDIF PRINTLN("DELETING CHASERS 1") ENDIF ENDREPEAT ELSE IF bEndForced bEndForced = FALSE ENDIF ENDIF IF NOT bChaserLost[0] OR NOT bChaserLost[1] REPEAT COUNT_OF(pedChasers) iTemp IF NOT bChaserLost[iTemp] IF DOES_ENTITY_EXIST(pedChasers[iTemp]) AND (IS_PED_INJURED(pedChasers[iTemp]) OR IS_ENTITY_DEAD(pedChasers[iTemp])) OR NOT DOES_ENTITY_EXIST(pedChasers[iTemp]) bChaserLost[iTemp] = TRUE ENDIF ENDIF ENDREPEAT ENDIF ENDPROC BOOL bConvCanPlay = FALSE BOOL bCanCrash = FALSE BOOL bOffthisFrame = FALSE PROC SPEEDOPHILE_CHASE2() //vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID()) //INT iCountCoords //REPEAT COUNT_OF(vehChasers) iCountCoords // IF NOT IS_PED_INJURED(pedChasers[iCountCoords]) // vChaserCoords[iCountCoords] = GET_ENTITY_COORDS(pedChasers[iCountCoords]) // ENDIF //ENDREPEAT IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) IF NOT bCanCrash AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND VMAG2(GET_ENTITY_VELOCITY(vehPlayerSeashark)) > 18*18 bCanCrash = TRUE ENDIF IF bCanCrash AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND VMAG2(GET_ENTITY_VELOCITY(vehPlayerSeashark)) < 15*15 bCanCrash = FALSE ENDIF IF NOT bOffthisFrame IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) bOffthisFrame = TRUE ENDIF ELSE bOffthisFrame = FALSE ENDIF IF bOffthisFrame AND bCanCrash AND IS_PED_RAGDOLL(PLAYER_PED_ID()) SET_ENTITY_HEALTH(PLAYER_PED_ID(), 0) ENDIF #IF IS_DEBUG_BUILD IF bCanCrash DRAW_DEBUG_TEXT_2D("Mike can crash", <<0.9,0.5,0>>) ENDIF DRAW_DEBUG_TEXT(GET_STRING_FROM_FLOAT(VMAG(GET_ENTITY_VELOCITY(vehPlayerSeashark))), GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0,0,1.5>> ) #ENDIF ENDIF eCurrentChaseSection = GET_CURRENT_CHASE_ENUM() IF eCurrentChaseSection < FAM2_CHASE_SEEK_AND_DESTROY AND eCurrentChaseSection > eHighestSection eHighestSection = eCurrentChaseSection ENDIF IF eCurrentChaseSection != ePreviousChaseSection IF NOT IS_BIT_SET(iSectionsHit, ENUM_TO_INT(eCurrentChaseSection)) SET_BIT(iSectionsHit, ENUM_TO_INT(eCurrentChaseSection)) ENDIF IF DOES_ENTITY_EXIST(vehChasers[0]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[0]) STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[0]) ENDIF ENDIF IF DOES_ENTITY_EXIST(vehChasers[1]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[1]) STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[1]) ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1) // IF NOT IS_PED_INJURED(pedChasers[0]) // EXPLODE_PED_HEAD(pedChasers[0]) // ENDIF // IF NOT IS_PED_INJURED(pedChasers[1]) // EXPLODE_PED_HEAD(pedChasers[1]) // ENDIF EXPLODE_PED_HEAD(pedTracy) ENDIF #ENDIF IF IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vehPlayerSeashark) AND TIMERA() > 500 STOP_PLAYBACK_RECORDED_VEHICLE(vehPlayerSeashark) ENDIF ePreviousChaseSection = eCurrentChaseSection IF NOT DOES_ENTITY_EXIST(objFitTest) REQUEST_MODEL(PROP_LD_TEST_01) IF HAS_MODEL_LOADED(PROP_LD_TEST_01) objFitTest = CREATE_OBJECT(PROP_LD_TEST_01, v_jimmy_end_pos) SET_ENTITY_COLLISION(objFitTest, FALSE) SET_ENTITY_VISIBLE(objFitTest, FALSE) FREEZE_ENTITY_POSITION(objFitTest, TRUE) ENDIF ENDIF SWITCH iStageProgress // set up all lines and create chasers. CASE 0 SET_MAX_WANTED_LEVEL(0) IF INIT_RECORDING_PATHS() AND CREATE_CHASER(0) AND CREATE_CHASER(1) AND HAVE_ALL_CANAL_PATHS_LOADED() AND CREATE_WATER_PED() IF NOT IS_PED_INJURED(pedBoatDancer[0]) TASK_SMART_FLEE_PED(pedBoatDancer[0], PLAYER_PED_ID(), 300, -1) SET_PED_RELATIONSHIP_GROUP_HASH(pedBoatDancer[0], rgChasers) ENDIF IF NOT IS_PED_INJURED(pedTracy) REQUEST_ANIM_DICT("missfam2_tracy_jetski") SET_VEHICLE_ENGINE_HEALTH(vehPlayerSeashark, 1000) SET_ENTITY_PROOFS(vehPlayerSeashark, TRUE, FALSE,FALSE,TRUE,FALSE) SET_PED_SUFFERS_CRITICAL_HITS(pedTracy, FALSE) SET_ENTITY_HEALTH(pedTracy, 5000) SET_PED_COMBAT_ATTRIBUTES(pedTracy, CA_CAN_TAUNT_IN_VEHICLE, FALSE) SET_PED_COMBAT_ATTRIBUTES(pedTracy, CA_DO_DRIVEBYS, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedTracy, TRUE) SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), TRUE) SET_ENTITY_INVINCIBLE(pedTracy, TRUE) ENDIF SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rgChasers, RELGROUPHASH_PLAYER) REMOVE_PED_FOR_DIALOGUE(sSpeech, 2) ADD_PED_FOR_DIALOGUE(sSpeech, 2, pedTracy, "TRACEY") ALLOW_DIALOGUE_IN_WATER(TRUE) INIT_CHASE_BOUNDS() INIT_CANAL_PATHS() iChaseStage = 0 fGlobalSpeedVal = 0 fKillTime = 0 bEndForced = FALSE bCanLosePeds = FALSE bChaserLost[0] = FALSE bChaserLost[1] = FALSE bKilledOne = FALSE bKillLineDone = FALSE bShooting = FALSE bShootLineDone = FALSE bKilledBoth = FALSE bCanalCatchupDone = FALSE bConvCanPlay = FALSE eCurrentCanalSection = FAM2_CS_BOTTOM ePreviousCanalSection = FAM2_CS_INVALID eHighestSection = FAM2_CHASE_OPEN_SEA TRIGGER_MUSIC_EVENT("FAM2_ON_JETSKI") SET_ENTITY_REQUIRES_MORE_EXPENSIVE_RIVER_CHECK(vehChasers[0], TRUE) SET_ENTITY_REQUIRES_MORE_EXPENSIVE_RIVER_CHECK(vehChasers[1], TRUE) START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehChasers[0], 101, "famtwo", 15, DRIVINGMODE_PLOUGHTHROUGH) START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehChasers[1], 102, "famtwo", 15, DRIVINGMODE_PLOUGHTHROUGH) START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehPlayerSeashark, 1, "famtwoplayer", 24, DRIVINGMODE_PLOUGHTHROUGH) ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehChasers[0], "FAMILY_2_ENEMY_JETSKI_Group") ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehChasers[1], "FAMILY_2_ENEMY_JETSKI_Group") SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_HARD) IF DOES_ENTITY_EXIST(vehPlayerSeashark) AND IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_INITIAL_PLAYER_STATION("OFF") SET_VEH_RADIO_STATION(vehPlayerSeashark, "OFF") SET_ENTITY_REQUIRES_MORE_EXPENSIVE_RIVER_CHECK(vehPlayerSeashark, TRUE) ENDIF IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_2_JETSKI_CHASE") START_AUDIO_SCENE("FAMILY_2_JETSKI_CHASE") ENDIF SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, TRUE, TRUE) SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING) SETTIMERB(0) REPLAY_RECORD_BACK_FOR_TIME(0.0, 8.0, REPLAY_IMPORTANCE_HIGHEST) SET_WATER_CALM(FALSE, 4.0) iSectionsHit = 0 iStageProgress++ IF bReplaySetupRequired iStageProgress = -1 ENDIF ENDIF BREAK CASE -1 REQUEST_IPL("smboat") WHILE NOT IS_IPL_ACTIVE("smBoat") WAIT(0) ENDWHILE iStageProgress = 1 bReplaySetupRequired = FALSE BREAK CASE 1 IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(500) ENDIF IF DOES_CAM_EXIST(camRescueOutro) IF TIMERB() > 1000 DESTROY_CAM(camRescueOutro) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(sSpeech.PedInfo[7].Index) OR IS_PED_INJURED(sSpeech.PedInfo[7].Index) IF NOT IS_PED_INJURED(pedChasers[0]) ADD_PED_FOR_DIALOGUE(sSpeech, 7, pedChasers[0], "FAM2MAN2") ELIF NOT IS_PED_INJURED(pedChasers[1]) ADD_PED_FOR_DIALOGUE(sSpeech, 7, pedChasers[1], "FAM2MAN2") ENDIF ENDIF IF NOT bPlayerShouldDie IF bPedsSetToKillPlayer INT iKill FOR iKill = 0 TO 1 IF NOT IS_PED_INJURED(pedChasers[iKill]) SET_PED_COMBAT_ABILITY(pedChasers[iKill], CAL_POOR) SET_PED_COMBAT_RANGE(pedChasers[iKill], CR_FAR) SET_PED_ACCURACY(pedChasers[iKill], 0) SET_PED_FIRING_PATTERN(pedChasers[iKill], FIRING_PATTERN_DELAY_FIRE_BY_ONE_SEC) SET_PED_SHOOT_RATE(pedChasers[iKill], 50) ENDIF ENDFOR bPedsSetToKillPlayer = FALSE ENDIF IF (eCurrentChaseSection = FAM2_CHASE_SEEK_AND_DESTROY AND iChaseStage < 100) OR bPlayerBehind[0] OR bPlayerBehind[1] OR eCurrentChaseSection < eHighestSection OR bPlayerIdleInCanals OR IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) IF NOT IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) #IF IS_DEBUG_BUILD IF (eCurrentChaseSection = FAM2_CHASE_SEEK_AND_DESTROY AND iChaseStage < 100) PRINTLN("KILLING PLAYER FOR GOING OUT OF BOUNDS") ENDIF IF bPlayerBehind[0] OR bPlayerBehind[1] PRINTLN("KILLING PLAYER FOR BEING TOO SLOW") ENDIF IF bPlayerIdleInCanals PRINTLN("KILLING PLAYER FOR BEING TOO LAZY IN CANALS") ENDIF IF eCurrentChaseSection < eHighestSection PRINTLN("KILLING PLAYER FOR GOING BACKWARDS") ENDIF IF (IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark)) PRINTLN("KILLING PLAYER FOR BEING OUT OF HIS VEHICLE") ENDIF #ENDIF iChaserLastWarp[0] = GET_GAME_TIMER() iChaserLastWarp[1] = GET_GAME_TIMER() - 1500 bPlayerShouldDie = TRUE ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD PRINTLN("KILLING PLAYER!") #ENDIF IF fKillTime > 10.0 AND fKillTime < 12.0 // IF IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) // SET_PED_TO_RAGDOLL(pedTracy, 5000, 10000, TASK_RELAX) // fKillTime = 13.0 // ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) IF (NOT IS_PED_INJURED(pedChasers[0]) AND VDIST2(GET_ENTITY_COORDS(pedChasers[0]), GET_ENTITY_COORDS(vehPlayerSeashark)) < 15*15) OR (NOT IS_PED_INJURED(pedChasers[1]) AND VDIST2(GET_ENTITY_COORDS(pedChasers[1]), GET_ENTITY_COORDS(vehPlayerSeashark)) < 15*15) fKillTime += GET_FRAME_TIME() ENDIF ENDIF ENDIF IF NOT bPedsSetToKillPlayer INT iKill FOR iKill = 0 TO 1 IF DOES_ENTITY_EXIST(pedChasers[iKill]) AND NOT IS_PED_INJURED(pedChasers[iKill]) SET_PED_COMBAT_ABILITY(pedChasers[iKill], CAL_AVERAGE) SET_PED_COMBAT_RANGE(pedChasers[iKill], CR_FAR) SET_PED_ACCURACY(pedChasers[iKill], 20) SET_PED_FIRING_PATTERN(pedChasers[iKill], FIRING_PATTERN_SINGLE_SHOT) SET_PED_SHOOT_RATE(pedChasers[iKill], 40) IF DOES_ENTITY_EXIST(vehChasers[iKill]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[iKill]) STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[iKill]) ENDIF ENDIF ENDIF ENDFOR bPedsSetToKillPlayer = TRUE ELSE IF (eCurrentChaseSection != FAM2_CHASE_CANALS OR (eCurrentChaseSection = FAM2_CHASE_CANALS AND eCurrentCanalSection = FAM2_CS_BOTTOM)) AND NOT bEndForced MANAGE_CHASER_WARPING() ENDIF ENDIF IF NOT bPlayerBehind[0] AND NOT bPlayerBehind[1] AND eCurrentChaseSection <> FAM2_CHASE_SEEK_AND_DESTROY AND eCurrentChaseSection >= eHighestSection AND NOT bPlayerIdleInCanals AND (IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark)) bPlayerShouldDie = FALSE ENDIF IF IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) bPlayerShouldDie = FALSE ENDIF ENDIF IF NOT IS_PED_INJURED(pedBoatDancer[0]) IF VDIST2(GET_ENTITY_COORDS(pedBoatDancer[0]), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100*100 SET_PED_AS_NO_LONGER_NEEDED(pedBoatDancer[0]) ENDIF ENDIF RUN_SEASHARK_HELP() RUN_CHASERS() IF iChaseStage < 100 IF NOT bShooting IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN) AND IS_PED_SHOOTING(PLAYER_PED_ID()) bShooting = TRUE ENDIF ELSE IF NOT bShootLineDone IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_SHOOT", CONV_PRIORITY_HIGH) bShootLineDone = TRUE ENDIF ENDIF ENDIF IF NOT bKilledOne OR NOT bKilledBoth INT iKillCheck bKilledBoth = TRUE REPEAT COUNT_OF(pedChasers) iKillCheck IF DOES_ENTITY_EXIST(pedChasers[iKillCheck]) IF (IS_PED_INJURED(pedChasers[iKillCheck]) OR IS_ENTITY_DEAD(pedChasers[iKillCheck])) bKilledOne = TRUE ELSE bKilledBoth = FALSE ENDIF ENDIF ENDREPEAT ENDIF IF bKilledOne AND NOT bKillLineDone AND NOT bKilledBoth IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF iChaseStage < 50 OR iChaseStage >= 100 iSavedStage = iChaseStage PRINTLN("IN kill check setting isavedstage to ", iSavedStage) ENDIF IF DOES_BLIP_EXIST(blipPlayerVeh) REMOVE_BLIP(blipPlayerVeh) ENDIF iChaseStage = 50 bKillLineDone = TRUE ENDIF ENDIF IF eCurrentChaseSection = FAM2_CHASE_TUNNELS IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) IF IS_MESSAGE_BEING_DISPLAYED() AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CLEAR_PRINTS() ENDIF ENDIF ENDIF IF iChaseStage < 5 IF eCurrentChaseSection = FAM2_CHASE_TUNNELS iChaseStage = 5 ENDIF ENDIF CHECK_FOR_LOSING_CHASERS() ENDIF IF iChaseStage <> 60 AND iChaseStage <> 61 IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) IF iChaseStage < 50 OR iChaseStage >= 100 iSavedStage = iChaseStage PRINTLN("IN vehicle check setting isavedstage to ", iSavedStage) ENDIF iChaseStage = 60 ENDIF ENDIF IF DOES_BLIP_EXIST(blipDest) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) IF eCurrentChaseSection = FAM2_CHASE_TUNNELS REMOVE_BLIP(blipDest) ENDIF ENDIF SWITCH iChaseStage CASE 0 IF HAS_ANIM_DICT_LOADED("missfam2_tracy_jetski") IF NOT IS_PED_INJURED(pedTracy) IF NOT IS_ENTITY_PLAYING_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_a") IF IS_CHASER_BEHIND_TRACEY(0) TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) ELSE IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_COMING", CONV_PRIORITY_HIGH) TRIGGER_MUSIC_EVENT("FAM2_COMING") TASK_LOOK_AT_ENTITY(pedTracy, pedChasers[0], -1) iChaseStage++ SETTIMERA(0) ENDIF ENDIF ELSE IF GET_ENTITY_ANIM_CURRENT_TIME(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_a") > 0.12 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_COMING", CONV_PRIORITY_HIGH) TRIGGER_MUSIC_EVENT("FAM2_COMING") iChaseStage++ SETTIMERA(0) ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE 1 IF TIMERA() > 1000 VECTOR vToTunnel vToTunnel = vOutlet - GET_ENTITY_COORDS(vehPlayerSeashark) VECTOR vForward vForward = GET_ENTITY_FORWARD_VECTOR(vehPlayerSeashark) FLOAT fAngle fAngle = GET_ANGLE_BETWEEN_2D_VECTORS(vForward.x, vForward.y, vToTunnel.x, vToTunnel.y) IF fAngle > 180 fAngle -= 360 ENDIF IF fAngle < -180 fAngle += 360 ENDIF IF fAngle < 0 IF fAngle > -90 IF NOT IS_PED_INJURED(pedTracy) TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_point_right", SLOW_BLEND_IN) ENDIF ENDIF ELSE IF fAngle < 90 IF NOT IS_PED_INJURED(pedTracy) TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_point_left", SLOW_BLEND_IN) ENDIF ENDIF ENDIF ENDIF IF (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR TIMERA() > 3000) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) AND NOT DOES_BLIP_EXIST(blipDest) blipDest = CREATE_BLIP_FOR_COORD(vOutlet) iChaseStage++ ENDIF BREAK CASE 2 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_MRESP", CONV_PRIORITY_HIGH) TASK_LOOK_AT_COORD(PLAYER_PED_ID(), vOutlet, 7500, SLF_SLOW_TURN_RATE) SETTIMERA(0) iChaseStage++ ENDIF BREAK CASE 3 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT("FM2_CHASE1", DEFAULT_GOD_TEXT_TIME, 1) SETTIMERA(0) iChaseStage++ ENDIF BREAK CASE 4 IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vOutlet) > 30*30 DO_TRACY_PANIC_LINES("FAM2_OLREM", "", 9000) ENDIF BREAK CASE 5 IF (DOES_ENTITY_EXIST(pedChasers[0]) AND NOT IS_PED_INJURED(pedChasers[0]) AND IS_PED_SHOOTING(pedChasers[0])) OR (DOES_ENTITY_EXIST(pedChasers[1]) AND NOT IS_PED_INJURED(pedChasers[1]) AND IS_PED_SHOOTING(pedChasers[1])) iChaseStage++ ENDIF BREAK CASE 6 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT IS_PED_INJURED(pedTracy) IF NOT IS_ENTITY_PLAYING_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_c") IF IS_CHASER_BEHIND_TRACEY(0) TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_c", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) ELSE IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_HESHOOT", CONV_PRIORITY_HIGH) TRIGGER_MUSIC_EVENT("FAM2_SHOOTING") TASK_LOOK_AT_ENTITY(pedTracy, pedChasers[0], -1) iChaseStage++ SETTIMERA(0) ENDIF ENDIF ELSE IF GET_ENTITY_ANIM_CURRENT_TIME(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_c") > 0.12 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_HESHOOT", CONV_PRIORITY_HIGH) TRIGGER_MUSIC_EVENT("FAM2_SHOOTING") iChaseStage++ SETTIMERA(0) ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE 7 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT("FM2_CHASE3", DEFAULT_GOD_TEXT_TIME, 1) SETTIMERB(0) iChaseStage++ ENDIF BREAK CASE 8 IF TIMERB() > 5000 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_LOSEM", CONV_PRIORITY_HIGH) iChaseStage ++ ENDIF ENDIF ENDIF BREAK CASE 9 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_MULTIPART_CONVERSATION_WITH_4_LINES(sSpeech, sConvBlock, "FAM2_WHO", "FAM2_WHO_3", "FAM2_WHO", "FAM2_WHO_5", "FAM2_WHO", "FAM2_WHO_7", "FAM2_WHO", "FAM2_WHO_9", CONV_PRIORITY_HIGH) iChaseStage++ ENDIF ENDIF BREAK CASE 10 DO_TRACY_PANIC_LINES("FAM2_TSHOUT", "FAM2_MSHOUT") IF eCurrentChaseSection = FAM2_CHASE_CANALS iChaseStage++ ENDIF BREAK CASE 11 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_LOSET", CONV_PRIORITY_HIGH) iChaseStage++ ENDIF BREAK CASE 12 DO_TRACY_PANIC_LINES("FAM2_TSHOUT", "FAM2_MSHOUT") BREAK CASE 50 KILL_FACE_TO_FACE_CONVERSATION() IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_KILLONE", CONV_PRIORITY_HIGH) iChaseStage++ ENDIF BREAK CASE 51 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_KILLER", CONV_PRIORITY_HIGH) iChaseStage = iSavedStage ENDIF BREAK CASE 60 KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) IF NOT DOES_BLIP_EXIST(blipPlayerVeh) blipPlayerVeh = CREATE_BLIP_FOR_VEHICLE(vehPlayerSeashark) PRINT_GOD_TEXT(gtGetBackInSeashark) ENDIF IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) ENDIF iTraceyPanicTimer = GET_GAME_TIMER() iChaseStage++ ENDIF BREAK CASE 61 IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) IF NOT IS_MESSAGE_BEING_DISPLAYED() IF NOT IS_PED_INJURED(pedTracy) AND IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), pedTracy, <<20, 20, 20>>) AND IS_ENTITY_IN_WATER(PLAYER_PED_ID()) AND NOT IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID()) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark, TRUE) IF GET_GAME_TIMER() - iTraceyPanicTimer > 6000 IF CREATE_CONVERSATION(sSpeech, sConvBlock, "FAM2_FALL", CONV_PRIORITY_HIGH) iTraceyPanicTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF (eCurrentChaseSection = FAM2_CHASE_OPEN_SEA OR eCurrentChaseSection = FAM2_CHASE_SEEK_AND_DESTROY) AND NOT DOES_BLIP_EXIST(blipDest) AND iSavedStage < 5 blipDest = CREATE_BLIP_FOR_COORD(vOutlet) ENDIF IF DOES_BLIP_EXIST(blipPlayerVeh) REMOVE_BLIP(blipPlayerVeh) ENDIF CLEAR_PRINTS() iChaseStage = iSavedStage ENDIF ENDIF BREAK CASE 100 IF DOES_BLIP_EXIST(blipChasers[0]) REMOVE_BLIP(blipChasers[0]) ENDIF IF DOES_BLIP_EXIST(blipChasers[1]) REMOVE_BLIP(blipChasers[1]) ENDIF IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) ENDIF KILL_FACE_TO_FACE_CONVERSATION() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) IF NOT IS_PED_INJURED(pedTracy) IF NOT IS_ENTITY_PLAYING_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_d") TASK_PLAY_ANIM(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_d", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) ELSE IF GET_ENTITY_ANIM_CURRENT_TIME(pedTracy, "missfam2_tracy_jetski", "tracy_jetski_d") > 0.25 IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_JETSKI_CHASE") STOP_AUDIO_SCENE("FAMILY_2_JETSKI_CHASE") ENDIF TASK_CLEAR_LOOK_AT(pedTracy) iChaseStage++ ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE 101 STRING sTraceyEndConv IF bKilledBoth sTraceyEndConv = "FAM2_KILLTWO" ELIF bKilledOne sTraceyEndCOnv = "FAM2_ESCAPE" ELSE sTraceyEndCOnv = "FAM2_LOST" ENDIF IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) bConvCanPlay = TRUE ENDIF MANAGE_CONVERSATION(sTraceyEndConv, bConvCanPlay) IF in_car_conv_started AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT in_car_conv_on_hold REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0) in_car_conv_started = FALSE iChaseStage++ ENDIF BREAK CASE 102 STRING sMichaelEndConv IF bKilledBoth OR bKilledOne sMichaelEndConv = "FAM2_KILLER2" ELSE sMichaelEndConv = "FAM2_TALK1" ENDIF IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) bConvCanPlay = TRUE ENDIF MANAGE_CONVERSATION(sMichaelEndConv, bConvCanPlay) IF in_car_conv_started AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT in_car_conv_on_hold REMOVE_ANIM_DICT("missfam2_tracy_jetski") SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_DEFAULT) in_car_conv_started = FALSE GO_TO_STAGE(stage_drive_to_beach) ENDIF BREAK ENDSWITCH IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) AND NOT IS_ENTITY_IN_WATER(PLAYER_PED_ID()) AND NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID()) AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID()) AND VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedTracy)) > 30 iStageProgress = 2 ENDIF IF NOT IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) iStageProgress = 3 ENDIF IF NOT IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) OR IS_SEASHARK_GROUNDED(vehPlayerSeashark, fPlayerGroundTime, bPlayerGroundingChecked) iStageProgress = 4 ENDIF IF iChaseStage < 100 AND (IS_PED_INJURED(pedChasers[0]) OR IS_ENTITY_DEAD(pedChasers[0]) OR bChaserLost[0]) AND (IS_PED_INJURED(pedChasers[1]) OR IS_ENTITY_DEAD(pedChasers[1]) OR bChaserLost[1]) AND iChaseStage != 60 AND iChaseStage != 61 SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) TRIGGER_MUSIC_EVENT("FAM2_LOST_HIM") iChaseStage = 100 ENDIF IF iStageProgress > 1 CLEAR_PRINTS() KILL_FACE_TO_FACE_CONVERSATION() INT iTemp REPEAT COUNT_OF(pedChasers) iTemp IF NOT IS_PED_INJURED(pedChasers[iTemp]) AND DOES_ENTITY_EXIST(vehChasers[iTemp]) AND IS_VEHICLE_DRIVEABLE(vehChasers[iTemp]) AND IS_PED_IN_VEHICLE(pedChasers[iTemp], vehChasers[iTemp]) CLEAR_PED_TASKS(pedChasers[iTemp]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChasers[iTemp]) STOP_PLAYBACK_RECORDED_VEHICLE(vehChasers[iTemp]) ENDIF ENDIF ENDREPEAT IF DOES_BLIP_EXIST(blipDest) REMOVE_BLIP(blipDest) ENDIF SETTIMERA(0) ENDIF BREAK CASE 2 IF TIMERA() > 2000 Mission_Failed("FM2_TRAAB") ENDIF BREAK CASE 3 IF TIMERA() > 2000 Mission_Failed("FM2_TRAFELL") ENDIF BREAK CASE 4 IF TIMERA() > 1000 SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_HARD) IF IS_ENTITY_DEAD(vehPlayerSeashark) Mission_Failed("FM2_SKIDED") ELSE Mission_Failed("FM2_SKIGRN") ENDIF ENDIF BREAK ENDSWITCH ENDPROC //╞═════════╡CUTSCENES BOOL bLoadScene RAYFIRE_INDEX iTVObject PROC RUN_INTRO_CUTSCENE() SWITCH iStageProgress CASE 0 SET_STATIC_EMITTER_ENABLED("SE_MICHAELS_HOUSE_RADIO", FALSE) bLoadScene = FALSE IF NOT IS_CUTSCENE_ACTIVE() REQUEST_CUTSCENE("family_2_int") PRINTLN("SET CUTSCENE PED ASSETS IN MISSION SCRIPT") iStageProgress = -1 ELSE iStageProgress++ ENDIF BREAK CASE -1 IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_OUTFIT("Michael", GET_PLAYER_PED_MODEL(CHAR_MICHAEL), OUTFIT_P0_YOGA_FLIP_FLOPS) iStageProgress = 1 ENDIF BREAK CASE 1 IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() IF HAS_THIS_CUTSCENE_LOADED_WITH_FAILSAFE("family_2_int") SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE) IF NOT DOES_ENTITY_EXIST(pedJimmy) PRINTLN("CREATING CUTSCENE JIMMY") REGISTER_ENTITY_FOR_CUTSCENE(pedJimmy, "Jimmy", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_JIMMY)) ELIF NOT IS_PED_INJURED(pedJimmy) PRINTLN("ANIMATING SCRIPT JIMMY") REGISTER_ENTITY_FOR_CUTSCENE(pedJimmy, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF PRE_INIT_ASSETS(stage_drive_to_venice) INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START() CLEAR_HELP() START_CUTSCENE() REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) END_SRL() iStageProgress++ ELSE REMOVE_CUTSCENE() iStageProgress = 0 ENDIF ENDIF BREAK CASE 2 SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY") SET_WIND(0.1) IF DOES_ENTITY_EXIST(objDoorL) DELETE_OBJECT(objDoorL) REMOVE_MODEL_HIDE(vLeftDoorPos, 1.0, V_ILEV_MM_DOORM_L) ENDIF IF DOES_ENTITY_EXIST(objDoorR) DELETE_OBJECT(objDoorR) REMOVE_MODEL_HIDE(vRightDoorPos, 1.0, V_ILEV_MM_DOORM_R) ENDIF IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_L)) DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), 0.0, FALSE, FALSE) DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE) ENDIF IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_R)) DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), 0.0, FALSE, FALSE) DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE) ENDIF REMOVE_ANIM_DICT("missfam2mcs_intp1") CLEAR_PED_TASKS(PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(objDoorL) STOP_SYNCHRONIZED_ENTITY_ANIM(objDoorL, INSTANT_BLEND_OUT, TRUE) SET_OBJECT_AS_NO_LONGER_NEEDED(objDoorL) ENDIF IF DOES_ENTITY_EXIST(objDoorR) STOP_SYNCHRONIZED_ENTITY_ANIM(objDoorR, INSTANT_BLEND_OUT, TRUE) SET_OBJECT_AS_NO_LONGER_NEEDED(objDoorR) ENDIF REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300) SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE, DEFAULT, DEFAULT, TRUE, FALSE) // SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL) CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID()) iStageProgress++ BREAK CASE 3 IF NOT DOES_ENTITY_EXIST(pedJimmy) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Jimmy")) pedJimmy = GET_PED_INDEX_FROM_ENTITY_INDEX((GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Jimmy"))) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy") IF NOT IS_PED_INJURED(pedJimmy) SET_ENTITY_COORDS(pedJimmy, vJimmyCoords) SET_ENTITY_HEADING(pedJimmy, fJimmyHeading) FORCE_PED_MOTION_STATE(pedJimmy, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT) TASK_FOLLOW_WAYPOINT_RECORDING(pedJimmy, sJimmyStairRoute, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, -1) PRINTLN("SETTING JIMMY") ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") AND CAN_SET_EXIT_STATE_FOR_CAMERA() println("setting motion state here 1") FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK) SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK) IF NOT IS_PED_INJURED(pedJimmy) SET_PED_AS_BUDDY(pedJimmy) ENDIF ENDIF IF NOT bLoadScene IF IS_SCREEN_FADED_OUT() AND WAS_CUTSCENE_SKIPPED() PRINTLN("loading scene for skip") SETTIMERA(0) IF NEW_LOAD_SCENE_START_SPHERE(vPlayerStartCoords, 30, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE) PRINTLN("Starting load sphere") WHILE NOT IS_NEW_LOAD_SCENE_LOADED() AND TIMERA() < 5000 PRINTLN("loading sphere...") DO_SCREEN_FADE_OUT(0) WAIT(0) ENDWHILE NEW_LOAD_SCENE_STOP() PRINTLN("Finished load sphere") bLoadScene = TRUE ENDIF ENDIF ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() IF NOT DOES_ENTITY_EXIST(vehMikesCar) IF IS_PLAYER_VEHICLE_IN_AREA(CHAR_MICHAEL, VEHICLE_TYPE_CAR, v_car_start_coords, 100.0) DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_MICHAEL, VEHICLE_TYPE_CAR) ENDIF DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SKIP_CUTSCENE) CREATE_PLAYER_VEHICLE(vehMikesCar, CHAR_MICHAEL, v_car_start_coords, f_car_start, TRUE, VEHICLE_TYPE_CAR) ENDIF IF NOT IS_CUTSCENE_ACTIVE() PRINTLN("Cutscene over") SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END() GO_TO_STAGE(stage_drive_to_venice) REQUEST_ADDITIONAL_TEXT("FAMILY2", MISSION_TEXT_SLOT) REQUEST_ADDITIONAL_TEXT(sConvBlock, MISSION_DIALOGUE_TEXT_SLOT) IF NOT IS_PED_INJURED(pedJimmy) SET_PED_AS_BUDDY(pedJimmy) ENDIF REPLAY_STOP_EVENT() println("setting motion state here 2") IF IS_VALID_INTERIOR(intMikeMansion) UNPIN_INTERIOR(intMikeMansion) ENDIF iTVObject = GET_RAYFIRE_MAP_OBJECT(<<-809.9620, 170.9190, 75.7407>>, 3, "des_tvsmash") IF DOES_RAYFIRE_MAP_OBJECT_EXIST(iTVObject) SET_STATE_OF_RAYFIRE_MAP_OBJECT(iTVObject, RFMO_STATE_ENDING) ENDIF IF IS_SCREEN_FADED_OUT() OR WAS_CUTSCENE_SKIPPED() IF NOT IS_PED_INJURED(pedJimmy) SET_ENTITY_COORDS(pedJimmy, vJimmyCoords) SET_ENTITY_HEADING(pedJimmy, fJimmyHeading) FORCE_PED_MOTION_STATE(pedJimmy, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT) TASK_FOLLOW_WAYPOINT_RECORDING(pedJimmy, sJimmyStairRoute, 3, EWAYPOINT_DEFAULT, -1) PRINTLN("Setting Jimmy coords and forcing motion state") ENDIF WAIT(0) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK) PRINTLN("Setting Player coords and forcing motion state") ENDIF CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MISSION_VEH) SET_STATIC_EMITTER_ENABLED("SE_MICHAELS_HOUSE_RADIO", TRUE) SET_WIDESCREEN_BORDERS(FALSE, 0) DO_SCREEN_FADE_IN(500) ENDIF PRINTLN("frame") BREAK ENDSWITCH ENDPROC PROC RUN_PIER_CUTSCENE() SWITCH iStageProgress CASE 0 IF NOT IS_CUTSCENE_ACTIVE() REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("family_2_mcs_2", CS_SECTION_2 | CS_SECTION_3) iStageProgress++ ELSE iStageProgress+=2 ENDIF BREAK CASE 1 IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() PRINTLN("SETTING components from player") SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) iStageProgress++ ENDIF BREAK CASE 2 KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() IF HAS_THIS_CUTSCENE_LOADED_WITH_FAILSAFE("family_2_mcs_2") SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE) IF NOT IS_PED_INJURED(pedJimmy) SET_PED_SWEAT(pedJimmy, 100) REGISTER_ENTITY_FOR_CUTSCENE(pedJimmy, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlayerBike) STOP_PLAYBACK_RECORDED_VEHICLE(vehPlayerBike) ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(vehJimmyBike) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehJimmyBike) FREEZE_ENTITY_POSITION(vehJimmyBike, FALSE) STOP_PLAYBACK_RECORDED_VEHICLE(vehJimmyBike) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(vehJimmyBike, "FAM_2_Jimmys_bike", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) START_CUTSCENE() PRINTLN("Cutscene starting") CLEAR_PRINTS() CLEAR_HELP() INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START() SET_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID(), PED_COMP_TORSO, 26, 0) SET_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID(), PED_COMP_LEG, 27, 0) IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_BIKE_RACE_JIMMY") STOP_AUDIO_SCENE("FAMILY_2_BIKE_RACE_JIMMY") ENDIF SET_PED_WALLA_DENSITY(0.0, 0.0) iStageProgress++ ELSE PRINTLN("WRONG CUT LOADED") REMOVE_CUTSCENE() REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("family_2_mcs_2", CS_SECTION_1 | CS_SECTION_3) ENDIF ENDIF BREAK CASE 3 IF IS_VEHICLE_DRIVEABLE(vehPlayerBike) IF bJimmyWon SET_ENTITY_COORDS(vehPlayerBike, <<-1848.194702,-1218.705688,12.583574>>) SET_ENTITY_HEADING(vehPlayerBike, 129.352661) ELSE SET_ENTITY_COORDS(vehPlayerBike, <<-1867.382690,-1212.197876,12.574015>>) SET_ENTITY_HEADING(vehPlayerBike, -0.030485) ENDIF SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayerBike) ACTIVATE_PHYSICS(vehPlayerBike) ENDIF CLEAR_AREA(<<-1859.0448, -1215.5027, 12.0665>>, 2, TRUE) IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(500) ENDIF REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE) iStageProgress++ BREAK CASE 4 IF IS_CUTSCENE_ACTIVE() AND IS_CUTSCENE_PLAYING() OVERRIDE_LODSCALE_THIS_FRAME(1.5) IF GET_CUTSCENE_TIME() > 90500 DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") REPLAY_STOP_EVENT() SETUP_CLOTHES(TRUE) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() PRINTLN("\n\n\nMIKE'S EXIT FRAME\n\n\n") FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_SPRINT, FALSE, FAUS_CUTSCENE_EXIT) PRINTLN("FAMILY 2 CUT EXIT - RUN A") SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_SPRINT, iRunTime) PRINT_HELP("FM2_DIVOFF") ENDIF // IF bMikeOut // AND (IS_SCREEN_FADED_IN() OR IS_SCREEN_FADING_IN()) // SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_SPRINT) // ENDIF IF NOT IS_CUTSCENE_ACTIVE() SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) IF IS_VEHICLE_DRIVEABLE(vehJimmyBike) SET_ENTITY_COORDS_NO_OFFSET(vehJimmyBike, <<-1858.6121, -1214.5627, 12.3070>>) SET_ENTITY_QUATERNION(vehJimmyBike, 0.3880, -0.4380, 0.4777, 0.6553) APPLY_FORCE_TO_ENTITY(vehJimmyBike, APPLY_TYPE_FORCE, <<0,0,-0.01>>, <<0,0,0>>, 0, TRUE, TRUE, FALSE) ENDIF RELEASE_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID()) SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END() GO_TO_STAGE(stage_go_to_yacht) ENDIF #IF IS_DEBUG_BUILD DEBUG_CUTSCENE_CONTROL() #ENDIF BREAK ENDSWITCH ENDPROC BOOL bGrabMusicPlayed = FALSE BOOL bRadioKilled = FALSE BOOL bWaterPedFlee = FALSE BOOL bCutsceneSkipped = FALSE FLOAT fHeight BOOL bWaterCalm PROC RUN_RESCUE_CUTSCENE() SWITCH iStageProgress CASE 0 bCutsceneSkipped = FALSE REQUEST_VEHICLE_RECORDING(1, "famtwoplayer") REQUEST_VEHICLE_RECORDING(101, "famtwo") REQUEST_VEHICLE_RECORDING(102, "famtwo") REQUEST_ANIM_DICT("missfam2_tracy_jetski") IF NOT IS_CUTSCENE_ACTIVE() PRINTLN("REQUESTING CUTSCENE IN CUT STAGE") REQUEST_CUTSCENE("family_2_mcs_3") iStageProgress++ ELSE iStageProgress+=2 ENDIF bWaterPedFlee = FALSE BREAK CASE -1 REQUEST_IPL("smboat") WHILE NOT IS_IPL_ACTIVE("smBoat") WAIT(0) ENDWHILE iStageProgress = 3 bReplaySetupRequired = FALSE BREAK CASE 1 IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(pedBoatDancer[0]) AND NOT IS_PED_INJURED(pedBoatDancer[0]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Guy_on_sofa", pedBoatDancer[0]) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[1]) AND NOT IS_PED_INJURED(pedBoatDancer[1]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Man_getting_wood", pedBoatDancer[1]) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[2]) AND NOT IS_PED_INJURED(pedBoatDancer[2]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Girl_on_sofa", pedBoatDancer[2]) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[3]) AND NOT IS_PED_INJURED(pedBoatDancer[3]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Girl_being_chatted_up", pedBoatDancer[3]) ENDIF IF DOES_ENTITY_EXIST(pedTracy) AND NOT IS_PED_INJURED(pedTracy) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Tracy", pedTracy) ENDIF iStageProgress++ ENDIF BREAK CASE 2 BOOL bChasersReady bChasersReady = FALSE IF CREATE_CHASER(0, TRUE) AND CREATE_CHASER(1, TRUE) PRINTLN("READY") bChasersReady = TRUE ELSE PRINTLN("NOT READY") ENDIF IF bChasersReady AND HAS_VEHICLE_RECORDING_BEEN_LOADED(1, "famtwoplayer") iStageProgress++ IF bReplaySetupRequired iStageProgress = -1 ENDIF ENDIF BREAK CASE 3 IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() bWaterComponentsGrabbed = FALSE SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE) IF NOT IS_PED_INJURED(pedTracy) PRINTLN("REGISTERING TRACEY") REGISTER_ENTITY_FOR_CUTSCENE(pedTracy, "Tracy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) PRINTLN("\n\n\nSETTING PLAYER SEASHARK ANCHOR OFF\n\n\n") SET_BOAT_ANCHOR(vehPlayerSeashark, FALSE) REGISTER_ENTITY_FOR_CUTSCENE(vehPlayerSeashark, "Michaels_seashark", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, FALSE, TRUE) ENDIF IF DOES_ENTITY_EXIST(objMP3Dock) REGISTER_ENTITY_FOR_CUTSCENE(objMP3Dock, "Prop_MP3_Dock", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(pedChasers[0]) FREEZE_ENTITY_POSITION(pedChasers[0], FALSE) SET_PED_CAN_RAGDOLL(pedChasers[0], TRUE) REGISTER_ENTITY_FOR_CUTSCENE(pedChasers[0], "Porn_Dude", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(pedChasers[1]) FREEZE_ENTITY_POSITION(pedChasers[1], FALSE) SET_PED_CAN_RAGDOLL(pedChasers[1], TRUE) REGISTER_ENTITY_FOR_CUTSCENE(pedChasers[1], "Porn_Dude^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(vehChasers[0]) PRINTLN("Registered seashark 0 to Porn_Dude_seashark") REGISTER_ENTITY_FOR_CUTSCENE(vehChasers[0], "Porn_Dude_seashark", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(vehChasers[1]) PRINTLN("Registered seashark 1 to Porn_Dude_^1_seashark") REGISTER_ENTITY_FOR_CUTSCENE(vehChasers[1], "Porn_Dude_^1_seashark", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[0]) AND NOT IS_PED_INJURED(pedBoatDancer[0]) SET_PED_DIES_IN_WATER(pedBoatDancer[0], FALSE) SET_PED_COMBAT_ATTRIBUTES(pedBoatDancer[0], CA_ALWAYS_FLEE, TRUE) SET_PED_LOD_MULTIPLIER(pedBoatDancer[0], 1.75) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedBoatDancer[0], TRUE) TASK_LOOK_AT_ENTITY(pedBoatDancer[0], PLAYER_PED_ID(), -1, SLF_EXTEND_YAW_LIMIT, SLF_LOOKAT_HIGH) bWaterComponentsGrabbed = TRUE REGISTER_ENTITY_FOR_CUTSCENE(pedBoatDancer[0], "Guy_on_sofa", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[1]) AND NOT IS_PED_INJURED(pedBoatDancer[1]) REGISTER_ENTITY_FOR_CUTSCENE(pedBoatDancer[1], "Man_getting_wood", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[2]) AND NOT IS_PED_INJURED(pedBoatDancer[2]) REGISTER_ENTITY_FOR_CUTSCENE(pedBoatDancer[2], "Girl_on_sofa", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF DOES_ENTITY_EXIST(pedBoatDancer[3]) AND NOT IS_PED_INJURED(pedBoatDancer[3]) REGISTER_ENTITY_FOR_CUTSCENE(pedBoatDancer[3], "Girl_being_chatted_up", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH) CLEAR_PRINTS() CLEAR_HELP() REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() PRE_INIT_ASSETS(stage_speedophile_chase) INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START() PREPARE_MUSIC_EVENT("FAM2_NECK_GRAB") bGrabMusicPlayed = FALSE bRadioKilled = FALSE iStageProgress++ ENDIF BREAK CASE 4 IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(500) ENDIF CLEAR_AREA(<<-2006.246582,-1043.832275,-1.481001>>, 200, TRUE) iStageProgress++ BREAK CASE 5 IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tracy") PRINTLN("Tracey out") IF NOT IS_PED_IN_VEHICLE(pedTracy, vehPlayerSeashark) SET_PED_INTO_VEHICLE(pedTracy, vehPlayerSeashark, VS_FRONT_RIGHT) SET_ENTITY_INVINCIBLE(pedTracy, TRUE) FORCE_PED_AI_AND_ANIMATION_UPDATE(pedTracy) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() PRINTLN("CAMERA OUT") ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Porn_Dude") PRINTLN("Porn_Dude OUT") ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Porn_Dude^1") PRINTLN("Porn_Dude^1 OUT") ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Porn_Dude_seashark") PRINTLN("Porn_Dude_seashark OUT") ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Porn_Dude^1_seashark") PRINTLN("Porn_Dude^1_seashark OUT") ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_seashark") // AND CAN_SET_EXIT_STATE_FOR_CAMERA() PRINTLN("Michaels_seashark out") IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPlayerSeashark) ENDIF SET_WATER_CALM(TRUE, 0) START_PLAYBACK_RECORDED_VEHICLE(vehPlayerSeashark, 1, "famtwoplayer") SET_PLAYBACK_SPEED(vehPlayerSeashark, 0.66) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) SET_ENTITY_COORDS(vehPlayerSeashark, vSeasharkChaseStartCoords) SET_ENTITY_HEADING(vehPlayerSeashark, fSeasharkChaseStartCoords) SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, TRUE, TRUE) SET_VEHICLE_FORWARD_SPEED(vehPlayerSeashark, 15) STOP_PLAYBACK_RECORDED_VEHICLE(vehPlayerSeashark) GET_WATER_HEIGHT(vSeasharkChaseStartCoords, fHeight) IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_ENTITY_COORDS(vehPlayerSeashark, <>) SET_ENTITY_HEADING(vehPlayerSeashark, fSeasharkChaseStartCoords) SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, TRUE, TRUE) SET_VEHICLE_FORWARD_SPEED(vehPlayerSeashark, 17) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) ENDIF INT i VECTOR vTemp FLOAT fTemp REPEAT COUNT_OF(vehChasers) i IF DOES_ENTITY_EXIST(vehChasers[i]) AND IS_VEHICLE_DRIVEABLE(vehChasers[i]) AND DOES_ENTITY_EXIST(pedChasers[i]) AND NOT IS_PED_INJURED(pedChasers[i]) FREEZE_ENTITY_POSITION(pedChasers[i], FALSE) SET_PED_CAN_RAGDOLL(pedChasers[i], TRUE) SET_BOAT_ANCHOR(vehChasers[i], FALSE) IF NOT IS_PED_IN_VEHICLE(pedChasers[i], vehChasers[i]) SET_PED_INTO_VEHICLE(pedChasers[i], vehChasers[i]) ENDIF vTemp = GET_ENTITY_COORDS(vehChasers[i]) GET_WATER_HEIGHT(vTemp, fTemp) SET_ENTITY_COORDS(vehChasers[i], <>) //START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehChasers[i], 101+i, "famtwo", 25, DRIVINGMODE_PLOUGHTHROUGH) SET_VEHICLE_FORWARD_SPEED(vehChasers[i], 10.0 + (2.0*TO_FLOAT(i))) ENDIF ENDREPEAT IF NOT WAS_CUTSCENE_SKIPPED() DESTROY_ALL_CAMS() camRescueOutro = CREATE_CAM("DEFAULT_SPLINE_CAMERA") SET_CAM_SPLINE_SMOOTHING_STYLE(camRescueOutro, CAM_SPLINE_SLOW_IN_SMOOTH) ADD_CAM_SPLINE_NODE_USING_CAMERA(camRescueOutro, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-2023.1742, -1052.9800, 1.5290>>, <<2.1162, 0.0000, -39.8484>>, 50.0000, TRUE), 0) ADD_CAM_SPLINE_NODE_USING_CAMERA(camRescueOutro, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-2008.2240, -1037.2172, 1.8555>>, <<-2.0921, 0.0684, -60.6791>>, 50.0000, TRUE), 1400, CAM_SPLINE_NODE_SMOOTH_ROT) ADD_CAM_SPLINE_NODE_USING_CAMERA(camRescueOutro, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-1985.4370, -1024.5334, 2.0868>>, <<-3.9139, 0.0000, -78.7979>>, 50.0000, TRUE), 1850) SET_CAM_ACTIVE(camRescueOutro, TRUE) POINT_CAM_AT_ENTITY(camRescueOutro, PLAYER_PED_ID(), <<0,0,0.3>>) RENDER_SCRIPT_CAMS(TRUE, FALSE) FILL_PUSH_IN_DATA(pushInData, PLAYER_PED_ID(), CHAR_MICHAEL, 20, 1000, 1000, 500) PRINTLN("@@@@@@@@@@@@ GET FILL_PUSH_IN_DATA 1 @@@@@@@@@@@@@@@@") SETTIMERB(0) ELSE bCutsceneSkipped = TRUE STOP_PLAYBACK_RECORDED_VEHICLE(vehPlayerSeashark) SET_WATER_CALM(TRUE, 0.1) GET_WATER_HEIGHT(vSeasharkChaseStartCoords, fHeight) IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_ENTITY_COORDS(vehPlayerSeashark, <>) SET_ENTITY_HEADING(vehPlayerSeashark, fSeasharkChaseStartCoords) SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, TRUE, TRUE) SET_VEHICLE_FORWARD_SPEED(vehPlayerSeashark, 18) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) ENDIF ENDIF ENDIF ENDIF IF NOT bGrabMusicPlayed IF PREPARE_MUSIC_EVENT("FAM2_NECK_GRAB") AND GET_CUTSCENE_TIME() > 31250 TRIGGER_MUSIC_EVENT("FAM2_NECK_GRAB") bGrabMusicPlayed = TRUE ENDIF ENDIF IF NOT bRadioKilled IF GET_CUTSCENE_TIME() > 9700 SET_STATIC_EMITTER_ENABLED("SE_FAMILY_2_BOAT_RADIO",FALSE) bRadioKilled = TRUE ENDIF ENDIF IF (GET_CUTSCENE_TIME() > 37500) IF NOT bWaterCalm SET_WATER_CALM(TRUE) bWaterCalm = TRUE ENDIF ENDIF IF NOT bWaterPedFlee IF GET_CUTSCENE_TIME() > 45000 IF NOT IS_PED_INJURED(pedBoatDancer[0]) TASK_GO_STRAIGHT_TO_COORD(pedBoatDancer[0], <<-2097.8667, -973.0261, -1>>, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_NEVER_WARP) bWaterPedFlee = TRUE ENDIF ENDIF ENDIF IF NOT bWaterComponentsGrabbed IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("Guy_on_sofa")) AND NOT IS_PED_INJURED(GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("Guy_on_sofa"))) INT iTemp REPEAT COUNT_OF(PED_COMPONENT) iTemp iWaterComponents[iTemp][0] = GET_PED_DRAWABLE_VARIATION(GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("Guy_on_sofa")), INT_TO_ENUM(PED_COMPONENT, iTemp)) iWaterComponents[iTemp][1] = GET_PED_TEXTURE_VARIATION(GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("Guy_on_sofa")), INT_TO_ENUM(PED_COMPONENT, iTemp)) PRINTLN("GRABBING COMPONENTS FOR WATER PED") ENDREPEAT bWaterComponentsGrabbed = TRUE ENDIF ELSE IF NOT DOES_ENTITY_EXIST(pedBoatDancer[0]) PRINTLN("CREATING WATER PED") CREATE_WATER_PED() ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() PRINTLN("camera out") ENDIF PRINTLN("frame") IF NOT IS_CUTSCENE_ACTIVE() REPLAY_STOP_EVENT() SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) IF DOES_ENTITY_EXIST(objMP3Dock) DELETE_OBJECT(objMP3Dock) SET_MODEL_AS_NO_LONGER_NEEDED(PROP_MP3_DOCK) ENDIF IF NOT bGrabMusicPlayed TRIGGER_MUSIC_EVENT("FAM2_CS_SKIP") ENDIF SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) //cutscene finished, back to game INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END() SPECIAL_ABILITY_CHARGE_LARGE(PLAYER_ID(), TRUE, FALSE) IF NOT bGrabMusicPlayed CANCEL_MUSIC_EVENT("FAM2_GRAB_NECK") ENDIF SETTIMERA(0) IF NOT bCutsceneSkipped iStageProgress++ ELSE IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlayerSeashark) STOP_PLAYBACK_RECORDED_VEHICLE(vehPlayerSeashark) ENDIF GO_TO_STAGE(stage_speedophile_chase) ENDIF ENDIF BREAK CASE 6 IF GET_FOLLOW_VEHICLE_CAM_VIEW_MODE() != CAM_VIEW_MODE_FIRST_PERSON AND GET_FOLLOW_PED_CAM_VIEW_MODE() != CAM_VIEW_MODE_FIRST_PERSON IF TIMERB() > 2350 RENDER_SCRIPT_CAMS(FALSE, TRUE, 1500, FALSE) //STOP_PLAYBACK_RECORDED_VEHICLE(vehPlayerSeashark) ENDIF IF TIMERB() > 2500 IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlayerSeashark) STOP_PLAYBACK_RECORDED_VEHICLE(vehPlayerSeashark) ENDIF GO_TO_STAGE(stage_speedophile_chase) ENDIF ENDIF ELIF TIMERB() > 2350 IF HANDLE_PUSH_IN(pushInData, TRUE) PRINTLN("@@@@@@@@@@@@ GET_FOLLOW_VEHICLE_CAM_VIEW_MODE 1 @@@@@@@@@@@@@@@@") RENDER_SCRIPT_CAMS(FALSE, TRUE, 1500, FALSE) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlayerSeashark) STOP_PLAYBACK_RECORDED_VEHICLE(vehPlayerSeashark) ENDIF RESET_PUSH_IN(pushInData) GO_TO_STAGE(stage_speedophile_chase) ENDIF ENDIF BREAK ENDSWITCH ENDPROC PROC RUN_FINAL_CUTSCENE() PRINTLN("stage prog ", iStageProgress) IF IS_SCREEN_FADED_OUT() DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE) ENDIF SWITCH iStageProgress CASE 0 SET_AUDIO_FLAG("HoldMissionCompleteWhenPrepared", TRUE) REQUEST_PTFX_ASSET() REQUEST_ANIM_DICT( "missfam2_pier") REQUEST_MODEL(PROP_CIGAR_01) REQUEST_MODEL(CRUISER) IF NOT IS_CUTSCENE_ACTIVE() IF bPlayFullFinalCut REQUEST_CUTSCENE("family_2_mcs_4") PRINTLN("@@@@@@@@@@ CUTSCENE REQUEST_CUTSCENE(family_2_mcs_4) @@@@@@@@@@@") ELSE REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("family_2_mcs_4", CS_SECTION_2) PRINTLN("@@@@@@@@@@ CUTSCENE REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(family_2_mcs_4, CS_SECTION_2) 2 @@@@@@@@@@@") ENDIF iStageProgress++ ELSE iStageProgress+=2 ENDIF BREAK CASE 1 PRINTLN("WAITING ON CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY") IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Tracy", pedTracy) SET_CUTSCENE_PED_PROP_VARIATION("Tracy", ANCHOR_EYES, 1, 0) SET_CUTSCENE_PED_PROP_VARIATION("Tracy", ANCHOR_HEAD, 0, 0) IF IS_AUDIO_SCENE_ACTIVE("FAMILY_2_JETSKI_GO_TO_BEACH") STOP_AUDIO_SCENE("FAMILY_2_JETSKI_GO_TO_BEACH") ENDIF iStageProgress++ ENDIF BREAK CASE 2 PRINTLN("WAITING ON CUTSCENE TO LOAD") SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Tracy", pedTracy) SET_CUTSCENE_PED_PROP_VARIATION("Tracy", ANCHOR_EYES, 1, 0) SET_CUTSCENE_PED_PROP_VARIATION("Tracy", ANCHOR_HEAD, 0, 0) IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE) IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_VEHICLE_ENGINE_ON(vehPlayerSeashark, FALSE, TRUE) REGISTER_ENTITY_FOR_CUTSCENE(vehPlayerSeashark, "Michaels_seashark", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(pedTracy) REGISTER_ENTITY_FOR_CUTSCENE(pedTracy, "Tracy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(pedJimmy) REGISTER_ENTITY_FOR_CUTSCENE(pedJimmy, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF CLEAR_PRINTS() CLEAR_HELP() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() TRIGGER_MUSIC_EVENT("FAM2_COMPLETE") START_CUTSCENE() REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) REQUEST_ANIM_DICT( "missfam2_pier") REQUEST_MODEL(PROP_CIGAR_01) REQUEST_MODEL(CRUISER) INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START() iStageProgress++ ENDIF BREAK CASE 3 IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(500) ENDIF REMOVE_DECALS_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100) TRIGGER_MISSION_STATS_UI(TRUE, TRUE) SET_AUDIO_FLAG("AvoidMissionCompleteDelay", FALSE) iStageProgress++ BREAK CASE 4 IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MICHAEL") PRINTLN("MIKE OUT") IF IS_VEHICLE_DRIVEABLE(vehPlayerSeashark) SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayerSeashark) APPLY_FORCE_TO_ENTITY(vehPlayerSeashark, APPLY_TYPE_FORCE, <<0,0,0.1>>, <<0,0,0>>,0, TRUE, TRUE, FALSE) ENDIF IF DOES_ENTITY_EXIST(pedJimmy) DELETE_PED(pedJimmy) ENDIF IF DOES_ENTITY_EXIST(pedTracy) DELETE_PED(pedTracy) ENDIF SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1607.2512, -1138.1034, 1.1443>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 262.2968) ENDIF OVERRIDE_LODSCALE_THIS_FRAME(1.5) IF IS_SCREEN_FADED_OUT() AND WAS_CUTSCENE_SKIPPED() PRINTLN("SKIPPED SCENE") SETTIMERA(0) DO_SCREEN_FADE_OUT(0) ENDIF IF IS_CUTSCENE_ACTIVE() IF GET_CUTSCENE_TIME() > 31400 IF NOT IS_SCREEN_FADING_OUT() AND NOT IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_OUT(1500) ENDIF DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SKIP_CUTSCENE) ENDIF ENDIF IF NOT IS_CUTSCENE_ACTIVE() PRINTLN("CUTSCENE OUT") SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END() IF NOT IS_SCREEN_FADING_OUT() AND NOT IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_OUT(500) ENDIF REPLAY_STOP_EVENT() iStageProgress++ ENDIF #IF IS_DEBUG_BUILD DEBUG_CUTSCENE_CONTROL() #ENDIF BREAK CASE 5 IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT() TRIGGER_MUSIC_EVENT("FAM2_STOP") IF DOES_ENTITY_EXIST(vehPlayerCar) SET_MISSION_VEHICLE_GEN_VEHICLE(vehPlayerCar, <<-1060.5181, -1691.8796, 3.5097>>, 185.4265) ENDIF CLEAR_PED_BLOOD_DAMAGE_BY_ZONE(PLAYER_PED_ID(), PDZ_TORSO) CLEAR_PED_BLOOD_DAMAGE_BY_ZONE(PLAYER_PED_ID(), PDZ_RIGHT_ARM) CLEAR_PED_BLOOD_DAMAGE_BY_ZONE(PLAYER_PED_ID(), PDZ_LEFT_ARM) WHILE NOT SETUP_CLOTHES(FALSE, TRUE) WAIT(0) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE) ENDWHILE SETTIMERA(0) REMOVE_IPL("smboat") iStageProgress=100 ENDIF BREAK CASE 100 REQUEST_PTFX_ASSET() DO_QUICK_WARP(<< -1850.139, -1250.253, 8.590 >>, -120.1799) REQUEST_ANIM_DICT( "missfam2_pier") REQUEST_MODEL(PROP_CIGAR_01) REQUEST_MODEL(CRUISER) WHILE NOT HAS_ANIM_DICT_LOADED( "missfam2_pier") OR NOT HAS_MODEL_LOADED(PROP_CIGAR_01) OR NOT HAS_MODEL_LOADED(CRUISER) PRINTLN("LOADING ASSETS FOR SMOKING SCENE SCENE") WAIT(0) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE) ENDWHILE SET_AUDIO_FLAG("HoldMissionCompleteWhenPrepared", FALSE) SET_ENTITY_COORDS(PLAYER_PED_ID(), << -1850.139, -1250.253, 8.590 >>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 134.280) vehEndBike = CREATE_VEHICLE(CRUISER, <<-1846.5731, -1214.7306, 12.5755>>, 0) SET_ENTITY_QUATERNION(vehEndBike, -0.0155, -0.0834, -0.3060, 0.9483) SET_VEHICLE_ON_GROUND_PROPERLY(vehEndBike) CLEAR_PED_WETNESS(PLAYER_PED_ID()) objCig = CREATE_OBJECT(PROP_CIGAR_01, << -1850.139, -1250.253, 8.590 >>) ATTACH_ENTITY_TO_ENTITY(objCig, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,180>>) START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_cig_smoke", objcig, <<0.05,0,0>>, <<0,0,90>>) camFinal = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE) SET_CAM_PARAMS(camFinal, <<-1852.0020, -1250.2244, 8.9706>>, <<-3.6975, 0.0000, -120.1799>>, 45) SET_CAM_PARAMS(camFinal, <<-1852.0870, -1250.3954, 8.9706>>, <<-1.3266, 0.0000, -102.4498>>, 45, 10000) SET_WIDESCREEN_BORDERS(TRUE, 0) IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(GET_HASH_KEY("mission_stat_watcher")) > 0 TRIGGER_MISSION_STATS_UI(TRUE, TRUE) // failsafe trigger for 1582752 WHILE NOT g_bResultScreenDisplaying PRINTLN("g_bResultScreenDisplaying = FALSE") WAIT(0) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE) ENDWHILE WHILE g_bResultScreenDisplaying PRINTLN("g_bResultScreenDisplaying = TRUE") WAIT(0) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE) ENDWHILE ELSE PRINTLN("mission stat watcher is not running") WAIT(3000) ENDIF CLEAR_AREA_OF_PEDS(<< -1850.150, -1250.253, 8.625 >>, 5) iFinalScene = CREATE_SYNCHRONIZED_SCENE(<< -1850.150, -1250.253, 8.625 >>, << 0.000, 0.000, 134.280 >>) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iFinalScene, "missfam2_pier", "pier_lean_toss_cigarette", INSTANT_BLEND_IN, SLOW_BLEND_OUT) RENDER_SCRIPT_CAMS(TRUE, FALSE) SETTIMERA(0) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(1500) ENDIF iStageProgress++ BREAK CASE 101 IF IS_SYNCHRONIZED_SCENE_RUNNING(iFinalScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iFinalScene) > 0.227 START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("cs_cig_exhale_nose", PLAYER_PED_ID(), <<-0.025,0.12,0>>, <<0,90,0>>, BONETAG_HEAD) iStageProgress++ ENDIF BREAK CASE 102 IF IS_SYNCHRONIZED_SCENE_RUNNING(iFinalScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iFinalScene) > 0.563 SET_CAM_PARAMS(camFinal, GET_CAM_COORD(camFinal), GET_CAM_ROT(camFinal), GET_CAM_FOV(camFinal)) IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) != CAM_VIEW_MODE_FIRST_PERSON) SET_CAM_PARAMS(camFinal, <<-1852.9216, -1252.6982, 9.3524>>, <<-2.9046, 0.0000, -46.5763>>, 50, 4000) ELSE SET_CAM_PARAMS(camFinal, <<-1851.6848, -1251.4376, 9.3524>>, <<-0.0547, 0.0543, -38.2308>>, 50, 4000) ENDIF iStageProgress++ ENDIF BREAK CASE 103 IF DOES_ENTITY_EXIST(objCig) AND IS_ENTITY_ATTACHED(objCig) IF GET_SYNCHRONIZED_SCENE_PHASE(iFinalScene) > 0.711 DETACH_ENTITY(objCig) SET_ENTITY_VELOCITY(objCig, <<-1852.4299, -1250.9132, 8.3737>> - <<-1850.8989, -1250.4399, 9.2628>>) ENDIF ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iFinalScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iFinalScene) > 0.768 START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("cs_cig_exhale_mouth", PLAYER_PED_ID(), <<-0.025,0.13,0>>, <<0,0,0>>, BONETAG_HEAD) iStageProgress++ ENDIF BREAK CASE 104 IF IS_SYNCHRONIZED_SCENE_RUNNING(iFinalScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iFinalScene) > 0.7116 START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("cs_cig_exhale_mouth", PLAYER_PED_ID(), <<-0.025,0.13,0>>, <<0,0,0>>, BONETAG_HEAD) FILL_PUSH_IN_DATA(pushInData, PLAYER_PED_ID(), CHAR_MICHAEL) PRINTLN("@@@@@@@@@@@@ GET FILL_PUSH_IN_DATA 2 @@@@@@@@@@@@@@@@") iStageProgress++ ENDIF BREAK CASE 105 IF IS_SYNCHRONIZED_SCENE_RUNNING(iFinalScene) IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON) IF DOES_CAM_EXIST(camFinal) IF GET_SYNCHRONIZED_SCENE_PHASE(iFinalScene) > 0.85 AND HANDLE_PUSH_IN(pushInData, FALSE, TRUE, TRUE, FALSE, FALSE) PRINTLN("@@@@@@@@@@@@ GET_FOLLOW_PED_CAM_VIEW_MODE 2 @@@@@@@@@@@@@@@@") SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) IF DOES_CAM_EXIST(camFinal) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() RENDER_SCRIPT_CAMS(FALSE, TRUE, 1000) DESTROY_CAM(camFinal) ENDIF ENDIF ENDIF ENDIF IF GET_SYNCHRONIZED_SCENE_PHASE(iFinalScene) > 0.98 IF DOES_CAM_EXIST(camFinal) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() RENDER_SCRIPT_CAMS(FALSE, TRUE, 1000) DESTROY_CAM(camFinal) ENDIF SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) CLEAR_PED_TASKS(PLAYER_PED_ID()) SET_WIDESCREEN_BORDERS(FALSE, 100) IF DOES_ENTITY_EXIST(objCig) DELETE_OBJECT(objCig) ENDIF SETTIMERA(0) iStageProgress++ ENDIF ENDIF BREAK CASE 106 IF TIMERA() > 100 SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) Mission_Flow_Mission_Passed() Mission_Cleanup() ENDIF BREAK ENDSWITCH ENDPROC //╞═════════╡DEBUG PROCEDURES #IF IS_DEBUG_BUILD PROC DEBUG_PROCS() IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) MISSION_PASSED() ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) Mission_Failed("FM2_FAIL") ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) JSKIP() ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1) IF NOT IS_PED_INJURED(pedJimmy) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_BERD, 0, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_TORSO, 0, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_LEG, 0, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_FEET, 0, 0) SET_PED_COMPONENT_VARIATION(pedJimmy, PED_COMP_DECL, 0, 0) PRINTLN("debug setting vars") ENDIF ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P) PSKIP() ENDIF IF LAUNCH_MISSION_STAGE_MENU(skipMenuOptions, iStageHolder) SWITCH iStageHolder CASE 0 selected_stage = stage_intro BREAK CASE 1 selected_stage = stage_drive_to_venice BREAK CASE 2 selected_stage = stage_hire_bike BREAK CASE 3 selected_stage = stage_bike_ride BREAK CASE 4 selected_stage = stage_telltale bJimmyWon = TRUE bDebugMenuCutsceneSelection = TRUE BREAK CASE 5 selected_stage = stage_telltale bJimmyWon = FALSE bDebugMenuCutsceneSelection = TRUE BREAK CASE 6 selected_stage = stage_go_to_yacht BREAK CASE 7 selected_stage = stage_rescue BREAK CASE 8 selected_stage = stage_speedophile_chase BREAK CASE 9 selected_stage = stage_drive_to_beach BREAK CASE 10 selected_stage = stage_finish BREAK ENDSWITCH b_skip = TRUE SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE, DEFAULT, DEFAULT, TRUE, FALSE) GO_TO_STAGE(selected_stage) ENDIF IF b_skip STOP_CUTSCENE() FADE_OUT() ENDIF ENDPROC FLOAT fOceanWaveAmplitude = 0.0 FLOAT fNoiseAmplitude = 0.0 FLOAT fOceanWaveMinAmplitude = 0.0 FLOAT fOceanWaveMaxAmplitude = 0.0 FLOAT fRippleBumpiness = 0.0 FLOAT fRippleDisturb = 0.0 FLOAT fRippleMinBumpiness = 0.0 FLOAT fRippleMaxBumpiness = 0.0 FLOAT fShoreWaveamplitude = 0.0 FLOAT fShoreWaveMinamplitude = 0.0 FLOAT fShoreWaveMaxamplitude = 0.0 FLOAT fOverrideStrength = 1.0 BOOL bWaveOverrideFadeIn = FALSE BOOL bWaveOverrideFadeOut = FALSE BOOL bApply = FALSE BOOL bActive = FALSE FLOAT fFadeTime = 1.0 PROC BUILD_WIDGETS() parent_widget = START_WIDGET_GROUP("Family 2") chase_widget = START_WIDGET_GROUP("Chase information") ADD_WIDGET_FLOAT_READ_ONLY("Total duration of recording", fRecordingTime) ADD_WIDGET_FLOAT_READ_ONLY("Duration per section", fSectionTime) ADD_WIDGET_FLOAT_READ_ONLY("Duration per section", fSectionProgressTime) ADD_WIDGET_FLOAT_READ_ONLY("Progress in current section", fSectionProgress) ADD_WIDGET_INT_READ_ONLY("Closest node is", iClosestPoint) ADD_WIDGET_BOOL("Chaser 1 is on recording", bChaserPlaybackForced[0]) ADD_WIDGET_BOOL("Chaser 2 is on recording", bChaserPlaybackForced[1]) ADD_WIDGET_INT_READ_ONLY("Chase Stage", iChaseStage) ADD_WIDGET_INT_READ_ONLY("Saved Stage", iSavedStage) twChaseSection = ADD_TEXT_WIDGET("Current Chase section") twCanalSection = ADD_TEXT_WIDGET("Current Canal section") twPrevCanalSection = ADD_TEXT_WIDGET("Previous Canal section") ADD_WIDGET_INT_SLIDER("Cutscene exit run time", iRunTime, 0, 2000, 100) ADD_WIDGET_INT_SLIDER("Break point", iBreak, 0, 20, 1) ADD_WIDGET_BOOL("Start test", bRun) STOP_WIDGET_GROUP() wave_widget = START_WIDGET_GROUP("Wave settings") ADD_WIDGET_FLOAT_SLIDER("Ocean wave amplitude", fOceanWaveAmplitude, 0.0, 10.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Min ocean wave amplitude", fOceanWaveMinAmplitude, 0.0, 20.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Max ocean wave amplitude", fOceanWaveMaxAmplitude, 0.0, 20.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Shore wave amplitude", fShoreWaveamplitude, 0.0, 20.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Min shore wave amplitude", fShoreWaveMinamplitude, 0.0, 20.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Max shore wave amplitude", fShoreWaveMaxamplitude, 0.0, 20.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Ripple bumpiness", fRippleBumpiness, 0.0, 2.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Ripple disturb", fRippleDisturb, 0.0, 2.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Min ripple bumpiness", fRippleMinBumpiness, 0.0, 2.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Max ripple bumpiness", fRippleMaxBumpiness, 0.0, 2.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Noise amplitude", fNoiseAmplitude, 0.0, 50.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Override strength", fOverrideStrength, 0.0, 1.0, 0.01) ADD_WIDGET_FLOAT_SLIDER("Override fade time", fFadeTime, 0.0, 10.0, 0.1) ADD_WIDGET_BOOL("Apply settings", bApply) //ADD_WIDGET_BOOL("Fade override in", bWaveOverrideFadeIn) //ADD_WIDGET_BOOL("Fade override out", bWaveOverrideFadeOut) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() ENDPROC PROC RUN_WIDGETS() //chase info SET_CONTENTS_OF_TEXT_WIDGET(twChaseSection, GET_STRING_FROM_CHASE_STAGE(GET_CURRENT_CHASE_ENUM())) SET_CONTENTS_OF_TEXT_WIDGET(twCanalSection, GET_CANAL_SECTION_RECORDING_NAME(eCurrentCanalSection)) SET_CONTENTS_OF_TEXT_WIDGET(twPrevCanalSection, GET_CANAL_SECTION_RECORDING_NAME(ePreviousCanalSection)) //wave settings IF bApply AND bActive WATER_OVERRIDE_SET_OCEANNOISEMINAMPLITUDE(fNoiseAmplitude) WATER_OVERRIDE_SET_OCEANWAVEAMPLITUDE(fOceanWaveAmplitude) WATER_OVERRIDE_SET_OCEANWAVEMINAMPLITUDE(fOceanWaveMinAmplitude) WATER_OVERRIDE_SET_OCEANWAVEMAXAMPLITUDE(fOceanWaveMinAmplitude) WATER_OVERRIDE_SET_SHOREWAVEAMPLITUDE(fShoreWaveamplitude) WATER_OVERRIDE_SET_SHOREWAVEMINAMPLITUDE(fShoreWaveMinamplitude) WATER_OVERRIDE_SET_SHOREWAVEMAXAMPLITUDE(fShoreWaveMaxamplitude) WATER_OVERRIDE_SET_RIPPLEBUMPINESS(fRippleBumpiness) WATER_OVERRIDE_SET_RIPPLEDISTURB(fRippleDisturb) WATER_OVERRIDE_SET_RIPPLEMAXBUMPINESS(fRippleMaxBumpiness) WATER_OVERRIDE_SET_RIPPLEMINBUMPINESS(fRippleMinBumpiness) WATER_OVERRIDE_SET_STRENGTH(fOverrideStrength) bApply = FALSE ENDIF IF bWaveOverrideFadeIn IF NOT bActive WATER_OVERRIDE_FADE_IN(fFadeTime) bActive = TRUE ENDIF bWaveOverrideFadeIn = FALSE ENDIF IF bWaveOverrideFadeOut IF bActive WATER_OVERRIDE_FADE_OUT(fFadeTime) bActive = FALSE ENDIF bWaveOverrideFadeOut = FALSE ENDIF ENDPROC PROC RUN_TEST() INT iTest FOR iTest = 0 TO 20 IF iTest = iBreak EXIT ELSE PRINTLN("Test ", iTest) ENDIF ENDFOR ENDPROC #ENDIF PROC SET_PED_CANT_DANCE(PED_INDEX ped) IF NOT IS_PED_INJURED(ped) AND IS_PED_IN_ANY_VEHICLE(ped) SET_PED_CAN_PLAY_AMBIENT_ANIMS(ped, FALSE) SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(ped, FALSE) ENDIF ENDPROC FUNC BOOL IS_VEHICLE_SMALL_ENOUGH(VEHICLE_INDEX vehTemp) MODEL_NAMES model = GET_ENTITY_MODEL(vehTemp) VECTOR vMin VECTOR vMax GET_MODEL_DIMENSIONS(model, vMin, vMax) FLOAT fMinHeight = -vMin.z + vMax.z IF fMinHeight < 2.6 RETURN TRUE ENDIF RETURN FALSE ENDFUNC //╞═════════╡ MAIN SCRIPT LOOP ╞════════════════════════════════════════════════════╡ INT iSkipToHour INT iWalkInScene BOOL bPrefetchCalled //TIMEOFDAY todReference SCRIPT IF HAS_FORCE_CLEANUP_OCCURRED() SET_CLEANUP_TO_RUN_ON_RESPAWN(RCI_FAMILY2) MISSION_FLOW_MISSION_FORCE_CLEANUP() TRIGGER_MUSIC_EVENT("FAM2_STOP") MISSION_CLEANUP() ENDIF SET_MISSION_FLAG(TRUE) // REQUEST_CUTSCENE("family_2_int") FAM2_INITIALISE() SET_PLAYER_PED_DATA_IN_CUTSCENES(FALSE, TRUE) #IF IS_DEBUG_BUILD BUILD_WIDGETS() #ENDIF bPrefetchCalled = FALSE WHILE(TRUE) IF NOT b_skip CHECK_FOR_FAIL() ENDIF IF NOT b_stage_ready SETUP_FOR_MISSION_STAGE() ENDIF DO_NO_STAMINA_HELP_TEXT() WATCH_STATS_FOR_MISSION() REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_DaddysLittleGirl") SWITCH current_mission_stage CASE stage_pre_intro IF IS_PLAYER_PLAYING(PLAYER_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK) ENDIF SWITCH iStageProgress CASE 0 IF NOT DOES_ENTITY_EXIST(pedJimmy) IF NOT DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0]) PRINTLN("CREATING JIMMY IN SCRIPT") CREATE_JIMMY(<<-808.0422, 168.5755, 75.7504>>, 244.0649) ELSE PRINTLN("GRABBING TRIGGER SCENE JIMMY") SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[0], TRUE, TRUE) pedJimmy = g_sTriggerSceneAssets.ped[0] // 1984737 //g_sTriggerSceneAssets.ped[0] = NULL ENDIF ENDIF IF NOT IS_VALID_INTERIOR(intMikeMansion) intMikeMansion = GET_INTERIOR_AT_COORDS(<<-813.1963, 179.4912, 71.1592>>) ENDIF REQUEST_ANIM_DICT("missfam2mcs_intp1") REQUEST_WAYPOINT_RECORDING(sJimmyStairRoute) REQUEST_MODEL(V_ILEV_MM_DOORM_L) REQUEST_MODEL(V_ILEV_MM_DOORM_R) REQUEST_ADDITIONAL_TEXT("FAMILY2", MISSION_TEXT_SLOT) REQUEST_ADDITIONAL_TEXT(sConvBlock, MISSION_DIALOGUE_TEXT_SLOT) IF NOT bPrefetchCalled PREFETCH_SRL("family_2_Timelapse_srl") bPrefetchCalled = TRUE ENDIF IF IS_INTERIOR_READY(intMikeMansion) AND HAS_ANIM_DICT_LOADED("missfam2mcs_intp1") AND DOES_ENTITY_EXIST(pedJimmy) AND REQUEST_AMBIENT_AUDIO_BANK("TIME_LAPSE") AND DOES_ENTITY_EXIST(pedJimmy) AND HAS_MODEL_LOADED(V_ILEV_MM_DOORM_L) AND HAS_MODEL_LOADED(V_ILEV_MM_DOORM_R) AND GET_IS_WAYPOINT_RECORDING_LOADED(sJimmyStairRoute) AND IS_SRL_LOADED() AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT) REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) iWalkInScene = CREATE_SYNCHRONIZED_SCENE(<< -817.311, 179.330, 71.241 >>, << 0.000, 0.000, -113.000 >>) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iWalkInScene, "missfam2mcs_intp1", "fam_2_int_p1_michael", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_ON_ABORT_STOP_SCENE) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_L)) DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), 1.0, FALSE, FALSE) DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), DOORSTATE_LOCKED, FALSE, TRUE) ENDIF IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_R)) DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), -1.0, FALSE, FALSE) DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), DOORSTATE_LOCKED, FALSE, TRUE) ENDIF CREATE_MODEL_HIDE(vLeftDoorPos, 1.0, V_ILEV_MM_DOORM_L, FALSE) CREATE_MODEL_HIDE(vRightDoorPos, 1.0, V_ILEV_MM_DOORM_R, FALSE) objDoorL = CREATE_OBJECT(V_ILEV_MM_DOORM_L, vLeftDoorPos) objDoorR = CREATE_OBJECT(V_ILEV_MM_DOORM_R, vRightDoorPos) PLAY_SYNCHRONIZED_ENTITY_ANIM(objDoorL, iWalkInScene, "fam_2_int_p1_doorl", "missfam2mcs_intp1", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) PLAY_SYNCHRONIZED_ENTITY_ANIM(objDoorR, iWalkInScene, "fam_2_int_p1_doorr", "missfam2mcs_intp1", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objDoorL) FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objDoorR) DESTROY_ALL_CAMS() camIGIntro = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE) PLAY_SYNCHRONIZED_CAM_ANIM(camIGIntro, iWalkInScene, "fam_2_int_p1_cam", "missfam2mcs_intp1") SET_WIDESCREEN_BORDERS(TRUE, 0) RENDER_SCRIPT_CAMS(TRUE, FALSE) MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FAMILY_2) SET_SRL_READAHEAD_TIMES(5, 5, 5, 5) BEGIN_SRL() SETTIMERA(0) SET_MODEL_AS_NO_LONGER_NEEDED(V_ILEV_MM_DOORM_L) SET_MODEL_AS_NO_LONGER_NEEDED(V_ILEV_MM_DOORM_R) PRELOAD_OUTFIT(PLAYER_PED_ID(), OUTFIT_P0_YOGA_FLIP_FLOPS) SET_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID(), PED_COMP_TORSO, 17, 0) SET_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID(), PED_COMP_LEG, 16, 0) SET_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID(), PED_COMP_FEET, 1, 0) REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE) IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) IF IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(GET_PLAYERS_LAST_VEHICLE()) INT iVeh REPEAT NUM_NPC_VEHICLE_IDS iVeh IF DOES_ENTITY_EXIST(g_viCreatedNPCVehicleIDs[iVeh]) IF VDIST2(GET_ENTITY_COORDS(g_viCreatedNPCVehicleIDs[iVeh]), v_car_start_coords) < 30*30 SET_ENTITY_AS_MISSION_ENTITY(g_viCreatedNPCVehicleIDs[iVeh], TRUE, TRUE) DELETE_VEHICLE(g_viCreatedNPCVehicleIDs[iVeh]) iVeh = NUM_NPC_VEHICLE_IDS ENDIF ENDIF ENDREPEAT ENDIF ENDIF DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(vJimmyCoords, 1000) VEHICLE_INDEX vehTemp IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) PRINTLN("PLAYER IS IN VEHICLE") ELSE vehTemp = GET_LAST_DRIVEN_VEHICLE() PRINTLN("PLAYER IS NOT IN VEHICLE") ENDIF IF DOES_ENTITY_EXIST(vehTemp) AND IS_VEHICLE_DRIVEABLE(vehTemp) IF NOT IS_VEHICLE_MODEL(vehTemp, TAXI) AND NOT IS_VEHICLE_IN_PLAYERS_GARAGE(vehTemp, CHAR_MICHAEL, TRUE) IF IS_VEHICLE_SMALL_ENOUGH(vehTemp) AND VDIST(GET_ENTITY_COORDS(vehTemp), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 50 PRINTLN("PLAYER VEHICLE IS NEARBY") SET_ENTITY_AS_MISSION_ENTITY(vehTemp, TRUE, TRUE) #IF IS_DEBUG_BUILD PRINTLN("Vehicle belongs to: ", GET_PLAYER_PED_PERSONAL_VEHICLE_BELONGS_TO(vehTemp)) #ENDIF IF GET_PLAYER_PED_PERSONAL_VEHICLE_BELONGS_TO(vehTemp) = CHAR_MICHAEL DELETE_VEHICLE(vehTemp) PRINTLN("Deleting as this is the player's vehicle") ELSE SET_MISSION_VEHICLE_GEN_VEHICLE(vehTemp, <<-822.4229, 157.8134, 69.0913>>, 91.164993) SET_ENTITY_COORDS(vehTemp, <<-822.4229, 157.8134, 69.0913>>) SET_ENTITY_HEADING(vehTemp, 91.164993) SET_VEHICLE_DOORS_SHUT(vehTemp, TRUE) PRINTLN("SETTING PLAYER VEH AS veh gen") ENDIF ENDIF ENDIF ENDIF CLEAR_AREA(v_car_start_coords, 200, TRUE) CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MISSION_VEH) STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300) REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300) SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE) iStageProgress++ ENDIF BREAK CASE 1 REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() SET_SRL_TIME(TO_FLOAT(TIMERA())) IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() FADE_OUT() iStageProgress+=2 ENDIF IF (IS_SYNCHRONIZED_SCENE_RUNNING(iWalkInScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iWalkInScene) > 0.95) OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iWalkInScene) iWalkInScene = -1 sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA") ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, <<-835.1494, 180.1434, 71.9064>>, <<12.6567, 0.0000, -102.4400>>, 5000) ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, <<-835.7494, 180.2434, 71.9064>>, <<12.6567, 0.0000, -102.4400>>, 5000) SET_CAM_FOV(sTimelapse.splineCamera, 47.9931) SET_CAM_ACTIVE(sTimelapse.splineCamera, TRUE) PLAY_SOUND_FRONTEND(-1, "TIME_LAPSE_MASTER") SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE, FALSE) SET_CAM_ACTIVE(camIGIntro, FALSE) iSkipToHour = 10 SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE) iStageProgress++ ENDIF BREAK CASE 2 REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() SET_SRL_TIME(TO_FLOAT(TIMERA())) IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(iSkipToHour, 0, "EXTRASUNNY", "cirrocumulus", sTimelapse) RELEASE_AMBIENT_AUDIO_BANK() SETTIMERA(0) iStageProgress++ ENDIF IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED() SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE, FALSE) WAIT(0) FADE_OUT() iStageProgress++ ENDIF BREAK CASE 3 REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() IF TIMERA() > 300 AND HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(PLAYER_PED_ID()) AND GET_IS_WAYPOINT_RECORDING_LOADED("fam2Stairs") SETUP_CLOTHES() IF DOES_ENTITY_EXIST(pedJimmy) SET_ENTITY_VISIBLE(pedJimmy, TRUE) SET_ENTITY_COLLISION(pedJimmy, TRUE) FREEZE_ENTITY_POSITION(pedJimmy, FALSE) ENDIF SET_CLOCK_TIME(10, 0, 0) iStageProgress++ ENDIF BREAK CASE 4 REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() iStageProgress = 0 current_mission_stage = stage_intro BREAK ENDSWITCH BREAK CASE stage_intro RUN_INTRO_CUTSCENE() BREAK CASE stage_drive_to_venice GO_TO_VENICE() BREAK CASE stage_hire_bike DO_IN_GAME_BIKE_HIRE() BREAK CASE stage_bike_ride BIKE_RIDE2() BREAK CASE stage_telltale RUN_PIER_CUTSCENE() BREAK CASE stage_go_to_yacht GO_TO_YACHT() BREAK CASE stage_rescue RUN_RESCUE_CUTSCENE() BREAK CASE stage_speedophile_chase SPEEDOPHILE_CHASE2() MANAGE_AMBIENT_MARINA_BOATS() BREAK CASE stage_drive_to_beach DRIVE_BACK() BREAK CASE stage_finish RUN_FINAL_CUTSCENE() BREAK CASE stage_lose_cops LOSE_THE_COPS() BREAK DEFAULT SCRIPT_ASSERT("Unrecognised Mission Stage!") BREAK ENDSWITCH HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE() IF IS_VEHICLE_DRIVEABLE(vehPlayerCar) AND NOT IS_PED_INJURED(pedJimmy) IF IS_PED_IN_VEHICLE(pedJimmy, vehPlayerCar) SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(pedJimmy, FALSE) ENDIF ENDIF #IF IS_DEBUG_BUILD IF bRun RUN_TEST() bRun = FALSE ENDIF #ENDIF MANAGE_BLOCKING_AREAS() MANAGE_BIKE_SHOP() MANAGE_DANCING_SCENE() IF DOES_ENTITY_EXIST(pedJimmy) AND NOT IS_PED_INJURED(pedJimmy) SET_PED_RESET_FLAG(pedJimmy, PRF_DisablePlayerMeleeFriendlyAttacks, TRUE) ENDIF IF DOES_ENTITY_EXIST(pedTracy) AND NOT IS_PED_INJURED(pedTracy) SET_PED_RESET_FLAG(pedTracy, PRF_DisablePlayerMeleeFriendlyAttacks, TRUE) ENDIF IF bPlayerGroundingChecked bPlayerGroundingChecked = FALSE ENDIF IF bChaserGroundingChecked bChaserGroundingChecked = FALSE ENDIF #IF IS_DEBUG_BUILD DEBUG_PROCS() RUN_WIDGETS() #ENDIF WAIT(0) ENDWHILE ENDSCRIPT