// ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // 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, <>) 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_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_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_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_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_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(<>, <>) 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 = <> - <> 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(<>, <>) //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, <>) 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], <>) 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, <>) 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], <>) 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, <>, <<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, <> , <<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