// ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // 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(<>)) 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