11278 lines
370 KiB
Python
Executable File
11278 lines
370 KiB
Python
Executable File
//╒═════════════════════════════════════════════════════════════════════════════╕
|
|
//│ 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, <<COS(fHead+90), SIN(fHead+90), 0>>, 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 a<b
|
|
RETURN a
|
|
ELSE
|
|
RETURN b
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
FUNC FLOAT MAX(FLOAT a, FLOAT b)
|
|
IF a>b
|
|
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>> + <<iChaser, 0, 0>>)
|
|
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()))<POW(200, 2)
|
|
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
|
|
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, <<GET_RANDOM_FLOAT_IN_RANGE(minXrange, maxXrange), GET_RANDOM_FLOAT_IN_RANGE(minYRange, maxYrange), 0.0>>)
|
|
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(<<vBounds[iTemp].x, vBounds[iTemp].y, 40>>, <<vBounds[iTemp+1].x, vBounds[iTemp+1].y, 40>>, r,0,b)
|
|
IF r = 255
|
|
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(iTemp), <<vBounds[iTemp].x, vBounds[iTemp].y, 41>>)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
DRAW_DEBUG_LINE(<<vBounds[COUNT_OF(vBounds)-1].x, vBounds[COUNT_OF(vBounds)-1].y, 40>>, <<vBounds[0].x, vBounds[0].y, 40>>, r,0,b)
|
|
IF r = 255
|
|
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(COUNT_OF(vBounds)-1), <<vBounds[COUNT_OF(vBounds)-1].x, vBounds[COUNT_OF(vBounds)-1].y, 41>>)
|
|
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, <<vSeasharkChaseStartCoords.x, vSeasharkChaseStartCoords.y, fHeight>>)
|
|
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], <<vTemp.x, vTemp.y, fTemp>>)
|
|
|
|
//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, <<vSeasharkChaseStartCoords.x, vSeasharkChaseStartCoords.y, fHeight>>)
|
|
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
|