13754 lines
554 KiB
Python
Executable File
13754 lines
554 KiB
Python
Executable File
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : franklin2.sc
|
|
// AUTHOR : Kevin Bolt, Ben Wilson, Matthew Booton
|
|
// DESCRIPTION : Lamar is in trouble, Franklin goes to the sawmill to rescue
|
|
// him with the help of Michael and Trevor.
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
//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_audio.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_clock.sch"
|
|
USING "commands_debug.sch"
|
|
USING "commands_fire.sch"
|
|
USING "commands_graphics.sch"
|
|
USING "commands_hud.sch"
|
|
USING "commands_misc.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_ped.sch"
|
|
USING "commands_physics.sch"
|
|
USING "commands_player.sch"
|
|
USING "commands_recording.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_task.sch"
|
|
USING "commands_vehicle.sch"
|
|
USING "commands_interiors.sch"
|
|
USING "commands_itemsets.sch"
|
|
|
|
USING "building_control_public.sch"
|
|
USING "cam_recording_public.sch"
|
|
USING "chase_hint_cam.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "emergency_call.sch"
|
|
USING "locates_public.sch"
|
|
USING "flow_public_core_override.sch"
|
|
USING "model_enums.sch"
|
|
USING "script_ped.sch"
|
|
USING "script_player.sch"
|
|
USING "script_misc.sch"
|
|
USING "script_blips.sch"
|
|
USING "script_heist.sch"
|
|
USING "selector_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "replay_public.sch"
|
|
USING "CompletionPercentage_public.sch"
|
|
USING "taxi_functions.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "vehicle_gen_public.sch"
|
|
USING "stripclub_public.sch"
|
|
USING "shop_public.sch"
|
|
USING "shared_hud_displays.sch"
|
|
USING "heist_end_screen.sch"
|
|
USING "vehicle_public.sch"
|
|
USING "achievement_public.sch"
|
|
USING "clearmissionarea.sch"
|
|
USING "cheat_controller_public.sch"
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
USING "shared_debug.sch"
|
|
USING "script_debug.sch"
|
|
USING "select_mission_stage.sch"
|
|
#ENDIF
|
|
|
|
ENUM MISSION_STAGE
|
|
STAGE_INTRO_CUTSCENE = 0,
|
|
STAGE_MEET_THE_CREW,
|
|
STAGE_MEET_CREW_CUTSCENE,
|
|
STAGE_GET_INTO_POSITION,
|
|
STAGE_ATTACK_SAWMILL,
|
|
STAGE_GET_LAMAR_OUT,
|
|
STAGE_DRIVE_HOME,
|
|
STAGE_OUTRO_CUTSCENE
|
|
ENDENUM
|
|
|
|
ENUM FAILED_REASON
|
|
FAILED_GENERIC = 0,
|
|
FAILED_COVER_BLOWN,
|
|
FAILED_LAMAR_DIED,
|
|
FAILED_TREVOR_DIED,
|
|
FAILED_MICHAEL_DIED,
|
|
FAILED_FRANKLIN_DIED,
|
|
FAILED_BULLDOZER_DESTROYED,
|
|
FAILED_ABANDONED_LAMAR,
|
|
FAILED_COPS_LED_TO_SAWMILL,
|
|
FAILED_MICHAELS_CAR_DESTROYED,
|
|
FAILED_TREVORS_CAR_DESTROYED
|
|
ENDENUM
|
|
|
|
ENUM SECTION_STAGE
|
|
SECTION_STAGE_SETUP = 0,
|
|
SECTION_STAGE_RUNNING,
|
|
SECTION_STAGE_CLEANUP,
|
|
SECTION_STAGE_SKIP,
|
|
SECTION_STAGE_JUMPING_TO_STAGE
|
|
ENDENUM
|
|
|
|
ENUM TRIGGERED_TEXT_LABEL
|
|
FRAN2_GOSAW = 0,
|
|
FRAN2_GETP,
|
|
FRAN2_FIND,
|
|
FRAN2_GETLAMAR,
|
|
FRAN2_SWFRANK,
|
|
FRAN2_SIGHELP,
|
|
FRAN2_SIGHELP2,
|
|
FRAN2_SPECHELP,
|
|
FRAN2_POSHELP,
|
|
FRAN2_getCar,
|
|
FRAN2_drvL,
|
|
FRAN2_phnhlp,
|
|
FRAN2_leadL,
|
|
FRAN2_PROT,
|
|
FRAN2_PROTFT,
|
|
FRAN2_switch,
|
|
FRAN2_SWITCH2,
|
|
LM2_ALONE,
|
|
LM2_WHERE,
|
|
LM2_OUT,
|
|
LM2_LHEARM,
|
|
LM2_WAY,
|
|
LM2_NOWAIT,
|
|
lm2_lgof,
|
|
lm2_lgot,
|
|
LM2_LSEE,
|
|
LM2_SH1,
|
|
LM2_SH2,
|
|
LM2_SH3,
|
|
LM2_SH4,
|
|
LM2_SH5,
|
|
LM2_SH6,
|
|
LM2_SH7,
|
|
LM2_SH8,
|
|
LM2_snipe1,
|
|
lm2_movin,
|
|
LM2_BANT1,
|
|
LM2_BANT2,
|
|
LM2_BANT3,
|
|
LM2_BANT4,
|
|
LM2_BANT5,
|
|
LM2_BANT6,
|
|
LM2_BANT6b,
|
|
LM2_LSIDE,
|
|
LM2_MORE1,
|
|
LM2_MORE2,
|
|
LM2_MORE3,
|
|
LM2_MORE4,
|
|
LM2_MORE5,
|
|
LM2_LCARS,
|
|
LM2_miKill,
|
|
LM2_PICK,
|
|
LM2_FRANPICK,
|
|
LM2_MIKEBANG,
|
|
LM2_MIXT,
|
|
LM2_MIXF,
|
|
LM2_TREVSAME,
|
|
LM2_PREBANG,
|
|
lm2_bang,
|
|
LM2_TREVBANG,
|
|
LM2_MATT,
|
|
LM2_NOCLOSE,
|
|
LM2_SPOTL,
|
|
LM2_MIKEHURT1,
|
|
Lm2_frank,
|
|
Lm2_mut,
|
|
Lm2_flank,
|
|
LM2_mrpg,
|
|
LM2_deal,
|
|
LM2_deal2,
|
|
LM2_MPATH,
|
|
LM2_PHNL,
|
|
FRAN2_RETSAW,
|
|
LM2_TAKE,
|
|
LM2_LBYEM,
|
|
LM2_LBYET,
|
|
LM2_MGOING,
|
|
LM2_tbye,
|
|
LM2_leaveA,
|
|
lm2_leave,
|
|
Lm2_onphn,
|
|
LM2_SNIPER,
|
|
LM2_phn,
|
|
LM2_Snipe3A,
|
|
LM2_Snipe3B,
|
|
LM2_enc1,
|
|
LM2_enc2,
|
|
LM2_move,
|
|
LM2_move2,
|
|
LM2_driveT,
|
|
LM2_ANYSIGN,
|
|
LM2_ANYSIGN2,
|
|
LM2_ANYSIGN3,
|
|
LM2_FOUND,
|
|
LM2_FOUND2,
|
|
LM2_FOUND3,
|
|
LM2_WEED,
|
|
FRAN2_SNIPEHELP
|
|
ENDENUM
|
|
|
|
ENUM SAWMILL_ENTRY_POINT
|
|
ENTRY_POINT_BY_SNIPER_HILL = 0,
|
|
ENTRY_POINT_BY_METAL_BRIDGE,
|
|
ENTRY_POINT_BY_CONVEYOR_BELT,
|
|
ENTRY_POINT_BY_CLIFF,
|
|
ENTRY_POINT_BY_BULLDOZER,
|
|
ENTRY_POINT_BY_WOOD_LOGS,
|
|
ENTRY_POINT_BY_TRAIN_TUNNEL
|
|
ENDENUM
|
|
|
|
ENUM BUDDY_SHOOTOUT_ROUTE
|
|
BUDDY_ROUTE_BULLDOZER = 0,
|
|
BUDDY_ROUTE_BULLDOZER_ON_FOOT,
|
|
BUDDY_ROUTE_SNIPING,
|
|
BUDDY_ROUTE_REAR,
|
|
BUDDY_ROUTE_FRONT_ASSAULT,
|
|
BUDDY_ROUTE_IN_PLAYERS_GROUP
|
|
ENDENUM
|
|
|
|
STRUCT MISSION_VEHICLE
|
|
VEHICLE_INDEX veh
|
|
BLIP_INDEX blip
|
|
INT iEvent
|
|
ENDSTRUCT
|
|
|
|
STRUCT MISSION_PED
|
|
PED_INDEX ped
|
|
BLIP_INDEX blip
|
|
INT iEvent
|
|
ENDSTRUCT
|
|
|
|
STRUCT BUDDY_DATA
|
|
PED_INDEX ped
|
|
BLIP_INDEX blip
|
|
COVERPOINT_INDEX cover
|
|
INT iEvent
|
|
INT iPrevMaxEvent
|
|
INT iTimer
|
|
INT iHealth
|
|
BOOL bRefreshTasks
|
|
BOOL bIsUsingSecondaryCover
|
|
BOOL bSwitchedFromThisPed
|
|
BOOL bSwitchBlocked
|
|
VECTOR vDest
|
|
ENDSTRUCT
|
|
|
|
STRUCT ENEMY_DATA
|
|
PED_INDEX ped
|
|
BLIP_INDEX blip
|
|
COVERPOINT_INDEX cover
|
|
BOOL bIsCreated
|
|
BOOL bSetToCharge
|
|
BOOL bBlockOpenCombat
|
|
BOOL bForcedLowAccuracy
|
|
INT iEvent
|
|
INT iTimer
|
|
INT iRopeEvent
|
|
VECTOR vDest
|
|
AI_BLIP_STRUCT sBlipData
|
|
ENDSTRUCT
|
|
|
|
VECTOR vMeetLocation = <<-727.5588, 5313.5103, 71.4980>>
|
|
VECTOR vMichaelsCarStartPos = <<-716.7578, 5319.3579, 70.8262>>
|
|
VECTOR vTrevorsCarStartPos = <<-718.4451, 5304.8486, 71.6183>>
|
|
VECTOR vMichaelMeetingPos = <<-715.2372, 5317.7798, 70.6856>>
|
|
VECTOR vTrevorMeetingPos = <<-719.1467, 5308.0078, 71.6904>>
|
|
VECTOR vBulldozerStartPos = <<-540.0828, 5425.9590, 62.3495>>
|
|
VECTOR vLamarShootoutStartPos = <<-523.0940, 5309.0811, 79.2679>>
|
|
VECTOR vSawmillExitPos = <<-579.0994, 5246.1548, 69.4693>>
|
|
VECTOR vFrontRouteStartPos = <<-654.8719, 5241.6436, 75.2173>>
|
|
VECTOR vRearRouteStartPos = <<-440.6452, 5429.0010, 76.2830>>
|
|
VECTOR vBulldozerRouteStartPos = <<-545.1334, 5428.2881, 61.8625>>
|
|
VECTOR vMichaelSnipePos = <<-555.7971, 5214.8340, 81.4045>>//<<-566.6038, 5214.9829, 82.3980>>
|
|
VECTOR vGoHomePos = <<-71.2345, -1466.6842, 30.9867>>
|
|
VECTOR vReplayCarPos = <<-732.8705, 5317.5469, 71.9049>>
|
|
VECTOR vMichaelSwitchAimPos = <<0.0, 0.0, 0.0>>
|
|
VECTOR vChosenRoutePos = <<0.0, 0.0, 0.0>>
|
|
VECTOR vPosOfLastPlayerKill = <<0.0, 0.0, 0.0>>
|
|
|
|
BOOL bMissionFailed = FALSE
|
|
BOOL bSkippedMocap = FALSE
|
|
BOOL bHasUsedCheckpoint = FALSE
|
|
BOOL bCreatedBallaStartCars = FALSE
|
|
BOOL bEnemiesHaveBeenAlerted = FALSE
|
|
BOOL bLamarHasBeenRescued = FALSE
|
|
BOOL bHitLocateBallasOnBelt = FALSE
|
|
BOOL bHitLocateBallasTimber1 = FALSE
|
|
BOOL bHitLocateBallasTimber2 = FALSE
|
|
BOOL bHitLocateBallasBulldozer1 = FALSE
|
|
BOOL bHitLocateBallasBulldozer2 = FALSE
|
|
BOOL bHitLocateBallasBeforeTimber = FALSE
|
|
BOOL bHitLocateBallasSniper = FALSE
|
|
BOOL bHitLocateBallasRearTimber1 = FALSE
|
|
BOOL bHitLocateBallasRearTimber2 = FALSE
|
|
BOOL bHitLocateBallasPostRescueTimber = FALSE
|
|
BOOL bHitLocateBallasPostRescueExit = FALSE
|
|
BOOL bHitLocateBallasRocket = FALSE
|
|
BOOL bHitLocateBallasBulldozer3 = FALSE
|
|
BOOL bBulldozerReachedDestination = FALSE
|
|
BOOL bBulldozerIsInMixGroup = FALSE
|
|
BOOL bEscapedSawmill = FALSE
|
|
BOOL bTaxiDropoffUpdated = FALSE
|
|
BOOL bPlayerPickedStartCar = FALSE
|
|
BOOL bMichaelHUDFlashingForSniper = FALSE
|
|
BOOL bMichaelHUDFlashingForRocket = FALSE
|
|
BOOL bSwitchHUDFlashingToGetLamar = FALSE
|
|
BOOL bMichaelIsGettingFlanked = FALSE
|
|
BOOL bPlayerGivenLookAtLamarTask = FALSE
|
|
BOOL bMichaelSetToMoveFreely = FALSE
|
|
BOOl bTrevorTriggeredShootoutEarly = FALSE
|
|
BOOL bPlayerIsInShootoutAreaForSwitch = FALSE
|
|
BOOL bBulldozerCoverDisabled = FALSE
|
|
BOOL bReplayEventStarted = FALSE
|
|
BOOL bHasTextLabelTriggered[120]
|
|
|
|
CONST_INT CHECKPOINT_FRANKLIN2_ATTACK_SAWMILL 1
|
|
CONST_INT CHECKPOINT_FRANKLIN2_GET_LAMAR_OUT 2
|
|
CONST_INT CHECKPOINT_FRANKLIN2_FLEE_AREA 3
|
|
CONST_INT CARREC_BALLA_POST_RESCUE_1 10
|
|
CONST_INT CARREC_BALLA_POST_RESCUE_2 11
|
|
CONST_INT CARREC_BALLA_POST_RESCUE_3 12
|
|
INT iCurrentEvent = 0
|
|
INT iSwitchStage = 0
|
|
INT iHealthBeforeSwitch = 0
|
|
INT iTimeOfLastSwitch = 0
|
|
INT iNavmeshBlockUnderSawmill = -1
|
|
INT iNavmeshBlockByTimber = -1
|
|
INT iEnemyToCheckForAlert = 0
|
|
INT iCombatDialogueWaitTime = 0
|
|
INT iPlayerCombatDialogueTimer = 0
|
|
INT iBuddyCombatDialogueTimer = 0
|
|
INT iBuddyUpdateDialogueTimer = 0
|
|
INT iLamarCombatDialogueTimer = 0
|
|
INT iLocateCheckIndex = 0
|
|
INT iMainDialogueTimer = 0
|
|
INT iTimeLastPedKilledByMichael = 0
|
|
INT iTimeLastPedKilledByFranklin = 0
|
|
INT iTimeLastPedKilledByPlayer = 0
|
|
INT iFranklinInDangerTimer = 0
|
|
INT iTrevorInDangerTimer = 0
|
|
INT iFranklinDangerDialogueTimer = 0
|
|
INT iTrevorDangerDialogueTimer = 0
|
|
INT iNumTimesFiredRocket = 0
|
|
INT iBallaRocketTimer = 0
|
|
INT iBulldozerLiftTimer = 0
|
|
INT iFinalSwitchTimer = 0
|
|
INT iBulldozerJackTimer = 0
|
|
INT iTimeSinceLamarRescued = 0
|
|
INT iTimeSniperStartedAttacking = 0
|
|
INT iRocketDialogueTimer = 0
|
|
INT iSniperDialogueTimer = 0
|
|
INT iTimePlayerGaveSignal = 0
|
|
INT iTimeSincePlayerShotSniperRifle = 0
|
|
INT iTimeSinceSwitchToMichael = 0
|
|
INT iLamarFireTimer = 0
|
|
INT iWantedFailTimer = 0
|
|
INT iTimePlayedGotoMichaelDialogue = 0
|
|
INT iBallasPedToSpeak = 0
|
|
INT iFirstPersonSnipeAimTimer = 0
|
|
|
|
FLOAT fMichaelsCarStartHeading = 261.2129
|
|
FLOAT fTrevorsCarStartHeading = 15.0
|
|
FLOAT fMichaelMeetingHeading = 221.4874
|
|
FLOAT fTrevorMeetingHeading = 283.0
|
|
FLOAT fBulldozerStartHeading = 104.2
|
|
FLOAT fLamarShootoutStartHeading = 163.0
|
|
FLOAT fMichaelSnipeHeading = -14.1
|
|
FLOAT fReplayCarHeading = 261.1234
|
|
FLOAT fBulldozerCruiseSpeed = 0.0
|
|
|
|
STRING strLamarInjuredWalkAnims = "move_injured_generic"
|
|
STRING strLamarInjuredAnims = "missfra2"
|
|
STRING strFailLabel
|
|
STRING strWaypointBulldozerRoute = "fra2_001"
|
|
STRING strWaypointRearRoute = "fra2_002"
|
|
STRING strWaypointFrontRoute = "fra2_003"
|
|
STRING strWaypointBulldozer = "fratwoWP0"
|
|
STRING strCarrec = "fratwo"
|
|
STRING strPickupAnims = "pickup_object"
|
|
|
|
BLIP_INDEX blipCurrentObjective
|
|
BLIP_INDEX blipBulldozerRoute
|
|
BLIP_INDEX blipFrontRoute
|
|
BLIP_INDEX blipRearRoute
|
|
|
|
CAMERA_INDEX camMain
|
|
|
|
COVERPOINT_INDEX coverShootout[20]
|
|
|
|
OBJECT_INDEX objMichaelsWeapon
|
|
OBJECT_INDEX objShootoutCover[5]
|
|
OBJECT_INDEX objExtraWeed[3]
|
|
OBJECT_INDEX objFrontDoor
|
|
|
|
PICKUP_INDEX pickupShootout[3]
|
|
|
|
SCENARIO_BLOCKING_INDEX sbiShootout[1]
|
|
|
|
VEHICLE_INDEX vehMichaelsCar
|
|
VEHICLE_INDEX vehTrevorsCar
|
|
VEHICLE_INDEX vehFinalCutsceneCar
|
|
VEHICLE_INDEX vehReplayCar
|
|
VEHICLE_INDEX vehBallaStart[6]
|
|
VEHICLE_INDEX vehBallaPostRescueTimber
|
|
VEHICLE_INDEX vehBallaPostRescueExit[2]
|
|
|
|
MODEL_NAMES modelBulldozer = BULLDOZER
|
|
MODEL_NAMES modelBalla = G_M_Y_BallaOrig_01
|
|
MODEL_NAMES modelBallaStartCars = BISON
|
|
MODEL_NAMES modelBallaReinforcementCar = FELON
|
|
MODEL_NAMES modelExtraCover1 = PROP_WOODPILE_01B
|
|
MODEL_NAMES modelExtraCover2 = PROP_SKIP_01A
|
|
MODEL_NAMES modelWeedPallet = Prop_Weed_Pallet
|
|
|
|
MISSION_STAGE eMissionStage = STAGE_INTRO_CUTSCENE
|
|
SECTION_STAGE eSectionStage = SECTION_STAGE_SETUP
|
|
SELECTOR_SLOTS_ENUM eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
BUDDY_SHOOTOUT_ROUTE eMichaelRoute = BUDDY_ROUTE_SNIPING
|
|
BUDDY_SHOOTOUT_ROUTE eTrevorRoute = BUDDY_ROUTE_BULLDOZER
|
|
BUDDY_SHOOTOUT_ROUTE eFranklinRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
BUDDY_SHOOTOUT_ROUTE ePrevTrevorRoute = BUDDY_ROUTE_BULLDOZER
|
|
BUDDY_SHOOTOUT_ROUTE ePrevFranklinRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
BUDDY_SHOOTOUT_ROUTE ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
SAWMILL_ENTRY_POINT ePointOfEnemySpawn = ENTRY_POINT_BY_METAL_BRIDGE
|
|
SWITCH_TYPE eFinalSwitchType = SWITCH_TYPE_SHORT
|
|
|
|
SELECTOR_PED_STRUCT sSelectorPeds
|
|
LOCATES_HEADER_DATA sLocatesData
|
|
|
|
BUDDY_DATA sTrevor
|
|
BUDDY_DATA sMichael
|
|
BUDDY_DATA sFranklin
|
|
BUDDY_DATA sLamar
|
|
|
|
ENEMY_DATA sBallasStart[7]
|
|
ENEMY_DATA sBallasAfterAlert[4]
|
|
ENEMY_DATA sBallasGuardingLamar[1]
|
|
ENEMY_DATA sBallasOnBelt[1]
|
|
ENEMY_DATA sBallasBeforeTimber[4]
|
|
ENEMY_DATA sBallasTimber1[4]
|
|
ENEMY_DATA sBallasTimber2[4]
|
|
ENEMY_DATA sBallasAfterLamar[3]
|
|
ENEMY_DATA sBallasAfterLamar2[4]
|
|
ENEMY_DATA sBallasAfterLamar3[1]
|
|
ENEMY_DATA sBallasBulldozer1[3]
|
|
ENEMY_DATA sBallasBulldozer2[3]
|
|
ENEMY_DATA sBallasBulldozer3[3]
|
|
ENEMY_DATA sBallasRocket[1]
|
|
ENEMY_DATA sBallasSniper[1]
|
|
ENEMY_DATA sBallasFrontExtra[3]
|
|
ENEMY_DATA sBallasRearTimber1[4]
|
|
ENEMY_DATA sBallasRearTimber2[4]
|
|
ENEMY_DATA sBallasPostRescueTimber[3]
|
|
ENEMY_DATA sBallasPostRescueExit[6]
|
|
ENEMY_DATA sBallasOnPhone[1]
|
|
|
|
MISSION_VEHICLE sBulldozer
|
|
|
|
REL_GROUP_HASH relGroupBallas
|
|
REL_GROUP_HASH relGroupNeutral
|
|
|
|
structPedsForConversation sConversationPeds
|
|
SELECTOR_CAM_STRUCT sSelectorCam
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID widgetDebug
|
|
|
|
CONST_INT MAX_SKIP_MENU_LENGTH 8
|
|
INT iDebugJumpStage = 0
|
|
INT iDebugMichaelRoute = 0
|
|
INT iDebugFranklinRoute = 0
|
|
INT iDebugTrevorRoute = 0
|
|
INT iDebugPlayerRoute = 0
|
|
|
|
MissionStageMenuTextStruct sSkipMenu[MAX_SKIP_MENU_LENGTH]
|
|
|
|
BOOL bDebugShowDebug = FALSE
|
|
|
|
PROC CREATE_WIDGETS()
|
|
widgetDebug = START_WIDGET_GROUP("Franklin 2")
|
|
ADD_WIDGET_BOOL("Show debug display", bDebugShowDebug)
|
|
|
|
START_WIDGET_GROUP("Variables")
|
|
ADD_WIDGET_INT_READ_ONLY("iCurrentEvent", iCurrentEvent)
|
|
ADD_WIDGET_INT_READ_ONLY("sLamar.iEvent", sLamar.iEvent)
|
|
ADD_WIDGET_INT_READ_ONLY("sMichael.iEvent", sMichael.iEvent)
|
|
ADD_WIDGET_INT_READ_ONLY("sTrevor.iEvent", sTrevor.iEvent)
|
|
ADD_WIDGET_INT_READ_ONLY("sFranklin.iEvent", sFranklin.iEvent)
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugPlayerRoute", iDebugPlayerRoute)
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugMichaelRoute", iDebugMichaelRoute)
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugFranklinRoute", iDebugFranklinRoute)
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugTrevorRoute", iDebugTrevorRoute)
|
|
ADD_WIDGET_INT_READ_ONLY("iTrevorInDangerTimer", iTrevorInDangerTimer)
|
|
ADD_WIDGET_INT_READ_ONLY("iFranklinInDangerTimer", iFranklinInDangerTimer)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("fBulldozerCruiseSpeed", fBulldozerCruiseSpeed)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
SET_LOCATES_HEADER_WIDGET_GROUP(widgetDebug)
|
|
ENDPROC
|
|
|
|
PROC DESTROY_WIDGETS()
|
|
IF DOES_WIDGET_GROUP_EXIST(widgetDebug)
|
|
DELETE_WIDGET_GROUP(widgetDebug)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DRAW_INT_ABOVE_PED(PED_INDEX ped, INT i)
|
|
IF bDebugShowDebug
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
TEXT_LABEL str = ""
|
|
str += i
|
|
|
|
DRAW_DEBUG_TEXT(str, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(ped, <<0.0, 0.0, 1.0>>))
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
PROC CLEAR_TRIGGERED_LABELS()
|
|
INT iArraySize = COUNT_OF(bHasTextLabelTriggered)
|
|
INT i = 0
|
|
|
|
REPEAT iArraySize i
|
|
bHasTextLabelTriggered[i] = FALSE
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
///Gets the ped index for a given player ped character, if the character is the player it returns PLAYER_PED_ID(), otherwise it returns the relevant selector ped.
|
|
FUNC PED_INDEX GET_PED_INDEX(enumCharacterList eChar)
|
|
IF GET_PLAYER_PED_MODEL(eChar) = GET_ENTITY_MODEL(PLAYER_PED_ID())
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(eChar)]
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
|
|
PROC DISABLE_COMBAT_CONTROLS_THIS_FRAME(BOOL bAllowEnteringVehicles = FALSE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
|
|
IF NOT bAllowEnteringVehicles
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
ENDIF
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PREV_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_RELOAD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
|
|
ENDPROC
|
|
|
|
FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR vRot)
|
|
RETURN <<-SIN(vRot.z) * COS(vRot.x), COS(vRot.z) * COS(vRot.x), SIN(vRot.x)>>
|
|
ENDFUNC
|
|
|
|
PROC FIX_ALL_VEHICLE_TYRES(VEHICLE_INDEX veh)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC PED_INDEX CREATE_ENEMY_PED(MODEL_NAMES model, VECTOR vPos, FLOAT fHeading, REL_GROUP_HASH group,
|
|
INT iHealth = 200, INT iArmour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED, PED_TYPE ePedType = PEDTYPE_MISSION)
|
|
PED_INDEX ped = CREATE_PED(ePedType, model, vPos, fHeading)
|
|
GIVE_WEAPON_TO_PED(ped, weapon, INFINITE_AMMO, TRUE)
|
|
SET_PED_INFINITE_AMMO(ped, TRUE, weapon)
|
|
SET_PED_MAX_HEALTH(ped, iHealth)
|
|
SET_ENTITY_HEALTH(ped, iHealth)
|
|
ADD_ARMOUR_TO_PED(ped, -GET_PED_ARMOUR(ped))
|
|
ADD_ARMOUR_TO_PED(ped, iArmour)
|
|
SET_PED_DIES_WHEN_INJURED(ped, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ped, group)
|
|
SET_PED_AS_ENEMY(ped, TRUE)
|
|
SET_PED_TARGET_LOSS_RESPONSE(ped, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_DisableHurt, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
|
|
|
|
SET_PED_MONEY(ped, 0)
|
|
|
|
RETURN ped
|
|
ENDFUNC
|
|
|
|
FUNC PED_INDEX CREATE_ENEMY_PED_IN_VEHICLE(MODEL_NAMES model, VEHICLE_INDEX veh, VEHICLE_SEAT eSeat, REL_GROUP_HASH group,
|
|
INT iHealth = 200, INT iArmour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED, PED_TYPE ePedType = PEDTYPE_MISSION)
|
|
PED_INDEX ped
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
ped = CREATE_ENEMY_PED(model, GET_ENTITY_COORDS(veh) + <<0.0, 0.0, 3.0>>, 0.0, group, iHealth, iArmour, weapon, ePedType)
|
|
SET_PED_INTO_VEHICLE(ped, veh, eSeat)
|
|
ENDIF
|
|
|
|
RETURN ped
|
|
ENDFUNC
|
|
|
|
PROC SET_PED_COMBAT_PARAMS(PED_INDEX &ped, INT iAccuracy, COMBAT_MOVEMENT eMovement, COMBAT_ABILITY_LEVEL eAbility, COMBAT_RANGE eRange,
|
|
COMBAT_TARGET_LOSS_RESPONSE eTLR)
|
|
SET_PED_COMBAT_MOVEMENT(ped, eMovement)
|
|
SET_PED_COMBAT_ABILITY(ped, eAbility)
|
|
SET_PED_COMBAT_RANGE(ped, eRange)
|
|
SET_PED_ACCURACY(ped, iAccuracy)
|
|
SET_PED_TARGET_LOSS_RESPONSE(ped, eTLR)
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_ENEMY_PED(ENEMY_DATA &sEnemy, STRING strName, INT iIndex)
|
|
IF NOT IS_PED_INJURED(sEnemy.ped)
|
|
TASK_STAND_STILL(sEnemy.ped, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemy.ped, TRUE)
|
|
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(sEnemy.ped)
|
|
sEnemy.bIsCreated = TRUE
|
|
sEnemy.bSetToCharge = FALSE
|
|
sEnemy.bForcedLowAccuracy = FALSE
|
|
sEnemy.bBlockOpenCombat = FALSE
|
|
sEnemy.iEvent = 0
|
|
sEnemy.iTimer = 0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL_31 strDebugName = strName
|
|
strDebugName += iIndex
|
|
SET_PED_NAME_DEBUG(sEnemy.ped, strDebugName)
|
|
#ENDIF
|
|
|
|
#IF NOT IS_DEBUG_BUILD
|
|
strName = strName // to prevent an Unreferenced variable error
|
|
iIndex = iIndex
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_ENEMY_GROUP(ENEMY_DATA &sEnemies[], STRING name)
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(sEnemies) i
|
|
INITIALISE_ENEMY_PED(sEnemies[i], name, i)
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC CLEAN_UP_ENEMY_PED(ENEMY_DATA &sEnemy, BOOL bResetVariables = FALSE)
|
|
IF DOES_BLIP_EXIST(sEnemy.blip)
|
|
REMOVE_BLIP(sEnemy.blip)
|
|
ENDIF
|
|
|
|
CLEANUP_AI_PED_BLIP(sEnemy.sBlipData)
|
|
|
|
IF NOT IS_PED_INJURED(sEnemy.ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sEnemy.ped, NORMAL_BLEND_OUT, TRUE)
|
|
ELSE
|
|
//Increment the kill stat if this ped was killed by the player.
|
|
IF DOES_ENTITY_EXIST(sEnemy.ped)
|
|
ENTITY_INDEX entityDeathSource = GET_PED_SOURCE_OF_DEATH(sEnemy.ped)
|
|
|
|
IF DOES_ENTITY_EXIST(entityDeathSource)
|
|
AND IS_ENTITY_A_PED(entityDeathSource)
|
|
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entityDeathSource) = PLAYER_PED_ID()
|
|
REL_GROUP_HASH eEnemyGroup = GET_PED_RELATIONSHIP_GROUP_HASH(sEnemy.ped)
|
|
|
|
IF eEnemyGroup = relGroupBallas
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_KILLS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REMOVE_COVER_POINT(sEnemy.cover)
|
|
SET_PED_AS_NO_LONGER_NEEDED(sEnemy.ped)
|
|
|
|
IF bResetVariables
|
|
sEnemy.bIsCreated = FALSE
|
|
sEnemy.iEvent = 0
|
|
sEnemy.iTimer = 0
|
|
sEnemy.iRopeEvent = 0
|
|
sEnemy.ped = NULL
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC KILL_ENEMY_GROUP_INSTANTLY(ENEMY_DATA &sEnemies[])
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(sEnemies) i
|
|
sEnemies[i].bIsCreated = TRUE
|
|
|
|
IF NOT IS_PED_INJURED(sEnemies[i].ped)
|
|
SET_ENTITY_HEALTH(sEnemies[i].ped, 0)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
///Counts the number of enemies currently alive in the group. If the group hasn't been created yet than all the peds are considered as alive.
|
|
FUNC INT GET_NUM_ENEMIES_ALIVE_IN_GROUP(ENEMY_DATA &sEnemies[])
|
|
INT iNumAlive = 0
|
|
INT iNumEnemiesInGroup = COUNT_OF(sEnemies)
|
|
INT i = 0
|
|
|
|
IF sEnemies[0].bIsCreated
|
|
REPEAT iNumEnemiesInGroup i
|
|
IF NOT IS_PED_INJURED(sEnemies[i].ped)
|
|
iNumAlive++
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
iNumAlive = iNumEnemiesInGroup
|
|
ENDIF
|
|
|
|
RETURN iNumAlive
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Helper function to set up a ped's personal cover point and defensive sphere in one go.
|
|
PROC SET_PED_COVER_POINT_AND_SPHERE(PED_INDEX &ped, COVERPOINT_INDEX &cover, VECTOR vPos, FLOAT fHeading, FLOAT fSphereRadius,
|
|
COVERPOINT_USAGE covUsage, COVERPOINT_HEIGHT covHeight, COVERPOINT_ARC covArc, BOOL bGoToCentreOfSphere = FALSE)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF cover != NULL
|
|
REMOVE_COVER_POINT(cover)
|
|
ENDIF
|
|
|
|
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(vPos)
|
|
cover = ADD_COVER_POINT(vPos, fHeading, covUsage, covHeight, covArc)
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(ped, vPos, fSphereRadius, bGoToCentreOfSphere)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_OBJECT(OBJECT_INDEX &obj, BOOL bForceDelete = FALSE)
|
|
IF DOES_ENTITY_EXIST(obj)
|
|
IF IS_ENTITY_ATTACHED(obj)
|
|
DETACH_ENTITY(obj)
|
|
ENDIF
|
|
|
|
IF bForceDelete
|
|
DELETE_OBJECT(obj)
|
|
ELSE
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(obj)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_VEHICLE(VEHICLE_INDEX &veh, BOOL bForceDelete = FALSE)
|
|
IF DOES_ENTITY_EXIST(veh)
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF IS_ENTITY_ATTACHED(veh)
|
|
DETACH_ENTITY(veh)
|
|
ENDIF
|
|
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(veh, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh, FALSE)
|
|
IF bForceDelete
|
|
DELETE_VEHICLE(veh)
|
|
ELSE
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_PED(PED_INDEX &ped, BOOL bForceDelete = FALSE)
|
|
IF DOES_ENTITY_EXIST(ped)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(ped, NORMAL_BLEND_OUT, TRUE)
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(ped, TRUE)
|
|
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(ped)
|
|
IF IS_ENTITY_ATTACHED_TO_ANY_OBJECT(ped)
|
|
OR IS_ENTITY_ATTACHED_TO_ANY_PED(ped)
|
|
OR IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(ped)
|
|
DETACH_ENTITY(ped)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(ped)
|
|
SET_ENTITY_COLLISION(ped, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_PED_GROUP_MEMBER(ped, PLAYER_GROUP_ID())
|
|
REMOVE_PED_FROM_GROUP(ped)
|
|
ENDIF
|
|
|
|
SET_PED_KEEP_TASK(ped, TRUE)
|
|
ENDIF
|
|
|
|
IF bForceDelete
|
|
DELETE_PED(ped)
|
|
ELSE
|
|
SET_PED_AS_NO_LONGER_NEEDED(ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ENEMY_GROUP(ENEMY_DATA &peds[], BOOL bForceDelete = FALSE)
|
|
INT i = 0
|
|
REPEAT COUNT_OF(peds) i
|
|
IF DOES_BLIP_EXIST(peds[i].blip)
|
|
REMOVE_BLIP(peds[i].blip)
|
|
ENDIF
|
|
|
|
CLEANUP_AI_PED_BLIP(peds[i].sBlipData)
|
|
|
|
REMOVE_COVER_POINT(peds[i].cover)
|
|
|
|
//Give them combat in most cases
|
|
IF NOT IS_PED_INJURED(peds[i].ped)
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(peds[i].ped)
|
|
AND GET_PED_RELATIONSHIP_GROUP_HASH(peds[i].ped) = relGroupBallas
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
TASK_COMBAT_PED(peds[i].ped, PLAYER_PED_ID())
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
|
|
//SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].ped, TRUE)
|
|
SET_PED_KEEP_TASK(peds[i].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REMOVE_PED(peds[i].ped, bForceDelete)
|
|
|
|
peds[i].bIsCreated = FALSE
|
|
peds[i].iEvent = 0
|
|
peds[i].iRopeEvent = 0
|
|
peds[i].iTimer = 0
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(VEHICLE_INDEX &veh, FLOAT fTime)
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh, fTime - GET_TIME_POSITION_IN_RECORDING(veh))
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Converges a value towards a given destination, by adding/removing a given amount.
|
|
/// If bAdjustForFramerate is true, then fAmountToConverge is scaled by frame time.
|
|
PROC CONVERGE_VALUE(FLOAT &val, FLOAT fDesiredVal, FLOAT fAmountToConverge, BOOL bAdjustForFramerate = FALSE)
|
|
IF val != fDesiredVal
|
|
FLOAT fConvergeAmountThisFrame = fAmountToConverge
|
|
IF bAdjustForFramerate
|
|
fConvergeAmountThisFrame = 0.0 +@ (fAmountToConverge * 30.0)
|
|
ENDIF
|
|
|
|
IF val - fDesiredVal > fConvergeAmountThisFrame
|
|
val -= fConvergeAmountThisFrame
|
|
ELIF val - fDesiredVal < -fConvergeAmountThisFrame
|
|
val += fConvergeAmountThisFrame
|
|
ELSE
|
|
val = fDesiredVal
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_FADE_OUT_WITH_WAIT()
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_FADE_IN_WITH_WAIT()
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_BLIPS()
|
|
IF DOES_BLIP_EXIST(blipCurrentObjective)
|
|
REMOVE_BLIP(blipCurrentObjective)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(blipBulldozerRoute)
|
|
REMOVE_BLIP(blipBulldozerRoute)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(blipFrontRoute)
|
|
REMOVE_BLIP(blipFrontRoute)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(blipRearRoute)
|
|
REMOVE_BLIP(blipRearRoute)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sMichael.blip)
|
|
REMOVE_BLIP(sMichael.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sTrevor.blip)
|
|
REMOVE_BLIP(sTrevor.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sFranklin.blip)
|
|
REMOVE_BLIP(sFranklin.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLamar.blip)
|
|
REMOVE_BLIP(sLamar.blip)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_SHOOTOUT_OBJECTS(BOOL bForceDelete = FALSE)
|
|
INT i = 0
|
|
REPEAT COUNT_OF(objShootoutCover) i
|
|
REMOVE_OBJECT(objShootoutCover[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objExtraWeed) i
|
|
REMOVE_OBJECT(objExtraWeed[i], bForceDelete)
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_OBJECTS(BOOL bForceDelete = FALSE)
|
|
REMOVE_OBJECT(objMichaelsWeapon, bForceDelete)
|
|
REMOVE_OBJECT(objFrontDoor, FALSE)
|
|
|
|
REMOVE_ALL_SHOOTOUT_OBJECTS(bForceDelete)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_SHOOTOUT_PEDS(BOOL bForceDelete = FALSE)
|
|
REMOVE_ENEMY_GROUP(sBallasStart, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasAfterAlert, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasAfterLamar, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasAfterLamar2, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasAfterLamar3, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasGuardingLamar, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasOnBelt, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasBeforeTimber, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasTimber1, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasTimber2, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasBulldozer1, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasBulldozer2, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasRocket, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasSniper, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasFrontExtra, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasRearTimber1, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasRearTimber2, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasPostRescueTimber, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasPostRescueExit, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sBallasOnPhone, bForceDelete)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_PEDS(BOOL bForceDelete = FALSE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], bForceDelete)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], bForceDelete)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], bForceDelete)
|
|
REMOVE_PED(sLamar.ped, bForceDelete)
|
|
|
|
REMOVE_ALL_SHOOTOUT_PEDS(bForceDelete)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_SHOOTOUT_VEHICLES(BOOL bForceDelete = FALSE)
|
|
REMOVE_VEHICLE(vehBallaPostRescueTimber, bForceDelete)
|
|
REMOVE_VEHICLE(vehBallaPostRescueExit[0], bForceDelete)
|
|
REMOVE_VEHICLE(vehBallaPostRescueExit[1], bForceDelete)
|
|
REMOVE_VEHICLE(sBulldozer.veh, bForceDelete)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(vehBallaStart) i
|
|
REMOVE_VEHICLE(vehBallaStart[i], bForceDelete)
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_VEHICLES(BOOL bForceDelete = FALSE)
|
|
REMOVE_ALL_SHOOTOUT_VEHICLES(bForceDelete)
|
|
REMOVE_VEHICLE(vehFinalCutsceneCar, bForceDelete)
|
|
REMOVE_VEHICLE(vehMichaelsCar, bForceDelete)
|
|
REMOVE_VEHICLE(vehTrevorsCar, bForceDelete)
|
|
REMOVE_VEHICLE(vehReplayCar, bForceDelete)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_CAMERAS()
|
|
IF DOES_CAM_EXIST(camMain)
|
|
DESTROY_CAM(camMain)
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_WIDESCREEN_BORDERS(FALSE, 0)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_ANIMS()
|
|
REMOVE_ANIM_DICT(strLamarInjuredWalkAnims)
|
|
REMOVE_ANIM_DICT(strLamarInjuredAnims)
|
|
REMOVE_ANIM_DICT(strPickupAnims)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_AUDIO()
|
|
STOP_AUDIO_SCENES()
|
|
STOP_STREAM()
|
|
|
|
IF NOT bMissionFailed //This will have already triggered in that case.
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_FAIL")
|
|
ENDIF
|
|
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
ENDPROC
|
|
|
|
/// Cancels any music events from this mission that may
|
|
PROC CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
CANCEL_MUSIC_EVENT("FRA2_END_VEHICLE")
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Blocks all cops, ambulance and fire department.
|
|
PROC BLOCK_EMERGENCY_SERVICES_FOR_SHOOTOUT(BOOL bBlock)
|
|
IF bBlock
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_HELICOPTER, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, TRUE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, TRUE)
|
|
ELSE
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Blocks random peds and vehicles to help improve performance.
|
|
PROC BLOCK_AMBIENT_PEDS_AND_VEHICLES_FOR_SHOOTOUT(BOOL bBlock)
|
|
IF bBlock
|
|
SET_NUMBER_OF_PARKED_VEHICLES(0)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
SET_PED_POPULATION_BUDGET(0)
|
|
ELSE
|
|
SET_NUMBER_OF_PARKED_VEHICLES(-1)
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC BLOCK_ROADS_AT_SAWMILL(BOOL bBlock)
|
|
IF bBlock
|
|
SET_ROADS_IN_AREA(<<-713.6164, 5242.0498, 0.8567>>, <<-428.4971, 5498.2988, 171.8567>>, FALSE)
|
|
ELSE
|
|
SET_ROADS_BACK_TO_ORIGINAL(<<-713.6164, 5242.0498, 0.8567>>, <<-428.4971, 5498.2988, 171.8567>>)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC BLOCK_SCENARIOS_AT_SAWMILL(BOOL bBlock)
|
|
IF bBlock
|
|
IF sbiShootout[0] = NULL
|
|
sbiShootout[0] = ADD_SCENARIO_BLOCKING_AREA(<<-970.6, 5015.2, 0.8567>>, <<-228.4971, 5698.2988, 181.8567>>)
|
|
ENDIF
|
|
ELSE
|
|
IF sbiShootout[0] != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiShootout[0])
|
|
sbiShootout[0] = NULL
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(BOOL bActive)
|
|
INT i
|
|
|
|
IF bActive
|
|
IF coverShootout[0] = NULL
|
|
coverShootout[0] = ADD_COVER_POINT(<<-565.6465, 5257.0039, 69.4669>>, 175.0081, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[1] = NULL
|
|
coverShootout[1] = ADD_COVER_POINT(<<-581.6578, 5291.7690, 69.2604>>, 128.3183, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[2] = NULL
|
|
coverShootout[2] = ADD_COVER_POINT(<<-592.0037, 5236.3384, 69.9043>>, 325.1953, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[3] = NULL
|
|
coverShootout[3] = ADD_COVER_POINT(<<-487.6498, 5385.0801, 77.0692>>, 192.7037, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[4] = NULL
|
|
coverShootout[4] = ADD_COVER_POINT(<<-499.8006, 5292.3442, 79.6100>>, 158.0821, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[5] = NULL
|
|
coverShootout[5] = ADD_COVER_POINT(<<-580.1699, 5262.9121, 69.4438>>, 56.7250, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[6] = NULL
|
|
coverShootout[6] = ADD_COVER_POINT(<<-588.9133, 5318.1499, 69.2144>>, 333.8809, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[7] = NULL
|
|
coverShootout[7] = ADD_COVER_POINT(<<-582.0135, 5334.6250, 69.2144>>, 329.7396, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[8] = NULL
|
|
coverShootout[8] = ADD_COVER_POINT(<<-554.9641, 5364.9629, 69.4369>>, 340.0293, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[9] = NULL
|
|
coverShootout[9] = ADD_COVER_POINT(<<-522.1553, 5250.7095, 78.5550>>, 339.6773, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[10] = NULL
|
|
coverShootout[10] = ADD_COVER_POINT(<<-524.0961, 5250.4805, 78.3368>>, 355.7343, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[11] = NULL
|
|
coverShootout[11] = ADD_COVER_POINT(<<-475.8146, 5321.9814, 79.6100>>, 161.7416, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[12] = NULL
|
|
coverShootout[12] = ADD_COVER_POINT(<<-475.4565, 5334.2856, 81.7084>>, 344.8566, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[13] = NULL
|
|
coverShootout[13] = ADD_COVER_POINT(<<-472.9561, 5340.5737, 81.7094>>, 162.1539, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[14] = NULL
|
|
coverShootout[14] = ADD_COVER_POINT(<<-495.6543, 5299.4863, 79.6100>>, 152.2808, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[15] = NULL
|
|
coverShootout[15] = ADD_COVER_POINT(<<-494.1110, 5298.9985, 79.6100>>, 161.1279, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[16] = NULL
|
|
coverShootout[16] = ADD_COVER_POINT(<<-532.4843, 5260.9775, 73.3015>>, 73.5275, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[17] = NULL
|
|
coverShootout[17] = ADD_COVER_POINT(<<-580.3589, 5263.8354, 69.4457>>, 140.5717, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[18] = NULL
|
|
coverShootout[18] = ADD_COVER_POINT(<<-492.6234, 5316.0278, 79.6067>>, 333.0276, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF coverShootout[19] = NULL
|
|
coverShootout[19] = ADD_COVER_POINT(<<-615.4936, 5267.1724, 71.5453>>, 317.7524, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(coverShootout) i
|
|
IF coverShootout[i] != NULL
|
|
REMOVE_COVER_POINT(coverShootout[i])
|
|
coverShootout[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CREATE_SHOOTOUT_PICKUPS()
|
|
VECTOR vPickupPos
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(pickupShootout) i
|
|
IF DOES_PICKUP_EXIST(pickupShootout[i])
|
|
vPickupPos = GET_PICKUP_COORDS(pickupShootout[i])
|
|
REMOVE_PICKUP(pickupShootout[i])
|
|
CLEAR_AREA(vPickupPos, 2.0, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
INT iPlacementFlags = 0
|
|
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
|
|
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_LOCAL_ONLY))
|
|
|
|
pickupShootout[0] = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, <<-515.1648, 5307.2559, 80.2493>>, <<0.0000, 0.0000, -18.3600>>, iPlacementFlags)
|
|
pickupShootout[1] = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, <<-468.3400, 5355.2998, 79.8500>>, <<0.0000, 0.0000, -50.4000>>, iPlacementFlags)
|
|
pickupShootout[2] = CREATE_PICKUP_ROTATE(PICKUP_ARMOUR_STANDARD, <<-523.6100, 5289.8901, 73.2810>>, <<-90.0000, 0.0000, -58.2000>>, iPlacementFlags)
|
|
ENDPROC
|
|
|
|
///Checks the three player chars and makes sure they're assigned the correct speakers in dialogue. This is useful for when switches occur, as these
|
|
///make current speaker peds invalid.
|
|
PROC REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF sConversationPeds.PedInfo[0].Index != sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
OR NOT sConversationPeds.PedInfo[0].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF sConversationPeds.PedInfo[0].Index != PLAYER_PED_ID()
|
|
OR NOT sConversationPeds.PedInfo[0].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ENDIF
|
|
ELSE
|
|
IF sConversationPeds.PedInfo[0].Index != NULL
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, NULL, "MICHAEL")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF sConversationPeds.PedInfo[1].Index != sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
OR NOT sConversationPeds.PedInfo[1].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
IF sConversationPeds.PedInfo[1].Index != PLAYER_PED_ID()
|
|
OR NOT sConversationPeds.PedInfo[1].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
ENDIF
|
|
ELSE
|
|
IF sConversationPeds.PedInfo[1].Index != NULL
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF sConversationPeds.PedInfo[2].Index != sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
OR NOT sConversationPeds.PedInfo[2].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF sConversationPeds.PedInfo[2].Index != PLAYER_PED_ID()
|
|
OR NOT sConversationPeds.PedInfo[2].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, PLAYER_PED_ID(), "TREVOR")
|
|
ENDIF
|
|
ELSE
|
|
IF sConversationPeds.PedInfo[2].Index != NULL
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, NULL, "TREVOR")
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_CUTSCENE_PED_COMPONENT_VARIATIONS(STRING strCutsceneName)
|
|
INT iNameHash = GET_HASH_KEY(strCutsceneName)
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
IF iNameHash = HASH("FRA_2_INT")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
|
|
ELIF iNameHash = HASH("FRA_2_IG_4_ALT1_concat")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
//SET_CUTSCENE_PED_OUTFIT("Michael", GET_PLAYER_PED_MODEL(CHAR_MICHAEL), OUTFIT_P0_LEATHER_AND_JEANS)
|
|
//SET_CUTSCENE_PED_OUTFIT("Trevor", GET_PLAYER_PED_MODEL(CHAR_TREVOR), OUTFIT_P2_TSHIRT_CARGOPANTS_3)
|
|
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EARS, 0)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Trevor", ANCHOR_EARS, 0)
|
|
ELIF iNameHash = HASH("FRA_2_EXT")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Lamar", sLamar.ped)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_BERD, 0, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Checks if ped1 is in front of ped2
|
|
FUNC BOOL IS_PED_BLOCKING_TARGET(PED_INDEX ped1, PED_INDEX ped2, VECTOR vTarget)
|
|
VECTOR vPedPos1 = GET_ENTITY_COORDS(ped1)
|
|
VECTOR vPedPos2 = GET_ENTITY_COORDS(ped2)
|
|
FLOAT fDistBetweenPeds = VDIST2(vPedPos1, vPedPos2)
|
|
FLOAT fHeadingBetweenPedAndTarget = GET_HEADING_FROM_VECTOR_2D(vTarget.x - vPedPos2.x, vTarget.y - vPedPos2.y)
|
|
FLOAT fHeadingBetweenPeds = GET_HEADING_FROM_VECTOR_2D(vPedPos1.x - vPedPos2.x, vPedPos1.y - vPedPos2.y)
|
|
FLOAT fHeadingDiff = ABSF(fHeadingBetweenPeds - fHeadingBetweenPedAndTarget)
|
|
|
|
IF fHeadingDiff > 180.0
|
|
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
|
|
ENDIF
|
|
|
|
IF fDistBetweenPeds < 9.0
|
|
IF fHeadingDiff < 40.0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF fHeadingDiff < 20.0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Fetches the closest entry point to a given coords. Useful for determining suitable locations to spawn enemies.
|
|
FUNC SAWMILL_ENTRY_POINT GET_CLOSEST_ENTRY_POINT_TO_COORDS(VECTOR vPos)
|
|
FLOAT fDist[7]
|
|
FLOAT fClosestDist = -1.0
|
|
SAWMILL_ENTRY_POINT eClosestEntryPoint
|
|
|
|
fDist[ENTRY_POINT_BY_BULLDOZER] = VDIST2(vPos, <<-557.3316, 5385.4585, 69.6229>>)
|
|
fDist[ENTRY_POINT_BY_CLIFF] = VDIST2(vPos, <<-611.2953, 5334.0156, 71.1438>>)
|
|
fDist[ENTRY_POINT_BY_SNIPER_HILL] = VDIST2(vPos, <<-570.3, 5212.4, 88.4678>>)
|
|
fDist[ENTRY_POINT_BY_METAL_BRIDGE] = VDIST2(vPos, <<-598.2, 5280.5, 71.2>>)
|
|
fDist[ENTRY_POINT_BY_CONVEYOR_BELT] = VDIST2(vPos, <<-574.8340, 5253.5645, 69.4682>>)
|
|
fDist[ENTRY_POINT_BY_TRAIN_TUNNEL] = VDIST2(vPos, <<-503.5374, 5248.1382, 85.5385>>)
|
|
fDist[ENTRY_POINT_BY_WOOD_LOGS] = VDIST2(vPos, <<-476.6512, 5344.6880, 83.9177>>)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(fDist) i
|
|
IF fClosestDist = -1.0
|
|
OR fDist[i] < fClosestDist
|
|
fClosestDist = fDist[i]
|
|
eClosestEntryPoint = INT_TO_ENUM(SAWMILL_ENTRY_POINT, i)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN eClosestEntryPoint
|
|
ENDFUNC
|
|
|
|
PROC GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
WEAPON_TYPE e_fail_weapon = Get_Fail_Weapon(ENUM_TO_INT(GET_PLAYER_PED_ENUM(PLAYER_PED_ID())))
|
|
|
|
IF e_fail_weapon = WEAPONTYPE_INVALID
|
|
OR e_fail_weapon = WEAPONTYPE_UNARMED
|
|
e_fail_weapon = GET_BEST_PED_WEAPON(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF e_fail_weapon != WEAPONTYPE_INVALID
|
|
AND e_fail_weapon != WEAPONTYPE_UNARMED
|
|
INT i_ammo_per_clip = GET_MAX_AMMO_IN_CLIP(PLAYER_PED_ID(), e_fail_weapon)
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), e_fail_weapon) < i_ammo_per_clip
|
|
ADD_AMMO_TO_PED(PLAYER_PED_ID(), e_fail_weapon, i_ammo_per_clip * 2)
|
|
SET_AMMO_IN_CLIP(PLAYER_PED_ID(), e_fail_weapon, i_ammo_per_clip)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), e_fail_weapon, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REFRESH_BUDDY_PED_AUDIO_MIX_GROUP()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "FRANKLIN_2_BUDDIES_GROUP")
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN_2_BUDDIES_GROUP")
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "FRANKLIN_2_BUDDIES_GROUP")
|
|
ENDIF
|
|
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(PLAYER_PED_ID())
|
|
ENDPROC
|
|
|
|
PROC MISSION_SETUP()
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
|
|
|
|
REQUEST_ADDITIONAL_TEXT("FRAN2", MISSION_TEXT_SLOT)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
|
|
ADD_RELATIONSHIP_GROUP("BALLAS", relGroupBallas)
|
|
ADD_RELATIONSHIP_GROUP("NEUTRAL", relGroupNeutral)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relGroupBallas)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, relGroupNeutral)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupBallas, relGroupBallas)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupBallas, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupBallas, relGroupNeutral)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, relGroupNeutral)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, relGroupBallas)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
DISABLE_CABLE_CAR_SCRIPT()
|
|
SUPPRESS_EMERGENCY_CALLS()
|
|
|
|
BLOCK_ROADS_AT_SAWMILL(TRUE)
|
|
BLOCK_SCENARIOS_AT_SAWMILL(TRUE)
|
|
|
|
iNavmeshBlockUnderSawmill = ADD_NAVMESH_BLOCKING_OBJECT((<<-551.224, 5323.079, 70.517>>), (<<25.0, 87.3, 3.0>>), DEG_TO_RAD(-18.920))
|
|
iNavmeshBlockByTimber = ADD_NAVMESH_BLOCKING_OBJECT((<<-517.347, 5276.551, 77.5>>), (<<52.27, 4.0, 3.0>>), DEG_TO_RAD(-110.2))
|
|
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelBulldozer, TRUE)
|
|
|
|
g_bFranklin2RequestedBackup = TRUE //The current mission is set up to always have Michael and Trevor arrive as backup.
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CREATE_WIDGETS()
|
|
|
|
sSkipMenu[0].sTxtLabel = "INTRO_CUTSCENE (FRA_2_INT)"
|
|
sSkipMenu[1].sTxtLabel = "MEET_THE_CREW"
|
|
sSkipMenu[2].sTxtLabel = "MEET_CREW_CUTSCENE (FRA_2_IG_4_ALT1_concat)"
|
|
sSkipMenu[3].sTxtLabel = "GET_INTO_POSITION"
|
|
sSkipMenu[4].sTxtLabel = "ATTACK_SAWMILL"
|
|
sSkipMenu[5].sTxtLabel = "GET_LAMAR_OUT"
|
|
sSkipMenu[6].sTxtLabel = "DRIVE_HOME"
|
|
sSkipMenu[7].sTxtLabel = "OUTRO_CUTSCENE (FRA_2_EXT)"
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
PROC MISSION_CLEANUP()
|
|
IF NOT HAS_CUTSCENE_FINISHED()
|
|
STOP_CUTSCENE()
|
|
ENDIF
|
|
|
|
REMOVE_CUTSCENE()
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
WHILE IS_CUTSCENE_ACTIVE()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
//If we started a replay recording then make sure it's cancelled if we're performing cleanup.
|
|
IF bReplayEventStarted
|
|
REPLAY_STOP_EVENT()
|
|
bReplayEventStarted = FALSE
|
|
ENDIF
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
DISABLE_CELLPHONE(FALSE)
|
|
HIDE_ACTIVE_PHONE(FALSE)
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
SET_STUNT_JUMPS_CAN_TRIGGER(TRUE)
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
SET_AGGRESSIVE_HORNS(FALSE)
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
CLEAR_FOCUS()
|
|
SET_GPS_DISABLED_ZONE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
STOP_GAMEPLAY_CAM_SHAKING(FALSE)
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(PLAYER_PED_ID())
|
|
DETACH_ENTITY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, TRUE)
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_POLICE_RADAR_BLIPS(TRUE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
ELSE
|
|
//Have the buddies flee/fight depending on what's happening in the shootout.
|
|
IF eMissionStage = STAGE_ATTACK_SAWMILL
|
|
OR eMissionStage = STAGE_GET_LAMAR_OUT
|
|
OR eMissionStage = STAGE_GET_INTO_POSITION
|
|
OR eMissionStage = STAGE_MEET_THE_CREW
|
|
OR eMissionStage = STAGE_DRIVE_HOME
|
|
PED_INDEX peds[8]
|
|
BOOL bEnemiesNearby = FALSE
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
GET_PED_NEARBY_PEDS(sLamar.ped, peds)
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(peds) i
|
|
IF NOT IS_PED_INJURED(peds[i])
|
|
IF GET_PED_RELATIONSHIP_GROUP_HASH(peds[i]) = relGroupBallas
|
|
bEnemiesNearby = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
IF NOT IS_PED_IN_COMBAT(sLamar.ped)
|
|
AND eMissionStage >= STAGE_GET_LAMAR_OUT
|
|
IF bEnemiesNearby
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sLamar.ped, 500.0)
|
|
ELSE
|
|
TASK_SMART_FLEE_COORD(sLamar.ped, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 200.0, -1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_KEEP_TASK(sLamar.ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF bEnemiesNearby
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 500.0)
|
|
ELSE
|
|
TASK_SMART_FLEE_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 200.0, -1)
|
|
ENDIF
|
|
SET_PED_KEEP_TASK(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF bEnemiesNearby
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 500.0)
|
|
ELSE
|
|
TASK_SMART_FLEE_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 200.0, -1)
|
|
ENDIF
|
|
SET_PED_KEEP_TASK(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF bEnemiesNearby
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 500.0)
|
|
ELSE
|
|
TASK_SMART_FLEE_COORD(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 200.0, -1)
|
|
ENDIF
|
|
SET_PED_KEEP_TASK(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDIF
|
|
|
|
//REMOVE_PTFX_ASSET()
|
|
TRIGGER_MUSIC_EVENT("FRA2_FAIL")
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
REMOVE_ALL_COVER_BLOCKING_AREAS()
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 2)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 4)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 5)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 6)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 7)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 8)
|
|
|
|
REMOVE_ALL_AUDIO()
|
|
REMOVE_ALL_BLIPS()
|
|
REMOVE_ALL_CAMERAS()
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
REMOVE_ALL_OBJECTS(TRUE)
|
|
REMOVE_ALL_PEDS(TRUE)
|
|
REMOVE_ALL_VEHICLES(TRUE)
|
|
ELSE
|
|
REMOVE_ALL_OBJECTS()
|
|
REMOVE_ALL_PEDS()
|
|
REMOVE_ALL_VEHICLES()
|
|
ENDIF
|
|
|
|
REMOVE_ALL_ANIMS()
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(FALSE)
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(sSelectorPeds)
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
IF eSectionStage != SECTION_STAGE_JUMPING_TO_STAGE
|
|
//Clean up anything that was created in the initial setup (this stuff must not be cleaned up if p-skipping)
|
|
#IF IS_DEBUG_BUILD
|
|
DESTROY_WIDGETS()
|
|
#ENDIF
|
|
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelBulldozer, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE), FALSE)
|
|
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
|
|
ENABLE_CABLE_CAR_SCRIPT()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
BLOCK_ROADS_AT_SAWMILL(FALSE)
|
|
BLOCK_SCENARIOS_AT_SAWMILL(FALSE)
|
|
|
|
IF iNavmeshBlockUnderSawmill != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockUnderSawmill)
|
|
iNavmeshBlockUnderSawmill = -1
|
|
ENDIF
|
|
|
|
IF iNavmeshBlockByTimber != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockByTimber)
|
|
iNavmeshBlockByTimber = -1
|
|
ENDIF
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO(FALSE)
|
|
TERMINATE_THIS_THREAD()
|
|
ELSE
|
|
CLEAR_TRIGGERED_LABELS()
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
CLEAR_AREA(<<0.0, 0.0, 0.0>>, 10000.0, TRUE)
|
|
STOP_FIRE_IN_RANGE(<<0.0, 0.0, 0.0>>, 10000.0)
|
|
REMOVE_DECALS_IN_RANGE(<<0.0, 0.0, 0.0>>, 10000.0)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBulldozer)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBalla)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBallaStartCars)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBallaReinforcementCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelExtraCover1)
|
|
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_SMG)
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_PISTOL)
|
|
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointBulldozerRoute)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointFrontRoute)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointRearRoute)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointBulldozer)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_3, strCarrec)
|
|
|
|
IF eMissionStage < STAGE_ATTACK_SAWMILL
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(pickupShootout) i
|
|
IF DOES_PICKUP_EXIST(pickupShootout[i])
|
|
REMOVE_PICKUP(pickupShootout[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
|
|
PROC JUMP_TO_STAGE(MISSION_STAGE stage, BOOL bIsDebugJump = FALSE)
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
iCurrentEvent = 0
|
|
eMissionStage = stage
|
|
MISSION_CLEANUP()
|
|
|
|
//Update mission checkpoint in case they skipped the stages where it gets set.
|
|
IF bIsDebugJump
|
|
IF eMissionStage >= STAGE_DRIVE_HOME
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FRANKLIN2_FLEE_AREA, "FLEE_AREA", TRUE)
|
|
ELIF eMissionStage >= STAGE_GET_LAMAR_OUT
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FRANKLIN2_GET_LAMAR_OUT, "GET_LAMAR_OUT")
|
|
ELIF eMissionStage >= STAGE_GET_INTO_POSITION
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FRANKLIN2_ATTACK_SAWMILL, "ATTACK_SAWMILL")
|
|
ELIF eMissionStage >= STAGE_MEET_THE_CREW
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "MEET_THE_CREW")
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Chooses which stage to jump to if the player restarted the mission from a checkpoint.
|
|
/// RETURNS:
|
|
///
|
|
FUNC BOOL JUMP_TO_CHECKPOINT()
|
|
IF Is_Replay_In_Progress()
|
|
INT iStage = Get_Replay_Mid_Mission_Stage()
|
|
|
|
IF g_bShitskipAccepted
|
|
iStage++
|
|
ENDIF
|
|
|
|
IF iStage = 0
|
|
JUMP_TO_STAGE(STAGE_MEET_THE_CREW)
|
|
ELIF iStage = CHECKPOINT_FRANKLIN2_ATTACK_SAWMILL
|
|
JUMP_TO_STAGE(STAGE_GET_INTO_POSITION)
|
|
ELIF iStage = CHECKPOINT_FRANKLIN2_GET_LAMAR_OUT
|
|
JUMP_TO_STAGE(STAGE_GET_LAMAR_OUT)
|
|
ELIF iStage = CHECKPOINT_FRANKLIN2_FLEE_AREA
|
|
JUMP_TO_STAGE(STAGE_DRIVE_HOME)
|
|
ELIF iStage > CHECKPOINT_FRANKLIN2_FLEE_AREA
|
|
JUMP_TO_STAGE(STAGE_OUTRO_CUTSCENE)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "MEET_THE_CREW")
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
///Creates a new load scene sphere and waits until it has finished loading or it times out.
|
|
PROC NEW_LOAD_SCENE_SPHERE_WITH_WAIT(VECTOR vPos, FLOAT fRadius, NEWLOADSCENE_FLAGS controlFlags = 0, INT iMaxWaitTime = 10000)
|
|
INT iTimeOut = GET_GAME_TIMER()
|
|
|
|
WHILE GET_GAME_TIMER() - iTimeOut < iMaxWaitTime
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_START_SPHERE(vPos, fRadius, controlFlags)
|
|
ELIF IS_NEW_LOAD_SCENE_LOADED()
|
|
iTimeOut = 0
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDPROC
|
|
|
|
PROC SETUP_TREVOR_OUTFIT()
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
//SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_OUTFIT, OUTFIT_P2_TSHIRT_CARGOPANTS_3, FALSE) //1572447 - Don't change outfits.
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SETUP_MICHAEL_OUTFIT()
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
//SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_OUTFIT, OUTFIT_P0_LEATHER_AND_JEANS, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL SETUP_REQ_FRANKLIN(VECTOR vPos, FLOAT fHeading = 0.0, BOOl bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_FRANKLIN)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_FRANKLIN)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CHAR_FRANKLIN, vPos, fHeading)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_DisableHurt, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
sFranklin.iEvent = 0
|
|
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], COMP_TYPE_PROPS, PROPS_P1_HEADSET, TRUE)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sConversationPeds.PedInfo[1].Index != sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TREVOR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_TREVOR)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, vPos, fHeading)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_DisableHurt, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
sTrevor.iEvent = 0
|
|
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
|
|
SETUP_TREVOR_OUTFIT()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sConversationPeds.PedInfo[2].Index != sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MICHAEL(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_MICHAEL)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vPos, fHeading)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_DisableHurt, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
sMichael.iEvent = 0
|
|
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER, 100, TRUE)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RELGROUPHASH_PLAYER)
|
|
SETUP_MICHAEL_OUTFIT()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sConversationPeds.PedInfo[0].Index != sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_LAMAR(VECTOR vPos, FLOAT fHeading = 0.0)
|
|
IF NOT DOES_ENTITY_EXIST(sLamar.ped)
|
|
IF CREATE_NPC_PED_ON_FOOT(sLamar.ped, CHAR_LAMAR, vPos, fHeading)
|
|
SET_PED_CAN_BE_TARGETTED(sLamar.ped, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sLamar.ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(sLamar.ped, pedmove_run)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sLamar.ped, "FRANKLIN_2_LAMAR_GROUP")
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sLamar.ped, "LAMAR")
|
|
|
|
IF eMissionStage = STAGE_ATTACK_SAWMILL
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sLamar.ped,TRUE)
|
|
TASK_START_SCENARIO_IN_PLACE(sLamar.ped,"WORLD_HUMAN_STUPOR")
|
|
ENDIF
|
|
|
|
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_HEAD, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_TORSO, 2, 0)
|
|
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_LEG, 5, 0)
|
|
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_FEET, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_HAND, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_BERD, 1, 0)
|
|
|
|
sLamar.iEvent = 0
|
|
sLamar.iTimer = 0
|
|
sLamar.bRefreshTasks = FALSE
|
|
sLamar.bIsUsingSecondaryCover = FALSE
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF sConversationPeds.PedInfo[3].Index != sLamar.ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sLamar.ped, "LAMAR")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MICHAELS_CAR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
REQUEST_PLAYER_VEH_MODEL(CHAR_MICHAEL, VEHICLE_TYPE_CAR)
|
|
|
|
IF HAS_PLAYER_VEH_MODEL_LOADED(CHAR_MICHAEL, VEHICLE_TYPE_CAR)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_PLAYER_VEHICLE(vehMichaelsCar, CHAR_MICHAEL, vPos, fHeading, TRUE, VEHICLE_TYPE_CAR)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehMichaelsCar, SC_DOOR_FRONT_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehMichaelsCar, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehMichaelsCar, FALSE)
|
|
SET_VEHICLE_STRONG(vehMichaelsCar, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(vehMichaelsCar, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehMichaelsCar, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehMichaelsCar, FALSE)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TREVORS_CAR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(vehTrevorsCar)
|
|
REQUEST_PLAYER_VEH_MODEL(CHAR_TREVOR, VEHICLE_TYPE_CAR)
|
|
|
|
IF HAS_PLAYER_VEH_MODEL_LOADED(CHAR_TREVOR, VEHICLE_TYPE_CAR)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_PLAYER_VEHICLE(vehTrevorsCar, CHAR_TREVOR, vPos, fHeading, TRUE, VEHICLE_TYPE_CAR)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehTrevorsCar, SC_DOOR_FRONT_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehTrevorsCar, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehTrevorsCar, FALSE)
|
|
SET_VEHICLE_STRONG(vehTrevorsCar, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(vehTrevorsCar, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehTrevorsCar, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehTrevorsCar, FALSE)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_REPLAY_CAR(VECTOR vPos, FLOAT fHeading = 0.0)
|
|
IF NOT DOES_ENTITY_EXIST(vehReplayCar)
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
AND GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() != BULLDOZER
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
|
|
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
|
|
vehReplayCar = CREATE_REPLAY_CHECKPOINT_VEHICLE(vPos, fHeading)
|
|
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehReplayCar, FALSE)
|
|
SET_VEHICLE_INFLUENCES_WANTED_LEVEL(vehReplayCar, FALSE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehReplayCar, TRUE)
|
|
SET_ENTITY_AS_MISSION_ENTITY(vehReplayCar, TRUE, TRUE)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_BULLDOZER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sBulldozer.veh)
|
|
REQUEST_MODEL(modelBulldozer)
|
|
|
|
IF HAS_MODEL_LOADED(modelBulldozer)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELSE
|
|
sBulldozer.veh = CREATE_VEHICLE(modelBulldozer, vPos, fHeading)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sBulldozer.veh, SC_DOOR_FRONT_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sBulldozer.veh, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sBulldozer.veh, FALSE)
|
|
SET_VEHICLE_STRONG(sBulldozer.veh, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(sBulldozer.veh, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sBulldozer.veh, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sBulldozer.veh, FALSE)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sBulldozer.veh, "FRANKLIN_2_BULLDOZER_Group")
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sBulldozer.veh, TRUE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBulldozer)
|
|
SET_VEHICLE_BULLDOZER_ARM_POSITION(sBulldozer.veh, 0.1, FALSE)
|
|
SET_ENTITY_ALWAYS_PRERENDER(sBulldozer.veh, TRUE)
|
|
|
|
sBulldozer.iEvent = 0
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ELSE
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_MICHAEL)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ELSE
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_IS_TREVOR()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ELSE
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
FUNC BOOL SETUP_REQ_BUDDIES_START_FIGHT()
|
|
sMichael.iEvent = 0
|
|
sMichael.iPrevMaxEvent = 0
|
|
sMichael.iTimer = 0
|
|
sMichael.bSwitchBlocked = FALSE
|
|
sMichael.bRefreshTasks = FALSE
|
|
sMichael.bIsUsingSecondaryCover = FALSE
|
|
sMichael.bSwitchedFromThisPed = FALSE
|
|
|
|
sFranklin.iEvent = 0
|
|
sFranklin.iPrevMaxEvent = 0
|
|
sFranklin.iTimer = 0
|
|
sFranklin.bSwitchBlocked = FALSE
|
|
sFranklin.bRefreshTasks = FALSE
|
|
sFranklin.bIsUsingSecondaryCover = FALSE
|
|
sFranklin.bSwitchedFromThisPed = FALSE
|
|
|
|
sTrevor.iEvent = 0
|
|
sTrevor.iPrevMaxEvent = 0
|
|
sTrevor.iTimer = 0
|
|
sTrevor.bSwitchBlocked = FALSE
|
|
sTrevor.bRefreshTasks = FALSE
|
|
sTrevor.bIsUsingSecondaryCover = FALSE
|
|
sTrevor.bSwitchedFromThisPed = FALSE
|
|
|
|
sLamar.iEvent = 0
|
|
sLamar.iPrevMaxEvent = 0
|
|
sLamar.iTimer = 0
|
|
sLamar.bRefreshTasks = FALSE
|
|
sLamar.bIsUsingSecondaryCover = FALSE
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER, 100, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 5, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_DisableHurt, TRUE)
|
|
SET_ENTITY_PROOFS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER, TRUE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 5, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_DisableHurt, TRUE)
|
|
SET_ENTITY_PROOFS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 5, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_DisableHurt, TRUE)
|
|
SET_ENTITY_PROOFS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE, -1)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_SHOOTOUT_COVER_OBJECTS()
|
|
IF NOT DOES_ENTITY_EXIST(objShootoutCover[0])
|
|
REQUEST_MODEL(modelExtraCover1)
|
|
REQUEST_MODEL(modelExtraCover2)
|
|
REQUEST_MODEL(modelWeedPallet)
|
|
|
|
IF HAS_MODEL_LOADED(modelExtraCover1)
|
|
AND HAS_MODEL_LOADED(modelExtraCover2)
|
|
AND HAS_MODEL_LOADED(modelWeedPallet)
|
|
objShootoutCover[0] = CREATE_OBJECT_NO_OFFSET(modelExtraCover1, <<-614.2900, 5269.0601, 71.3612>>)
|
|
SET_ENTITY_ROTATION(objShootoutCover[0], <<-4.3000, -0.0000, -44.1800>>)
|
|
|
|
objShootoutCover[1] = CREATE_OBJECT_NO_OFFSET(modelExtraCover2, <<-525.2531, 5241.2412, 78.6260>>)
|
|
SET_ENTITY_ROTATION(objShootoutCover[1], <<3.3465, 4.7541, 172.9586>>)
|
|
|
|
objShootoutCover[2] = CREATE_OBJECT_NO_OFFSET(modelWeedPallet, <<-600.1290, 5325.8389, 69.4513>>)
|
|
SET_ENTITY_ROTATION(objShootoutCover[2], <<0.0000, 0.0000, -32.0400>>)
|
|
|
|
objShootoutCover[3] = CREATE_OBJECT_NO_OFFSET(modelWeedPallet, <<-578.5708, 5303.5190, 69.2611>>)
|
|
SET_ENTITY_ROTATION(objShootoutCover[3], <<0.0000, 0.0000, -83.5200>>)
|
|
|
|
objShootoutCover[4] = CREATE_OBJECT_NO_OFFSET(modelWeedPallet, <<-578.8108, 5305.3989, 69.2611>>)
|
|
SET_ENTITY_ROTATION(objShootoutCover[4], <<0.0000, 0.0000, -97.5600>>)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(objShootoutCover) i
|
|
FREEZE_ENTITY_POSITION(objShootoutCover[i], TRUE)
|
|
|
|
IF GET_ENTITY_MODEL(objShootoutCover[i]) = modelWeedPallet
|
|
SET_ENTITY_LOD_DIST(objShootoutCover[i], 200)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelExtraCover1)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelExtraCover2)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelWeedPallet)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_WEED_PALLETS_FOR_CUTSCENE(BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(objExtraWeed[0])
|
|
REQUEST_MODEL(modelWeedPallet)
|
|
|
|
IF HAS_MODEL_LOADED(modelWeedPallet)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELSE
|
|
objExtraWeed[0] = CREATE_OBJECT_NO_OFFSET(modelWeedPallet, <<-597.2990, 5313.8091, 69.2413>>)
|
|
SET_ENTITY_ROTATION(objExtraWeed[0], <<0.0000, 0.0000, 33.4800>>)
|
|
|
|
objExtraWeed[1] = CREATE_OBJECT_NO_OFFSET(modelWeedPallet, <<-594.8490, 5314.0791, 69.2413>>)
|
|
SET_ENTITY_ROTATION(objExtraWeed[1], <<0.0000, 0.0000, 42.8400>>)
|
|
|
|
objExtraWeed[2] = CREATE_OBJECT_NO_OFFSET(modelWeedPallet, <<-595.7390, 5312.1489, 69.2413>>)
|
|
SET_ENTITY_ROTATION(objExtraWeed[2], <<0.0000, 0.0000, 5.4000>>)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(objExtraWeed) i
|
|
FREEZE_ENTITY_POSITION(objExtraWeed[i], TRUE)
|
|
|
|
IF GET_ENTITY_MODEL(objExtraWeed[i]) = modelWeedPallet
|
|
SET_ENTITY_LOD_DIST(objExtraWeed[i], 200)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelWeedPallet)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
///Returns the ped index of the ped that killed the given ped (if their source of death was a ped).
|
|
FUNC PED_INDEX GET_PED_THAT_KILLED_PED(PED_INDEX ped)
|
|
ENTITY_INDEX entityDeathSource = GET_PED_SOURCE_OF_DEATH(ped)
|
|
|
|
IF DOES_ENTITY_EXIST(entityDeathSource)
|
|
IF IS_ENTITY_A_PED(entityDeathSource)
|
|
RETURN GET_PED_INDEX_FROM_ENTITY_INDEX(entityDeathSource)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
FUNC BOOL ARE_PEDS_IN_ANGLED_AREA(PED_INDEX ped_1, PED_INDEX ped_2, PED_INDEX ped_3, VECTOR v_pos_1, VECTOR v_pos_2, FLOAT f_width)
|
|
IF NOT IS_PED_INJURED(ped_1)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(ped_1, v_pos_1, v_pos_2, f_width, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped_2)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(ped_2, v_pos_1, v_pos_2, f_width, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped_3)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(ped_3, v_pos_1, v_pos_2, f_width, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the heading to set the gameplay cam so that it faces the given coord to look at.
|
|
FUNC FLOAT GET_GAMEPLAY_CAM_RELATIVE_HEADING_FOR_COORD(VECTOR vPlayerPos, VECTOR vLookAtPos)
|
|
VECTOR vPosDiff = vLookAtPos - vPlayerPos
|
|
FLOAT fHeading = GET_HEADING_FROM_VECTOR_2D(vPosDiff.x, vPosDiff.y) - GET_ENTITY_HEADING(PLAYER_PED_ID())
|
|
|
|
IF fHeading > 180.0
|
|
fheading -= 180.0
|
|
ELIF fHeading < -180.0
|
|
fHeading += 180.0
|
|
ENDIF
|
|
|
|
RETURN fHeading
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the pitch to set the gameplay cam so that it faces the given coord to look at.
|
|
FUNC FLOAT GET_GAMEPLAY_CAM_RELATIVE_PITCH_FOR_COORD(VECTOR vPlayerPos, VECTOR vLookAtPos)
|
|
VECTOR vPosDiff = vLookAtPos - vPlayerPos
|
|
VECTOR vDir = vPosDiff / VMAG(vPosDiff)
|
|
|
|
RETURN ATAN2(vDir.z, VMAG(<<vDir.x, vDir.y, 0.0>>))
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(PED_INDEX ped)
|
|
IF NOT IS_PED_RAGDOLL(ped)
|
|
AND NOT IS_PED_GETTING_UP(ped)
|
|
AND NOT IS_PED_IN_COMBAT(ped)
|
|
AND NOT IS_PED_RELOADING(ped)
|
|
AND IS_PED_WEAPON_READY_TO_SHOOT(ped)
|
|
WEAPON_TYPE eCurrentWeapon
|
|
WEAPON_GROUP eCurrentGroup
|
|
|
|
GET_CURRENT_PED_WEAPON(ped, eCurrentWeapon)
|
|
eCurrentGroup = GET_WEAPONTYPE_GROUP(eCurrentWeapon)
|
|
|
|
IF eCurrentGroup != WEAPONGROUP_MELEE
|
|
AND eCurrentGroup != WEAPONGROUP_INVALID
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
///Called after a ped is killed: keep track of who killed the ped and where they were killed.
|
|
PROC UPDATE_PLAYER_PED_KILLS_STATS(PED_INDEX pedDead, VECTOR vPlayerPos)
|
|
ENTITY_INDEX entityKiller = GET_PED_SOURCE_OF_DEATH(pedDead)
|
|
|
|
IF IS_ENTITY_A_PED(entityKiller)
|
|
PED_INDEX pedKiller = GET_PED_INDEX_FROM_ENTITY_INDEX(entityKiller)
|
|
|
|
IF pedKiller = sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
IF VDIST2(GET_ENTITY_COORDS(pedDead, FALSE), vPlayerPos) < 10000.0
|
|
iTimeLastPedKilledByMichael = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF pedKiller = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
iTimeLastPedKilledByFranklin = GET_GAME_TIMER()
|
|
ELIF pedKiller = PLAYER_PED_ID()
|
|
vPosOfLastPlayerKill = GET_ENTITY_COORDS(pedKiller, FALSE)
|
|
iTimeLastPedKilledByPlayer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BUDDY_SHOOTOUT_ROUTE GET_CLOSEST_ROUTE_TO_PED(PED_INDEX ped)
|
|
BUDDY_SHOOTOUT_ROUTE eClosestRoute = BUDDY_ROUTE_IN_PLAYERS_GROUP
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointBulldozerRoute)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointFrontRoute)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointRearRoute)
|
|
INT iClosestNodeBulldozer, iClosestNodeFront, iClosestNodeRear
|
|
|
|
IF GET_PLAYER_PED_MODEL(CHAR_MICHAEL) = GET_ENTITY_MODEL(ped)
|
|
eClosestRoute = BUDDY_ROUTE_SNIPING
|
|
ELSE
|
|
VECTOR vBuddyPos = GET_ENTITY_COORDS(ped)
|
|
VECTOR vBulldozerNodePos, vFrontNodePos, vRearNodePos
|
|
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointBulldozerRoute, vBuddyPos, iClosestNodeBulldozer)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointFrontRoute, vBuddyPos, iClosestNodeFront)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointRearRoute, vBuddyPos, iClosestNodeRear)
|
|
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypointBulldozerRoute, iClosestNodeBulldozer, vBulldozerNodePos)
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypointFrontRoute, iClosestNodeFront, vFrontNodePos)
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypointRearRoute, iClosestNodeRear, vRearNodePos)
|
|
|
|
FLOAT fDistFromBulldozerRoute = VDIST2(vBuddyPos, vBulldozerNodePos)
|
|
FLOAT fDistFromFrontRoute = VDIST2(vBuddyPos, vFrontNodePos)
|
|
FLOAT fDistFromRearRoute = VDIST2(vBuddyPos, vRearNodePos)
|
|
|
|
IF fDistFromBulldozerRoute < fDistFromFrontRoute
|
|
IF fDistFromBulldozerRoute < fDistFromRearRoute
|
|
eClosestRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
ELSE
|
|
eClosestRoute = BUDDY_ROUTE_REAR
|
|
ENDIF
|
|
ELSE
|
|
IF fDistFromFrontRoute < fDistFromRearRoute
|
|
eClosestRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
ELSE
|
|
eClosestRoute = BUDDY_ROUTE_REAR
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Check if the ped is currently in the bulldozer.
|
|
IF eClosestRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
AND IS_PED_SITTING_IN_VEHICLE(ped, sBulldozer.veh)
|
|
eClosestRoute = BUDDY_ROUTE_BULLDOZER
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN eClosestRoute
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Splits locates triggers over multiple frames to conserve execution time.
|
|
PROC CHECK_ENEMY_TRIGGER_LOCATES(INT iMaxNumLocatesPerFrame = 1)
|
|
INT iNumLocatesCheckedThisFrame = 0
|
|
|
|
WHILE iNumLocatesCheckedThisFrame < iMaxNumLocatesPerFrame
|
|
IF eMissionStage = STAGE_ATTACK_SAWMILL
|
|
SWITCH iLocateCheckIndex
|
|
CASE 0
|
|
IF NOT bHitLocateBallasOnBelt
|
|
bHitLocateBallasOnBelt = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-558.177429,5305.119629,67.829933>>, <<-580.605591,5263.624023,88.293259>>, 4.000000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Alternate trigger for conveyor belt ped.
|
|
IF NOT bHitLocateBallasOnBelt
|
|
bHitLocateBallasOnBelt = IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), <<-581.077393,5263.983398,61.983421>>, <<-566.598206,5254.707520,74.502625>>, 4.000000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT bHitLocateBallasTimber1
|
|
bHitLocateBallasTimber1 = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-513.981750,5303.330078,74.589127>>, <<-531.828796,5254.357910,78.010544>>, 1.750000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF NOT bHitLocateBallasTimber1
|
|
bHitLocateBallasTimber1 = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-531.574036,5253.477539,74.835709>>, <<-541.579407,5225.216309,78.376968>>, 1.750000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF NOT bHitLocateBallasBulldozer1
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
AND IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), <<-578.975525,5378.432617,68.781471>>, <<-531.740173,5358.951660,83.436295>>, 10.500000)
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
bHitLocateBallasBulldozer1 = TRUE
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sBulldozer.veh)
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
bHitLocateBallasBulldozer1 = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHitLocateBallasBulldozer1 = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
AND IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_TREVOR), <<-578.975525,5378.432617,68.781471>>, <<-531.740173,5358.951660,83.436295>>, 10.500000)
|
|
IF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
bHitLocateBallasBulldozer1 = TRUE
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sBulldozer.veh)
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
bHitLocateBallasBulldozer1 = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHitLocateBallasBulldozer1 = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5
|
|
bHitLocateBallasBulldozer2 = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-547.798279,5327.897461,83.811836>>, <<-621.139587,5351.126953,65.211105>>, 10.500000)
|
|
|
|
IF NOT bHitLocateBallasBulldozer2
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
AND IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), <<-547.798279,5327.897461,83.811836>>, <<-621.139587,5351.126953,65.211105>>, 10.500000)
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
bHitLocateBallasBulldozer2 = TRUE
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sBulldozer.veh)
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
bHitLocateBallasBulldozer2 = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHitLocateBallasBulldozer2 = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
AND IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_TREVOR), <<-547.798279,5327.897461,83.811836>>, <<-621.139587,5351.126953,65.211105>>, 10.500000)
|
|
IF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
bHitLocateBallasBulldozer2 = TRUE
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sBulldozer.veh)
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
bHitLocateBallasBulldozer2 = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHitLocateBallasBulldozer2 = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6
|
|
IF NOT bHitLocateBallasRearTimber1
|
|
bHitLocateBallasRearTimber1 = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-421.038300,5325.919922,105.337448>>, <<-516.910034,5335.936523,63.603600>>, 18.500000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 7
|
|
IF NOT bHitLocateBallasRearTimber2
|
|
bHitLocateBallasRearTimber2 = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-439.473450,5303.472656,98.535141>>, <<-518.608032,5324.276855,79.133942>>, 9.250000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 8
|
|
IF NOT bHitLocateBallasTimber2
|
|
bHitLocateBallasTimber2 = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-538.501160,5288.443359,72.864220>>, <<-462.794434,5238.156738,99.614388>>, 9.250000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 9
|
|
IF NOT bHitLocateBallasRocket
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
bHitLocateBallasRocket = IS_ENTITY_IN_ANGLED_AREA(sBulldozer.veh, <<-558.265198,5294.500977,69.138664>>, <<-629.746155,5269.547852,82.583916>>, 4.250000)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 10
|
|
IF NOT bHitLocateBallasBulldozer3
|
|
bHitLocateBallasBulldozer3 = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-563.001221,5294.141602,83.103325>>, <<-615.778564,5313.239746,66.259796>>, 7.000000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 11
|
|
IF NOT bHitLocateBallasSniper
|
|
bHitLocateBallasSniper = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-512.323181,5297.808105,75.352188>>, <<-528.553284,5122.546875,114.407562>>, 11.000000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 12
|
|
IF NOT bHitLocateBallasBeforeTimber
|
|
bHitLocateBallasBeforeTimber = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-563.693848,5225.039551,66.894447>>, <<-556.407288,5290.143066,95.390747>>, 7.250000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 13 //Alternate locate for BeforeTimber
|
|
IF NOT bHitLocateBallasBeforeTimber
|
|
bHitLocateBallasBeforeTimber = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-588.445679,5264.123535,56.399567>>, <<-546.951477,5244.379883,85.201309>>, 7.250000)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iLocateCheckIndex++
|
|
|
|
IF iLocateCheckIndex > 13
|
|
iLocateCheckIndex = 0
|
|
ENDIF
|
|
ELIF eMissionStage = STAGE_GET_LAMAR_OUT
|
|
SWITCH iLocateCheckIndex
|
|
CASE 0
|
|
IF NOT bHitLocateBallasPostRescueTimber
|
|
bHitLocateBallasPostRescueTimber = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-450.690033,5276.055176,94.359428>>, <<-533.646851,5304.580078,72.325470>>, 2.500000)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT bHitLocateBallasPostRescueExit
|
|
bHitLocateBallasPostRescueExit = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-598.337305,5469.928711,56.109970>>, <<-431.000751,5025.955762,204.017235>>, 8.500000)
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Alternate trigger for PostRescueExit: need this to still trigger as Michael, but also safeguard against a buddy ped running the wrong way and triggering it early.
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
bHitLocateBallasPostRescueExit = ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), NULL,
|
|
<<-566.737305,5383.928711,68.109970>>, <<-488.800751,5165.155762,104.017235>>, 8.500000)
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar2) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueTimber) < 3
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iLocateCheckIndex++
|
|
|
|
IF iLocateCheckIndex > 2
|
|
iLocateCheckIndex = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iNumLocatesCheckedThisFrame++
|
|
ENDWHILE
|
|
ENDPROC
|
|
|
|
PROC RESET_SHOOTOUT_VARIABLES()
|
|
bHitLocateBallasBulldozer1 = FALSE
|
|
bHitLocateBallasBulldozer2 = FALSE
|
|
bHitLocateBallasRearTimber1 = FALSE
|
|
bHitLocateBallasRearTimber2 = FALSE
|
|
bHitLocateBallasOnBelt = FALSE
|
|
bHitLocateBallasTimber1 = FALSE
|
|
bBulldozerReachedDestination = FALSE
|
|
bHitLocateBallasPostRescueTimber = FALSE
|
|
bHitLocateBallasPostRescueExit = FALSE
|
|
bCreatedBallaStartCars = FALSE
|
|
bHitLocateBallasTimber2 = FALSE
|
|
bHitLocateBallasRocket = FALSE
|
|
bHitLocateBallasSniper = FALSE
|
|
bHitLocateBallasBeforeTimber = FALSE
|
|
bMichaelIsGettingFlanked = FALSE
|
|
bPlayerGivenLookAtLamarTask = FALSE
|
|
bMichaelHUDFlashingForRocket = FALSE
|
|
bMichaelHUDFlashingForSniper = FALSE
|
|
bSwitchHUDFlashingToGetLamar = FALSE
|
|
bHitLocateBallasBulldozer3 = FALSE
|
|
bBulldozerIsInMixGroup = FALSE
|
|
bMichaelSetToMoveFreely = FALSE
|
|
|
|
iNumTimesFiredRocket = 0
|
|
iBulldozerLiftTimer = 0
|
|
iBallaRocketTimer = 0
|
|
iTimeSniperStartedAttacking = 0
|
|
iSwitchStage = 0
|
|
|
|
IF eMissionStage <= STAGE_GET_INTO_POSITION
|
|
bEnemiesHaveBeenAlerted = FALSE
|
|
bLamarHasBeenRescued = FALSE
|
|
bBulldozerReachedDestination = FALSE
|
|
ELIF eMissionStage = STAGE_ATTACK_SAWMILL
|
|
bEnemiesHaveBeenAlerted = TRUE
|
|
bLamarHasBeenRescued = FALSE
|
|
bBulldozerReachedDestination = FALSE
|
|
ELIF eMissionStage >= STAGE_GET_LAMAR_OUT
|
|
bEnemiesHaveBeenAlerted = TRUE
|
|
bLamarHasBeenRescued = TRUE
|
|
bBulldozerReachedDestination = TRUE
|
|
sLamar.iEvent = 50
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//At this moment we need to do some cleanup for the next section, reposition vehicles so they won't be in the way for the recorded cars.
|
|
PROC REPOSITION_VEHICLES_FOR_LAMAR_ESCAPE()
|
|
IF DOES_ENTITY_EXIST(vehBallaStart[2])
|
|
IF WOULD_ENTITY_BE_OCCLUDED(modelBallaStartCars, GET_ENTITY_COORDS(vehBallaStart[2], FALSE), FALSE)
|
|
SET_ENTITY_COORDS(vehBallaStart[2], <<-599.5241, 5287.4238, 69.7612>>, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehBallaStart[3])
|
|
IF WOULD_ENTITY_BE_OCCLUDED(modelBallaStartCars, GET_ENTITY_COORDS(vehBallaStart[3], FALSE), FALSE)
|
|
SET_ENTITY_COORDS(vehBallaStart[3], <<-551.5220, 5251.0991, 72.2283>>, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehBallaStart[4])
|
|
IF WOULD_ENTITY_BE_OCCLUDED(modelBallaStartCars, GET_ENTITY_COORDS(vehBallaStart[4], FALSE), FALSE)
|
|
SET_ENTITY_COORDS(vehBallaStart[4], <<-568.6070, 5270.8330, 69.8024>>, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sBulldozer.veh)
|
|
VECTOR vCurrentBulldozerPos = GET_ENTITY_COORDS(sBulldozer.veh, FALSE)
|
|
|
|
IF VDIST2(vCurrentBulldozerPos, <<-585.3985, 5283.5503, 69.2604>>) < 2500.0
|
|
SET_ENTITY_COORDS(sBulldozer.veh, <<-585.3985, 5283.5503, 69.2604>>, FALSE)
|
|
SET_ENTITY_ROTATION(sBulldozer.veh, <<0.0, 0.0, 213.3433>>, EULER_YXZ, FALSE)
|
|
ENDIF
|
|
|
|
IF VDIST2(vCurrentBulldozerPos, <<-509.1606, 5238.8970, 79.3041>>) < 2500.0
|
|
SET_ENTITY_COORDS(sBulldozer.veh, <<-509.1606, 5238.8970, 79.3041>>, FALSE)
|
|
SET_ENTITY_ROTATION(sBulldozer.veh, <<0.0, 0.0, 256.9148>>, EULER_YXZ, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_SHOOTOUT_ENEMIES()
|
|
INT i = 0
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
REQUEST_MODEL(modelBalla)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_SMG)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_PISTOL)
|
|
REQUEST_CLIP_SET("move_ped_strafing")
|
|
|
|
SAWMILL_ENTRY_POINT ePlayersClosestEntryPoint = GET_CLOSEST_ENTRY_POINT_TO_COORDS(vPlayerPos)
|
|
|
|
//General check for alerting enemies.
|
|
IF NOT bEnemiesHaveBeenAlerted
|
|
VEHICLE_INDEX vehLast = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN),
|
|
<<-582.528870,5331.000977,66.464424>>, <<-477.767700,5292.183105,145.072815>>, 109.500000)
|
|
OR IS_BULLET_IN_ANGLED_AREA(<<-499.700958,5391.089844,166.611298>>, <<-559.496155,5230.064941,63.068489>>, 188.000000, FALSE)
|
|
OR IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-499.700958,5391.089844,166.611298>>, <<-559.496155,5230.064941,63.068489>>, 188.000000)
|
|
OR DOES_ENTITY_EXIST(vehLast) AND IS_POINT_IN_ANGLED_AREA(GET_ENTITY_COORDS(vehLast, FALSE), <<-499.700958,5391.089844,166.611298>>, <<-559.496155,5230.064941,63.068489>>, 188.000000)
|
|
bEnemiesHaveBeenAlerted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//First ballas: these peds are there when the player arrives, dotted around key areas to cover all angles of entry.
|
|
IF NOT sBallasStart[0].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND eMissionStage < STAGE_GET_LAMAR_OUT
|
|
//Stagger creation over multiple frames to avoid spikes.
|
|
IF NOT DOES_ENTITY_EXIST(sBallasStart[0].ped)
|
|
sBallasStart[0].ped = CREATE_ENEMY_PED(modelBalla, <<-600.8010, 5282.0342, 69.9220>>, -123.5317, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasStart[1].ped)
|
|
sBallasStart[1].ped = CREATE_ENEMY_PED(modelBalla, <<-567.2858, 5256.0068, 69.4673>>, 62.9176, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasStart[2].ped)
|
|
sBallasStart[2].ped = CREATE_ENEMY_PED(modelBalla, <<-465.5948, 5348.7334, 83.4476>>, 160.7631, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasStart[3].ped)
|
|
sBallasStart[3].ped = CREATE_ENEMY_PED(modelBalla, <<-556.7905, 5363.8936, 69.2721>>, 74.8856, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasStart[4].ped)
|
|
sBallasStart[4].ped = CREATE_ENEMY_PED(modelBalla, <<-495.7584, 5248.2979, 85.7865>>, 104.5180, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasStart[5].ped)
|
|
sBallasStart[5].ped = CREATE_ENEMY_PED(modelBalla, <<-604.6235, 5295.0073, 69.3041>>, 291.1520, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasStart[6].ped)
|
|
sBallasStart[6].ped = CREATE_ENEMY_PED(modelBalla, <<-552.7806, 5348.8618, 73.7482>>, 291.1520, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasStart, "Start_")
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(TRUE)
|
|
iEnemyToCheckForAlert = 0
|
|
iBallasPedToSpeak = -1
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasStart) i
|
|
IF DOES_ENTITY_EXIST(sBallasStart[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasStart[i].ped)
|
|
SWITCH sBallasStart[i].iEvent
|
|
CASE 0 //Set up starting behaviour: they'll either be standing or on patrol.
|
|
IF i = 5
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-599.9635, 5350.1118, 69.4697>>, PEDMOVE_WALK, -1, DEFAULT, DEFAULT, 98.0563)
|
|
TASK_STAND_STILL(NULL, GET_RANDOM_INT_IN_RANGE(2000, 4000))
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-604.6235, 5295.0073, 69.3041>>, PEDMOVE_WALK, -1, DEFAULT, DEFAULT, 291.1520)
|
|
TASK_STAND_STILL(NULL, GET_RANDOM_INT_IN_RANGE(2000, 4000))
|
|
SET_SEQUENCE_TO_REPEAT(seq, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBallasStart[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ELSE
|
|
TASK_STAND_GUARD(sBallasStart[i].ped, GET_ENTITY_COORDS(sBallasStart[i].ped), GET_ENTITY_HEADING(sBallasStart[i].ped), "WORLD_HUMAN_GUARD_STAND")
|
|
ENDIF
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasStart[i].ped, TRUE)
|
|
sBallasStart[i].iEvent++
|
|
BREAK
|
|
|
|
CASE 1 //Once everything kicks off send them all to different defensive areas.
|
|
IF NOT bEnemiesHaveBeenAlerted
|
|
//Check if any of the enemies would be able to spot the player, only check one ped a frame to avoid execution spikes.
|
|
IF i = iEnemyToCheckForAlert
|
|
VECTOR vPedPos
|
|
FLOAT fHeightDiff, fDistFromPlayer, fDistFromBuddy
|
|
vPedPos = GET_ENTITY_COORDS(sBallasStart[i].ped)
|
|
fDistFromPlayer = VDIST2(vPlayerPos, vPedPos)
|
|
fDistFromBuddy = 100000.0
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
fDistFromBuddy = VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), vPedPos)
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
fDistFromBuddy = VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]), vPedPos)
|
|
ENDIF
|
|
|
|
fHeightDiff = vPedPos.z - vPlayerPos.z
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sBallasStart[i].ped, PLAYER_PED_ID())
|
|
OR (i != 2 AND fDistFromPlayer < 1600.0 AND (fHeightDiff > -5.0 OR fDistFromPlayer < 100.0))
|
|
OR (i != 2 AND fDistFromBuddy < 1600.0)
|
|
OR (i = 2 AND fDistFromPlayer < 900.0)
|
|
OR IS_PROJECTILE_IN_AREA(vPedPos - <<8.0, 8.0, 5.0>>, vPedPos + <<8.0, 8.0, 5.0>>, TRUE)
|
|
iBallasPedToSpeak = i
|
|
bEnemiesHaveBeenAlerted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF i = 0
|
|
sBallasStart[i].vDest = <<-596.4, 5287.0, 69.8>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasStart[i].ped, sBallasStart[i].vDest, 6.0, TRUE)
|
|
ELIF i = 1
|
|
sBallasStart[i].vDest = <<-565.5, 5257.3, 69.9>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasStart[i].ped, sBallasStart[i].vDest, 2.0, TRUE)
|
|
ELIF i = 2
|
|
sBallasStart[i].vDest = <<-465.8, 5348.8, 84.1>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasStart[i].ped, sBallasStart[i].vDest, 3.0, TRUE)
|
|
sBallasStart[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 3
|
|
sBallasStart[i].vDest = <<-561.2, 5377.0, 70.2>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasStart[i].ped, sBallasStart[i].vDest, 6.0, TRUE)
|
|
ELIF i = 4
|
|
sBallasStart[i].vDest = <<-513.3, 5257.5, 80.0>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasStart[i].ped, sBallasStart[i].vDest, 10.0, TRUE)
|
|
ELIF i = 5
|
|
sBallasStart[i].vDest = <<-581.3, 5292.0, 70.4>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasStart[i].ped, sBallasStart[i].vDest, 6.0, TRUE)
|
|
ELIF i = 6
|
|
sBallasStart[i].vDest = <<-554.8165, 5349.4985, 73.7563>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasStart[i].ped, sBallasStart[i].vDest, 6.0, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(sBallasStart[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasStart[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasStart[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasStart[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasStart[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasStart[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasStart[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_PED_ALERTNESS(sBallasStart[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
sBallasStart[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasStart[i].iEvent != 0
|
|
AND bEnemiesHaveBeenAlerted
|
|
UPDATE_AI_PED_BLIP(sBallasStart[i].ped, sBallasStart[i].sBlipData)
|
|
|
|
IF NOT sBallasStart[i].bForcedLowAccuracy
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
SET_PED_ACCURACY(sBallasStart[i].ped, 1)
|
|
sBallasStart[i].bForcedLowAccuracy = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_ACCURACY(sBallasStart[i].ped, 5)
|
|
sBallasStart[i].bForcedLowAccuracy = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF sBallasStart[i].iEvent > 1
|
|
IF NOT sBallasStart[i].bSetToCharge
|
|
IF sBallasStart[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasStart[i].ped), sBallasStart[i].vDest) < 4.0
|
|
IF (i = 0 AND ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT)
|
|
sBallasStart[i].iTimer = 1
|
|
ELSE
|
|
sBallasStart[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasStart[i].iTimer > 10000
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF (NOT sBallasStart[i].bBlockOpenCombat AND VDIST2(vPlayerPos, GET_ENTITY_COORDS(sBallasStart[i].ped)) < 625.0)
|
|
OR (i = 0 AND ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT)
|
|
OR (sBallasStart[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasStart[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasStart[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
IF i = 0
|
|
SET_PED_CONFIG_FLAG(sBallasStart[i].ped, PCF_ShouldChargeNow, TRUE)
|
|
ENDIF
|
|
|
|
sBallasStart[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF (VDIST2(GET_ENTITY_COORDS(sBallasStart[i].ped), vPlayerPos) > 900.0 AND i != 0)
|
|
OR eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasStart[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasStart[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasStart[i].ped, sBallasStart[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasStart[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iBallasPedToSpeak > -1
|
|
AND iBallasPedToSpeak = i
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sBallasStart[i].ped, "fr2_enemy1")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "Lm2_alert", CONV_PRIORITY_MEDIUM)
|
|
iBallasPedToSpeak = -1
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasStart[i].ped, sBallasStart[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
IF NOT bEnemiesHaveBeenAlerted
|
|
bEnemiesHaveBeenAlerted = TRUE
|
|
ENDIF
|
|
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasStart[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasStart[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
iEnemyToCheckForAlert++
|
|
|
|
IF iEnemyToCheckForAlert >= COUNT_OF(sBallasStart)
|
|
iEnemyToCheckForAlert = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Parked cars: these are always there at the sawmill.
|
|
IF NOT bCreatedBallaStartCars
|
|
//Only create one car a frame to keep down execution time.
|
|
IF NOT DOES_ENTITY_EXIST(vehBallaStart[0])
|
|
REQUEST_MODEL(modelBallaStartCars)
|
|
|
|
IF HAS_MODEL_LOADED(modelBallaStartCars)
|
|
vehBallaStart[0] = CREATE_VEHICLE(modelBallaStartCars, <<-583.9711, 5315.6089, 69.2144>>, -68.552)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(vehBallaStart[1])
|
|
vehBallaStart[1] = CREATE_VEHICLE(modelBallaStartCars, <<-561.6607, 5378.3745, 69.1896>>, 274.1927)
|
|
ELIF NOT DOES_ENTITY_EXIST(vehBallaStart[2])
|
|
vehBallaStart[2] = CREATE_VEHICLE(modelBallaStartCars, <<-596.3167, 5286.4297, 69.2252>>, 19.9865)
|
|
ELIF NOT DOES_ENTITY_EXIST(vehBallaStart[3])
|
|
vehBallaStart[3] = CREATE_VEHICLE(modelBallaStartCars, <<-545.0247, 5253.0581, 73.3049>>, 124.1131)
|
|
ELIF NOT DOES_ENTITY_EXIST(vehBallaStart[4])
|
|
vehBallaStart[4] = CREATE_VEHICLE(modelBallaStartCars, <<-569.1078, 5268.1108, 69.2658>>, 146.2613)
|
|
ELIF NOT DOES_ENTITY_EXIST(vehBallaStart[5])
|
|
vehBallaStart[5] = CREATE_VEHICLE(modelBallaStartCars, <<-583.5582, 5250.5132, 69.4679>>, 216.5756)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBallaStartCars)
|
|
|
|
REPEAT COUNT_OF(vehBallaStart) i
|
|
IF NOT IS_ENTITY_DEAD(vehBallaStart[i])
|
|
SET_VEHICLE_COLOURS(vehBallaStart[i], 66, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehBallaStart[i], 66, 0)
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(vehBallaStart[i], VEHICLELOCK_LOCKED_BUT_CAN_BE_DAMAGED)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehBallaStart[i], TRUE)
|
|
//SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehBallaStart[i], FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
bCreatedBallaStartCars = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF eMissionStage = STAGE_DRIVE_HOME
|
|
AND IS_SCREEN_FADED_IN()
|
|
IF DOES_ENTITY_EXIST(vehBallaStart[0])
|
|
REPEAT COUNT_OF(vehBallaStart) i
|
|
REMOVE_VEHICLE(vehBallaStart[i])
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Ped on phone: intended to be stealth killed, do not create if the player has already been seen.
|
|
IF NOT sBallasOnPhone[0].bIsCreated
|
|
IF eMissionStage = STAGE_GET_INTO_POSITION
|
|
AND NOT bEnemiesHaveBeenAlerted
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
sBallasOnPhone[0].ped = CREATE_ENEMY_PED(modelBalla, <<-474.2554, 5377.4683, 79.3745>>, 208.8788, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasOnPhone, "Phone_")
|
|
|
|
SET_CURRENT_PED_WEAPON(sBallasOnPhone[0].ped, WEAPONTYPE_UNARMED, TRUE)
|
|
TASK_USE_MOBILE_PHONE(sBallasOnPhone[0].ped, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasOnPhone[0].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasOnPhone) i
|
|
IF DOES_ENTITY_EXIST(sBallasOnPhone[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasOnPhone[i].ped)
|
|
SWITCH sBallasOnPhone[i].iEvent
|
|
CASE 0 //Aim at Lamar
|
|
FLOAT fDistFromPlayer
|
|
fDistFromPlayer = VDIST2(GET_ENTITY_COORDS(sBallasOnPhone[i].ped), vPlayerPos)
|
|
|
|
IF bEnemiesHaveBeenAlerted
|
|
OR (fDistFromPlayer < 2500.0 AND HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(sBallasOnPhone[i].ped, PLAYER_PED_ID()))
|
|
IF fDistFromPlayer > 5000.0
|
|
AND (IS_ENTITY_OCCLUDED(sBallasOnPhone[i].ped) OR fDistFromPlayer > 10000.0)
|
|
SET_ENTITY_HEALTH(sBallasOnPhone[i].ped, 0)
|
|
ELSE
|
|
SET_CURRENT_PED_WEAPON(sBallasOnPhone[i].ped, WEAPONTYPE_PISTOL, TRUE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasOnPhone[i].ped, GET_ENTITY_COORDS(sBallasOnPhone[i].ped), 5.0)
|
|
SET_PED_COMBAT_PARAMS(sBallasOnPhone[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasOnPhone[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasOnPhone[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasOnPhone[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasOnPhone[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasOnPhone[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasOnPhone[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasOnPhone[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_PED_ALERTNESS(sBallasOnPhone[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
CLEAR_PED_TASKS(sBallasOnPhone[i].ped)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasOnPhone[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasOnPhone[i].ped, FALSE)
|
|
|
|
|
|
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasOnPhone[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
|
|
sBallasOnPhone[i].iEvent++
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bHasTextLabelTriggered[Lm2_onphn]
|
|
IF fDistFromPlayer < 625.0
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sBallasOnPhone[i].ped, "fr2_enemy1")
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "Lm2_onphn", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[Lm2_onphn] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "Lm2_onphn2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[Lm2_onphn] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasOnPhone[i].iEvent != 0
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sBallasOnPhone[i].ped, PLAYER_PED_ID())
|
|
UPDATE_AI_PED_BLIP(sBallasOnPhone[i].ped, sBallasOnPhone[i].sBlipData)
|
|
|
|
TEXT_LABEL strLabel
|
|
strLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
|
|
IF ARE_STRINGS_EQUAL(strLabel, "Lm2_onphn")
|
|
OR ARE_STRINGS_EQUAL(strLabel, "Lm2_onphn2")
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasOnPhone[i].ped, sBallasOnPhone[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasOnPhone[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasOnPhone[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//The following enemies only trigger after the player has alerted the starting enemies.
|
|
IF bEnemiesHaveBeenAlerted
|
|
//This group spawn straight after the player alerts the start Ballas. Spawn point is dependent on where the player currently is.
|
|
IF NOT sBallasAfterAlert[0].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
|
|
AND eMissionStage < STAGE_GET_LAMAR_OUT
|
|
//Stagger creation, and create each ped at multiple potential locations depending on where the player was when they alerted the enemies.
|
|
IF ePlayersClosestEntryPoint = ENTRY_POINT_BY_BULLDOZER
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[0].ped)
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-554.3489, 5358.4390, 69.6098>>, 339.5240, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[1].ped)
|
|
sBallasAfterAlert[1].ped = CREATE_ENEMY_PED(modelBalla, <<-579.1994, 5344.5347, 69.2308>>, 322.3706, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[2].ped)
|
|
sBallasAfterAlert[2].ped = CREATE_ENEMY_PED(modelBalla, <<-576.9061, 5350.8096, 69.2145>>, 349.5044, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[3].ped)
|
|
sBallasAfterAlert[3].ped = CREATE_ENEMY_PED(modelBalla, <<-585.9430, 5345.0, 69.2672>>, 280.4455, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_CLIFF
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[0].ped)
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-572.7003, 5346.6313, 69.2309>>, 139.4092, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[1].ped)
|
|
sBallasAfterAlert[1].ped = CREATE_ENEMY_PED(modelBalla, <<-571.7344, 5348.9189, 69.2319>>, 154.9614, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[2].ped)
|
|
sBallasAfterAlert[2].ped = CREATE_ENEMY_PED(modelBalla, <<-571.5287, 5351.3413, 69.2284>>, 154.9614, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[3].ped)
|
|
sBallasAfterAlert[3].ped = CREATE_ENEMY_PED(modelBalla, <<-570.4391, 5353.6860, 69.2298>>, 154.9614, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_SNIPER_HILL
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[0].ped)
|
|
IF VDIST2(vPlayerPos, <<-574.6, 5249.3, 70.9>>) < VDIST2(vPlayerPos, <<-551.1, 5245.5, 73.1>>)
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-581.5417, 5264.8799, 69.4481>>, 144.5352, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELSE
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-561.1369, 5254.2246, 69.5090>>, 139.8273, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[1].ped)
|
|
sBallasAfterAlert[1].ped = CREATE_ENEMY_PED(modelBalla, <<-556.1404, 5300.7168, 80.6723>>, 155.9017, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[2].ped)
|
|
sBallasAfterAlert[2].ped = CREATE_ENEMY_PED(modelBalla, <<-543.4486, 5247.4453, 73.7604>>, 138.4167, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[3].ped)
|
|
sBallasAfterAlert[3].ped = CREATE_ENEMY_PED(modelBalla, <<-587.5444, 5271.0928, 69.4683>>, 131.0496, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_METAL_BRIDGE
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[0].ped)
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-544.0679, 5269.8926, 73.1741>>, 74.9389, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[1].ped)
|
|
sBallasAfterAlert[1].ped = CREATE_ENEMY_PED(modelBalla, <<-563.5525, 5288.2593, 74.9328>>, 152.3262, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(sBallasAfterAlert[1].ped, <<-563.5525, 5288.2593, 74.9328>>, 1000, FALSE, 0.0, FALSE, FALSE, NULL, FALSE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sBallasAfterAlert[1].ped)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[2].ped)
|
|
sBallasAfterAlert[2].ped = CREATE_ENEMY_PED(modelBalla, <<-593.4202, 5320.5791, 69.2144>>, 153.0497, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[3].ped)
|
|
sBallasAfterAlert[3].ped = CREATE_ENEMY_PED(modelBalla, <<-592.1321, 5334.9941, 69.2534>>, 169.7280, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_CONVEYOR_BELT
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[0].ped)
|
|
IF VDIST2(vPlayerPos, <<-574.6, 5249.3, 70.9>>) < VDIST2(vPlayerPos, <<-551.1, 5245.5, 73.1>>)
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-581.5417, 5264.8799, 69.4481>>, 144.5352, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELSE
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-561.1369, 5254.2246, 69.5090>>, 139.8273, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[1].ped)
|
|
sBallasAfterAlert[1].ped = CREATE_ENEMY_PED(modelBalla, <<-544.4281, 5274.3335, 73.1741>>, 167.7283, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[2].ped)
|
|
sBallasAfterAlert[2].ped = CREATE_ENEMY_PED(modelBalla, <<-543.4486, 5247.4453, 73.7604>>, 138.4167, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[3].ped)
|
|
sBallasAfterAlert[3].ped = CREATE_ENEMY_PED(modelBalla, <<-587.5444, 5271.0928, 69.4683>>, 131.0496, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_TRAIN_TUNNEL
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[0].ped)
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-503.1779, 5326.7080, 79.2676>>, 184.6035, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[1].ped)
|
|
sBallasAfterAlert[1].ped = CREATE_ENEMY_PED(modelBalla, <<-498.2337, 5277.7466, 79.6100>>, 150.6502, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[2].ped)
|
|
sBallasAfterAlert[2].ped = CREATE_ENEMY_PED(modelBalla, <<-505.1916, 5286.6523, 79.5654>>, 141.7527, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[3].ped)
|
|
sBallasAfterAlert[3].ped = CREATE_ENEMY_PED(modelBalla, <<-501.1952, 5292.9609, 79.6030>>, 169.5985, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[0].ped)
|
|
sBallasAfterAlert[0].ped = CREATE_ENEMY_PED(modelBalla, <<-484.6786, 5324.6045, 79.6103>>, 337.5868, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[1].ped)
|
|
sBallasAfterAlert[1].ped = CREATE_ENEMY_PED(modelBalla, <<-480.7613, 5337.8291, 81.6950>>, 329.0870, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[2].ped)
|
|
sBallasAfterAlert[2].ped = CREATE_ENEMY_PED(modelBalla, <<-471.4462, 5315.3018, 82.4486>>, 350.6388, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterAlert[3].ped)
|
|
sBallasAfterAlert[3].ped = CREATE_ENEMY_PED(modelBalla, <<-476.9317, 5324.8955, 79.6100>>, 333.9693, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sBallasAfterAlert[3].ped)
|
|
INITIALISE_ENEMY_GROUP(sBallasAfterAlert, "Alert_")
|
|
|
|
ePointOfEnemySpawn = ePlayersClosestEntryPoint
|
|
|
|
//When these peds are created delete some of the starting peds based on where the player peds are.
|
|
VECTOR vBuddyPos
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
vBuddyPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
vBuddyPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(sBallasStart) i
|
|
IF NOT IS_PED_INJURED(sBallasStart[i].ped)
|
|
FLOAT fDistFromPlayer = VDIST2(GET_ENTITY_COORDS(sBallasStart[i].ped), vPlayerPos)
|
|
FLOAT fDistFromBuddy = VDIST2(GET_ENTITY_COORDS(sBallasStart[i].ped), vBuddyPos)
|
|
|
|
IF fDistFromPlayer > 5000.0
|
|
AND fDistFromBuddy > 5000.0
|
|
AND (IS_ENTITY_OCCLUDED(sBallasStart[i].ped) OR fDistFromPlayer > 10000.0)
|
|
SET_ENTITY_HEALTH(sBallasStart[i].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Difficulty update: If the player is in the bulldozer reduce the number of enemies.
|
|
IF ePlayersClosestEntryPoint = ENTRY_POINT_BY_BULLDOZER
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
IF NOT IS_PED_INJURED(sBallasAfterAlert[0].ped)
|
|
SET_ENTITY_HEALTH(sBallasAfterAlert[0].ped, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBallasAfterAlert[2].ped)
|
|
SET_ENTITY_HEALTH(sBallasAfterAlert[2].ped, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBallasAfterAlert[3].ped)
|
|
SET_ENTITY_HEALTH(sBallasAfterAlert[3].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Difficulty update: As this group accounts for peds in different areas it's easier to just kill the peds we want to remove.
|
|
IF ePlayersClosestEntryPoint = ENTRY_POINT_BY_WOOD_LOGS
|
|
SET_ENTITY_HEALTH(sBallasAfterAlert[0].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasAfterAlert) i
|
|
IF DOES_ENTITY_EXIST(sBallasAfterAlert[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasAfterAlert[i].ped)
|
|
SWITCH sBallasAfterAlert[i].iEvent
|
|
CASE 0 //Put into combat immediately.
|
|
IF ePlayersClosestEntryPoint = ENTRY_POINT_BY_BULLDOZER
|
|
IF i = 0
|
|
sBallasAfterAlert[i].vDest = <<-562.2291, 5374.9160, 69.1818>>
|
|
ELIF i = 1
|
|
sBallasAfterAlert[i].vDest = <<-559.8881, 5356.9600, 69.2145>>
|
|
ELIF i = 2
|
|
sBallasAfterAlert[i].vDest = <<-572.6667, 5362.7197, 69.2182>>
|
|
ELIF i = 3
|
|
sBallasAfterAlert[i].vDest = <<-577.9835, 5344.3418, 69.2178>>
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_CLIFF
|
|
IF i = 0
|
|
sBallasAfterAlert[i].vDest = <<-594.3, 5314.7, 69.2309>>
|
|
ELIF i = 1
|
|
sBallasAfterAlert[i].vDest = <<-604.9, 5333.7, 69.2319>>
|
|
ELIF i = 2
|
|
sBallasAfterAlert[i].vDest = <<-605.7, 5340.1, 69.5284>>
|
|
ELIF i = 3
|
|
sBallasAfterAlert[i].vDest = <<-587.1, 5369.4860, 69.7298>>
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_SNIPER_HILL
|
|
IF i = 0
|
|
sBallasAfterAlert[i].vDest = <<-567.8237, 5270.8550, 69.2604>>
|
|
ELIF i = 1
|
|
sBallasAfterAlert[i].vDest = <<-556.1403, 5283.8877, 76.1836>>
|
|
SET_PED_STRAFE_CLIPSET(sBallasAfterAlert[i].ped, "move_ped_strafing")
|
|
SET_PED_PATH_CAN_USE_CLIMBOVERS(sBallasAfterAlert[i].ped, FALSE)
|
|
ELIF i = 2
|
|
sBallasAfterAlert[i].vDest = <<-571.0912, 5276.4121, 69.2604>>
|
|
|
|
ELIF i = 3
|
|
sBallasAfterAlert[i].vDest = <<-580.3883, 5263.8218, 69.4455>>
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_METAL_BRIDGE
|
|
IF i = 0
|
|
sBallasAfterAlert[i].vDest = <<-571.9470, 5273.3647, 69.2604>>
|
|
ELIF i = 1
|
|
sBallasAfterAlert[i].vDest = <<-572.3436, 5296.3540, 73.8037>>
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterAlert[i].ped, CA_USE_COVER, FALSE)
|
|
sBallasAfterAlert[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 2
|
|
sBallasAfterAlert[i].vDest = <<-594.5383, 5285.5923, 69.2216>>
|
|
ELIF i = 3
|
|
sBallasAfterAlert[i].vDest = <<-586.1855, 5316.1484, 69.2147>>
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_CONVEYOR_BELT
|
|
IF i = 0
|
|
sBallasAfterAlert[i].vDest = <<-564.5952, 5272.3892, 69.2142>>
|
|
ELIF i = 1
|
|
sBallasAfterAlert[i].vDest = <<-556.1403, 5283.8877, 76.1836>>
|
|
SET_PED_STRAFE_CLIPSET(sBallasAfterAlert[i].ped, "move_ped_strafing")
|
|
SET_PED_PATH_CAN_USE_CLIMBOVERS(sBallasAfterAlert[i].ped, FALSE)
|
|
sBallasAfterAlert[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 2
|
|
sBallasAfterAlert[i].vDest = <<-571.0912, 5276.4121, 69.2604>>
|
|
|
|
ELIF i = 3
|
|
sBallasAfterAlert[i].vDest = <<-580.3883, 5263.8218, 69.4455>>
|
|
ENDIF
|
|
ELIF ePlayersClosestEntryPoint = ENTRY_POINT_BY_TRAIN_TUNNEL
|
|
IF i = 0
|
|
sBallasAfterAlert[i].vDest = <<-498.4009, 5303.5508, 79.5833>>
|
|
ELIF i = 1
|
|
sBallasAfterAlert[i].vDest = <<-507.3313, 5259.4932, 79.6100>>
|
|
ELIF i = 2
|
|
sBallasAfterAlert[i].vDest = <<-515.3116, 5265.8149, 79.4651>>
|
|
ELIF i = 3
|
|
sBallasAfterAlert[i].vDest = <<-504.5242, 5282.3179, 79.6100>>
|
|
ENDIF
|
|
ELSE
|
|
IF i = 0
|
|
sBallasAfterAlert[i].vDest = <<-464.8362, 5331.2334, 82.4351>>
|
|
sBallasAfterAlert[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 1
|
|
sBallasAfterAlert[i].vDest = <<-474.5163, 5340.7954, 81.7043>>
|
|
sBallasAfterAlert[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 2
|
|
sBallasAfterAlert[i].vDest = <<-462.8243, 5337.7476, 82.4694>>
|
|
sBallasAfterAlert[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 3
|
|
sBallasAfterAlert[i].vDest = <<-472.7236, 5312.4346, 85.6664>>
|
|
SET_PED_STRAFE_CLIPSET(sBallasAfterAlert[i].ped, "move_ped_strafing")
|
|
sBallasAfterAlert[i].bBlockOpenCombat = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterAlert[i].ped, sBallasAfterAlert[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasAfterAlert[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasAfterAlert[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterAlert[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasAfterAlert[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasAfterAlert[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterAlert[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasAfterAlert[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasAfterAlert[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasAfterAlert[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasAfterAlert[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
SET_CURRENT_PED_WEAPON(sBallasAfterAlert[i].ped, WEAPONTYPE_PISTOL, TRUE)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasAfterAlert[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasAfterAlert[i].iTimer = 0
|
|
sBallasAfterAlert[i].iEvent++
|
|
BREAK
|
|
|
|
CASE 1
|
|
//Special cases:
|
|
IF ePointOfEnemySpawn = ENTRY_POINT_BY_WOOD_LOGS AND i = 3
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF vPlayerPos.z > 83.0
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasAfterAlert[i].ped), sBallasAfterAlert[i].vDest) < 4.0
|
|
sBallasAfterAlert[i].vDest = <<-466.5307, 5329.6491, 82.4978>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterAlert[i].ped, sBallasAfterAlert[i].vDest, 2.0)
|
|
|
|
sBallasAfterAlert[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasAfterAlert[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasAfterAlert[i].ped, sBallasAfterAlert[i].sBlipData)
|
|
|
|
IF (i = 0 AND ePointOfEnemySpawn != ENTRY_POINT_BY_WOOD_LOGS)
|
|
OR (i = 1 AND ePointOfEnemySpawn = ENTRY_POINT_BY_WOOD_LOGS)
|
|
IF NOT bHasTextLabelTriggered[Lm2_frank]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
BOOL bPlayBulldozerLine = FALSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
OR (NOT IS_VEHICLE_SEAT_FREE(sBulldozer.veh) AND VDIST2(vPlayerPos, GET_ENTITY_COORDS(sBulldozer.veh)) < 625.0)
|
|
bPlayBulldozerLine = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bPlayBulldozerLine
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sBallasAfterAlert[i].ped, "fr2_enemy2")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "Lm2_dozer", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[Lm2_frank] = TRUE
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sBallasAfterAlert[i].ped, "fr2_enemy1")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "Lm2_frank", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[Lm2_frank] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Set to lower accuracy if the player is in the bulldozer.
|
|
IF NOT sBallasAfterAlert[i].bForcedLowAccuracy
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
SET_PED_ACCURACY(sBallasAfterAlert[i].ped, 1)
|
|
sBallasAfterAlert[i].bForcedLowAccuracy = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_ACCURACY(sBallasAfterAlert[i].ped, 5)
|
|
sBallasAfterAlert[i].bForcedLowAccuracy = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasAfterAlert[i].bSetToCharge
|
|
IF sBallasAfterAlert[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasAfterAlert[i].ped), sBallasAfterAlert[i].vDest) < 4.0
|
|
sBallasAfterAlert[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasAfterAlert[i].iTimer > 10000
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF (NOT sBallasAfterAlert[i].bBlockOpenCombat AND VDIST2(vPlayerPos, GET_ENTITY_COORDS(sBallasAfterAlert[i].ped)) < 900.0)
|
|
OR (sBallasAfterAlert[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasAfterAlert[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterAlert[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterAlert[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasAfterAlert[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasAfterAlert[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasAfterAlert[i].ped), vPlayerPos) > 900.0
|
|
OR eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterAlert[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterAlert[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasAfterAlert[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterAlert[i].ped, sBallasAfterAlert[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasAfterAlert[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasAfterAlert[i].ped, sBallasAfterAlert[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasAfterAlert[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasAfterAlert[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Ped guarding Lamar: once shot at or the player gets close he goes into combat.
|
|
IF NOT sBallasGuardingLamar[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
sBallasGuardingLamar[0].ped = CREATE_ENEMY_PED(modelBalla, <<-521.6014, 5306.6914, 79.2676>>, 39.3728, relGroupBallas, 200, 0, WEAPONTYPE_PISTOL)
|
|
SET_PED_DROPS_WEAPONS_WHEN_DEAD(sBallasGuardingLamar[0].ped, FALSE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasGuardingLamar, "Guard_")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasGuardingLamar) i
|
|
IF DOES_ENTITY_EXIST(sBallasGuardingLamar[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasGuardingLamar[i].ped)
|
|
SWITCH sBallasGuardingLamar[i].iEvent
|
|
CASE 0 //Aim at Lamar
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
TASK_AIM_GUN_AT_ENTITY(sBallasGuardingLamar[i].ped, sLamar.ped, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasGuardingLamar[i].ped, TRUE)
|
|
|
|
sBallasGuardingLamar[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //If the player shoots at the ped then go into combat.
|
|
IF NOT DOES_BLIP_EXIST(sBallasGuardingLamar[i].blip)
|
|
IF DOES_BLIP_EXIST(sLamar.blip)
|
|
sBallasGuardingLamar[i].blip = CREATE_BLIP_FOR_ENTITY(sBallasGuardingLamar[i].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN)) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sBallasGuardingLamar[i].ped, GET_PED_INDEX(CHAR_FRANKLIN)))
|
|
OR (NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR)) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sBallasGuardingLamar[i].ped, GET_PED_INDEX(CHAR_TREVOR)))
|
|
OR VDIST2(GET_ENTITY_COORDS(sBallasGuardingLamar[i].ped), vPlayerPos) < 324.0
|
|
OR (IS_BULLET_IN_AREA(GET_ENTITY_COORDS(sBallasGuardingLamar[i].ped), 8.0) AND NOT IS_ENTITY_OCCLUDED(sBallasGuardingLamar[i].ped))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasGuardingLamar[i].ped, GET_ENTITY_COORDS(sBallasGuardingLamar[i].ped), 5.0)
|
|
SET_PED_COMBAT_PARAMS(sBallasGuardingLamar[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasGuardingLamar[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasGuardingLamar[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasGuardingLamar[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasGuardingLamar[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasGuardingLamar[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasGuardingLamar[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasGuardingLamar[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_PED_ALERTNESS(sBallasGuardingLamar[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF NOT DOES_BLIP_EXIST(sBallasGuardingLamar[i].blip)
|
|
sBallasGuardingLamar[i].blip = CREATE_BLIP_FOR_ENTITY(sBallasGuardingLamar[i].ped, TRUE)
|
|
ENDIF
|
|
|
|
sBallasGuardingLamar[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasGuardingLamar[i].ped, sBallasGuardingLamar[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasGuardingLamar[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasGuardingLamar[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Bulldozer first wave
|
|
IF NOT sBallasBulldozer1[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
BOOL bBypassThisGroup = FALSE
|
|
|
|
IF bHitLocateBallasBulldozer1
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh)
|
|
//If an AI buddy is in the bulldozer then the player must be on the same route to trigger this.
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sBulldozer.veh))
|
|
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sBulldozer.veh))
|
|
IF ePlayerRoute != BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Franklin2.sc - Bulldozer1 group not created: AI was in bulldozer, but player wasn't with them.")
|
|
#ENDIF
|
|
|
|
bBypassThisGroup = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-597.861523,5345.111328,54.719841>>, <<-666.824890,5242.858398,102.606491>>, 112.250000)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Franklin2.sc - Bulldozer1 group not created: Player is in a position to see them spawn.")
|
|
#ENDIF
|
|
|
|
bBypassThisGroup = TRUE
|
|
ENDIF
|
|
|
|
IF bBypassThisGroup
|
|
REPEAT COUNT_OF(sBallasBulldozer1) i
|
|
sBallasBulldozer1[i].bIsCreated = TRUE
|
|
ENDREPEAT
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(sBallasBulldozer1[0].ped)
|
|
sBallasBulldozer1[0].ped = CREATE_ENEMY_PED(modelBalla, <<-565.0798, 5326.8994, 69.2400>>, 71.9622, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBulldozer1[1].ped)
|
|
sBallasBulldozer1[1].ped = CREATE_ENEMY_PED(modelBalla, <<-592.5015, 5334.4028, 69.2620>>, 252.6935, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBulldozer1[2].ped)
|
|
sBallasBulldozer1[2].ped = CREATE_ENEMY_PED(modelBalla, <<-594.6821, 5335.3022, 69.3288>>, 350.3948, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasBulldozer1, "Bull1_")
|
|
|
|
//Difficulty update: If the player is in the bulldozer reduce the number of enemies.
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
IF NOT IS_PED_INJURED(sBallasBulldozer1[1].ped)
|
|
SET_ENTITY_HEALTH(sBallasBulldozer1[1].ped, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBallasBulldozer1[2].ped)
|
|
SET_ENTITY_HEALTH(sBallasBulldozer1[2].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasBulldozer1) i
|
|
IF DOES_ENTITY_EXIST(sBallasBulldozer1[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasBulldozer1[i].ped)
|
|
SWITCH sBallasBulldozer1[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasBulldozer1[i].vDest = <<-571.5660, 5329.7129, 69.2144>>
|
|
ELIF i = 1
|
|
sBallasBulldozer1[i].vDest = <<-578.4724, 5338.5435, 69.2144>>
|
|
ELIF i = 2
|
|
sBallasBulldozer1[i].vDest = <<-566.1284, 5339.8271, 69.2144>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasBulldozer1[i].ped, sBallasBulldozer1[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasBulldozer1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasBulldozer1[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer1[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasBulldozer1[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasBulldozer1[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer1[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer1[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasBulldozer1[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasBulldozer1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasBulldozer1[i].iTimer = 0
|
|
sBallasBulldozer1[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasBulldozer1[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasBulldozer1[i].ped, sBallasBulldozer1[i].sBlipData)
|
|
|
|
IF NOT sBallasBulldozer1[i].bForcedLowAccuracy
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
SET_PED_ACCURACY(sBallasBulldozer1[i].ped, 1)
|
|
sBallasBulldozer1[i].bForcedLowAccuracy = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_ACCURACY(sBallasBulldozer1[i].ped, 5)
|
|
sBallasBulldozer1[i].bForcedLowAccuracy = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasBulldozer1[i].bSetToCharge
|
|
IF sBallasBulldozer1[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasBulldozer1[i].ped), sBallasBulldozer1[i].vDest) < 4.0
|
|
sBallasBulldozer1[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasBulldozer1[i].iTimer > 10000
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER
|
|
OR ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
IF (NOT sBallasBulldozer1[i].bBlockOpenCombat)
|
|
OR (sBallasBulldozer1[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasBulldozer1[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasBulldozer1[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerRoute != BUDDY_ROUTE_BULLDOZER
|
|
AND ePlayerRoute != BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasBulldozer1[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer1[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasBulldozer1[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasBulldozer1[i].ped, sBallasBulldozer1[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasBulldozer1[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasBulldozer1[i].ped, sBallasBulldozer1[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasBulldozer1[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasBulldozer1[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//Bulldozer second wave
|
|
IF NOT sBallasBulldozer2[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
BOOL bTriggerBasedOnDeaths = FALSE
|
|
BOOL bBypassThisGroup = FALSE
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasBulldozer1) <= 1
|
|
AND (ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT OR ePlayerRoute = BUDDY_ROUTE_BULLDOZER)
|
|
bTriggerBasedOnDeaths = TRUE
|
|
ENDIF
|
|
|
|
//This group is only safe to trigger in particular scenarios, otherwise we risk swamping the bulldozer and/or the other AI ped.
|
|
IF bHitLocateBallasBulldozer2 OR bTriggerBasedOnDeaths
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh)
|
|
//If the player is in the bulldozer or it's empty then just make sure no player/AI peds aren't in front.
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
OR IS_VEHICLE_SEAT_FREE(sBulldozer.veh, VS_DRIVER)
|
|
IF ARE_PEDS_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN), NULL,
|
|
<<-503.459473,5236.240723,102.546524>>, <<-618.606689,5292.703613,55.009380>>, 40.500000)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Franklin2.sc - Bulldozer2 group not created: a player ped was up ahead.")
|
|
#ENDIF
|
|
|
|
bBypassThisGroup = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If an AI buddy is in the bulldozer then the player must be on the same route to trigger this.
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sBulldozer.veh))
|
|
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sBulldozer.veh))
|
|
IF ePlayerRoute != BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Franklin2.sc - Bulldozer2 group not created: AI was in bulldozer, but player wasn't with them.")
|
|
#ENDIF
|
|
|
|
bBypassThisGroup = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-601.561523,5333.111328,54.719841>>, <<-666.824890,5242.858398,102.606491>>, 112.250000)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Franklin2.sc - Bulldozer2 group not created: Player is in a position to see them spawn.")
|
|
#ENDIF
|
|
|
|
bBypassThisGroup = TRUE
|
|
ENDIF
|
|
|
|
IF bBypassThisGroup
|
|
REPEAT COUNT_OF(sBallasBulldozer2) i
|
|
sBallasBulldozer2[i].bIsCreated = TRUE
|
|
ENDREPEAT
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(sBallasBulldozer2[0].ped)
|
|
sBallasBulldozer2[0].ped = CREATE_ENEMY_PED(modelBalla, <<-583.9528, 5284.0156, 69.2604>>, 345.9741, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBulldozer2[1].ped)
|
|
sBallasBulldozer2[1].ped = CREATE_ENEMY_PED(modelBalla, <<-582.0480, 5282.9438, 69.6424>>, 71.8583, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBulldozer2[2].ped)
|
|
sBallasBulldozer2[2].ped = CREATE_ENEMY_PED(modelBalla, <<-595.5361, 5315.0264, 69.2144>>, 309.6455, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasBulldozer2, "Bull2_")
|
|
|
|
//Difficulty update: If the player is in the bulldozer reduce the number of enemies.
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
IF NOT IS_PED_INJURED(sBallasBulldozer2[1].ped)
|
|
SET_ENTITY_HEALTH(sBallasBulldozer2[1].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasBulldozer2) i
|
|
IF DOES_ENTITY_EXIST(sBallasBulldozer2[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasBulldozer2[i].ped)
|
|
SWITCH sBallasBulldozer2[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasBulldozer2[i].vDest = <<-584.1713, 5311.3719, 69.2144>>
|
|
ELIF i = 1
|
|
sBallasBulldozer2[i].vDest = <<-573.7343, 5315.2500, 69.1795>>
|
|
ELIF i = 2
|
|
sBallasBulldozer2[i].vDest = <<-583.9662, 5286.5220, 69.2604>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasBulldozer2[i].ped, sBallasBulldozer2[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasBulldozer2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasBulldozer2[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer2[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasBulldozer2[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasBulldozer2[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer2[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasBulldozer2[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasBulldozer2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasBulldozer2[i].iTimer = 0
|
|
sBallasBulldozer2[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasBulldozer2[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasBulldozer2[i].ped, sBallasBulldozer2[i].sBlipData)
|
|
|
|
//Set to lower accuracy if the player is in the bulldozer.
|
|
IF NOT sBallasBulldozer2[i].bForcedLowAccuracy
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
SET_PED_ACCURACY(sBallasBulldozer2[i].ped, 1)
|
|
sBallasBulldozer2[i].bForcedLowAccuracy = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_ACCURACY(sBallasBulldozer2[i].ped, 5)
|
|
sBallasBulldozer2[i].bForcedLowAccuracy = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasBulldozer2[i].bSetToCharge
|
|
IF sBallasBulldozer2[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasBulldozer2[i].ped), sBallasBulldozer2[i].vDest) < 4.0
|
|
sBallasBulldozer2[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasBulldozer2[i].iTimer > 10000
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER
|
|
OR ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
IF (NOT sBallasBulldozer2[i].bBlockOpenCombat)
|
|
OR (sBallasBulldozer2[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasBulldozer2[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasBulldozer2[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerRoute != BUDDY_ROUTE_BULLDOZER
|
|
AND ePlayerRoute != BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasBulldozer2[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer2[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasBulldozer2[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasBulldozer2[i].ped, sBallasBulldozer2[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasBulldozer2[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasBulldozer2[i].ped, sBallasBulldozer2[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasBulldozer2[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasBulldozer2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Bulldozer third wave.
|
|
IF NOT sBallasBulldozer3[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
//This group is only safe to trigger in particular scenarios, otherwise we risk swamping the bulldozer and/or the other AI ped.
|
|
IF bHitLocateBallasBulldozer3
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasBulldozer2) = 0
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT OR ePlayerRoute = BUDDY_ROUTE_BULLDOZER
|
|
IF NOT DOES_ENTITY_EXIST(sBallasBulldozer3[0].ped)
|
|
sBallasBulldozer3[0].ped = CREATE_ENEMY_PED(modelBalla, <<-562.3906, 5254.9883, 69.4939>>, 64.2948, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBulldozer3[1].ped)
|
|
sBallasBulldozer3[1].ped = CREATE_ENEMY_PED(modelBalla, <<-568.1168, 5236.5229, 69.4282>>, 152.2310, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBulldozer3[2].ped)
|
|
sBallasBulldozer3[2].ped = CREATE_ENEMY_PED(modelBalla, <<-558.9417, 5266.6992, 71.3148>>, 54.0498, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasBulldozer3, "Bull3_")
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("franklin2.sc - Did not create bulldozer3, player route is ", ENUM_TO_INT(ePlayerRoute))
|
|
#ENDIF
|
|
|
|
REPEAT COUNT_OF(sBallasBulldozer3) i
|
|
sBallasBulldozer3[i].bIsCreated = TRUE
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Difficulty update: If the player is in the bulldozer reduce the number of enemies.
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
IF NOT IS_PED_INJURED(sBallasBulldozer3[2].ped)
|
|
SET_ENTITY_HEALTH(sBallasBulldozer3[2].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasBulldozer3) i
|
|
IF DOES_ENTITY_EXIST(sBallasBulldozer3[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasBulldozer3[i].ped)
|
|
SWITCH sBallasBulldozer3[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasBulldozer3[i].vDest = <<-571.5106, 5274.3599, 69.2604>>
|
|
ELIF i = 1
|
|
sBallasBulldozer3[i].vDest = <<-568.8, 5265.7, 69.8>>
|
|
ELIF i = 2
|
|
sBallasBulldozer3[i].vDest = <<-580.0616, 5262.9087, 69.4442>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasBulldozer3[i].ped, sBallasBulldozer3[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasBulldozer3[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasBulldozer3[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer3[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasBulldozer3[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasBulldozer3[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer3[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer3[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer3[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasBulldozer3[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasBulldozer3[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasBulldozer3[i].iTimer = 0
|
|
sBallasBulldozer3[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasBulldozer3[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasBulldozer3[i].ped, sBallasBulldozer3[i].sBlipData)
|
|
|
|
//Set to lower accuracy if the player is in the bulldozer.
|
|
IF NOT sBallasBulldozer3[i].bForcedLowAccuracy
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
SET_PED_ACCURACY(sBallasBulldozer3[i].ped, 1)
|
|
sBallasBulldozer3[i].bForcedLowAccuracy = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_ACCURACY(sBallasBulldozer3[i].ped, 5)
|
|
sBallasBulldozer3[i].bForcedLowAccuracy = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasBulldozer3[i].bSetToCharge
|
|
IF sBallasBulldozer3[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasBulldozer3[i].ped), sBallasBulldozer3[i].vDest) < 4.0
|
|
sBallasBulldozer3[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasBulldozer3[i].iTimer > 10000
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER
|
|
OR ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
IF (NOT sBallasBulldozer3[i].bBlockOpenCombat)
|
|
OR (sBallasBulldozer3[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasBulldozer3[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer3[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer3[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasBulldozer3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasBulldozer3[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerRoute != BUDDY_ROUTE_BULLDOZER
|
|
AND ePlayerRoute != BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasBulldozer3[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer3[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBulldozer3[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasBulldozer3[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasBulldozer3[i].ped, sBallasBulldozer3[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasBulldozer3[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasBulldozer3[i].ped, sBallasBulldozer3[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasBulldozer3[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasBulldozer3[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Rocket ped: takes position on the roof and shoots at the bulldozer.
|
|
IF NOT sBallasRocket[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
|
|
IF bHitLocateBallasRocket
|
|
IF NOT DOES_ENTITY_EXIST(sBallasRocket[0].ped)
|
|
BOOL bSafeToCreate = FALSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
bSafeToCreate = TRUE
|
|
ELSE
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sBulldozer.veh))
|
|
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sBulldozer.veh))
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
OR ePlayerRoute = BUDDY_ROUTE_SNIPING
|
|
OR ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber2) > 0 //Don't create if the player already got to Lamar
|
|
bSafeToCreate = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bSafeToCreate
|
|
sBallasRocket[0].ped = CREATE_ENEMY_PED(modelBalla, <<-544.1907, 5296.9399, 87.4445>>, 157.0515, relGroupBallas, 200, 0, WEAPONTYPE_RPG)
|
|
SET_PED_STRAFE_CLIPSET(sBallasRocket[0].ped, "move_ped_strafing")
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasRocket, "Rocket_")
|
|
ELSE
|
|
KILL_ENEMY_GROUP_INSTANTLY(sBallasRocket)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
VECTOR vShootPos
|
|
INT iClosestNode
|
|
FLOAT fDistFromTrevor = 0.0
|
|
FLOAT fDistFromFranklin = 0.0
|
|
|
|
REPEAT COUNT_OF(sBallasRocket) i
|
|
IF DOES_ENTITY_EXIST(sBallasRocket[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasRocket[i].ped)
|
|
SWITCH sBallasRocket[i].iEvent
|
|
CASE 0
|
|
sBallasRocket[i].vDest = <<-546.0917, 5286.8765, 87.3861>>
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasRocket[i].ped, sBallasRocket[i].vDest, 1.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasRocket[i].ped, 10, CM_STATIONARY, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasRocket[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRocket[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRocket[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasRocket[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasRocket[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasRocket[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sBallasRocket[i].vDest, sBulldozer.veh, PEDMOVE_RUN, FALSE, 0.25, 4.0, FALSE, ENAV_STOP_EXACTLY)
|
|
TASK_AIM_GUN_AT_ENTITY(NULL, sBulldozer.veh, -1)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sBallasRocket[i].vDest, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.25, 4.0, FALSE, ENAV_STOP_EXACTLY)
|
|
TASK_AIM_GUN_AT_ENTITY(NULL, PLAYER_PED_ID(), -1)
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBallasRocket[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasRocket[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
|
|
sBallasRocket[i].iTimer = 0
|
|
sBallasRocket[i].iEvent++
|
|
BREAK
|
|
|
|
CASE 1 //Fire rockets based on the bulldozer's position: get closer the more rockets fired.
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasRocket[i].ped), sBallasRocket[i].vDest) < 4.0
|
|
IF sBallasRocket[i].iTimer = 0
|
|
sBallasRocket[i].iTimer = GET_GAME_TIMER() + 1000
|
|
ELIF GET_GAME_TIMER() - sBallasRocket[i].iTimer > 0
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh)
|
|
IF iNumTimesFiredRocket < 4
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointBulldozer)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointBulldozer, GET_ENTITY_COORDS(sBulldozer.veh), iClosestNode)
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypointBulldozer, iClosestNode + (4 - iNumTimesFiredRocket), vShootPos)
|
|
|
|
vShootPos.x += GET_RANDOM_FLOAT_IN_RANGE(-1.0, 1.0)
|
|
vShootPos.y += GET_RANDOM_FLOAT_IN_RANGE(-1.0, 1.0)
|
|
|
|
//First rocket always takes out the car.
|
|
IF iNumTimesFiredRocket = 0
|
|
vShootPos = <<-570.1, 5266.5, 70.9>>
|
|
ENDIF
|
|
|
|
SET_PED_SHOOTS_AT_COORD(sBallasRocket[i].ped, vShootPos)
|
|
|
|
iNumTimesFiredRocket++
|
|
sBallasRocket[i].iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 5000)
|
|
ENDIF
|
|
ELSE
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
SET_PED_SHOOTS_AT_COORD(sBallasRocket[i].ped, GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
fDistFromFranklin = VDIST2(GET_ENTITY_COORDS(sBallasRocket[i].ped), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
fDistFromTrevor = VDIST2(GET_ENTITY_COORDS(sBallasRocket[i].ped), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
|
|
IF fDistFromFranklin < fDistFromTrevor
|
|
SET_PED_SHOOTS_AT_COORD(sBallasRocket[i].ped, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
ELSE
|
|
SET_PED_SHOOTS_AT_COORD(sBallasRocket[i].ped, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iNumTimesFiredRocket++
|
|
sBallasRocket[i].iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 5000)
|
|
ENDIF
|
|
ELSE
|
|
//Bulldozer already dead, so just go into combat.
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasRocket[i].ped, 300.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasRocket[i].ped, FALSE)
|
|
|
|
sBallasRocket[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF eMissionStage >= STAGE_GET_LAMAR_OUT
|
|
//Bulldozer already dead, so just go into combat.
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasRocket[i].ped, 300.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasRocket[i].ped, FALSE)
|
|
|
|
sBallasRocket[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasRocket[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasRocket[i].ped, sBallasRocket[i].sBlipData)
|
|
|
|
//Kill if they fall off the roof.
|
|
VECTOR vPos = GET_ENTITY_COORDS(sBallasRocket[i].ped)
|
|
|
|
IF vPos.z < 84.0
|
|
APPLY_DAMAGE_TO_PED(sBallasRocket[i].ped, 300, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasRocket[i].ped, sBallasRocket[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
IF i = 0
|
|
//Record footage of the player killing the ped.
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0)
|
|
ENDIF
|
|
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasRocket[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasRocket[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//Sniper ped: alternative to the rocket ped.
|
|
IF NOT sBallasSniper[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
|
|
IF bHitLocateBallasSniper
|
|
IF NOT DOES_ENTITY_EXIST(sBallasSniper[0].ped)
|
|
IF g_bFranklin2RequestedBackup
|
|
IF ePlayerRoute != BUDDY_ROUTE_REAR
|
|
sBallasSniper[0].ped = CREATE_ENEMY_PED(modelBalla, <<-503.8309, 5323.5601, 88.0160>>, 158.6523, relGroupBallas, 200, 0, WEAPONTYPE_SNIPERRIFLE)
|
|
ELSE
|
|
sBallasSniper[0].ped = CREATE_ENEMY_PED(modelBalla, <<-510.6272, 5308.1636, 87.9901>>, 158.8536, relGroupBallas, 200, 0, WEAPONTYPE_SNIPERRIFLE)
|
|
ENDIF
|
|
|
|
SET_PED_STRAFE_CLIPSET(sBallasSniper[0].ped, "move_ped_strafing")
|
|
INITIALISE_ENEMY_GROUP(sBallasSniper, "Sniper_")
|
|
ELSE
|
|
sBallasSniper[0].bIsCreated = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
VECTOR vPos
|
|
|
|
REPEAT COUNT_OF(sBallasSniper) i
|
|
IF DOES_ENTITY_EXIST(sBallasSniper[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasSniper[i].ped)
|
|
SWITCH sBallasSniper[i].iEvent
|
|
CASE 0
|
|
sBallasSniper[i].vDest = <<-512.1504, 5308.8306, 88.0628>>
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasSniper[i].ped, sBallasSniper[i].vDest, 1.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasSniper[i].ped, 40, CM_STATIONARY, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasSniper[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasSniper[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasSniper[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasSniper[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasSniper[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasSniper[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sBallasSniper[i].vDest, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.25, 4.0, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 500.0)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBallasSniper[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBallasSniper[i].blip = CREATE_BLIP_FOR_PED(sBallasSniper[i].ped, TRUE)
|
|
iTimeSniperStartedAttacking = GET_GAME_TIMER()
|
|
sBallasSniper[i].iTimer = 0
|
|
sBallasSniper[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasSniper[i].ped, sBallasSniper[i].iEvent)
|
|
#ENDIF
|
|
|
|
vPos = GET_ENTITY_COORDS(sBallasSniper[i].ped)
|
|
|
|
IF vPos.z < 85.0
|
|
APPLY_DAMAGE_TO_PED(sBallasSniper[i].ped, 300, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF i = 0
|
|
//Record footage of the player killing the ped
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0)
|
|
ENDIF
|
|
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasSniper[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasSniper[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//Roof ped: only turns up if the player started on the front route.
|
|
IF NOT sBallasFrontExtra[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
|
|
IF sBallasAfterAlert[0].bIsCreated
|
|
AND (ePointOfEnemySpawn = ENTRY_POINT_BY_METAL_BRIDGE OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterAlert) < 4)
|
|
IF (ePointOfEnemySpawn = ENTRY_POINT_BY_CONVEYOR_BELT OR ePointOfEnemySpawn = ENTRY_POINT_BY_METAL_BRIDGE OR ePointOfEnemySpawn = ENTRY_POINT_BY_SNIPER_HILL)
|
|
AND (ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT OR ePlayerRoute = BUDDY_ROUTE_SNIPING)
|
|
AND g_bFranklin2RequestedBackup
|
|
IF ePointOfEnemySpawn = ENTRY_POINT_BY_METAL_BRIDGE
|
|
//Note: there used to be enemies here, currently they're gone for difficulty testing.
|
|
sBallasFrontExtra[0].bIsCreated = TRUE
|
|
sBallasFrontExtra[1].bIsCreated = TRUE
|
|
sBallasFrontExtra[2].bIsCreated = TRUE
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasFrontExtra, "Extra_")
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(sBallasFrontExtra[0].ped)
|
|
sBallasFrontExtra[0].ped = CREATE_ENEMY_PED(modelBalla, <<-537.4317, 5292.5913, 88.1882>>, 162.6303, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
SET_PED_STRAFE_CLIPSET(sBallasFrontExtra[0].ped, "move_ped_strafing")
|
|
ELSE
|
|
sBallasFrontExtra[1].bIsCreated = TRUE
|
|
sBallasFrontExtra[2].bIsCreated = TRUE
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasFrontExtra, "Extra_")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
sBallasFrontExtra[0].bIsCreated = TRUE
|
|
sBallasFrontExtra[1].bIsCreated = TRUE
|
|
sBallasFrontExtra[2].bIsCreated = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
VECTOR vPos
|
|
|
|
REPEAT COUNT_OF(sBallasFrontExtra) i
|
|
IF DOES_ENTITY_EXIST(sBallasFrontExtra[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasFrontExtra[i].ped)
|
|
SWITCH sBallasFrontExtra[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
IF ePointOfEnemySpawn = ENTRY_POINT_BY_METAL_BRIDGE
|
|
sBallasFrontExtra[i].vDest = <<-569.2231, 5302.5654, 82.7490>>
|
|
ELSE
|
|
sBallasFrontExtra[i].vDest = <<-539.9885, 5285.0991, 87.4831>>
|
|
ENDIF
|
|
ELIF i = 1
|
|
sBallasFrontExtra[i].vDest = <<-586.1855, 5316.1484, 69.2147>>
|
|
ELIF i = 2
|
|
sBallasFrontExtra[i].vDest = <<-566.7495, 5269.2300, 69.2973>>
|
|
ENDIF
|
|
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasFrontExtra[i].ped, sBallasFrontExtra[i].vDest, 1.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasFrontExtra[i].ped, 10, CM_STATIONARY, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasFrontExtra[i].ped, sBallasFrontExtra[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasFrontExtra[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasFrontExtra[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasFrontExtra[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasFrontExtra[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasFrontExtra[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasFrontExtra[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasFrontExtra[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
IF i = 0
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sBallasFrontExtra[i].vDest, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.25, 4.0, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBallasFrontExtra[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ELSE
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasFrontExtra[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasFrontExtra[i].ped, FALSE)
|
|
ENDIF
|
|
|
|
sBallasFrontExtra[i].iTimer = 0
|
|
sBallasFrontExtra[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasFrontExtra[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasFrontExtra[i].ped, sBallasFrontExtra[i].sBlipData)
|
|
|
|
//Kill the ped on the high roof if they fall off.
|
|
IF i = 0
|
|
AND ePointOfEnemySpawn != ENTRY_POINT_BY_METAL_BRIDGE
|
|
vPos = GET_ENTITY_COORDS(sBallasFrontExtra[i].ped)
|
|
|
|
IF vPos.z < 85.0
|
|
APPLY_DAMAGE_TO_PED(sBallasFrontExtra[i].ped, 300, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasFrontExtra[i].ped, sBallasFrontExtra[i].iEvent)
|
|
#ENDIF
|
|
|
|
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasFrontExtra[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasFrontExtra[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//Rear peds first wave
|
|
IF NOT sBallasRearTimber1[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
IF bHitLocateBallasRearTimber1
|
|
IF NOT sBallasTimber2[0].bIsCreated AND vPlayerPos.y > 5315.2 //The player may be on the rear route but still in view of spawn points, so do another check here.
|
|
IF NOT DOES_ENTITY_EXIST(sBallasRearTimber1[0].ped)
|
|
IF ePlayerRoute != BUDDY_ROUTE_FRONT_ASSAULT AND ePlayerRoute != BUDDY_ROUTE_SNIPING
|
|
sBallasRearTimber1[0].ped = CREATE_ENEMY_PED(modelBalla, <<-510.4515, 5304.9263, 79.2676>>, 341.0726, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELSE
|
|
sBallasRearTimber1[0].ped = CREATE_ENEMY_PED(modelBalla, <<-502.4980, 5298.0488, 79.5761>>, 70.1201, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasRearTimber1[1].ped)
|
|
IF VDIST2(vPlayerPos, <<-462.7, 5341.5, 83.4>>) < 400.0
|
|
OR ePlayerRoute != BUDDY_ROUTE_REAR
|
|
sBallasRearTimber1[1].ped = CREATE_ENEMY_PED(modelBalla, <<-485.4689, 5324.9492, 79.6100>>, 349.1465, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELSE
|
|
sBallasRearTimber1[1].ped = CREATE_ENEMY_PED(modelBalla, <<-504.8583, 5308.1387, 79.2676>>, 320.3648, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasRearTimber1[2].ped)
|
|
IF VDIST2(vPlayerPos, <<-462.7, 5341.5, 83.4>>) < 400.0
|
|
OR ePlayerRoute != BUDDY_ROUTE_REAR
|
|
sBallasRearTimber1[2].ped = CREATE_ENEMY_PED(modelBalla, <<-491.6151, 5327.0200, 79.5436>>, 334.4004, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELSE
|
|
sBallasRearTimber1[2].ped = CREATE_ENEMY_PED(modelBalla, <<-505.3082, 5306.3003, 79.2676>>, 325.5638, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasRearTimber1[3].ped)
|
|
IF ePlayerRoute != BUDDY_ROUTE_FRONT_ASSAULT AND ePlayerRoute != BUDDY_ROUTE_SNIPING
|
|
sBallasRearTimber1[3].ped = CREATE_ENEMY_PED(modelBalla, <<-512.5977, 5305.6699, 79.2676>>, 307.4940, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELSE
|
|
sBallasRearTimber1[3].ped = CREATE_ENEMY_PED(modelBalla, <<-502.8857, 5326.4292, 79.2676>>, 192.3165, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ENDIF
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasRearTimber1, "Rear1_")
|
|
ENDIF
|
|
ELSE
|
|
//Player is on top of the spawn points (or they reached the trigger from the front route), so don't spawn these peds.
|
|
sBallasRearTimber1[0].bIsCreated = TRUE
|
|
sBallasRearTimber1[1].bIsCreated = TRUE
|
|
sBallasRearTimber1[2].bIsCreated = TRUE
|
|
sBallasRearTimber1[3].bIsCreated = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasRearTimber1) i
|
|
IF DOES_ENTITY_EXIST(sBallasRearTimber1[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasRearTimber1[i].ped)
|
|
SWITCH sBallasRearTimber1[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasRearTimber1[i].vDest = <<-491.4250, 5314.0537, 79.6100>>
|
|
ELIF i = 1
|
|
sBallasRearTimber1[i].vDest = <<-487.1756, 5317.7554, 79.6100>>
|
|
ELIF i = 2
|
|
sBallasRearTimber1[i].vDest = <<-484.8855, 5314.1694, 79.6100>>
|
|
ELIF i = 3
|
|
sBallasRearTimber1[i].vDest = <<-480.3152, 5303.8145, 79.6100>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasRearTimber1[i].ped, sBallasRearTimber1[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasRearTimber1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasRearTimber1[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber1[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasRearTimber1[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasRearTimber1[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasRearTimber1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasRearTimber1[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasRearTimber1[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasRearTimber1[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF HAS_PED_GOT_WEAPON(sBallasRearTimber1[i].ped, WEAPONTYPE_SMG)
|
|
SET_CURRENT_PED_WEAPON(sBallasRearTimber1[i].ped, WEAPONTYPE_SMG, TRUE)
|
|
ELIF HAS_PED_GOT_WEAPON(sBallasRearTimber1[i].ped, WEAPONTYPE_ASSAULTRIFLE)
|
|
SET_CURRENT_PED_WEAPON(sBallasRearTimber1[i].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
|
|
ENDIF
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasRearTimber1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasRearTimber1[i].iTimer = 0
|
|
sBallasRearTimber1[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasRearTimber1[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasRearTimber1[i].ped, sBallasRearTimber1[i].sBlipData)
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasRearTimber1[i].bSetToCharge
|
|
IF sBallasRearTimber1[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasRearTimber1[i].ped), sBallasRearTimber1[i].vDest) < 4.0
|
|
sBallasRearTimber1[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasRearTimber1[i].iTimer > 10000
|
|
IF ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
OR ePlayerRoute = BUDDY_ROUTE_REAR
|
|
IF (NOT sBallasRearTimber1[i].bBlockOpenCombat AND VDIST2(vPlayerPos, GET_ENTITY_COORDS(sBallasRearTimber1[i].ped)) < 900.0)
|
|
OR (sBallasRearTimber1[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasRearTimber1[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasRearTimber1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasRearTimber1[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerRoute != BUDDY_ROUTE_FRONT_ASSAULT
|
|
AND ePlayerRoute != BUDDY_ROUTE_REAR
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasRearTimber1[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber1[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasRearTimber1[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasRearTimber1[i].ped, sBallasRearTimber1[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasRearTimber1[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasRearTimber1[i].ped, sBallasRearTimber1[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasRearTimber1[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasRearTimber1[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//One ped runs up onto the gantry when entering from the back timber area.
|
|
IF NOT sBallasRearTimber2[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
AND ePlayerRoute = BUDDY_ROUTE_REAR
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
IF bHitLocateBallasRearTimber2
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasRearTimber1) <= 1
|
|
IF NOT sBallasTimber2[0].bIsCreated AND vPlayerPos.y > 5315.2 //The player may be on the rear route but still in view of spawn points, so do another check here.
|
|
IF NOT DOES_ENTITY_EXIST(sBallasRearTimber2[0].ped)
|
|
sBallasRearTimber2[0].ped = CREATE_ENEMY_PED(modelBalla, <<-503.3340, 5294.9595, 79.5500>>, 343.6317, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasRearTimber2[1].ped)
|
|
sBallasRearTimber2[1].ped = CREATE_ENEMY_PED(modelBalla, <<-511.1639, 5305.3657, 79.2676>>, 345.3339, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasRearTimber2[2].ped)
|
|
sBallasRearTimber2[2].ped = CREATE_ENEMY_PED(modelBalla, <<-503.0632, 5293.5557, 79.5585>>, 352.8675, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasRearTimber2[3].ped)
|
|
sBallasRearTimber2[3].ped = CREATE_ENEMY_PED(modelBalla, <<-519.3588, 5304.9502, 79.2676>>, 261.0985, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasRearTimber2, "Rear2_")
|
|
ENDIF
|
|
ELSE
|
|
//Player is right on top of the spawn points, just skip this enemy group.
|
|
sBallasRearTimber2[0].bIsCreated = TRUE
|
|
sBallasRearTimber2[1].bIsCreated = TRUE
|
|
sBallasRearTimber2[2].bIsCreated = TRUE
|
|
sBallasRearTimber2[3].bIsCreated = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasRearTimber2) i
|
|
IF DOES_ENTITY_EXIST(sBallasRearTimber2[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasRearTimber2[i].ped)
|
|
SWITCH sBallasRearTimber2[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasRearTimber2[i].vDest = <<-499.1525, 5298.5225, 79.6052>>
|
|
ELIF i = 1
|
|
sBallasRearTimber2[i].vDest = <<-495.8702, 5309.0659, 79.5914>>
|
|
ELIF i = 2
|
|
sBallasRearTimber2[i].vDest = <<-501.6623, 5302.2622, 79.5513>>
|
|
ELSE
|
|
sBallasRearTimber2[i].vDest = <<-488.4678, 5306.7129, 79.6103>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasRearTimber2[i].ped, sBallasRearTimber2[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasRearTimber2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasRearTimber2[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber2[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasRearTimber2[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasRearTimber2[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasRearTimber2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasRearTimber2[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasRearTimber2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasRearTimber2[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasRearTimber2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasRearTimber2[i].iTimer = 0
|
|
sBallasRearTimber2[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasRearTimber2[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasRearTimber2[i].ped, sBallasRearTimber2[i].sBlipData)
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasRearTimber2[i].bSetToCharge
|
|
IF sBallasRearTimber2[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasRearTimber2[i].ped), sBallasRearTimber2[i].vDest) < 4.0
|
|
sBallasRearTimber2[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasRearTimber2[i].iTimer > 10000
|
|
IF ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
OR ePlayerRoute = BUDDY_ROUTE_REAR
|
|
IF (NOT sBallasRearTimber2[i].bBlockOpenCombat AND VDIST2(vPlayerPos, GET_ENTITY_COORDS(sBallasRearTimber2[i].ped)) < 900.0)
|
|
OR (sBallasRearTimber2[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasRearTimber2[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasRearTimber2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasRearTimber2[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerRoute != BUDDY_ROUTE_FRONT_ASSAULT
|
|
AND ePlayerRoute != BUDDY_ROUTE_REAR
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasRearTimber2[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasRearTimber2[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasRearTimber2[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasRearTimber2[i].ped, sBallasRearTimber2[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasRearTimber2[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasRearTimber2[i].ped, sBallasRearTimber2[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasRearTimber2[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasRearTimber2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//Ped guarding Lamar: once shot at or the player gets close he goes into combat.
|
|
IF NOT sBallasOnBelt[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
|
|
IF bHitLocateBallasOnBelt
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL //Don't create if we're in sniper cam, or if the player has reached an area where they could be seen to spawn.
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-485.044128,5304.459961,66.859909>>, <<-562.708069,5083.084961,129.198059>>, 91.250000)
|
|
KILL_ENEMY_GROUP_INSTANTLY(sBallasOnBelt)
|
|
ELSE
|
|
sBallasOnBelt[0].ped = CREATE_ENEMY_PED(modelBalla, <<-535.3907, 5288.1235, 83.9712>>, 100.9884, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
SET_PED_STRAFE_CLIPSET(sBallasOnBelt[0].ped, "move_ped_strafing")
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasOnBelt, "Belt_")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasOnBelt) i
|
|
IF DOES_ENTITY_EXIST(sBallasOnBelt[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasOnBelt[i].ped)
|
|
SWITCH sBallasOnBelt[i].iEvent
|
|
CASE 0 //Run down conveyor belt.
|
|
sBallasOnBelt[0].vDest = <<-540.4274, 5272.7402, 80.2341>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sBallasOnBelt[0].vDest, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE, 0.5, 4.0, FALSE)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBallasOnBelt[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasOnBelt[i].ped, sBallasOnBelt[0].vDest, 2.0)
|
|
SET_PED_COMBAT_PARAMS(sBallasOnBelt[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasOnBelt[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasOnBelt[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_COMBAT_FLOAT(sBallasOnBelt[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasOnBelt[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasOnBelt[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasOnBelt[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasOnBelt[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasOnBelt[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasOnBelt[i].ped, sBallasOnBelt[i].sBlipData)
|
|
|
|
//Kill the ped if he falls off.
|
|
VECTOR vPos = GET_ENTITY_COORDS(sBallasOnBelt[i].ped)
|
|
IF vPos.z < 78.5
|
|
APPLY_DAMAGE_TO_PED(sBallasOnBelt[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasOnBelt[i].ped, sBallasOnBelt[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasOnBelt[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasOnBelt[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Peds show up on the way to the timber section.
|
|
IF NOT sBallasBeforeTimber[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
IF bHitLocateBallasBeforeTimber
|
|
OR (ePlayerRoute != BUDDY_ROUTE_REAR AND IS_PED_INJURED(sBallasRocket[0].ped) AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasOnBelt) = 0)
|
|
IF NOT DOES_ENTITY_EXIST(sBallasBeforeTimber[0].ped)
|
|
IF ePlayerRoute != BUDDY_ROUTE_SNIPING
|
|
sBallasBeforeTimber[0].ped = CREATE_ENEMY_PED(modelBalla, <<-502.0386, 5252.9727, 79.6104>>, 74.4253, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELSE
|
|
sBallasBeforeTimber[0].ped = CREATE_ENEMY_PED(modelBalla, <<-503.4162, 5258.2720, 79.6100>>, 79.7836, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBeforeTimber[1].ped)
|
|
IF ePlayerRoute != BUDDY_ROUTE_SNIPING
|
|
sBallasBeforeTimber[1].ped = CREATE_ENEMY_PED(modelBalla, <<-527.3934, 5272.4277, 73.3164>>, 126.3766, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELSE
|
|
sBallasBeforeTimber[1].ped = CREATE_ENEMY_PED(modelBalla, <<-528.6542, 5274.0645, 73.1741>>, 133.3165, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBeforeTimber[2].ped)
|
|
IF ePlayerRoute != BUDDY_ROUTE_SNIPING
|
|
sBallasBeforeTimber[2].ped = CREATE_ENEMY_PED(modelBalla, <<-531.4066, 5263.5024, 73.3278>>, 175.8792, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELSE
|
|
sBallasBeforeTimber[2].ped = CREATE_ENEMY_PED(modelBalla, <<-531.7002, 5265.3149, 73.2375>>, 155.8115, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasBeforeTimber[3].ped)
|
|
IF ePlayerRoute != BUDDY_ROUTE_SNIPING
|
|
sBallasBeforeTimber[3].ped = CREATE_ENEMY_PED(modelBalla, <<-502.2048, 5252.9600, 79.6104>>, 83.7086, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELSE
|
|
sBallasBeforeTimber[3].ped = CREATE_ENEMY_PED(modelBalla, <<-502.4242, 5256.5176, 79.6100>>, 84.5402, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ENDIF
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasBeforeTimber, "BeforeT_")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasBeforeTimber) i
|
|
IF DOES_ENTITY_EXIST(sBallasBeforeTimber[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasBeforeTimber[i].ped)
|
|
SWITCH sBallasBeforeTimber[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasBeforeTimber[i].vDest = <<-520.9052, 5260.5249, 78.8500>>
|
|
ELIF i = 1
|
|
sBallasBeforeTimber[i].vDest = <<-542.3945, 5253.3306, 73.6131>>
|
|
ELIF i = 2
|
|
sBallasBeforeTimber[i].vDest = <<-545.6429, 5251.0005, 73.1374>>
|
|
ELIF i = 3
|
|
sBallasBeforeTimber[i].vDest = <<-523.8617, 5242.0698, 78.6782>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasBeforeTimber[i].ped, sBallasBeforeTimber[i].vDest, 3.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasBeforeTimber[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasBeforeTimber[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBeforeTimber[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasBeforeTimber[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasBeforeTimber[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBeforeTimber[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasBeforeTimber[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasBeforeTimber[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasBeforeTimber[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasBeforeTimber[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 2
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasBeforeTimber[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
//Keep these enemies near to their defensive areas.
|
|
IF i = 0 OR i = 3
|
|
sBallasBeforeTimber[i].bBlockOpenCombat = TRUE
|
|
ENDIF
|
|
|
|
sBallasBeforeTimber[i].iEvent++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasBeforeTimber[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasBeforeTimber[i].ped, sBallasBeforeTimber[i].sBlipData)
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasBeforeTimber[i].bSetToCharge
|
|
IF sBallasBeforeTimber[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasBeforeTimber[i].ped), sBallasBeforeTimber[i].vDest) < 4.0
|
|
sBallasBeforeTimber[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasBeforeTimber[i].iTimer > 15000
|
|
IF (NOT sBallasBeforeTimber[i].bBlockOpenCombat AND ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT)
|
|
OR (sBallasBeforeTimber[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasBeforeTimber[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBeforeTimber[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBeforeTimber[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
sBallasBeforeTimber[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerRoute != BUDDY_ROUTE_FRONT_ASSAULT
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasBeforeTimber[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBeforeTimber[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasBeforeTimber[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasBeforeTimber[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasBeforeTimber[i].ped, sBallasBeforeTimber[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasBeforeTimber[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasBeforeTimber[i].ped, sBallasBeforeTimber[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasBeforeTimber[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasBeforeTimber[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Peds show up and take cover at the timber.
|
|
IF NOT sBallasTimber1[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
IF bHitLocateBallasTimber1
|
|
IF NOT DOES_ENTITY_EXIST(sBallasTimber1[0].ped)
|
|
sBallasTimber1[0].ped = CREATE_ENEMY_PED(modelBalla, <<-500.7499, 5274.3579, 79.6100>>, 125.7038, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasTimber1[1].ped)
|
|
sBallasTimber1[1].ped = CREATE_ENEMY_PED(modelBalla, <<-503.8717, 5286.3208, 79.5971>>, 174.9208, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasTimber1[2].ped)
|
|
AND NOT sBallasTimber1[2].bIsCreated
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-527.082581,5251.387207,85.503258>>, <<-554.000549,5261.276855,68.925285>>, 20.000000)
|
|
sBallasTimber1[2].ped = CREATE_ENEMY_PED(modelBalla, <<-492.2799, 5259.2686, 85.8358>>, 96.1830, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELSE
|
|
sBallasTimber1[2].bIsCreated = TRUE
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasTimber1[3].ped)
|
|
sBallasTimber1[3].ped = CREATE_ENEMY_PED(modelBalla, <<-503.4756, 5262.6255, 79.6103>>, 357.9579, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasTimber1, "Timber1_")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasTimber1) i
|
|
IF DOES_ENTITY_EXIST(sBallasTimber1[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasTimber1[i].ped)
|
|
SWITCH sBallasTimber1[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasTimber1[i].vDest = <<-515.1771, 5265.7627, 79.4700>>
|
|
ELIF i = 1
|
|
sBallasTimber1[i].vDest = <<-502.3758, 5270.7603, 79.6100>>
|
|
ELIF i = 2
|
|
sBallasTimber1[i].vDest = <<-492.2799, 5259.2686, 85.8358>>
|
|
sBallasTimber1[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 3
|
|
sBallasTimber1[i].vDest = <<-504.5726, 5265.7915, 79.6103>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasTimber1[i].ped, sBallasTimber1[i].vDest, 3.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasTimber1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasTimber1[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber1[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasTimber1[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasTimber1[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasTimber1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasTimber1[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasTimber1[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasTimber1[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasTimber1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasTimber1[i].iEvent++
|
|
BREAK
|
|
|
|
CASE 1 //Switch combat once the player arrives.
|
|
IF vPlayerPos.z > 79.5
|
|
IF i = 2
|
|
sBallasTimber1[i].vDest = <<-485.1102, 5278.6089, 85.8650>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasTimber1[i].ped, sBallasTimber1[i].vDest, 2.0, TRUE)
|
|
|
|
sBallasTimber1[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasTimber1[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasTimber1[i].ped, sBallasTimber1[i].sBlipData)
|
|
|
|
IF i != 2
|
|
AND vPlayerPos.z > 79.5
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasTimber1[i].bSetToCharge
|
|
IF sBallasTimber1[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasTimber1[i].ped), sBallasTimber1[i].vDest) < 4.0
|
|
sBallasTimber1[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasTimber1[i].iTimer > 10000
|
|
IF (NOT sBallasTimber1[i].bBlockOpenCombat AND ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT)
|
|
OR (sBallasTimber1[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasTimber1[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasTimber1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasTimber1[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerRoute != BUDDY_ROUTE_FRONT_ASSAULT
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasTimber1[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber1[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasTimber1[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasTimber1[i].ped, sBallasTimber1[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasTimber1[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasTimber1[i].ped, sBallasTimber1[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasTimber1[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasTimber1[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//More peds show up at the timber section.
|
|
IF NOT sBallasTimber2[0].bIsCreated
|
|
IF eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
|
|
IF bHitLocateBallasTimber2
|
|
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber1) <= 1 AND ePlayerRoute != BUDDY_ROUTE_REAR)
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-495.678741,5296.493652,90.666832>>,<<21.250000,14.000000,12.500000>>)
|
|
IF NOT DOES_ENTITY_EXIST(sBallasTimber2[0].ped)
|
|
sBallasTimber2[0].ped = CREATE_ENEMY_PED(modelBalla, <<-501.6830, 5293.6221, 79.5882>>, 164.6348, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasTimber2[1].ped)
|
|
sBallasTimber2[1].ped = CREATE_ENEMY_PED(modelBalla, <<-504.0350, 5286.5898, 79.5914>>, 175.8207, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasTimber2[2].ped)
|
|
AND NOT sBallasTimber2[2].bIsCreated
|
|
IF ePlayerRoute != BUDDY_ROUTE_REAR
|
|
sBallasTimber2[2].ped = CREATE_ENEMY_PED(modelBalla, <<-502.1692, 5320.1548, 86.6316>>, 164.9300, relGroupBallas, 200, 0, WEAPONTYPE_COMBATMG)
|
|
SET_PED_STRAFE_CLIPSET(sBallasTimber2[2].ped, "move_ped_strafing")
|
|
ELSE
|
|
sBallasTimber2[2].bIsCreated = TRUE
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasTimber2[3].ped)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-514.717224,5247.317383,77.877007>>, <<-499.806976,5287.700684,85.860344>>, 21.500000)
|
|
sBallasTimber2[3].ped = CREATE_ENEMY_PED(modelBalla, <<-481.4254, 5284.5571, 83.1625>>, 146.3917, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
SET_PED_STRAFE_CLIPSET(sBallasTimber2[3].ped, "move_ped_strafing")
|
|
ELSE
|
|
sBallasTimber2[3].bIsCreated = TRUE
|
|
ENDIF
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasTimber2, "Timber2_")
|
|
ENDIF
|
|
ELSE
|
|
sBallasTimber2[0].bIsCreated = TRUE
|
|
sBallasTimber2[1].bIsCreated = TRUE
|
|
sBallasTimber2[2].bIsCreated = TRUE
|
|
sBallasTimber2[3].bIsCreated = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasTimber2) i
|
|
BOOL bMoveToSphere = FALSE
|
|
|
|
IF DOES_ENTITY_EXIST(sBallasTimber2[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasTimber2[i].ped)
|
|
SWITCH sBallasTimber2[i].iEvent
|
|
CASE 0
|
|
IF i != 2
|
|
bMoveToSphere = TRUE
|
|
ELSE
|
|
//Delay the roof guy moving until the player's attention is in the area.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber2) < COUNT_OF(sBallasTimber2)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-538.501160,5288.443359,72.864220>>, <<-462.794434,5238.156738,99.614388>>, 9.250000)
|
|
OR ePlayerRoute = BUDDY_ROUTE_REAR
|
|
bMoveToSphere = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMoveToSphere
|
|
IF i = 0
|
|
sBallasTimber2[i].vDest = <<-501.6830, 5293.6221, 79.5882>>
|
|
ELIF i = 1
|
|
sBallasTimber2[i].vDest = <<-496.6544, 5286.9561, 79.6100>>
|
|
ELIF i = 2
|
|
sBallasTimber2[i].vDest = <<-489.4470, 5304.7974, 86.9991>>
|
|
sBallasTimber2[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 3
|
|
sBallasTimber2[i].vDest = <<-478.7840, 5296.9609, 85.6715>>
|
|
sBallasTimber2[i].bBlockOpenCombat = TRUE
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasTimber2[i].ped, sBallasTimber2[i].vDest, 3.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasTimber2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasTimber2[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber2[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasTimber2[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasTimber2[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasTimber2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasTimber2[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasTimber2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasTimber2[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasTimber2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasTimber2[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Switch combat once the player arrives.
|
|
IF i = 2
|
|
VECTOR vPos
|
|
vPos = GET_ENTITY_COORDS(sBallasTimber2[i].ped)
|
|
|
|
IF vPos.z < 82.0
|
|
APPLY_DAMAGE_TO_PED(sBallasTimber2[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasTimber2[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasTimber2[i].ped, sBallasTimber2[i].sBlipData)
|
|
|
|
IF i != 2
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasTimber2[i].bSetToCharge
|
|
IF sBallasTimber2[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasTimber2[i].ped), sBallasTimber2[i].vDest) < 4.0
|
|
sBallasTimber2[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasTimber2[i].iTimer > 10000
|
|
IF (NOT sBallasTimber2[i].bBlockOpenCombat AND ePlayerRoute = BUDDY_ROUTE_FRONT_ASSAULT)
|
|
OR (sBallasTimber2[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasTimber2[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasTimber2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasTimber2[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerRoute != BUDDY_ROUTE_FRONT_ASSAULT
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasTimber2[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasTimber2[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasTimber2[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasTimber2[i].ped, sBallasTimber2[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasTimber2[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasTimber2[i].ped, sBallasTimber2[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasTimber2[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasTimber2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
ENDPROC
|
|
|
|
PROC UPDATE_SHOOTOUT_ENEMIES_AFTER_RESCUING_LAMAR()
|
|
//The following enemies only trigger after the player has rescued Lamar.
|
|
IF eMissionStage = STAGE_GET_LAMAR_OUT
|
|
INT i = 0
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
//First wave: arrive immediately after rescuing Lamar.
|
|
IF NOT sBallasAfterLamar[0].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterLamar[0].ped)
|
|
IF GET_GAME_TIMER() - iTimeSinceLamarRescued > 1500
|
|
OR IS_SPHERE_VISIBLE(<<-500.2, 5299.8, 80.8>>, 2.0)
|
|
sBallasAfterLamar[0].ped = CREATE_ENEMY_PED(modelBalla, <<-493.5506, 5253.9517, 85.8353>>, 39.0411, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterLamar[1].ped)
|
|
sBallasAfterLamar[1].ped = CREATE_ENEMY_PED(modelBalla, <<-489.7464, 5314.8032, 79.6100>>, 33.0662, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterLamar[2].ped)
|
|
sBallasAfterLamar[2].ped = CREATE_ENEMY_PED(modelBalla, <<-482.9134, 5314.7871, 79.6100>>, 83.8990, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasAfterLamar, "AfterL_")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasAfterLamar) i
|
|
IF DOES_ENTITY_EXIST(sBallasAfterLamar[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasAfterLamar[i].ped)
|
|
SWITCH sBallasAfterLamar[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasAfterLamar[i].vDest = <<-484.8358, 5277.8628, 85.8626>>
|
|
sBallasAfterLamar[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 1
|
|
sBallasAfterLamar[i].vDest = <<-497.8528, 5299.3110, 79.6100>>
|
|
sBallasAfterLamar[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 2
|
|
sBallasAfterLamar[i].vDest = <<-498.0019, 5301.9556, 79.6037>>
|
|
sBallasAfterLamar[i].bBlockOpenCombat = TRUE
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterLamar[i].ped, sBallasAfterLamar[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasAfterLamar[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasAfterLamar[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasAfterLamar[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasAfterLamar[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasAfterLamar[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 1
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasAfterLamar[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasAfterLamar[i].iTimer = 0
|
|
sBallasAfterLamar[i].iEvent++
|
|
BREAK
|
|
|
|
CASE 1 //Switch combat once the player arrives.
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasAfterLamar[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasAfterLamar[i].ped, sBallasAfterLamar[i].sBlipData)
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasAfterLamar[i].bSetToCharge
|
|
IF sBallasAfterLamar[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar[i].ped), sBallasAfterLamar[i].vDest) < 4.0
|
|
sBallasAfterLamar[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasAfterLamar[i].iTimer > 10000
|
|
IF (NOT sBallasAfterLamar[i].bBlockOpenCombat AND eCurrentPlayer != SELECTOR_PED_MICHAEL)
|
|
OR (sBallasAfterLamar[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasAfterLamar[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasAfterLamar[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterLamar[i].ped, sBallasAfterLamar[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasAfterLamar[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasAfterLamar[i].ped, sBallasAfterLamar[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasAfterLamar[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasAfterLamar[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Second wave: a bit further on in the timber.
|
|
IF NOT sBallasAfterLamar2[0].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
IF sBallasAfterLamar[0].bIsCreated
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterLamar2[0].ped)
|
|
sBallasAfterLamar2[0].ped = CREATE_ENEMY_PED(modelBalla, <<-500.3767, 5275.7744, 79.6100>>, 350.0594, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterLamar2[1].ped)
|
|
sBallasAfterLamar2[1].ped = CREATE_ENEMY_PED(modelBalla, <<-524.5526, 5250.3794, 78.2809>>, 314.8624, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterLamar2[2].ped)
|
|
sBallasAfterLamar2[2].ped = CREATE_ENEMY_PED(modelBalla, <<-494.5456, 5251.4844, 85.8305>>, 356.7617, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasAfterLamar2[3].ped)
|
|
sBallasAfterLamar2[3].ped = CREATE_ENEMY_PED(modelBalla, <<-505.5895, 5259.6177, 79.6100>>, 347.4243, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasAfterLamar2, "AfterL2_")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasAfterLamar2) i
|
|
IF DOES_ENTITY_EXIST(sBallasAfterLamar2[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasAfterLamar2[i].ped)
|
|
SWITCH sBallasAfterLamar2[i].iEvent
|
|
CASE 0
|
|
sBallasAfterLamar2[i].vDest = GET_ENTITY_COORDS(sBallasAfterLamar2[i].ped)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterLamar2[i].ped, sBallasAfterLamar2[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasAfterLamar2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasAfterLamar2[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar2[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasAfterLamar2[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasAfterLamar2[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar2[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasAfterLamar2[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasAfterLamar2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasAfterLamar2[i].iTimer = 0
|
|
sBallasAfterLamar2[i].iEvent++
|
|
BREAK
|
|
|
|
CASE 1 //Once the player gets closer have them charge.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-451.718506,5289.728516,89.019905>>, <<-536.241882,5292.254395,71.685295>>, 10.250000)
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar) = 0
|
|
IF i = 0
|
|
sBallasAfterLamar2[i].vDest = <<-504.8420, 5280.0142, 79.6100>>
|
|
ELIF i = 1
|
|
sBallasAfterLamar2[i].vDest = <<-502.5594, 5272.3975, 79.6100>>
|
|
ELIF i = 2
|
|
sBallasAfterLamar2[i].vDest = <<-490.6916, 5260.4219, 85.9607>>
|
|
sBallasAfterLamar2[i].bBlockOpenCombat = TRUE
|
|
ELIF i = 3
|
|
sBallasAfterLamar2[i].vDest = <<-515.0439, 5269.5923, 79.4698>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterLamar2[i].ped, sBallasAfterLamar2[i].vDest, 2.0, TRUE)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasAfterLamar[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasAfterLamar2[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Set to charge once safe.
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasAfterLamar2[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasAfterLamar2[i].ped, sBallasAfterLamar2[i].sBlipData)
|
|
|
|
IF sBallasAfterLamar2[i].iEvent > 1
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasAfterLamar2[i].bSetToCharge
|
|
IF sBallasAfterLamar2[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar2[i].ped), sBallasAfterLamar2[i].vDest) < 4.0
|
|
sBallasAfterLamar2[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasAfterLamar2[i].iTimer > 10000
|
|
IF (NOT sBallasAfterLamar2[i].bBlockOpenCombat AND eCurrentPlayer != SELECTOR_PED_MICHAEL)
|
|
OR (sBallasAfterLamar2[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar2[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasAfterLamar2[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar2[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar2[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasAfterLamar2[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterLamar2[i].ped, sBallasAfterLamar2[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasAfterLamar2[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasAfterLamar2[i].ped, sBallasAfterLamar2[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasAfterLamar2[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasAfterLamar2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Third wave: Hides behind fence down the hill.
|
|
IF NOT sBallasAfterLamar3[0].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
|
|
IF bHitLocateBallasPostRescueTimber
|
|
IF NOT DOES_ENTITY_EXIST(sBallasAfterLamar3[0].ped)
|
|
sBallasAfterLamar3[0].ped = CREATE_ENEMY_PED(modelBalla, <<-561.4196, 5254.9111, 69.5070>>, 290.0712, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasAfterLamar3, "AfterL3_")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasAfterLamar3) i
|
|
IF DOES_ENTITY_EXIST(sBallasAfterLamar3[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasAfterLamar3[i].ped)
|
|
SWITCH sBallasAfterLamar3[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
sBallasAfterLamar3[i].vDest = <<-561.0891, 5254.9658, 69.5110>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterLamar3[i].ped, sBallasAfterLamar3[i].vDest, 2.0, TRUE)
|
|
SET_PED_COMBAT_PARAMS(sBallasAfterLamar3[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sBallasAfterLamar3[i].ped, relGroupBallas)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar3[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasAfterLamar3[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasAfterLamar3[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar3[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar3[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar3[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_ALERTNESS(sBallasAfterLamar3[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
sBallasAfterLamar3[i].iTimer = 0
|
|
sBallasAfterLamar3[i].iEvent++
|
|
BREAK
|
|
|
|
CASE 1 //Once the player gets closer have them charge.
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasAfterLamar3[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sBallasAfterLamar3[i].ped, sBallasAfterLamar3[i].sBlipData)
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasAfterLamar3[i].bSetToCharge
|
|
IF sBallasAfterLamar3[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar3[i].ped), sBallasAfterLamar3[i].vDest) < 4.0
|
|
sBallasAfterLamar3[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar3[i].ped), vPlayerPos) < 900.0
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sBallasAfterLamar3[i].ped, PLAYER_PED_ID())
|
|
IF (NOT sBallasAfterLamar3[i].bBlockOpenCombat AND eCurrentPlayer != SELECTOR_PED_MICHAEL)
|
|
OR (sBallasAfterLamar3[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar3[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar3[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar3[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasAfterLamar3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasAfterLamar3[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasAfterLamar3[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar3[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasAfterLamar3[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasAfterLamar3[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasAfterLamar3[i].ped, sBallasAfterLamar3[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasAfterLamar3[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasAfterLamar3[i].ped, sBallasAfterLamar3[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasAfterLamar3[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasAfterLamar3[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF NOT sBallasPostRescueTimber[0].bIsCreated
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_1, strCarrec)
|
|
REQUEST_MODEL(modelBallaReinforcementCar)
|
|
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_MODEL_LOADED(modelBallaReinforcementCar)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BALLA_POST_RESCUE_1, strCarrec)
|
|
IF bHitLocateBallasPostRescueTimber
|
|
vehBallaPostRescueTimber = CREATE_VEHICLE(modelBallaReinforcementCar, <<-590.5018, 5283.3286, 69.9264>>, -107.7629)
|
|
SET_VEHICLE_ENGINE_ON(vehBallaPostRescueTimber, TRUE, TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehBallaPostRescueTimber, CARREC_BALLA_POST_RESCUE_1, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehBallaPostRescueTimber, 2000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehBallaPostRescueTimber)
|
|
SET_PLAYBACK_SPEED(vehBallaPostRescueTimber, 1.1)
|
|
SET_AUDIO_VEHICLE_PRIORITY(vehBallaPostRescueTimber, AUDIO_VEHICLE_PRIORITY_MAX)
|
|
//SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehBallaPostRescueTimber, FALSE)
|
|
|
|
sBallasPostRescueTimber[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueTimber, VS_DRIVER, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
sBallasPostRescueTimber[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueTimber, VS_FRONT_RIGHT, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
sBallasPostRescueTimber[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueTimber, VS_BACK_LEFT, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasPostRescueTimber, "TimbPost_")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(sBallasPostRescueTimber) i
|
|
IF DOES_ENTITY_EXIST(sBallasPostRescueTimber[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasPostRescueTimber[i].ped)
|
|
SWITCH sBallasPostRescueTimber[i].iEvent
|
|
CASE 0
|
|
BOOL bGetPedsOut
|
|
INT iGetOutTimer
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehBallaPostRescueTimber)
|
|
IF ABSF(GET_ENTITY_SPEED(vehBallaPostRescueTimber)) < 0.5 AND IS_ENTITY_AT_COORD(vehBallaPostRescueTimber, <<-518.2, 5245.4, 80.0>>, <<10.0, 10.0, 5.0>>)
|
|
SET_AUDIO_VEHICLE_PRIORITY(vehBallaPostRescueTimber, AUDIO_VEHICLE_PRIORITY_NORMAL)
|
|
|
|
bGetPedsOut = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bGetPedsOut = TRUE
|
|
ENDIF
|
|
|
|
IF bGetPedsOut
|
|
IF i = 0
|
|
iGetOutTimer = 0
|
|
ELIF i = 1
|
|
iGetOutTimer = 1200
|
|
ELIF i = 2
|
|
iGetOutTimer = 650
|
|
ENDIF
|
|
|
|
IF sBallasPostRescueTimber[i].iTimer = 0
|
|
sBallasPostRescueTimber[i].iTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - sBallasPostRescueTimber[i].iTimer > iGetOutTimer
|
|
IF i = 0
|
|
sBallasPostRescueTimber[i].vDest = <<-519.2643, 5255.7915, 79.4995>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueTimber[i].ped, sBallasPostRescueTimber[i].vDest, 3.0, TRUE)
|
|
ELIF i = 1
|
|
sBallasPostRescueTimber[i].vDest = GET_ENTITY_COORDS(sBallasPostRescueTimber[i].ped)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueTimber[i].ped, sBallasPostRescueTimber[i].vDest, 5.0, TRUE)
|
|
ELIF i = 2
|
|
sBallasPostRescueTimber[i].vDest = <<-507.8264, 5254.7817, 79.6530>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueTimber[i].ped, sBallasPostRescueTimber[i].vDest, 3.0, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(sBallasPostRescueTimber[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
|
|
IF HAS_PED_GOT_WEAPON(sBallasPostRescueTimber[i].ped, WEAPONTYPE_SMG)
|
|
SET_CURRENT_PED_WEAPON(sBallasPostRescueTimber[i].ped, WEAPONTYPE_SMG, TRUE)
|
|
ELIF HAS_PED_GOT_WEAPON(sBallasPostRescueTimber[i].ped, WEAPONTYPE_ASSAULTRIFLE)
|
|
SET_CURRENT_PED_WEAPON(sBallasPostRescueTimber[i].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueTimber[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_COMBAT_FLOAT(sBallasPostRescueTimber[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasPostRescueTimber[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasPostRescueTimber[i].ped, FALSE)
|
|
SET_PED_ALERTNESS(sBallasPostRescueTimber[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasPostRescueTimber[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasPostRescueTimber[i].iTimer = GET_GAME_TIMER()
|
|
sBallasPostRescueTimber[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasPostRescueTimber[i].iEvent > 0
|
|
UPDATE_AI_PED_BLIP(sBallasPostRescueTimber[i].ped, sBallasPostRescueTimber[i].sBlipData)
|
|
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasPostRescueTimber[i].bSetToCharge
|
|
IF sBallasPostRescueTimber[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasPostRescueTimber[i].ped), sBallasPostRescueTimber[i].vDest) < 4.0
|
|
sBallasPostRescueTimber[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasPostRescueTimber[i].iTimer > 10000
|
|
IF (NOT sBallasPostRescueTimber[i].bBlockOpenCombat AND eCurrentPlayer != SELECTOR_PED_MICHAEL)
|
|
OR (sBallasPostRescueTimber[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasPostRescueTimber[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueTimber[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueTimber[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sBallasPostRescueTimber[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sBallasPostRescueTimber[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasPostRescueTimber[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueTimber[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueTimber[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasPostRescueTimber[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueTimber[i].ped, sBallasPostRescueTimber[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasPostRescueTimber[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasPostRescueTimber[i].ped, sBallasPostRescueTimber[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasPostRescueTimber[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasPostRescueTimber[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehBallaPostRescueTimber)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehBallaPostRescueTimber)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_1, strCarrec)
|
|
ENDIF
|
|
|
|
/*IF IS_VEHICLE_DRIVEABLE(vehBallaPostRescueTimber)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehBallaPostRescueTimber, PLAYER_PED_ID())
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueTimber) <= 2
|
|
IF GET_ENTITY_HEALTH(vehBallaPostRescueTimber) < 800
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(vehBallaPostRescueTimber) < 800
|
|
OR GET_VEHICLE_ENGINE_HEALTH(vehBallaPostRescueTimber) < 800
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vehBallaPostRescueTimber, -100)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF NOT sBallasPostRescueExit[0].bIsCreated
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_3, strCarrec)
|
|
REQUEST_MODEL(modelBallaReinforcementCar)
|
|
|
|
IF HAS_MODEL_LOADED(modelBalla)
|
|
AND HAS_MODEL_LOADED(modelBallaReinforcementCar)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BALLA_POST_RESCUE_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BALLA_POST_RESCUE_3, strCarrec)
|
|
IF bHitLocateBallasPostRescueExit
|
|
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueTimber) = 0 AND VDIST2(vPlayerPos, vSawmillExitPos) < 10000.0)
|
|
IF NOT DOES_ENTITY_EXIST(vehBallaPostRescueExit[0])
|
|
vehBallaPostRescueExit[0] = CREATE_VEHICLE(modelBallaReinforcementCar, <<-701.8870, 5255.8970, 73.3489>>, -104.8644)
|
|
SET_VEHICLE_ENGINE_ON(vehBallaPostRescueExit[0], TRUE, TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehBallaPostRescueExit[0], CARREC_BALLA_POST_RESCUE_2, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehBallaPostRescueExit[0], 1500.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehBallaPostRescueExit[0])
|
|
SET_PLAYBACK_SPEED(vehBallaPostRescueExit[0], 1.1)
|
|
SET_AUDIO_VEHICLE_PRIORITY(vehBallaPostRescueExit[0], AUDIO_VEHICLE_PRIORITY_MAX)
|
|
//SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehBallaPostRescueExit[0], FALSE)
|
|
|
|
vehBallaPostRescueExit[1] = CREATE_VEHICLE(modelBallaReinforcementCar, <<-709.0966, 5259.7446, 72.5166>>, -126.1647)
|
|
SET_VEHICLE_ENGINE_ON(vehBallaPostRescueExit[1], TRUE, TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehBallaPostRescueExit[1], CARREC_BALLA_POST_RESCUE_3, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehBallaPostRescueExit[1], 1500.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehBallaPostRescueExit[1])
|
|
SET_PLAYBACK_SPEED(vehBallaPostRescueExit[1], 1.1)
|
|
//SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehBallaPostRescueExit[1], FALSE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasPostRescueExit[0].ped)
|
|
sBallasPostRescueExit[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueExit[0], VS_DRIVER, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasPostRescueExit[1].ped)
|
|
sBallasPostRescueExit[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueExit[0], VS_FRONT_RIGHT, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasPostRescueExit[2].ped)
|
|
sBallasPostRescueExit[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueExit[0], VS_BACK_LEFT, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasPostRescueExit[3].ped)
|
|
sBallasPostRescueExit[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueExit[1], VS_DRIVER, relGroupBallas, 200, 0, WEAPONTYPE_SMG)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasPostRescueExit[4].ped)
|
|
sBallasPostRescueExit[4].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueExit[1], VS_FRONT_RIGHT, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sBallasPostRescueExit[5].ped)
|
|
sBallasPostRescueExit[5].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelBalla, vehBallaPostRescueExit[1], VS_BACK_LEFT, relGroupBallas, 200, 0, WEAPONTYPE_ASSAULTRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sBallasPostRescueExit, "ExitPost_")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
INT iVehIndex = 0
|
|
|
|
REPEAT COUNT_OF(sBallasPostRescueExit) i
|
|
IF DOES_ENTITY_EXIST(sBallasPostRescueExit[i].ped)
|
|
IF NOT IS_PED_INJURED(sBallasPostRescueExit[i].ped)
|
|
SWITCH sBallasPostRescueExit[i].iEvent
|
|
CASE 0
|
|
IF i < 3
|
|
iVehIndex = 0
|
|
ELSE
|
|
iVehIndex = 1
|
|
ENDIF
|
|
|
|
BOOL bGetPedsOut
|
|
INT iGetOutTimer
|
|
|
|
bGetPedsOut = FALSE
|
|
iGetOutTimer = 0
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehBallaPostRescueExit[iVehIndex])
|
|
IF ABSF(VMAG(GET_ENTITY_VELOCITY(vehBallaPostRescueExit[iVehIndex]))) < 0.5 AND IS_ENTITY_AT_COORD(vehBallaPostRescueExit[iVehIndex], <<-568.1, 5263.7, 71.7>>, <<30.0, 30.0, 10.0>>)
|
|
IF iVehIndex = 0
|
|
SET_AUDIO_VEHICLE_PRIORITY(vehBallaPostRescueExit[iVehIndex], AUDIO_VEHICLE_PRIORITY_MAX)
|
|
ENDIF
|
|
|
|
bGetPedsOut = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bGetPedsOut = TRUE
|
|
ENDIF
|
|
|
|
IF bGetPedsOut
|
|
IF i = 0
|
|
iGetOutTimer = 0
|
|
ELIF i = 1
|
|
iGetOutTimer = 950
|
|
ELIF i = 2
|
|
iGetOutTimer = 450
|
|
ELIF i = 3
|
|
iGetOutTimer = 0
|
|
ELIF i = 4
|
|
iGetOutTimer = 1900
|
|
ELIF i = 5
|
|
iGetOutTimer = 1200
|
|
ENDIF
|
|
|
|
IF sBallasPostRescueExit[i].iTimer = 0
|
|
sBallasPostRescueExit[i].iTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - sBallasPostRescueExit[i].iTimer > iGetOutTimer
|
|
IF i = 0
|
|
sBallasPostRescueExit[i].vDest = <<-566.3519, 5256.4736, 69.4670>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].vDest, 3.0, TRUE)
|
|
ELIF i = 1
|
|
sBallasPostRescueExit[i].vDest = <<-566.4669, 5270.9419, 69.2532>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].vDest, 3.0, TRUE)
|
|
ELIF i = 2
|
|
sBallasPostRescueExit[i].vDest = GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].vDest, 5.0, TRUE)
|
|
ELIF i = 3
|
|
IF NOT g_bFranklin2RequestedBackup
|
|
sBallasPostRescueExit[i].vDest = <<-573.4135, 5274.2612, 69.2604>>
|
|
ELSE
|
|
sBallasPostRescueExit[i].vDest = <<-542.5646, 5232.9063, 74.4704>>
|
|
ENDIF
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].vDest, 3.0, TRUE)
|
|
ELIF i = 4
|
|
IF NOT g_bFranklin2RequestedBackup
|
|
sBallasPostRescueExit[i].vDest = GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped)
|
|
ELSE
|
|
sBallasPostRescueExit[i].vDest = <<-547.2554, 5231.9375, 73.1780>>
|
|
ENDIF
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].vDest, 5.0, TRUE)
|
|
ELSE
|
|
IF NOT g_bFranklin2RequestedBackup
|
|
sBallasPostRescueExit[i].vDest = GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped)
|
|
ELSE
|
|
sBallasPostRescueExit[i].vDest = <<-541.3654, 5227.2979, 75.7013>>
|
|
ENDIF
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].vDest, 5.0, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(sBallasPostRescueExit[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
|
|
IF HAS_PED_GOT_WEAPON(sBallasPostRescueExit[i].ped, WEAPONTYPE_SMG)
|
|
SET_CURRENT_PED_WEAPON(sBallasPostRescueExit[i].ped, WEAPONTYPE_SMG, TRUE)
|
|
ELIF HAS_PED_GOT_WEAPON(sBallasPostRescueExit[i].ped, WEAPONTYPE_ASSAULTRIFLE)
|
|
SET_CURRENT_PED_WEAPON(sBallasPostRescueExit[i].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueExit[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_COMBAT_FLOAT(sBallasPostRescueExit[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_COMBAT_FLOAT(sBallasPostRescueExit[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
//The peds from the second car go after Michael.
|
|
IF i < 3
|
|
OR IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasPostRescueExit[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasPostRescueExit[i].ped, FALSE)
|
|
ELSE
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF i = 3
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<-570.1, 5236.1, 69.6337>>, GET_PED_INDEX(CHAR_MICHAEL), PEDMOVE_RUN,
|
|
FALSE, 2.0, 2.0, TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ELIF i = 4
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<-571.1, 5235.4, 69.6337>>, GET_PED_INDEX(CHAR_MICHAEL), PEDMOVE_RUN,
|
|
FALSE, 2.0, 2.0, TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ELIF i = 5
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<-573.1, 5235.4, 69.6337>>, GET_PED_INDEX(CHAR_MICHAEL), PEDMOVE_RUN,
|
|
FALSE, 2.0, 2.0, TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sBallasPostRescueExit[i].vDest, GET_PED_INDEX(CHAR_MICHAEL), PEDMOVE_RUN,
|
|
FALSE, 1.0, 4.0, TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
TASK_COMBAT_PED(NULL, GET_PED_INDEX(CHAR_MICHAEL), COMBAT_PED_PREVENT_CHANGING_TARGET)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBallasPostRescueExit[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasPostRescueExit[i].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sBallasPostRescueExit[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sBallasPostRescueExit[i].bSetToCharge = FALSE
|
|
sBallasPostRescueExit[i].iTimer = 0
|
|
sBallasPostRescueExit[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Go further up the hill after some time.
|
|
IF i >= 3
|
|
AND g_bFranklin2RequestedBackup
|
|
INT iThreshold
|
|
VECTOR vNewDest
|
|
|
|
IF i = 3
|
|
iThreshold = 10000
|
|
vNewDest = <<-562.8715, 5217.4800, 81.9101>>
|
|
ELIF i = 4
|
|
iThreshold = 10700
|
|
vNewDest = <<-578.9219, 5207.4038, 81.6344>>
|
|
ELSE
|
|
iThreshold = 11200
|
|
vNewDest = <<-586.4161, 5210.2407, 80.3978>>
|
|
ENDIF
|
|
|
|
IF sBallasPostRescueExit[i].iTimer = 0
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped), sBallasPostRescueExit[i].vDest) < 4.0
|
|
sBallasPostRescueExit[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasPostRescueExit[i].iTimer > iThreshold
|
|
sBallasPostRescueExit[i].vDest = vNewDest
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasPostRescueExit[i].iTimer = GET_GAME_TIMER()
|
|
sBallasPostRescueExit[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //1445421 - Kill Michael once they get up the hill.
|
|
IF i >= 3
|
|
AND g_bFranklin2RequestedBackup
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped), sBallasPostRescueExit[i].vDest) < 4.0
|
|
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sBallasPostRescueExit[i].ped)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sBallasPostRescueExit[i].iEvent > 0
|
|
UPDATE_AI_PED_BLIP(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].sBlipData)
|
|
|
|
IF i = 3
|
|
IF NOT bHasTextLabelTriggered[Lm2_flank]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped), vPlayerPos) < 900.0
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, sBallasPostRescueExit[i].ped, "fr2_enemy3")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "Lm2_flank", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[Lm2_flank] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[Lm2_flank] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF i < 3
|
|
//Handle charging behaviour: set to charge once they reach their destinations and the player is nearby. Reset behaviour if the player switches away.
|
|
IF NOT sBallasPostRescueExit[i].bSetToCharge
|
|
IF sBallasPostRescueExit[i].iTimer = 0
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped), sBallasPostRescueExit[i].vDest) < 4.0
|
|
sBallasPostRescueExit[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sBallasPostRescueExit[i].iTimer > 10000
|
|
IF (NOT sBallasPostRescueExit[i].bBlockOpenCombat AND eCurrentPlayer != SELECTOR_PED_MICHAEL)
|
|
OR (sBallasPostRescueExit[i].bBlockOpenCombat AND VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped), vPlayerPos) < 25.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueExit[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueExit[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
sBallasPostRescueExit[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped), vPlayerPos) > 900.0
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueExit[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sBallasPostRescueExit[i].ped, CA_CAN_CHARGE, FALSE)
|
|
SET_PED_COMBAT_MOVEMENT(sBallasPostRescueExit[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].vDest, 3.0, TRUE)
|
|
|
|
sBallasPostRescueExit[i].bSetToCharge = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//1445421 - If the player is Michael then make sure the buddies can't kill these peds.
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sBallasPostRescueExit[i].ped, TRUE)
|
|
ELSE
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sBallasPostRescueExit[i].ped, FALSE)
|
|
ENDIF
|
|
|
|
//These peds are set to go for Michael, if they're damaged by the player then switch them to combat.
|
|
IF i >= 3
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sBallasPostRescueExit[i].ped, PLAYER_PED_ID())
|
|
OR VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[i].ped), vPlayerPos) < 10.0
|
|
IF GET_SCRIPT_TASK_STATUS(sBallasPostRescueExit[i].ped, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sBallasPostRescueExit[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBallasPostRescueExit[i].ped, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sBallasPostRescueExit[i].ped, sBallasPostRescueExit[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
UPDATE_PLAYER_PED_KILLS_STATS(sBallasPostRescueExit[i].ped, vPlayerPos)
|
|
CLEAN_UP_ENEMY_PED(sBallasPostRescueExit[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehBallaPostRescueExit[0]) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehBallaPostRescueExit[0])
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_2, strCarrec)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehBallaPostRescueExit[1]) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehBallaPostRescueExit[1])
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BALLA_POST_RESCUE_3, strCarrec)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a given ped is currently hanging around where another given ped is trying to task to.
|
|
/// PARAMS:
|
|
/// pedToCheckForSteal - The ped that we want to check is stealing cover from our AI ped.
|
|
/// pedToMove - The AI ped that we want to move to the given destination.
|
|
/// vDestination - The destination
|
|
/// fMaxDistBeforeCheck - The moving ped must be within this distance of the destination before we start checking what the other ped is doing.
|
|
/// fMaxDistConsideredAsStealing - pedToCheckForSteal must be within this distance of the destination to be considered stealing it.
|
|
/// bPlayerMustBeInCover - If TRUE then the ped must be in cover for them to be considered in the way.
|
|
FUNC BOOL IS_PED_STEALING_PEDS_DESTINATION(PED_INDEX pedToCheckForSteal, PED_INDEX pedToMove, VECTOR vDestination, VECTOR vStealPedDestination, FLOAT fMaxDistBeforeCheck, FLOAT fMaxDistConsideredAsStealing = 3.0)
|
|
IF NOT IS_PED_INJURED(pedToMove)
|
|
AND NOT IS_PED_INJURED(pedToCheckForSteal)
|
|
IF ARE_VECTORS_ALMOST_EQUAL(vStealPedDestination, vDestination)
|
|
RETURN TRUE
|
|
ELSE
|
|
VECTOR vPed1Pos = GET_ENTITY_COORDS(pedToCheckForSteal)
|
|
VECTOR vPed2Pos = GET_ENTITY_COORDS(pedToMove)
|
|
|
|
FLOAT fDistFromPed2ToDest = VDIST2(vPed2Pos, vDestination)
|
|
FLOAT fDistFromPed1ToDest = VDIST2(vPed1Pos, vDestination)
|
|
|
|
IF fDistFromPed2ToDest < (fMaxDistBeforeCheck * fMaxDistBeforeCheck)
|
|
IF fDistFromPed1ToDest < (fMaxDistConsideredAsStealing * fMaxDistConsideredAsStealing)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if any enemies are hanging around close to the ped's next destination.
|
|
FUNC BOOL ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(PED_INDEX ped, VECTOR vPedDestination, FLOAT fExtraDistance = 20.0)
|
|
CONST_INT NUM_PEDS_TO_GRAB 8
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
PED_INDEX peds[NUM_PEDS_TO_GRAB]
|
|
VECTOR vPedPos = GET_ENTITY_COORDS(ped)
|
|
VECTOR vClosestEnemyPos
|
|
FLOAT fEnemyDistFromPed
|
|
FLOAT fPedDistToDestination, fEnemyDistToDestination
|
|
INT i = 0
|
|
|
|
GET_PED_NEARBY_PEDS(ped, peds)
|
|
|
|
WHILE i < NUM_PEDS_TO_GRAB
|
|
IF NOT IS_PED_INJURED(peds[i])
|
|
IF GET_ENTITY_MODEL(peds[i]) = modelBalla
|
|
vClosestEnemyPos = GET_ENTITY_COORDS(peds[i])
|
|
fEnemyDistFromPed = VDIST2(vClosestEnemyPos, vPedPos)
|
|
fEnemyDistToDestination = VDIST2(vClosestEnemyPos, vPedDestination)
|
|
fPedDistToDestination = VDIST2(vPedPos, vPedDestination)
|
|
|
|
IF fEnemyDistFromPed < fPedDistToDestination + (fExtraDistance * fExtraDistance) //Ped is closer to the enemy than the destination.
|
|
IF fEnemyDistToDestination < fPedDistToDestination //Enemy is closer to the destination than the ped is.
|
|
OR fEnemyDistFromPed < 225.0 //Enemy is close in general to the ped from any direction.
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugShowDebug
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
DRAW_DEBUG_SPHERE(vClosestEnemyPos, 1.0, 0, 0, 255, 128)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i++
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if any enemies are hanging around between the two coordinates.
|
|
FUNC BOOL ARE_ENEMIES_IN_BETWEEN_COORDS(PED_INDEX ped, VECTOR vStart, VECTOR vEnd, FLOAT fExtraDistance = 20.0)
|
|
CONST_INT NUM_PEDS_TO_GRAB 16
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
PED_INDEX peds[NUM_PEDS_TO_GRAB]
|
|
VECTOR vClosestEnemyPos
|
|
FLOAT fEnemyDistFromStart, fEnemyDistFromEnd
|
|
FLOAT fDistFromStartToEnd = VDIST2(vStart, vEnd)
|
|
INT i = 0
|
|
|
|
GET_PED_NEARBY_PEDS(ped, peds)
|
|
|
|
WHILE i < NUM_PEDS_TO_GRAB
|
|
IF NOT IS_PED_INJURED(peds[i])
|
|
IF GET_PED_RELATIONSHIP_GROUP_HASH(peds[i]) = relGroupBallas
|
|
vClosestEnemyPos = GET_ENTITY_COORDS(peds[i])
|
|
fEnemyDistFromStart = VDIST2(vClosestEnemyPos, vStart)
|
|
fEnemyDistFromEnd = VDIST2(vClosestEnemyPos, vEnd)
|
|
|
|
IF fEnemyDistFromStart < fEnemyDistFromEnd + (fExtraDistance * fExtraDistance) //Start point is closer to the enemy than the end point (the enemy is potentially in the way if you wanted to walk to the end point).
|
|
IF fEnemyDistFromEnd < fDistFromStartToEnd //Enemy is closer to the end than the distance from the start coord to the end coord (the enemy is between the two coords).
|
|
OR fEnemyDistFromStart < 225.0 //Enemy is close in general to the start point
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugShowDebug
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
DRAW_DEBUG_SPHERE(vClosestEnemyPos, 1.0, 0, 0, 255, 128)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i++
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_BULLDOZER()
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh)
|
|
IF g_bFranklin2RequestedBackup
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
IF NOT bBulldozerReachedDestination
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
AND bEnemiesHaveBeenAlerted
|
|
SET_VEHICLE_FORWARD_SPEED(sBulldozer.veh, 2.0)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_SEAT_FREE(sBulldozer.veh, VS_DRIVER)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sBulldozer.veh, TRUE)
|
|
ELSE
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sBulldozer.veh, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Update the bulldozer audio mix group: should only be active if the player isn't driving the bulldozer.
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBullDozer.veh)
|
|
IF NOT bBulldozerIsInMixGroup
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sBulldozer.veh, "FRANKLIN_2_BULLDOZER_Group")
|
|
bBulldozerIsInMixGroup = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF bBulldozerIsInMixGroup
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sBulldozer.veh)
|
|
bBulldozerIsInMixGroup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bBulldozerCoverDisabled
|
|
IF GET_ENTITY_SPEED(sBulldozer.veh) > 2.0
|
|
SET_VEHICLE_PROVIDES_COVER(sBulldozer.veh, FALSE)
|
|
bBulldozerCoverDisabled = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF GET_ENTITY_SPEED(sBulldozer.veh) < 0.5
|
|
SET_VEHICLE_PROVIDES_COVER(sBulldozer.veh, TRUE)
|
|
bBulldozerCoverDisabled = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///2070342 - If the player is in first-person and switches to Michael then they'll already be forced into snipe mode. Display help indicating that
|
|
///they still need to press the aim button to zoom.
|
|
PROC UPDATE_FIRST_PERSON_SNIPE_HELP_TEXT()
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
AND GET_ALLOW_MOVEMENT_WHILE_ZOOMED()
|
|
AND IS_AIMING_THROUGH_SNIPER_SCOPE(PLAYER_PED_ID())
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF NOT bHasTextLabelTriggered[FRAN2_SNIPEHELP]
|
|
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_IN_SECONDARY)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_OUT_SECONDARY)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_IN)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_OUT)
|
|
OR GET_GAME_TIMER() - iFirstPersonSnipeAimTimer > 2000
|
|
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
|
|
IF IS_PC_VERSION()
|
|
IF NOT IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
|
|
PRINT_HELP("FRAN2_SNIPEHELP", DEFAULT_HELP_TEXT_TIME * 2) // ~s~Use ~INPUTGROUP_LOOK~ to move the reticle. ~n~Use ~INPUTGROUP_SNIPER_ZOOM_SECONDARY~ while holding ~INPUT_AIM~ to zoom in/out. ~n~Press ~INPUT_ATTACK~ to fire the weapon.
|
|
ELSE
|
|
PRINT_HELP("FRAN2_SNIPEHELP_KM", DEFAULT_HELP_TEXT_TIME * 2) // ~s~Use ~INPUTGROUP_LOOK~ to move the reticle. ~n~Use ~INPUTGROUP_SNIPER_ZOOM_SECONDARY~ to zoom in/out. ~n~Press ~INPUT_ATTACK~ to fire the weapon.
|
|
ENDIF
|
|
ELSE
|
|
PRINT_HELP("FRAN2_SNIPEHELP", DEFAULT_HELP_TEXT_TIME * 2)
|
|
ENDIF
|
|
|
|
bHasTextLabelTriggered[FRAN2_SNIPEHELP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SNIPEHELP")
|
|
AND NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_AIM)
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
IF IS_PC_VERSION()
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SNIPEHELP_KM")
|
|
AND NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_AIM)
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
iFirstPersonSnipeAimTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Sniping route: ped just needs to stand and snipe. May possibly have some scripted events later where they snipe specific peds.
|
|
PROC UPDATE_BUDDY_PED_SNIPE_PATH(PED_INDEX &pedBuddy, BUDDY_DATA &sBuddyData)
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF HAS_PED_GOT_WEAPON(pedBuddy, WEAPONTYPE_HEAVYSNIPER)
|
|
WEAPON_TYPE eWeapon
|
|
GET_CURRENT_PED_WEAPON(pedBuddy, eWeapon)
|
|
|
|
IF eWeapon != WEAPONTYPE_HEAVYSNIPER
|
|
SET_CURRENT_PED_WEAPON(pedBuddy, WEAPONTYPE_HEAVYSNIPER)
|
|
ENDIF
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(pedBuddy, WEAPONTYPE_HEAVYSNIPER) < 5
|
|
ADD_AMMO_TO_PED(pedBuddy, WEAPONTYPE_HEAVYSNIPER, 5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vMichaelSnipePos
|
|
|
|
IF sBuddyData.bSwitchedFromThisPed
|
|
//Warp the player if we're currently switching and they're a long distance away from where they're meant to be.
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT fDistToDest = VDIST2(sBuddyData.vDest, vPlayerPos)
|
|
|
|
IF fDistToDest > 4.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, sBuddyData.vDest)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
sBuddyData.bSwitchedFromThisPed = FALSE
|
|
ENDIF
|
|
|
|
IF bEnemiesHaveBeenAlerted
|
|
IF iSwitchStage = 0
|
|
IF (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK AND NOT IS_PED_IN_COMBAT(pedBuddy))
|
|
OR sBuddyData.bRefreshTasks
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF VDIST2(sBuddyData.vDest, GET_ENTITY_COORDS(pedBuddy)) > 100.0
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, sBuddyData.vDest, PEDMOVE_RUN, 60000, DEFAULT, ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 1000.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_COMBAT_FLOAT(pedBuddy, CCF_MAX_SHOOTING_DISTANCE, 500.0)
|
|
SET_PED_STEALTH_MOVEMENT(pedBuddy, FALSE)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Bulldozer route: ped drives bulldozer up to the timber area, then gets out and joins the fron assault route.
|
|
PROC UPDATE_BUDDY_PED_BULLDOZER_PATH(PED_INDEX &pedBuddy, BUDDY_DATA &sBuddyData)
|
|
BOOL bNeedToChangeRoute = FALSE
|
|
VECTOR vBuddyPos
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
vBuddyPos = GET_ENTITY_COORDS(pedBuddy)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointBulldozer)
|
|
|
|
IF IS_PED_IN_VEHICLE(pedBuddy, sBulldozer.veh)
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointBulldozer)
|
|
BOOL bPlayerBlockingBulldozer = FALSE
|
|
VECTOR vPlayerOffset
|
|
|
|
//Stop the bulldozer if the player gets in front.
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
vPlayerOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sBulldozer.veh, vPlayerPos)
|
|
|
|
IF vPlayerOffset.y < 6.0 AND vPlayerOffset.y > 3.0
|
|
IF ABSF(vPlayerOffset.x) < 1.25
|
|
IF GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_VEHICLE_TEMP_ACTION) = FINISHED_TASK
|
|
IF GET_ENTITY_SPEED(sBulldozer.veh) > 1.0
|
|
TASK_VEHICLE_TEMP_ACTION(pedBuddy, sBulldozer.veh, TEMPACT_BRAKE, -1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bPlayerBlockingBulldozer = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sBulldozer.veh)
|
|
IF NOT bBulldozerReachedDestination
|
|
AND NOT bPlayerBlockingBulldozer
|
|
INT iClosestNode
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointBulldozer, GET_ENTITY_COORDS(sBulldozer.veh), iClosestNode)
|
|
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(pedBuddy, sBulldozer.veh, strWaypointBulldozer, DRIVINGMODE_PLOUGHTHROUGH, iClosestNode + 2,
|
|
EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedBuddy, TRUE)
|
|
fBulldozerCruiseSpeed = 4.0
|
|
ENDIF
|
|
ELSE
|
|
INT iClosestNode
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointBulldozer, GET_ENTITY_COORDS(sBulldozer.veh), iClosestNode)
|
|
|
|
IF GET_GAME_TIMER() - iBulldozerLiftTimer > 2000
|
|
AND GET_GAME_TIMER() - iBulldozerLiftTimer < 5200
|
|
SET_VEHICLE_BULLDOZER_ARM_POSITION(sBulldozer.veh, 0.9, FALSE)
|
|
ELSE
|
|
IF iClosestNode > 10 AND iClosestNode < 25
|
|
SET_VEHICLE_BULLDOZER_ARM_POSITION(sBulldozer.veh, 0.05, FALSE)
|
|
ELSE
|
|
SET_VEHICLE_BULLDOZER_ARM_POSITION(sBulldozer.veh, 0.1, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Rubber band the bulldozer based on the player.
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
IF iClosestNode > 9
|
|
FLOAT fOffset = vPlayerOffset.y
|
|
FLOAT fDesiredSpeed = 4.0
|
|
|
|
IF iClosestNode < 17
|
|
IF fOffset < -2.0
|
|
fDesiredSpeed = 1.0
|
|
ELSE
|
|
fDesiredSpeed = 4.0
|
|
ENDIF
|
|
ELSE
|
|
IF fOffset < -2.0
|
|
fDesiredSpeed = 5.0
|
|
ELIF
|
|
fDesiredSpeed = 10.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fBulldozerCruiseSpeed = fBulldozerCruiseSpeed +@ (((fDesiredSpeed - fBulldozerCruiseSpeed) * 0.01) * 30.0)
|
|
SET_DRIVE_TASK_CRUISE_SPEED(pedBuddy, fBulldozerCruiseSpeed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sBulldozer.veh, <<-512.429565,5258.324707,79.609993>>, <<-515.066040,5217.234375,83.786385>>, 8.0)
|
|
bBulldozerReachedDestination = TRUE
|
|
bNeedToChangeRoute = TRUE
|
|
ENDIF
|
|
|
|
//Check for nearby peds and vehicles to the bulldozer
|
|
VEHICLE_INDEX vehClosest[2]
|
|
PED_INDEX pedClosest[4]
|
|
GET_PED_NEARBY_VEHICLES(pedBuddy, vehClosest)
|
|
GET_PED_NEARBY_PEDS(pedBuddy, pedClosest)
|
|
|
|
//Play dialogue if an enemy ped tries to jack Trevor.
|
|
IF GET_GAME_TIMER() - iBulldozerJackTimer > 10000
|
|
AND pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
AND VDIST2(vPlayerPos, vBuddyPos) < 625.0
|
|
BOOL bEnemyTryingToJack = FALSE
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(pedClosest) i
|
|
IF NOT IS_PED_INJURED(pedClosest[i])
|
|
AND GET_PED_RELATIONSHIP_GROUP_HASH(pedClosest[i]) = relGroupBallas
|
|
IF VDIST2(GET_ENTITY_COORDS(pedClosest[i]), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sBulldozer.veh, <<-1.9927, -0.0424, 0.8947>>)) < 9.0
|
|
bEnemyTryingToJack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF bEnemyTryingToJack
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_jack", CONV_PRIORITY_MEDIUM)
|
|
iBulldozerJackTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Set vehicles on fire when touching them.
|
|
IF NOT IS_ENTITY_DEAD(vehClosest[1])
|
|
AND vehClosest[1] != sBulldozer.veh
|
|
IF VDIST2(GET_ENTITY_COORDS(vehClosest[1]), vBuddyPos) < 100.0
|
|
IF GET_VEHICLE_ENGINE_HEALTH(vehClosest[1]) > 0.0
|
|
IF IS_ENTITY_TOUCHING_ENTITY(sBulldozer.veh, vehClosest[1])
|
|
SET_VEHICLE_ENGINE_HEALTH(vehClosest[1], 0.0)
|
|
|
|
iBulldozerLiftTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
//Play some specific dialogue if the buddy is Trevor.
|
|
IF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
IF VDIST2(vPlayerPos, vBuddyPos) < 625.0
|
|
IF NOT bHasTextLabelTriggered[LM2_move]
|
|
IF VDIST2(vBuddyPos, <<-563.1, 5375.6, 69.8>>) < 400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_move", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_move] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_move2]
|
|
IF VDIST2(vBuddyPos, <<-584.2, 5312.7, 69.8>>) < 400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_move2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_move2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player is also on the bulldozer route treat the ped in the bulldozer as the player.
|
|
IF ePlayerRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
SET_PED_CONFIG_FLAG(pedBuddy, PCF_TreatAsPlayerDuringTargeting, TRUE)
|
|
ELSE
|
|
SET_PED_CONFIG_FLAG(pedBuddy, PCF_TreatAsPlayerDuringTargeting, FALSE)
|
|
ENDIF
|
|
|
|
//Specific events along the bulldozer path.
|
|
SWITCH sBulldozer.iEvent
|
|
CASE 0
|
|
//If the rocket ped spawns then stop the bulldozer.
|
|
IF sBallasRocket[0].bIsCreated
|
|
IF iBallaRocketTimer != 0
|
|
IF GET_GAME_TIMER() - iBallaRocketTimer > 1500
|
|
bNeedToChangeRoute = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ELSE
|
|
bNeedToChangeRoute = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bNeedToChangeRoute = TRUE
|
|
ENDIF
|
|
|
|
IF bNeedToChangeRoute
|
|
IF VDIST2(vBuddyPos, <<-512.429565,5258.324707,79.609993>>) < 6400.0
|
|
AND IS_PED_INJURED(sBallasRocket[0].ped)
|
|
IF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
eFranklinRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
ELSE
|
|
eTrevorRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
ENDIF
|
|
ELSE
|
|
IF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
eFranklinRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
ELSE
|
|
eTrevorRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sBulldozer.veh, FALSE)
|
|
ENDIF
|
|
|
|
SET_PED_CONFIG_FLAG(pedBuddy, PCF_TreatAsPlayerDuringTargeting, FALSE)
|
|
|
|
sBuddyData.iEvent = 0
|
|
sBuddyData.bSwitchedFromThisPed = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Bulldozer alternate route: ped takes same route as bulldozer but on foot, eventually meeting up with where the bulldozer would have stopped.
|
|
PROC UPDATE_BUDDY_PED_BULLDOZER_ON_FOOT_PATH(PED_INDEX &pedBuddy, BUDDY_DATA &sBuddyData)
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
VECTOR vBuddyPos = GET_ENTITY_COORDS(pedBuddy)
|
|
FLOAT fDistToDestination
|
|
BOOL bPlayerStoleCover = FALSE
|
|
BOOL bKilledFirstWave = TRUE
|
|
BOOL bIsInCombat = (IS_PED_IN_COMBAT(pedBuddy) OR GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vOtherBuddysCurrentDestination
|
|
|
|
IF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
vOtherBuddysCurrentDestination = sFranklin.vDest
|
|
ELSE
|
|
vOtherBuddysCurrentDestination = sTrevor.vDest
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(pedBuddy, WEAPONTYPE_CARBINERIFLE)
|
|
IF GET_AMMO_IN_PED_WEAPON(pedBuddy, WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(pedBuddy, WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vDest[5]
|
|
vDest[0] = <<-561.3218, 5379.8799, 69.0322>> //no cover
|
|
vDest[1] = <<-563.3644, 5350.0957, 69.2162>> //156.7, wall to both, low
|
|
vDest[2] = <<-571.0067, 5331.9878, 69.2144>> //156.7, wall to both, low
|
|
vDest[3] = <<-598.5005, 5291.3999, 69.2144>> //no cover
|
|
vDest[4] = <<-573.1577, 5274.5259, 69.2604>> //-126.0, wall to both, low
|
|
|
|
VECTOR vAltDest[5]
|
|
vAltDest[0] = <<-551.4478, 5375.3696, 69.4518>> //156.7, wall to both, low
|
|
vAltDest[1] = <<-572.2329, 5357.8052, 69.2145>> //156.7, wall to both, low
|
|
vAltDest[2] = <<-579.6328, 5342.0933, 69.2144>> //156.7, wall to right, high
|
|
vAltDest[3] = <<-584.6021, 5285.1162, 69.2604>> //-122.7, wall to left, high
|
|
vAltDest[4] = <<-584.8169, 5285.1431, 69.2604>> //-122.7, wall to left, high
|
|
|
|
//If the player switched away from this ped then we need to recalculate where they should be on the route.
|
|
IF sBuddyData.bSwitchedFromThisPed
|
|
INT i = 0
|
|
INT iClosestDest = 0
|
|
FLOAT fClosestDist = -1.0
|
|
FLOAT fDist
|
|
|
|
REPEAT COUNT_OF(vDest) i
|
|
fDist = VDIST2(vBuddyPos, vDest[i])
|
|
|
|
IF fClosestDist = -1.0
|
|
OR fDist < fClosestDist
|
|
iClosestDest = i
|
|
fClosestDist = fDist
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Check if this destination would put the ped into a group of enemies. If so, take the previous destination as the closest.
|
|
IF iClosestDest > 0
|
|
IF ARE_ENEMIES_IN_BETWEEN_COORDS(pedBuddy, vDest[iClosestDest - 1], vDest[iClosestDest])
|
|
iClosestDest = iClosestDest - 1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iClosestDest = 0
|
|
sBuddyData.iEvent = 0
|
|
ELIF iClosestDest = 1
|
|
sBuddyData.iEvent = 1
|
|
ELIF iClosestDest = 2
|
|
sBuddyData.iEvent = 2
|
|
ELIF iClosestDest = 3
|
|
sBuddyData.iEvent = 3
|
|
ELSE
|
|
sBuddyData.iEvent = 4
|
|
ENDIF
|
|
|
|
//Warp the player if we're currently switching and they're a long distance away from where they're meant to be.
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT fDistToDest = VDIST2(vDest[iClosestDest], vPlayerPos)
|
|
FLOAT fDistToAltDest = VDIST2(vAltDest[iClosestDest], vPlayerPos)
|
|
|
|
IF fDistToDest < fDistToAltDest
|
|
IF fDistToDest > 400.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, vDest[iClosestDest])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vDest[iClosestDest]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
IF fDistToAltDest > 400.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, vAltDest[iClosestDest])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vAltDest[iClosestDest]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
sBuddyData.bSwitchedFromThisPed = FALSE
|
|
ENDIF
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, <<0.0, 0.0, 0.0>>)
|
|
sBuddyData.vDest = vDest[0]
|
|
ENDIF
|
|
|
|
SWITCH sBuddyData.iEvent
|
|
CASE 0 //Fight at the rock outside the entrance until it's safe to enter.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[0]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[0]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest[0], sBuddyData.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vAltDest[0], sBuddyData.vDest)
|
|
sBuddyData.vDest = vDest[0]
|
|
ENDIF
|
|
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[0])
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 156.7, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-590.8, 5276.8, 71.5>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[1])
|
|
bKilledFirstWave = TRUE
|
|
|
|
IF ePointOfEnemySpawn = ENTRY_POINT_BY_BULLDOZER
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterAlert) > 0
|
|
bKilledFirstWave = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bKilledFirstWave
|
|
sBuddyData.vDest = vDest[1]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[1]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[1]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[1])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 156.7, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 156.7, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-590.8, 5276.8, 71.5>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[2])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasBulldozer1) = 0
|
|
sBuddyData.vDest = vDest[2]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[2]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[2]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[2])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 156.7, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 156.7, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-590.8, 5276.8, 71.5>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[3])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasBulldozer2) = 0
|
|
sBuddyData.vDest = vDest[3]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[3]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[3]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[3])
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -122.7, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-553.1, 5258.8, 73.3>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[4])
|
|
sBuddyData.vDest = vDest[4]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[4]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[4]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[4])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -126.0, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -122.7, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-553.1, 5258.8, 73.3>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
|
|
//From this point onwards the route joins up with the front assault, so switch the buddy ped over to that route.
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, <<-566.3613, 5256.4595, 69.4670>>)
|
|
AND IS_PED_INJURED(sBallasRocket[0].ped)
|
|
IF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
eFranklinRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
ELIF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
eTrevorRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
ENDIF
|
|
|
|
sBuddyData.iEvent = 0
|
|
sBuddyData.bSwitchedFromThisPed = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Front route: ped goes on foot from the front.
|
|
PROC UPDATE_BUDDY_PED_FRONT_PATH(PED_INDEX &pedBuddy, BUDDY_DATA &sBuddyData)
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
VECTOR vBuddyPos = GET_ENTITY_COORDS(pedBuddy)
|
|
FLOAT fDistToDestination
|
|
BOOL bPlayerStoleCover = FALSE
|
|
BOOL bKilledFirstWave = TRUE
|
|
BOOL bIsInCombat = (IS_PED_IN_COMBAT(pedBuddy) OR GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vOtherBuddysCurrentDestination
|
|
|
|
IF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
vOtherBuddysCurrentDestination = sFranklin.vDest
|
|
ELSE
|
|
vOtherBuddysCurrentDestination = sTrevor.vDest
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(pedBuddy, WEAPONTYPE_CARBINERIFLE)
|
|
IF GET_AMMO_IN_PED_WEAPON(pedBuddy, WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(pedBuddy, WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vDest[8]
|
|
//There are two potential start positions for this route, depending on where the player started.
|
|
IF VDIST2(vBuddyPos, <<-592.0587, 5236.6323, 69.8622>>) < VDIST2(vBuddyPos, <<-598.3776, 5286.8184, 69.2335>>)
|
|
vDest[0] = <<-592.0587, 5236.6323, 69.8622>> //-31.4, wall to both, low
|
|
ELSE
|
|
vDest[0] = <<-598.3776, 5286.8184, 69.2335>> //no cover
|
|
ENDIF
|
|
vDest[1] = <<-566.3613, 5256.4595, 69.4670>> //-108.3, wall to right, high
|
|
vDest[2] = <<-547.0441, 5270.3545, 73.1741>> //-115.0, wall to left, high
|
|
vDest[3] = <<-522.0834, 5250.7563, 78.5639>> //-23.1, wall to both, low
|
|
vDest[4] = <<-518.9554, 5255.7407, 79.5127>> //-30.7, wall to both, low
|
|
vDest[5] = <<-504.8981, 5280.0112, 79.6100>> //-22.7, wall to both, low
|
|
vDest[6] = <<-497.9232, 5299.3667, 79.6100>> //68.6, wall to both, low
|
|
vDest[7] = <<-504.7159, 5300.7744, 79.5876>> //no cover
|
|
|
|
VECTOR vAltDest[8]
|
|
vAltDest[0] = <<-583.5048, 5248.0664, 69.4689>> //no cover
|
|
vAltDest[1] = <<-566.3081, 5271.2119, 69.2443>> //-107.8, wall to both, low
|
|
vAltDest[2] = <<-544.6422, 5255.0625, 73.2873>> //231.8, wall to both, low
|
|
vAltDest[3] = <<-508.5136, 5255.0532, 79.6276>> //-14.4, wall to both, low
|
|
vAltDest[4] = <<-508.5136, 5255.0532, 79.6276>> //-14.4, wall to both, low
|
|
vAltDest[5] = <<-501.2620, 5275.9766, 79.6100>> //-21.3, wall to right, high
|
|
vAltDest[6] = <<-497.8619, 5302.2593, 79.6041>> //68.6, wall to both, low
|
|
vAltDest[7] = <<-504.2799, 5304.1685, 79.4737>> //no cover
|
|
|
|
//If the player switched away from this ped then we need to recalculate where they should be on the route.
|
|
IF sBuddyData.bSwitchedFromThisPed
|
|
INT i = 0
|
|
INT iClosestDest = 0
|
|
FLOAT fClosestDist = -1.0
|
|
FLOAT fDist
|
|
|
|
//Find the closest destination to the ped.
|
|
REPEAT COUNT_OF(vDest) i
|
|
fDist = VDIST2(vBuddyPos, vDest[i])
|
|
|
|
IF fClosestDist = -1.0
|
|
OR fDist < fClosestDist
|
|
iClosestDest = i
|
|
fClosestDist = fDist
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Check if this destination would put the ped into a group of enemies. If so, take the previous destination as the closest.
|
|
IF iClosestDest > 0
|
|
IF ARE_ENEMIES_IN_BETWEEN_COORDS(pedBuddy, vDest[iClosestDest - 1], vDest[iClosestDest])
|
|
iClosestDest = iClosestDest - 1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Assign the event index that matches the closest destination.
|
|
IF iClosestDest = 0
|
|
sBuddyData.iEvent = 0
|
|
ELIF iClosestDest = 1
|
|
sBuddyData.iEvent = 1
|
|
ELIF iClosestDest = 2
|
|
sBuddyData.iEvent = 2
|
|
ELIF iClosestDest = 3
|
|
sBuddyData.iEvent = 3
|
|
ELIF iClosestDest = 4
|
|
sBuddyData.iEvent = 4
|
|
ELIF iClosestDest = 5
|
|
sBuddyData.iEvent = 5
|
|
ELIF iClosestDest = 6
|
|
sBuddyData.iEvent = 6
|
|
ELSE
|
|
sBuddyData.iEvent = 7
|
|
ENDIF
|
|
|
|
//Warp the player if we're currently switching and they're a long distance away from where they're meant to be.
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT fDistToDest = VDIST2(vDest[iClosestDest], vPlayerPos)
|
|
FLOAT fDistToAltDest = VDIST2(vAltDest[iClosestDest], vPlayerPos)
|
|
|
|
IF fDistToDest < fDistToAltDest
|
|
IF fDistToDest > 400.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, vDest[iClosestDest])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vDest[iClosestDest]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
IF fDistToAltDest > 400.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, vAltDest[iClosestDest])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vAltDest[iClosestDest]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
sBuddyData.bSwitchedFromThisPed = FALSE
|
|
ENDIF
|
|
|
|
//Failsafe in case something went wrong with determining the next destination.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, <<0.0, 0.0, 0.0>>)
|
|
sBuddyData.vDest = vDest[0]
|
|
ENDIF
|
|
|
|
SWITCH sBuddyData.iEvent
|
|
CASE 0 //Fight at the rock outside the entrance until it's safe to enter.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[0]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[0]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF fDistToDestination > VDIST2(sBuddyData.vDest, <<-664.8, 5242.8, 76.3>>)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-664.8, 5242.8, 76.3>>, <<-570.3, 5267.9, 70.9>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, <<-570.3, 5267.9, 70.9>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[1])
|
|
bKilledFirstWave = TRUE
|
|
|
|
IF (ePointOfEnemySpawn = ENTRY_POINT_BY_CONVEYOR_BELT OR ePointOfEnemySpawn = ENTRY_POINT_BY_SNIPER_HILL)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterAlert) > 0
|
|
bKilledFirstWave = FALSE
|
|
ENDIF
|
|
ELIF ePointOfEnemySpawn = ENTRY_POINT_BY_METAL_BRIDGE
|
|
//If the player took the left fork at the front then the buddy usually takes the right fork: only check for alert peds that are closer to the right fork.
|
|
IF NOT IS_PED_INJURED(sBallasAfterAlert[0].ped)
|
|
bKilledFirstWave = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bKilledFirstWave
|
|
AND (GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasBulldozer3) = 0 OR NOT sBallasBulldozer3[0].bIsCreated)
|
|
sBuddyData.vDest = vDest[1]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Heading up to the timber
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[1]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[1]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[1])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -108.3, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -107.8, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, <<-541.5, 5254.5, 75.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[2])
|
|
sBuddyData.vDest = vDest[2]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[2]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[2]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[2])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -115.0, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 231.8, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, <<-541.5, 5254.5, 75.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedBuddy)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(pedBuddy, <<-543.377502,5254.161621,76.240410>>, <<-575.465820,5268.107910,67.468452>>, 19.500000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasBeforeTimber) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), pedBuddy, <<-524.1, 5246.2, 80.0>>)
|
|
SET_PED_SHOOTS_AT_COORD(pedBuddy, <<-524.1, 5246.2, 80.0>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[3])
|
|
sBuddyData.vDest = vDest[3]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[3]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[3]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[3])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -23.1, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -14.4, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, <<-492.6, 5304.7, 81.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedBuddy)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(pedBuddy, <<-509.119965,5255.369141,82.360039>>, <<-515.347961,5237.144531,77.304115>>, 19.500000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber1) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), pedBuddy, <<-492.6, 5304.7, 81.6>>)
|
|
SET_PED_SHOOTS_AT_COORD(pedBuddy, <<-492.6, 5304.7, 81.6>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[4])
|
|
sBuddyData.vDest = vDest[4]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4 //Kill any remaining enemies before heading up to the timber area.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[4]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[4]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[4])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -30.7, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -14.4, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, <<-492.6, 5304.7, 81.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedBuddy)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(pedBuddy, <<-511.059113,5255.000488,79.360039>>, <<-498.243927,5290.137207,83.110039>>, 14.250000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber2) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), pedBuddy, <<-492.6, 5304.7, 81.6>>)
|
|
SET_PED_SHOOTS_AT_COORD(pedBuddy, <<-492.6, 5304.7, 81.6>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[5])
|
|
AND (sBallasTimber1[0].bIsCreated AND IS_PED_INJURED(sBallasTimber1[0].ped) AND IS_PED_INJURED(sBallasTimber1[1].ped))
|
|
AND IS_PED_INJURED(sBallasSniper[0].ped) //This ped may never get created, so we only care that it's alive.
|
|
sBuddyData.vDest = vDest[5]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5 //Kill enemies in the timber area
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[5]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[5]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[5])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -22.7, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -21.3, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, <<-492.6, 5304.7, 81.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedBuddy)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(pedBuddy, <<-511.059113,5255.000488,79.360039>>, <<-498.243927,5290.137207,83.110039>>, 14.250000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber2) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), pedBuddy, <<-492.6, 5304.7, 81.6>>)
|
|
SET_PED_SHOOTS_AT_COORD(pedBuddy, <<-492.6, 5304.7, 81.6>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[6])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber2) = 0
|
|
AND IS_PED_INJURED(sBallasSniper[0].ped) //This ped may never get created, so we only care that it's alive.
|
|
sBuddyData.vDest = vDest[6]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6 //near to Lamar: take out remaining enemies.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[6]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[6]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[6])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 68.6, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 68.6, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, <<-520.9, 5306.8, 80.8>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[7])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasGuardingLamar) = 0
|
|
sBuddyData.vDest = vDest[7]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 7 //Go to near where Lamar is, fight any nearby enemies, once they'e dead aim at a coord.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 3.0, 2.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[7]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[7]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND fDistToDestination > 4.0)
|
|
VECTOR vAimPos
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[7])
|
|
vAimPos = <<-537.1587, 5268.9067, 79.4526>>
|
|
ELSE
|
|
vAimPos = <<-487.8635, 5318.1475, 81.0427>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
TASK_AIM_GUN_AT_COORD(NULL, vAimPos, -1)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Rear route: ped goes on-foot from the rear.
|
|
PROC UPDATE_BUDDY_PED_REAR_PATH(PED_INDEX &pedBuddy, BUDDY_DATA &sBuddyData)
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
VECTOR vBuddyPos = GET_ENTITY_COORDS(pedBuddy)
|
|
FLOAT fDistToDestination
|
|
BOOL bPlayerStoleCover = FALSE
|
|
BOOL bIsInCombat = (IS_PED_IN_COMBAT(pedBuddy) OR GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vOtherBuddysCurrentDestination
|
|
|
|
IF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
vOtherBuddysCurrentDestination = sFranklin.vDest
|
|
ELSE
|
|
vOtherBuddysCurrentDestination = sTrevor.vDest
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(pedBuddy, WEAPONTYPE_CARBINERIFLE)
|
|
IF GET_AMMO_IN_PED_WEAPON(pedBuddy, WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(pedBuddy, WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vDest[6]
|
|
vDest[0] = <<-487.6498, 5385.0801, 77.0692>> //-176.6, wall to both, low
|
|
vDest[1] = <<-462.0061, 5339.4502, 82.4832>> //no cover
|
|
vDest[2] = <<-476.0758, 5322.0405, 79.6100>> //156.4, wall to left, low
|
|
vDest[3] = <<-483.3072, 5315.9570, 79.6100>> //153.5, wall to both, low
|
|
vDest[4] = <<-497.8078, 5302.2251, 79.6052>> //65.6, wall to both, low
|
|
vDest[5] = <<-504.7159, 5300.7744, 79.5876>> //no cover
|
|
|
|
VECTOR vAltDest[6]
|
|
vAltDest[0] = <<-471.3402, 5380.9253, 78.8354>> //158.9, wall to left, low
|
|
vAltDest[1] = <<-462.9181, 5335.0532, 82.4505>> //150.6, wall to left, low
|
|
vAltDest[2] = <<-483.2917, 5321.4258, 79.6100>> //158.8, wall to both, low
|
|
vAltDest[3] = <<-489.7770, 5318.1147, 79.6100>> //158.4, wall to both, low
|
|
vAltDest[4] = <<-497.9330, 5299.2705, 79.6100>> //65.6, wall to both, low
|
|
vAltDest[5] = <<-504.2799, 5304.1685, 79.4737>> //no cover
|
|
|
|
//If the player switched away from this ped then we need to recalculate where they should be on the route.
|
|
IF sBuddyData.bSwitchedFromThisPed
|
|
INT i = 0
|
|
INT iClosestDest = 0
|
|
FLOAT fClosestDist = -1.0
|
|
FLOAT fDist
|
|
|
|
REPEAT COUNT_OF(vDest) i
|
|
fDist = VDIST2(vBuddyPos, vDest[i])
|
|
|
|
IF fClosestDist = -1.0
|
|
OR fDist < fClosestDist
|
|
iClosestDest = i
|
|
fClosestDist = fDist
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Check if this destination would put the ped into a group of enemies. If so, take the previous destination as the closest.
|
|
IF iClosestDest > 0
|
|
IF ARE_ENEMIES_IN_BETWEEN_COORDS(pedBuddy, vDest[iClosestDest - 1], vDest[iClosestDest])
|
|
iClosestDest = iClosestDest - 1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iClosestDest = 0
|
|
sBuddyData.iEvent = 0
|
|
ELIF iClosestDest = 1
|
|
sBuddyData.iEvent = 1
|
|
ELIF iClosestDest = 2
|
|
sBuddyData.iEvent = 2
|
|
ELIF iClosestDest = 3
|
|
sBuddyData.iEvent = 3
|
|
ELIF iClosestDest = 4
|
|
sBuddyData.iEvent = 4
|
|
ELSE
|
|
sBuddyData.iEvent = 5
|
|
ENDIF
|
|
|
|
//Warp the player if we're currently switching and they're a long distance away from where they're meant to be.
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT fDistToDest = VDIST2(vDest[iClosestDest], vPlayerPos)
|
|
FLOAT fDistToAltDest = VDIST2(vAltDest[iClosestDest], vPlayerPos)
|
|
|
|
IF fDistToDest < fDistToAltDest
|
|
IF fDistToDest > 400.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, vDest[iClosestDest])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vDest[iClosestDest]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
IF fDistToAltDest > 400.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, vAltDest[iClosestDest])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vAltDest[iClosestDest]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
sBuddyData.bSwitchedFromThisPed = FALSE
|
|
ENDIF
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, <<0.0, 0.0, 0.0>>)
|
|
sBuddyData.vDest = vDest[0]
|
|
ENDIF
|
|
|
|
SWITCH sBuddyData.iEvent
|
|
CASE 0 //Fight at the rock outside the entrance until it's safe to enter.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[0]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[0]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest[0], sBuddyData.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vAltDest[0], sBuddyData.vDest)
|
|
sBuddyData.vDest = vDest[0]
|
|
ENDIF
|
|
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[0])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -176.6, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 158.9, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-498.8398, 5292.7832, 81.7003>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[1])
|
|
sBuddyData.vDest = vDest[1]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Climb up the ladder.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 2.0, 2.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[1]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[1]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[1])
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 150.6, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
IF vBuddyPos.z < 83.0
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, <<-463.8806, 5341.8472, 79.7449>>, <<-498.8398, 5292.7832, 81.7003>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-462.0908, 5340.9727, 82.4936>>, PEDMOVE_RUN, -1, 0.5, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-498.8398, 5292.7832, 81.7003>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Warp the buddy up the ladder if the player isn't looking.
|
|
IF vBuddyPos.z < 83.0
|
|
AND VDIST2(vBuddyPos, <<-463.8806, 5341.8472, 79.7449>>) < 4.0
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vBuddyPos) > 100.0
|
|
IF WOULD_ENTITY_BE_OCCLUDED(GET_ENTITY_MODEL(pedBuddy), <<-463.8806, 5341.8472, 79.7449>>)
|
|
AND WOULD_ENTITY_BE_OCCLUDED(GET_ENTITY_MODEL(pedBuddy), <<-462.0908, 5340.9727, 82.4936>>)
|
|
SET_ENTITY_COORDS(pedBuddy, <<-462.0908, 5340.9727, 82.4936>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[2])
|
|
AND vBuddyPos.z > 83.0
|
|
sBuddyData.vDest = vDest[2]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Go down to the timber stacks.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[2]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[2]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[2])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 156.4, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 158.8, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-498.8398, 5292.7832, 81.7003>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[3])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasRearTimber1) = 0
|
|
sBuddyData.vDest = vDest[3]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[3]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[3]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[3])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 153.5, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 158.5, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-498.8398, 5292.7832, 81.7003>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[4])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasRearTimber2) = 0
|
|
sBuddyData.vDest = vDest[4]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[4]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[4]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[4])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 65.6, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 65.6, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-523.1256, 5307.7715, 80.4874>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//From this point onwards the route joins up with the front assault, so switch the buddy ped over to that route.
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[5])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasGuardingLamar) = 0
|
|
sBuddyData.vDest = vDest[5]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5 //Go to Lamar
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 3.0, 2.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[5]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[5]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND fDistToDestination > 4.0)
|
|
VECTOR vAimPos
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[5])
|
|
vAimPos = <<-537.1587, 5268.9067, 79.4526>>
|
|
ELSE
|
|
vAimPos = <<-487.8635, 5318.1475, 81.0427>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
TASK_AIM_GUN_AT_COORD(NULL, vAimPos, -1)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
//Route to the exit after the player has rescued Lamar.
|
|
PROC UPDATE_BUDDY_PED_AFTER_SAVING_LAMAR(PED_INDEX &pedBuddy, BUDDY_DATA &sBuddyData)
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
VECTOR vBuddyPos = GET_ENTITY_COORDS(pedBuddy)
|
|
FLOAT fDistToDestination
|
|
BOOL bPlayerStoleCover = FALSE
|
|
BOOL bIsInCombat = (IS_PED_IN_COMBAT(pedBuddy) OR GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vOtherBuddysCurrentDestination
|
|
|
|
IF pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
vOtherBuddysCurrentDestination = sFranklin.vDest
|
|
ELSE
|
|
vOtherBuddysCurrentDestination = sTrevor.vDest
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(pedBuddy, WEAPONTYPE_CARBINERIFLE)
|
|
IF GET_AMMO_IN_PED_WEAPON(pedBuddy, WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(pedBuddy, WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_RESET_FLAG(pedBuddy, PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
VECTOR vDest[5]
|
|
vDest[0] = <<-505.4764, 5305.9390, 79.2676>> //-111.4, wall to left, high
|
|
vDest[1] = <<-502.2627, 5288.6313, 79.6100>> //159.7959, wall to right, high
|
|
vDest[2] = <<-515.8207, 5274.3574, 79.2366>> //154.3, wall to both, low
|
|
vDest[3] = <<-547.1495, 5262.1836, 72.9514>> //70.7, wall to right, high
|
|
vDest[4] = <<-573.9721, 5258.0229, 69.4643>> //no cover
|
|
|
|
VECTOR vAltDest[5]
|
|
vAltDest[0] = <<-506.0377, 5301.8140, 79.2758>> //-113.9, wall to both, low
|
|
vAltDest[1] = <<-496.8887, 5287.0449, 79.6100>> //158.4, wall to both, low
|
|
vAltDest[2] = <<-502.4147, 5270.4785, 79.6100>> //158.1, wall to both, low
|
|
vAltDest[3] = <<-544.3444, 5269.4688, 73.1745>> //72.4, wall to right, high
|
|
vAltDest[4] = <<-573.9721, 5258.0229, 69.4643>> //Same as regular dest, it's here to avoid complications with the closest node calculation below.
|
|
|
|
//If the player switched away from this ped then we need to recalculate where they should be on the route.
|
|
IF sBuddyData.bSwitchedFromThisPed
|
|
INT i = 0
|
|
INT iClosestDest = 0
|
|
FLOAT fClosestDist = -1.0
|
|
FLOAT fDist
|
|
|
|
REPEAT COUNT_OF(vDest) i
|
|
fDist = VDIST2(vBuddyPos, vDest[i])
|
|
|
|
IF fClosestDist = -1.0
|
|
OR fDist < fClosestDist
|
|
iClosestDest = i
|
|
fClosestDist = fDist
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Check if this destination would put the ped into a group of enemies. If so, take the previous destination as the closest.
|
|
IF iClosestDest > 0
|
|
IF ARE_ENEMIES_IN_BETWEEN_COORDS(pedBuddy, vDest[iClosestDest - 1], vDest[iClosestDest])
|
|
iClosestDest = iClosestDest - 1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iClosestDest = 0
|
|
sBuddyData.iEvent = 0
|
|
ELIF iClosestDest = 1
|
|
sBuddyData.iEvent = 1
|
|
ELIF iClosestDest = 2
|
|
sBuddyData.iEvent = 2
|
|
ELSE
|
|
sBuddyData.iEvent = 3
|
|
ENDIF
|
|
|
|
//Warp the player if we're currently switching and they're a long distance away from where they're meant to be.
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT fDistToDest = VDIST2(vDest[iClosestDest], vPlayerPos)
|
|
FLOAT fDistToAltDest = VDIST2(vAltDest[iClosestDest], vPlayerPos)
|
|
|
|
IF fDistToDest < fDistToAltDest
|
|
IF fDistToDest > 400.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, vDest[iClosestDest])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vDest[iClosestDest]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
IF fDistToAltDest > 400.0
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
SET_ENTITY_COORDS(pedBuddy, vAltDest[iClosestDest])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sBuddyData.vDest = vAltDest[iClosestDest]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
sBuddyData.bSwitchedFromThisPed = FALSE
|
|
ENDIF
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, <<0.0, 0.0, 0.0>>)
|
|
sBuddyData.vDest = vDest[0]
|
|
ENDIF
|
|
|
|
SWITCH sBuddyData.iEvent
|
|
CASE 0 //Fight at the rock outside the entrance until it's safe to enter.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[0]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[0]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest[0], sBuddyData.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vAltDest[0], sBuddyData.vDest)
|
|
sBuddyData.vDest = vDest[0]
|
|
ENDIF
|
|
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[0])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -111.4, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, -113.9, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
//IF fDistToDestination > 4.0
|
|
//AND NOT bPlayerStoleCover
|
|
// TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
// TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-493.3602, 5294.6758, 81.5900>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
// TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
//ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[1])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar) = 0
|
|
sBuddyData.vDest = vDest[1]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 2.0, 2.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[1]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[1]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[1])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 158.4, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 158.4, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sBuddyData.vDest, <<-516.1574, 5247.1709, 80.3439>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedBuddy)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(pedBuddy, <<-511.059113,5255.000488,79.360039>>, <<-496.357666,5296.456543,84.412308>>, 14.250000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar2) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), pedBuddy, <<-516.1574, 5247.1709, 80.3439>>)
|
|
SET_PED_SHOOTS_AT_COORD(pedBuddy, <<-516.1574, 5247.1709, 80.3439>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue for the first run, encouraging the player to go towards Michael.
|
|
IF NOT bHasTextLabelTriggered[LM2_OUT]
|
|
AND eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF VDIST2(vBuddyPos, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 625.0
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_OUT2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_OUT] = TRUE
|
|
iTimePlayedGotoMichaelDialogue = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_OUT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_OUT] = TRUE
|
|
iTimePlayedGotoMichaelDialogue = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[2])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar2) = 0
|
|
sBuddyData.vDest = vDest[2]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[2]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[2]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[2])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 154.3, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 158.1, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-516.1574, 5247.1709, 80.3439>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedBuddy)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(pedBuddy, <<-511.059113,5255.000488,79.360039>>, <<-496.357666,5296.456543,84.412308>>, 14.250000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueTimber) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), pedBuddy, <<-516.1574, 5247.1709, 80.3439>>)
|
|
SET_PED_SHOOTS_AT_COORD(pedBuddy, <<-516.1574, 5247.1709, 80.3439>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player is Michael at this point play a line.
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
AND NOT bHasTextLabelTriggered[LM2_Snipe3A]
|
|
IF fDistToDestination > 25.0
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
AND GET_GAME_TIMER() - iTimeLastPedKilledByPlayer < 10000
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_Snipe3", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_Snipe3A] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(pedBuddy, vDest[3])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueTimber) = 0
|
|
sBuddyData.vDest = vDest[3]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Run down to the conveyor belt area.
|
|
IF NOT sBuddyData.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), pedBuddy, sBuddyData.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sBuddyData.bIsUsingSecondaryCover
|
|
sBuddyData.vDest = vDest[3]
|
|
sBuddyData.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sBuddyData.vDest = vAltDest[3]
|
|
sBuddyData.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
//Setup the cover point if needed.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sBuddyData.vDest, vDest[3])
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 70.7, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ELSE
|
|
SET_PED_COVER_POINT_AND_SPHERE(pedBuddy, sBuddyData.cover, sBuddyData.vDest, 72.4, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF VDIST2(vBuddyPos, sBuddyData.vDest) > VDIST2(<<-519.4547, 5250.6426, 78.7824>>, sBuddyData.vDest)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-519.4547, 5250.6426, 78.7824>>, PEDMOVE_RUN, 60000, 0.5, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-574.0313, 5258.5898, 71.0182>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedBuddy)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(pedBuddy, <<-527.860657,5247.066406,79.939369>>, <<-556.417664,5258.927734,69.149582>>, 14.500000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueExit) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), pedBuddy, <<-574.0313, 5258.5898, 71.0182>>)
|
|
SET_PED_SHOOTS_AT_COORD(pedBuddy, <<-574.0313, 5258.5898, 71.0182>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player is Michael at this point play a line.
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
AND NOT bHasTextLabelTriggered[LM2_Snipe3B]
|
|
IF fDistToDestination > 25.0
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
AND NOT bMichaelIsGettingFlanked
|
|
AND GET_GAME_TIMER() - iTimeLastPedKilledByPlayer < 10000
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_Snipe3", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_Snipe3B] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToDestination < 25.0
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueExit) = 0
|
|
sBuddyData.vDest = vDest[4]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
sBuddyData.iTimer = 0
|
|
sBuddyData.iEvent++
|
|
sBuddyData.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4 //Final enemies are dead, run to the exit.
|
|
fDistToDestination = VDIST2(vBuddyPos, sBuddyData.vDest)
|
|
|
|
IF sBuddyData.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(pedBuddy, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedBuddy, sBuddyData.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sBuddyData.vDest, <<-587.1, 5281.6, 71.0>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedBuddy, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sBuddyData.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Last resort behaviour: put the buddy with the player and tell them to follow.
|
|
PROC UPDATE_BUDDY_PED_IN_PLAYERS_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
PROC RESET_BUDDY_ROUTES_FOR_SHOOTOUT_START()
|
|
IF GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) = GET_ENTITY_MODEL(PLAYER_PED_ID())
|
|
eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
ELIF GET_PLAYER_PED_MODEL(CHAR_TREVOR) = GET_ENTITY_MODEL(PLAYER_PED_ID())
|
|
eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
ELSE
|
|
eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
ENDIF
|
|
|
|
eMichaelRoute = GET_CLOSEST_ROUTE_TO_PED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
eFranklinRoute = GET_CLOSEST_ROUTE_TO_PED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
eTrevorRoute = GET_CLOSEST_ROUTE_TO_PED(GET_PED_INDEX(CHAR_TREVOR))
|
|
ePrevFranklinRoute = eFranklinRoute
|
|
ePrevTrevorRoute = eTrevorRoute
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
iBuddyUpdateDialogueTimer = GET_GAME_TIMER() + 25000
|
|
|
|
IF eCurrentPlayer != SELECTOR_PED_FRANKLIN
|
|
sFranklin.bSwitchedFromThisPed = TRUE //This will ensure their initial destination is calculated.
|
|
ENDIF
|
|
|
|
IF eCurrentPlayer != SELECTOR_PED_TREVOR
|
|
sTrevor.bSwitchedFromThisPed = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Kills off buddies if the player launches explosive weapons at them (e.g. grenades). This has to be handled in script due to the
|
|
/// high health of the buddies.
|
|
PROC HANDLE_BUDDY_DEATHS_FROM_EXPLOSIONS(PED_INDEX &pedBuddy, INT &iBuddyHealthTracker)
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
BOOL bSafeToGrabHealth = TRUE
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedBuddy, PLAYER_PED_ID(), TRUE)
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedBuddy)
|
|
|
|
IF IS_PED_RAGDOLL(pedBuddy)
|
|
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(pedBuddy), 5.0)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(pedBuddy, RBF_NONE)
|
|
SET_ENTITY_HEALTH(pedBuddy, 0)
|
|
bSafeToGrabHealth = FALSE
|
|
ELIF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
//If the buddy was smashed into by the player's car then kill them.
|
|
IF iBuddyHealthTracker - GET_ENTITY_HEALTH(pedBuddy) > 100
|
|
SET_RAGDOLL_BLOCKING_FLAGS(pedBuddy, RBF_NONE)
|
|
SET_ENTITY_HEALTH(pedBuddy, 0)
|
|
bSafeToGrabHealth = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bSafeToGrabHealth
|
|
iBuddyHealthTracker = GET_ENTITY_HEALTH(pedBuddy)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates buddies during the shootout: keeps them progressing on the closest route.
|
|
/// PARAMS:
|
|
/// bJustPerformedASwitch - If the player just switched then the routes for each buddy need to be refreshed in case the player moved them elsewhere before switching.
|
|
PROC UPDATE_PLAYER_BUDDIES_DURING_SHOOTOUT()
|
|
PED_INDEX pedsNearby[8]
|
|
INT i = 0
|
|
|
|
//Michael's route: he should always be sniping but just in case check the other routes.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
IF eMichaelRoute = BUDDY_ROUTE_SNIPING
|
|
|
|
ENDIF
|
|
|
|
//Only update Michael if the player isn't switching to him, as during the switch to Michael he is given custom aim tasks.
|
|
IF NOT IS_SELECTOR_CAM_ACTIVE()
|
|
OR (IS_SELECTOR_CAM_ACTIVE() AND sSelectorPeds.eNewSelectorPed != SELECTOR_PED_MICHAEL)
|
|
UPDATE_BUDDY_PED_SNIPE_PATH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael)
|
|
ENDIF
|
|
|
|
//Kill Michael if the player does anything to them.
|
|
IF IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF IS_ENTITY_ON_FIRE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), 5.0)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
IF eMissionStage <= STAGE_ATTACK_SAWMILL
|
|
IF eFranklinRoute = BUDDY_ROUTE_BULLDOZER
|
|
UPDATE_BUDDY_PED_BULLDOZER_PATH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin)
|
|
ELIF eFranklinRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
UPDATE_BUDDY_PED_BULLDOZER_ON_FOOT_PATH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin)
|
|
ELIF eFranklinRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
UPDATE_BUDDY_PED_FRONT_PATH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin)
|
|
ELIF eFranklinRoute = BUDDY_ROUTE_REAR
|
|
UPDATE_BUDDY_PED_REAR_PATH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin)
|
|
ENDIF
|
|
|
|
//If Franklin becomes stuck on a route then flash them red for help. Becoming stuck depends on the following:
|
|
// - The ped's event index for this route hasn't increased for a long time.
|
|
// - There are enemies near to the ped.
|
|
VECTOR vFranklinPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
|
|
//If the ped is currently performing a custom task then reset the danger timer.
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
|
|
AND NOT IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the ped is moving to their destination then reset the danger timer.
|
|
IF VDIST2(vFranklinPos, sFranklin.vDest) > 9.0
|
|
AND GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) > 0.3
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the player kills an enemy near to the buddy then reset the danger timer.
|
|
IF GET_GAME_TIMER() - iTimeLastPedKilledByPlayer < 500
|
|
AND VDIST2(vFranklinPos, vPosOfLastPlayerKill) < 2500.0
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the enemies haven't been triggered yet then reset the danger timer.
|
|
IF NOT bEnemiesHaveBeenAlerted
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the buddy changes route then update their previous max event index as it won't be valid for the new route.
|
|
IF ePrevFranklinRoute != eFranklinRoute
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
sFranklin.iPrevMaxEvent = 0
|
|
ePrevFranklinRoute = eFranklinRoute
|
|
ENDIF
|
|
|
|
//If the buddy progresses a stage in their current route then reset the danger timer.
|
|
IF sFranklin.iEvent > sFranklin.iPrevMaxEvent
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
sFranklin.iPrevMaxEvent = sFranklin.iEvent
|
|
ENDIF
|
|
|
|
//If Franklin and Trevor are both on the same route then they're not considered in danger.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF VDIST2(vFranklinPos, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) < 400.0
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - iFranklinInDangerTimer > 20000
|
|
INT iNumEnemiesNearFranklin = 0
|
|
|
|
GET_PED_NEARBY_PEDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], pedsNearby)
|
|
|
|
REPEAT COUNT_OF(pedsNearby) i
|
|
IF NOT IS_PED_INJURED(pedsNearby[i])
|
|
AND GET_PED_RELATIONSHIP_GROUP_HASH(pedsNearby[i]) = relGroupBallas
|
|
IF VDIST2(vFranklinPos, GET_ENTITY_COORDS(pedsNearby[i])) < 2500.0
|
|
iNumEnemiesNearFranklin++
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iNumEnemiesNearFranklin > 1
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL)
|
|
|
|
IF GET_GAME_TIMER() - iFranklinDangerDialogueTimer > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_FRANHURT", CONV_PRIORITY_MEDIUM)
|
|
iFranklinDangerDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 10000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iFranklinInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_BUDDY_PED_AFTER_SAVING_LAMAR(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin)
|
|
ENDIF
|
|
|
|
HANDLE_BUDDY_DEATHS_FROM_EXPLOSIONS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.iHealth)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
IF eMissionStage <= STAGE_ATTACK_SAWMILL
|
|
IF eTrevorRoute = BUDDY_ROUTE_BULLDOZER
|
|
UPDATE_BUDDY_PED_BULLDOZER_PATH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor)
|
|
ELIF eTrevorRoute = BUDDY_ROUTE_BULLDOZER_ON_FOOT
|
|
UPDATE_BUDDY_PED_BULLDOZER_ON_FOOT_PATH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor)
|
|
ELIF eTrevorRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
UPDATE_BUDDY_PED_FRONT_PATH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor)
|
|
ELIF eTrevorRoute = BUDDY_ROUTE_REAR
|
|
UPDATE_BUDDY_PED_REAR_PATH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor)
|
|
ENDIF
|
|
|
|
//If the ped is currently performing a custom task then reset the danger timer.
|
|
VECTOR vTrevorPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
|
|
AND NOT IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the player kills an enemy near to the buddy then reset the danger timer.
|
|
IF GET_GAME_TIMER() - iTimeLastPedKilledByPlayer < 500
|
|
AND VDIST2(vTrevorPos, vPosOfLastPlayerKill) < 2500.0
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the ped is moving to their destination then reset the danger timer.
|
|
IF VDIST2(vTrevorPos, sTrevor.vDest) > 9.0
|
|
AND GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) > 0.3
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the enemies haven't been alerted yet then reset the danger time.
|
|
IF NOT bEnemiesHaveBeenAlerted
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the buddy changes route then update their previous max event index as it won't be valid for the new route.
|
|
IF ePrevTrevorRoute != eTrevorRoute
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
sTrevor.iPrevMaxEvent = 0
|
|
ePrevTrevorRoute = eTrevorRoute
|
|
ENDIF
|
|
|
|
//If the buddy progresses a stage in their current route then reset the danger timer.
|
|
IF sTrevor.iEvent > sTrevor.iPrevMaxEvent
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
sTrevor.iPrevMaxEvent = sTrevor.iEvent
|
|
ENDIF
|
|
|
|
//If Franklin and Trevor are both on the same route then they're not considered in danger.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF VDIST2(vTrevorPos, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) < 400.0
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - iTrevorInDangerTimer > 20000
|
|
INT iNumEnemiesNearTrevor = 0
|
|
|
|
GET_PED_NEARBY_PEDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], pedsNearby)
|
|
|
|
REPEAT COUNT_OF(pedsNearby) i
|
|
IF NOT IS_PED_INJURED(pedsNearby[i])
|
|
AND GET_PED_RELATIONSHIP_GROUP_HASH(pedsNearby[i]) = relGroupBallas
|
|
IF VDIST2(vTrevorPos, GET_ENTITY_COORDS(pedsNearby[i])) < 2500.0
|
|
iNumEnemiesNearTrevor++
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iNumEnemiesNearTrevor > 1
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_TREVOR, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL)
|
|
|
|
IF GET_GAME_TIMER() - iTrevorDangerDialogueTimer > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_TREVHURT", CONV_PRIORITY_MEDIUM)
|
|
iTrevorDangerDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 10000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTrevorInDangerTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_BUDDY_PED_AFTER_SAVING_LAMAR(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor)
|
|
ENDIF
|
|
|
|
HANDLE_BUDDY_DEATHS_FROM_EXPLOSIONS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.iHealth)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_SHOOTOUT_SWITCH()
|
|
VECTOR vPlayerPos
|
|
INT iClosestEnemy = -1
|
|
INT i = 0
|
|
BOOL bAllowSwitch = TRUE
|
|
PED_INDEX peds[16]
|
|
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF NOT bMichaelSetToMoveFreely
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iSwitchStage
|
|
CASE 0
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
//Don't allow switching if the player is flying.
|
|
IF IS_PED_IN_ANY_PLANE(PLAYER_PED_ID())
|
|
OR IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
|
|
bAllowSwitch = FALSE
|
|
ENDIF
|
|
|
|
//Block switching if it's not safe to switch (e.g. the ped is on fire).
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT sFranklin.bSwitchBlocked
|
|
IF IS_ENTITY_ON_FIRE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
sFranklin.bSwitchBlocked = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_ON_FIRE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
sFranklin.bSwitchBlocked = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Block switching if it's not safe to switch (e.g. the ped is on fire).
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT sTrevor.bSwitchBlocked
|
|
IF IS_ENTITY_ON_FIRE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
sTrevor.bSwitchBlocked = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_ON_FIRE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
sTrevor.bSwitchBlocked = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Block switching if it's not safe to switch (e.g. the ped is on fire). Don't allow switching to Michael if he isn't in position yet.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT sMichael.bSwitchBlocked
|
|
IF IS_ENTITY_ON_FIRE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), vMichaelSnipePos) > 16.0
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
|
|
sMichael.bSwitchBlocked = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_ON_FIRE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), vMichaelSnipePos) < 16.0
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
sMichael.bSwitchBlocked = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bAllowSwitch
|
|
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
|
|
CLEAR_HELP()
|
|
DESTROY_ALL_CAMS()
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_SWITCHES)
|
|
|
|
sSelectorCam.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
|
|
iHealthBeforeSwitch = GET_ENTITY_HEALTH(PLAYER_PED_ID())
|
|
|
|
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_TREVOR")
|
|
START_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_TREVOR")
|
|
ENDIF
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_TREVOR")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_TREVOR")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
GET_PED_NEARBY_PEDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], peds)
|
|
|
|
REPEAT COUNT_OF(peds) i
|
|
IF iClosestEnemy = -1
|
|
IF NOT IS_PED_INJURED(peds[i])
|
|
IF GET_PED_RELATIONSHIP_GROUP_HASH(peds[i]) = relGroupBallas
|
|
iClosestEnemy = i
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Set Michael to aim at the closest enemy ped (or the player if there are no enemies).
|
|
IF bMichaelHUDFlashingForSniper
|
|
AND NOT IS_PED_INJURED(sBallasSniper[0].ped)
|
|
vMichaelSwitchAimPos = GET_ENTITY_COORDS(sBallasSniper[0].ped, FALSE) + <<-1.0, 0.0, 3.0>>
|
|
TASK_AIM_GUN_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vMichaelSwitchAimPos, -1, TRUE)
|
|
ELIF bMichaelHUDFlashingForRocket
|
|
AND NOT IS_PED_INJURED(sBallasRocket[0].ped)
|
|
vMichaelSwitchAimPos = GET_ENTITY_COORDS(sBallasRocket[0].ped, FALSE) + <<1.0, 0.0, -3.0>>
|
|
TASK_AIM_GUN_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vMichaelSwitchAimPos, -1, TRUE)
|
|
ELSE
|
|
IF iClosestEnemy = -1
|
|
vMichaelSwitchAimPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
ELSE
|
|
vMichaelSwitchAimPos = GET_ENTITY_COORDS(peds[iClosestEnemy], FALSE)
|
|
ENDIF
|
|
|
|
TASK_AIM_GUN_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vMichaelSwitchAimPos, -1, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Franklin2.sc - Michael set to aim at ", vMichaelSwitchAimPos)
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_MICHAEL")
|
|
START_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_MICHAEL")
|
|
ENDIF
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_MICHAEL")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_MICHAEL")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bPlayerIsInShootoutAreaForSwitch = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-489.725586,5408.617676,49.595184>>, <<-570.134766,5210.887207,122.609947>>, 188.750000)
|
|
|
|
IF bPlayerIsInShootoutAreaForSwitch
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed])
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
VECTOR vRot
|
|
vRot = <<0.0, 0.0, GET_ENTITY_HEADING(sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed])>>
|
|
NEW_LOAD_SCENE_START(GET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]), CONVERT_ROTATION_TO_DIRECTION_VECTOR(vRot), 50.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iSwitchStage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
//Guarantee that the current player's cover info is removed from when they were AI controlled.
|
|
IF GET_GAME_TIMER() - iTimeOfLastSwitch > 1000
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF sFranklin.cover != NULL
|
|
IF VDIST2(sFranklin.vDest, vPlayerPos) > 9.0
|
|
REMOVE_COVER_POINT(sFranklin.cover)
|
|
sFranklin.vDest = <<0.0, 0.0, 0.0>>
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF sMichael.cover != NULL
|
|
IF VDIST2(sMichael.vDest, vPlayerPos) > 9.0
|
|
REMOVE_COVER_POINT(sMichael.cover)
|
|
sMichael.vDest = <<0.0, 0.0, 0.0>>
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sTrevor.cover != NULL
|
|
IF VDIST2(sTrevor.vDest, vPlayerPos) > 9.0
|
|
REMOVE_COVER_POINT(sTrevor.cover)
|
|
sTrevor.vDest = <<0.0, 0.0, 0.0>>
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
|
|
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
AND bMichaelSetToMoveFreely
|
|
|
|
ENDIF
|
|
|
|
IF (bPlayerIsInShootoutAreaForSwitch AND NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_SHORT_RANGE(sSelectorCam))
|
|
OR (NOT bPlayerIsInShootoutAreaForSwitch AND NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sSelectorCam))
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF bMichaelSetToMoveFreely
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
|
|
ELSE
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vMichaelSwitchAimPos, <<0.0, 0.0, 0.0>>)
|
|
FLOAT fPitch
|
|
fPitch = GET_GAMEPLAY_CAM_RELATIVE_PITCH_FOR_COORD(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelSwitchAimPos)
|
|
|
|
SET_FIRST_PERSON_AIM_CAM_RELATIVE_PITCH_LIMITS_THIS_UPDATE(fPitch - 0.5, fPitch + 0.5)
|
|
ENDIF
|
|
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE)
|
|
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDIF
|
|
|
|
iTimeOfLastSwitch = GET_GAME_TIMER()
|
|
iSwitchStage = 0
|
|
ELSE
|
|
IF sSelectorCam.bOKToSwitchPed
|
|
IF NOT sSelectorCam.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
|
|
IF iHealthBeforeSwitch < 110
|
|
iHealthBeforeSwitch = 110
|
|
ENDIF
|
|
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_DIES_WHEN_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
|
|
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 5, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_DisableHurt, TRUE)
|
|
SET_ENTITY_PROOFS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], iHealthBeforeSwitch)
|
|
SET_PED_MAX_HEALTH_WITH_SCALE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 1800)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE, -1)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed],
|
|
RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_MELEE | RBF_IMPACT_OBJECT | RBF_PED_RAGDOLL_BUMP | RBF_PLAYER_IMPACT)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
|
|
|
|
IF eMissionStage = STAGE_ATTACK_SAWMILL
|
|
OR eMissionStage = STAGE_GET_LAMAR_OUT
|
|
//Reset the defensive area for each ped, this ensures they update their destination to match the latest state of the buddies.
|
|
IF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_MICHAEL
|
|
eMichaelRoute = GET_CLOSEST_ROUTE_TO_PED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
|
|
sMichael.bSwitchedFromThisPed = TRUE
|
|
ELIF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_FRANKLIN
|
|
eFranklinRoute = GET_CLOSEST_ROUTE_TO_PED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
|
|
sFranklin.bSwitchedFromThisPed = TRUE
|
|
|
|
//If Franklin would be considered in danger after switching then reset the danger timer.
|
|
IF GET_GAME_TIMER() - iFranklinInDangerTimer > 17000
|
|
iFranklinInDangerTimer = GET_GAME_TIMER() - 17000
|
|
ENDIF
|
|
ELIF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_TREVOR
|
|
eTrevorRoute = GET_CLOSEST_ROUTE_TO_PED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
|
|
sTrevor.bSwitchedFromThisPed = TRUE
|
|
|
|
//If Trevor would be considered in danger after switching then reset the danger timer.
|
|
IF GET_GAME_TIMER() - iTrevorInDangerTimer > 17000
|
|
iTrevorInDangerTimer = GET_GAME_TIMER() - 17000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//Don't allow AI peds to use certain weapons.
|
|
IF sSelectorPeds.ePreviousSelectorPed != SELECTOR_PED_MICHAEL
|
|
//GET_WEAPONTYPE_GROUP
|
|
|
|
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE)
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED_ID(), RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_MELEE | RBF_IMPACT_OBJECT | RBF_PED_RAGDOLL_BUMP | RBF_PLAYER_IMPACT)
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
REFRESH_BUDDY_PED_AUDIO_MIX_GROUP()
|
|
|
|
eCurrentPlayer = sSelectorPeds.eCurrentSelectorPed
|
|
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
sMichael.vDest = <<0.0, 0.0, 0.0>>
|
|
ELSE
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
|
|
|
|
//If the new player ped is near their destination then try to get them into cover there.
|
|
VECTOR vAICoverPos
|
|
FLOAT fBuddyDistFromCover, fPlayerDistFromCover
|
|
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
vAICoverPos = sFranklin.vDest
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
vAICoverPos = sTrevor.vDest
|
|
ENDIF
|
|
|
|
IF DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(vAICoverPos)
|
|
fBuddyDistFromCover = VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed]), vAICoverPos)
|
|
fPlayerDistFromCover = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vAICoverPos)
|
|
|
|
IF fPlayerDistFromCover < fBuddyDistFromCover
|
|
AND fBuddyDistFromCover > 100.0
|
|
AND fPlayerDistFromCover < 4.0
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), vAICoverPos, 1500, FALSE, 0.0, FALSE, FALSE, NULL, TRUE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
sFranklin.vDest = <<0.0, 0.0, 0.0>>
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
sTrevor.vDest = <<0.0, 0.0, 0.0>>
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sSelectorCam.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC UPDATE_BUDDY_BLIPS_DURING_SHOOTOUT()
|
|
//Update buddy blips: remove the blip for whoever is the player, add blips for other buddies.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT DOES_BLIP_EXIST(sFranklin.blip)
|
|
sFranklin.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(sFranklin.blip)
|
|
REMOVE_BLIP(sFranklin.blip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT DOES_BLIP_EXIST(sMichael.blip)
|
|
sMichael.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(sMichael.blip)
|
|
REMOVE_BLIP(sMichael.blip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT DOES_BLIP_EXIST(sTrevor.blip)
|
|
sTrevor.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(sTrevor.blip)
|
|
REMOVE_BLIP(sTrevor.blip)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_LAMAR_DURING_SHOOTOUT()
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
PED_INDEX pedsNearby[5]
|
|
INT i = 0
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sLamar.ped)
|
|
IF VDIST2(vPlayerPos, vLamarShootoutStartPos) < 40000.0
|
|
AND sBallasAfterAlert[0].bIsCreated
|
|
SETUP_REQ_LAMAR(vLamarShootoutStartPos, fLamarShootoutStartHeading)
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(sLamar.ped)
|
|
VECTOR vBuddyPos = GET_ENTITY_COORDS(sLamar.ped)
|
|
BOOL bPlayerStoleCover
|
|
BOOL bIsInCombat = (IS_PED_IN_COMBAT(sLamar.ped) OR GET_SCRIPT_TASK_STATUS(sLamar.ped, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
FLOAT fDistToDestination
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vOtherBuddysCurrentDestination
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
vOtherBuddysCurrentDestination = sFranklin.vDest
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
vOtherBuddysCurrentDestination = sTrevor.vDest
|
|
ENDIF
|
|
|
|
VECTOR vDest[6]
|
|
vDest[0] = <<-523.0930, 5306.6973, 79.2448>>
|
|
vDest[1] = <<-498.3445, 5300.7861, 79.6049>>
|
|
vDest[2] = <<-498.9495, 5281.7505, 79.6100>>
|
|
vDest[3] = <<-516.5259, 5258.8921, 79.5591>>
|
|
vDest[4] = <<-532.4301, 5261.0220, 73.3084>>
|
|
vDest[5] = <<-577.0162, 5256.7354, 69.4628>>
|
|
|
|
VECTOR vAltDest[6]
|
|
vAltDest[0] = <<-519.9658, 5307.7275, 79.2448>>
|
|
vAltDest[1] = <<-498.4532, 5303.5000, 79.5833>>
|
|
vAltDest[2] = <<-504.1630, 5282.2646, 79.6100>>
|
|
vAltDest[3] = <<-517.9027, 5256.0908, 79.5374>>
|
|
vAltDest[4] = <<-541.1633, 5260.2632, 73.2855>>
|
|
vAltDest[5] = <<-577.0162, 5256.7354, 69.4628>>
|
|
|
|
|
|
REQUEST_ANIM_DICT(strLamarInjuredAnims)
|
|
|
|
SET_PED_RESET_FLAG(sLamar.ped, PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
SWITCH sLamar.iEvent
|
|
CASE 0 //Set up Lamar sitting and waiting.
|
|
IF HAS_ANIM_DICT_LOADED(strLamarInjuredAnims)
|
|
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sLamar.ped, relGroupNeutral)
|
|
SET_PED_CAN_BE_TARGETTED(sLamar.ped, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sLamar.ped, TRUE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sLamar.ped, FALSE)
|
|
SET_CURRENT_PED_WEAPON(sLamar.ped, WEAPONTYPE_UNARMED, TRUE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sLamar.ped, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
|
|
TASK_PLAY_ANIM(sLamar.ped, strLamarInjuredAnims, "lamar_base_idle", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sLamar.ped, TRUE)
|
|
|
|
sLamar.iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Progress once the player reaches him.
|
|
SET_PED_CAPSULE(sLamar.ped, 0.5)
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-512.474158,5304.624805,78.767578>>, <<-525.518250,5308.746582,83.017578>>, 3.500000)
|
|
AND IS_PED_INJURED(sBallasGuardingLamar[0].ped)
|
|
AND sBallasGuardingLamar[0].bIsCreated
|
|
TASK_PLAY_ANIM(sLamar.ped, strLamarInjuredAnims, "lamar_base_idle_to_standing_idle", SLOW_BLEND_IN, WALK_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sLamar.ped, TRUE)
|
|
|
|
//Record footage of the player reaching Lamar.
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0)
|
|
|
|
REPOSITION_VEHICLES_FOR_LAMAR_ESCAPE()
|
|
|
|
sLamar.iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Once Lamar has gotten up progress.
|
|
IF NOT bHasTextLabelTriggered[lm2_lgof]
|
|
AND NOT bHasTextLabelTriggered[lm2_lgot]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "lm2_lgof", CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[lm2_lgof] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "lm2_lgot", CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[lm2_lgot] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bLamarHasBeenRescued = TRUE
|
|
ENDIF
|
|
|
|
SET_PED_CAPSULE(sLamar.ped, 0.5)
|
|
|
|
IF (IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarInjuredAnims, "lamar_base_idle_to_standing_idle")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(sLamar.ped, strLamarInjuredAnims, "lamar_base_idle_to_standing_idle") > 0.65)
|
|
OR NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarInjuredAnims, "lamar_base_idle_to_standing_idle")
|
|
CLEAR_PED_TASKS(sLamar.ped)
|
|
|
|
sLamar.iEvent = 50
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50 //Set up Lamar for combat.
|
|
IF NOT HAS_PED_GOT_WEAPON(sLamar.ped, WEAPONTYPE_PISTOL)
|
|
GIVE_WEAPON_TO_PED(sLamar.ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sLamar.ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_PARAMS(sLamar.ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sLamar.ped, CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sLamar.ped, CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sLamar.ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sLamar.ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_ENTITY_PROOFS(sLamar.ped, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
SET_PED_CAN_BE_TARGETTED(sLamar.ped, FALSE)
|
|
SET_PED_MAX_HEALTH(sLamar.ped, 1800)
|
|
SET_ENTITY_HEALTH(sLamar.ped, 1800)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sLamar.ped, FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sLamar.ped, FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sLamar.ped, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
SET_PED_USING_ACTION_MODE(sLamar.ped, TRUE, -1)
|
|
SET_PED_PATH_AVOID_FIRE(sLamar.ped, TRUE)
|
|
|
|
|
|
sLamar.vDest = vDest[0]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
sLamar.iTimer = 0
|
|
sLamar.iEvent++
|
|
sLamar.bRefreshTasks = TRUE
|
|
BREAK
|
|
|
|
CASE 51 //Lamar goes to the dead body of the ped near him and picks up the gun.
|
|
VECTOR vDeadBallaPos
|
|
|
|
GET_PED_NEARBY_PEDS(sLamar.ped, pedsNearby)
|
|
|
|
REPEAT COUNT_OF(pedsNearby) i
|
|
IF DOES_ENTITY_EXIST(pedsNearby[i])
|
|
IF GET_ENTITY_MODEL(pedsNearby[i]) = modelBalla
|
|
IF VDIST2(vBuddyPos, GET_ENTITY_COORDS(pedsNearby[i], FALSE)) < 16.0
|
|
vDeadBallaPos = GET_ENTITY_COORDS(pedsNearby[i], FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
WEAPON_TYPE eCurrentWeapon
|
|
|
|
IF HAS_PED_GOT_WEAPON(sLamar.ped, WEAPONTYPE_PISTOL)
|
|
GET_CURRENT_PED_WEAPON(sLamar.ped, eCurrentWeapon)
|
|
ENDIF
|
|
|
|
IF NOT ARE_VECTORS_EQUAL(vDeadBallaPos, <<0.0, 0.0, 0.0>>)
|
|
REQUEST_ANIM_DICT(strPickupAnims)
|
|
|
|
IF sLamar.iTimer = 0
|
|
IF HAS_ANIM_DICT_LOADED(strPickupAnims)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vDeadBallaPos, PEDMOVE_RUN, -1, DEFAULT, ENAV_NO_STOPPING)
|
|
TASK_PLAY_ANIM(NULL, strPickupAnims, "pickup_low", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
TASK_LOOK_AT_COORD(sLamar.ped, vDeadBallaPos, -1, SLF_WHILE_NOT_IN_FOV)
|
|
|
|
sLamar.iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sLamar.iTimer > 3000
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strPickupAnims, "pickup_low")
|
|
IF eCurrentWeapon != WEAPONTYPE_PISTOL
|
|
SET_CURRENT_PED_WEAPON(sLamar.ped, WEAPONTYPE_PISTOL, TRUE)
|
|
ENDIF
|
|
|
|
TASK_CLEAR_LOOK_AT(sLamar.ped)
|
|
REMOVE_ANIM_DICT(strPickupAnims)
|
|
|
|
sLamar.iTimer = 0
|
|
sLamar.iEvent++
|
|
sLamar.bRefreshTasks = TRUE
|
|
ELSE
|
|
IF eCurrentWeapon != WEAPONTYPE_PISTOL
|
|
IF IS_ENTITY_PLAYING_ANIM(sLamar.ped, strPickupAnims, "pickup_low")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(sLamar.ped, strPickupAnims, "pickup_low") > 0.381
|
|
SET_CURRENT_PED_WEAPON(sLamar.ped, WEAPONTYPE_PISTOL, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Couldn't find the ped so just continue.
|
|
SET_CURRENT_PED_WEAPON(sLamar.ped, WEAPONTYPE_PISTOL, TRUE)
|
|
|
|
REMOVE_ANIM_DICT(strPickupAnims)
|
|
|
|
sLamar.iTimer = 0
|
|
sLamar.iEvent++
|
|
sLamar.bRefreshTasks = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 52 //Leaving the start point and entering combat.
|
|
//Warp Lamar if he falls too far behind the player.
|
|
IF NOT sLamar.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), sLamar.ped, sLamar.vDest, vOtherBuddysCurrentDestination, 3.0, 2.0)
|
|
IF sLamar.bIsUsingSecondaryCover
|
|
sLamar.vDest = vDest[0]
|
|
sLamar.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sLamar.vDest = vAltDest[0]
|
|
sLamar.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sLamar.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sLamar.vDest)
|
|
|
|
IF sLamar.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sLamar.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sLamar.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Progress once the player has gone ahead to the next enemy wave.
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(sLamar.ped, vDest[1])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar) = 0
|
|
AND (GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar2) < COUNT_OF(sBallasAfterLamar2)
|
|
OR (NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN)) AND IS_ENTITY_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<-499.087769,5287.962402,84.859978>>,<<56.750000,9.000000,9.500000>>)))
|
|
sLamar.vDest = vDest[1]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
sLamar.iTimer = 0
|
|
sLamar.iEvent++
|
|
sLamar.bRefreshTasks = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 53 //Begins making his way across the timber area.
|
|
//Warp Lamar if he falls too far behind the player.
|
|
IF NOT sLamar.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), sLamar.ped, sLamar.vDest, vOtherBuddysCurrentDestination, 3.0, 2.0)
|
|
IF sLamar.bIsUsingSecondaryCover
|
|
sLamar.vDest = vDest[1]
|
|
sLamar.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sLamar.vDest = vAltDest[1]
|
|
sLamar.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sLamar.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sLamar.vDest)
|
|
|
|
IF sLamar.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sLamar.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sLamar.vDest, <<-516.1574, 5247.1709, 80.3439>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sLamar.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(sLamar.ped)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sLamar.ped, <<-511.059113,5255.000488,79.360039>>, <<-496.357666,5296.456543,84.412308>>, 14.250000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar2) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), sLamar.ped, <<-516.1574, 5247.1709, 80.3439>>)
|
|
SET_PED_SHOOTS_AT_COORD(sLamar.ped, <<-516.1574, 5247.1709, 80.3439>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(sLamar.ped, vDest[2])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar2) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueTimber) < COUNT_OF(sBallasPostRescueTimber)
|
|
sLamar.vDest = vDest[2]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
sLamar.iTimer = 0
|
|
sLamar.iEvent++
|
|
sLamar.bRefreshTasks = TRUE
|
|
ELSE
|
|
//Play some "more guys" dialogue.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF NOT bHasTextLabelTriggered[LM2_MORE1]
|
|
IF sBallasAfterLamar2[0].iEvent > 0
|
|
IF VDIST2(vPlayerPos, vBuddyPos) < 900.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MORE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MORE1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[LM2_LSIDE]
|
|
IF NOT IS_PED_INJURED(sBallasAfterLamar2[2].ped)
|
|
IF VDIST2(vPlayerPos, vBuddyPos) < 900.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_LSIDE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_LSIDE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 54 //Begins making his way across the timber area.
|
|
//Warp Lamar if he falls too far behind the player.
|
|
IF NOT sLamar.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), sLamar.ped, sLamar.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sLamar.bIsUsingSecondaryCover
|
|
sLamar.vDest = vDest[2]
|
|
sLamar.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sLamar.vDest = vAltDest[2]
|
|
sLamar.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sLamar.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sLamar.vDest)
|
|
|
|
IF sLamar.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sLamar.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sLamar.vDest, <<-516.1574, 5247.1709, 80.3439>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sLamar.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(sLamar.ped)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sLamar.ped, <<-511.059113,5255.000488,79.360039>>, <<-496.357666,5296.456543,84.412308>>, 14.250000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueTimber) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), sLamar.ped, <<-516.1574, 5247.1709, 80.3439>>)
|
|
SET_PED_SHOOTS_AT_COORD(sLamar.ped, <<-516.1574, 5247.1709, 80.3439>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(sLamar.ped, vDest[3])
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueTimber) = 0
|
|
sLamar.vDest = vDest[3]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
sLamar.iTimer = 0
|
|
sLamar.iEvent++
|
|
sLamar.bRefreshTasks = TRUE
|
|
ELSE
|
|
//Play some "more guys" dialogue.
|
|
IF NOT bHasTextLabelTriggered[LM2_MORE2]
|
|
IF sBallasPostRescueTimber[0].iEvent > 0
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(vPlayerPos, vBuddyPos) < 625.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MORE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MORE2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 55 //Runs to the start of the hill.
|
|
IF NOT sLamar.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), sLamar.ped, sLamar.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sLamar.bIsUsingSecondaryCover
|
|
sLamar.vDest = vDest[3]
|
|
sLamar.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sLamar.vDest = vAltDest[3]
|
|
sLamar.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sLamar.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sLamar.vDest)
|
|
|
|
IF sLamar.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sLamar.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, sLamar.vDest, PEDMOVE_RUN, -1, 0.5, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sLamar.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
IF NOT ARE_ENEMIES_IN_THE_WAY_OF_DESTINATION(sLamar.ped, vDest[4])
|
|
AND ((NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN)) AND IS_ENTITY_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<-556.707581,5235.427246,83.054245>>,<<19.250000,44.750000,16.750000>>))
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueExit) = 0)
|
|
sLamar.vDest = vDest[4]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
sLamar.iTimer = 0
|
|
sLamar.iEvent++
|
|
sLamar.bRefreshTasks = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 56 //Runs down to the conveyor area
|
|
//Warp Lamar if he falls too far behind the player.
|
|
IF NOT sLamar.bRefreshTasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), sLamar.ped, sLamar.vDest, vOtherBuddysCurrentDestination, 5.0, 3.0)
|
|
IF sLamar.bIsUsingSecondaryCover
|
|
sLamar.vDest = vDest[4]
|
|
sLamar.bIsUsingSecondaryCover = FALSE
|
|
ELSE
|
|
sLamar.vDest = vAltDest[4]
|
|
sLamar.bIsUsingSecondaryCover = TRUE
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sLamar.bRefreshTasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vBuddyPos, sLamar.vDest)
|
|
|
|
IF sLamar.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sLamar.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sLamar.vDest, <<-574.0313, 5258.5898, 71.0182>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sLamar.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire bullets during the aim run task if it's safe to do so.
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(sLamar.ped)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sLamar.ped, <<-527.860657,5247.066406,79.939369>>, <<-556.417664,5258.927734,69.149582>>, 14.500000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueExit) > 0
|
|
IF NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), sLamar.ped, <<-574.0313, 5258.5898, 71.0182>>)
|
|
SET_PED_SHOOTS_AT_COORD(sLamar.ped, <<-574.0313, 5258.5898, 71.0182>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueExit) = 0
|
|
sLamar.vDest = vDest[5]
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
sLamar.iTimer = 0
|
|
sLamar.iEvent++
|
|
sLamar.bRefreshTasks = TRUE
|
|
ELSE
|
|
//Play some "more guys" dialogue.
|
|
IF NOT bHasTextLabelTriggered[LM2_MORE3]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF sBallasPostRescueExit[0].bIsCreated
|
|
IF VDIST2(vPlayerPos, vBuddyPos) < 900.0
|
|
AND VDIST2(vBuddyPos, sLamar.vDest) < 400.0
|
|
IF (IS_VEHICLE_DRIVEABLE(vehBallaPostRescueExit[0]) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehBallaPostRescueExit[0]))
|
|
OR (IS_VEHICLE_DRIVEABLE(vehBallaPostRescueExit[1]) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehBallaPostRescueExit[1]))
|
|
//If the cars are still driving play a specific line about them pulling up.
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_LCARS", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_LCARS] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MORE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MORE3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 57 //Lamar goes to the exit and waits
|
|
fDistToDestination = VDIST2(vBuddyPos, sLamar.vDest)
|
|
|
|
IF sLamar.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sLamar.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sLamar.ped, sLamar.vDest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sLamar.vDest, <<-591.5313, 5285.2898, 71.0182>>, PEDMOVE_RUN, FALSE, 0.5, 0.5,
|
|
TRUE, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sLamar.bRefreshTasks = FALSE
|
|
ENDIF
|
|
|
|
//Area should be safe, Lamar can rejoin group.
|
|
IF VDIST2(vBuddyPos, sLamar.vDest) < 25.0
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sLamar.ped, FALSE)
|
|
CLEAR_PED_TASKS(sLamar.ped)
|
|
SET_PED_AS_GROUP_MEMBER(sLamar.ped, PLAYER_GROUP_ID())
|
|
|
|
SET_PED_NEVER_LEAVES_GROUP(sLamar.ped, TRUE)
|
|
|
|
sLamar.iEvent = 100
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 100 //Lamar is now in the player's group.
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//1476917 - If Lamar is set on fire then make sure it isn't prolonged.
|
|
IF sLamar.iEvent > 50
|
|
AND NOT IS_PED_INJURED(sLamar.ped)
|
|
IF IS_ENTITY_ON_FIRE(sLamar.ped)
|
|
IF GET_GAME_TIMER() - iLamarFireTimer > 2000
|
|
STOP_ENTITY_FIRE(sLamar.ped)
|
|
ENDIF
|
|
ELSE
|
|
iLamarFireTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC UPDATE_BUDDY_SHOOTOUT_DIALOGUE()
|
|
PED_INDEX pedBuddy
|
|
PED_INDEX pedNearest[5]
|
|
TEXT_LABEL strBuddyDialogueLabel
|
|
TEXT_LABEL strPlayerDialogueLabel
|
|
BOOL bEnemyPedIsNearby = FALSE
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
INT i = 0
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF NOT bHasTextLabelTriggered[FRAN2_GETLAMAR]
|
|
AND eMissionStage < STAGE_GET_LAMAR_OUT
|
|
IF NOT bHasTextLabelTriggered[LM2_driveT]
|
|
AND IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
AND IS_PED_IN_VEHICLE(pedBuddy, sBulldozer.veh)
|
|
strBuddyDialogueLabel = "LM2_driveT"
|
|
ELSE
|
|
strBuddyDialogueLabel = "LM2_drive"
|
|
ENDIF
|
|
strPlayerDialogueLabel = "LM2_FRANGEN"
|
|
ENDIF
|
|
|
|
IF eMissionStage = STAGE_GET_LAMAR_OUT
|
|
strBuddyDialogueLabel = "LM2_TRVATT"
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF NOT bHasTextLabelTriggered[FRAN2_GETLAMAR]
|
|
AND eMissionStage < STAGE_GET_LAMAR_OUT
|
|
strBuddyDialogueLabel = "LM2_FRANGEN"
|
|
strPlayerDialogueLabel = "LM2_drive"
|
|
ENDIF
|
|
|
|
IF eMissionStage = STAGE_GET_LAMAR_OUT
|
|
strPlayerDialogueLabel = "LM2_TRVATT"
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - iCombatDialogueWaitTime > 0
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
//Player dialogue
|
|
IF GET_GAME_TIMER() - iPlayerCombatDialogueTimer > 0
|
|
GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), pedNearest)
|
|
|
|
REPEAT COUNT_OF(pedNearest) i
|
|
IF NOT IS_PED_INJURED(pedNearest[i])
|
|
IF GET_ENTITY_MODEL(pedNearest[i]) = modelBalla
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(pedNearest[i])) < 10000.0
|
|
bEnemyPedIsNearby = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF bEnemyPedIsNearby
|
|
AND IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strPlayerDialogueLabel)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", strPlayerDialogueLabel, CONV_PRIORITY_MEDIUM)
|
|
iPlayerCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Buddy dialogue
|
|
IF GET_GAME_TIMER() - iBuddyCombatDialogueTimer > 0
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
IF (IS_PED_SHOOTING(pedBuddy) OR IS_PED_IN_COMBAT(pedBuddy) OR (IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(pedBuddy, sBulldozer.veh)))
|
|
AND NOT IS_PED_RAGDOLL(pedBuddy)
|
|
AND VDIST2(GET_ENTITY_COORDS(pedBuddy), vPlayerPos) < 625.0
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strBuddyDialogueLabel)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", strBuddyDialogueLabel, CONV_PRIORITY_MEDIUM)
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(pedBuddy, sBulldozer.veh)
|
|
iBuddyCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(15000, 19000)
|
|
ELSE
|
|
iBuddyCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
ENDIF
|
|
|
|
IF ARE_STRINGS_EQUAL(strBuddyDialogueLabel, "LM2_driveT")
|
|
bHasTextLabelTriggered[LM2_driveT] = TRUE
|
|
ENDIF
|
|
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the buddies are on different paths then play update dialogue
|
|
IF g_bFranklin2RequestedBackup
|
|
AND eMissionStage = STAGE_ATTACK_SAWMILL
|
|
AND eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND NOT DOES_BLIP_EXIST(sLamar.blip)
|
|
AND NOT IS_PED_INJURED(pedBuddy)
|
|
IF GET_GAME_TIMER() - iBuddyUpdateDialogueTimer > 0
|
|
IF VDIST2(GET_ENTITY_COORDS(pedBuddy), vPlayerPos) > 2500.0
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT bHasTextLabelTriggered[LM2_ANYSIGN]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_ANYSIGN", CONV_PRIORITY_MEDIUM)
|
|
iBuddyUpdateDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(35000, 40000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
bHasTextLabelTriggered[LM2_ANYSIGN] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_ANYSIGN2]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_ANYSIGN2", CONV_PRIORITY_MEDIUM)
|
|
iBuddyUpdateDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(35000, 40000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
bHasTextLabelTriggered[LM2_ANYSIGN2] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_ANYSIGN3]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_ANYSIGN3", CONV_PRIORITY_MEDIUM)
|
|
iBuddyUpdateDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(35000, 40000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
bHasTextLabelTriggered[LM2_ANYSIGN3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT bHasTextLabelTriggered[LM2_FOUND]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_FOUND", CONV_PRIORITY_MEDIUM)
|
|
iBuddyUpdateDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(35000, 40000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
bHasTextLabelTriggered[LM2_FOUND] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_FOUND2]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_FOUND2", CONV_PRIORITY_MEDIUM)
|
|
iBuddyUpdateDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(35000, 40000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
bHasTextLabelTriggered[LM2_FOUND2] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_FOUND3]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_FOUND3", CONV_PRIORITY_MEDIUM)
|
|
iBuddyUpdateDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(35000, 40000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
bHasTextLabelTriggered[LM2_FOUND3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if one of the buddies passes the weed.
|
|
IF NOT bHasTextLabelTriggered[LM2_WEED]
|
|
AND eMissionStage = STAGE_ATTACK_SAWMILL
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), <<-579.0, 5304.6, 70.1>>) < 100.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_WEEDT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_WEED] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]), <<-579.0, 5304.6, 70.1>>) < 100.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_WEEDF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_WEED] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if AI Michael just killed a ped.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF iTimeLastPedKilledByMichael > 0
|
|
AND GET_GAME_TIMER() - iTimeLastPedKilledByMichael < 1500
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "lm2_mikill", CONV_PRIORITY_MEDIUM)
|
|
iTimeLastPedKilledByMichael = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if AI Franklin just killed a ped (while playing as Michael).
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF iTimeLastPedKilledByFranklin > 0
|
|
AND GET_GAME_TIMER() - iTimeLastPedKilledByFranklin < 1500
|
|
AND eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF eFranklinRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
OR eMissionStage = STAGE_GET_LAMAR_OUT
|
|
IF IS_ENTITY_ON_SCREEN(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "lm2_frkill", CONV_PRIORITY_MEDIUM)
|
|
iTimeLastPedKilledByFranklin = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if the player as Michael hasn't killed anyone.
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF NOT IS_SELECTOR_CAM_ACTIVE()
|
|
AND NOT bHasTextLabelTriggered[FRAN2_SWFRANK] //This text triggers once the buddies have reached the exit.
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
iTimeSincePlayerShotSniperRifle = GET_GAME_TIMER()
|
|
bHasTextLabelTriggered[LM2_enc1] = FALSE
|
|
bHasTextLabelTriggered[LM2_enc2] = FALSE
|
|
ELSE
|
|
IF eTrevorRoute = BUDDY_ROUTE_FRONT_ASSAULT
|
|
OR eMissionStage = STAGE_GET_LAMAR_OUT
|
|
IF NOT bHasTextLabelTriggered[LM2_enc1]
|
|
IF GET_GAME_TIMER() - iTimeSincePlayerShotSniperRifle > 10000
|
|
AND GET_GAME_TIMER() - iTrevorInDangerTimer > 10000
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_enc1", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_enc1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_enc2]
|
|
IF GET_GAME_TIMER() - iTimeSincePlayerShotSniperRifle > 17000
|
|
AND sSelectorPeds.bDisplayDamage[SELECTOR_PED_TREVOR]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_enc2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_enc2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTimeSincePlayerShotSniperRifle = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL CREATE_RANDOM_LAMAR_SHOOTOUT_CONVERSATION()
|
|
INT i = GET_RANDOM_INT_IN_RANGE(0, 8)
|
|
TEXT_LABEL strLabel = ""
|
|
TRIGGERED_TEXT_LABEL eLabel
|
|
|
|
SWITCH i
|
|
CASE 0
|
|
strLabel += "LM2_SH1"
|
|
eLabel = LM2_SH1
|
|
BREAK
|
|
|
|
CASE 1
|
|
strLabel += "LM2_SH2"
|
|
eLabel = LM2_SH2
|
|
BREAK
|
|
|
|
CASE 2
|
|
strLabel += "LM2_SH3"
|
|
eLabel = LM2_SH3
|
|
BREAK
|
|
|
|
CASE 3
|
|
strLabel += "LM2_SH4"
|
|
eLabel = LM2_SH4
|
|
BREAK
|
|
|
|
CASE 4
|
|
strLabel += "LM2_SH5"
|
|
eLabel = LM2_SH5
|
|
BREAK
|
|
|
|
CASE 5
|
|
strLabel += "LM2_SH6"
|
|
eLabel = LM2_SH6
|
|
BREAK
|
|
|
|
CASE 6
|
|
strLabel += "LM2_SH7"
|
|
eLabel = LM2_SH7
|
|
BREAK
|
|
|
|
CASE 7
|
|
strLabel += "LM2_SH8"
|
|
eLabel = LM2_SH8
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT bHasTextLabelTriggered[eLabel]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[eLabel] = TRUE
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_LAMAR_SHOOTOUT_DIALOGUE()
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR vLamarPos = GET_ENTITY_COORDS(sLamar.ped)
|
|
|
|
IF VDIST2(vPlayerPos, vLamarPos) < 400.0
|
|
IF GET_GAME_TIMER() - iCombatDialogueWaitTime > 0
|
|
AND GET_GAME_TIMER() - iLamarCombatDialogueTimer > 0
|
|
IF (bHasTextLabelTriggered[LM2_LSEE] AND (bHasTextLabelTriggered[LM2_LHEARM] OR NOT bHasTextLabelTriggered[LM2_OUT])) //Don't play if we're waiting on responses from Lamar to buddy peds.
|
|
OR NOT g_bFranklin2RequestedBackup
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF CREATE_RANDOM_LAMAR_SHOOTOUT_CONVERSATION()
|
|
ilamarCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(14000, 19000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_SPEAK", CONV_PRIORITY_MEDIUM)
|
|
ilamarCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(14000, 19000)
|
|
iCombatDialogueWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bHasTextLabelTriggered[LM2_OUT]
|
|
//If the buddy told the player to go to Michael, then Lamar says a line about Michael being in the bushes.
|
|
IF NOT bHasTextLabelTriggered[LM2_LHEARM]
|
|
AND eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF GET_GAME_TIMER() - iTimePlayedGotoMichaelDialogue < 13000
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_LHEARM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_LHEARM] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[LM2_LHEARM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue if the player goes in a different direction.
|
|
IF NOT bHasTextLabelTriggered[LM2_WAY]
|
|
AND eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-486.696198,5309.810547,86.643921>>,<<22.250000,2.500000,7.500000>>)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_WAY", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_WAY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CHECK_FOR_MICHAEL_ABILITY_HELP_TEXT()
|
|
IF NOT bHasTextLabelTriggered[FRAN2_SPECHELP]
|
|
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
|
|
bHasTextLabelTriggered[FRAN2_SPECHELP] = TRUE
|
|
ELSE
|
|
IF GET_GAME_TIMER() - iTimeSinceSwitchToMichael > 30000
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
|
|
PRINT_HELP("FRAN2_SPECHELP_KM")
|
|
ELSE
|
|
PRINT_HELP("FRAN2_SPECHELP")
|
|
ENDIF
|
|
bHasTextLabelTriggered[FRAN2_SPECHELP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SPECHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
IF IS_PC_VERSION()
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SPECHELP_KM")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Fail cleanup cannot delete peds in the same group/vehicle as the player, so use this to force delete them.
|
|
PROC FORCE_DELETE_PED_FOR_FAIL(PED_INDEX ped)
|
|
IF NOT IS_ENTITY_DEAD(ped)
|
|
IF IS_PED_GROUP_MEMBER(ped, PLAYER_GROUP_ID())
|
|
OR ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), ped)
|
|
REMOVE_PED(ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MISSION_PASSED(BOOL bIsDebugPass = FALSE)
|
|
IF bIsDebugPass
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT HAS_CUTSCENE_FINISHED()
|
|
STOP_CUTSCENE()
|
|
ENDIF
|
|
|
|
REMOVE_CUTSCENE()
|
|
|
|
WHILE IS_CUTSCENE_ACTIVE()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
Mission_Flow_Mission_Passed()
|
|
|
|
MISSION_CLEANUP()
|
|
ENDPROC
|
|
|
|
PROC MISSION_FAILED(FAILED_REASON reason)
|
|
IF NOT bMissionFailed
|
|
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
KILL_ANY_CONVERSATION()
|
|
|
|
SWITCH reason
|
|
CASE FAILED_GENERIC
|
|
strFailLabel = ""
|
|
BREAK
|
|
|
|
CASE FAILED_ABANDONED_LAMAR
|
|
strFailLabel = "FRAN2_LABAN"
|
|
BREAK
|
|
|
|
CASE FAILED_BULLDOZER_DESTROYED
|
|
strFailLabel = "FRAN2_F03"
|
|
BREAK
|
|
|
|
CASE FAILED_COVER_BLOWN
|
|
strFailLabel = "FRAN2_FEARLY"
|
|
BREAK
|
|
|
|
CASE FAILED_FRANKLIN_DIED
|
|
strFailLabel = "CMN_FDIED"
|
|
BREAK
|
|
|
|
CASE FAILED_LAMAR_DIED
|
|
strFailLabel = "FRAN2_F01"
|
|
BREAK
|
|
|
|
CASE FAILED_MICHAEL_DIED
|
|
strFailLabel = "CMN_MDIED"
|
|
BREAK
|
|
|
|
CASE FAILED_TREVOR_DIED
|
|
strFailLabel = "CMN_TDIED"
|
|
BREAK
|
|
|
|
CASE FAILED_COPS_LED_TO_SAWMILL
|
|
strFailLabel = "FRAN2_FCOPS"
|
|
BREAK
|
|
|
|
CASE FAILED_MICHAELS_CAR_DESTROYED
|
|
strFailLabel = "CMN_MDEST"
|
|
BREAK
|
|
|
|
CASE FAILED_TREVORS_CAR_DESTROYED
|
|
strFailLabel = "CMN_TDEST"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FRA2_FAIL")
|
|
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON(strFailLabel)
|
|
|
|
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
|
IF eMissionStage >= STAGE_GET_INTO_POSITION
|
|
AND eMissionStage < STAGE_DRIVE_HOME
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
UPDATE_LAMAR_DURING_SHOOTOUT()
|
|
|
|
IF eMissionStage >= STAGE_GET_LAMAR_OUT
|
|
UPDATE_SHOOTOUT_ENEMIES_AFTER_RESCUING_LAMAR()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
|
|
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
FORCE_DELETE_PED_FOR_FAIL(sLamar.ped)
|
|
|
|
MISSION_CLEANUP() // must only take 1 frame and terminate the thread
|
|
ENDPROC
|
|
|
|
|
|
PROC DO_INTRO_CUTSCENE()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<8.2263, 535.3607, 175.0279>>, 2.8314, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<8.2263, 535.3607, 175.0279>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 2.8314)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_CUTSCENE("FRA_2_INT")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("FRA_2_INT")
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
objFrontDoor = GET_CLOSEST_OBJECT_OF_TYPE(<<7.5184, 539.5269, 176.1776>>, 2.0, v_ilev_fh_frontdoor, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(objFrontDoor)
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), "] ", "Successfully grabbed front door.")
|
|
//NOTE: 1024 represents a new flag for flagging a registered door as a map door.
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objFrontDoor, "Franklins_Door", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, DEFAULT, INT_TO_ENUM(CUTSCENE_ENTITY_OPTION_FLAGS, 1024))
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iCurrentEvent = 0
|
|
bSkippedMocap = FALSE
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
//JUMP_TO_STAGE(STAGE_MEET_THE_CREW)
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Do any setup on first frame of cutscene.
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
|
|
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<3.1501, 543.9788, 173.7280>>, 124.6853)
|
|
ENDIF
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<8.178145,549.365967,169.815567>>, <<18.647863,526.653015,179.864288>>, 29.000000, <<3.1501, 543.9788, 173.7280>>, 124.6853,
|
|
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
//DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FRANKLIN_2)
|
|
|
|
DO_FADE_IN_WITH_WAIT() //In case this is a mission replay, the game will be faded out at this point
|
|
|
|
//1910810 - Registering the door for the cutscene causes portal issues, to get around this open the door slightly when the cutscene starts.
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_fh_frontdoor, <<7.5184, 539.5269, 176.1776>>, TRUE, 0.1)
|
|
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), "] ", "Intro cutscene is playing.")
|
|
|
|
CLEAR_AREA_OF_PEDS(<<0.0, 0.0, 0.0>>, 5000.0)
|
|
CLEAR_AREA_OF_OBJECTS(<<0.0, 0.0, 0.0>>, 5000.0)
|
|
CLEAR_AREA_OF_COPS(<<0.0, 0.0, 0.0>>, 5000.0)
|
|
CLEAR_AREA_OF_PROJECTILES(<<0.0, 0.0, 0.0>>, 5000.0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF bSkippedMocap
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_fh_frontdoor, <<7.5184, 539.5269, 176.1776>>, TRUE, 0.0)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_fh_frontdoor, <<7.5184, 539.5269, 176.1776>>, FALSE, 0.0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
REPLAY_STOP_EVENT()
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
IF bSkippedMocap
|
|
|
|
ENDIF
|
|
|
|
REMOVE_OBJECT(objFrontDoor, FALSE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, FALSE)
|
|
|
|
eMissionStage = STAGE_MEET_THE_CREW
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_CUTSCENE()
|
|
bSkippedMocap = TRUE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MEET_THE_CREW()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<8.2263, 535.3607, 175.0279>>, 2.8314, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<8.2263, 535.3607, 175.0279>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 2.8314)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
//Stream assets.
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0, TRUE, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
RESET_SHOOTOUT_VARIABLES()
|
|
bTaxiDropoffUpdated = FALSE
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_FRANKLIN_SAVEHOUSE_HILLS_BIKE)
|
|
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_FRANKLIN_SAVEHOUSE_HILLS_CAR)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
WAIT(500)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
CREATE_SHOOTOUT_PICKUPS()
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(sLocatesData)
|
|
#ENDIF
|
|
|
|
FLOAT fPlayerDistFromDestination = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeetLocation)
|
|
FLOAT fPlayerDistFromOtherSide = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-484.7, 5276.6, 87.5>>)
|
|
BOOL bLoseWantedLevel = TRUE
|
|
|
|
//Fail if the player has a wanted level and goes to the sawmill.
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
IF fPlayerDistFromDestination < 2500.0
|
|
bLoseWantedLevel = FALSE
|
|
|
|
IF GET_GAME_TIMER() - iWantedFailTimer > 1500
|
|
MISSION_FAILED(FAILED_COPS_LED_TO_SAWMILL)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iWantedFailTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX vehFinalCar
|
|
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
vehFinalCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, vMeetLocation, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, "FRAN2_GOSAW", bLoseWantedLevel)
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF (NOT IS_ENTITY_DEAD(vehFinalCar) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-704.742188,5313.340820,74.917175>>, <<-733.021667,5316.371094,69.172340>>, 37.000000) AND NOT IS_ENTITY_IN_AIR(vehFinalCar))
|
|
OR (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-711.735474,5310.284180,75.798866>>, <<-730.608948,5311.804199,69.004204>>, 27.500000))
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
IF IS_MOBILE_PHONE_CALL_ONGOING()
|
|
HANG_UP_AND_PUT_AWAY_PHONE()
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehFinalCar)
|
|
AND IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehFinalCar))
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
|
|
ENDIF
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT bHasTextLabelTriggered[LM2_PHNL]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, NULL, "LESTER")
|
|
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(sConversationPeds, CHAR_LESTER, "LEM2AUD", "LM2_PHNL", CONV_PRIORITY_CELLPHONE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[LM2_PHNL] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
/*ELIF NOT bHasTextLabelTriggered[Lm2_mut]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_MOBILE_PHONE_CALL_ONGOING()
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "Lm2_mut", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[Lm2_mut] = TRUE
|
|
iMainDialogueTimer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FRAN2_phnhlp]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF iMainDialogueTimer = 0
|
|
iMainDialogueTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - iMainDialogueTimer > 1800
|
|
PRINT_HELP("FRAN2_phnhlp")
|
|
bHasTextLabelTriggered[FRAN2_phnhlp] = TRUE
|
|
ENDIF
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
BOOL bHasStopped
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehFinalCar)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PHONE)
|
|
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehFinalCar, DEFAULT_VEH_STOPPING_DISTANCE, 1)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
|
|
bHasStopped = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHasStopped = TRUE
|
|
ENDIF
|
|
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
IF bHasStopped
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//If the player calls Michael or Trevor then force a specific call through.
|
|
/*IF NOT bHasTextLabelTriggered[LM2_phn]
|
|
AND bHasTextLabelTriggered[LM2_PHNL]
|
|
IF fPlayerDistFromDestination > 90000.0
|
|
IF IS_CALLING_CONTACT(CHAR_MICHAEL)
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(sConversationPeds, CHAR_MICHAEL, "LEM2AUD", "LM2_phnM", CONV_PRIORITY_MEDIUM)
|
|
DISABLE_HANGUP_FOR_THIS_CALL(TRUE)
|
|
bHasTextLabelTriggered[LM2_phn] = TRUE
|
|
g_bFranklin2RequestedBackup = TRUE
|
|
ENDIF
|
|
ELIF IS_CALLING_CONTACT(CHAR_TREVOR)
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(sConversationPeds, CHAR_TREVOR, "LEM2AUD", "LM2_phnT", CONV_PRIORITY_MEDIUM)
|
|
DISABLE_HANGUP_FOR_THIS_CALL(TRUE)
|
|
bHasTextLabelTriggered[LM2_phn] = TRUE
|
|
g_bFranklin2RequestedBackup = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
//If the enemies were alreted early then progress straight away.
|
|
IF bEnemiesHaveBeenAlerted
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_GET_TO_SAWMILL")
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
START_AUDIO_SCENE("FRANKLIN_2_GET_TO_SAWMILL")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bPlayerPickedStartCar
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
//Track the vehicle speed/damage stat.
|
|
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(veh))
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_VEHICLE_CHOSEN, 0)
|
|
ELIF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(veh))
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_VEHICLE_CHOSEN, 1)
|
|
ELSE
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_VEHICLE_CHOSEN, 2) //something else
|
|
ENDIF
|
|
ELSE
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_VEHICLE_CHOSEN, 2) //no vehicle
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bPlayerPickedStartCar = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF fPlayerDistFromDestination < 40000.0
|
|
OR fPlayerDistFromOtherSide < 90000.0
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
|
|
IF DOES_ENTITY_EXIST(sBallasStart[0].ped)
|
|
SETUP_REQ_BULLDOZER(vBulldozerStartPos, fBulldozerStartHeading)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sBulldozer.veh)
|
|
SETUP_REQ_SHOOTOUT_COVER_OBJECTS()
|
|
ENDIF
|
|
|
|
//Pre-stream Michael, Trevor and the cars en-route.
|
|
IF g_bFranklin2RequestedBackup
|
|
SETUP_REQ_MICHAEL(vMichaelMeetingPos, fMichaelMeetingHeading)
|
|
SETUP_REQ_TREVOR(vTrevorMeetingPos, fTrevorMeetingHeading)
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SETUP_REQ_MICHAELS_CAR(vMichaelsCarStartPos, fMichaelsCarStartHeading)
|
|
SETUP_REQ_TREVORS_CAR(vTrevorsCarStartPos, fTrevorsCarStartHeading)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF fPlayerDistFromDestination > 62500.0
|
|
AND fPlayerDistFromOtherSide > 1600000.0
|
|
IF g_bFranklin2RequestedBackup
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_VEHICLE(vehMichaelsCar, TRUE)
|
|
REMOVE_VEHICLE(vehTrevorsCar, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
IF fPlayerDistFromDestination < (DEFAULT_CUTSCENE_LOAD_DIST * DEFAULT_CUTSCENE_LOAD_DIST)
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REQUEST_CUTSCENE("FRA_2_IG_4_ALT1_concat")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("FRA_2_IG_4_ALT1_concat")
|
|
ENDIF
|
|
ELIF fPlayerDistFromDestination > (150.0 * 150.0) //Used to be default unload dist, but there were issues when following the road.
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Add a custom taxi drop-off.
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF NOT bTaxiDropoffUpdated
|
|
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(sLocatesData.LocationBlip, <<-745.3523, 5320.2935, 72.6167>>, 257.6477)
|
|
bTaxiDropoffUpdated = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bTaxiDropoffUpdated = FALSE
|
|
ENDIF
|
|
|
|
//Fail for destroying the bulldozer early.
|
|
IF DOES_ENTITY_EXIST(sBulldozer.veh)
|
|
IF NOT IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
MISSION_FAILED(FAILED_BULLDOZER_DESTROYED)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_HELP()
|
|
|
|
//If the player didn't go there in a car then just set the stat to no vehicle.
|
|
IF NOT bPlayerPickedStartCar
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_VEHICLE_CHOSEN, 2)
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
AND NOT bEnemiesHaveBeenAlerted
|
|
eMissionStage = STAGE_MEET_CREW_CUTSCENE
|
|
ELSE
|
|
eMissionStage = STAGE_GET_INTO_POSITION
|
|
ENDIF
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_MEET_CREW_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MEET_CREW_CUTSCENE()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bHasUsedCheckpoint
|
|
g_bFranklin2RequestedBackup = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(vMeetLocation, 204.9590, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vMeetLocation)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 204.9590)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
RESET_SHOOTOUT_VARIABLES()
|
|
|
|
//Stream assets.
|
|
WHILE NOT DOES_ENTITY_EXIST(sBulldozer.veh)
|
|
OR NOT DOES_ENTITY_EXIST(objShootoutCover[0])
|
|
OR NOT sBallasStart[0].bIsCreated
|
|
OR NOT bCreatedBallaStartCars
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
SETUP_REQ_BULLDOZER(vBulldozerStartPos, fBulldozerStartHeading)
|
|
SETUP_REQ_SHOOTOUT_COVER_OBJECTS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
WHILE NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
OR NOT DOES_ENTITY_EXIST(vehTrevorsCar)
|
|
SETUP_REQ_MICHAEL(vMichaelMeetingPos, fMichaelMeetingHeading)
|
|
SETUP_REQ_TREVOR(vTrevorMeetingPos, fTrevorMeetingHeading)
|
|
SETUP_REQ_MICHAELS_CAR(vMichaelsCarStartPos, fMichaelsCarStartHeading)
|
|
SETUP_REQ_TREVORS_CAR(vTrevorsCarStartPos, fTrevorsCarStartHeading)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
CREATE_SHOOTOUT_PICKUPS()
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
bEnemiesHaveBeenAlerted = FALSE
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_CUTSCENE("FRA_2_IG_4_ALT1_concat")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("FRA_2_IG_4_ALT1_concat")
|
|
|
|
RESET_SHOOTOUT_VARIABLES()
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
|
|
SETUP_REQ_WEED_PALLETS_FOR_CUTSCENE(TRUE)
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND SETUP_REQ_WEED_PALLETS_FOR_CUTSCENE(TRUE)
|
|
AND HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_FOCUS_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER, TRUE)
|
|
|
|
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vehMichaelsCar, "Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Michaels_car", CU_DONT_ANIMATE_ENTITY, GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehTrevorsCar)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vehTrevorsCar, "Trevors_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Trevors_car", CU_DONT_ANIMATE_ENTITY, GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iCurrentEvent = 0
|
|
bSkippedMocap = FALSE
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Do any setup on first frame of cutscene.
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
//Store the last player's car as the checkpoint car, so it's recreated on a retry.
|
|
VEHICLE_INDEX vehLastCar
|
|
vehLastCar = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehLastCar)
|
|
IF VDIST2(GET_ENTITY_COORDS(vehLastCar), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 10000.0
|
|
AND vehLastCar != vehMichaelsCar
|
|
AND vehLastCar != vehTrevorsCar
|
|
IF IS_ENTITY_IN_ANGLED_AREA(vehLastCar, <<-707.737244,5325.163574,74.473297>>, <<-715.099304,5299.242188,68.701591>>, 45.000000)
|
|
SET_ENTITY_HEADING(vehLastCar, 261.1234)
|
|
SET_ENTITY_COORDS(vehLastCar, <<-732.8705, 5317.5469, 71.9049>>)
|
|
ENDIF
|
|
|
|
SET_VEH_RADIO_STATION(vehLastCar, "OFF")
|
|
SET_VEHICLE_ENGINE_ON(vehLastCar, FALSE, FALSE)
|
|
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vehLastCar)
|
|
vehReplayCar = vehLastCar
|
|
SET_ENTITY_AS_MISSION_ENTITY(vehReplayCar, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehMichaelsCar)
|
|
SET_VEHICLE_ENGINE_HEALTH(vehMichaelsCar, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vehMichaelsCar, 1000.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTrevorsCar)
|
|
SET_VEHICLE_ENGINE_HEALTH(vehTrevorsCar, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vehTrevorsCar, 1000.0)
|
|
ENDIF
|
|
|
|
//SET_ENTITY_COORDS(vehMichaelsCar, vMichaelsCarStartPos, FALSE)
|
|
//SET_ENTITY_ROTATION(vehMichaelsCar, <<-4.7475, 2.8756, -98.7217>>, DEFAULT, FALSE)
|
|
|
|
//SET_ENTITY_COORDS(vehTrevorsCar, vTrevorsCarStartPos, FALSE)
|
|
//SET_ENTITY_ROTATION(vehTrevorsCar, <<1.2134, -3.1879, 15.0001>>, DEFAULT, FALSE)
|
|
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-707.737244,5325.163574,74.473297>>, <<-715.099304,5299.242188,68.701591>>, 45.000000, <<-732.8705, 5317.5469, 71.9049>>, 261.1234,
|
|
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
|
|
BLOCK_EMERGENCY_SERVICES_FOR_SHOOTOUT(TRUE)
|
|
BLOCK_AMBIENT_PEDS_AND_VEHICLES_FOR_SHOOTOUT(TRUE)
|
|
|
|
CLEAR_AREA_OF_PEDS(vMeetLocation, 5000.0)
|
|
CLEAR_AREA_OF_OBJECTS(vMeetLocation, 5000.0)
|
|
CLEAR_AREA_OF_COPS(vMeetLocation, 5000.0)
|
|
CLEAR_AREA_OF_PROJECTILES(vMeetLocation, 5000.0)
|
|
//CLEAR_AREA_OF_VEHICLES(vMeetLocation, 5000.0, TRUE)
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
ENDIF
|
|
|
|
SETUP_REQ_WEED_PALLETS_FOR_CUTSCENE()
|
|
|
|
DO_FADE_IN_WITH_WAIT() //In case this is a mission replay, the game will be faded out at this point
|
|
|
|
iCurrentEvent++
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF GET_CUTSCENE_TIME() > 28000
|
|
TRIGGER_MUSIC_EVENT("FRA2_START")
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Remove the weed pallets created just for the cutscene.
|
|
IF DOES_ENTITY_EXIST(objExtraWeed[0])
|
|
IF IS_CUTSCENE_PLAYING()
|
|
AND GET_CUTSCENE_TIME() > 43000
|
|
INT i = 0
|
|
REPEAT COUNT_OF(objExtraWeed) i
|
|
REMOVE_OBJECT(objExtraWeed[i], TRUE)
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
AND GET_CUTSCENE_TIME() > 46000
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
|
|
ENDIF
|
|
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<-686.4227, 5256.7705, 75.7882>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 223.4715)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
CLEAR_FOCUS()
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_RUN, 5500, -87.7, FALSE)
|
|
ELSE
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_RUN, 3500, -87.7, FALSE)
|
|
ENDIF
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_RUN, FALSE, FAUS_CUTSCENE_EXIT)
|
|
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_car")
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_car")
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
|
|
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, GET_PED_INDEX(CHAR_MICHAEL))
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
bEnemiesHaveBeenAlerted = FALSE
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(objExtraWeed) i
|
|
REMOVE_OBJECT(objExtraWeed[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
CLEAR_FOCUS()
|
|
|
|
eMissionStage = STAGE_GET_INTO_POSITION
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_CUTSCENE()
|
|
bSkippedMocap = TRUE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC GET_INTO_POSITION()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bHasUsedCheckpoint
|
|
g_bFranklin2RequestedBackup = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF (g_bFranklin2RequestedBackup AND SETUP_REQ_PLAYER_IS_TREVOR())
|
|
OR (NOT g_bFranklin2RequestedBackup AND SETUP_REQ_PLAYER_IS_FRANKLIN())
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<-706.1613, 5313.1440, 70.0483>>, 284.2023, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-706.1613, 5313.1440, 70.0483>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 284.2023)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
RESET_SHOOTOUT_VARIABLES()
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
WHILE NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
OR NOT DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
OR NOT DOES_ENTITY_EXIST(vehTrevorsCar)
|
|
SETUP_REQ_MICHAEL(<<-686.4227, 5256.7705, 75.7882>>, 223.4715)
|
|
SETUP_REQ_FRANKLIN(<<-696.7804, 5312.5044, 69.2695>>, 275.3851)
|
|
SETUP_REQ_MICHAELS_CAR(vMichaelsCarStartPos, fMichaelsCarStartHeading)
|
|
SETUP_REQ_TREVORS_CAR(vTrevorsCarStartPos, fTrevorsCarStartHeading)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_MICHAEL_OUTFIT()
|
|
SETUP_TREVOR_OUTFIT()
|
|
ENDIF
|
|
|
|
//Stream assets.
|
|
WHILE NOT SETUP_REQ_REPLAY_CAR(vReplayCarPos, fReplayCarHeading)
|
|
OR NOT DOES_ENTITY_EXIST(sBulldozer.veh)
|
|
OR NOT DOES_ENTITY_EXIST(objShootoutCover[0])
|
|
OR NOT sBallasStart[0].bIsCreated
|
|
OR NOT bCreatedBallaStartCars
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
SETUP_REQ_BULLDOZER(vBulldozerStartPos, fBulldozerStartHeading)
|
|
SETUP_REQ_SHOOTOUT_COVER_OBJECTS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P2_HEADSET, FALSE)
|
|
ELSE
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
ENDIF
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SETTIMERA(0)
|
|
|
|
WHILE TIMERA() < 10000
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
SETTIMERA(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
|
|
BLOCK_EMERGENCY_SERVICES_FOR_SHOOTOUT(TRUE)
|
|
BLOCK_AMBIENT_PEDS_AND_VEHICLES_FOR_SHOOTOUT(TRUE)
|
|
CREATE_SHOOTOUT_PICKUPS()
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
bEnemiesHaveBeenAlerted = FALSE
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
bLamarHasBeenRescued = FALSE
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
TRIGGER_MUSIC_EVENT("FRA2_HEAD_TO_POS")
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_STEALTH")
|
|
START_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_STEALTH")
|
|
ENDIF
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
SETUP_REQ_BUDDIES_START_FIGHT()
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sBulldozer.veh, FALSE)
|
|
ENDIF
|
|
|
|
CLEAR_TRIGGERED_LABELS()
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FRANKLIN2_ATTACK_SAWMILL, "ATTACK_SAWMILL")
|
|
REFRESH_BUDDY_PED_AUDIO_MIX_GROUP()
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
IF g_bFranklin2RequestedBackup
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-706.1613, 5313.1440, 70.0483>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 284.2023)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<-707.5012, 5310.9429, 70.3263>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 285.2878)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
WAIT(500)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sBulldozer.veh, TRUE)
|
|
ENDIF
|
|
|
|
//If the audio scene is still running from the first stage then stop it now.
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_GET_TO_SAWMILL")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_GET_TO_SAWMILL")
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SETTIMERB(0)
|
|
eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
bTrevorTriggeredShootoutEarly = FALSE
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
UPDATE_BULLDOZER()
|
|
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointBulldozerRoute)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointFrontRoute)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointRearRoute)
|
|
|
|
IF bEnemiesHaveBeenAlerted
|
|
IF g_bFranklin2RequestedBackup
|
|
UPDATE_SHOOTOUT_SWITCH()
|
|
ENDIF
|
|
|
|
//Warp Michael if he's not on screen.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])) > 25.0
|
|
IF NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), 2.0)
|
|
AND NOT IS_SPHERE_VISIBLE(vMichaelSnipePos, 2.0)
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vMichaelSnipePos)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], fMichaelSnipeHeading)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player was Trevor and decided to run in early then play a line.
|
|
IF iCurrentEvent = 0
|
|
bTrevorTriggeredShootoutEarly = TRUE
|
|
ENDIF
|
|
|
|
//Once the enemies have been alerted then progress the mission.
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
//Get each ped into position
|
|
IF NOT g_bFranklin2RequestedBackup
|
|
IF NOT bHasTextLabelTriggered[LM2_ALONE]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_ALONE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_ALONE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FRAN2_FIND]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_FIND", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_FIND] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
BOOL bPlayerReachedStartPoint
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Get Trevor into position
|
|
IF NOT DOES_BLIP_EXIST(blipBulldozerRoute)
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
blipBulldozerRoute = CREATE_BLIP_FOR_ENTITY(sBulldozer.veh)
|
|
SET_BLIP_COLOUR(blipBulldozerRoute, BLIP_COLOUR_YELLOW)
|
|
SET_BLIP_BRIGHT(blipBulldozerRoute, FALSE)
|
|
ELSE
|
|
blipBulldozerRoute = CREATE_BLIP_FOR_COORD(vBulldozerRouteStartPos)
|
|
ENDIF
|
|
ELSE
|
|
BOOL bShowCorona
|
|
|
|
IF NOT IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(GET_BLIP_COORDS(blipBulldozerRoute), vBulldozerRouteStartPos, 0.1)
|
|
REMOVE_BLIP(blipBulldozerRoute)
|
|
ENDIF
|
|
|
|
bShowCorona = TRUE
|
|
ELSE
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
DISABLE_PLAYER_VEHICLE_DRIVING_CONTROLS_THIS_FRAME()
|
|
|
|
SET_BLIP_ALPHA(blipBulldozerRoute, 0)
|
|
ELSE
|
|
SET_BLIP_ALPHA(blipBulldozerRoute, 255)
|
|
ENDIF
|
|
|
|
bShowCorona = TRUE //FALSE: currently the bulldozer blip is turned off.
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vBulldozerRouteStartPos, g_vAnyMeansLocate, bShowCorona)
|
|
OR (IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh))
|
|
vChosenRoutePos = vBulldozerRouteStartPos
|
|
bPlayerReachedStartPoint = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(blipFrontRoute)
|
|
blipFrontRoute = CREATE_BLIP_FOR_COORD(vFrontRouteStartPos)
|
|
ELSE
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vFrontRouteStartPos, g_vAnyMeansLocate, TRUE)
|
|
vChosenRoutePos = vFrontRouteStartPos
|
|
bPlayerReachedStartPoint = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(blipRearRoute)
|
|
blipRearRoute = CREATE_BLIP_FOR_COORD(vRearRouteStartPos)
|
|
ELSE
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vRearRouteStartPos, g_vAnyMeansLocate, TRUE)
|
|
vChosenRoutePos = vRearRouteStartPos
|
|
bPlayerReachedStartPoint = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bPlayerReachedStartPoint
|
|
OR NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
|
|
IF NOT bHasTextLabelTriggered[LM2_PICK]
|
|
TEXT_LABEL strLabel
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(vChosenRoutePos, vRearRouteStartPos)
|
|
strLabel = "LM2_PICK3"
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(vChosenRoutePos, vFrontRouteStartPos)
|
|
strLabel = "LM2_PICK1"
|
|
ELSE
|
|
strLabel = "LM2_PICK2"
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_CONTEXT)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
ELSE
|
|
PRINT_HELP_FOREVER("FRAN2_SIGHELP2")
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[LM2_PICK] = TRUE
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_HELP()
|
|
DESTROY_ALL_CAMS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_SWITCHES)
|
|
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
|
|
sSelectorCam.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
|
|
iHealthBeforeSwitch = GET_ENTITY_HEALTH(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed])
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
VECTOR vRot
|
|
vRot = <<0.0, 0.0, GET_ENTITY_HEADING(sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed])>>
|
|
NEW_LOAD_SCENE_START(GET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]), CONVERT_ROTATION_TO_DIRECTION_VECTOR(vRot), 50.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ELSE
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SIGHELP2")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[LM2_WHERE]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_WHERE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_WHERE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FRAN2_GETP]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_GETP", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_GETP] = TRUE
|
|
iMainDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_MPATH]
|
|
IF GET_GAME_TIMER() - iMainDialogueTimer > 4000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MPATH", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MPATH] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FRAN2_POSHELP]
|
|
PRINT_HELP("FRAN2_POSHELP")
|
|
bHasTextLabelTriggered[FRAN2_POSHELP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_NOCLOSE]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_NOCLOSE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_NOCLOSE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
HANDLE_BUDDY_DEATHS_FROM_EXPLOSIONS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.iHealth)
|
|
BREAK
|
|
|
|
CASE 1 //Perform switch to Franklin
|
|
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sSelectorCam, SWITCH_TYPE_SHORT)
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
iCurrentEvent++
|
|
ELSE
|
|
IF sSelectorCam.bOKToSwitchPed
|
|
IF NOT sSelectorCam.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
|
|
IF iHealthBeforeSwitch < 110
|
|
iHealthBeforeSwitch = 110
|
|
ENDIF
|
|
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_DIES_WHEN_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
|
|
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 5, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_DisableHurt, TRUE)
|
|
SET_ENTITY_PROOFS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], iHealthBeforeSwitch)
|
|
SET_PED_MAX_HEALTH_WITH_SCALE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 1800)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE, -1)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed],
|
|
RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_MELEE | RBF_IMPACT_OBJECT | RBF_PED_RAGDOLL_BUMP | RBF_PLAYER_IMPACT)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
|
|
|
|
//1897010 - Make sure Trevor has a suitable weapon after the switch.
|
|
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Now is a good time to reposition Michael
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vMichaelSnipePos, TRUE, TRUE)
|
|
SET_PED_STEALTH_MOVEMENT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED_ID(), RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_MELEE | RBF_IMPACT_OBJECT | RBF_PED_RAGDOLL_BUMP | RBF_PLAYER_IMPACT)
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
REFRESH_BUDDY_PED_AUDIO_MIX_GROUP()
|
|
|
|
eCurrentPlayer = sSelectorPeds.eNewSelectorPed
|
|
|
|
sSelectorCam.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eCurrentPlayer != SELECTOR_PED_FRANKLIN
|
|
//If Trevor is on foot just have him face the right way.
|
|
VECTOR vPos
|
|
FLOAT fHeading, fHeadingFromDest, fHeadingDiff
|
|
vPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
fHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
|
|
fHeadingFromDest = GET_HEADING_FROM_VECTOR_2D(vLamarShootoutStartPos.x - vPos.x, vLamarShootoutStartPos.y - vPos.y)
|
|
fHeadingDiff = ABSF(fHeadingFromDest - fHeading)
|
|
|
|
IF fHeadingDiff > 180.0
|
|
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_COORD) != PERFORMING_TASK
|
|
AND fHeadingDiff > 20.0
|
|
TASK_TURN_PED_TO_FACE_COORD(PLAYER_PED_ID(), vLamarShootoutStartPos)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Get Franklin into position
|
|
IF NOT DOES_BLIP_EXIST(blipBulldozerRoute)
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
AND IS_VEHICLE_SEAT_FREE(sBulldozer.veh, VS_DRIVER)
|
|
blipBulldozerRoute = CREATE_BLIP_FOR_ENTITY(sBulldozer.veh)
|
|
SET_BLIP_COLOUR(blipBulldozerRoute, BLIP_COLOUR_YELLOW)
|
|
SET_BLIP_BRIGHT(blipBulldozerRoute, FALSE)
|
|
ELSE
|
|
blipBulldozerRoute = CREATE_BLIP_FOR_COORD(vBulldozerRouteStartPos)
|
|
ENDIF
|
|
ELSE
|
|
BOOL bShowCorona
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
AND IS_VEHICLE_SEAT_FREE(sBulldozer.veh, VS_DRIVER)
|
|
SET_BLIP_ALPHA(blipBulldozerRoute, 255)
|
|
|
|
bShowCorona = TRUE
|
|
ELSE
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh)
|
|
DISABLE_PLAYER_VEHICLE_DRIVING_CONTROLS_THIS_FRAME()
|
|
|
|
SET_BLIP_ALPHA(blipBulldozerRoute, 0)
|
|
ELSE
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(GET_BLIP_COORDS(blipBulldozerRoute), vBulldozerRouteStartPos, 0.1)
|
|
REMOVE_BLIP(blipBulldozerRoute)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bShowCorona = TRUE //FALSE
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vBulldozerRouteStartPos, g_vAnyMeansLocate, bShowCorona)
|
|
OR (IS_VEHICLE_DRIVEABLE(sBulldozer.veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sBulldozer.veh))
|
|
bPlayerReachedStartPoint = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(blipFrontRoute)
|
|
blipFrontRoute = CREATE_BLIP_FOR_COORD(vFrontRouteStartPos)
|
|
ELSE
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vFrontRouteStartPos, g_vAnyMeansLocate, TRUE)
|
|
bPlayerReachedStartPoint = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(blipRearRoute)
|
|
blipRearRoute = CREATE_BLIP_FOR_COORD(vRearRouteStartPos)
|
|
ELSE
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vRearRouteStartPos, g_vAnyMeansLocate, TRUE)
|
|
bPlayerReachedStartPoint = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bPlayerReachedStartPoint
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_CONTEXT)
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
RESET_BUDDY_ROUTES_FOR_SHOOTOUT_START()
|
|
|
|
TRIGGER_MUSIC_EVENT("FRA2_IN_POSITION")
|
|
|
|
iTimePlayerGaveSignal = GET_GAME_TIMER()
|
|
iCurrentEvent++
|
|
ELSE
|
|
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
PRINT_HELP_FOREVER("FRAN2_SIGHELP")
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[LM2_PREBANG]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_PREBANG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_PREBANG] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SIGHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT bHasTextLabelTriggered[LM2_FRANPICK]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_FRANPICK", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_FRANPICK] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_MIKEBANG]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MIKEBANG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MIKEBANG] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_MIXT]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MIXT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MIXT] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_MIXF]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MIXF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MIXF] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_TREVSAME]
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_TREVSAME", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_TREVSAME] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
//If the player chose the bulldozer route for Trevor then get him to get inside.
|
|
IF ARE_VECTORS_ALMOST_EQUAL(vChosenRoutePos, vBulldozerRouteStartPos)
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sBullDozer.veh)
|
|
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sBulldozer.veh, -1, VS_DRIVER, PEDMOVE_RUN)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sBulldozer.veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//If Trevor is on foot just have him face the right way.
|
|
VECTOR vPos
|
|
FLOAT fHeading, fHeadingFromDest, fHeadingDiff
|
|
vPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
fHeading = GET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
fHeadingFromDest = GET_HEADING_FROM_VECTOR_2D(vLamarShootoutStartPos.x - vPos.x, vLamarShootoutStartPos.y - vPos.y)
|
|
fHeadingDiff = ABSF(fHeadingFromDest - fHeading)
|
|
|
|
IF fHeadingDiff > 180.0
|
|
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_TURN_PED_TO_FACE_COORD) != PERFORMING_TASK
|
|
AND fHeadingDiff > 20.0
|
|
TASK_TURN_PED_TO_FACE_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vLamarShootoutStartPos)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
HANDLE_BUDDY_DEATHS_FROM_EXPLOSIONS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.iHealth)
|
|
BREAK
|
|
|
|
CASE 3 //Wait for the player to kick off.
|
|
IF NOT bHasTextLabelTriggered[lm2_bang]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "lm2_bang", CONV_PRIORITY_MEDIUM)
|
|
iTimePlayerGaveSignal = GET_GAME_TIMER()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[lm2_bang] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Have the buddies kick off here.
|
|
IF g_bFranklin2RequestedBackup
|
|
IF GET_GAME_TIMER() - iTimePlayerGaveSignal > 800
|
|
UPDATE_SHOOTOUT_SWITCH()
|
|
UPDATE_PLAYER_BUDDIES_DURING_SHOOTOUT()
|
|
UPDATE_FIRST_PERSON_SNIPE_HELP_TEXT()
|
|
ENDIF
|
|
UPDATE_BUDDY_BLIPS_DURING_SHOOTOUT()
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[LM2_MATT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MATT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MATT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_TREVBANG]
|
|
//If Trevor and Franklin picked the same route then play a different line
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN)), GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR))) < 625.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "lm2_bul", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_TREVBANG] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_TREVBANG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_TREVBANG] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bHasTextLabelTriggered[FRAN2_FIND]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_FIND", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_FIND] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//Fail if the player tries to leave.
|
|
FLOAT fDistFromLamar = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vLamarShootoutStartPos)
|
|
|
|
IF fDistFromlamar > 90000.0
|
|
MISSION_FAILED(FAILED_ABANDONED_LAMAR)
|
|
ELIF fDistFromLamar > 50625.0
|
|
IF NOT bHasTextLabelTriggered[FRAN2_RETSAW]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_RETSAW", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_RETSAW] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael gets into position at the hill.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
sMichael.vDest = vMichaelSnipePos
|
|
|
|
//1476954 - Michael seems to change weapons after he's been knocked over, so make sure he still has the sniper rifle.
|
|
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER)
|
|
WEAPON_TYPE eWeapon
|
|
GET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], eWeapon)
|
|
|
|
IF eWeapon != WEAPONTYPE_HEAVYSNIPER
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER)
|
|
ENDIF
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER) < 5
|
|
ADD_AMMO_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_HEAVYSNIPER, 5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), vMichaelSnipePos) > 4.0
|
|
SEQUENCE_INDEX seq
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vMichaelSnipePos, PEDMOVE_RUN, -1, 0.5)
|
|
TASK_AIM_GUN_AT_COORD(NULL, <<-573.5, 5257.8, 71.7>>, -1)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_PED_STEALTH_MOVEMENT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
HANDLE_BUDDY_DEATHS_FROM_EXPLOSIONS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.iHealth)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_HELP()
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
//Warp Michael if he didn't make it to the start point
|
|
If NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF (WOULD_ENTITY_BE_OCCLUDED(GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), vMichaelSnipePos, FALSE) OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelSnipePos) > 22500.0)
|
|
AND (IS_ENTITY_OCCLUDED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])) > 22500.0)
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vMichaelSnipePos)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], fMichaelSnipeHeading)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
eMissionStage = STAGE_ATTACK_SAWMILL
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_ATTACK_SAWMILL)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC ATTACK_SAWMILL()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bHasUsedCheckpoint
|
|
g_bFranklin2RequestedBackup = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<-591.8130, 5236.3486, 69.8739>>, 321.3476, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-591.8130, 5236.3486, 69.8739>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 321.3476)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
RESET_SHOOTOUT_VARIABLES()
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
WHILE NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
OR NOT DOES_ENTITY_EXIST(vehTrevorsCar)
|
|
SETUP_REQ_MICHAEL(vMichaelSnipePos, fMichaelSnipeHeading)
|
|
SETUP_REQ_TREVOR(<<-487.0432, 5385.6133, 77.1299>>, 189.1107)
|
|
SETUP_REQ_MICHAELS_CAR(vMichaelsCarStartPos, fMichaelsCarStartHeading)
|
|
SETUP_REQ_TREVORS_CAR(vTrevorsCarStartPos, fTrevorsCarStartHeading)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_MICHAEL_OUTFIT()
|
|
SETUP_TREVOR_OUTFIT()
|
|
ENDIF
|
|
|
|
//Stream assets.
|
|
WHILE NOT SETUP_REQ_REPLAY_CAR(vReplayCarPos, fReplayCarHeading)
|
|
OR NOT DOES_ENTITY_EXIST(sBulldozer.veh)
|
|
OR NOT DOES_ENTITY_EXIST(objShootoutCover[0])
|
|
OR NOT sBallasStart[0].bIsCreated
|
|
OR NOT bCreatedBallaStartCars
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
SETUP_REQ_BULLDOZER(vBulldozerStartPos, fBulldozerStartHeading)
|
|
SETUP_REQ_SHOOTOUT_COVER_OBJECTS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SETTIMERA(0)
|
|
|
|
WHILE TIMERA() < 5000
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
SETTIMERA(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
|
|
|
|
BLOCK_EMERGENCY_SERVICES_FOR_SHOOTOUT(TRUE)
|
|
BLOCK_AMBIENT_PEDS_AND_VEHICLES_FOR_SHOOTOUT(TRUE)
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(TRUE)
|
|
SETUP_REQ_BUDDIES_START_FIGHT()
|
|
REFRESH_BUDDY_PED_AUDIO_MIX_GROUP()
|
|
CREATE_SHOOTOUT_PICKUPS()
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointBulldozerRoute)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointFrontRoute)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointRearRoute)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointBulldozerRoute)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointFrontRoute)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointRearRoute)
|
|
RESET_SHOOTOUT_VARIABLES()
|
|
|
|
BLOCK_EMERGENCY_SERVICES_FOR_SHOOTOUT(TRUE)
|
|
BLOCK_AMBIENT_PEDS_AND_VEHICLES_FOR_SHOOTOUT(TRUE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
|
|
RESET_BUDDY_ROUTES_FOR_SHOOTOUT_START()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sBulldozer.veh)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sBulldozer.veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_STEALTH")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_STEALTH")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_ALERT")
|
|
START_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_ALERT")
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), <<-591.8130, 5236.3486, 69.8739>>, -1, FALSE, 0, FALSE, FALSE, NULL)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
|
|
TRIGGER_MUSIC_EVENT("FRA2_ATTACK_RT")
|
|
|
|
WAIT(500)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
ENDIF
|
|
|
|
//TRIGGER_MUSIC_EVENT("FRA2_BULLDOZER")
|
|
TRIGGER_MUSIC_EVENT("FRA2_ALERTED")
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
ePlayerRoute = GET_CLOSEST_ROUTE_TO_PED(PLAYER_PED_ID())
|
|
|
|
CHECK_ENEMY_TRIGGER_LOCATES(3)
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
UPDATE_LAMAR_DURING_SHOOTOUT()
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointBulldozerRoute)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointFrontRoute)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointRearRoute)
|
|
|
|
UPDATE_SHOOTOUT_SWITCH()
|
|
UPDATE_PLAYER_BUDDIES_DURING_SHOOTOUT()
|
|
UPDATE_BUDDY_BLIPS_DURING_SHOOTOUT()
|
|
UPDATE_BULLDOZER()
|
|
UPDATE_FIRST_PERSON_SNIPE_HELP_TEXT()
|
|
ENDIF
|
|
|
|
IF bLamarHasBeenRescued
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
IF NOT bHasTextLabelTriggered[LM2_NOWAIT] //Play dialogue from Trevor if he triggered the shootout early.
|
|
IF bTrevorTriggeredShootoutEarly
|
|
AND g_bFranklin2RequestedBackup
|
|
AND eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_NOWAIT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_NOWAIT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[LM2_NOWAIT] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FRAN2_FIND] //Display god text to find lamar.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_FIND", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_FIND] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
//When the sniper/rocket ped shows up then flash Michael's HUD.
|
|
IF NOT bMichaelHUDFlashingForRocket
|
|
IF NOT IS_PED_INJURED(sBallasRocket[0].ped)
|
|
AND iNumTimesFiredRocket > 0
|
|
IF iBallaRocketTimer = 0
|
|
iBallaRocketTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - iBallaRocketTimer > 1500
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR)
|
|
bMichaelHUDFlashingForRocket = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sBallasRocket[0].ped)
|
|
//If Franklin and Trevor are together and waiting for the rocket ped to die then play a line.
|
|
IF NOT bHasTextLabelTriggered[LM2_mrpg]
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN))) < 900.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_mrpg", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_mrpg] = TRUE
|
|
iRocketDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_deal] //If the ped still isn't dead then play another line.
|
|
IF GET_GAME_TIMER() - iRocketDialogueTimer > 11000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(sBallasRocket[0].ped)) < VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN)), GET_ENTITY_COORDS(sBallasRocket[0].ped))
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_TSHOOTM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_deal] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_FSHOOTM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_deal] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN))) < 900.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_DEALT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_deal] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN))) < 900.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_DEALF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_deal] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PED_INJURED(sBallasSniper[0].ped)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
bMichaelHUDFlashingForRocket = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Do the same for the sniper that turns up, but play different dialogue.
|
|
IF NOT bMichaelHUDFlashingForSniper
|
|
IF NOT IS_PED_INJURED(sBallasSniper[0].ped)
|
|
IF iTimeSniperStartedAttacking != 0
|
|
AND GET_GAME_TIMER() - iTimeSniperStartedAttacking > 5000
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR)
|
|
bMichaelHUDFlashingForSniper = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sBallasSniper[0].ped)
|
|
//Get which player is closest to the sniper and have them play the line.
|
|
IF NOT bHasTextLabelTriggered[LM2_SNIPER]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(sBallasSniper[0].ped)) < VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN)), GET_ENTITY_COORDS(sBallasSniper[0].ped))
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_SNIPERT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_SNIPER] = TRUE
|
|
iSniperDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_SNIPERF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_SNIPER] = TRUE
|
|
iSniperDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_deal2] //If the ped still isn't dead then play another line.
|
|
IF GET_GAME_TIMER() - iSniperDialogueTimer > 11000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(sBallasSniper[0].ped)) < VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN)), GET_ENTITY_COORDS(sBallasSniper[0].ped))
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_TSHOOTM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_deal2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_FSHOOTM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_deal2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN))) < 900.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_DEALT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_deal2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN))) < 900.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_DEALF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_deal2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PED_INJURED(sBallasRocket[0].ped)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
bMichaelHUDFlashingForRocket = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If both buddies reached Lamar and the player is Michael then prompt a switch.
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF VDIST2(vLamarShootoutStartPos, GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR))) < 900.0
|
|
AND VDIST2(vLamarShootoutStartPos, GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN))) < 900.0
|
|
AND (GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasTimber2) = 0 OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasRearTimber2) = 0)
|
|
IF NOT bHasTextLabelTriggered[FRAN2_SWITCH2]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_SWITCH2", DEFAULT_GOD_TEXT_TIME, 0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSwitchHUDFlashingToGetLamar
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL)
|
|
|
|
bSwitchHUDFlashingToGetLamar = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//CHECK_FOR_MICHAEL_ABILITY_HELP_TEXT()
|
|
ELSE
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("FRAN2_SWITCH2")
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
|
|
IF bHasTextLabelTriggered[FRAN2_SPECHELP]
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SPECHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
IF IS_PC_VERSION()
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SPECHELP_KM")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bSwitchHUDFlashingToGetLamar
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
bSwitchHUDFlashingToGetLamar = FALSE
|
|
ENDIF
|
|
|
|
iTimeSinceSwitchToMichael = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for abandoning Lamar if leaving the area (not as michael).
|
|
IF eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
FLOAT fDistFromLamar = VDIST2(vPlayerPos, vLamarShootoutStartPos)
|
|
|
|
IF fDistFromlamar > 90000.0
|
|
MISSION_FAILED(FAILED_ABANDONED_LAMAR)
|
|
ELIF fDistFromLamar > 50625.0
|
|
IF NOT bHasTextLabelTriggered[FRAN2_RETSAW]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_RETSAW", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_RETSAW] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
VECTOR vLamarPos = GET_ENTITY_COORDS(sLamar.ped)
|
|
|
|
IF VDIST2(vPlayerPos, vLamarPos) < 2500.0
|
|
AND vPlayerPos.z > 79.0
|
|
IF NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF NOT DOES_BLIP_EXIST(sLamar.blip)
|
|
sLamar.blip = CREATE_BLIP_FOR_ENTITY(sLamar.ped)
|
|
SET_BLIP_SCALE(sLamar.blip, BLIP_SIZE_VEHICLE)
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FRAN2_GETLAMAR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
TRIGGER_MUSIC_EVENT("FRA2_GET_TO_LAMAR")
|
|
|
|
PRINT_NOW("FRAN2_GETLAMAR", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_GETLAMAR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue when the player sees Lamar.
|
|
IF NOT bHasTextLabelTriggered[LM2_SPOTL]
|
|
AND g_bFranklin2RequestedBackup
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF NOT IS_ENTITY_OCCLUDED(sLamar.ped)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-527.930969,5309.885742,79.267578>>, <<-503.380615,5300.900879,82.347145>>, 3.500000)
|
|
FLOAT fScreenX, fScreenY
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vLamarPos, fScreenX, fScreenY)
|
|
|
|
IF fScreenX > 0.3 AND fScreenX < 0.7
|
|
AND fScreenY > 0.3 AND fScreenY < 0.7
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_SPOTL", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_SPOTL] = TRUE
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_SPOTL2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_SPOTL] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Have the player look at Lamar once going near him.
|
|
IF NOT bPlayerGivenLookAtLamarTask
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sLamar.ped)) < 225.0
|
|
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sLamar.ped, 8000, SLF_WHILE_NOT_IN_FOV)
|
|
bPlayerGivenLookAtLamarTask = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sLamar.ped)) > 400.0
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
bPlayerGivenLookAtLamarTask = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
UPDATE_BUDDY_SHOOTOUT_DIALOGUE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_HELP()
|
|
|
|
//Kill any of the start enemies that were dotted around originally.
|
|
INT i
|
|
REPEAT COUNT_OF(sBallasStart) i
|
|
IF NOT IS_PED_INJURED(sBallasStart[i].ped)
|
|
IF VDIST2(GET_ENTITY_COORDS(sBallasStart[i].ped), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 22500.0
|
|
AND NOT IS_ENTITY_ON_SCREEN(sBallasStart[i].ped)
|
|
SET_ENTITY_HEALTH(sBallasStart[i].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
CLEAR_SELECTOR_PED_PRIORITY(sSelectorPeds)
|
|
|
|
eMissionStage = STAGE_GET_LAMAR_OUT
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_GET_LAMAR_OUT)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC GET_LAMAR_OUT()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bHasUsedCheckpoint
|
|
g_bFranklin2RequestedBackup = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<-516.7184, 5305.6040, 79.2676>>, 248.7328, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-516.7184, 5305.6040, 79.2676>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 248.7328)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
RESET_SHOOTOUT_VARIABLES()
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
WHILE NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
OR NOT DOES_ENTITY_EXIST(vehTrevorsCar)
|
|
SETUP_REQ_MICHAEL(vMichaelSnipePos, fMichaelSnipeHeading)
|
|
SETUP_REQ_TREVOR(<<-508.7989, 5305.9316, 79.2676>>, 250.0743)
|
|
SETUP_REQ_MICHAELS_CAR(vMichaelsCarStartPos, fMichaelsCarStartHeading)
|
|
SETUP_REQ_TREVORS_CAR(vTrevorsCarStartPos, fTrevorsCarStartHeading)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_MICHAEL_OUTFIT()
|
|
SETUP_TREVOR_OUTFIT()
|
|
ENDIF
|
|
|
|
//Stream assets.
|
|
WHILE NOT SETUP_REQ_REPLAY_CAR(vReplayCarPos, fReplayCarHeading)
|
|
OR NOT DOES_ENTITY_EXIST(sBulldozer.veh)
|
|
OR NOT DOES_ENTITY_EXIST(sLamar.ped)
|
|
OR NOT DOES_ENTITY_EXIST(objShootoutCover[0])
|
|
OR NOT bCreatedBallaStartCars
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
UPDATE_SHOOTOUT_ENEMIES_AFTER_RESCUING_LAMAR()
|
|
SETUP_REQ_LAMAR(<<-521.4622, 5307.6079, 79.2676>>, 252.3208)
|
|
SETUP_REQ_BULLDOZER(vBulldozerStartPos, fBulldozerStartHeading)
|
|
SETUP_REQ_SHOOTOUT_COVER_OBJECTS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SETTIMERA(0)
|
|
|
|
WHILE TIMERA() < 10000
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
SETTIMERA(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
|
|
|
|
BLOCK_EMERGENCY_SERVICES_FOR_SHOOTOUT(TRUE)
|
|
BLOCK_AMBIENT_PEDS_AND_VEHICLES_FOR_SHOOTOUT(TRUE)
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(TRUE)
|
|
SETUP_REQ_BUDDIES_START_FIGHT()
|
|
REPOSITION_VEHICLES_FOR_LAMAR_ESCAPE()
|
|
REFRESH_BUDDY_PED_AUDIO_MIX_GROUP()
|
|
CREATE_SHOOTOUT_PICKUPS()
|
|
|
|
bHasTextLabelTriggered[lm2_lgof] = TRUE //Indicates that Franklin rescued Lamar.
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
sLamar.iEvent = 50
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_ALERT")
|
|
START_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_ALERT")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_PROTECT_LAMAR")
|
|
START_AUDIO_SCENE("FRANKLIN_2_PROTECT_LAMAR")
|
|
ENDIF
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
//Warp the buddy closer to where Lamar was if they got stuck on their route.
|
|
PED_INDEX pedBuddy
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
ELSE
|
|
pedBuddy = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(pedBuddy)
|
|
IF VDIST2(GET_ENTITY_COORDS(pedBuddy), vLamarShootoutStartPos) > 2500.0
|
|
IF IS_ENTITY_OCCLUDED(pedBuddy)
|
|
IF WOULD_ENTITY_BE_OCCLUDED(GET_ENTITY_MODEL(pedBuddy), <<-507.0433, 5308.2754, 79.2676>>)
|
|
SET_ENTITY_COORDS(pedBuddy, <<-507.0433, 5308.2754, 79.2676>>)
|
|
ELSE
|
|
SET_ENTITY_COORDS(pedBuddy, <<-494.3257, 5324.5132, 79.5372>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sTrevor.iEvent = 0
|
|
sTrevor.bRefreshTasks = TRUE
|
|
sFranklin.iEvent = 0
|
|
sFranklin.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLamar.blip)
|
|
REMOVE_BLIP(sLamar.blip)
|
|
ENDIF
|
|
|
|
//1979404 - Don't overwrite the replay checkpoint vehicle when hitting this checkpoint.
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FRANKLIN2_GET_LAMAR_OUT, "GET_LAMAR_OUT", DEFAULT, DEFAULT, DEFAULT, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
|
|
TRIGGER_MUSIC_EVENT("FRA2_CUT_LAMAR_RT")
|
|
|
|
WAIT(500)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FRA2_GOT_LAMAR")
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SETTIMERB(0)
|
|
SETTIMERA(0)
|
|
iFinalSwitchTimer = 0
|
|
eFinalSwitchType = SWITCH_TYPE_SHORT
|
|
iTimeSinceLamarRescued = GET_GAME_TIMER()
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
VECTOR vPlayerPos, vLamarPos, vMichaelPos
|
|
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
vLamarPos = GET_ENTITY_COORDS(sLamar.ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
vMichaelPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
|
|
CHECK_ENEMY_TRIGGER_LOCATES()
|
|
UPDATE_LAMAR_DURING_SHOOTOUT()
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
UPDATE_SHOOTOUT_ENEMIES_AFTER_RESCUING_LAMAR()
|
|
UPDATE_BULLDOZER()
|
|
UPDATE_FIRST_PERSON_SNIPE_HELP_TEXT()
|
|
|
|
IF NOT bHasTextLabelTriggered[LM2_snipe1]
|
|
IF g_bFranklin2RequestedBackup
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_snipe1", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_snipe1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[LM2_snipe1] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FRAN2_leadL]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_leadL", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_leadL] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_LSEE]
|
|
//Dialogue.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
AND eCurrentPlayer != SELECTOR_PED_MICHAEL
|
|
AND g_bFranklin2RequestedBackup
|
|
//If the player rescued Lamar with buddies then have Lamar comment on the other buddy once they're in range.
|
|
IF TIMERA() < 35000
|
|
AND NOT IS_PED_INJURED(sLamar.ped)
|
|
IF bHasTextLabelTriggered[lm2_lgof]
|
|
IF VDIST2(vLamarPos, GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR))) < 400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_LSEET", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_LSEE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF bHasTextLabelTriggered[lm2_lgot]
|
|
IF VDIST2(vLamarPos, GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN))) < 400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_LSEEF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_LSEE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(sLamar.blip)
|
|
AND NOT IS_PED_INJURED(sLamar.ped)
|
|
sLamar.blip = CREATE_BLIP_FOR_ENTITY(sLamar.ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF bHasTextLabelTriggered[FRAN2_leadL]
|
|
UPDATE_BUDDY_SHOOTOUT_DIALOGUE()
|
|
UPDATE_LAMAR_SHOOTOUT_DIALOGUE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//A group of enemies go up to attack Michael, if they get close flash Michael and play dialogue.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF (NOT IS_PED_INJURED(sBallasPostRescueExit[3].ped) AND VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[3].ped), vMichaelPos) < 1600.0)
|
|
OR (NOT IS_PED_INJURED(sBallasPostRescueExit[4].ped) AND VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[4].ped), vMichaelPos) < 1600.0)
|
|
OR (NOT IS_PED_INJURED(sBallasPostRescueExit[5].ped) AND VDIST2(GET_ENTITY_COORDS(sBallasPostRescueExit[5].ped), vMichaelPos) < 1600.0)
|
|
bMichaelIsGettingFlanked = TRUE
|
|
bMichaelSetToMoveFreely = TRUE
|
|
|
|
IF NOT bHasTextLabelTriggered[LM2_MIKEHURT1]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MIKEHURT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MIKEHURT1] = TRUE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL)
|
|
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMichaelIsGettingFlanked
|
|
IF IS_PED_INJURED(sBallasPostRescueExit[3].ped)
|
|
AND IS_PED_INJURED(sBallasPostRescueExit[4].ped)
|
|
AND IS_PED_INJURED(sBallasPostRescueExit[5].ped)
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
|
|
bMichaelIsGettingFlanked = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/*IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
//CHECK_FOR_MICHAEL_ABILITY_HELP_TEXT()
|
|
ELSE
|
|
IF bHasTextLabelTriggered[FRAN2_SPECHELP]
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FRAN2_SPECHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
//This locate is used just for the corona.
|
|
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vSawmillExitPos, g_vAnyMeansLocate, TRUE)
|
|
|
|
BOOL bAllEnemiesAreDead
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasPostRescueExit) = 0 //Must have been created first.
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(sBallasAfterLamar3) = 0
|
|
AND IS_PED_INJURED(sBallasRocket[0].ped) //Can be dead or never created.
|
|
AND IS_PED_INJURED(sBallasSniper[0].ped) //Can be dead or never created.
|
|
bAllEnemiesAreDead = TRUE
|
|
ENDIF
|
|
|
|
IF (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-565.169250,5272.239746,69.214165>>, <<-584.383545,5234.474121,78.220451>>, 20.000000) OR eCurrentPlayer = SELECTOR_PED_MICHAEL)
|
|
AND bAllEnemiesAreDead
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF DOES_BLIP_EXIST(blipCurrentObjective)
|
|
REMOVE_BLIP(blipCurrentObjective)
|
|
ENDIF
|
|
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
IF iFinalSwitchTimer = 0
|
|
iFinalSwitchTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - iFinalSwitchTimer > 1500
|
|
/*IF NOT bHasTextLabelTriggered[FRAN2_SWFRANK]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("FRAN2_SWFRANK", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_SWFRANK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL)
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
|
|
IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE)*/
|
|
CLEAR_PRINTS()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FRA2_SWITCHES)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
|
|
sSelectorCam.pedTo = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
|
|
//Make sure Franklin is aiming in a good place for the switch.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
TASK_AIM_GUN_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<-587.6, 5230.2, 71.4>>, -1, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-489.725586,5408.617676,49.595184>>, <<-570.134766,5210.887207,122.609947>>, 188.750000)
|
|
eFinalSwitchType = SWITCH_TYPE_AUTO
|
|
ENDIF
|
|
|
|
iCurrentEvent++
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(blipCurrentObjective)
|
|
blipCurrentObjective = CREATE_BLIP_FOR_COORD(vSawmillExitPos)
|
|
ENDIF
|
|
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("FRAN2_SWFRANK")
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
//1979130: Don't allow the player to switch if all the enemies are dead and they're already playing as Franklin.
|
|
IF eCurrentPlayer != SELECTOR_PED_FRANKLIN
|
|
OR NOT bAllEnemiesAreDead
|
|
OR IS_SELECTOR_CAM_ACTIVE()
|
|
UPDATE_SHOOTOUT_SWITCH()
|
|
ENDIF
|
|
|
|
UPDATE_BUDDY_BLIPS_DURING_SHOOTOUT()
|
|
UPDATE_PLAYER_BUDDIES_DURING_SHOOTOUT()
|
|
|
|
|
|
//Display a different objective if playing as Michael
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("FRAN2_leadL")
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FRAN2_PROT]
|
|
AND NOT bMichaelIsGettingFlanked
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
PRINT_NOW("FRAN2_PROT", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[FRAN2_PROT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bHasTextLabelTriggered[FRAN2_PROT]
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("FRAN2_PROT")
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sSelectorCam, eFinalSwitchType)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
IF sSelectorCam.bOKToSwitchPed
|
|
IF NOT sSelectorCam.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
|
|
IF iHealthBeforeSwitch < 110
|
|
iHealthBeforeSwitch = 110
|
|
ENDIF
|
|
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_DIES_WHEN_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
|
|
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 5, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_DisableHurt, TRUE)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], iHealthBeforeSwitch)
|
|
SET_PED_MAX_HEALTH_WITH_SCALE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 1800)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE, -1)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed],
|
|
RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_MELEE | RBF_IMPACT_OBJECT | RBF_PED_RAGDOLL_BUMP | RBF_PLAYER_IMPACT)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
|
|
ENDIF
|
|
|
|
//TASK_AIM_GUN_AT_COORD(PLAYER_PED_ID(), <<-587.6, 5230.2, 71.4>>, -1, TRUE)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED_ID(), RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_MELEE | RBF_IMPACT_OBJECT | RBF_PED_RAGDOLL_BUMP | RBF_PLAYER_IMPACT)
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
REFRESH_BUDDY_PED_AUDIO_MIX_GROUP()
|
|
|
|
eCurrentPlayer = sSelectorPeds.eNewSelectorPed
|
|
|
|
sSelectorCam.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF VDIST2(vPlayerPos, vLamarPos) > 22500.0
|
|
MISSION_FAILED(FAILED_ABANDONED_LAMAR)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_HELP()
|
|
REMOVE_ANIM_DICT(strLamarInjuredAnims)
|
|
|
|
REMOVE_CLIP_SET("move_ped_strafing")
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
CLEAR_SELECTOR_PED_PRIORITY(sSelectorPeds)
|
|
|
|
eMissionStage = STAGE_DRIVE_HOME
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_DRIVE_HOME)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DRIVE_HOME()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bHasUsedCheckpoint
|
|
g_bFranklin2RequestedBackup = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<-577.2953, 5254.0166, 69.4656>>, 152.9580, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-577.2953, 5254.0166, 69.4656>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 152.9580)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
RESET_SHOOTOUT_VARIABLES()
|
|
|
|
IF g_bFranklin2RequestedBackup
|
|
WHILE NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
OR NOT DOES_ENTITY_EXIST(vehTrevorsCar)
|
|
SETUP_REQ_MICHAEL(vMichaelSnipePos, fMichaelSnipeHeading)
|
|
SETUP_REQ_TREVOR(<<-568.2169, 5261.1172, 69.5043>>, 178.0029)
|
|
SETUP_REQ_MICHAELS_CAR(vMichaelsCarStartPos, fMichaelsCarStartHeading)
|
|
SETUP_REQ_TREVORS_CAR(vTrevorsCarStartPos, fTrevorsCarStartHeading)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_MICHAEL_OUTFIT()
|
|
SETUP_TREVOR_OUTFIT()
|
|
ENDIF
|
|
|
|
//Stream assets.
|
|
WHILE NOT SETUP_REQ_REPLAY_CAR(vReplayCarPos, fReplayCarHeading)
|
|
OR NOT DOES_ENTITY_EXIST(sLamar.ped)
|
|
OR NOT bCreatedBallaStartCars
|
|
OR NOT DOES_ENTITY_EXIST(objShootoutCover[0])
|
|
UPDATE_SHOOTOUT_ENEMIES()
|
|
SETUP_REQ_LAMAR(<<-573.1397, 5254.3828, 69.4683>>, 145.2989)
|
|
SETUP_REQ_SHOOTOUT_COVER_OBJECTS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SETTIMERA(0)
|
|
|
|
WHILE TIMERA() < 10000
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
AND ((NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
OR IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
SETTIMERA(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
BLOCK_EMERGENCY_SERVICES_FOR_SHOOTOUT(TRUE)
|
|
BLOCK_AMBIENT_PEDS_AND_VEHICLES_FOR_SHOOTOUT(TRUE)
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(TRUE)
|
|
SETUP_REQ_BUDDIES_START_FIGHT()
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
sLamar.iEvent = 50
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
bEscapedSawmill = FALSE
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_ALERT")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_ALERT")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_PROTECT_LAMAR")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_PROTECT_LAMAR")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_TREVOR")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_TREVOR")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_SAVE_LAMAR_MICHAEL")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_SAVE_LAMAR_MICHAEL")
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sBulldozer.veh)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sBulldozer.veh)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sMichael.blip)
|
|
REMOVE_BLIP(sMichael.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sTrevor.blip)
|
|
REMOVE_BLIP(sTrevor.blip)
|
|
ENDIF
|
|
|
|
//Reset Lamar post-shootout.
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
CLEAR_PED_TASKS(sLamar.ped)
|
|
|
|
IF NOT IS_PED_GROUP_MEMBER(sLamar.ped, PLAYER_GROUP_ID())
|
|
SET_PED_AS_GROUP_MEMBER(sLamar.ped, PLAYER_GROUP_ID())
|
|
ENDIF
|
|
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sLamar.ped, RBF_NONE)
|
|
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sLamar.ped, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sLamar.ped, FALSE)
|
|
SET_ENTITY_PROOFS(sLamar.ped, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sLamar.ped, CA_DO_DRIVEBYS, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sLamar.ped, FALSE)
|
|
SET_ENTITY_PROOFS(sLamar.ped, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_PED_ALLOWED_TO_DUCK(sLamar.ped, TRUE)
|
|
SET_PED_PATH_CAN_USE_CLIMBOVERS(sLamar.ped, TRUE)
|
|
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_UseKinematicModeWhenStationary, FALSE)
|
|
SET_PED_NEVER_LEAVES_GROUP(sLamar.ped, FALSE)
|
|
ENDIF
|
|
|
|
//1979404 - Don't overwrite the replay checkpoint vehicle when hitting this checkpoint.
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FRANKLIN2_FLEE_AREA, "FLEE_AREA", TRUE, DEFAULT, DEFAULT, FALSE)
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
//Unlock the player cars
|
|
//(NOTE: this should only be done if the buddies aren't going to use them. Currently they hang back at the sawmill, but in the past they've used the vehicles to drive off).
|
|
IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehMichaelsCar, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(vehMichaelsCar, VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehTrevorsCar)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehTrevorsCar, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(vehTrevorsCar, VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
|
|
//Reset collision flags on buddies as you can no longer switch to them.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
SET_PED_USING_ACTION_MODE(sLamar.ped, TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE, -1)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
TRIGGER_MUSIC_EVENT("FRA2_FLEE_RT")
|
|
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
|
|
WAIT(1000) //Wait a bit to allow action mode to kick in.
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FRA2_RETURN_LAMAR")
|
|
ENDIF
|
|
|
|
BLOCK_ROADS_AT_SAWMILL(FALSE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(sLocatesData)
|
|
#ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLamar.blip)
|
|
REMOVE_ALL_BLIPS()
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
//If Michael and Trevor are here play dialogue saying that Franklin will take Lamar home.
|
|
IF g_bFranklin2RequestedBackup
|
|
IF NOT bHasTextLabelTriggered[LM2_TAKE] //Franklin says he'll take Lamar.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_TAKE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_TAKE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_MGOING] //Michael says he's going.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_MGOING", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_MGOING] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_LBYEM] //Lamar says bye to Michael.
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sLamar.ped)) < 400.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_LBYEM", CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[LM2_LBYEM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[LM2_LBYEM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_tbye] //Trevor says he's going.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sLamar.ped)) < 400.0
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) < 625.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_tbye", CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[LM2_tbye] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[LM2_tbye] = TRUE
|
|
bHasTextLabelTriggered[LM2_LBYET] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_LBYET] //Lamar says bye to Trevor.
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sLamar.ped)) < 625.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_LBYET", CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[LM2_LBYET] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player is in a car and Lamar isn't then play a line telling him to get in.
|
|
IF NOT bHasTextLabelTriggered[lm2_leave]
|
|
AND NOT bHasTextLabelTriggered[LM2_BANT1]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_PED_IN_ANY_VEHICLE(sLamar.ped)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "lm2_leave", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[lm2_leave] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, vGoHomePos, g_vAnyMeansLocate, TRUE, sLamar.ped, "FRAN2_getCar", "FRAN2_drvL", FALSE, TRUE)
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
IF IS_MOBILE_PHONE_CALL_ONGOING()
|
|
HANG_UP_AND_PUT_AWAY_PHONE()
|
|
ENDIF
|
|
|
|
//1984722 - Player is able to get a wanted level after hitting the locate.
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
|
|
//Dialogue after losing the cops: locates god text takes priority so check this after checking the locate.
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
AND NOT IS_PED_INJURED(sLamar.ped)
|
|
AND ARE_CHARS_SITTING_IN_SAME_VEHICLE(PLAYER_PED_ID(), sLamar.ped)
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT bHasTextLabelTriggered[LM2_BANT1]
|
|
IF bEscapedSawmill
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_BANT1", CONV_PRIORITY_MEDIUM)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_USING_ACTION_MODE(sLamar.ped, FALSE)
|
|
|
|
bHasTextLabelTriggered[LM2_BANT1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_BANT2]
|
|
IF g_bFranklin2RequestedBackup
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_BANT4", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_BANT2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_BANT5", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_BANT2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_BANT6]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_BANT6", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_BANT6] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LM2_BANT6b]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "LEM2AUD", "LM2_BANT6b", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[LM2_BANT6b] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bHasTextLabelTriggered[LM2_BANT1]
|
|
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
BOOL bHasStopped
|
|
VEHICLE_INDEX vehFinalCar
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
vehFinalCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehFinalCar)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PHONE)
|
|
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehFinalCar, DEFAULT, 5)
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
|
|
ENDIF
|
|
bHasStopped = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
|
|
ENDIF
|
|
bHasStopped = TRUE
|
|
ENDIF
|
|
|
|
IF bHasStopped
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
VECTOR vLamarPos = GET_ENTITY_COORDS(sLamar.ped)
|
|
|
|
//Check if the player escaped the sawmill:
|
|
// - Player must be at least 30m away from the mill.
|
|
// - Player must be at least 100m away from any Balla peds.
|
|
IF NOT bEscapedSawmill
|
|
VECTOR vMillCentre = <<-547.2, 5314.1, 84.7>>
|
|
|
|
PREPARE_MUSIC_EVENT("FRA2_END_VEHICLE")
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
//Play audio scene if the player is in a car
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_ESCAPE_IN_VEHICLE")
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
START_AUDIO_SCENE("FRANKLIN_2_ESCAPE_IN_VEHICLE")
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_ESCAPE_IN_VEHICLE")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VDIST2(vPlayerPos, vSawmillExitPos) > 900.0
|
|
AND VDIST2(vPlayerPos, vMillCentre) > VDIST2(vSawmillExitPos, vMillCentre)
|
|
IF VDIST2(vPlayerPos, vLamarPos) < 900.0
|
|
PED_INDEX pedNearest[5]
|
|
|
|
GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), pedNearest)
|
|
|
|
INT i = 0
|
|
BOOL bEnemyIsNearby = FALSE
|
|
REPEAT COUNT_OF(pedNearest) i
|
|
IF NOT IS_PED_INJURED(pedNearest[i])
|
|
IF GET_ENTITY_MODEL(pedNearest[i]) = modelBalla
|
|
IF VDIST2(GET_ENTITY_COORDS(pedNearest[i]), vPlayerPos) < 10000.0
|
|
bEnemyIsNearby = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT bEnemyIsNearby
|
|
IF ARE_CHARS_IN_SAME_VEHICLE(sLamar.ped, PLAYER_PED_ID())
|
|
TRIGGER_MUSIC_EVENT("FRA2_END_VEHICLE")
|
|
ELSE
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
TRIGGER_MUSIC_EVENT("FRA2_END_ON_FOOT")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_ESCAPE_IN_VEHICLE")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_ESCAPE_IN_VEHICLE")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_GO_TO_FRANKLINS")
|
|
START_AUDIO_SCENE("FRANKLIN_2_GO_TO_FRANKLINS")
|
|
ENDIF
|
|
|
|
REMOVE_ALL_SHOOTOUT_PEDS()
|
|
REMOVE_ALL_SHOOTOUT_VEHICLES()
|
|
REMOVE_ALL_SHOOTOUT_OBJECTS()
|
|
|
|
//Remove all assets from the shootout.
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBalla)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBallaReinforcementCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBallaStartCars)
|
|
REMOVE_VEHICLE_ASSET(modelBallaReinforcementCar)
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_SMG)
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_PISTOL)
|
|
|
|
BLOCK_EMERGENCY_SERVICES_FOR_SHOOTOUT(FALSE)
|
|
BLOCK_AMBIENT_PEDS_AND_VEHICLES_FOR_SHOOTOUT(FALSE)
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(FALSE)
|
|
|
|
bEscapedSawmill = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Remove the other player peds once they're far away.
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)) > 40000.0
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
IF (VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehMichaelsCar, FALSE)) > 40000.0 AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
OR VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehMichaelsCar, FALSE)) > 160000.0
|
|
REMOVE_VEHICLE(vehMichaelsCar, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)) > 40000.0
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehTrevorsCar)
|
|
IF (VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehTrevorsCar, FALSE)) > 40000.0 AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
OR VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehTrevorsCar, FALSE)) > 160000.0
|
|
REMOVE_VEHICLE(vehTrevorsCar, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehReplayCar)
|
|
IF (VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehReplayCar, FALSE)) > 40000.0 AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
OR VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehReplayCar, FALSE)) > 160000.0
|
|
REMOVE_VEHICLE(vehReplayCar, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for leaving Lamar behind.
|
|
IF NOT DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF VDIST2(vPlayerPos, vLamarPos) > 22500.0
|
|
MISSION_FAILED(FAILED_ABANDONED_LAMAR)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael behaviour: he leaves in his car.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
//New behaviour: ped stays at the sawmill (1516070).
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
|
|
IF VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), <<-587.9527, 5181.2993, 94.6509>>) > 4.0
|
|
AND NOT IS_AREA_OCCUPIED(<<-587.9527, 5181.2993, 94.6509>> - <<1.0, 1.0, 1.0>>, <<-587.9527, 5181.2993, 94.6509>> + <<1.0, 1.0, 1.0>>, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<-587.9527, 5181.2993, 94.6509>>, PEDMOVE_RUN, -1, DEFAULT, DEFAULT, 186.8357)
|
|
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Old behaviour: gets into car and drives off.
|
|
/*IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
|
|
IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehMichaelsCar)
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
|
|
TASK_VEHICLE_MISSION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehMichaelsCar, NULL, MISSION_CRUISE, 20.0, DRIVINGMODE_STOPFORCARS, 2.0, 2.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehMichaelsCar)
|
|
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehMichaelsCar, 120000)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Alternate behaviour (currently not needed as we fail for destroying the car).
|
|
ENDIF*/
|
|
ENDIF
|
|
|
|
//Trevor behaviour: he leaves in his car.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
//New behaviour: ped stays at the sawmill (1516070).
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
|
|
IF VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), <<-575.8129, 5271.7529, 69.2686>>) > 4.0
|
|
AND NOT IS_AREA_OCCUPIED(<<-575.8129, 5271.7529, 69.2686>> - <<0.5, 0.5, 1.0>>, <<-575.8129, 5271.7529, 69.2686>> + <<0.5, 0.5, 1.0>>, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-575.8129, 5271.7529, 69.2686>>, PEDMOVE_RUN, -1, DEFAULT, DEFAULT, 204.2659)
|
|
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Old behaviour: gets into car and drives off.
|
|
/*IF IS_VEHICLE_DRIVEABLE(vehTrevorsCar)
|
|
IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehTrevorsCar)
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
|
|
TASK_VEHICLE_MISSION(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehTrevorsCar, NULL, MISSION_CRUISE, 20.0, DRIVINGMODE_STOPFORCARS, 2.0, 2.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehTrevorsCar)
|
|
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehTrevorsCar, 120000)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Alternate behaviour (currently not needed as we fail for destroying the car).
|
|
ENDIF*/
|
|
ENDIF
|
|
|
|
//Request mocap cutscene in advance.
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vGoHomePos) < 15625.0
|
|
REQUEST_CUTSCENE("FRA_2_EXT")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("FRA_2_EXT")
|
|
ELIF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vGoHomePos) > 30625.0
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
eMissionStage = STAGE_OUTRO_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_OUTRO_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_OUTRO_CUTSCENE()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(vGoHomePos, 0.0, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vGoHomePos)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
WHILE NOT DOES_ENTITY_EXIST(sLamar.ped)
|
|
SETUP_REQ_LAMAR(<<-72.3909, -1461.0822, 31.1151>>, 323.4056)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETTIMERA(0)
|
|
|
|
//Stream assets.
|
|
WHILE TIMERA() < 10000
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND ((NOT IS_PED_INJURED(sLamar.ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sLamar.ped))
|
|
OR IS_PED_INJURED(sLamar.ped))
|
|
SETTIMERA(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_CUTSCENE("FRA_2_EXT")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("FRA_2_EXT")
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sLamar.ped, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 0
|
|
bSkippedMocap = FALSE
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Do any setup on first frame of cutscene.
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_2_GO_TO_FRANKLINS")
|
|
STOP_AUDIO_SCENE("FRANKLIN_2_GO_TO_FRANKLINS")
|
|
ENDIF
|
|
|
|
//Resolve vehicles
|
|
//Move the last vehicle somewhere if it's in the way.
|
|
vehFinalCutsceneCar = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehFinalCutsceneCar)
|
|
SET_VEH_RADIO_STATION(vehFinalCutsceneCar, "OFF")
|
|
SET_VEHICLE_ENGINE_ON(vehFinalCutsceneCar, FALSE, FALSE)
|
|
|
|
IF IS_ENTITY_AT_COORD(vehFinalCutsceneCar, vGoHomePos, <<20.0, 20.0, 10.0>>)
|
|
AND GET_ENTITY_MODEL(vehFinalCutsceneCar) != GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR)
|
|
PED_INDEX pedDriver
|
|
IF NOT IS_VEHICLE_SEAT_FREE(vehFinalCutsceneCar)
|
|
pedDriver = GET_PED_IN_VEHICLE_SEAT(vehFinalCutsceneCar)
|
|
ENDIF
|
|
|
|
//Don't warp if we arrived as a passenger (e.g. in a taxi ride)
|
|
IF pedDriver = NULL OR pedDriver = PLAYER_PED_ID()
|
|
SET_ENTITY_AS_MISSION_ENTITY(vehFinalCutsceneCar)
|
|
SET_ENTITY_HEADING(vehFinalCutsceneCar, 135.3133)
|
|
SET_ENTITY_COORDS(vehFinalCutsceneCar, <<-77.4702, -1472.7953, 31.0564>>)
|
|
SET_VEHICLE_DOORS_SHUT(vehFinalCutsceneCar)
|
|
SET_VEHICLE_ENGINE_ON(vehFinalCutsceneCar, FALSE, FALSE)
|
|
SET_VEHICLE_LIGHTS(vehFinalCutsceneCar, FORCE_VEHICLE_LIGHTS_OFF)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_BERD, 0, 0)
|
|
ENDIF
|
|
|
|
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
|
|
|
|
CLEAR_AREA(vGoHomePos, 200.0, TRUE)
|
|
|
|
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
|
|
DO_FADE_IN_WITH_WAIT() //In case this is a mission replay, the game will be faded out at this point
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
SETTIMERB(0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF TIMERB() < 500
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
|
|
ENDIF
|
|
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
|
|
IF TIMERB() > 4000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000, 0.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sLamar.ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar")
|
|
SET_ENTITY_COORDS(sLamar.ped, <<-72.3909, -1461.0822, 31.1151>>)
|
|
SET_ENTITY_HEADING(sLamar.ped, 323.4056)
|
|
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sLamar.ped, <<-83.6490, -1437.1771, 30.3611>>, PEDMOVE_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
|
|
|
|
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_BERD, 1, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
|
|
REMOVE_VEHICLE(vehFinalCutsceneCar, FALSE)
|
|
REMOVE_PED(sLamar.ped, TRUE)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
IF GET_ACCOUNT_BALANCE(BANK_ACCOUNT_FRANKLIN) > 50
|
|
DEBIT_BANK_ACCOUNT(CHAR_FRANKLIN,BAAC_UNLOGGED_SMALL_ACTION,50)
|
|
ENDIF
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
MISSION_PASSED()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Fail checks that are relevant across the entire mission or over a number of stages.
|
|
PROC DO_GLOBAL_FAIL_CHECKS()
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
MISSION_FAILED(FAILED_FRANKLIN_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
MISSION_FAILED(FAILED_MICHAEL_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
MISSION_FAILED(FAILED_TREVOR_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sLamar.ped)
|
|
AND IS_PED_INJURED(sLamar.ped)
|
|
MISSION_FAILED(FAILED_LAMAR_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
AND NOT IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
|
|
MISSION_FAILED(FAILED_MICHAELS_CAR_DESTROYED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehTrevorsCar)
|
|
AND NOT IS_VEHICLE_DRIVEABLE(vehTrevorsCar)
|
|
MISSION_FAILED(FAILED_TREVORS_CAR_DESTROYED)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks stats that are applicable across multiple mission stages.
|
|
PROC DO_GLOBAL_STAT_CHECKS()
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), FRA2_DAMAGE)
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
//Track the vehicle speed/damage stat.
|
|
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
|
|
OR NOT IS_ENTITY_A_VEHICLE(g_MissionStatSingleDamageWatchEntity)
|
|
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleDamageWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity) != veh)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(veh, FRA2_CAR_DAMAGE)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleSpeedWatchEntity)
|
|
OR NOT IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity)
|
|
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleSpeedWatchEntity) != veh)
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(veh)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Track the player damage stat.
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
|
|
OR NOT IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity)
|
|
OR (IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity) AND GET_PED_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity) != PLAYER_PED_ID())
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), FRA2_DAMAGE)
|
|
ENDIF
|
|
|
|
//Remove any vehicles from the speed tracking stat.
|
|
IF g_MissionStatSingleSpeedWatchEntity != NULL
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PROC UPDATE_WIDGETS()
|
|
iDebugMichaelRoute = ENUM_TO_INT(eMichaelRoute)
|
|
iDebugFranklinRoute = ENUM_TO_INT(eFranklinRoute)
|
|
iDebugTrevorRoute = ENUM_TO_INT(eTrevorRoute)
|
|
iDebugPlayerRoute = ENUM_TO_INT(ePlayerRoute)
|
|
ENDPROC
|
|
|
|
PROC DO_DEBUG()
|
|
UPDATE_WIDGETS()
|
|
|
|
//Reset any skipping from the previous frame
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
|
|
PRINTLN("Franklin2.sc - Player S-passed the mission.")
|
|
|
|
MISSION_PASSED(TRUE)
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
|
|
PRINTLN("Franklin2.sc - Player F-failed the mission.")
|
|
|
|
MISSION_FAILED(FAILED_GENERIC)
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
PRINTLN("Franklin2.sc - Player J-skipped.")
|
|
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
|
PRINTLN("Franklin2.sc - Player P-skipped.")
|
|
|
|
//Work out which stage we want to reach based on the current stage
|
|
INT iCurrentStage = ENUM_TO_INT(eMissionStage)
|
|
|
|
IF iCurrentStage > 0
|
|
MISSION_STAGE eStage = INT_TO_ENUM(MISSION_STAGE, iCurrentStage - 1)
|
|
|
|
JUMP_TO_STAGE(eStage, TRUE)
|
|
ELSE
|
|
JUMP_TO_STAGE(STAGE_INTRO_CUTSCENE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage, 0, FALSE, "", TRUE, FALSE, KEY_Z, KEYBOARD_MODIFIER_NONE, TRUE, FALSE, 0.9)
|
|
PRINTLN("Franklin2.sc - Player Z-skipped.")
|
|
|
|
MISSION_STAGE eStage = INT_TO_ENUM(MISSION_STAGE, iDebugJumpStage)
|
|
JUMP_TO_STAGE(eStage, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
SCRIPT
|
|
SET_MISSION_FLAG(TRUE)
|
|
|
|
IF HAS_FORCE_CLEANUP_OCCURRED()
|
|
Mission_Flow_Mission_Force_Cleanup()
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
MISSION_CLEANUP()
|
|
ENDIF
|
|
|
|
MISSION_SETUP()
|
|
bHasUsedCheckpoint = JUMP_TO_CHECKPOINT()
|
|
|
|
//If the player triggered the mission from the blip then keep them blocked until the cutscene loads.
|
|
IF NOT bHasUsedCheckpoint
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
ENDIF
|
|
|
|
WHILE (TRUE)
|
|
WAIT(0)
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_LamarDown")
|
|
|
|
IF bHasUsedCheckpoint
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
bHasUsedCheckpoint = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DO_GLOBAL_FAIL_CHECKS()
|
|
DO_GLOBAL_STAT_CHECKS()
|
|
|
|
//Main stages
|
|
SWITCH eMissionStage
|
|
CASE STAGE_INTRO_CUTSCENE
|
|
DO_INTRO_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_MEET_THE_CREW
|
|
MEET_THE_CREW()
|
|
BREAK
|
|
|
|
CASE STAGE_MEET_CREW_CUTSCENE
|
|
MEET_CREW_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_GET_INTO_POSITION
|
|
GET_INTO_POSITION()
|
|
BREAK
|
|
|
|
CASE STAGE_ATTACK_SAWMILL
|
|
ATTACK_SAWMILL()
|
|
BREAK
|
|
|
|
CASE STAGE_GET_LAMAR_OUT
|
|
GET_LAMAR_OUT()
|
|
BREAK
|
|
|
|
CASE STAGE_DRIVE_HOME
|
|
DRIVE_HOME()
|
|
BREAK
|
|
|
|
CASE STAGE_OUTRO_CUTSCENE
|
|
DO_OUTRO_CUTSCENE()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DO_DEBUG()
|
|
#ENDIF
|
|
ENDWHILE
|
|
ENDSCRIPT
|
|
|