Files
gtav-src/script/dev_ng/singleplayer/scripts/heists/heistFinale/finale_heist2B.sc
T
2025-09-29 00:52:08 +02:00

26583 lines
1.1 MiB
Plaintext
Executable File

// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : finale_heist2B.sc
// AUTHOR : Matthew Booton
// DESCRIPTION : Franklin and the crew drill from an underground tunnel into
// the bank vault to collect the gold. Trevor collects the gold
// in a chopper. Michael causes a distraction in the main bank,
// Franklin goes to rescue him, and a shootout
// ensues until they reach a car park. Trevor flies in to collect
// them, and has to lose the cops in the chopper.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//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 "chase_hint_cam.sch"
USING "dialogue_public.sch"
USING "locates_public.sch"
USING "flow_public_game.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 "script_drawing.sch"
USING "selector_public.sch"
USING "locates_public.sch"
USING "replay_public.sch"
USING "cutscene_public.sch"
USING "CompletionPercentage_public.sch"
USING "taxi_functions.sch"
USING "cam_recording_public.sch"
USING "shop_public.sch"
USING "stripclub_public.sch"
USING "heist_end_screen.sch"
USING "rappel_public.sch"
USING "achievement_public.sch"
USING "clearmissionarea.sch"
USING "Timelapse.sch"
USING "spline_cam_edit.sch"
// total should not exceed 225
CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 5
CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 5
CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 5
// total should not exceed 12
CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 2
CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 5
// this should be fine
CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 5
USING "traffic.sch"
#IF IS_DEBUG_BUILD
USING "shared_debug.sch"
USING "script_debug.sch"
USING "select_mission_stage.sch"
#ENDIF
ENUM MISSION_STAGE
STAGE_START_CUTSCENE,
STAGE_GO_TO_BANK,
STAGE_DRILL_THROUGH_WALL,
STAGE_BLOW_UP_DOORS,
STAGE_COLLECT_GOLD,
STAGE_WINCH_GOLD_CUTSCENE,
STAGE_TUNNEL_SHOOTOUT,
STAGE_LEAVE_BANK,
STAGE_CITY_SHOOTOUT,
STAGE_CITY_SHOOTOUT_MID_POINT,
STAGE_LOSE_COPS,
STAGE_CHOPPER_CHASE,
STAGE_DROP_GOLD_ON_TRAIN,
STAGE_DROP_GOLD_ON_TRAIN_CUTSCENE,
STAGE_LAND_AT_AIRFIELD,
STAGE_END_CUTSCENE,
STAGE_DEBUG_RECORD_HELI_CHASE_SETPIECES,
STAGE_DEBUG_RECORD_CAMERA,
STAGE_DEBUG_PLAYBACK_CAMERA,
STAGE_DEBUG_RECORD_HELI_TRAIN_HOVER,
STAGE_DEBUG_RECORD_GOLD_DROP
ENDENUM
ENUM FAILED_REASON
FAILED_GENERIC = 0,
FAILED_FRANKLIN_DIED,
FAILED_MICHAEL_DIED,
FAILED_TREVOR_DIED,
FAILED_CREW_MEMBER_DIED,
FAILED_CREW_MEMBERS_DIED,
FAILED_LOST_CREW_MEMBER,
FAILED_LOST_CREW_MEMBERS,
FAILED_ALERTED_BANK,
FAILED_DESTROYED_START_CAR,
FAILED_DESTROYED_END_CAR,
FAILED_DESTROYED_TREVORS_CAR,
FAILED_DESTROYED_FRANKLINS_CAR,
FAILED_DESTROYED_FORKLIFT,
FAILED_DESTROYED_CHOPPER,
FAILED_STUCK_START_CAR,
FAILED_STUCK_FORKLIFT,
FAILED_STUCK_CHOPPER,
FAILED_STUCK_CUTTER,
FAILED_RAN_OUT_OF_CHARGES,
FAILED_LEFT_CHOPPER_BEHIND,
FAILED_ABANDONED_CREW_IN_TUNNELS,
FAILED_ABANDONED_CREW_IN_SHOOTOUT,
FAILED_ABANDONED_CREW_IN_CHASE,
FAILED_MISSED_TRAIN,
FAILED_ABANDONED_HEIST,
FAILED_LESTER_DIED,
FAILED_ABANDONED_LESTER,
FAILED_CUTTER_BLOCKING_TUNNEL,
FAILED_TROLLEY_DETACHED,
FAILED_DIDNT_KILL_MERRYWEATHER,
FAILED_BAILED_OUT_OF_CHOPPER
ENDENUM
ENUM SECTION_STAGE
SECTION_STAGE_SETUP = 0,
SECTION_STAGE_RUNNING,
SECTION_STAGE_CLEANUP,
SECTION_STAGE_SKIP
ENDENUM
ENUM CREW_HELI_STAGE
HELI_STAGE_FLY_TO_BANK,
HELI_STAGE_WAIT_FOR_TREVOR,
HELI_STAGE_HOVER_OVER_TUNNEL,
HELI_STAGE_LEAVE_BANK
ENDENUM
ENUM ROCKET_LINE_UP_STATE
LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE,
LINE_UP_DONT_FIRE_TOO_FAR_AWAY_RIGHT_SIDE,
LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE,
LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE,
LINE_UP_FIRE_MISS_LEFT_SIDE,
LINE_UP_FIRE_MISS_RIGHT_SIDE,
LINE_UP_FIRE_LEFT_SIDE,
LINE_UP_FIRE_RIGHT_SIDE
ENDENUM
ENUM ROCKET_ANIM_STATE
ROCKET_ANIM_USING_AI,
ROCKET_ANIM_GET_LAUNCHER_OUT_THEN_AIM,
ROCKET_ANIM_PUT_LAUNCHER_AWAY,
ROCKET_ANIM_GET_CLOSER_THEN_AIM,
ROCKET_ANIM_RELOAD_THEN_AIM,
ROCKET_ANIM_AIMING
ENDENUM
ENUM ENEMY_HELI_STATE
ENEMY_HELI_PLAY_RECORDING,
ENEMY_HELI_ATTACK_HIGH,
ENEMY_HELI_ATTACK_LOW,
ENEMY_HELI_BLOW_UP
ENDENUM
ENUM TRIGGERED_TEXT_LABEL
BS2B_CRGOLD1 = 0,
BS2B_CRGOLD2,
F3B_ROCHELP,
BS2B_RELOAD,
BS2B_GOSHOT,
BS2B_FLYLOW,
BS2B_MSWITCH,
F3B_GOTOMICH,
BS2B_TLEAVE,
BS2B_BCOPS,
BS2B_CRCOPS4,
BS2B_GOTIT,
BS2B_GOGOBRIDGE,
BS2B_BRIDG2,
BS2B_BRIDGE,
BS2B_BHELI,
BS2B_GOGO4,
BS2B_HIGH,
BS2B_LEFTRAMP,
BS2B_NOLORAMP,
BS2B_HIGH2,
BS2B_TOP,
BS2B_WAITRAMP,
BS2B_GOGOSTAIRS,
BS2B_PHELI,
BS2B_GOGOPLAZA,
BS2B_RIGHTPLAZA,
BS2B_COVER,
BS2B_HELI2,
BS2B_DBRID,
BS2B_DRAMP,
BS2B_GOGO5,
BS2B_MERRY,
BS2B_PDOWN,
BS2B_BACK,
BS2B_WAITCOURT,
BS2B_GOGO8,
BS2B_GOGO9,
BS2B_GOGOMERRY,
BS2B_RIGHTRAMP,
BS2B_CPARK,
BS2B_CPARK2,
BS2B_WAGON,
BS2B_CPUSH1,
BS2B_CPUSH2,
BS2B_CPUSH3,
BS2B_STAIRS,
F3B_SWIFRAN,
BS2B_BORE,
BS2B_WALL,
BS2B_DRIL,
F3B_DRILL,
F3B_DRILLHELP,
BS2B_REM,
BS2B_WAY,
BS2B_HOLD,
BS2B_INTO,
BS2B_MADE,
BS2B_BACKDRILL,
BS2B_BUP,
BS2B_JAM,
F3B_CUTOUT,
BS2B_BLIMIT,
F3B_CHARGE,
BS2B_BLOW,
BS2B_TWO,
BS2B_OUT,
F3B_CHARGE2,
BS2B_SET,
BS2B_ONE,
BS2B_OPEN,
F3B_ABANCREW,
BS2B_TAKE,
BS2B_GEN,
BS2B_BCOPS2,
F3B_FORKHELP1,
F3B_GETGOLD,
F3B_TAKEGOLD,
BS2B_THELI,
F3B_FORKLIFT,
F3B_FORKLIFTB,
BS2B_CRFORK2,
BS2B_CRFORK,
BS2B_BCOPS3,
F3B_DEFGOLD2,
BS2B_OPENTUNNEL,
F3B_DEFGOLD,
BS2B_TFIGHT,
BS2B_TRAPPEL,
F3B_SWITREV,
BS2B_USURE,
BS2B_GOBACK,
BS2B_SEE,
BS2B_CHP,
BS2B_FRANARR,
BS2B_MERCOV,
BS2B_MENT1,
BS2B_MENT2,
BS2B_SCHAT,
BS2B_DOWN1,
BS2B_DOWN2,
BS2B_DOWN3,
BS2B_DOWN4,
BS2B_JACK,
BS2B_JACK2,
BS2B_GETCAR,
BS2B_VSAFE,
BS2B_GO,
BS2B_VSAFEM,
BS2B_RADIO,
BS2B_LOST,
BS2B_INFO,
F3B_FOLLOWCREW,
BS2B_SEES,
BS2B_LSEES,
BS2B_DROP,
BS2B_TREVOR,
BS2B_REPLY,
BS2B_RESPOND,
BS2B_NOSM,
BS2B_WIND,
BS2B_HLP2,
BS2B_OVER,
BS2B_TRB,
BS2B_BEFORE,
BS2B_CRS,
BS2B_SAF,
BS2B_DOWN,
BS2B_BAD,
F3B_DROPHELP,
BS2B_NODROP,
BS2B_YESDROP,
BS2B_PACK1,
BS2B_PACK2,
BS2B_MOREGARAGE,
BS2B_MOVE1,
BS2B_MOVE2,
BS2B_LOGIC,
BS2B_RENT,
BS2B_FRANK,
BS2B_MBANK,
BS2B_MBANK_PRELOAD,
BS2B_BANK,
BS2B_SWITCH,
BS2B_GOGO,
BS2B_MORE1,
BS2B_MORE2,
BS2B_MORE3,
BS2B_COM1,
BS2B_COM2,
BS2B_COM3,
BS2B_CHAT,
BS2B_OTH,
BS2B_OKAY,
BS2B_NSWITCH,
BS2B_AIR,
BS2B_DIDIT,
BS2B_WOO,
BS2B_DRIVE,
BS2B_TALK,
BS2B_SEEAIR,
BS2B_TRN,
BS2B_CLEAR,
BS2B_HEAR,
BS2B_HEAR2,
BS2B_HEAR3,
BS2B_HEAR4,
BS2B_HEAR5,
BS2B_POLICE,
BS2B_POLICE2,
BS2B_MTL1,
BS2B_MTL2,
POLICE_REPORT_1,
POLICE_REPORT_2,
POLICE_REPORT_3,
POLICE_REPORT_4
ENDENUM
STRUCT MISSION_VEHICLE
VEHICLE_INDEX veh
BLIP_INDEX blip
INT i_event
ENDSTRUCT
STRUCT MISSION_PED
PED_INDEX ped
BLIP_INDEX blip
INT i_event
ENDSTRUCT
STRUCT BUDDY_DATA
PED_INDEX ped
PED_INDEX ped_current_target
BLIP_INDEX blip
COVERPOINT_INDEX cover
INT i_event
INT i_timer
INT i_fire_timer
INT i_sync_scene
BOOL b_is_waypoint_aiming
BOOL b_refresh_tasks //For shootouts involving player peds their tasks need to be checked constantly in case you switch to them. This flag is used to force an update of tasks if necessary.
BOOl b_is_using_secondary_cover
VECTOR v_dest
ENDSTRUCT
STRUCT ENEMY_DATA
PED_INDEX ped
PED_INDEX ped_current_target
BLIP_INDEX blip
COVERPOINT_INDEX cover
BOOL b_is_created
BOOL b_has_started_rope_jump
INT i_event
INT i_timer
INT i_rope_event
VECTOR v_dest
AI_BLIP_STRUCT s_blip_data
ENDSTRUCT
STRUCT ROPE_DATA
ROPE_INDEX rope
BOOL b_is_attached
BOOL b_attached_object_is_ready
ENDSTRUCT
STRUCT ROCKET_DATA
OBJECT_INDEX obj
ENTITY_INDEX entity_owner
VEHICLE_INDEX veh_target
VECTOR v_dir
VECTOR v_start
VECTOR v_rot
VECTOR v_offset
VECTOR v_vel
VECTOR v_prev_pos
BOOL b_reached_target
BOOL b_add_entity_speed
BOOL b_rocket_belongs_to_player
INT i_explode_timer
INT i_sound
FLOAT f_speed_multiplier
PTFX_ID ptfx
ENDSTRUCT
BOOL b_is_jumping_directly_to_stage = FALSE
BOOL b_picked_good_driver = FALSE
BOOL b_crew_driver_set_to_die = FALSE
BOOL b_force_train_creation = FALSE
BOOL b_picked_good_franklin_gunman = FALSE
BOOL b_picked_good_michael_gunman = FALSE
BOOL b_mission_failed = FALSE
BOOL b_vault_door_blown_up[2]
//BOOL b_played_line_up_dialogue = FALSE
BOOL b_cutter_warped = FALSE
BOOL b_crew_gold_dropped_onto_train = FALSE
BOOL b_skipped_mocap = FALSE
BOOL b_reset_decals_in_cutscene = FALSE
BOOL b_players_car_exit_state_hit = FALSE
//BOOL b_attached_pallet_to_forklift = FALSE
BOOL b_player_jumped_over_wall = FALSE
BOOl b_crew_have_reached_bridge = FALSE
BOOL b_buddy_crossed_bridge = FALSE
BOOL b_crew_member_crossed_bridge = FALSE
BOOl b_created_car_park_cars = FALSE
BOOL b_reached_end_of_shootout = FALSE
BOOL b_spin_cutter_blades = FALSE
//BOOL b_allow_ambience_during_shootout = TRUE
BOOL b_player_primed_to_die = FALSE
BOOL b_trolley_sequence_is_being_blocked = FALSE
BOOL b_crew_nearly_finished_trolleys = FALSE
BOOL b_merry_heli_is_active = FALSE
BOOL b_traffic_enabled_for_shootout = FALSE
BOOL b_player_got_to_bridge = FALSE
BOOL b_cleared_first_section_corpses = FALSE
BOOL b_performed_rayfire_force_reset = FALSE
BOOL b_switch_has_been_unpaused = FALSE
BOOL b_buddy_is_going_to_car_park = FALSE
BOOL b_ramp_heli_is_active = FALSE
BOOL b_has_used_checkpoint = FALSE
BOOL b_gold_trolley_warped_for_anim = FALSE
BOOL b_played_wait_line = FALSE
BOOL b_crew_member_is_in_audio_group = FALSE
BOOL b_mission_passed_screen_displayed = FALSE
BOOL b_allow_any_vehicle_for_getaway = FALSE
BOOL b_set_improved_heli_handling = FALSE
BOOL b_trevor_chopper_too_high = FALSE
BOOL b_play_too_high_response = FALSE
BOOL b_turned_on_heli_engine = FALSE
BOOL b_cops_relationship_still_active = FALSE
BOOL b_vehicle_gen_set_to_unavailable = FALSE
BOOL b_has_changed_clothes_michael = FALSE
BOOL b_has_changed_clothes_franklin = FALSE
BOOL b_has_changed_clothes_trevor = FALSE
BOOL b_player_got_close_enough_to_train = FALSE
BOOL b_replay_event_started = FALSE
BOOL b_were_ipls_reset_early = FALSE
BOOL b_moved_doors_out_of_way[2]
BOOL b_has_text_label_triggered[180]
BOOL bRecordSomeRappelling = FALSE
BOOL bHasFirstPersonFlashTriggered = FALSE
//BOOL b_disable_climbing = FALSE
CONST_FLOAT ROPE_MIN_LENGTH 4.0
CONST_FLOAT ROPE_MAX_LENGTH 16.0
CONST_FLOAT ROPE_START_LENGTH 4.0
CONST_FLOAT ROPE_SPEED 3.5
CONST_FLOAT CONTAINER_WEIGHT 20.0
FLOAT f_chase_playback_speed = 0.0
FLOAT f_chase_playback_time = 0.0
FLOAT f_crew_shootout_start_heading = 112.2401
FLOAT f_michael_shootout_start_heading = 116.8722
FLOAT f_cutter_heading_after_drilling = 98.3992
FLOAT f_heli_hover_speed = 1.0
FLOAT f_crew_heli_speed = 1.0
FLOAT f_cutter_start_heading = 216.5789//220.3114
FLOAT f_current_train_speed = 0.0
FLOAT f_bridge_heli_playback_speed = 1.0
FLOAT f_merry_heli_playback_speed = 1.0
FLOAT f_heli_bridge_2_playback_speed = 1.0
FLOAT f_heli_ramp_playback_speed = 1.0
FLOAT f_prev_distance_from_cutter_to_wall = 0.0
FLOAT f_merry_heli_rocket_multiplier = 0.0
FLOAT f_cutter_playback_speed = 0.0
FLOAT f_current_buddy_chopper_health = 0.0
//FLOAT f_forklift_playback_speed = 1.0
CONST_INT CREW_DRIVER_ID 0
CONST_INT CREW_TRAIN_DRIVER_ID 1
CONST_INT CREW_FRANKLIN_ID 2
CONST_INT CREW_MICHAEL_ID 3
CONST_INT CARREC_HELI_CHASE_TRIGGER 1
CONST_INT CARREC_HOVER_TRAIN 101
CONST_INT CARREC_HOVER_TRAIN_HELI 102
CONST_INT CARREC_HOVER_TRAIN_GOLD 103
CONST_INT CARREC_FORKLIFT 500
CONST_INT CARREC_HELI_ARRIVE_TREVOR 501
CONST_INT CARREC_HELI_ARRIVE_CREW 502
CONST_INT CARREC_CREW_DRIVE_CUTTER 505
CONST_INT CARREC_TREVOR_ARRIVE 510
CONST_INT CARREC_TREVOR_ARRIVE_CREW 511
CONST_INT CARREC_TREVOR_COLLECT_GOLD 520
CONST_INT CARREC_CREW_COLLECT_GOLD 521
CONST_INT CARREC_CREW_HELI_COLLECT_GOLD 530
CONST_INT CARREC_CUTTER_LEAVE 550
CONST_INT CARREC_CUTTER_ENTER 551
CONST_INT CARREC_CUTTER_LEAD_UP 552
CONST_INT CARREC_COPS_CAR_PARK_1 621
CONST_INT CARREC_COPS_CAR_PARK_2 622
CONST_INT CARREC_COPS_CAR_PARK_3 624
CONST_INT CARREC_COPS_CAR_PARK_GROUND 601
CONST_INT CARREC_COPS_HELI_BRIDGE 606
CONST_INT CARREC_COPS_HELI_CAR_PARK 607
CONST_INT CARREC_COPS_HELI_BRIDGE_2 609
CONST_INT CARREC_COPS_HELI_RAMP 611
CONST_INT CARREC_COPS_HELI_COURTYARD 615
CONST_INT CARREC_MERRY_HELI 623
CONST_INT CARREC_COPS_BRIDGE_1 630
CONST_INT CARREC_COPS_BRIDGE_2 631
CONST_INT CARREC_COPS_BRIDGE_3 632
CONST_INT CARREC_COPS_BRIDGE_4 633
CONST_INT CARREC_COPS_BRIDGE_5 634
CONST_INT CARREC_COPS_BRIDGE_6 635
CONST_INT CARREC_COPS_BLOCKADE_1 640
CONST_INT CARREC_COPS_BLOCKADE_2 641
CONST_INT CARREC_COPS_BLOCKADE_3 645
CONST_INT CARREC_COPS_BEFORE_CAR_PARK_1 650
CONST_INT CARREC_COPS_BEFORE_CAR_PARK_2 651
CONST_INT CARREC_COPS_BEFORE_CAR_PARK_3 652
CONST_INT CARREC_COPS_BEFORE_CAR_PARK_4 653
CONST_INT CARREC_COPS_RAMP_1 642
CONST_INT CARREC_COPS_RAMP_2 643
CONST_INT CARREC_HELI_LEAVE 700
CONST_INT CARREC_HELI_LEAVE_2 701
CONST_INT CARREC_CAR_LEAVE 702
CONST_INT CARREC_CHASE_CAM_ANGLE_1 900
CONST_INT CHECKPOINT_DRILL 1
CONST_INT CHECKPOINT_TUNNEL_SHOOTOUT 2
CONST_INT CHECKPOINT_CITY_SHOOTOUT 3
CONST_INT CHECKPOINT_CITY_SHOOTOUT_MID 4
CONST_INT CHECKPOINT_LOSE_COPS 5
CONST_INT CHECKPOINT_HELI_CHASE 6
CONST_INT CHECKPOINT_DROPOFF_GOLD 7
CONST_INT CHECKPOINT_FLY_BACK 8
CONST_INT SWAT_SPEAKER_1 3
CONST_INT SWAT_SPEAKER_2 4
CONST_INT SWAT_SPEAKER_3 5
CONST_INT MAX_NUM_CHOPPERS_IN_CHASE 3
CONST_INT GOLD_TROLLEY_BONE_GRIP_LEFT 14991
CONST_INT GOLD_TROLLEY_BONE_GRIP_RIGHT 50415
CONST_INT ROPES_REFVELOCITY_COLLIDERORDER 2
CONST_INT MAX_OVERALL_TAKE 201600000
INT i_current_event = 0
INT i_lose_cops_event = 0
INT i_timelapse_timer = 0
INT i_time_since_player_last_shot = 0
INT i_michael_headset_dialogue_timer = 0
INT i_gunman_trouble_dialogue_timer = 0
INT i_switch_stage = 0
INT i_health_before_switch = 0
INT i_current_chopper_wave = 0
INT i_player_rocket_event = 0
//INT i_enemy_rocket_event = 0
INT i_heli_explosion_timers[MAX_NUM_CHOPPERS_IN_CHASE]
//INT i_time_since_gold_not_attached = 0
//INT i_time_since_last_chopper_exploded = 0
//INT i_time_since_last_rocket_missed = 0
INT i_cutter_sound_id = 0
INT i_gold_container_sound_id = 0
INT i_rocket_timer = 0
INT i_num_rockets_for_current_target = 0
INT i_more_cops_dialogue_timer = 0
INT i_bank_door_hashes[10]
INT i_vault_blip_timer[2]
INT i_vault_blip_remove_timer[2]
//INT i_chase_cops_dialogue_timer = 0
//INT i_chase_cops_dialogue_event = 0
INT i_player_combat_dialogue_timer = 0
INT i_buddy_combat_dialogue_timer = 0
INT i_combat_dialogue_wait_time = 0
//INT i_swat_dialogue_timer = 0
INT i_prev_num_sticky_bombs = 0
INT i_time_of_last_sticky_bomb_throw = 0
//INT i_gunman_forklift_dialogue_timer = 0
INT i_shootout_end_timer = 0
INT i_lester_rocket_anim_event = 0
INT i_lester_rocket_sync_scene = 0
INT i_current_lester_target = 0
INT i_rocket_line_up_dialogue_timer = 0
INT i_shoot_rocket_wait_timer = 0
INT i_shootout_fail_index = 0
INT i_time_since_last_bomb_activity = 0
//INT i_time_since_bomb_section_started = 0
INT i_switch_timer = 0
INT i_switch_dialogue_timer = 0
INT i_current_music_event = 0
INT i_trevor_switch_event = 0
INT i_shootout_ascend_audio_event = 0
INT i_cutter_pos_index = 0
INT i_rope_detach_timer = 0
INT i_tunnel_navmesh_block = -1
INT i_bridge_navmesh_block = -1
INT i_stairs_navmesh_block = -1
INT i_ramp_navmesh_block_1 = -1
INT i_ramp_navmesh_block_2 = -1
INT i_time_last_chopper_killed = 0
INT i_displayed_take = 0
INT i_current_take = 0
INT i_max_take_considering_crew = 0
INT i_take_penalty_crew_died = 0
INT i_main_conversation_timer = 0
INT i_fall_behind_chase_timer = 0
INT i_num_times_played_fall_behind_dialogue = 0
INT i_time_plaza_heli_blew_up = 0
INT i_lose_cops_dialogue_timer = 0
INT i_num_lose_cops_lines_played = 0
INT i_time_ramp_heli_blew_up = 0
INT i_time_bridge_heli_blew_up = 0
INT i_time_merry_heli_blew_up = 0
INT i_time_crew_gold_dropped = 0
INT i_wait_dialogue_timer = 0
INT i_time_train_help_displayed = 0
INT i_time_train_help_cleared = 0
INT i_crew_wait_dialogue_timer = 0
INT i_crew_franklin_default_accuracy = 5
INT i_crew_michael_default_accuracy = 5
INT i_cutscene_request_delay_timer = 0
INT i_door_force_timer[2]
TEXT_LABEL str_crew_names[4]
STRING str_carrec = "finheistb"
STRING str_waypoint_crew_shootout = "FinHeistB01"
STRING str_waypoint_heli_end = "FinHeistB10"
STRING str_waypoint_gold_enter_left = "FinHeistB20"
STRING str_waypoint_gold_exit_left = "FinHeistB23"
STRING str_waypoint_gold_enter_right = "FinHeistB22"
STRING str_waypoint_gold_exit_right = "FinHeistB21"
STRING str_waypoint_vault_charge_left = "finheistb30"
STRING str_waypoint_vault_charge_right = "finheistb31"
STRING str_fail_label = ""
STRING str_dialogue_block = "BS2BAUD"
STRING str_anim_cutter = "vehicle_cutter"
STRING str_anim_ig_2 = "missbigscore2big_2"
STRING str_mocap_int = "bs_2b_mcs_3"
STRING str_anim_rockets = "missbigscore2big_5"
STRING str_anim_rocket_reload = "missbigscore2big_6"
STRING str_anim_rocket_signal = "missbigscore2big_7_p2"
STRING str_anim_trolley_push_out = "missbigscore2big_11"
STRING str_anim_trolley_push_in = "missbigscore2big_13"
STRING str_anim_custom_switch = "missbigscore2big_16_switch"
STRING str_anim_custom_switch2 = "VEH@BULLDOZER@BASE" //"missah_3aig_25_switch"
STRING str_anim_cam_shake = "shake_cam_all@"
STRING str_waypoint_shootout_route = "FinHeistB50"
STRING str_anim_crew_action_idle = "MOVE_ACTION@P_M_ONE@ARMED@1H@IDLE@HIGH_ENERGY@D"
VECTOR v_zero = <<0.0, 0.0, 0.0>>
VECTOR v_outside_bank = <<-12.3722, -740.1751, 43.1717>>
VECTOR v_inside_bank = <<5.8424, -708.3293, 44.9716>>
VECTOR v_gold_pickup_pos = <<24.76, -636.02, 29.36>>
//VECTOR v_gold_dropoff_pos = <<24.76, -636.02, 16.36>>
VECTOR v_michael_shootout_start_pos = <<-1.1965, -664.0656, 48.4766>>
VECTOR v_gunman_shootout_start_pos = <<-2.6696, -670.0996, 48.4902>>
VECTOR v_cutter_start_pos = <<-1.6528, -619.2049, 14.6747>>//<<6.2154, -631.0806, 14.9017>>
VECTOR v_airfield_pos = <<2150.8811, 4811.9429, 40.1960>>
VECTOR v_cutter_pos_after_drilling = <<17.2666, -632.8779, 15.1200>> //<<11.5074, -635.8491, 15.0882>>
VECTOR v_vault_gate_pos_1 = <<3.0, -660.1, 16.4>>
VECTOR v_vault_gate_pos_2 = <<7.8, -663.5, 16.4>>
VECTOR v_vault_door_pos = <<-1.7, -686.5, 16.7>>
VECTOR v_vault_area_centre = <<10.6678, -644.2510, 15.0870>>
VECTOR v_rope_heli_attach_offset = <<0.0, 1.0, -0.25>>
VECTOR v_trolley_attach = <<0.0, 1.5444, -0.6>>
VECTOR v_trolley_left_hand_attach = <<0.0, 0.0, -0.1>>//<<-0.762, 0.559, 0.822>>
VECTOR v_trolley_right_hand_attach = <<0.0, 0.0, -0.1>>//<<-0.782, -0.539, 0.822>>
//VECTOR v_prev_winch_helper_pos = <<0.0, 0.0, 0.0>>
//VECTOR v_prev_winch_helper_dir = <<0.0, 0.0, 0.0>>
//VECTOR v_current_rocket_offset = <<0.0, 0.0, 0.0>>
VECTOR v_last_cutter_pos[4]
BLIP_INDEX blip_current_objective
BLIP_INDEX blip_gold
BLIP_INDEX blip_vault_doors[2]
BLIP_INDEX blip_chase_cops[MAX_NUM_CHOPPERS_IN_CHASE]
CAMERA_INDEX cam_main
CAMERA_INDEX cam_interp
CAMERA_INDEX cam_attach
CAMERA_INDEX cam_chase
//CAMERA_INDEX cam_lookat
//CAMERA_INDEX cam_lookat_start
//CAMERA_INDEX cam_lookat_end
//GROUP_INDEX group_player
//GROUP_INDEX group_swat_line
COVERPOINT_INDEX cover_rubble[3]
COVERPOINT_INDEX cover_shootout[4]
COVERPOINT_INDEX cover_tunnel[2]
COVERPOINT_INDEX cover_player
INTERIOR_INSTANCE_INDEX interior_tunnels[2]
INTERIOR_INSTANCE_INDEX interior_vault
OBJECT_INDEX obj_gold_trolleys[2]
OBJECT_INDEX obj_rope_weights[2]
OBJECT_INDEX obj_tunnel_crates[1] //May need to be increased.
OBJECT_INDEX obj_pallets[2]
OBJECT_INDEX obj_gold_containers[2]
OBJECT_INDEX obj_vault_gates[2]
OBJECT_INDEX obj_lesters_rpg
OBJECT_INDEX obj_single_rocket
OBJECT_INDEX obj_rope_hook
OBJECT_INDEX obj_merry_rocket_helper
OBJECT_INDEX obj_winch_cutscene_helper[2]
OBJECT_INDEX obj_cutscene_weapons[2]
PED_INDEX ped_cutscene_cops[2]
PED_INDEX ped_fake_chopper
RAYFIRE_INDEX rayfire_tunnel
RAYFIRE_INDEX rayfire_vault
ROPE_INDEX rope_cutscene
SCENARIO_BLOCKING_INDEX sbi_bank_guard
SCENARIO_BLOCKING_INDEX sbi_tunnel_hole
SCENARIO_BLOCKING_INDEX sbi_shootout
SCENARIO_BLOCKING_INDEX sbi_airfield[3]
SCENARIO_BLOCKING_INDEX sbi_chase_start
VEHICLE_INDEX veh_franklins_car
VEHICLE_INDEX veh_trevors_car
VEHICLE_INDEX veh_cutter
VEHICLE_INDEX veh_bridge_cops[4]
VEHICLE_INDEX veh_cops_car_park_1
VEHICLE_INDEX veh_cops_car_park_2
VEHICLE_INDEX veh_cops_car_park_3
VEHICLE_INDEX veh_cops_bridge_heli
VEHICLE_INDEX veh_cops_heli_bridge_2
VEHICLE_INDEX veh_cops_heli_ramp
VEHICLE_INDEX veh_cops_blockade_by_car_park[3]
VEHICLE_INDEX veh_cops_after_ramp_blockade[2]
VEHICLE_INDEX veh_cops_after_ramp_blockade_2[1]
VEHICLE_INDEX veh_cops_before_garage_blockade[2]
VEHICLE_INDEX veh_cops_before_garage_blockade_2[2]
VEHICLE_INDEX veh_chase_cam
VEHICLE_INDEX veh_pre_mission_car
VEHICLE_INDEX veh_gold_train
VEHICLE_INDEX veh_train_hover_helpers[4]
VEHICLE_INDEX veh_chase_van
VEHICLE_INDEX veh_final_trailer
VEHICLE_INDEX veh_final_car
VEHICLE_INDEX veh_merry_heli
VEHICLE_INDEX veh_car_park_cars[6]
VEHICLE_INDEX veh_cops_courtyard_heli
VEHICLE_INDEX veh_fake_chopper
VEHICLE_INDEX veh_getaway_car
MODEL_NAMES model_gold_container = PROP_GOLD_CONT_01
MODEL_NAMES model_gold_container_open = PROP_GOLD_CONT_01B
MODEL_NAMES model_large_gold_trolley = PROP_LARGE_GOLD
MODEL_NAMES model_cutter = CUTTER
MODEL_NAMES model_gold_chopper = FROGGER
MODEL_NAMES model_trevor_gold_chopper = FROGGER2
MODEL_NAMES model_military_chopper = BUZZARD
MODEL_NAMES model_cop = S_M_Y_COP_01
MODEL_NAMES model_cop_car = POLICE3
MODEL_NAMES model_cop_heli = POLMAV
MODEL_NAMES model_rope_weight = PROP_GOLF_BALL
MODEL_NAMES model_vault_gates = PROP_GOLD_VAULT_GATE_01
MODEL_NAMES model_vault_door = V_ILEV_FIN_VAULTDOOR
MODEL_NAMES model_tunnel_crate = PROP_CRATE_10A
MODEL_NAMES model_tunnel_crate_2 = PROP_PARTSBOX_01
MODEL_NAMES model_tunnel_crate_3 = prop_woodpile_01b
MODEL_NAMES model_train_engine = FREIGHT
MODEL_NAMES model_train_carriage = FREIGHTCAR
//MODEL_NAMES model_pallet = p_pallet_02a_s
MODEL_NAMES model_swat = S_M_Y_SWAT_01
MODEL_NAMES model_merry = S_M_Y_BLACKOPS_01
MODEL_NAMES model_rocket_helper = PROP_GOLF_BALL
MODEL_NAMES model_swat_van = FBI2//RIOT
MODEL_NAMES model_rope_hook = PROP_ROPE_HOOK_01
MODEL_NAMES model_start_car = ORACLE2
MODEL_NAMES model_suppressed_getaway = DUMMY_MODEL_FOR_SCRIPT
MISSION_STAGE e_mission_stage = STAGE_START_CUTSCENE
SECTION_STAGE e_section_stage = SECTION_STAGE_SETUP
ROCKET_ANIM_STATE e_rocket_anim_state = ROCKET_ANIM_USING_AI
WEAPON_TYPE e_weapon_before_cutscene = WEAPONTYPE_INVALID
ENEMY_HELI_STATE e_heli_state[3]
SELECTOR_PED_STRUCT s_selector_peds
LOCATES_HEADER_DATA s_locates_data
//ROPE_DATA s_heli_ropes[2]
//ROPE_DATA s_heli_support_ropes[4]
ROPE_DATA s_heli_ropes_new[8]
ROCKET_DATA s_rockets[4]
structTimelapse sTimelapse
//structTimelapse sFinalTimelapse
BUDDY_DATA s_crew[4]
//BUDDY_DATA s_trevor
BUDDY_DATA s_michael
BUDDY_DATA s_franklin
BUDDY_DATA s_lester
ENEMY_DATA s_tunnel_cops_1[3]
ENEMY_DATA s_tunnel_cops_2[2]
ENEMY_DATA s_tunnel_cops_2b[3]
ENEMY_DATA s_tunnel_cops_3[3]
RAPPEL_DATA s_tunnel_cops_3_rappel_data[3]
ENEMY_DATA s_tunnel_cops_new_1[8]
ENEMY_DATA s_tunnel_cops_new_2[8]
ENEMY_DATA s_cops_start[5]
ENEMY_DATA s_cops_pillars[2]
ENEMY_DATA s_cops_pillars_end[1]
ENEMY_DATA s_cops_before_bridge[1]
ENEMY_DATA s_cops_bridge_start[2]
ENEMY_DATA s_cops_bridge[4]
ENEMY_DATA s_cops_bridge_2[3]
ENEMY_DATA s_cops_bridge_flank[2]
ENEMY_DATA s_cops_heli_bridge[3]
ENEMY_DATA s_cops_heli_bridge_2[2]
ENEMY_DATA s_cops_heli_ramp[3]
ENEMY_DATA s_cops_under_bridge[4]
ENEMY_DATA s_cops_after_bridge[3]
ENEMY_DATA s_cops_car_park_1[4]
ENEMY_DATA s_cops_car_park_2[4]
ENEMY_DATA s_cops_car_park_3[4]
ENEMY_DATA s_cops_after_ramp_blockade[4]
ENEMY_DATA s_cops_after_ramp_blockade_2[2]
ENEMY_DATA s_cops_before_turn[5]
ENEMY_DATA s_cops_blockade_by_car_park[1]
ENEMY_DATA s_cops_courtyard_1[4]
ENEMY_DATA s_cops_courtyard_1b[2]
ENEMY_DATA s_cops_courtyard_2[3]
ENEMY_DATA s_cops_courtyard_heli[4]
ENEMY_DATA s_merry_heli[1]
ENEMY_DATA s_cops_after_courtyard[1]
ENEMY_DATA s_cops_before_car_park[3]
ENEMY_DATA s_cops_before_garage_blockade[4]
ENEMY_DATA s_cops_before_garage_blockade_2[4]
MISSION_VEHICLE s_start_car
MISSION_VEHICLE s_gold_choppers[2]
REL_GROUP_HASH rel_group_cops
REL_GROUP_HASH rel_cops_buddy_ignore
REL_GROUP_HASH rel_group_neutral
SELECTOR_SLOTS_ENUM e_current_buddy = SELECTOR_PED_MICHAEL
structPedsForConversation s_conversation_peds
SELECTOR_CAM_STRUCT s_selector_cam
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
//structTimelapseSettings sFinalTimelapseSettings
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widget_debug
CONST_INT MAX_SKIP_MENU_LENGTH 16
INT i_debug_jump_stage = 0
MissionStageMenuTextStruct s_skip_menu[MAX_SKIP_MENU_LENGTH]
BOOL b_debug_record_heli_chase_setpieces
BOOL b_debug_show_chase_stats
BOOL b_debug_show_crew_state = FALSE
BOOL b_debug_test_chopper_respawning = FALSE
BOOL b_debug_show_heli_health = FALSE
BOOL b_debug_record_camera = FALSE
BOOL b_debug_playback_camera = FALSE
BOOL b_debug_force_activate = FALSE
BOOL b_debug_force_local_force = FALSE
BOOL b_debug_force_local_offset = FALSE
BOOL b_debug_force_scale_by_mass = FALSE
BOOL b_debug_draw_debug = FALSE
BOOL b_debug_record_train_heli_hover = FALSE
BOOL b_debug_playback_trigger_while_recording = FALSE
BOOl b_debug_record_gold_drop = FALSE
BOOL b_debug_switch_heli_to_ai = FALSE
BOOL b_debug_kill_enemy_helis = FALSE
INT i_debug_force_component = 0
INT i_debug_force_type = 0
FLOAT f_debug_trolley_mass = 0.0
FLOAT f_debug_trolley_gravity_factor = 0.0
FLOAT f_debug_trolley_buoyancy = 0.0
FLOAT f_debug_trolley_stabilisation = 0.0
VECTOR v_debug_entity_pos = v_zero
VECTOR v_debug_entity_rot = v_zero
VECTOR v_debug_force_dir = v_zero
VECTOR v_debug_force_offset = v_zero
VEHICLE_INDEX veh_debug
CAM_RECORDING_DATA s_cam_data
PROC CREATE_WIDGETS()
widget_debug = START_WIDGET_GROUP("Big Score 2B")
ADD_WIDGET_FLOAT_READ_ONLY("Playback time", f_chase_playback_time)
ADD_WIDGET_BOOL("DPicked good driver", b_picked_good_driver)
//ADD_WIDGET_BOOL("Allow ambience during shootout", b_allow_ambience_during_shootout)
ADD_WIDGET_BOOL("Show crew shootout state", b_debug_show_crew_state)
ADD_WIDGET_BOOL("Playback trigger car while recording traffic", b_debug_playback_trigger_while_recording)
ADD_WIDGET_BOOL("Record heli chase set-pieces", b_debug_record_heli_chase_setpieces)
ADD_WIDGET_BOOL("Show chase stats", b_debug_show_chase_stats)
ADD_WIDGET_BOOL("Record train heli hover", b_debug_record_train_heli_hover)
ADD_WIDGET_BOOL("Test chopper respawning", b_debug_test_chopper_respawning)
ADD_WIDGET_BOOL("Show chopper health", b_debug_show_heli_health)
ADD_WIDGET_BOOL("Record a heli chase camera", b_debug_record_camera)
ADD_WIDGET_BOOL("Playback heli chase cameras", b_debug_playback_camera)
ADD_WIDGET_BOOL("Draw debug info", b_debug_draw_debug)
ADD_WIDGET_BOOL("Record gold drop", b_debug_record_gold_drop)
ADD_WIDGET_BOOL("Switch first heli to AI", b_debug_switch_heli_to_ai)
ADD_WIDGET_BOOL("Kill enemy helis", b_debug_kill_enemy_helis)
START_WIDGET_GROUP("Michael attach")
ADD_WIDGET_VECTOR_SLIDER("Pos", v_debug_entity_pos, -10.0, 10.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Rot", v_debug_entity_rot, -180.0, 180.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Vehicle forces")
ADD_WIDGET_BOOL("Activate", b_debug_force_activate)
ADD_WIDGET_INT_SLIDER("Force type", i_debug_force_type, 0, 5, 1)
ADD_WIDGET_VECTOR_SLIDER("Force direction", v_debug_force_dir, -20.0, 20.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Force offset", v_debug_force_offset, -20.0, 20.0, 0.01)
ADD_WIDGET_INT_SLIDER("Component", i_debug_force_component, 0, 50, 1)
ADD_WIDGET_BOOL("Local force", b_debug_force_local_force)
ADD_WIDGET_BOOL("Local offset", b_debug_force_local_offset)
ADD_WIDGET_BOOL("Scale by mass", b_debug_force_scale_by_mass)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Variable debugger")
ADD_WIDGET_INT_SLIDER("i_current_event", i_current_event, 0, 200, 1)
ADD_WIDGET_INT_READ_ONLY("i_current_chopper_wave", i_current_chopper_wave)
ADD_WIDGET_INT_READ_ONLY("i_player_rocket_event", i_player_rocket_event)
ADD_WIDGET_INT_READ_ONLY("i_current_lester_target", i_current_lester_target)
//ADD_WIDGET_INT_READ_ONLY("i_enemy_rocket_event", i_enemy_rocket_event)
ADD_WIDGET_INT_READ_ONLY("i_rocket_timer", i_rocket_timer)
ADD_WIDGET_INT_READ_ONLY("i_time_last_chopper_killed", i_time_last_chopper_killed)
ADD_WIDGET_STRING("")
ADD_WIDGET_INT_READ_ONLY("Franklin crew event", s_crew[CREW_FRANKLIN_ID].i_event)
ADD_WIDGET_INT_READ_ONLY("Michael crew event", s_crew[CREW_MICHAEL_ID].i_event)
ADD_WIDGET_FLOAT_READ_ONLY("f_chase_playback_speed", f_chase_playback_speed)
ADD_WIDGET_FLOAT_READ_ONLY("f_chase_playback_time", f_chase_playback_time)
ADD_WIDGET_FLOAT_READ_ONLY("f_heli_hover_speed", f_heli_hover_speed)
ADD_WIDGET_FLOAT_READ_ONLY("f_crew_heli_speed", f_crew_heli_speed)
ADD_WIDGET_FLOAT_READ_ONLY("f_cutter_playback_speed", f_cutter_playback_speed)
ADD_WIDGET_STRING("")
ADD_WIDGET_INT_READ_ONLY("i_max_take_considering_crew", i_max_take_considering_crew)
ADD_WIDGET_INT_READ_ONLY("i_current_take", i_current_take)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Trolley physics params")
ADD_WIDGET_FLOAT_SLIDER("Mass", f_debug_trolley_mass, 0.0, 10000.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Gravity", f_debug_trolley_gravity_factor, 0.0, 10000.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Buoyancy", f_debug_trolley_buoyancy, 0.0, 10000.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Stabilisation", f_debug_trolley_stabilisation, -100.0, 100.0, 0.1)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SET_LOCATES_HEADER_WIDGET_GROUP(widget_debug)
SET_UBER_PARENT_WIDGET_GROUP(widget_debug)
SET_CAM_RECORDING_WIDGET_GROUP(s_cam_data, widget_debug)
ENDPROC
PROC DESTROY_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(widget_debug)
DELETE_WIDGET_GROUP(widget_debug)
ENDIF
ENDPROC
#ENDIF
//NEED TO DELETE THESE RECORDINGS
//200-250 = set-pieces.
//400-500 = set-pieces that need converting to traffic.
//250-400 = recorded traffic.
//PROC LOAD_VAN_CHASE_UBER_DATA()
//ENDPROC
PROC LOAD_HELI_CHASE_UBER_DATA()
//Order of attack in chase: 2, 1, 0
SetPieceCarPos[0] = <<1554.8298, 827.8248, 174.8822>>
SetPieceCarQuatX[0] = -0.0040
SetPieceCarQuatY[0] = 0.0024
SetPieceCarQuatZ[0] = 0.5941
SetPieceCarQuatW[0] = 0.8044
SetPieceCarRecording[0] = 13
SetPieceCarStartime[0] = 57200.0000
SetPieceCarRecordingSpeed[0] = 1.2500
SetPieceCarModel[0] = buzzard
SetPieceCarPos[1] = <<1097.6914, 1844.3870, 323.2633>>
SetPieceCarQuatX[1] = 0.0052
SetPieceCarQuatY[1] = -0.0054
SetPieceCarQuatZ[1] = 0.9983
SetPieceCarQuatW[1] = -0.0575
SetPieceCarRecording[1] = 15
SetPieceCarStartime[1] = 59300.0000
SetPieceCarRecordingSpeed[1] = 1.2500
SetPieceCarModel[1] = buzzard
SetPieceCarPos[2] = <<1091.0607, 1849.5540, 322.3521>>
SetPieceCarQuatX[2] = 0.0000
SetPieceCarQuatY[2] = 0.0034
SetPieceCarQuatZ[2] = 0.9989
SetPieceCarQuatW[2] = -0.0478
SetPieceCarRecording[2] = 14
SetPieceCarStartime[2] = 58900.0000
SetPieceCarRecordingSpeed[2] = 1.2500
SetPieceCarModel[2] = buzzard
//Have some specific set-pieces if the good gunman was picked to accompany Franklin to the tunnels.
IF b_picked_good_franklin_gunman
ENDIF
ENDPROC
PROC CLEAR_TRIGGERED_LABELS()
INT i = 0
REPEAT COUNT_OF(b_has_text_label_triggered) i
b_has_text_label_triggered[i] = FALSE
ENDREPEAT
ENDPROC
FUNC PED_INDEX CREATE_ENEMY_PED(MODEL_NAMES model, VECTOR v_pos, FLOAT f_heading, REL_GROUP_HASH group,
INT i_health = 200, INT i_armour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED, PED_TYPE e_ped_type = PEDTYPE_MISSION)
PED_INDEX ped = CREATE_PED(e_ped_type, model, v_pos, f_heading)
GIVE_WEAPON_TO_PED(ped, weapon, INFINITE_AMMO, TRUE)
SET_PED_INFINITE_AMMO(ped, TRUE, weapon)
SET_PED_MAX_HEALTH(ped, i_health)
SET_ENTITY_HEALTH(ped, i_health)
//Need to reset the armour first, in case the ped already has armour
ADD_ARMOUR_TO_PED(ped, -GET_PED_ARMOUR(ped))
ADD_ARMOUR_TO_PED(ped, i_armour)
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_COMBAT_ATTRIBUTES(ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_CONFIG_FLAG(ped, PCF_DisableHurt, TRUE)
SET_PED_PATH_CAN_USE_CLIMBOVERS(ped, 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 e_seat, REL_GROUP_HASH group,
INT i_health = 200, INT i_armour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED)
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, i_health, i_armour, weapon)
SET_PED_INTO_VEHICLE(ped, veh, e_seat)
ENDIF
RETURN ped
ENDFUNC
PROC SET_PED_COMBAT_PARAMS(PED_INDEX &ped, INT i_accuracy, COMBAT_MOVEMENT e_movement, COMBAT_ABILITY_LEVEL e_ability, COMBAT_RANGE e_range,
COMBAT_TARGET_LOSS_RESPONSE e_tlr)
SET_PED_COMBAT_MOVEMENT(ped, e_movement)
SET_PED_COMBAT_ABILITY(ped, e_ability)
SET_PED_COMBAT_RANGE(ped, e_range)
SET_PED_ACCURACY(ped, i_accuracy)
SET_PED_TARGET_LOSS_RESPONSE(ped, e_tlr)
ENDPROC
PROC SET_PED_COMBAT_AI(PED_INDEX &ped, INT accuracy, COMBAT_MOVEMENT movement, COMBAT_ABILITY_LEVEL ability, COMBAT_RANGE range, COMBAT_ATTRIBUTE active_attributes,
VECTOR v_defensive_sphere_pos, FLOAT f_defensive_sphere_radius = 0.0)
IF NOT IS_PED_INJURED(ped)
SET_PED_COMBAT_MOVEMENT(ped, movement)
SET_PED_COMBAT_ABILITY(ped, ability)
SET_PED_COMBAT_RANGE(ped, range)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_DO_DRIVEBYS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_CAN_INVESTIGATE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, active_attributes, TRUE)
SET_PED_ACCURACY(ped, accuracy)
IF f_defensive_sphere_radius != 0.0
SET_PED_SPHERE_DEFENSIVE_AREA(ped, v_defensive_sphere_pos, f_defensive_sphere_radius)
ENDIF
ENDIF
ENDPROC
PROC INITIALISE_ENEMY_PED(ENEMY_DATA &s_enemy, STRING str_name, INT i_index, BOOL b_allow_targetting = TRUE)
IF NOT IS_PED_INJURED(s_enemy.ped)
TASK_STAND_STILL(s_enemy.ped, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_enemy.ped, TRUE)
SET_PED_CAN_BE_TARGETTED(s_enemy.ped, b_allow_targetting)
s_enemy.b_is_created = TRUE
s_enemy.i_event = 0
s_enemy.i_timer = 0
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(s_enemy.ped)
#IF IS_DEBUG_BUILD
TEXT_LABEL_31 debug_name = str_name
debug_name += i_index
SET_PED_NAME_DEBUG(s_enemy.ped, debug_name)
#ENDIF
#IF NOT IS_DEBUG_BUILD
str_name = str_name // to prevent an Unreferenced variable error
i_index = i_index
#ENDIF
ENDIF
ENDPROC
PROC INITIALISE_ENEMY_GROUP(ENEMY_DATA &s_enemies[], STRING name, BOOL b_allow_targetting = TRUE)
INT i = 0
REPEAT COUNT_OF(s_enemies) i
INITIALISE_ENEMY_PED(s_enemies[i], name, i, b_allow_targetting)
ENDREPEAT
ENDPROC
PROC CLEAN_UP_ENEMY_PED(ENEMY_DATA &s_enemy, BOOL b_reset_variables = FALSE)
IF DOES_BLIP_EXIST(s_enemy.blip)
REMOVE_BLIP(s_enemy.blip)
ENDIF
//Increment the kill stat if this ped was killed by the player.
IF NOT IS_PED_INJURED(s_enemy.ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(s_enemy.ped, NORMAL_BLEND_OUT, TRUE)
ELSE
IF DOES_ENTITY_EXIST(s_enemy.ped)
ENTITY_INDEX entity_death_source = GET_PED_SOURCE_OF_DEATH(s_enemy.ped)
IF DOES_ENTITY_EXIST(entity_death_source)
AND IS_ENTITY_A_PED(entity_death_source)
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entity_death_source) = PLAYER_PED_ID()
REL_GROUP_HASH e_enemy_hash = GET_PED_RELATIONSHIP_GROUP_HASH(s_enemy.ped)
IF e_enemy_hash = rel_group_cops
OR e_enemy_hash = RELGROUPHASH_COP
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_KILLS)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
CLEANUP_AI_PED_BLIP(s_enemy.s_blip_data)
REMOVE_COVER_POINT(s_enemy.cover)
SET_PED_AS_NO_LONGER_NEEDED(s_enemy.ped)
IF b_reset_variables
s_enemy.b_is_created = FALSE
s_enemy.i_event = 0
s_enemy.i_timer = 0
ENDIF
ENDPROC
/// PURPOSE:
/// Sets a ped as "ignored" in combat, this means they won't be targetable and buddies won't fire at them.
/// This is useful for when creating peds in advance for shootouts, you can prevent buddies from firing at them until the right time.
/// PARAMS:
/// ped - The ped to ignore
/// b_ignore - If TRUE, the ped will be ignored.
/// rgh_neutral - If the ped is being ignored they will be placed in this group
/// rgh_enemy - If the ped is being treated as an enemy they will be placed in this group
PROC SET_PED_AS_IGNORED_IN_COMBAT(PED_INDEX ped, BOOL b_ignore, REL_GROUP_HASH &rgh_neutral, REL_GROUP_HASH &rgh_enemy)
SET_PED_CAN_BE_TARGETTED(ped, NOT b_ignore)
IF b_ignore
SET_PED_RELATIONSHIP_GROUP_HASH(ped, rgh_neutral)
ELSE
SET_PED_RELATIONSHIP_GROUP_HASH(ped, rgh_enemy)
ENDIF
ENDPROC
PROC KILL_ENEMY_GROUP_INSTANTLY(ENEMY_DATA &s_enemies[])
INT i = 0
REPEAT COUNT_OF(s_enemies) i
s_enemies[i].b_is_created = TRUE
IF NOT IS_PED_INJURED(s_enemies[i].ped)
SET_ENTITY_HEALTH(s_enemies[i].ped, 0)
ENDIF
ENDREPEAT
ENDPROC
FUNC INT GET_NUM_ENEMIES_ALIVE_IN_GROUP(ENEMY_DATA &s_enemies[])
INT i_num_alive = 0
INT i = 0
INT i_num_enemies_in_group = COUNT_OF(s_enemies)
IF s_enemies[0].b_is_created
REPEAT i_num_enemies_in_group i
IF s_enemies[i].b_is_created
IF NOT IS_PED_INJURED(s_enemies[i].ped)
i_num_alive++
ENDIF
ELSE
i_num_alive++
ENDIF
ENDREPEAT
ELSE
//Group hasn't been created yet, so just count them all as alive.
i_num_alive = i_num_enemies_in_group
ENDIF
RETURN i_num_alive
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 v_pos, FLOAT f_heading, FLOAT f_sphere_radius,
COVERPOINT_USAGE cov_usage, COVERPOINT_HEIGHT cov_height, COVERPOINT_ARC cov_arc)
IF NOT IS_PED_INJURED(ped)
IF cover != NULL
REMOVE_COVER_POINT(cover)
ENDIF
cover = ADD_COVER_POINT(v_pos, f_heading, cov_usage, cov_height, cov_arc)
SET_PED_SPHERE_DEFENSIVE_AREA(ped, v_pos, f_sphere_radius, TRUE)
ENDIF
ENDPROC
PROC SET_PED_PREFERRED_COVER_POINT(PED_INDEX &ped, COVERPOINT_INDEX &cover)
IF NOT IS_PED_INJURED(ped)
ITEMSET_INDEX item_cover = CREATE_ITEMSET(TRUE)
ADD_TO_ITEMSET(cover, item_cover)
SET_PED_PREFERRED_COVER_SET(ped, item_cover)
DESTROY_ITEMSET(item_cover)
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the player is currently hanging around where the given ped is trying to get to. This is useful for checking if peds
/// playing synced scenes need to break into AI due to the player getting in the way.
/// PARAMS:
/// ped - The ped moving towards the destination.
/// v_destination - The destination
/// f_max_dist_before_check - The ped must be within this distance of the destination before we start checking what the player is doing.
/// b_player_must_be_in_cover - If TRUE then the player must be in cover for them to be considered in the way.
FUNC BOOL IS_PLAYER_STEALING_PEDS_DESTINATION(PED_INDEX ped, VECTOR v_destination, FLOAT f_max_dist_before_check, FLOAT f_max_player_dist_from_point = 2.0, BOOL b_player_must_be_in_cover = FALSE,
BOOL b_player_must_be_closer = TRUE)
IF NOT IS_PED_INJURED(ped)
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR v_ped_pos = GET_ENTITY_COORDS(ped)
FLOAT f_dist_from_ped_to_dest = VDIST(v_ped_pos, v_destination)
FLOAT f_dist_from_player_to_dest = VDIST(v_player_pos, v_destination)
IF f_dist_from_ped_to_dest < f_max_dist_before_check
IF (f_dist_from_player_to_dest < f_dist_from_ped_to_dest OR NOT b_player_must_be_closer)
AND f_dist_from_player_to_dest < f_max_player_dist_from_point
IF b_player_must_be_in_cover
IF IS_PED_IN_COVER(PLAYER_PED_ID())
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//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:
/// 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, FLOAT fMaxDistBeforeCheck, FLOAT fMaxDistConsideredAsStealing = 2.0, BOOL bMustBeInCover = FALSE)
IF NOT IS_PED_INJURED(pedToMove)
AND NOT IS_PED_INJURED(pedToCheckForSteal)
VECTOR vPed1Pos = GET_ENTITY_COORDS(pedToCheckForSteal)
VECTOR vPed2Pos = GET_ENTITY_COORDS(pedToMove)
FLOAT fDistFromPed2ToDest = VDIST(vPed2Pos, vDestination)
FLOAT fDistFromPed1ToDest = VDIST(vPed1Pos, vDestination)
IF fDistFromPed2ToDest < fMaxDistBeforeCheck
IF fDistFromPed1ToDest < fDistFromPed2ToDest
AND fDistFromPed1ToDest < fMaxDistConsideredAsStealing
IF bMustBeInCover
IF IS_PED_IN_COVER(pedToCheckForSteal)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Tells a ped to go to cover while aiming at either a coord or a given entity, and then go into general combat.
PROC SEQ_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, INT i_time_spent_in_cover, BOOL b_shoot, VECTOR v_aim_pos,
FLOAT f_target_distance = 0.5, FLOAT f_slow_distance = 4.0, BOOL b_use_navmesh = TRUE, ENTITY_INDEX entity_aim = NULL)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF IS_ENTITY_DEAD(entity_aim)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
ENDIF
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, v_destination, i_time_spent_in_cover)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Tells a ped to go to cover while aiming at either a coord or a given entity.
PROC SEQ_GO_TO_COVER_WHILE_AIMING(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, INT i_time_spent_in_cover, BOOL b_shoot, VECTOR v_aim_pos,
FLOAT f_target_distance = 0.5, FLOAT f_slow_distance = 4.0, BOOL b_use_navmesh = TRUE, ENTITY_INDEX entity_aim = NULL)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF IS_ENTITY_DEAD(entity_aim)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
ENDIF
TASK_SEEK_COVER_TO_COORDS(NULL, v_destination, v_aim_pos, i_time_spent_in_cover)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Tells a ped to run to a location and then puts them into cover there
PROC SEQ_GO_TO_COVER(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, INT i_time_spent_in_cover, BOOL b_block_non_temp_events = TRUE, BOOL b_use_navmesh = TRUE,
INT i_time = DEFAULT_TIME_BEFORE_WARP, FLOAT f_radius = DEFAULT_NAVMESH_RADIUS, ENAV_SCRIPT_FLAGS nav_flags = ENAV_DEFAULT)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF b_use_navmesh
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, v_destination, move_state, i_time, f_radius, nav_flags)
ELSE
TASK_GO_STRAIGHT_TO_COORD(NULL, v_destination, move_state, i_time)
ENDIF
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, v_destination, i_time_spent_in_cover)
CLOSE_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, b_block_non_temp_events)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Performs a generic sequence where a ped will go to a coord while aiming at something (either a coord or entity), then transition into combat
PROC SEQ_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, VECTOR v_aim_pos, ENTITY_INDEX entity_aim = NULL, BOOL b_shoot = TRUE,
FLOAT f_target_dist = 0.5, FLOAT f_slow_dist = 0.5, BOOL b_use_navmesh = TRUE,
PED_INDEX ped_to_attack = NULL, FLOAT f_combat_range = 100.0)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
IF IS_ENTITY_DEAD(entity_aim)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
ENDIF
IF NOT IS_PED_INJURED(ped_to_attack)
TASK_COMBAT_PED(NULL, ped_to_attack)
ELSE
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, f_combat_range)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Performs a generic sequence where a ped will go to a coord while aiming at something (either a coord or entity), then either continue aiming or shoot at the target.
PROC SEQ_GO_TO_COORD_WHILE_AIMING_THEN_AIM(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, VECTOR v_aim_pos, ENTITY_INDEX entity_aim = NULL, BOOL b_shoot = TRUE,
FLOAT f_target_dist = 0.5, FLOAT f_slow_dist = 0.5, BOOL b_use_navmesh = TRUE, BOOL b_block_non_temp_events = TRUE,
BOOL b_shoot_when_stopped = TRUE, FIRING_TYPE fire_type = FIRING_TYPE_RANDOM_BURSTS)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF IS_ENTITY_DEAD(entity_aim)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
IF b_shoot_when_stopped
TASK_SHOOT_AT_COORD(NULL, v_aim_pos, -1, fire_type)
ELSE
TASK_AIM_GUN_AT_COORD(NULL, v_aim_pos, -1)
ENDIF
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
IF b_shoot_when_stopped
TASK_SHOOT_AT_ENTITY(NULL, entity_aim, -1, fire_type)
ELSE
TASK_AIM_GUN_AT_ENTITY(NULL, entity_aim, -1)
ENDIF
ENDIF
CLOSE_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, b_block_non_temp_events)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Shorthand function for checking multiple peds against a single angled area at the same time.
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:
/// Shorthand function for checking multiple peds against a single area at the same time.
FUNC BOOL ARE_PEDS_AT_COORD(PED_INDEX ped_1, PED_INDEX ped_2, PED_INDEX ped_3, VECTOR v_pos, VECTOR v_size)
IF NOT IS_PED_INJURED(ped_1)
IF IS_ENTITY_AT_COORD(ped_1, v_pos, v_size, FALSE, TRUE, TM_ANY)
RETURN TRUE
ENDIF
ENDIF
IF NOT IS_PED_INJURED(ped_2)
IF IS_ENTITY_AT_COORD(ped_2, v_pos, v_size, FALSE, TRUE, TM_ANY)
RETURN TRUE
ENDIF
ENDIF
IF NOT IS_PED_INJURED(ped_3)
IF IS_ENTITY_AT_COORD(ped_3, v_pos, v_size, FALSE, TRUE, TM_ANY)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//PURPOSE: triggers multiple bullet hits around an entity at given intervals.
//AUTHOR: Ross Wallace
PROC DO_EXCITING_NEAR_BULLET_MISS_ON_ENTITY(ENTITY_INDEX entityToMiss, ENTITY_INDEX sourceOfBullets, INT &iControlTimer, VECTOR sourceOffset,
INT timeBetweenBullets = 60, FLOAT minXrange = -3.9, FLOAT maxXrange = -1.0, FLOAT minYRange = -2.9, FLOAT maxYrange = 3.9)
INT currentBulletTime = GET_GAME_TIMER()
VECTOR bulletHit
VECTOR bulletOrigin
IF ((currentBulletTime - iControlTimer) > timeBetweenBullets)
IF NOT IS_ENTITY_DEAD(entityToMiss)
AND NOT IS_ENTITY_DEAD(sourceOfBullets)
bulletHit = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityToMiss, <<GET_RANDOM_FLOAT_IN_RANGE(minXrange, maxXrange), GET_RANDOM_FLOAT_IN_RANGE(minYRange, maxYrange), 0.0>>)
bulletOrigin = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sourceOfBullets, sourceOffset)
GET_GROUND_Z_FOR_3D_COORD(bulletHit, bulletHit.z)
SHOOT_SINGLE_BULLET_BETWEEN_COORDS(bulletOrigin, bulletHit, 1)
iControlTimer = currentBulletTime
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
//DRAW_DEBUG_SPHERE(bulletOrigin, 0.2)
//DRAW_DEBUG_SPHERE(bulletHit, 0.2)
ENDIF
ENDIF
ENDPROC
PROC REMOVE_OBJECT(OBJECT_INDEX &obj, BOOL b_force_delete = FALSE)
IF DOES_ENTITY_EXIST(obj)
IF IS_ENTITY_ATTACHED(obj)
DETACH_ENTITY(obj)
ENDIF
IF b_force_delete
DELETE_OBJECT(obj)
ELSE
SET_OBJECT_AS_NO_LONGER_NEEDED(obj)
ENDIF
ENDIF
ENDPROC
PROC REMOVE_VEHICLE(VEHICLE_INDEX &veh, BOOL b_force_delete = FALSE)
IF DOES_ENTITY_EXIST(veh)
IF NOT IS_ENTITY_DEAD(veh)
STOP_SYNCHRONIZED_ENTITY_ANIM(veh, NORMAL_BLEND_OUT, TRUE)
IF IS_ENTITY_ATTACHED(veh)
DETACH_ENTITY(veh)
ENDIF
ENDIF
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh, FALSE)
IF b_force_delete
DELETE_VEHICLE(veh)
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC REMOVE_PED(PED_INDEX &ped, BOOL b_force_delete = 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 NOT IS_PLAYER_PLAYING(PLAYER_ID())
SET_PED_KEEP_TASK(ped, TRUE)
ENDIF
ENDIF
IF b_force_delete
DELETE_PED(ped)
ELSE
SET_PED_AS_NO_LONGER_NEEDED(ped)
ENDIF
ENDIF
ENDPROC
PROC REMOVE_ENEMY_GROUP(ENEMY_DATA &peds[], BOOL b_force_delete = FALSE, BOOL b_put_into_combat_on_cleanup = TRUE)
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].s_blip_data)
REMOVE_COVER_POINT(peds[i].cover)
IF b_put_into_combat_on_cleanup
AND NOT b_force_delete
AND NOT IS_PED_INJURED(peds[i].ped)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(peds[i].ped, 200.0)
SET_PED_KEEP_TASK(peds[i].ped, TRUE)
ENDIF
REMOVE_PED(peds[i].ped, b_force_delete)
peds[i].b_is_created = FALSE
peds[i].i_event = 0
peds[i].i_rope_event = 0
peds[i].i_timer = 0
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Mission vehicles are structs containing a vehicle and some extra data associated with that vehicle (e.g. blips, timers, etc). This cleans up the vehicle and resets
/// the extra data.
PROC REMOVE_MISSION_VEHICLE(MISSION_VEHICLE &s_veh, BOOl b_force_delete = FALSE)
IF DOES_BLIP_EXIST(s_veh.blip)
REMOVE_BLIP(s_veh.blip)
ENDIF
REMOVE_VEHICLE(s_veh.veh, b_force_delete)
s_veh.i_event = 0
ENDPROC
PROC SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(VEHICLE_INDEX &veh, FLOAT f_time)
IF IS_VEHICLE_DRIVEABLE(veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh, f_time - GET_TIME_POSITION_IN_RECORDING(veh))
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Based on Ross's proc in rural_bank_heist.sc: applies extra damage to vehicle components as it is shot.
PROC DO_VEHICLE_DAMAGE_WHEN_SHOT(VEHICLE_INDEX &veh)
IF NOT IS_ENTITY_DEAD(veh)
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, 1.4000, 0.1000>>), 0.738)
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_DAMAGE(veh, <<-1.0000, 1.0000, 0.2000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, 1.4000, 0.1000>>), 0.738)
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_DAMAGE(veh, <<1.0000, 1.0000, 0.2000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, -1.4000, 0.1000>>), 0.738)
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_DAMAGE(veh, <<-1.0000, -1.0000, 0.2000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, -1.5000, 0.1000>>), 0.738)
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_DAMAGE(veh, <<1.0000, -1.0000, 0.2000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_FRONT_LEFT)
AND NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_REAR_LEFT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, 0.0000, 0.1000>>), 0.538)
INT iDoorToBreak = GET_RANDOM_INT_IN_RANGE(0, 2)
IF iDoorToBreak = 0
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_FRONT_LEFT)
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_FRONT_LEFT, FALSE)
ELSE
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_REAR_LEFT)
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_REAR_LEFT, FALSE)
ENDIF
ENDIF
ENDIF
IF NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_FRONT_RIGHT)
AND NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_REAR_RIGHT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, 0.0000, 0.1000>>), 0.538)
INT iDoorToBreak = GET_RANDOM_INT_IN_RANGE(0, 2)
IF iDoorToBreak = 0
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_FRONT_RIGHT)
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_FRONT_RIGHT, FALSE)
ELSE
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_REAR_RIGHT)
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_REAR_RIGHT, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Converges a value towards a given destination, by adding/removing a given amount.
PROC CONVERGE_VALUE(FLOAT &val, FLOAT desired_val, FLOAT amount_to_converge, BOOL adjust_for_framerate = FALSE)
IF val != desired_val
FLOAT converge_amount_this_frame = amount_to_converge
IF adjust_for_framerate
converge_amount_this_frame = 0.0 +@ (amount_to_converge * 30.0)
ENDIF
IF val - desired_val > converge_amount_this_frame
val -= converge_amount_this_frame
ELIF val - desired_val < -converge_amount_this_frame
val += converge_amount_this_frame
ELSE
val = desired_val
ENDIF
ENDIF
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(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
IF s_conversation_peds.PedInfo[0].Index != s_selector_peds.pedID[SELECTOR_PED_MICHAEL]
OR NOT s_conversation_peds.PedInfo[0].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, s_selector_peds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF s_conversation_peds.PedInfo[0].Index != PLAYER_PED_ID()
OR NOT s_conversation_peds.PedInfo[0].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL")
ENDIF
ELSE
IF s_conversation_peds.PedInfo[0].Index != NULL
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
ENDIF
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
IF s_conversation_peds.PedInfo[1].Index != s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]
OR NOT s_conversation_peds.PedInfo[1].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF s_conversation_peds.PedInfo[1].Index != PLAYER_PED_ID()
OR NOT s_conversation_peds.PedInfo[1].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, PLAYER_PED_ID(), "FRANKLIN")
ENDIF
ELSE
IF s_conversation_peds.PedInfo[1].Index != NULL
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
ENDIF
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
IF s_conversation_peds.PedInfo[2].Index != s_selector_peds.pedID[SELECTOR_PED_TREVOR]
OR NOT s_conversation_peds.PedInfo[2].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, s_selector_peds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF s_conversation_peds.PedInfo[2].Index != PLAYER_PED_ID()
OR NOT s_conversation_peds.PedInfo[2].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, PLAYER_PED_ID(), "TREVOR")
ENDIF
ELSE
IF s_conversation_peds.PedInfo[2].Index != NULL
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
ENDIF
ENDIF
ENDPROC
///Creates a gunman conversation: each conversation in D* contains a postfix referring to which specific gunman speaks the line.
FUNC BOOL CREATE_GUNMAN_CONVERSATION(INT iGunmanID, PED_INDEX pedGunman, structPedsForConversation &sConvData, STRING strTextBlock, STRING strConvRootWithoutPostfix,
enumConversationPriority ePriority = CONV_PRIORITY_MEDIUM, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
TEXT_LABEL strConvRoot = strConvRootWithoutPostfix
TEXT_LABEL strCrewVoiceName = ""
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, iGunmanID)
SWITCH eCrewID
CASE CM_GUNMAN_G_GUSTAV
strConvRoot += "_GM"
strCrewVoiceName = "GUSTAVO"
BREAK
CASE CM_GUNMAN_G_KARL
strConvRoot += "_KA"
strCrewVoiceName = "KARL"
BREAK
CASE CM_GUNMAN_G_PACKIE_UNLOCK
strConvRoot += "_PM"
strCrewVoiceName = "PACKIE"
BREAK
CASE CM_GUNMAN_G_CHEF_UNLOCK
strConvRoot += "_CH"
strCrewVoiceName = "CHEF"
BREAK
CASE CM_GUNMAN_M_HUGH
strConvRoot += "_HW"
strCrewVoiceName = "HUGH"
BREAK
CASE CM_GUNMAN_B_NORM
strConvRoot += "_NR"
strCrewVoiceName = "NORM"
BREAK
CASE CM_GUNMAN_B_DARYL
strConvRoot += "_DJ"
strCrewVoiceName = "DARYL"
BREAK
ENDSWITCH
IF NOT IS_STRING_NULL_OR_EMPTY(strCrewVoiceName)
TEXT_LABEL strRandomRoot = strConvRoot
strRandomRoot += "_01"
TEXT_LABEL strNonRandomRoot = strConvRoot
strNonRandomRoot += "_1"
IF DOES_TEXT_LABEL_EXIST(strRandomRoot)
OR DOES_TEXT_LABEL_EXIST(strNonRandomRoot)
IF NOT IS_PED_INJURED(pedGunman)
IF VDIST2(GET_ENTITY_COORDS(pedGunman), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 3600.0
ADD_PED_FOR_DIALOGUE(sConvData, 4, pedGunman, strCrewVoiceName)
ELSE
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
ENDIF
ELSE
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
ENDIF
IF CREATE_CONVERSATION(sConvData, strTextBlock, strConvRoot, ePriority, eSubtitles)
RETURN TRUE
ENDIF
ELSE
//If the label doesn't exist then just return TRUE.
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CREATE_DRIVER_CONVERSATION(INT iDriverID, PED_INDEX pedDriver, structPedsForConversation &sConvData, STRING strTextBlock, STRING strConvRootWithoutPostfix,
enumConversationPriority ePriority = CONV_PRIORITY_MEDIUM, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
TEXT_LABEL strConvRoot = strConvRootWithoutPostfix
TEXT_LABEL strCrewVoiceName = ""
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, iDriverID)
SWITCH eCrewID
CASE CM_DRIVER_G_EDDIE
strConvRoot += "_ET"
strCrewVoiceName = "EDDIE"
BREAK
CASE CM_DRIVER_G_TALINA_UNLOCK
strConvRoot += "_TM"
strCrewVoiceName = "TALINA"
BREAK
CASE CM_DRIVER_B_KARIM
strConvRoot += "_KD"
strCrewVoiceName = "KARIM"
BREAK
ENDSWITCH
IF NOT IS_STRING_NULL_OR_EMPTY(strCrewVoiceName)
TEXT_LABEL strRandomRoot = strConvRoot
strRandomRoot += "_01"
TEXT_LABEL strNonRandomRoot = strConvRoot
strNonRandomRoot += "_1"
IF DOES_TEXT_LABEL_EXIST(strRandomRoot)
OR DOES_TEXT_LABEL_EXIST(strNonRandomRoot)
IF DOES_ENTITY_EXIST(pedDriver)
IF sConvData.PedInfo[4].Index != pedDriver
ADD_PED_FOR_DIALOGUE(sConvData, 4, pedDriver, strCrewVoiceName)
ENDIF
ELSE
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
ENDIF
IF CREATE_CONVERSATION(sConvData, strTextBlock, strConvRoot, ePriority, eSubtitles)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC REMOVE_ALL_SHOOTOUT_ENEMIES()
REMOVE_ENEMY_GROUP(s_cops_heli_bridge)
REMOVE_ENEMY_GROUP(s_cops_heli_bridge_2)
REMOVE_ENEMY_GROUP(s_cops_heli_ramp)
REMOVE_ENEMY_GROUP(s_cops_after_bridge)
REMOVE_ENEMY_GROUP(s_cops_pillars)
REMOVE_ENEMY_GROUP(s_cops_pillars_end)
REMOVE_ENEMY_GROUP(s_cops_start)
REMOVE_ENEMY_GROUP(s_cops_under_bridge)
REMOVE_ENEMY_GROUP(s_cops_after_ramp_blockade)
REMOVE_ENEMY_GROUP(s_cops_bridge_start)
REMOVE_ENEMY_GROUP(s_cops_bridge)
REMOVE_ENEMY_GROUP(s_cops_bridge_2)
REMOVE_ENEMY_GROUP(s_cops_bridge_flank)
REMOVE_ENEMY_GROUP(s_cops_before_bridge)
REMOVE_ENEMY_GROUP(s_cops_before_turn)
REMOVE_ENEMY_GROUP(s_cops_blockade_by_car_park)
REMOVE_ENEMY_GROUP(s_cops_courtyard_1)
REMOVE_ENEMY_GROUP(s_cops_courtyard_2)
REMOVE_ENEMY_GROUP(s_cops_car_park_1)
REMOVE_ENEMY_GROUP(s_cops_car_park_2)
REMOVE_ENEMY_GROUP(s_cops_car_park_3)
REMOVE_ENEMY_GROUP(s_cops_after_courtyard)
REMOVE_ENEMY_GROUP(s_merry_heli)
REMOVE_ENEMY_GROUP(s_cops_before_car_park)
REMOVE_ENEMY_GROUP(s_cops_before_garage_blockade)
REMOVE_ENEMY_GROUP(s_cops_before_garage_blockade_2)
REMOVE_VEHICLE(veh_cops_bridge_heli)
REMOVE_VEHICLE(veh_cops_heli_bridge_2)
REMOVE_VEHICLE(veh_cops_heli_ramp)
REMOVE_VEHICLE(veh_cops_car_park_1)
REMOVE_VEHICLE(veh_cops_car_park_2)
REMOVE_VEHICLE(veh_cops_car_park_3)
REMOVE_VEHICLE(veh_merry_heli)
INT i = 0
REPEAT COUNT_OF(veh_bridge_cops) i
REMOVE_VEHICLE(veh_bridge_cops[i])
ENDREPEAT
REPEAT COUNT_OF(veh_car_park_cars) i
REMOVE_VEHICLE(veh_car_park_cars[i])
ENDREPEAT
REPEAT COUNT_OF(veh_cops_after_ramp_blockade) i
REMOVE_VEHICLE(veh_cops_after_ramp_blockade[i])
ENDREPEAT
REPEAT COUNT_OF(veh_cops_before_garage_blockade) i
REMOVE_VEHICLE(veh_cops_before_garage_blockade[i])
ENDREPEAT
REPEAT COUNT_OF(veh_cops_before_garage_blockade_2) i
REMOVE_VEHICLE(veh_cops_before_garage_blockade_2[i])
ENDREPEAT
REPEAT COUNT_OF(veh_cops_blockade_by_car_park) i
REMOVE_VEHICLE(veh_cops_blockade_by_car_park[i])
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_car)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
ENDPROC
//Loops a vehicle recording on a heli to make it look like it's hovering.
//NOTE: The proc assumes that a recordining is already playing on the vehicle.
PROC HOVER_HELI_USING_RECORDING(VEHICLE_INDEX veh_heli, FLOAT &f_playback_speed, FLOAT f_min_time, FLOAT f_max_time)
IF IS_VEHICLE_DRIVEABLE(veh_heli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_heli)
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_heli)
IF f_max_time - f_playback_time < 4000.0
CONVERGE_VALUE(f_playback_speed, -1.0, 0.5, TRUE)
ENDIF
IF f_playback_time < f_min_time
CONVERGE_VALUE(f_playback_speed, 1.0, 0.5, TRUE)
ENDIF
SET_PLAYBACK_SPEED(veh_heli, f_playback_speed)
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(blip_current_objective)
REMOVE_BLIP(blip_current_objective)
ENDIF
IF DOES_BLIP_EXIST(blip_gold)
REMOVE_BLIP(blip_gold)
ENDIF
IF DOES_BLIP_EXIST(s_michael.blip)
REMOVE_BLIP(s_michael.blip)
ENDIF
IF DOES_BLIP_EXIST(s_franklin.blip)
REMOVE_BLIP(s_franklin.blip)
ENDIF
INT i = 0
REPEAT COUNT_OF(s_crew) i
IF DOES_BLIP_EXIST(s_crew[i].blip)
REMOVE_BLIP(s_crew[i].blip)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(blip_vault_doors) i
IF DOES_BLIP_EXIST(blip_vault_doors[i])
REMOVE_BLIP(blip_vault_doors[i])
ENDIF
ENDREPEAT
REPEAT COUNT_OF(blip_chase_cops) i
IF DOES_BLIP_EXIST(blip_chase_cops[i])
REMOVE_BLIP(blip_chase_cops[i])
ENDIF
ENDREPEAT
REPEAT COUNT_OF(s_gold_choppers) i
IF DOES_BLIP_EXIST(s_gold_choppers[i].blip)
REMOVE_BLIP(s_gold_choppers[i].blip)
ENDIF
ENDREPEAT
ENDPROC
PROC REMOVE_ALL_OBJECTS(BOOL b_force_delete = FALSE)
INT i = 0
IF IS_PLAYER_PLAYING(PLAYER_ID())
REPEAT COUNT_OF(obj_gold_trolleys) i
REMOVE_OBJECT(obj_gold_trolleys[i], b_force_delete)
ENDREPEAT
ENDIF
REPEAT COUNT_OF(obj_rope_weights) i
REMOVE_OBJECT(obj_rope_weights[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(obj_pallets) i
REMOVE_OBJECT(obj_pallets[i], b_force_delete)
ENDREPEAT
IF IS_PLAYER_PLAYING(PLAYER_ID())
REPEAT COUNT_OF(obj_gold_containers) i
REMOVE_OBJECT(obj_gold_containers[i], b_force_delete)
ENDREPEAT
ENDIF
REPEAT COUNT_OF(s_rockets) i
REMOVE_OBJECT(s_rockets[i].obj, b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(obj_tunnel_crates) i
REMOVE_OBJECT(obj_tunnel_crates[i], b_force_delete)
ENDREPEAT
REMOVE_OBJECT(obj_vault_gates[0], FALSE)
REMOVE_OBJECT(obj_vault_gates[1], FALSE)
REMOVE_OBJECT(obj_cutscene_weapons[0], TRUE)
REMOVE_OBJECT(obj_cutscene_weapons[1], TRUE)
REMOVE_OBJECT(obj_rope_hook, TRUE)
REMOVE_OBJECT(obj_winch_cutscene_helper[0], TRUE)
REMOVE_OBJECT(obj_winch_cutscene_helper[1], TRUE)
REMOVE_OBJECT(obj_lesters_rpg, b_force_delete)
REMOVE_OBJECT(obj_single_rocket, b_force_delete)
ENDPROC
PROC REMOVE_ALL_PEDS(BOOL b_force_delete = FALSE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], b_force_delete)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], b_force_delete)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], b_force_delete)
REMOVE_PED(s_lester.ped, b_force_delete)
REMOVE_PED(ped_fake_chopper, TRUE)
INT i = 0
REPEAT COUNT_OF(s_crew) i
REMOVE_PED(s_crew[i].ped, b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(ped_cutscene_cops) i
REMOVE_PED(ped_cutscene_cops[i], b_force_delete)
ENDREPEAT
REMOVE_ENEMY_GROUP(s_tunnel_cops_1, b_force_delete)
REMOVE_ENEMY_GROUP(s_tunnel_cops_2, b_force_delete)
REMOVE_ENEMY_GROUP(s_tunnel_cops_2b, b_force_delete)
REMOVE_ENEMY_GROUP(s_tunnel_cops_3, b_force_delete)
REMOVE_ENEMY_GROUP(s_tunnel_cops_new_1, b_force_delete)
REMOVE_ENEMY_GROUP(s_tunnel_cops_new_2, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_heli_bridge, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_heli_bridge_2, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_heli_ramp, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_after_bridge, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_pillars, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_pillars_end, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_start, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_under_bridge, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_after_ramp_blockade, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_after_ramp_blockade_2, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_bridge_flank, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_bridge_start, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_bridge, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_bridge_2, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_before_bridge, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_courtyard_1, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_courtyard_1b, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_courtyard_2, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_courtyard_heli, b_force_delete)
REMOVE_ENEMY_GROUP(s_merry_heli, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_after_courtyard, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_car_park_1, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_car_park_2, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_car_park_3, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_before_car_park, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_before_garage_blockade, b_force_delete)
REMOVE_ENEMY_GROUP(s_cops_before_garage_blockade_2, b_force_delete)
ENDPROC
PROC REMOVE_ALL_VEHICLES(BOOL b_force_delete = FALSE)
REMOVE_VEHICLE(veh_franklins_car, b_force_delete)
REMOVE_VEHICLE(veh_trevors_car, b_force_delete)
REMOVE_VEHICLE(veh_cutter, b_force_delete)
REMOVE_VEHICLE(veh_cops_bridge_heli, b_force_delete)
REMOVE_VEHICLE(veh_cops_heli_bridge_2, b_force_delete)
REMOVE_VEHICLE(veh_chase_cam, TRUE)
REMOVE_VEHICLE(veh_pre_mission_car, FALSE)
REMOVE_VEHICLE(veh_chase_van, b_force_delete)
REMOVE_VEHICLE(veh_final_trailer, b_force_delete)
REMOVE_VEHICLE(veh_final_car, b_force_delete)
REMOVE_VEHICLE(veh_merry_heli, b_force_delete)
REMOVE_VEHICLE(veh_cops_car_park_1, b_force_delete)
REMOVE_VEHICLE(veh_cops_car_park_2, b_force_delete)
REMOVE_VEHICLE(veh_cops_car_park_3, b_force_delete)
REMOVE_VEHICLE(veh_cops_courtyard_heli, b_force_delete)
REMOVE_VEHICLE(veh_cops_heli_ramp, b_force_delete)
REMOVE_VEHICLE(veh_fake_chopper, TRUE)
REMOVE_VEHICLE(veh_getaway_car)
#IF IS_DEBUG_BUILD
REMOVE_VEHICLE(veh_debug, TRUE)
#ENDIF
REMOVE_MISSION_VEHICLE(s_start_car, b_force_delete)
INT i = 0
REPEAT COUNT_OF(s_gold_choppers) i
REMOVE_MISSION_VEHICLE(s_gold_choppers[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(veh_bridge_cops) i
REMOVE_VEHICLE(veh_bridge_cops[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(veh_train_hover_helpers) i
REMOVE_VEHICLE(veh_train_hover_helpers[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(veh_cops_after_ramp_blockade) i
REMOVE_VEHICLE(veh_cops_after_ramp_blockade[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(veh_cops_after_ramp_blockade_2) i
REMOVE_VEHICLE(veh_cops_after_ramp_blockade_2[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(veh_cops_before_garage_blockade) i
REMOVE_VEHICLE(veh_cops_before_garage_blockade[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(veh_cops_before_garage_blockade_2) i
REMOVE_VEHICLE(veh_cops_before_garage_blockade_2[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(veh_cops_blockade_by_car_park) i
REMOVE_VEHICLE(veh_cops_blockade_by_car_park[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(SetPieceCarID) i
REMOVE_VEHICLE(SetPieceCarID[i], b_force_delete)
ENDREPEAT
REPEAT COUNT_OF(veh_car_park_cars) i
REMOVE_VEHICLE(veh_car_park_cars[i], b_force_delete)
ENDREPEAT
ENDPROC
PROC REMOVE_ALL_CAMERAS()
IF DOES_CAM_EXIST(cam_main)
DESTROY_CAM(cam_main)
ENDIF
IF DOES_CAM_EXIST(cam_attach)
DESTROY_CAM(cam_attach)
ENDIF
IF DOES_CAM_EXIST(cam_interp)
DESTROY_CAM(cam_interp)
ENDIF
IF DOES_CAM_EXIST(cam_chase)
DESTROY_CAM(cam_chase)
ENDIF
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_WIDESCREEN_BORDERS(FALSE, 0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
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
//Creates/removes the bank vault gates as forced objects.
PROC SET_VAULT_GATES_AS_FORCED_OBJECTS(BOOL b_set_active, BOOL b_is_skipping_stages = FALSE)
IF b_set_active
CREATE_FORCED_OBJECT(v_vault_gate_pos_1, 20.0, model_vault_gates, TRUE)
CREATE_FORCED_OBJECT(v_vault_gate_pos_2, 20.0, model_vault_gates, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2b.sc - Created forced objects for vault.")
#ENDIF
ELSE
REMOVE_FORCED_OBJECT(v_vault_gate_pos_1, 20.0, model_vault_gates)
REMOVE_FORCED_OBJECT(v_vault_gate_pos_2, 20.0, model_vault_gates)
IF b_is_skipping_stages
CLEAR_AREA_OF_OBJECTS(v_vault_gate_pos_1, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2b.sc - Removed forced objects for vault.")
#ENDIF
ENDIF
ENDPROC
///Grabs the vault gate objects and sets them as owned by the script, this is so they can be kept in the correct state if the player leaves the area.
PROC GRAB_VAULT_GATES(BOOL b_warp_to_start_pos = TRUE)
IF NOT DOES_ENTITY_EXIST(obj_vault_gates[0])
obj_vault_gates[0] = GET_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_1, 20.0, model_vault_gates)
//If we've just grabbed the door make sure it's in the right spot.
IF b_warp_to_start_pos
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
SET_ENTITY_COORDS_NO_OFFSET(obj_vault_gates[0], v_vault_gate_pos_1)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(obj_vault_gates[1])
obj_vault_gates[1] = GET_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_2, 20.0, model_vault_gates)
IF b_warp_to_start_pos
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
SET_ENTITY_COORDS_NO_OFFSET(obj_vault_gates[1], v_vault_gate_pos_2)
ENDIF
ENDIF
ENDIF
ENDPROC
///Moves the vault gates so they don't get in the way of enemy peds during the shootout.
PROC REPOSITION_VAULT_GATES_FOR_SHOOTOUT()
OBJECT_INDEX obj_temp_gate[2]
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
obj_temp_gate[0] = obj_vault_gates[0]
ELSE
obj_temp_gate[0] = GET_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_1, 20.0, model_vault_gates, FALSE)
ENDIF
IF DOES_ENTITY_EXIST(obj_temp_gate[0])
SET_ENTITY_COORDS(obj_temp_gate[0], <<1.883441,-659.381042,15.201376>>)
SET_ENTITY_ROTATION(obj_temp_gate[0], <<0.0,-89.415482,157.947311>>)
ENDIF
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
obj_temp_gate[1] = obj_vault_gates[1]
ELSE
obj_temp_gate[1] = GET_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_2, 20.0, model_vault_gates, FALSE)
ENDIF
IF DOES_ENTITY_EXIST(obj_temp_gate[1])
SET_ENTITY_COORDS(obj_temp_gate[1], <<9.199343,-663.593689,15.201376>>)
SET_ENTITY_ROTATION(obj_temp_gate[1], <<0.0,-89.901085,18.381920>>)
ENDIF
ENDPROC
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
PROC DISABLE_ROADS_FOR_CITY_SHOOTOUT(BOOL bDisable)
IF bDisable
SET_ROADS_IN_ANGLED_AREA(<<-73.934547,-579.552673,39.355595>>, <<-164.055222,-830.317749,27.963964>>, 42.250000, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<-280.868896,-836.965088,38.505768>>, <<-226.580948,-691.600830,30.429825>>, 42.250000, FALSE, FALSE)
ELSE
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-73.934547,-579.552673,39.355595>>, <<-164.055222,-830.317749,27.963964>>, 42.250000)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-280.868896,-836.965088,38.505768>>, <<-226.580948,-691.600830,30.429825>>, 42.250000)
ENDIF
ENDPROC
///Returns if the cutter is spinning.
FUNC BOOL IS_CUTTER_SPINNING()
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
IF IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
///Returns whether a ped is touching the blades at the front of the cutter, if so the ped needs to react (e.g. kill them).
FUNC BOOL IS_PED_TOUCHING_CUTTER_BLADES(PED_INDEX ped)
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
AND NOT IS_PED_INJURED(ped)
IF IS_ENTITY_TOUCHING_ENTITY(ped, veh_cutter)
VECTOR v_offset_1 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<-2.1, 6.85, -0.5>>)
VECTOR v_offset_2 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<2.1, 6.85, 4.0>>)
IF IS_ENTITY_IN_ANGLED_AREA(ped, v_offset_1, v_offset_2, 2.0)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//Forces a stop of the cutter blades, resetting the anims and audio.
PROC STOP_CUTTER_SPINNING()
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
IF IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
OR IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_spinup")
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spindown", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
ENDIF
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
STOP_SOUND(i_cutter_sound_id)
ENDIF
ENDIF
ENDPROC
/// Handles the spinning of the cutter blades if the player is driving it.
PROC UPDATE_CUTTER_SPINNING()
IF NOT IS_ENTITY_DEAD(veh_cutter)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
REQUEST_ANIM_DICT(str_anim_cutter)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), veh_cutter, TRUE)
SET_FOLLOW_VEHICLE_CAM_HIGH_ANGLE_MODE_THIS_UPDATE(FALSE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL_ABILITY_FRANKLIN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
ENDIF
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_01")
AND REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_02")
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), veh_cutter)
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
b_spin_cutter_blades = NOT b_spin_cutter_blades
ENDIF
ELSE
b_spin_cutter_blades = FALSE
ENDIF
IF b_spin_cutter_blades
IF NOT IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
IF NOT IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_spinup")
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spinup", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
ELIF GET_ENTITY_ANIM_CURRENT_TIME(veh_cutter, str_anim_cutter, "cutter_spinup") > 0.99
PLAY_ENTITY_ANIM(veh_cutter, "cutter_run", str_anim_cutter, NORMAL_BLEND_IN, TRUE, TRUE)
ENDIF
ENDIF
IF HAS_SOUND_FINISHED(i_cutter_sound_id)
PLAY_SOUND_FROM_ENTITY(i_cutter_sound_id, "CUTTER", veh_cutter, "BIG_SCORE_3B_SOUNDS")
ENDIF
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 100)
ELSE
IF IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
OR IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_spinup")
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spindown", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
ENDIF
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
STOP_SOUND(i_cutter_sound_id)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_TROLLEY_ARM_IK(PED_INDEX ped, OBJECT_INDEX obj_trolley, BOOL b_instant_blend = FALSE)
INT i_ik_blend_time = -1
IF b_instant_blend
i_ik_blend_time = 0
ENDIF
IF NOT IS_PED_INJURED(ped)
IF IS_ENTITY_ATTACHED_TO_ENTITY(obj_trolley, ped)
SET_IK_TARGET(ped, IK_PART_ARM_LEFT, obj_trolley, GOLD_TROLLEY_BONE_GRIP_LEFT, v_trolley_left_hand_attach, ITF_ARM_TARGET_WRT_IKHELPER, i_ik_blend_time)
SET_IK_TARGET(ped, IK_PART_ARM_RIGHT, obj_trolley, GOLD_TROLLEY_BONE_GRIP_RIGHT, v_trolley_right_hand_attach, ITF_ARM_TARGET_WRT_IKHELPER, i_ik_blend_time)
ENDIF
ENDIF
ENDPROC
PROC UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(PED_INDEX ped, OBJECT_INDEX obj_trolley, BOOL b_instant_blend = FALSE, BOOL b_force_ai_update = FALSE, BOOL b_force_walking_anim = FALSE)
FLOAT f_blend_time = WALK_BLEND_IN
IF b_instant_blend
f_blend_time = INSTANT_BLEND_IN
ENDIF
IF NOT IS_PED_INJURED(ped)
IF HAS_ANIM_DICT_LOADED(str_anim_trolley_push_out)
IF IS_ENTITY_ATTACHED_TO_ENTITY(obj_trolley, ped)
IF IS_PED_WALKING(ped)
OR b_force_walking_anim
IF NOT IS_ENTITY_PLAYING_ANIM(ped, str_anim_trolley_push_out, "push_trolly_walk")
TASK_PLAY_ANIM(ped, str_anim_trolley_push_out, "push_trolly_walk", f_blend_time, -2, -1,
AF_UPPERBODY | AF_SECONDARY | AF_LOOPING | AF_TAG_SYNC_CONTINUOUS)
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(ped, str_anim_trolley_push_out, "push_trolly_stand")
TASK_PLAY_ANIM(ped, str_anim_trolley_push_out, "push_trolly_stand", f_blend_time, -2, -1,
AF_UPPERBODY | AF_SECONDARY | AF_LOOPING | AF_TAG_SYNC_CONTINUOUS)
ENDIF
ENDIF
UPDATE_TROLLEY_ARM_IK(ped, obj_trolley, b_instant_blend)
ELSE
IF IS_ENTITY_PLAYING_ANIM(ped, str_anim_trolley_push_out, "push_trolly_walk")
OR IS_ENTITY_PLAYING_ANIM(ped, str_anim_trolley_push_out, "push_trolly_stand")
CLEAR_PED_SECONDARY_TASK(ped)
ENDIF
ENDIF
ENDIF
ENDIF
IF b_force_ai_update
FORCE_PED_AI_AND_ANIMATION_UPDATE(ped)
ENDIF
ENDPROC
PROC UPDATE_CREW_MEMBER_DURING_DRILL_SECTION()
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
VECTOR v_default_pos = <<22.8719, -638.4583, 15.0881>>
FLOAT f_default_heading = 133.7838
FLOAT f_heading_diff = ABSF(GET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped) - f_default_heading)
IF f_heading_diff > 180.0
f_heading_diff = ABSF(f_heading_diff - 360.0)
ENDIF
REQUEST_ANIM_DICT(str_anim_ig_2)
IF VDIST2(GET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped), v_default_pos) > 4.0
OR (f_heading_diff > 45.0 AND GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK)
OR IS_PED_RAGDOLL(s_crew[CREW_FRANKLIN_ID].ped)
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
IF NOT IS_POSITION_OCCUPIED(v_default_pos, 0.5, FALSE, TRUE, FALSE, FALSE, FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(s_crew[CREW_FRANKLIN_ID].ped, v_default_pos, PEDMOVE_WALK, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, f_default_heading)
ENDIF
ENDIF
ELSE
IF HAS_ANIM_DICT_LOADED(str_anim_ig_2)
IF IS_ENTITY_PLAYING_ANIM(s_crew[CREW_FRANKLIN_ID].ped, str_anim_ig_2, "base")
IF s_crew[CREW_FRANKLIN_ID].i_timer = 0
TASK_LOOK_AT_ENTITY(s_crew[CREW_FRANKLIN_ID].ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
s_crew[CREW_FRANKLIN_ID].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
ELIF GET_GAME_TIMER() - s_crew[CREW_FRANKLIN_ID].i_timer > 0
INT i_random = GET_RANDOM_INT_IN_RANGE(0, 6)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF i_random = 0
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
ELIF i_random = 1
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_b", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
ELIF i_random = 2
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_c", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
ELIF i_random = 3
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_d", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
ELIF i_random = 4
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_e", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
ELIF i_random = 5
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_f", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
ENDIF
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_FRANKLIN_ID].i_timer = 0
ENDIF
ELIF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
TASK_PLAY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, str_anim_ig_2, "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
s_crew[CREW_FRANKLIN_ID].i_timer = 0
ENDIF
ENDIF
ENDIF
//If the player drives the cutter into the crew, kill them and fail the mission.
IF IS_CUTTER_SPINNING()
IF IS_PED_TOUCHING_CUTTER_BLADES(s_crew[CREW_FRANKLIN_ID].ped)
SET_PED_TO_RAGDOLL(s_crew[CREW_FRANKLIN_ID].ped, 1000, 3000, TASK_NM_BALANCE)
APPLY_DAMAGE_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped) + 50, TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
/// Handles the behaviour for the crew member while he collects the gold and loads it into the containers.
PROC UPDATE_CREW_MEMBER_COLLECTING_GOLD()
VECTOR v_sync_scene_pos_first_trolley = <<8.862, -659.407, 15.130>>
VECTOR v_sync_scene_rot_first_trolley = <<0.000, -0.000, -110.000>>
VECTOR v_sync_scene_pos_second_trolley = <<8.862, -659.407, 15.130>>
VECTOR v_sync_scene_rot_second_trolley = <<0.000, -0.000, -110.000>>
#IF IS_DEBUG_BUILD
INT iPrevEvent = s_crew[CREW_FRANKLIN_ID].i_event
#ENDIF
REQUEST_WAYPOINT_RECORDING(str_waypoint_gold_enter_left)
REQUEST_WAYPOINT_RECORDING(str_waypoint_gold_exit_left)
REQUEST_WAYPOINT_RECORDING(str_waypoint_gold_enter_right)
REQUEST_WAYPOINT_RECORDING(str_waypoint_gold_exit_right)
REQUEST_ANIM_DICT(str_anim_trolley_push_out)
REQUEST_ANIM_DICT(str_anim_trolley_push_in)
REQUEST_ANIM_DICT(str_anim_crew_action_idle)
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_gold_enter_left)
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_gold_exit_left)
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_gold_enter_right)
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_gold_exit_right)
SEQUENCE_INDEX seq
VECTOR v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped)
FLOAT f_dist_to_destination
BOOL b_is_in_combat = (IS_PED_IN_COMBAT(s_crew[CREW_FRANKLIN_ID].ped) OR GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
BOOL b_safe_to_warp
INT i_num_nodes
//1410350 - The gold trolley has been moved further away from the door, however this doesn't match the anim so move it back when it's off-screen.
IF NOT b_gold_trolley_warped_for_anim
IF e_mission_stage = STAGE_COLLECT_GOLD
IF NOT IS_SPHERE_VISIBLE(<<1.913392,-660.422180,15.524313>>, 5.0)
OR IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_trolleys[1], <<1.913392,-660.422180,15.524313>>)
b_gold_trolley_warped_for_anim = TRUE
ENDIF
ENDIF
ENDIF
SWITCH s_crew[CREW_FRANKLIN_ID].i_event
CASE 0 //Run up to the first trolley.
IF e_mission_stage = STAGE_COLLECT_GOLD //Don't start collecting the gold until the player has blown up the doors.
OR (e_mission_stage = STAGE_BLOW_UP_DOORS AND b_vault_door_blown_up[0] AND b_vault_door_blown_up[1])
IF HAS_ANIM_DICT_LOADED(str_anim_trolley_push_out)
s_crew[CREW_FRANKLIN_ID].v_dest = <<11.9118, -664.0375, 15.1306>>
WAYPOINT_RECORDING_GET_NUM_POINTS(str_waypoint_gold_enter_left, i_num_nodes)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<9.8700, -647.2407, 15.0856>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_enter_left, 0,
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END, -1)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_RUN, 20000, 0.25, ENAV_STOP_EXACTLY | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, 74.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
TASK_CLEAR_LOOK_AT(s_crew[CREW_FRANKLIN_ID].ped)
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_AvoidTearGas, FALSE)
//SET_ENTITY_LOAD_COLLISION_FLAG(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
ELSE
//If the shootout started early then put him into combat.
IF s_tunnel_cops_new_1[0].i_event > 0
IF NOT IS_PED_IN_COMBAT(s_crew[CREW_FRANKLIN_ID].ped)
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) = 0
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) != 0
s_crew[CREW_FRANKLIN_ID].v_dest = <<7.6011, -643.7367, 15.0968>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_FRANKLIN_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE, -1, "DEFAULT_ACTION")
ENDIF
ELSE
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.6473, -644.7507, 15.0884>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_FRANKLIN_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE, -1, "DEFAULT_ACTION")
TASK_CLEAR_LOOK_AT(s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
ENDIF
ELSE
UPDATE_CREW_MEMBER_DURING_DRILL_SECTION()
ENDIF
ENDIF
BREAK
CASE 1 //Take the first trolley to a container.
IF VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 100.0
AND NOT IS_ENTITY_ON_SCREEN(s_crew[CREW_FRANKLIN_ID].ped)
AND NOT IS_ENTITY_ON_SCREEN(obj_gold_trolleys[0])
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<6.524613,-658.553345,14.880713>>, <<3.670824,-666.549072,18.166275>>, 17.250000)
b_safe_to_warp = TRUE
ENDIF
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
IF IS_ENTITY_STATIC(obj_vault_gates[1])
ACTIVATE_PHYSICS(obj_vault_gates[1])
ENDIF
ENDIF
LOAD_STREAM("Gold_Cart_Push_Anim_01", "BIG_SCORE_3B_SOUNDS")
IF (VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 4.0
AND ABSF(GET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped) - 74.0) < 20.0)
OR b_safe_to_warp
//FREEZE_ENTITY_POSITION(obj_gold_trolleys[0], FALSE)
//ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[0], s_crew[CREW_FRANKLIN_ID].ped, -1, v_trolley_attach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_UNARMED, TRUE)
s_crew[CREW_FRANKLIN_ID].i_sync_scene = CREATE_SYNCHRONIZED_SCENE(v_sync_scene_pos_first_trolley, v_sync_scene_rot_first_trolley)
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].i_sync_scene, str_anim_trolley_push_out, "push_out_vault_l",
SLOW_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS,
RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_IMPACT_OBJECT | RBF_MELEE, SLOW_BLEND_IN)
SET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene, 0.0)
FORCE_PED_AI_AND_ANIMATION_UPDATE(s_crew[CREW_FRANKLIN_ID].ped)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
IF LOAD_STREAM("Gold_Cart_Push_Anim_01", "BIG_SCORE_3B_SOUNDS")
PLAY_STREAM_FROM_OBJECT(obj_gold_trolleys[0])
ENDIF
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
BREAK
CASE 2 //Once the sync scene finishes go into walking
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_UseKinematicPhysics, TRUE)
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_DontWalkRoundObjects, TRUE)
IF NOT IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.05)
FREEZE_ENTITY_POSITION(obj_gold_trolleys[0], FALSE)
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[0], s_crew[CREW_FRANKLIN_ID].ped, -1, v_trolley_attach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
ENDIF
ELSE
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
ENDIF
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
IF IS_ENTITY_STATIC(obj_vault_gates[1])
ACTIVATE_PHYSICS(obj_vault_gates[1])
ENDIF
IF NOT b_moved_doors_out_of_way[1]
VECTOR vRot
vRot = GET_ENTITY_ROTATION(obj_vault_gates[1])
IF NOT (vRot.y < 95.0 AND vRot.y > 85.0)
AND NOT (vRot.y < 275.0 AND vRot.y > 265.0)
APPLY_FORCE_TO_ENTITY(obj_vault_gates[1], APPLY_TYPE_IMPULSE, <<-0.2, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE, FALSE, FALSE)
b_moved_doors_out_of_way[1] = TRUE
i_door_force_timer[1] = GET_GAME_TIMER()
ENDIF
ELSE
IF GET_GAME_TIMER() - i_door_force_timer[1] < 1000
APPLY_FORCE_TO_ENTITY(obj_vault_gates[1], APPLY_TYPE_FORCE, <<-0.2, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE, FALSE, FALSE)
ENDIF
ENDIF
ENDIF
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.95)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
IF IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
STOP_SYNCHRONIZED_ENTITY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, WALK_BLEND_OUT, TRUE)
s_crew[CREW_FRANKLIN_ID].i_sync_scene = -1
ENDIF
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
s_crew[CREW_FRANKLIN_ID].v_dest = <<19.6414, -636.7057, 15.2876>>
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_exit_right, 0,
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<10.8, -643.7, 15.3>>, PEDMOVE_WALK, DEFAULT)
//TASK_GO_STRAIGHT_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_WALK, DEFAULT, -69.5523)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
//If the player gets in the way while the synced scene is running then make them ragdoll.
IF NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
AND GET_ENTITY_SPEED(PLAYER_PED_ID()) < 0.1
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), obj_gold_trolleys[0])
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.0>>),
1.5)
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 1000, 3000, TASK_NM_BALANCE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 3 //Play synced scene of pushing the gold into the trolley.
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_UseKinematicPhysics, TRUE)
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_DontWalkRoundObjects, TRUE)
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
//DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 3.0, 0.0>>), 0.5)
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.5>>),
2.5)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.0>>),
2.5)
b_trolley_sequence_is_being_blocked = TRUE
ELSE
b_trolley_sequence_is_being_blocked = FALSE
ENDIF
IF NOT b_trolley_sequence_is_being_blocked
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_exit_right, 0,
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<10.8, -643.7, 15.3>>, PEDMOVE_WALK, DEFAULT)
//TASK_GO_STRAIGHT_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_WALK, DEFAULT, -69.5523)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF VDIST(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 1.0
s_crew[CREW_FRANKLIN_ID].i_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(s_crew[CREW_FRANKLIN_ID].i_sync_scene, obj_gold_containers[0], -1)
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].i_sync_scene, str_anim_trolley_push_in, "put_to_container_r", WALK_BLEND_IN, WALK_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_IMPACT_OBJECT | RBF_MELEE, WALK_BLEND_IN)
SET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene, 0.0)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
//Play some general dialogue about not getting shot.
IF NOT b_has_text_label_triggered[BS2B_MTL1]
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_MTL")
b_has_text_label_triggered[BS2B_MTL1] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_STAND_STILL) != PERFORMING_TASK
TASK_STAND_STILL(s_crew[CREW_FRANKLIN_ID].ped, -1)
ENDIF
IF NOT b_has_text_label_triggered[BS2B_MOVE1]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_MOVE")
b_has_text_label_triggered[BS2B_MOVE1] = TRUE
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER() - i_time_since_player_last_shot > 7000
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(s_crew[CREW_FRANKLIN_ID].ped)
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_crew[CREW_FRANKLIN_ID].ped, PLAYER_PED_ID())
IF GET_GAME_TIMER() - i_gunman_trouble_dialogue_timer > 15000
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) > 0
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_TRB")
i_gunman_trouble_dialogue_timer = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
ELSE
i_gunman_trouble_dialogue_timer = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 4 //Once the synced scene is finished then run to the next trolley.
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.84)
VECTOR v_attach_offset, v_attach_rot
v_attach_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(obj_gold_containers[0], GET_ENTITY_COORDS(obj_gold_trolleys[0]))
v_attach_rot = GET_ENTITY_ROTATION(obj_gold_trolleys[0]) - GET_ENTITY_ROTATION(obj_gold_containers[0])
DETACH_ENTITY(obj_gold_trolleys[0], FALSE)
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0], 0, v_attach_offset, v_attach_rot)
ENDIF
ENDIF
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.98)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
s_crew[CREW_FRANKLIN_ID].v_dest = <<0.300851,-659.911865, 15.1306>>
STOP_SYNCHRONIZED_ENTITY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, WALK_BLEND_OUT, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<9.8700, -647.2407, 15.0856>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_enter_right, 0,
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END, -1)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_RUN, 20000, 0.25, ENAV_STOP_EXACTLY | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, 250.2183)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
STOP_STREAM()
i_current_take += MAX_OVERALL_TAKE / 2
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
BREAK
CASE 5 //Take the second trolley to the container.
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
//Say a line about the first container being loaded.
IF NOT b_has_text_label_triggered[BS2B_CRGOLD1]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_GLD1")
b_has_text_label_triggered[BS2B_CRGOLD1] = TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
IF IS_ENTITY_STATIC(obj_vault_gates[0])
ACTIVATE_PHYSICS(obj_vault_gates[0])
ENDIF
ENDIF
IF VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 100.0
AND NOT IS_ENTITY_ON_SCREEN(s_crew[CREW_FRANKLIN_ID].ped)
AND NOT IS_ENTITY_ON_SCREEN(obj_gold_trolleys[1])
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<6.524613,-658.553345,14.880713>>, <<3.670824,-666.549072,18.166275>>, 17.250000)
b_safe_to_warp = TRUE
ENDIF
LOAD_STREAM("Gold_Cart_Push_Anim_02", "BIG_SCORE_3B_SOUNDS")
IF (VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 4.0
AND ABSF(GET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped) - 250.2183) < 20.0)
OR b_safe_to_warp
//FREEZE_ENTITY_POSITION(obj_gold_trolleys[1], FALSE)
//ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[1], s_crew[CREW_FRANKLIN_ID].ped, -1, v_trolley_attach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_UNARMED, TRUE)
s_crew[CREW_FRANKLIN_ID].i_sync_scene = CREATE_SYNCHRONIZED_SCENE(v_sync_scene_pos_second_trolley, v_sync_scene_rot_second_trolley)
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].i_sync_scene, str_anim_trolley_push_out, "push_out_vault_r", SLOW_BLEND_IN, WALK_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_IMPACT_OBJECT | RBF_MELEE)
SET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene, 0.0)
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
IF LOAD_STREAM("Gold_Cart_Push_Anim_02", "BIG_SCORE_3B_SOUNDS")
PLAY_STREAM_FROM_OBJECT(obj_gold_trolleys[1])
ENDIF
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
BREAK
CASE 6 //Once the sync scene finishes go into walking
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_UseKinematicPhysics, TRUE)
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_DontWalkRoundObjects, TRUE)
IF NOT IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.05)
FREEZE_ENTITY_POSITION(obj_gold_trolleys[1], FALSE)
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[1], s_crew[CREW_FRANKLIN_ID].ped, -1, v_trolley_attach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
ENDIF
ELSE
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
ENDIF
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
IF IS_ENTITY_STATIC(obj_vault_gates[0])
ACTIVATE_PHYSICS(obj_vault_gates[0])
ENDIF
IF NOT b_moved_doors_out_of_way[0]
VECTOR vRot
vRot = GET_ENTITY_ROTATION(obj_vault_gates[0])
IF NOT (vRot.y < 95.0 AND vRot.y > 85.0)
AND NOT (vRot.y < 275.0 AND vRot.y > 265.0)
APPLY_FORCE_TO_ENTITY(obj_vault_gates[0], APPLY_TYPE_IMPULSE, <<0.2, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE, FALSE, FALSE)
b_moved_doors_out_of_way[0] = TRUE
i_door_force_timer[0] = GET_GAME_TIMER()
ENDIF
ELSE
IF GET_GAME_TIMER() - i_door_force_timer[0] < 1000
APPLY_FORCE_TO_ENTITY(obj_vault_gates[0], APPLY_TYPE_FORCE, <<0.2, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE, FALSE, FALSE)
ENDIF
ENDIF
ENDIF
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.95)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
IF IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
STOP_SYNCHRONIZED_ENTITY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, WALK_BLEND_OUT, TRUE)
s_crew[CREW_FRANKLIN_ID].i_sync_scene = -1
ENDIF
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.9730, -641.9811, 16.0158>>
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_exit_left, 0,
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<10.8, -643.7, 15.3>>, PEDMOVE_WALK, DEFAULT)
//TASK_GO_STRAIGHT_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_WALK, DEFAULT, -84.4459)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
//If the player gets in the way while the synced scene is running then make them ragdoll.
IF NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
AND GET_ENTITY_SPEED(PLAYER_PED_ID()) < 0.1
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), obj_gold_trolleys[1])
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.0>>),
1.5)
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 1000, 3000, TASK_NM_BALANCE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 7 //Play final synced scene once hitting the locate.
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_UseKinematicPhysics, TRUE)
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_DontWalkRoundObjects, TRUE)
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.5>>),
2.5)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.0>>),
2.5)
b_trolley_sequence_is_being_blocked = TRUE
ELSE
b_trolley_sequence_is_being_blocked = FALSE
ENDIF
IF NOT b_trolley_sequence_is_being_blocked
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_exit_left, 0,
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<10.8, -643.7, 15.3>>, PEDMOVE_WALK, DEFAULT)
//TASK_GO_STRAIGHT_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_WALK, DEFAULT, -84.4459)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF VDIST(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 0.25
OR (GET_ENTITY_SPEED(s_crew[CREW_FRANKLIN_ID].ped) < 0.1 AND VDIST(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 1.0) //In case the player tries to block them.
s_crew[CREW_FRANKLIN_ID].i_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(s_crew[CREW_FRANKLIN_ID].i_sync_scene, obj_gold_containers[1], -1)
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].i_sync_scene, str_anim_trolley_push_in, "put_to_container_l", WALK_BLEND_IN, WALK_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_IMPACT_OBJECT | RBF_MELEE, WALK_BLEND_IN)
SET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene, 0.0)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
b_crew_nearly_finished_trolleys = TRUE
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
//Play some general dialogue about not getting shot.
IF NOT b_has_text_label_triggered[BS2B_MTL2]
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_MTL")
b_has_text_label_triggered[BS2B_MTL2] = TRUE
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER() - i_time_since_player_last_shot > 7000
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(s_crew[CREW_FRANKLIN_ID].ped)
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_crew[CREW_FRANKLIN_ID].ped, PLAYER_PED_ID())
IF GET_GAME_TIMER() - i_gunman_trouble_dialogue_timer > 15000
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) > 0
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_TRB")
i_gunman_trouble_dialogue_timer = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
ELSE
i_gunman_trouble_dialogue_timer = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_STAND_STILL) != PERFORMING_TASK
TASK_STAND_STILL(s_crew[CREW_FRANKLIN_ID].ped, -1)
ENDIF
IF NOT b_has_text_label_triggered[BS2B_MOVE2]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_MOVE")
b_has_text_label_triggered[BS2B_MOVE2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 8 //Go into combat after reaching the second container.
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.79)
VECTOR v_attach_offset, v_attach_rot
v_attach_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(obj_gold_containers[1], GET_ENTITY_COORDS(obj_gold_trolleys[1]))
v_attach_rot = GET_ENTITY_ROTATION(obj_gold_trolleys[1]) - GET_ENTITY_ROTATION(obj_gold_containers[1])
DETACH_ENTITY(obj_gold_trolleys[1], FALSE)
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1], 0, v_attach_offset, v_attach_rot)
ENDIF
ENDIF
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.99)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.6473, -644.7507, 15.0884>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].cover, s_crew[CREW_FRANKLIN_ID].v_dest, -123.1, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_FRANKLIN_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE, -1, "DEFAULT_ACTION")
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, FALSE)
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_AvoidTearGas, TRUE)
STOP_STREAM()
i_current_take += MAX_OVERALL_TAKE / 2
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = TRUE
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event = 50
ENDIF
BREAK
CASE 50 //Fight the enemies if they're still alive.
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
IF NOT s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 4.0, 2.0)
IF s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.6473, -644.7507, 15.0884>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].cover, s_crew[CREW_FRANKLIN_ID].v_dest, -123.1, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_FRANKLIN_ID].v_dest = <<12.6860, -644.9421, 15.0881>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].cover, s_crew[CREW_FRANKLIN_ID].v_dest, 229.0679, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = TRUE
ENDIF
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest)
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) = 0
s_crew[CREW_FRANKLIN_ID].v_dest = <<7.6011, -643.7367, 15.0968>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].cover, s_crew[CREW_FRANKLIN_ID].v_dest, -141.1, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ELSE
IF s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
IF s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = FALSE
ENDIF
ENDIF
ENDIF
BREAK
CASE 51 //Run back to the trolleys once everyone is dead.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) = 0
AND HAS_ANIM_DICT_LOADED(str_anim_crew_action_idle)
WEAPON_TYPE e_current_weapon
GET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, e_current_weapon)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<22.4168, -640.2405, 15.0690>>, PEDMOVE_RUN, -1, 0.5, ENAV_SUPPRESS_EXACT_STOP)
IF e_current_weapon = WEAPONTYPE_UNARMED
TASK_PLAY_ANIM(NULL, str_anim_crew_action_idle, "idle", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
ENDIF
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
BREAK
ENDSWITCH
//Say a line about the second container.
IF NOT b_has_text_label_triggered[BS2B_CRGOLD2]
AND s_crew[CREW_FRANKLIN_ID].i_event >= 50
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_GLD2")
b_has_text_label_triggered[BS2B_CRGOLD2] = TRUE
ENDIF
ENDIF
ENDIF
IF IS_PED_RAGDOLL(s_crew[CREW_FRANKLIN_ID].ped)
BOOL b_trolley_detached = FALSE
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
DETACH_ENTITY(obj_gold_trolleys[0], TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[0], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
b_trolley_detached = TRUE
ENDIF
ENDIF
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
DETACH_ENTITY(obj_gold_trolleys[1], TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[1], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
b_trolley_detached = TRUE
ENDIF
ENDIF
IF b_trolley_detached
STOP_STREAM()
APPLY_DAMAGE_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped) + 50, TRUE)
ENDIF
ELSE
IF IS_ENTITY_ON_FIRE(s_crew[CREW_FRANKLIN_ID].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, NORMAL_BLEND_OUT, TRUE)
SET_PED_TO_RAGDOLL(s_crew[CREW_FRANKLIN_ID].ped, 1000, 3000, TASK_NM_BALANCE)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
DETACH_ENTITY(obj_gold_trolleys[0], TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[0], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
ENDIF
ENDIF
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
DETACH_ENTITY(obj_gold_trolleys[1], TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[1], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
ENDIF
ENDIF
STOP_STREAM()
ENDIF
#IF IS_DEBUG_BUILD
IF iPrevEvent != s_crew[CREW_FRANKLIN_ID].i_event
PRINTLN("finale_heist2b.sc - Crew event changed from ", iPrevEvent, " to ", s_crew[CREW_FRANKLIN_ID].i_event)
ENDIF
#ENDIF
ENDPROC
PROC UPDATE_GUNMAN_FOR_VAULT_SHOOTOUT()
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
BOOL b_is_in_combat = (IS_PED_IN_COMBAT(s_crew[CREW_FRANKLIN_ID].ped) OR GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
FLOAT f_dist_to_destination = 0.0
SEQUENCE_INDEX seq
SWITCH s_crew[CREW_FRANKLIN_ID].i_event
CASE 0
SET_PED_COMBAT_PARAMS(s_crew[CREW_FRANKLIN_ID].ped, i_crew_franklin_default_accuracy, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_MAX_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
SET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
SET_RAGDOLL_BLOCKING_FLAGS(s_crew[CREW_FRANKLIN_ID].ped, RBF_BULLET_IMPACT)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_PINNED_DOWN, TRUE)
s_crew[CREW_FRANKLIN_ID].v_dest = <<9.6572, -657.1654, 15.0412>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0)
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = TRUE
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_event++
BREAK
CASE 1
IF NOT s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover
s_crew[CREW_FRANKLIN_ID].v_dest = <<9.6572, -657.1654, 15.0412>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0)
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_FRANKLIN_ID].v_dest = <<4.5155, -655.4434, 15.0952>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0)
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = TRUE
ENDIF
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(GET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped), s_crew[CREW_FRANKLIN_ID].v_dest)
IF IS_PED_IN_COVER(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
IF b_picked_good_franklin_gunman
AND NOT s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover
IF s_crew[CREW_FRANKLIN_ID].i_timer = 0
GIVE_WEAPON_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_GRENADE, 10, FALSE, TRUE)
s_crew[CREW_FRANKLIN_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_FRANKLIN_ID].i_timer > 2000
SET_PED_ACCURACY(s_crew[CREW_FRANKLIN_ID].ped, 100)
//TASK_THROW_PROJECTILE(s_crew[CREW_FRANKLIN_ID].ped, <<-1.7, -675.2659, 18.5308>>)
TASK_THROW_PROJECTILE(s_crew[CREW_FRANKLIN_ID].ped, <<-0.6, -671.5, 16.6308>>)
s_crew[CREW_FRANKLIN_ID].i_timer = GET_GAME_TIMER()
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
ELSE
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
ELSE
//Update the tasks if a refresh is required (player stole cover or ped was knocked out of tasks in some way)
IF s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<12.3624, -644.3405, 15.0881>>, <<1.6, -671.4, 16.9>>, PEDMOVE_RUN, FALSE, 1.0, 1.0, TRUE, ENAV_NO_STOPPING)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, <<1.6, -671.4, 16.9>>, PEDMOVE_RUN, TRUE, 1.0, 1.0, TRUE, ENAV_NO_STOPPING)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, -1, FALSE, SLOW_BLEND_DURATION, TRUE, FALSE, NULL, TRUE)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = FALSE
ENDIF
ENDIF
BREAK
CASE 2
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_THROW_PROJECTILE) != PERFORMING_TASK
OR GET_GAME_TIMER() - s_crew[CREW_FRANKLIN_ID].i_timer > 5000 //Just in case the grenade task fails.
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_FRANKLIN_ID].ped, 150.0)
SET_PED_ACCURACY(s_crew[CREW_FRANKLIN_ID].ped, i_crew_franklin_default_accuracy)
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
BREAK
CASE 3
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2b) = 0
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.0950, -658.6571, 15.1084>>
REMOVE_COVER_POINT(s_crew[CREW_FRANKLIN_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0)
s_crew[CREW_FRANKLIN_ID].i_event++
ENDIF
BREAK
CASE 4
IF b_has_text_label_triggered[F3B_SWITREV]
IF NOT IS_PED_IN_COVER(s_crew[CREW_FRANKLIN_ID].ped)
AND GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_SEEK_COVER_TO_COORDS) != PERFORMING_TASK
TASK_SEEK_COVER_TO_COORDS(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, <<24.5, -637.6, 18.1>>, -1)
ENDIF
ENDIF
BREAK
ENDSWITCH
IF IS_ENTITY_ON_FIRE(s_crew[CREW_FRANKLIN_ID].ped)
IF GET_GAME_TIMER() - s_crew[CREW_FRANKLIN_ID].i_fire_timer > 4000
APPLY_DAMAGE_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped) + 100, TRUE)
ENDIF
ELSE
s_crew[CREW_FRANKLIN_ID].i_fire_timer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDPROC
PROC RUBBER_BAND_CHASE(FLOAT &fCurrentSpeed, VEHICLE_INDEX vehPlayer, VEHICLE_INDEX vehTrigger)
IF IS_VEHICLE_DRIVEABLE(vehTrigger)
AND IS_VEHICLE_DRIVEABLE(vehPlayer)
VECTOR vPlayerPos = GET_ENTITY_COORDS(vehPlayer)
VECTOR vTriggerPos = GET_ENTITY_COORDS(vehTrigger)
//As it's a chopper chase remove the z from the calculations, otherwise the player could get ahead just by flying higher than the trigger.
vPlayerPos.z = 0.0
vTriggerPos.z = 0.0
//Rubber banding
FLOAT fDist = VDIST(vPlayerPos, vTriggerPos)
FLOAT fTouchingDist = 10.0
FLOAT fDesiredDist = 18.0
FLOAT fMaxDist = 50.0
FLOAT fSuperMaxDist = 100.0
FLOAT fDesiredPlaybackSpeed = 1.0
FLOAT fAccel = 0.01
FLOAT fPlayersSpeedModifier = 0.0
FLOAT fMaxDistInFront = 30.0
FLOAT fSpeedDiff = GET_ENTITY_SPEED(vehTrigger) - GET_ENTITY_SPEED(vehPlayer)
//Special cases: at these points we want the buddy to be further from or nearer to the player than normal
IF e_mission_stage >= STAGE_CHOPPER_CHASE
IF f_chase_playback_time > 100000.0
fTouchingDist = 30.0
fDesiredDist = 50.0
fMaxDist = 100.0
fSuperMaxDist = 150.0
ENDIF
ENDIF
FLOAT fDistRatio = 0.0
//VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrigger, vPlayerPos)
IF NOT IS_PED_IN_FRONT_OF_CAR(PLAYER_PED_ID(), vehTrigger)
//Player is behind
IF fDist > fMaxDist
//Player is a long way behind, slow the trigger car down by a lot (if not on screen).
BOOl bInsanelyFarBehind = FALSE
IF fDist > fSuperMaxDist
IF fDist > 200.0
bInsanelyFarBehind = TRUE
ENDIF
fDist = fSuperMaxDist
ENDIF
fDistRatio = ((fDist - fMaxDist) / (fSuperMaxDist - fMaxDist))
IF IS_ENTITY_ON_SCREEN(vehTrigger) AND NOT bInsanelyFarBehind
IF fSpeedDiff > 10.0
fDesiredPlaybackSpeed = 0.7 - (0.2 * fDistRatio)
ELSE
fDesiredPlaybackSpeed = 0.7 - (0.1 * fDistRatio)
ENDIF
ELSE
fDesiredPlaybackSpeed = 0.7 - (0.25 * fDistRatio)
ENDIF
ELIF fDist > fDesiredDist
//Player is somewhat behind, slow the trigger car down relative to how far behind the player is.
fDistRatio = ((fDist - fDesiredDist) / (fMaxDist - fDesiredDist))
fDesiredPlaybackSpeed = 1.0 - (0.3 * fDistRatio)
ELSE
//Player is getting too close, speed up the trigger car relative to how close the player is.
IF fDist < fTouchingDist
fDist = fTouchingDist
ENDIF
fDistRatio = (fDesiredDist - fDist) / (fDesiredDist - fTouchingDist)
fDesiredPlaybackSpeed = 1.0 + (fDistRatio)
ENDIF
ELSE
//Player is in front, speed up trigger car based on the player's own speed.
IF fDist > fMaxDistInFront
fDist = fMaxDistInFront
ENDIF
fDistRatio = fDist / fMaxDistInFront
//If the player is already going slower then don't speed up the buddy as much.
IF fSpeedDiff > 0.0
fDistRatio = fDistRatio * 0.5
ENDIF
IF GET_ENTITY_SPEED(vehPlayer) < 5.0 //If the player has slowed down slow the buddy down so it's not as harsh if they plough through.
AND fSpeedDiff > 0.0
fDesiredPlaybackSpeed = 0.6 + fDistRatio
ELSE
fDesiredPlaybackSpeed = 1.0 + fDistRatio
ENDIF
ENDIF
//If the trigger speed is trying to catch up from really slow then increase the acceleration.
IF fCurrentSpeed < 1.0
AND fDesiredPlaybackSpeed > fCurrentSpeed
fAccel *= 2.0
ENDIF
IF e_mission_stage >= STAGE_CHOPPER_CHASE
IF fDesiredPlaybackSpeed > 1.5
fDesiredPlaybackSpeed = 1.5
ENDIF
IF fDesiredPlaybackSpeed > 1.05
AND fDesiredPlaybackSpeed < fCurrentSpeed
fAccel *= 0.5
ENDIF
ENDIF
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
fDesiredPlaybackSpeed = 1.0
ENDIF
//Modify the player's speed further based on the desired speed.
IF fDesiredPlaybackSpeed > 1.0
fPlayersSpeedModifier = fPlayersSpeedModifier - ((fDesiredPlaybackSpeed - 1.0) * 10.0)
ENDIF
//Make the speed changes.
fCurrentSpeed = fCurrentSpeed +@ (((fDesiredPlaybackSpeed - fCurrentSpeed) * fAccel) * 30.0)
#IF IS_DEBUG_BUILD
IF b_debug_show_chase_stats
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 str_dist = "Distance: "
str_dist += GET_STRING_FROM_FLOAT(fDist)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.1, "STRING", str_dist)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 str_desired_speed = "Desired playback speed: "
str_desired_speed += GET_STRING_FROM_FLOAT(fDesiredPlaybackSpeed)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", str_desired_speed)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 str_speed = "Playback speed: "
str_speed += GET_STRING_FROM_FLOAT(fCurrentSpeed)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.2, "STRING", str_speed)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 str_time = "Time: "
str_time += GET_STRING_FROM_FLOAT(f_chase_playback_time)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.25, "STRING", str_time)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 str_diff = "Speed Diff: "
str_diff += GET_STRING_FROM_FLOAT(GET_ENTITY_SPEED(vehTrigger) - GET_ENTITY_SPEED(vehPlayer))
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.3, "STRING", str_diff)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strAccel = "Accel: "
strAccel += GET_STRING_FROM_FLOAT(fAccel)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.35, "STRING", strAccel)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 str_state = "Trigger car state: "
IF IS_PED_IN_FRONT_OF_CAR(PLAYER_PED_ID(), vehTrigger)
str_state += "in front and "
ELSE
str_state += "behind and "
ENDIF
IF IS_ENTITY_ON_SCREEN(vehTrigger)
str_state += "on screen."
ELSE
str_state += "off screen."
ENDIF
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.4, "STRING", str_state)
ENDIF
#ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the crew chopper behaviour during the collect gold stages. The crew recording has a number of sections where the chopper will hover
/// and wait for the mission to progress.
/// PARAMS:
/// e_current_stage - The current heli stage the recording should be at.
PROC UPDATE_CREW_HELI_PLAYBACK(CREW_HELI_STAGE e_heli_stage, BOOL b_dont_restart = FALSE)
REQUEST_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
AND NOT b_dont_restart
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
IF e_heli_stage = HELI_STAGE_FLY_TO_BANK
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 1000.0)
ELIF e_heli_stage = HELI_STAGE_WAIT_FOR_TREVOR
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 25000.0)
ELIF e_heli_stage = HELI_STAGE_HOVER_OVER_TUNNEL
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 45000.0)
ELIF e_heli_stage = HELI_STAGE_LEAVE_BANK
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 58000.0)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
//If the container is attached then it needs to be warped to match the recording warp.
IF DOES_ENTITY_EXIST(obj_gold_containers[1])
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, v_rope_heli_attach_offset + <<0.0, 0.0, -ROPE_START_LENGTH>>))
ENDIF
ELSE
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh)
IF e_heli_stage = HELI_STAGE_FLY_TO_BANK
CONVERGE_VALUE(f_crew_heli_speed, 1.0, 0.5, TRUE)
ELIF e_heli_stage = HELI_STAGE_WAIT_FOR_TREVOR
IF f_playback_time < 27000.0
CONVERGE_VALUE(f_crew_heli_speed, 1.0, 0.5, TRUE)
ELIF f_playback_time > 30000.0
CONVERGE_VALUE(f_crew_heli_speed, -1.0, 0.5, TRUE)
ENDIF
ELIF e_heli_stage = HELI_STAGE_HOVER_OVER_TUNNEL
IF f_playback_time < 46000.0
CONVERGE_VALUE(f_crew_heli_speed, 1.0, 0.5, TRUE)
ELIF f_playback_time > 48000.0
CONVERGE_VALUE(f_crew_heli_speed, -1.0, 0.5, TRUE)
ENDIF
ELIF e_heli_stage = HELI_STAGE_LEAVE_BANK
IF f_playback_time < 57500.0
CONVERGE_VALUE(f_crew_heli_speed, 1.0, 0.5, TRUE)
ELSE
//Rubber band the heli to stay in front of the player
RUBBER_BAND_CHASE(f_crew_heli_speed, s_gold_choppers[0].veh, s_gold_choppers[1].veh)
ENDIF
ENDIF
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, f_crew_heli_speed)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC REMOVE_ALL_CHASE_RECORDINGS()
INT i = 0
REPEAT COUNT_OF(SetPieceCarID) i
IF SetPieceCarRecording[i] > 0
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(SetPieceCarRecording[i], str_carrec)
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[i], str_carrec)
ENDIF
ENDIF
ENDREPEAT
REPEAT COUNT_OF(TrafficCarID) i
IF TrafficCarRecording[i] > 0
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(TrafficCarRecording[i], str_carrec)
REMOVE_VEHICLE_RECORDING(TrafficCarRecording[i], str_carrec)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC RUBBER_BAND_TRAIN_TO_VEH(VEHICLE_INDEX veh_train, INT i_carriage, VEHICLE_INDEX veh, FLOAT f_preferred_dist_behind_train = 0.0)
CONST_FLOAT MAX_SPEED_INCREASE 2.0
CONST_FLOAT MAX_SPEED_DECREASE 0.75
CONST_FLOAT MAX_DIST_BEHIND 80.0
CONST_FLOAT MAX_DIST_IN_FRONT 50.0
IF NOT IS_ENTITY_DEAD(veh_train)
AND NOT IS_ENTITY_DEAD(veh)
VECTOR v_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(GET_TRAIN_CARRIAGE(veh_train, i_carriage), GET_ENTITY_COORDS(veh))
FLOAT f_veh_speed = GET_ENTITY_SPEED(veh)
FLOAT f_diff, f_desired_speed
v_offset.y = -v_offset.y //We want distance behind the train to be positive.
IF v_offset.y < f_preferred_dist_behind_train
//Vehicle is close or ahead of the train, speed the train up.
f_diff = ABSF(v_offset.y - f_preferred_dist_behind_train)
IF f_diff > MAX_DIST_IN_FRONT
f_diff = MAX_DIST_IN_FRONT
ENDIF
f_desired_speed = f_veh_speed * (1.0 + ((f_diff / MAX_DIST_IN_FRONT) * MAX_SPEED_INCREASE))
ELIF v_offset.y > f_preferred_dist_behind_train
//Vehicle is too far behind, slow the train down.
f_diff = ABSF(v_offset.y - f_preferred_dist_behind_train)
IF f_diff > MAX_DIST_BEHIND
f_diff = MAX_DIST_BEHIND
ENDIF
f_desired_speed = f_veh_speed * (1.0 - ((f_diff / MAX_DIST_BEHIND) * MAX_SPEED_DECREASE))
ELSE
//Vehicle is spot on, just maintain speed.
f_desired_speed = f_veh_speed
ENDIF
CONVERGE_VALUE(f_current_train_speed, f_desired_speed, 0.5, TRUE)
IF e_mission_stage = STAGE_CHOPPER_CHASE
IF f_current_train_speed < 1.0
f_current_train_speed = 1.0
ENDIF
ENDIF
//PRINTLN(v_offset.y, " ", f_diff, " ", f_veh_speed, " ", f_desired_speed, " ", f_current_train_speed)
//PRINTLN(GET_ENTITY_SPEED(PLAYER_PED_ID()))
SET_TRAIN_CRUISE_SPEED(veh_train, f_current_train_speed)
SET_TRAIN_SPEED(veh_train, f_current_train_speed)
ENDIF
ENDPROC
///PURPOSE:
PROC UPDATE_MERRYWEATHER_HELI_USING_AI(VEHICLE_INDEX &veh_heli, PED_INDEX &ped_pilot, ENEMY_HELI_STATE &e_state, BOOL b_force_task = FALSE)
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
AND NOT IS_ENTITY_DEAD(veh_heli)
AND NOT IS_PED_INJURED(ped_pilot)
FLOAT f_player_height = GET_ENTITY_HEIGHT_ABOVE_GROUND(s_gold_choppers[0].veh)
IF b_force_task
e_state = ENEMY_HELI_ATTACK_LOW
ENDIF
IF e_state = ENEMY_HELI_ATTACK_HIGH
IF f_player_height < 60.0
TASK_HELI_MISSION(ped_pilot, veh_heli, NULL, PLAYER_PED_ID(), <<0.0, 0.0, 0.0>>, MISSION_ATTACK, 70.0, 15.0, -1.0, 50, 20)
e_state = ENEMY_HELI_ATTACK_LOW
ENDIF
ELIF e_state = ENEMY_HELI_ATTACK_LOW
IF (f_player_height > 70.0 OR b_force_task)
TASK_HELI_MISSION(ped_pilot, veh_heli, NULL, PLAYER_PED_ID(), <<0.0, 0.0, 0.0>>, MISSION_ATTACK, 70.0, 15.0, -1.0, 170, 70)
e_state = ENEMY_HELI_ATTACK_HIGH
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC ROCKET_LINE_UP_STATE GET_ROCKET_LINE_UP_STATE(VEHICLE_INDEX veh_target, VEHICLE_INDEX veh_player, BOOL bIncreaseMissChance = FALSE, FLOAT fMinDistance = 135.0)
VECTOR v_offset, v_rotation_vel
FLOAT f_vertical_angle, f_horizontal_angle, f_dist, f_rotation_speed
FLOAT f_speed_threshold = 0.85
ROCKET_LINE_UP_STATE e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE
IF bIncreaseMissChance
f_speed_threshold = 0.1
ENDIF
IF NOT IS_ENTITY_DEAD(veh_target)
AND NOT IS_ENTITY_DEAD(veh_player)
//Rules:
// - If the player is too far away, don't fire at all.
// - If the player is on the wrong side, don't fire at all.
// - If the the player is on the right side but the angle is too tight, then fire but miss.
f_dist = VDIST2(GET_ENTITY_COORDS(veh_target), GET_ENTITY_COORDS(veh_player))
v_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_player, GET_ENTITY_COORDS(veh_target))
IF f_dist < (fMinDistance * fMinDistance)
f_vertical_angle = ABSF(ATAN2(ABSF(v_offset.x), ABSF(v_offset.z)))
f_horizontal_angle = ABSF(ATAN2(ABSF(v_offset.x), ABSF(v_offset.y)))
IF f_vertical_angle > 18.5 AND f_horizontal_angle > 4.25
v_rotation_vel = GET_ENTITY_ROTATION_VELOCITY(veh_player)
f_rotation_speed = VMAG(v_rotation_vel)
#IF IS_DEBUG_BUILD
PRINTLN("Target offset = ", v_offset, " rotation speed = ", f_rotation_speed)
#ENDIF
IF f_rotation_speed < f_speed_threshold
IF v_offset.x < 0.0
e_rocket_state = LINE_UP_FIRE_LEFT_SIDE
ELSE
e_rocket_state = LINE_UP_FIRE_RIGHT_SIDE
ENDIF
ELSE
IF v_offset.x < 0.0
e_rocket_state = LINE_UP_FIRE_MISS_LEFT_SIDE
ELSE
e_rocket_state = LINE_UP_FIRE_MISS_RIGHT_SIDE
ENDIF
ENDIF
b_trevor_chopper_too_high = FALSE
ELSE
//There's be some additional dialogue if the player is too high.
IF f_vertical_angle > 18.5
b_trevor_chopper_too_high = FALSE
ELSE
b_trevor_chopper_too_high = TRUE
ENDIF
IF v_offset.x < 0.0
e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE
ELSE
e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE
ENDIF
ENDIF
ELSE
IF v_offset.x < 0.0
e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE
ELSE
e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_RIGHT_SIDE
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
//PRINTLN(f_dist, " ", v_offset, " ", f_vertical_angle, " ", f_horizontal_angle)
#ENDIF
RETURN e_rocket_state
ENDFUNC
//Updates Lester's rocket anims during the chase: Lester has a number of different states he can be in, these states link together different anims.
PROC UPDATE_LESTER_ROCKET_ANIMS()
REQUEST_ANIM_DICT(str_anim_rockets)
REQUEST_ANIM_DICT(str_anim_rocket_signal)
REQUEST_ANIM_DICT(str_anim_rocket_reload)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND NOT IS_PED_INJURED(s_lester.ped)
AND HAS_ANIM_DICT_LOADED(str_anim_rockets)
AND HAS_ANIM_DICT_LOADED(str_anim_rocket_signal)
AND HAS_ANIM_DICT_LOADED(str_anim_rocket_reload)
//Default to idle.
IF e_rocket_anim_state != ROCKET_ANIM_PUT_LAUNCHER_AWAY
IF NOT DOES_ENTITY_EXIST(obj_lesters_rpg)
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_RPG))
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
IF HAS_MODEL_LOADED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_RPG))
AND HAS_MODEL_LOADED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
obj_lesters_rpg = CREATE_OBJECT(GET_WEAPONTYPE_MODEL(WEAPONTYPE_RPG), GET_ENTITY_COORDS(s_lester.ped))
//ATTACH_ENTITY_TO_ENTITY(obj_lesters_rpg, s_lester.ped, GET_PED_BONE_INDEX(s_lester.ped, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_ENTITY_TO_ENTITY(obj_lesters_rpg, s_lester.ped, GET_PED_BONE_INDEX(s_lester.ped, BONETAG_PH_L_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
SET_ENTITY_VISIBLE(obj_lesters_rpg, FALSE)
obj_single_rocket = CREATE_OBJECT(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG), GET_ENTITY_COORDS(s_lester.ped))
ATTACH_ENTITY_TO_ENTITY(obj_single_rocket, obj_lesters_rpg, GET_ENTITY_BONE_INDEX_BY_NAME(obj_lesters_rpg, "gun_ammo"), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
SET_ENTITY_VISIBLE(obj_single_rocket, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_RPG))
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
ENDIF
ENDIF
IF IS_PED_IN_VEHICLE(s_lester.ped, s_gold_choppers[0].veh)
IF DOES_ENTITY_EXIST(obj_lesters_rpg)
IF NOT IS_ENTITY_VISIBLE(obj_lesters_rpg)
SET_ENTITY_VISIBLE(obj_lesters_rpg, TRUE)
ENDIF
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
DETACH_ENTITY(s_lester.ped)
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 0.0)
ENDIF
ENDIF
SWITCH e_rocket_anim_state
CASE ROCKET_ANIM_GET_LAUNCHER_OUT_THEN_AIM
IF DOES_ENTITY_EXIST(obj_lesters_rpg)
IF NOT IS_ENTITY_VISIBLE(obj_lesters_rpg)
SET_ENTITY_VISIBLE(obj_lesters_rpg, TRUE)
ENDIF
ENDIF
IF i_lester_rocket_anim_event = 0
IF IS_ENTITY_ATTACHED(s_lester.ped)
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
DETACH_ENTITY(s_lester.ped)
ENDIF
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "idle_to_leansit", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
i_lester_rocket_anim_event++
ELIF i_lester_rocket_anim_event = 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "intro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
i_lester_rocket_anim_event++
ENDIF
ELIF i_lester_rocket_anim_event = 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "sweep_medium", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.98)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 0.0)
e_rocket_anim_state = ROCKET_ANIM_AIMING
ENDIF
ENDIF
BREAK
CASE ROCKET_ANIM_PUT_LAUNCHER_AWAY
IF i_lester_rocket_anim_event = 0
IF IS_ENTITY_ATTACHED(s_lester.ped)
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
DETACH_ENTITY(s_lester.ped)
ENDIF
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "outro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
i_lester_rocket_anim_event++
ELIF i_lester_rocket_anim_event = 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "leansit_to_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
i_lester_rocket_anim_event++
ENDIF
ELIF i_lester_rocket_anim_event = 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
IF DOES_ENTITY_EXIST(obj_lesters_rpg)
SET_ENTITY_VISIBLE(obj_lesters_rpg, FALSE)
ENDIF
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.0)
i_lester_rocket_anim_event++
ENDIF
ELIF i_lester_rocket_anim_event = 3
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
STOP_SYNCHRONIZED_ENTITY_ANIM(s_lester.ped, NORMAL_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_PED_INTO_VEHICLE(s_lester.ped, s_gold_choppers[0].veh, VS_BACK_LEFT)
ENDIF
i_lester_rocket_anim_event++
ENDIF
ENDIF
BREAK
CASE ROCKET_ANIM_GET_CLOSER_THEN_AIM
IF i_lester_rocket_anim_event = 0
IF IS_ENTITY_ATTACHED(s_lester.ped)
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
DETACH_ENTITY(s_lester.ped)
ENDIF
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "outro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
i_lester_rocket_anim_event++
ELIF i_lester_rocket_anim_event = 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rocket_signal, "signal_forward", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
i_lester_rocket_anim_event++
ENDIF
ELIF i_lester_rocket_anim_event = 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "intro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
i_lester_rocket_anim_event++
ENDIF
ELIF i_lester_rocket_anim_event = 3
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "sweep_medium", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.98)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 0.0)
e_rocket_anim_state = ROCKET_ANIM_AIMING
ENDIF
ENDIF
BREAK
CASE ROCKET_ANIM_RELOAD_THEN_AIM
IF i_lester_rocket_anim_event = 0
IF IS_ENTITY_ATTACHED(s_lester.ped)
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
DETACH_ENTITY(s_lester.ped)
ENDIF
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "outro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.5)
i_lester_rocket_anim_event++
ELIF i_lester_rocket_anim_event = 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
IF DOES_ENTITY_EXIST(obj_single_rocket)
SET_ENTITY_VISIBLE(obj_single_rocket, TRUE)
DETACH_ENTITY(obj_single_rocket, FALSE, TRUE)
ATTACH_ENTITY_TO_ENTITY(obj_single_rocket, s_lester.ped, GET_PED_BONE_INDEX(s_lester.ped, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ENDIF
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rocket_reload, "reload_rocket_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.5)
i_lester_rocket_anim_event++
ENDIF
ELIF i_lester_rocket_anim_event = 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
IF DOES_ENTITY_EXIST(obj_single_rocket)
DETACH_ENTITY(obj_single_rocket, FALSE, TRUE)
ATTACH_ENTITY_TO_ENTITY(obj_single_rocket, obj_lesters_rpg, GET_ENTITY_BONE_INDEX_BY_NAME(obj_lesters_rpg, "gun_ammo"), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ENDIF
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "intro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.5)
i_lester_rocket_anim_event++
ENDIF
ELIF i_lester_rocket_anim_event = 3
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "sweep_medium", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT,
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.98)
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 0.0)
IF DOES_ENTITY_EXIST(obj_single_rocket)
SET_ENTITY_VISIBLE(obj_single_rocket, FALSE)
ENDIF
e_rocket_anim_state = ROCKET_ANIM_AIMING
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_STATE e_new_state)
e_rocket_anim_state = e_new_state
i_lester_rocket_anim_event = 0
ENDPROC
FUNC BOOL FIRE_ROCKET(VECTOR v_start, VEHICLE_INDEX veh_target, ENTITY_INDEX entity_owner, VECTOR v_offset, BOOL b_enemy_rocket = FALSE, BOOL b_track_target_speed = FALSE, FLOAT f_rocket_speed_multiplier = 1.0)
INT i = 0
INT i_rocket_index = -1
REPEAT COUNT_OF(s_rockets) i
IF NOT DOES_ENTITY_EXIST(s_rockets[i].obj)
i_rocket_index = i
ENDIF
ENDREPEAT
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
REQUEST_PTFX_ASSET()
IF HAS_MODEL_LOADED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
AND HAS_PTFX_ASSET_LOADED()
AND i_rocket_index > -1
s_rockets[i_rocket_index].obj = CREATE_OBJECT_NO_OFFSET(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG), v_start)
s_rockets[i_rocket_index].entity_owner = entity_owner
s_rockets[i_rocket_index].v_start = v_start
s_rockets[i_rocket_index].veh_target = veh_target
s_rockets[i_rocket_index].v_offset = v_offset
s_rockets[i_rocket_index].v_prev_pos = <<0.0, 0.0, 0.0>>
s_rockets[i_rocket_index].b_reached_target = FALSE
s_rockets[i_rocket_index].b_add_entity_speed = b_track_target_speed
s_rockets[i_rocket_index].b_rocket_belongs_to_player = NOT b_enemy_rocket
s_rockets[i_rocket_index].f_speed_multiplier = f_rocket_speed_multiplier
s_rockets[i_rocket_index].ptfx = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_rpg_trail", s_rockets[i_rocket_index].obj, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
PLAY_SOUND_FROM_ENTITY(s_rockets[i_rocket_index].i_sound, "SPL_RPG_DIST_FLIGHT_MASTER", s_rockets[i_rocket_index].obj)
PLAY_SOUND_FROM_ENTITY(-1, "SPL_RPG_NPC_SHOT_MASTER", s_rockets[i_rocket_index].obj)
SET_ENTITY_LOD_DIST(s_rockets[i_rocket_index].obj, 500)
SET_ENTITY_RECORDS_COLLISIONS(s_rockets[i_rocket_index].obj, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
IF NOT b_enemy_rocket
i_rocket_timer = 0 //When the timer = 0 no more rockets are allowed for the player.
ENDIF
//1414098 - The rocket can sometimes hit the gold and cause a mission fail, turn off collision in this case.
IF DOES_ENTITY_EXIST(obj_gold_containers[0])
SET_ENTITY_NO_COLLISION_ENTITY(s_rockets[i_rocket_index].obj, obj_gold_containers[0], FALSE)
ENDIF
//1979714 - Make sure the rocket object that's attached to Lester is removed at this point.
IF DOES_ENTITY_EXIST(obj_single_rocket)
SET_ENTITY_VISIBLE(obj_single_rocket, FALSE)
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC UPDATE_ROCKETS()
CONST_FLOAT ROCKET_SPEED 60.0
CONST_FLOAT MAX_ROCKET_SPEED 79.0
INT i = 0
REPEAT COUNT_OF(s_rockets) i
IF DOES_ENTITY_EXIST(s_rockets[i].obj)
BOOL b_force_blow_up = FALSE
VECTOR v_current_pos = GET_ENTITY_COORDS(s_rockets[i].obj)
//Update direction to home into offset, this lets us control how close the missile is to the target.
IF NOT s_rockets[i].b_reached_target
AND NOT IS_ENTITY_DEAD(s_rockets[i].veh_target)
VECTOR v_dest = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_rockets[i].veh_target, s_rockets[i].v_offset)
s_rockets[i].v_dir = (v_dest - v_current_pos) / VMAG(v_dest - v_current_pos)
//Detect when rockets hit (or when they've missed and are flying away).
IF s_rockets[i].v_prev_pos.x != 0.0
FLOAT f_dist_from_target = VDIST2(v_current_pos, v_dest)
//FLOAT f_prev_dist_from_target = VDIST2(s_rockets[i].v_prev_pos, v_dest)
IF ABSF(s_rockets[i].v_offset.x) < 3.0 AND ABSF(s_rockets[i].v_offset.y) < 3.0 AND ABSF(s_rockets[i].v_offset.z) < 3.0
//The rocket is meant to be on target, once it gets close blow it up
IF f_dist_from_target < 25.0
b_force_blow_up = TRUE
s_rockets[i].b_reached_target = TRUE
ENDIF
ELSE
IF f_dist_from_target < 100.0
//IF f_prev_dist_from_target < f_dist_from_target //The rocket is moving away from the target.
s_rockets[i].b_reached_target = TRUE
//If the missed rocket was one the player fired then play some near-miss dialogue.
IF s_rockets[i].b_rocket_belongs_to_player
//i_time_since_last_rocket_missed = GET_GAME_TIMER()
ENDIF
//ENDIF
ENDIF
ENDIF
IF s_rockets[i].b_reached_target
s_rockets[i].i_explode_timer = GET_GAME_TIMER()
//Start the timer for the player's next rocket (randomise a little).
IF i_rocket_timer = 0
AND s_rockets[i].b_rocket_belongs_to_player
//b_played_line_up_dialogue = FALSE
i_rocket_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0, 700)
ENDIF
ENDIF
ENDIF
s_rockets[i].v_vel = s_rockets[i].v_dir * ROCKET_SPEED * s_rockets[i].f_speed_multiplier
IF s_rockets[i].b_add_entity_speed
s_rockets[i].v_vel = s_rockets[i].v_vel + GET_ENTITY_VELOCITY(s_rockets[i].veh_target)
ENDIF
//Fix for B*550927: check the velocity to make sure it cannot go over the max amount.
IF VMAG(s_rockets[i].v_vel) > MAX_ROCKET_SPEED
s_rockets[i].v_vel = (s_rockets[i].v_vel / VMAG(s_rockets[i].v_vel)) * MAX_ROCKET_SPEED
ENDIF
ENDIF
//Update rotation to match the direction of movement.
s_rockets[i].v_rot = <<0.0, 0.0, 0.0>>
s_rockets[i].v_rot.x = ATAN2(s_rockets[i].v_dir.z, VMAG(<<s_rockets[i].v_dir.x, s_rockets[i].v_dir.y, 0.0>>))
s_rockets[i].v_rot.z = ATAN2(s_rockets[i].v_dir.y, s_rockets[i].v_dir.x) - 90.0
//SET_ENTITY_COORDS(s_rockets[i].obj, v_current_pos +@ (s_rockets[i].v_dir * ROCKET_SPEED))
SET_ENTITY_VELOCITY(s_rockets[i].obj, s_rockets[i].v_vel)
SET_ENTITY_ROTATION(s_rockets[i].obj, s_rockets[i].v_rot)
#IF IS_DEBUG_BUILD
IF b_debug_draw_debug
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(s_rockets[i].obj), 0.3)
ENDIF
#ENDIF
//Explode on contact or if scripted to hit
IF (s_rockets[i].b_reached_target AND GET_GAME_TIMER() - s_rockets[i].i_explode_timer > 3000)
OR HAS_ENTITY_COLLIDED_WITH_ANYTHING(s_rockets[i].obj) AND NOT IS_ENTITY_TOUCHING_ENTITY(s_rockets[i].obj, s_rockets[i].entity_owner)
OR b_force_blow_up
IF NOT IS_ENTITY_DEAD(s_rockets[i].veh_target)
IF IS_ENTITY_TOUCHING_ENTITY(s_rockets[i].obj, s_rockets[i].veh_target)
OR b_force_blow_up
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_rockets[i].veh_target)
STOP_PLAYBACK_RECORDED_VEHICLE(s_rockets[i].veh_target)
ENDIF
PED_INDEX ped_pilot = GET_PED_IN_VEHICLE_SEAT(s_rockets[i].veh_target, VS_DRIVER)
IF NOT IS_PED_INJURED(ped_pilot)
SET_ENTITY_HEALTH(ped_pilot, 0)
ENDIF
SET_VEHICLE_PETROL_TANK_HEALTH(s_rockets[i].veh_target, -100.0)
//i_time_since_last_chopper_exploded = GET_GAME_TIMER()
ENDIF
ENDIF
ADD_EXPLOSION(v_current_pos, EXP_TAG_ROCKET, 1.0)
IF s_rockets[i].ptfx != NULL
STOP_PARTICLE_FX_LOOPED(s_rockets[i].ptfx)
s_rockets[i].ptfx = NULL
ENDIF
IF NOT HAS_SOUND_FINISHED(s_rockets[i].i_sound)
STOP_SOUND(s_rockets[i].i_sound)
ENDIF
REMOVE_OBJECT(s_rockets[i].obj, TRUE)
//Guarantee that the timer is set (in case the rocket blew up before hitting its target).
IF i_rocket_timer = 0
AND s_rockets[i].b_rocket_belongs_to_player
//b_played_line_up_dialogue = FALSE
i_rocket_timer = GET_GAME_TIMER()
ENDIF
ENDIF
s_rockets[i].v_prev_pos = v_current_pos
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Updates the heli chase: the chase works using two main car recordings for cop helicopters, these recordings last the entire length of the chase.
/// If there are no helicopters, then one is created behind the player, and told to catch up to the correct position in the chase. Once the chopper
/// dies a new one is created later.
/// PARAMS:
/// f_playback_time -
/// f_playback_speed -
PROC UPDATE_HELI_CHASE(FLOAT f_playback_time, FLOAT f_playback_speed)
//VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
INT i_closest_alive_chopper = -1
INT i_num_choppers_still_alive = 0
//Handle the spawning and rubber banding of enemy choppers.
IF f_playback_time < 125000.0
INT i = 0
FLOAT f_closest_alive_dist = 0.0
REPEAT MAX_NUM_CHOPPERS_IN_CHASE i
IF SetPieceCarRecording[i] != 0
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[i], str_carrec)
REQUEST_MODEL(model_merry)
REQUEST_MODEL(model_military_chopper)
VEHICLE_SEAT e_gunner_seat = VS_BACK_LEFT
IF i = 1 OR i = 2
e_gunner_seat = VS_BACK_RIGHT
ENDIF
IF NOT DOES_ENTITY_EXIST(SetPieceCarID[i])
IF DOES_BLIP_EXIST(blip_chase_cops[i])
REMOVE_BLIP(blip_chase_cops[i])
ENDIF
BOOL b_created_this_frame = FALSE
FLOAT f_start_time_offset = 0.0
//VECTOR v_creation_pos
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(SetPieceCarRecording[i], str_carrec)
AND HAS_MODEL_LOADED(model_merry)
AND HAS_MODEL_LOADED(model_military_chopper)
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
SWITCH i_current_chopper_wave
CASE 0 //Military choppers
//Order of attack in array: 2, 1, 0
IF f_playback_time < 70000.0
AND f_playback_time >= SetPieceCarStartime[i]
SetPieceCarID[i] = CREATE_VEHICLE(model_military_chopper, SetPieceCarPos[i], 0.0)
START_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[i], SetPieceCarRecording[i], str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[i], (f_playback_time - SetPieceCarStartime[i] + f_start_time_offset) * SetPieceCarRecordingSpeed[i])
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(SetPieceCarID[i])
b_created_this_frame = TRUE
e_heli_state[i] = ENEMY_HELI_PLAY_RECORDING
//Once all choppers respawn as military ones don't create any more choppers.
IF i = 2
AND NOT IS_ENTITY_DEAD(SetPieceCarID[0]) AND GET_ENTITY_MODEL(SetPieceCarID[0]) = model_military_chopper
AND NOT IS_ENTITY_DEAD(SetPieceCarID[1]) AND GET_ENTITY_MODEL(SetPieceCarID[1]) = model_military_chopper
i_current_chopper_wave++
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
//When a chopper is created, add a ped inside.
IF b_created_this_frame
SET_VEHICLE_ENGINE_ON(SetPieceCarID[i], TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(SetPieceCarID[i])
SET_VEHICLE_LIGHTS(SetPieceCarID[i], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(SetPieceCarID[i], TRUE)
SET_SIREN_WITH_NO_DRIVER(SetPieceCarID[i], TRUE)
SET_ENTITY_INVINCIBLE(SetPieceCarID[i], TRUE)
PED_INDEX ped_temp = CREATE_PED_INSIDE_VEHICLE(SetPieceCarID[i], PEDTYPE_COP, model_merry)
SET_PED_RELATIONSHIP_GROUP_HASH(ped_temp, rel_group_cops)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped_temp, TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(ped_temp, FALSE)
SET_PED_CONFIG_FLAG(ped_temp, PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_AS_NO_LONGER_NEEDED(ped_temp)
PED_INDEX ped_gunner = CREATE_PED_INSIDE_VEHICLE(SetPieceCarID[i], PEDTYPE_COP, model_merry, e_gunner_seat)
SET_PED_RELATIONSHIP_GROUP_HASH(ped_gunner, rel_group_cops)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped_gunner, FALSE)
SET_PED_SUFFERS_CRITICAL_HITS(ped_gunner, FALSE)
SET_PED_CONFIG_FLAG(ped_gunner, PCF_WillFlyThroughWindscreen, FALSE)
GIVE_WEAPON_TO_PED(ped_gunner, WEAPONTYPE_COMBATMG, INFINITE_AMMO, TRUE)
SET_PED_ACCURACY(ped_gunner, 0)
TASK_DRIVE_BY(ped_gunner, NULL, s_gold_choppers[0].veh, <<0.0, 0.0, 0.0>>, 1000.0, 50)
SET_PED_KEEP_TASK(ped_gunner, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(ped_gunner)
IF i = 2
SET_MODEL_AS_NO_LONGER_NEEDED(model_merry)
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
ENDIF
i_heli_explosion_timers[i] = 0
ENDIF
ELIF NOT IS_ENTITY_DEAD(SetPieceCarID[i])
//Set the gunner to always shoot at the player.
PED_INDEX ped_gunner = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[i], e_gunner_seat)
PED_INDEX ped_pilot = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[i], VS_DRIVER)
IF NOT IS_PED_INJURED(ped_gunner)
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
IF GET_SCRIPT_TASK_STATUS(ped_gunner, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
AND f_chase_playback_time > 69000.0
TASK_DRIVE_BY(ped_gunner, NULL, s_gold_choppers[1].veh, <<0.0, 0.0, 0.0>>, 1000.0, 50, FALSE, FIRING_PATTERN_BURST_FIRE_DRIVEBY)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped_gunner, TRUE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF b_debug_kill_enemy_helis
IF NOT IS_PED_INJURED(ped_pilot)
SET_ENTITY_HEALTH(ped_pilot, 0)
ENDIF
ENDIF
#ENDIF
IF e_heli_state[i] != ENEMY_HELI_BLOW_UP
IF IS_PED_INJURED(ped_pilot)
e_heli_state[i] = ENEMY_HELI_BLOW_UP
ELSE
IF NOT DOES_BLIP_EXIST(blip_chase_cops[i])
IF f_playback_time > 70000.0
blip_chase_cops[i] = CREATE_BLIP_FOR_ENTITY(SetPieceCarID[i], TRUE)
ENDIF
ENDIF
i_num_choppers_still_alive++
FLOAT f_dist_to_chopper = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(SetPieceCarID[i]))
IF f_closest_alive_dist = 0.0
OR f_dist_to_chopper < f_closest_alive_dist
i_closest_alive_chopper = i
f_closest_alive_dist = f_dist_to_chopper
ENDIF
ENDIF
ENDIF
IF e_heli_state[i] = ENEMY_HELI_PLAY_RECORDING
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
FLOAT f_setpiece_speed = f_playback_speed * SetPieceCarRecordingSpeed[i]
SET_PLAYBACK_SPEED(SetPieceCarID[i], f_setpiece_speed)
//Once the chase is over set the choppers to attack the player
FLOAT f_stop_time = 0.0
IF i = 0
f_stop_time = 118000.0
ELIF i = 1
f_stop_time = 118700.0
ELIF i = 2
f_stop_time = 118300.0
#IF IS_DEBUG_BUILD
IF b_debug_switch_heli_to_ai
f_stop_time = 60000.0
ENDIF
#ENDIF
ENDIF
IF f_stop_time > 0.0
IF f_chase_playback_time > f_stop_time
//Switch to AI.
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[i])
SET_CURRENT_PED_VEHICLE_WEAPON(ped_pilot, WEAPONTYPE_VEHICLE_PLAYER_BUZZARD)
UPDATE_MERRYWEATHER_HELI_USING_AI(SetPieceCarID[i], ped_pilot, e_heli_state[i], TRUE)
ENDIF
ENDIF
ELSE
//If playback stops for any reason other than AI then tell the chopper to blow up.
e_heli_state[i] = ENEMY_HELI_BLOW_UP
ENDIF
ELIF e_heli_state[i] = ENEMY_HELI_BLOW_UP
IF i_heli_explosion_timers[i] = 0
IF DOES_BLIP_EXIST(blip_chase_cops[i])
REMOVE_BLIP(blip_chase_cops[i])
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[i])
ENDIF
//Record footage of the first targetted chopper blowing up.
IF i = 2
REPLAY_RECORD_BACK_FOR_TIME(2.5)
ENDIF
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[i], -200.0)
SET_VEHICLE_OUT_OF_CONTROL(SetPieceCarID[i], TRUE, TRUE)
SET_ENTITY_INVINCIBLE(SetPieceCarID[i], TRUE)
i_heli_explosion_timers[i] = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_heli_explosion_timers[i] < 2000
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[i], -200.0)
IF i = 2
APPLY_FORCE_TO_ENTITY(SetPieceCarID[i], APPLY_TYPE_FORCE, <<25.0, 0.0, 0.0>>, <<0.0, -3.0, 0.0>>, 0, TRUE, TRUE, TRUE)
ELSE
APPLY_FORCE_TO_ENTITY(SetPieceCarID[i], APPLY_TYPE_FORCE, <<-25.0, 0.0, 0.0>>, <<0.0, -3.0, 0.0>>, 0, TRUE, TRUE, TRUE)
ENDIF
ELSE
SET_ENTITY_INVINCIBLE(SetPieceCarID[i], FALSE)
SET_ENTITY_PROOFS(SetPieceCarID[i], FALSE, FALSE, FALSE, FALSE, FALSE)
ADD_EXPLOSION(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(SetPieceCarID[i], <<0.0, 2.5, 0.0>>), EXP_TAG_ROCKET, 1.0)
IF GET_VEHICLE_ENGINE_HEALTH(SetPieceCarID[i]) > -599.0
SET_VEHICLE_ENGINE_HEALTH(SetPieceCarID[i], -600.0)
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[i], -600.0)
ENDIF
EXPLODE_VEHICLE(SetPieceCarID[i])
SET_ENTITY_HEALTH(SetPieceCarID[i], 0)
SET_VEHICLE_AS_NO_LONGER_NEEDED(SetPieceCarID[i])
ENDIF
ELSE
//Chopper uses AI
UPDATE_MERRYWEATHER_HELI_USING_AI(SetPieceCarID[i], ped_pilot, e_heli_state[i])
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(SetPieceCarID[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Lester rockets: don't do any of this stuff if we're in the military choppers.
ROCKET_LINE_UP_STATE e_rocket_state
FLOAT f_min_time_to_shoot, f_max_time_to_shoot, f_speed_multiplier
//Rockets: come from buddies, and later on enemies.
IF f_playback_time > 55000.0
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
BOOL b_increase_rocket_miss_chance
FLOAT f_max_fire_distance = 150.0
//Set Lester's target to be the closest helicopter.
IF i_player_rocket_event < 50 //This is bad!
IF i_closest_alive_chopper >= 0
i_current_lester_target = i_closest_alive_chopper
ENDIF
IF (i_num_choppers_still_alive < 2 AND f_playback_time < 101000.0)
OR (i_num_choppers_still_alive < 3 AND f_playback_time < 85000.0)
b_increase_rocket_miss_chance = TRUE
ENDIF
/*IF (i_current_lester_target = 2 AND i_num_rockets_for_current_target = 0 AND GET_RANDOM_INT_IN_RANGE(0, 2) = 0)
OR (i_num_choppers_still_alive < 2 AND f_playback_time < 101000.0)
OR (i_num_choppers_still_alive < 3 AND f_playback_time < 85000.0)
b_increase_rocket_miss_chance = TRUE
ENDIF*/
IF (i_current_lester_target = 2 AND i_num_rockets_for_current_target = 0)
f_max_fire_distance = 250.0
ENDIF
ENDIF
//Determine which chopper is the current target: each one has a time range where they can be shot, and a multiplier for the rocket speed.
IF i_current_lester_target = 2
f_min_time_to_shoot = 74000.0
f_max_time_to_shoot = 122502.700
f_speed_multiplier = 1.75
ELIF i_current_lester_target = 1
f_min_time_to_shoot = 80224.0
f_max_time_to_shoot = 122502.700
f_speed_multiplier = 1.4
ELIF i_current_lester_target = 0
f_min_time_to_shoot = 88224.0
f_max_time_to_shoot = 122502.700
f_speed_multiplier = 1.4
ENDIF
//Sequence of events for Lester rockets:
// - Waits for the player to get into position.
// - Fires the rocket.
// - Reloads.
// - If the rocket missed then repeat, otherwise pick a new target.
SWITCH i_player_rocket_event
CASE 0 //Lester gets the rocket launcher out.
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_USING_AI)
IF f_playback_time > 70500.0 //Just as the Merryweather choppers come into view.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_GET_LAUNCHER_OUT_THEN_AIM)
i_num_rockets_for_current_target = 0
i_current_lester_target = 2
i_player_rocket_event++
ENDIF
ENDIF
BREAK
CASE 1 //Lester waits for the player to get into a good position.
IF NOT b_has_text_label_triggered[F3B_ROCHELP]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
PRINT_HELP("F3B_ROCHELP", DEFAULT_HELP_TEXT_TIME + 5000)
b_has_text_label_triggered[F3B_ROCHELP] = TRUE
ENDIF
ENDIF
//Play reloading dialogue.
IF e_rocket_anim_state = ROCKET_ANIM_RELOAD_THEN_AIM
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT b_has_text_label_triggered[BS2B_RELOAD]
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RELOAD", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_RELOAD] = TRUE
ENDIF
ELSE
b_has_text_label_triggered[BS2B_RELOAD] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF f_playback_time > f_min_time_to_shoot AND f_playback_time < f_max_time_to_shoot
e_rocket_state = GET_ROCKET_LINE_UP_STATE(SetPieceCarID[i_current_lester_target], s_gold_choppers[0].veh, b_increase_rocket_miss_chance, f_max_fire_distance)
//Wait for any dialogue to finish and add a random timer.
IF IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
i_shoot_rocket_wait_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(300, 1550)
ENDIF
IF GET_GAME_TIMER() - i_shoot_rocket_wait_timer > 0
OR GET_GAME_TIMER() - i_rocket_timer > 6000 //Failsafe in case dialogue screws up.
IF e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE
OR e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_RIGHT_SIDE
IF GET_GAME_TIMER() - i_rocket_line_up_dialogue_timer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TOOFAR", CONV_PRIORITY_MEDIUM)
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_GET_CLOSER_THEN_AIM)
i_rocket_line_up_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 10000)
ENDIF
ENDIF
ENDIF
ELIF e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE
OR e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE
IF GET_GAME_TIMER() - i_rocket_line_up_dialogue_timer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LINEUP", CONV_PRIORITY_MEDIUM)
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_GET_CLOSER_THEN_AIM)
i_rocket_line_up_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 10000)
IF b_trevor_chopper_too_high
b_play_too_high_response = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELIF e_rocket_state = LINE_UP_FIRE_LEFT_SIDE
OR e_rocket_state = LINE_UP_FIRE_RIGHT_SIDE
OR e_rocket_state = LINE_UP_FIRE_MISS_LEFT_SIDE
OR e_rocket_state = LINE_UP_FIRE_MISS_RIGHT_SIDE
IF NOT b_has_text_label_triggered[BS2B_GOSHOT]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOSHOT", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOSHOT] = TRUE
i_shoot_rocket_wait_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1900, 2600)
i_player_rocket_event++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//If Trevor is too high then play a response to Lester's line.
IF b_play_too_high_response
IF e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE
OR e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TOOHI2", CONV_PRIORITY_MEDIUM)
b_play_too_high_response = FALSE
ENDIF
ENDIF
ELSE
b_play_too_high_response = FALSE
ENDIF
ENDIF
ENDIF
BREAK
CASE 2 //Lester is primed to fire: wait for the dialogue, check the fire state and fire. If the player moved since the dialogue triggered we may need to miss.
IF f_playback_time > f_min_time_to_shoot AND f_playback_time < f_max_time_to_shoot
e_rocket_state = GET_ROCKET_LINE_UP_STATE(SetPieceCarID[i_current_lester_target], s_gold_choppers[0].veh, b_increase_rocket_miss_chance, f_max_fire_distance)
IF NOT IS_ENTITY_DEAD(SetPieceCarID[i_current_lester_target])
AND (e_rocket_anim_state = ROCKET_ANIM_AIMING OR GET_GAME_TIMER() - i_shoot_rocket_wait_timer > 3500)
AND GET_GAME_TIMER() - i_shoot_rocket_wait_timer > 0
VECTOR v_start_pos, v_end_offset
IF e_rocket_state = LINE_UP_FIRE_LEFT_SIDE
v_start_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<-1.1, 3.0, 1.2>>)
v_end_offset = <<1.5, 2.0, 0.0>>
ELIF e_rocket_state = LINE_UP_FIRE_RIGHT_SIDE
v_start_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.3429, 3.6245, 0.8325>>)
v_end_offset = <<-1.5, 2.0, 0.0>>
ELIF e_rocket_state = LINE_UP_FIRE_MISS_LEFT_SIDE
OR e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE
OR e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE
v_start_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<-1.1, 3.0, 1.2>>)
v_end_offset = <<5.0 + GET_RANDOM_FLOAT_IN_RANGE(0.0, 3.0), -5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0), -5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0)>>
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
v_end_offset.z *= -1.0
ENDIF
ELIF e_rocket_state = LINE_UP_FIRE_MISS_RIGHT_SIDE
OR e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE
OR e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_RIGHT_SIDE
v_start_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.3429, 3.6245, 0.8325>>)
v_end_offset = <<-5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 3.0), -5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0), -5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0)>>
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
v_end_offset.z *= -1.0
ENDIF
ENDIF
IF FIRE_ROCKET(v_start_pos, SetPieceCarID[i_current_lester_target], s_gold_choppers[0].veh, v_end_offset, FALSE, FALSE, f_speed_multiplier)
b_has_text_label_triggered[BS2B_RELOAD] = FALSE
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_RELOAD_THEN_AIM)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_LESTER_RPG_scene")
START_AUDIO_SCENE("BS_2B_LESTER_RPG_scene")
ENDIF
b_has_text_label_triggered[BS2B_GOSHOT] = FALSE
i_player_rocket_event = 50
ENDIF
ENDIF
ENDIF
BREAK
CASE 50 //Reload and update target if they were hit.
INT i_random
IF i_rocket_timer != 0
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_LESTER_RPG_scene")
STOP_AUDIO_SCENE("BS_2B_LESTER_RPG_scene")
ENDIF
IF GET_GAME_TIMER() - i_rocket_timer > 200
IF e_heli_state[i_current_lester_target] = ENEMY_HELI_BLOW_UP
OR NOT DOES_BLIP_EXIST(blip_chase_cops[i_current_lester_target]) //Chopper was blown up.
i_random = GET_RANDOM_INT_IN_RANGE(0, 2)
IF (i_random = 0 AND CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CHOHIT", CONV_PRIORITY_MEDIUM))
OR (i_random = 1 AND CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HITL", CONV_PRIORITY_MEDIUM))
i_rocket_timer = GET_GAME_TIMER()
IF i_num_choppers_still_alive = 0
i_player_rocket_event = 100 //All targets are dead.
ELSE
i_player_rocket_event = 1
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0)
i_num_rockets_for_current_target = 0
ENDIF
ELSE
i_random = GET_RANDOM_INT_IN_RANGE(0, 2)
IF (i_random = 0 AND CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CHOMISS", CONV_PRIORITY_MEDIUM))
OR (i_random = 1 AND CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MISSL", CONV_PRIORITY_MEDIUM))
i_rocket_timer = GET_GAME_TIMER()
i_player_rocket_event = 1
i_num_rockets_for_current_target++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
UPDATE_LESTER_ROCKET_ANIMS()
ENDIF
ELSE
//This is a good point to reset any variables (e.g. if we skipped here)
i_player_rocket_event = 0
//i_enemy_rocket_event = 0
i_rocket_timer = GET_GAME_TIMER()
INT i = 0
REPEAT COUNT_OF(i_heli_explosion_timers) i
i_heli_explosion_timers[i] = 0
ENDREPEAT
ENDIF
UPDATE_ROCKETS()
#IF IS_DEBUG_BUILD
IF b_debug_test_chopper_respawning
IF IS_BUTTON_JUST_PRESSED(PAD1,LEFTSHOULDER1)
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[1])
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[1])
ADD_EXPLOSION(GET_ENTITY_COORDS(SetPieceCarID[1]), EXP_TAG_PLANE, 1.0)
SET_ENTITY_HEALTH(SetPieceCarID[1], 0)
SET_VEHICLE_ENGINE_HEALTH(SetPieceCarID[1], -100)
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[1], -100)
ENDIF
ENDIF
ENDIF
#ENDIF
ENDPROC
/// Plays car horns on the nearest vehicle
PROC UPDATE_CHASE_HORNS(INT &i_horn_timer, VEHICLE_INDEX veh_closest)
//General horns for all vehicles: get the nearest vehicle and play horn
IF GET_GAME_TIMER() - i_horn_timer > 2000
IF IS_VEHICLE_DRIVEABLE(veh_closest)
PED_INDEX ped_closest = GET_PED_IN_VEHICLE_SEAT(veh_closest)
IF NOT IS_PED_INJURED(ped_closest)
START_VEHICLE_HORN(veh_closest, 2000)
i_horn_timer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDPROC
///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 UPDATE_VEHICLE_SPINNING_WHEN_SHOT(VEHICLE_INDEX &veh, INT &i_spin_timer, BOOL b_spin_left = FALSE)
IF IS_VEHICLE_DRIVEABLE(veh)
PED_INDEX ped_driver = GET_PED_IN_VEHICLE_SEAT(veh)
IF i_spin_timer = 0
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
i_spin_timer = 1
ENDIF
ELIF i_spin_timer = 1
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
IF ABSF(GET_ENTITY_SPEED(veh)) > 4.0
IF IS_PED_INJURED(ped_driver)
SET_VEHICLE_ENGINE_HEALTH(veh, 30.0)
SET_VEHICLE_PETROL_TANK_HEALTH(veh, 2000.0)
i_spin_timer = GET_GAME_TIMER()
ELSE
//Playback stopped naturally, kill the car off to stop it being driven.
SET_ENTITY_HEALTH(ped_driver, 0)
ENDIF
ENDIF
ENDIF
ELIF GET_GAME_TIMER() - i_spin_timer < 600
INT i_force_modifier = 1
IF NOT b_spin_left
i_force_modifier = -1
ENDIF
APPLY_FORCE_TO_ENTITY(veh, APPLY_TYPE_FORCE, <<35.0 * i_force_modifier, 0.0, 0.0>>, <<0.0, 1.8, 0.0>>, 0, TRUE, TRUE, TRUE)
ELSE
//Kill the car off
SET_VEHICLE_ENGINE_HEALTH(veh, -100.0)
SET_ENTITY_HEALTH(veh, 1)
ENDIF
ENDIF
ENDPROC
FUNC BOOL HAS_TROLLEY_ROPE_ATTACHMENT_BEEN_BROKEN(INT &i_heli_detach_timer, INT i_heli_index)
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
AND DOES_ENTITY_EXIST(obj_gold_containers[i_heli_index])
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
VECTOR v_offset_from_chopper = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]))
//PRINTLN(v_offset_from_chopper)
IF v_offset_from_chopper.z > -1.0
OR NOT IS_ENTITY_IN_AIR(s_gold_choppers[i_heli_index].veh)
IF GET_GAME_TIMER() - i_heli_detach_timer > 500
RETURN TRUE
ENDIF
ELSE
i_heli_detach_timer = GET_GAME_TIMER()
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC DISPLAY_TAKE()
IF i_displayed_take != i_current_take
//IF HAS_SOUND_FINISHED(iMoneyCountSoundID)
// PLAY_SOUND_FRONTEND(iMoneyCountSoundID, "ROBBERY_MONEY_TOTAL", "HUD_FRONTEND_CUSTOM_SOUNDSET")
//ENDIF
IF i_displayed_take > i_current_take
i_displayed_take = i_displayed_take - ROUND(0 +@ 10000000)
IF i_displayed_take < i_current_take
i_displayed_take = i_current_take
ENDIF
ELSE
i_displayed_take = i_displayed_take + ROUND(0 +@ 10000000)
IF i_displayed_take > i_current_take
i_displayed_take = i_current_take
ENDIF
ENDIF
ELSE
//IF NOT HAS_SOUND_FINISHED(iMoneyCountSoundID)
// STOP_SOUND(iMoneyCountSoundID)
//ENDIF
ENDIF
MPGlobalsScoreHud.bTitleExtraLeftJustified = TRUE
IF i_displayed_take > i_current_take
DRAW_GENERIC_SCORE(i_displayed_take, "CMN_TAKE", HEIST_TAKE_DISPLAY_FLASH_TIME, HUD_COLOUR_RED, HUDORDER_DONTCARE, FALSE, "HUD_CASH", FALSE, 0.0, HUDFLASHING_FLASHWHITE, 250)
ELSE
DRAW_GENERIC_SCORE(i_displayed_take, "CMN_TAKE", HEIST_TAKE_DISPLAY_FLASH_TIME, HUD_COLOUR_GREEN, HUDORDER_DONTCARE, FALSE, "HUD_CASH", FALSE, 0.0, HUDFLASHING_FLASHWHITE, 250)
ENDIF
ENDPROC
PROC SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(BOOL b_active)
INT i
IF b_active
IF cover_shootout[0] = NULL
cover_shootout[0] = ADD_COVER_POINT(<<-30.6895, -683.1865, 48.5083>>, 112.9372, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
ENDIF
IF cover_shootout[1] = NULL
cover_shootout[1] = ADD_COVER_POINT(<<-140.4568, -551.9787, 39.4984>>, 279.8140, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF cover_shootout[2] = NULL
cover_shootout[2] = ADD_COVER_POINT(<<-115.2832, -547.3452, 39.4987>>, 99.2825, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF cover_shootout[3] = NULL
cover_shootout[3] = ADD_COVER_POINT(<<-117.7532, -547.9827, 39.4984>>, 279.3659, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ENDIF
ELSE
REPEAT COUNT_OF(cover_shootout) i
IF cover_shootout[i] != NULL
REMOVE_COVER_POINT(cover_shootout[i])
cover_shootout[i] = NULL
ENDIF
ENDREPEAT
ENDIF
ENDPROC
PROC SET_SCRIPTED_TUNNEL_COVER_ACTIVE(BOOL b_active)
INT i
IF b_active
IF cover_tunnel[0] = NULL
cover_tunnel[0] = ADD_COVER_POINT(<<9.8065, -657.1228, 15.1062>>, 159.6641, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
ENDIF
IF cover_tunnel[1] = NULL
cover_tunnel[1] = ADD_COVER_POINT(<<4.7407, -655.3938, 15.0954>>, 165.0990, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
ENDIF
ELSE
REPEAT COUNT_OF(cover_tunnel) i
IF cover_tunnel[i] != NULL
REMOVE_COVER_POINT(cover_tunnel[i])
cover_tunnel[i] = NULL
ENDIF
ENDREPEAT
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("bs_2b_mcs_3")
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
ELIF iNameHash = HASH("bs_2b_mcs_1")
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
ELIF iNameHash = HASH("bs_2b_ext_alt1a")
IF NOT IS_PED_INJURED(s_lester.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lester", s_lester.ped)
ENDIF
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
//Gunman may not exist when the cutscene is created.
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_1", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID), CREW_OUTFIT_SUIT)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_DECL, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_HAIR, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_LEG, 5, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_TORSO, 5, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_FEET, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_BERD, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_SPECIAL2, 0, 0)
//SET_CUTSCENE_PED_PROP_VARIATION("gunman_selection_1", ANCHOR_EARS, 0)
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Driver_selection", s_crew[CREW_DRIVER_ID].ped)
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TORSO, 0, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_LEG, 0, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_FEET, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_JBIB, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAND, 7, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_DECL, 0, 0)
//SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EARS, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_TORSO, 18, 4)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_LEG, 15, 4)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_FEET, 10, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_SPECIAL, 14, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_JBIB, 5, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_HAND, 4, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_DECL, 0, 0)
//SET_CUTSCENE_PED_PROP_VARIATION("Franklin", ANCHOR_EARS, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", PLAYER_PED_ID())
ELIF iNameHash = HASH("bs_2b_ext_alt2")
IF NOT IS_PED_INJURED(s_lester.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lester", s_lester.ped)
ENDIF
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
//Gunman may not exist when the cutscene is created.
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_1", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID), CREW_OUTFIT_SUIT)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_DECL, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_HAIR, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_LEG, 5, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_TORSO, 5, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_FEET, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_BERD, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_SPECIAL2, 0, 0)
//SET_CUTSCENE_PED_PROP_VARIATION("gunman_selection_1", ANCHOR_EARS, 0)
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Driver_selection", s_crew[CREW_DRIVER_ID].ped)
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TORSO, 0, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_LEG, 0, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_FEET, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_JBIB, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAND, 7, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_DECL, 0, 0)
//SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EARS, 0) //Don't want the headset on.
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_TORSO, 18, 4)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_LEG, 15, 4)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_FEET, 10, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_SPECIAL, 14, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_JBIB, 5, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_HAND, 4, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_DECL, 0, 0)
//SET_CUTSCENE_PED_PROP_VARIATION("Franklin", ANCHOR_EARS, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", PLAYER_PED_ID())
ENDIF
ENDIF
ENDPROC
/// Cancels any music events from this mission that may
PROC CANCEL_ALL_PREPARED_MUSIC_EVENTS()
CANCEL_MUSIC_EVENT("FH2B_MISSION_START")
CANCEL_MUSIC_EVENT("FH2B_WALL_SMASH")
CANCEL_MUSIC_EVENT("FH2B_EXPLODE")
CANCEL_MUSIC_EVENT("FH2B_HELI_ARRIVE")
CANCEL_MUSIC_EVENT("FH2B_FIGHT_START")
CANCEL_MUSIC_EVENT("FH2B_SWITCH_2")
CANCEL_MUSIC_EVENT("FH2B_VAN_START")
CANCEL_MUSIC_EVENT("FH2B_TANKER")
CANCEL_MUSIC_EVENT("FH2B_SWITCH_3")
CANCEL_MUSIC_EVENT("FH2B_GOLD_DROPPED")
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_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("FINAL3B", MISSION_TEXT_SLOT)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL")
ADD_RELATIONSHIP_GROUP("COPS", rel_group_cops)
ADD_RELATIONSHIP_GROUP("COPS2", rel_cops_buddy_ignore)
ADD_RELATIONSHIP_GROUP("NEUTRAL", rel_group_neutral)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, rel_group_cops)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, rel_group_neutral)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_PLAYER, rel_cops_buddy_ignore)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_cops, rel_group_cops)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rel_group_cops, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_cops, rel_group_neutral)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_cops, rel_cops_buddy_ignore)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_neutral, rel_group_neutral)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_neutral, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_neutral, rel_group_cops)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_neutral, rel_cops_buddy_ignore)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_cops_buddy_ignore, rel_group_neutral)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rel_cops_buddy_ignore, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_cops_buddy_ignore, rel_group_cops)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_cops_buddy_ignore, rel_cops_buddy_ignore)
i_cutter_sound_id = GET_SOUND_ID()
i_gold_container_sound_id = GET_SOUND_ID()
INT i = 0
REPEAT COUNT_OF(s_rockets) i
s_rockets[i].i_sound = GET_SOUND_ID()
ENDREPEAT
//group_player = GET_PLAYER_GROUP(PLAYER_ID())
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<2.1, -704.1, 15.1>>, TRUE)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<-0.6, -703.1, 15.1>>, TRUE)
//Lock the vault gates for the entire mission
i_bank_door_hashes[0] = HASH("Finale_Bank_Gate_1")
i_bank_door_hashes[1] = HASH("Finale_Bank_Gate_2")
i_bank_door_hashes[2] = HASH("Finale_Bank_Gate_3")
i_bank_door_hashes[3] = HASH("Finale_Bank_Gate_4")
i_bank_door_hashes[4] = HASH("Finale_Bank_Gate_5")
i_bank_door_hashes[5] = HASH("Finale_Bank_Gate_6")
i_bank_door_hashes[6] = HASH("Finale_Bank_Gate_7")
i_bank_door_hashes[7] = HASH("Finale_Bank_Gate_8")
i_bank_door_hashes[8] = HASH("Finale_Bank_Gate_9")
i_bank_door_hashes[9] = HASH("Finale_Bank_Gate_10")
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[0], V_ILEV_FINGATE, <<-7.4, -678.7, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[1], V_ILEV_FINGATE, <<4.4, -682.9, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[2], V_ILEV_FINGATE, <<-3.0, -676.6, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[3], V_ILEV_FINGATE, <<2.3, -678.6, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[4], V_ILEV_FINGATE, <<-1.0, -671.1, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[5], V_ILEV_FINGATE, <<4.3, -673.0, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[6], V_ILEV_FINGATE, <<8.2, -672.4, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[7], V_ILEV_FINGATE, <<-3.6, -668.2, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[8], V_ILEV_FINGATE, <<10.6, -666.6, 16.4>>)
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[9], V_ILEV_FINGATE, <<-1.7, -662.1, 16.4>>)
REPEAT COUNT_OF(i_bank_door_hashes) i
DOOR_SYSTEM_SET_DOOR_STATE(i_bank_door_hashes[i], DOORSTATE_LOCKED, FALSE, TRUE)
ENDREPEAT
ROPE_LOAD_TEXTURES()
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_cutter, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_start_car, TRUE)
sbi_bank_guard = ADD_SCENARIO_BLOCKING_AREA(<<0.6, -713.0, 40.0>>, <<5.1, -704.0, 50.0>>)
sbi_tunnel_hole = ADD_SCENARIO_BLOCKING_AREA(<<-6.3514, -662.3804, 10.0184>>, <<73.9236, -587.0708, 52.0184>>)
//Don't disable strip clubs if we're triggering the mission from the timelapse, as peds are visibly cleared.
IF IS_SCREEN_FADED_OUT()
DISABLE_STRIP_CLUBS()
ENDIF
SET_WEATHER_TYPE_OVERTIME_PERSIST("clear", 20.0)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_DESTROYED)
SET_BUILDING_STATE( BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_DESTROYED)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_DESTROYED)
b_were_ipls_reset_early = FALSE
#IF IS_DEBUG_BUILD
CREATE_WIDGETS()
s_skip_menu[0].sTxtLabel = "START_CUTSCENE (BS_2B_MCS_3)"
s_skip_menu[1].sTxtLabel = "GO_TO_BANK"
s_skip_menu[2].sTxtLabel = "DRILL_THROUGH_WALL"
s_skip_menu[3].sTxtLabel = "BLOW_UP_DOORS"
s_skip_menu[4].sTxtLabel = "COLLECT_GOLD"
s_skip_menu[5].sTxtLabel = "WINCH_GOLD_CUTSCENE (BS_2B_MCS_1)"
s_skip_menu[6].sTxtLabel = "TUNNEL_SHOOTOUT"
s_skip_menu[7].sTxtLabel = "LEAVE_BANK"
s_skip_menu[8].sTxtLabel = "CITY_SHOOTOUT"
s_skip_menu[9].sTxtLabel = "CITY_SHOOTOUT_MID_POINT"
s_skip_menu[10].sTxtLabel = "LOSE_COPS"
s_skip_menu[11].sTxtLabel = "CHOPPER_CHASE"
s_skip_menu[12].sTxtLabel = "DROP_GOLD_ON_TRAIN"
s_skip_menu[13].sTxtLabel = "DROP_GOLD_CUTSCENE"
s_skip_menu[14].sTxtLabel = "LAND_AT_AIRFIELD"
s_skip_menu[15].sTxtLabel = "END_CUTSCENE (BS_2B_EXT_ALT)"
#ENDIF
b_has_changed_clothes_michael = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
b_has_changed_clothes_franklin = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN)
b_has_changed_clothes_trevor = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
//Store the skill levels of the crew members for use later
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID)) = CMSK_GOOD
b_picked_good_driver = TRUE
b_crew_driver_set_to_die = FALSE
ELSE
b_picked_good_driver = FALSE
b_crew_driver_set_to_die = TRUE //This can also be set if the good driver accidentally dies in the chase, but for the bad driver they will always die.
ENDIF
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FRANKLIN_ID)) = CMSK_GOOD
b_picked_good_franklin_gunman = TRUE
i_crew_franklin_default_accuracy = 10
ELSE
b_picked_good_franklin_gunman = FALSE
i_crew_franklin_default_accuracy = 5
ENDIF
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID)) != CMSK_BAD
b_picked_good_michael_gunman = TRUE
i_crew_michael_default_accuracy = 10
ELSE
b_picked_good_michael_gunman = FALSE
i_crew_michael_default_accuracy = 5
ENDIF
str_crew_names[CREW_MICHAEL_ID] = GET_CREW_MEMBER_NAME_LABEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID))
str_crew_names[CREW_FRANKLIN_ID] = GET_CREW_MEMBER_NAME_LABEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FRANKLIN_ID))
str_crew_names[CREW_DRIVER_ID] = GET_CREW_MEMBER_NAME_LABEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID))
IF b_crew_driver_set_to_die
i_max_take_considering_crew = MAX_OVERALL_TAKE / 2
i_take_penalty_crew_died = MAX_OVERALL_TAKE / 2
ELSE
i_max_take_considering_crew = MAX_OVERALL_TAKE
i_take_penalty_crew_died = 0
ENDIF
RESET_GENERIC_SCORE_FLASHING(0)
DISABLE_TAXI_HAILING(TRUE)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
ENDPROC
PROC MISSION_CLEANUP()
CLEAR_HELP()
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_MAX_WANTED_LEVEL(5)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
SET_NUMBER_OF_PARKED_VEHICLES(-1)
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)
SET_POLICE_RADAR_BLIPS(TRUE)
DISABLE_CELLPHONE(FALSE)
HIDE_ACTIVE_PHONE(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
DISTANT_COP_CAR_SIRENS(FALSE)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
SET_RANDOM_TRAINS(TRUE)
CLEAR_FOCUS()
SET_TIME_SCALE(1.0)
NEW_LOAD_SCENE_STOP()
SET_RANDOM_TRAINS(TRUE)
END_SRL()
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
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)
SET_PLAYER_SPRINT(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_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
SET_FAKE_WANTED_LEVEL(0)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), TRUE)
ENDIF
IF b_is_jumping_directly_to_stage
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
ENDIF
//Only reset the rayfire if the player didn't die, otherwise it needs to go through the delayed cleanup header.
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_RESET)
ENDIF
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_RESET)
ENDIF
ENDIF
//SET_VAULT_GATES_AS_FORCED_OBJECTS(FALSE, b_is_jumping_directly_to_stage)
IF interior_tunnels[0] != NULL
UNPIN_INTERIOR(interior_tunnels[0])
interior_tunnels[0] = NULL
ENDIF
IF interior_tunnels[1] != NULL
UNPIN_INTERIOR(interior_tunnels[1])
interior_tunnels[1] = NULL
ENDIF
IF interior_vault != NULL
UNPIN_INTERIOR(interior_vault)
interior_vault = NULL
ENDIF
IF i_tunnel_navmesh_block != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_tunnel_navmesh_block)
i_tunnel_navmesh_block = -1
ENDIF
IF i_bridge_navmesh_block != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_bridge_navmesh_block)
i_bridge_navmesh_block = -1
ENDIF
IF i_stairs_navmesh_block != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_stairs_navmesh_block)
i_stairs_navmesh_block = -1
ENDIF
IF i_ramp_navmesh_block_1 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_1)
i_ramp_navmesh_block_1 = -1
ENDIF
IF i_ramp_navmesh_block_2 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_2)
i_ramp_navmesh_block_2 = -1
ENDIF
REMOVE_COVER_POINT(cover_player)
INT i
REPEAT COUNT_OF(s_heli_ropes_new) i
IF s_heli_ropes_new[i].rope != NULL
DELETE_ROPE(s_heli_ropes_new[i].rope)
s_heli_ropes_new[i].rope = NULL
ENDIF
ENDREPEAT
IF DOES_ROPE_EXIST(rope_cutscene)
DELETE_ROPE(rope_cutscene)
ENDIF
REPEAT COUNT_OF(s_rockets) i
IF s_rockets[i].ptfx != NULL
STOP_PARTICLE_FX_LOOPED(s_rockets[i].ptfx)
s_rockets[i].ptfx = NULL
ENDIF
IF NOT HAS_SOUND_FINISHED(s_rockets[i].i_sound)
STOP_SOUND(s_rockets[i].i_sound)
ENDIF
ENDREPEAT
IF IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
STOP_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", b_is_jumping_directly_to_stage)
ENDIF
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
STOP_SOUND(i_cutter_sound_id)
ENDIF
IF NOT HAS_SOUND_FINISHED(i_gold_container_sound_id)
STOP_SOUND(i_gold_container_sound_id)
ENDIF
REMOVE_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT")
RELEASE_SCRIPT_AUDIO_BANK()
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
TRIGGER_MUSIC_EVENT("FH2B_MISSION_FAIL")
IF NOT HAS_CUTSCENE_FINISHED()
STOP_CUTSCENE()
ENDIF
REMOVE_CUTSCENE()
IF b_is_jumping_directly_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 b_replay_event_started
REPLAY_STOP_EVENT()
b_replay_event_started = FALSE
ENDIF
REMOVE_PTFX_ASSET()
CLEAR_TIMECYCLE_MODIFIER()
SET_NOISEOVERIDE(FALSE)
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 9)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 8)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 7)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 6)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 5)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 4)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 3)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 2)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 1)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 0)
REMOVE_WAYPOINT_RECORDING(str_waypoint_heli_end)
REMOVE_ALL_BLIPS()
REMOVE_ALL_CAMERAS()
REMOVE_ALL_OBJECTS(b_is_jumping_directly_to_stage)
REMOVE_ALL_PEDS(b_is_jumping_directly_to_stage)
REMOVE_ALL_VEHICLES(b_is_jumping_directly_to_stage)
REMOVE_MODEL_HIDE(v_vault_gate_pos_1, 2.0, model_vault_gates, TRUE)
REMOVE_MODEL_HIDE(v_vault_gate_pos_2, 2.0, model_vault_gates, TRUE)
STOP_AUDIO_SCENES()
STOP_STREAM()
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
IF model_suppressed_getaway != DUMMY_MODEL_FOR_SCRIPT
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_suppressed_getaway, FALSE)
ENDIF
DISABLE_ROADS_FOR_CITY_SHOOTOUT(FALSE)
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(FALSE)
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(FALSE)
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_TREVOR, FALSE)
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_TREVOR, FALSE)
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
SET_SELECTOR_PED_ACTIVITY(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_ACTIVITY_DEFAULT)
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-91.637230,-575.683105,40.183411>>, <<-171.572296,-794.956055,30.708052>>, 229.750000)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-227.156067,-518.369263,40.960091>>, <<-303.200714,-689.523193,31.132313>>, 87.000000)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>, TRUE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
REPEAT COUNT_OF(sbi_airfield) i
IF sbi_airfield[i] != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbi_airfield[i])
sbi_airfield[i] = NULL
ENDIF
ENDREPEAT
IF sbi_shootout != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbi_shootout)
sbi_shootout = NULL
ENDIF
IF sbi_chase_start != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbi_chase_start)
sbi_chase_start = NULL
ENDIF
SET_SCENARIO_GROUP_ENABLED("Grapeseed_Planes", TRUE)
IF NOT b_is_jumping_directly_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
IF sbi_bank_guard != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbi_bank_guard)
sbi_bank_guard = NULL
ENDIF
IF sbi_tunnel_hole != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbi_tunnel_hole)
sbi_tunnel_hole = NULL
ENDIF
IF NOT b_were_ipls_reset_early
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_NORMAL, TRUE)
SET_BUILDING_STATE( BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_NORMAL, TRUE)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_NORMAL, TRUE)
ENDIF
DISABLE_TAXI_HAILING(FALSE)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
KILL_FACE_TO_FACE_CONVERSATION()
ENABLE_STRIP_CLUBS()
RELEASE_SOUND_ID(i_cutter_sound_id)
RELEASE_SOUND_ID(i_gold_container_sound_id)
UNREGISTER_SCRIPT_WITH_AUDIO()
ROPE_UNLOAD_TEXTURES()
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<2.1, -704.1, 15.1>>, FALSE)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<-0.6, -703.1, 15.1>>, FALSE)
//Reset the vault gates
REPEAT COUNT_OF(i_bank_door_hashes) i
DOOR_SYSTEM_SET_DOOR_STATE(i_bank_door_hashes[i], DOORSTATE_UNLOCKED, FALSE, TRUE)
REMOVE_DOOR_FROM_SYSTEM(i_bank_door_hashes[i])
ENDREPEAT
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_cutter, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_start_car, FALSE)
CLEAR_WEATHER_TYPE_PERSIST()
TERMINATE_THIS_THREAD()
ELSE
CLEAR_TRIGGERED_LABELS()
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_AREA(v_zero, 10000.0, TRUE, TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
IF DOES_ENTITY_EXIST(veh_gold_train)
DELETE_MISSION_TRAIN(veh_gold_train)
ENDIF
CLEANUP_UBER_PLAYBACK()
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_car)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
SET_MODEL_AS_NO_LONGER_NEEDED(model_merry)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cutter)
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
SET_MODEL_AS_NO_LONGER_NEEDED(model_trevor_gold_chopper)
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_container)
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
SET_MODEL_AS_NO_LONGER_NEEDED(model_tunnel_crate)
SET_MODEL_AS_NO_LONGER_NEEDED(model_tunnel_crate_2)
SET_MODEL_AS_NO_LONGER_NEEDED(model_tunnel_crate_3)
SET_MODEL_AS_NO_LONGER_NEEDED(model_rope_weight)
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_engine)
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_carriage)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
SET_MODEL_AS_NO_LONGER_NEEDED(model_rocket_helper)
REMOVE_ANIM_DICT(str_anim_cutter)
REMOVE_ANIM_DICT(str_anim_ig_2)
REMOVE_ANIM_DICT(str_anim_rocket_reload)
REMOVE_ANIM_DICT(str_anim_rocket_signal)
REMOVE_ANIM_DICT(str_anim_rockets)
REMOVE_ANIM_DICT(str_anim_trolley_push_out)
REMOVE_ANIM_DICT(str_anim_trolley_push_in)
REMOVE_ANIM_DICT(str_anim_crew_action_idle)
REMOVE_ANIM_DICT(str_anim_custom_switch)
REMOVE_ANIM_DICT(str_anim_custom_switch2)
REMOVE_ANIM_DICT(str_anim_cam_shake)
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
REMOVE_VEHICLE_ASSET(model_cop_car)
REMOVE_VEHICLE_ASSET(model_cop_heli)
REMOVE_VEHICLE_ASSET(model_swat_van)
REMOVE_VEHICLE_ASSET(model_start_car)
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_enter_left)
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_enter_right)
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_exit_left)
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_exit_right)
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_left)
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_right)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_1, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_3, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_4, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_5, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_6, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_1, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_RAMP, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_1, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_COURTYARD, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_MERRY_HELI, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
STOP_STREAM()
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
ENDIF
ENDPROC
PROC DISABLE_VEH_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_DOWN_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_UP_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_LEFT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_RIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UP_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL_ABILITY_FRANKLIN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_DOWN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_DOWN_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UP_ONLY)
ENDPROC
PROC SET_HEIST_CREW_END_SCREEN_STATUSES()
INT i
REPEAT GET_HEIST_CREW_SIZE(HEIST_FINALE) i
IF i = CREW_DRIVER_ID
IF NOT b_crew_driver_set_to_die
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
ELSE
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_KILLED)
ENDIF
ELIF i = CREW_MICHAEL_ID
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
ELSE
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
ENDIF
ENDREPEAT
ENDPROC
PROC SET_END_SCREEN_TAKE()
SET_HEIST_CREW_END_SCREEN_STATUSES()
SET_HEIST_END_SCREEN_POTENTIAL_TAKE(HEIST_FINALE, MAX_OVERALL_TAKE)
SET_HEIST_END_SCREEN_ACTUAL_TAKE(HEIST_FINALE, MAX_OVERALL_TAKE)
ADD_PENALTY_TO_HEIST(HEIST_FINALE, HEIST_PENALTY_MONEY_DROPPED, i_take_penalty_crew_died)
ENDPROC
PROC MISSION_PASSED(BOOL bPassScreenAlreadyDisplayed = FALSE)
IF NOT bPassScreenAlreadyDisplayed
SET_END_SCREEN_TAKE()
ENDIF
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, b_has_changed_clothes_franklin)
AWARD_ACHIEVEMENT_FOR_MISSION(ACH09) // The Big One
Mission_Flow_Mission_Passed()
MISSION_CLEANUP()
ENDPROC
PROC JUMP_TO_STAGE(MISSION_STAGE stage, BOOL bIsDebugJump = FALSE)
DO_FADE_OUT_WITH_WAIT()
b_is_jumping_directly_to_stage = TRUE
i_current_event = 0
e_mission_stage = stage
e_section_stage = SECTION_STAGE_SETUP
MISSION_CLEANUP()
//Update mission checkpoint in case they skipped the stages where it gets set.
IF bIsDebugJump
IF e_mission_stage >= STAGE_LAND_AT_AIRFIELD
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FLY_BACK, "LAND_AT_AIRFIELD", TRUE)
ELIF e_mission_stage >= STAGE_DROP_GOLD_ON_TRAIN
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DROPOFF_GOLD, "DROP_OFF_GOLD")
ELIF e_mission_stage >= STAGE_CHOPPER_CHASE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_HELI_CHASE, "CHOPPER_CHASE")
ELIF e_mission_stage >= STAGE_LOSE_COPS
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LOSE_COPS, "LOSE_COPS")
ELIF e_mission_stage >= STAGE_CITY_SHOOTOUT_MID_POINT
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT_MID, "CITY_SHOOTOUT_MID_POINT")
ELIF e_mission_stage >= STAGE_CITY_SHOOTOUT
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT, "CITY_SHOOTOUT")
ELIF e_mission_stage >= STAGE_TUNNEL_SHOOTOUT
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_TUNNEL_SHOOTOUT, "TUNNEL_SHOOTOUT")
ELIF e_mission_stage >= STAGE_DRILL_THROUGH_WALL
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DRILL, "DRILL_THROUGH_WALL")
ELIF e_mission_stage >= STAGE_GO_TO_BANK
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "GO_TO_BANK")
ENDIF
ENDIF
ENDPROC
PROC DISABLE_WANTED_LEVEL_FOR_SHOOTOUT()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_POLICE_RADAR_BLIPS(FALSE)
CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.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_AMBULANCE_DEPARTMENT, FALSE)
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_CURRENT_PLAYER_PED_ENUM() = eChar
RETURN PLAYER_PED_ID()
ELSE
RETURN s_selector_peds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(eChar)]
ENDIF
ENDFUNC
PROC SETUP_MICHAEL_OUTFIT(BOOL b_needs_balaclava = FALSE)
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
//Boiler suit
/*SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_BOILER_SUIT_4, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_BOILER_SUIT_4, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_FEET, FEET_P0_1, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL2, SPECIAL2_P0_NONE, FALSE)*/
//Dress suit
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_GREY_SUIT_2, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GREY_SUIT_02, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_FEET, FEET_P0_BLACK_SHOES, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL2, SPECIAL2_P0_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_JBIB, JBIB_P0_TIE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_HAND, HAND_P0_BLACK_GLOVES, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL, SPECIAL_P0_NONE, FALSE)
IF b_needs_balaclava
//SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL, SPECIAL_P0_BALACLAVA, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_DECL, DECL_P0_MASK_3, FALSE)
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
ELSE
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_DECL, DECL_P0_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET, FALSE)
ENDIF
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
ENDIF
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_PROPS, PROPS_P2_HEADSET, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_SPECIAL2, SPECIAL2_P2_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_SPECIAL, SPECIAL_P2_DUMMY, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_HAND, HAND_P2_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
//Boiler suit
/*SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_LEGS, LEGS_P2_BOILER_SUIT_BLUE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_TORSO, TORSO_P2_BOILER_SUIT_BLUE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_FEET, FEET_P2_BLACK_BOOTS, FALSE)*/
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_5, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_FEET, FEET_P2_LOAFERS, FALSE)
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
ENDIF
ENDPROC
PROC SETUP_FRANKLIN_OUTFIT(BOOL b_needs_balaclava = FALSE, BOOL b_needs_gloves = TRUE)
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
IF b_needs_gloves
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_BLACK_GLOVES, FALSE)
ELSE
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_NONE, FALSE)
ENDIF
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
//Boiler suit
/*SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_LEGS, LEGS_P1_BLUE_BOILER, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_TORSO, TORSO_P1_BLUE_BOILER, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_FEET, FEET_P0_7, FALSE)*/
//Dress suit
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_LEGS, LEGS_P1_SUIT_4, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_TORSO, TORSO_P1_SUIT_4, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_FEET, FEET_P1_SMART_SHOES, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_JBIB, JBIB_P1_SHIRT_A, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_SPECIAL2, SPECIAL2_P1_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_SPECIAL, SPECIAL_P1_DUMMY, FALSE)
IF b_needs_balaclava
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_DECL, DECL_P1_MASK_3, FALSE)
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
ELSE
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_DECL, DECL_P1_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
ENDIF
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN)
ENDIF
ENDPROC
PROC SETUP_GUNMAN_OUTFIT(PED_INDEX ped, BOOL b_needs_balaclava = FALSE)
IF NOT IS_PED_INJURED(ped)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_DECL, 1, 0)
IF b_needs_balaclava
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, 0, 0)
ELSE
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, 1, 0)
ENDIF
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 5, 2)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, 5, 2)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_FEET, 1, 0)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_BERD, 1, 0)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL2, 0, 0)
SET_PED_PROP_INDEX(ped, ANCHOR_EARS, 0)
ENDIF
ENDPROC
PROC SETUP_DRIVER_OUTFIT()
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID)
IF eCrewID = CM_DRIVER_G_TALINA_UNLOCK
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_HAIR, 2, 0)
ELSE
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_HAIR, 0, 0)
ENDIF
SET_PED_PROP_INDEX(s_crew[CREW_DRIVER_ID].ped, ANCHOR_EARS, 0)
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_LEG, 3, 2)
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_TORSO, 4, 2)
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_SPECIAL, 1, 0)
ENDIF
ENDPROC
FUNC BOOL SETUP_REQ_FINAL_CAR(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(veh_final_car)
REQUEST_MODEL(TAILGATER)
REQUEST_VEHICLE_ASSET(TAILGATER, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS))
IF HAS_MODEL_LOADED(TAILGATER)
AND HAS_VEHICLE_ASSET_LOADED(TAILGATER)
IF NOT b_just_request_assets
veh_final_car = CREATE_VEHICLE(TAILGATER, v_pos, f_heading)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(veh_final_car, FALSE)
SET_VEHICLE_COLOURS(veh_final_car, 31, 31)
SET_VEHICLE_EXTRA_COLOURS(veh_final_car, 10, 0)
SET_VEHICLE_NUMBER_PLATE_TEXT(veh_final_car, "54AJM610")
SET_VEHICLE_DIRT_LEVEL(veh_final_car, 3.0)
SET_MODEL_AS_NO_LONGER_NEEDED(TAILGATER)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(BOOL b_request_models_only = FALSE, BOOL b_force_create_closed_containers = FALSE, BOOL b_ignore_entity_exist_check = FALSE)
MODEL_NAMES model_container
IF e_mission_stage >= STAGE_WINCH_GOLD_CUTSCENE
OR b_force_create_closed_containers
model_container = model_gold_container
ELSE
model_container = model_gold_container_open
ENDIF
IF (NOT DOES_ENTITY_EXIST(obj_gold_containers[0]) OR b_ignore_entity_exist_check)
REQUEST_MODEL(model_container)
IF HAS_MODEL_LOADED(model_container)
IF NOT b_request_models_only
obj_gold_containers[0] = CREATE_OBJECT_NO_OFFSET(model_container, <<23.8434, -636.2329, 16.0034>>)
SET_ENTITY_HEADING(obj_gold_containers[0], -56.8800)
FREEZE_ENTITY_POSITION(obj_gold_containers[0], TRUE)
SET_CAN_AUTO_VAULT_ON_ENTITY(obj_gold_containers[0], FALSE)
SET_CAN_CLIMB_ON_ENTITY(obj_gold_containers[0], FALSE)
IF interior_tunnels[0] != NULL
RETAIN_ENTITY_IN_INTERIOR(obj_gold_containers[0], interior_tunnels[0])
ENDIF
obj_gold_containers[1] = CREATE_OBJECT_NO_OFFSET(model_container, <<24.9209, -639.1294, 16.0089>>)
IF model_container = model_gold_container_open
SET_ENTITY_HEADING(obj_gold_containers[1], -72.3600 + 180.0)
ELSE
SET_ENTITY_HEADING(obj_gold_containers[1], -72.3600)
ENDIF
FREEZE_ENTITY_POSITION(obj_gold_containers[1], TRUE)
SET_CAN_AUTO_VAULT_ON_ENTITY(obj_gold_containers[1], FALSE)
SET_CAN_CLIMB_ON_ENTITY(obj_gold_containers[1], FALSE)
IF interior_tunnels[0] != NULL
RETAIN_ENTITY_IN_INTERIOR(obj_gold_containers[1], interior_tunnels[0])
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(model_container)
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT(BOOL b_request_models_only = FALSE)
IF NOT DOES_ENTITY_EXIST(obj_gold_trolleys[0])
REQUEST_MODEL(model_large_gold_trolley)
IF HAS_MODEL_LOADED(model_large_gold_trolley)
IF NOT b_request_models_only
obj_gold_trolleys[0] = CREATE_OBJECT_NO_OFFSET(model_large_gold_trolley, <<10.411038,-663.455688, 15.524313>>)
SET_ENTITY_HEADING(obj_gold_trolleys[0], 161.475769)
//obj_gold_trolleys[1] = CREATE_OBJECT_NO_OFFSET(model_large_gold_trolley, <<1.913392,-660.422180,15.524313>>)
obj_gold_trolleys[1] = CREATE_OBJECT_NO_OFFSET(model_large_gold_trolley, <<0.1734, -659.6722, 15.5243>>)
SET_ENTITY_HEADING(obj_gold_trolleys[1], -17.945414)
IF e_mission_stage < STAGE_WINCH_GOLD_CUTSCENE
IF interior_vault != NULL
IF IS_INTERIOR_READY(interior_vault)
RETAIN_ENTITY_IN_INTERIOR(obj_gold_trolleys[0], interior_vault)
RETAIN_ENTITY_IN_INTERIOR(obj_gold_trolleys[1], interior_vault)
FORCE_ROOM_FOR_ENTITY(obj_gold_trolleys[0], interior_vault, HASH("GtaMloRoom010"))
FORCE_ROOM_FOR_ENTITY(obj_gold_trolleys[1], interior_vault, HASH("GtaMloRoom010"))
ENDIF
ENDIF
FREEZE_ENTITY_POSITION(obj_gold_trolleys[0], TRUE)
FREEZE_ENTITY_POSITION(obj_gold_trolleys[1], TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(model_large_gold_trolley)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_CONTAINER_WITH_TROLLEY_INSIDE(INT i_container)
IF DOES_ENTITY_EXIST(obj_gold_containers[i_container])
AND DOES_ENTITY_EXIST(obj_gold_trolleys[i_container])
DETACH_ENTITY(obj_gold_trolleys[i_container])
DETACH_ENTITY(obj_gold_containers[i_container], FALSE)
FREEZE_ENTITY_POSITION(obj_gold_containers[i_container], FALSE)
FREEZE_ENTITY_POSITION(obj_gold_trolleys[i_container], FALSE)
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[i_container], obj_gold_containers[i_container], 0, <<0.0, 0.0, -0.45>>, <<0.0, 0.0, 0.0>>)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
IF SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
AND SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
IF SETUP_REQ_GOLD_CONTAINER_WITH_TROLLEY_INSIDE(0)
AND SETUP_REQ_GOLD_CONTAINER_WITH_TROLLEY_INSIDE(1)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SETUP_TUNNEL_CREW_FOR_SHOOTOUT()
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_PED_COMBAT_PARAMS(s_crew[CREW_FRANKLIN_ID].ped, i_crew_franklin_default_accuracy, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_MAX_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
SET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
SET_RAGDOLL_BLOCKING_FLAGS(s_crew[CREW_FRANKLIN_ID].ped, RBF_BULLET_IMPACT | RBF_IMPACT_OBJECT | RBF_PLAYER_IMPACT | RBF_ELECTROCUTION | RBF_MELEE | RBF_FIRE)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_DisableHurt, TRUE)
ENDIF
ENDPROC
FUNC BOOL SETUP_REQ_FRANKLIN(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE, BOOL b_with_balaclava = TRUE)
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
IF b_just_request_assets
REQUEST_PLAYER_PED_MODEL(CHAR_FRANKLIN)
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_FRANKLIN)
RETURN TRUE
ENDIF
ELIF CREATE_PLAYER_PED_ON_FOOT(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], CHAR_FRANKLIN, v_pos, f_heading)
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 1800)
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], RELGROUPHASH_PLAYER)
s_franklin.i_event = 0
s_franklin.i_timer = 0
s_franklin.b_is_waypoint_aiming = FALSE
REMOVE_COVER_POINT(s_franklin.cover)
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_APPISTOL, 500, FALSE)
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
GIVE_WEAPON_COMPONENT_TO_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
SETUP_FRANKLIN_OUTFIT(b_with_balaclava)
RETURN TRUE
ENDIF
ELSE
IF s_conversation_peds.PedInfo[1].Index != s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]
OR NOT s_conversation_peds.PedInfo[1].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TREVOR(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
IF b_just_request_assets
REQUEST_PLAYER_PED_MODEL(CHAR_TREVOR)
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_TREVOR)
RETURN TRUE
ENDIF
ELIF CREATE_PLAYER_PED_ON_FOOT(s_selector_peds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, v_pos, f_heading)
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
//s_trevor.i_event = 0
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_COMBATMG, 500, TRUE)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, s_selector_peds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
SETUP_TREVOR_OUTFIT()
RETURN TRUE
ENDIF
ELSE
IF s_conversation_peds.PedInfo[2].Index != s_selector_peds.pedID[SELECTOR_PED_TREVOR]
OR NOT s_conversation_peds.PedInfo[2].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, s_selector_peds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_MICHAEL(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE, BOOL b_with_balaclava = TRUE)
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
IF b_just_request_assets
REQUEST_PLAYER_PED_MODEL(CHAR_MICHAEL)
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_MICHAEL)
RETURN TRUE
ENDIF
ELIF CREATE_PLAYER_PED_ON_FOOT(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, v_pos, f_heading)
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], RELGROUPHASH_PLAYER)
s_michael.i_event = 0
s_michael.i_timer = 0
s_michael.b_is_waypoint_aiming = FALSE
REMOVE_COVER_POINT(s_michael.cover)
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
GIVE_WEAPON_COMPONENT_TO_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, s_selector_peds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
SET_PED_COMP_ITEM_CURRENT_SP(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET)
SETUP_MICHAEL_OUTFIT(b_with_balaclava)
RETURN TRUE
ENDIF
ELSE
IF s_conversation_peds.PedInfo[0].Index != s_selector_peds.pedID[SELECTOR_PED_MICHAEL]
OR NOT s_conversation_peds.PedInfo[0].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, s_selector_peds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_PLAYER_AS_FRANKLIN()
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN)
ELSE
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
IF s_conversation_peds.PedInfo[1].Index != PLAYER_PED_ID()
OR NOT s_conversation_peds.PedInfo[1].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, PLAYER_PED_ID(), "FRANKLIN")
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_PLAYER_AS_MICHAEL()
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_MICHAEL)
ELSE
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
IF s_conversation_peds.PedInfo[0].Index != PLAYER_PED_ID()
OR NOT s_conversation_peds.PedInfo[0].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL")
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_PLAYER_AS_TREVOR()
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR)
ELSE
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
IF s_conversation_peds.PedInfo[2].Index != PLAYER_PED_ID()
OR NOT s_conversation_peds.PedInfo[2].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, PLAYER_PED_ID(), "TREVOR")
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_START_CAR(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(s_start_car.veh)
REQUEST_MODEL(model_start_car)
REQUEST_VEHICLE_ASSET(model_start_car)
IF HAS_MODEL_LOADED(model_start_car)
AND HAS_VEHICLE_ASSET_LOADED(model_start_car)
IF NOT b_just_request_assets
s_start_car.veh = CREATE_VEHICLE(model_start_car, v_pos, f_heading)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(s_start_car.veh, FALSE)
SET_VEHICLE_STRONG(s_start_car.veh, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(s_start_car.veh, TRUE)
SET_VEHICLE_COLOURS(s_start_car.veh, 17, 17)
SET_VEHICLE_EXTRA_COLOURS(s_start_car.veh, 17, 0)
SET_VEHICLE_DIRT_LEVEL(s_start_car.veh, 0.0)
SET_VEHICLE_CAN_LEAK_OIL(s_start_car.veh, FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(s_start_car.veh, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(s_start_car.veh, "81TDS937")
SET_VEH_RADIO_STATION(s_start_car.veh, "RADIO_01_CLASS_ROCK")
SET_MODEL_AS_NO_LONGER_NEEDED(model_start_car)
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_MAIN_CREW(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_DRIVER_ID].ped)
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_MICHAEL_ID].ped)
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
IF HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
IF NOT b_just_request_assets
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_DRIVER_ID].ped)
s_crew[CREW_DRIVER_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID, v_pos, f_heading)
ENDIF
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
s_crew[CREW_FRANKLIN_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FRANKLIN_ID, v_pos + <<1.5, 0.0, 0.0>>, f_heading + 2.0)
ENDIF
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_MICHAEL_ID].ped)
s_crew[CREW_MICHAEL_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID, v_pos + <<-1.5, 0.0, 0.0>>, f_heading + 2.0)
ENDIF
INT i
REPEAT COUNT_OF(s_crew) i
IF NOT IS_PED_INJURED(s_crew[i].ped)
SET_PED_RELATIONSHIP_GROUP_HASH(s_crew[i].ped, RELGROUPHASH_PLAYER)
IF i = CREW_MICHAEL_ID
GIVE_WEAPON_TO_PED(s_crew[i].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
ELSE
GIVE_WEAPON_TO_PED(s_crew[i].ped, WEAPONTYPE_ADVANCEDRIFLE, INFINITE_AMMO, TRUE)
ENDIF
SET_ENTITY_HEALTH(s_crew[i].ped, 200)
SET_PED_MAX_HEALTH(s_crew[i].ped, 200)
SET_PED_SUFFERS_CRITICAL_HITS(s_crew[i].ped, FALSE)
SET_PED_CAN_BE_TARGETTED(s_crew[i].ped, FALSE)
SET_PED_COMBAT_AI(s_crew[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, v_zero)
ENDIF
ENDREPEAT
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, FALSE)
SETUP_DRIVER_OUTFIT()
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_CUTTER(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE, BOOL b_start_frozen = FALSE)
IF NOT DOES_ENTITY_EXIST(veh_cutter)
REQUEST_MODEL(model_cutter)
IF HAS_MODEL_LOADED(model_cutter)
IF NOT b_just_request_assets
veh_cutter = CREATE_VEHICLE(model_cutter, v_pos, f_heading)
SET_VEHICLE_RADIO_ENABLED(veh_cutter, FALSE)
SET_VEHICLE_STRONG(veh_cutter, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(veh_cutter, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(veh_cutter, FALSE)
SET_VEHICLE_AS_RESTRICTED(veh_cutter, 0)
IF b_start_frozen
FREEZE_ENTITY_POSITION(veh_cutter, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(model_cutter)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND(BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
IF HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
IF NOT b_just_request_assets
s_crew[CREW_FRANKLIN_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FRANKLIN_ID, <<22.8719, -638.4583, 15.0881>>, 133.7838)
SET_PED_RELATIONSHIP_GROUP_HASH(s_crew[CREW_FRANKLIN_ID].ped, RELGROUPHASH_PLAYER)
GIVE_WEAPON_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE, INFINITE_AMMO, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
SET_PED_CAN_BE_TARGETTED(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SET_PED_SUFFERS_CRITICAL_HITS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
s_crew[CREW_FRANKLIN_ID].i_event = 0
s_crew[CREW_FRANKLIN_ID].i_timer = 0
s_crew[CREW_FRANKLIN_ID].i_sync_scene = -1
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = FALSE
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_CREW_DRIVER_IN_CHOPPER(BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_DRIVER_ID].ped)
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
IF HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
IF NOT b_just_request_assets
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[CREW_DRIVER_ID].veh)
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
s_crew[CREW_DRIVER_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID, GET_ENTITY_COORDS(s_gold_choppers[1].veh) + <<0.0, 0.0, 10.0>>, 0.0)
SET_PED_RELATIONSHIP_GROUP_HASH(s_crew[CREW_DRIVER_ID].ped, RELGROUPHASH_PLAYER)
GIVE_WEAPON_TO_PED(s_crew[CREW_DRIVER_ID].ped, WEAPONTYPE_ADVANCEDRIFLE, INFINITE_AMMO, TRUE)
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
SET_PED_CAN_BE_TARGETTED(s_crew[CREW_DRIVER_ID].ped, FALSE)
SETUP_DRIVER_OUTFIT()
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TREVOR_IN_CHOPPER(BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND SETUP_REQ_TREVOR(GET_ENTITY_COORDS(s_gold_choppers[0].veh) + <<0.0, 0.0, 10.0>>)
IF NOT b_just_request_assets
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], s_gold_choppers[0].veh)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE, BOOL b_need_balaclava = TRUE)
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_MICHAEL_ID].ped)
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
IF HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
IF NOT b_just_request_assets
s_crew[CREW_MICHAEL_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID, v_pos, f_heading)
SET_PED_RELATIONSHIP_GROUP_HASH(s_crew[CREW_MICHAEL_ID].ped, RELGROUPHASH_PLAYER)
SET_ENTITY_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 200)
SET_PED_MAX_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 200)
SET_PED_SUFFERS_CRITICAL_HITS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
GIVE_WEAPON_TO_PED(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
SET_PED_CAN_BE_TARGETTED(s_crew[CREW_MICHAEL_ID].ped, FALSE)
SET_PED_COMBAT_AI(s_crew[CREW_MICHAEL_ID].ped, i_crew_michael_default_accuracy, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, v_zero)
SET_PED_SHOOT_RATE(s_crew[CREW_MICHAEL_ID].ped, 80)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, b_need_balaclava)
s_crew[CREW_MICHAEL_ID].i_event = 0
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
AND DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) = RFMO_STATE_END
AND GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) = RFMO_STATE_END
RETURN TRUE
ELSE
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_END
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_ENDING
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_ENDING)
ENDIF
ENDIF
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) != RFMO_STATE_END
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) != RFMO_STATE_ENDING
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_ENDING)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
rayfire_tunnel = GET_RAYFIRE_MAP_OBJECT(<<7.25, -656.98, 17.14>>, 50.0, "des_finale_tunnel")
ENDIF
IF NOT DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
rayfire_vault = GET_RAYFIRE_MAP_OBJECT(<<7.25, -656.98, 17.14>>, 50.0, "des_finale_vault")
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TUNNEL_INTERIOR_READY()
IF interior_tunnels[0] = NULL
interior_tunnels[0] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<10.44, -647.86, 16.33>>, "v_31_tun_02")
ENDIF
IF interior_tunnels[1] = NULL
interior_tunnels[1] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<36.4, -689.1, 17.6>>, "v_31_tun_03")
ENDIF
IF interior_vault = NULL
interior_vault = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<4.3929, -661.7692, 16.1308>>, "v_finalebank")
ENDIF
IF NOT IS_INTERIOR_READY(interior_tunnels[0])
PIN_INTERIOR_IN_MEMORY(interior_tunnels[0])
ENDIF
IF NOT IS_INTERIOR_READY(interior_tunnels[1])
PIN_INTERIOR_IN_MEMORY(interior_tunnels[1])
ENDIF
IF NOT IS_INTERIOR_READY(interior_vault)
PIN_INTERIOR_IN_MEMORY(interior_vault)
ENDIF
IF IS_INTERIOR_READY(interior_vault)
AND IS_INTERIOR_READY(interior_tunnels[0])
AND IS_INTERIOR_READY(interior_tunnels[1])
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
IF NOT IS_ENTITY_DEAD(veh_cutter)
SET_ENTITY_COORDS(veh_cutter, v_cutter_pos_after_drilling)
SET_ENTITY_HEADING(veh_cutter, f_cutter_heading_after_drilling)
//FREEZE_ENTITY_POSITION(veh_cutter, TRUE)
//SET_VEHICLE_DOORS_LOCKED(veh_cutter, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
SET_VEHICLE_LIGHTS(veh_cutter, FORCE_VEHICLE_LIGHTS_ON)
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<20.1574, -638.8393, 15.0670>>)
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 322.5426)
ENDIF
IF e_mission_stage != STAGE_LEAVE_BANK //Don't reposition the trolleys on this stage as they'll be attached to the choppers.
IF SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
//Don't reposition these objects if they're currently attached to the helicopter (this could potentially happen on a Z-skip).
IF NOT s_heli_ropes_new[0].b_is_attached
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], <<23.4634, -636.2529, 16.0034>>)
SET_ENTITY_HEADING(obj_gold_containers[0], 159.9524)
ENDIF
IF NOT s_heli_ropes_new[4].b_is_attached
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[1], <<23.4009, -639.7594, 16.0089>>)
IF e_mission_stage >= STAGE_WINCH_GOLD_CUTSCENE
SET_ENTITY_HEADING(obj_gold_containers[1], 223.2627)
ELSE
SET_ENTITY_HEADING(obj_gold_containers[1], 223.2627 - 180.0)
ENDIF
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(BOOL bIsActive)
IF bIsActive
IF cover_rubble[0] = NULL
cover_rubble[0] = ADD_COVER_POINT(<<5.0604, -664.9948, 15.1306>>, 157.7793, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
cover_rubble[1] = ADD_COVER_POINT(<<3.4377, -664.0313, 15.1306>>, 160.3413, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
cover_rubble[2] = ADD_COVER_POINT(<<4.2783, -664.3798, 15.1306>>, 159.3272, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ENDIF
ELSE
INT i
REPEAT COUNT_OF(cover_rubble) i
REMOVE_COVER_POINT(cover_rubble[i])
cover_rubble[i] = NULL
ENDREPEAT
ENDIF
ENDPROC
FUNC BOOL SETUP_GOLD_CHOPPERS(VECTOR vChopper1Pos, FLOAT fChopper1Heading, VECTOR vChopper2Pos, FLOAT fChopper2Heading, BOOL bJustRequestAssets = FALSE, BOOL bFreezeOnCreation = FALSE)
IF NOT DOES_ENTITY_EXIST(s_gold_choppers[0].veh)
REQUEST_MODEL(model_gold_chopper)
REQUEST_MODEL(model_trevor_gold_chopper)
IF HAS_MODEL_LOADED(model_gold_chopper)
AND HAS_MODEL_LOADED(model_trevor_gold_chopper)
IF NOT bJustRequestAssets
s_gold_choppers[0].veh = CREATE_VEHICLE(model_trevor_gold_chopper, vChopper1Pos, fChopper1Heading)
s_gold_choppers[1].veh = CREATE_VEHICLE(model_gold_chopper, vChopper2Pos, fChopper2Heading)
SET_VEHICLE_AS_RESTRICTED(s_gold_choppers[0].veh, 1)
SET_VEHICLE_LIVERY(s_gold_choppers[0].veh, 1)
SET_VEHICLE_STRONG(s_gold_choppers[0].veh, TRUE)
SET_VEHICLE_STRONG(s_gold_choppers[1].veh, TRUE)
SET_VEHICLE_COLOURS(s_gold_choppers[1].veh, 62, 0)
SET_VEHICLE_EXTRA_COLOURS(s_gold_choppers[1].veh, 70, 0)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[1].veh)
IF bFreezeOnCreation
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, TRUE)
FREEZE_ENTITY_POSITION(s_gold_choppers[1].veh, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
SET_MODEL_AS_NO_LONGER_NEEDED(model_trevor_gold_chopper)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/*FUNC BOOL SETUP_REQ_ROPES_ON_CHOPPER(INT i_rope_index, BOOL b_already_unwound = FALSE)
IF s_heli_ropes[i_rope_index].rope = NULL
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_rope_index].veh)
FLOAT f_start_length = ROPE_MIN_LENGTH
IF b_already_unwound
f_start_length = ROPE_MAX_LENGTH
ENDIF
s_heli_ropes[i_rope_index].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, ROPE_MAX_LENGTH, PHYSICS_ROPE_DEFAULT_WIRE, f_start_length, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes[i_rope_index].b_is_attached = FALSE
ENDIF
ELIF NOT DOES_ENTITY_EXIST(obj_rope_weights[i_rope_index])
REQUEST_MODEL(model_rope_weight)
IF HAS_MODEL_LOADED(model_rope_weight)
obj_rope_weights[i_rope_index] = CREATE_OBJECT(model_rope_weight,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>)
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_rope_weights[i_rope_index], TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_rope_weights[i_rope_index], FALSE)
SET_ENTITY_VISIBLE(obj_rope_weights[i_rope_index], FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_rope_weight)
s_heli_ropes[i_rope_index].b_is_attached = FALSE
ENDIF
ELIF NOT s_heli_ropes[i_rope_index].b_is_attached
IF DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_rope_index].veh)
AND DOES_ENTITY_HAVE_PHYSICS(obj_rope_weights[i_rope_index])
APPLY_FORCE_TO_ENTITY(obj_rope_weights[i_rope_index], APPLY_TYPE_EXTERNAL_IMPULSE, <<0,0,-1.0>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes[i_rope_index].rope, s_gold_choppers[i_rope_index].veh, obj_rope_weights[i_rope_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>, ROPE_MIN_LENGTH,
0, 0)
s_heli_ropes[i_rope_index].b_is_attached = TRUE
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sets up a rope on the chopper attached to the gold trolley, in the unwound position. i_rope_index is consistent for the chopper, rope and trolley.
FUNC BOOL SETUP_REQ_TROLLEY_ATTACHED_TO_UNWOUND_HELI_ROPE(INT i_rope_index)
IF s_heli_ropes[i_rope_index].rope = NULL
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_rope_index].veh)
s_heli_ropes[i_rope_index].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, ROPE_MAX_LENGTH, PHYSICS_ROPE_DEFAULT_WIRE, ROPE_MAX_LENGTH, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes[i_rope_index].b_is_attached = FALSE
s_heli_ropes[i_rope_index].b_attached_object_is_ready = FALSE
ENDIF
ELIF DOES_ENTITY_EXIST(obj_rope_weights[i_rope_index])
DETACH_ROPE_FROM_ENTITY(s_heli_ropes[i_rope_index].rope, obj_rope_weights[i_rope_index])
REMOVE_OBJECT(obj_rope_weights[i_rope_index], TRUE)
s_heli_ropes[i_rope_index].b_is_attached = FALSE
s_heli_ropes[i_rope_index].b_attached_object_is_ready = FALSE
ELIF NOT s_heli_ropes[i_rope_index].b_attached_object_is_ready
IF DOES_ENTITY_EXIST(obj_gold_containers[i_rope_index])
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_rope_index]), GET_ENTITY_COORDS(s_gold_choppers[i_rope_index].veh)) > 400.0
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_rope_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, <<0.0, 0.0, -5.0>>))
ENDIF
IF IS_ENTITY_ATTACHED(obj_gold_containers[i_rope_index])
DETACH_ENTITY(obj_gold_containers[i_rope_index])
ENDIF
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_gold_containers[i_rope_index], TRUE)
FREEZE_ENTITY_POSITION(obj_gold_containers[i_rope_index], FALSE) //Can be frozen in other stages.
ACTIVATE_PHYSICS(obj_gold_containers[i_rope_index])
IF DOES_ENTITY_HAVE_PHYSICS(obj_gold_containers[i_rope_index])
AND DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_rope_index].veh)
//Set the player's container to be lighter, so it can be carried more easily.
IF i_rope_index = 0
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[i_rope_index], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
ENDIF
s_heli_ropes[i_rope_index].b_attached_object_is_ready = TRUE
s_heli_ropes[i_rope_index].b_is_attached = FALSE
ENDIF
ENDIF
ELIF NOT s_heli_ropes[i_rope_index].b_is_attached
APPLY_FORCE_TO_ENTITY(s_gold_choppers[i_rope_index].veh, APPLY_TYPE_IMPULSE, <<0.0, 0.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes[i_rope_index].rope, s_gold_choppers[i_rope_index].veh, obj_gold_containers[i_rope_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_rope_index], <<0.0, 0.0, 0.6>>), ROPE_MAX_LENGTH,
0, 0)
s_heli_ropes[i_rope_index].b_is_attached = TRUE
//TEMP: currently the ropes are going crazy, disable collision for now.
//IF i_rope_index = 1
//IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_rope_index].veh)
// SET_ENTITY_NO_COLLISION_ENTITY(obj_gold_containers[i_rope_index], s_gold_choppers[i_rope_index].veh, FALSE)
//ENDIF
//ENDIF
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sets up a rope on the chopper attached to the gold trolley, in the wound position. i_rope_index is consistent for the chopper, rope and trolley.
FUNC BOOL SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPE(INT i_rope_index)
IF s_heli_ropes[i_rope_index].rope = NULL
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_rope_index].veh)
s_heli_ropes[i_rope_index].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, ROPE_MAX_LENGTH, PHYSICS_ROPE_DEFAULT_WIRE, ROPE_START_LENGTH, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes[i_rope_index].b_is_attached = FALSE
s_heli_ropes[i_rope_index].b_attached_object_is_ready = FALSE
ENDIF
ELIF DOES_ENTITY_EXIST(obj_rope_weights[i_rope_index])
DETACH_ROPE_FROM_ENTITY(s_heli_ropes[i_rope_index].rope, obj_rope_weights[i_rope_index])
REMOVE_OBJECT(obj_rope_weights[i_rope_index], TRUE)
s_heli_ropes[i_rope_index].b_is_attached = FALSE
s_heli_ropes[i_rope_index].b_attached_object_is_ready = FALSE
ELIF NOT s_heli_ropes[i_rope_index].b_attached_object_is_ready
IF DOES_ENTITY_EXIST(obj_gold_containers[i_rope_index])
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_rope_index]), GET_ENTITY_COORDS(s_gold_choppers[i_rope_index].veh)) > 400.0
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_rope_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, <<0.0, 0.0, -5.0>>))
ENDIF
IF IS_ENTITY_ATTACHED(obj_gold_containers[i_rope_index])
DETACH_ENTITY(obj_gold_containers[i_rope_index])
ENDIF
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_gold_containers[i_rope_index], TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_gold_containers[i_rope_index], FALSE)
FREEZE_ENTITY_POSITION(obj_gold_containers[i_rope_index], FALSE) //Can be frozen in other stages.
ACTIVATE_PHYSICS(obj_gold_containers[i_rope_index])
IF DOES_ENTITY_HAVE_PHYSICS(obj_gold_containers[i_rope_index])
AND DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_rope_index].veh)
#IF IS_DEBUG_BUILD
PRINTLN("Big Score 2B - container is ready to attach.")
#ENDIF
IF i_rope_index = 0
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[i_rope_index], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
ENDIF
s_heli_ropes[i_rope_index].b_attached_object_is_ready = TRUE
s_heli_ropes[i_rope_index].b_is_attached = FALSE
ENDIF
ENDIF
ELIF NOT s_heli_ropes[i_rope_index].b_is_attached
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_rope_index]), GET_ENTITY_COORDS(s_gold_choppers[i_rope_index].veh)) > 400.0
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_rope_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, <<0.0, 0.0, -5.0>>))
ENDIF
APPLY_FORCE_TO_ENTITY(s_gold_choppers[i_rope_index].veh, APPLY_TYPE_IMPULSE, <<0.0, 0.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes[i_rope_index].rope, s_gold_choppers[i_rope_index].veh, obj_gold_containers[i_rope_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_rope_index], <<0.0, 0.0, 0.6>>), ROPE_MIN_LENGTH,
0, 0)
s_heli_ropes[i_rope_index].b_is_attached = TRUE
#IF IS_DEBUG_BUILD
PRINTLN("Big Score 2B - rope is attached.")
#ENDIF
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// Adds some invisible ropes attached to the corners of the gold trolley, this helps to stop the trolley swinging wildly during the fly heli sections.
FUNC BOOL SETUP_SUPPORT_ROPES_FOR_PLAYER_CHOPPER()
IF s_heli_ropes[0].b_is_attached
IF s_heli_support_ropes[0].rope = NULL
FLOAT f_dist_to_support_attach_point = SQRT(2.0) //x = 1, y = 1
FLOAT f_support_rope_length = SQRT((f_dist_to_support_attach_point * f_dist_to_support_attach_point) + (ROPE_START_LENGTH * ROPE_START_LENGTH))
s_heli_support_ropes[0].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
s_heli_support_ropes[1].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
s_heli_support_ropes[2].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
s_heli_support_ropes[3].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
ATTACH_ENTITIES_TO_ROPE(s_heli_support_ropes[0].rope, s_gold_choppers[0].veh, obj_gold_containers[0],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[0], <<-1.0, 1.0, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_support_ropes[1].rope, s_gold_choppers[0].veh, obj_gold_containers[0],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[0], <<-1.0, -1.0, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_support_ropes[2].rope, s_gold_choppers[0].veh, obj_gold_containers[0],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[0], <<1.0, 1.0, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_support_ropes[3].rope, s_gold_choppers[0].veh, obj_gold_containers[0],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[0], <<1.0, -1.0, 0.6>>), f_support_rope_length,
0, 0)
ROPE_DRAW_ENABLED(s_heli_support_ropes[0].rope, FALSE)
ROPE_DRAW_ENABLED(s_heli_support_ropes[1].rope, FALSE)
ROPE_DRAW_ENABLED(s_heli_support_ropes[2].rope, FALSE)
ROPE_DRAW_ENABLED(s_heli_support_ropes[3].rope, FALSE)
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC*/
///Sets up four ropes hanging free.
FUNC BOOL SETUP_REQ_ROPES_HANGING_FREE_ON_CHOPPER(INT i_heli_index, BOOL b_already_unwound = FALSE, BOOL b_attach_weight = TRUE)
INT i_start_rope = i_heli_index * 4 //Heli 0 starts at 0, heli 1 starts at 4
INT i = 0
FLOAT f_attach_offset_x = 0.95
FLOAT f_attach_offset_y = 0.85
FLOAT f_start_length = ROPE_MIN_LENGTH
IF b_already_unwound
f_start_length = ROPE_MAX_LENGTH
ENDIF
FLOAT f_dist_to_support_attach_point = SQRT((f_attach_offset_x * f_attach_offset_x) + (f_attach_offset_y * f_attach_offset_y))
FLOAT f_support_rope_length = SQRT((f_dist_to_support_attach_point * f_dist_to_support_attach_point) + (f_start_length * f_start_length))
FLOAT f_rope_max_length = ROPE_MAX_LENGTH
IF f_support_rope_length > ROPE_MAX_LENGTH
f_rope_max_length = f_support_rope_length
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
IF s_heli_ropes_new[i_start_rope].rope = NULL
//Create the ropes if they're not created already
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
s_heli_ropes_new[i_start_rope].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_rope_max_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 1].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_rope_max_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 2].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_rope_max_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 3].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_rope_max_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i >= i_start_rope
AND i <= i_start_rope + 3
s_heli_ropes_new[i].b_is_attached = FALSE
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
ENDIF
ENDREPEAT
ENDIF
ELIF NOT DOES_ENTITY_EXIST(obj_rope_weights[i_heli_index])
REQUEST_MODEL(model_rope_weight)
IF HAS_MODEL_LOADED(model_rope_weight)
obj_rope_weights[i_heli_index] = CREATE_OBJECT(model_rope_weight,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>)
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_rope_weights[i_heli_index], TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_rope_weights[i_heli_index], FALSE)
SET_ENTITY_VISIBLE(obj_rope_weights[i_heli_index], FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_rope_weight)
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i >= i_start_rope
AND i <= i_start_rope + 3
s_heli_ropes_new[i].b_is_attached = FALSE
ENDIF
ENDREPEAT
ENDIF
ELIF NOT s_heli_ropes_new[i_start_rope].b_is_attached
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
IF DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_heli_index].veh)
AND DOES_ENTITY_HAVE_PHYSICS(obj_rope_weights[i_heli_index])
IF VDIST2(GET_ENTITY_COORDS(obj_rope_weights[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
SET_ENTITY_COORDS_NO_OFFSET(obj_rope_weights[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
ENDIF
APPLY_FORCE_TO_ENTITY(obj_rope_weights[i_heli_index], APPLY_TYPE_IMPULSE, <<0,0,-1.0>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
IF b_attach_weight
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope].rope, s_gold_choppers[i_heli_index].veh, obj_rope_weights[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -f_support_rope_length>>, f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 1].rope, s_gold_choppers[i_heli_index].veh, obj_rope_weights[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -f_support_rope_length>>, f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 2].rope, s_gold_choppers[i_heli_index].veh, obj_rope_weights[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -f_support_rope_length>>, f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 3].rope, s_gold_choppers[i_heli_index].veh, obj_rope_weights[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -f_support_rope_length>>, f_support_rope_length,
0, 0)
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+1].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+2].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+3].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ENDIF
s_heli_ropes_new[i_start_rope].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+1].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+2].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+3].b_is_attached = TRUE
#IF IS_DEBUG_BUILD
PRINTLN("Big Score 2B - ropes are attached.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(INT i_heli_index, BOOL b_use_damping = TRUE)
INT i_start_rope = i_heli_index * 4 //Heli 0 starts at 0, heli 1 starts at 4
INT i = 0
FLOAT f_attach_offset_x = 0.95
FLOAT f_attach_offset_y = 0.85
FLOAT f_dist_to_support_attach_point = SQRT((f_attach_offset_x * f_attach_offset_x) + (f_attach_offset_y * f_attach_offset_y))
FLOAT f_support_rope_length = SQRT((f_dist_to_support_attach_point * f_dist_to_support_attach_point) + (ROPE_START_LENGTH * ROPE_START_LENGTH))
IF s_heli_ropes_new[i_start_rope].rope = NULL
//Create the ropes if they're not created already
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
s_heli_ropes_new[i_start_rope].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 1].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 2].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 3].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i >= i_start_rope
AND i <= i_start_rope + 3
s_heli_ropes_new[i].b_is_attached = FALSE
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
ENDIF
ENDREPEAT
ENDIF
ELIF DOES_ENTITY_EXIST(obj_rope_weights[i_heli_index])
//If the ropes already existed check that the rope weight objects aren't still around.
REMOVE_OBJECT(obj_rope_weights[i_heli_index], TRUE)
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i >= i_start_rope
AND i <= i_start_rope + 3
s_heli_ropes_new[i].b_is_attached = FALSE
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
ENDIF
ENDREPEAT
ELIF NOT s_heli_ropes_new[i_start_rope].b_attached_object_is_ready
//Make sure the physics is ready on relevant entities before continuing.
IF DOES_ENTITY_EXIST(obj_gold_containers[i_heli_index])
AND NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
ENDIF
IF IS_ENTITY_ATTACHED(obj_gold_containers[i_heli_index])
DETACH_ENTITY(obj_gold_containers[i_heli_index])
ENDIF
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_gold_containers[i_heli_index], TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_gold_containers[i_heli_index], FALSE)
FREEZE_ENTITY_POSITION(obj_gold_containers[i_heli_index], FALSE) //Can be frozen in other stages.
ACTIVATE_PHYSICS(obj_gold_containers[i_heli_index])
SET_ENTITY_LOD_DIST(obj_gold_containers[i_heli_index], 500)
IF DOES_ENTITY_HAVE_PHYSICS(obj_gold_containers[i_heli_index])
AND DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_heli_index].veh)
#IF IS_DEBUG_BUILD
PRINTLN("Big Score 2B - container is ready to attach.")
#ENDIF
//IF i_heli_index = 0
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[i_heli_index], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
//ENDIF
s_heli_ropes_new[i_start_rope].b_attached_object_is_ready = TRUE
s_heli_ropes_new[i_start_rope].b_is_attached = FALSE
ENDIF
ENDIF
ELIF NOT s_heli_ropes_new[i_start_rope].b_is_attached
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
//Attach the container to the ropes.
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
ENDIF
APPLY_FORCE_TO_ENTITY(s_gold_choppers[i_heli_index].veh, APPLY_TYPE_IMPULSE, <<0.0, 0.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<-f_attach_offset_x, f_attach_offset_y, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 1].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<-f_attach_offset_x, -f_attach_offset_y, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 2].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<f_attach_offset_x, f_attach_offset_y, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 3].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<f_attach_offset_x, -f_attach_offset_y, 0.6>>), f_support_rope_length,
0, 0)
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+1].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+2].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+3].rope, ROPES_REFVELOCITY_COLLIDERORDER )
IF b_use_damping
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index], -f_support_rope_length)
ENDIF
s_heli_ropes_new[i_start_rope].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+1].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+2].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+3].b_is_attached = TRUE
#IF IS_DEBUG_BUILD
PRINTLN("Big Score 2B - ropes are attached.")
#ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sets up four ropes attached to the trolley in a fully unwound state.
FUNC BOOL SETUP_REQ_TROLLEY_ATTACHED_TO_UNWOUND_HELI_ROPES(INT i_heli_index)
INT i_start_rope = i_heli_index * 4 //Heli 0 starts at 0, heli 1 starts at 4
INT i = 0
FLOAT f_attach_offset_x = 0.95
FLOAT f_attach_offset_y = 0.85
FLOAT f_dist_to_support_attach_point = SQRT((f_attach_offset_x * f_attach_offset_x) + (f_attach_offset_y * f_attach_offset_y))
FLOAT f_support_rope_length = SQRT((f_dist_to_support_attach_point * f_dist_to_support_attach_point) + (ROPE_MAX_LENGTH * ROPE_MAX_LENGTH))
IF s_heli_ropes_new[i_start_rope].rope = NULL
//Create the ropes if they're not created already
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
s_heli_ropes_new[i_start_rope].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 1].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 2].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
s_heli_ropes_new[i_start_rope + 3].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i >= i_start_rope
AND i <= i_start_rope + 3
s_heli_ropes_new[i].b_is_attached = FALSE
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
ENDIF
ENDREPEAT
ENDIF
ELIF DOES_ENTITY_EXIST(obj_rope_weights[i_heli_index])
//If the ropes already existed check that the rope weight objects aren't still around.
REMOVE_OBJECT(obj_rope_weights[i_heli_index], TRUE)
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i >= i_start_rope
AND i <= i_start_rope + 3
s_heli_ropes_new[i].b_is_attached = FALSE
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
ENDIF
ENDREPEAT
ELIF NOT s_heli_ropes_new[i_start_rope].b_attached_object_is_ready
//Make sure the physics is ready on relevant entities before continuing.
IF DOES_ENTITY_EXIST(obj_gold_containers[i_heli_index])
AND NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
ENDIF
IF IS_ENTITY_ATTACHED(obj_gold_containers[i_heli_index])
DETACH_ENTITY(obj_gold_containers[i_heli_index])
ENDIF
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_gold_containers[i_heli_index], TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_gold_containers[i_heli_index], FALSE)
FREEZE_ENTITY_POSITION(obj_gold_containers[i_heli_index], FALSE) //Can be frozen in other stages.
ACTIVATE_PHYSICS(obj_gold_containers[i_heli_index])
IF DOES_ENTITY_HAVE_PHYSICS(obj_gold_containers[i_heli_index])
AND DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_heli_index].veh)
#IF IS_DEBUG_BUILD
PRINTLN("Big Score 2B - container is ready to attach.")
#ENDIF
//IF i_heli_index = 0
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[i_heli_index], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
//ENDIF
s_heli_ropes_new[i_start_rope].b_attached_object_is_ready = TRUE
s_heli_ropes_new[i_start_rope].b_is_attached = FALSE
ENDIF
ENDIF
ELIF NOT s_heli_ropes_new[i_start_rope].b_is_attached
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
//Attach the container to the ropes.
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
ENDIF
APPLY_FORCE_TO_ENTITY(s_gold_choppers[i_heli_index].veh, APPLY_TYPE_IMPULSE, <<0.0, 0.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<-f_attach_offset_x, f_attach_offset_y, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 1].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<-f_attach_offset_x, -f_attach_offset_y, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 2].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<f_attach_offset_x, f_attach_offset_y, 0.6>>), f_support_rope_length,
0, 0)
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 3].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<f_attach_offset_x, -f_attach_offset_y, 0.6>>), f_support_rope_length,
0, 0)
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+1].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+2].rope, ROPES_REFVELOCITY_COLLIDERORDER )
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+3].rope, ROPES_REFVELOCITY_COLLIDERORDER )
s_heli_ropes_new[i_start_rope].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+1].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+2].b_is_attached = TRUE
s_heli_ropes_new[i_start_rope+3].b_is_attached = TRUE
#IF IS_DEBUG_BUILD
PRINTLN("Big Score 2B - ropes are attached.")
#ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_VAULT_GATES_DESTROYED()
CREATE_MODEL_HIDE(v_vault_gate_pos_1, 2.0, model_vault_gates, FALSE)
CREATE_MODEL_HIDE(v_vault_gate_pos_2, 2.0, model_vault_gates, FALSE)
//SET_USES_COLLISION_OF_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_1, 2.0, model_vault_gates, FALSE) //TEMP: CREATE_MODEL_HIDE isn't removing collision.
//SET_USES_COLLISION_OF_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_2, 2.0, model_vault_gates, FALSE) //TEMP: CREATE_MODEL_HIDE isn't removing collision.
RETURN TRUE
ENDFUNC
FUNC BOOL SETUP_REQ_VAULT_ALARM(BOOL bSkipStartup, BOOL bJustRequestAlarm = FALSE)
IF PREPARE_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS")
IF bJustRequestAlarm
RETURN TRUE
ELSE
IF NOT IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
START_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", bSkipStartup)
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TUNNEL_RAYFIRE_READY_FOR_DRILLING(BOOL bDoResetOnGrab = TRUE)
BOOL b_tunnel_rayfire_primed = FALSE
BOOL b_vault_rayfire_primed = FALSE
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_PRIMED
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_PRIMING
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_PRIMING)
ENDIF
ELSE
b_tunnel_rayfire_primed = TRUE
ENDIF
ELSE
rayfire_tunnel = GET_RAYFIRE_MAP_OBJECT(<<7.25, -656.98, 17.14>>, 50.0, "des_finale_tunnel")
//Do a force reset the first time it's grabbed.
IF bDoResetOnGrab
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_RESET)
ENDIF
ENDIF
ENDIF
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) != RFMO_STATE_PRIMED
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) != RFMO_STATE_PRIMING
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_PRIMING)
ENDIF
ELSE
b_vault_rayfire_primed = TRUE
ENDIF
ELSE
rayfire_vault = GET_RAYFIRE_MAP_OBJECT(<<7.25, -656.98, 17.14>>, 50.0, "des_finale_vault")
IF bDoResetOnGrab
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_RESET)
ENDIF
ENDIF
ENDIF
RETURN (b_tunnel_rayfire_primed AND b_vault_rayfire_primed)
ENDFUNC
FUNC BOOL SETUP_REQ_TUNNEL_COVER_OBJECTS(BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(obj_tunnel_crates[0])
REQUEST_MODEL(model_tunnel_crate)
IF HAS_MODEL_LOADED(model_tunnel_crate)
IF b_just_request_assets
RETURN TRUE
ELSE
obj_tunnel_crates[0] = CREATE_OBJECT_NO_OFFSET(model_tunnel_crate, <<-9.6200, -602.9300, 15.5900>>)
SET_ENTITY_ROTATION(obj_tunnel_crates[0], <<7.0000, -6.7000, 28.8000>>)
FREEZE_ENTITY_POSITION(obj_tunnel_crates[0], TRUE)
INT i = 0
REPEAT COUNT_OF(obj_tunnel_crates) i
IF interior_tunnels[0] != NULL
RETAIN_ENTITY_IN_INTERIOR(obj_tunnel_crates[i], interior_tunnels[0])
ENDIF
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(model_tunnel_crate)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_TRAIN(BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(veh_gold_train)
REQUEST_MODEL(model_train_engine)
REQUEST_MODEL(model_train_carriage)
IF HAS_MODEL_LOADED(model_train_engine)
AND HAS_MODEL_LOADED(model_train_carriage)
IF b_just_request_assets
RETURN TRUE
ELSE
veh_gold_train = CREATE_MISSION_TRAIN(0, <<2324.3, 2670.7, 44.45>>, TRUE)
SET_TRAIN_CRUISE_SPEED(veh_gold_train, 10.0)
SET_TRAIN_SPEED(veh_gold_train, 10.0)
f_current_train_speed = 10.0
VEHICLE_INDEX veh_train_carriage_1, veh_train_carriage_2
veh_train_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
veh_train_carriage_2 = GET_TRAIN_CARRIAGE(veh_gold_train, 2)
IF NOT IS_ENTITY_DEAD(veh_gold_train)
SET_ENTITY_LOD_DIST(veh_gold_train, 1000)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_train_carriage_1)
SET_ENTITY_LOD_DIST(veh_train_carriage_1, 1000)
ENDIF
//1418524 - only want one carriage
IF NOT IS_ENTITY_DEAD(veh_train_carriage_2)
DELETE_VEHICLE(veh_train_carriage_2)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_engine)
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_carriage)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_UseKinematicModeWhenStationary, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_CAN_COWER_IN_COVER(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_RAGDOLL_BLOCKING_FLAGS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FIRE | RBF_PLAYER_IMPACT)
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE, -1)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], CA_REQUIRES_LOS_TO_SHOOT, FALSE)
SET_PED_ACCURACY(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 10)
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 1800)
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_UseKinematicModeWhenStationary, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_CAN_COWER_IN_COVER(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_RAGDOLL_BLOCKING_FLAGS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FIRE | RBF_PLAYER_IMPACT)
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE, -1)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], CA_REQUIRES_LOS_TO_SHOOT, FALSE)
SET_PED_ACCURACY(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 10)
ENDIF
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_PED_MAX_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 1800)
SET_ENTITY_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 1800)
SET_PED_SUFFERS_CRITICAL_HITS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_UseKinematicModeWhenStationary, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_MICHAEL_ID].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_CAN_COWER_IN_COVER(s_crew[CREW_MICHAEL_ID].ped, FALSE)
SET_RAGDOLL_BLOCKING_FLAGS(s_crew[CREW_MICHAEL_ID].ped, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FIRE | RBF_PLAYER_IMPACT)
SET_PED_USING_ACTION_MODE(s_crew[CREW_MICHAEL_ID].ped, TRUE, -1, "DEFAULT_ACTION")
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_MICHAEL_ID].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_MICHAEL_ID].ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
SET_PED_ACCURACY(s_crew[CREW_MICHAEL_ID].ped, i_crew_michael_default_accuracy)
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL SETUP_LESTER_IN_CHOPPER(BOOL b_just_request_assets = FALSE)
IF NOT DOES_ENTITY_EXIST(s_lester.ped)
REQUEST_NPC_PED_MODEL(CHAR_LESTER)
IF HAS_NPC_PED_MODEL_LOADED(CHAR_LESTER)
IF b_just_request_assets
RETURN TRUE
ELSE
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
VEHICLE_SEAT e_seat = VS_BACK_LEFT
IF CREATE_NPC_PED_INSIDE_VEHICLE(s_lester.ped, CHAR_LESTER, s_gold_choppers[0].veh, e_seat)
SET_PED_CAN_BE_TARGETTED(s_lester.ped, FALSE)
SET_PED_MAX_HEALTH(s_lester.ped, 1800)
SET_ENTITY_HEALTH(s_lester.ped, 1800)
SET_PED_SUFFERS_CRITICAL_HITS(s_lester.ped, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_lester.ped, RELGROUPHASH_PLAYER)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_lester.ped, TRUE)
SET_PED_PROP_INDEX(s_lester.ped, ANCHOR_EYES, 0)
s_lester.i_event = 0
s_lester.i_timer = 0
REMOVE_COVER_POINT(s_lester.cover)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, s_lester.ped, "LESTER")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_CUTTER_BLOCKING_PROGRESS()
BOOL b_cutter_blocking = FALSE
IF NOT IS_ENTITY_DEAD(veh_cutter)
v_last_cutter_pos[0] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<2.6222, 6.5265, 1.7702>>)
v_last_cutter_pos[1] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<-2.5270, 6.7267, 1.8416>>)
v_last_cutter_pos[2] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<-2.0915, -4.0069, 0.7723>>)
v_last_cutter_pos[3] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<1.9142, -3.9661, 0.6946>>)
ENDIF
//If the cutter is dead then check the last position it was in, fail if it's blocking the location.
IF NOT IS_VEHICLE_DRIVEABLE(veh_cutter)
IF IS_POINT_IN_ANGLED_AREA(v_last_cutter_pos[i_cutter_pos_index], <<5.083910,-663.961853,14.880619>>, <<11.945152,-638.320679,19.838081>>, 7.000000)
OR IS_POINT_IN_ANGLED_AREA(v_last_cutter_pos[i_cutter_pos_index], <<29.294580,-636.268982,14.838079>>, <<15.562843,-646.079529,19.838079>>, 9.750000)
b_cutter_blocking = TRUE
ENDIF
i_cutter_pos_index++
IF i_cutter_pos_index >= COUNT_OF(v_last_cutter_pos)
i_cutter_pos_index = 0
ENDIF
ENDIF
RETURN b_cutter_blocking
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
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
AND GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE) > 0
e_fail_weapon = WEAPONTYPE_ADVANCEDRIFLE
ELSE
e_fail_weapon = GET_BEST_PED_WEAPON(PLAYER_PED_ID())
ENDIF
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
/// PURPOSE:
/// There are three slots being used for random enemy ped speakers. This adds a ped into a currently free slot. Once a ped dies the slot is cleared.
/// If i_speaker is set to something other than -1 it'll try to place the ped in the given slot.
PROC ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(PED_INDEX ped, INT i_speaker = -1, BOOL b_force_add = FALSE)
IF NOT IS_PED_INJURED(ped)
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].Index != ped
AND s_conversation_peds.PedInfo[SWAT_SPEAKER_2].Index != ped
AND s_conversation_peds.PedInfo[SWAT_SPEAKER_3].Index != ped
IF i_speaker = -1
IF NOT s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_1, ped, "BS2BSwat1")
ELIF NOT s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_2, ped, "BS2BSwat2")
ELIF NOT s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
ADD_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_3, ped, "BS2BSwat3")
ENDIF
ELSE
IF NOT s_conversation_peds.PedInfo[i_speaker].ActiveInConversation
OR b_force_add
IF i_speaker = SWAT_SPEAKER_1
ADD_PED_FOR_DIALOGUE(s_conversation_peds, i_speaker, ped, "BS2BSwat1")
ELIF i_speaker = SWAT_SPEAKER_2
ADD_PED_FOR_DIALOGUE(s_conversation_peds, i_speaker, ped, "BS2BSwat2")
ELIF i_speaker = SWAT_SPEAKER_3
ADD_PED_FOR_DIALOGUE(s_conversation_peds, i_speaker, ped, "BS2BSwat3")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_ENEMY_SHOOTOUT_DIALOGUE(INT &i_dialogue_timer, BOOL b_force_dialogue = FALSE)
//Remove peds if they no longer exist, and randomly play dialogue on those that do exist.
//First clean up any dead/removed speakers.
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
IF IS_PED_INJURED(s_conversation_peds.PedInfo[SWAT_SPEAKER_1].Index)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_1)
ENDIF
ENDIF
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
IF IS_PED_INJURED(s_conversation_peds.PedInfo[SWAT_SPEAKER_2].Index)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_2)
ENDIF
ENDIF
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
IF IS_PED_INJURED(s_conversation_peds.PedInfo[SWAT_SPEAKER_3].Index)
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_3)
ENDIF
ENDIF
//Then play dialogue on a random alive enemy ped.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND b_has_text_label_triggered[F3B_GOTOMICH] //This is the initial god text.
IF GET_GAME_TIMER() - i_dialogue_timer > 0
OR b_force_dialogue
INT i_speaker = -1
INT i_random = GET_RANDOM_INT_IN_RANGE(0, 3)
IF i_random = 0
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
i_speaker = SWAT_SPEAKER_1
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
i_speaker = SWAT_SPEAKER_2
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
i_speaker = SWAT_SPEAKER_3
ENDIF
ELIF i_random = 1
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
i_speaker = SWAT_SPEAKER_2
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
i_speaker = SWAT_SPEAKER_3
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
i_speaker = SWAT_SPEAKER_1
ENDIF
ELIF i_random = 2
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
i_speaker = SWAT_SPEAKER_3
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
i_speaker = SWAT_SPEAKER_1
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
i_speaker = SWAT_SPEAKER_2
ENDIF
ENDIF
IF i_speaker != -1
IF NOT IS_PED_INJURED(s_conversation_peds.PedInfo[i_speaker].Index)
AND VDIST2(GET_ENTITY_COORDS(s_conversation_peds.PedInfo[i_speaker].Index), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 1600.0
IF IS_PED_IN_COMBAT(s_conversation_peds.PedInfo[i_speaker].Index)
OR IS_PED_SHOOTING(s_conversation_peds.PedInfo[i_speaker].Index)
OR b_force_dialogue
TEXT_LABEL str_label
IF i_speaker = SWAT_SPEAKER_1
str_label = "BS2B_CGENS1"
ELIF i_speaker = SWAT_SPEAKER_2
str_label = "BS2B_CGENS2"
ELIF i_speaker = SWAT_SPEAKER_3
str_label = "BS2B_CGENS3"
ENDIF
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, str_label, CONV_PRIORITY_MEDIUM)
i_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_TUNNEL_SHOOTOUT_ENEMIES(BOOL b_force_activate_peds = FALSE)
INT i = 0
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
SEQUENCE_INDEX seq
BOOl b_time_to_trigger = FALSE
//BOOL b_checked_trigger = FALSE
BOOL b_player_got_into_vault = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.387976,-686.162659,14.630766>>, <<3.554323,-668.402344,19.196697>>, 15.250000)
IF NOT s_tunnel_cops_3[0].b_is_created
REQUEST_MODEL(model_swat)
REQUEST_WAYPOINT_RECORDING(str_waypoint_vault_charge_left)
REQUEST_WAYPOINT_RECORDING(str_waypoint_vault_charge_right)
ENDIF
//First cops in vault: Take cover by the wall.
IF NOT s_tunnel_cops_1[0].b_is_created
IF HAS_MODEL_LOADED(model_swat)
s_tunnel_cops_1[0].ped = CREATE_ENEMY_PED(model_swat, <<-0.7845, -679.5873, 15.1306>>, 339.3133, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
s_tunnel_cops_1[1].ped = CREATE_ENEMY_PED(model_swat, <<-0.8462, -681.0955, 15.1308>>, 339.3115, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
s_tunnel_cops_1[2].ped = CREATE_ENEMY_PED(model_swat, <<-2.2295, -681.5751, 15.1308>>, 339.3114, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 3, s_tunnel_cops_1[0].ped, "BS2BCop1")
INITIALISE_ENEMY_GROUP(s_tunnel_cops_1, "1 ")
REPEAT COUNT_OF(s_tunnel_cops_1) i
SET_PED_CONFIG_FLAG(s_tunnel_cops_1[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
SET_ENTITY_PROOFS(s_tunnel_cops_1[i].ped, FALSE, TRUE, FALSE, FALSE, FALSE)
IF HAS_PED_GOT_WEAPON(s_tunnel_cops_1[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_1[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(s_tunnel_cops_1[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_1[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
SET_ENTITY_VISIBLE(s_tunnel_cops_1[i].ped, FALSE)
ENDREPEAT
ENDIF
ELSE
REPEAT COUNT_OF(s_tunnel_cops_1) i
IF NOT IS_PED_INJURED(s_tunnel_cops_1[i].ped)
SWITCH s_tunnel_cops_1[i].i_event
CASE 0
IF (e_mission_stage = STAGE_WINCH_GOLD_CUTSCENE AND b_force_activate_peds)
OR e_mission_stage != STAGE_WINCH_GOLD_CUTSCENE
IF i = 0
s_tunnel_cops_1[i].v_dest = <<2.7797, -670.1835, 15.1306>>
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover, s_tunnel_cops_1[i].v_dest, 343.5278, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
SET_PED_PREFERRED_COVER_POINT(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover)
//ADD_EXPLOSION(<<10.0806, -647.2332, 15.0857>>, EXP_TAG_SMOKE_GRENADE)
ELIF i = 1
s_tunnel_cops_1[i].v_dest = <<3.2509, -671.1411, 15.1308>>
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover, s_tunnel_cops_1[i].v_dest, 343.5278, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
SET_PED_PREFERRED_COVER_POINT(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover)
ELIF i = 2
s_tunnel_cops_1[i].v_dest = <<0.7341, -670.1761, 15.1308>>
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover, s_tunnel_cops_1[i].v_dest, 343.5278, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
SET_PED_PREFERRED_COVER_POINT(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover)
ENDIF
SET_PED_COMBAT_PARAMS(s_tunnel_cops_1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_tunnel_cops_1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
SET_ENTITY_VISIBLE(s_tunnel_cops_1[i].ped, 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(s_tunnel_cops_1[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
IF i = 0
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
s_tunnel_cops_1[i].i_timer = 0
s_tunnel_cops_1[i].i_event++
ENDIF
BREAK
CASE 1 //Once the next wave starts charging then break these guys into regular combat.
IF VDIST2(GET_ENTITY_COORDS(s_tunnel_cops_1[i].ped), s_tunnel_cops_1[i].v_dest) < 4.0
SET_ENTITY_PROOFS(s_tunnel_cops_1[i].ped, FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
IF s_tunnel_cops_2[0].i_event > 0
OR b_player_got_into_vault
IF s_tunnel_cops_1[i].i_timer = 0
s_tunnel_cops_1[i].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_tunnel_cops_1[i].i_timer > 7000
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) = 0
OR b_player_got_into_vault
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_ENTITY_PROOFS(s_tunnel_cops_1[i].ped, FALSE, FALSE, FALSE, FALSE, FALSE)
s_tunnel_cops_1[i].i_timer = 0
s_tunnel_cops_1[i].i_event++
ENDIF
ENDIF
BREAK
CASE 2 //Have some of them charge forwards if the nxt group is already dead.
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_vault_charge_left)
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_vault_charge_right)
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) = 0
IF i = 0
s_tunnel_cops_1[i].v_dest = <<4.3919, -661.5233, 15.1306>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].v_dest, 2.0)
TASK_FOLLOW_WAYPOINT_RECORDING(s_tunnel_cops_1[i].ped, str_waypoint_vault_charge_left, 0,
EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_1[i].ped, TRUE)
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_1[i].ped, "MOVE_IN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
s_tunnel_cops_1[i].i_timer = 0
s_tunnel_cops_1[i].i_event++
ELIF i = 2
s_tunnel_cops_1[i].v_dest = <<6.7206, -662.2943, 15.1306>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].v_dest, 2.0)
TASK_FOLLOW_WAYPOINT_RECORDING(s_tunnel_cops_1[i].ped, str_waypoint_vault_charge_right, 0,
EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_1[i].ped, TRUE)
s_tunnel_cops_1[i].i_timer = 0
s_tunnel_cops_1[i].i_event++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3 //If the peds went on the waypoints
SET_PED_MIN_MOVE_BLEND_RATIO(s_tunnel_cops_1[i].ped, PEDMOVE_RUN)
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_tunnel_cops_1[i].ped)
WAYPOINT_PLAYBACK_START_AIMING_AT_PED(s_tunnel_cops_1[i].ped, PLAYER_PED_ID(), FALSE)
ENDIF
VECTOR v_current_pos
v_current_pos = GET_ENTITY_COORDS(s_tunnel_cops_1[i].ped)
IF VDIST2(v_current_pos, v_player_pos) < 4.0
OR VDIST2(v_current_pos, s_tunnel_cops_1[i].v_dest) < 16.0
OR NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_tunnel_cops_1[i].ped)
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_1[i].ped, v_current_pos, 2.0)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_1[i].ped, CA_CAN_CHARGE, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_1[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_1[i].ped, FALSE)
s_tunnel_cops_1[i].i_timer = 0
s_tunnel_cops_1[i].i_event++
ENDIF
BREAK
ENDSWITCH
IF s_tunnel_cops_1[i].i_event > 0
SET_PED_RESET_FLAG(s_tunnel_cops_1[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
UPDATE_AI_PED_BLIP(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_tunnel_cops_1[i])
ENDIF
ENDREPEAT
ENDIF
//Second wave: try to charge at the player through the side doors.
IF NOT s_tunnel_cops_2[0].b_is_created
IF HAS_MODEL_LOADED(model_swat)
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_vault_charge_left)
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_vault_charge_right)
s_tunnel_cops_2[0].ped = CREATE_ENEMY_PED(model_swat, <<-3.9060, -690.9534, 15.1308>>, 338.8146, rel_group_cops, 200, 0, WEAPONTYPE_PUMPSHOTGUN)
s_tunnel_cops_2[1].ped = CREATE_ENEMY_PED(model_swat, <<-12.0647, -693.7500, 15.1307>>, 289.9279, rel_group_cops, 200, 0, WEAPONTYPE_PUMPSHOTGUN)
INITIALISE_ENEMY_GROUP(s_tunnel_cops_2, "2 ")
REPEAT COUNT_OF(s_tunnel_cops_2) i
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_2[i].ped, WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_AT_AR_FLSH)
SET_PED_CONFIG_FLAG(s_tunnel_cops_2[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
SET_ENTITY_PROOFS(s_tunnel_cops_2[i].ped, FALSE, TRUE, FALSE, FALSE, FALSE)
ENDREPEAT
ENDIF
ELSE
REPEAT COUNT_OF(s_tunnel_cops_2) i
IF NOT IS_PED_INJURED(s_tunnel_cops_2[i].ped)
SWITCH s_tunnel_cops_2[i].i_event
CASE 0
IF s_tunnel_cops_2[i].i_timer = 0
s_tunnel_cops_2[i].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_tunnel_cops_2[i].i_timer > 8000
OR b_player_got_into_vault
IF i = 0
s_tunnel_cops_2[i].v_dest = <<4.3919, -661.5233, 15.1306>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_2[i].ped, s_tunnel_cops_2[i].v_dest, 2.0)
ELIF i = 1
s_tunnel_cops_2[i].v_dest = <<6.7206, -662.2943, 15.1306>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_2[i].ped, s_tunnel_cops_2[i].v_dest, 2.0)
ENDIF
SET_PED_COMBAT_PARAMS(s_tunnel_cops_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_tunnel_cops_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
IF i = 0
TASK_FOLLOW_WAYPOINT_RECORDING(s_tunnel_cops_2[i].ped, str_waypoint_vault_charge_left, 0,
EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT)
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_2[i].ped, "MOVE_IN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ELSE
TASK_FOLLOW_WAYPOINT_RECORDING(s_tunnel_cops_2[i].ped, str_waypoint_vault_charge_right, 0,
EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_2[i].ped, TRUE)
s_tunnel_cops_2[i].i_timer = 0
s_tunnel_cops_2[i].i_event++
ENDIF
BREAK
CASE 1 //Break out of waypoint recording once ready.
SET_PED_MIN_MOVE_BLEND_RATIO(s_tunnel_cops_2[i].ped, PEDMOVE_RUN)
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_tunnel_cops_2[i].ped)
WAYPOINT_PLAYBACK_START_AIMING_AT_PED(s_tunnel_cops_2[i].ped, PLAYER_PED_ID(), FALSE)
ENDIF
VECTOR v_current_pos
v_current_pos = GET_ENTITY_COORDS(s_tunnel_cops_2[i].ped)
IF VDIST2(v_current_pos, v_player_pos) < 4.0
OR VDIST2(v_current_pos, s_tunnel_cops_2[i].v_dest) < 16.0
OR NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_tunnel_cops_2[i].ped)
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_2[i].ped, v_current_pos, 2.0)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_CAN_CHARGE, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_2[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_2[i].ped, FALSE)
SET_ENTITY_PROOFS(s_tunnel_cops_2[i].ped, FALSE, FALSE, FALSE, FALSE, FALSE)
s_tunnel_cops_2[i].i_timer = 0
s_tunnel_cops_2[i].i_event++
ENDIF
BREAK
ENDSWITCH
IF s_tunnel_cops_2[i].i_event > 0
SET_PED_RESET_FLAG(s_tunnel_cops_2[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
UPDATE_AI_PED_BLIP(s_tunnel_cops_2[i].ped, s_tunnel_cops_2[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_tunnel_cops_2[i])
ENDIF
ENDREPEAT
ENDIF
//More cops arrive after the first two batches are dead.
IF NOT s_tunnel_cops_2b[0].b_is_created
IF HAS_MODEL_LOADED(model_swat)
s_tunnel_cops_2b[0].ped = CREATE_ENEMY_PED(model_swat, <<-12.8146, -694.0009, 15.1308>>, 301.6743, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
s_tunnel_cops_2b[1].ped = CREATE_ENEMY_PED(model_swat, <<-13.6107, -694.3180, 15.1309>>, 315.4348, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
s_tunnel_cops_2b[2].ped = CREATE_ENEMY_PED(model_swat, <<-14.3188, -695.0073, 15.1309>>, 319.8594, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
INITIALISE_ENEMY_GROUP(s_tunnel_cops_2b, "2b ")
REPEAT COUNT_OF(s_tunnel_cops_2b) i
IF HAS_PED_GOT_WEAPON(s_tunnel_cops_2b[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_2b[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(s_tunnel_cops_2b[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_2b[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
SET_PED_CONFIG_FLAG(s_tunnel_cops_2b[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
SET_ENTITY_PROOFS(s_tunnel_cops_2b[i].ped, FALSE, TRUE, FALSE, FALSE, FALSE)
ENDREPEAT
ENDIF
ELSE
REPEAT COUNT_OF(s_tunnel_cops_2b) i
IF NOT IS_PED_INJURED(s_tunnel_cops_2b[i].ped)
SWITCH s_tunnel_cops_2b[i].i_event
CASE 0
b_time_to_trigger = ((GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2)) < 3
OR b_player_got_into_vault)
IF b_time_to_trigger
IF i = 0
s_tunnel_cops_2b[i].v_dest = <<2.4281, -671.4919, 15.1308>>
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_2b[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ELIF i = 1
s_tunnel_cops_2b[i].v_dest = <<3.2209, -672.1075, 15.1308>>
ELIF i = 2
s_tunnel_cops_2b[i].v_dest = <<0.4082, -671.0529, 15.1308>>
ENDIF
SET_PED_COMBAT_PARAMS(s_tunnel_cops_2b[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_2b[i].ped, s_tunnel_cops_2b[i].v_dest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2b[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2b[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(s_tunnel_cops_2b[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
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(s_tunnel_cops_2b[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_2b[i].ped, FALSE)
s_tunnel_cops_2b[i].i_timer = 0
s_tunnel_cops_2b[i].i_event++
ENDIF
BREAK
CASE 1
IF VDIST2(s_tunnel_cops_2b[i].v_dest, GET_ENTITY_COORDS(s_tunnel_cops_2b[i].ped)) < 4.0
SET_ENTITY_PROOFS(s_tunnel_cops_2b[i].ped, FALSE, TRUE, FALSE, FALSE, FALSE)
s_tunnel_cops_2b[i].i_timer = 0
s_tunnel_cops_2b[i].i_event++
ENDIF
BREAK
ENDSWITCH
IF s_tunnel_cops_2b[i].i_event > 0
SET_PED_RESET_FLAG(s_tunnel_cops_2b[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
UPDATE_AI_PED_BLIP(s_tunnel_cops_2b[i].ped, s_tunnel_cops_2b[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_tunnel_cops_2b[i])
ENDIF
ENDREPEAT
ENDIF
//Cops rappelling down.
IF NOT s_tunnel_cops_3[0].b_is_created
REQUEST_RAPPEL_ASSETS()
IF HAS_MODEL_LOADED(model_swat)
AND HAVE_RAPPEL_ASSETS_LOADED()
//Trigger after Trevor's line about leaving the area has finished.
IF b_has_text_label_triggered[BS2B_TLEAVE]
s_tunnel_cops_3[0].ped = CREATE_ENEMY_PED(model_swat, <<28.1363, -639.6749, 29.3101>>, 247.7011, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
s_tunnel_cops_3[1].ped = CREATE_ENEMY_PED(model_swat, <<18.7498, -638.1521, 29.3101>>, 70.5276, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
s_tunnel_cops_3[2].ped = CREATE_ENEMY_PED(model_swat, <<19.9, -635.0039, 29.3101>>, 69.8973, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
INITIALISE_ENEMY_GROUP(s_tunnel_cops_3, "rappel ")
INIT_RAPPEL_WITH_ROPE(s_tunnel_cops_3_rappel_data[0], NULL, <<28.1363, -639.6749, 29.3101>>, <<0,0,247.7011>>, -2.0, -13.2, 13.2,
FALSE, FALSE, TRUE, s_tunnel_cops_3[0].ped, TRUE, TRUE, 1.0, -1.0, FALSE)
INIT_RAPPEL_WITH_ROPE(s_tunnel_cops_3_rappel_data[1], NULL, <<18.7498, -638.1521, 29.3101>>, <<0,0,70.5276>>, -2.0, -13.2, 13.2,
FALSE, FALSE, TRUE, s_tunnel_cops_3[1].ped, TRUE, TRUE, 1.0, -1.0, FALSE)
INIT_RAPPEL_WITH_ROPE(s_tunnel_cops_3_rappel_data[2], NULL, <<19.9, -635.0039, 29.3101>>, <<0,0,69.8973>>, -2.0, -13.2, 13.2,
FALSE, FALSE, TRUE, s_tunnel_cops_3[2].ped, TRUE, TRUE, 1.0, -1.0, FALSE)
REPEAT COUNT_OF(s_tunnel_cops_3) i
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_3[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
SET_RAPPEL_AI(s_tunnel_cops_3_rappel_data[i], RAPPEL_AI_STOP)
s_tunnel_cops_3_rappel_data[i].bSuppressUnpinAllVertices = TRUE
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_tunnel_cops_3[i].ped, "BS_2B_NOOSE_ABSEIL_GROUP")
s_tunnel_cops_3[i].i_timer = GET_GAME_TIMER()
ENDREPEAT
ENDIF
ENDIF
ELSE
INT iNumPedsFinishedRappelling = 0
REPEAT COUNT_OF(s_tunnel_cops_3) i
IF NOT IS_PED_INJURED(s_tunnel_cops_3[i].ped)
SWITCH s_tunnel_cops_3[i].i_event
CASE 0
IF IS_SPHERE_VISIBLE(<<23.4, -636.1, 19.9>>, 5.0)
OR GET_GAME_TIMER() - s_tunnel_cops_3[i].i_timer > 15000
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2b) = 0)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_NOOSE_ABSEIL_SCENE")
START_AUDIO_SCENE("BS_2B_NOOSE_ABSEIL_SCENE")
ENDIF
s_tunnel_cops_3[i].blip = CREATE_BLIP_FOR_PED(s_tunnel_cops_3[i].ped, TRUE)
s_tunnel_cops_3[i].i_timer = GET_GAME_TIMER()
s_tunnel_cops_3[i].i_event++
ENDIF
BREAK
CASE 1
INT i_threshold
IF i = 0
i_threshold = 400
SET_RAPPEL_MAX_SLIDE_SPEED(s_tunnel_cops_3_rappel_data[i], 3.0)
ELIF i = 1
i_threshold = 0
ELIF i = 2
i_threshold = 750
SET_RAPPEL_MAX_SLIDE_SPEED(s_tunnel_cops_3_rappel_data[i], 2.8)
ENDIF
IF GET_GAME_TIMER() - s_tunnel_cops_3[i].i_timer > i_threshold
SET_RAPPEL_AI(s_tunnel_cops_3_rappel_data[i], RAPPEL_AI_MOVE_FAST)
SET_PED_RELATIONSHIP_GROUP_HASH(s_tunnel_cops_3[i].ped, rel_group_cops)
IF i = 0 OR i = 2
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_3[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
s_tunnel_cops_3[i].i_timer = GET_GAME_TIMER()
s_tunnel_cops_3[i].i_event++
ENDIF
BREAK
CASE 2
HANDLE_RAPPEL(s_tunnel_cops_3_rappel_data[i], TRUE, FALSE)
VECTOR vPos
vPos = GET_ENTITY_COORDS(s_tunnel_cops_3[i].ped)
IF HAS_FREE_ROPING_FINISHED(s_tunnel_cops_3_rappel_data[i])
OR vPos.z < 16.25
//CANCEL_RAPPEL(s_tunnel_cops_3_rappel_data[i], FALSE, WEAPONTYPE_CARBINERIFLE, TRUE, FALSE)
DISMOUNT_RAPPEL(s_tunnel_cops_3_rappel_data[i], WEAPONTYPE_CARBINERIFLE)
SET_ENTITY_COLLISION(s_tunnel_cops_3[i].ped, TRUE)
s_tunnel_cops_3[i].i_timer = 0
s_tunnel_cops_3[i].i_event++
ENDIF
BREAK
CASE 3
HANDLE_RAPPEL(s_tunnel_cops_3_rappel_data[i], TRUE, FALSE)
IF s_tunnel_cops_3[i].i_timer = 0
s_tunnel_cops_3[i].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_tunnel_cops_3[i].i_timer > 700
CANCEL_RAPPEL(s_tunnel_cops_3_rappel_data[i], FALSE, WEAPONTYPE_CARBINERIFLE, TRUE, FALSE)
IF i = 0
s_tunnel_cops_3[i].v_dest = <<24.0304, -643.2753, 15.0881>>
ELIF i = 1
s_tunnel_cops_3[i].v_dest = <<16.9297, -638.2366, 15.0881>>
ELIF i = 2
s_tunnel_cops_3[i].v_dest = GET_ENTITY_COORDS(s_tunnel_cops_3[i].ped)
ENDIF
SET_PED_COMBAT_PARAMS(s_tunnel_cops_3[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_3[i].ped, s_tunnel_cops_3[i].v_dest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_3[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_3[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_3[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_3[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_CONFIG_FLAG(s_tunnel_cops_3[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
SET_COMBAT_FLOAT(s_tunnel_cops_3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
// TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_3[i].ped, 200.0)
TASK_COMBAT_PED(s_tunnel_cops_3[i].ped, PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_3[i].ped, FALSE)
REMOVE_BLIP(s_tunnel_cops_3[i].blip)
UPDATE_AI_PED_BLIP(s_tunnel_cops_3[i].ped, s_tunnel_cops_3[i].s_blip_data)
s_tunnel_cops_3[i].i_timer = 0
s_tunnel_cops_3[i].i_event++
ENDIF
BREAK
CASE 4
HANDLE_RAPPEL_ROPE(s_tunnel_cops_3_rappel_data[i], FALSE, FALSE, FALSE, TRUE)
iNumPedsFinishedRappelling++
UPDATE_AI_PED_BLIP(s_tunnel_cops_3[i].ped, s_tunnel_cops_3[i].s_blip_data)
BREAK
ENDSWITCH
IF s_tunnel_cops_3[i].i_event > 1
SET_PED_RESET_FLAG(s_tunnel_cops_3[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
ENDIF
ELSE
//If this is the first rappel ped to die then record some footage.
//IF COUNT_OF(s_tunnel_cops_3) - GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_3) = 1
IF NOT bRecordSomeRappelling
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.0)
bRecordSomeRappelling = TRUE
ENDIF
HANDLE_RAPPEL_ROPE(s_tunnel_cops_3_rappel_data[i], FALSE, FALSE, FALSE, TRUE)
iNumPedsFinishedRappelling++
CLEAN_UP_ENEMY_PED(s_tunnel_cops_3[i])
ENDIF
ENDREPEAT
IF iNumPedsFinishedRappelling >= COUNT_OF(s_tunnel_cops_3)
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_NOOSE_ABSEIL_SCENE")
STOP_AUDIO_SCENE("BS_2B_NOOSE_ABSEIL_SCENE")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_TUNNEL_SHOOTOUT_ENEMIES_2(BOOL b_force_activate_peds = FALSE)
INT i = 0
VECTOR v_pos
//VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
SEQUENCE_INDEX seq
BOOL b_time_to_trigger = FALSE
//BOOL b_checked_trigger = FALSE
IF b_force_activate_peds
ENDIF
//Cops run down the tunnels
IF NOT s_tunnel_cops_new_1[0].b_is_created
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
IF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[0].ped)
b_time_to_trigger = (e_mission_stage = STAGE_COLLECT_GOLD)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<41.326279,-672.480347,14.733490>>, <<27.868965,-655.675354,19.991060>>, 36.750000)
//OR GET_GAME_TIMER() - i_time_since_bomb_section_started > 60000
OR s_tunnel_cops_new_1[0].i_event > 0
IF b_time_to_trigger
s_tunnel_cops_new_1[0].ped = CREATE_ENEMY_PED(model_swat, <<36.6492, -687.2292, 15.4872>>, 359.6833, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[1].ped)
s_tunnel_cops_new_1[1].ped = CREATE_ENEMY_PED(model_swat, <<35.7176, -689.4240, 15.5492>>, 359.2877, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[2].ped)
s_tunnel_cops_new_1[2].ped = CREATE_ENEMY_PED(model_swat, <<34.1383, -696.9333, 15.7245>>, 357.4622, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[3].ped)
s_tunnel_cops_new_1[3].ped = CREATE_ENEMY_PED(model_swat, <<32.2270, -699.9393, 15.6202>>, 356.0465, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[4].ped)
s_tunnel_cops_new_1[4].ped = CREATE_ENEMY_PED(model_swat, <<28.9658, -705.8560, 15.5606>>, 339.0316, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[5].ped)
s_tunnel_cops_new_1[5].ped = CREATE_ENEMY_PED(model_swat, <<27.2658, -707.4560, 15.5606>>, 339.0316, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[6].ped)
s_tunnel_cops_new_1[6].ped = CREATE_ENEMY_PED(model_swat, <<15.9690, -721.1433, 15.5305>>, 326.4022, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[7].ped)
s_tunnel_cops_new_1[7].ped = CREATE_ENEMY_PED(model_swat, <<7.7690, -729.8433, 15.5305>>, 326.4022, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
REPEAT COUNT_OF(s_tunnel_cops_new_1) i
IF NOT IS_PED_INJURED(s_tunnel_cops_new_1[i].ped)
IF HAS_PED_GOT_WEAPON(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
ENDIF
ENDREPEAT
IF i_tunnel_navmesh_block = -1
i_tunnel_navmesh_block = ADD_NAVMESH_BLOCKING_OBJECT(<<34.9, -675.5, 16.3>>, <<1.9, 1.9, 5.0>>, DEG_TO_RAD(-173.5))
ENDIF
INITIALISE_ENEMY_GROUP(s_tunnel_cops_new_1, "new 1 ")
ENDIF
ENDIF
ELSE
b_time_to_trigger = FALSE
REPEAT COUNT_OF(s_tunnel_cops_new_1) i
IF NOT IS_PED_INJURED(s_tunnel_cops_new_1[i].ped)
SWITCH s_tunnel_cops_new_1[i].i_event
CASE 0
IF i < 4
b_time_to_trigger = TRUE
ELSE
b_time_to_trigger = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<41.326279,-672.480347,14.733490>>, <<27.868965,-655.675354,19.991060>>, 36.750000)
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) < 8
ENDIF
IF b_time_to_trigger
IF i = 0
v_pos = <<38.5383, -671.1333, 15.4245>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
ELIF i = 1
v_pos = <<34.6138, -671.2228, 15.4835>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
ELIF i = 2
v_pos = <<27.0334, -648.3330, 15.0881>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
ELIF i = 3
v_pos = <<17.3964, -651.6926, 15.0881>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
ELIF i = 4
v_pos = <<35.2043, -663.0771, 15.4835>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
ELIF i = 5
v_pos = <<25.4105, -659.9389, 15.2536>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
ELIF i = 6
v_pos = <<33.7382, -670.4211, 15.4835>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
ELIF i = 7
v_pos = <<37.8303, -666.4304, 15.4835>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
ENDIF
SET_PED_COMBAT_PARAMS(s_tunnel_cops_new_1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_CAN_COWER_IN_COVER(s_tunnel_cops_new_1[i].ped, FALSE)
SET_PED_CONFIG_FLAG(s_tunnel_cops_new_1[i].ped, PCF_RunFromFiresAndExplosions, FALSE)
CLEAR_PED_TASKS_IMMEDIATELY(s_tunnel_cops_new_1[i].ped)
SET_COMBAT_FLOAT(s_tunnel_cops_new_1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
SET_COMBAT_FLOAT(s_tunnel_cops_new_1[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
IF i < 2
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_new_1[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_new_1[i].ped, FALSE)
ELIF i = 2 OR i = 3
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_CAN_CHARGE, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<37.1755, -675.1907, 15.5034>>, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.5, 4.0, TRUE, ENAV_NO_STOPPING)
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(s_tunnel_cops_new_1[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ELIF i >= 4
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_CAN_CHARGE, TRUE)
IF i = 4
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_new_1[i].ped, "MOVE_IN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_new_1[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_new_1[i].ped, FALSE)
ENDIF
IF i = 0
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 3, s_tunnel_cops_new_1[i].ped, "BS2BSwat1")
ENDIF
s_tunnel_cops_new_1[i].i_timer = 0
s_tunnel_cops_new_1[i].i_event++
ENDIF
BREAK
CASE 1 //Have the front guy push forward if someone in the group dies.
IF i = 0 //First guy shouts when opening fire.
IF NOT b_has_text_label_triggered[BS2B_BCOPS]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BCOPS", CONV_PRIORITY_MEDIUM)
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_new_1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL)
b_has_text_label_triggered[BS2B_BCOPS] = TRUE
//ENDIF
ENDIF
ENDIF
ENDIF
//Once the two rushing enemies get into position (or die) then allow the two covering enemies to push.
IF i = 0 OR i = 1
IF s_tunnel_cops_new_1[i].i_timer = 0
s_tunnel_cops_new_1[i].i_timer = GET_GAME_TIMER()
ELSE
IF (i = 0 AND GET_GAME_TIMER() - s_tunnel_cops_new_1[i].i_timer > 15200)
OR (i = 1 AND GET_GAME_TIMER() - s_tunnel_cops_new_1[i].i_timer > 14800)
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, <<27.7524, -647.8356, 15.0881>>, 3.0)
ELSE
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, <<25.1614, -659.1172, 15.2274>>, 3.0)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_CAN_CHARGE, TRUE)
s_tunnel_cops_new_1[i].i_event++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF s_tunnel_cops_new_1[i].i_event > 0
SET_PED_RESET_FLAG(s_tunnel_cops_new_1[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
UPDATE_AI_PED_BLIP(s_tunnel_cops_new_1[i].ped, s_tunnel_cops_new_1[i].s_blip_data)
ENDIF
//Kill these cops instantly if they're hit by the exploding gas cans or the cutter.
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_EXPLOSION)
APPLY_DAMAGE_TO_PED(s_tunnel_cops_new_1[i].ped, 200, TRUE)
ELIF IS_PED_TOUCHING_CUTTER_BLADES(s_tunnel_cops_new_1[i].ped)
APPLY_DAMAGE_TO_PED(s_tunnel_cops_new_1[i].ped, 200, TRUE)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_tunnel_cops_new_1[i])
ENDIF
ENDREPEAT
ENDIF
//Cops run from the other side.
IF NOT s_tunnel_cops_new_2[0].b_is_created
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
IF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[0].ped)
b_time_to_trigger = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-8.604258,-606.761108,14.231360>>, <<-6.964643,-608.810669,18.422485>>, 6.750000)
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) < 2
IF b_time_to_trigger
s_tunnel_cops_new_2[0].ped = CREATE_ENEMY_PED(model_swat, <<-15.0140, -591.5684, 17.2677>>, 159.3242, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[1].ped)
s_tunnel_cops_new_2[1].ped = CREATE_ENEMY_PED(model_swat, <<-12.7972, -590.0397, 17.6131>>, 129.0517, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[2].ped)
s_tunnel_cops_new_2[2].ped = CREATE_ENEMY_PED(model_swat, <<-11.4219, -589.1260, 17.8536>>, 125.2921, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[3].ped)
s_tunnel_cops_new_2[3].ped = CREATE_ENEMY_PED(model_swat, <<-9.7856, -588.1921, 18.1903>>, 120.8828, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[4].ped)
s_tunnel_cops_new_2[4].ped = CREATE_ENEMY_PED(model_swat, <<-8.4372, -587.6932, 18.4802>>, 132.6740, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[5].ped)
s_tunnel_cops_new_2[5].ped = CREATE_ENEMY_PED(model_swat, <<-7.1320, -587.0947, 18.7958>>, 132.6740, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[6].ped)
s_tunnel_cops_new_2[6].ped = CREATE_ENEMY_PED(model_swat, <<-5.7203, -586.3234, 19.1201>>, 138.0245, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[7].ped)
s_tunnel_cops_new_2[7].ped = CREATE_ENEMY_PED(model_swat, <<-4.3026, -585.6801, 19.3491>>, 131.6877, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
INITIALISE_ENEMY_GROUP(s_tunnel_cops_new_2, "new 2 ")
REPEAT COUNT_OF(s_tunnel_cops_new_2) i
IF NOT IS_PED_INJURED(s_tunnel_cops_new_2[i].ped)
FREEZE_ENTITY_POSITION(s_tunnel_cops_new_2[i].ped, TRUE)
SET_ENTITY_INVINCIBLE(s_tunnel_cops_new_2[i].ped, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(s_tunnel_cops_new_2[i].ped, TRUE)
IF HAS_PED_GOT_WEAPON(s_tunnel_cops_new_2[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_new_2[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(s_tunnel_cops_new_2[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_new_2[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ELSE
INT i_num_enemies_alive = GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2)
REPEAT COUNT_OF(s_tunnel_cops_new_2) i
IF NOT IS_PED_INJURED(s_tunnel_cops_new_2[i].ped)
SWITCH s_tunnel_cops_new_2[i].i_event
CASE 0
IF i < 4
b_time_to_trigger = TRUE
ELIF i < 6
b_time_to_trigger = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-8.604258,-606.761108,14.231360>>, <<-6.964643,-608.810669,18.422485>>, 6.750000)
OR i_num_enemies_alive < 7
ELSE
b_time_to_trigger = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-8.604258,-606.761108,14.231360>>, <<-6.964643,-608.810669,18.422485>>, 6.750000)
OR i_num_enemies_alive < 6
ENDIF
IF b_time_to_trigger
IF i = 0
v_pos = <<-16.4908, -596.7791, 16.5802>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, TRUE)
ELIF i = 1
v_pos = <<-7.5370, -617.3412, 14.9065>>
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_new_2[i].ped, s_tunnel_cops_new_2[i].cover, v_pos, 201.3598, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 2
v_pos = <<-10.4712, -602.2746, 15.6628>>
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_new_2[i].ped, s_tunnel_cops_new_2[i].cover, v_pos, 203.7851, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 3
v_pos = <<-0.6758, -629.6381, 14.7396>>
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_new_2[i].ped, s_tunnel_cops_new_2[i].cover, v_pos, 248.4832, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 4
v_pos = <<-7.5370, -617.3412, 14.9065>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, FALSE)
ELIF i = 5
v_pos = <<-10.4712, -602.2746, 15.6628>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, FALSE)
ELIF i = 6
v_pos = <<-0.6758, -629.6381, 14.7396>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, FALSE)
ELIF i = 7
v_pos = <<-4.0, -637.0, 14.9>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, FALSE)
ENDIF
FREEZE_ENTITY_POSITION(s_tunnel_cops_new_2[i].ped, FALSE)
SET_ENTITY_INVINCIBLE(s_tunnel_cops_new_2[i].ped, FALSE)
SET_PED_COMBAT_PARAMS(s_tunnel_cops_new_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_CAN_COWER_IN_COVER(s_tunnel_cops_new_2[i].ped, FALSE)
SET_PED_CONFIG_FLAG(s_tunnel_cops_new_2[i].ped, PCF_RunFromFiresAndExplosions, FALSE)
CLEAR_PED_TASKS_IMMEDIATELY(s_tunnel_cops_new_2[i].ped)
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0)
SET_COMBAT_FLOAT(s_tunnel_cops_new_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
SET_COMBAT_FLOAT(s_tunnel_cops_new_2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
IF i != 0
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_CAN_CHARGE, TRUE)
ENDIF
IF i = 0 OR i = 4
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_new_2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_new_2[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_new_2[i].ped, FALSE)
//s_tunnel_cops_new_2[i].blip = CREATE_BLIP_FOR_ENTITY(s_tunnel_cops_new_2[i].ped, TRUE)
s_tunnel_cops_new_2[i].i_timer = 0
s_tunnel_cops_new_2[i].i_event++
ENDIF
BREAK
CASE 1 //After some time have the covering enemies push forward.
IF i = 0
IF s_tunnel_cops_new_2[i].i_timer = 0
s_tunnel_cops_new_2[i].i_timer = GET_GAME_TIMER()
ELSE
IF GET_GAME_TIMER() - s_tunnel_cops_new_2[i].i_timer > 12200
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, <<2.8157, -626.8237, 14.6692>>, 3.0)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_CAN_CHARGE, TRUE)
s_tunnel_cops_new_2[i].i_event++
ENDIF
ENDIF
ELSE
//Set enemies to charge if a certain number is dead.
IF i_num_enemies_alive = 1
OR (i = 2 AND i_num_enemies_alive < 3)
SET_PED_CONFIG_FLAG(s_tunnel_cops_new_2[i].ped, PCF_ShouldChargeNow, TRUE)
s_tunnel_cops_new_2[i].i_event++
ENDIF
//The buddy has a "more guys from the other side" line that ties in with the cops appearing, place here as the mission could potentially be in different stages.
IF NOT b_has_text_label_triggered[BS2B_CRCOPS4]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF s_tunnel_cops_new_1[0].i_event > 0 //Only trigger if the enemies were triggered in order.
IF s_tunnel_cops_new_1[i].i_timer = 0
s_tunnel_cops_new_1[i].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_tunnel_cops_new_2[i].i_timer > 3000
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SEC")
b_has_text_label_triggered[BS2B_CRCOPS4] = TRUE
ENDIF
ENDIF
ELSE
b_has_text_label_triggered[BS2B_CRCOPS4] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF s_tunnel_cops_new_2[i].i_event > 0
SET_PED_RESET_FLAG(s_tunnel_cops_new_2[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
UPDATE_AI_PED_BLIP(s_tunnel_cops_new_2[i].ped, s_tunnel_cops_new_2[i].s_blip_data)
ENDIF
IF IS_PED_TOUCHING_CUTTER_BLADES(s_tunnel_cops_new_2[i].ped)
APPLY_DAMAGE_TO_PED(s_tunnel_cops_new_2[i].ped, 200, TRUE)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_tunnel_cops_new_2[i])
ENDIF
ENDREPEAT
ENDIF
ENDPROC
PROC UPDATE_SHOOTOUT_COPS()
INT i = 0
VECTOR v_pos
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
SEQUENCE_INDEX seq
BOOL b_created_ped_this_frame = FALSE
BOOL b_created_vehicle_this_frame = FALSE
BOOL b_time_to_trigger_enemies = FALSE
BOOL b_already_checked_enemy_trigger = FALSE
IF e_mission_stage < STAGE_LOSE_COPS
REQUEST_MODEL(model_cop)
IF e_mission_stage > STAGE_LEAVE_BANK
REQUEST_MODEL(model_cop_car)
ENDIF
REQUEST_WEAPON_ASSET(WEAPONTYPE_PISTOL)
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
//First cops to appear when leaving the bank
REPEAT COUNT_OF(s_cops_start) i
IF NOT s_cops_start[i].b_is_created
IF NOT b_created_ped_this_frame
AND HAS_MODEL_LOADED(model_cop)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PISTOL)
SWITCH i
CASE 0 s_cops_start[0].ped = CREATE_ENEMY_PED(model_cop, <<-25.2, -680.9, 48.4766>>, -64.9392, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL) BREAK
CASE 1 s_cops_start[1].ped = CREATE_ENEMY_PED(model_cop, <<-11.0577, -674.1201, 48.5005>>, 273.1100, rel_group_cops, 200, 0, WEAPONTYPE_PUMPSHOTGUN) BREAK
CASE 2 s_cops_start[2].ped = CREATE_ENEMY_PED(model_cop, <<-37.5546, -681.1513, 48.4740>>, 338.5009, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL) BREAK
CASE 3 s_cops_start[3].ped = CREATE_ENEMY_PED(model_cop, <<-62.8, -701.6, 48.4740>>, -66.8, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE) BREAK
CASE 4 s_cops_start[4].ped = CREATE_ENEMY_PED(model_cop, <<-63.7075, -703.1475, 48.4740>>, 338.9530, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL) BREAK
ENDSWITCH
INITIALISE_ENEMY_PED(s_cops_start[i], "Start ", i)
SET_COMBAT_FLOAT(s_cops_start[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
SET_PED_CONFIG_FLAG(s_cops_start[i].ped, PCF_DontBlipCop, TRUE)
b_created_ped_this_frame = TRUE
ENDIF
ELSE
IF DOES_ENTITY_EXIST(s_cops_start[i].ped)
IF NOT IS_PED_INJURED(s_cops_start[i].ped)
SWITCH s_cops_start[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_start[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_start[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_start[i].ped, 200.0)
s_cops_start[i].i_event = 100
ELSE
IF i != 4
IF i = 1 OR i = 2 OR IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF i = 0
SET_PED_COVER_POINT_AND_SPHERE(s_cops_start[i].ped, s_cops_start[i].cover, <<-16.4179, -671.3395, 48.4766>>, -18.4, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 1
v_pos = <<-11.0577, -674.1201, 48.5005>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_start[i].ped, s_cops_start[i].cover, v_pos, -63.0, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
ELIF i = 2
v_pos = <<-37.3565, -681.3320, 48.5495>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_start[i].ped, s_cops_start[i].cover, v_pos, 336.9946, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 3
v_pos = <<-39.1769, -687.3491, 48.5495>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_start[i].ped, s_cops_start[i].cover, v_pos, -63.0, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_start[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_DISABLE_PINNED_DOWN, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_CAN_CHARGE, TRUE)
OPEN_SEQUENCE_TASK(seq)
IF i = 1 OR i = 2
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, v_pos, 1000 + (i * 400), FALSE, 0.0, FALSE, FALSE, s_cops_start[i].cover, TRUE)
ENDIF
IF i = 3
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_PAUSE(NULL, 3400)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_cops_start[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
IF i = 0
PLAY_PED_AMBIENT_SPEECH(s_cops_start[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
//s_cops_start[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_start[i].ped, TRUE)
s_cops_start[i].i_event++
ENDIF
ELIF ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, NULL, <<-42.12,-672.53,48.52>>, <<-35.51,-688.068,52.219>>, 1.75)
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) < 2 AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) < 2)
SET_PED_COMBAT_AI(s_cops_start[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, CA_USE_COVER, <<-50.6064, -688.0734, 48.4740>>, 2.0)
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_CAN_CHARGE, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_start[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_start[i].ped, FALSE)
//s_cops_start[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_start[i].ped, TRUE)
s_cops_start[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1
IF i = 0
IF e_mission_stage = STAGE_CITY_SHOOTOUT
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PED_CONFIG_FLAG(s_cops_start[i].ped, PCF_ShouldChargeNow, TRUE)
s_cops_start[i].i_event++
ENDIF
ENDIF
BREAK
ENDSWITCH
IF s_cops_start[i].i_event > 0
UPDATE_AI_PED_BLIP(s_cops_start[i].ped, s_cops_start[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_cops_start[i])
ENDIF
ENDIF
ENDIF
ENDREPEAT
//More cops arrive as the player progresses
REPEAT COUNT_OF(s_cops_pillars) i
IF i = 0
b_created_ped_this_frame = FALSE
b_time_to_trigger_enemies = FALSE
b_already_checked_enemy_trigger = FALSE
ENDIF
IF NOT s_cops_pillars[i].b_is_created
IF NOT b_created_ped_this_frame
AND HAS_MODEL_LOADED(model_cop)
SWITCH i
CASE 0 s_cops_pillars[0].ped = CREATE_ENEMY_PED(model_cop, <<-65.4661, -705.5660, 48.4740>>, 329.6893, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE) BREAK
CASE 1 s_cops_pillars[1].ped = CREATE_ENEMY_PED(model_cop, <<-74.2775, -703.4993, 46.3202>>, 260.4156, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE) BREAK
ENDSWITCH
INITIALISE_ENEMY_PED(s_cops_pillars[i], "Pillars ", i)
SET_COMBAT_FLOAT(s_cops_pillars[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
SET_PED_CONFIG_FLAG(s_cops_pillars[i].ped, PCF_DontBlipCop, TRUE)
b_created_ped_this_frame = TRUE
ENDIF
ELSE
IF DOES_ENTITY_EXIST(s_cops_pillars[i].ped)
IF NOT IS_PED_INJURED(s_cops_pillars[i].ped)
IF s_cops_pillars[i].i_event = 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_pillars[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_pillars[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_pillars[i].ped, 200.0)
s_cops_pillars[i].i_event = 100
ELSE
IF NOT b_already_checked_enemy_trigger
b_time_to_trigger_enemies = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, NULL,
<<-42.129002,-672.534180,48.527149>>, <<-35.514149,-688.064148,52.214169>>, 1.750000)
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) < 4)
b_already_checked_enemy_trigger = TRUE
ENDIF
IF b_time_to_trigger_enemies
IF i = 0
v_pos = <<-44.7908, -684.3557, 48.4740>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_pillars[i].ped, v_pos, 2.0)
PLAY_PED_AMBIENT_SPEECH(s_cops_pillars[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ELIF i = 1
v_pos = <<-58.5649, -691.1188, 48.5495>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_pillars[i].ped, s_cops_pillars[i].cover, v_pos, 326.8453, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_pillars[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(s_cops_pillars[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
SET_PED_COMBAT_PARAMS(s_cops_pillars[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_pillars[i].ped, 150.0)
//s_cops_pillars[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_pillars[i].ped, TRUE)
s_cops_pillars[i].i_event++
ENDIF
ENDIF
ELIF s_cops_pillars[i].i_event = 1
UPDATE_AI_PED_BLIP(s_cops_pillars[i].ped, s_cops_pillars[i].s_blip_data)
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_pillars[i].ped)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_cops_pillars[i])
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Cop comes up the stairs at the end of the pillars.
IF NOT s_cops_pillars_end[0].b_is_created
IF s_cops_start[0].i_event > 0
AND e_mission_stage > STAGE_LEAVE_BANK
IF HAS_MODEL_LOADED(model_cop)
s_cops_pillars_end[0].ped = CREATE_ENEMY_PED(model_cop, <<-75.6078, -702.7124, 45.6410>>, 241.7591, rel_group_neutral, 200, 0, WEAPONTYPE_PUMPSHOTGUN)
SET_PED_CONFIG_FLAG(s_cops_pillars_end[0].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_pillars_end, "PillEnd ")
ENDIF
ENDIF
ELSE
BOOL b_time_to_trigger = FALSE
REPEAT COUNT_OF(s_cops_pillars_end) i
IF DOES_ENTITY_EXIST(s_cops_pillars_end[i].ped)
IF NOT IS_PED_INJURED(s_cops_pillars_end[i].ped)
SWITCH s_cops_pillars_end[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_pillars_end[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_pillars_end[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_pillars_end[i].ped, 200.0)
s_cops_pillars_end[i].i_event = 100
ELSE
b_time_to_trigger = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, NULL,
<<-56.933033,-697.963318,48.473969>>, <<-64.046089,-683.155457,51.723969>>, 1.750000)
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) = 0)
IF b_time_to_trigger
v_pos = <<-65.5606, -694.5168, 48.4740>>
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_pillars_end[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars_end[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars_end[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars_end[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_AI(s_cops_pillars_end[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, v_pos, 2.0)
SEQ_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(s_cops_pillars_end[i].ped, v_pos, PEDMOVE_RUN, v_zero, PLAYER_PED_ID(), TRUE)
PLAY_PED_AMBIENT_SPEECH(s_cops_pillars_end[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
//s_cops_pillars_end[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_pillars_end[i].ped, TRUE)
s_cops_pillars_end[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1
UPDATE_AI_PED_BLIP(s_cops_pillars_end[i].ped, s_cops_pillars_end[i].s_blip_data)
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_pillars_end[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Cops appear above the other side of the bridge
IF NOT s_cops_heli_bridge[0].b_is_created
IF s_cops_pillars_end[0].i_event > 0
REQUEST_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE, str_carrec)
REQUEST_MODEL(model_cop_heli)
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
AND HAS_MODEL_LOADED(model_cop_heli)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_HELI_BRIDGE, str_carrec)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-69.588188,-679.454834,56.489262>>, <<-67.637695,-678.490112,27.739422>>, 46.000000)
veh_cops_bridge_heli = CREATE_VEHICLE(model_cop_heli, <<-21.9836, -738.0031, 56.5109>>, 0.0)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
SET_VEHICLE_LIGHTS(veh_cops_bridge_heli, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_cops_bridge_heli, TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_bridge_heli, TRUE)
SET_VEHICLE_ENGINE_ON(veh_cops_bridge_heli, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(veh_cops_bridge_heli)
SET_VEHICLE_LIVERY(veh_cops_bridge_heli, 0)
SET_VEHICLE_STRONG(veh_cops_bridge_heli, TRUE)
SET_ENTITY_INVINCIBLE(veh_cops_bridge_heli, TRUE) //We need to control how and when this heli gets destroyed, so it doesn't block key routes when crashing.
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_bridge_heli, CARREC_COPS_HELI_BRIDGE, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_bridge_heli, 4000.0)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_bridge_heli, "BS_POLICE_HELI_01_group")
s_cops_heli_bridge[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_bridge_heli, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
s_cops_heli_bridge[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_bridge_heli, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
s_cops_heli_bridge[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_bridge_heli, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
INITIALISE_ENEMY_GROUP(s_cops_heli_bridge, "HBridge ")
ENDIF
ENDIF
ENDIF
ELSE
//Look after the helicopter: keep track of when it is on the ground so the peds can get out at the right time.
BOOL b_heli_stopped = FALSE
FLOAT f_playback_time = 0.0
IF IS_VEHICLE_DRIVEABLE(veh_cops_bridge_heli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_bridge_heli)
IF f_playback_time > 15000.0
IF f_playback_time < 18000.0
CONVERGE_VALUE(f_bridge_heli_playback_speed, 0.25, 0.02)
b_heli_stopped = TRUE
ELSE
CONVERGE_VALUE(f_bridge_heli_playback_speed, 1.0, 0.02)
ENDIF
ELSE
IF f_playback_time < 10000.0
f_bridge_heli_playback_speed = 0.85
ELSE
f_bridge_heli_playback_speed = 1.0
ENDIF
ENDIF
SET_PLAYBACK_SPEED(veh_cops_bridge_heli, f_bridge_heli_playback_speed)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(veh_cops_bridge_heli)
//Spin the chopper out if shot enough.
IF s_cops_heli_bridge[0].i_event != 100
IF IS_PED_INJURED(s_cops_heli_bridge[0].ped)
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
OR f_playback_time > 6000.0
IF IS_PED_INJURED(s_cops_heli_bridge[0].ped)
OR GET_ENTITY_HEALTH(veh_cops_bridge_heli) < 900
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_bridge_heli) < 700
OR GET_VEHICLE_ENGINE_HEALTH(veh_cops_bridge_heli) < 700
OR IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_bridge_heli, <<0.0, 5.0, -5.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_bridge_heli, <<0.0, -5.0, 5.0>>), 8.0)
SET_ENTITY_HEALTH(veh_cops_bridge_heli, 1000)
IF NOT IS_PED_INJURED(s_cops_heli_bridge[0].ped)
SET_ENTITY_HEALTH(s_cops_heli_bridge[0].ped, 0)
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_bridge_heli)
ENDIF
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_bridge_heli, -200.0)
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_bridge_heli)
s_cops_heli_bridge[0].i_timer = GET_GAME_TIMER()
s_cops_heli_bridge[0].i_event = 100
ENDIF
ELSE
SET_ENTITY_HEALTH(veh_cops_bridge_heli, 1000)
ENDIF
ELSE
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_bridge_heli, -200.0)
IF GET_GAME_TIMER() - s_cops_heli_bridge[0].i_timer > 3000
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_bridge_heli)
SET_ENTITY_INVINCIBLE(veh_cops_bridge_heli, FALSE)
SET_ENTITY_PROOFS(veh_cops_bridge_heli, FALSE, FALSE, FALSE, FALSE, FALSE)
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_bridge_heli)
REMOVE_VEHICLE(veh_cops_bridge_heli)
s_cops_heli_bridge[0].i_event++
ELSE
APPLY_FORCE_TO_ENTITY(veh_cops_bridge_heli, APPLY_TYPE_FORCE, <<-10.0, -10.0, 7.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, FALSE, TRUE)
ENDIF
ENDIF
ELIF DOES_ENTITY_EXIST(veh_cops_bridge_heli)
REMOVE_VEHICLE(veh_cops_bridge_heli)
ENDIF
REPEAT COUNT_OF(s_cops_heli_bridge) i
IF DOES_ENTITY_EXIST(s_cops_heli_bridge[i].ped)
IF NOT IS_PED_INJURED(s_cops_heli_bridge[i].ped)
SWITCH s_cops_heli_bridge[i].i_event
CASE 0
IF i != 0
IF b_heli_stopped
IF i = 1
v_pos = <<-131.4572, -668.1079, 47.2191>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_heli_bridge[i].ped, s_cops_heli_bridge[i].cover, v_pos, -110.0, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_180)
ELIF i = 2
v_pos = <<-132.3714, -670.7834, 47.2191>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_heli_bridge[i].ped, s_cops_heli_bridge[i].cover, v_pos, -110.0, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_180)
ENDIF
SET_PED_COMBAT_AI(s_cops_heli_bridge[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_USE_COVER, v_pos, 2.0)
SET_COMBAT_FLOAT(s_cops_heli_bridge[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
SET_COMBAT_FLOAT(s_cops_heli_bridge[i].ped, CCF_BURST_DURATION_IN_COVER, 5.0)
SET_PED_COMBAT_ATTRIBUTES(s_cops_heli_bridge[i].ped, CA_USE_COVER, FALSE)
SET_PED_CONFIG_FLAG(s_cops_heli_bridge[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
//SET_COMBAT_FLOAT(s_cops_heli_bridge[i].ped, CCF_TIME_BETWEEN_PEEKS, 0.05)
SET_PED_SEEING_RANGE(s_cops_heli_bridge[i].ped, 150.0)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_LEAVE_ANY_VEHICLE(NULL, i * 50, ECF_DONT_CLOSE_DOOR)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_pos, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.5, 0.5, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_cops_heli_bridge[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
//s_cops_heli_bridge[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_heli_bridge[i].ped, TRUE)
s_cops_heli_bridge[i].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 3000)
s_cops_heli_bridge[i].i_event++
ENDIF
//If the pilot died before they got out then kill them.
IF IS_PED_INJURED(s_cops_heli_bridge[0].ped)
SET_ENTITY_HEALTH(s_cops_heli_bridge[i].ped, 0)
ENDIF
ELSE
//Once the heli gets out of view delete the driver and the heli.
IF IS_VEHICLE_DRIVEABLE(veh_cops_bridge_heli)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
IF IS_ENTITY_OCCLUDED(veh_cops_bridge_heli)
REMOVE_PED(s_cops_heli_bridge[i].ped, TRUE)
REMOVE_VEHICLE(veh_cops_bridge_heli, TRUE)
ELSE
TASK_HELI_MISSION(s_cops_heli_bridge[i].ped, veh_cops_bridge_heli, NULL, NULL, <<685.2, 984.9, 316.0>>, MISSION_GOTO, 30.0, 10.0, -26.0, 200, 50)
SET_PED_KEEP_TASK(s_cops_heli_bridge[i].ped, TRUE)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_bridge_heli)
CLEAN_UP_ENEMY_PED(s_cops_heli_bridge[i])
REMOVE_VEHICLE(veh_cops_bridge_heli)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE, str_carrec)
s_cops_heli_bridge[i].i_event++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Remove blips if the player runs on and ignores them
//Manually handle cover times.
/*IF GET_GAME_TIMER() - s_cops_heli_bridge[i].i_timer < 10000
SET_PED_COMBAT_ATTRIBUTES(s_cops_heli_bridge[i].ped, CA_USE_COVER, FALSE)
ELSE
SET_PED_COMBAT_ATTRIBUTES(s_cops_heli_bridge[i].ped, CA_USE_COVER, TRUE)
IF GET_GAME_TIMER() - s_cops_heli_bridge[i].i_timer > 12000
s_cops_heli_bridge[i].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 3000)
ENDIF
ENDIF*/
IF s_cops_after_bridge[0].i_event > 0
s_cops_heli_bridge[i].i_event++
ENDIF
BREAK
CASE 2 //Delete them once the player goes up to the courtyard section.
IF s_cops_courtyard_1[0].i_event > 0
v_pos = GET_ENTITY_COORDS(s_cops_heli_bridge[i].ped, FALSE)
CLEAN_UP_ENEMY_PED(s_cops_heli_bridge[i])
CLEAR_AREA_OF_PEDS(v_pos, 2.0)
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_heli_bridge[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
IF NOT s_cops_bridge_start[0].b_is_created
IF e_mission_stage > STAGE_LEAVE_BANK
REQUEST_MODEL(model_swat)
//These cops are created straight away.
IF HAS_MODEL_LOADED(model_swat)
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_start[0].ped)
s_cops_bridge_start[0].ped = CREATE_ENEMY_PED(model_swat, <<-97.7897, -683.5250, 39.5162>>, 257.1212, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge_start[0].ped, PCF_DontBlipCop, TRUE)
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_start[1].ped)
s_cops_bridge_start[1].ped = CREATE_ENEMY_PED(model_swat, <<-104.3132, -685.7965, 39.5162>>, 258.7648, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge_start[1].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_bridge_start, "BridStart ")
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_bridge_start) i
IF DOES_ENTITY_EXIST(s_cops_bridge_start[i].ped)
IF NOT IS_PED_INJURED(s_cops_bridge_start[i].ped)
SWITCH s_cops_bridge_start[i].i_event
CASE 0 //Put them into combat immediately (the player can potentially see these peds from far away).
IF i = 0
s_cops_bridge_start[i].v_dest = <<-97.7897, -683.5250, 39.5162>>
ELIF i = 1
s_cops_bridge_start[i].v_dest = <<-104.3132, -685.7965, 39.5162>>
ENDIF
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge_start[i].ped, s_cops_bridge_start[i].v_dest, 2.0)
SET_PED_COMBAT_PARAMS(s_cops_bridge_start[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_start[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_start[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_start[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_start[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_start[i].ped, FALSE)
s_cops_bridge_start[i].i_timer = GET_GAME_TIMER()
s_cops_bridge_start[i].i_event++
BREAK
CASE 1 //Once the player gets closer to them set them to charge.
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-89.297874,-686.501404,42.274471>>, <<6.750000,7.000000,4.750000>>)
OR b_player_got_to_bridge
SET_PED_COMBAT_PARAMS(s_cops_bridge_start[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_start[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_start[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(s_cops_bridge_start[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
s_cops_bridge_start[i].i_timer = GET_GAME_TIMER()
s_cops_bridge_start[i].i_event++
ENDIF
BREAK
ENDSWITCH
IF s_cops_bridge_start[i].i_event > 0
UPDATE_AI_PED_BLIP(s_cops_bridge_start[i].ped, s_cops_bridge_start[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_cops_bridge_start[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
IF NOT s_cops_bridge[0].b_is_created
IF e_mission_stage > STAGE_LEAVE_BANK
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
IF NOT DOES_ENTITY_EXIST(s_cops_bridge[0].ped)
//Three potential trigger areas for these enemies, as the player could potentially walk around the bank or go down the stairs at the start.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-76.852043,-704.108032,45.154190>>, <<-75.870018,-701.383789,49.154129>>, 8.000000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-67.761673,-708.226929,42.242195>>, <<-70.335564,-715.258911,46.063213>>, 5.750000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.310922,-656.394409,38.490685>>, <<-9.158315,-654.127136,43.241711>>, 8.000000)
OR (IS_SELECTOR_CAM_ACTIVE() AND s_cops_pillars_end[0].b_is_created) //In case the player switches to Franklin before reaching the locates.
s_cops_bridge[0].ped = CREATE_ENEMY_PED(model_swat, <<-125.2105, -678.0999, 39.5162>>, 244.2533, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge[0].ped, PCF_DontBlipCop, TRUE)
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_bridge[1].ped)
s_cops_bridge[1].ped = CREATE_ENEMY_PED(model_swat, <<-118.8595, -676.0781, 39.5162>>, 249.4472, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_bridge[2].ped)
s_cops_bridge[2].ped = CREATE_ENEMY_PED(model_swat, <<-150.4314, -671.3599, 39.4888>>, 240.4354, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge[2].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_bridge[3].ped)
s_cops_bridge[3].ped = CREATE_ENEMY_PED(model_swat, <<-123.0884, -651.0028, 39.4888>>, 150.6339, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge[3].ped, PCF_DontBlipCop, TRUE)
//Add a navmesh blocking area to prevent these guys from running down the side (we want them to run across the bridge).
IF i_bridge_navmesh_block = -1
i_bridge_navmesh_block = ADD_NAVMESH_BLOCKING_OBJECT(<<-121.6, -637.8, 39.2>>, <<3.0, 3.0, 5.0>>, DEG_TO_RAD(69.6))
ENDIF
INITIALISE_ENEMY_GROUP(s_cops_bridge, "Bridge ")
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
BOOL b_checked_first_wave_trigger = FALSE
BOOL b_checked_second_wave_trigger = FALSE
BOOL b_trigger_first_wave = FALSE
BOOL b_trigger_second_wave = FALSE
REPEAT COUNT_OF(s_cops_bridge) i
IF DOES_ENTITY_EXIST(s_cops_bridge[i].ped)
IF NOT IS_PED_INJURED(s_cops_bridge[i].ped)
SWITCH s_cops_bridge[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_bridge[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge[i].ped, 200.0)
s_cops_bridge[i].i_event = 100
ELSE
IF i = 0
v_pos = <<-125.2105, -678.0999, 39.5162>>
ELIF i = 1
v_pos = <<-118.8595, -676.0781, 39.5162>>
ELIF i = 2
v_pos = <<-132.6517, -680.5043, 39.4888>>
ELIF i = 3
v_pos = <<-128.4617, -668.9617, 39.4888>>
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_bridge[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge[i].ped, v_pos, 2.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge[i].ped, FALSE)
s_cops_bridge[i].i_timer = GET_GAME_TIMER()
s_cops_bridge[i].i_event++
ENDIF
BREAK
CASE 1 //Each set of enemies pushes forwards after certain events.
IF i = 0 OR i = 1
IF NOT b_checked_first_wave_trigger
b_trigger_first_wave = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-83.250252,-691.094421,38.231274>>, <<-129.437363,-674.255249,46.516178>>, 5.750000)
OR GET_GAME_TIMER() - s_cops_bridge[i].i_timer > 10000
b_checked_first_wave_trigger = TRUE
ENDIF
IF b_trigger_first_wave
IF i = 0
v_pos = <<-114.7722, -681.9135, 39.5162>>
ELIF i = 1
v_pos = <<-108.3075, -679.6312, 39.5162>>
ENDIF
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge[i].ped, v_pos, 2.0)
SET_PED_COMBAT_RANGE(s_cops_bridge[i].ped, CR_NEAR)
SET_COMBAT_FLOAT(s_cops_bridge[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
s_cops_bridge[i].i_timer = GET_GAME_TIMER()
s_cops_bridge[i].i_event++
ENDIF
ELSE
IF NOT b_checked_second_wave_trigger
b_trigger_second_wave = (IS_PED_INJURED(s_cops_bridge[0].ped) AND IS_PED_INJURED(s_cops_bridge[1].ped))
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-104.569275,-683.346069,36.266178>>, <<-129.437363,-674.255249,46.516178>>, 5.750000)
b_checked_second_wave_trigger = TRUE
ENDIF
IF b_trigger_second_wave
IF i = 2
v_pos = <<-125.2105, -678.0999, 39.5162>>
ELIF i = 3
v_pos = <<-118.8595, -676.0781, 39.5162>>
ENDIF
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge[i].ped, v_pos, 2.0)
SET_PED_COMBAT_RANGE(s_cops_bridge[i].ped, CR_NEAR)
SET_COMBAT_FLOAT(s_cops_bridge[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
s_cops_bridge[i].i_timer = GET_GAME_TIMER()
s_cops_bridge[i].i_event++
ENDIF
ENDIF
BREAK
CASE 2 //Once the player reaches the bridge then set the peds to charge.
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-89.297874,-686.501404,42.274471>>, <<6.750000,7.000000,4.750000>>)
OR b_player_got_to_bridge
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge[i].ped, CA_CAN_CHARGE, TRUE)
s_cops_bridge[i].i_timer = GET_GAME_TIMER()
s_cops_bridge[i].i_event++
ENDIF
BREAK
ENDSWITCH
IF s_cops_bridge[i].i_event > 0
UPDATE_AI_PED_BLIP(s_cops_bridge[i].ped, s_cops_bridge[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_cops_bridge[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Two cops flank on the side, they don't have to be killed.
IF NOT s_cops_bridge_flank[0].b_is_created
IF HAS_MODEL_LOADED(model_cop)
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_flank[0].ped)
IF s_cops_under_bridge[0].b_is_created
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-85.121323,-684.696716,41.481277>>, <<-88.585175,-694.255127,45.231049>>, 12.250000)
s_cops_bridge_flank[0].ped = CREATE_ENEMY_PED(model_cop, <<-50.8090, -676.5306, 39.7281>>, 113.7806, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL)
ENDIF
ENDIF
ELIF NOT DOES_ENTITY_EXIST(s_cops_bridge_flank[1].ped)
s_cops_bridge_flank[1].ped = CREATE_ENEMY_PED(model_cop, <<-50.1772, -677.9645, 39.7281>>, 113.7806, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL)
INITIALISE_ENEMY_GROUP(s_cops_bridge_flank, "Flank ")
REPEAT COUNT_OF(s_cops_bridge_flank) i
s_cops_bridge_flank[i].i_timer = GET_GAME_TIMER()
ENDREPEAT
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_bridge_flank) i
IF DOES_ENTITY_EXIST(s_cops_bridge_flank[i].ped)
IF NOT IS_PED_INJURED(s_cops_bridge_flank[i].ped)
SWITCH s_cops_bridge_flank[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_bridge_flank[i].ped, 1, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_flank[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_flank[i].ped, 200.0)
s_cops_bridge_flank[i].i_event = 100
ELSE
IF i = 0
OR (i = 1 AND GET_GAME_TIMER() - s_cops_bridge_flank[i].i_timer > 800)
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge_flank[i].ped, <<-55.7670, -660.6670, 39.7281>>, 5.0, TRUE)
ELIF i = 1
SET_PED_COVER_POINT_AND_SPHERE(s_cops_bridge_flank[i].ped, s_cops_bridge_flank[i].cover, <<-50.8090, -676.5306, 39.7281>>, 117.8575, 5.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_bridge_flank[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_flank[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_flank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_flank[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_CONFIG_FLAG(s_cops_bridge_flank[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
SET_COMBAT_FLOAT(s_cops_bridge_flank[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_flank[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_flank[i].ped, FALSE)
IF i = 0
PLAY_PED_AMBIENT_SPEECH(s_cops_bridge_flank[i].ped, "SURROUNDED", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
s_cops_bridge_flank[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1 //Clean up once the player gets far enough away.
IF s_cops_after_ramp_blockade[0].b_is_created
CLEAN_UP_ENEMY_PED(s_cops_bridge_flank[i])
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_bridge_flank[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Heli attacks the player.
IF NOT s_cops_heli_bridge_2[0].b_is_created
IF s_cops_bridge[0].b_is_created
REQUEST_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE_2, str_carrec)
REQUEST_MODEL(model_cop_heli)
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
AND HAS_MODEL_LOADED(model_cop_heli)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_HELI_BRIDGE_2, str_carrec)
IF NOT DOES_ENTITY_EXIST(veh_cops_heli_bridge_2)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-89.162170,-688.929138,36.935856>>, <<-129.603409,-674.280518,43.516178>>, 7.250000)
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0 AND NOT IS_POINT_VISIBLE(<<-27.3128, -736.0812, 56.3044>>, 5.0))
veh_cops_heli_bridge_2 = CREATE_VEHICLE(model_cop_heli, <<-27.3128, -736.0812, 56.3044>>, 0.0)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
SET_VEHICLE_LIGHTS(veh_cops_heli_bridge_2, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_LIVERY(veh_cops_heli_bridge_2, 0)
SET_VEHICLE_SIREN(veh_cops_heli_bridge_2, TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_heli_bridge_2, TRUE)
SET_VEHICLE_ENGINE_ON(veh_cops_heli_bridge_2, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(veh_cops_heli_bridge_2)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_bridge_2, CARREC_COPS_HELI_BRIDGE_2, str_carrec)
SET_VEHICLE_STRONG(veh_cops_heli_bridge_2, TRUE)
SET_ENTITY_INVINCIBLE(veh_cops_heli_bridge_2, TRUE)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_bridge_2, 4000.0)
f_heli_bridge_2_playback_speed = 1.0
i_time_bridge_heli_blew_up = 0
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_heli_bridge_2[0].ped)
s_cops_heli_bridge_2[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_bridge_2, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL)
SET_PED_CONFIG_FLAG(s_cops_heli_bridge_2[0].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_heli_bridge_2[1].ped)
s_cops_heli_bridge_2[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_bridge_2, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_COMBATMG)
SET_PED_CONFIG_FLAG(s_cops_heli_bridge_2[1].ped, PCF_DontBlipCop, TRUE)
//s_cops_heli_bridge_2[1].blip = CREATE_BLIP_FOR_PED(s_cops_heli_bridge_2[1].ped, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
INITIALISE_ENEMY_GROUP(s_cops_heli_bridge_2, "Heli 2 ")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Handle the chopper
HOVER_HELI_USING_RECORDING(veh_cops_heli_bridge_2, f_heli_bridge_2_playback_speed, 13000.0, 26000.0)
REPEAT COUNT_OF(s_cops_heli_bridge_2) i
IF DOES_ENTITY_EXIST(s_cops_heli_bridge_2[i].ped)
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[i].ped)
SWITCH s_cops_heli_bridge_2[i].i_event
CASE 0
IF i != 0
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_bridge_2)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_bridge_2)
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_heli_bridge_2) > 8500.0
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_heli_bridge_2[i].ped, rel_group_cops)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_heli_bridge_2[i].ped, TRUE)
IF i = 1
SET_PED_COMBAT_PARAMS(s_cops_heli_bridge_2[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SHOOT_RATE(s_cops_heli_bridge_2[i].ped, 100)
TASK_DRIVE_BY(s_cops_heli_bridge_2[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, FALSE, FIRING_PATTERN_FULL_AUTO)
SET_PED_CAN_BE_TARGETTED(s_cops_heli_bridge_2[i].ped, TRUE)
SET_ENTITY_IS_TARGET_PRIORITY(s_cops_heli_bridge_2[i].ped, TRUE)
//GIVE_WEAPON_COMPONENT_TO_PED(s_cops_heli_bridge_2[i].ped, WEAPONTYPE_COMBATMG, WEAPONCOMPONENT_AT_AR_LASR)
ENDIF
s_cops_heli_bridge_2[i].i_event++
ENDIF
ELSE
s_cops_heli_bridge_2[i].i_timer = 0
s_cops_heli_bridge_2[i].i_event = 100
ENDIF
BREAK
CASE 1
IF i != 0
UPDATE_AI_PED_BLIP(s_cops_heli_bridge_2[i].ped, s_cops_heli_bridge_2[i].s_blip_data)
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_heli_bridge_2[i].ped)
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_heli_bridge_2[i])
ENDIF
ENDIF
ENDREPEAT
//If the chopper was blown up then the player says a line.
IF NOT b_has_text_label_triggered[BS2B_DOWN1]
IF i_time_bridge_heli_blew_up != 0
AND GET_GAME_TIMER() - i_time_bridge_heli_blew_up < 3000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNF", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_DOWN1] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNM", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_DOWN1] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Handle the chopper behaviour
IF NOT IS_ENTITY_DEAD(veh_cops_heli_bridge_2)
//If the gunner is injured, the chopper flies off.
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_bridge_2)
IF IS_PED_INJURED(s_cops_heli_bridge_2[1].ped)
IF s_cops_heli_bridge_2[0].i_timer = 0
s_cops_heli_bridge_2[0].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_cops_heli_bridge_2[0].i_timer > 1400
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_bridge_2)
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[0].ped)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_HELI_MISSION(NULL, veh_cops_heli_bridge_2, NULL, NULL, <<29.1, -282.1, 55.0>>, MISSION_GOTO, 30.0, 10.0, -20.0, 55, 10)
TASK_HELI_MISSION(NULL, veh_cops_heli_bridge_2, NULL, NULL, <<685.2, 984.9, 66.0>>, MISSION_GOTO, 30.0, 10.0, -26.0, 50, 20)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_cops_heli_bridge_2[0].ped, seq)
SET_PED_KEEP_TASK(s_cops_heli_bridge_2[0].ped, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
//Cleanup if the chopper flies off.
IF VDIST2(GET_ENTITY_COORDS(veh_cops_heli_bridge_2), v_player_pos) > 90000.0
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_bridge_2)
REMOVE_VEHICLE(veh_cops_heli_bridge_2)
ENDIF
ENDIF
//Spin the chopper out if shot enough.
IF NOT IS_ENTITY_DEAD(veh_cops_heli_bridge_2)
IF s_cops_heli_bridge_2[0].i_event = 100
IF IS_PED_INJURED(s_cops_heli_bridge_2[0].ped)
OR GET_ENTITY_HEALTH(veh_cops_heli_bridge_2) < 700
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_bridge_2) < 700
OR GET_VEHICLE_ENGINE_HEALTH(veh_cops_heli_bridge_2) < 700
OR IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_heli_bridge_2, <<0.0, 5.0, -5.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_heli_bridge_2, <<0.0, -5.0, 5.0>>), 8.0)
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[0].ped)
SET_ENTITY_HEALTH(s_cops_heli_bridge_2[0].ped, 0)
ENDIF
SET_ENTITY_HEALTH(veh_cops_heli_bridge_2, 1000)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_bridge_2)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_bridge_2)
ENDIF
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_bridge_2, -200.0)
REPLAY_RECORD_BACK_FOR_TIME(2.5)
i_time_bridge_heli_blew_up = GET_GAME_TIMER()
s_cops_heli_bridge_2[0].i_timer = GET_GAME_TIMER()
s_cops_heli_bridge_2[0].i_event++
ENDIF
ELIF s_cops_heli_bridge_2[0].i_event = 101
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_bridge_2, -200.0)
IF GET_GAME_TIMER() - s_cops_heli_bridge_2[0].i_timer < 2000
APPLY_FORCE_TO_ENTITY(veh_cops_heli_bridge_2, APPLY_TYPE_FORCE, <<5.0, 20.0, 5.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
APPLY_FORCE_TO_ENTITY(veh_cops_heli_bridge_2, APPLY_TYPE_FORCE, <<4.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
ELSE
SET_ENTITY_INVINCIBLE(veh_cops_heli_bridge_2, FALSE)
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_heli_bridge_2)
s_cops_heli_bridge_2[0].i_event++
ENDIF
ENDIF
ENDIF
ELIF DOES_ENTITY_EXIST(veh_cops_heli_bridge_2)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_bridge_2)
REMOVE_VEHICLE(veh_cops_heli_bridge_2)
ENDIF
ENDIF
//Cop cars on either side of the bridge
IF NOT s_cops_under_bridge[COUNT_OF(s_cops_under_bridge) - 1].b_is_created
IF e_mission_stage > STAGE_LEAVE_BANK
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_1, str_carrec)
//REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_2, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_3, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_4, str_carrec)
//REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_5, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_6, str_carrec)
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
IF HAS_MODEL_LOADED(model_cop)
AND HAS_MODEL_LOADED(model_cop_car)
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_1, str_carrec)
//AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_2, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_3, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_4, str_carrec)
//AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_5, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_6, str_carrec)
//Once the first cop is created there's no need to check the locates any more.
BOOL b_safe_to_create
BOOL b_create_car_straight_away = TRUE
IF s_cops_under_bridge[0].b_is_created
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.310922,-656.394409,38.490685>>, <<-9.158315,-654.127136,43.241711>>, 8.000000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-91.535706,-692.756287,40.349461>>, <<-79.282700,-697.252563,52.476322>>, 19.500000)
OR (s_cops_pillars_end[0].i_event > 0 AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-80.311104,-701.220520,43.460842>>, <<-78.256950,-701.993347,46.785755>>, 3.250000))
b_safe_to_create = TRUE
ENDIF
IF b_safe_to_create
OR b_create_car_straight_away
//Create vehicles: only create one per frame.
REPEAT COUNT_OF(veh_bridge_cops) i
IF b_safe_to_create
OR (b_create_car_straight_away AND i = 3)
IF NOT b_created_vehicle_this_frame
AND NOT DOES_ENTITY_EXIST(veh_bridge_cops[i])
SWITCH i
CASE 0
veh_bridge_cops[i] = CREATE_VEHICLE(model_cop_car, <<-174.2081, -649.0671, 31.9570>>, 0.0)
BREAK
CASE 1
veh_bridge_cops[i] = CREATE_VEHICLE(model_cop_car, <<-28.9355, -549.4929, 39.2717>>, 0.0)
BREAK
CASE 2
veh_bridge_cops[i] = CREATE_VEHICLE(model_cop_car, <<-233.6112, -716.5612, 33.2955>>, 0.0)
BREAK
CASE 3
veh_bridge_cops[i] = CREATE_VEHICLE(model_cop_car, <<-78.5712, -676.5475, 34.3735>>, 0.0)
BREAK
ENDSWITCH
SET_VEHICLE_ENGINE_ON(veh_bridge_cops[i], TRUE, TRUE)
SET_VEHICLE_LIGHTS(veh_bridge_cops[i], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_bridge_cops[i], TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_bridge_cops[i], TRUE)
b_created_vehicle_this_frame = TRUE
ENDIF
ENDIF
ENDREPEAT
//Create peds inside the vehicles (only create one per frame).
IF b_safe_to_create
REPEAT COUNT_OF(s_cops_under_bridge) i
INT i_carrec = 0
FLOAT f_playback_speed = 1.0
INT i_car_index = 0
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
IF NOT b_created_ped_this_frame
AND NOT s_cops_under_bridge[i].b_is_created
SWITCH i
CASE 0
i_car_index = 0
e_vehicle_seat = VS_DRIVER
i_carrec = CARREC_COPS_BRIDGE_1
f_playback_speed = 0.8
BREAK
CASE 1
i_car_index = 1
e_vehicle_seat = VS_DRIVER
i_carrec = CARREC_COPS_BRIDGE_3
f_playback_speed = 0.8
BREAK
CASE 2
i_car_index = 2
e_vehicle_seat = VS_DRIVER
i_carrec = CARREC_COPS_BRIDGE_4
f_playback_speed = 0.95
BREAK
CASE 3
i_car_index = 3
e_vehicle_seat = VS_DRIVER
i_carrec = CARREC_COPS_BRIDGE_6
f_playback_speed = 0.8
BREAK
ENDSWITCH
IF NOT IS_ENTITY_DEAD(veh_bridge_cops[i_car_index])
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_bridge_cops[i_car_index])
START_PLAYBACK_RECORDED_VEHICLE(veh_bridge_cops[i_car_index], i_carrec, str_carrec)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_bridge_cops[i_car_index])
SET_PLAYBACK_SPEED(veh_bridge_cops[i_car_index], f_playback_speed)
ENDIF
s_cops_under_bridge[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_bridge_cops[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
SET_PED_INTO_VEHICLE(s_cops_under_bridge[i].ped, veh_bridge_cops[i_car_index], e_vehicle_seat)
INITIALISE_ENEMY_PED(s_cops_under_bridge[i], "Blockade ", i)
b_created_ped_this_frame = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_under_bridge) i
IF DOES_ENTITY_EXIST(s_cops_under_bridge[i].ped)
IF NOT IS_PED_INJURED(s_cops_under_bridge[i].ped)
SWITCH s_cops_under_bridge[i].i_event
CASE 0 //Wait for the car to stop.
IF IS_PED_IN_ANY_VEHICLE(s_cops_under_bridge[i].ped)
VEHICLE_INDEX veh
veh = GET_VEHICLE_PED_IS_IN(s_cops_under_bridge[i].ped)
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_SPEED(veh) < 0.5
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
s_cops_under_bridge[i].i_timer = GET_GAME_TIMER()
s_cops_under_bridge[i].i_event++
ENDIF
ELSE
s_cops_under_bridge[i].i_timer = GET_GAME_TIMER()
s_cops_under_bridge[i].i_event++
ENDIF
ELSE
s_cops_under_bridge[i].i_timer = GET_GAME_TIMER()
s_cops_under_bridge[i].i_event++
ENDIF
BREAK
CASE 1 //Get out and fight.
SET_PED_COMBAT_PARAMS(s_cops_under_bridge[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SEEING_RANGE(s_cops_under_bridge[i].ped, 150.0)
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_under_bridge[i].ped, GET_ENTITY_COORDS(s_cops_under_bridge[i].ped) - <<0.0, 0.0, 1.0>>, 7.0, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_under_bridge[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_under_bridge[i].ped, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_under_bridge[i].ped, CA_WILL_DRAG_INJURED_PEDS_TO_SAFETY, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_under_bridge[i].ped, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_under_bridge[i].ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
SET_COMBAT_FLOAT(s_cops_under_bridge[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
SET_PED_ALERTNESS(s_cops_under_bridge[i].ped, AS_MUST_GO_TO_COMBAT)
SET_PED_CONFIG_FLAG(s_cops_under_bridge[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
SET_PED_DIES_WHEN_INJURED(s_cops_under_bridge[i].ped, FALSE) //Normally this is TRUE, but we want these guys to get dragged around.
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_under_bridge[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_under_bridge[i].ped, FALSE)
SET_PED_KEEP_TASK(s_cops_under_bridge[i].ped, TRUE)
s_cops_under_bridge[i].i_event++
BREAK
CASE 2 //Once the player is far enough away from these cops clean them up.
IF s_cops_after_ramp_blockade[0].i_event > 0
OR (s_cops_after_ramp_blockade[0].b_is_created AND IS_PED_INJURED(s_cops_after_ramp_blockade[0].ped))
CLEAN_UP_ENEMY_PED(s_cops_under_bridge[i])
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_under_bridge[i])
ENDIF
ENDIF
ENDREPEAT
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
REPEAT COUNT_OF(veh_bridge_cops) i
//DO_VEHICLE_DAMAGE_WHEN_SHOT(veh_bridge_cops[i])
IF s_cops_after_ramp_blockade[0].i_event > 0
OR (s_cops_after_ramp_blockade[0].b_is_created AND IS_PED_INJURED(s_cops_after_ramp_blockade[0].ped))
REMOVE_VEHICLE(veh_bridge_cops[i])
ENDIF
//Blow up one of the cars if the player shoots it
IF i = 4
IF IS_VEHICLE_DRIVEABLE(veh_bridge_cops[i])
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(veh_bridge_cops[i], PLAYER_PED_ID())
IF GET_ENTITY_HEALTH(veh_bridge_cops[i]) < 800
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_bridge_cops[i]) < 800
OR GET_VEHICLE_ENGINE_HEALTH(veh_bridge_cops[i]) < 800
SET_VEHICLE_PETROL_TANK_HEALTH(veh_bridge_cops[i], -100)
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
//More cops arrive as the player crosses the bridge.
IF NOT s_cops_bridge_2[0].b_is_created
IF e_mission_stage > STAGE_LEAVE_BANK
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_2[0].ped)
IF ARE_PEDS_AT_COORD(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, <<-116.736267,-678.848328,40.266178>>,<<12.500000,15.750000,6.250000>>)
s_cops_bridge_2[0].ped = CREATE_ENEMY_PED(model_swat, <<-127.3615, -654.2029, 41.8522>>, 340.3756, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge_2[0].ped, PCF_DontBlipCop, TRUE)
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_2[1].ped)
s_cops_bridge_2[1].ped = CREATE_ENEMY_PED(model_swat, <<-127.9446, -655.8145, 42.0630>>, 340.6406, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge_2[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_bridge_2[2].ped)
s_cops_bridge_2[2].ped = CREATE_ENEMY_PED(model_swat, <<-128.5191, -657.4022, 42.9372>>, 340.6406, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_bridge_2[2].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_bridge_2, "Bridge 2 ")
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_bridge_2) i
IF DOES_ENTITY_EXIST(s_cops_bridge_2[i].ped)
IF NOT IS_PED_INJURED(s_cops_bridge_2[i].ped)
SWITCH s_cops_bridge_2[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_bridge_2[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_2[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_2[i].ped, 200.0)
s_cops_bridge_2[i].i_event = 100
ELSE
IF i = 0
v_pos = <<-131.4433, -676.8610, 39.4974>>
ELIF i = 1
v_pos = <<-129.3374, -671.1276, 39.5026>>
ELIF i = 2
v_pos = <<-126.9097, -664.9212, 39.5048>>
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_bridge_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge_2[i].ped, v_pos, 2.0)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_2[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_2[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(s_cops_bridge_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_2[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_2[i].ped, FALSE)
IF i = 0
PLAY_PED_AMBIENT_SPEECH(s_cops_bridge_2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
s_cops_bridge_2[i].i_timer = GET_GAME_TIMER()
s_cops_bridge_2[i].i_event++
ENDIF
BREAK
ENDSWITCH
IF s_cops_bridge_2[i].i_event > 0
UPDATE_AI_PED_BLIP(s_cops_bridge_2[i].ped, s_cops_bridge_2[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_cops_bridge_2[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Cops run up the ramp after crossing the bridge.
IF NOT s_cops_after_bridge[0].b_is_created
IF NOT DOES_ENTITY_EXIST(s_cops_after_bridge[0].ped)
IF s_cops_heli_bridge_2[0].i_event > 0
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
AND ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped,
<<-221.509293,-640.804016,71.972031>>, <<-124.449242,-676.107483,28.016178>>, 120.000000)
s_cops_after_bridge[0].ped = CREATE_ENEMY_PED(model_swat, <<-181.1778, -663.5786, 37.7780>>, 248.2368, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_after_bridge[0].ped, PCF_DontBlipCop, TRUE)
ENDIF
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_after_bridge[1].ped)
s_cops_after_bridge[1].ped = CREATE_ENEMY_PED(model_swat, <<-182.4772, -663.4427, 37.3071>>, 245.7573, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_after_bridge[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_after_bridge[2].ped)
s_cops_after_bridge[2].ped = CREATE_ENEMY_PED(model_swat, <<-211.9646, -650.1057, 39.4888>>, 246.6968, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_after_bridge[2].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_after_bridge, "Ramp ")
ENDIF
ENDIF
ELSE
BOOL b_time_to_trigger = FALSE
BOOL b_checked_trigger = FALSE
REPEAT COUNT_OF(s_cops_after_bridge) i
IF DOES_ENTITY_EXIST(s_cops_after_bridge[i].ped)
IF NOT IS_PED_INJURED(s_cops_after_bridge[i].ped)
SWITCH s_cops_after_bridge[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_after_bridge[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_bridge[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_bridge[i].ped, 200.0)
s_cops_after_bridge[i].i_event = 100
ELSE
//Only run the angled area check once, as all the peds in this group are triggered off the same check.
IF NOT b_time_to_trigger
AND NOT b_checked_trigger
b_time_to_trigger = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy],
<<-221.509293,-640.804016,71.972031>>, <<-124.449242,-676.107483,28.016178>>, 120.000000)
b_checked_trigger = TRUE
ENDIF
IF b_time_to_trigger
IF i = 0
v_pos = <<-165.4060, -667.7348, 39.4761>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_after_bridge[i].ped, s_cops_after_bridge[i].cover, v_pos, 246.9576, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 1
v_pos = <<-167.0893, -663.7800, 39.4888>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_after_bridge[i].ped, s_cops_after_bridge[i].cover, v_pos, 247.3722, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
ELSE
v_pos = <<-173.4099, -663.5237, 39.4843>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_after_bridge[i].ped, v_pos, 2.0, TRUE)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_after_bridge[i].ped, rel_group_cops)
SET_PED_COMBAT_PARAMS(s_cops_after_bridge[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_bridge[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_COMBAT_FLOAT(s_cops_after_bridge[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_bridge[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_bridge[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_bridge[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_after_bridge[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
IF i = 1
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(s_cops_after_bridge[i].ped, TRUE)
ELIF i = 0
PLAY_PED_AMBIENT_SPEECH(s_cops_after_bridge[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
s_cops_after_bridge[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1 //Set to can charge once the buddies arrive (or the player gets close).
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
IF VDIST2(GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped), <<-150.2, -673.3, 40.0>>) < 25.0
OR VDIST2(v_player_pos, GET_ENTITY_COORDS(s_cops_after_bridge[i].ped)) < 25.0
//SET_PED_COMBAT_ATTRIBUTES(s_cops_after_bridge[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(s_cops_after_bridge[i].ped, CA_CAN_CHARGE, TRUE)
s_cops_after_bridge[i].i_event++
ENDIF
ENDIF
BREAK
ENDSWITCH
IF s_cops_after_bridge[i].i_event > 0
UPDATE_AI_PED_BLIP(s_cops_after_bridge[i].ped, s_cops_after_bridge[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_cops_after_bridge[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Another heli arrives after the bridge: tracks the crew until shot down.
IF NOT s_cops_heli_ramp[0].b_is_created
IF s_cops_after_bridge[0].b_is_created
REQUEST_VEHICLE_RECORDING(CARREC_COPS_HELI_RAMP, str_carrec)
REQUEST_MODEL(model_cop_heli)
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
AND HAS_MODEL_LOADED(model_cop_heli)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_HELI_RAMP, str_carrec)
IF NOT DOES_ENTITY_EXIST(veh_cops_heli_ramp)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-151.240479,-672.489746,24.737293>>, <<-195.994110,-655.863098,80.738068>>, 119.250000)
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0 AND NOT IS_POINT_VISIBLE(<<-126.5, -674.0, 546.8>>, 5.0))
veh_cops_heli_ramp = CREATE_VEHICLE(model_cop_heli, <<-27.3128, -736.0812, 56.3044>>, 0.0)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
SET_VEHICLE_LIGHTS(veh_cops_heli_ramp, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_LIVERY(veh_cops_heli_ramp, 0)
SET_VEHICLE_SIREN(veh_cops_heli_ramp, TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_heli_ramp, TRUE)
SET_VEHICLE_ENGINE_ON(veh_cops_heli_ramp, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(veh_cops_heli_ramp)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_ramp, CARREC_COPS_HELI_RAMP, str_carrec)
SET_VEHICLE_STRONG(veh_cops_heli_ramp, TRUE)
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, TRUE)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_ramp, 5000.0)
f_heli_ramp_playback_speed = 1.0
i_time_ramp_heli_blew_up = 0
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_heli_ramp[0].ped)
s_cops_heli_ramp[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_ramp, VS_DRIVER, rel_group_cops, 300, 0, WEAPONTYPE_PISTOL)
SET_PED_CONFIG_FLAG(s_cops_heli_ramp[0].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_heli_ramp[1].ped)
s_cops_heli_ramp[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_ramp, VS_BACK_RIGHT, rel_group_cops, 300, 0, WEAPONTYPE_COMBATMG)
SET_PED_CONFIG_FLAG(s_cops_heli_ramp[1].ped, PCF_DontBlipCop, TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(s_cops_heli_ramp[1].ped, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_heli_ramp[2].ped)
s_cops_heli_ramp[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_ramp, VS_BACK_LEFT, rel_group_cops, 300, 0, WEAPONTYPE_COMBATMG)
SET_PED_CONFIG_FLAG(s_cops_heli_ramp[2].ped, PCF_DontBlipCop, TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(s_cops_heli_ramp[2].ped, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
INITIALISE_ENEMY_GROUP(s_cops_heli_ramp, "Heli ramp ")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_heli_ramp) i
IF DOES_ENTITY_EXIST(s_cops_heli_ramp[i].ped)
IF NOT IS_PED_INJURED(s_cops_heli_ramp[i].ped)
SWITCH s_cops_heli_ramp[i].i_event
CASE 0
IF i = 0
//Hover the recording until the player and crew progress closer to the stairs.
HOVER_HELI_USING_RECORDING(veh_cops_heli_ramp, f_heli_ramp_playback_speed, 16000.0, 24000.0)
IF ARE_PEDS_AT_COORD(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, <<-203.768814,-653.964172,38.738064>>,<<18.500000,8.750000,6.000000>>)
s_cops_heli_ramp[i].i_timer = 0
s_cops_heli_ramp[i].i_event++
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_ramp)
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_heli_ramp) > 8500.0
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_heli_ramp[i].ped, rel_group_cops)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_heli_ramp[i].ped, TRUE)
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(veh_cops_heli_ramp, TRUE)
IF i = 1
SET_PED_COMBAT_PARAMS(s_cops_heli_ramp[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SHOOT_RATE(s_cops_heli_ramp[i].ped, 100)
TASK_DRIVE_BY(s_cops_heli_ramp[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, FALSE, FIRING_PATTERN_FULL_AUTO)
SET_PED_CAN_BE_TARGETTED(s_cops_heli_ramp[i].ped, TRUE)
SET_ENTITY_IS_TARGET_PRIORITY(s_cops_heli_ramp[i].ped, TRUE)
//GIVE_WEAPON_COMPONENT_TO_PED(s_cops_heli_ramp[i].ped, WEAPONTYPE_COMBATMG, WEAPONCOMPONENT_AT_AR_LASR)
ENDIF
b_ramp_heli_is_active = TRUE
s_cops_heli_ramp[i].i_timer = 0
s_cops_heli_ramp[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1
IF i = 0
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_ramp)
IF GET_TIME_POSITION_IN_RECORDING(veh_cops_heli_ramp) < 23500.0
CONVERGE_VALUE(f_heli_ramp_playback_speed, 1.5, 1.0, TRUE)
SET_PLAYBACK_SPEED(veh_cops_heli_ramp, f_heli_ramp_playback_speed)
ELSE
HOVER_HELI_USING_RECORDING(veh_cops_heli_ramp, f_heli_ramp_playback_speed, 33000.0, 38000.0)
ENDIF
ENDIF
ENDIF
ELSE
IF i = 2
IF IS_PED_INJURED(s_cops_heli_ramp[1].ped)
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
IF GET_PED_IN_VEHICLE_SEAT(veh_cops_heli_ramp, VS_BACK_RIGHT) != s_cops_heli_ramp[i].ped
IF IS_PED_IN_VEHICLE(s_cops_heli_ramp[i].ped, veh_cops_heli_ramp)
IF GET_SCRIPT_TASK_STATUS(s_cops_heli_ramp[i].ped, SCRIPT_TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT) != PERFORMING_TASK
TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT(s_cops_heli_ramp[i].ped, veh_cops_heli_ramp)
ENDIF
ENDIF
ELSE
s_cops_heli_ramp[i].i_timer = GET_GAME_TIMER()
s_cops_heli_ramp[i].i_event++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF i = 2
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
IF GET_SCRIPT_TASK_STATUS(s_cops_heli_ramp[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
SET_PED_COMBAT_PARAMS(s_cops_heli_ramp[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SHOOT_RATE(s_cops_heli_ramp[i].ped, 100)
TASK_DRIVE_BY(s_cops_heli_ramp[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, FALSE, FIRING_PATTERN_FULL_AUTO)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF i != 0
AND s_cops_heli_ramp[i].i_event > 0
UPDATE_AI_PED_BLIP(s_cops_heli_ramp[i].ped, s_cops_heli_ramp[i].s_blip_data)
ENDIF
ELSE
CLEAN_UP_ENEMY_PED(s_cops_heli_ramp[i])
ENDIF
ENDIF
ENDREPEAT
//If the chopper was blown up before the peds got out then the player says a line.
IF NOT b_has_text_label_triggered[BS2B_DOWN2]
IF i_time_ramp_heli_blew_up != 0
AND GET_GAME_TIMER() - i_time_ramp_heli_blew_up < 3000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DOWN2] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DOWN2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Handle the chopper behaviour
IF NOT IS_ENTITY_DEAD(veh_cops_heli_ramp)
//If the gunner is injured, the chopper flies off.
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_ramp)
IF IS_PED_INJURED(s_cops_heli_ramp[1].ped)
AND IS_PED_INJURED(s_cops_heli_ramp[2].ped)
IF s_cops_heli_ramp[0].i_timer = 0
s_cops_heli_ramp[0].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0, 500)
ELIF GET_GAME_TIMER() - s_cops_heli_ramp[0].i_timer > 2500
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_ramp)
IF NOT IS_PED_INJURED(s_cops_heli_ramp[0].ped)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_HELI_MISSION(NULL, veh_cops_heli_ramp, NULL, NULL, <<-712.7, -654.7, 50.1>>, MISSION_GOTO, 30.0, 10.0, -20.0, 15, 10)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_cops_heli_ramp[0].ped, seq)
SET_PED_KEEP_TASK(s_cops_heli_ramp[0].ped, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
//Cleanup if the chopper flies off.
IF VDIST2(GET_ENTITY_COORDS(veh_cops_heli_ramp), v_player_pos) > 90000.0
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_ramp)
REMOVE_VEHICLE(veh_cops_heli_ramp)
ENDIF
ENDIF
//Spin the chopper out if shot enough.
IF NOT IS_ENTITY_DEAD(veh_cops_heli_ramp)
IF s_cops_heli_ramp[0].i_event < 100
BOOL b_hit_by_explosion = IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_heli_ramp, <<0.0, 5.0, -5.0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_heli_ramp, <<0.0, -5.0, 5.0>>), 8.0)
IF IS_PED_INJURED(s_cops_heli_ramp[0].ped)
OR GET_ENTITY_HEALTH(veh_cops_heli_ramp) < 600
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_ramp) < 600
OR GET_VEHICLE_ENGINE_HEALTH(veh_cops_heli_ramp) < 600
OR b_hit_by_explosion
IF NOT IS_PED_INJURED(s_cops_heli_ramp[0].ped)
SET_ENTITY_HEALTH(s_cops_heli_ramp[0].ped, 0)
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_ramp)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_ramp)
ENDIF
IF b_hit_by_explosion
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_ramp, -300.0)
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, FALSE)
SET_ENTITY_HEALTH(veh_cops_heli_ramp, 0)
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_heli_ramp)
EXPLODE_VEHICLE(veh_cops_heli_ramp, TRUE)
s_cops_heli_ramp[0].i_event = 101
ELSE
SET_ENTITY_HEALTH(veh_cops_heli_ramp, 1000)
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, TRUE)
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_ramp, -200.0)
s_cops_heli_ramp[0].i_timer = GET_GAME_TIMER()
s_cops_heli_ramp[0].i_event = 100
ENDIF
//Record footage of the chopper blowing up.
REPLAY_RECORD_BACK_FOR_TIME(2.5)
i_time_ramp_heli_blew_up = GET_GAME_TIMER()
ENDIF
ELIF s_cops_heli_ramp[0].i_event = 100
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_ramp, -200.0)
IF GET_GAME_TIMER() - s_cops_heli_ramp[0].i_timer < 1500
APPLY_FORCE_TO_ENTITY(veh_cops_heli_ramp, APPLY_TYPE_FORCE, <<-15.0, -8.0, 5.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
APPLY_FORCE_TO_ENTITY(veh_cops_heli_ramp, APPLY_TYPE_FORCE, <<4.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
ELSE
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, FALSE)
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_heli_ramp)
s_cops_heli_ramp[0].i_event++
ENDIF
ENDIF
ENDIF
ELIF DOES_ENTITY_EXIST(veh_cops_heli_ramp)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_ramp)
REMOVE_VEHICLE(veh_cops_heli_ramp)
ENDIF
ENDIF
//Cops form a blockade ahead of the ramp.
IF NOT s_cops_after_ramp_blockade[COUNT_OF(s_cops_after_ramp_blockade) - 1].b_is_created
IF s_cops_after_bridge[0].b_is_created
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_1, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_2, str_carrec)
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
IF HAS_MODEL_LOADED(model_cop)
AND HAS_MODEL_LOADED(model_cop_car)
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BLOCKADE_1, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BLOCKADE_2, str_carrec)
IF s_cops_after_ramp_blockade[0].b_is_created //Once the first cop is created there's no need to check the locates any more.
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-151.013657,-641.056641,62.759335>>, <<-182.292191,-724.088806,28.454020>>, 13.500000)
//Create vehicles: only create one per frame.
REPEAT COUNT_OF(veh_cops_after_ramp_blockade) i
INT i_carrec = 0
FLOAT f_playback_speed = 1.0
FLOAT f_playback_time = 0.0
IF NOT b_created_vehicle_this_frame
AND NOT DOES_ENTITY_EXIST(veh_cops_after_ramp_blockade[i])
SWITCH i
CASE 0
veh_cops_after_ramp_blockade[i] = CREATE_VEHICLE(model_cop_car, <<-174.2081, -649.0671, 31.9570>>, 0.0)
i_carrec = CARREC_COPS_BLOCKADE_1
f_playback_speed = 0.95
f_playback_time = 2000.0
BREAK
CASE 1
veh_cops_after_ramp_blockade[i] = CREATE_VEHICLE(model_cop_car, <<-176.1406, -641.4283, 32.1534>>, 0.0)
i_carrec = CARREC_COPS_BLOCKADE_2
f_playback_speed = 0.95
f_playback_time = 2000.0
BREAK
ENDSWITCH
SET_VEHICLE_ENGINE_ON(veh_cops_after_ramp_blockade[i], TRUE, TRUE)
SET_VEHICLE_LIGHTS(veh_cops_after_ramp_blockade[i], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_cops_after_ramp_blockade[i], TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_after_ramp_blockade[i], TRUE)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_after_ramp_blockade[i], i_carrec, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_after_ramp_blockade[i], f_playback_time)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_after_ramp_blockade[i])
SET_PLAYBACK_SPEED(veh_cops_after_ramp_blockade[i], f_playback_speed)
b_created_vehicle_this_frame = TRUE
ENDIF
ENDREPEAT
//Create peds inside the vehicles (only create one per frame).
REPEAT COUNT_OF(s_cops_after_ramp_blockade) i
INT i_car_index = 0
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
IF NOT b_created_ped_this_frame
AND NOT s_cops_after_ramp_blockade[i].b_is_created
SWITCH i
CASE 0
i_car_index = 0
e_vehicle_seat = VS_DRIVER
BREAK
CASE 1
i_car_index = 0
e_vehicle_seat = VS_FRONT_RIGHT
BREAK
CASE 2
i_car_index = 1
e_vehicle_seat = VS_DRIVER
BREAK
CASE 3
i_car_index = 1
e_vehicle_seat = VS_FRONT_RIGHT
BREAK
ENDSWITCH
IF NOT IS_ENTITY_DEAD(veh_cops_after_ramp_blockade[i_car_index])
s_cops_after_ramp_blockade[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_cops_after_ramp_blockade[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
SET_PED_INTO_VEHICLE(s_cops_after_ramp_blockade[i].ped, veh_cops_after_ramp_blockade[i_car_index], e_vehicle_seat)
INITIALISE_ENEMY_PED(s_cops_after_ramp_blockade[i], "RampB ", i)
b_created_ped_this_frame = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_after_ramp_blockade) i
IF DOES_ENTITY_EXIST(s_cops_after_ramp_blockade[i].ped)
IF NOT IS_PED_INJURED(s_cops_after_ramp_blockade[i].ped)
SWITCH s_cops_after_ramp_blockade[i].i_event
CASE 0 //Wait for the car to stop.
IF IS_PED_IN_ANY_VEHICLE(s_cops_after_ramp_blockade[i].ped)
VEHICLE_INDEX veh
veh = GET_VEHICLE_PED_IS_IN(s_cops_after_ramp_blockade[i].ped)
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_SPEED(veh) < 0.5
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
s_cops_after_ramp_blockade[i].i_timer = GET_GAME_TIMER()
s_cops_after_ramp_blockade[i].i_event++
ENDIF
ELSE
s_cops_after_ramp_blockade[i].i_timer = GET_GAME_TIMER()
s_cops_after_ramp_blockade[i].i_event++
ENDIF
ELSE
s_cops_after_ramp_blockade[i].i_timer = GET_GAME_TIMER()
s_cops_after_ramp_blockade[i].i_event++
ENDIF
BREAK
CASE 1 //Get out and fight.
SET_PED_COMBAT_PARAMS(s_cops_after_ramp_blockade[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_after_ramp_blockade[i].ped, GET_ENTITY_COORDS(s_cops_after_ramp_blockade[i].ped) - <<0.0, 0.0, 1.0>>, 5.0, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_after_ramp_blockade[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_ramp_blockade[i].ped, CA_USE_VEHICLE, FALSE)
SET_PED_CONFIG_FLAG(s_cops_after_ramp_blockade[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_ramp_blockade[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_ramp_blockade[i].ped, FALSE)
s_cops_after_ramp_blockade[i].i_event++
BREAK
CASE 2 //Once the player is far enough away from these cops clean them up.
IF s_cops_courtyard_2[0].i_event > 0
OR (s_cops_courtyard_2[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
CLEAN_UP_ENEMY_PED(s_cops_after_ramp_blockade[i])
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_after_ramp_blockade[i])
ENDIF
ENDIF
ENDREPEAT
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
REPEAT COUNT_OF(veh_cops_after_ramp_blockade) i
//DO_VEHICLE_DAMAGE_WHEN_SHOT(veh_cops_after_ramp_blockade[i])
IF s_cops_courtyard_2[0].i_event > 0
OR (s_cops_courtyard_2[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
REMOVE_VEHICLE(veh_cops_after_ramp_blockade[i])
ENDIF
ENDREPEAT
ENDIF
//Second blockade arrives after the ramp.
IF NOT s_cops_after_ramp_blockade_2[COUNT_OF(s_cops_after_ramp_blockade_2) - 1].b_is_created
IF s_cops_after_bridge[0].b_is_created
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_3, str_carrec)
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
IF HAS_MODEL_LOADED(model_cop)
AND HAS_MODEL_LOADED(model_cop_car)
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BLOCKADE_3, str_carrec)
IF s_cops_after_ramp_blockade_2[0].b_is_created //Once the first cop is created there's no need to check the locates any more.
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-172.374329,-594.539063,63.220547>>, <<-214.174149,-716.375549,31.956020>>, 13.500000)
//Create vehicles: only create one per frame.
REPEAT COUNT_OF(veh_cops_after_ramp_blockade_2) i
INT i_carrec = 0
FLOAT f_playback_speed = 1.0
FLOAT f_playback_start_time = 0.0
IF NOT b_created_vehicle_this_frame
AND NOT DOES_ENTITY_EXIST(veh_cops_after_ramp_blockade_2[i])
SWITCH i
CASE 0
veh_cops_after_ramp_blockade_2[i] = CREATE_VEHICLE(model_cop_car, <<-350.7944, -730.3459, 33.7211>>, -15.8839)
i_carrec = CARREC_COPS_BLOCKADE_3
f_playback_speed = 1.0
f_playback_start_time = 2000.0
BREAK
ENDSWITCH
SET_VEHICLE_ENGINE_ON(veh_cops_after_ramp_blockade_2[i], TRUE, TRUE)
SET_VEHICLE_LIGHTS(veh_cops_after_ramp_blockade_2[i], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_cops_after_ramp_blockade_2[i], TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_after_ramp_blockade_2[i], TRUE)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_after_ramp_blockade_2[i], i_carrec, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_after_ramp_blockade_2[i], f_playback_start_time)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_after_ramp_blockade_2[i])
SET_PLAYBACK_SPEED(veh_cops_after_ramp_blockade_2[i], f_playback_speed)
b_created_vehicle_this_frame = TRUE
ENDIF
ENDREPEAT
//Create peds inside the vehicles (only create one per frame).
REPEAT COUNT_OF(s_cops_after_ramp_blockade_2) i
INT i_car_index = 0
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
IF NOT b_created_ped_this_frame
AND NOT s_cops_after_ramp_blockade_2[i].b_is_created
SWITCH i
CASE 0
i_car_index = 0
e_vehicle_seat = VS_DRIVER
BREAK
CASE 1
i_car_index = 0
e_vehicle_seat = VS_FRONT_RIGHT
BREAK
ENDSWITCH
IF NOT IS_ENTITY_DEAD(veh_cops_after_ramp_blockade_2[i_car_index])
s_cops_after_ramp_blockade_2[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_cops_after_ramp_blockade_2[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
SET_PED_INTO_VEHICLE(s_cops_after_ramp_blockade_2[i].ped, veh_cops_after_ramp_blockade_2[i_car_index], e_vehicle_seat)
INITIALISE_ENEMY_PED(s_cops_after_ramp_blockade_2[i], "RampC ", i)
b_created_ped_this_frame = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_after_ramp_blockade_2) i
IF DOES_ENTITY_EXIST(s_cops_after_ramp_blockade_2[i].ped)
IF NOT IS_PED_INJURED(s_cops_after_ramp_blockade_2[i].ped)
SWITCH s_cops_after_ramp_blockade_2[i].i_event
CASE 0 //Wait for the car to stop.
IF IS_PED_IN_ANY_VEHICLE(s_cops_after_ramp_blockade_2[i].ped)
VEHICLE_INDEX veh
veh = GET_VEHICLE_PED_IS_IN(s_cops_after_ramp_blockade_2[i].ped)
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_SPEED(veh) < 0.5
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
s_cops_after_ramp_blockade_2[i].i_timer = GET_GAME_TIMER()
s_cops_after_ramp_blockade_2[i].i_event++
ENDIF
ELSE
s_cops_after_ramp_blockade_2[i].i_timer = GET_GAME_TIMER()
s_cops_after_ramp_blockade_2[i].i_event++
ENDIF
ELSE
s_cops_after_ramp_blockade_2[i].i_timer = GET_GAME_TIMER()
s_cops_after_ramp_blockade_2[i].i_event++
ENDIF
BREAK
CASE 1 //Get out and fight.
SET_PED_COMBAT_PARAMS(s_cops_after_ramp_blockade_2[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_after_ramp_blockade_2[i].ped, GET_ENTITY_COORDS(s_cops_after_ramp_blockade_2[i].ped) - <<0.0, 0.0, 1.0>>, 10.0, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_after_ramp_blockade_2[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_ramp_blockade_2[i].ped, CA_USE_VEHICLE, FALSE)
SET_PED_CONFIG_FLAG(s_cops_after_ramp_blockade_2[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_ramp_blockade_2[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_ramp_blockade_2[i].ped, FALSE)
s_cops_after_ramp_blockade_2[i].i_event++
BREAK
CASE 2 //Once the player is far enough away from these cops clean them up.
IF s_cops_courtyard_2[0].i_event > 0
OR (s_cops_courtyard_2[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
CLEAN_UP_ENEMY_PED(s_cops_after_ramp_blockade_2[i])
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_after_ramp_blockade_2[i])
ENDIF
ENDIF
ENDREPEAT
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
REPEAT COUNT_OF(veh_cops_after_ramp_blockade_2) i
IF IS_VEHICLE_DRIVEABLE(veh_cops_after_ramp_blockade_2[i])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_after_ramp_blockade_2[i])
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_after_ramp_blockade_2[i])
FLOAT f_playback_speed = 1.0
IF f_playback_time < 2000.0
f_playback_speed += (1.0 - ((f_playback_time / 3000.0) * 0.5))
ENDIF
SET_PLAYBACK_SPEED(veh_cops_after_ramp_blockade_2[i], f_playback_speed)
ENDIF
ENDIF
IF s_cops_courtyard_2[0].i_event > 0
OR (s_cops_courtyard_2[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
REMOVE_VEHICLE(veh_cops_after_ramp_blockade_2[i])
ENDIF
ENDREPEAT
ENDIF
//Cops outside the business park building.
IF NOT s_cops_courtyard_1[0].b_is_created
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1[0].ped)
IF s_cops_after_bridge[0].i_event > 0
OR e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
IF ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped,
<<-199.341995,-652.362793,44.292439>>, <<-200.206345,-654.693542,47.222027>>, 2.000000)
OR e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
s_cops_courtyard_1[0].ped = CREATE_ENEMY_PED(model_swat, <<-162.2765, -580.2377, 47.2257>>, 165.3703, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_1[0].ped, PCF_DontBlipCop, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1[1].ped)
s_cops_courtyard_1[1].ped = CREATE_ENEMY_PED(model_swat, <<-165.0926, -603.0400, 47.2208>>, 182.7348, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_1[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1[2].ped)
s_cops_courtyard_1[2].ped = CREATE_ENEMY_PED(model_swat, <<-181.6499, -613.3109, 47.2185>>, 174.4213, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_1[2].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1[3].ped)
s_cops_courtyard_1[3].ped = CREATE_ENEMY_PED(model_swat, <<-201.5549, -579.9914, 47.2264>>, 158.9434, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_1[3].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_courtyard_1, "Plaza ")
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_courtyard_1) i
IF DOES_ENTITY_EXIST(s_cops_courtyard_1[i].ped)
IF NOT IS_PED_INJURED(s_cops_courtyard_1[i].ped)
SWITCH s_cops_courtyard_1[i].i_event
CASE 0
IF i = 0
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_1[i].ped, s_cops_courtyard_1[i].cover, <<-174.4371, -598.7026, 47.2283>>,
159.6471, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
ELIF i = 1
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_1[i].ped, s_cops_courtyard_1[i].cover, <<-165.0926, -603.0400, 47.2208>>,
182.7348, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ELIF i = 2
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_1[i].ped, s_cops_courtyard_1[i].cover, <<-179.0030, -627.6848, 47.9718>>,
147.9208, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
ELSE
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_courtyard_1[i].ped, <<-199.4786, -597.8848, 47.2195>>, 5.0)
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_courtyard_1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_1[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_1[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_courtyard_1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
IF i = 0
PLAY_PED_AMBIENT_SPEECH(s_cops_courtyard_1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
//s_cops_courtyard_1[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_courtyard_1[i].ped, TRUE)
s_cops_courtyard_1[i].i_event++
BREAK
CASE 1
UPDATE_AI_PED_BLIP(s_cops_courtyard_1[i].ped, s_cops_courtyard_1[i].s_blip_data)
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_courtyard_1[i].ped)
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_courtyard_1[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Second wave of enemies turn up
IF NOT s_cops_courtyard_1b[0].b_is_created
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1b[0].ped)
IF s_cops_courtyard_1[0].i_event > 0
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
IF ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped,
<<-199.341995,-652.362793,44.292439>>, <<-200.206345,-654.693542,47.222027>>, 2.000000)
OR e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
s_cops_courtyard_1b[0].ped = CREATE_ENEMY_PED(model_swat, <<-130.4501, -618.1221, 47.2228>>, 37.4470, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_1b[0].ped, PCF_DontBlipCop, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1b[1].ped)
s_cops_courtyard_1b[1].ped = CREATE_ENEMY_PED(model_swat, <<-129.0058, -619.6517, 47.2241>>, 45.9230, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_1b[1].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_courtyard_1b, "PlazaB ")
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_courtyard_1b) i
IF DOES_ENTITY_EXIST(s_cops_courtyard_1b[i].ped)
IF NOT IS_PED_INJURED(s_cops_courtyard_1b[i].ped)
SWITCH s_cops_courtyard_1b[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_courtyard_1b[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_1b[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_1b[i].ped, 200.0)
s_cops_courtyard_1b[i].i_event = 100
ELSE
IF (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1 AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1) <= 1)
OR ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped,
<<-218.940857,-624.044250,46.721035>>, <<-127.287636,-658.595459,133.219131>>, 2.500000)
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_courtyard_1b[i].ped, <<-155.6902, -613.2861, 47.5365>>, 2.0)
PLAY_PED_AMBIENT_SPEECH(s_cops_courtyard_1b[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ELIF i = 1
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_courtyard_1b[i].ped, <<-155.7195, -620.4007, 47.5010>>, 2.0)
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_courtyard_1b[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1b[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_1b[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_1b[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1b[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1b[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_courtyard_1b[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
s_cops_courtyard_1b[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1
UPDATE_AI_PED_BLIP(s_cops_courtyard_1b[i].ped, s_cops_courtyard_1b[i].s_blip_data)
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_courtyard_1b[i].ped)
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_courtyard_1b[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Cops in a chopper get dropped off at the courtyard.
IF NOT s_cops_courtyard_heli[0].b_is_created
IF s_cops_after_bridge[0].i_event > 0
OR e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
REQUEST_VEHICLE_RECORDING(CARREC_COPS_HELI_COURTYARD, str_carrec)
REQUEST_MODEL(model_cop_heli)
REQUEST_MODEL(model_swat)
REQUEST_VEHICLE_ASSET(model_cop_heli, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
IF HAS_MODEL_LOADED(model_swat)
AND HAS_MODEL_LOADED(model_cop_heli)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_HELI_COURTYARD, str_carrec)
AND HAS_VEHICLE_ASSET_LOADED(model_cop_heli)
IF NOT DOES_ENTITY_EXIST(veh_cops_courtyard_heli)
IF v_player_pos.z > 47.0
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-183.073105,-660.491577,40.232239>>, <<-147.523422,-555.349487,72.347198>>, 115.250000)
veh_cops_courtyard_heli = CREATE_VEHICLE(model_cop_heli, <<-179.3185, -529.7585, 54.6964>>, 0.0)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
SET_VEHICLE_LIGHTS(veh_cops_courtyard_heli, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_LIVERY(veh_cops_courtyard_heli, 0)
SET_VEHICLE_SIREN(veh_cops_courtyard_heli, TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_courtyard_heli, TRUE)
SET_VEHICLE_ENGINE_ON(veh_cops_courtyard_heli, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(veh_cops_courtyard_heli)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(veh_cops_courtyard_heli, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_courtyard_heli, CARREC_COPS_HELI_COURTYARD, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_courtyard_heli, 1000.0)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_courtyard_heli, "BS_POLICE_HELI_02_group")
//Clear the previous area of cops to help with CPU time.
CLEAR_AREA(<<-111.3153, -679.9694, 34.8729>>, 80.0, FALSE)
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_heli[0].ped)
s_cops_courtyard_heli[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_courtyard_heli, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_heli[0].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_heli[1].ped)
s_cops_courtyard_heli[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_courtyard_heli, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_heli[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_heli[2].ped)
s_cops_courtyard_heli[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_courtyard_heli, VS_BACK_LEFT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_heli[2].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_heli[3].ped)
s_cops_courtyard_heli[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_courtyard_heli, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_heli[3].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_courtyard_heli, "Bridge ")
i_time_plaza_heli_blew_up = 0
REPEAT COUNT_OF(s_cops_courtyard_heli) i
IF NOT IS_PED_INJURED(s_cops_courtyard_heli[i].ped)
SET_PED_SUFFERS_CRITICAL_HITS(s_cops_courtyard_heli[i].ped, FALSE)
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Look after the helicopter: keep track of when it is on the ground so the peds can get out at the right time.
BOOL b_heli_stopped = FALSE
IF IS_VEHICLE_DRIVEABLE(veh_cops_courtyard_heli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_courtyard_heli)
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_courtyard_heli)
IF f_playback_time > 15000.0
IF f_playback_time < 18800.0
b_heli_stopped = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Send the chopper out of control if the pilot is shot.
IF IS_PED_INJURED(s_cops_courtyard_heli[0].ped)
IF NOT IS_ENTITY_DEAD(veh_cops_courtyard_heli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_courtyard_heli)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_courtyard_heli)
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_courtyard_heli)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_courtyard_heli)
ENDIF
ENDIF
ENDIF
//If the chopper was blown up before the peds got out then the player says a line.
IF NOT b_has_text_label_triggered[BS2B_DOWN3]
IF i_time_plaza_heli_blew_up != 0
AND GET_GAME_TIMER() - i_time_plaza_heli_blew_up < 3000
IF s_cops_courtyard_heli[1].i_event = 0
AND s_cops_courtyard_heli[2].i_event = 0
AND s_cops_courtyard_heli[3].i_event = 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DOWN3] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DOWN3] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
REPEAT COUNT_OF(s_cops_courtyard_heli) i
IF DOES_ENTITY_EXIST(s_cops_courtyard_heli[i].ped)
IF NOT IS_PED_INJURED(s_cops_courtyard_heli[i].ped)
SWITCH s_cops_courtyard_heli[i].i_event
CASE 0
IF i != 0
IF i > 1
IF IS_PED_IN_ANY_VEHICLE(s_cops_courtyard_heli[i].ped)
IF GET_SCRIPT_TASK_STATUS(s_cops_courtyard_heli[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
TASK_DRIVE_BY(s_cops_courtyard_heli[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
ENDIF
ENDIF
ENDIF
IF b_heli_stopped
SET_PED_COMBAT_AI(s_cops_courtyard_heli[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0)
SET_CURRENT_PED_WEAPON(s_cops_courtyard_heli[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_heli[i].ped, CA_USE_VEHICLE, FALSE)
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_heli[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_heli[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_heli[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_heli[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_heli[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_courtyard_heli[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
SET_PED_SUFFERS_CRITICAL_HITS(s_cops_courtyard_heli[i].ped, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_LEAVE_ANY_VEHICLE(NULL, i * 50, ECF_DONT_CLOSE_DOOR)
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(s_cops_courtyard_heli[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
//s_cops_courtyard_heli[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_courtyard_heli[i].ped, TRUE)
s_cops_courtyard_heli[i].i_event++
ENDIF
ELSE
//Once the heli gets out of view delete the driver and the heli.
IF IS_VEHICLE_DRIVEABLE(veh_cops_courtyard_heli)
IF IS_VEHICLE_DRIVEABLE(veh_cops_courtyard_heli)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(veh_cops_courtyard_heli, PLAYER_PED_ID())
IF GET_ENTITY_HEALTH(veh_cops_courtyard_heli) < 700
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_courtyard_heli) < 700
OR GET_VEHICLE_ENGINE_HEALTH(veh_cops_courtyard_heli) < 700
IF GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_courtyard_heli) > -100
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_courtyard_heli, -100)
i_time_plaza_heli_blew_up = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_courtyard_heli)
TASK_HELI_MISSION(s_cops_courtyard_heli[i].ped, veh_cops_courtyard_heli, NULL, NULL, <<685.2, 984.9, 316.0>>, MISSION_GOTO, 30.0, 10.0, -26.0, 200, 50)
SET_PED_KEEP_TASK(s_cops_courtyard_heli[i].ped, TRUE)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_courtyard_heli)
CLEAN_UP_ENEMY_PED(s_cops_courtyard_heli[i])
REMOVE_VEHICLE(veh_cops_courtyard_heli)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_COURTYARD, str_carrec)
s_cops_courtyard_heli[i].i_event++
ENDIF
ELSE
APPLY_DAMAGE_TO_PED(s_cops_courtyard_heli[i].ped, 200, TRUE)
ENDIF
ENDIF
BREAK
CASE 1 //Remove blips if the player runs on and ignores them
BREAK
ENDSWITCH
UPDATE_AI_PED_BLIP(s_cops_courtyard_heli[i].ped, s_cops_courtyard_heli[i].s_blip_data)
ELSE
REMOVE_VEHICLE_ASSET(model_cop_heli) //This is the last police chopper, so the exit anims are no longer needed.
CLEAN_UP_ENEMY_PED(s_cops_courtyard_heli[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//More cops show up as the player progresses through the plaza.
IF NOT s_cops_courtyard_2[0].b_is_created
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_2[0].ped)
IF s_cops_courtyard_1b[0].i_event > 0
OR (s_cops_courtyard_1b[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
s_cops_courtyard_2[0].ped = CREATE_ENEMY_PED(model_swat, <<-167.3500, -576.5425, 47.2208>>, 163.6350, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_2[0].ped, PCF_DontBlipCop, TRUE)
ENDIF
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_2[1].ped)
s_cops_courtyard_2[1].ped = CREATE_ENEMY_PED(model_swat, <<-158.5129, -558.8813, 45.9982>>, 107.3095, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_2[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_2[2].ped)
s_cops_courtyard_2[2].ped = CREATE_ENEMY_PED(model_swat, <<-156.6866, -558.4078, 44.9105>>, 107.3066, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_courtyard_2[2].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_courtyard_2, "Plaza2 ")
ENDIF
ENDIF
ELSE
BOOL b_time_to_trigger = FALSE
BOOL b_checked_trigger = FALSE
REPEAT COUNT_OF(s_cops_courtyard_2) i
IF DOES_ENTITY_EXIST(s_cops_courtyard_2[i].ped)
IF NOT IS_PED_INJURED(s_cops_courtyard_2[i].ped)
SWITCH s_cops_courtyard_2[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_courtyard_2[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_2[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_2[i].ped, 200.0)
s_cops_courtyard_2[i].i_event = 100
ELSE
IF NOT b_time_to_trigger
AND NOT b_checked_trigger
b_time_to_trigger = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy],
<<-203.360443,-581.705017,44.493492>>, <<-130.864227,-667.531921,94.220375>>, 2.000000)
b_checked_trigger = TRUE
ENDIF
IF b_time_to_trigger
IF i = 0
v_pos = <<-158.8138, -580.5103, 47.2301>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_2[i].ped, s_cops_courtyard_2[i].cover, v_pos, 164.2663, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
PLAY_PED_AMBIENT_SPEECH(s_cops_courtyard_2[i].ped, "MOVE_IN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ELIF i = 1
v_pos = <<-162.2717, -564.3132, 47.2208>>
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_2[i].ped, s_cops_courtyard_2[i].cover, v_pos, 163.5161, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELSE
v_pos = <<-150.2652, -562.8853, 47.2216>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_courtyard_2[i].ped, v_pos, 2.0, FALSE)
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_courtyard_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_2[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_2[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_2[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_2[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_courtyard_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
//s_cops_courtyard_2[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_courtyard_2[i].ped, TRUE)
s_cops_courtyard_2[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1
UPDATE_AI_PED_BLIP(s_cops_courtyard_2[i].ped, s_cops_courtyard_2[i].s_blip_data)
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_courtyard_2[i].ped)
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_courtyard_2[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Merryweather helicopter shows up at the business centre (now SWAT).
IF NOT s_merry_heli[0].b_is_created
IF s_cops_courtyard_2[0].b_is_created
REQUEST_VEHICLE_RECORDING(CARREC_MERRY_HELI, str_carrec)
REQUEST_MODEL(model_swat)
REQUEST_MODEL(model_military_chopper)
REQUEST_MODEL(model_rocket_helper)
IF HAS_MODEL_LOADED(model_swat)
AND HAS_MODEL_LOADED(model_military_chopper)
AND HAS_MODEL_LOADED(model_rocket_helper)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_MERRY_HELI, str_carrec)
IF NOT DOES_ENTITY_EXIST(veh_merry_heli)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-159.953873,-583.151306,46.982475>>, <<-166.073624,-580.664673,50.724922>>, 1.250000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-129.271210,-574.096619,46.970215>>, <<-134.197693,-578.311279,49.970215>>, 2.000000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-100.208809,-579.424438,46.728283>>, <<-96.472244,-569.563354,51.727242>>, 6.000000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-147.122269,-579.817139,45.225082>>, <<-150.993530,-555.962891,52.719139>>, 106.250000)
veh_merry_heli = CREATE_VEHICLE(model_military_chopper, <<-27.3128, -736.0812, 56.3044>>, 0.0)
SET_ENTITY_PROOFS(veh_merry_heli, FALSE, FALSE, TRUE, FALSE, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
START_PLAYBACK_RECORDED_VEHICLE(veh_merry_heli, CARREC_MERRY_HELI, str_carrec)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_merry_heli, "BS_BUZZARD_group")
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_merry_heli, 2000.0)
f_merry_heli_playback_speed = 1.0
i_time_merry_heli_blew_up = 0
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_merry_heli[0].ped)
s_merry_heli[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_merry_heli, VS_DRIVER, rel_group_cops, 800, 0, WEAPONTYPE_UNARMED)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_merry_heli[0].ped, TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(s_merry_heli[0].ped, FALSE)
SET_PED_ACCURACY(s_merry_heli[0].ped, 1)
SET_PED_FIRING_PATTERN(s_merry_heli[0].ped, FIRING_PATTERN_BURST_FIRE_HELI)
SET_PED_SHOOT_RATE(s_merry_heli[0].ped, 80)
SET_PED_CAN_BE_TARGETTED(s_merry_heli[0].ped, FALSE)
SET_PED_CONFIG_FLAG(s_merry_heli[0].ped, PCF_DontBlipCop, TRUE)
IF IS_VEHICLE_DRIVEABLE(veh_merry_heli)
SET_VEHICLE_ENGINE_ON(veh_merry_heli, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(veh_merry_heli)
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_CHOPPER_ARRIVES")
START_AUDIO_SCENE("BS_2B_CHOPPER_ARRIVES")
ENDIF
obj_merry_rocket_helper = CREATE_OBJECT_NO_OFFSET(model_rocket_helper, <<-27.3128, -736.0812, 66.3044>>)
FREEZE_ENTITY_POSITION(obj_merry_rocket_helper, TRUE)
SET_ENTITY_COLLISION(obj_merry_rocket_helper, FALSE)
SET_ENTITY_VISIBLE(obj_merry_rocket_helper, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
INITIALISE_ENEMY_GROUP(s_merry_heli, "mHeli ")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(veh_merry_heli)
//Handle the chopper
HOVER_HELI_USING_RECORDING(veh_merry_heli, f_merry_heli_playback_speed, 16000.0, 30000.0)
//Spin the chopper out if shot enough.
IF s_merry_heli[0].i_event < 100
BOOL b_hit_by_explosion = IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_merry_heli, <<0.0, 5.0, -5.0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_merry_heli, <<0.0, -5.0, 5.0>>), 8.0)
IF IS_PED_INJURED(s_merry_heli[0].ped)
OR GET_ENTITY_HEALTH(veh_merry_heli) < 500
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli) < 500
OR GET_VEHICLE_ENGINE_HEALTH(veh_merry_heli) < 500
OR b_hit_by_explosion
IF NOT IS_PED_INJURED(s_merry_heli[0].ped)
SET_ENTITY_HEALTH(s_merry_heli[0].ped, 0)
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_merry_heli)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_merry_heli)
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_MERRY_HELI, str_carrec)
/*IF b_hit_by_explosion
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -150.0)
SET_ENTITY_INVINCIBLE(veh_merry_heli, FALSE)
SET_ENTITY_HEALTH(veh_merry_heli, 0)
SET_VEHICLE_OUT_OF_CONTROL(veh_merry_heli)
EXPLODE_VEHICLE(veh_merry_heli, TRUE)
s_merry_heli[0].i_event = 101
ELSE
SET_ENTITY_HEALTH(veh_merry_heli, 1000)
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -150.0)
SET_VEHICLE_OUT_OF_CONTROL(veh_merry_heli)
b_merry_heli_is_active = FALSE
s_merry_heli[0].i_timer = GET_GAME_TIMER()
s_merry_heli[0].i_event = 100
ENDIF*/
SET_ENTITY_HEALTH(veh_merry_heli, 1000)
IF b_hit_by_explosion
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -300.0)
ELSE
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -150.0)
ENDIF
SET_VEHICLE_OUT_OF_CONTROL(veh_merry_heli)
b_merry_heli_is_active = FALSE
s_merry_heli[0].i_timer = GET_GAME_TIMER()
s_merry_heli[0].i_event = 100
//Record footage of the chopper blowing up.
REPLAY_RECORD_BACK_FOR_TIME(2.5)
i_time_merry_heli_blew_up = GET_GAME_TIMER()
ENDIF
ELIF s_merry_heli[0].i_event = 100
IF GET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli) < -299
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -300.0)
ELSE
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -150.0)
ENDIF
IF GET_GAME_TIMER() - s_merry_heli[0].i_timer > 3000
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_merry_heli)
SET_ENTITY_PROOFS(veh_merry_heli, FALSE, FALSE, FALSE, FALSE, FALSE)
EXPLODE_VEHICLE(veh_merry_heli)
s_merry_heli[0].i_event++
ELSE
APPLY_FORCE_TO_ENTITY(veh_merry_heli, APPLY_TYPE_FORCE, <<-10.0, 10.0, 9.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, FALSE, TRUE)
APPLY_FORCE_TO_ENTITY(veh_merry_heli, APPLY_TYPE_FORCE, <<3.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
ENDIF
ENDIF
ELIF DOES_ENTITY_EXIST(veh_merry_heli)
KILL_ENEMY_GROUP_INSTANTLY(s_merry_heli)
REMOVE_VEHICLE(veh_merry_heli)
ELSE
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_CHOPPER_ARRIVES")
STOP_AUDIO_SCENE("BS_2B_CHOPPER_ARRIVES")
ENDIF
ENDIF
//If the chopper was blown up then the player says a line.
IF NOT b_has_text_label_triggered[BS2B_DOWN4]
IF i_time_merry_heli_blew_up != 0
AND GET_GAME_TIMER() - i_time_merry_heli_blew_up < 3000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DOWN4] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DOWN4] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
REPEAT COUNT_OF(s_merry_heli) i
IF DOES_ENTITY_EXIST(s_merry_heli[i].ped)
IF NOT IS_PED_INJURED(s_merry_heli[i].ped)
SWITCH s_merry_heli[i].i_event
CASE 0
IF IS_VEHICLE_DRIVEABLE(veh_merry_heli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_merry_heli)
IF GET_TIME_POSITION_IN_RECORDING(veh_merry_heli) > 5000.0
//TASK_VEHICLE_SHOOT_AT_PED(s_merry_heli[i].ped, PLAYER_PED_ID())
b_merry_heli_is_active = TRUE
f_merry_heli_rocket_multiplier = 5.0
s_merry_heli[0].i_event++
s_merry_heli[0].i_timer = GET_GAME_TIMER() + 1000
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Shoot rockets after timer is hit, with each rocket the heli becomes more accurate.
UPDATE_AI_PED_BLIP(s_merry_heli[i].ped, s_merry_heli[i].s_blip_data)
VECTOR vRocketTargetPos
FLOAT fXOffsetModifier, fYOffsetModifier
IF GET_GAME_TIMER() - s_merry_heli[i].i_timer > 0
SET_CURRENT_PED_VEHICLE_WEAPON(s_merry_heli[i].ped, WEAPONTYPE_VEHICLE_SPACE_ROCKET)
IF v_player_pos.z > 43.5
AND v_player_pos.x > -165.0
AND v_player_pos.x < -140.5
vRocketTargetPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ELSE
vRocketTargetPos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
fXOffsetModifier = -1.0
ELSE
fXOffsetModifier = 1.0
ENDIF
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
fYOffsetModifier = -1.0
ELSE
fYOffsetModifier = 1.0
ENDIF
vRocketTargetPos.x = vRocketTargetPos.x + ((f_merry_heli_rocket_multiplier + GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0)) * fXOffsetModifier)
vRocketTargetPos.y = vRocketTargetPos.y + (((f_merry_heli_rocket_multiplier / 2.5) + GET_RANDOM_FLOAT_IN_RANGE(0.0, 1.0)) * fYOffsetModifier)
vRocketTargetPos.z = vRocketTargetPos.z + (f_merry_heli_rocket_multiplier / 2.0)
//For the first rocket make sure it always misses.
IF f_merry_heli_rocket_multiplier >= 5.0
vRocketTargetPos.z = 55.8
ENDIF
//PRINTLN(vRocketTargetPos, " ", f_merry_heli_rocket_multiplier)
SET_PED_ACCURACY(s_merry_heli[i].ped, 100)
//SET_VEHICLE_SHOOT_AT_TARGET(s_merry_heli[i].ped, PLAYER_PED_ID(), <<0.0, 0.0, 0.0>>)
//SET_VEHICLE_SHOOT_AT_TARGET(s_merry_heli[i].ped, NULL, vRocketTargetPos)
SET_ENTITY_COORDS_NO_OFFSET(obj_merry_rocket_helper, vRocketTargetPos)
SET_VEHICLE_SHOOT_AT_TARGET(s_merry_heli[i].ped, obj_merry_rocket_helper, <<0.0, 0.0, 0.0>>)
//SET_CURRENT_PED_VEHICLE_WEAPON(s_merry_heli[i].ped, WEAPONTYPE_VEHICLE_PLAYER_BUZZARD)
CONVERGE_VALUE(f_merry_heli_rocket_multiplier, 0.0, 0.75)
s_merry_heli[i].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
ENDIF
//If a rocket explodes and the player ran off then class it as hitting the crew member.
IF v_player_pos.z < 43.5
IF IS_EXPLOSION_IN_AREA(EXP_TAG_PLANE_ROCKET, <<-174.9, -581.7, 46.5>>, <<-139.0, -548.8, 59.3>>)
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
VECTOR v_crew_pos
v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)
IF v_crew_pos.z > 46.0
APPLY_DAMAGE_TO_PED(s_crew[CREW_MICHAEL_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_MICHAEL_ID].ped) + 50, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_merry_heli[i])
REMOVE_OBJECT(obj_merry_rocket_helper, TRUE)
ENDIF
ENDIF
ENDREPEAT
ENDIF
//When leaving the courtyard down the stairs some guys appear at the opposite end.
IF NOT s_cops_after_courtyard[0].b_is_created
IF NOT DOES_ENTITY_EXIST(s_cops_after_courtyard[0].ped)
IF s_merry_heli[0].b_is_created
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
s_cops_after_courtyard[0].ped = CREATE_ENEMY_PED(model_swat, <<-105.0238, -551.9466, 39.4899>>, 107.3095, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_after_courtyard[0].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_after_courtyard, "After court ")
ENDIF
ENDIF
ENDIF
ELSE
BOOL b_time_to_trigger = FALSE
BOOL b_checked_trigger = FALSE
REPEAT COUNT_OF(s_cops_after_courtyard) i
IF DOES_ENTITY_EXIST(s_cops_after_courtyard[i].ped)
IF NOT IS_PED_INJURED(s_cops_after_courtyard[i].ped)
SWITCH s_cops_after_courtyard[i].i_event
CASE 0
IF b_mission_failed
SET_PED_COMBAT_PARAMS(s_cops_after_courtyard[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_courtyard[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_courtyard[i].ped, 200.0)
s_cops_after_courtyard[i].i_event = 100
ELSE
IF i < 2
IF NOT b_time_to_trigger
AND NOT b_checked_trigger
b_time_to_trigger = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy],
<<-148.950745,-555.908875,41.092220>>, <<-148.632355,-558.330444,44.841061>>, 1.750000)
b_checked_trigger = TRUE
ENDIF
ENDIF
IF b_time_to_trigger
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_after_courtyard[i].ped, <<-111.6535, -547.5443, 39.4983>>, 2.0, TRUE)
PLAY_PED_AMBIENT_SPEECH(s_cops_after_courtyard[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_after_courtyard[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_courtyard[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_COMBAT_FLOAT(s_cops_after_courtyard[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_courtyard[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_courtyard[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_courtyard[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_courtyard[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_courtyard[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_after_courtyard[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
//s_cops_after_courtyard[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_after_courtyard[i].ped, TRUE)
s_cops_after_courtyard[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1
UPDATE_AI_PED_BLIP(s_cops_after_courtyard[i].ped, s_cops_after_courtyard[i].s_blip_data)
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_after_courtyard[i].ped)
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_after_courtyard[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Two more cops pop out from the corner when heading for the car park.
IF NOT s_cops_before_car_park[0].b_is_created
IF NOT DOES_ENTITY_EXIST(s_cops_before_car_park[0].ped)
IF s_merry_heli[0].b_is_created
REQUEST_MODEL(model_swat)
IF HAS_MODEL_LOADED(model_swat)
IF ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy],
<<-145.489563,-553.322083,46.248287>>, <<-194.477005,-562.312744,38.997589>>, 3.000000)
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_courtyard) = 0
s_cops_before_car_park[0].ped = CREATE_ENEMY_PED(model_swat, <<-196.6814, -568.4095, 39.4899>>, 340.8683, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_before_car_park[0].ped, PCF_DontBlipCop, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_before_car_park[1].ped)
s_cops_before_car_park[1].ped = CREATE_ENEMY_PED(model_swat, <<-197.0649, -569.5699, 39.4889>>, 340.8626, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_before_car_park[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_before_car_park[2].ped)
s_cops_before_car_park[2].ped = CREATE_ENEMY_PED(model_swat, <<-201.5502, -580.5303, 39.4881>>, 340.0840, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_before_car_park[2].ped, PCF_DontBlipCop, TRUE)
INITIALISE_ENEMY_GROUP(s_cops_before_car_park, "Before car park ")
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_before_car_park) i
IF DOES_ENTITY_EXIST(s_cops_before_car_park[i].ped)
IF NOT IS_PED_INJURED(s_cops_before_car_park[i].ped)
SWITCH s_cops_before_car_park[i].i_event
CASE 0
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_before_car_park[i].ped, <<-186.1787, -561.3795, 39.5001>>, 2.0, TRUE)
PLAY_PED_AMBIENT_SPEECH(s_cops_before_car_park[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ELIF i = 1
SET_PED_COVER_POINT_AND_SPHERE(s_cops_before_car_park[i].ped, s_cops_before_car_park[i].cover, <<-188.8791, -565.5320, 39.4921>>, 273.8708, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
ELIF i = 2
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_before_car_park[i].ped, <<-191.8576, -563.6796, 39.4959>>, 2.0, TRUE)
ENDIF
SET_PED_COMBAT_PARAMS(s_cops_before_car_park[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_car_park[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_COMBAT_FLOAT(s_cops_before_car_park[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_before_car_park[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_before_car_park[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_car_park[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_car_park[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_car_park[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_before_car_park[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
//s_cops_before_car_park[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_before_car_park[i].ped, TRUE)
s_cops_before_car_park[i].i_event++
BREAK
CASE 1
UPDATE_AI_PED_BLIP(s_cops_before_car_park[i].ped, s_cops_before_car_park[i].s_blip_data)
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_before_car_park[i].ped)
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_before_car_park[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
IF NOT s_cops_before_garage_blockade[COUNT_OF(s_cops_before_garage_blockade) - 1].b_is_created
IF e_mission_stage > STAGE_LEAVE_BANK
AND s_cops_before_car_park[0].b_is_created
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_1, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_2, str_carrec)
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
IF HAS_MODEL_LOADED(model_cop)
AND HAS_MODEL_LOADED(model_cop_car)
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BEFORE_CAR_PARK_1, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BEFORE_CAR_PARK_2, str_carrec)
IF s_cops_before_garage_blockade[0].b_is_created //Once the first cop is created there's no need to check the locates any more.
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-196.893082,-564.165466,28.103390>>, <<-158.514581,-556.676257,42.747276>>, 13.000000)
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) <= 1
//Create vehicles: only create one per frame.
REPEAT COUNT_OF(veh_cops_before_garage_blockade) i
INT i_carrec = 0
FLOAT f_playback_speed = 1.0
FLOAT f_playback_time = 0.0
IF NOT b_created_vehicle_this_frame
AND NOT DOES_ENTITY_EXIST(veh_cops_before_garage_blockade[i])
SWITCH i
CASE 0
veh_cops_before_garage_blockade[i] = CREATE_VEHICLE(model_cop_car, <<-257.5987, -334.0827, 29.6645>>, 0.0)
i_carrec = CARREC_COPS_BEFORE_CAR_PARK_1
f_playback_speed = 1.0
f_playback_time = 500.0
BREAK
CASE 1
veh_cops_before_garage_blockade[i] = CREATE_VEHICLE(model_cop_car, <<-260.6430, -317.7758, 29.8408>>, 0.0)
i_carrec = CARREC_COPS_BEFORE_CAR_PARK_2
f_playback_speed = 1.0
f_playback_time = 500.0
BREAK
ENDSWITCH
SET_VEHICLE_ENGINE_ON(veh_cops_before_garage_blockade[i], TRUE, TRUE)
SET_VEHICLE_LIGHTS(veh_cops_before_garage_blockade[i], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_cops_before_garage_blockade[i], TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_before_garage_blockade[i], TRUE)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_before_garage_blockade[i], i_carrec, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_before_garage_blockade[i], f_playback_time)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_before_garage_blockade[i])
SET_PLAYBACK_SPEED(veh_cops_before_garage_blockade[i], f_playback_speed)
b_created_vehicle_this_frame = TRUE
ENDIF
ENDREPEAT
//Create peds inside the vehicles (only create one per frame).
REPEAT COUNT_OF(s_cops_before_garage_blockade) i
INT i_car_index = 0
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
IF NOT b_created_ped_this_frame
AND NOT s_cops_before_garage_blockade[i].b_is_created
SWITCH i
CASE 0
i_car_index = 0
e_vehicle_seat = VS_DRIVER
BREAK
CASE 1
i_car_index = 0
e_vehicle_seat = VS_FRONT_RIGHT
BREAK
CASE 2
i_car_index = 1
e_vehicle_seat = VS_DRIVER
BREAK
CASE 3
i_car_index = 1
e_vehicle_seat = VS_FRONT_RIGHT
BREAK
ENDSWITCH
IF NOT IS_ENTITY_DEAD(veh_cops_before_garage_blockade[i_car_index])
s_cops_before_garage_blockade[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_cops_before_garage_blockade[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
SET_PED_INTO_VEHICLE(s_cops_before_garage_blockade[i].ped, veh_cops_before_garage_blockade[i_car_index], e_vehicle_seat)
INITIALISE_ENEMY_PED(s_cops_before_garage_blockade[i], "RampB ", i)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_before_garage_blockade[i].ped, TRUE)
b_created_ped_this_frame = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_before_garage_blockade) i
IF DOES_ENTITY_EXIST(s_cops_before_garage_blockade[i].ped)
IF NOT IS_PED_INJURED(s_cops_before_garage_blockade[i].ped)
SWITCH s_cops_before_garage_blockade[i].i_event
CASE 0 //Switch to AI after a few seconds (so the cars can avoid traffic).
IF IS_PED_IN_ANY_VEHICLE(s_cops_before_garage_blockade[i].ped)
VEHICLE_INDEX veh
veh = GET_VEHICLE_PED_IS_IN(s_cops_before_garage_blockade[i].ped)
IF IS_VEHICLE_DRIVEABLE(veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
IF GET_TIME_POSITION_IN_RECORDING(veh) > 7000.0
SET_PLAYBACK_TO_USE_AI(veh, DRIVINGMODE_AVOIDCARS)
s_cops_before_garage_blockade[i].i_event++
ENDIF
ELSE
s_cops_before_garage_blockade[i].i_event++
ENDIF
ELSE
s_cops_before_garage_blockade[i].i_event++
ENDIF
ENDIF
BREAK
CASE 1 //Wait for the car to stop.
IF IS_PED_IN_ANY_VEHICLE(s_cops_before_garage_blockade[i].ped)
VEHICLE_INDEX veh
veh = GET_VEHICLE_PED_IS_IN(s_cops_before_garage_blockade[i].ped)
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_SPEED(veh) < 0.5
AND ((NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(veh))
OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0 AND VDIST2(GET_ENTITY_COORDS(veh), <<-196.9, -566.7, 40.5>>) < 225.0))
s_cops_before_garage_blockade[i].i_timer = GET_GAME_TIMER()
s_cops_before_garage_blockade[i].i_event++
ENDIF
ELSE
s_cops_before_garage_blockade[i].i_timer = GET_GAME_TIMER()
s_cops_before_garage_blockade[i].i_event++
ENDIF
ELSE
s_cops_before_garage_blockade[i].i_timer = GET_GAME_TIMER()
s_cops_before_garage_blockade[i].i_event++
ENDIF
BREAK
CASE 2 //Get out and fight.
SET_PED_COMBAT_PARAMS(s_cops_before_garage_blockade[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_before_garage_blockade[i].ped, GET_ENTITY_COORDS(s_cops_before_garage_blockade[i].ped) - <<0.0, 0.0, 1.0>>, 7.0, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_before_garage_blockade[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_garage_blockade[i].ped, CA_USE_VEHICLE, FALSE)
SET_PED_CONFIG_FLAG(s_cops_before_garage_blockade[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_before_garage_blockade[i].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_before_garage_blockade[i].ped, FALSE)
s_cops_before_garage_blockade[i].i_event++
BREAK
CASE 3 //Once the player is far enough away from these cops clean them up.
IF s_cops_car_park_2[0].i_event > 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_2) = 0
CLEAN_UP_ENEMY_PED(s_cops_before_garage_blockade[i])
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_before_garage_blockade[i])
ENDIF
ENDIF
ENDREPEAT
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
REPEAT COUNT_OF(veh_cops_before_garage_blockade) i
IF IS_VEHICLE_DRIVEABLE(veh_cops_before_garage_blockade[i])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_before_garage_blockade[i])
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_before_garage_blockade[i])
FLOAT f_playback_speed = 1.0
IF f_playback_time < 3000.0
f_playback_speed += (1.0 - ((f_playback_time / 3000.0) * 0.5))
ENDIF
SET_PLAYBACK_SPEED(veh_cops_before_garage_blockade[i], f_playback_speed)
ENDIF
ENDIF
IF s_cops_car_park_2[0].i_event > 0
OR (s_cops_car_park_2[0].b_is_created AND IS_PED_INJURED(s_cops_car_park_2[0].ped))
REMOVE_VEHICLE(veh_cops_before_garage_blockade[i])
ENDIF
ENDREPEAT
ENDIF
//More cops show up by the car park entrance, just as the player gets near.
IF NOT s_cops_before_garage_blockade_2[COUNT_OF(s_cops_before_garage_blockade_2) - 1].b_is_created
IF s_cops_before_garage_blockade[0].b_is_created
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_3, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_4, str_carrec)
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
IF HAS_MODEL_LOADED(model_cop)
AND HAS_MODEL_LOADED(model_cop_car)
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BEFORE_CAR_PARK_3, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BEFORE_CAR_PARK_4, str_carrec)
IF s_cops_before_garage_blockade_2[0].b_is_created //Once the first cop is created there's no need to check the locates any more.
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-201.765411,-591.722046,70.663177>>, <<-351.272980,-558.346436,19.204063>>, 16.500000)
//Create vehicles: only create one per frame.
REPEAT COUNT_OF(veh_cops_before_garage_blockade_2) i
INT i_carrec = 0
FLOAT f_playback_speed = 1.0
FLOAT f_playback_time = 0.0
IF NOT b_created_vehicle_this_frame
AND NOT DOES_ENTITY_EXIST(veh_cops_before_garage_blockade_2[i])
SWITCH i
CASE 0
veh_cops_before_garage_blockade_2[i] = CREATE_VEHICLE(model_cop_car, <<-257.5987, -334.0827, 29.6645>>, 0.0)
i_carrec = CARREC_COPS_BEFORE_CAR_PARK_3
f_playback_speed = 1.0
f_playback_time = 500.0
BREAK
CASE 1
veh_cops_before_garage_blockade_2[i] = CREATE_VEHICLE(model_cop_car, <<-260.6430, -317.7758, 29.8408>>, 0.0)
i_carrec = CARREC_COPS_BEFORE_CAR_PARK_4
f_playback_speed = 1.0
f_playback_time = 500.0
BREAK
ENDSWITCH
SET_VEHICLE_ENGINE_ON(veh_cops_before_garage_blockade_2[i], TRUE, TRUE)
SET_VEHICLE_LIGHTS(veh_cops_before_garage_blockade_2[i], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_cops_before_garage_blockade_2[i], TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_before_garage_blockade_2[i], TRUE)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_before_garage_blockade_2[i], i_carrec, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_before_garage_blockade_2[i], f_playback_time)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_before_garage_blockade_2[i])
SET_PLAYBACK_SPEED(veh_cops_before_garage_blockade_2[i], f_playback_speed)
b_created_vehicle_this_frame = TRUE
ENDIF
ENDREPEAT
//Create peds inside the vehicles (only create one per frame).
REPEAT COUNT_OF(s_cops_before_garage_blockade_2) i
INT i_car_index = 0
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
IF NOT b_created_ped_this_frame
AND NOT s_cops_before_garage_blockade_2[i].b_is_created
SWITCH i
CASE 0
i_car_index = 0
e_vehicle_seat = VS_DRIVER
BREAK
CASE 1
i_car_index = 0
e_vehicle_seat = VS_FRONT_RIGHT
BREAK
CASE 2
i_car_index = 1
e_vehicle_seat = VS_DRIVER
BREAK
CASE 3
i_car_index = 1
e_vehicle_seat = VS_FRONT_RIGHT
BREAK
ENDSWITCH
IF NOT IS_ENTITY_DEAD(veh_cops_before_garage_blockade_2[i_car_index])
s_cops_before_garage_blockade_2[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_cops_before_garage_blockade_2[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
SET_PED_INTO_VEHICLE(s_cops_before_garage_blockade_2[i].ped, veh_cops_before_garage_blockade_2[i_car_index], e_vehicle_seat)
INITIALISE_ENEMY_PED(s_cops_before_garage_blockade_2[i], "RampB ", i)
b_created_ped_this_frame = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_before_garage_blockade_2) i
IF DOES_ENTITY_EXIST(s_cops_before_garage_blockade_2[i].ped)
IF NOT IS_PED_INJURED(s_cops_before_garage_blockade_2[i].ped)
SWITCH s_cops_before_garage_blockade_2[i].i_event
CASE 0 //Wait for the car to stop.
IF IS_PED_IN_ANY_VEHICLE(s_cops_before_garage_blockade_2[i].ped)
VEHICLE_INDEX veh
veh = GET_VEHICLE_PED_IS_IN(s_cops_before_garage_blockade_2[i].ped)
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_SPEED(veh) < 0.5
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
s_cops_before_garage_blockade_2[i].i_timer = GET_GAME_TIMER()
s_cops_before_garage_blockade_2[i].i_event++
ENDIF
ELSE
s_cops_before_garage_blockade_2[i].i_timer = GET_GAME_TIMER()
s_cops_before_garage_blockade_2[i].i_event++
ENDIF
ELSE
s_cops_before_garage_blockade_2[i].i_timer = GET_GAME_TIMER()
s_cops_before_garage_blockade_2[i].i_event++
ENDIF
BREAK
CASE 1 //Get out and fight.
SET_PED_COMBAT_PARAMS(s_cops_before_garage_blockade_2[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_before_garage_blockade_2[i].ped, GET_ENTITY_COORDS(s_cops_before_garage_blockade_2[i].ped) - <<0.0, 0.0, 1.0>>, 7.0, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_before_garage_blockade_2[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_garage_blockade_2[i].ped, CA_USE_VEHICLE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_before_garage_blockade_2[i].ped, 200.0)
SET_PED_CONFIG_FLAG(s_cops_before_garage_blockade_2[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_before_garage_blockade_2[i].ped, FALSE)
s_cops_before_garage_blockade_2[i].i_event++
BREAK
CASE 2 //Once the player is far enough away from these cops clean them up.
IF s_cops_car_park_2[0].i_event > 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_2) = 0
CLEAN_UP_ENEMY_PED(s_cops_before_garage_blockade_2[i])
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(s_cops_before_garage_blockade_2[i])
ENDIF
ENDIF
ENDREPEAT
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
REPEAT COUNT_OF(veh_cops_before_garage_blockade_2) i
IF IS_VEHICLE_DRIVEABLE(veh_cops_before_garage_blockade_2[i])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_before_garage_blockade_2[i])
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_before_garage_blockade_2[i])
FLOAT f_playback_speed = 1.0
IF f_playback_time < 2000.0
f_playback_speed += (1.0 - ((f_playback_time / 3000.0) * 0.5))
ENDIF
SET_PLAYBACK_SPEED(veh_cops_before_garage_blockade_2[i], f_playback_speed)
ENDIF
ENDIF
IF s_cops_car_park_2[0].i_event > 0
OR (s_cops_car_park_2[0].b_is_created AND IS_PED_INJURED(s_cops_car_park_2[0].ped))
REMOVE_VEHICLE(veh_cops_before_garage_blockade_2[i])
ENDIF
ENDREPEAT
ENDIF
//First SWAT van arrives in the car park.
IF NOT s_cops_car_park_1[0].b_is_created
IF NOT DOES_ENTITY_EXIST(veh_cops_car_park_1)
IF s_cops_after_courtyard[0].b_is_created
REQUEST_MODEL(model_swat)
REQUEST_MODEL(model_swat_van)
REQUEST_VEHICLE_ASSET(model_swat_van, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
REQUEST_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_1, str_carrec)
IF HAS_MODEL_LOADED(model_swat)
AND HAS_MODEL_LOADED(model_swat_van)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_CAR_PARK_1, str_carrec)
AND HAS_VEHICLE_ASSET_LOADED(model_swat_van)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-212.946976,-638.482788,31.595699>>, <<-208.236359,-625.890503,36.576645>>, 6.250000)
OR (ARE_PEDS_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy], NULL,
<<-212.946976,-638.482788,31.595699>>, <<-208.236359,-625.890503,36.576645>>, 6.250000)
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 2500.0)
veh_cops_car_park_1 = CREATE_VEHICLE(model_swat_van, <<-118.4678, -676.4661, 34.7534>>)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_1, CARREC_COPS_CAR_PARK_1, str_carrec)
SET_VEHICLE_ENGINE_ON(veh_cops_car_park_1, TRUE, TRUE)
SET_VEHICLE_STRONG(veh_cops_car_park_1, TRUE)
SET_VEHICLE_LIGHTS(veh_cops_car_park_1, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_cops_car_park_1, TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_car_park_1, TRUE)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_car_park_1, "BS_ENEMY_VANS_group")
//NOTE: need to wrap this up in a visiblity check in case the player goes a different route.
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_1, 3000.0)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_car_park_1[0].ped)
s_cops_car_park_1[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_1, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_1[0].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_1[1].ped)
s_cops_car_park_1[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_1, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_1[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_1[2].ped)
s_cops_car_park_1[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_1, VS_BACK_LEFT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_1[2].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_1[3].ped)
s_cops_car_park_1[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_1, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_1[3].ped, PCF_DontBlipCop, TRUE)
REPEAT COUNT_OF(s_cops_car_park_1) i
IF i = 2 OR i = 3
IF NOT IS_PED_INJURED(s_cops_car_park_1[i].ped)
SET_PED_ACCURACY(s_cops_car_park_1[i].ped, 1)
TASK_DRIVE_BY(s_cops_car_park_1[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
ENDIF
ENDIF
ENDREPEAT
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VANS_ARRIVE")
START_AUDIO_SCENE("BS_2B_VANS_ARRIVE")
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
INITIALISE_ENEMY_GROUP(s_cops_car_park_1, "garage1 ")
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_car_park_1) i
IF DOES_ENTITY_EXIST(s_cops_car_park_1[i].ped)
IF NOT IS_PED_INJURED(s_cops_car_park_1[i].ped)
SWITCH s_cops_car_park_1[i].i_event
CASE 0
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_1[i].ped)
IF i = 2 OR i = 3
IF GET_SCRIPT_TASK_STATUS(s_cops_car_park_1[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
TASK_DRIVE_BY(s_cops_car_park_1[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
ENDIF
ENDIF
VEHICLE_INDEX veh
veh = GET_VEHICLE_PED_IS_IN(s_cops_car_park_1[i].ped)
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_SPEED(veh) < 0.5
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
s_cops_car_park_1[i].i_timer = GET_GAME_TIMER()
s_cops_car_park_1[i].i_event++
ENDIF
ENDIF
ELSE
s_cops_car_park_1[i].i_timer = GET_GAME_TIMER()
s_cops_car_park_1[i].i_event++
ENDIF
BREAK
CASE 1
INT i_delay
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_1[i].ped, <<-170.3, -635.9, 31.7>>, 3.0, TRUE)
i_delay = 1200
ELIF i = 1
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_1[i].ped, <<-160.6, -639.4, 31.7>>, 3.0, TRUE)
i_delay = 850
ELIF i = 2
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_1[i].ped, <<-173.9, -645.4, 31.7>>, 3.0, TRUE)
i_delay = 0
ELIF i = 3
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_1[i].ped, <<-164.1, -648.9, 31.7>>, 3.0, TRUE)
i_delay = 400
ENDIF
IF GET_GAME_TIMER() - s_cops_car_park_1[i].i_timer > i_delay
SET_PED_COMBAT_PARAMS(s_cops_car_park_1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_car_park_1[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_1[i].ped, CA_USE_VEHICLE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_car_park_1[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_1[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_1[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_car_park_1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
//s_cops_car_park_1[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_car_park_1[i].ped, TRUE)
s_cops_car_park_1[i].i_event++
ENDIF
BREAK
CASE 2
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_car_park_1[i].ped)
BREAK
ENDSWITCH
UPDATE_AI_PED_BLIP(s_cops_car_park_1[i].ped, s_cops_car_park_1[i].s_blip_data)
ELSE
//Make sure the vehicle is stopped if the driver dies.
IF i = 0
AND NOT IS_ENTITY_DEAD(veh_cops_car_park_1)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_car_park_1)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_1)
ENDIF
ENDIF
CLEAN_UP_ENEMY_PED(s_cops_car_park_1[i])
ENDIF
ENDIF
ENDREPEAT
//DO_VEHICLE_DAMAGE_WHEN_SHOT(veh_cops_car_park_1)
ENDIF
//Second SWAT van arrives in the car park after the first one.
IF NOT s_cops_car_park_2[0].b_is_created
IF NOT DOES_ENTITY_EXIST(veh_cops_car_park_2)
IF s_cops_before_garage_blockade_2[0].b_is_created
REQUEST_MODEL(model_swat)
REQUEST_MODEL(model_swat_van)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_2, str_carrec)
REQUEST_VEHICLE_ASSET(model_swat_van, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
IF HAS_MODEL_LOADED(model_swat)
AND HAS_MODEL_LOADED(model_swat_van)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_CAR_PARK_2, str_carrec)
AND HAS_VEHICLE_ASSET_LOADED(model_swat_van)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-167.229630,-724.514282,24.954021>>, <<-98.497353,-553.928406,78.740616>>, 58.000000)
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_1) <= 1
veh_cops_car_park_2 = CREATE_VEHICLE(model_swat_van, <<-118.4678, -676.4661, 34.7534>>)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_2, CARREC_COPS_CAR_PARK_2, str_carrec)
SET_VEHICLE_ENGINE_ON(veh_cops_car_park_2, TRUE, TRUE)
SET_VEHICLE_STRONG(veh_cops_car_park_2, TRUE)
SET_VEHICLE_LIGHTS(veh_cops_car_park_2, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_cops_car_park_2, TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_car_park_2, TRUE)
//NOTE: need to wrap this up in a visiblity check in case the player goes a different route.
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_2, 2000.0)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_car_park_2, "BS_ENEMY_VANS_group")
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_car_park_2[0].ped)
s_cops_car_park_2[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_2, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_2[0].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_2[1].ped)
s_cops_car_park_2[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_2, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_2[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_2[2].ped)
s_cops_car_park_2[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_2, VS_BACK_LEFT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_2[2].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_2[3].ped)
s_cops_car_park_2[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_2, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_2[3].ped, PCF_DontBlipCop, TRUE)
REPEAT COUNT_OF(s_cops_car_park_2) i
IF i = 2 OR i = 3
IF NOT IS_PED_INJURED(s_cops_car_park_2[i].ped)
SET_PED_ACCURACY(s_cops_car_park_2[i].ped, 1)
TASK_DRIVE_BY(s_cops_car_park_2[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_2[i].ped, TRUE)
ENDIF
ENDIF
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
INITIALISE_ENEMY_GROUP(s_cops_car_park_2, "garage2 ")
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_car_park_2) i
IF DOES_ENTITY_EXIST(s_cops_car_park_2[i].ped)
IF NOT IS_PED_INJURED(s_cops_car_park_2[i].ped)
VEHICLE_INDEX veh
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_2[i].ped)
veh = GET_VEHICLE_PED_IS_IN(s_cops_car_park_2[i].ped)
ENDIF
SWITCH s_cops_car_park_2[i].i_event
CASE 0
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_2[i].ped)
IF i = 2 OR i = 3
IF GET_SCRIPT_TASK_STATUS(s_cops_car_park_2[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
TASK_DRIVE_BY(s_cops_car_park_2[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_2[i].ped, TRUE)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_SPEED(veh) < 0.5
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
s_cops_car_park_2[i].i_timer = GET_GAME_TIMER()
s_cops_car_park_2[i].i_event++
ENDIF
ENDIF
ELSE
s_cops_car_park_2[i].i_timer = GET_GAME_TIMER()
s_cops_car_park_2[i].i_event++
ENDIF
BREAK
CASE 1
INT i_delay
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_2[i].ped, <<-169.0, -599.3, 31.7>>, 3.0, TRUE)
i_delay = 1100
ELIF i = 1
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_2[i].ped, <<-149.3, -606.5, 31.7>>, 3.0, TRUE)
i_delay = 700
ELIF i = 2
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_2[i].ped, <<-159.2, -602.9, 31.7>>, 3.0, TRUE)
i_delay = 0
ELIF i = 3
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_2[i].ped, <<-148.8, -617.5, 31.7>>, 3.0, TRUE)
i_delay = 400
ENDIF
IF GET_GAME_TIMER() - s_cops_car_park_2[i].i_timer > i_delay
SET_PED_COMBAT_PARAMS(s_cops_car_park_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_car_park_2[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_2[i].ped, CA_USE_VEHICLE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_car_park_2[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_2[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_2[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_car_park_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
//s_cops_car_park_2[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_car_park_2[i].ped, TRUE)
s_cops_car_park_2[i].i_event++
ENDIF
BREAK
CASE 2
UPDATE_AI_PED_BLIP(s_cops_car_park_2[i].ped, s_cops_car_park_2[i].s_blip_data)
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_car_park_2[i].ped)
BREAK
ENDSWITCH
IF s_cops_car_park_2[i].i_event > 0
OR (IS_VEHICLE_DRIVEABLE(veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0)
UPDATE_AI_PED_BLIP(s_cops_car_park_2[i].ped, s_cops_car_park_2[i].s_blip_data)
ENDIF
ELSE
//Make sure the vehicle is stopped if the driver dies.
IF i = 0
AND NOT IS_ENTITY_DEAD(veh_cops_car_park_2)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_car_park_2)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_2)
ENDIF
ENDIF
CLEAN_UP_ENEMY_PED(s_cops_car_park_2[i])
ENDIF
ENDIF
ENDREPEAT
//DO_VEHICLE_DAMAGE_WHEN_SHOT(veh_cops_car_park_2)
ENDIF
//Third SWAT van shows up.
IF NOT s_cops_car_park_3[0].b_is_created
IF NOT DOES_ENTITY_EXIST(veh_cops_car_park_3)
IF s_cops_car_park_1[0].b_is_created
REQUEST_MODEL(model_swat)
REQUEST_MODEL(model_swat_van)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_3, str_carrec)
REQUEST_VEHICLE_ASSET(model_swat_van, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
IF HAS_MODEL_LOADED(model_swat)
AND HAS_MODEL_LOADED(model_swat_van)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_CAR_PARK_3, str_carrec)
AND HAS_VEHICLE_ASSET_LOADED(model_swat_van)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-167.229630,-724.514282,24.954021>>, <<-98.497353,-553.928406,78.740616>>, 58.000000)
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_2) <= 3
veh_cops_car_park_3 = CREATE_VEHICLE(model_swat_van, <<-118.4678, -676.4661, 34.7534>>)
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_3, CARREC_COPS_CAR_PARK_3, str_carrec)
SET_VEHICLE_ENGINE_ON(veh_cops_car_park_3, TRUE, TRUE)
SET_VEHICLE_STRONG(veh_cops_car_park_3, TRUE)
SET_VEHICLE_LIGHTS(veh_cops_car_park_3, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(veh_cops_car_park_3, TRUE)
SET_SIREN_WITH_NO_DRIVER(veh_cops_car_park_3, TRUE)
//NOTE: need to wrap this up in a visiblity check in case the player goes a different route.
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_3, 1500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_car_park_3)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_car_park_3, "BS_ENEMY_VANS_group")
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(s_cops_car_park_3[0].ped)
s_cops_car_park_3[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_3, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_3[0].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_3[1].ped)
s_cops_car_park_3[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_3, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_3[1].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_3[2].ped)
s_cops_car_park_3[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_3, VS_BACK_LEFT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_3[2].ped, PCF_DontBlipCop, TRUE)
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_3[3].ped)
s_cops_car_park_3[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_3, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
SET_PED_CONFIG_FLAG(s_cops_car_park_3[3].ped, PCF_DontBlipCop, TRUE)
REPEAT COUNT_OF(s_cops_car_park_3) i
IF i = 2 OR i = 3
IF NOT IS_PED_INJURED(s_cops_car_park_3[i].ped)
SET_PED_ACCURACY(s_cops_car_park_3[i].ped, 1)
TASK_DRIVE_BY(s_cops_car_park_3[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
ENDIF
ENDIF
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
INITIALISE_ENEMY_GROUP(s_cops_car_park_3, "garage3 ")
ENDIF
ENDIF
ELSE
REPEAT COUNT_OF(s_cops_car_park_3) i
IF DOES_ENTITY_EXIST(s_cops_car_park_3[i].ped)
IF NOT IS_PED_INJURED(s_cops_car_park_3[i].ped)
VEHICLE_INDEX veh
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_3[i].ped)
veh = GET_VEHICLE_PED_IS_IN(s_cops_car_park_3[i].ped)
ENDIF
SWITCH s_cops_car_park_3[i].i_event
CASE 0
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_3[i].ped)
IF i = 2 OR i = 3
IF GET_SCRIPT_TASK_STATUS(s_cops_car_park_3[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
TASK_DRIVE_BY(s_cops_car_park_3[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_SPEED(veh) < 0.5
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
s_cops_car_park_3[i].i_timer = GET_GAME_TIMER()
s_cops_car_park_3[i].i_event++
ENDIF
ENDIF
ELSE
s_cops_car_park_3[i].i_timer = GET_GAME_TIMER()
s_cops_car_park_3[i].i_event++
ENDIF
BREAK
CASE 1
INT i_delay
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_3[i].ped, <<-153.6068, -587.0838, 31.4245>>, 3.0, TRUE)
i_delay = 1100
ELIF i = 1
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_3[i].ped, <<-163.3693, -583.5307, 31.4245>>, 3.0, TRUE)
i_delay = 700
ELIF i = 2
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_3[i].ped, <<-143.7290, -590.6827, 31.4245>>, 3.0, TRUE)
i_delay = 0
ELIF i = 3
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_3[i].ped, <<-160.4481, -582.0713, 31.4245>>, 3.0, TRUE)
i_delay = 400
ENDIF
IF GET_GAME_TIMER() - s_cops_car_park_3[i].i_timer > i_delay
SET_PED_COMBAT_PARAMS(s_cops_car_park_3[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_car_park_3[i].ped, rel_group_cops)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_3[i].ped, CA_USE_VEHICLE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_car_park_3[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_3[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_3[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_3[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_3[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_COMBAT_FLOAT(s_cops_car_park_3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
s_cops_car_park_3[i].i_event++
ENDIF
BREAK
ENDSWITCH
IF s_cops_car_park_3[i].i_event > 0
OR (IS_VEHICLE_DRIVEABLE(veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0)
UPDATE_AI_PED_BLIP(s_cops_car_park_3[i].ped, s_cops_car_park_3[i].s_blip_data)
ENDIF
ELSE
//Make sure the vehicle is stopped if the driver dies.
IF i = 0
AND NOT IS_ENTITY_DEAD(veh_cops_car_park_3)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_car_park_3)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_3)
ENDIF
ENDIF
CLEAN_UP_ENEMY_PED(s_cops_car_park_3[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
//Pedestrian vehicles in the car park.
IF NOT b_created_car_park_cars
//Only create one car a frame to keep down execution time.
IF NOT DOES_ENTITY_EXIST(veh_car_park_cars[0])
IF s_cops_before_car_park[0].b_is_created
OR e_mission_stage = STAGE_LOSE_COPS
REQUEST_MODEL(baller2)
REQUEST_MODEL(oracle2)
IF HAS_MODEL_LOADED(baller2)
AND HAS_MODEL_LOADED(oracle2)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-214.209686,-618.228821,32.065613>>, <<-286.469269,-559.749695,45.950104>>, 2.250000)
OR e_mission_stage = STAGE_LOSE_COPS
veh_car_park_cars[0] = CREATE_VEHICLE(baller2, <<-182.0917, -624.2522, 31.4281>>, 251.3879)
ENDIF
ENDIF
ENDIF
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[1])
veh_car_park_cars[1] = CREATE_VEHICLE(baller2, <<-149.4820, -618.5926, 31.4271>>, 67.6452)
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[2])
veh_car_park_cars[2] = CREATE_VEHICLE(oracle2, <<-169.4180, -588.6669, 31.4281>>, 253.2657)
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[3])
veh_car_park_cars[3] = CREATE_VEHICLE(oracle2, <<-178.3785, -612.2272, 31.4245>>, 69.1812)
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[4])
veh_car_park_cars[4] = CREATE_VEHICLE(oracle2, <<-156.8075, -637.6180, 31.4244>>, 252.0134)
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[5])
veh_car_park_cars[5] = CREATE_VEHICLE(baller2, <<-138.5987, -590.7236, 31.4245>>, 69.4967)
ELIF NOT DOES_ENTITY_EXIST(veh_getaway_car)
BOOL bCreateDummyVehicle = TRUE
BOOL bCreateVehGenVehicle = FALSE
//Grab the vehicle gen car if available and use that as the getaway car.
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(VEHGEN_MISSION_VEH_FBI4_PREP, VEHGEN_S_FLAG_AVAILABLE)
IF NOT IS_ENTITY_DEAD(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH_FBI4_PREP))
veh_getaway_car = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH_FBI4_PREP)
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2b.sc - successfully grabbed getaway car")
#ENDIF
SET_ENTITY_AS_MISSION_ENTITY(veh_getaway_car, TRUE, TRUE)
SET_ENTITY_HEADING(veh_getaway_car, 68.0133)
SET_ENTITY_COORDS(veh_getaway_car, <<-166.1555, -621.9833, 31.4281>>)
bCreateVehGenVehicle = FALSE
bCreateDummyVehicle = FALSE
ELSE
//Car failed to grab but is available, so try to create below using the global data.
bCreateVehGenVehicle = TRUE
bCreateDummyVehicle = FALSE
ENDIF
ELSE
//Car not available, create a default car instead.
bCreateVehGenVehicle = FALSE
bCreateDummyVehicle = TRUE
ENDIF
//If the car failed to create but is available then use the global data to create it.
IF bCreateVehGenVehicle
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2b.sc - car was available but couldn't be grabbed, creating fake vehicle instead.")
#ENDIF
VEHICLE_GEN_DATA_STRUCT sVehGenData
IF GET_VEHICLE_GEN_DATA(sVehGenData, VEHGEN_MISSION_VEH_FBI4_PREP)
REQUEST_MODEL(sVehGenData.model)
IF HAS_MODEL_LOADED(sVehGenData.model)
veh_getaway_car = CREATE_VEHICLE(sVehGenData.model, <<-166.1555, -621.9833, 31.4281>>, 68.0133)
SET_VEHICLE_COLOURS(veh_getaway_car, sVehGenData.colour1, sVehGenData.colour2)
SET_VEHICLE_EXTRA_COLOURS(veh_getaway_car, 0, 0)
SET_VEHICLE_STRONG(veh_getaway_car, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(veh_getaway_car, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(veh_getaway_car, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(sVehGenData.model)
SET_VEHICLE_GEN_SAVED_FLAG_STATE(VEHGEN_MISSION_VEH_FBI4_PREP, VEHGEN_S_FLAG_AVAILABLE, FALSE)
b_vehicle_gen_set_to_unavailable = TRUE
bCreateVehGenVehicle = FALSE
bCreateDummyVehicle = FALSE
ENDIF
ELSE
bCreateVehGenVehicle = FALSE
bCreateDummyVehicle = TRUE
ENDIF
ENDIF
//The getaway car doesn't exist, just create a default one instead.
IF bCreateDummyVehicle
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2b.sc - getaway car doesn't exist, creating backup")
#ENDIF
veh_getaway_car = CREATE_VEHICLE(oracle2, <<-166.1555, -621.9833, 31.4281>>, 68.0133)
SET_VEHICLE_COLOURS(veh_getaway_car, 0, 0)
SET_VEHICLE_EXTRA_COLOURS(veh_getaway_car, 0, 0)
SET_VEHICLE_STRONG(veh_getaway_car, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(veh_getaway_car, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(veh_getaway_car, FALSE)
ENDIF
IF DOES_ENTITY_EXIST(veh_getaway_car)
SET_MODEL_AS_NO_LONGER_NEEDED(baller2)
SET_MODEL_AS_NO_LONGER_NEEDED(oracle2)
REPEAT COUNT_OF(veh_car_park_cars) i
IF NOT IS_ENTITY_DEAD(veh_car_park_cars[i])
SET_VEHICLE_DOORS_LOCKED(veh_car_park_cars[i], VEHICLELOCK_LOCKED_BUT_CAN_BE_DAMAGED)
SET_VEHICLE_STRONG(veh_car_park_cars[i], TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(veh_car_park_cars[i], TRUE)
SET_VEHICLE_ALARM(veh_car_park_cars[i], TRUE)
ENDIF
ENDREPEAT
IF NOT IS_ENTITY_DEAD(veh_getaway_car)
SET_VEHICLE_STRONG(veh_getaway_car, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(veh_getaway_car, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(veh_getaway_car, TRUE)
ENDIF
b_created_car_park_cars = TRUE
ENDIF
ENDIF
ELSE
//Set alarms off on the cars when they've been shot.
REPEAT COUNT_OF(veh_car_park_cars) i
IF NOT IS_ENTITY_DEAD(veh_car_park_cars[i])
IF NOT IS_VEHICLE_ALARM_ACTIVATED(veh_car_park_cars[i])
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(veh_car_park_cars[i], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
IF i != 2
START_VEHICLE_ALARM(veh_car_park_cars[i])
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Clean up the cars once the player reaches the car park (they're not required by the script and the player is close enough for them to not stream out).
IF DOES_ENTITY_EXIST(veh_car_park_cars[0])
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_3) = 0
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-181.347168,-649.545044,30.315771>>, <<-155.179962,-577.773804,35.445507>>, 39.750000)
AND IS_SCREEN_FADED_IN()
REPEAT COUNT_OF(veh_car_park_cars) i
REMOVE_VEHICLE(veh_car_park_cars[i])
ENDREPEAT
ENDIF
ENDIF
//Make sure the getaway car doesn't fall through the map before the player gets there.
IF NOT s_cops_car_park_1[0].b_is_created
AND e_mission_stage < STAGE_LOSE_COPS
IF NOT IS_ENTITY_DEAD(veh_getaway_car)
VECTOR v_getaway_car_start_pos = <<-166.1555, -621.9833, 31.4281>>
IF VDIST2(GET_ENTITY_COORDS(veh_getaway_car), v_getaway_car_start_pos) > 100.0
AND VDIST2(v_player_pos, GET_ENTITY_COORDS(veh_getaway_car)) > 100.0
AND VDIST2(v_player_pos, v_getaway_car_start_pos) > 100.0
SET_ENTITY_HEADING(veh_getaway_car, 68.0133)
SET_ENTITY_COORDS(veh_getaway_car, v_getaway_car_start_pos)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), "] ", "Getaway car moved before the player reached the car park: warping back to start pos.")
ENDIF
ENDIF
ENDIF
ENDIF
//Handle dialogue (shouldn't be needed with ambient stuff).
//UPDATE_ENEMY_SHOOTOUT_DIALOGUE(i_swat_dialogue_timer)
ENDPROC
PROC UPDATE_SHOOTOUT_SWITCH()
BOOL bAllowSwitch = TRUE
SWITCH i_switch_stage
CASE 0
//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
IF bAllowSwitch
IF UPDATE_SELECTOR_HUD(s_selector_peds)
CLEAR_HELP()
DESTROY_ALL_CAMS()
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
i_health_before_switch = GET_ENTITY_HEALTH(PLAYER_PED_ID())
i_switch_stage++
ENDIF
ENDIF
BREAK
CASE 1
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_SHORT_RANGE(s_selector_cam)
i_switch_stage = 0
ELSE
IF s_selector_cam.bOKToSwitchPed
IF NOT s_selector_cam.bPedSwitched
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE, TRUE)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed])
IF i_health_before_switch < 110
i_health_before_switch = 110
ENDIF
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
SET_PED_DIES_WHEN_INJURED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
SET_PED_COMBAT_PARAMS(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_ENTITY_HEALTH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], i_health_before_switch)
SET_PED_MAX_HEALTH_WITH_SCALE(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 1800)
SET_PED_CAN_COWER_IN_COVER(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], PCF_UseKinematicModeWhenStationary, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FIRE | RBF_PLAYER_IMPACT)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_REQUIRES_LOS_TO_SHOOT, FALSE)
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], TRUE, -1)
IF HAS_PED_GOT_WEAPON(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], WEAPONTYPE_ADVANCEDRIFLE)
SET_CURRENT_PED_WEAPON(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], WEAPONTYPE_ADVANCEDRIFLE)
IF GET_AMMO_IN_PED_WEAPON(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], WEAPONTYPE_ADVANCEDRIFLE) < 50
ADD_AMMO_TO_PED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], WEAPONTYPE_ADVANCEDRIFLE, 50)
ENDIF
ENDIF
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
e_current_buddy = s_selector_peds.ePreviousSelectorPed
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
s_selector_cam.bPedSwitched = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
///Handles AI tasks for either Franklin or Michael, depending on who the player is at the moment.
///(e.g. if the player is Michael then Franklin will use this behaviour).
PROC UPDATE_SELECTOR_PED_DURING_SHOOTOUT()
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
BOOL b_player_stole_cover = FALSE
BOOL b_player_went_to_bridge = FALSE
BOOL b_is_in_combat = (IS_PED_IN_COMBAT(s_selector_peds.pedID[e_current_buddy]) OR GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
VECTOR v_ped_pos = GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
FLOAT f_dist_from_player = VDIST2(v_ped_pos, v_player_pos)
FLOAT f_dist_to_destination
SEQUENCE_INDEX seq
INT i = 0
INT i_closest_node_to_buddy = 0
INT i_closest_node_to_player = 0
REQUEST_WAYPOINT_RECORDING(str_waypoint_shootout_route)
REQUEST_WAYPOINT_RECORDING(str_waypoint_crew_shootout)
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_shootout_route)
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_crew_shootout)
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_ped_pos, i_closest_node_to_buddy)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_player_pos, i_closest_node_to_player)
ELSE
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_ped_pos, i_closest_node_to_buddy)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_player_pos, i_closest_node_to_player)
ENDIF
ENDIF
SET_PED_RESET_FLAG(s_selector_peds.pedID[e_current_buddy], PRF_DisableFriendlyGunReactAudio, TRUE)
SWITCH s_michael.i_event
CASE 0 //This runs as soon as the selector ped is created: run to cover point while aiming (aim at the ped that pops out at the stairs if he exists).
s_michael.v_dest = <<-91.9914, -695.8475, 43.2512>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 59.4266, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF NOT IS_PED_INJURED(s_cops_before_bridge[0].ped)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, s_michael.v_dest, s_cops_before_bridge[0].ped, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ELSE
IF DOES_ENTITY_EXIST(s_cops_before_bridge[0].ped)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, GET_ENTITY_COORDS(s_cops_before_bridge[0].ped, FALSE), PEDMOVE_RUN, FALSE, 0.5, 0.5)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-132.2, -674.7, 41.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ENDIF
ENDIF
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-132.2, -674.7, 41.6>>, 1000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
s_michael.b_is_using_secondary_cover = FALSE
s_michael.i_timer = 0
s_michael.i_event++
BREAK
CASE 1 //Run to cover to take on the bridge enemies.
//Check if the player is stealing cover.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-91.9914, -695.8475, 43.2512>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 59.4266, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-88.5532, -694.7739, 43.2481>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 67.1871, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat)
AND s_cops_bridge[0].b_is_created)
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-132.2, -674.7, 41.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-132.2, -674.7, 41.6>>, 1000)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Check if the player went to the bridge while the buddy was hanging around further up. If this happens the player says a "let's go" line.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-86.694138,-694.010742,45.085995>>, <<-84.451782,-687.800415,39.489246>>, 15.500000)
IF NOT b_has_text_label_triggered[BS2B_GOGOBRIDGE]
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGOBRIDGE] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGOBRIDGE] = TRUE
ENDIF
ENDIF
ENDIF
b_player_went_to_bridge = TRUE
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) < 4
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_start) < 2
OR b_player_went_to_bridge
s_michael.v_dest = <<-85.5955, -686.9423, 41.4885>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 69.9291, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
s_michael.b_refresh_tasks = TRUE
s_michael.b_is_using_secondary_cover = FALSE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
BREAK
CASE 2 //Push forward closer to the bridge
//Check if the player is stealing cover.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-85.5955, -686.9423, 41.4885>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 69.9291, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-87.5926, -692.6145, 41.9286>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 68.5747, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-132.2, -674.7, 41.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-132.2, -674.7, 41.6>>, 1000)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
BOOL b_time_to_move
IF f_dist_to_destination < 9.0
IF s_michael.i_timer = 0
s_michael.i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_michael.i_timer > 7000
IF v_player_pos.z < 45.0
b_time_to_move = TRUE
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-86.694138,-694.010742,45.085995>>, <<-84.451782,-687.800415,39.489246>>, 15.500000)
b_player_went_to_bridge = TRUE
ENDIF
//Play a line if the player is hanging around before the bridge.
IF NOT b_player_went_to_bridge
IF f_dist_to_destination < 9.0
IF NOT b_has_text_label_triggered[BS2B_DBRID]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DBRIDM", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_DBRID] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DBRIDF", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_DBRID] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Progress once there's only one ped left alive, or if the player went down to the bridge.
IF b_time_to_move
OR b_player_went_to_bridge
IF IS_PED_INJURED(s_cops_bridge_start[0].ped)
AND IS_PED_INJURED(s_cops_bridge_start[1].ped)
s_michael.v_dest = <<-100.7743, -686.8337, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0)
s_michael.b_refresh_tasks = TRUE
s_michael.b_is_using_secondary_cover = FALSE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
ENDIF
BREAK
CASE 3 //Go onto the bridge, progress once the two enemies at the front are dead.
//Check if the player is stealing cover.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-100.7743, -686.8337, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-101.3149, -683.7056, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some dialogue telling the player to cross the bridge.
IF NOT b_has_text_label_triggered[BS2B_BRIDG2]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BRIDG2M", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BRIDG2] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BRIDG2F", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BRIDG2] = TRUE
ENDIF
ENDIF
ENDIF
//Progress once there's only one ped left alive, or if the player went down to the bridge.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) < 4
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_start) = 0
IF IS_PED_INJURED(s_cops_bridge[0].ped)
AND IS_PED_INJURED(s_cops_bridge[1].ped)
s_michael.v_dest = <<-111.3170, -683.3491, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
i_wait_dialogue_timer = 0
b_played_wait_line = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.b_is_using_secondary_cover = FALSE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
ENDIF
BREAK
CASE 4 //Fight the heli and remaining bridge guys, once they're dead progress.
//Check if the player is stealing cover.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-111.3170, -683.3491, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-115.2356, -676.8964, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[1].ped)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, s_michael.v_dest, s_cops_heli_bridge_2[1].ped, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ENDIF
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Progress fully across the bridge once the heli is dead.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0
IF i_closest_node_to_buddy - i_closest_node_to_player < 5
OR s_cops_after_bridge[0].i_event > 0
s_michael.v_dest = <<-121.6736, -679.2559, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_refresh_tasks = TRUE
s_michael.b_is_using_secondary_cover = FALSE
s_michael.i_timer = 0
s_michael.i_event++
ELSE
//Play some dialogue here to tell the player to catch up.
IF NOT b_played_wait_line
AND f_dist_from_player > 400.0
AND f_dist_from_player < 2500.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BWAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
//ENDIF
ELSE
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BWAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
//ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Play some dialogue telling the player to kill the bridge enemies.
IF NOT b_has_text_label_triggered[BS2B_BHELI] //Kill the heli
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
b_has_text_label_triggered[BS2B_BHELI] = TRUE
ELSE
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_bridge_2)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_bridge_2)
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_heli_bridge_2) > 8500.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BHELIM", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_BHELI] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BHELIF", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_BHELI] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_BRIDGE] //Kill the bridge peds
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BRIDGEM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BRIDGE] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BRIDGEF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BRIDGE] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 5 //Fight any remaining bridge enemies then progress.
//Check if the player is stealing cover.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-121.6736, -679.2559, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-118.3590, -677.3660, 39.5162>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<-129.8, -674.0, 40.0>>, 20.0)
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Progress fully across the bridge once the heli is dead.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) = 0
IF i_closest_node_to_buddy - i_closest_node_to_player < 5
OR s_cops_after_bridge[0].i_event > 0
s_michael.v_dest = <<-151.0778, -674.5917, 39.4882>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
b_buddy_crossed_bridge = TRUE
s_michael.b_refresh_tasks = TRUE
s_michael.b_is_using_secondary_cover = FALSE
s_michael.i_timer = 0
s_michael.i_event++
ELSE
//Play some dialogue here to tell the player to catch up.
IF NOT b_played_wait_line
AND f_dist_from_player > 400.0
AND f_dist_from_player < 4900.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BWAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
//ENDIF
ELSE
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BWAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
//ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 6 //Fight the SWAT that come up the ramp.
//Check if the player is stealing cover.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-151.0778, -674.5917, 39.4882>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-146.8298, -673.8439, 39.4947>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF f_dist_to_destination > VDIST2(<<-129.4, -675.5, 39.4888>>, s_michael.v_dest)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-129.4, -675.5, 39.4888>>, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 1.0, 1.0, TRUE, ENAV_NO_STOPPING)
ENDIF
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<-172.55, -664.63, 40.0>>, 10.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some "let's go" dialogue while running to the ramp.
IF NOT b_has_text_label_triggered[BS2B_GOGO4]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO4] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO4] = TRUE
ENDIF
ENDIF
ENDIF
//Progress once there's just one enemy left.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
AND f_dist_to_destination < 100.0
s_michael.v_dest = <<-212.2528, -650.0736, 39.4881>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0)
//Now is a good time to remove the navmesh blocking areas at the bottom of the ramps.
IF i_ramp_navmesh_block_1 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_1)
i_ramp_navmesh_block_1 = -1
ENDIF
IF i_ramp_navmesh_block_2 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_2)
i_ramp_navmesh_block_2 = -1
ENDIF
i_wait_dialogue_timer = 0
b_played_wait_line = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.b_is_using_secondary_cover = FALSE
s_michael.i_timer = GET_GAME_TIMER()
s_michael.i_event++
ENDIF
BREAK
CASE 7 //Push to the bottom of the stairs, wait for the player to arrive.
//Damage any remaining bridge peds.
IF GET_GAME_TIMER() - s_michael.i_timer < 2000
AND GET_GAME_TIMER() - s_michael.i_timer > 500
REPEAT COUNT_OF(s_cops_after_bridge) i
IF NOT IS_PED_INJURED(s_cops_after_bridge[i].ped)
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], GET_ENTITY_COORDS(s_cops_after_bridge[i].ped))
ENDIF
IF GET_GAME_TIMER() - s_michael.i_timer > 1000
APPLY_DAMAGE_TO_PED(s_cops_after_bridge[i].ped, 200, TRUE)
ENDIF
ENDIF
ENDREPEAT
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-237.0136, -711.0485, 34.2278>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some "go up the stairs" dialogue.
IF NOT b_has_text_label_triggered[BS2B_HIGH]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGHM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_HIGH] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGHF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_HIGH] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_HELI2] //Dialogue when the chopper shows up.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF b_ramp_heli_is_active
AND IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HELI2M", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_HELI2] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HELI2F", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_HELI2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_MENT1]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MENT1", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MENT1] = TRUE
ENDIF
ENDIF
ENDIF
//Play some dialogue if the player goes down the ramp here.
IF NOT b_has_text_label_triggered[BS2B_NOLORAMP]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF v_player_pos.z < 39.5
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NOLOM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_NOLORAMP] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NOLOF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_NOLORAMP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(s_selector_peds.pedID[e_current_buddy], <<-194.867493,-656.806824,39.488064>>, <<-167.274139,-665.861633,42.720985>>, 7.500000)
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], GET_ENTITY_COORDS(veh_cops_heli_ramp))
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], GET_ENTITY_COORDS(veh_cops_heli_ramp))
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
ENDIF
ELIF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_ramp_blockade) != 0
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], <<-232.8978, -694.9381, 36.0902>>)
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], <<-232.8978, -694.9381, 36.0902>>)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
ENDIF
ENDIF
ENDIF
//Continue once the buddy reaches the area and a certain amount of enemies are dead.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_ramp) <= 1
IF f_dist_to_destination < 16.0
IF i_closest_node_to_buddy - i_closest_node_to_player < 3
AND (f_dist_from_player < 64.0 OR i_closest_node_to_buddy - i_closest_node_to_player < -2)
IF i_closest_node_to_buddy - i_closest_node_to_player < -2
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-210.915771,-651.131226,39.511784>>, <<-229.199402,-644.067200,43.001026>>, 6.500000)
AND IS_SPHERE_VISIBLE(<<-209.0352, -650.2074, 40.9769>>, 0.25)
AND IS_ENTITY_ON_SCREEN(s_selector_peds.pedID[e_current_buddy]))
s_michael.v_dest = <<-201.8401, -644.1752, 47.6733>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 2.7610, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event = 50
ENDIF
ELSE
//Play some dialogue if the player goes past the stairs
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-215.509857,-649.067505,36.238064>>, <<-229.233154,-644.159912,43.627552>>, 7.250000)
IF NOT b_has_text_label_triggered[BS2B_HIGH2]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 1600.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGH2M", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_HIGH2] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGH2F", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_HIGH2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Play some dialogue if the player lags behind.
IF NOT b_played_wait_line
AND f_dist_from_player > 400.0
AND f_dist_from_player < 2500.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGHM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGHF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 50 //Push forwards to the business centre, go into combat on arrival.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-201.8401, -644.1752, 47.6733>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 2.7610, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-190.6709, -648.3492, 47.6726>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 348.9619, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
INT i_closest_node_to_ped, i_closest_node_to_dest_1, i_closest_node_to_dest_2
//Don't perform the early parts of the sequence if the ped has already gone past those points (e.g. if the player switched half-way through the path).
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_ped_pos, i_closest_node_to_ped)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-211.0997, -649.6271, 39.4888>>, i_closest_node_to_dest_1)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-194.1727, -655.5215, 47.2264>>, i_closest_node_to_dest_2)
OPEN_SEQUENCE_TASK(seq)
IF e_mission_stage = STAGE_CITY_SHOOTOUT
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF i_closest_node_to_ped < i_closest_node_to_dest_1
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-211.0997, -649.6271, 39.4888>>, <<-237.0136, -711.0485, 34.2278>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
ENDIF
IF i_closest_node_to_ped < i_closest_node_to_dest_2
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-194.1727, -655.5215, 47.2264>>, PEDMOVE_SPRINT, 30000, 0.5, ENAV_NO_STOPPING)
ENDIF
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, TRUE, 0.5, 1.0)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-154.0717, -549.3301, 48.7064>>, 1000)
ENDIF
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play dialogue when they reach the top of the stairs.
IF NOT b_has_text_label_triggered[BS2B_TOP]
IF v_ped_pos.z > 47.0
AND IS_PED_SHOOTING(s_selector_peds.pedID[e_current_buddy])
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TOPM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_TOP] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TOPF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_TOP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF e_mission_stage = STAGE_CITY_SHOOTOUT
IF NOT b_has_text_label_triggered[BS2B_GOGOSTAIRS]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGH2M", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGOSTAIRS] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGH2F", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGOSTAIRS] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Continue once the buddy reaches the area and a certain amount of enemies are dead.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1
IF v_ped_pos.z > 47.0
s_michael.v_dest = <<-169.6940, -613.6614, 47.2191>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 3.0, TRUE)
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(veh_cops_courtyard_heli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_courtyard_heli)
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_courtyard_heli) > 5000.0
IF NOT b_has_text_label_triggered[BS2B_PHELI]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PHELIM", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_PHELI] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PHELIF", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_PHELI] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 51 //Push half-way through the plaza, then fight any enemies still around.
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some let's go dialogue
IF NOT b_has_text_label_triggered[BS2B_GOGOPLAZA]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGOPLAZA] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGOPLAZA] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_RIGHTPLAZA]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF s_cops_courtyard_1b[0].i_event > 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1b) != 0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RIGHTM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_RIGHTPLAZA] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RIGHTF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_RIGHTPLAZA] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_COVER]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_COVERM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_COVER] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_COVERF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_COVER] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Progress once all the enemies are dead.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1b) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1
s_michael.v_dest = <<-163.9965, -594.8786, 47.2226>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 335.7135, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
BREAK
CASE 52 //Push forwards through the business centre, and fight the next wave.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-163.9965, -594.8786, 47.2226>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 335.7135, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-167.5977, -598.7238, 47.2214>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
IF s_michael.cover != NULL
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-154.0717, -549.3301, 48.7064>>, 1000)
ENDIF
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some "let's go" dialogue while running to the next destination.
IF NOT b_has_text_label_triggered[BS2B_GOGO5]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(v_ped_pos, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO5] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO5] = TRUE
ENDIF
ENDIF
ENDIF
//Play some "stick together" dialogue if the player runs off.
IF NOT b_played_wait_line
AND f_dist_from_player > 900.0
AND f_dist_from_player < 2500.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_2) = 0
s_michael.v_dest = <<-153.2118, -560.0645, 47.2208>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 12.9, 3.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
BREAK
CASE 53 //Run to the chopper location, once the chopper arrives dive to cover.
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some let's go dialogue.
IF NOT b_has_text_label_triggered[BS2B_GOGOMERRY]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TUNNELM", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_GOGOMERRY] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TUNNELF", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_GOGOMERRY] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) != 0
IF b_merry_heli_is_active
AND IS_ENTITY_IN_ANGLED_AREA(s_selector_peds.pedID[e_current_buddy], <<-164.167935,-584.824866,45.725426>>, <<-154.954956,-559.742920,51.469128>>, 21.500000)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
ELSE
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = FALSE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
BREAK
CASE 54 //Run into cover and fight the helicopter.
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) = 0
#IF IS_DEBUG_BUILD
PRINTLN(i_closest_node_to_buddy, " ", i_closest_node_to_player)
#ENDIF
IF (i_closest_node_to_buddy - i_closest_node_to_player < 8 AND f_dist_to_destination < 16.0)
OR s_cops_after_courtyard[0].i_event > 0
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-158.399490,-557.349121,44.969173>>, <<-156.922089,-565.438049,51.718651>>, 15.250000)
s_michael.v_dest = <<-139.2620, -556.2374, 39.4933>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ELSE
IF NOT IS_PED_IN_COVER(s_selector_peds.pedID[e_current_buddy])
AND NOT IS_PED_GOING_INTO_COVER(s_selector_peds.pedID[e_current_buddy])
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_SEEK_COVER_TO_COORDS) != PERFORMING_TASK
TASK_SEEK_COVER_TO_COORDS(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, <<-166.8, -518.0, 52.7>>, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[e_current_buddy], TRUE)
ENDIF
ENDIF
//Play some "stick together" dialogue if the player runs off.
IF NOT b_played_wait_line
AND f_dist_from_player > 400.0
AND f_dist_from_player < 2500.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, s_michael.v_dest, PEDMOVE_SPRINT, DEFAULT, 2.0, ENAV_NO_STOPPING)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-154.0717, -549.3301, 51.7064>>, PEDMOVE_SPRINT, TRUE, 2.0, 2.0, TRUE, ENAV_NO_STOPPING)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, s_michael.v_dest, 1000, FALSE, 0.0, FALSE, FALSE, s_michael.cover, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some dialogue when the ped spots the Merryweather chopper.
IF NOT b_has_text_label_triggered[BS2B_MERRY]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF s_merry_heli[0].b_is_created
IF s_michael.i_timer = 0
s_michael.i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_michael.i_timer > 3000
IF f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MERRYM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MERRY] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MERRYF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MERRY] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 55 //Run down the stairs, fight the enemies that appear there.
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-146.4362, -556.7252, 40.9678>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some "let's go" dialogue while running to the next destination.
IF NOT b_has_text_label_triggered[BS2B_PDOWN]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PDOWNM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_PDOWN] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PDOWNF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_PDOWN] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_MENT2]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MENT2", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MENT2] = TRUE
ENDIF
ENDIF
ENDIF
//Play some "stick together" dialogue if the player runs off.
IF NOT b_played_wait_line
AND f_dist_from_player > 400.0
AND f_dist_from_player < 2500.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_courtyard) = 0
s_michael.v_dest = <<-195.2280, -564.3157, 39.4934>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
BREAK
CASE 56 //Begin running to car park, switch to combat once the peds pop out.
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
INT i_closest_node_to_ped, i_closest_node_to_dest_1
//Don't perform the early parts of the sequence if the ped has already gone past those points (e.g. if the player switched half-way through the path).
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_ped_pos, i_closest_node_to_ped)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-142.6308, -553.0471, 39.4983>>, i_closest_node_to_dest_1)
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF i_closest_node_to_ped < i_closest_node_to_dest_1
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-142.6308, -553.0471, 39.4983>>, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
ENDIF
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some "let's go" dialogue while running to the next destination.
IF NOT b_has_text_label_triggered[BS2B_BACK]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BACKM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BACK] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BACKF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BACK] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_WAITCOURT]
//Play a line if the player goes the wrong way.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 10000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-136.001709,-553.247864,39.496075>>, <<-102.206711,-547.259033,42.747730>>, 7.500000)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_WAITCOURT] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_WAITCOURT] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF s_cops_before_car_park[0].i_event > 0
s_michael.v_dest = <<-170.0670, -562.4701, 39.4993>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 98.3922, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
BREAK
CASE 57 //Fight the enemies, once dead continue to the car park.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-170.0670, -562.4701, 39.4993>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 98.3922, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-168.0697, -559.9905, 39.5001>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
s_michael.b_refresh_tasks = FALSE
ENDIF
INT i_enemies_alive
i_enemies_alive = GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park)
IF s_michael.i_timer = 0
AND i_enemies_alive = 1
s_michael.i_timer = GET_GAME_TIMER()
ENDIF
IF i_enemies_alive = 0
OR (i_enemies_alive = 1
AND (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-181.360565,-561.776001,39.499413>>, <<-196.067978,-564.505859,42.994396>>, 7.000000) OR GET_GAME_TIMER() - s_michael.i_timer > 1500))
s_michael.v_dest = <<-191.8480, -564.3631, 39.4953>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
//Play some "stick together" dialogue if the player runs off.
IF NOT b_played_wait_line
AND f_dist_from_player > 400.0
AND f_dist_from_player < 4900.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Play a line if the player goes the wrong way.
IF NOT b_has_text_label_triggered[BS2B_WAITCOURT]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 10000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-136.001709,-553.247864,39.496075>>, <<-102.206711,-547.259033,42.747730>>, 7.500000)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_WAITCOURT] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_WAITCOURT] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 58 //Run to the corner, wait for Franklin to arrive.
//Kill any remaining enemies on the way.
REPEAT COUNT_OF(s_cops_before_car_park) i
IF NOT IS_PED_INJURED(s_cops_before_car_park[i].ped)
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], GET_ENTITY_COORDS(s_cops_before_car_park[i].ped))
APPLY_DAMAGE_TO_PED(s_cops_before_car_park[i].ped, 200, TRUE)
ENDIF
ENDIF
ENDREPEAT
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF VDIST2(<<-171.7854, -560.7704, 39.4947>>, s_michael.v_dest) < f_dist_to_destination
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-171.7854, -560.7704, 39.4947>>, <<-254.7373, -602.8020, 40.9296>>, PEDMOVE_RUN, FALSE, 0.5, 1.0, TRUE,
ENAV_NO_STOPPING)
ENDIF
IF f_dist_to_destination > 4.0
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-254.7373, -602.8020, 40.9296>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
ENDIF
TASK_AIM_GUN_AT_COORD(NULL, <<-254.7373, -602.8020, 40.9296>>, -1)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Play some "let's go" dialogue while running to the next destination.
IF NOT b_has_text_label_triggered[BS2B_GOGO8]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(v_ped_pos, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO8] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO8] = TRUE
ENDIF
ENDIF
ENDIF
//Play some dialogue when the cops arrive.
IF NOT b_has_text_label_triggered[BS2B_RIGHTRAMP]
IF IS_VEHICLE_DRIVEABLE(veh_cops_before_garage_blockade[0])
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_before_garage_blockade[0])
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_before_garage_blockade[0]) > 5000.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RIGHTM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_RIGHTRAMP] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RIGHTF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_RIGHTRAMP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF (i_closest_node_to_buddy - i_closest_node_to_player < 5 AND f_dist_to_destination < 16.0)
AND v_player_pos.z < 45.0
s_michael.v_dest = <<-209.6340, -597.2145, 39.4953>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ELSE
//Play some "stick together" dialogue if the player runs off.
IF NOT b_played_wait_line
AND f_dist_from_player > 400.0
AND f_dist_from_player < 4900.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 59 //Push to the top of the ramp, wait for the player to arrive.
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-236.2467, -565.2051, 38.0008>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Fire at the cop cars.
IF f_dist_to_destination > 16.0
AND NOT b_is_in_combat
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_garage_blockade) > 0
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], <<-236.2467, -565.2051, 38.0008>>)
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], <<-236.2467, -565.2051, 38.0008>>)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
ENDIF
ENDIF
ENDIF
ENDIF
//Play some general chat here.
IF NOT b_has_text_label_triggered[BS2B_SCHAT]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
If GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_SCHAT1", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_SCHAT] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_SCHAT2", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_SCHAT] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF f_dist_to_destination < 64.0
//Play some dialogue telling the player to go down the ramp
IF NOT b_has_text_label_triggered[BS2B_DRAMP]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DRAMPM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DRAMP] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DRAMPF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DRAMP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Continue once the buddy reaches the area and a certain amount of enemies are dead.
IF f_dist_to_destination < 16.0
BOOL b_player_went_down_other_side
b_player_went_down_other_side = IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-230.208069,-574.921448,35.299747>>,<<28.750000,3.000000,2.500000>>)
IF (i_closest_node_to_buddy - i_closest_node_to_player < 3 AND (f_dist_from_player < 64.0 OR i_closest_node_to_buddy - i_closest_node_to_player < 0))
OR b_player_went_down_other_side
IF (i_closest_node_to_buddy - i_closest_node_to_player < 0 AND v_player_pos.z < 40.5)
OR b_player_went_down_other_side
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-204.007278,-597.495117,42.238064>>, <<-211.373444,-594.653809,38.937641>>, 5.500000)
AND IS_ENTITY_ON_SCREEN(s_selector_peds.pedID[e_current_buddy]))
s_michael.v_dest = <<-184.9264, -623.4516, 31.4281>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
b_played_wait_line = FALSE
i_wait_dialogue_timer = 0
b_buddy_is_going_to_car_park = TRUE
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = GET_GAME_TIMER()
s_michael.i_event++
ENDIF
ELSE
//Play some dialogue here if the player runs past the ramp without going down.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-207.951157,-601.452576,42.238064>>, <<-213.683884,-617.953308,39.386734>>, 4.750000)
IF NOT b_has_text_label_triggered[BS2B_WAITRAMP]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 4900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_WAITRAMP] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_WAITRAMP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Play some "stick together" dialogue if the player runs off.
IF NOT b_played_wait_line
AND f_dist_from_player > 625.0
AND f_dist_from_player < 4900.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 60 //Run all the way to the car park, then fight the first van.
IF NOT s_michael.b_refresh_tasks
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_michael.b_is_using_secondary_cover
s_michael.v_dest = <<-184.9264, -623.4516, 31.4281>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
s_michael.b_is_using_secondary_cover = FALSE
ELSE
s_michael.v_dest = <<-175.7344, -615.4920, 31.4281>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 248.8329, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
s_michael.b_is_using_secondary_cover = TRUE
ENDIF
b_player_stole_cover = TRUE
s_michael.b_refresh_tasks = TRUE
ENDIF
ENDIF
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
INT i_closest_node_to_ped, i_closest_node_to_dest_1, i_closest_node_to_dest_2, i_closest_node_to_dest_3
//Don't perform the early parts of the sequence if the ped has already gone past those points (e.g. if the player switched half-way through the path).
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_ped_pos, i_closest_node_to_ped)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-195.2280, -564.3157, 39.4934>>, i_closest_node_to_dest_1)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-210.8291, -596.9030, 39.4888>>, i_closest_node_to_dest_2)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-217.0694, -624.0117, 32.4958>>, i_closest_node_to_dest_3)
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
OPEN_SEQUENCE_TASK(seq)
IF f_dist_to_destination > 4.0
AND NOT b_player_stole_cover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF i_closest_node_to_ped < i_closest_node_to_dest_1
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-195.2280, -564.3157, 39.4934>>, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
ENDIF
IF i_closest_node_to_ped < i_closest_node_to_dest_2
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-210.8291, -596.9030, 39.4888>>, <<-217.2492, -614.3069, 40.8903>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
ENDIF
IF i_closest_node_to_ped < i_closest_node_to_dest_3
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-217.0694, -624.0117, 32.4958>>, <<-258.6456, -637.2813, 34.0890>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
ENDIF
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-151.4, -649.4, 33.6759>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
//Shoot at the next batch of cop cars.
IF i_closest_node_to_ped < i_closest_node_to_dest_3 - 1
AND NOT b_is_in_combat
IF GET_GAME_TIMER() - s_michael.i_timer > 1000
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_garage_blockade_2) > 0
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], <<-258.6456, -637.2813, 34.0890>>)
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], <<-258.6456, -637.2813, 34.0890>>)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(veh_cops_car_park_1)
IF IS_ENTITY_IN_ANGLED_AREA(s_selector_peds.pedID[e_current_buddy], <<-201.288651,-633.703491,30.983559>>, <<-184.850479,-640.012512,35.400841>>, 13.000000)
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], <<-158.3629, -647.3505, 32.9995>>)
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], <<-158.3629, -647.3505, 32.9995>>)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
ENDIF
ENDIF
ENDIF
ENDIF
//Play some "let's go" dialogue while running to the next destination.
IF NOT b_has_text_label_triggered[BS2B_GOGO9]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO9] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO9] = TRUE
ENDIF
ENDIF
ENDIF
//Play some dialogue indicating they should go to the car park.
IF NOT b_has_text_label_triggered[BS2B_CPARK]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 625.0
AND VDIST2(v_ped_pos, <<-220.7790, -624.0447, 32.4813>>) < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PARK", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_CPARK] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PARK", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_CPARK] = TRUE
ENDIF
ENDIF
ENDIF
//Play some dialogue when arriving at the car park and the enemies show up.
IF NOT b_has_text_label_triggered[BS2B_CPARK2]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF s_cops_car_park_1[0].i_event > 0
OR IS_PED_INJURED(s_cops_car_park_1[0].ped)
IF v_ped_pos.x > -192.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CPARK2M", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_CPARK2] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CPARK2F", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_CPARK2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Play some "stick together" dialogue if the player runs off.
IF NOT b_played_wait_line
AND f_dist_from_player > 900.0
AND f_dist_from_player < 4900.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF i_wait_dialogue_timer = 0
i_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
b_played_wait_line = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_1) <= 1
IF s_michael.i_timer = 0
s_michael.i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_michael.i_timer > 2500
s_michael.v_dest = <<-164.9733, -623.7012, 31.4281>>
REMOVE_COVER_POINT(s_michael.cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 3.0, TRUE)
s_michael.b_is_using_secondary_cover = FALSE
s_michael.b_refresh_tasks = TRUE
s_michael.i_timer = 0
s_michael.i_event++
ENDIF
ENDIF
BREAK
CASE 61 //Fight the final enemies.
IF NOT b_has_text_label_triggered[BS2B_WAGON]
IF IS_VEHICLE_DRIVEABLE(veh_cops_car_park_2)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_car_park_2)
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_car_park_2) > 3000.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND f_dist_from_player < 900.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAGONM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_WAGON] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAGONF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_WAGON] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF s_michael.b_refresh_tasks
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND NOT b_is_in_combat)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
s_michael.b_refresh_tasks = FALSE
ENDIF
BREAK
ENDSWITCH
ENDIF
#IF IS_DEBUG_BUILD
IF b_debug_show_crew_state
TEXT_LABEL str_index = ""
str_index += s_michael.i_event
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_TEXT(str_index, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_selector_peds.pedID[e_current_buddy], <<0.0, 0.0, 2.0>>))
ENDIF
#ENDIF
ENDPROC
PROC UPDATE_CREW_DURING_SHOOTOUT()
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
VECTOR v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
INT i_closest_node
//INT i
SEQUENCE_INDEX seq
INT i_closest_node_to_buddy = 0
INT i_closest_node_to_player = 0
REQUEST_WAYPOINT_RECORDING(str_waypoint_shootout_route)
REQUEST_WAYPOINT_RECORDING(str_waypoint_crew_shootout)
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_shootout_route)
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_crew_shootout)
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_crew_pos, i_closest_node_to_buddy)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_player_pos, i_closest_node_to_player)
ELSE
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_crew_pos, i_closest_node_to_buddy)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_player_pos, i_closest_node_to_player)
ENDIF
ENDIF
SET_PED_RESET_FLAG(s_crew[CREW_MICHAEL_ID].ped, PRF_DisableFriendlyGunReactAudio, TRUE)
SWITCH s_crew[CREW_MICHAEL_ID].i_event
CASE 0 //Leave bank, combat cops that are waiting outside.
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_crew_shootout)
s_crew[CREW_MICHAEL_ID].v_dest = <<-2.5532, -670.1262, 48.5509>>
IF IS_SCREEN_FADED_OUT() //The crew is already given tasks on a switch, so only do this on a skip
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 118.6997, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF VDIST2(v_crew_pos, s_crew[CREW_MICHAEL_ID].v_dest) > 4.0
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-74.5, -702.1, 50.0>>, PEDMOVE_RUN, FALSE, 1.0, 4.0)
ENDIF
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, s_crew[CREW_MICHAEL_ID].v_dest, 1000, FALSE, 0.0, FALSE, FALSE, s_crew[CREW_MICHAEL_ID].cover, TRUE)
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(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 1
IF s_cops_start[0].b_is_created
AND IS_PED_INJURED(s_cops_start[0].ped)
AND IS_PED_INJURED(s_cops_start[1].ped)
s_crew[CREW_MICHAEL_ID].v_dest = <<-30.6679, -683.2444, 48.5509>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
BOOL b_shoot_while_run
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) != 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) != 0
b_shoot_while_run = TRUE
ENDIF
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-74.5, -702.1, 50.0>>, PEDMOVE_RUN, b_shoot_while_run, 1.0, 4.0)
//TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-74.5, -702.1, 50.0>>, 1000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 2 //Push a bit further once most of the enemies are dead.
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-30.6679, -683.2444, 48.5509>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 125.5623, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-29.0067, -677.4194, 48.5439>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 119.3390, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
IF NOT b_has_text_label_triggered[BS2B_CPUSH1]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(v_crew_pos, v_player_pos) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_PSH")
b_has_text_label_triggered[BS2B_CPUSH1] = TRUE
ENDIF
ENDIF
ENDIF
IF s_cops_pillars[0].b_is_created
AND IS_PED_INJURED(s_cops_pillars[0].ped)
AND IS_PED_INJURED(s_cops_start[2].ped)
AND IS_PED_INJURED(s_cops_start[3].ped)
s_crew[CREW_MICHAEL_ID].v_dest = <<-37.7259, -686.4499, 48.5495>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 118.4274, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
BOOL b_shoot_while_run
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) != 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) != 0
b_shoot_while_run = TRUE
ENDIF
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-74.5, -702.1, 50.0>>, PEDMOVE_RUN, b_shoot_while_run, 1.0, 4.0)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-74.5, -702.1, 50.0>>, 1000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 3 //Run to the end of pillars section
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-37.7259, -686.4499, 48.5495>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 118.4274, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-36.4270, -680.7614, 48.5394>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 76.3381, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
/*IF NOT b_has_text_label_triggered[BS2B_CPUSH2]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(v_crew_pos, v_player_pos) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_PSH")
b_has_text_label_triggered[BS2B_CPUSH2] = TRUE
ENDIF
ENDIF
ENDIF*/
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) = 0
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_crew_pos, i_closest_node)
TASK_FOLLOW_WAYPOINT_RECORDING(s_crew[CREW_MICHAEL_ID].ped, str_waypoint_crew_shootout, i_closest_node + 2, EWAYPOINT_DEFAULT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 4 //Once the cops at the end of the walkway pop out, start fighting them.
IF NOT s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_crew[CREW_MICHAEL_ID].ped)
WAYPOINT_PLAYBACK_START_AIMING_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-78.6, -702.2, 50.0>>, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = TRUE
ENDIF
ENDIF
IF NOT b_has_text_label_triggered[BS2B_CPUSH3]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(v_crew_pos, v_player_pos) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_PSH")
b_has_text_label_triggered[BS2B_CPUSH3] = TRUE
ENDIF
ENDIF
ENDIF
IF s_cops_pillars_end[0].i_event > 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars_end) = 0
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 2000
s_crew[CREW_MICHAEL_ID].v_dest = <<-60.9122, -696.5268, 48.4733>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ENDIF
BREAK
CASE 5 //Run down the stairs while aiming forwards
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars_end) = 0
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_crew_pos, i_closest_node)
TASK_FOLLOW_WAYPOINT_RECORDING(s_crew[CREW_MICHAEL_ID].ped, str_waypoint_crew_shootout, i_closest_node + 2, EWAYPOINT_DEFAULT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 6 //When ped at bottom of stairs pops out, start shooting at him.
IF NOT s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_crew[CREW_MICHAEL_ID].ped)
WAYPOINT_PLAYBACK_START_AIMING_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-113.2, -689.0, 44.3>>, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = TRUE
ENDIF
ENDIF
//Play dialogue for going down the stairs.
IF NOT b_has_text_label_triggered[BS2B_STAIRS]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF v_player_pos.z > 49.2 //Don't play if the player already went down the stairs.
IF IS_ENTITY_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-64.070358,-707.475342,51.801304>>, <<-80.975197,-701.118713,42.984421>>, 30.000000)
IF VDIST2(v_crew_pos, v_player_pos) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_STR")
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_STAIRS] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Once reaching the stairs progress to next task.
IF v_crew_pos.z < 48.5
s_crew[CREW_MICHAEL_ID].v_dest = <<-92.8086, -698.7925, 43.2513>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 77.3724, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-132.2, -674.7, 41.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-132.2, -674.7, 41.6>>, 1000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 7 //Once the player makes a move onto the bridge follow them on.
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-92.8086, -698.7925, 43.2513>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 77.3724, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-94.4246, -701.6109, 43.2255>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 60.9092, 2.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
IF b_player_got_to_bridge
s_crew[CREW_MICHAEL_ID].v_dest = <<-94.3734, -684.6033, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[1].ped)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, s_crew[CREW_MICHAEL_ID].v_dest, s_cops_heli_bridge_2[1].ped, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
b_crew_have_reached_bridge = TRUE
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 8 //Once first two bridge guys are dead continue across the bridge.
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-94.3734, -684.6033, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-96.9391, -686.5752, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) < 4
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_start) = 0
IF IS_PED_INJURED(s_cops_bridge[0].ped)
AND IS_PED_INJURED(s_cops_bridge[1].ped)
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 600
s_crew[CREW_MICHAEL_ID].v_dest = <<-104.8503, -680.8834, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[1].ped)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, s_crew[CREW_MICHAEL_ID].v_dest, s_cops_heli_bridge_2[1].ped, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
b_crew_have_reached_bridge = TRUE
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ENDIF
ENDIF
BREAK
CASE 9 //Once heli guy dies finish going across the bridge.
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-104.8503, -680.8834, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-100.7857, -687.0374, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
IF i_closest_node_to_buddy - i_closest_node_to_player < 5
OR s_cops_after_bridge[0].i_event > 0
s_crew[CREW_MICHAEL_ID].v_dest = <<-115.2149, -676.9531, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<-129.8, -674.0, 40.0>>, 20.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ENDIF
BREAK
CASE 10 //Finish off the last bridge enemies then progress.
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-115.2149, -676.9531, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-115.8660, -680.0275, 39.5162>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 150.0)
TASK_COMBAT_HATED_TARGETS_IN_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-129.8, -674.0, 40.0>>, 20.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
IF i_closest_node_to_buddy - i_closest_node_to_player < 5
OR s_cops_after_bridge[0].i_event > 0
s_crew[CREW_MICHAEL_ID].v_dest = <<-150.7710, -673.4553, 39.4888>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 68.1787, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-129.4, -675.5, 39.4888>>, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 1.0, 1.0, TRUE, ENAV_NO_STOPPING)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-173.89, -654.68, 33.69>>, 1000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<-172.55, -664.63, 40.0>>, 5.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
b_crew_member_crossed_bridge = TRUE
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ENDIF
BREAK
CASE 11 //Push forwards when one ramp enemy left
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-150.7710, -673.4553, 39.4888>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 68.1787, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-146.6174, -672.2836, 39.4997>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
AND VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 100.0
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 1400
s_crew[CREW_MICHAEL_ID].v_dest = <<-213.0200, -647.9929, 39.4881>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 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, s_crew[CREW_MICHAEL_ID].v_dest, <<-237.0136, -711.0485, 34.2278>>, PEDMOVE_SPRINT,
FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
i_crew_wait_dialogue_timer = 0
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ENDIF
BREAK
CASE 12 //Once the player reaches the stairs then keep moving.
IF IS_ENTITY_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-194.867493,-656.806824,39.488064>>, <<-167.274139,-665.861633,42.720985>>, 7.500000)
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, GET_ENTITY_COORDS(veh_cops_heli_ramp))
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, GET_ENTITY_COORDS(veh_cops_heli_ramp))
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
ENDIF
ELIF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_ramp_blockade) != 0
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, <<-232.8978, -694.9381, 36.0902>>)
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-232.8978, -694.9381, 36.0902>>)
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
ENDIF
ENDIF
ENDIF
IF VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 100.0
IF s_michael.i_event >= 50
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 1200
s_crew[CREW_MICHAEL_ID].v_dest = <<-192.6817, -647.4163, 47.6727>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 316.5104, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-194.1727, -655.5215, 47.2264>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, TRUE, 0.5, 1.0)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-154.0717, -549.3301, 48.7064>>, 1000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = FALSE
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
s_crew[CREW_MICHAEL_ID].i_event = 50
ENDIF
ELSE
//Play some dialogue if the crew are waiting on the player.
IF NOT b_has_text_label_triggered[BS2B_COM1]
IF i_crew_wait_dialogue_timer = 0
i_crew_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_crew_wait_dialogue_timer > 12000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(v_crew_pos, v_player_pos) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COM")
b_has_text_label_triggered[BS2B_COM1] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 50 //Fight the first business centre enemies, once they're dead push forwards.
//Change the crew member's cover point if the player steals their default one.
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
OR s_crew[CREW_MICHAEL_ID].b_refresh_tasks
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-192.6817, -647.4163, 47.6727>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 316.5104, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-215.1918, -639.5822, 47.2214>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 343.7635, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = FALSE
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1
AND v_crew_pos.z > 47.0
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
s_crew[CREW_MICHAEL_ID].v_dest = <<-177.7119, -604.4832, 47.2191>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 3.0, TRUE)
OPEN_SEQUENCE_TASK(seq)
//TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
//TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-169.3, -610.2, 49.0>>, PEDMOVE_SPRINT, TRUE,
// 0.5, 1.0, TRUE, ENAV_DEFAULT, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ENDIF
BREAK
CASE 51 //Fight the rest of the business centre enemies, then push to the end.
//Progress once all the enemies are dead.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1b) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1
s_crew[CREW_MICHAEL_ID].v_dest = <<-170.5575, -592.5718, 47.2322>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 348.7640, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-154.0717, -549.3301, 48.7064>>, 1000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 52 //Fight the second wave of enemies at the business centre, once dead push forwards.
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-170.7304, -592.4411, 47.2220>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 343.8275, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-167.0552, -592.7778, 47.2284>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_2) = 0
s_crew[CREW_MICHAEL_ID].v_dest = <<-159.9476, -561.1776, 47.2208>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 12.9, 3.0,
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 53 //Have the ped dive for cover once the merryweather chopper show up.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) != 0
IF b_merry_heli_is_active
AND IS_ENTITY_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-164.167935,-584.824866,45.725426>>, <<-154.954956,-559.742920,51.469128>>, 21.500000)
BOOL b_shoot
b_shoot = (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) != 0)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-154.0717, -549.3301, 51.7064>>, PEDMOVE_SPRINT, b_shoot, 2.0, 2.0, TRUE, ENAV_NO_STOPPING)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, PEDMOVE_SPRINT, DEFAULT, 2.0, ENAV_NO_STOPPING)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, s_crew[CREW_MICHAEL_ID].v_dest, 1000, FALSE, 0.0, FALSE, FALSE, s_crew[CREW_MICHAEL_ID].cover, TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ELSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 54 //Fight the Merryweather chopper, once dead continue down the stairs.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) = 0
IF (i_closest_node_to_buddy - i_closest_node_to_player < 8 AND VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 16.0)
OR s_cops_after_courtyard[0].i_event > 0
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-158.399490,-557.349121,44.969173>>, <<-156.922089,-565.438049,51.718651>>, 15.250000)
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
s_crew[CREW_MICHAEL_ID].v_dest = <<-144.1131, -553.1654, 39.4983>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-146.4362, -556.7252, 40.9678>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ELSE
IF NOT IS_PED_IN_COVER(s_crew[CREW_MICHAEL_ID].ped)
AND NOT IS_PED_GOING_INTO_COVER(s_crew[CREW_MICHAEL_ID].ped)
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_SEEK_COVER_TO_COORDS) != PERFORMING_TASK
TASK_SEEK_COVER_TO_COORDS(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, <<-166.8, -518.0, 52.7>>, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 55 //Fight the enemies at the bottom of the stairs, once done start running to the car park.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_courtyard) = 0
s_crew[CREW_MICHAEL_ID].v_dest = <<-195.2280, -564.3157, 39.4934>>
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-142.6308, -553.0471, 39.4983>>, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 56 //When the next group of enemies pop out switch to combat.
IF s_cops_before_car_park[0].i_event > 0
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) != 0
s_crew[CREW_MICHAEL_ID].v_dest = <<-169.6723, -557.6520, 39.4983>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 57 //Once the enemies are dead continue running to the car park.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) <= 0
s_crew[CREW_MICHAEL_ID].v_dest = <<-190.6681, -561.5054, 39.4977>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 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, s_crew[CREW_MICHAEL_ID].v_dest, <<-254.7373, -602.8020, 40.9296>>, PEDMOVE_SPRINT, FALSE,
0.5, 1.0, TRUE, ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
TASK_AIM_GUN_AT_COORD(NULL, <<-254.7373, -602.8020, 40.9296>>, -1)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
i_crew_wait_dialogue_timer = 0
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 58 // Wait at the corner for the player.
IF (i_closest_node_to_buddy - i_closest_node_to_player < 5 AND VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 16.0)
AND v_player_pos.z < 45.0
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
s_crew[CREW_MICHAEL_ID].v_dest = <<-210.4501, -593.2936, 39.5092>>
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 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, s_crew[CREW_MICHAEL_ID].v_dest, <<-240.9469, -573.4080, 38.2711>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
i_crew_wait_dialogue_timer = 0
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ELSE
//Play some dialogue if the crew are waiting on the player.
IF NOT b_has_text_label_triggered[BS2B_COM2]
IF i_crew_wait_dialogue_timer = 0
i_crew_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_crew_wait_dialogue_timer > 12000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(v_crew_pos, v_player_pos) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COM")
b_has_text_label_triggered[BS2B_COM2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 59 //Once the player reaches the ramp progress.
IF VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) > 16.0
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_garage_blockade) > 0
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, <<-240.9469, -573.4080, 38.2711>>)
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-240.9469, -573.4080, 38.2711>>)
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
ENDIF
ENDIF
ENDIF
ENDIF
IF VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 100.0
IF b_buddy_is_going_to_car_park
IF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 10000 //Timer may have already been set above, so check that the difference isn't large.
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
s_crew[CREW_MICHAEL_ID].v_dest = <<-181.7385, -631.7137, 31.4281>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 254.9355, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-217.6269, -623.7309, 32.4973>>, <<-246.0434, -647.4365, 33.9782>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-151.4, -649.4, 33.6759>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-151.4, -649.4, 33.6759>>, 1000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
ELSE
//Play some dialogue if the crew are waiting on the player.
IF NOT b_has_text_label_triggered[BS2B_COM3]
IF i_crew_wait_dialogue_timer = 0
i_crew_wait_dialogue_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_crew_wait_dialogue_timer > 12000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(v_crew_pos, v_player_pos) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COM")
b_has_text_label_triggered[BS2B_COM3] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 60 //Fight the first van in the car park, then push forward to the next one.
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-181.7385, -631.7137, 31.4281>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 254.9355, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-185.2314, -641.2884, 31.3864>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 245.8032, 2.0,
COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
//Shoot at nearby cops
IF v_crew_pos.z > 35.0
AND GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 1200
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_garage_blockade_2) > 0
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, <<-246.0434, -647.4365, 33.9782>>)
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-246.0434, -647.4365, 33.9782>>)
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
ENDIF
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(veh_cops_car_park_1)
IF IS_ENTITY_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-201.288651,-633.703491,30.983559>>, <<-184.850479,-640.012512,35.400841>>, 13.000000)
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, <<-158.3629, -647.3505, 32.9995>>)
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-158.3629, -647.3505, 32.9995>>)
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_1) = 0
s_crew[CREW_MICHAEL_ID].v_dest = <<-175.3369, -616.4162, 31.4281>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 6.8686 , 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
s_crew[CREW_MICHAEL_ID].i_timer = 0
s_crew[CREW_MICHAEL_ID].i_event++
ENDIF
BREAK
CASE 61 //Fight the second van, once dead take cover.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_3) != 0
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
s_crew[CREW_MICHAEL_ID].v_dest = <<-175.3369, -616.4162, 31.4281>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 6.8686 , 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
ELSE
s_crew[CREW_MICHAEL_ID].v_dest = <<-166.4209, -623.2525, 31.4281>>
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 4.0, TRUE)
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
ENDIF
BREAK
ENDSWITCH
//Have some special stuff happen if the good gunman was picked to protect Michael.
IF NOT b_picked_good_michael_gunman
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF b_debug_show_crew_state
TEXT_LABEL str_index = ""
str_index += s_crew[CREW_MICHAEL_ID].i_event
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_TEXT(str_index, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_MICHAEL_ID].ped, <<0.0, 0.0, 2.0>>))
ENDIF
#ENDIF
ENDPROC
PROC MANAGE_VAN_CHASE_SWITCHING()
SWITCH i_switch_stage
CASE 0
IF UPDATE_SELECTOR_HUD(s_selector_peds)
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
CLEAR_HELP()
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
DESTROY_ALL_CAMS()
s_selector_cam.camID = CREATE_CAM("DEFAULT_SPLINE_CAMERA", FALSE)
SET_CAM_SPLINE_SMOOTHING_STYLE(s_selector_cam.camID, CAM_SPLINE_SLOW_IN_OUT_SMOOTH)
s_selector_cam.camInterpIDs[0] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
VECTOR v_start_pos
v_start_pos = GET_FINAL_RENDERED_CAM_COORD() + (GET_ENTITY_VELOCITY(veh_chase_van) * GET_FRAME_TIME())
ATTACH_CAM_TO_ENTITY(s_selector_cam.camInterpIDs[0], veh_chase_van, GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_chase_van, v_start_pos))
SET_CAM_ROT(s_selector_cam.camInterpIDs[0], GET_FINAL_RENDERED_CAM_ROT())
SET_CAM_FOV(s_selector_cam.camInterpIDs[0], GET_FINAL_RENDERED_CAM_FOV())
s_selector_cam.camInterpIDs[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ATTACH_CAM_TO_ENTITY(s_selector_cam.camInterpIDs[1], veh_chase_van, <<-0.0244, 5.2763, 2.0373>>)
POINT_CAM_AT_ENTITY(s_selector_cam.camInterpIDs[1], veh_chase_van, <<-0.1910, 2.3076, 1.6382>>)
SET_CAM_FOV(s_selector_cam.camInterpIDs[1], 50.0319)
ADD_CAM_SPLINE_NODE_USING_CAMERA(s_selector_cam.camID, s_selector_cam.camInterpIDs[0], 0)
ADD_CAM_SPLINE_NODE_USING_CAMERA(s_selector_cam.camID, s_selector_cam.camInterpIDs[1], 1000)
ADD_CAM_SPLINE_NODE_USING_GAMEPLAY_FRAME(s_selector_cam.camID, 1000)
s_selector_cam.bSplineCreated = TRUE
i_switch_stage++
ENDIF
BREAK
CASE 1
//NOTE: setting the rotation outside of the -360.0 - 360.0 range tells the proc to not modify it (this is what we want).
IF NOT RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(s_selector_cam, 1000.0, 1000.0, SELECTOR_CAM_STRAIGHT_INTERP, 0)
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed])
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
SET_PED_DIES_WHEN_INJURED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
SET_PED_COMBAT_AI(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, v_zero)
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_MAX_HEALTH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 1800)
SET_ENTITY_HEALTH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 1800)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
i_switch_stage = 0
ENDIF
ELSE
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(s_selector_cam.pedTo)
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC UPDATE_PLAYER_TUNNEL_SHOOTOUT_DIALOGUE()
IF GET_GAME_TIMER() - i_player_combat_dialogue_timer > 0
AND IS_PED_SHOOTING(PLAYER_PED_ID())
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_FFIGHT", CONV_PRIORITY_MEDIUM)
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_PLAYER_DEFEND_CREW_DIALOGUE()
IF GET_GAME_TIMER() - i_player_combat_dialogue_timer > 0
AND IS_PED_SHOOTING(PLAYER_PED_ID())
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TUNNEL1", CONV_PRIORITY_MEDIUM)
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
ENDIF
ENDIF
ENDIF
ENDPROC
INT i_crew_dialogue_timer = 0
PROC UPDATE_BUDDY_SHOOTOUT_DIALOGUE(VECTOR v_player_pos, BOOL b_ignore_buddy = FALSE)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
AND NOT IS_SELECTOR_CAM_ACTIVE()
IF GET_GAME_TIMER() - i_combat_dialogue_wait_time > 0
//Player dialogue
IF GET_GAME_TIMER() - i_player_combat_dialogue_timer > 0
AND IS_PED_SHOOTING(PLAYER_PED_ID())
AND (VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0 OR b_ignore_buddy)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CGEN", CONV_PRIORITY_MEDIUM)
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ELSE
//If the player is Michael and hasn't reached Franklin yet then there are some specific lines to play.
IF NOT IS_ENTITY_VISIBLE(s_selector_peds.pedID[e_current_buddy])
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_SHOUT", CONV_PRIORITY_MEDIUM)
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CGENM", CONV_PRIORITY_MEDIUM)
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ENDIF
ENDIF
//Buddy dialogue
IF GET_GAME_TIMER() - i_buddy_combat_dialogue_timer > 0
AND b_has_text_label_triggered[BS2B_FRANARR] //Don't start checking until Franklin's arrival line has played.
IF IS_ENTITY_VISIBLE(s_selector_peds.pedID[e_current_buddy])
IF (IS_PED_IN_COMBAT(s_selector_peds.pedID[e_current_buddy]) OR IS_PED_SHOOTING(s_selector_peds.pedID[e_current_buddy]))
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CGENM", CONV_PRIORITY_MEDIUM)
i_buddy_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CGEN", CONV_PRIORITY_MEDIUM)
i_buddy_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ENDIF
ELSE
//Add a small delay so that peds don't start shouting if they trigger combat for a single frame.
i_buddy_combat_dialogue_timer = GET_GAME_TIMER() + 250
ENDIF
ELSE
//If the buddy hasn't joined the fight yet then keep the timer updated.
i_buddy_combat_dialogue_timer = GET_GAME_TIMER() + 10000
ENDIF
ENDIF
//Crew member dialogue.
IF GET_GAME_TIMER() - i_crew_dialogue_timer > 0
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
IF (IS_PED_IN_COMBAT(s_crew[CREW_MICHAEL_ID].ped) OR IS_PED_SHOOTING(s_crew[CREW_MICHAEL_ID].ped))
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)) < 400.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_ATT")
i_crew_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(18000, 23000)
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ELSE
//Add a small delay so that peds don't start shouting if they trigger combat for a single frame.
i_crew_dialogue_timer = GET_GAME_TIMER() + 250
ENDIF
ENDIF
ENDIF
//Some specific lines:
//Play a "more cops" line when the guys at the end of the bridge show up.
IF NOT b_has_text_label_triggered[BS2B_MORE1]
IF s_cops_bridge_2[0].b_is_created
IF s_cops_bridge_2[0].i_event > 0
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer > 2000
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer < 7000
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) > 0
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MORE1] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MORE1] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
b_has_text_label_triggered[BS2B_MORE1] = TRUE
ENDIF
ENDIF
ELSE
i_more_cops_dialogue_timer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
//Play a "more cops" line when the guys at the other end of the plaza show up.
IF NOT b_has_text_label_triggered[BS2B_MORE2]
IF s_cops_courtyard_2[0].b_is_created
IF s_cops_courtyard_2[0].i_event > 0
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer > 2000
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer < 5000
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_2) > 0
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MORE2] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MORE2] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
b_has_text_label_triggered[BS2B_MORE2] = TRUE
ENDIF
ENDIF
ELSE
i_more_cops_dialogue_timer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
//Play a "more cops" line when the guys before the car park show up.
IF NOT b_has_text_label_triggered[BS2B_MORE3]
IF s_cops_before_car_park[0].b_is_created
IF s_cops_before_car_park[0].i_event > 0
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer > 2000
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer < 7000
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) > 0
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MORE3] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MORE3] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
b_has_text_label_triggered[BS2B_MORE3] = TRUE
ENDIF
ENDIF
ELSE
i_more_cops_dialogue_timer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MISSION_FAILED(FAILED_REASON reason)
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
IF NOT b_mission_failed
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
KILL_ANY_CONVERSATION()
Store_Fail_Weapon(PLAYER_PED_ID(), ENUM_TO_INT(GET_PLAYER_PED_ENUM(PLAYER_PED_ID())))
IF reason = FAILED_ALERTED_BANK
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
TASK_SMART_FLEE_PED(s_crew[CREW_MICHAEL_ID].ped, PLAYER_PED_ID(), 200.0, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF
ENDIF
//Make sure the trolleys are detached from the crew member on a fail.
IF e_mission_stage = STAGE_COLLECT_GOLD
IF DOES_ENTITY_EXIST(obj_gold_trolleys[0])
AND DOES_ENTITY_EXIST(obj_gold_containers[0])
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
DETACH_ENTITY(obj_gold_trolleys[0], TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[0], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(obj_gold_trolleys[1])
AND DOES_ENTITY_EXIST(obj_gold_containers[1])
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
SET_ENTITY_COLLISION(obj_gold_containers[1], TRUE)
DETACH_ENTITY(obj_gold_trolleys[1], TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[1], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
ENDIF
ENDIF
ENDIF
ENDIF
//If Trevor's chopper is playing a recording then make sure it stops if appropriate.
IF reason = FAILED_DESTROYED_CHOPPER
OR reason = FAILED_CREW_MEMBER_DIED
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
ENDIF
IF NOT IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
SET_VEHICLE_OUT_OF_CONTROL(s_gold_choppers[1].veh, FALSE)
ENDIF
ENDIF
ENDIF
SWITCH reason
CASE FAILED_GENERIC
str_fail_label = ""
BREAK
CASE FAILED_ALERTED_BANK
str_fail_label = "F3B_BANKALERT"
BREAK
CASE FAILED_CREW_MEMBER_DIED
str_fail_label = "F3B_CREWDEAD"
BREAK
CASE FAILED_CREW_MEMBERS_DIED
str_fail_label = "F3B_CREWDEAD2"
BREAK
CASE FAILED_DESTROYED_CHOPPER
str_fail_label = "F3B_HELIDEAD"
BREAK
CASE FAILED_DESTROYED_FRANKLINS_CAR
str_fail_label = "F3B_FCARDEAD"
BREAK
CASE FAILED_DESTROYED_START_CAR
str_fail_label = "F3B_CARDEAD"
BREAK
CASE FAILED_DESTROYED_END_CAR
str_fail_label = "F3B_CARDEAD"
BREAK
CASE FAILED_DESTROYED_TREVORS_CAR
str_fail_label = "F3B_TCARDEAD"
BREAK
CASE FAILED_FRANKLIN_DIED
str_fail_label = "F3B_FRANDEAD"
BREAK
CASE FAILED_LEFT_CHOPPER_BEHIND
str_fail_label = "F3B_LEFTHELI"
BREAK
CASE FAILED_LOST_CREW_MEMBER
str_fail_label = "F3B_CREWLOST"
BREAK
CASE FAILED_LOST_CREW_MEMBERS
str_fail_label = "F3B_CREWLOST2"
BREAK
CASE FAILED_MICHAEL_DIED
str_fail_label = "F3B_MICHDEAD"
BREAK
CASE FAILED_RAN_OUT_OF_CHARGES
str_fail_label = "F3B_CHARGEGONE"
BREAK
CASE FAILED_STUCK_CHOPPER
str_fail_label = "F3B_HELISTUCK"
BREAK
CASE FAILED_STUCK_START_CAR
str_fail_label = "F3B_CARSTUCK"
BREAK
CASE FAILED_STUCK_CUTTER
str_fail_label = "F3B_CUTSTUCK"
BREAK
CASE FAILED_TREVOR_DIED
str_fail_label = "F3B_TREVDEAD"
BREAK
CASE FAILED_ABANDONED_CREW_IN_TUNNELS
str_fail_label = "F3B_FABANCREW"
BREAK
CASE FAILED_ABANDONED_CREW_IN_SHOOTOUT
str_fail_label = "F3B_FABANCREW"
BREAK
CASE FAILED_ABANDONED_CREW_IN_CHASE
str_fail_label = "F3B_FABANCREW"
BREAK
CASE FAILED_ABANDONED_HEIST
str_fail_label = "F3B_FABANHEIST"
BREAK
CASE FAILED_BAILED_OUT_OF_CHOPPER
str_fail_label = "F3B_BAILFAIL"
BREAK
CASE FAILED_LESTER_DIED
str_fail_label = "F3B_LESTDEAD"
BREAK
CASE FAILED_ABANDONED_LESTER
str_fail_label = "F3B_LESTLOST"
BREAK
CASE FAILED_CUTTER_BLOCKING_TUNNEL
str_fail_label = "F3B_CUTBLOCK"
BREAK
CASE FAILED_TROLLEY_DETACHED
str_fail_label = "F3B_DETACHFAIL"
BREAK
CASE FAILED_DIDNT_KILL_MERRYWEATHER
str_fail_label = "F3B_MERRYFAIL"
BREAK
CASE FAILED_MISSED_TRAIN
str_fail_label = "F3B_TRAINFAIL"
BREAK
ENDSWITCH
b_mission_failed = TRUE
ENDIF
REMOVE_ALL_BLIPS()
TRIGGER_MUSIC_EVENT("FH2B_MISSION_FAIL")
MISSION_FLOW_MISSION_FAILED_WITH_REASON(str_fail_label)
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
IF e_mission_stage < STAGE_LEAVE_BANK
UPDATE_CUTTER_SPINNING()
ENDIF
//Maintain anything that could look weird during fade out (e.g. enemies walking off).
IF e_mission_stage = STAGE_CITY_SHOOTOUT
UPDATE_SHOOTOUT_COPS()
ENDIF
//1496283 - Lester must be deleted before the restricted helicopter.
IF IS_SCREEN_FADED_OUT()
REMOVE_OBJECT(obj_lesters_rpg, TRUE)
REMOVE_OBJECT(obj_single_rocket, TRUE)
REMOVE_PED(s_lester.ped, TRUE)
i_lester_rocket_sync_scene = -1
ENDIF
WAIT(0)
ENDWHILE
//Deal with group members and same vehicle cleanup.
FORCE_DELETE_PED_FOR_FAIL(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
FORCE_DELETE_PED_FOR_FAIL(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
FORCE_DELETE_PED_FOR_FAIL(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
FORCE_DELETE_PED_FOR_FAIL(s_crew[CREW_DRIVER_ID].ped)
FORCE_DELETE_PED_FOR_FAIL(s_crew[CREW_FRANKLIN_ID].ped)
FORCE_DELETE_PED_FOR_FAIL(s_crew[CREW_MICHAEL_ID].ped)
FORCE_DELETE_PED_FOR_FAIL(s_lester.ped)
//Remove balaclava and gloves from the player.
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL, SPECIAL_P0_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_DECL, DECL_P0_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_HAND, HAND_P0_NONE, FALSE)
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_SPECIAL, SPECIAL_P1_DUMMY, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_DECL, DECL_P1_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_NONE, FALSE)
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_HAND, HAND_P2_NONE, FALSE)
ENDIF
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, b_has_changed_clothes_michael)
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, b_has_changed_clothes_franklin)
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR, b_has_changed_clothes_trevor)
IF (e_mission_stage >= STAGE_DRILL_THROUGH_WALL AND e_mission_stage <= STAGE_LEAVE_BANK)
OR e_mission_stage = STAGE_CHOPPER_CHASE
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<70.1244, -618.3326, 30.6703>>, 123.7843)
//2229928 - If the player failed near the bank then force reset the interiors while the screen is faded.
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_NORMAL, FALSE)
SET_BUILDING_STATE(BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_NORMAL, FALSE)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_NORMAL, FALSE)
b_were_ipls_reset_early = TRUE
ELIF (e_mission_stage = STAGE_DROP_GOLD_ON_TRAIN OR e_mission_stage = STAGE_LAND_AT_AIRFIELD)
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<2088.3970, 2604.4448, 52.1730>>, 0.8348)
ENDIF
IF b_vehicle_gen_set_to_unavailable
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MISSION_VEH_FBI4_PREP, TRUE)
b_vehicle_gen_set_to_unavailable = FALSE
ENDIF
// check if we need to respawn the player in a different position,
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
//MISSION_FLOW_SET_FAIL_WARP_LOCATION(<< 144.2238, -1311.4945, 28.0306 >>, 53.4660)
//SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<< 145.1657, -1304.0176, 28.0517 >>, 118.8119)
MISSION_CLEANUP()
ENDIF
ENDPROC
//=======================================
// CUSTOM SWITCH CAM STUFFS
//=======================================
ENUM BIGSCORE2B_SWITCH_CAM_STATE
SWITCH_CAM_IDLE,
SWITCH_CAM_START_SPLINE1,
SWITCH_CAM_PLAYING_SPLINE1,
SWITCH_CAM_RETURN_TO_GAMEPLAY
ENDENUM
BIGSCORE2B_SWITCH_CAM_STATE eSwitchCamState = SWITCH_CAM_IDLE
SWITCH_CAM_STRUCT scsSwitchCamMichaelToFranklin
INT iSyncSceneCustomSwitch
FLOAT fSyncSceneCustomSwitchPhase = 0.15
FLOAT fMichaelCrewConvoStartPhase = 0.300
FLOAT fWooshStartPhase = 0.732713
FLOAT fWooshStopPhase = 0.866397
FLOAT fSwitchSceneFX1StartPhase = 0.732713
FLOAT fSwitchSceneFX2StartPhase = 0.764283
INT iWooshSoundID = -1
BOOL bCrewMemberWalkToCar = FALSE
BOOL bWooshStarted = FALSE
BOOL bWooshStopped = FALSE
BOOL bSwitchSceneFX1Started = FALSE
BOOL bSwitchSceneFX2Started = FALSE
BOOL bSwitchedToFranklin = FALSE
BOOL bCustomSwitchSRLRequested = FALSE
BOOL bSetSRLPostCutsceneCam = FALSE
STRING strCustomSwitchSRL = "fin_2b_customswitch"
FLOAT fSRLTime = -9999.0
/*#IF IS_DEBUG_BUILD
BOOL bWarpPlayerToSwitchLocation = FALSE
#ENDIF*/
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX viVeh1, VEHICLE_INDEX viVeh2)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN")
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[0].iNodeTime = 0
thisSwitchCam.nodes[0].vNodePos = <<-2.0834, 0.9941, 0.9668>>
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[0].vNodeDir = <<0.1204, 0.2895, 0.8984>>
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 40.0000
thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[0].iNodeToClone = 0
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[0].fNodeCamShake = 0.2000
thisSwitchCam.nodes[0].iCamEaseType = 1
thisSwitchCam.nodes[0].fCamEaseScaler = 0.7000
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[0].fTimeScale = 1.0000
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[0].fMinExposure = 0.0000
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
thisSwitchCam.nodes[0].iRampUpDuration = 0
thisSwitchCam.nodes[0].iRampDownDuration = 0
thisSwitchCam.nodes[0].iHoldDuration = 0
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[0].bUseCustomDOF = TRUE
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 50.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.8000
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 2600
thisSwitchCam.nodes[1].vNodePos = <<-2.1614, 0.7546, 0.9048>>
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[1].vNodeDir = <<0.0425, 0.0507, 0.8354>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].fNodeFOV = 40.0000
thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[1].iNodeToClone = 0
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[1].fNodeCamShake = 0.2000
thisSwitchCam.nodes[1].iCamEaseType = 0
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[1].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[1].fTimeScale = 1.0000
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[1].fMinExposure = 0.0000
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
thisSwitchCam.nodes[1].iRampUpDuration = 0
thisSwitchCam.nodes[1].iRampDownDuration = 0
thisSwitchCam.nodes[1].iHoldDuration = 0
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[1].bUseCustomDOF = TRUE
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 50.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.8000
thisSwitchCam.nodes[2].bIsCamCutNode = TRUE
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[3].iNodeTime = 0
thisSwitchCam.nodes[3].vNodePos = <<1.9790, 0.6067, 0.9139>>
thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[3].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[3].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[3].vNodeDir = <<-0.0404, 0.1328, 0.8930>>
thisSwitchCam.nodes[3].bPointAtEntity = TRUE
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[3].fNodeFOV = 35.0000
thisSwitchCam.nodes[3].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[3].iNodeToClone = 0
thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[3].fNodeCamShake = 0.2000
thisSwitchCam.nodes[3].iCamEaseType = 1
thisSwitchCam.nodes[3].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[3].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[3].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[3].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[3].fTimeScale = 1.0000
thisSwitchCam.nodes[3].iTimeScaleEaseType = 0
thisSwitchCam.nodes[3].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[3].bFlashEnabled = FALSE
thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[3].fMinExposure = 0.0000
thisSwitchCam.nodes[3].fMaxExposure = 0.0000
thisSwitchCam.nodes[3].iRampUpDuration = 0
thisSwitchCam.nodes[3].iRampDownDuration = 0
thisSwitchCam.nodes[3].iHoldDuration = 0
thisSwitchCam.nodes[3].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[3].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[3].bUseCustomDOF = FALSE
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_FarDOF = 50.0000
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.8000
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[4].iNodeTime = 6400
thisSwitchCam.nodes[4].vNodePos = <<1.8804, 0.5757, 0.9129>>
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[4].vNodeDir = <<-0.0387, 0.1253, 0.8931>>
thisSwitchCam.nodes[4].bPointAtEntity = TRUE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[4].fNodeFOV = 35.0000
thisSwitchCam.nodes[4].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[4].iNodeToClone = 0
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[4].fNodeCamShake = 0.2000
thisSwitchCam.nodes[4].iCamEaseType = 2
thisSwitchCam.nodes[4].fCamEaseScaler = 0.5
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[4].fTimeScale = 1.0000
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[4].fMinExposure = 0.0000
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
thisSwitchCam.nodes[4].iRampUpDuration = 0
thisSwitchCam.nodes[4].iRampDownDuration = 0
thisSwitchCam.nodes[4].iHoldDuration = 0
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 50.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.8000
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[5].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[5].iNodeTime = 600
thisSwitchCam.nodes[5].vNodePos = <<1.8908, 0.5751, -0.0736>>
thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[5].vNodeDir = <<-0.0283, 0.1247, -0.0935>>
thisSwitchCam.nodes[5].bPointAtEntity = TRUE
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[5].fNodeFOV = 35.0000
thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[5].iNodeToClone = 0
thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[5].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[5].fNodeCamShake = 0.2000
thisSwitchCam.nodes[5].iCamEaseType = 0
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[5].fTimeScale = 1.0000
thisSwitchCam.nodes[5].iTimeScaleEaseType = 0
thisSwitchCam.nodes[5].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[5].bFlashEnabled = TRUE
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelIn
thisSwitchCam.nodes[5].fMinExposure = 0.0000
thisSwitchCam.nodes[5].fMaxExposure = 0.0000
thisSwitchCam.nodes[5].iRampUpDuration = 0
thisSwitchCam.nodes[5].iRampDownDuration = 0
thisSwitchCam.nodes[5].iHoldDuration = 0
thisSwitchCam.nodes[5].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[5].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[5].bUseCustomDOF = FALSE
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_FarDOF = 50.0000
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 0.8000
thisSwitchCam.nodes[6].bIsCamCutNode = TRUE
thisSwitchCam.nodes[7].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[7].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[7].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[7].iNodeTime = 0
thisSwitchCam.nodes[7].vNodePos = <<-2.8515, 1.6151, 3.2973>> //<<-3.6654, 2.6977, 3.2973>>
thisSwitchCam.nodes[7].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[7].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[7].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[7].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[7].vNodeDir = <<-0.4965, -0.2387, 3.1747>> //<<-0.0146, -0.1552, 3.1747>>
thisSwitchCam.nodes[7].bPointAtEntity = TRUE
thisSwitchCam.nodes[7].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[7].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[7].fNodeFOV = 40.0000
thisSwitchCam.nodes[7].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[7].iNodeToClone = 0
thisSwitchCam.nodes[7].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[7].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[7].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[7].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[7].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[7].fNodeCamShake = 0.0
thisSwitchCam.nodes[7].iCamEaseType = 0
thisSwitchCam.nodes[7].fCamEaseScaler = 0.0
thisSwitchCam.nodes[7].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[7].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[7].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[7].fTimeScale = 1.0000
thisSwitchCam.nodes[7].iTimeScaleEaseType = 0
thisSwitchCam.nodes[7].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[7].bFlashEnabled = FALSE
thisSwitchCam.nodes[7].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[7].fMinExposure = 0.0000
thisSwitchCam.nodes[7].fMaxExposure = 0.0000
thisSwitchCam.nodes[7].iRampUpDuration = 0
thisSwitchCam.nodes[7].iRampDownDuration = 0
thisSwitchCam.nodes[7].iHoldDuration = 0
thisSwitchCam.nodes[7].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[7].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[7].bUseCustomDOF = FALSE
thisSwitchCam.nodes[7].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[7].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[7].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[8].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[8].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[8].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[8].iNodeTime = 400
thisSwitchCam.nodes[8].vNodePos = <<-2.8515, 1.6151, 1.2940>>
thisSwitchCam.nodes[8].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[8].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[8].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[8].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[8].vNodeDir = <<-0.4965, -0.2387, 1.2255>>
thisSwitchCam.nodes[8].bPointAtEntity = TRUE
thisSwitchCam.nodes[8].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[8].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[8].fNodeFOV = 40.0000
thisSwitchCam.nodes[8].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[8].iNodeToClone = 0
thisSwitchCam.nodes[8].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[8].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[8].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[8].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[8].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[8].fNodeCamShake = 0.0
thisSwitchCam.nodes[8].iCamEaseType = 1
thisSwitchCam.nodes[8].fCamEaseScaler = 0.5
thisSwitchCam.nodes[8].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[8].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[8].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[8].fTimeScale = 1.0000
thisSwitchCam.nodes[8].iTimeScaleEaseType = 0
thisSwitchCam.nodes[8].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[8].bFlashEnabled = FALSE
thisSwitchCam.nodes[8].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[8].fMinExposure = 0.0000
thisSwitchCam.nodes[8].fMaxExposure = 0.0000
thisSwitchCam.nodes[8].iRampUpDuration = 0
thisSwitchCam.nodes[8].iRampDownDuration = 0
thisSwitchCam.nodes[8].iHoldDuration = 0
thisSwitchCam.nodes[8].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[8].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[8].bUseCustomDOF = FALSE
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[9].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[9].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[9].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[9].iNodeTime = 600
thisSwitchCam.nodes[9].vNodePos = <<-2.8515, 1.6151, 0.8940>> //<<-3.7233, 2.7130, 1.2147>>
thisSwitchCam.nodes[9].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[9].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[9].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[9].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[9].vNodeDir = <<-0.4965, -0.2387, 1.0255>> //<<-0.0726, -0.1398, 1.0920>>
thisSwitchCam.nodes[9].bPointAtEntity = TRUE
thisSwitchCam.nodes[9].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[9].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[9].fNodeFOV = 40.0000
thisSwitchCam.nodes[9].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[9].iNodeToClone = 0
thisSwitchCam.nodes[9].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[9].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[9].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[9].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[9].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[9].fNodeCamShake = 0.0
thisSwitchCam.nodes[9].iCamEaseType = 0
thisSwitchCam.nodes[9].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[9].fCamNodeVelocityScale = -0.7060
thisSwitchCam.nodes[9].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[9].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[9].fTimeScale = 1.0000
thisSwitchCam.nodes[9].iTimeScaleEaseType = 0
thisSwitchCam.nodes[9].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[9].bFlashEnabled = FALSE
thisSwitchCam.nodes[9].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[9].fMinExposure = 0.0000
thisSwitchCam.nodes[9].fMaxExposure = 0.0000
thisSwitchCam.nodes[9].iRampUpDuration = 0
thisSwitchCam.nodes[9].iRampDownDuration = 0
thisSwitchCam.nodes[9].iHoldDuration = 0
thisSwitchCam.nodes[9].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[9].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[9].bUseCustomDOF = FALSE
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[10].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[10].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[10].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[10].iNodeTime = 1750
thisSwitchCam.nodes[10].vNodePos = <<-2.8515, 1.6151, 0.8940>> //<<-3.7233, 2.7130, 1.2147>>
thisSwitchCam.nodes[10].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[10].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[10].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[10].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[10].vNodeDir = <<-0.4965, -0.2387, 1.0255>> //<<-0.0726, -0.1398, 1.0920>>
thisSwitchCam.nodes[10].bPointAtEntity = TRUE
thisSwitchCam.nodes[10].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[10].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[10].fNodeFOV = 40.0000
thisSwitchCam.nodes[10].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[10].iNodeToClone = 0
thisSwitchCam.nodes[10].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[10].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[10].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[10].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[10].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[10].fNodeCamShake = 0.0
thisSwitchCam.nodes[10].iCamEaseType = 0
thisSwitchCam.nodes[10].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[10].fCamNodeVelocityScale = 0.5000
thisSwitchCam.nodes[10].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[10].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[10].fTimeScale = 1.0000
thisSwitchCam.nodes[10].iTimeScaleEaseType = 0
thisSwitchCam.nodes[10].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[10].bFlashEnabled = FALSE
thisSwitchCam.nodes[10].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[10].fMinExposure = 0.0000
thisSwitchCam.nodes[10].fMaxExposure = 0.0000
thisSwitchCam.nodes[10].iRampUpDuration = 0
thisSwitchCam.nodes[10].iRampDownDuration = 0
thisSwitchCam.nodes[10].iHoldDuration = 0
thisSwitchCam.nodes[10].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[10].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[10].bUseCustomDOF = FALSE
thisSwitchCam.nodes[10].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[10].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[10].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.iNumNodes = 11
thisSwitchCam.iCamSwitchFocusNode = 6
thisSwitchCam.fSwitchSoundAudioStartPhase = -1.0000
thisSwitchCam.fSwitchSoundAudioEndPhase = -1.0000
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_BigScore2B_MichaelToFranklin.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_BigScore2B_MichaelToFranklin.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.viVehicles[0] = viVeh1
thisSwitchCam.viVehicles[1] = viVeh2
ENDPROC
FUNC BOOL HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam)
//CDEBUG3LN(DEBUG_MISSION, "HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN")
//1991361 - HD interior is popping during the switch.
IF NOT IS_ENTITY_DEAD(veh_cutter)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(veh_cutter)
ENDIF
INT iCurrentNode
FLOAT fCamPhase
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_START_SPLINE1
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_START_SPLINE1")
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
DESTROY_ALL_CAMS()
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(thisSwitchCam, s_start_car.veh, veh_cutter)
CREATE_SPLINE_CAM(thisSwitchCam)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
AND IS_VEHICLE_DRIVEABLE(s_start_car.veh)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(s_crew[CREW_MICHAEL_ID].ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SET_ENTITY_HEADING(s_start_car.veh, 69.5421)
SET_ENTITY_COORDS(s_start_car.veh, <<-7.1097, -741.5182, 43.1419>>)
SET_VEHICLE_ENGINE_HEALTH(s_start_car.veh, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(s_start_car.veh, 1000.0)
CLEAR_AREA(<<-7.1097, -741.5182, 43.1419>>, 20.0, TRUE)
iSyncSceneCustomSwitch = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncSceneCustomSwitch, s_start_car.veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_start_car.veh, "seat_dside_f"))
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncSceneCustomSwitch, str_anim_custom_switch, "michael_call_franklin", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_MICHAEL_ID].ped, iSyncSceneCustomSwitch, str_anim_custom_switch, "michael_call_franklin_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCustomSwitch, fSyncSceneCustomSwitchPhase)
PLAY_ENTITY_ANIM(s_start_car.veh, "michael_call_franklin_cardoor", str_anim_custom_switch, INSTANT_BLEND_IN, FALSE, FALSE, DEFAULT, fSyncSceneCustomSwitchPhase)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
FORCE_PED_AI_AND_ANIMATION_UPDATE(s_crew[CREW_MICHAEL_ID].ped)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(s_start_car.veh)
ENDIF
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
BEGIN_SRL()
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
fSRLTime = -9999.0 //Just setting to large negative so first frame i actually set to zero in UPDATE_SRL_FRAME_TIME()
bWooshStarted = FALSE
bWooshStopped = FALSE
bSwitchSceneFX1Started = FALSE
bSwitchSceneFX2Started = FALSE
bSwitchedToFranklin = FALSE
bSetSRLPostCutsceneCam = FALSE
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
FALLTHRU
CASE SWITCH_CAM_PLAYING_SPLINE1
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
fSRLTime += (GET_FRAME_TIME() * 1000)
IF fSRLTime < 0.0
fSRLTime = 0.0
ENDIF
CDEBUG3LN(DEBUG_MISSION, "SRL Time = ", fSRLTime)
SET_SRL_TIME(fSRLTime)
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
iCurrentNode = iCurrentNode
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam)
fCamPhase = fCamPhase
fCamPhase = GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)
#IF IS_DEBUG_BUILD
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN: fCamPhase = ", fCamPhase, " iCurrentNode = ", iCurrentNode, "TIMERB = ", TIMERB())
#ENDIF
IF NOT bSetSRLPostCutsceneCam
IF iCurrentNode > 2
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START(<<-4.6, -615.3, 18.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-1.4, 0.0, -143.5>>), 90.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
//SET_SRL_POST_CUTSCENE_CAMERA(<<-4.6, -615.3, 18.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-1.4, 0.0, -143.5>>))
//SET_SRL_POST_CUTSCENE_CAMERA(<<-4.6, -615.3, 18.1>>, <<-1.4, 0.0, -143.5>>)
ELSE
bSetSRLPostCutsceneCam = TRUE
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
AND IS_VEHICLE_DRIVEABLE(s_start_car.veh)
//Play a quick convo with the crew member.
IF NOT b_has_text_label_triggered[BS2B_MBANK]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
OR b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
FLOAT fSyncScenePhase
fSyncScenePhase = 0.0
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneCustomSwitch)
fSyncScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCustomSwitch)
ENDIF
IF fSyncScenePhase >= fMichaelCrewConvoStartPhase
IF b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
BEGIN_PRELOADED_CONVERSATION()
b_has_text_label_triggered[BS2B_MBANK] = TRUE
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MBANK", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MBANK] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF NOT b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
KILL_FACE_TO_FACE_CONVERSATION() //In case the in-car convo from the previous section is still going.
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_BANK]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
CrewMember eCrewID
eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID)
TEXT_LABEL strLabel
INT iNumTimesGunmanHired
iNumTimesGunmanHired = GET_NUMBER_OF_TIMES_CREW_MEMBER_HIRED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID))
IF iNumTimesGunmanHired > 0
OR eCrewID = CM_GUNMAN_G_KARL
strLabel = "BS2B_BANK"
ELSE
strLabel = "BS2B_BNK2"
ENDIF
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, strLabel)
b_has_text_label_triggered[BS2B_BANK] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bSwitchedToFranklin
IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
CDEBUG3LN(DEBUG_MISSION, "Switching to Franklin...")
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
FREEZE_ENTITY_POSITION(veh_cutter, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(veh_cutter)
SET_VEHICLE_DOORS_SHUT(veh_cutter)
SET_VEHICLE_FIXED(veh_cutter)
SET_VEHICLE_ENGINE_ON(veh_cutter, TRUE, FALSE)
ENDIF
s_selector_peds.pedID[SELECTOR_PED_MICHAEL] = PLAYER_PED_ID()
SET_SELECTOR_PED_FAKE_STATE(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_STATE_AVAILABLE)
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, FALSE, TRUE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
TASK_PLAY_ANIM(PLAYER_PED_ID(), str_anim_custom_switch2, "start_engine", SLOW_BLEND_IN, WALK_BLEND_OUT, -1, DEFAULT, 0.0) //"we_got_your_gear_franklin")
SHAKE_SCRIPT_GLOBAL("HAND_SHAKE", 1.0)
/*VECTOR vPostCamPos
VECTOR vPostCamDir
vPostCamPos = <<438.9, -1068.8, 31.1>>
vPostCamDir = <<-1.6, 0.0, 97.0>>
SET_SRL_POST_CUTSCENE_CAMERA(vPostCamPos, vPostCamDir)*/
bSwitchedToFranklin = TRUE
ENDIF
ENDIF
ENDIF
IF bSwitchedToFranklin
UPDATE_CUTTER_SPINNING()
IF NOT b_has_text_label_triggered[BS2B_BORE]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BORE", CONV_PRIORITY_MEDIUM)
SETTIMERB(0)
b_has_text_label_triggered[BS2B_BORE] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bSwitchSceneFX1Started
IF fCamPhase >= fSwitchSceneFX1StartPhase
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN: Triggering Hit_Out audio, TIMERB = ", TIMERB())
//ANIMPOSTFX_PLAY("SwitchShortMichaelIn", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bSwitchSceneFX1Started = TRUE
ENDIF
ENDIF
IF NOT bSwitchSceneFX2Started
IF fCamPhase >= fSwitchSceneFX2StartPhase
CDEBUG3LN(DEBUG_MISSION, "FX2 Started...")
ANIMPOSTFX_PLAY("SwitchShortFranklinMid", 0, FALSE)
bSwitchSceneFX2Started = TRUE
ENDIF
ENDIF
IF NOT bWooshStarted
IF fCamPhase >= 0.749
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN: Triggering Short_Transition_Int audio, TIMERB = ", TIMERB())
PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bWooshStarted = TRUE
ENDIF
ENDIF
//Old version: remove when new sound is verified.
IF NOT bWooshStarted
IF fCamPhase >= fWooshStartPhase
//iWooshSoundID = GET_SOUND_ID()
//PLAY_SOUND_FRONTEND(iWooshSoundID, "In", "SHORT_PLAYER_SWITCH_SOUND_SET")
//bWooshStarted = TRUE
ENDIF
ENDIF
IF NOT bWooshStopped
IF fCamPhase >= fWooshStopPhase
//STOP_SOUND(iWooshSoundID)
bWooshStopped = TRUE
ENDIF
ENDIF
IF fCamPhase >= 1.0
SET_TIME_SCALE(1.0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, FALSE)
DESTROY_CAM(thisSwitchCam.ciSpline)
ENDIF
DESTROY_ALL_CAMS()
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF iWooshSoundID != -1
STOP_SOUND(iWooshSoundID)
ENDIF
STOP_SCRIPT_GLOBAL_SHAKING(TRUE)
END_SRL()
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
eSwitchCamState = SWITCH_CAM_IDLE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
/*#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widWidgetDebug
PROC CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS(WIDGET_GROUP_ID widParentGroup)
CDEBUG3LN(DEBUG_MISSION, "CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS")
SET_CURRENT_WIDGET_GROUP(widParentGroup)
START_WIDGET_GROUP("Custom Switch Cameras - Extra Tunables -")
ADD_WIDGET_BOOL("Warp Player to switch location", bWarpPlayerToSwitchLocation)
ADD_WIDGET_FLOAT_SLIDER("Michael and Crew Sync Scene Start Phase", fSyncSceneCustomSwitchPhase, 0.0, 1.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Michael and Crew Start Convo Phase", fMichaelCrewConvoStartPhase, 0.0, 1.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Woosh start phase", fWooshStartPhase, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Woosh stop phase", fWooshStopPhase, 0.0, 1.0, 0.001)
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(widParentGroup)
ENDPROC
PROC UPDATE_SPLINE_CAM_SCRIPT_SPECIFIC_WIDGETS()
//CDEBUG3LN(DEBUG_MISSION, "UPDATE_SPLINE_CAM_SCRIPT_SPECIFIC_WIDGETS")
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
OR IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
bWarpPlayerToSwitchLocation = TRUE
ENDIF
IF bWarpPlayerToSwitchLocation
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF DOES_ENTITY_EXIST(s_start_car.veh)
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_start_car.veh)
ENDIF
SET_ENTITY_COORDS(s_start_car.veh, <<6.6858, -749.8281, 43.1635>>)
SET_ENTITY_HEADING(s_start_car.veh, 71.4844)
ENDIF
ENDIF
ENDIF
bWarpPlayerToSwitchLocation = FALSE
ENDIF
ENDPROC
#ENDIF*/
PROC REQUEST_ASSETS_FOR_SWITCH_TO_CUTTER()
SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, TRUE)
SETUP_REQ_TUNNEL_INTERIOR_READY()
SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(TRUE)
SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT(TRUE)
SETUP_REQ_TUNNEL_COVER_OBJECTS(TRUE)
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND(TRUE)
REQUEST_ANIM_DICT(str_anim_cutter)
REQUEST_ANIM_DICT(str_anim_ig_2)
REQUEST_ANIM_DICT(str_anim_custom_switch)
REQUEST_ANIM_DICT(str_anim_custom_switch2)
REQUEST_ANIM_DICT(str_anim_cam_shake)
IF NOT bCustomSwitchSRLRequested
PREFETCH_SRL(strCustomSwitchSRL)
SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_FORCE_OFF)
bCustomSwitchSRLRequested = TRUE
ENDIF
ENDPROC
FUNC BOOL HAVE_ASSETS_FOR_SWITCH_TO_CUTTER_LOADED()
IF SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, TRUE)
CDEBUG3LN(DEBUG_MISSION, "Cutter Setup.")
IF SETUP_REQ_TUNNEL_INTERIOR_READY()
CDEBUG3LN(DEBUG_MISSION, "Interior Setup.")
IF SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(TRUE)
CDEBUG3LN(DEBUG_MISSION, "Gold Containers Setup.")
IF SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT(TRUE)
CDEBUG3LN(DEBUG_MISSION, "Gold Trolleys Setup.")
IF SETUP_REQ_TUNNEL_COVER_OBJECTS(TRUE)
CDEBUG3LN(DEBUG_MISSION, "Tunnel Cover Objects Setup.")
IF SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND(TRUE)
CDEBUG3LN(DEBUG_MISSION, "One Crew Member Underground Setup.")
IF HAS_ANIM_DICT_LOADED(str_anim_cutter)
CDEBUG3LN(DEBUG_MISSION, "Anim Cutter Anims Loaded.")
IF HAS_ANIM_DICT_LOADED(str_anim_ig_2)
CDEBUG3LN(DEBUG_MISSION, "ig2 Anims Loaded.")
IF HAS_ANIM_DICT_LOADED(str_anim_custom_switch)
CDEBUG3LN(DEBUG_MISSION, "Custom switch Anims Loaded.")
IF HAS_ANIM_DICT_LOADED(str_anim_custom_switch2)
CDEBUG3LN(DEBUG_MISSION, "Custom switch 2 Anims Loaded.")
IF HAS_ANIM_DICT_LOADED(str_anim_cam_shake)
CDEBUG3LN(DEBUG_MISSION, "Cam shake anims Loaded.")
IF IS_SRL_LOADED()
CDEBUG3LN(DEBUG_MISSION, "SRL is loaded.")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC DO_START_CUTSCENE()
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_TREVOR
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET)
ELIF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
ELSE
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
ENDIF
i_current_event = 0
b_is_jumping_directly_to_stage = FALSE
ELSE
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_TREVOR
//1. Bug #3705257 CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT flag added by request of Graeme Sales.
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(str_mocap_int, CS_SECTION_1 | CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4, CUTSCENE_REQUESTED_IN_MISSION | CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT)
ELIF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
//2. Bug #3705257 CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT flag added by request of Graeme Sales.
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(str_mocap_int, CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4, CUTSCENE_REQUESTED_IN_MISSION | CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT)
ELSE
//3. Bug #3705257 CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT flag added by request of Graeme Sales.
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(str_mocap_int, CS_SECTION_3 | CS_SECTION_4, CUTSCENE_REQUESTED_IN_MISSION | CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT)
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(str_mocap_int)
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
IF i_current_event < 99
IF NOT IS_SCREEN_FADED_OUT()
AND NOT g_FH2_bTimelapseTriggeredInside
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<151.2816, -1309.2737, 28.2024>>, 65.7988)
ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<129.082687,-1299.175659,28.232706>>, <<136.970322,-1312.649536,33.186874>>, 19.750000, <<151.2816, -1309.2737, 28.2024>>, 65.7988,
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES()
CLEAR_AREA_OF_PEDS(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
CLEAR_AREA_OF_OBJECTS(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
CLEAR_AREA_OF_PROJECTILES(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
CLEAR_AREA_OF_VEHICLES(<<-17.1615, -1439.0176, 30.1015>>, 400.0, TRUE)
REMOVE_PARTICLE_FX_IN_RANGE(<<-17.1615, -1439.0176, 30.1015>>, 50.0)
structTimelapseSettings sTimelapseSettings
GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTES(SP_HEIST_FINALE_2B, sTimelapseSettings)
DESTROY_ALL_CAMS()
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<147.032776,-1310.506592,29.858635>>, <<10.395594,-0.000021,49.974117>>, 39.402699, TRUE)
SET_CAM_PARAMS(cam_main, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.fCamFOV, 3000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
i_current_event = 99
ELSE
SETTIMERB(0)
i_current_event = 99
ENDIF
ELIF i_current_event = 99
IF TIMERB() > 3000
OR IS_SCREEN_FADED_OUT()
OR g_FH2_bTimelapseTriggeredInside
IF DO_TIMELAPSE(SP_HEIST_FINALE_2B, sTimelapse, FALSE, FALSE)
i_current_event = 100
ENDIF
IF i_timelapse_timer = 0
i_timelapse_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_timelapse_timer > 100 AND GET_GAME_TIMER() - i_timelapse_timer < 200
DISABLE_STRIP_CLUBS()
i_timelapse_timer = 1
ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
IF NOT IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
ENDIF
ELIF i_current_event = 100
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
DISABLE_STRIP_CLUBS()
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_TREVOR
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
ENDIF
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_MICHAEL
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Michael", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
ENDIF
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_FRANKLIN
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Franklin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
i_current_event = 0
b_skipped_mocap = FALSE
b_reset_decals_in_cutscene = FALSE
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
IF WAS_CUTSCENE_SKIPPED()
AND NOT b_skipped_mocap
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
e_section_stage = SECTION_STAGE_SKIP
ENDIF
SWITCH i_current_event
CASE 0 //Do any setup on first frame of cutscene.
IF IS_CUTSCENE_PLAYING()
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<151.2816, -1309.2737, 28.2024>>, 65.7988)
ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<129.082687,-1299.175659,28.232706>>, <<136.970322,-1312.649536,33.186874>>, 19.750000, <<151.2816, -1309.2737, 28.2024>>, 65.7988,
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
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)
SET_SRL_POST_CUTSCENE_CAMERA(<<128.2, -1303.4, 30.0>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-3.0, 0.0, -146.1>>))
//SET_SRL_POST_CUTSCENE_CAMERA(<<128.2, -1303.4, 30.0>>, <<-3.0, 0.0, -146.1>>)
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_HEIST_FINALE_2B)
DO_FADE_IN_WITH_WAIT() //In case this is a mission replay, the game will be faded out at this point
i_current_event++
ENDIF
BREAK
CASE 1 //When Michael and Trevor are off-screen change them into the outfits.
SETUP_REQ_MAIN_CREW(<<132.3231, -1305.5222, 28.1893>>, 218.3951)
ENTITY_INDEX entity_trevor, entity_michael, entity_franklin
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
entity_trevor = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor")
IF DOES_ENTITY_EXIST(entity_trevor)
s_selector_peds.pedID[SELECTOR_PED_TREVOR] = GET_PED_INDEX_FROM_ENTITY_INDEX(entity_trevor)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
entity_michael = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michael")
IF DOES_ENTITY_EXIST(entity_michael)
s_selector_peds.pedID[SELECTOR_PED_MICHAEL] = GET_PED_INDEX_FROM_ENTITY_INDEX(entity_michael)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
entity_franklin = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")
IF DOES_ENTITY_EXIST(entity_franklin)
s_selector_peds.pedID[SELECTOR_PED_FRANKLIN] = GET_PED_INDEX_FROM_ENTITY_INDEX(entity_franklin)
ENDIF
ENDIF
ENDIF
//1748559 - Some of the new outfits have decals that can stay when Trevor is getting changed.
IF NOT b_reset_decals_in_cutscene
IF GET_CUTSCENE_TIME() > 17366
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_DECL, DECL_P2_NONE, FALSE)
b_reset_decals_in_cutscene = TRUE
ENDIF
ENDIF
IF GET_CUTSCENE_TIME() > 34250
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SETUP_MICHAEL_OUTFIT(FALSE)
SETUP_FRANKLIN_OUTFIT(FALSE)
SETUP_TREVOR_OUTFIT()
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SETUP_DRIVER_OUTFIT()
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
i_current_event++
ENDIF
ENDIF
BREAK
ENDSWITCH
IF i_current_event >= 1
IF NOT DOES_ENTITY_EXIST(s_start_car.veh)
SETUP_REQ_START_CAR(<<132.5750, -1307.5503, 28.0729>>, 122.3149)
ENDIF
IF NOT DOES_ENTITY_EXIST(veh_franklins_car)
CREATE_PLAYER_VEHICLE(veh_franklins_car, CHAR_FRANKLIN, <<138.9697, -1306.2550, 27.9471>>, 298.8787, TRUE, VEHICLE_TYPE_CAR)
ENDIF
IF NOT DOES_ENTITY_EXIST(veh_trevors_car)
CREATE_PLAYER_VEHICLE(veh_trevors_car, CHAR_TREVOR, <<126.8221, -1314.4611, 28.0071>>, 121.0992)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<129.9813, -1305.5826, 28.2125>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 213.8997)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, FALSE, FAUS_CUTSCENE_EXIT)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
IF IS_VEHICLE_DRIVEABLE(veh_trevors_car)
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
IF IS_VEHICLE_DRIVEABLE(veh_franklins_car)
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
//IF IS_VEHICLE_DRIVEABLE(veh_trevors_car)
// SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car, VS_FRONT_RIGHT)
//ENDIF
SET_ENTITY_COORDS(s_crew[CREW_DRIVER_ID].ped, <<126.5602, -1310.9265, 28.0974>>)
SET_ENTITY_HEADING(s_crew[CREW_DRIVER_ID].ped, 222.3256)
ENDIF
IF IS_VEHICLE_DRIVEABLE(veh_franklins_car)
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_PED_INTO_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car, VS_FRONT_RIGHT)
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
//Fixes issues with LODs popping in after the cutscene.
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
SET_FORCE_HD_VEHICLE(s_start_car.veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_franklins_car)
SET_FORCE_HD_VEHICLE(veh_franklins_car, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_trevors_car)
SET_FORCE_HD_VEHICLE(veh_trevors_car, TRUE)
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
IF b_skipped_mocap
//For now just do a skip to the next stage.
JUMP_TO_STAGE(STAGE_GO_TO_BANK)
ELSE
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
e_mission_stage = STAGE_GO_TO_BANK
e_section_stage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
STOP_CUTSCENE()
b_skipped_mocap = TRUE
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC GO_TO_BANK()
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF SETUP_REQ_PLAYER_AS_MICHAEL()
IF b_has_used_checkpoint
START_REPLAY_SETUP(<<129.9813, -1305.5826, 28.2125>>, 100.0, FALSE)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<129.9813, -1305.5826, 28.2125>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 100.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
WAIT(0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
WHILE NOT DOES_ENTITY_EXIST(veh_trevors_car)
OR NOT DOES_ENTITY_EXIST(veh_franklins_car)
OR NOT DOES_ENTITY_EXIST(s_start_car.veh)
OR NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
OR NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
REQUEST_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
REQUEST_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
CREATE_PLAYER_VEHICLE(veh_trevors_car, CHAR_TREVOR, <<126.8221, -1314.4611, 28.0071>>, 121.0992)
CREATE_PLAYER_VEHICLE(veh_franklins_car, CHAR_FRANKLIN, <<138.9697, -1306.2550, 27.9471>>, 298.8787, TRUE, VEHICLE_TYPE_CAR)
SETUP_REQ_TREVOR(<<129.0483, -1315.0841, 28.1318>>, 306.4064)
SETUP_REQ_MAIN_CREW(<<123.3231, -1311.5222, 28.1893>>, 218.3951)
SETUP_REQ_START_CAR(<<132.5750, -1307.5503, 28.0729>>, 122.3149)
SETUP_REQ_FRANKLIN(<<139.6429, -1304.3286, 27.9994>>, 293.0838)
WAIT(0)
ENDWHILE
IF IS_VEHICLE_DRIVEABLE(veh_franklins_car)
SET_VEHICLE_ON_GROUND_PROPERLY(veh_franklins_car)
ENDIF
SETUP_MICHAEL_OUTFIT(FALSE)
SETUP_FRANKLIN_OUTFIT(FALSE)
SETUP_TREVOR_OUTFIT()
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SETUP_DRIVER_OUTFIT()
//If the screen is faded out use this chance to chack all the streaming requests.
WHILE NOT (NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
OR NOT (NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_selector_peds.pedID[SELECTOR_PED_TREVOR]))
OR NOT (NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_DRIVER_ID].ped))
OR NOT (NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_FRANKLIN_ID].ped))
OR NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
WAIT(0)
ENDWHILE
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<129.9813, -1305.5826, 28.2125>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 213.8997)
IF IS_VEHICLE_DRIVEABLE(s_start_car.veh)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
//Position the other two crew members next to their cars.
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_DRIVER_ID].ped, <<126.5602, -1310.9265, 28.0974>>)
SET_ENTITY_HEADING(s_crew[CREW_DRIVER_ID].ped, 222.3256)
ENDIF
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<141.9831, -1306.0529, 28.0581>>)
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 71.9209)
ENDIF
CLEAR_AREA(<<132.8943, -1305.1912, 28.1806>>, 100.0, TRUE, TRUE)
bCrewMemberWalkToCar = FALSE
i_current_event = 0
b_skipped_mocap = TRUE
b_is_jumping_directly_to_stage = FALSE
ENDIF
ELSE
IF IS_SCREEN_FADED_OUT()
SETTIMERB(0)
WHILE TIMERB() < 10000
IF (IS_VEHICLE_DRIVEABLE(veh_franklins_car) AND HAVE_VEHICLE_MODS_STREAMED_IN(veh_franklins_car))
AND (IS_VEHICLE_DRIVEABLE(veh_trevors_car) AND HAVE_VEHICLE_MODS_STREAMED_IN(veh_trevors_car))
AND (IS_VEHICLE_DRIVEABLE(s_start_car.veh) AND HAVE_VEHICLE_MODS_STREAMED_IN(s_start_car.veh))
SETTIMERB(100000)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
IF IS_VEHICLE_DRIVEABLE(veh_franklins_car)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(veh_franklins_car, FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(veh_franklins_car, FALSE)
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
AND NOT IS_PED_IN_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car)
TASK_ENTER_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
AND NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car)
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car, DEFAULT_TIME_BEFORE_WARP)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(veh_trevors_car)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(veh_trevors_car, FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(veh_trevors_car, FALSE)
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
AND NOT IS_PED_IN_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car)
TASK_ENTER_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car)
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car, DEFAULT_TIME_BEFORE_WARP)
ENDIF
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_GET_TO_BANK")
START_AUDIO_SCENE("BS_2B_GET_TO_BANK")
ENDIF
//Michael's crew member is already at the bank: create him closer to arriving there.
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), TRUE)
IF NOT IS_SCREEN_FADED_IN()
SETTIMERB(0)
//TODO 548046: get the peds already walking into their cars before the fade in.
WHILE TIMERB() < 500
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
SET_FORCE_HD_VEHICLE(s_start_car.veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_franklins_car)
SET_FORCE_HD_VEHICLE(veh_franklins_car, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_trevors_car)
SET_FORCE_HD_VEHICLE(veh_trevors_car, TRUE)
ENDIF
WAIT(0)
ENDWHILE
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
SET_FORCE_HD_VEHICLE(s_start_car.veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_franklins_car)
SET_FORCE_HD_VEHICLE(veh_franklins_car, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_trevors_car)
SET_FORCE_HD_VEHICLE(veh_trevors_car, TRUE)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
SETTIMERB(0)
REMOVE_VEHICLE(veh_pre_mission_car, FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
bCrewMemberWalkToCar = FALSE
b_crew_member_is_in_audio_group = FALSE
b_switch_has_been_unpaused = FALSE
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(s_locates_data)
#ENDIF
VECTOR vBlipLocation = <<-7.3800, -741.8743, 43.1540>>
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
SET_FORCE_HD_VEHICLE(s_start_car.veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_franklins_car)
SET_FORCE_HD_VEHICLE(veh_franklins_car, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_trevors_car)
SET_FORCE_HD_VEHICLE(veh_trevors_car, TRUE)
ENDIF
//Michael's crew member waits for him at the bank: create based on distance.
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_outside_bank) < 62500.0
SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(<<-6.5194, -732.2536, 43.2273>>, 166.8456, FALSE, FALSE)
ELIF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_outside_bank) > 90000.0
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF
IF i_current_event = 0 //Drive to the bank, park up near the entrance.
IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_locates_data, vBlipLocation, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, s_start_car.veh, "F3B_GOBANK", "F3B_GETINCAR", "F3B_GETBACKCAR", TRUE)
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vBlipLocation) <= 10000 //100m * 100m
REQUEST_ASSETS_FOR_SWITCH_TO_CUTTER()
ENDIF
ENDIF
ENDIF
//Once all other dialogue has finished preload the start conversation for the next cutscene.
IF NOT b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
IF b_has_text_label_triggered[BS2B_FRANK]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PRELOAD_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MBANK", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MBANK_PRELOAD] = TRUE
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
//Progress once the player hits the parking spot.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-15.328293,-739.265625,42.917812>>, <<-3.549676,-743.407959,45.884602>>, 4.000000)
IF NOT bCrewMemberWalkToCar
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
CDEBUG3LN(DEBUG_MISSION, "Michaels crew member walk to car...")
TASK_GO_TO_ENTITY(s_crew[CREW_MICHAEL_ID].ped, s_start_car.veh, DEFAULT, DEFAULT, PEDMOVEBLENDRATIO_WALK)
bCrewMemberWalkToCar = TRUE
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_start_car.veh)
AND CAN_PLAYER_START_CUTSCENE(TRUE, TRUE)
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(s_start_car.veh, 5.0)
AND HAVE_ASSETS_FOR_SWITCH_TO_CUTTER_LOADED()
//Guarantee that the Franklin and Trevor assets are removed at this point.
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
REMOVE_VEHICLE(veh_franklins_car, TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_VEHICLE(veh_trevors_car, TRUE)
IF DOES_BLIP_EXIST(blip_current_objective)
REMOVE_BLIP(blip_current_objective)
ENDIF
//Don't kill the current conversation if we're currently preloading the next cutscene convo.
IF NOT b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(9.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
ELSE
//Dialogue: should only play during the journey.
IF NOT b_has_text_label_triggered[BS2B_LOGIC]
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LOGIC", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_LOGIC] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_RENT]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, NULL, s_conversation_peds, str_dialogue_block, "BS2B_RENT")
b_has_text_label_triggered[BS2B_RENT] = TRUE
i_main_conversation_timer = 0
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_FRANK]
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF i_main_conversation_timer = 0
i_main_conversation_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 3000
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_FRANK", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_FRANK] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF DOES_BLIP_EXIST(blip_current_objective)
REMOVE_BLIP(blip_current_objective)
ENDIF
ENDIF
IF NOT bCrewMemberWalkToCar
//The crew member stands and smokes at the bank.
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
VECTOR v_crew_pos = <<1.7534, -715.5212, 44.9741>>
IF VDIST2(GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped), v_crew_pos) > 2.0
AND ABSF(GET_ENTITY_HEADING(s_crew[CREW_MICHAEL_ID].ped) - 202.0588) < 20.0
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
TASK_FOLLOW_NAV_MESH_TO_COORD(s_crew[CREW_MICHAEL_ID].ped, v_crew_pos, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_DEFAULT, 202.0588)
ENDIF
ELIF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_START_SCENARIO_IN_PLACE) != PERFORMING_TASK
TASK_START_SCENARIO_IN_PLACE(s_crew[CREW_MICHAEL_ID].ped, "WORLD_HUMAN_SMOKING")
ENDIF
IF NOT b_crew_member_is_in_audio_group
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_crew[CREW_MICHAEL_ID].ped, "BS_HEIST_BUDDY_group")
b_crew_member_is_in_audio_group = TRUE
ENDIF
ELSE
b_crew_member_is_in_audio_group = FALSE
ENDIF
ENDIF
//Request some assets in advance
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_inside_bank) < 10000.0
SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, TRUE)
SETUP_REQ_FRANKLIN(<<15.9272, -642.3282, 15.0883>>, 0.0, TRUE)
ENDIF
//Fail if the main car gets stuck
IF IS_VEHICLE_DRIVEABLE(s_start_car.veh)
IF IS_VEHICLE_PERMANENTLY_STUCK(s_start_car.veh)
MISSION_FAILED(FAILED_STUCK_START_CAR)
ENDIF
ENDIF
VEHICLE_INDEX vehCurrent
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehCurrent = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
//Fail if the player drives vehicles into the area.
IF NOT IS_ENTITY_DEAD(vehCurrent)
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehCurrent))
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<4.757608,-706.329834,42.472942>>, <<17.995380,-734.747559,68.216003>>, 30.750000, FALSE, TRUE, TM_ANY)
MISSION_FAILED(FAILED_ALERTED_BANK)
ENDIF
ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<4.726292,-706.276855,43.224064>>, <<9.202497,-715.744324,48.092426>>, 22.750000, FALSE, TRUE, TM_ANY)
MISSION_FAILED(FAILED_ALERTED_BANK)
ENDIF
ENDIF
//Also fail if the player's last vehicle is in the bank area (e.g. they jumped out and it travelled into the bank area).
VEHICLE_INDEX vehLast = GET_PLAYERS_LAST_VEHICLE()
IF NOT IS_ENTITY_DEAD(vehLast)
IF IS_ENTITY_IN_ANGLED_AREA(vehLast, <<4.726292,-706.276855,43.224064>>, <<9.202497,-715.744324,48.092426>>, 22.750000, FALSE, TRUE, TM_ANY)
MISSION_FAILED(FAILED_ALERTED_BANK)
ENDIF
ENDIF
//Fail if the player tries to follow Trevor.
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<2144.2202, 2670.7727, 48.7379>>) < VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_inside_bank)
MISSION_FAILED(FAILED_ABANDONED_HEIST)
ENDIF
//Fail if the player tries to follow Franklin.
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<899.3143, -2250.0337, 29.4995>>) < 160000.0
MISSION_FAILED(FAILED_ABANDONED_HEIST)
ENDIF
//Fail for trying to use a firetruck in the area.
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(veh)
IF GET_ENTITY_MODEL(veh) = FIRETRUK
AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK)
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<4.459524,-706.075989,57.974064>>, <<25.487049,-750.868225,39.808624>>, 64.250000)
MISSION_FAILED(FAILED_ALERTED_BANK)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(s_start_car.veh)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(s_start_car.veh)
ENDIF
//Fudge fix for the pre-streamed tunnel crew member falling: freeze him for now
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
FREEZE_ENTITY_POSITION(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
ENDIF
PREPARE_MUSIC_EVENT("FH2B_MISSION_START")
SWITCH i_current_event
CASE 1 //Once everything is ready do the switch.
REQUEST_ASSETS_FOR_SWITCH_TO_CUTTER()
IF HAVE_ASSETS_FOR_SWITCH_TO_CUTTER_LOADED()
AND SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, FALSE, TRUE)
AND SETUP_REQ_FRANKLIN(<<15.9272, -642.3282, 15.0883>>) //NOTE: Franklin may or may not have existed before this point, so need to go through creation process just to be sure.
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF) OR TIMERB() > 10000 OR b_has_text_label_triggered[BS2B_MBANK_PRELOAD])
SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, FALSE, TRUE)
SETUP_REQ_FRANKLIN(<<15.9272, -642.3282, 15.0883>>)
SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
SETUP_REQ_TUNNEL_COVER_OBJECTS()
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
AND IS_VEHICLE_DRIVEABLE(veh_cutter)
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_cutter)
SET_ENTITY_COORDS(veh_cutter, v_cutter_start_pos)
SET_ENTITY_HEADING(veh_cutter, f_cutter_start_heading)
FREEZE_ENTITY_POSITION(veh_cutter, TRUE)
ENDIF
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_FRANKLIN, TRUE)
SET_SELECTOR_PED_ACTIVITY(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_ACTIVITY_CAR)
SET_SELECTOR_PED_PRIORITY(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR)
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_FRANKLIN)
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
SET_SELECTOR_PED_ACTIVITY(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_ACTIVITY_DEFAULT)
DISABLE_SELECTOR_THIS_FRAME()
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_ENTITY_INVINCIBLE(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF
CLEAR_PRINTS()
DESTROY_ALL_CAMS()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
TRIGGER_MUSIC_EVENT("FH2B_MISSION_START")
eSwitchCamState = SWITCH_CAM_START_SPLINE1
SETTIMERB(0)
i_current_event = 50
ENDIF
BREAK
CASE 50
IF HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN(scsSwitchCamMichaelToFranklin)
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
REMOVE_VEHICLE(s_start_car.veh, TRUE)
REMOVE_VEHICLE(veh_franklins_car, TRUE)
REMOVE_VEHICLE(veh_trevors_car, TRUE)
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
b_performed_rayfire_force_reset = b_performed_rayfire_force_reset
b_switch_has_been_unpaused = b_switch_has_been_unpaused
b_performed_rayfire_force_reset = FALSE
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
ENDIF
//Fail if the player does anything dodgy around the bank area.
IF i_current_event < 50
IF IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-23.453369,-738.772583,29.263611>>, <<10.948552,-649.322937,272.377960>>, 87.500000)
OR IS_BULLET_IN_BOX(<<-23.453369,-738.772583,29.263611>>, <<10.948552,-649.322937,272.377960>>, FALSE)
MISSION_FAILED(FAILED_ALERTED_BANK)
ENDIF
ENDIF
//Trevor and the chopper pilot drive off together
IF DOES_ENTITY_EXIST(veh_trevors_car)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
AND IS_VEHICLE_DRIVEABLE(veh_trevors_car)
IF NOT IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car)
OR NOT IS_PED_SITTING_IN_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car)
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
AND NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car, TRUE)
AND NOT IS_PED_RAGDOLL(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_GETTING_UP(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_DRIVER_ID].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
AND NOT IS_PED_IN_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car, TRUE)
AND NOT IS_PED_RAGDOLL(s_crew[CREW_DRIVER_ID].ped)
AND NOT IS_PED_GETTING_UP(s_crew[CREW_DRIVER_ID].ped)
TASK_ENTER_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_TREVOR]), <<94.8243, -1333.8383, 28.3518>>) < 10000.0
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<94.8243, -1333.8383, 28.3518>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
ENDIF
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<175.1965, -1242.2568, 37.3161>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<1598.2593, -977.4659, 60.1755>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<2180.5105, -541.6199, 93.0735>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<2499.6746, -71.3421, 90.2445>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<2412.8171, 1017.2548, 84.1214>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<2144.2202, 2670.7727, 48.7379>>, 30.0, DRIVINGMODE_AVOIDCARS, 3.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_TREVOR])) > 10000.0
IF NOT IS_ENTITY_ON_SCREEN(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
DELETE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
DELETE_PED(s_crew[CREW_DRIVER_ID].ped)
DELETE_VEHICLE(veh_trevors_car)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Franklin and one gunman drive off together
IF DOES_ENTITY_EXIST(veh_franklins_car)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
AND IS_VEHICLE_DRIVEABLE(veh_franklins_car)
FLOAT f_dist_from_franklin = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
IF NOT IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car)
OR NOT IS_PED_SITTING_IN_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car)
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
AND NOT IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car)
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
ENDIF
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
AND NOT IS_PED_SITTING_IN_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car)
TASK_ENTER_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]), <<899.3143, -2250.0337, 29.4995>>) > 100.0
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]), <<205.6445, -1286.6569, 28.2408>>) < 10000.0
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_franklins_car, <<205.6445, -1286.6569, 28.2408>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
ENDIF
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_franklins_car, <<899.3143, -2250.0337, 29.4995>>, 30.0, DRIVINGMODE_AVOIDCARS, 3.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDIF
IF f_dist_from_franklin > 10000.0
IF NOT IS_ENTITY_ON_SCREEN(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
DELETE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
DELETE_PED(s_crew[CREW_FRANKLIN_ID].ped)
DELETE_VEHICLE(veh_franklins_car)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//General fail for the start car being destroyed.
IF DOES_ENTITY_EXIST(s_start_car.veh)
IF NOT IS_VEHICLE_DRIVEABLE(s_start_car.veh)
MISSION_FAILED(FAILED_DESTROYED_START_CAR)
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION()
REMOVE_PED(s_crew[0].ped, TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
REMOVE_VEHICLE(s_start_car.veh, TRUE)
REMOVE_VEHICLE(veh_franklins_car, TRUE)
REMOVE_VEHICLE(veh_trevors_car, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
REMOVE_VEHICLE_ASSET(model_start_car)
REMOVE_ANIM_DICT(str_anim_custom_switch)
REMOVE_ANIM_DICT(str_anim_custom_switch2)
REMOVE_ANIM_DICT(str_anim_cam_shake)
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_GET_TO_BANK")
STOP_AUDIO_SCENE("BS_2B_GET_TO_BANK")
ENDIF
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
e_mission_stage = STAGE_DRILL_THROUGH_WALL
e_section_stage = SECTION_STAGE_SETUP
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_DRILL_THROUGH_WALL)
ENDIF
ENDPROC
PROC DRILL_THROUGH_WALL()
CONST_FLOAT MAX_DRILL_SPEED 1.0
CONST_FLOAT MAX_DRILL_ACCEL 0.1
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
IF b_has_used_checkpoint
START_REPLAY_SETUP(v_cutter_start_pos, 24.2033, FALSE, TRUE)
i_current_event = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_cutter_start_pos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 24.2033)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
WAIT(0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
i_current_event = 99
ENDIF
WHILE NOT SETUP_REQ_TUNNEL_INTERIOR_READY()
OR NOT DOES_ENTITY_EXIST(veh_cutter)
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
OR NOT DOES_ENTITY_EXIST(obj_gold_containers[0])
OR NOT DOES_ENTITY_EXIST(obj_gold_trolleys[0])
OR NOT DOES_ENTITY_EXIST(obj_tunnel_crates[0])
REQUEST_ANIM_DICT(str_anim_cutter)
REQUEST_ANIM_DICT(str_anim_ig_2)
SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading)
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
SETUP_REQ_TUNNEL_COVER_OBJECTS()
WAIT(0)
ENDWHILE
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), veh_cutter)
SET_ENTITY_COORDS(veh_cutter, v_cutter_start_pos)
SET_ENTITY_HEADING(veh_cutter, f_cutter_start_heading)
SET_VEHICLE_ON_GROUND_PROPERLY(veh_cutter)
ENDIF
SETUP_FRANKLIN_OUTFIT(TRUE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
b_is_jumping_directly_to_stage = FALSE
ENDIF
ELSE
UPDATE_CUTTER_SPINNING()
REQUEST_ANIM_DICT(str_anim_cutter)
REQUEST_ANIM_DICT(str_anim_ig_2)
IF HAS_ANIM_DICT_LOADED(str_anim_cutter)
AND HAS_ANIM_DICT_LOADED(str_anim_ig_2)
DESTROY_ALL_CAMS()
//Crew member may have been frozen from earlier (to prevent bugs with him falling through the map), now's the time to unfreeze him.
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
FREEZE_ENTITY_POSITION(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2B_DRILL_RESTART")
SETTIMERB(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-162.9016 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
/*//If we skipped here spend some time setting up the tunnel rayfire.
WHILE NOT SETUP_REQ_TUNNEL_RAYFIRE_READY_FOR_DRILLING()
AND TIMERB() < 3000
WAIT(0)
ENDWHILE*/
ENDIF
//Need to freeze some props here as they interfere with the drill.
OBJECT_INDEX objBoxes[3]
objBoxes[0] = GET_CLOSEST_OBJECT_OF_TYPE(<<13.9814, -646.0353, 15.9349>>, 3.0, PROP_PARTSBOX_01, FALSE)
objBoxes[1] = GET_CLOSEST_OBJECT_OF_TYPE(<<13.9814, -646.0353, 15.9349>>, 3.0, PROP_PARTSBOX_01, FALSE)
objBoxes[2] = GET_CLOSEST_OBJECT_OF_TYPE(<<13.9814, -646.0353, 15.9349>>, 3.0, PROP_PARTSBOX_01, FALSE)
INT i = 0
REPEAT COUNT_OF(objBoxes) i
IF DOES_ENTITY_EXIST(objBoxes[i])
FREEZE_ENTITY_POSITION(objBoxes[i], TRUE)
ENDIF
ENDREPEAT
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_DRILL_THROUGH_VAULT")
START_AUDIO_SCENE("BS_2B_DRILL_THROUGH_VAULT")
ENDIF
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SETTIMERA(0)
SETTIMERB(0)
IF NOT IS_SCREEN_FADED_IN()
//If we skipped here then make sure the gates are force cleared (in case we were on a stage where they were blown up).
CLEAR_AREA_OF_OBJECTS(v_vault_gate_pos_1, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS)
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_IN()
UPDATE_CUTTER_SPINNING()
WAIT(0)
ENDWHILE
ENDIF
i_current_music_event = 0
b_spin_cutter_blades = FALSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
NEW_LOAD_SCENE_STOP() //May have carried over from the switch scene.
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DRILL, "DRILL_THROUGH_WALL")
REPLAY_RECORD_BACK_FOR_TIME(10.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
IF NOT IS_ENTITY_DEAD(veh_cutter)
REMOVE_VEHICLE_HIGH_DETAIL_MODEL(veh_cutter)
ENDIF
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
//PRINTLN(GET_GAMEPLAY_CAM_RELATIVE_HEADING(), " ", GET_GAMEPLAY_CAM_RELATIVE_PITCH())
//Update crew behaviour during this section: play idle anims
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND() //The crew member sometimes isn't getting created in time.
UPDATE_CREW_MEMBER_DURING_DRILL_SECTION()
UPDATE_CUTTER_SPINNING()
SWITCH i_current_event
CASE 0
REQUEST_VEHICLE_RECORDING(CARREC_CUTTER_ENTER, str_carrec)
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
LOAD_STREAM("DRILL_WALL", "BIG_SCORE_3B_SOUNDS")
FLOAT f_dist_from_cutter_to_trigger, f_cutter_heading, f_heading_diff
f_dist_from_cutter_to_trigger = VDIST2(GET_ENTITY_COORDS(veh_cutter), <<7.6676, -653.8835, 15.0823>>)
f_cutter_heading = GET_ENTITY_HEADING(veh_cutter)
IF NOT DOES_BLIP_EXIST(blip_current_objective)
blip_current_objective = CREATE_BLIP_FOR_COORD(<<7.2064, -656.3232, 16.0789>>)
ENDIF
IF NOT b_has_text_label_triggered[BS2B_HEAR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR", CONV_PRIORITY_MEDIUM)
SETTIMERB(0)
b_has_text_label_triggered[BS2B_HEAR] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_WALL]
IF NOT b_has_text_label_triggered[F3B_DRILLHELP]
IF TIMERB() > 2000
PRINT_HELP("F3B_DRILLHELP", 60000)
b_has_text_label_triggered[F3B_DRILLHELP] = TRUE
ENDIF
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_WALL")
b_has_text_label_triggered[BS2B_WALL] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[F3B_DRILL]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3B_DRILL", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_DRILL] = TRUE
SETTIMERB(0)
ENDIF
ELSE
//Cops come in on the radio.
IF NOT b_has_text_label_triggered[BS2B_POLICE]
IF TIMERB() > 500
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2B_01")
b_has_text_label_triggered[BS2B_POLICE] = TRUE
ENDIF
ENDIF
//Crew member says a line if the player hangs around
IF NOT b_has_text_label_triggered[BS2B_REM]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF TIMERB() > 13200
AND f_dist_from_cutter_to_trigger > 225.0
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_REM")
b_has_text_label_triggered[BS2B_REM] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_HOLD] //Another reminder.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF TIMERB() > 21200
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_HOLD")
b_has_text_label_triggered[BS2B_HOLD] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Crew member says a line if the player goes the wrong way.
IF NOT b_has_text_label_triggered[BS2B_WAY]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<18.989424,-646.675842,15.088079>>, <<39.385719,-680.171082,22.002810>>, 13.250000)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_WAY")
b_has_text_label_triggered[BS2B_WAY] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR v_cutter_front_pos
v_cutter_front_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<-0.0359, 5.7960, 1.6637>>)
//When the cutter approaches slow it down.
IF f_dist_from_cutter_to_trigger <= 225.0
f_heading_diff = ABSF(f_cutter_heading - 162.0)
IF f_heading_diff > 180.0
f_heading_diff = ABSF(f_heading_diff - 360.0)
ENDIF
IF f_heading_diff < 45.0
FLOAT f_speed_modifier, f_dist_adjusted, f_current_speed
f_current_speed = GET_ENTITY_SPEED(veh_cutter)
f_dist_adjusted = f_dist_from_cutter_to_trigger
f_speed_modifier = (1.0 - (f_dist_adjusted - 64.0) / (225.0 - 64.0)) * 80.0
IF f_prev_distance_from_cutter_to_wall < f_dist_from_cutter_to_trigger
f_speed_modifier = 0.0
ELSE
IF f_current_speed > 2.0
SET_ENTITY_VELOCITY(veh_cutter, GET_ENTITY_VELOCITY(veh_cutter) * 0.97)
ENDIF
ENDIF
MODIFY_VEHICLE_TOP_SPEED(veh_cutter, -f_speed_modifier)
ENDIF
ENDIF
//If the player is about to hit the wall and doesn't have the cutters moving don't go any further.
IF f_dist_from_cutter_to_trigger < 64.0
AND NOT IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
ENDIF
//Don't start priming the rayfire until the tunnel is properly streamed in.
IF TIMERA() > 2000
SETUP_REQ_TUNNEL_RAYFIRE_READY_FOR_DRILLING(FALSE)
ENDIF
IF IS_POINT_IN_ANGLED_AREA(v_cutter_front_pos, <<4.426229,-664.508057,15.130619>>, <<7.489964,-654.724365,20.332310>>, 4.000000)
IF IS_CUTTER_SPINNING()
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CUTTER_ENTER, str_carrec)
AND GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) = RFMO_STATE_PRIMED
AND LOAD_STREAM("DRILL_WALL", "BIG_SCORE_3B_SOUNDS")
AND f_dist_from_cutter_to_trigger <= f_prev_distance_from_cutter_to_wall //Cutter is going towards the wall or is stationary.
MODIFY_VEHICLE_TOP_SPEED(veh_cutter, 0.0)
START_PLAYBACK_RECORDED_VEHICLE(veh_cutter, CARREC_CUTTER_ENTER, str_carrec, FALSE)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cutter, 650.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cutter, FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(veh_cutter, TRUE)
RESET_VEHICLE_WHEELS(veh_cutter, FALSE)
f_cutter_playback_speed = 0.55
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
CLEAR_PRINTS()
ENDIF
CLEAR_HELP()
REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION()
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0, TRUE, TRUE)
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
STOP_ENTITY_FIRE(veh_cutter)
SET_VEHICLE_ENGINE_HEALTH(veh_cutter, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cutter, 1000.0)
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<17.829350,-655.785889,17.536486>>,<<-2.166965,-0.006385,90.217682>>,29.275511, TRUE)
SET_CAM_PARAMS(cam_main,<<17.831120,-656.252747,17.536448>>,<<-2.166965,-0.006385,90.217682>>,29.275511, 7000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_FRONTEND_RADIO_ACTIVE(FALSE)
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) //Can't turn control off as it stops the pad shake.
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISABLE_SELECTOR_THIS_FRAME()
PLAY_STREAM_FRONTEND()
//ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cutter, "BS_2B_VAULT_RAYFIRE")
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_RAYFIRE")
START_AUDIO_SCENE("BS_2B_VAULT_RAYFIRE")
ENDIF
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_START_ANIM)
TRIGGER_MUSIC_EVENT("FH2B_DRILL_START")
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
//Add this cutscene to the captured footage.
IF NOT b_replay_event_started
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
b_replay_event_started = TRUE
ENDIF
SETTIMERA(0)
SETTIMERB(0)
i_current_event++
ENDIF
ELSE
//Play dialogue if the player drove up to the wall without turning on the cutter.
IF NOT b_has_text_label_triggered[BS2B_DRIL]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_DRIL")
b_has_text_label_triggered[BS2B_DRIL] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
f_prev_distance_from_cutter_to_wall = f_dist_from_cutter_to_trigger
//Fail checks
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
//Fail if the cutter gets stuck
IF IS_VEHICLE_PERMANENTLY_STUCK(veh_cutter)
MISSION_FAILED(FAILED_STUCK_CUTTER)
ENDIF
//Fail if the cutter is driven into the tunnels.
IF NOT IS_ENTITY_DEAD(veh_cutter)
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<-21.860806,-579.642761,16.917259>>, <<-23.791729,-570.581726,34.792725>>, 55.250000)
MISSION_FAILED(FAILED_ABANDONED_HEIST)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Start second part of rayfire inside the vault
DISABLE_SELECTOR_THIS_FRAME()
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
CONVERGE_VALUE(f_cutter_playback_speed, 0.49, 0.05, TRUE)
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
ENDIF
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
//Play dialogue from Franklin when cutscene starts.
IF NOT b_has_text_label_triggered[BS2B_INTO]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_INTO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_INTO] = TRUE
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
IF GET_RAYFIRE_MAP_OBJECT_ANIM_PHASE(rayfire_tunnel) > 0.6
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_ENDING)
//Need to wait to prevent visible pops with changing the rayfire state.
SETTIMERB(0) //Safety timer in case the rayfire never resets.
WHILE GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_END
AND TIMERB() < 1000
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
WAIT(0)
ENDWHILE
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) = RFMO_STATE_PRIMED
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_START_ANIM)
ENDIF
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
SET_VARIABLE_ON_SOUND(i_cutter_sound_id, "Muffling", 1.0)
ENDIF
SET_CAM_PARAMS(cam_main, <<0.046478,-670.565002,15.832479>>,<<3.964742,0.023400,-32.681709>>,33.154215)
SET_CAM_PARAMS(cam_main, <<-0.497207,-671.412476,15.762693>>,<<7.658487,0.023399,-33.584625>>,33.154217, 20000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
REMOVE_PARTICLE_FX_IN_RANGE(<<0.046478,-670.565002,15.832479>>, 200.0)
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cutter, 2800.0)
SET_GLOBAL_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(veh_cutter, <<-0.2, 0.0, 0.0>>)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cutter, FALSE)
f_cutter_playback_speed = 0.1
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
ENDIF
SETTIMERB(0)
i_current_event++
ENDIF
BREAK
CASE 2 //Start the alarm
DISABLE_SELECTOR_THIS_FRAME()
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
CONVERGE_VALUE(f_cutter_playback_speed, 0.3, 0.001, TRUE)
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
ENDIF
//Music event triggers here when the cutter gets through the wall.
IF i_current_music_event = 0
PREPARE_MUSIC_EVENT("FH2B_WALL_SMASH")
IF TIMERB() > 2000
TRIGGER_MUSIC_EVENT("FH2B_WALL_SMASH")
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
i_current_music_event++
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
IF TIMERB() < 5000
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
ENDIF
IF TIMERB() > 5000
AND SETUP_REQ_VAULT_ALARM(FALSE, TRUE)
SETUP_REQ_VAULT_ALARM(FALSE)
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
BREAK
CASE 3 //Drill reverses out
DISABLE_SELECTOR_THIS_FRAME()
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
IF TIMERB() < 6000
CONVERGE_VALUE(f_cutter_playback_speed, 0.275, 0.03, TRUE)
ELSE
CONVERGE_VALUE(f_cutter_playback_speed, 0.15, 0.03, TRUE)
ENDIF
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
ENDIF
IF TIMERB() > 10000
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_ENDING)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_ENDING)
SETTIMERB(0) //Safety timer in case the rayfire never resets.
WHILE GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_END
AND TIMERB() < 1000
WAIT(0)
ENDWHILE
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
SET_VARIABLE_ON_SOUND(i_cutter_sound_id, "Muffling", 0.0)
ENDIF
IF b_replay_event_started
REPLAY_STOP_EVENT()
b_replay_event_started = FALSE
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cutter)
ENDIF
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spindown", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
SET_ENTITY_HEADING(veh_cutter, 164.9295)
SET_ENTITY_COORDS(veh_cutter, <<8.1528, -652.3942, 15.0973>>)
SET_ENTITY_VELOCITY(veh_cutter, <<0.0, 0.0, 0.0>>)
//REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cutter)
ENDIF
//Reposition entities at this point in case something went wrong
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<17.7703, -646.9630, 15.0883>>)
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 317.3096)
ENDIF
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], <<23.8434, -636.2329, 16.0034>>)
SET_ENTITY_HEADING(obj_gold_containers[0], -56.8800)
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[1], <<24.9209, -639.1294, 16.0089>>)
SET_ENTITY_HEADING(obj_gold_containers[1], -72.3600 + 180.0)
STOP_STREAM()
TRIGGER_MUSIC_EVENT("FH2B_PARK_CUTTER")
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_RAYFIRE")
STOP_AUDIO_SCENE("BS_2B_VAULT_RAYFIRE")
ENDIF
IF IS_SCREEN_FADED_OUT()
WAIT(500)
ENDIF
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()
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 100)
WAIT(0)
ENDWHILE
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SETTIMERB(0)
i_current_event++
ELSE
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
ENDIF
ENDIF
BREAK
CASE 4
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
IF NOT DOES_BLIP_EXIST(blip_current_objective)
blip_current_objective = CREATE_BLIP_FOR_COORD(<<12.1850, -633.0806, 16.0882>>)
ENDIF
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
IF NOT b_has_text_label_triggered[BS2B_MADE]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MADE", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MADE] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[F3B_CUTOUT]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3B_CUTOUT", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_CUTOUT] = TRUE
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_JAM]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_JAM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_JAM] = TRUE
ENDIF
ENDIF
ENDIF
//2001826 - As part of the fixes for this we need to adjust the path of the cutter slightly so it easily hits the smaller locate.
SET_VEHICLE_STEER_BIAS(veh_cutter, 0.0)
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
AND NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
VECTOR vPointBehindCutter
FLOAT fCutterHeading
vPointBehindCutter = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<0.0, -3.9057, 0.5031>>)
fCutterHeading = GET_ENTITY_HEADING(veh_cutter)
IF fCutterHeading < 0.0
fCutterHeading += 360.0
ENDIF
IF fCutterHeading > 164.0
AND fCutterHeading < 170.0
IF IS_POINT_IN_ANGLED_AREA(vPointBehindCutter, <<11.451782,-635.602539,15.088079>>, <<10.528242,-641.369690,23.104958>>, 7.250000)
SET_VEHICLE_STEER_BIAS(veh_cutter, -0.02)
ENDIF
ENDIF
ENDIF
//IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<11.953387,-626.074402,14.782672>>, <<10.861650,-634.806152,21.588079>>, 7.000000)
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<11.921734,-626.025146,14.871298>>, <<10.923436,-632.279480,21.588079>>, 7.250000)
OR IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<-0.105172,-623.442566,14.245301>>, <<8.899252,-634.569153,19.838383>>, 14.250000)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
i_current_event++
ELSE
//Backing up dialogue.
IF b_has_text_label_triggered[BS2B_JAM]
//Player says a line once he starts reversing.
IF NOT b_has_text_label_triggered[BS2B_BACKDRILL]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BACK", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_BACKDRILL] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Crew says a line.
IF NOT b_has_text_label_triggered[BS2B_BUP]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped)) < 100.0
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_BUP")
b_has_text_label_triggered[BS2B_BUP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Fail in this section if the cutter gets stuck
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND IS_VEHICLE_PERMANENTLY_STUCK(veh_cutter)
MISSION_FAILED(FAILED_STUCK_CUTTER)
ENDIF
ENDIF
BREAK
CASE 5
IF TIMERB() > 500
AND IS_VEHICLE_DRIVEABLE(veh_cutter)
AND ABSF(GET_ENTITY_SPEED(veh_cutter)) < 0.5
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
//Skip the drill cutscene
IF i_current_event > 0
AND NOT IS_GAMEPLAY_CAM_RENDERING()
IF IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_SKIP_CUTSCENE)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
IF NOT IS_PAUSE_MENU_ACTIVE()
AND TIMERA() > CUTSCENE_SKIP_DELAY
//Stop any footage recording before the fade.
IF b_replay_event_started
REPLAY_STOP_EVENT()
b_replay_event_started = FALSE
ENDIF
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()
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
WAIT(0)
ENDWHILE
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) //Player control isn't turned off during the cutscene, so do it here.
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_ENDING)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_ENDING)
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
WAIT(2000)
WHILE NOT SETUP_REQ_VAULT_ALARM(TRUE)
WAIT(0)
ENDWHILE
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
SKIP_TO_END_AND_STOP_PLAYBACK_RECORDED_VEHICLE(veh_cutter)
ENDIF
ENDIF
SETTIMERB(100000)
i_current_music_event = 100
i_current_event = 3 //Cutscene cleanup
ENDIF
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION()
REMOVE_VEHICLE_RECORDING(CARREC_CUTTER_ENTER, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_CUTTER_LEAVE, str_carrec)
STOP_CUTTER_SPINNING()
STOP_AUDIO_SCENES()
//IF IS_VEHICLE_DRIVEABLE(veh_cutter)
// REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cutter)
//ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_01")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_02")
REMOVE_ANIM_DICT(str_anim_cutter)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_BLOW_UP_DOORS
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cutter)
ENDIF
SET_ENTITY_COORDS(veh_cutter, v_cutter_pos_after_drilling)
SET_ENTITY_HEADING(veh_cutter, f_cutter_heading_after_drilling)
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spindown", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
ENDIF
WHILE NOT SETUP_REQ_VAULT_ALARM(TRUE)
WAIT(0)
ENDWHILE
STOP_STREAM()
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
DESTROY_ALL_CAMS()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC BLOW_UP_DOORS()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<23.3, -642.8, 15.3>>)
//Need to load the scene first in this case, otherwise everything falls through the ground.
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
AND SETUP_REQ_TUNNEL_INTERIOR_READY()
LOAD_SCENE(v_cutter_start_pos)
i_current_event = 99
ENDIF
ELSE
IF SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
AND SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
AND SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
AND SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
AND SETUP_REQ_VAULT_ALARM(TRUE)
AND SETUP_REQ_TUNNEL_COVER_OBJECTS()
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), veh_cutter)
ENDIF
SETUP_FRANKLIN_OUTFIT(TRUE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
SETTIMERB(0)
//Wait for clothes to stream in
WHILE TIMERB() < 5000
IF (NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_FRANKLIN_ID].ped)
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID()))
SETTIMERB(10000)
ENDIF
WAIT(0)
ENDWHILE
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
//If we skipped here then make sure the gates are force cleared (in case we were on a stage where they were blown up).
CLEAR_AREA_OF_OBJECTS(v_vault_gate_pos_1, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS)
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ELSE
//There's a chance the crew member was frozen before, make sure they're unfrozen in all cases.
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
CLEAR_PED_TASKS_IMMEDIATELY(s_crew[CREW_FRANKLIN_ID].ped)
REMOVE_ANIM_DICT(str_anim_ig_2)
FREEZE_ENTITY_POSITION(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_DisableExplosionReactions, TRUE)
ENDIF
//Give the player 5 sticky bombs (give them less if they already have some).
i_prev_num_sticky_bombs = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STICKYBOMB)
IF i_prev_num_sticky_bombs < 16
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_STICKYBOMB, 16 - i_prev_num_sticky_bombs, FALSE, FALSE)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2B_BOMBS_RESTART")
ELSE
TRIGGER_MUSIC_EVENT("FH2B_PLANT_BOMBS")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_PLANT_C4")
START_AUDIO_SCENE("BS_2B_PLANT_C4")
ENDIF
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0, TRUE)
IF NOT IS_SCREEN_FADED_IN()
//If we skipped here then make sure the gates are force cleared (in case we were on a stage where they were blown up).
CLEAR_AREA_OF_OBJECTS(v_vault_gate_pos_1, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS)
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_IN()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
WAIT(0)
ENDWHILE
ENDIF
s_crew[CREW_FRANKLIN_ID].i_event = 0
b_vault_door_blown_up[0] = FALSE
b_vault_door_blown_up[1] = FALSE
b_cutter_warped = FALSE
SET_WANTED_LEVEL_MULTIPLIER(0.0)
i_prev_num_sticky_bombs = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STICKYBOMB)
i_time_since_last_bomb_activity = GET_GAME_TIMER() + 5000
//i_time_since_bomb_section_started = GET_GAME_TIMER()
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(model_vault_door, v_vault_door_pos, TRUE, 0.0, 0.0)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SETTIMERB(0)
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED() //B*617956: Rayfire resets itself if walking away from the area.
IF NOT b_has_text_label_triggered[BS2B_BLIMIT]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BLIMIT", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BLIMIT] = TRUE
ENDIF
ENDIF
ENDIF
//The player can trigger the shootout enemies early if they do the wrong thing, so make sure the buddy and enemies are kept up to date.
UPDATE_TUNNEL_SHOOTOUT_ENEMIES_2()
UPDATE_CREW_MEMBER_COLLECTING_GOLD()
UPDATE_CUTTER_SPINNING()
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) < 1600.0
IF DOES_BLIP_EXIST(s_crew[CREW_FRANKLIN_ID].blip)
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
ENDIF
SWITCH i_current_event
CASE 0
BOOL b_explosion_fired
PREPARE_MUSIC_EVENT("FH2B_EXPLODE")
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_VAULT_EXPLOSION")
//Continue once both doors have been exploded.
IF b_vault_door_blown_up[0]
AND b_vault_door_blown_up[1]
CLEAR_HELP()
CLEAR_PRINTS()
TRIGGER_MUSIC_EVENT("FH2B_EXPLODE")
SETTIMERB(0)
i_current_event++
ELSE
IF NOT b_vault_door_blown_up[0]
AND NOT b_vault_door_blown_up[1]
//Play dialogue after the player fits the first sticky bomb (if neither door has blown up yet).
IF b_has_text_label_triggered[BS2B_BLIMIT] //Don't play god text until after the crew member says his line about the time limit.
IF NOT b_has_text_label_triggered[F3B_CHARGE] //God text fir planting both charges.
IF DOES_BLIP_EXIST(blip_vault_doors[0])
OR DOES_BLIP_EXIST(blip_vault_doors[1])
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3B_CHARGE", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_CHARGE] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_TWO] //Dialogue after planting the first charge.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF (DOES_BLIP_EXIST(blip_vault_doors[0]) AND NOT DOES_BLIP_EXIST(blip_vault_doors[1]))
OR (DOES_BLIP_EXIST(blip_vault_doors[1]) AND NOT DOES_BLIP_EXIST(blip_vault_doors[0]))
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_TWO")
b_has_text_label_triggered[BS2B_TWO] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_BLOW] //Gunman dialogue after planting both charges.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BLOW", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_BLOW] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_OUT] //Gunman dialogue after planting both charges.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_OUT")
b_has_text_label_triggered[BS2B_OUT] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[F3B_CHARGE2] //God text for blowing up the charges.
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3B_CHARGE2", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_CHARGE2] = TRUE
i_main_conversation_timer = 0
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_SET] //Reminder dialogue if the bombs haven't blown up yet.
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_DO_ALL_CHECKS)
IF i_main_conversation_timer = 0
i_main_conversation_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 7200
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SET")
b_has_text_label_triggered[BS2B_SET] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//One of the doors wasn't blown up, gunman says to blow up the other.
IF NOT b_has_text_label_triggered[BS2B_ONE]
IF DOES_BLIP_EXIST(blip_vault_doors[0])
OR DOES_BLIP_EXIST(blip_vault_doors[1])
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_ONE")
b_has_text_label_triggered[BS2B_ONE] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
GRAB_VAULT_GATES(TRUE)
IF NOT b_vault_door_blown_up[0]
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
IF TIMERB() > 500
b_explosion_fired = IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_STICKYBOMB, <<2.363872,-662.097778,15.012270>>, <<3.228940,-659.719604,18.044346>>, 0.750000)
IF b_explosion_fired
OR VDIST(GET_ENTITY_COORDS(obj_vault_gates[0]), v_vault_gate_pos_1) > 0.5
//FREEZE_ENTITY_POSITION(obj_vault_gates[0], TRUE)
//SET_ENTITY_COORDS_NO_OFFSET(obj_vault_gates[0], v_vault_gate_pos_1 + <<0.0, 0.0, 5.0>>)
IF b_explosion_fired
PLAY_SOUND_FROM_ENTITY(-1, "Gold_Vault_Explosions", obj_vault_gates[0], "BIG_SCORE_3B_SOUNDS")
ENDIF
IF DOES_BLIP_EXIST(blip_vault_doors[0])
REMOVE_BLIP(blip_vault_doors[0])
ENDIF
//Record footage of the doors blowing up.
REPLAY_RECORD_BACK_FOR_TIME(1.0)
b_vault_door_blown_up[0] = TRUE
i_time_since_last_bomb_activity = GET_GAME_TIMER()
ENDIF
ENDIF
//Handle the blip: remove if a sticky bomb is in the right place, add if there are no sticky bombs and no explosions.
IF IS_PROJECTILE_TYPE_IN_ANGLED_AREA(<<2.363872,-662.097778,15.012270>>, <<3.228940,-659.719604,18.044346>>, 0.750000, WEAPONTYPE_STICKYBOMB)
OR VDIST(GET_ENTITY_COORDS(obj_vault_gates[0]), v_vault_gate_pos_1) > 0.5
IF DOES_BLIP_EXIST(blip_vault_doors[0])
IF GET_GAME_TIMER() - i_vault_blip_remove_timer[0] > 500 //Delay the removal of the blip in case the sticky bomb is just passing through the locate.
REMOVE_BLIP(blip_vault_doors[0])
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
i_time_since_last_bomb_activity = GET_GAME_TIMER()
ENDIF
ENDIF
i_vault_blip_timer[0] = GET_GAME_TIMER()
ELSE
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
AND NOT b_vault_door_blown_up[0] //In case it was set this frame
AND GET_GAME_TIMER() - i_vault_blip_timer[0] > 500 //In case an explosion just triggered but wasn't detected yet.
blip_vault_doors[0] = CREATE_BLIP_FOR_COORD(<<3.2056, -660.8693, 15.1561>>)
ENDIF
i_vault_blip_remove_timer[0] = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
IF NOT b_vault_door_blown_up[1]
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
IF TIMERB() > 500
b_explosion_fired = IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_STICKYBOMB, <<8.365052,-661.627136,15.011101>>, <<7.536329,-663.902588,17.999533>>, 0.750000)
IF b_explosion_fired
OR VDIST(GET_ENTITY_COORDS(obj_vault_gates[1]), v_vault_gate_pos_2) > 0.5
//FREEZE_ENTITY_POSITION(obj_vault_gates[1], TRUE)
//SET_ENTITY_COORDS_NO_OFFSET(obj_vault_gates[1], v_vault_gate_pos_2 + <<0.0, 0.0, 5.0>>)
IF b_explosion_fired
PLAY_SOUND_FROM_ENTITY(-1, "Gold_Vault_Explosions", obj_vault_gates[1], "BIG_SCORE_3B_SOUNDS")
ENDIF
IF DOES_BLIP_EXIST(blip_vault_doors[1])
REMOVE_BLIP(blip_vault_doors[1])
ENDIF
b_vault_door_blown_up[1] = TRUE
i_time_since_last_bomb_activity = GET_GAME_TIMER()
ENDIF
ENDIF
//Handle the blip: remove if a sticky bomb is in the right place, add if there are no sticky bombs and no explosions.
IF IS_PROJECTILE_TYPE_IN_ANGLED_AREA(<<8.365052,-661.627136,15.011101>>, <<7.536329,-663.902588,17.999533>>, 0.750000, WEAPONTYPE_STICKYBOMB)
OR VDIST(GET_ENTITY_COORDS(obj_vault_gates[1]), v_vault_gate_pos_2) > 0.5
IF DOES_BLIP_EXIST(blip_vault_doors[1])
IF GET_GAME_TIMER() - i_vault_blip_remove_timer[1] > 500 //Delay the removal of the blip in case the sticky bomb is just passing through the locate.
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
REMOVE_BLIP(blip_vault_doors[1])
i_time_since_last_bomb_activity = GET_GAME_TIMER()
ENDIF
ENDIF
i_vault_blip_timer[1] = GET_GAME_TIMER()
ELSE
IF NOT DOES_BLIP_EXIST(blip_vault_doors[1])
AND NOT b_vault_door_blown_up[1] //In case it was set this frame
AND GET_GAME_TIMER() - i_vault_blip_timer[1] > 500 //In case an explosion just triggered but wasn't detected yet.
blip_vault_doors[1] = CREATE_BLIP_FOR_COORD(<<7.3349, -662.4049, 15.1561>>)
ENDIF
i_vault_blip_remove_timer[1] = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
//Audio scenes.
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_PLANT_C4")
STOP_AUDIO_SCENE("BS_2B_PLANT_C4")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_WAIT_FOR_DETONATION")
START_AUDIO_SCENE("BS_2B_WAIT_FOR_DETONATION")
ENDIF
ENDIF
//TODO 396831 - Move the cutter further back when it's safe to do so.
IF NOT b_cutter_warped
AND NOT IS_ENTITY_DEAD(veh_cutter)
IF IS_POINT_IN_ANGLED_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<0.0536, 6.7800, 1.5680>>),
<<9.034413,-647.950317,15.085551>>, <<10.894372,-638.945435,18.838383>>, 6.250000)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_cutter)) > 400.0
AND NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(veh_cutter), 8.0)
AND NOT IS_SPHERE_VISIBLE(v_cutter_pos_after_drilling, 8.0)
SET_ENTITY_COORDS(veh_cutter, v_cutter_pos_after_drilling)
SET_ENTITY_HEADING(veh_cutter, f_cutter_heading_after_drilling)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ", "Cutter has been warped while planting bombs.")
b_cutter_warped = TRUE
ENDIF
ELSE
b_cutter_warped = TRUE //No need to warp the cutter as it's not in the way.
ENDIF
ENDIF
INT i_num_sticky_bombs
i_num_sticky_bombs = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STICKYBOMB)
IF i_num_sticky_bombs < i_prev_num_sticky_bombs
i_time_of_last_sticky_bomb_throw = GET_GAME_TIMER()
ENDIF
//Fail the mission if the player doesn't have enough sticky bombs to progress
IF GET_GAME_TIMER() - i_time_of_last_sticky_bomb_throw > 2000
IF i_num_sticky_bombs = 0
//Player has no bombs left, but there's still at least one door to blow up.
IF (NOT b_vault_door_blown_up[0] AND DOES_BLIP_EXIST(blip_vault_doors[0]))
OR (NOT b_vault_door_blown_up[1] AND DOES_BLIP_EXIST(blip_vault_doors[1]))
MISSION_FAILED(FAILED_RAN_OUT_OF_CHARGES)
ENDIF
ELIF i_num_sticky_bombs = 1
//Player has a single bomb left, but both doors need to be blown up.
IF (NOT b_vault_door_blown_up[0] AND DOES_BLIP_EXIST(blip_vault_doors[0]))
AND (NOT b_vault_door_blown_up[0] AND DOES_BLIP_EXIST(blip_vault_doors[1]))
MISSION_FAILED(FAILED_RAN_OUT_OF_CHARGES)
ENDIF
ENDIF
ENDIF
i_prev_num_sticky_bombs = i_num_sticky_bombs
BREAK
CASE 1
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_WAIT_FOR_DETONATION")
STOP_AUDIO_SCENE("BS_2B_WAIT_FOR_DETONATION")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_01")
START_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_01")
ENDIF
//Play a police report once the god text has displayed.
IF NOT b_has_text_label_triggered[POLICE_REPORT_2]
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2B_02")
b_has_text_label_triggered[POLICE_REPORT_2] = TRUE
ENDIF
IF TIMERB() > 500
IF NOT b_has_text_label_triggered[BS2B_OPEN]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OPEN", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_OPEN] = TRUE
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ELIF TIMERB() > 3000
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
IF NOT DOES_BLIP_EXIST(s_crew[CREW_FRANKLIN_ID].blip)
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
s_crew[CREW_FRANKLIN_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
IF NOT b_has_text_label_triggered[F3B_ABANCREW]
PRINT_NOW("F3B_ABANCREW", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_ABANCREW] = TRUE
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) > 6400.0
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_TUNNELS)
ENDIF
ENDIF
//Check if the shootout started early due to the player taking too long or leaving the area.
IF s_tunnel_cops_new_1[0].i_event > 0
OR s_tunnel_cops_new_2[0].i_event > 0
//If the player ran out of time and the shootout started then play some dialogue.
IF b_has_text_label_triggered[BS2B_BCOPS]
IF NOT b_has_text_label_triggered[BS2B_BCOPS2]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COP")
b_has_text_label_triggered[BS2B_BCOPS2] = TRUE
SETUP_TUNNEL_CREW_FOR_SHOOTOUT() //Put him into combat mode: increased health, disable ragdoll, etc.
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//"Hurry up" dialogue, if the player doesn't plant any bombs or blow any doors after a set amount of time then play a line.
IF GET_GAME_TIMER() - i_time_since_last_bomb_activity > 8000
IF DOES_BLIP_EXIST(blip_vault_doors[0])
OR DOES_BLIP_EXIST(blip_vault_doors[1])
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT b_has_text_label_triggered[BS2B_TAKE]
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_TAKE")
b_has_text_label_triggered[BS2B_TAKE] = TRUE
i_time_since_last_bomb_activity = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_GEN]
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_GEN")
b_has_text_label_triggered[BS2B_GEN] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Fail for destroying the cutter in a location that blocks progress.
IF IS_CUTTER_BLOCKING_PROGRESS()
MISSION_FAILED(FAILED_CUTTER_BLOCKING_TUNNEL)
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_HELP()
REMOVE_ALL_BLIPS()
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cutter)
ENDIF
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_PLANT_C4")
STOP_AUDIO_SCENE("BS_2B_PLANT_C4")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_WAIT_FOR_DETONATION")
STOP_AUDIO_SCENE("BS_2B_WAIT_FOR_DETONATION")
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_CREW_DRIVE_CUTTER, str_carrec)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_COLLECT_GOLD
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
//SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(model_door_1, v_vault_door_1, FALSE, 0.0)
//SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(model_door_2, v_vault_door_2, FALSE, 0.0)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
/// New version of COLLECT_GOLD: The crew member collects the gold by hand, while the player defends them.
PROC DEFEND_CREW_IN_TUNNELS()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<14.7575, -642.5212, 15.0884>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 222.1138)
//Need to load the scene first in this case, otherwise everything falls through the ground.
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
AND SETUP_REQ_TUNNEL_INTERIOR_READY()
LOAD_SCENE(v_cutter_start_pos)
WAIT(1000)
i_current_event = 99
ENDIF
ELSE
IF SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
AND SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
AND SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
AND SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
AND SETUP_REQ_TUNNEL_COVER_OBJECTS()
//AND SETUP_REQ_VAULT_GATES_DESTROYED()
AND SETUP_REQ_VAULT_ALARM(TRUE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<14.7575, -642.5212, 15.0884>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 222.1138)
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<17.1605, -643.1400, 15.0884>>)
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 123.1396)
ENDIF
GRAB_VAULT_GATES(FALSE)
//Frag the gates
ADD_EXPLOSION(<<2.7727, -660.9886, 16.7971>>, EXP_TAG_GRENADE, 0.5)
ADD_EXPLOSION(<<7.8554, -662.5552, 16.5439>>, EXP_TAG_GRENADE, 0.5)
SETUP_FRANKLIN_OUTFIT(TRUE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
SETTIMERB(0)
//Wait for clothes to stream in
WHILE TIMERB() < 5000
IF (NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_FRANKLIN_ID].ped)
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID()))
SETTIMERB(10000)
ENDIF
WAIT(0)
ENDWHILE
WAIT(1000) //This is to allow the explosions to finish before fading back in.
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
CLEAR_PED_WETNESS(PLAYER_PED_ID())
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ELSE
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(model_vault_door, v_vault_door_pos, TRUE, 0.0, 0.0)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
ENDIF
SETUP_TUNNEL_CREW_FOR_SHOOTOUT()
DISABLE_WANTED_LEVEL_FOR_SHOOTOUT()
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(TRUE)
IF IS_SCREEN_FADED_OUT()
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
TRIGGER_MUSIC_EVENT("FH2B_NOOSE_FIGHT_RESTART")
i_current_music_event = 1
ELSE
i_current_music_event = 0
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_01")
START_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_01")
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
IF NOT IS_SCREEN_FADED_IN()
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0, TRUE)
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_IN()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
s_crew[CREW_FRANKLIN_ID].i_event = 0
i_time_since_player_last_shot = GET_GAME_TIMER()
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 7000)
b_gold_trolley_warped_for_anim = FALSE
b_moved_doors_out_of_way[0] = FALSE
b_moved_doors_out_of_way[1] = FALSE
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
b_crew_nearly_finished_trolleys = FALSE
b_trolley_sequence_is_being_blocked = FALSE
i_current_take = 0
i_displayed_take = 0
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED() //B*617956: Rayfire resets itself if walking away from the area.
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_LOCK")
SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(TRUE)
UPDATE_CUTTER_SPINNING() //In case the player decides to get in it again.
UPDATE_CREW_MEMBER_COLLECTING_GOLD()
UPDATE_TUNNEL_SHOOTOUT_ENEMIES_2()
IF NOT DOES_BLIP_EXIST(s_crew[CREW_FRANKLIN_ID].blip)
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
s_crew[CREW_FRANKLIN_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
INT i_num_enemies_left = GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2)
IF i_current_music_event = 0
IF NOT IS_MUSIC_ONESHOT_PLAYING()
TRIGGER_MUSIC_EVENT("FH2B_NOOSE_FIGHT")
i_current_music_event++
ENDIF
ELSE
//Prepare the music event for the next cutscene in advance.
PREPARE_MUSIC_EVENT("FH2B_HELI_ARRIVE")
ENDIF
//God text and start dialogue.
IF NOT b_has_text_label_triggered[BS2B_BCOPS2] //Crew member spots the cops.
IF b_has_text_label_triggered[BS2B_BCOPS] //Don't trigger until the cops line plays.
IF i_num_enemies_left > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COP")
b_has_text_label_triggered[BS2B_BCOPS2] = TRUE
ENDIF
ENDIF
ELSE
b_has_text_label_triggered[BS2B_BCOPS2] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_BCOPS3] //Franklin tells the crew member to load the gold.
IF i_num_enemies_left > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BCOPS3", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BCOPS3] = TRUE
ENDIF
ENDIF
ELSE
b_has_text_label_triggered[BS2B_BCOPS3] = TRUE
ENDIF
ELIF NOT b_has_text_label_triggered[F3B_DEFGOLD2] //God text to defend the crew member.
IF i_num_enemies_left > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_STRING_IN_STRING_NOW("F3B_DEFGOLD2", str_crew_names[CREW_FRANKLIN_ID], DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_DEFGOLD2] = TRUE
ENDIF
ELSE
b_has_text_label_triggered[F3B_DEFGOLD2] = TRUE
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_HEAR2] //More shouts from Michael at the bank
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR2", CONV_PRIORITY_MEDIUM)
i_michael_headset_dialogue_timer = GET_GAME_TIMER()
b_has_text_label_triggered[BS2B_HEAR2] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_HEAR3] //More shouts from Michael at the bank
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND GET_GAME_TIMER() - i_michael_headset_dialogue_timer > 19000
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR3", CONV_PRIORITY_MEDIUM)
i_michael_headset_dialogue_timer = GET_GAME_TIMER()
b_has_text_label_triggered[BS2B_HEAR3] = TRUE
ENDIF
ENDIF
ENDIF
SWITCH i_current_event
CASE 0
IF i_num_enemies_left > 0
IF IS_PED_SHOOTING(PLAYER_PED_ID())
i_time_since_player_last_shot = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_time_since_player_last_shot > 12000
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(s_crew[CREW_FRANKLIN_ID].ped)
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_crew[CREW_FRANKLIN_ID].ped, PLAYER_PED_ID())
APPLY_DAMAGE_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped) + 50, TRUE)
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
DETACH_ENTITY(obj_gold_trolleys[0], TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[0], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
ENDIF
ENDIF
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
DETACH_ENTITY(obj_gold_trolleys[1], TRUE, FALSE)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[1], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//If the "more cops" line triggered and the gold hasn't been loaded yet Franklin says a response.
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
IF b_has_text_label_triggered[BS2B_CRCOPS4]
IF NOT b_has_text_label_triggered[BS2B_GOTIT] //Franklin finds out where Trevor is
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOTIT", CONV_PRIORITY_MEDIUM)
i_main_conversation_timer = 0
b_has_text_label_triggered[BS2B_GOTIT] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_HEAR4] //More shouts from Michael at the bank.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND b_has_text_label_triggered[BS2B_HEAR3]
IF i_main_conversation_timer = 0
i_main_conversation_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 2200
AND GET_GAME_TIMER() - i_michael_headset_dialogue_timer > 19000
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR4", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_HEAR4] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Play random shouts: make sure these can't interfere with the response dialogue above.
IF (b_has_text_label_triggered[BS2B_CRCOPS4] AND b_has_text_label_triggered[BS2B_GOTIT])
OR NOT b_has_text_label_triggered[BS2B_CRCOPS4]
UPDATE_PLAYER_DEFEND_CREW_DIALOGUE()
ENDIF
ENDIF
ELSE
IF NOT b_has_text_label_triggered[BS2B_THELI] //Franklin finds out where Trevor is
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_THELI", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_THELI] = TRUE
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ELSE
IF IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
AND IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
BOOL bDialogueFinished
IF b_has_text_label_triggered[BS2B_CRGOLD2] //Crew member's line about finishing loading the gold, this is triggered in his AI behaviour.
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
bDialogueFinished = TRUE
ENDIF
IF (bDialogueFinished AND TIMERB() > 2000)
OR (NOT bDialogueFinished AND TIMERB() > 10000)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
IF NOT DOES_ENTITY_EXIST(veh_fake_chopper)
REQUEST_MODEL(model_gold_chopper)
REQUEST_MODEL(model_swat)
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
IF i_num_enemies_left <= 5
IF b_crew_nearly_finished_trolleys
AND i_num_enemies_left <= 2
IF HAS_MODEL_LOADED(model_gold_chopper)
AND HAS_MODEL_LOADED(model_swat)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
veh_fake_chopper = CREATE_VEHICLE(model_gold_chopper, <<211.7976, -246.2731, 120.3408>>, 149.6132)
SET_ENTITY_INVINCIBLE(veh_fake_chopper, TRUE)
SET_ENTITY_VISIBLE(veh_fake_chopper, FALSE)
SET_ENTITY_COLLISION(veh_fake_chopper, FALSE)
SET_VEHICLE_ENGINE_ON(veh_fake_chopper, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(veh_fake_chopper)
ped_fake_chopper = CREATE_PED_INSIDE_VEHICLE(veh_fake_chopper, PEDTYPE_MISSION, model_swat)
SET_ENTITY_VISIBLE(ped_fake_chopper, FALSE)
SET_ENTITY_INVINCIBLE(ped_fake_chopper, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(veh_fake_chopper, CARREC_HELI_ARRIVE_TREVOR, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_fake_chopper, 8000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_fake_chopper)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(veh_fake_chopper, <<0.0, 0.0, -10.0>>)
ENDIF
//Pre-stream some map above the tunnels for the next cutscene.
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START_SPHERE(<<19.5, -649.9, 31.9>>, 50.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(veh_fake_chopper)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_fake_chopper)
IF GET_TIME_POSITION_IN_RECORDING(veh_fake_chopper) > 16000.0
SET_PLAYBACK_SPEED(veh_fake_chopper, 0.0)
ELSE
SET_PLAYBACK_SPEED(veh_fake_chopper, 0.5)
ENDIF
ENDIF
ENDIF
ENDIF
//Pre-stream some assets in advance.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) < 3
SETUP_GOLD_CHOPPERS(v_zero, 0.0, v_zero, 0.0, TRUE)
SETUP_REQ_CREW_DRIVER_IN_CHOPPER(TRUE)
SETUP_REQ_TREVOR(v_zero, 0.0, TRUE)
SETUP_LESTER_IN_CHOPPER(TRUE)
REQUEST_MODEL(model_rope_hook)
REQUEST_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_CREW, str_carrec)
ENDIF
//2001826 - If the cutter wasn't moved in the previous section then we need to move it at the first opportunity.
IF NOT b_cutter_warped
AND NOT IS_ENTITY_DEAD(veh_cutter)
IF IS_POINT_IN_ANGLED_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<0.0536, 6.7800, 1.5680>>),
<<9.034413,-647.950317,15.085551>>, <<10.894372,-638.945435,18.838383>>, 6.250000)
IF NOT IS_ENTITY_ON_SCREEN(veh_cutter)
AND NOT IS_SPHERE_VISIBLE(v_cutter_pos_after_drilling, 8.0)
SET_ENTITY_COORDS(veh_cutter, v_cutter_pos_after_drilling)
SET_ENTITY_HEADING(veh_cutter, f_cutter_heading_after_drilling)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ", "Cutter has been warped during shootout.")
b_cutter_warped = TRUE
ENDIF
ELSE
b_cutter_warped = TRUE //No need to warp the cutter as it's not in the way.
ENDIF
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) > 6400.0
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_TUNNELS)
ENDIF
IF IS_CUTTER_BLOCKING_PROGRESS()
MISSION_FAILED(FAILED_CUTTER_BLOCKING_TUNNEL)
ENDIF
//Display the current take once the first gold trolley is loaded.
IF b_has_text_label_triggered[BS2B_CRGOLD1]
DISPLAY_TAKE()
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
KILL_FACE_TO_FACE_CONVERSATION()
UPDATE_TUNNEL_SHOOTOUT_ENEMIES_2() //Guarantees cleanup runs at least once after all enemies are dead (e.g. to make sure stats are tracked).
REMOVE_ENEMY_GROUP(s_tunnel_cops_new_1)
REMOVE_ENEMY_GROUP(s_tunnel_cops_new_2)
REMOVE_ANIM_DICT(str_anim_trolley_push_out)
REMOVE_ANIM_DICT(str_anim_trolley_push_in)
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_enter_left)
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_enter_right)
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_exit_left)
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_exit_right)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_VAULT_EXPLOSION")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_LOCK")
IF i_tunnel_navmesh_block != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_tunnel_navmesh_block)
i_tunnel_navmesh_block = -1
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_WINCH_GOLD_CUTSCENE
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_WINCH_GOLD_CUTSCENE)
ENDIF
ENDPROC
PROC WINCH_GOLD_CUTSCENE()
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<18.8869, -656.3212, 15.0978>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 80.4371)
//Need to load the scene first in this case, otherwise everything falls through the ground.
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
AND SETUP_REQ_TUNNEL_INTERIOR_READY()
LOAD_SCENE(v_cutter_start_pos)
WAIT(1000)
i_current_event = 99
ENDIF
ELSE
IF SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
AND SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
AND SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
AND SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
AND SETUP_REQ_VAULT_ALARM(TRUE)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
ENDIF
GRAB_VAULT_GATES(FALSE)
//Frag the gates
ADD_EXPLOSION(<<2.7727, -660.9886, 16.7971>>, EXP_TAG_GRENADE, 0.5)
ADD_EXPLOSION(<<7.8554, -662.5552, 16.5439>>, EXP_TAG_GRENADE, 0.5)
SETUP_FRANKLIN_OUTFIT(TRUE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ELSE
REQUEST_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_CREW, str_carrec)
REQUEST_CUTSCENE("bs_2b_mcs_1")
REQUEST_MODEL(model_rope_hook)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_mcs_1")
IF SETUP_GOLD_CHOPPERS(<<211.7976, -246.2731, 120.3408>>, 149.6132, <<244.2724, -264.6229, 127.8352>>, 148.9453)
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
AND SETUP_REQ_TREVOR(<<136.4691, -347.8948, 81.6682>>)
AND SETUP_LESTER_IN_CHOPPER()
AND SETUP_REQ_TUNNEL_COVER_OBJECTS(TRUE)
AND SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(TRUE, TRUE, TRUE)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_ARRIVE_CREW, str_carrec)
AND HAS_MODEL_LOADED(model_rope_hook)
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
SETUP_REQ_TUNNEL_COVER_OBJECTS()
SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
SETUP_TREVOR_OUTFIT()
SETUP_DRIVER_OUTFIT()
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
REMOVE_PED(ped_fake_chopper, TRUE)
REMOVE_VEHICLE(veh_fake_chopper, TRUE)
//Remove the open gold containers, replace them with the closed ones and reattach the trolleys.
REMOVE_OBJECT(obj_gold_containers[0], TRUE)
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(FALSE, TRUE, TRUE)
SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), e_weapon_before_cutscene)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<20.6039, -636.3605, 15.0772>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 277.6608)
obj_rope_hook = CREATE_OBJECT(model_rope_hook, <<44.9, -634.2, 10.5>>)
SET_MODEL_AS_NO_LONGER_NEEDED(model_rope_hook)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], s_gold_choppers[0].veh, VS_DRIVER)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HELI_ARRIVE_TREVOR, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 12000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_ARRIVE_CREW, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 11000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
ENDIF
REPOSITION_VAULT_GATES_FOR_SHOOTOUT()
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_PED_MAX_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
SET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
ENDIF
//NOTE: can't do clear area here as it will repair the vault doors.
STOP_FIRE_IN_RANGE(<<20.6039, -636.3605, 15.0772>>, 100.0)
CLEAR_AREA_OF_PROJECTILES(<<20.6039, -636.3605, 15.0772>>, 100.0)
REMOVE_PARTICLE_FX_IN_RANGE(<<20.6039, -636.3605, 15.0772>>, 100.0)
STOP_AUDIO_SCENES()
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<22.065281,-603.449951,55.915459>>,<<-42.069878,-0.005891,-175.491959>>,32.632004, TRUE)
SET_CAM_PARAMS(cam_main, <<21.285315,-606.179077,55.915459>>,<<-25.890034,-0.005891,-176.476944>>,32.632004, 5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SHAKE_CAM(cam_main, "HAND_SHAKE", 0.5)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("GtaMloRoomTun2")
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(model_vault_door, v_vault_door_pos, TRUE, 0.0, 0.0, 1.0)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2B_HELI_RESTART")
ELSE
TRIGGER_MUSIC_EVENT("FH2B_HELI_ARRIVE")
ENDIF
DO_FADE_IN_WITH_WAIT()
NEW_LOAD_SCENE_STOP()
i_current_music_event = 0
f_heli_hover_speed = 1.0
i_current_take = MAX_OVERALL_TAKE
i_displayed_take = i_current_take
SETTIMERB(0)
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ELSE
IF NOT IS_SCREEN_FADED_OUT()
DISPLAY_TAKE()
ENDIF
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2294801
SWITCH i_current_event
CASE 0
SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
REQUEST_CUTSCENE("bs_2b_mcs_1")
REQUEST_MODEL(PROP_GOLF_BALL)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_mcs_1")
IF TIMERB() > 4500
AND HAS_MODEL_LOADED(PROP_GOLF_BALL)
AND HAS_CUTSCENE_LOADED()
//Setup all the weapons
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 100)
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, TRUE)
obj_cutscene_weapons[0] = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
REGISTER_ENTITY_FOR_CUTSCENE(obj_cutscene_weapons[0], "Franklins_Weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
REGISTER_ENTITY_FOR_CUTSCENE(s_crew[CREW_FRANKLIN_ID].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF NOT HAS_PED_GOT_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE, 100)
ENDIF
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
obj_cutscene_weapons[1] = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE)
REGISTER_ENTITY_FOR_CUTSCENE(obj_cutscene_weapons[1], "HC_Gunman1_2_Handedweapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
obj_winch_cutscene_helper[0] = CREATE_OBJECT(PROP_GOLF_BALL, <<22.065281,-603.449951,105.915459>>)
obj_winch_cutscene_helper[1] = CREATE_OBJECT(PROP_GOLF_BALL, <<22.065281,-603.449951,106.915459>>)
SET_ENTITY_VISIBLE(obj_winch_cutscene_helper[0], FALSE)
SET_ENTITY_VISIBLE(obj_winch_cutscene_helper[1], FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_GOLF_BALL)
REGISTER_ENTITY_FOR_CUTSCENE(obj_gold_containers[0], "Prop_Gold_Cont_01", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(obj_gold_containers[1], "Prop_Gold_Cont_01^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(obj_rope_hook, "prop_rope_hook_01", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SETTIMERB(0)
b_skipped_mocap = FALSE
i_current_event++
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
e_section_stage = SECTION_STAGE_SKIP
ENDIF
BREAK
CASE 1
IF WAS_CUTSCENE_SKIPPED()
AND NOT b_skipped_mocap
e_section_stage = SECTION_STAGE_SKIP
ENDIF
IF IS_CUTSCENE_PLAYING()
//Delete the scripted cam and get both helicopters onto their hover recordings once the mocap starts
IF DOES_CAM_EXIST(cam_main)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_TREVOR_COLLECT_GOLD, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 6000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 25000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
ENDIF
DESTROY_CAM(cam_main)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ENDIF
//Update the rope to match the cutscene object)
IF IS_CUTSCENE_PLAYING()
AND DOES_ENTITY_EXIST(obj_rope_hook)
//#IF IS_DEBUG_BUILD
// SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
// DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_rope_hook, <<0.0, 0.0, 0.1>>), 0.05)
//#ENDIF
IF NOT DOES_ROPE_EXIST(rope_cutscene)
SET_ENTITY_COORDS(obj_winch_cutscene_helper[0], <<23.1, -636.9, 22.4>>)
FREEZE_ENTITY_POSITION(obj_winch_cutscene_helper[0], TRUE)
ATTACH_ENTITY_TO_ENTITY(obj_winch_cutscene_helper[1], obj_rope_hook, GET_ENTITY_BONE_INDEX_BY_NAME(obj_rope_hook, "ROPE_ATTATCH"), <<0.0, 0.0, -0.01>>, <<0.0, 0.0, 0.0>>)
VECTOR v_helper_pos, v_hook_pos
FLOAT f_rope_length
v_helper_pos = GET_ENTITY_COORDS(obj_winch_cutscene_helper[0])
v_hook_pos = GET_ENTITY_COORDS(obj_winch_cutscene_helper[1])
f_rope_length = VMAG(v_helper_pos - v_hook_pos)
IF f_rope_length < 20.0 //Don't attach the rope until the cutscene hook is animating in the right place.
rope_cutscene = ADD_ROPE(v_helper_pos, <<0.0, 90.0, 0.0>>, f_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_rope_length, f_rope_length)
ATTACH_ENTITIES_TO_ROPE(rope_cutscene, obj_winch_cutscene_helper[0], obj_winch_cutscene_helper[1],
v_helper_pos, v_hook_pos, f_rope_length, 0, 0)
ROPE_SET_UPDATE_ORDER(rope_cutscene, 1)
ENDIF
ENDIF
ENDIF
UPDATE_TUNNEL_SHOOTOUT_ENEMIES()
HOVER_HELI_USING_RECORDING(s_gold_choppers[0].veh, f_heli_hover_speed, 4000.0, 12000.0)
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_WAIT_FOR_TREVOR)
REQUEST_ACTION_MODE_ASSET("FRANKLIN_ACTION")
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
//SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<20.2, -639.9, 15.0882>>)
//SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 117.3504)
//SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Gunman1_2_Handedweapon")
GIVE_WEAPON_OBJECT_TO_PED(obj_cutscene_weapons[1], s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
IF HAS_ACTION_MODE_ASSET_LOADED("FRANKLIN_ACTION")
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ACTIONMODE_IDLE, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklins_Weapon")
GIVE_WEAPON_OBJECT_TO_PED(obj_cutscene_weapons[0], PLAYER_PED_ID())
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE) < 200
SET_PED_AMMO(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("prop_rope_hook_01")
IF DOES_ROPE_EXIST(rope_cutscene)
DELETE_ROPE(rope_cutscene)
ENDIF
REMOVE_OBJECT(obj_winch_cutscene_helper[0], TRUE)
REMOVE_OBJECT(obj_winch_cutscene_helper[1], TRUE)
REMOVE_OBJECT(obj_rope_hook, TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(127.1 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
IF i_current_music_event = 0
IF NOT IS_MUSIC_ONESHOT_PLAYING()
i_current_music_event++
ENDIF
ELIF i_current_music_event = 1
PREPARE_MUSIC_EVENT("FH2B_FIGHT_START")
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
DESTROY_ALL_CAMS()
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF DOES_ROPE_EXIST(rope_cutscene)
DELETE_ROPE(rope_cutscene)
ENDIF
REMOVE_OBJECT(obj_cutscene_weapons[0], TRUE)
REMOVE_OBJECT(obj_cutscene_weapons[1], TRUE)
REMOVE_OBJECT(obj_winch_cutscene_helper[0], TRUE)
REMOVE_OBJECT(obj_winch_cutscene_helper[1], TRUE)
REMOVE_ANIM_DICT(str_anim_crew_action_idle)
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_GOLF_BALL)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_TUNNEL_SHOOTOUT
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
IF IS_CUTSCENE_PLAYING()
DO_FADE_OUT_WITH_WAIT()
STOP_CUTSCENE()
e_section_stage = SECTION_STAGE_RUNNING
b_skipped_mocap = TRUE
ELSE
JUMP_TO_STAGE(STAGE_TUNNEL_SHOOTOUT)
ENDIF
ENDIF
ENDPROC
PROC TUNNEL_SHOOTOUT()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
INT i = 0
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
IF b_has_used_checkpoint
START_REPLAY_SETUP(<<19.3153, -636.0062, 15.0881>>, 155.6458, FALSE, TRUE)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<19.3153, -636.0062, 15.0881>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 155.6458)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
ENDIF
SETUP_FRANKLIN_OUTFIT(TRUE)
WHILE NOT SETUP_REQ_TUNNEL_INTERIOR_READY()
OR NOT SETUP_REQ_VAULT_ALARM(TRUE)
OR NOT SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
OR NOT DOES_ENTITY_EXIST(veh_cutter)
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
OR NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
OR NOT DOES_ENTITY_EXIST(obj_gold_containers[0])
OR NOT DOES_ENTITY_EXIST(obj_gold_trolleys[0])
OR NOT DOES_ENTITY_EXIST(obj_tunnel_crates[0])
OR NOT DOES_ENTITY_EXIST(s_gold_choppers[0].veh)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
SETUP_GOLD_CHOPPERS(<<32.0823, -604.9429, 61.9758>>, 159.2227, <<38.0823, -594.9429, 64.9758>>, 159.2227)
SETUP_REQ_TREVOR(<<18.8869, -656.3212, 15.0978>>)
SETUP_REQ_TUNNEL_COVER_OBJECTS()
WAIT(0)
ENDWHILE
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
WHILE NOT SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
OR NOT SETUP_LESTER_IN_CHOPPER()
OR NOT SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
OR NOT SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
OR NOT s_tunnel_cops_1[0].b_is_created
OR NOT s_tunnel_cops_2[0].b_is_created
UPDATE_TUNNEL_SHOOTOUT_ENEMIES()
WAIT(0)
ENDWHILE
SETUP_TREVOR_OUTFIT()
SETUP_DRIVER_OUTFIT()
IF b_has_used_checkpoint
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
ELSE
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<19.3153, -636.0062, 15.0881>>, 40.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
SETTIMERB(0)
WHILE TIMERB() < 10000
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
AND ((NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_FRANKLIN_ID].ped))
OR IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped))
SETTIMERB(100000)
ENDIF
WAIT(0)
ENDWHILE
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], s_gold_choppers[0].veh)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_TREVOR_COLLECT_GOLD, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 20000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 45000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
IF DOES_ENTITY_EXIST(obj_rope_weights[1])
SET_ENTITY_COORDS_NO_OFFSET(obj_rope_weights[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>)
ENDIF
ENDIF
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<19.3153, -636.0062, 15.0881>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 155.6458)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(127.1 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
GRAB_VAULT_GATES(FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
ENDIF
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE) < 200
SET_PED_AMMO(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, TRUE)
REMOVE_COVER_POINT(s_franklin.cover)
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
i_current_take = MAX_OVERALL_TAKE
i_displayed_take = i_current_take
b_is_jumping_directly_to_stage = FALSE
ENDIF
ELSE
DISABLE_WANTED_LEVEL_FOR_SHOOTOUT()
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(TRUE)
FREEZE_ENTITY_POSITION(obj_gold_containers[0], FALSE)
FREEZE_ENTITY_POSITION(obj_gold_containers[1], FALSE)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(model_vault_door, v_vault_door_pos, TRUE, 0.0, 0.0, 1.0)
//Get the choppers into their start positions at the shootout:
// - Trevor has already picked up one container and flown off.
// - The crew member has just attached the second container.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 21000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
//Update the gold container to match the chopper's new position otherwise the attachment will screw up.
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 45000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
//Update the weight to match, and also the container in preparation for the attach that takes place during the shootout (this should take place off-screen).
IF DOES_ENTITY_EXIST(obj_rope_weights[1])
SET_ENTITY_COORDS_NO_OFFSET(obj_rope_weights[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>)
ENDIF
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MAX_LENGTH>>)
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_HOVER_OVER_TUNNEL)
ENDIF
IF IS_SCREEN_FADED_OUT()
//If we skipped here just set up the second trolley ropes now.
WHILE NOT SETUP_REQ_TROLLEY_ATTACHED_TO_UNWOUND_HELI_ROPES(1)
WAIT(0)
ENDWHILE
//If the player skipped from the previous cutscene then give them the weapon they had in the shootout. If they came here via checkpoint then give them a fail weapon.
IF e_weapon_before_cutscene != WEAPONTYPE_UNARMED
AND e_weapon_before_cutscene != WEAPONTYPE_INVALID
AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), e_weapon_before_cutscene)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), e_weapon_before_cutscene, FALSE)
ELSE
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
ENDIF
TRIGGER_MUSIC_EVENT("FH2B_FIGHT_1_RESTART")
ELSE
TRIGGER_MUSIC_EVENT("FH2B_FIGHT_START")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_02")
START_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_02")
ENDIF
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0, TRUE)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
//Unlock some of the vault gates, so SWAT peds can come through.
DOOR_SYSTEM_SET_DOOR_STATE(i_bank_door_hashes[8], DOORSTATE_UNLOCKED, FALSE, TRUE)
DOOR_SYSTEM_SET_DOOR_STATE(i_bank_door_hashes[9], DOORSTATE_UNLOCKED, FALSE, TRUE)
IF NOT IS_SCREEN_FADED_IN()
s_crew[CREW_DRIVER_ID].i_timer = 0
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<20.2, -639.9, 15.0882>>)
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 126.3504)
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
ENDIF
SETTIMERB(0)
WHILE TIMERB() < 500
UPDATE_GUNMAN_FOR_VAULT_SHOOTOUT()
WAIT(0)
ENDWHILE
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
//Frag the gates
ADD_EXPLOSION(<<2.7727, -660.9886, 16.7971>>, EXP_TAG_ROCKET, 1.0, FALSE, TRUE, 0.0)
ADD_EXPLOSION(<<7.8554, -662.5552, 16.5439>>, EXP_TAG_ROCKET, 1.0, FALSE, TRUE, 0.0)
//REPOSITION_VAULT_GATES_FOR_SHOOTOUT()
WHILE NOT IS_SCREEN_FADED_IN()
UPDATE_GUNMAN_FOR_VAULT_SHOOTOUT()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISPLAY_TAKE()
WAIT(0)
ENDWHILE
ELSE
s_crew[CREW_DRIVER_ID].i_timer = GET_GAME_TIMER()
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 7000)
i_current_music_event = 0
s_crew[CREW_FRANKLIN_ID].i_event = 0
s_crew[CREW_DRIVER_ID].i_event = 0
f_heli_hover_speed = 1.0
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_TUNNEL_SHOOTOUT, "TUNNEL_SHOOTOUT")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
SETTIMERB(0)
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2294801
SET_POLICE_RADAR_BLIPS(FALSE)
IF i_current_event = 0
SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(TRUE)
ENDIF
UPDATE_TUNNEL_SHOOTOUT_ENEMIES()
SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED() //B*617956: Rayfire resets itself if walking away from the area.
DISPLAY_TAKE()
UPDATE_GUNMAN_FOR_VAULT_SHOOTOUT()
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
IF s_tunnel_cops_3[0].b_is_created
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_3) < 3
NEW_LOAD_SCENE_START(<<29.8, -604.5, 71.6>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-36.7, 0.0, -22.1>>), 150.0)
ENDIF
ENDIF
SWITCH i_current_event
CASE 0
UPDATE_CUTTER_SPINNING()
IF NOT DOES_BLIP_EXIST(s_crew[CREW_FRANKLIN_ID].blip)
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
s_crew[CREW_FRANKLIN_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2b) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_3) = 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
//Trevor says a line indicating to switch.
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TRAPPEL", CONV_PRIORITY_MEDIUM)
IF b_has_text_label_triggered[BS2B_TRAPPEL] = FALSE
REPLAY_RECORD_BACK_FOR_TIME(6.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
b_has_text_label_triggered[BS2B_TRAPPEL] = TRUE
SET_RAPPEL_ASSETS_AS_NO_LONGER_NEEDED()
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_TREVOR, TRUE)
SET_SELECTOR_PED_PRIORITY(s_selector_peds, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
IF interior_tunnels[0] != NULL
UNPIN_INTERIOR(interior_tunnels[0])
interior_tunnels[0] = NULL
ENDIF
IF interior_tunnels[1] != NULL
UNPIN_INTERIOR(interior_tunnels[1])
interior_tunnels[1] = NULL
ENDIF
IF interior_vault != NULL
UNPIN_INTERIOR(interior_vault)
interior_vault = NULL
ENDIF
i_current_event++
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ELSE
IF NOT b_has_text_label_triggered[BS2B_OPENTUNNEL] //Crew member says a line to get the shootout going
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_OPEN")
REPLAY_RECORD_BACK_FOR_TIME(2.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_OPENTUNNEL] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[F3B_DEFGOLD]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3B_DEFGOLD", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_DEFGOLD] = TRUE
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_TFIGHT]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TFIGHT", CONV_PRIORITY_MEDIUM)
i_main_conversation_timer = 0
b_has_text_label_triggered[BS2B_TFIGHT] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_HEAR5] //Final lines for Michael shouting.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF i_main_conversation_timer = 0
i_main_conversation_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 1700
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR5", CONV_PRIORITY_MEDIUM)
i_main_conversation_timer = 0
b_has_text_label_triggered[BS2B_HEAR5] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Player shouts during combat.
UPDATE_PLAYER_TUNNEL_SHOOTOUT_DIALOGUE()
ENDIF
IF i_current_music_event = 0
IF NOT IS_MUSIC_ONESHOT_PLAYING()
i_current_music_event++
ENDIF
ELIF i_current_music_event = 1
PREPARE_MUSIC_EVENT("FH2B_SWITCH_2")
ENDIF
//Fail if player tries to run away
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) > 6400.0
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_TUNNELS)
ENDIF
BREAK
CASE 1
UPDATE_CUTTER_SPINNING()
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_02")
STOP_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_02")
ENDIF
IF UPDATE_SELECTOR_HUD(s_selector_peds, FALSE)
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
CLEAR_PRINTS()
DESTROY_ALL_CAMS()
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_TREVOR, FALSE)
//Stop playback on Trevor's chopper once the switch starts, update the container to match the new position.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(s_gold_choppers[0].veh, <<0.0, 0.0, 10.0>>)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 20000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
ENDIF
ENDIF
//Clean up the cutter.
STOP_CUTTER_SPINNING()
REMOVE_ANIM_DICT(str_anim_cutter)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_01")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_02")
TRIGGER_MUSIC_EVENT("FH2B_SWITCH_2")
SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(FALSE)
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(FALSE)
REPEAT COUNT_OF(obj_tunnel_crates) i
REMOVE_OBJECT(obj_tunnel_crates[i], FALSE)
ENDREPEAT
SETTIMERB(0)
i_current_event++
ENDIF
ELSE
IF NOT b_has_text_label_triggered[F3B_SWITREV]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3B_SWITREV", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_SWITREV] = TRUE
i_main_conversation_timer = 0
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_USURE]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_DO_ALL_CHECKS)
IF i_main_conversation_timer = 0
i_main_conversation_timer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 5000
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_USURE", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_USURE] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Fail if player tries to run away
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) > 6400.0
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_TUNNELS)
ENDIF
ENDIF
BREAK
CASE 2
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(s_selector_cam, SWITCH_TYPE_SHORT)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
IF s_selector_cam.bPedSwitched
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
ENDIF
ENDIF
ENDIF
IF s_selector_cam.bOKToSwitchPed
IF NOT s_selector_cam.bPedSwitched
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE, TRUE)
//Warp the buddy chopper into a better position when returning to gameplay
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 57500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 1.0)
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.5)
SET_VEHICLE_ENGINE_HEALTH(s_gold_choppers[0].veh, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[0].veh, 1000.0)
ENDIF
ENDIF
REMOVE_ALL_BLIPS()
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
REPEAT COUNT_OF(s_tunnel_cops_3_rappel_data) i
CLEANUP_RAPPEL(s_tunnel_cops_3_rappel_data[i])
ENDREPEAT
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-25.0)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
s_selector_cam.bPedSwitched = TRUE
ENDIF
ENDIF
ENDIF
//IF s_selector_cam.bPedSwitched
// IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_JUMPCUT_DESCENT
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10.0)
// ENDIF
//ENDIF
BREAK
ENDSWITCH
//Disable climbing over the rubble.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<4.070398,-665.754761,14.744704>>, <<5.399380,-662.305359,19.130619>>, 5.250000)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
ENDIF
//Handle the sequence of events for winching the gold, the player should just see the last trolley going up.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
FLOAT f_trevor_playback_time, f_crew_playback_time
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
f_trevor_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[0].veh)
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
f_crew_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh)
ENDIF
SWITCH s_crew[CREW_DRIVER_ID].i_event
CASE 0 //Attach the last trolley off-screen.
IF SETUP_REQ_TROLLEY_ATTACHED_TO_UNWOUND_HELI_ROPES(1)
STOP_ROPE_UNWINDING_FRONT(s_heli_ropes_new[4].rope)
STOP_ROPE_UNWINDING_FRONT(s_heli_ropes_new[5].rope)
STOP_ROPE_UNWINDING_FRONT(s_heli_ropes_new[6].rope)
STOP_ROPE_UNWINDING_FRONT(s_heli_ropes_new[7].rope)
s_crew[CREW_DRIVER_ID].i_event++
ENDIF
BREAK
CASE 1 //lift the second trolley up and keep hovering.
//Just before the rappelling peds start to show up move the chopper away.
IF NOT b_has_text_label_triggered[BS2B_TLEAVE]
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_HOVER_OVER_TUNNEL)
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2b) <= 2
//Trevor says a line about the guys rappelling in.
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TLEAVE", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_TLEAVE] = TRUE
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ELSE
//Once the chopper is out of view then freeze it until the next section.
IF f_crew_playback_time < 67000.0
IF f_crew_playback_time < 49000.0
AND NOT IS_ENTITY_ON_SCREEN(s_gold_choppers[1].veh)
AND NOT s_selector_cam.bPedSwitched
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 49500.0)
ENDIF
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_LEAVE_BANK)
ELSE
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.0)
ENDIF
ENDIF
START_ROPE_WINDING(s_heli_ropes_new[4].rope)
START_ROPE_WINDING(s_heli_ropes_new[5].rope)
START_ROPE_WINDING(s_heli_ropes_new[6].rope)
START_ROPE_WINDING(s_heli_ropes_new[7].rope)
BREAK
ENDSWITCH
//Wind up Trevor's rope off-screen.
IF SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
START_ROPE_WINDING(s_heli_ropes_new[0].rope)
START_ROPE_WINDING(s_heli_ropes_new[1].rope)
START_ROPE_WINDING(s_heli_ropes_new[2].rope)
START_ROPE_WINDING(s_heli_ropes_new[3].rope)
ENDIF
//Once Trevor has the gold keep him hovering until the player starts the switch sequence (don't do after switching).
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF f_trevor_playback_time > 22000.0
AND e_section_stage != SECTION_STAGE_CLEANUP
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
ENDIF
ENDIF
ENDIF
//Gunman's behaviour.
IF IS_CUTTER_BLOCKING_PROGRESS()
MISSION_FAILED(FAILED_CUTTER_BLOCKING_TUNNEL)
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
NEW_LOAD_SCENE_STOP()
REPEAT COUNT_OF(s_heli_ropes_new) i
STOP_ROPE_WINDING(s_heli_ropes_new[i].rope)
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
DESTROY_ALL_CAMS()
//Call once more to guarantee cleanup for all enemies.
UPDATE_TUNNEL_SHOOTOUT_ENEMIES()
REPEAT COUNT_OF(obj_tunnel_crates) i
REMOVE_OBJECT(obj_tunnel_crates[i], TRUE)
ENDREPEAT
REMOVE_OBJECT(obj_vault_gates[0])
REMOVE_OBJECT(obj_vault_gates[1])
REMOVE_ENEMY_GROUP(s_tunnel_cops_1)
REMOVE_ENEMY_GROUP(s_tunnel_cops_2)
REMOVE_ENEMY_GROUP(s_tunnel_cops_2b)
SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(FALSE)
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(FALSE)
REMOVE_COVER_POINT(s_crew[CREW_FRANKLIN_ID].cover)
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_02")
STOP_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_02")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_NOOSE_ABSEIL_SCENE")
STOP_AUDIO_SCENE("BS_2B_NOOSE_ABSEIL_SCENE")
ENDIF
SET_RAPPEL_ASSETS_AS_NO_LONGER_NEEDED()
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
REMOVE_ACTION_MODE_ASSET("FRANKLIN_ACTION")
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_LEAVE_BANK
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_LEAVE_BANK)
ENDIF
ENDPROC
PROC LEAVE_BANK()
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<38.0410, -599.7668, 41.6337>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 80.4371)
//Need to load the scene first in this case, otherwise everything falls through the ground.
IF SETUP_REQ_PLAYER_AS_TREVOR()
AND SETUP_REQ_TUNNEL_INTERIOR_READY()
AND SETUP_GOLD_CHOPPERS(<<32.0823, -604.9429, 61.9758>>, 159.2227, <<38.0823, -594.9429, 64.9758>>, 159.2227)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
ENDIF
LOAD_SCENE(<<32.0823, -604.9429, 61.9758>>)
WAIT(1000)
i_current_event = 99
ENDIF
ELSE
REQUEST_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
IF SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
AND SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
AND SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
AND SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
AND SETUP_LESTER_IN_CHOPPER()
AND SETUP_REQ_FRANKLIN(<<18.8869, -656.3212, 15.0978>>)
AND SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0) //New test version: 4 ropes
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(1)
AND SETUP_REQ_VAULT_ALARM(TRUE)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
SETUP_FRANKLIN_OUTFIT(TRUE)
SETUP_TREVOR_OUTFIT()
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
SETUP_DRIVER_OUTFIT()
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
FREEZE_ENTITY_POSITION(veh_cutter, TRUE)
SET_VEHICLE_DOORS_LOCKED(veh_cutter, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_ENTITY_COORDS(s_gold_choppers[0].veh, <<38.0410, -599.7668, 41.6337>>)
SET_ENTITY_HEADING(s_gold_choppers[0].veh, 342.4966)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_TREVOR_COLLECT_GOLD, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 18000.0)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(s_gold_choppers[0].veh, <<0.0, 0.0, 10.0>>)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 1.0)
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset + <<0.0, 0.0, -ROPE_START_LENGTH>>))
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh))
ENDIF
//Hide Franklin out of the way for now
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
SET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], <<12.8530, -647.5173, 9.7693>>)
ENDIF
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
i_current_take = MAX_OVERALL_TAKE
i_displayed_take = i_current_take
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ELSE
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
IF interior_tunnels[0] != NULL
UNPIN_INTERIOR(interior_tunnels[0])
interior_tunnels[0] = NULL
ENDIF
IF interior_tunnels[1] != NULL
UNPIN_INTERIOR(interior_tunnels[1])
interior_tunnels[1] = NULL
ENDIF
IF interior_vault != NULL
UNPIN_INTERIOR(interior_vault)
interior_vault = NULL
ENDIF
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2B_LEAVE_RESTART")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_HELI_TAKE_GOLD")
START_AUDIO_SCENE("BS_2B_HELI_TAKE_GOLD")
ENDIF
//Make sure the crew recording is reset is turned off if arriving here from the previous section (the recording updates below will make sure it's restarted in the right place).
//IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
// IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
// STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
// ENDIF
//ENDIF
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
DO_FADE_IN_WITH_WAIT()
REPLAY_RECORD_BACK_FOR_TIME(1.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
s_crew[CREW_DRIVER_ID].i_event = 0
SETTIMERA(0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF TIMERA() > 1000
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh)
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
ENDIF
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND GET_ENTITY_HEIGHT_ABOVE_GROUND(s_gold_choppers[0].veh) > 5.0
MISSION_FAILED(FAILED_BAILED_OUT_OF_CHOPPER)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(s_locates_data)
#ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
IF NOT DOES_BLIP_EXIST(s_gold_choppers[1].blip)
s_gold_choppers[1].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_DRIVER_ID].ped)
ENDIF
IF s_crew[CREW_DRIVER_ID].i_event = 0
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_LEAVE_BANK)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
s_crew[CREW_DRIVER_ID].i_event++
ENDIF
ELIF s_crew[CREW_DRIVER_ID].i_event = 1
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_LEAVE_BANK, TRUE)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
TASK_HELI_MISSION(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh, NULL, NULL, v_airfield_pos, MISSION_GOTO, 20.0, 5.0, -30.0, 50, 30)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
s_crew[CREW_DRIVER_ID].i_event++
ENDIF
ENDIF
ENDIF
SWITCH i_current_event
CASE 0
IF NOT b_has_text_label_triggered[BS2B_GOGO]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOGO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOGO] = TRUE
ENDIF
ENDIF
ELSE
IF NOT b_has_text_label_triggered[BS2B_CHAT]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, s_lester.ped, "LESTER")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CHAT", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_CHAT] = TRUE
ENDIF
ENDIF
ENDIF
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, 0.001>>, FALSE, s_gold_choppers[0].veh,
"F3B_GOFIELD", "", "F3B_GETBACKHELI", TRUE)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
SETUP_REQ_MICHAEL(<<12.8530, -647.5173, 9.7693>>, f_michael_shootout_start_heading, TRUE)
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
ENDIF
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT b_has_text_label_triggered[BS2B_GOBACK]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_gold_pickup_pos) > 90000.0 //300m
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOBACK", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GOBACK] = TRUE
SETTIMERB(0)
ENDIF
ENDIF
ELSE
IF NOT b_has_text_label_triggered[BS2B_OTH]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_OTH")
b_has_text_label_triggered[BS2B_OTH] = TRUE
SETTIMERB(0)
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_OKAY]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OKAY", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_OKAY] = TRUE
SETTIMERB(0)
ENDIF
ENDIF
ENDIF
IF (NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data) AND b_has_text_label_triggered[BS2B_OKAY])
OR TIMERB() > 20000 //TEMP: currently the dialogue gets stuck, this timer prevents a PT where the mission doesn't progress.
IF TIMERB() > 20000
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(3.0, 7.0, REPLAY_IMPORTANCE_HIGHEST)
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_MICHAEL, TRUE)
SET_SELECTOR_PED_PRIORITY(s_selector_peds, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR)
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
PRINT_NOW("F3B_SWIMICH", DEFAULT_GOD_TEXT_TIME, 0)
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
REMOVE_VEHICLE(veh_cutter, TRUE)
//Create Michael in a hidden spot.
SETUP_REQ_MICHAEL(<<12.8530, -647.5173, 9.7693>>, f_michael_shootout_start_heading)
If NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
IF UPDATE_SELECTOR_HUD(s_selector_peds, FALSE)
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<4.0, -665.6, 49.6>>) < 40000.0 //Auto-switch if the player tries to fly back to the vault.
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<4.0, -665.6, 49.6>>) > 3610000.0 //Auto-switch if the player flies miles away.
CLEAR_PRINTS()
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
SET_ENTITY_NO_COLLISION_ENTITY(obj_gold_containers[0], s_gold_choppers[0].veh, FALSE)
ENDIF
//Move Michael to the switch location
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
SET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], v_michael_shootout_start_pos)
SET_ENTITY_HEADING(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], f_michael_shootout_start_heading)
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
FREEZE_ENTITY_POSITION(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
ENDIF
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_MICHAEL)
s_selector_cam.pedTo = s_selector_peds.pedID[SELECTOR_PED_MICHAEL]
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
FLOAT f_heading
VECTOR v_dest, v_pos, v_dir
f_heading = GET_ENTITY_HEADING(s_gold_choppers[0].veh)
v_dir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, f_heading>>)
v_pos = GET_ENTITY_COORDS(s_gold_choppers[0].veh)
v_dest = v_pos + (v_dir * 200.0) + <<0.0, 0.0, 200.0>>
TASK_HELI_MISSION(PLAYER_PED_ID(), s_gold_choppers[0].veh, NULL, NULL, v_dest, MISSION_GOTO, 30.0, 5.0, f_heading, 200, 100)
ENDIF
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
TRIGGER_MUSIC_EVENT("FH2B_LEAVE_BANK")
STOP_AUDIO_SCENES()
IF IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
STOP_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", TRUE)
ENDIF
s_michael.i_event = 0
SETTIMERB(0)
i_current_event = 50
ELSE
IF TIMERB() > 10000
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_MICHAEL, TRUE)
IF NOT b_has_text_label_triggered[BS2B_NSWITCH]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NSWITCH", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_NSWITCH] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 50
SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(v_gunman_shootout_start_pos, f_crew_shootout_start_heading)
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_SHOOT_AT_COORD) != PERFORMING_TASK
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
SET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, <<-3.1672, -669.1010, 48.4785>>)
SET_ENTITY_HEADING(s_crew[CREW_MICHAEL_ID].ped, 113.6377)
TASK_SHOOT_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-53.3699, -691.1768, 49.7996>>, -1, FIRING_TYPE_CLIP)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF
/*IF NOT IS_PED_IN_COVER(s_crew[CREW_MICHAEL_ID].ped)
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, v_gunman_shootout_start_pos, f_crew_shootout_start_heading,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
TASK_PUT_PED_DIRECTLY_INTO_COVER(s_crew[CREW_MICHAEL_ID].ped, v_gunman_shootout_start_pos, -1, FALSE, 0.0, TRUE, FALSE, s_crew[CREW_MICHAEL_ID].cover)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF*/
ENDIF
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(s_selector_cam, SWITCH_TYPE_LONG)
//As a failsafe put Michael back if he falls through the map.
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_michael_shootout_start_pos) > 25.0
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_michael_shootout_start_pos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), f_michael_shootout_start_heading)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_PED_COVER_POINT_AND_SPHERE(PLAYER_PED_ID(), s_michael.cover, v_michael_shootout_start_pos, f_michael_shootout_start_heading,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), v_michael_shootout_start_pos, -1, TRUE, 0.0, TRUE, TRUE, s_michael.cover)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
ENDIF
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//DISTANT_COP_CAR_SIRENS(TRUE)
e_section_stage = SECTION_STAGE_CLEANUP
ELSE
IF s_selector_cam.bOKToSwitchPed
IF NOT s_selector_cam.bPedSwitched
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE, TRUE)
SETUP_MICHAEL_OUTFIT(TRUE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, TRUE)
IF IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
STOP_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", TRUE)
ENDIF
REMOVE_ALL_BLIPS()
//Cleanup everything from the tunnel section.
INT i
REPEAT COUNT_OF(s_heli_ropes_new) i
IF s_heli_ropes_new[i].rope != NULL
DELETE_ROPE(s_heli_ropes_new[i].rope)
s_heli_ropes_new[i].rope = NULL
ENDIF
ENDREPEAT
REPEAT COUNT_OF(obj_gold_trolleys) i
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
ENDREPEAT
REMOVE_OBJECT(obj_pallets[0], TRUE)
REMOVE_OBJECT(obj_pallets[1], TRUE)
REMOVE_OBJECT(obj_gold_containers[0], TRUE)
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_left)
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_right)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
REMOVE_PED(s_lester.ped, TRUE)
REMOVE_VEHICLE(s_gold_choppers[0].veh, TRUE)
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
REMOVE_VEHICLE(veh_cutter, TRUE)
s_michael.i_event = 0
s_selector_cam.bPedSwitched = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF s_selector_cam.bPedSwitched
UPDATE_SHOOTOUT_COPS() //Get these peds created before the switch finishes
SWITCH s_michael.i_event
CASE 0
IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_OUTRO
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_michael_shootout_start_pos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), -153.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
SET_PED_COVER_POINT_AND_SPHERE(PLAYER_PED_ID(), s_michael.cover, v_michael_shootout_start_pos, f_michael_shootout_start_heading,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), v_michael_shootout_start_pos, -1, TRUE, 0.0, TRUE, TRUE, s_michael.cover)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
/*IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
CLEAR_PED_TASKS_IMMEDIATELY(s_crew[CREW_MICHAEL_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, v_gunman_shootout_start_pos)
SET_ENTITY_HEADING(s_crew[CREW_MICHAEL_ID].ped, f_crew_shootout_start_heading)
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, v_gunman_shootout_start_pos, f_crew_shootout_start_heading,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
TASK_PUT_PED_DIRECTLY_INTO_COVER(s_crew[CREW_MICHAEL_ID].ped, v_gunman_shootout_start_pos, -1, FALSE, 0.0, TRUE, FALSE, s_crew[CREW_MICHAEL_ID].cover)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF*/
SET_GAMEPLAY_CAM_RELATIVE_HEADING(117.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
s_michael.i_event++
ENDIF
BREAK
CASE 1
IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), v_michael_shootout_start_pos, -1, TRUE, 0.0, TRUE, TRUE, s_michael.cover)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(117.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
BREAK
ENDSWITCH
ENDIF
BREAK
ENDSWITCH
//Gold container collision audio.
IF DOES_ENTITY_EXIST(obj_gold_containers[0])
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_COLLISIONS")
IF HAS_SOUND_FINISHED(i_gold_container_sound_id)
PLAY_SOUND_FROM_ENTITY(i_gold_container_sound_id, "Gold_Cage_Collisions", obj_gold_containers[0], "BIG_SCORE_3B_SOUNDS")
ENDIF
ENDIF
ENDIF
//Fail if the trolley starts swinging into the chopper.
IF i_current_event < 50
AND TIMERA() > 1000
IF HAS_TROLLEY_ROPE_ATTACHMENT_BEEN_BROKEN(i_rope_detach_timer, 0)
IF DOES_ROPE_EXIST(s_heli_ropes_new[0].rope)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[0].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[1].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[2].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[3].rope, s_gold_choppers[0].veh)
DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
s_heli_ropes_new[0].b_is_attached = FALSE
s_heli_ropes_new[1].b_is_attached = FALSE
s_heli_ropes_new[2].b_is_attached = FALSE
s_heli_ropes_new[3].b_is_attached = FALSE
ENDIF
MISSION_FAILED(FAILED_TROLLEY_DETACHED)
ENDIF
ENDIF
IF i_current_event < 50
DISPLAY_TAKE()
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
IF IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
STOP_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", TRUE)
ENDIF
IF NOT HAS_SOUND_FINISHED(i_gold_container_sound_id)
STOP_SOUND(i_gold_container_sound_id)
ENDIF
INT i = 0
REPEAT COUNT_OF(s_heli_ropes_new) i
IF s_heli_ropes_new[i].rope != NULL
DELETE_ROPE(s_heli_ropes_new[i].rope)
s_heli_ropes_new[i].rope = NULL
ENDIF
ENDREPEAT
REPEAT COUNT_OF(obj_gold_trolleys) i
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
ENDREPEAT
REMOVE_OBJECT(obj_pallets[0], TRUE)
REMOVE_OBJECT(obj_pallets[1], TRUE)
REMOVE_OBJECT(obj_gold_containers[0], TRUE)
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_left)
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_right)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
REMOVE_PED(s_lester.ped, TRUE)
REMOVE_VEHICLE(s_gold_choppers[0].veh, TRUE)
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
REMOVE_VEHICLE(veh_cutter, TRUE)
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_CITY_SHOOTOUT
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_CITY_SHOOTOUT)
ENDIF
ENDPROC
PROC CITY_SHOOTOUT()
CONST_FLOAT TREVOR_HELI_START_TIME 60000.0
CONST_FLOAT CREW_HELI_START_TIME 62000.0
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
VECTOR v_michael_start_pos = v_michael_shootout_start_pos
FLOAT f_michael_start_heading = f_michael_shootout_start_heading
IF e_mission_stage != STAGE_CITY_SHOOTOUT
v_michael_start_pos = <<-190.7969, -648.4908, 47.6731>>
f_michael_start_heading = 10.0965
ENDIF
IF i_current_event != 99
IF SETUP_REQ_PLAYER_AS_MICHAEL()
IF b_has_used_checkpoint
START_REPLAY_SETUP(v_michael_start_pos, f_michael_start_heading, FALSE)
i_current_event = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_michael_start_pos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), f_michael_start_heading)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
i_current_event = 99
ENDIF
ENDIF
ELSE
IF SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(v_gunman_shootout_start_pos, f_crew_shootout_start_heading)
SETUP_MICHAEL_OUTFIT(TRUE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SETTIMERB(0)
WHILE TIMERB() < 10000
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
AND (NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_MICHAEL_ID].ped))
SETTIMERB(100000)
ENDIF
WAIT(0)
ENDWHILE
//Request some extra stuff if jumping to mid-point.
IF e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
WHILE NOT SETUP_REQ_FRANKLIN(<<-202.2140, -645.3587, 47.6737>>, 347.1321)
WAIT(0)
ENDWHILE
ENDIF
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
i_current_take = MAX_OVERALL_TAKE
i_displayed_take = i_current_take
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ELSE
IF SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(v_gunman_shootout_start_pos, f_crew_shootout_start_heading)
s_selector_peds.ePreviousSelectorPed = SELECTOR_PED_FRANKLIN
e_current_buddy = SELECTOR_PED_FRANKLIN
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
IF e_mission_stage = STAGE_CITY_SHOOTOUT
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, v_gunman_shootout_start_pos, f_crew_shootout_start_heading,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = FALSE
ENDIF
ELSE
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, <<-214.9014, -639.8576, 47.2236>>)
SET_ENTITY_HEADING(s_crew[CREW_MICHAEL_ID].ped, 335.4802)
s_crew[CREW_MICHAEL_ID].v_dest = <<-215.1918, -639.5822, 47.2214>>
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 343.7635, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = TRUE
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
s_michael.v_dest = <<-201.8401, -644.1752, 47.6733>>
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 2.7610, 2.0,
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
ENDIF
ENDIF
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500, FALSE)
ENDIF
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, TRUE)
SET_PLAYER_SPRINT(PLAYER_ID(), TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
IF IS_SCREEN_FADED_OUT()
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
REMOVE_COVER_POINT(s_michael.cover)
IF e_mission_stage = STAGE_CITY_SHOOTOUT
cover_player = ADD_COVER_POINT(v_michael_shootout_start_pos, f_michael_shootout_start_heading, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), v_michael_shootout_start_pos, -1, TRUE, 0.0, TRUE, TRUE, cover_player)
ELSE
cover_player = ADD_COVER_POINT(<<-190.7969, -648.4908, 47.6731>>, 10.0965, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), <<-190.7969, -648.4908, 47.6731>>, -1, TRUE, 0.0, TRUE, FALSE, cover_player)
ENDIF
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
ENDIF
SET_NUMBER_OF_PARKED_VEHICLES(0)
SET_RANDOM_TRAINS(FALSE)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_POPULATION_BUDGET(0)
SET_PED_POPULATION_BUDGET(0)
b_traffic_enabled_for_shootout = FALSE
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(TRUE)
DISABLE_ROADS_FOR_CITY_SHOOTOUT(TRUE)
sbi_shootout = ADD_SCENARIO_BLOCKING_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>, FALSE)
//SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 5)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_FAKE_WANTED_LEVEL(5)
SET_MAX_WANTED_LEVEL(0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_POLICE_RADAR_BLIPS(FALSE)
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)
IF i_stairs_navmesh_block = -1
i_stairs_navmesh_block = ADD_NAVMESH_BLOCKING_OBJECT(<<-72.0, -643.7, 37.4>>, <<3.5, 12.5, 10.0>>, DEG_TO_RAD(160.2))
ENDIF
IF i_ramp_navmesh_block_1 = -1
//i_ramp_navmesh_block_1 = ADD_NAVMESH_BLOCKING_OBJECT(<<-150.7, -674.4, 34.7>>, <<3.5, 3.5, 5.0>>, DEG_TO_RAD(68.6))
ENDIF
IF i_ramp_navmesh_block_2 = -1
//i_ramp_navmesh_block_2 = ADD_NAVMESH_BLOCKING_OBJECT(<<-195.0, -658.6, 34.0>>, <<3.5, 12.5, 5.0>>, DEG_TO_RAD(-108.8))
ENDIF
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
CLEAR_TRIGGERED_LABELS()
IF IS_SCREEN_FADED_OUT()
SETTIMERB(0)
IF e_mission_stage = STAGE_CITY_SHOOTOUT
WHILE NOT s_cops_start[COUNT_OF(s_cops_start) - 1].b_is_created //The peds are created one at a time, so need to check that the last one is created.
UPDATE_SHOOTOUT_COPS()
UPDATE_CREW_DURING_SHOOTOUT()
WAIT(0)
ENDWHILE
ELSE
KILL_ENEMY_GROUP_INSTANTLY(s_cops_start)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_pillars)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_pillars_end)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_under_bridge)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_bridge)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_bridge_2)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_ramp)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_after_bridge)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_after_ramp_blockade)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_after_ramp_blockade_2)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_bridge)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_bridge_start)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_bridge_2)
KILL_ENEMY_GROUP_INSTANTLY(s_cops_bridge_flank)
WHILE NOT s_cops_courtyard_1[COUNT_OF(s_cops_courtyard_1) - 1].b_is_created //The peds are created one at a time, so need to check that the last one is created.
UPDATE_SHOOTOUT_COPS()
UPDATE_CREW_DURING_SHOOTOUT()
WAIT(0)
ENDWHILE
ENDIF
SETTIMERB(0)
WHILE TIMERB() < 1000
UPDATE_SHOOTOUT_COPS()
UPDATE_CREW_DURING_SHOOTOUT()
WAIT(0)
ENDWHILE
TRIGGER_MUSIC_EVENT("FH2B_ESCAPE_RESTART")
ELSE
TRIGGER_MUSIC_EVENT("FH2B_CREW_ESCAPE")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_ESCAPE_START")
START_AUDIO_SCENE("BS_2B_ESCAPE_START")
ENDIF
CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
CLEAR_AREA_OF_PEDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0, TRUE)
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()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
UPDATE_SHOOTOUT_COPS()
UPDATE_CREW_DURING_SHOOTOUT()
WAIT(0)
ENDWHILE
ENDIF
IF e_mission_stage = STAGE_CITY_SHOOTOUT
i_shootout_ascend_audio_event = 0
i_current_music_event = 0
i_switch_stage = 0
b_player_jumped_over_wall = FALSE
b_player_primed_to_die = FALSE
b_created_car_park_cars = FALSE
b_crew_have_reached_bridge = FALSE
b_buddy_crossed_bridge = FALSE
b_crew_member_crossed_bridge = FALSE
b_reached_end_of_shootout = FALSE
b_traffic_enabled_for_shootout = FALSE
b_cleared_first_section_corpses = FALSE
b_buddy_is_going_to_car_park = FALSE
s_crew[CREW_MICHAEL_ID].i_event = 0
s_michael.i_event = 0
b_player_got_to_bridge = FALSE
b_ramp_heli_is_active = FALSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT, "CITY_SHOOTOUT")
i_current_event = 0
ELSE
i_shootout_ascend_audio_event = 50
i_current_music_event = 0
i_switch_stage = 0
b_player_jumped_over_wall = FALSE
b_player_primed_to_die = FALSE
b_created_car_park_cars = FALSE
b_crew_have_reached_bridge = TRUE
b_buddy_crossed_bridge = TRUE
b_crew_member_crossed_bridge = TRUE
b_reached_end_of_shootout = FALSE
b_traffic_enabled_for_shootout = FALSE
b_cleared_first_section_corpses = TRUE
b_buddy_is_going_to_car_park = FALSE
s_crew[CREW_MICHAEL_ID].i_event = 50
s_michael.i_event = 50
b_player_got_to_bridge = TRUE
b_ramp_heli_is_active = FALSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT_MID, "CITY_SHOOTOUT_MID_POINT")
i_current_event = 1
ENDIF
SETTIMERA(0)
SETTIMERB(0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISTANT_COP_CAR_SIRENS(TRUE)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
REPLAY_RECORD_BACK_FOR_TIME(1.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
//Keep track of the current buddy.
IF GET_PLAYER_PED_MODEL(CHAR_MICHAEL) = GET_PLAYER_MODEL()
e_current_buddy = SELECTOR_PED_FRANKLIN
ELSE
e_current_buddy = SELECTOR_PED_MICHAEL
ENDIF
//Keep traffic and peds disabled until later on in the shootout (parked cars are always off)
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REQUEST_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
IF NOT b_traffic_enabled_for_shootout
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF s_cops_courtyard_2[0].b_is_created
IF s_cops_courtyard_2[0].i_event > 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_2) = 0
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>, TRUE)
b_traffic_enabled_for_shootout = TRUE
ENDIF
ENDIF
ELSE
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
ENDIF
VECTOR v_player_pos, v_crew_pos, v_buddy_pos
v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
v_buddy_pos = GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])
ELSE
//Buddy hasn't shown up yet (or is dead), in either case we don't want to fail for abandoning them.
v_buddy_pos = v_player_pos
ENDIF
//Warning and fail if the player starts moving a distance away from the crew.
BOOL b_allow_shootout_switch = TRUE
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
FLOAT f_crew_fail_dist = 1600.0
//Increase the fail distance when reaching the last ramp.
IF s_cops_before_garage_blockade[0].b_is_created
f_crew_fail_dist = 2500.0
ENDIF
IF VDIST2(v_player_pos, v_crew_pos) > f_crew_fail_dist
OR VDIST2(v_player_pos, v_buddy_pos) > f_crew_fail_dist
OR (NOT b_crew_have_reached_bridge AND v_player_pos.z < 42.0)
b_allow_shootout_switch = FALSE
IF (i_current_event != 0 AND i_current_event < 50)
OR (NOT b_crew_have_reached_bridge AND v_player_pos.z < 42.0)
IF NOT b_has_text_label_triggered[F3B_ABANCREW]
PRINT_NOW("F3B_ABANCREW", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_ABANCREW] = TRUE
ENDIF
ENDIF
IF i_current_event = 0 //be more lenient if the player hasn't met Franklin yet.
IF VDIST2(v_player_pos, v_crew_pos) > 22500.0
OR VDIST2(v_player_pos, v_buddy_pos) > 22500.0
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
ENDIF
ELSE
IF VDIST2(v_player_pos, v_crew_pos) > 10000.0
OR VDIST2(v_player_pos, v_buddy_pos) > 10000.0
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
ENDIF
//If the player went all the way down to the bottom while the crew are still fighting at the top then fail.
IF NOT b_crew_have_reached_bridge
IF v_player_pos.z < 36.5
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
ENDIF
ENDIF
ENDIF
ENDIF
//Instant fail if the player goes in these areas (these are normally alternate exits that mean the player is trying to go somewhere else).
//Stagger over multiple frames to help with execution time.
IF NOT b_reached_end_of_shootout
IF i_shootout_fail_index = 0
IF NOT b_player_got_to_bridge
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-24.422255,-629.864685,38.427891>>, <<48.428841,-656.828247,30.378513>>, 28.500000)
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
ENDIF
ENDIF
ELIF i_shootout_fail_index = 1
IF NOT b_player_got_to_bridge
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-72.939621,-641.094116,38.765491>>, <<-75.345497,-640.220337,35.015427>>, 30.000000)
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
ENDIF
ENDIF
ELIF i_shootout_fail_index = 2
IF NOT b_player_got_to_bridge
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<26.817902,-742.593018,46.688881>>, <<12.609173,-782.953308,30.339386>>, 92.500000)
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
ENDIF
ENDIF
ELIF i_shootout_fail_index = 3
IF NOT b_player_got_to_bridge
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-30.434286,-686.885437,33.316105>>, <<-53.188824,-634.624023,45.447689>>, 10.000000)
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) != 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) != 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars_end) != 0
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_ENTITY_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 0)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT b_crew_member_crossed_bridge OR NOT b_buddy_crossed_bridge
//Disable climbing if the player is on the bridge and the buddies haven't crossed it yet (to stop the player jumping down).
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-109.079002,-681.708069,42.266190>>,<<21.500000,10.500000,3.250000>>)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
ENDIF
//Fail if the player goes too far down.
IF v_player_pos.z < 36.5
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
ENDIF
ENDIF
ENDIF
i_shootout_fail_index++
IF i_shootout_fail_index > 3
i_shootout_fail_index = 0
ENDIF
//Disable climbing over the railings around the stairs, as this can screw up the shootout spawns (the staircase is the only safe point to spawn).
IF NOT s_cops_bridge[0].b_is_created
OR NOT s_cops_under_bridge[0].b_is_created
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-86.426544,-701.010803,47.549473>>, <<-83.277954,-692.184021,51.049473>>, 5.750000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-64.566696,-708.274963,47.549473>>, <<-87.001091,-700.258118,51.174416>>, 5.750000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-80.382095,-699.304993,47.549473>>, <<-81.743042,-702.775452,51.049473>>, 5.750000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-68.870926,-702.858337,47.549473>>, <<-79.697258,-699.030640,51.049473>>, 5.750000)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
SET_PED_PATH_CAN_USE_CLIMBOVERS(PLAYER_PED_ID(), FALSE)
ENDIF
IF IS_PED_JUMPING(PLAYER_PED_ID())
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_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
ENDIF
ENDIF
//Some general locates checks.
IF NOT b_player_got_to_bridge
//Kill the player if they try to jump over the side of the bank down to the bottom (to prevent them trying to skip the first part of the shootout)).
IF NOT b_player_jumped_over_wall
IF v_player_pos.z > 47.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.223616,-652.224670,39.005672>>, <<-84.830887,-690.504395,48.491180>>, 3.250000)
b_player_jumped_over_wall = TRUE
ENDIF
ENDIF
ELIF NOT b_player_primed_to_die
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
AND v_player_pos.z < 42.0
b_player_primed_to_die = TRUE
ENDIF
ENDIF
IF b_player_primed_to_die
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
SET_ENTITY_HEALTH(PLAYER_PED_ID(), 0)
//APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), GET_ENTITY_HEALTH(PLAYER_PED_ID()) + 50, TRUE)
ENDIF
ENDIF
IF s_cops_bridge[0].i_event > 0
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-85.344025,-689.497864,42.731506>>,<<6.750000,4.750000,4.000000>>)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-102.836800,-684.035767,41.266190>>,<<16.750000,7.750000,2.750000>>)
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
b_player_got_to_bridge = TRUE
ENDIF
ENDIF
ENDIF
SWITCH i_current_event
CASE 0 //Michael and crew member push through cops, Franklin eventually joins them.
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
UPDATE_SHOOTOUT_COPS()
UPDATE_CREW_DURING_SHOOTOUT()
IF NOT DOES_BLIP_EXIST(s_crew[CREW_MICHAEL_ID].blip)
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
s_crew[CREW_MICHAEL_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_MICHAEL_ID].ped)
ENDIF
IF NOT b_has_text_label_triggered[BS2B_MSWITCH]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MSWITCH", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_MSWITCH] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[F3B_GOTOMICH]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_STRING_IN_STRING_NOW("F3B_GOTOMICH", str_crew_names[CREW_MICHAEL_ID], DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_GOTOMICH] = TRUE
ENDIF
ENDIF
//Play a police report once the god text has displayed.
IF NOT b_has_text_label_triggered[POLICE_REPORT_3]
AND b_has_text_label_triggered[F3B_GOTOMICH]
AND e_mission_stage = STAGE_CITY_SHOOTOUT
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2B_03")
b_has_text_label_triggered[POLICE_REPORT_3] = TRUE
ENDIF
VECTOR v_franklin_start_pos
FLOAT f_franklin_start_heading, f_dist_to_franklin
BOOL b_hit_franklin_create_locate, b_hit_alternate_franklin_create_locate
//Create an invisible Franklin to start (this gives time for his outfit to stream in).
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
IF SETUP_REQ_FRANKLIN(<<-13.9, -719.3, 74.1>>, 0.0)
SET_ENTITY_VISIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_ENTITY_INVINCIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
FREEZE_ENTITY_POSITION(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
IF NOT IS_ENTITY_VISIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
//b_hit_franklin_create_locate = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-80.671684,-701.176636,43.234303>>, <<-82.549141,-700.484253,46.484303>>, 3.000000)
b_hit_franklin_create_locate = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-75.126038,-703.198730,43.146358>>, <<-81.553040,-700.846863,48.233311>>, 3.000000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-85.292641,-696.182678,48.477474>>, <<-83.135193,-696.947510,51.474876>>, 10.250000)
b_hit_alternate_franklin_create_locate = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-84.339615,-687.004700,40.989578>>, <<-83.304123,-686.471924,44.564587>>, 12.250000)
IF b_hit_franklin_create_locate
OR b_hit_alternate_franklin_create_locate
IF b_hit_franklin_create_locate
v_franklin_start_pos = <<-86.1804, -696.4077, 43.2485>>
f_franklin_start_heading = 76.0034
ELSE
v_franklin_start_pos = <<-86.0959, -701.9257, 43.2362>>
f_franklin_start_heading = 332.1051
ENDIF
SET_ENTITY_VISIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
SET_ENTITY_INVINCIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
FREEZE_ENTITY_POSITION(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], v_franklin_start_pos)
SET_ENTITY_HEADING(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], f_franklin_start_heading)
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
UPDATE_BUDDY_SHOOTOUT_DIALOGUE(v_player_pos, TRUE)
ENDIF
ELSE
UPDATE_SELECTOR_PED_DURING_SHOOTOUT()
IF NOT DOES_BLIP_EXIST(s_franklin.blip)
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
s_franklin.blip = CREATE_BLIP_FOR_ENTITY(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
ENDIF
IF NOT b_cleared_first_section_corpses
IF v_player_pos.z < 45.0
CLEAR_AREA_OF_PEDS(<<-43.7, -685.8, 49.3>>, 25.0)
b_cleared_first_section_corpses = TRUE
ENDIF
ENDIF
//Franklin says a line when he arrives
IF NOT b_has_text_label_triggered[BS2B_FRANARR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
f_dist_to_franklin = VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
IF f_dist_to_franklin < 400.0
IF NOT IS_ENTITY_OCCLUDED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
OR f_dist_to_franklin < 9.0
IF IS_PED_INJURED(s_cops_before_bridge[0].ped)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_FRANARR", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_FRANARR] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//If the player hasn't reached Franklin yet but the crew member has then he says a line.
IF NOT b_has_text_label_triggered[BS2B_SEE]
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]), GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)) < 100.0
//1851223 - Conversation now obsolete: Franklin's line will always trigger first as there's no longer an enemy to hold up the conversation.
//IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SEE")
b_has_text_label_triggered[BS2B_SEE] = TRUE
//ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
ENDIF
ENDIF
//Play some dialogue from the gunman when the chopper arrives.
IF NOT b_has_text_label_triggered[BS2B_CHP]
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
IF IS_VEHICLE_DRIVEABLE(veh_cops_bridge_heli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
IF GET_TIME_POSITION_IN_RECORDING(veh_cops_bridge_heli) > 5000.0
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)) < 625.0
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_CHP")
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_CHP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Michael, Franklin and the crew member have joined up, allow switching.
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
UPDATE_CREW_DURING_SHOOTOUT()
UPDATE_SELECTOR_PED_DURING_SHOOTOUT()
UPDATE_SHOOTOUT_COPS()
IF NOT DOES_BLIP_EXIST(s_crew[CREW_MICHAEL_ID].blip)
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
s_crew[CREW_MICHAEL_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_MICHAEL_ID].ped)
ENDIF
IF NOT b_cleared_first_section_corpses
IF v_player_pos.z < 45.0
CLEAR_AREA_OF_PEDS(<<-43.7, -685.8, 49.3>>, 25.0)
b_cleared_first_section_corpses = TRUE
ENDIF
ENDIF
//Update blips to reflect current player ped.
IF e_current_buddy = SELECTOR_PED_FRANKLIN
IF DOES_BLIP_EXIST(s_michael.blip)
REMOVE_BLIP(s_michael.blip)
ENDIF
IF NOT DOES_BLIP_EXIST(s_franklin.blip)
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
s_franklin.blip = CREATE_BLIP_FOR_ENTITY(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
ENDIF
ELSE
IF DOES_BLIP_EXIST(s_franklin.blip)
REMOVE_BLIP(s_franklin.blip)
ENDIF
IF NOT DOES_BLIP_EXIST(s_michael.blip)
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
s_michael.blip = CREATE_BLIP_FOR_ENTITY(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
ENDIF
//Once the player has triggered the car park enemies play a music event.
IF i_current_music_event = 0
IF s_cops_car_park_1[0].i_event > 0
TRIGGER_MUSIC_EVENT("FH2B_CARPARK")
i_current_music_event++
ENDIF
ENDIF
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_3) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_2) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_1) = 0
AND NOT IS_SELECTOR_CAM_ACTIVE()
//AND IS_PED_INJURED(s_cops_heli_ramp[1].ped)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
AND GET_GAME_TIMER() - i_shootout_end_timer > 500
AND i_switch_stage = 0
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
IF NOT IS_ENTITY_DEAD(veh_cops_car_park_1)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_car_park_1)
REMOVE_VEHICLE(veh_cops_car_park_1)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_cops_car_park_2)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_car_park_2)
REMOVE_VEHICLE(veh_cops_car_park_2)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_cops_car_park_3)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_car_park_3)
REMOVE_VEHICLE(veh_cops_car_park_3)
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_VANS_ARRIVE")
STOP_AUDIO_SCENE("BS_2B_VANS_ARRIVE")
ENDIF
ELSE
//Allow switching between Michael and Franklin during the shootout.
IF b_allow_shootout_switch
UPDATE_SHOOTOUT_SWITCH()
ENDIF
//Shootout dialogue
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//Play a line from the player when the Merryweather chopper arrives.
IF NOT IS_ENTITY_DEAD(veh_merry_heli)
IF NOT b_has_text_label_triggered[BS2B_MERCOV]
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_merry_heli)
IF GET_TIME_POSITION_IN_RECORDING(veh_merry_heli) > 4000.0
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_merry_heli)) < 10000.0
IF e_current_buddy = SELECTOR_PED_FRANKLIN
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MERCOVM", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_MERCOV] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MERCOVF", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_MERCOV] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//General lines
UPDATE_BUDDY_SHOOTOUT_DIALOGUE(v_player_pos)
ENDIF
//Update the checkpoint when appropriate.
IF e_mission_stage = STAGE_CITY_SHOOTOUT
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) = 0
AND v_player_pos.z > 47.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-183.073105,-660.491577,40.232239>>, <<-147.523422,-555.349487,72.347198>>, 115.250000)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT_MID, "CITY_SHOOTOUT_MID_POINT")
e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
ENDIF
ENDIF
ENDIF
//Audio scenes.
SWITCH i_shootout_ascend_audio_event
CASE 0 //Going down the first stairs.
IF v_player_pos.z < 46.7
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-82.497536,-674.991699,41.474552>>, <<-94.017052,-706.526367,47.711830>>, 9.250000)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_SHOOTOUT_ACROSS_STREET")
START_AUDIO_SCENE("BS_2B_SHOOTOUT_ACROSS_STREET")
ENDIF
i_shootout_ascend_audio_event++
ENDIF
BREAK
CASE 1 //After crossing the bridge.
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) = 0
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_SHOOTOUT_ACROSS_STREET")
STOP_AUDIO_SCENE("BS_2B_SHOOTOUT_ACROSS_STREET")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_ASCEND_TO_NEXT_AREA")
START_AUDIO_SCENE("BS_2B_ASCEND_TO_NEXT_AREA")
ENDIF
i_shootout_ascend_audio_event = 50
ENDIF
BREAK
CASE 50 //Once reaching the large courtyard area.
IF v_player_pos.z > 47.0
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-183.073105,-660.491577,40.232239>>, <<-147.523422,-555.349487,72.347198>>, 115.250000)
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_ASCEND_TO_NEXT_AREA")
STOP_AUDIO_SCENE("BS_2B_ASCEND_TO_NEXT_AREA")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_SHOOTOUT_CONT")
START_AUDIO_SCENE("BS_2B_SHOOTOUT_CONT")
ENDIF
i_shootout_ascend_audio_event++
ENDIF
BREAK
CASE 51
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) = 0
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_courtyard) = 0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-215.143021,-630.299561,31.054901>>, <<-134.248795,-659.825623,37.041439>>, 13.750000)
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_SHOOTOUT_CONT")
STOP_AUDIO_SCENE("BS_2B_SHOOTOUT_CONT")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_ESCAPE_START")
STOP_AUDIO_SCENE("BS_2B_ESCAPE_START")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_UNDERGROUND_GARAGE")
START_AUDIO_SCENE("BS_2B_UNDERGROUND_GARAGE")
ENDIF
//This is a good time to also play the final police report for the shootout.
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2B_04")
i_shootout_ascend_audio_event++
ENDIF
ENDIF
BREAK
ENDSWITCH
i_shootout_end_timer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
UPDATE_SHOOTOUT_COPS() //To guarantee any remaining cleanup is done (e.g. flagging dead enemies for the kill stat).
REMOVE_ALL_SHOOTOUT_ENEMIES()
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_car)
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
REMOVE_VEHICLE_ASSET(model_cop_car)
REMOVE_VEHICLE_ASSET(model_cop_heli)
REMOVE_VEHICLE_ASSET(model_swat_van)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_CREW, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_1, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_3, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_4, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_5, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_6, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_1, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_3, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_RAMP, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_COURTYARD, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_MERRY_HELI, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_1, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_3, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_1, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_3, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_4, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_1, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_3, str_carrec)
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
IF i_bridge_navmesh_block != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_bridge_navmesh_block)
i_bridge_navmesh_block = -1
ENDIF
IF i_stairs_navmesh_block != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_stairs_navmesh_block)
i_stairs_navmesh_block = -1
ENDIF
IF i_ramp_navmesh_block_1 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_1)
i_ramp_navmesh_block_1 = -1
ENDIF
IF i_ramp_navmesh_block_2 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_2)
i_ramp_navmesh_block_2 = -1
ENDIF
REMOVE_COVER_POINT(cover_player)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_LOSE_COPS
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
IF e_mission_stage = STAGE_CITY_SHOOTOUT
JUMP_TO_STAGE(STAGE_CITY_SHOOTOUT_MID_POINT)
ELIF e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
JUMP_TO_STAGE(STAGE_LOSE_COPS)
ENDIF
ENDIF
ENDPROC
//Once the player reaches the car park after the shootout they have to lose a 5-star wanted level, then switch to Trevor.
PROC LOSE_COPS()
CONST_FLOAT TREVOR_HELI_START_TIME 60000.0
CONST_FLOAT CREW_HELI_START_TIME 62000.0
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
VECTOR v_michael_start_pos = <<-161.3123, -620.1779, 31.4244>>
FLOAT f_michael_start_heading = 122.4834
SELECTOR_SLOTS_ENUM e_current_player = SELECTOR_PED_TREVOR
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
e_current_player = SELECTOR_PED_MICHAEL
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
e_current_player = SELECTOR_PED_FRANKLIN
ENDIF
IF i_current_event != 99
IF e_current_player = SELECTOR_PED_MICHAEL OR e_current_player = SELECTOR_PED_FRANKLIN
OR SETUP_REQ_PLAYER_AS_FRANKLIN()
IF b_has_used_checkpoint
START_REPLAY_SETUP(v_michael_start_pos, f_michael_start_heading, FALSE)
i_current_event = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_michael_start_pos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), f_michael_start_heading)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
i_current_event = 99
ENDIF
ENDIF
ELSE
IF SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(<<-158.5508, -619.2999, 31.4244>>, 123.1897)
AND ((e_current_player = SELECTOR_PED_MICHAEL AND SETUP_REQ_FRANKLIN(<<-167.5823, -617.2461, 31.4244>>, 206.7324))
OR (e_current_player = SELECTOR_PED_FRANKLIN AND SETUP_REQ_MICHAEL(<<-167.5823, -617.2461, 31.4244>>, 206.7324)))
SETUP_MICHAEL_OUTFIT(TRUE)
SETUP_FRANKLIN_OUTFIT(TRUE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SETTIMERB(0)
WHILE TIMERB() < 10000
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
AND (NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_MICHAEL_ID].ped))
AND ((NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
OR IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
AND ((NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL]))
OR IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL]))
SETTIMERB(100000)
ENDIF
WAIT(0)
ENDWHILE
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
i_current_take = MAX_OVERALL_TAKE
i_displayed_take = i_current_take
b_created_car_park_cars = FALSE
s_selector_peds.ePreviousSelectorPed = SELECTOR_PED_FRANKLIN
e_current_buddy = SELECTOR_PED_FRANKLIN
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ELSE
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
CLEAR_TRIGGERED_LABELS()
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_MICHAEL, TRUE)
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_FRANKLIN, TRUE)
SET_NUMBER_OF_PARKED_VEHICLES(0)
SET_RANDOM_TRAINS(FALSE)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
//Set a real wanted level to attract cops.
SET_MAX_WANTED_LEVEL(5)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 5)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_FAKE_WANTED_LEVEL(0)
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
SET_CREATE_RANDOM_COPS(TRUE)
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 1.0)
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_AMBULANCE_DEPARTMENT, TRUE)
SET_POLICE_RADAR_BLIPS(TRUE)
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
SET_PLAYER_WANTED_CENTRE_POSITION(PLAYER_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()))
REPORT_POLICE_SPOTTED_PLAYER(PLAYER_ID())
sbi_shootout = ADD_SCENARIO_BLOCKING_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_ESCAPE_START")
START_AUDIO_SCENE("BS_2B_ESCAPE_START")
ENDIF
i_current_event = 0
i_current_music_event = 0
i_switch_stage = 0
i_lose_cops_event = 0
i_num_lose_cops_lines_played = 0
b_reached_end_of_shootout = TRUE
b_allow_any_vehicle_for_getaway = FALSE
b_cops_relationship_still_active = TRUE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LOSE_COPS, "LOSE_COPS")
//Reset some attributes from the shootout.
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
ENDIF
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_getaway_car)
model_suppressed_getaway = GET_ENTITY_MODEL(veh_getaway_car)
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_suppressed_getaway, TRUE)
ENDIF
IF NOT IS_SCREEN_FADED_IN()
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
TRIGGER_MUSIC_EVENT("FH2B_ESCAPE_RESTART")
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE, -1)
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE, -1)
ENDIF
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_PED_USING_ACTION_MODE(s_crew[CREW_MICHAEL_ID].ped, TRUE, -1)
ENDIF
WHILE NOT b_created_car_park_cars
UPDATE_SHOOTOUT_COPS()
WAIT(0)
ENDWHILE
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, TRUE, FALSE) //Can we clear cargen cars? It might delete the getaway car.
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
UPDATE_SHOOTOUT_COPS()
WAIT(0)
ENDWHILE
ENDIF
SETTIMERA(0)
SETTIMERB(0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
TRIGGER_MUSIC_EVENT("FH2B_ENTER_VEHICLE")
DISTANT_COP_CAR_SIRENS(TRUE)
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
//Keep track of the current buddy.
IF GET_PLAYER_PED_MODEL(CHAR_MICHAEL) = GET_PLAYER_MODEL()
e_current_buddy = SELECTOR_PED_FRANKLIN
ELSE
e_current_buddy = SELECTOR_PED_MICHAEL
ENDIF
UPDATE_SHOOTOUT_COPS()
//Keep traffic and peds disabled until later on in the shootout (parked cars are always off)
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REQUEST_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
//Keep track of crew positions.
VECTOR v_player_pos, v_crew_pos, v_buddy_pos
v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
v_buddy_pos = GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])
ENDIF
//Fail for leaving buddies behind.
IF i_current_event = 0 OR i_current_event = 1
IF VDIST2(v_player_pos, v_crew_pos) > 40000.0
OR VDIST2(v_player_pos, v_buddy_pos) > 40000.0
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
ENDIF
ENDIF
//Check when to switch to any vehicle locate instead.
IF NOT b_allow_any_vehicle_for_getaway
IF NOT IS_VEHICLE_DRIVEABLE(veh_getaway_car)
b_allow_any_vehicle_for_getaway = TRUE
ELSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF veh != veh_getaway_car
b_allow_any_vehicle_for_getaway = TRUE
ENDIF
ELSE
//If the getaway car has moved too far from the start point and the player then ignore it.
IF VDIST2(GET_ENTITY_COORDS(veh_getaway_car), <<-166.1555, -621.9833, 31.4281>>) > 40000.0
AND VDIST2(GET_ENTITY_COORDS(veh_getaway_car), v_player_pos) > 10000.0
b_allow_any_vehicle_for_getaway = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH i_current_event
CASE 0 //Player has to lose the cops
PREPARE_MUSIC_EVENT("FH2B_SWITCH_3")
UPDATE_SHOOTOUT_COPS()
TEXT_LABEL str_leave_buddy_label, str_get_back_in_car_label
IF e_current_buddy = SELECTOR_PED_MICHAEL
str_leave_buddy_label = "F3B_LEFTMICH"
ELSE
str_leave_buddy_label = "F3B_LEFTFRAN"
ENDIF
IF b_has_text_label_triggered[F3B_SWITREV]
str_get_back_in_car_label = ""
ELSE
str_get_back_in_car_label = "CMN_GENGETBCK"
ENDIF
IF NOT b_has_text_label_triggered[BS2B_JACK]
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 625.0
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GETAWAY", CONV_PRIORITY_MEDIUM)
SETTIMERB(0)
b_has_text_label_triggered[BS2B_JACK] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GETAWAY", CONV_PRIORITY_MEDIUM)
SETTIMERB(0)
b_has_text_label_triggered[BS2B_JACK] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
b_has_text_label_triggered[BS2B_JACK] = TRUE
ENDIF
ELSE
IF DOES_BLIP_EXIST(s_crew[CREW_MICHAEL_ID].blip)
REMOVE_BLIP(s_crew[CREW_MICHAEL_ID].blip)
ENDIF
IF DOES_BLIP_EXIST(s_michael.blip)
REMOVE_BLIP(s_michael.blip)
ENDIF
IF DOES_BLIP_EXIST(s_franklin.blip)
REMOVE_BLIP(s_franklin.blip)
ENDIF
IF b_allow_any_vehicle_for_getaway
IS_PLAYER_AT_LOCATION_WITH_CREW_MEMBERS_IN_ANY_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, 0.001>>, FALSE, s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, NULL,
"LOSE_WANTED", str_leave_buddy_label, "F3B_LEFTMEMBER", "", "F3B_ABANCREW", "", str_crew_names[CREW_MICHAEL_ID], "",
"F3B_FINDCAR", str_get_back_in_car_label, FALSE, FALSE, 2)
ELSE
IS_PLAYER_AT_LOCATION_WITH_CREW_MEMBERS_IN_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, 0.001>>, FALSE, s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, NULL,
veh_getaway_car, "LOSE_WANTED", str_leave_buddy_label, "F3B_LEFTMEMBER", "", "F3B_ABANCREW", "F3B_GETINCAR", "F3B_GETBACKCAR",
"", str_crew_names[CREW_MICHAEL_ID], "")
ENDIF
ENDIF
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF i_lose_cops_event = 0
IF TIMERB() > 60000
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.5)
i_lose_cops_event++
ENDIF
ELIF i_lose_cops_event = 1
IF TIMERB() > 30000
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.35)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
i_lose_cops_event++
ENDIF
ELIF i_lose_cops_event = 2
IF TIMERB() > 30000
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.2)
i_lose_cops_event++
ENDIF
ELIF i_lose_cops_event = 3
IF TIMERB() > 30000
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.1)
i_lose_cops_event++
ENDIF
ELIF i_lose_cops_event = 4
IF TIMERB() > 30000
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.0)
i_lose_cops_event++
ENDIF
ENDIF
ELSE
//Make sure buddies don't attack cops after losing the wanted level.
IF b_cops_relationship_still_active
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, RELGROUPHASH_COP)
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, rel_group_cops)
b_cops_relationship_still_active = FALSE
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_DRIVE_BY) = PERFORMING_TASK
OR GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_COMBAT) = PERFORMING_TASK
CLEAR_PED_TASKS(s_crew[CREW_MICHAEL_ID].ped)
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_DRIVE_BY) = PERFORMING_TASK
OR GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_COMBAT) = PERFORMING_TASK
CLEAR_PED_TASKS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_DRIVE_BY) = PERFORMING_TASK
OR GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_COMBAT) = PERFORMING_TASK
CLEAR_PED_TASKS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
SET_BLIP_ROUTE(s_locates_data.LocationBlip, FALSE)
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
DISTANT_COP_CAR_SIRENS(FALSE)
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 1.0)
i_current_event++
ELSE
//Dialogue while losing the wanted level.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//Play some "let's go" dialogue while running to the next destination.
IF b_has_text_label_triggered[BS2B_JACK]
IF NOT b_has_text_label_triggered[BS2B_JACK2]
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy])
AND ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_JACK2M", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_JACK2] = TRUE
i_lose_cops_dialogue_timer = GET_GAME_TIMER()
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_JACK2F", CONV_PRIORITY_MEDIUM)
i_lose_cops_dialogue_timer = GET_GAME_TIMER()
b_has_text_label_triggered[BS2B_JACK2] = TRUE
ENDIF
ENDIF
ELSE
//Play a line from the buddy if the player hasn't got in a car yet after the god text.
IF NOT b_has_text_label_triggered[BS2B_GETCAR]
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GETCARM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GETCAR] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GETCARF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_GETCAR] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Gunman shouts to go (not a priority).
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy])
AND ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped)
IF NOT b_has_text_label_triggered[BS2B_GO]
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_GO")
b_has_text_label_triggered[BS2B_GO] = TRUE
ENDIF
ENDIF
ENDIF
//Dialogue while losing the cops.
IF b_has_text_label_triggered[BS2B_JACK]
IF GET_GAME_TIMER() - i_lose_cops_dialogue_timer > 21000 + (i_num_lose_cops_lines_played * 500)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
AND ARE_CHARS_SITTING_IN_SAME_VEHICLE(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy])
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF i_num_lose_cops_lines_played < 8
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LOSE", CONV_PRIORITY_MEDIUM)
i_lose_cops_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 2000)
i_num_lose_cops_lines_played++
ENDIF
ENDIF
ELIF e_current_buddy = SELECTOR_PED_FRANKLIN
IF i_num_lose_cops_lines_played < 9
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LOSEF", CONV_PRIORITY_MEDIUM)
i_lose_cops_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 2000)
i_num_lose_cops_lines_played++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_DRIVE_AWAY")
START_AUDIO_SCENE("BS_2B_DRIVE_AWAY")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_UNDERGROUND_GARAGE")
STOP_AUDIO_SCENE("BS_2B_UNDERGROUND_GARAGE")
ENDIF
ENDIF
BREAK
CASE 1 //Player has lost the cops, get ready for the switch.
TEXT_LABEL str_leave_buddy_label_2, str_get_back_in_car_label_2
IF e_current_buddy = SELECTOR_PED_MICHAEL
str_leave_buddy_label_2 = "F3B_LEFTMICH"
ELSE
str_leave_buddy_label_2 = "F3B_LEFTFRAN"
ENDIF
IF b_has_text_label_triggered[F3B_SWITREV]
str_get_back_in_car_label_2 = ""
ELSE
str_get_back_in_car_label_2 = "CMN_GENGETBCK"
ENDIF
IS_PLAYER_AT_LOCATION_WITH_CREW_MEMBERS_IN_ANY_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, 0.001>>, FALSE, s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, NULL,
"F3B_LEAVEAREA", str_leave_buddy_label_2, "F3B_LEFTMEMBER", "", "F3B_ABANCREW", "", str_crew_names[CREW_MICHAEL_ID], "",
"F3B_FINDCAR", str_get_back_in_car_label_2, FALSE, FALSE, 2)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT b_has_text_label_triggered[BS2B_LOST]
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LOST", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_LOST] = TRUE
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_RADIO]
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RADIO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_RADIO] = TRUE
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_VSAFEM]
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_VSAFEM", CONV_PRIORITY_MEDIUM)
i_switch_dialogue_timer = GET_GAME_TIMER()
b_has_text_label_triggered[BS2B_VSAFEM] = TRUE
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
SET_BLIP_ROUTE(s_locates_data.LocationBlip, FALSE)
ENDIF
//Request all of the chase assets, once they're ready we can switch.
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
IF SETUP_GOLD_CHOPPERS(<<683.8, 981.4, 150.3>>, -30.0, <<673.8, 981.4, 150.3>>, -30.0, FALSE, TRUE)
AND SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
AND SETUP_REQ_TREVOR_IN_CHOPPER()
AND SETUP_LESTER_IN_CHOPPER()
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(1)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
IF NOT b_has_text_label_triggered[F3B_SWITREV]
IF b_has_text_label_triggered[BS2B_VSAFEM]
AND DOES_BLIP_EXIST(s_locates_data.LocationBlip)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_DO_ALL_CHECKS)
OR (GET_GAME_TIMER() - i_switch_dialogue_timer > 15000 AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF))
PRINT_NOW("F3B_SWITREV", DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_SWITREV] = TRUE
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_TREVOR, TRUE)
SET_SELECTOR_PED_PRIORITY(s_selector_peds, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN)
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_MICHAEL, TRUE)
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_FRANKLIN, TRUE)
i_switch_timer = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
IF UPDATE_SELECTOR_HUD(s_selector_peds, FALSE)
OR GET_GAME_TIMER() - i_switch_timer > 20000
CLEAR_PRINTS()
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
FREEZE_ENTITY_POSITION(s_gold_choppers[1].veh, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CREW_HELI_START_TIME)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.0)
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, TREVOR_HELI_START_TIME)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
//TODO 1173037: Remove scenarios around chase start location.
VECTOR v_chase_start
v_chase_start = GET_ENTITY_COORDS(obj_gold_containers[0])
IF sbi_chase_start = NULL
sbi_chase_start = ADD_SCENARIO_BLOCKING_AREA(v_chase_start + <<-1000.0, -1000.0, -1000.0>>, v_chase_start + <<1000.0, 1000.0, 1000.0>>)
ENDIF
CLEAR_ANGLED_AREA_OF_VEHICLES(v_chase_start + <<-1000.0, -1000.0, -100.0>>, v_chase_start + <<1000.0, 1000.0, 1000.0>>, 1000.0)
//NEW_LOAD_SCENE_START(<<746.879639,1030.785645,317.191681>>,<<2.575815,-0.000000,-5.936784>>, 100.0)
TRIGGER_MUSIC_EVENT("FH2B_SWITCH_3")
STOP_AUDIO_SCENES()
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_TREVOR)
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
i_trevor_switch_event = 0
i_current_event++
ELSE
IF NOT b_has_text_label_triggered[BS2B_NOSM]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
AND GET_GAME_TIMER() - i_switch_timer > 11300
IF e_current_buddy = SELECTOR_PED_MICHAEL
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NOSM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_NOSM] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NOSF", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_NOSM] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
REQUEST_MODEL(model_merry)
REQUEST_MODEL(model_military_chopper)
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_LONG_RANGE(s_selector_cam)
e_section_stage = SECTION_STAGE_CLEANUP
ELSE
//SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(s_selector_cam.pedTo)
IF s_selector_cam.bOKToSwitchPed
IF NOT s_selector_cam.bPedSwitched
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE, TRUE)
//Turn off wanted level again here
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_FAKE_WANTED_LEVEL(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)
UPDATE_SHOOTOUT_COPS() //To guarantee any remaining cleanup is done (e.g. flagging dead enemies for the kill stat).
REMOVE_ALL_SHOOTOUT_ENEMIES()
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
REMOVE_VEHICLE(veh_getaway_car, TRUE)
DISTANT_COP_CAR_SIRENS(FALSE)
s_selector_cam.bPedSwitched = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Keep the choppers frozen until the final cut.
SWITCH i_trevor_switch_event
CASE 0
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_JUMPCUT_DESCENT
IF GET_PLAYER_SWITCH_JUMP_CUT_INDEX() = 0
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, TREVOR_HELI_START_TIME)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.5)
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[0], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[0])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CREW_HELI_START_TIME)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.5)
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
ENDIF
ENDIF
i_trevor_switch_event++
ENDIF
ENDIF
BREAK
CASE 1
IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_OUTRO_SWOOP
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, TREVOR_HELI_START_TIME)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.5)
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[0], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[0])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CREW_HELI_START_TIME)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.5)
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(s_gold_choppers[1].veh, TRUE)
ENDIF
ENDIF
i_trevor_switch_event++
ENDIF
BREAK
ENDSWITCH
//Remove assets as soon as the switch takes them off-screen
IF DOES_ENTITY_EXIST(s_crew[CREW_MICHAEL_ID].ped)
IF NOT IS_ENTITY_DEAD(s_crew[CREW_MICHAEL_ID].ped)
IF VDIST2(GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped), GET_FINAL_RENDERED_CAM_COORD()) > 1600.0
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped)
LOAD_HELI_CHASE_UBER_DATA()
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
UPDATE_SHOOTOUT_COPS() //To guarantee any remaining cleanup is done (e.g. flagging dead enemies for the kill stat).
REMOVE_ALL_SHOOTOUT_ENEMIES()
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped)
REMOVE_VEHICLE(veh_getaway_car, TRUE)
SET_NUMBER_OF_PARKED_VEHICLES(-1)
DISTANT_COP_CAR_SIRENS(FALSE)
STOP_AUDIO_SCENES()
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
IF model_suppressed_getaway != DUMMY_MODEL_FOR_SCRIPT
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_suppressed_getaway, FALSE)
ENDIF
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_CHOPPER_CHASE
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_CHOPPER_CHASE)
ENDIF
ENDPROC
PROC CHOPPER_CHASE()
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
IF SETUP_REQ_PLAYER_AS_TREVOR()
IF b_has_used_checkpoint
START_REPLAY_SETUP(<<632.2070, 983.7871, 248.9346>>, 0.0, FALSE)
i_current_event = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<632.2070, 983.7871, 248.9346>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
i_current_event = 99
ENDIF
ENDIF
ELSE
LOAD_HELI_CHASE_UBER_DATA()
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[0], str_carrec)
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[1],str_carrec)
REQUEST_MODEL(model_merry)
REQUEST_MODEL(model_military_chopper)
IF SETUP_REQ_PLAYER_AS_TREVOR()
AND SETUP_GOLD_CHOPPERS(<<-336.4547, -750.0684, 59.2059>>, -100.0, <<-290.0, -763.0684, 64.2059>>, -100.0)
AND SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
AND SETUP_LESTER_IN_CHOPPER()
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(1)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SetPieceCarRecording[0], str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SetPieceCarRecording[1], str_carrec)
SETUP_TREVOR_OUTFIT()
SETUP_DRIVER_OUTFIT()
IF b_has_used_checkpoint
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
ELSE
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
FREEZE_ENTITY_POSITION(s_gold_choppers[1].veh, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 58000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.5)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(s_gold_choppers[1].veh, TRUE)
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 56000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.5)
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[0], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[0])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
i_current_take = MAX_OVERALL_TAKE
i_displayed_take = i_current_take
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_RANDOM_TRAINS(FALSE)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF DOES_ROPE_EXIST(s_heli_ropes_new[0].rope)
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[0], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
ENDIF
ENDIF
//TEMP: Stop the chopper from being damaged by the windmill blades.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
SET_ENTITY_INVINCIBLE(s_gold_choppers[1].veh, TRUE)
SET_ENTITY_PROOFS(s_gold_choppers[1].veh, TRUE, TRUE, TRUE, TRUE, TRUE)
IF IS_SCREEN_FADED_OUT()
//SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
//SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
//SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.9)
ENDIF
ENDIF
SETTIMERA(0)
DESTROY_ALL_CAMS() //Destroys the switch splines from the previous stage after they're done.
//Reset the wanted level modifiers, but disable wanted level for the chase.
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_FAKE_WANTED_LEVEL(0)
SET_MAX_WANTED_LEVEL(0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_POLICE_RADAR_BLIPS(TRUE)
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)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2B_HELI_CHASE_RESTART")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_HELI_CHASE")
START_AUDIO_SCENE("BS_2B_HELI_CHASE")
ENDIF
SET_AMBIENT_ZONE_LIST_STATE("AZL_BIG_SCORE_2B_WINDFARM_TURBINES", TRUE, TRUE)
IF NOT IS_SCREEN_FADED_IN()
WAIT(1000)
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
DISPLAY_TAKE()
WAIT(0)
ENDWHILE
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
f_chase_playback_speed = 0.5
i_time_last_chopper_killed = 0
i_current_chopper_wave = 0
i_player_rocket_event = 0
//i_enemy_rocket_event = 0
i_rocket_timer = GET_GAME_TIMER()
i_num_times_played_fall_behind_dialogue = 0
f_current_buddy_chopper_health = 1000.0
b_crew_gold_dropped_onto_train = FALSE
b_force_train_creation = FALSE
b_play_too_high_response = FALSE
b_trevor_chopper_too_high = FALSE
INT i = 0
REPEAT COUNT_OF(i_heli_explosion_timers) i
i_heli_explosion_timers[i] = 0
e_heli_state[i] = ENEMY_HELI_PLAY_RECORDING
ENDREPEAT
REPLAY_RECORD_BACK_FOR_TIME(2.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_HELI_CHASE, "CHOPPER_CHASE")
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
//Player's vehicle recording carries over to the main chase for a bit.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
IF TIMERA() > 1500
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh)
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND GET_ENTITY_HEIGHT_ABOVE_GROUND(s_gold_choppers[0].veh) > 5.0
MISSION_FAILED(FAILED_BAILED_OUT_OF_CHOPPER)
ENDIF
ENDIF
//#IF IS_DEBUG_BUILD
// SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[0], f_debug_trolley_mass, f_debug_trolley_gravity_factor,
// <<-1.0, -1.0, 1.0>>, <<-1.0, -1.0, -1.0>>, -1.0, -1.0, f_debug_trolley_buoyancy)
//#ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
f_chase_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh)
RUBBER_BAND_CHASE(f_chase_playback_speed, s_gold_choppers[0].veh, s_gold_choppers[1].veh)
UPDATE_HELI_CHASE(f_chase_playback_time, f_chase_playback_speed)
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, f_chase_playback_speed)
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, s_gold_choppers[1].veh)
ENDIF
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_FOCUS_ON_HELI")
START_AUDIO_SCENE("BS_2B_FOCUS_ON_HELI")
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_FOCUS_ON_HELI")
STOP_AUDIO_SCENE("BS_2B_FOCUS_ON_HELI")
ENDIF
ENDIF
//Remove any cops from earlier once the chase progresses
IF f_chase_playback_time > 20000.0
IF DOES_ENTITY_EXIST(ped_cutscene_cops[0])
REMOVE_PED(ped_cutscene_cops[0])
REMOVE_PED(ped_cutscene_cops[1])
ENDIF
ENDIF
//Fake locate: handles all the stuff for leaving the chopper, but the locate isn't considered.
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(s_locates_data)
#ENDIF
IF NOT b_has_text_label_triggered[BS2B_INFO]
//Dialogue before god text: Lester gives instructions.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_INFO", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_INFO] = TRUE
ENDIF
ENDIF
ELSE
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_locates_data, v_outside_bank, <<0.001, 0.001, 0.001>>, FALSE, s_gold_choppers[0].veh,
"", "", "F3B_GETBACKHELI")
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
SET_BLIP_ROUTE(s_locates_data.LocationBlip, FALSE)
//Need to do a custom print here to show the crew member name.
IF NOT b_has_text_label_triggered[F3B_FOLLOWCREW]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_STRING_IN_STRING_NOW("F3B_FOLLOWCREW", str_crew_names[CREW_DRIVER_ID], DEFAULT_GOD_TEXT_TIME, 0)
b_has_text_label_triggered[F3B_FOLLOWCREW] = TRUE
ENDIF
ENDIF
IF NOT DOES_BLIP_EXIST(s_gold_choppers[1].blip)
s_gold_choppers[1].blip = CREATE_BLIP_FOR_ENTITY(s_gold_choppers[1].veh)
ENDIF
ELSE
IF DOES_BLIP_EXIST(s_gold_choppers[1].blip)
REMOVE_BLIP(s_gold_choppers[1].blip)
ENDIF
//Fail for abandoning the chopper.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
VECTOR v_chopper_pos = GET_ENTITY_COORDS(s_gold_choppers[0].veh)
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_gold_choppers[0].veh)) > 10000.0
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
ELSE
IF v_chopper_pos.z - v_player_pos.z > 10.0
IF NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh)
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
OR v_player_pos.z < 1.0
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
FLOAT f_dist_between_choppers
//Fail if the player abandons the crew during the chase.
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR v_heli_pos = GET_ENTITY_COORDS(s_gold_choppers[1].veh)
f_dist_between_choppers = VDIST2(<<v_player_pos.x, v_player_pos.y, 0.0>>, <<v_heli_pos.x, v_heli_pos.y, 0.0>>)
IF f_dist_between_choppers > 160000.0
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_CHASE)
ENDIF
ENDIF
//Keep track of how many choppers are still alive.
BOOL b_choppers_still_alive = FALSE
INT i_num_choppers_still_alive = 0
INT i = 0
REPEAT COUNT_OF(i_heli_explosion_timers) i
IF i_heli_explosion_timers[i] = 0
i_num_choppers_still_alive++
b_choppers_still_alive = TRUE
ENDIF
ENDREPEAT
IF i_time_last_chopper_killed = 0
IF f_chase_playback_time > 90000.0
AND NOT b_choppers_still_alive
i_time_last_chopper_killed = GET_GAME_TIMER()
ENDIF
ENDIF
SWITCH i_current_event
CASE 0 //Progress once either all the choppers are killed or the bad driver reaches the point where they're guaranteed to explode.
//Control the buddy chopper's health during the chase: gradually reduce while the enemies are still alive.
IF b_choppers_still_alive
FLOAT f_health_ratio, f_adjusted_playback_time
f_adjusted_playback_time = f_chase_playback_time
IF f_adjusted_playback_time < 75000.0
f_adjusted_playback_time = 75000.0
ELIF f_adjusted_playback_time > 117650.0
f_adjusted_playback_time = 117650.0
ENDIF
f_health_ratio = (f_adjusted_playback_time - 75000.0) / (117650.0 - 75000.0)
IF b_picked_good_driver
f_current_buddy_chopper_health = 1000.0 - (f_health_ratio * 900.0)
ELSE
f_current_buddy_chopper_health = 1000.0 - (f_health_ratio * 1000.0)
IF i_num_choppers_still_alive <= 1
IF f_current_buddy_chopper_health > 0.0
f_current_buddy_chopper_health = 0.0
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh, f_current_buddy_chopper_health)
ENDIF
ENDIF
IF f_chase_playback_time > 117650.0
OR (NOT b_choppers_still_alive AND i_time_last_chopper_killed != 0 AND GET_GAME_TIMER() - i_time_last_chopper_killed > 4000)
IF NOT b_picked_good_driver
OR b_choppers_still_alive
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
ENDIF
b_crew_driver_set_to_die = TRUE
ELSE
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
IF GET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh) < 200.0
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh, 200.0)
ENDIF
ENDIF
ENDIF
SETTIMERB(0)
i_current_event++
ELSE
//Dialogue if the player is too far away.
IF i_num_times_played_fall_behind_dialogue < 4
IF f_dist_between_choppers > 22500.0
IF GET_GAME_TIMER() - i_fall_behind_chase_timer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OFFPATH", CONV_PRIORITY_MEDIUM)
i_fall_behind_chase_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
i_num_times_played_fall_behind_dialogue++
ENDIF
ENDIF
ENDIF
ELSE
i_fall_behind_chase_timer = GET_GAME_TIMER()
ENDIF
ENDIF
//Initial conversation: They see Merryweather, Lester gets the rocket launcher out.
IF NOT b_has_text_label_triggered[BS2B_SEES]
IF f_chase_playback_time > 68500.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SEES")
b_has_text_label_triggered[BS2B_SEES] = TRUE
ENDIF
ENDIF
ENDIF
//NOTE: these lines are no longer needed, they've been replaced by the first lines after switching.
//If subtitles are off then slot these lines in after the god text.
/*IF NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
AND b_has_text_label_triggered[F3B_FOLLOWCREW]
AND f_chase_playback_time < 68500.0
IF NOT b_has_text_label_triggered[BS2B_TREVOR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TREVOR", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_TREVOR] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_REPLY]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_REPLY", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_REPLY] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_RESPOND]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RESPOND", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_RESPOND] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF*/
ELIF NOT b_has_text_label_triggered[BS2B_LSEES]
IF f_chase_playback_time < 74000.0
AND f_chase_playback_speed >= 0.7
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LSEES", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_LSEES] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_DROP] //Driver says they're going to drop altitude.
IF f_chase_playback_time > 72500.0
AND f_chase_playback_time < 75000.0
AND f_chase_playback_speed >= 0.7
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_DROP")
b_has_text_label_triggered[BS2B_DROP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Dialogue for the driver going to the wind farm.
IF f_chase_playback_time > 87000.0 AND f_chase_playback_time < 95000.0
IF NOT b_has_text_label_triggered[BS2B_OVER]
IF f_chase_playback_speed > 0.7
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
CrewMember eCrewID
eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID)
IF eCrewID = CM_DRIVER_G_EDDIE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OVER_ET", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_OVER] = TRUE
ENDIF
ELIF eCrewID = CM_DRIVER_G_TALINA_UNLOCK
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OVER_TM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_OVER] = TRUE
ENDIF
ELIF eCrewID = CM_DRIVER_B_KARIM
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OVER_KD", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_OVER] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//If the player is behind then just skip this.
b_has_text_label_triggered[BS2B_OVER] = TRUE
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_WIND]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_WIND")
b_has_text_label_triggered[BS2B_WIND] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Lester warns that the choppers need to be taken out.
/*IF f_chase_playback_time > 104000.0
AND e_rocket_anim_state = ROCKET_ANIM_AIMING
IF NOT b_has_text_label_triggered[BS2B_BEFORE]
AND b_choppers_still_alive
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BEFORE", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BEFORE] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF*/
//Crew driver says they're in trouble.
IF f_chase_playback_time > 104000.0
AND e_rocket_anim_state = ROCKET_ANIM_AIMING
IF NOT b_has_text_label_triggered[BS2B_HLP2]
AND b_choppers_still_alive
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_HLP2")
b_has_text_label_triggered[BS2B_HLP2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF b_crew_driver_set_to_die
IF NOT b_has_text_label_triggered[BS2B_CRS]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_CRS")
b_has_text_label_triggered[BS2B_CRS] = TRUE
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh, -200.0)
ENDIF
IF TIMERB() < 2000
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
APPLY_FORCE_TO_ENTITY(s_gold_choppers[1].veh, APPLY_TYPE_FORCE, <<-15.0, 0.0, 0.0>>, <<0.0, -3.0, 0.0>>, 0, TRUE, TRUE, TRUE)
APPLY_FORCE_TO_ENTITY(s_gold_choppers[1].veh, APPLY_TYPE_FORCE, <<5.0, 5.0, -10.0>>, v_zero, 0, FALSE, TRUE, TRUE)
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
SET_ENTITY_PROOFS(s_gold_choppers[1].veh, FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_INVINCIBLE(s_gold_choppers[1].veh, FALSE)
SET_VEHICLE_OUT_OF_CONTROL(s_gold_choppers[1].veh)
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh, -300.0)
IF DOES_ROPE_EXIST(s_heli_ropes_new[4].rope)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, s_gold_choppers[1].veh)
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[1].veh, NULL, 0.0)
s_heli_ropes_new[4].b_is_attached = FALSE
s_heli_ropes_new[5].b_is_attached = FALSE
s_heli_ropes_new[6].b_is_attached = FALSE
s_heli_ropes_new[7].b_is_attached = FALSE
ENDIF
ENDIF
ADD_EXPLOSION(GET_ENTITY_COORDS(s_gold_choppers[1].veh, FALSE), EXP_TAG_ROCKET, 1.0)
i_take_penalty_crew_died = MAX_OVERALL_TAKE / 2
i_current_take -= i_take_penalty_crew_died
SETTIMERB(0)
i_current_event++
ENDIF
ELSE
i_current_event++
ENDIF
BREAK
CASE 2
IF NOT b_crew_driver_set_to_die
IF b_choppers_still_alive
IF f_chase_playback_time > 124000.0
MISSION_FAILED(FAILED_DIDNT_KILL_MERRYWEATHER)
ENDIF
ELSE
IF NOT b_has_text_label_triggered[BS2B_SAF]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SAF")
b_has_text_label_triggered[BS2B_SAF] = TRUE
ENDIF
ENDIF
ELIF NOT IS_ENTITY_DEAD(veh_gold_train)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
ELSE
//Dialogue commenting on the crew dying.
IF NOT b_has_text_label_triggered[BS2B_DOWN]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWN", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DOWN] = TRUE
ENDIF
ENDIF
ENDIF
IF b_choppers_still_alive
IF TIMERB() > 4000
MISSION_FAILED(FAILED_DIDNT_KILL_MERRYWEATHER)
ENDIF
ELSE
IF NOT b_has_text_label_triggered[BS2B_BAD]
IF b_picked_good_driver
//Player picked a good driver, but didn't kill Merryweather in time.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
CrewMember eCrewID
eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID)
//Need to play different lines based on gender.
IF eCrewID = CM_DRIVER_G_EDDIE OR eCrewID = CM_DRIVER_B_KARIM
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOOD_EK", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BAD] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOOD_TM", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BAD] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//Player picked bad driver who was always going to crash.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BAD", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_BAD] = TRUE
b_force_train_creation = TRUE //2046008 - If all the enemies are killed really early and the bad driver dies, then the player is stuck waiting for the train to spawn.
ENDIF
ENDIF
ENDIF
ELSE
IF TIMERB() > 2000
AND NOT IS_ENTITY_DEAD(veh_gold_train)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//Create and update the train.
IF NOT DOES_ENTITY_EXIST(veh_gold_train)
IF b_force_train_creation
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<2216.3, 2628.0, 52.0>>) < 250000.0
SETUP_REQ_GOLD_TRAIN()
ENDIF
ELIF NOT IS_ENTITY_DEAD(veh_gold_train)
IF b_crew_driver_set_to_die
CONVERGE_VALUE(f_current_train_speed, 15.0, 0.1)
SET_TRAIN_CRUISE_SPEED(veh_gold_train, f_current_train_speed)
SET_TRAIN_SPEED(veh_gold_train, f_current_train_speed)
ELSE
RUBBER_BAND_TRAIN_TO_VEH(veh_gold_train, 1, s_gold_choppers[1].veh, 0.0)
ENDIF
ENDIF
//Gold container collision audio.
IF DOES_ENTITY_EXIST(obj_gold_containers[0])
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_COLLISIONS")
IF HAS_SOUND_FINISHED(i_gold_container_sound_id)
PLAY_SOUND_FROM_ENTITY(i_gold_container_sound_id, "Gold_Cage_Collisions", obj_gold_containers[0], "BIG_SCORE_3B_SOUNDS")
ENDIF
ENDIF
ENDIF
//Fail if the trolley starts swinging into the chopper.
IF TIMERA() > 2000
IF HAS_TROLLEY_ROPE_ATTACHMENT_BEEN_BROKEN(i_rope_detach_timer, 0)
IF DOES_ROPE_EXIST(s_heli_ropes_new[0].rope)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[0].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[1].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[2].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[3].rope, s_gold_choppers[0].veh)
DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
s_heli_ropes_new[0].b_is_attached = FALSE
s_heli_ropes_new[1].b_is_attached = FALSE
s_heli_ropes_new[2].b_is_attached = FALSE
s_heli_ropes_new[3].b_is_attached = FALSE
ENDIF
MISSION_FAILED(FAILED_TROLLEY_DETACHED)
ENDIF
ENDIF
DISPLAY_TAKE()
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_HELP()
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
STOP_CAM_PLAYBACK(veh_chase_cam)
REMOVE_VEHICLE(veh_chase_cam, TRUE)
REMOVE_CAM_RECORDING(CARREC_CHASE_CAM_ANGLE_1, str_carrec)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
REMOVE_VEHICLE(SetPieceCarID[0], FALSE)
REMOVE_VEHICLE(SetPieceCarID[1], FALSE)
REMOVE_VEHICLE(SetPieceCarID[2], FALSE)
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[0], str_carrec)
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[1], str_carrec)
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[2], str_carrec)
REMOVE_OBJECT(obj_single_rocket, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_merry)
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
REMOVE_PTFX_ASSET()
IF sbi_chase_start != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbi_chase_start)
sbi_chase_start = NULL
ENDIF
IF b_crew_driver_set_to_die
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(s_gold_choppers[1].veh)
ENDIF
REMOVE_OBJECT(obj_gold_containers[1])
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped)
REMOVE_VEHICLE(s_gold_choppers[1].veh)
ENDIF
STOP_AUDIO_SCENES()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_DROP_GOLD_ON_TRAIN
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_DROP_GOLD_ON_TRAIN)
ENDIF
ENDPROC
PROC DROP_GOLD_ON_TRAIN()
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
IF SETUP_REQ_PLAYER_AS_TREVOR()
IF b_has_used_checkpoint
START_REPLAY_SETUP(<<2098.3, 2464.01, 87.0>>, -38.24, FALSE)
i_current_event = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2098.3, 2464.01, 87.0>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), -38.24)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
i_current_event = 99
ENDIF
ENDIF
ELSE
LOAD_HELI_CHASE_UBER_DATA()
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
IF SETUP_REQ_PLAYER_AS_TREVOR()
AND SETUP_GOLD_CHOPPERS(<<2107.78, 2443.01, 117.60>>, -38.24, <<2176.8989, 2575.7715, 62.2540>>, 328.2068)
AND SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
AND SETUP_LESTER_IN_CHOPPER()
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
AND (b_crew_driver_set_to_die OR (NOT b_crew_driver_set_to_die AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(1)))
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
SETUP_TREVOR_OUTFIT()
IF b_has_used_checkpoint
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
ELSE
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_ENTITY_COORDS(s_gold_choppers[0].veh, <<2107.78, 2443.01, 117.60>>)
SET_ENTITY_HEADING(s_gold_choppers[0].veh, -38.24)
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[0], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[0])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
ENDIF
IF NOT b_crew_driver_set_to_die
SETUP_DRIVER_OUTFIT()
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
SETUP_DRIVER_OUTFIT()
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 122000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(s_gold_choppers[1].veh, TRUE)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
ENDIF
ELSE
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
i_current_take = i_max_take_considering_crew
i_displayed_take = i_current_take
//Don't play Lester's rocket anims on a skip.
e_rocket_anim_state = ROCKET_ANIM_PUT_LAUNCHER_AWAY
i_lester_rocket_anim_event = 99
i_lester_rocket_sync_scene = -1
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ENDIF
ELSE
IF SETUP_REQ_GOLD_TRAIN()
//SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[0], -1.0, -1.0, <<-1.0, -1.0, 1.0>>, <<-1.0, -1.0, -1.0>>)
SET_RANDOM_TRAINS(FALSE)
DELETE_ALL_TRAINS()
//Disable wanted level.
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_GET_TO_TRAIN")
START_AUDIO_SCENE("BS_2B_GET_TO_TRAIN")
ENDIF
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
//In case it was frozen in the Z-skip.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, FALSE)
ENDIF
TRIGGER_MUSIC_EVENT("FH2B_DROP_GOLD_RESTART")
SET_AMBIENT_ZONE_LIST_STATE("AZL_BIG_SCORE_2B_WINDFARM_TURBINES", TRUE, TRUE)
WHILE NOT IS_SCREEN_FADED_IN()
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_VEHICLE_FORWARD_SPEED(s_gold_choppers[0].veh, 20.0)
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
b_player_got_close_enough_to_train = FALSE
b_set_improved_heli_handling = FALSE
i_current_music_event = 0
i_time_train_help_displayed = 0
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DROPOFF_GOLD, "DROP_OFF_GOLD")
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FH2B_GOLD_DROP_TIME)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
b_crew_gold_dropped_onto_train = FALSE
i_time_crew_gold_dropped = 0
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
f_chase_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh)
RUBBER_BAND_CHASE(f_chase_playback_speed, s_gold_choppers[0].veh, s_gold_choppers[1].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, f_chase_playback_speed)
ENDIF
IF f_chase_playback_time > 120000.0
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
SET_ENTITY_INVINCIBLE(s_gold_choppers[1].veh, FALSE)
SET_ENTITY_PROOFS(s_gold_choppers[1].veh, FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND GET_ENTITY_HEIGHT_ABOVE_GROUND(s_gold_choppers[0].veh) > 5.0
MISSION_FAILED(FAILED_BAILED_OUT_OF_CHOPPER)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_gold_train)
IF NOT b_set_improved_heli_handling
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), GET_ENTITY_COORDS(veh_gold_train)) < 10000.0
SET_HELI_TURBULENCE_SCALAR(s_gold_choppers[0].veh, 0.0)
SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(s_gold_choppers[0].veh, 0.0)
ENDIF
ELSE
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), GET_ENTITY_COORDS(veh_gold_train)) > 22500.0
SET_HELI_TURBULENCE_SCALAR(s_gold_choppers[0].veh, 1.0)
SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(s_gold_choppers[0].veh, 1.0)
ENDIF
ENDIF
ENDIF
ENDIF
//Fake locate: handles all the stuff for leaving the chopper, but the locate isn't considered.
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(s_locates_data)
#ENDIF
//Dialogue before god text: varies depending on if the driver survived.
IF NOT b_has_text_label_triggered[BS2B_CLEAR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF b_crew_driver_set_to_die
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CLEAR", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_CLEAR] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOING", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_CLEAR] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_locates_data, v_outside_bank, <<0.001, 0.001, 0.001>>, FALSE, s_gold_choppers[0].veh,
"F3B_DROPGOLD", "", "F3B_GETBACKHELI")
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
IF i_current_music_event = 0
IF NOT IS_MUSIC_ONESHOT_PLAYING()
i_current_music_event++
ENDIF
ELIF i_current_music_event = 1
PREPARE_MUSIC_EVENT("FH2B_GOLD_DROPPED")
ENDIF
//Request assets for next cutscene.
REQUEST_MODEL(model_gold_chopper)
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
LOAD_STREAM("Gold_Drop_Train", "BIG_SCORE_3B_SOUNDS")
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
SET_BLIP_ROUTE(s_locates_data.LocationBlip, FALSE)
IF NOT DOES_BLIP_EXIST(blip_current_objective)
AND NOT IS_ENTITY_DEAD(veh_gold_train)
blip_current_objective = CREATE_BLIP_FOR_ENTITY(GET_TRAIN_CARRIAGE(veh_gold_train, 1))
ENDIF
VEHICLE_INDEX veh_train_carriage_1
IF NOT IS_ENTITY_DEAD(veh_gold_train)
veh_train_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
ENDIF
BOOL b_safe_to_drop_gold = TRUE
SWITCH i_current_event
CASE 0
IF NOT IS_ENTITY_DEAD(veh_gold_train)
IF NOT IS_ENTITY_DEAD(veh_train_carriage_1)
AND NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
//Check that the train isn't about to go under a bridge.
IF IS_ENTITY_IN_ANGLED_AREA(veh_gold_train, <<2520.433350,2815.515381,35.313625>>, <<2473.084961,2762.365723,44.206718>>, 9.750000)
OR IS_ENTITY_IN_ANGLED_AREA(veh_train_carriage_1, <<2520.433350,2815.515381,35.313625>>, <<2473.084961,2762.365723,44.206718>>, 9.750000)
OR IS_ENTITY_IN_ANGLED_AREA(veh_gold_train, <<2901.285889,3585.482910,41.650940>>, <<2874.897461,3763.112549,50.441540>>, 51.000000)
OR IS_ENTITY_IN_ANGLED_AREA(veh_train_carriage_1, <<2901.285889,3585.482910,41.650940>>, <<2874.897461,3763.112549,50.441540>>, 51.000000)
OR IS_ENTITY_IN_ANGLED_AREA(veh_gold_train, <<2657.047852,3913.478760,39.682320>>, <<2489.471924,3882.476563,46.098293>>, 51.000000)
OR IS_ENTITY_IN_ANGLED_AREA(veh_train_carriage_1, <<2657.047852,3913.478760,39.682320>>, <<2489.471924,3882.476563,46.098293>>, 51.000000)
b_safe_to_drop_gold = FALSE
ENDIF
//Draw a corona if it's currently safe to drop.
IF b_safe_to_drop_gold
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_carriage_1, <<0.0, 0.0, -0.4>>),
<<0.01, 0.01, LOCATE_SIZE_HEIGHT>>, TRUE)
ENDIF
BOOL b_above_carriage_1
b_above_carriage_1 = IS_ENTITY_IN_ANGLED_AREA(s_gold_choppers[0].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_carriage_1, <<0.0, 9.0, 7.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_carriage_1, <<0.0, -20.0, 24.0>>),
10.0)
IF b_above_carriage_1
IF b_safe_to_drop_gold
IF NOT b_has_text_label_triggered[F3B_DROPHELP]
IF GET_GAME_TIMER() - i_time_train_help_cleared > 1000
OR i_time_train_help_displayed = 0 //This is so there's no delay the first time the help is printed.
PRINT_HELP_FOREVER("F3B_DROPHELP")
b_has_text_label_triggered[F3B_DROPHELP] = TRUE
ENDIF
ENDIF
IF b_has_text_label_triggered[BS2B_NODROP]
IF NOT b_has_text_label_triggered[BS2B_YESDROP]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_YESDROP", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_NODROP] = FALSE
b_has_text_label_triggered[BS2B_YESDROP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_GRAPPLING_HOOK)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
i_time_train_help_displayed = GET_GAME_TIMER()
ELSE
IF NOT b_has_text_label_triggered[BS2B_NODROP]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NODROP", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_NODROP] = TRUE
b_has_text_label_triggered[BS2B_YESDROP] = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF b_has_text_label_triggered[F3B_DROPHELP]
IF GET_GAME_TIMER() - i_time_train_help_displayed > 1000
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3B_DROPHELP")
CLEAR_HELP()
ENDIF
b_has_text_label_triggered[F3B_DROPHELP] = FALSE
ENDIF
ENDIF
i_time_train_help_cleared = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF NOT IS_ENTITY_DEAD(veh_gold_train)
//The buddy chopper drops it's gold first (if they're still alive). Once it's dropped go at a speed that the player can catch up to.
IF b_crew_gold_dropped_onto_train
OR b_crew_driver_set_to_die
CONVERGE_VALUE(f_current_train_speed, 15.0, 0.1)
SET_TRAIN_CRUISE_SPEED(veh_gold_train, f_current_train_speed)
SET_TRAIN_SPEED(veh_gold_train, f_current_train_speed)
//Play some dialogue after dropping the gold.
IF b_crew_gold_dropped_onto_train
IF NOT b_has_text_label_triggered[BS2B_PACK1]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_PACK")
b_has_text_label_triggered[BS2B_PACK1] = TRUE
ENDIF
ENDIF
ENDIF
//Make sure the crew's trolley is attached on falling.
IF NOT IS_ENTITY_DEAD(veh_train_carriage_1)
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_containers[1], veh_train_carriage_1)
//Apply a force that'll guide the container onto the train
IF GET_GAME_TIMER() - i_time_crew_gold_dropped < 1500
VECTOR v_container_pos = GET_ENTITY_COORDS(obj_gold_containers[1])
VECTOR v_desired_attach_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_carriage_1, <<0.0, -2.0, 0.0>>)
VECTOR v_diff = <<v_desired_attach_pos.x, v_desired_attach_pos.y, 0.0>> - <<v_container_pos.x, v_container_pos.y, 0.0>>
VECTOR v_dir = v_diff / VMAG(v_diff)
APPLY_FORCE_TO_ENTITY(obj_gold_containers[1], APPLY_TYPE_FORCE, v_dir * 30.0, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(obj_gold_containers[1], veh_train_carriage_1)
IF GET_GAME_TIMER() - i_time_crew_gold_dropped > 1600
VECTOR v_attach_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_carriage_1, GET_ENTITY_COORDS(obj_gold_containers[1]))
VECTOR v_attach_rotation = GET_ENTITY_ROTATION(obj_gold_containers[1]) - GET_ENTITY_ROTATION(veh_train_carriage_1)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, obj_gold_containers[1])
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, obj_gold_containers[1])
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, obj_gold_containers[1])
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, obj_gold_containers[1])
DETACH_ENTITY(obj_gold_containers[1], TRUE, FALSE)
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[1].veh, NULL, 0.0)
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[1], veh_train_carriage_1, 0, v_attach_offset, v_attach_rotation, FALSE, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
RUBBER_BAND_TRAIN_TO_VEH(veh_gold_train, 1, s_gold_choppers[1].veh, 2.0)
IF f_chase_playback_time > 135450.0 AND f_chase_playback_time < 140000.0
IF DOES_ROPE_EXIST(s_heli_ropes_new[4].rope)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, s_gold_choppers[1].veh)
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[1].veh, NULL, 0.0)
/*DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, obj_gold_containers[1])
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, obj_gold_containers[1])
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, obj_gold_containers[1])
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, obj_gold_containers[1])
DETACH_ENTITY(obj_gold_containers[1], TRUE, FALSE)*/
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh))
s_heli_ropes_new[4].b_is_attached = FALSE
s_heli_ropes_new[5].b_is_attached = FALSE
s_heli_ropes_new[6].b_is_attached = FALSE
s_heli_ropes_new[7].b_is_attached = FALSE
ENDIF
i_time_crew_gold_dropped = GET_GAME_TIMER()
b_crew_gold_dropped_onto_train = TRUE
ENDIF
ENDIF
ENDIF
//Do a hint cam to the train.
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, veh_gold_train)
//Dialogue:
//Train driver says a line as the choppers get closer.
IF NOT b_has_text_label_triggered[BS2B_TRN]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_gold_train)) < 62500.0
IF b_crew_driver_set_to_die
IF CREATE_DRIVER_CONVERSATION(CREW_TRAIN_DRIVER_ID, NULL, s_conversation_peds, str_dialogue_block, "BS2B_TRN1")
REPLAY_RECORD_BACK_FOR_TIME(4.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_TRN] = TRUE
ENDIF
ELSE
IF CREATE_DRIVER_CONVERSATION(CREW_TRAIN_DRIVER_ID, NULL, s_conversation_peds, str_dialogue_block, "BS2B_TRN2")
REPLAY_RECORD_BACK_FOR_TIME(4.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_TRN] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR v_train_pos = GET_ENTITY_COORDS(veh_gold_train)
FLOAT f_dist_from_train = VDIST2(<<v_player_pos.x, v_player_pos.y, 0.0>>, <<v_train_pos.x, v_train_pos.y, 0.0>>)
//2046008 - If we had to trigger the train early then make sure the player doesn't fail immediately for being too far away.
IF NOT b_player_got_close_enough_to_train
IF f_dist_from_train < 360000.0
b_player_got_close_enough_to_train = TRUE
ENDIF
ENDIF
IF f_dist_from_train > 490000.0
AND b_player_got_close_enough_to_train
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_CHASE)
ENDIF
//Fail if the player just follows the train indefinitely.
IF VDIST2(v_train_pos, <<-448.7, 4089.8, 85.0>>) < 100.0
MISSION_FAILED(FAILED_MISSED_TRAIN)
ENDIF
ENDIF
ELSE
IF DOES_BLIP_EXIST(blip_current_objective)
REMOVE_BLIP(blip_current_objective)
ENDIF
//Fail for abandoning the chopper.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
VECTOR v_chopper_pos = GET_ENTITY_COORDS(s_gold_choppers[0].veh)
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_gold_choppers[0].veh)) > 10000.0
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
ELSE
IF v_chopper_pos.z - v_player_pos.z > 10.0
IF NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh)
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
OR v_player_pos.z < 1.0
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3B_DROPHELP")
CLEAR_HELP()
ENDIF
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_FOCUS_ON_TRAIN")
START_AUDIO_SCENE("BS_2B_FOCUS_ON_TRAIN")
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_FOCUS_ON_TRAIN")
STOP_AUDIO_SCENE("BS_2B_FOCUS_ON_TRAIN")
ENDIF
ENDIF
//Carry over the cleanup of Lester's anims
IF NOT IS_PED_INJURED(s_lester.ped)
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
IF e_rocket_anim_state != ROCKET_ANIM_PUT_LAUNCHER_AWAY
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_PUT_LAUNCHER_AWAY)
ENDIF
ENDIF
UPDATE_LESTER_ROCKET_ANIMS()
ENDIF
//Gold container collision audio.
IF DOES_ENTITY_EXIST(obj_gold_containers[0])
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_COLLISIONS")
IF HAS_SOUND_FINISHED(i_gold_container_sound_id)
PLAY_SOUND_FROM_ENTITY(i_gold_container_sound_id, "Gold_Cage_Collisions", obj_gold_containers[0], "BIG_SCORE_3B_SOUNDS")
ENDIF
ENDIF
ENDIF
IF HAS_TROLLEY_ROPE_ATTACHMENT_BEEN_BROKEN(i_rope_detach_timer, 0)
IF DOES_ROPE_EXIST(s_heli_ropes_new[0].rope)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[0].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[1].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[2].rope, s_gold_choppers[0].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[3].rope, s_gold_choppers[0].veh)
DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
s_heli_ropes_new[0].b_is_attached = FALSE
s_heli_ropes_new[1].b_is_attached = FALSE
s_heli_ropes_new[2].b_is_attached = FALSE
s_heli_ropes_new[3].b_is_attached = FALSE
ENDIF
MISSION_FAILED(FAILED_TROLLEY_DETACHED)
ENDIF
DISPLAY_TAKE()
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
KILL_FACE_TO_FACE_CONVERSATION()
REMOVE_OBJECT(obj_lesters_rpg, TRUE)
REMOVE_ANIM_DICT(str_anim_rocket_reload)
REMOVE_ANIM_DICT(str_anim_rocket_signal)
REMOVE_ANIM_DICT(str_anim_rockets)
STOP_AUDIO_SCENES()
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(FALSE, FH2B_GOLD_DROP_TIME)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_DROP_GOLD_ON_TRAIN_CUTSCENE
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_LAND_AT_AIRFIELD)
ENDIF
ENDPROC
PROC DROP_GOLD_ON_TRAIN_CUTSCENE()
INT i = 0
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2720.3782, 3131.4307, 42.5514>>)
//Need to load the scene first in this case, otherwise some physics don't work correctly
IF SETUP_REQ_PLAYER_AS_TREVOR()
AND SETUP_GOLD_CHOPPERS(<<2720.3782, 3131.4307, 72.1530>>, 334.9478, <<2786.2661, 3303.3547, 85.3582>>, 347.3535)
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, TRUE)
LOAD_SCENE(<<2169.7993, 2490.4705, 79.5050>>)
WAIT(1000)
i_current_event = 99
ENDIF
ELSE
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
IF SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
AND SETUP_LESTER_IN_CHOPPER()
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
//AND SETUP_SUPPORT_ROPES_FOR_PLAYER_CHOPPER()
AND SETUP_REQ_GOLD_TRAIN()
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_HELI_TURBULENCE_SCALAR(s_gold_choppers[0].veh, 1.0)
SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(s_gold_choppers[0].veh, 1.0)
IF NOT b_crew_driver_set_to_die
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
SETUP_DRIVER_OUTFIT()
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 140000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
ENDIF
ELSE
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
ENDIF
REPEAT COUNT_OF(s_gold_choppers) i
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[i].veh)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[i].veh, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[i].veh)
IF IS_SCREEN_FADED_OUT()
FREEZE_ENTITY_POSITION(s_gold_choppers[i].veh, FALSE)
ENDIF
ENDIF
ENDREPEAT
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
SET_RANDOM_TRAINS(FALSE)
SETUP_TREVOR_OUTFIT()
IF NOT IS_ENTITY_DEAD(veh_gold_train)
SET_MISSION_TRAIN_COORDS(veh_gold_train, <<2795.0928, 3279.0688, 45.8408>>)
SET_TRAIN_CRUISE_SPEED(veh_gold_train, 15.0)
SET_TRAIN_SPEED(veh_gold_train, 15.0)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
i_current_take = i_max_take_considering_crew
i_displayed_take = i_current_take
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ENDIF
ELSE
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
REQUEST_MODEL(model_gold_chopper)
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_GOLD, str_carrec)
IF LOAD_STREAM("Gold_Drop_Train", "BIG_SCORE_3B_SOUNDS")
AND HAS_MODEL_LOADED(model_gold_chopper)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN_HELI, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN_GOLD, str_carrec)
//Buddy heli just flies off
//IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
//AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
// TASK_HELI_MISSION(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh, NULL, NULL, <<2109.1042, 4802.0615, 40.1387>>, MISSION_LAND_AND_WAIT, 30.0, 2.0, 193.5127,
// 120, 80)
//ENDIF
//Create two helper vehicles that'll play a recording of a helicopter hovering above a train.
veh_train_hover_helpers[0] = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 45.4778>>, 324.5322)
SET_ENTITY_COLLISION(veh_train_hover_helpers[0], FALSE)
SET_ENTITY_VISIBLE(veh_train_hover_helpers[0], FALSE)
START_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[0], CARREC_HOVER_TRAIN, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[0], 8000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_train_hover_helpers[0], FALSE)
veh_train_hover_helpers[1] = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 55.4778>>, 324.5322)
SET_ENTITY_COLLISION(veh_train_hover_helpers[1], FALSE)
SET_ENTITY_VISIBLE(veh_train_hover_helpers[1], FALSE)
START_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[1], CARREC_HOVER_TRAIN_HELI, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[1], 8000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_train_hover_helpers[1], FALSE)
veh_train_hover_helpers[2] = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 50.4778>>, 324.5322)
SET_ENTITY_COLLISION(veh_train_hover_helpers[2], FALSE)
SET_ENTITY_VISIBLE(veh_train_hover_helpers[2], FALSE)
START_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[2], CARREC_HOVER_TRAIN_GOLD, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[2], 0.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_train_hover_helpers[2], FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
//Set the player's heli to copy the offset of the helper heli from the train it's hovering over.
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
AND NOT IS_ENTITY_DEAD(veh_gold_train)
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[0])
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[1])
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[2])
VEHICLE_INDEX veh_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
VECTOR v_helper_heli_rotation = GET_ENTITY_ROTATION(veh_train_hover_helpers[1])
VECTOR v_helper_gold_rotation = GET_ENTITY_ROTATION(veh_train_hover_helpers[2])
FLOAT f_helper_train_heading = GET_ENTITY_HEADING(veh_train_hover_helpers[0])
FLOAT f_heading_diff = v_helper_heli_rotation.z - f_helper_train_heading
FLOAT f_gold_heading_diff = v_helper_gold_rotation.z - f_helper_train_heading
VECTOR v_heli_offset_from_helper_train = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_hover_helpers[0], GET_ENTITY_COORDS(veh_train_hover_helpers[1]))
VECTOR v_gold_offset_from_helper_train = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_hover_helpers[0], GET_ENTITY_COORDS(veh_train_hover_helpers[2]))
SET_ENTITY_COORDS_NO_OFFSET(s_gold_choppers[0].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_carriage_1, v_heli_offset_from_helper_train))
SET_ENTITY_ROTATION(s_gold_choppers[0].veh, <<v_helper_heli_rotation.x, v_helper_heli_rotation.y, f_heading_diff + GET_ENTITY_HEADING(veh_carriage_1)>>)
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_carriage_1, v_gold_offset_from_helper_train))
SET_ENTITY_ROTATION(obj_gold_containers[0], <<v_helper_gold_rotation.x, v_helper_gold_rotation.y, f_gold_heading_diff + GET_ENTITY_HEADING(veh_carriage_1)>>)
ENDIF
PLAY_STREAM_FROM_VEHICLE(s_gold_choppers[0].veh)
//If the buddy gold wasn't dropped yet then just do it now.
IF NOT b_crew_driver_set_to_die
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
IF DOES_ROPE_EXIST(s_heli_ropes_new[4].rope)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, s_gold_choppers[1].veh)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, s_gold_choppers[1].veh)
DELETE_ROPE(s_heli_ropes_new[4].rope)
DELETE_ROPE(s_heli_ropes_new[5].rope)
DELETE_ROPE(s_heli_ropes_new[6].rope)
DELETE_ROPE(s_heli_ropes_new[7].rope)
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[1].veh, NULL, 0.0)
s_heli_ropes_new[4].b_is_attached = FALSE
s_heli_ropes_new[5].b_is_attached = FALSE
s_heli_ropes_new[6].b_is_attached = FALSE
s_heli_ropes_new[7].b_is_attached = FALSE
ENDIF
DETACH_ENTITY(obj_gold_containers[1])
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[1], veh_carriage_1, 0, <<0.0, -2.0, 0.55>>, <<0.0, 0.0, 2.7>>, FALSE, FALSE, TRUE)
ENDIF
ENDIF
VEHICLE_INDEX veh_carriage_cam = veh_gold_train
IF NOT IS_ENTITY_DEAD(veh_carriage_cam)
DESTROY_ALL_CAMS()
cam_main = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
ATTACH_CAM_TO_ENTITY(cam_main, veh_carriage_cam, <<-2.6097, -5.1243, 1.6098>>)
POINT_CAM_AT_ENTITY(cam_main, veh_carriage_cam, <<-2.0230, -8.0717, 1.5609>>)
SET_CAM_FOV(cam_main, 42.0)
SHAKE_CAM(cam_main, "ROAD_VIBRATION_SHAKE", 1.0)
ENDIF
ENDIF
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i < 4
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
ROPE_SET_UPDATE_ORDER(s_heli_ropes_new[i].rope, 1)
ENDIF
ENDIF
ENDREPEAT
IF b_crew_driver_set_to_die
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
ENDIF
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SETTIMERB(0)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2B_DROPPED_RESTART")
SET_AMBIENT_ZONE_LIST_STATE("AZL_BIG_SCORE_2B_WINDFARM_TURBINES", TRUE, TRUE)
ELSE
TRIGGER_MUSIC_EVENT("FH2B_GOLD_DROPPED")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_DROP_GOLD_CUTSCENE")
START_AUDIO_SCENE("BS_2B_DROP_GOLD_CUTSCENE")
ENDIF
DO_FADE_IN_WITH_WAIT()
IF NOT b_replay_event_started
REPLAY_START_EVENT()
b_replay_event_started = TRUE
ENDIF
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
VEHICLE_INDEX veh_carriage_1, veh_carriage_cam
//Update the heli's position every frame: Set the heli to copy the offset of the helper heli from the train it's hovering over.
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
AND NOT IS_ENTITY_DEAD(veh_gold_train)
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[0])
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[1])
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[2])
//TEMP: used to make it easier to grab cam offsets
//SET_TRAIN_CRUISE_SPEED(veh_gold_train, 0.0)
//SET_TRAIN_SPEED(veh_gold_train, 0.0)
veh_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
veh_carriage_cam = veh_gold_train
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
VECTOR v_helper_heli_rotation = GET_ENTITY_ROTATION(veh_train_hover_helpers[1])
VECTOR v_helper_gold_rotation = GET_ENTITY_ROTATION(veh_train_hover_helpers[2])
FLOAT f_helper_train_heading = GET_ENTITY_HEADING(veh_train_hover_helpers[0])
FLOAT f_heading_diff = v_helper_heli_rotation.z - f_helper_train_heading
FLOAT f_gold_heading_diff = v_helper_gold_rotation.z - f_helper_train_heading
VECTOR v_heli_offset_from_helper_train = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_hover_helpers[0], GET_ENTITY_COORDS(veh_train_hover_helpers[1]))
VECTOR v_gold_offset_from_helper_train = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_hover_helpers[0], GET_ENTITY_COORDS(veh_train_hover_helpers[2]))
SET_ENTITY_COORDS_NO_OFFSET(s_gold_choppers[0].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_carriage_1, v_heli_offset_from_helper_train))
SET_ENTITY_ROTATION(s_gold_choppers[0].veh, <<v_helper_heli_rotation.x, v_helper_heli_rotation.y, f_heading_diff + GET_ENTITY_HEADING(veh_carriage_1)>>)
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_carriage_1, v_gold_offset_from_helper_train))
SET_ENTITY_ROTATION(obj_gold_containers[0], <<v_helper_gold_rotation.x, v_helper_gold_rotation.y, f_gold_heading_diff + GET_ENTITY_HEADING(veh_carriage_1)>>)
ENDIF
ENDIF
SWITCH i_current_event
CASE 0 //Start the cam interp
IF TIMERB() > 150
IF NOT IS_ENTITY_DEAD(veh_carriage_cam)
cam_interp = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
ATTACH_CAM_TO_ENTITY(cam_interp, veh_carriage_cam, <<-2.6100, -5.1185, 1.6098>>)
POINT_CAM_AT_ENTITY(cam_interp, veh_carriage_cam, <<-1.9070, -8.0153, 1.2721>>)
SET_CAM_FOV(cam_interp, 42.0)
SHAKE_CAM(cam_interp, "ROAD_VIBRATION_SHAKE", 1.0)
SET_CAM_ACTIVE_WITH_INTERP(cam_interp, cam_main, 1700, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
BREAK
CASE 1 //Drop the gold.
IF TIMERB() > 350
IF NOT IS_ENTITY_DEAD(veh_gold_train)
AND NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i < 4
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i].rope, 0)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[i].rope, s_gold_choppers[0].veh)
ENDIF
ENDIF
ENDREPEAT
//DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
//FREEZE_ENTITY_POSITION(obj_gold_containers[0], FALSE)
//SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(veh_gold_train) * 1.5)
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
BREAK
CASE 2
IF TIMERB() > 300
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i < 4
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
AND s_heli_ropes_new[i].b_is_attached
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[i].rope, obj_gold_containers[0])
s_heli_ropes_new[i].b_is_attached = FALSE
IF IS_ENTITY_ATTACHED(obj_gold_containers[0])
DETACH_ENTITY(obj_gold_containers[0])
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
IF TIMERB() > 600
SHAKE_CAM(cam_main, "SMALL_EXPLOSION_SHAKE", 0.05)
SHAKE_CAM(cam_interp, "SMALL_EXPLOSION_SHAKE", 0.05)
IF NOT HAS_SOUND_FINISHED(i_gold_container_sound_id)
STOP_SOUND(i_gold_container_sound_id)
ENDIF
i_current_event++
ENDIF
BREAK
CASE 3
IF TIMERB() > 1000
SHAKE_CAM(cam_main, "ROAD_VIBRATION_SHAKE", 1.0)
SHAKE_CAM(cam_interp, "ROAD_VIBRATION_SHAKE", 1.0)
i_current_event++
ENDIF
BREAK
CASE 4
IF TIMERB() > 3000
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
CLEAR_HELP()
//Stop any footage recording.
IF b_replay_event_started
REPLAY_STOP_EVENT()
b_replay_event_started = FALSE
ENDIF
REPEAT COUNT_OF(s_heli_ropes_new) i
IF s_heli_ropes_new[i].rope != NULL
DELETE_ROPE(s_heli_ropes_new[i].rope)
s_heli_ropes_new[i].rope = NULL
ENDIF
ENDREPEAT
REMOVE_VEHICLE(veh_train_hover_helpers[0], TRUE)
REMOVE_VEHICLE(veh_train_hover_helpers[1], TRUE)
REMOVE_VEHICLE(veh_train_hover_helpers[2], TRUE)
REMOVE_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_GOLD, str_carrec)
IF NOT IS_ENTITY_DEAD(veh_gold_train)
VEHICLE_INDEX veh_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
FREEZE_ENTITY_POSITION(obj_gold_containers[0], FALSE)
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[0], veh_carriage_1, 0, <<0.0, 2.0, 0.55>>, <<0.0, 0.0, 0.0>>, FALSE, FALSE, TRUE)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_VEHICLE_FORWARD_SPEED(s_gold_choppers[0].veh, 15.0)
IF NOT IS_PED_INJURED(s_lester.ped)
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
STOP_SYNCHRONIZED_ENTITY_ANIM(s_lester.ped, NORMAL_BLEND_OUT, TRUE)
i_lester_rocket_sync_scene = -1
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
SET_PED_INTO_VEHICLE(s_lester.ped, s_gold_choppers[0].veh, VS_BACK_LEFT)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
IF GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh) < 151000.0
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 151000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
ENDIF
ENDIF
ENDIF
IF NOT HAS_SOUND_FINISHED(i_gold_container_sound_id)
STOP_SOUND(i_gold_container_sound_id)
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_DROP_GOLD_CUTSCENE")
STOP_AUDIO_SCENE("BS_2B_DROP_GOLD_CUTSCENE")
ENDIF
STOP_STREAM()
//Clean up the other pilot here if the bad driver was picked, they're no longer needed.
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
STOP_AUDIO_SCENES()
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_LAND_AT_AIRFIELD
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i < 4
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[i].rope, obj_gold_containers[0])
s_heli_ropes_new[i].b_is_attached = FALSE
ENDIF
ENDIF
ENDREPEAT
DETACH_ENTITY(obj_gold_containers[0])
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC LAND_AT_AIRFIELD()
INT i = 0
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
IF SETUP_REQ_PLAYER_AS_TREVOR()
AND SETUP_GOLD_CHOPPERS(<<2720.3782, 3131.4307, 72.1530>>, 334.9478, <<2786.2661, 3303.3547, 85.3582>>, 347.3535)
IF b_has_used_checkpoint
START_REPLAY_SETUP(<<2720.3782, 3131.4307, 42.5514>>, 0.0, FALSE)
i_current_event = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2720.3782, 3131.4307, 42.5514>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
i_current_event = 99
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, TRUE)
ENDIF
ENDIF
ELSE
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
IF SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
AND SETUP_LESTER_IN_CHOPPER()
AND SETUP_REQ_GOLD_TRAIN()
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF NOT b_crew_driver_set_to_die
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
SETUP_DRIVER_OUTFIT()
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 146000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
ENDIF
ELSE
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
ENDIF
REPEAT COUNT_OF(s_gold_choppers) i
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[i].veh)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[i].veh, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[i].veh)
IF IS_SCREEN_FADED_OUT()
FREEZE_ENTITY_POSITION(s_gold_choppers[i].veh, FALSE)
ENDIF
ENDIF
ENDREPEAT
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
SET_RANDOM_TRAINS(FALSE)
SETUP_TREVOR_OUTFIT()
IF NOT IS_ENTITY_DEAD(veh_gold_train)
SET_MISSION_TRAIN_COORDS(veh_gold_train, <<2755.4928, 3190.4688, 45.8408>>)
SET_TRAIN_CRUISE_SPEED(veh_gold_train, 15.0)
SET_TRAIN_SPEED(veh_gold_train, 15.0)
VEHICLE_INDEX veh_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[0], veh_carriage_1, 0, <<0.0, 2.0, 0.55>>, <<0.0, 0.0, 0.0>>, FALSE, FALSE, TRUE)
IF NOT b_crew_driver_set_to_die
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[1], veh_carriage_1, 0, <<0.0, 5.0, 0.55>>, <<0.0, 0.0, 0.0>>, FALSE, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
i_current_take = i_max_take_considering_crew
i_displayed_take = i_current_take
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ENDIF
ELSE
//Re-enable wanted level
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_MAX_WANTED_LEVEL(5)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2B_DROPPED_RESTART")
ENDIF
sbi_airfield[0] = ADD_SCENARIO_BLOCKING_AREA(<<1670.5116, 4589.3999, 30.0>>, <<1703.1768, 4620.1318, 127.7757>>)
sbi_airfield[1] = ADD_SCENARIO_BLOCKING_AREA(<<1774.1407, 4628.9160, 30.0>>, <<1817.5054, 4693.5049, 127.7757>>)
sbi_airfield[2] = ADD_SCENARIO_BLOCKING_AREA(<<1862.7349, 4663.5698, 30.0>>, <<2196.0427, 4909.0830, 127.7757>>)
SET_SCENARIO_GROUP_ENABLED("Grapeseed_Planes", FALSE)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FLY_BACK, "LAND_AT_AIRFIELD", TRUE)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_GET_TO_AIRSTRIP")
START_AUDIO_SCENE("BS_2B_GET_TO_AIRSTRIP")
ENDIF
IF NOT IS_SCREEN_FADED_IN()
SET_AMBIENT_ZONE_LIST_STATE("AZL_BIG_SCORE_2B_WINDFARM_TURBINES", TRUE, TRUE)
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
SET_VEHICLE_FORWARD_SPEED(s_gold_choppers[0].veh, 15.0)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_HEIST_CREW_END_SCREEN_STATUSES()
INCREMENT_ALL_CREW_MEMBER_STATS_DURING_HEIST(HEIST_FINALE, TRUE)
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE) //This section has streaming issues on next-gen, so block the vehicle gens.
s_michael.i_event = 0
s_crew[CREW_DRIVER_ID].i_event = 0
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(s_locates_data)
#ENDIF
//Play Trevor's line for dropping the gold immediately, different variations based on if the driver died.
IF NOT b_has_text_label_triggered[BS2B_PACK2]
IF NOT b_crew_driver_set_to_die
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PACK2", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_PACK2] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PACK2B", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
b_has_text_label_triggered[BS2B_PACK2] = TRUE
ENDIF
ENDIF
ENDIF
//Play "go to airfield" line first.
IF NOT b_has_text_label_triggered[BS2B_AIR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_AIR", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_AIR] = TRUE
ENDIF
ENDIF
ELSE
IF IS_PLAYER_AT_LOCATION_WITH_BUDDIES_IN_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, s_lester.ped, NULL, NULL, s_gold_choppers[0].veh,
"F3B_LANDFIELD", "F3B_LEFTLEST", "", "", "F3B_LEFTLEST", "F3B_GETINHELI", "F3B_GETBACKHELI", FALSE, TRUE)
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
VECTOR v_chopper_pos = GET_ENTITY_COORDS(s_gold_choppers[0].veh)
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
IF IS_ENTITY_IN_ANGLED_AREA(s_gold_choppers[0].veh, <<2164.553467,4824.145020,39.388706>>, <<2081.562988,4784.206055,51.811592>>, 24.250000)
AND NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh)
AND v_chopper_pos.z < 42.0
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
//Dialogue.
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), v_airfield_pos) > 2500.0
IF NOT b_has_text_label_triggered[BS2B_SEEAIR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT b_has_text_label_triggered[BS2B_DIDIT]
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DIDIT", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DIDIT] = TRUE
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_WOO]
IF b_crew_driver_set_to_die
b_has_text_label_triggered[BS2B_WOO] = TRUE
ELSE
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_WOO")
b_has_text_label_triggered[BS2B_WOO] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_DRIVE]
IF b_crew_driver_set_to_die
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DRIVE1", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DRIVE] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DRIVE2", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_DRIVE] = TRUE
ENDIF
ENDIF
ELIF NOT b_has_text_label_triggered[BS2B_TALK]
//Michael and Franklin don't exist, so add null peds for dialogue.
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TALK", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_TALK] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT b_has_text_label_triggered[BS2B_SEEAIR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_SEEAIR", CONV_PRIORITY_MEDIUM)
b_has_text_label_triggered[BS2B_SEEAIR] = TRUE
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
IF b_has_text_label_triggered[BS2B_DIDIT]
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_gold_choppers[0].veh)) > 10000.0
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
ELSE
IF v_chopper_pos.z - v_player_pos.z > 6.0
IF NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh)
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
OR v_player_pos.z < 1.0
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
/*IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_airfield_pos) < 40000.0
IF NOT b_crew_driver_set_to_die
REQUEST_CUTSCENE("bs_2b_ext_alt1a")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_ext_alt1a")
ELSE
REQUEST_CUTSCENE("bs_2b_ext_alt2")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_ext_alt2")
ENDIF
ELIF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_airfield_pos) > 62500.0
IF IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
ENDIF
ENDIF*/
SWITCH s_crew[CREW_DRIVER_ID].i_event
CASE 0
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
//SET_HELI_BLADES_SPEED(s_gold_choppers[1].veh, 0.0)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, FALSE, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_TURN_PED_TO_FACE_COORD(NULL, <<2151.3, 4801.1, 42.6>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(s_crew[CREW_DRIVER_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
TASK_LOOK_AT_ENTITY(s_crew[CREW_DRIVER_ID].ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(s_gold_choppers[1].veh, TRUE)
s_crew[CREW_DRIVER_ID].i_event++
ELSE
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 1.0)
ENDIF
ENDIF
BREAK
ENDSWITCH
//Delete the train once the player is far away from it.
IF DOES_ENTITY_EXIST(veh_gold_train)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_gold_train, FALSE)) > 90000.0
REPEAT COUNT_OF(obj_gold_trolleys) i
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(obj_gold_containers) i
REMOVE_OBJECT(obj_gold_containers[i], TRUE)
ENDREPEAT
IF DOES_ENTITY_EXIST(veh_gold_train)
DELETE_MISSION_TRAIN(veh_gold_train)
ENDIF
ENDIF
ENDIF
//The crew turn up in their car as the player comes in to land.
SWITCH s_michael.i_event
CASE 0 //Create the assets.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), v_airfield_pos) < 40000.0
//If the train wasn't deleted already it should be safe to do it now.
IF DOES_ENTITY_EXIST(veh_gold_train)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_gold_train, FALSE)) > 2500.0
IF NOT IS_ENTITY_ON_SCREEN(veh_gold_train)
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_gold_train, FALSE)) > 40000.0
REPEAT COUNT_OF(obj_gold_trolleys) i
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(obj_gold_containers) i
REMOVE_OBJECT(obj_gold_containers[i], TRUE)
ENDREPEAT
IF DOES_ENTITY_EXIST(veh_gold_train)
DELETE_MISSION_TRAIN(veh_gold_train)
ENDIF
ENDIF
ENDIF
ENDIF
IF SETUP_REQ_FRANKLIN(<<2132.6914, 4776.3657, 39.9703>>, 98.5572)
AND SETUP_REQ_MICHAEL(<<2135.0344, 4778.0078, 39.9703>>, 63.7681)
AND SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(<<2137.6624, 4778.7617, 39.9702>>, 288.5962)
AND SETUP_REQ_FINAL_CAR(<<2136.8210, 4775.6343, 39.9703>>, 291.3345)
IF IS_VEHICLE_DRIVEABLE(veh_final_car)
//Remove balaclavas and gloves in advance.
SETUP_FRANKLIN_OUTFIT(FALSE, FALSE)
SETUP_MICHAEL_OUTFIT(FALSE)
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car)
ENDIF
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], veh_final_car, VS_FRONT_RIGHT)
ENDIF
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_PED_INTO_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, veh_final_car, VS_BACK_LEFT)
ENDIF
SET_ENTITY_COORDS(veh_final_car, <<2136.8210, 4775.6343, 19.9703>>)
FREEZE_ENTITY_POSITION(veh_final_car, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(veh_final_car, TRUE)
//SET_ENTITY_LOAD_COLLISION_FLAG(veh_final_car, TRUE)
s_michael.i_event++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Place the car into position based on where the player is looking.
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
AND IS_VEHICLE_DRIVEABLE(veh_final_car)
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), v_airfield_pos) < 12500.0
FREEZE_ENTITY_POSITION(veh_final_car, FALSE)
IF NOT IS_SPHERE_VISIBLE(<<2089.0110, 4705.9326, 40.1857>>, 5.0)
CLEAR_AREA(<<2089.0110, 4705.9326, 40.1857>>, 5.0, TRUE)
SET_ENTITY_HEADING(veh_final_car, 313.1474)
SET_ENTITY_COORDS(veh_final_car, <<2089.0110, 4705.9326, 40.1857>>)
ELSE
CLEAR_AREA(<<2195.9761, 4747.8091, 39.8789>>, 5.0, TRUE)
SET_ENTITY_HEADING(veh_final_car, 74.5414)
SET_ENTITY_COORDS(veh_final_car, <<2195.9761, 4747.8091, 39.8789>>)
ENDIF
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(veh_final_car, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(veh_final_car, TRUE)
s_michael.i_event++
ENDIF
ENDIF
BREAK
CASE 2 //Handle tasks
IF IS_VEHICLE_DRIVEABLE(veh_final_car)
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
IF IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car)
AND IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], veh_final_car)
AND IS_PED_SITTING_IN_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, veh_final_car)
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK
TASK_VEHICLE_DRIVE_TO_COORD(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car, <<2125.8513, 4794.7520, 40.1405>>, 40.0, DRIVINGSTYLE_NORMAL,
GET_ENTITY_MODEL(veh_final_car), DRIVINGMODE_AVOIDCARS, 5.0, 8.0)
ENDIF
ELSE
IF NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car)
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car)
ENDIF
ENDIF
IF NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], veh_final_car)
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], veh_final_car, DEFAULT, VS_FRONT_RIGHT)
ENDIF
ENDIF
IF NOT IS_PED_IN_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, veh_final_car)
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, veh_final_car, DEFAULT, VS_BACK_LEFT)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF DOES_ENTITY_EXIST(veh_final_car)
IF NOT IS_VEHICLE_DRIVEABLE(veh_final_car)
MISSION_FAILED(FAILED_DESTROYED_END_CAR)
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
REPEAT COUNT_OF(obj_gold_trolleys) i
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(obj_gold_containers) i
REMOVE_OBJECT(obj_gold_containers[i], TRUE)
ENDREPEAT
IF DOES_ENTITY_EXIST(veh_gold_train)
DELETE_MISSION_TRAIN(veh_gold_train)
ENDIF
i_cutscene_request_delay_timer = GET_GAME_TIMER()
REPLAY_RECORD_BACK_FOR_TIME(10.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_END_CUTSCENE
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
ENDIF
SET_ENTITY_COORDS(s_gold_choppers[0].veh, v_airfield_pos)
ENDIF
ENDIF
ENDPROC
PROC DO_END_CUTSCENE()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
DISABLE_VEH_CONTROLS_THIS_FRAME()
IF e_section_stage = SECTION_STAGE_SETUP
IF b_is_jumping_directly_to_stage
IF i_current_event != 99
IF SETUP_REQ_PLAYER_AS_TREVOR()
AND SETUP_GOLD_CHOPPERS(<<2135.937988,4807.837402,41.783092>>, 119.467896, <<2129.158447,4817.372559,41.710297>>, 119.467896)
IF b_has_used_checkpoint
START_REPLAY_SETUP(<<2124.3782, 4801.4307, 41.5514>>, 0.0, FALSE)
i_current_event = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2124.3782, 4801.4307, 41.5514>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
i_current_event = 99
ENDIF
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, TRUE)
ENDIF
ENDIF
ELSE
IF SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
AND SETUP_LESTER_IN_CHOPPER()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
IF NOT IS_PED_INJURED(s_lester.ped)
SET_PED_INTO_VEHICLE(s_lester.ped, s_gold_choppers[0].veh, VS_BACK_LEFT)
ENDIF
ENDIF
SETUP_TREVOR_OUTFIT()
SETUP_DRIVER_OUTFIT()
IF NOT b_crew_driver_set_to_die
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
ENDIF
ENDIF
ELSE
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
ENDIF
i_current_take = i_max_take_considering_crew
i_displayed_take = i_current_take
b_is_jumping_directly_to_stage = FALSE
ENDIF
ENDIF
ELSE
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ENDIF
//2002346 - Once the player is locked into the cutscene request sequence then make the crew ped invincible so the mission doesn't fail.
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
SET_ENTITY_INVINCIBLE(s_crew[CREW_DRIVER_ID].ped, TRUE)
ENDIF
IF SETUP_REQ_FRANKLIN(<<2146.3652, 4770.1538, 40.4926>>, 17.2965)
AND SETUP_REQ_MICHAEL(<<2148.3652, 4770.1538, 40.4926>>, 17.2965)
AND SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(<<2146.3652, 4772.1538, 40.4926>>, 17.2965)
AND SETUP_REQ_FINAL_CAR(<<2141.2652, 4762.1538, 41.4926>>, 101.2965)
SETUP_MICHAEL_OUTFIT(FALSE)
SETUP_FRANKLIN_OUTFIT(FALSE, FALSE)
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, FALSE)
SETUP_DRIVER_OUTFIT()
//1902301 - Delay the cutscene request to prevent streaming issues.
IF GET_GAME_TIMER() - i_cutscene_request_delay_timer > 2000
IF NOT b_crew_driver_set_to_die
REQUEST_CUTSCENE("bs_2b_ext_alt1a")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_ext_alt1a")
ELSE
REQUEST_CUTSCENE("bs_2b_ext_alt2")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_ext_alt2")
ENDIF
IF HAS_CUTSCENE_LOADED()
IF NOT IS_PED_INJURED(s_lester.ped)
REGISTER_ENTITY_FOR_CUTSCENE(s_lester.ped, "Lester", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
REGISTER_ENTITY_FOR_CUTSCENE(s_gold_choppers[0].veh, "Main_heli", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(s_gold_choppers[1].veh)
REGISTER_ENTITY_FOR_CUTSCENE(s_gold_choppers[1].veh, "Background_heli", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ELSE
//REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Background_heli", CU_DONT_ANIMATE_ENTITY, model_gold_chopper)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
REGISTER_ENTITY_FOR_CUTSCENE(GET_PED_INDEX(CHAR_MICHAEL), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
REGISTER_ENTITY_FOR_CUTSCENE(GET_PED_INDEX(CHAR_FRANKLIN), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
REGISTER_ENTITY_FOR_CUTSCENE(GET_PED_INDEX(CHAR_TREVOR), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_ENTITY_DEAD(veh_final_car)
SET_VEHICLE_ENGINE_HEALTH(veh_final_car, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(veh_final_car, 1000.0)
SET_VEHICLE_RADIO_ENABLED(veh_final_car, FALSE)
REGISTER_ENTITY_FOR_CUTSCENE(veh_final_car, "BS_2B_Tailgater", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_NONE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
TRIGGER_MUSIC_EVENT("FH2B_MISSION_END")
b_mission_passed_screen_displayed = FALSE
b_players_car_exit_state_hit = FALSE
b_turned_on_heli_engine = FALSE
i_current_event = 0
b_skipped_mocap = FALSE
bHasFirstPersonFlashTriggered = FALSE
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ELSE
//If all the assets haven't loaded yet then delay when the cutscene is requested to prevent a stack of asset requests.
i_cutscene_request_delay_timer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
REQUEST_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
SWITCH i_current_event
CASE 0
IF IS_CUTSCENE_PLAYING()
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
SET_VEHICLE_ENGINE_HEALTH(s_gold_choppers[0].veh, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[0].veh, 1000.0)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, FALSE, FALSE)
SET_VEHICLE_RADIO_ENABLED(s_gold_choppers[0].veh, FALSE)
SET_VEHICLE_FIXED(s_gold_choppers[0].veh)
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, TRUE, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, FALSE, FALSE)
SET_VEHICLE_RADIO_ENABLED(s_gold_choppers[1].veh, FALSE)
ENDIF
//Remove the headsets for this scene.
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
ENDIF
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
CLEAR_PED_PROP(s_crew[CREW_DRIVER_ID].ped, ANCHOR_EARS)
ENDIF
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
CLEAR_PED_PROP(s_crew[CREW_MICHAEL_ID].ped, ANCHOR_EARS)
ENDIF
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_NONE, FALSE)
CLEAR_AREA_OF_PEDS(<<2124.3782, 4801.4307, 41.5514>>, 200.0)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
STOP_AUDIO_SCENES()
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
//Michael's crew member is going to be used as an invisible pilot so we can turn the engine on during the cutscene.
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, <<2124.0, 4788.2, 40.7>>)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SET_ENTITY_VISIBLE(s_crew[CREW_MICHAEL_ID].ped, FALSE)
STOP_PED_SPEAKING(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SET_ENTITY_INVINCIBLE(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF
DO_FADE_IN_WITH_WAIT()
i_current_event++
ELSE
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(GET_PED_INDEX(CHAR_TREVOR))
ENDIF
ENDIF
BREAK
CASE 1
IF WAS_CUTSCENE_SKIPPED()
AND NOT b_skipped_mocap
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
e_section_stage = SECTION_STAGE_SKIP
ENDIF
IF NOT b_turned_on_heli_engine
IF IS_CUTSCENE_PLAYING()
IF (NOT b_crew_driver_set_to_die AND GET_CUTSCENE_TIME() > 48000)
OR (b_crew_driver_set_to_die AND GET_CUTSCENE_TIME() > 54500)
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
SET_PED_INTO_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, s_gold_choppers[0].veh, VS_DRIVER)
SET_PED_KEEP_TASK(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
ENDIF
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, FALSE)
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, TRUE, FALSE)
ENDIF
b_turned_on_heli_engine = TRUE
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(veh_final_car)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("BS_2B_Tailgater")
SET_VEHICLE_DOORS_SHUT(veh_final_car, TRUE)
SET_ENTITY_HEADING(veh_final_car, 117.0281)
SET_ENTITY_COORDS(veh_final_car, <<2114.8843, 4800.6284, 40.1790>>)
SET_VEH_RADIO_STATION(veh_final_car, "OFF")
SET_VEHICLE_RADIO_ENABLED(veh_final_car, FALSE)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CAR_LEAVE, str_carrec)
START_PLAYBACK_RECORDED_VEHICLE(veh_final_car, CARREC_CAR_LEAVE, str_carrec, FALSE)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_final_car, 1000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_final_car, FALSE)
SET_PLAYBACK_SPEED(veh_final_car, 1.0)
ENDIF
b_players_car_exit_state_hit = TRUE
ELIF NOT b_players_car_exit_state_hit
//SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(veh_final_car)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
IF NOT IS_ENTITY_DEAD(veh_final_car)
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), veh_final_car)
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_FRANKLIN))
//TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(PLAYER_PED_ID(), veh_final_car, <<1925.3854, 4707.9507, 40.1959>>, 20.0, DRIVINGMODE_PLOUGHTHROUGH | DF_UseSwitchedOffNodes, 5.0)
//SET_VEHICLE_FORWARD_SPEED(veh_final_car, 20.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(GET_PED_INDEX(CHAR_FRANKLIN), TRUE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Main_heli")
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_LEAVE, str_carrec)
SET_VEHICLE_DOORS_SHUT(s_gold_choppers[0].veh)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, FALSE)
//SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
//SET_ENTITY_VELOCITY(s_gold_choppers[0].veh, <<0.0, 0.0, 10.0>>)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HELI_LEAVE, str_carrec, FALSE)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh, FALSE)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.9)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), s_gold_choppers[0].veh, VS_DRIVER)
//TASK_HELI_MISSION(GET_PED_INDEX(CHAR_TREVOR), s_gold_choppers[0].veh, NULL, NULL, <<386.2, 1471.8, 368.3>>, MISSION_GOTO, 50.0, 10.0, -20.0, 10, 8)
SET_PED_KEEP_TASK(GET_PED_INDEX(CHAR_TREVOR), TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(GET_PED_INDEX(CHAR_TREVOR), TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
//The crew members are deleted during the cutscene, so use Michael as the pilot for the second chopper.
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_MICHAEL), s_gold_choppers[1].veh, VS_DRIVER)
ELSE
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_MICHAEL), s_gold_choppers[0].veh, VS_FRONT_RIGHT)
ENDIF
SET_PED_KEEP_TASK(GET_PED_INDEX(CHAR_MICHAEL), TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(GET_PED_INDEX(CHAR_MICHAEL), TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(s_lester.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lester")
SET_PED_INTO_VEHICLE(s_lester.ped, s_gold_choppers[0].veh, VS_BACK_LEFT)
SET_PED_KEEP_TASK(s_lester.ped, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_lester.ped, TRUE)
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Background_heli")
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_LEAVE_2, str_carrec)
SET_VEHICLE_DOORS_SHUT(s_gold_choppers[1].veh)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[1].veh)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_LEAVE_2, str_carrec, FALSE)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 1000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh, FALSE)
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 1.0)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
OR b_skipped_mocap
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<2155.057373,4837.334961,43.127262>>,<<5.583202,0.000000,140.558350>>,47.291622, TRUE)
SET_CAM_PARAMS(cam_main, <<2157.028809,4838.927734,52.013939>>,<<7.445146,-0.000000,134.473083>>,47.291622, 8000, GRAPH_TYPE_ACCEL, GRAPH_TYPE_ACCEL)
SHAKE_CAM(cam_main, "HAND_SHAKE", 0.05)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
SETTIMERB(0)
i_current_event = 50
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
//i_current_event = 50
//e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
CASE 50
IF TIMERB() > 5000
OR IS_SCREEN_FADED_OUT()
IF NOT IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(3000)
ENDIF
SETTIMERB(0)
i_current_event++
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
IF NOT IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
ENDIF
BREAK
CASE 51 //Once the screen has faded out trigger the mission passed screen.
IF TIMERB() > 3000
OR IS_SCREEN_FADED_OUT()
IF NOT IS_CUTSCENE_ACTIVE()
INT i
REPEAT COUNT_OF(s_heli_ropes_new) i
IF s_heli_ropes_new[i].rope != NULL
DELETE_ROPE(s_heli_ropes_new[i].rope)
s_heli_ropes_new[i].rope = NULL
ENDIF
ENDREPEAT
IF GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) != GET_ENTITY_MODEL(PLAYER_PED_ID())
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ENDIF
REMOVE_PED(s_lester.ped, TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
REMOVE_VEHICLE(s_gold_choppers[0].veh, TRUE) //Remove the chopper after the cutscene has ended, this fixes B*730413.
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
DESTROY_ALL_CAMS()
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_END_SCREEN_TAKE()
TRIGGER_MISSION_STATS_UI(TRUE, TRUE)
IF NOT IS_REPEAT_PLAY_ACTIVE()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
CLEAR_AREA(<<1339.5610, 642.0800, 79.4907>>, 100.0, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(veh_final_car)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), veh_final_car)
SET_VEHICLE_DOORS_SHUT(veh_final_car)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_final_car)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_final_car)
ENDIF
SET_ENTITY_HEADING(veh_final_car, 133.7396)
SET_ENTITY_COORDS(veh_final_car, <<1339.5610, 642.0800, 79.4907>>)
FREEZE_ENTITY_POSITION(veh_final_car, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
//NEW_LOAD_SCENE_START_SPHERE(<<1339.5610, 642.0800, 79.4907>>, 300.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
NEW_LOAD_SCENE_START(<<1324.267700,628.066162,85.775108>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-2.527736, 0.0, 133.285507>>), 300.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
BREAK
CASE 52 //Wait for the screen to display, then continue
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF g_bResultScreenDisplaying
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1
b_mission_passed_screen_displayed = TRUE
i_current_event++
ENDIF
BREAK
CASE 53 //Progress once the screen is gone.
IF NOT g_bResultScreenDisplaying
IF IS_REPEAT_PLAY_ACTIVE()
e_section_stage = SECTION_STAGE_CLEANUP
ELSE
IF (IS_NEW_LOAD_SCENE_ACTIVE() AND IS_NEW_LOAD_SCENE_LOADED())
OR TIMERB() > 15000
CLEAR_AREA(<<1339.5610, 642.0800, 79.4907>>, 50.0, TRUE)
IF NOT IS_ENTITY_DEAD(veh_final_car)
SET_VEHICLE_FIXED(veh_final_car)
FREEZE_ENTITY_POSITION(veh_final_car, FALSE)
SET_ENTITY_HEADING(veh_final_car, 133.7396)
SET_ENTITY_COORDS(veh_final_car, <<1339.5610, 642.0800, 79.4907>>)
SET_VEHICLE_ENGINE_ON(veh_final_car, TRUE, TRUE)
SET_VEHICLE_RADIO_ENABLED(veh_final_car, TRUE)
SET_VEH_RADIO_STATION(veh_final_car, "RADIO_03_HIPHOP_NEW")
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1324.220093,628.036438,87.027969>>,<<-2.527736,0.512502,133.285507>>,50.000000, TRUE)
SET_CAM_PARAMS(cam_main, <<1324.267700,628.066162,85.775108>>,<<-2.527736,0.512502,133.285507>>,50.000000, 4000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SHAKE_CAM(cam_main, "HAND_SHAKE", 0.05)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SETTIMERB(0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
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()
DISABLE_VEH_CONTROLS_THIS_FRAME()
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF NOT IS_ENTITY_DEAD(veh_final_car)
SET_VEHICLE_FORWARD_SPEED(veh_final_car, 15.0)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
DISABLE_VEH_CONTROLS_THIS_FRAME()
i_current_event++
ENDIF
ENDIF
ENDIF
BREAK
CASE 54 //Finish final shot.
IF NOT IS_ENTITY_DEAD(veh_final_car)
SET_VEHICLE_FORWARD_SPEED(veh_final_car, 15.0)
ENDIF
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
//Do different transitions back to gameplay depending on cam view, as the default transition looks bad for first-person.
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
OR GET_FOLLOW_VEHICLE_CAM_ZOOM_LEVEL() = VEHICLE_ZOOM_LEVEL_BONNET
IF NOT bHasFirstPersonFlashTriggered
AND NOT IS_SCREEN_FADED_OUT()
IF TIMERB() > 2700
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Triggering flash: TIMERB = ", TIMERB())
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bHasFirstPersonFlashTriggered = TRUE
ENDIF
ENDIF
IF TIMERB() > 3000
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
NEW_LOAD_SCENE_STOP()
SETTIMERB(0)
i_current_event++
ENDIF
ELSE
IF TIMERB() > 2000
//DESTROY_ALL_CAMS()
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(FALSE, TRUE, 2000, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
NEW_LOAD_SCENE_STOP()
SETTIMERB(0)
i_current_event++
ENDIF
ENDIF
BREAK
CASE 55 //Wait for interp to finish.
IF NOT IS_ENTITY_DEAD(veh_final_car)
SET_VEHICLE_FORWARD_SPEED(veh_final_car, 15.0)
ENDIF
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF TIMERB() > 2000
OR (bHasFirstPersonFlashTriggered AND TIMERB() > 500)
DESTROY_ALL_CAMS()
e_section_stage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
ENDIF
IF e_section_stage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF b_skipped_mocap
ENDIF
INT i = 0
REPEAT COUNT_OF(s_heli_ropes_new) i
IF s_heli_ropes_new[i].rope != NULL
DELETE_ROPE(s_heli_ropes_new[i].rope)
s_heli_ropes_new[i].rope = NULL
ENDIF
ENDREPEAT
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
REMOVE_PED(s_lester.ped, TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
REMOVE_VEHICLE(s_gold_choppers[0].veh, TRUE) //Remove the chopper after the cutscene has ended, this fixes B*730413.
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
REMOVE_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
NEW_LOAD_SCENE_STOP()
MISSION_PASSED(TRUE)
ENDIF
IF e_section_stage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
STOP_CUTSCENE()
SET_FOCUS_ENTITY(PLAYER_PED_ID())
b_skipped_mocap = TRUE
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
PROC UPDATE_WIDGETS()
IF b_debug_record_heli_chase_setpieces
b_is_jumping_directly_to_stage = TRUE
MISSION_CLEANUP()
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_DEBUG_RECORD_HELI_CHASE_SETPIECES
b_debug_record_heli_chase_setpieces = FALSE
b_is_jumping_directly_to_stage = FALSE
ENDIF
IF b_debug_record_camera
b_is_jumping_directly_to_stage = TRUE
MISSION_CLEANUP()
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_DEBUG_RECORD_CAMERA
b_debug_record_camera = FALSE
b_is_jumping_directly_to_stage = FALSE
ENDIF
IF b_debug_playback_camera
b_is_jumping_directly_to_stage = TRUE
MISSION_CLEANUP()
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_DEBUG_PLAYBACK_CAMERA
b_debug_playback_camera = FALSE
b_is_jumping_directly_to_stage = FALSE
ENDIF
IF b_debug_record_train_heli_hover
b_is_jumping_directly_to_stage = TRUE
MISSION_CLEANUP()
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_DEBUG_RECORD_HELI_TRAIN_HOVER
b_debug_record_train_heli_hover = FALSE
b_is_jumping_directly_to_stage = FALSE
ENDIF
IF b_debug_record_gold_drop
b_is_jumping_directly_to_stage = TRUE
MISSION_CLEANUP()
e_section_stage = SECTION_STAGE_SETUP
e_mission_stage = STAGE_DEBUG_RECORD_GOLD_DROP
b_debug_record_gold_drop = FALSE
b_is_jumping_directly_to_stage = FALSE
ENDIF
IF b_debug_force_activate
VEHICLE_INDEX veh
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(veh)
IF IS_BUTTON_PRESSED(PAD1, SQUARE)
APPLY_FORCE_TYPE e_force_type
IF i_debug_force_type = 0
e_force_type = APPLY_TYPE_FORCE
ELIF i_debug_force_type = 1
e_force_type = APPLY_TYPE_IMPULSE
ELIF i_debug_force_type = 2
e_force_type = APPLY_TYPE_EXTERNAL_FORCE
ELIF i_debug_force_type = 3
e_force_type = APPLY_TYPE_EXTERNAL_IMPULSE
ELIF i_debug_force_type = 4
e_force_type = APPLY_TYPE_TORQUE
ELIF i_debug_force_type = 5
e_force_type = APPLY_TYPE_ANGULAR_IMPULSE
ENDIF
APPLY_FORCE_TO_ENTITY(veh, e_force_type, v_debug_force_dir, v_debug_force_offset, i_debug_force_component,
b_debug_force_local_force, b_debug_force_local_offset, b_debug_force_scale_by_mass)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC DO_DEBUG()
UPDATE_WIDGETS()
//Reset any skipping from the previous frame
IF e_section_stage = SECTION_STAGE_SKIP
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
AND NOT b_mission_passed_screen_displayed
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
MISSION_PASSED()
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
MISSION_FAILED(FAILED_GENERIC)
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
e_section_stage = SECTION_STAGE_SKIP
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
//Work out which stage we want to reach based on the current stage
INT i_current_stage = ENUM_TO_INT(e_mission_stage)
IF i_current_stage > 0
MISSION_STAGE e_stage = INT_TO_ENUM(MISSION_STAGE, i_current_stage - 1)
JUMP_TO_STAGE(e_stage, TRUE)
ELSE
JUMP_TO_STAGE(STAGE_START_CUTSCENE, TRUE)
ENDIF
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1)
OUTPUT_DEBUG_CAM_RELATIVE_TO_ENTITY(GET_FOCUS_ENTITY_INDEX())
ENDIF
IF LAUNCH_MISSION_STAGE_MENU(s_skip_menu, i_debug_jump_stage)
MISSION_STAGE e_stage = INT_TO_ENUM(MISSION_STAGE, i_debug_jump_stage)
JUMP_TO_STAGE(e_stage, TRUE)
ENDIF
ENDIF
ENDPROC
PROC RECORD_HELI_CHASE_SETPIECES()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF e_section_stage = SECTION_STAGE_SETUP
REQUEST_MODEL(model_gold_chopper)
IF HAS_MODEL_LOADED(model_gold_chopper)
s_gold_choppers[0].veh = CREATE_VEHICLE(model_gold_chopper, <<-336.4547, -750.0684, 54.2059>>, 0.0)
SET_ENTITY_COLLISION(s_gold_choppers[0].veh, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF i_current_event = 0
INITIALISE_UBER_PLAYBACK(str_carrec, CARREC_HELI_CHASE_TRIGGER)
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
LOAD_HELI_CHASE_UBER_DATA()
i_current_event++
ELIF i_current_event = 1
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
IF SET_CAR_AT_PLAYBACK_POSITION(s_gold_choppers[0].veh, CARREC_HELI_CHASE_TRIGGER, 0.0, TRUE, FALSE)
SET_ENTITY_COLLISION(s_gold_choppers[0].veh, FALSE)
i_current_event++
ENDIF
ENDIF
ELIF i_current_event = 2
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
f_chase_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[0].veh)
f_chase_playback_speed = 1.0
SET_ENTITY_COLLISION(s_gold_choppers[0].veh, FALSE)
SET_ENTITY_INVINCIBLE(s_gold_choppers[0].veh, TRUE)
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
CREATE_ALL_WAITING_UBER_CARS()
UPDATE_UBER_PLAYBACK(s_gold_choppers[0].veh, 1.0)
//Draw spheres in front of the trigger: this is useful for recording cars that need to be in front.
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
VECTOR v_pos_1 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_HELI_CHASE_TRIGGER, f_chase_playback_time + 500.0, str_carrec)
VECTOR v_pos_2 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_HELI_CHASE_TRIGGER, f_chase_playback_time + 1500.0, str_carrec)
VECTOR v_pos_3 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_HELI_CHASE_TRIGGER, f_chase_playback_time + 5000.0, str_carrec)
DRAW_DEBUG_SPHERE(v_pos_1, 1.0, 0, 255, 0, 128)
DRAW_DEBUG_SPHERE(v_pos_2, 1.0, 0, 255, 0, 128)
DRAW_DEBUG_SPHERE(v_pos_3, 1.0, 0, 255, 0, 128)
INT i = 0
REPEAT COUNT_OF(SetPieceCarID) i
IF NOT IS_ENTITY_DEAD(SetPieceCarID[i])
SET_ENTITY_COLLISION(SetPieceCarID[i], FALSE)
ENDIF
ENDREPEAT
ELSE
i_current_event = 1
CLEANUP_UBER_PLAYBACK(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RECORD_TRAIN_HELI_HOVER()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF e_section_stage = SECTION_STAGE_SETUP
REQUEST_MODEL(FREIGHTCAR)
REQUEST_MODEL(FROGGER)
IF HAS_MODEL_LOADED(FREIGHTCAR)
AND HAS_MODEL_LOADED(FROGGER)
veh_debug = CREATE_VEHICLE(FREIGHTCAR, <<2552.4368, 2927.5645, 45.4778>>, 324.5322)
s_gold_choppers[0].veh = CREATE_VEHICLE(FROGGER, <<2552.4368, 2927.5645, 65.4778>>, 324.5322)
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
SET_MODEL_AS_NO_LONGER_NEEDED(FREIGHTCAR)
SET_MODEL_AS_NO_LONGER_NEEDED(FROGGER)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
IF NOT IS_ENTITY_DEAD(veh_debug)
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
IF i_current_event = 0
SET_ENTITY_COORDS(s_gold_choppers[0].veh, <<2552.4368, 2927.5645, 65.4778>>)
SET_ENTITY_HEADING(s_gold_choppers[0].veh, 324.5322)
i_current_event++
ELIF i_current_event = 1
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
START_RECORDING_VEHICLE(veh_debug, CARREC_HOVER_TRAIN, str_carrec, TRUE)
START_RECORDING_VEHICLE(s_gold_choppers[0].veh, CARREC_HOVER_TRAIN_HELI, str_carrec, TRUE)
i_current_event++
ENDIF
ELIF i_current_event = 2
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
STOP_RECORDING_VEHICLE(veh_debug)
STOP_RECORDING_VEHICLE(s_gold_choppers[0].veh)
i_current_event = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RECORD_GOLD_DROP()
INT i = 0
IF e_section_stage = SECTION_STAGE_SETUP
REQUEST_MODEL(model_gold_chopper)
REQUEST_MODEL(model_train_carriage)
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
IF HAS_MODEL_LOADED(model_gold_chopper)
AND HAS_MODEL_LOADED(model_train_carriage)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN_HELI, str_carrec)
//Create two helper vehicles that'll play a recording of a helicopter hovering above a train.
veh_train_hover_helpers[0] = CREATE_VEHICLE(model_train_carriage, <<2552.4368, 2927.5645, 45.4778>>, 324.5322)
START_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[0], CARREC_HOVER_TRAIN, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[0], 8000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_train_hover_helpers[0])
SET_PLAYBACK_SPEED(veh_train_hover_helpers[0], 0.0)
SET_ENTITY_COLLISION(veh_train_hover_helpers[0], FALSE)
veh_train_hover_helpers[1] = CREATE_VEHICLE(model_train_carriage, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<-2.8, 0.0, 0.0>>),
GET_ENTITY_HEADING(veh_train_hover_helpers[0]))
SET_ENTITY_COORDS_NO_OFFSET(veh_train_hover_helpers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<-2.8, 0.0, 0.0>>))
FREEZE_ENTITY_POSITION(veh_train_hover_helpers[1], TRUE)
veh_train_hover_helpers[2] = CREATE_VEHICLE(model_train_carriage, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<2.8, 0.0, 0.0>>),
GET_ENTITY_HEADING(veh_train_hover_helpers[0]))
SET_ENTITY_COORDS_NO_OFFSET(veh_train_hover_helpers[2], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<2.8, 0.0, 0.0>>))
FREEZE_ENTITY_POSITION(veh_train_hover_helpers[2], TRUE)
veh_train_hover_helpers[3] = CREATE_VEHICLE(model_train_carriage, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<0.0, 0.0, -1.0>>),
GET_ENTITY_HEADING(veh_train_hover_helpers[0]))
SET_ENTITY_COORDS_NO_OFFSET(veh_train_hover_helpers[3], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<0.0, 0.0, -1.0>>))
FREEZE_ENTITY_POSITION(veh_train_hover_helpers[3], TRUE)
s_gold_choppers[0].veh = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 55.4778>>, 324.5322)
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HOVER_TRAIN_HELI, str_carrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 8000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
veh_debug = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 55.4778>>, 324.5322)
FREEZE_ENTITY_POSITION(veh_debug, TRUE)
SET_ENTITY_COLLISION(veh_debug, FALSE)
SET_ENTITY_INVINCIBLE(veh_debug, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_carriage)
WHILE NOT SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
OR NOT SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0, FALSE)
WAIT(0)
ENDWHILE
DO_FADE_IN_WITH_WAIT()
i_current_event = 0
e_section_stage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF e_section_stage = SECTION_STAGE_RUNNING
IF NOT IS_ENTITY_DEAD(veh_train_hover_helpers[0])
AND NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
AND NOT IS_ENTITY_DEAD(veh_debug)
VECTOR v_dir
v_dir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(GET_ENTITY_ROTATION(veh_train_hover_helpers[0]))
SET_ENTITY_COORDS_NO_OFFSET(veh_debug, GET_ENTITY_COORDS(obj_gold_containers[0]))
SET_ENTITY_ROTATION(veh_debug, GET_ENTITY_ROTATION(obj_gold_containers[0]))
SWITCH i_current_event
CASE 0
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN, str_carrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN_HELI, str_carrec)
AND IS_BUTTON_PRESSED(PAD1, SQUARE)
SET_PLAYBACK_SPEED(veh_train_hover_helpers[0], 1.0)
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 1.0)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(veh_train_hover_helpers[0], FALSE)
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(veh_train_hover_helpers[0], TRUE)
APPLY_FORCE_TO_ENTITY(obj_gold_containers[0], APPLY_TYPE_IMPULSE, <<v_dir.x * 5.0, v_dir.y * 5.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
START_RECORDING_VEHICLE(veh_debug, CARREC_HOVER_TRAIN_GOLD, str_carrec, TRUE)
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING", DEFAULT_GOD_TEXT_TIME, 1)
SETTIMERB(0)
i_current_event++
ENDIF
BREAK
CASE 1
IF TIMERB() > 500
REPEAT COUNT_OF(s_heli_ropes_new) i
IF i < 4
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[i].rope, s_gold_choppers[0].veh)
s_heli_ropes_new[i].b_is_attached = FALSE
ENDIF
ENDIF
ENDREPEAT
DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
SETTIMERB(0)
i_current_event++
ENDIF
BREAK
CASE 2
//Apply a force to keep the container moving towards the train.
IF TIMERB() < 1500
//APPLY_FORCE_TO_ENTITY(obj_gold_containers[0], APPLY_TYPE_FORCE, <<v_dir.x * 10.0, v_dir.y * 10.0, 0.0>> , <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
ENDIF
//Stop recording.
IF IS_BUTTON_PRESSED(PAD1, SQUARE)
STOP_RECORDING_VEHICLE(veh_debug)
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING STOPPED", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
#ENDIF
SCRIPT
SET_MISSION_FLAG(TRUE)
IF HAS_FORCE_CLEANUP_OCCURRED()
Mission_Flow_Mission_Force_Cleanup()
b_is_jumping_directly_to_stage = FALSE
SET_CLEANUP_TO_RUN_ON_RESPAWN(RCI_BIGSCORE2B)
MISSION_CLEANUP()
ENDIF
MISSION_SETUP()
//SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(scsSwitchCamMichaelToFranklin, INT_TO_NATIVE(VEHICLE_INDEX, 0), INT_TO_NATIVE(VEHICLE_INDEX, 0))
//CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichaelToFranklin, "Michael", "Franklin", widget_debug)
IF Is_Replay_In_Progress()
INT i_stage = Get_Replay_Mid_Mission_Stage()
IF g_bShitskipAccepted
i_stage++
ENDIF
IF i_stage = 0
JUMP_TO_STAGE(STAGE_GO_TO_BANK)
ELIF i_stage = CHECKPOINT_DRILL
JUMP_TO_STAGE(STAGE_DRILL_THROUGH_WALL)
ELIF i_stage = CHECKPOINT_TUNNEL_SHOOTOUT
JUMP_TO_STAGE(STAGE_TUNNEL_SHOOTOUT)
ELIF i_stage = CHECKPOINT_CITY_SHOOTOUT
JUMP_TO_STAGE(STAGE_CITY_SHOOTOUT)
ELIF i_stage = CHECKPOINT_CITY_SHOOTOUT_MID
JUMP_TO_STAGE(STAGE_CITY_SHOOTOUT_MID_POINT)
ELIF i_stage = CHECKPOINT_LOSE_COPS
JUMP_TO_STAGE(STAGE_LOSE_COPS)
ELIF i_stage = CHECKPOINT_HELI_CHASE
JUMP_TO_STAGE(STAGE_CHOPPER_CHASE)
ELIF i_stage = CHECKPOINT_DROPOFF_GOLD
JUMP_TO_STAGE(STAGE_DROP_GOLD_ON_TRAIN)
ELIF i_stage = CHECKPOINT_FLY_BACK
JUMP_TO_STAGE(STAGE_LAND_AT_AIRFIELD)
ELIF i_stage > CHECKPOINT_FLY_BACK
JUMP_TO_STAGE(STAGE_END_CUTSCENE)
ENDIF
b_has_used_checkpoint = TRUE
ELSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "GO_TO_BANK")
ENDIF
WHILE (TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BigScoreObvious")
INT i = 0
INT i_num_crew_dead = 0
//UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichaelToFranklin)
//Global fail conditions
IF e_section_stage = SECTION_STAGE_RUNNING
AND NOT b_mission_failed
AND NOT b_mission_passed_screen_displayed
IF b_has_used_checkpoint
b_has_used_checkpoint = FALSE
ENDIF
IF DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
AND IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
MISSION_FAILED(FAILED_MICHAEL_DIED)
ENDIF
IF DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
AND IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
MISSION_FAILED(FAILED_TREVOR_DIED)
ENDIF
IF DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
AND IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
MISSION_FAILED(FAILED_FRANKLIN_DIED)
ENDIF
IF DOES_ENTITY_EXIST(s_lester.ped)
AND IS_PED_INJURED(s_lester.ped)
MISSION_FAILED(FAILED_LESTER_DIED)
ENDIF
REPEAT COUNT_OF(s_crew) i
IF DOES_ENTITY_EXIST(s_crew[i].ped)
AND IS_PED_INJURED(s_crew[i].ped)
IF NOT (e_mission_stage > STAGE_CITY_SHOOTOUT AND i = CREW_MICHAEL_ID AND NOT b_picked_good_michael_gunman)
AND NOT (e_mission_stage >= STAGE_CHOPPER_CHASE AND i = CREW_DRIVER_ID AND b_crew_driver_set_to_die)
AND e_mission_stage < STAGE_END_CUTSCENE
i_num_crew_dead++
ENDIF
ENDIF
ENDREPEAT
IF i_num_crew_dead > 0
IF i_num_crew_dead > 1
MISSION_FAILED(FAILED_CREW_MEMBERS_DIED)
ELSE
MISSION_FAILED(FAILED_CREW_MEMBER_DIED)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(veh_franklins_car)
AND NOT IS_VEHICLE_DRIVEABLE(veh_franklins_car)
MISSION_FAILED(FAILED_DESTROYED_FRANKLINS_CAR)
ENDIF
IF DOES_ENTITY_EXIST(veh_trevors_car)
AND NOT IS_VEHICLE_DRIVEABLE(veh_trevors_car)
MISSION_FAILED(FAILED_DESTROYED_TREVORS_CAR)
ENDIF
IF DOES_ENTITY_EXIST(s_gold_choppers[0].veh)
IF e_mission_stage < STAGE_END_CUTSCENE
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
IF IS_ENTITY_ON_FIRE(s_gold_choppers[0].veh)
OR (NOT IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh) AND NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh) AND GET_ENTITY_SPEED(s_gold_choppers[0].veh) < 1.0)
MISSION_FAILED(FAILED_DESTROYED_CHOPPER)
ENDIF
ELSE
MISSION_FAILED(FAILED_DESTROYED_CHOPPER)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(s_gold_choppers[1].veh)
AND NOT IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
IF e_mission_stage < STAGE_LAND_AT_AIRFIELD
IF e_mission_stage >= STAGE_CHOPPER_CHASE
IF NOT b_crew_driver_set_to_die
MISSION_FAILED(FAILED_DESTROYED_CHOPPER)
ENDIF
ELSE
MISSION_FAILED(FAILED_DESTROYED_CHOPPER)
ENDIF
ENDIF
ENDIF
ENDIF
//Stats.
IF NOT b_mission_passed_screen_displayed
AND e_section_stage = SECTION_STAGE_RUNNING
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, FH2B_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(), FH2B_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
//Mission stages
SWITCH e_mission_stage
CASE STAGE_START_CUTSCENE
DO_START_CUTSCENE()
BREAK
CASE STAGE_GO_TO_BANK
GO_TO_BANK()
BREAK
CASE STAGE_DRILL_THROUGH_WALL
DRILL_THROUGH_WALL()
BREAK
CASE STAGE_BLOW_UP_DOORS
BLOW_UP_DOORS()
BREAK
CASE STAGE_COLLECT_GOLD
DEFEND_CREW_IN_TUNNELS()
BREAK
CASE STAGE_WINCH_GOLD_CUTSCENE
WINCH_GOLD_CUTSCENE()
BREAK
CASE STAGE_TUNNEL_SHOOTOUT
TUNNEL_SHOOTOUT()
BREAK
CASE STAGE_LEAVE_BANK
LEAVE_BANK()
BREAK
CASE STAGE_CITY_SHOOTOUT
CASE STAGE_CITY_SHOOTOUT_MID_POINT
CITY_SHOOTOUT()
BREAK
CASE STAGE_LOSE_COPS
LOSE_COPS()
BREAK
CASE STAGE_CHOPPER_CHASE
CHOPPER_CHASE()
BREAK
CASE STAGE_DROP_GOLD_ON_TRAIN
DROP_GOLD_ON_TRAIN()
BREAK
CASE STAGE_DROP_GOLD_ON_TRAIN_CUTSCENE
DROP_GOLD_ON_TRAIN_CUTSCENE()
BREAK
CASE STAGE_LAND_AT_AIRFIELD
LAND_AT_AIRFIELD()
BREAK
CASE STAGE_END_CUTSCENE
DO_END_CUTSCENE()
BREAK
CASE STAGE_DEBUG_RECORD_HELI_CHASE_SETPIECES
#IF IS_DEBUG_BUILD
RECORD_HELI_CHASE_SETPIECES()
#ENDIF
BREAK
CASE STAGE_DEBUG_RECORD_HELI_TRAIN_HOVER
#IF IS_DEBUG_BUILD
RECORD_TRAIN_HELI_HOVER()
#ENDIF
BREAK
CASE STAGE_DEBUG_RECORD_GOLD_DROP
#IF IS_DEBUG_BUILD
RECORD_GOLD_DROP()
#ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
DO_DEBUG()
#ENDIF
ENDWHILE
ENDSCRIPT