26583 lines
1.1 MiB
Plaintext
Executable File
26583 lines
1.1 MiB
Plaintext
Executable File
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : finale_heist2B.sc
|
|
// AUTHOR : Matthew Booton
|
|
// DESCRIPTION : Franklin and the crew drill from an underground tunnel into
|
|
// the bank vault to collect the gold. Trevor collects the gold
|
|
// in a chopper. Michael causes a distraction in the main bank,
|
|
// Franklin goes to rescue him, and a shootout
|
|
// ensues until they reach a car park. Trevor flies in to collect
|
|
// them, and has to lose the cops in the chopper.
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
|
|
USING "commands_audio.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_clock.sch"
|
|
USING "commands_debug.sch"
|
|
USING "commands_fire.sch"
|
|
USING "commands_graphics.sch"
|
|
USING "commands_hud.sch"
|
|
USING "commands_misc.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_ped.sch"
|
|
USING "commands_physics.sch"
|
|
USING "commands_player.sch"
|
|
USING "commands_recording.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_task.sch"
|
|
USING "commands_vehicle.sch"
|
|
USING "commands_interiors.sch"
|
|
USING "commands_itemsets.sch"
|
|
|
|
USING "chase_hint_cam.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "flow_public_game.sch"
|
|
USING "flow_public_core_override.sch"
|
|
USING "model_enums.sch"
|
|
USING "script_ped.sch"
|
|
USING "script_player.sch"
|
|
USING "script_misc.sch"
|
|
USING "script_blips.sch"
|
|
USING "script_heist.sch"
|
|
USING "script_drawing.sch"
|
|
USING "selector_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "replay_public.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "CompletionPercentage_public.sch"
|
|
USING "taxi_functions.sch"
|
|
USING "cam_recording_public.sch"
|
|
USING "shop_public.sch"
|
|
USING "stripclub_public.sch"
|
|
USING "heist_end_screen.sch"
|
|
USING "rappel_public.sch"
|
|
USING "achievement_public.sch"
|
|
USING "clearmissionarea.sch"
|
|
USING "Timelapse.sch"
|
|
USING "spline_cam_edit.sch"
|
|
|
|
// total should not exceed 225
|
|
CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 5
|
|
CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 5
|
|
CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 5
|
|
|
|
// total should not exceed 12
|
|
CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 2
|
|
CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 5
|
|
|
|
// this should be fine
|
|
CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 5
|
|
|
|
USING "traffic.sch"
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
USING "shared_debug.sch"
|
|
USING "script_debug.sch"
|
|
USING "select_mission_stage.sch"
|
|
#ENDIF
|
|
|
|
ENUM MISSION_STAGE
|
|
STAGE_START_CUTSCENE,
|
|
STAGE_GO_TO_BANK,
|
|
STAGE_DRILL_THROUGH_WALL,
|
|
STAGE_BLOW_UP_DOORS,
|
|
STAGE_COLLECT_GOLD,
|
|
STAGE_WINCH_GOLD_CUTSCENE,
|
|
STAGE_TUNNEL_SHOOTOUT,
|
|
STAGE_LEAVE_BANK,
|
|
STAGE_CITY_SHOOTOUT,
|
|
STAGE_CITY_SHOOTOUT_MID_POINT,
|
|
STAGE_LOSE_COPS,
|
|
STAGE_CHOPPER_CHASE,
|
|
STAGE_DROP_GOLD_ON_TRAIN,
|
|
STAGE_DROP_GOLD_ON_TRAIN_CUTSCENE,
|
|
STAGE_LAND_AT_AIRFIELD,
|
|
STAGE_END_CUTSCENE,
|
|
STAGE_DEBUG_RECORD_HELI_CHASE_SETPIECES,
|
|
STAGE_DEBUG_RECORD_CAMERA,
|
|
STAGE_DEBUG_PLAYBACK_CAMERA,
|
|
STAGE_DEBUG_RECORD_HELI_TRAIN_HOVER,
|
|
STAGE_DEBUG_RECORD_GOLD_DROP
|
|
ENDENUM
|
|
|
|
ENUM FAILED_REASON
|
|
FAILED_GENERIC = 0,
|
|
FAILED_FRANKLIN_DIED,
|
|
FAILED_MICHAEL_DIED,
|
|
FAILED_TREVOR_DIED,
|
|
FAILED_CREW_MEMBER_DIED,
|
|
FAILED_CREW_MEMBERS_DIED,
|
|
FAILED_LOST_CREW_MEMBER,
|
|
FAILED_LOST_CREW_MEMBERS,
|
|
FAILED_ALERTED_BANK,
|
|
FAILED_DESTROYED_START_CAR,
|
|
FAILED_DESTROYED_END_CAR,
|
|
FAILED_DESTROYED_TREVORS_CAR,
|
|
FAILED_DESTROYED_FRANKLINS_CAR,
|
|
FAILED_DESTROYED_FORKLIFT,
|
|
FAILED_DESTROYED_CHOPPER,
|
|
FAILED_STUCK_START_CAR,
|
|
FAILED_STUCK_FORKLIFT,
|
|
FAILED_STUCK_CHOPPER,
|
|
FAILED_STUCK_CUTTER,
|
|
FAILED_RAN_OUT_OF_CHARGES,
|
|
FAILED_LEFT_CHOPPER_BEHIND,
|
|
FAILED_ABANDONED_CREW_IN_TUNNELS,
|
|
FAILED_ABANDONED_CREW_IN_SHOOTOUT,
|
|
FAILED_ABANDONED_CREW_IN_CHASE,
|
|
FAILED_MISSED_TRAIN,
|
|
FAILED_ABANDONED_HEIST,
|
|
FAILED_LESTER_DIED,
|
|
FAILED_ABANDONED_LESTER,
|
|
FAILED_CUTTER_BLOCKING_TUNNEL,
|
|
FAILED_TROLLEY_DETACHED,
|
|
FAILED_DIDNT_KILL_MERRYWEATHER,
|
|
FAILED_BAILED_OUT_OF_CHOPPER
|
|
ENDENUM
|
|
|
|
ENUM SECTION_STAGE
|
|
SECTION_STAGE_SETUP = 0,
|
|
SECTION_STAGE_RUNNING,
|
|
SECTION_STAGE_CLEANUP,
|
|
SECTION_STAGE_SKIP
|
|
ENDENUM
|
|
|
|
ENUM CREW_HELI_STAGE
|
|
HELI_STAGE_FLY_TO_BANK,
|
|
HELI_STAGE_WAIT_FOR_TREVOR,
|
|
HELI_STAGE_HOVER_OVER_TUNNEL,
|
|
HELI_STAGE_LEAVE_BANK
|
|
ENDENUM
|
|
|
|
ENUM ROCKET_LINE_UP_STATE
|
|
LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE,
|
|
LINE_UP_DONT_FIRE_TOO_FAR_AWAY_RIGHT_SIDE,
|
|
LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE,
|
|
LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE,
|
|
LINE_UP_FIRE_MISS_LEFT_SIDE,
|
|
LINE_UP_FIRE_MISS_RIGHT_SIDE,
|
|
LINE_UP_FIRE_LEFT_SIDE,
|
|
LINE_UP_FIRE_RIGHT_SIDE
|
|
ENDENUM
|
|
|
|
ENUM ROCKET_ANIM_STATE
|
|
ROCKET_ANIM_USING_AI,
|
|
ROCKET_ANIM_GET_LAUNCHER_OUT_THEN_AIM,
|
|
ROCKET_ANIM_PUT_LAUNCHER_AWAY,
|
|
ROCKET_ANIM_GET_CLOSER_THEN_AIM,
|
|
ROCKET_ANIM_RELOAD_THEN_AIM,
|
|
ROCKET_ANIM_AIMING
|
|
ENDENUM
|
|
|
|
ENUM ENEMY_HELI_STATE
|
|
ENEMY_HELI_PLAY_RECORDING,
|
|
ENEMY_HELI_ATTACK_HIGH,
|
|
ENEMY_HELI_ATTACK_LOW,
|
|
ENEMY_HELI_BLOW_UP
|
|
ENDENUM
|
|
|
|
ENUM TRIGGERED_TEXT_LABEL
|
|
BS2B_CRGOLD1 = 0,
|
|
BS2B_CRGOLD2,
|
|
F3B_ROCHELP,
|
|
BS2B_RELOAD,
|
|
BS2B_GOSHOT,
|
|
BS2B_FLYLOW,
|
|
BS2B_MSWITCH,
|
|
F3B_GOTOMICH,
|
|
BS2B_TLEAVE,
|
|
BS2B_BCOPS,
|
|
BS2B_CRCOPS4,
|
|
BS2B_GOTIT,
|
|
BS2B_GOGOBRIDGE,
|
|
BS2B_BRIDG2,
|
|
BS2B_BRIDGE,
|
|
BS2B_BHELI,
|
|
BS2B_GOGO4,
|
|
BS2B_HIGH,
|
|
BS2B_LEFTRAMP,
|
|
BS2B_NOLORAMP,
|
|
BS2B_HIGH2,
|
|
BS2B_TOP,
|
|
BS2B_WAITRAMP,
|
|
BS2B_GOGOSTAIRS,
|
|
BS2B_PHELI,
|
|
BS2B_GOGOPLAZA,
|
|
BS2B_RIGHTPLAZA,
|
|
BS2B_COVER,
|
|
BS2B_HELI2,
|
|
BS2B_DBRID,
|
|
BS2B_DRAMP,
|
|
BS2B_GOGO5,
|
|
BS2B_MERRY,
|
|
BS2B_PDOWN,
|
|
BS2B_BACK,
|
|
BS2B_WAITCOURT,
|
|
BS2B_GOGO8,
|
|
BS2B_GOGO9,
|
|
BS2B_GOGOMERRY,
|
|
BS2B_RIGHTRAMP,
|
|
BS2B_CPARK,
|
|
BS2B_CPARK2,
|
|
BS2B_WAGON,
|
|
BS2B_CPUSH1,
|
|
BS2B_CPUSH2,
|
|
BS2B_CPUSH3,
|
|
BS2B_STAIRS,
|
|
F3B_SWIFRAN,
|
|
BS2B_BORE,
|
|
BS2B_WALL,
|
|
BS2B_DRIL,
|
|
F3B_DRILL,
|
|
F3B_DRILLHELP,
|
|
BS2B_REM,
|
|
BS2B_WAY,
|
|
BS2B_HOLD,
|
|
BS2B_INTO,
|
|
BS2B_MADE,
|
|
BS2B_BACKDRILL,
|
|
BS2B_BUP,
|
|
BS2B_JAM,
|
|
F3B_CUTOUT,
|
|
BS2B_BLIMIT,
|
|
F3B_CHARGE,
|
|
BS2B_BLOW,
|
|
BS2B_TWO,
|
|
BS2B_OUT,
|
|
F3B_CHARGE2,
|
|
BS2B_SET,
|
|
BS2B_ONE,
|
|
BS2B_OPEN,
|
|
F3B_ABANCREW,
|
|
BS2B_TAKE,
|
|
BS2B_GEN,
|
|
BS2B_BCOPS2,
|
|
F3B_FORKHELP1,
|
|
F3B_GETGOLD,
|
|
F3B_TAKEGOLD,
|
|
BS2B_THELI,
|
|
F3B_FORKLIFT,
|
|
F3B_FORKLIFTB,
|
|
BS2B_CRFORK2,
|
|
BS2B_CRFORK,
|
|
BS2B_BCOPS3,
|
|
F3B_DEFGOLD2,
|
|
BS2B_OPENTUNNEL,
|
|
F3B_DEFGOLD,
|
|
BS2B_TFIGHT,
|
|
BS2B_TRAPPEL,
|
|
F3B_SWITREV,
|
|
BS2B_USURE,
|
|
BS2B_GOBACK,
|
|
BS2B_SEE,
|
|
BS2B_CHP,
|
|
BS2B_FRANARR,
|
|
BS2B_MERCOV,
|
|
BS2B_MENT1,
|
|
BS2B_MENT2,
|
|
BS2B_SCHAT,
|
|
BS2B_DOWN1,
|
|
BS2B_DOWN2,
|
|
BS2B_DOWN3,
|
|
BS2B_DOWN4,
|
|
BS2B_JACK,
|
|
BS2B_JACK2,
|
|
BS2B_GETCAR,
|
|
BS2B_VSAFE,
|
|
BS2B_GO,
|
|
BS2B_VSAFEM,
|
|
BS2B_RADIO,
|
|
BS2B_LOST,
|
|
BS2B_INFO,
|
|
F3B_FOLLOWCREW,
|
|
BS2B_SEES,
|
|
BS2B_LSEES,
|
|
BS2B_DROP,
|
|
BS2B_TREVOR,
|
|
BS2B_REPLY,
|
|
BS2B_RESPOND,
|
|
BS2B_NOSM,
|
|
BS2B_WIND,
|
|
BS2B_HLP2,
|
|
BS2B_OVER,
|
|
BS2B_TRB,
|
|
BS2B_BEFORE,
|
|
BS2B_CRS,
|
|
BS2B_SAF,
|
|
BS2B_DOWN,
|
|
BS2B_BAD,
|
|
F3B_DROPHELP,
|
|
BS2B_NODROP,
|
|
BS2B_YESDROP,
|
|
BS2B_PACK1,
|
|
BS2B_PACK2,
|
|
BS2B_MOREGARAGE,
|
|
BS2B_MOVE1,
|
|
BS2B_MOVE2,
|
|
BS2B_LOGIC,
|
|
BS2B_RENT,
|
|
BS2B_FRANK,
|
|
BS2B_MBANK,
|
|
BS2B_MBANK_PRELOAD,
|
|
BS2B_BANK,
|
|
BS2B_SWITCH,
|
|
BS2B_GOGO,
|
|
BS2B_MORE1,
|
|
BS2B_MORE2,
|
|
BS2B_MORE3,
|
|
BS2B_COM1,
|
|
BS2B_COM2,
|
|
BS2B_COM3,
|
|
BS2B_CHAT,
|
|
BS2B_OTH,
|
|
BS2B_OKAY,
|
|
BS2B_NSWITCH,
|
|
BS2B_AIR,
|
|
BS2B_DIDIT,
|
|
BS2B_WOO,
|
|
BS2B_DRIVE,
|
|
BS2B_TALK,
|
|
BS2B_SEEAIR,
|
|
BS2B_TRN,
|
|
BS2B_CLEAR,
|
|
BS2B_HEAR,
|
|
BS2B_HEAR2,
|
|
BS2B_HEAR3,
|
|
BS2B_HEAR4,
|
|
BS2B_HEAR5,
|
|
BS2B_POLICE,
|
|
BS2B_POLICE2,
|
|
BS2B_MTL1,
|
|
BS2B_MTL2,
|
|
POLICE_REPORT_1,
|
|
POLICE_REPORT_2,
|
|
POLICE_REPORT_3,
|
|
POLICE_REPORT_4
|
|
ENDENUM
|
|
|
|
STRUCT MISSION_VEHICLE
|
|
VEHICLE_INDEX veh
|
|
BLIP_INDEX blip
|
|
INT i_event
|
|
ENDSTRUCT
|
|
|
|
STRUCT MISSION_PED
|
|
PED_INDEX ped
|
|
BLIP_INDEX blip
|
|
INT i_event
|
|
ENDSTRUCT
|
|
|
|
STRUCT BUDDY_DATA
|
|
PED_INDEX ped
|
|
PED_INDEX ped_current_target
|
|
BLIP_INDEX blip
|
|
COVERPOINT_INDEX cover
|
|
INT i_event
|
|
INT i_timer
|
|
INT i_fire_timer
|
|
INT i_sync_scene
|
|
BOOL b_is_waypoint_aiming
|
|
BOOL b_refresh_tasks //For shootouts involving player peds their tasks need to be checked constantly in case you switch to them. This flag is used to force an update of tasks if necessary.
|
|
BOOl b_is_using_secondary_cover
|
|
VECTOR v_dest
|
|
ENDSTRUCT
|
|
|
|
STRUCT ENEMY_DATA
|
|
PED_INDEX ped
|
|
PED_INDEX ped_current_target
|
|
BLIP_INDEX blip
|
|
COVERPOINT_INDEX cover
|
|
BOOL b_is_created
|
|
BOOL b_has_started_rope_jump
|
|
INT i_event
|
|
INT i_timer
|
|
INT i_rope_event
|
|
VECTOR v_dest
|
|
AI_BLIP_STRUCT s_blip_data
|
|
ENDSTRUCT
|
|
|
|
STRUCT ROPE_DATA
|
|
ROPE_INDEX rope
|
|
BOOL b_is_attached
|
|
BOOL b_attached_object_is_ready
|
|
ENDSTRUCT
|
|
|
|
STRUCT ROCKET_DATA
|
|
OBJECT_INDEX obj
|
|
ENTITY_INDEX entity_owner
|
|
VEHICLE_INDEX veh_target
|
|
VECTOR v_dir
|
|
VECTOR v_start
|
|
VECTOR v_rot
|
|
VECTOR v_offset
|
|
VECTOR v_vel
|
|
VECTOR v_prev_pos
|
|
BOOL b_reached_target
|
|
BOOL b_add_entity_speed
|
|
BOOL b_rocket_belongs_to_player
|
|
INT i_explode_timer
|
|
INT i_sound
|
|
FLOAT f_speed_multiplier
|
|
PTFX_ID ptfx
|
|
ENDSTRUCT
|
|
|
|
BOOL b_is_jumping_directly_to_stage = FALSE
|
|
BOOL b_picked_good_driver = FALSE
|
|
BOOL b_crew_driver_set_to_die = FALSE
|
|
BOOL b_force_train_creation = FALSE
|
|
BOOL b_picked_good_franklin_gunman = FALSE
|
|
BOOL b_picked_good_michael_gunman = FALSE
|
|
BOOL b_mission_failed = FALSE
|
|
BOOL b_vault_door_blown_up[2]
|
|
//BOOL b_played_line_up_dialogue = FALSE
|
|
BOOL b_cutter_warped = FALSE
|
|
BOOL b_crew_gold_dropped_onto_train = FALSE
|
|
BOOL b_skipped_mocap = FALSE
|
|
BOOL b_reset_decals_in_cutscene = FALSE
|
|
BOOL b_players_car_exit_state_hit = FALSE
|
|
//BOOL b_attached_pallet_to_forklift = FALSE
|
|
BOOL b_player_jumped_over_wall = FALSE
|
|
BOOl b_crew_have_reached_bridge = FALSE
|
|
BOOL b_buddy_crossed_bridge = FALSE
|
|
BOOL b_crew_member_crossed_bridge = FALSE
|
|
BOOl b_created_car_park_cars = FALSE
|
|
BOOL b_reached_end_of_shootout = FALSE
|
|
BOOL b_spin_cutter_blades = FALSE
|
|
//BOOL b_allow_ambience_during_shootout = TRUE
|
|
BOOL b_player_primed_to_die = FALSE
|
|
BOOL b_trolley_sequence_is_being_blocked = FALSE
|
|
BOOL b_crew_nearly_finished_trolleys = FALSE
|
|
BOOL b_merry_heli_is_active = FALSE
|
|
BOOL b_traffic_enabled_for_shootout = FALSE
|
|
BOOL b_player_got_to_bridge = FALSE
|
|
BOOL b_cleared_first_section_corpses = FALSE
|
|
BOOL b_performed_rayfire_force_reset = FALSE
|
|
BOOL b_switch_has_been_unpaused = FALSE
|
|
BOOL b_buddy_is_going_to_car_park = FALSE
|
|
BOOL b_ramp_heli_is_active = FALSE
|
|
BOOL b_has_used_checkpoint = FALSE
|
|
BOOL b_gold_trolley_warped_for_anim = FALSE
|
|
BOOL b_played_wait_line = FALSE
|
|
BOOL b_crew_member_is_in_audio_group = FALSE
|
|
BOOL b_mission_passed_screen_displayed = FALSE
|
|
BOOL b_allow_any_vehicle_for_getaway = FALSE
|
|
BOOL b_set_improved_heli_handling = FALSE
|
|
BOOL b_trevor_chopper_too_high = FALSE
|
|
BOOL b_play_too_high_response = FALSE
|
|
BOOL b_turned_on_heli_engine = FALSE
|
|
BOOL b_cops_relationship_still_active = FALSE
|
|
BOOL b_vehicle_gen_set_to_unavailable = FALSE
|
|
BOOL b_has_changed_clothes_michael = FALSE
|
|
BOOL b_has_changed_clothes_franklin = FALSE
|
|
BOOL b_has_changed_clothes_trevor = FALSE
|
|
BOOL b_player_got_close_enough_to_train = FALSE
|
|
BOOL b_replay_event_started = FALSE
|
|
BOOL b_were_ipls_reset_early = FALSE
|
|
BOOL b_moved_doors_out_of_way[2]
|
|
BOOL b_has_text_label_triggered[180]
|
|
BOOL bRecordSomeRappelling = FALSE
|
|
BOOL bHasFirstPersonFlashTriggered = FALSE
|
|
//BOOL b_disable_climbing = FALSE
|
|
|
|
CONST_FLOAT ROPE_MIN_LENGTH 4.0
|
|
CONST_FLOAT ROPE_MAX_LENGTH 16.0
|
|
CONST_FLOAT ROPE_START_LENGTH 4.0
|
|
CONST_FLOAT ROPE_SPEED 3.5
|
|
CONST_FLOAT CONTAINER_WEIGHT 20.0
|
|
FLOAT f_chase_playback_speed = 0.0
|
|
FLOAT f_chase_playback_time = 0.0
|
|
FLOAT f_crew_shootout_start_heading = 112.2401
|
|
FLOAT f_michael_shootout_start_heading = 116.8722
|
|
FLOAT f_cutter_heading_after_drilling = 98.3992
|
|
FLOAT f_heli_hover_speed = 1.0
|
|
FLOAT f_crew_heli_speed = 1.0
|
|
FLOAT f_cutter_start_heading = 216.5789//220.3114
|
|
FLOAT f_current_train_speed = 0.0
|
|
FLOAT f_bridge_heli_playback_speed = 1.0
|
|
FLOAT f_merry_heli_playback_speed = 1.0
|
|
FLOAT f_heli_bridge_2_playback_speed = 1.0
|
|
FLOAT f_heli_ramp_playback_speed = 1.0
|
|
FLOAT f_prev_distance_from_cutter_to_wall = 0.0
|
|
FLOAT f_merry_heli_rocket_multiplier = 0.0
|
|
FLOAT f_cutter_playback_speed = 0.0
|
|
FLOAT f_current_buddy_chopper_health = 0.0
|
|
//FLOAT f_forklift_playback_speed = 1.0
|
|
|
|
CONST_INT CREW_DRIVER_ID 0
|
|
CONST_INT CREW_TRAIN_DRIVER_ID 1
|
|
CONST_INT CREW_FRANKLIN_ID 2
|
|
CONST_INT CREW_MICHAEL_ID 3
|
|
CONST_INT CARREC_HELI_CHASE_TRIGGER 1
|
|
CONST_INT CARREC_HOVER_TRAIN 101
|
|
CONST_INT CARREC_HOVER_TRAIN_HELI 102
|
|
CONST_INT CARREC_HOVER_TRAIN_GOLD 103
|
|
CONST_INT CARREC_FORKLIFT 500
|
|
CONST_INT CARREC_HELI_ARRIVE_TREVOR 501
|
|
CONST_INT CARREC_HELI_ARRIVE_CREW 502
|
|
CONST_INT CARREC_CREW_DRIVE_CUTTER 505
|
|
CONST_INT CARREC_TREVOR_ARRIVE 510
|
|
CONST_INT CARREC_TREVOR_ARRIVE_CREW 511
|
|
CONST_INT CARREC_TREVOR_COLLECT_GOLD 520
|
|
CONST_INT CARREC_CREW_COLLECT_GOLD 521
|
|
CONST_INT CARREC_CREW_HELI_COLLECT_GOLD 530
|
|
CONST_INT CARREC_CUTTER_LEAVE 550
|
|
CONST_INT CARREC_CUTTER_ENTER 551
|
|
CONST_INT CARREC_CUTTER_LEAD_UP 552
|
|
CONST_INT CARREC_COPS_CAR_PARK_1 621
|
|
CONST_INT CARREC_COPS_CAR_PARK_2 622
|
|
CONST_INT CARREC_COPS_CAR_PARK_3 624
|
|
CONST_INT CARREC_COPS_CAR_PARK_GROUND 601
|
|
CONST_INT CARREC_COPS_HELI_BRIDGE 606
|
|
CONST_INT CARREC_COPS_HELI_CAR_PARK 607
|
|
CONST_INT CARREC_COPS_HELI_BRIDGE_2 609
|
|
CONST_INT CARREC_COPS_HELI_RAMP 611
|
|
CONST_INT CARREC_COPS_HELI_COURTYARD 615
|
|
CONST_INT CARREC_MERRY_HELI 623
|
|
CONST_INT CARREC_COPS_BRIDGE_1 630
|
|
CONST_INT CARREC_COPS_BRIDGE_2 631
|
|
CONST_INT CARREC_COPS_BRIDGE_3 632
|
|
CONST_INT CARREC_COPS_BRIDGE_4 633
|
|
CONST_INT CARREC_COPS_BRIDGE_5 634
|
|
CONST_INT CARREC_COPS_BRIDGE_6 635
|
|
CONST_INT CARREC_COPS_BLOCKADE_1 640
|
|
CONST_INT CARREC_COPS_BLOCKADE_2 641
|
|
CONST_INT CARREC_COPS_BLOCKADE_3 645
|
|
CONST_INT CARREC_COPS_BEFORE_CAR_PARK_1 650
|
|
CONST_INT CARREC_COPS_BEFORE_CAR_PARK_2 651
|
|
CONST_INT CARREC_COPS_BEFORE_CAR_PARK_3 652
|
|
CONST_INT CARREC_COPS_BEFORE_CAR_PARK_4 653
|
|
CONST_INT CARREC_COPS_RAMP_1 642
|
|
CONST_INT CARREC_COPS_RAMP_2 643
|
|
CONST_INT CARREC_HELI_LEAVE 700
|
|
CONST_INT CARREC_HELI_LEAVE_2 701
|
|
CONST_INT CARREC_CAR_LEAVE 702
|
|
CONST_INT CARREC_CHASE_CAM_ANGLE_1 900
|
|
CONST_INT CHECKPOINT_DRILL 1
|
|
CONST_INT CHECKPOINT_TUNNEL_SHOOTOUT 2
|
|
CONST_INT CHECKPOINT_CITY_SHOOTOUT 3
|
|
CONST_INT CHECKPOINT_CITY_SHOOTOUT_MID 4
|
|
CONST_INT CHECKPOINT_LOSE_COPS 5
|
|
CONST_INT CHECKPOINT_HELI_CHASE 6
|
|
CONST_INT CHECKPOINT_DROPOFF_GOLD 7
|
|
CONST_INT CHECKPOINT_FLY_BACK 8
|
|
CONST_INT SWAT_SPEAKER_1 3
|
|
CONST_INT SWAT_SPEAKER_2 4
|
|
CONST_INT SWAT_SPEAKER_3 5
|
|
CONST_INT MAX_NUM_CHOPPERS_IN_CHASE 3
|
|
CONST_INT GOLD_TROLLEY_BONE_GRIP_LEFT 14991
|
|
CONST_INT GOLD_TROLLEY_BONE_GRIP_RIGHT 50415
|
|
CONST_INT ROPES_REFVELOCITY_COLLIDERORDER 2
|
|
CONST_INT MAX_OVERALL_TAKE 201600000
|
|
|
|
INT i_current_event = 0
|
|
INT i_lose_cops_event = 0
|
|
INT i_timelapse_timer = 0
|
|
INT i_time_since_player_last_shot = 0
|
|
INT i_michael_headset_dialogue_timer = 0
|
|
INT i_gunman_trouble_dialogue_timer = 0
|
|
INT i_switch_stage = 0
|
|
INT i_health_before_switch = 0
|
|
INT i_current_chopper_wave = 0
|
|
INT i_player_rocket_event = 0
|
|
//INT i_enemy_rocket_event = 0
|
|
INT i_heli_explosion_timers[MAX_NUM_CHOPPERS_IN_CHASE]
|
|
//INT i_time_since_gold_not_attached = 0
|
|
//INT i_time_since_last_chopper_exploded = 0
|
|
//INT i_time_since_last_rocket_missed = 0
|
|
INT i_cutter_sound_id = 0
|
|
INT i_gold_container_sound_id = 0
|
|
INT i_rocket_timer = 0
|
|
INT i_num_rockets_for_current_target = 0
|
|
INT i_more_cops_dialogue_timer = 0
|
|
INT i_bank_door_hashes[10]
|
|
INT i_vault_blip_timer[2]
|
|
INT i_vault_blip_remove_timer[2]
|
|
//INT i_chase_cops_dialogue_timer = 0
|
|
//INT i_chase_cops_dialogue_event = 0
|
|
INT i_player_combat_dialogue_timer = 0
|
|
INT i_buddy_combat_dialogue_timer = 0
|
|
INT i_combat_dialogue_wait_time = 0
|
|
//INT i_swat_dialogue_timer = 0
|
|
INT i_prev_num_sticky_bombs = 0
|
|
INT i_time_of_last_sticky_bomb_throw = 0
|
|
//INT i_gunman_forklift_dialogue_timer = 0
|
|
INT i_shootout_end_timer = 0
|
|
INT i_lester_rocket_anim_event = 0
|
|
INT i_lester_rocket_sync_scene = 0
|
|
INT i_current_lester_target = 0
|
|
INT i_rocket_line_up_dialogue_timer = 0
|
|
INT i_shoot_rocket_wait_timer = 0
|
|
INT i_shootout_fail_index = 0
|
|
INT i_time_since_last_bomb_activity = 0
|
|
//INT i_time_since_bomb_section_started = 0
|
|
INT i_switch_timer = 0
|
|
INT i_switch_dialogue_timer = 0
|
|
INT i_current_music_event = 0
|
|
INT i_trevor_switch_event = 0
|
|
INT i_shootout_ascend_audio_event = 0
|
|
INT i_cutter_pos_index = 0
|
|
INT i_rope_detach_timer = 0
|
|
INT i_tunnel_navmesh_block = -1
|
|
INT i_bridge_navmesh_block = -1
|
|
INT i_stairs_navmesh_block = -1
|
|
INT i_ramp_navmesh_block_1 = -1
|
|
INT i_ramp_navmesh_block_2 = -1
|
|
INT i_time_last_chopper_killed = 0
|
|
INT i_displayed_take = 0
|
|
INT i_current_take = 0
|
|
INT i_max_take_considering_crew = 0
|
|
INT i_take_penalty_crew_died = 0
|
|
INT i_main_conversation_timer = 0
|
|
INT i_fall_behind_chase_timer = 0
|
|
INT i_num_times_played_fall_behind_dialogue = 0
|
|
INT i_time_plaza_heli_blew_up = 0
|
|
INT i_lose_cops_dialogue_timer = 0
|
|
INT i_num_lose_cops_lines_played = 0
|
|
INT i_time_ramp_heli_blew_up = 0
|
|
INT i_time_bridge_heli_blew_up = 0
|
|
INT i_time_merry_heli_blew_up = 0
|
|
INT i_time_crew_gold_dropped = 0
|
|
INT i_wait_dialogue_timer = 0
|
|
INT i_time_train_help_displayed = 0
|
|
INT i_time_train_help_cleared = 0
|
|
INT i_crew_wait_dialogue_timer = 0
|
|
INT i_crew_franklin_default_accuracy = 5
|
|
INT i_crew_michael_default_accuracy = 5
|
|
INT i_cutscene_request_delay_timer = 0
|
|
INT i_door_force_timer[2]
|
|
|
|
TEXT_LABEL str_crew_names[4]
|
|
STRING str_carrec = "finheistb"
|
|
STRING str_waypoint_crew_shootout = "FinHeistB01"
|
|
STRING str_waypoint_heli_end = "FinHeistB10"
|
|
STRING str_waypoint_gold_enter_left = "FinHeistB20"
|
|
STRING str_waypoint_gold_exit_left = "FinHeistB23"
|
|
STRING str_waypoint_gold_enter_right = "FinHeistB22"
|
|
STRING str_waypoint_gold_exit_right = "FinHeistB21"
|
|
STRING str_waypoint_vault_charge_left = "finheistb30"
|
|
STRING str_waypoint_vault_charge_right = "finheistb31"
|
|
STRING str_fail_label = ""
|
|
STRING str_dialogue_block = "BS2BAUD"
|
|
STRING str_anim_cutter = "vehicle_cutter"
|
|
STRING str_anim_ig_2 = "missbigscore2big_2"
|
|
STRING str_mocap_int = "bs_2b_mcs_3"
|
|
STRING str_anim_rockets = "missbigscore2big_5"
|
|
STRING str_anim_rocket_reload = "missbigscore2big_6"
|
|
STRING str_anim_rocket_signal = "missbigscore2big_7_p2"
|
|
STRING str_anim_trolley_push_out = "missbigscore2big_11"
|
|
STRING str_anim_trolley_push_in = "missbigscore2big_13"
|
|
STRING str_anim_custom_switch = "missbigscore2big_16_switch"
|
|
STRING str_anim_custom_switch2 = "VEH@BULLDOZER@BASE" //"missah_3aig_25_switch"
|
|
STRING str_anim_cam_shake = "shake_cam_all@"
|
|
STRING str_waypoint_shootout_route = "FinHeistB50"
|
|
STRING str_anim_crew_action_idle = "MOVE_ACTION@P_M_ONE@ARMED@1H@IDLE@HIGH_ENERGY@D"
|
|
|
|
VECTOR v_zero = <<0.0, 0.0, 0.0>>
|
|
VECTOR v_outside_bank = <<-12.3722, -740.1751, 43.1717>>
|
|
VECTOR v_inside_bank = <<5.8424, -708.3293, 44.9716>>
|
|
VECTOR v_gold_pickup_pos = <<24.76, -636.02, 29.36>>
|
|
//VECTOR v_gold_dropoff_pos = <<24.76, -636.02, 16.36>>
|
|
VECTOR v_michael_shootout_start_pos = <<-1.1965, -664.0656, 48.4766>>
|
|
VECTOR v_gunman_shootout_start_pos = <<-2.6696, -670.0996, 48.4902>>
|
|
VECTOR v_cutter_start_pos = <<-1.6528, -619.2049, 14.6747>>//<<6.2154, -631.0806, 14.9017>>
|
|
VECTOR v_airfield_pos = <<2150.8811, 4811.9429, 40.1960>>
|
|
VECTOR v_cutter_pos_after_drilling = <<17.2666, -632.8779, 15.1200>> //<<11.5074, -635.8491, 15.0882>>
|
|
VECTOR v_vault_gate_pos_1 = <<3.0, -660.1, 16.4>>
|
|
VECTOR v_vault_gate_pos_2 = <<7.8, -663.5, 16.4>>
|
|
VECTOR v_vault_door_pos = <<-1.7, -686.5, 16.7>>
|
|
VECTOR v_vault_area_centre = <<10.6678, -644.2510, 15.0870>>
|
|
VECTOR v_rope_heli_attach_offset = <<0.0, 1.0, -0.25>>
|
|
VECTOR v_trolley_attach = <<0.0, 1.5444, -0.6>>
|
|
VECTOR v_trolley_left_hand_attach = <<0.0, 0.0, -0.1>>//<<-0.762, 0.559, 0.822>>
|
|
VECTOR v_trolley_right_hand_attach = <<0.0, 0.0, -0.1>>//<<-0.782, -0.539, 0.822>>
|
|
//VECTOR v_prev_winch_helper_pos = <<0.0, 0.0, 0.0>>
|
|
//VECTOR v_prev_winch_helper_dir = <<0.0, 0.0, 0.0>>
|
|
//VECTOR v_current_rocket_offset = <<0.0, 0.0, 0.0>>
|
|
VECTOR v_last_cutter_pos[4]
|
|
|
|
BLIP_INDEX blip_current_objective
|
|
BLIP_INDEX blip_gold
|
|
BLIP_INDEX blip_vault_doors[2]
|
|
BLIP_INDEX blip_chase_cops[MAX_NUM_CHOPPERS_IN_CHASE]
|
|
|
|
CAMERA_INDEX cam_main
|
|
CAMERA_INDEX cam_interp
|
|
CAMERA_INDEX cam_attach
|
|
CAMERA_INDEX cam_chase
|
|
//CAMERA_INDEX cam_lookat
|
|
//CAMERA_INDEX cam_lookat_start
|
|
//CAMERA_INDEX cam_lookat_end
|
|
|
|
//GROUP_INDEX group_player
|
|
//GROUP_INDEX group_swat_line
|
|
|
|
COVERPOINT_INDEX cover_rubble[3]
|
|
COVERPOINT_INDEX cover_shootout[4]
|
|
COVERPOINT_INDEX cover_tunnel[2]
|
|
COVERPOINT_INDEX cover_player
|
|
|
|
INTERIOR_INSTANCE_INDEX interior_tunnels[2]
|
|
INTERIOR_INSTANCE_INDEX interior_vault
|
|
|
|
OBJECT_INDEX obj_gold_trolleys[2]
|
|
OBJECT_INDEX obj_rope_weights[2]
|
|
OBJECT_INDEX obj_tunnel_crates[1] //May need to be increased.
|
|
OBJECT_INDEX obj_pallets[2]
|
|
OBJECT_INDEX obj_gold_containers[2]
|
|
OBJECT_INDEX obj_vault_gates[2]
|
|
OBJECT_INDEX obj_lesters_rpg
|
|
OBJECT_INDEX obj_single_rocket
|
|
OBJECT_INDEX obj_rope_hook
|
|
OBJECT_INDEX obj_merry_rocket_helper
|
|
OBJECT_INDEX obj_winch_cutscene_helper[2]
|
|
OBJECT_INDEX obj_cutscene_weapons[2]
|
|
|
|
PED_INDEX ped_cutscene_cops[2]
|
|
PED_INDEX ped_fake_chopper
|
|
|
|
RAYFIRE_INDEX rayfire_tunnel
|
|
RAYFIRE_INDEX rayfire_vault
|
|
|
|
ROPE_INDEX rope_cutscene
|
|
|
|
SCENARIO_BLOCKING_INDEX sbi_bank_guard
|
|
SCENARIO_BLOCKING_INDEX sbi_tunnel_hole
|
|
SCENARIO_BLOCKING_INDEX sbi_shootout
|
|
SCENARIO_BLOCKING_INDEX sbi_airfield[3]
|
|
SCENARIO_BLOCKING_INDEX sbi_chase_start
|
|
|
|
VEHICLE_INDEX veh_franklins_car
|
|
VEHICLE_INDEX veh_trevors_car
|
|
VEHICLE_INDEX veh_cutter
|
|
VEHICLE_INDEX veh_bridge_cops[4]
|
|
VEHICLE_INDEX veh_cops_car_park_1
|
|
VEHICLE_INDEX veh_cops_car_park_2
|
|
VEHICLE_INDEX veh_cops_car_park_3
|
|
VEHICLE_INDEX veh_cops_bridge_heli
|
|
VEHICLE_INDEX veh_cops_heli_bridge_2
|
|
VEHICLE_INDEX veh_cops_heli_ramp
|
|
VEHICLE_INDEX veh_cops_blockade_by_car_park[3]
|
|
VEHICLE_INDEX veh_cops_after_ramp_blockade[2]
|
|
VEHICLE_INDEX veh_cops_after_ramp_blockade_2[1]
|
|
VEHICLE_INDEX veh_cops_before_garage_blockade[2]
|
|
VEHICLE_INDEX veh_cops_before_garage_blockade_2[2]
|
|
VEHICLE_INDEX veh_chase_cam
|
|
VEHICLE_INDEX veh_pre_mission_car
|
|
VEHICLE_INDEX veh_gold_train
|
|
VEHICLE_INDEX veh_train_hover_helpers[4]
|
|
VEHICLE_INDEX veh_chase_van
|
|
VEHICLE_INDEX veh_final_trailer
|
|
VEHICLE_INDEX veh_final_car
|
|
VEHICLE_INDEX veh_merry_heli
|
|
VEHICLE_INDEX veh_car_park_cars[6]
|
|
VEHICLE_INDEX veh_cops_courtyard_heli
|
|
VEHICLE_INDEX veh_fake_chopper
|
|
VEHICLE_INDEX veh_getaway_car
|
|
|
|
|
|
MODEL_NAMES model_gold_container = PROP_GOLD_CONT_01
|
|
MODEL_NAMES model_gold_container_open = PROP_GOLD_CONT_01B
|
|
MODEL_NAMES model_large_gold_trolley = PROP_LARGE_GOLD
|
|
MODEL_NAMES model_cutter = CUTTER
|
|
MODEL_NAMES model_gold_chopper = FROGGER
|
|
MODEL_NAMES model_trevor_gold_chopper = FROGGER2
|
|
MODEL_NAMES model_military_chopper = BUZZARD
|
|
MODEL_NAMES model_cop = S_M_Y_COP_01
|
|
MODEL_NAMES model_cop_car = POLICE3
|
|
MODEL_NAMES model_cop_heli = POLMAV
|
|
MODEL_NAMES model_rope_weight = PROP_GOLF_BALL
|
|
MODEL_NAMES model_vault_gates = PROP_GOLD_VAULT_GATE_01
|
|
MODEL_NAMES model_vault_door = V_ILEV_FIN_VAULTDOOR
|
|
MODEL_NAMES model_tunnel_crate = PROP_CRATE_10A
|
|
MODEL_NAMES model_tunnel_crate_2 = PROP_PARTSBOX_01
|
|
MODEL_NAMES model_tunnel_crate_3 = prop_woodpile_01b
|
|
MODEL_NAMES model_train_engine = FREIGHT
|
|
MODEL_NAMES model_train_carriage = FREIGHTCAR
|
|
//MODEL_NAMES model_pallet = p_pallet_02a_s
|
|
MODEL_NAMES model_swat = S_M_Y_SWAT_01
|
|
MODEL_NAMES model_merry = S_M_Y_BLACKOPS_01
|
|
MODEL_NAMES model_rocket_helper = PROP_GOLF_BALL
|
|
MODEL_NAMES model_swat_van = FBI2//RIOT
|
|
MODEL_NAMES model_rope_hook = PROP_ROPE_HOOK_01
|
|
MODEL_NAMES model_start_car = ORACLE2
|
|
MODEL_NAMES model_suppressed_getaway = DUMMY_MODEL_FOR_SCRIPT
|
|
|
|
MISSION_STAGE e_mission_stage = STAGE_START_CUTSCENE
|
|
SECTION_STAGE e_section_stage = SECTION_STAGE_SETUP
|
|
ROCKET_ANIM_STATE e_rocket_anim_state = ROCKET_ANIM_USING_AI
|
|
WEAPON_TYPE e_weapon_before_cutscene = WEAPONTYPE_INVALID
|
|
ENEMY_HELI_STATE e_heli_state[3]
|
|
|
|
SELECTOR_PED_STRUCT s_selector_peds
|
|
LOCATES_HEADER_DATA s_locates_data
|
|
//ROPE_DATA s_heli_ropes[2]
|
|
//ROPE_DATA s_heli_support_ropes[4]
|
|
ROPE_DATA s_heli_ropes_new[8]
|
|
ROCKET_DATA s_rockets[4]
|
|
structTimelapse sTimelapse
|
|
//structTimelapse sFinalTimelapse
|
|
|
|
BUDDY_DATA s_crew[4]
|
|
//BUDDY_DATA s_trevor
|
|
BUDDY_DATA s_michael
|
|
BUDDY_DATA s_franklin
|
|
BUDDY_DATA s_lester
|
|
|
|
ENEMY_DATA s_tunnel_cops_1[3]
|
|
ENEMY_DATA s_tunnel_cops_2[2]
|
|
ENEMY_DATA s_tunnel_cops_2b[3]
|
|
ENEMY_DATA s_tunnel_cops_3[3]
|
|
|
|
RAPPEL_DATA s_tunnel_cops_3_rappel_data[3]
|
|
|
|
ENEMY_DATA s_tunnel_cops_new_1[8]
|
|
ENEMY_DATA s_tunnel_cops_new_2[8]
|
|
|
|
ENEMY_DATA s_cops_start[5]
|
|
ENEMY_DATA s_cops_pillars[2]
|
|
ENEMY_DATA s_cops_pillars_end[1]
|
|
ENEMY_DATA s_cops_before_bridge[1]
|
|
ENEMY_DATA s_cops_bridge_start[2]
|
|
ENEMY_DATA s_cops_bridge[4]
|
|
ENEMY_DATA s_cops_bridge_2[3]
|
|
ENEMY_DATA s_cops_bridge_flank[2]
|
|
ENEMY_DATA s_cops_heli_bridge[3]
|
|
ENEMY_DATA s_cops_heli_bridge_2[2]
|
|
ENEMY_DATA s_cops_heli_ramp[3]
|
|
ENEMY_DATA s_cops_under_bridge[4]
|
|
ENEMY_DATA s_cops_after_bridge[3]
|
|
ENEMY_DATA s_cops_car_park_1[4]
|
|
ENEMY_DATA s_cops_car_park_2[4]
|
|
ENEMY_DATA s_cops_car_park_3[4]
|
|
ENEMY_DATA s_cops_after_ramp_blockade[4]
|
|
ENEMY_DATA s_cops_after_ramp_blockade_2[2]
|
|
ENEMY_DATA s_cops_before_turn[5]
|
|
ENEMY_DATA s_cops_blockade_by_car_park[1]
|
|
ENEMY_DATA s_cops_courtyard_1[4]
|
|
ENEMY_DATA s_cops_courtyard_1b[2]
|
|
ENEMY_DATA s_cops_courtyard_2[3]
|
|
ENEMY_DATA s_cops_courtyard_heli[4]
|
|
ENEMY_DATA s_merry_heli[1]
|
|
ENEMY_DATA s_cops_after_courtyard[1]
|
|
ENEMY_DATA s_cops_before_car_park[3]
|
|
ENEMY_DATA s_cops_before_garage_blockade[4]
|
|
ENEMY_DATA s_cops_before_garage_blockade_2[4]
|
|
|
|
MISSION_VEHICLE s_start_car
|
|
MISSION_VEHICLE s_gold_choppers[2]
|
|
|
|
REL_GROUP_HASH rel_group_cops
|
|
REL_GROUP_HASH rel_cops_buddy_ignore
|
|
REL_GROUP_HASH rel_group_neutral
|
|
|
|
SELECTOR_SLOTS_ENUM e_current_buddy = SELECTOR_PED_MICHAEL
|
|
|
|
structPedsForConversation s_conversation_peds
|
|
SELECTOR_CAM_STRUCT s_selector_cam
|
|
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
|
|
//structTimelapseSettings sFinalTimelapseSettings
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID widget_debug
|
|
|
|
CONST_INT MAX_SKIP_MENU_LENGTH 16
|
|
INT i_debug_jump_stage = 0
|
|
MissionStageMenuTextStruct s_skip_menu[MAX_SKIP_MENU_LENGTH]
|
|
|
|
BOOL b_debug_record_heli_chase_setpieces
|
|
BOOL b_debug_show_chase_stats
|
|
BOOL b_debug_show_crew_state = FALSE
|
|
BOOL b_debug_test_chopper_respawning = FALSE
|
|
BOOL b_debug_show_heli_health = FALSE
|
|
BOOL b_debug_record_camera = FALSE
|
|
BOOL b_debug_playback_camera = FALSE
|
|
BOOL b_debug_force_activate = FALSE
|
|
BOOL b_debug_force_local_force = FALSE
|
|
BOOL b_debug_force_local_offset = FALSE
|
|
BOOL b_debug_force_scale_by_mass = FALSE
|
|
BOOL b_debug_draw_debug = FALSE
|
|
BOOL b_debug_record_train_heli_hover = FALSE
|
|
BOOL b_debug_playback_trigger_while_recording = FALSE
|
|
BOOl b_debug_record_gold_drop = FALSE
|
|
BOOL b_debug_switch_heli_to_ai = FALSE
|
|
BOOL b_debug_kill_enemy_helis = FALSE
|
|
|
|
INT i_debug_force_component = 0
|
|
INT i_debug_force_type = 0
|
|
|
|
FLOAT f_debug_trolley_mass = 0.0
|
|
FLOAT f_debug_trolley_gravity_factor = 0.0
|
|
FLOAT f_debug_trolley_buoyancy = 0.0
|
|
FLOAT f_debug_trolley_stabilisation = 0.0
|
|
|
|
VECTOR v_debug_entity_pos = v_zero
|
|
VECTOR v_debug_entity_rot = v_zero
|
|
VECTOR v_debug_force_dir = v_zero
|
|
VECTOR v_debug_force_offset = v_zero
|
|
|
|
VEHICLE_INDEX veh_debug
|
|
CAM_RECORDING_DATA s_cam_data
|
|
|
|
PROC CREATE_WIDGETS()
|
|
widget_debug = START_WIDGET_GROUP("Big Score 2B")
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Playback time", f_chase_playback_time)
|
|
ADD_WIDGET_BOOL("DPicked good driver", b_picked_good_driver)
|
|
//ADD_WIDGET_BOOL("Allow ambience during shootout", b_allow_ambience_during_shootout)
|
|
ADD_WIDGET_BOOL("Show crew shootout state", b_debug_show_crew_state)
|
|
ADD_WIDGET_BOOL("Playback trigger car while recording traffic", b_debug_playback_trigger_while_recording)
|
|
ADD_WIDGET_BOOL("Record heli chase set-pieces", b_debug_record_heli_chase_setpieces)
|
|
ADD_WIDGET_BOOL("Show chase stats", b_debug_show_chase_stats)
|
|
ADD_WIDGET_BOOL("Record train heli hover", b_debug_record_train_heli_hover)
|
|
ADD_WIDGET_BOOL("Test chopper respawning", b_debug_test_chopper_respawning)
|
|
ADD_WIDGET_BOOL("Show chopper health", b_debug_show_heli_health)
|
|
ADD_WIDGET_BOOL("Record a heli chase camera", b_debug_record_camera)
|
|
ADD_WIDGET_BOOL("Playback heli chase cameras", b_debug_playback_camera)
|
|
ADD_WIDGET_BOOL("Draw debug info", b_debug_draw_debug)
|
|
ADD_WIDGET_BOOL("Record gold drop", b_debug_record_gold_drop)
|
|
ADD_WIDGET_BOOL("Switch first heli to AI", b_debug_switch_heli_to_ai)
|
|
ADD_WIDGET_BOOL("Kill enemy helis", b_debug_kill_enemy_helis)
|
|
|
|
START_WIDGET_GROUP("Michael attach")
|
|
ADD_WIDGET_VECTOR_SLIDER("Pos", v_debug_entity_pos, -10.0, 10.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rot", v_debug_entity_rot, -180.0, 180.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Vehicle forces")
|
|
ADD_WIDGET_BOOL("Activate", b_debug_force_activate)
|
|
ADD_WIDGET_INT_SLIDER("Force type", i_debug_force_type, 0, 5, 1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Force direction", v_debug_force_dir, -20.0, 20.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Force offset", v_debug_force_offset, -20.0, 20.0, 0.01)
|
|
ADD_WIDGET_INT_SLIDER("Component", i_debug_force_component, 0, 50, 1)
|
|
ADD_WIDGET_BOOL("Local force", b_debug_force_local_force)
|
|
ADD_WIDGET_BOOL("Local offset", b_debug_force_local_offset)
|
|
ADD_WIDGET_BOOL("Scale by mass", b_debug_force_scale_by_mass)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Variable debugger")
|
|
ADD_WIDGET_INT_SLIDER("i_current_event", i_current_event, 0, 200, 1)
|
|
ADD_WIDGET_INT_READ_ONLY("i_current_chopper_wave", i_current_chopper_wave)
|
|
ADD_WIDGET_INT_READ_ONLY("i_player_rocket_event", i_player_rocket_event)
|
|
ADD_WIDGET_INT_READ_ONLY("i_current_lester_target", i_current_lester_target)
|
|
//ADD_WIDGET_INT_READ_ONLY("i_enemy_rocket_event", i_enemy_rocket_event)
|
|
ADD_WIDGET_INT_READ_ONLY("i_rocket_timer", i_rocket_timer)
|
|
ADD_WIDGET_INT_READ_ONLY("i_time_last_chopper_killed", i_time_last_chopper_killed)
|
|
|
|
ADD_WIDGET_STRING("")
|
|
|
|
ADD_WIDGET_INT_READ_ONLY("Franklin crew event", s_crew[CREW_FRANKLIN_ID].i_event)
|
|
ADD_WIDGET_INT_READ_ONLY("Michael crew event", s_crew[CREW_MICHAEL_ID].i_event)
|
|
|
|
ADD_WIDGET_FLOAT_READ_ONLY("f_chase_playback_speed", f_chase_playback_speed)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("f_chase_playback_time", f_chase_playback_time)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("f_heli_hover_speed", f_heli_hover_speed)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("f_crew_heli_speed", f_crew_heli_speed)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("f_cutter_playback_speed", f_cutter_playback_speed)
|
|
|
|
ADD_WIDGET_STRING("")
|
|
|
|
ADD_WIDGET_INT_READ_ONLY("i_max_take_considering_crew", i_max_take_considering_crew)
|
|
ADD_WIDGET_INT_READ_ONLY("i_current_take", i_current_take)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Trolley physics params")
|
|
ADD_WIDGET_FLOAT_SLIDER("Mass", f_debug_trolley_mass, 0.0, 10000.0, 0.001)
|
|
ADD_WIDGET_FLOAT_SLIDER("Gravity", f_debug_trolley_gravity_factor, 0.0, 10000.0, 0.001)
|
|
ADD_WIDGET_FLOAT_SLIDER("Buoyancy", f_debug_trolley_buoyancy, 0.0, 10000.0, 0.001)
|
|
ADD_WIDGET_FLOAT_SLIDER("Stabilisation", f_debug_trolley_stabilisation, -100.0, 100.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
SET_LOCATES_HEADER_WIDGET_GROUP(widget_debug)
|
|
SET_UBER_PARENT_WIDGET_GROUP(widget_debug)
|
|
SET_CAM_RECORDING_WIDGET_GROUP(s_cam_data, widget_debug)
|
|
ENDPROC
|
|
|
|
PROC DESTROY_WIDGETS()
|
|
IF DOES_WIDGET_GROUP_EXIST(widget_debug)
|
|
DELETE_WIDGET_GROUP(widget_debug)
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
//NEED TO DELETE THESE RECORDINGS
|
|
//200-250 = set-pieces.
|
|
//400-500 = set-pieces that need converting to traffic.
|
|
//250-400 = recorded traffic.
|
|
//PROC LOAD_VAN_CHASE_UBER_DATA()
|
|
//ENDPROC
|
|
|
|
PROC LOAD_HELI_CHASE_UBER_DATA()
|
|
//Order of attack in chase: 2, 1, 0
|
|
SetPieceCarPos[0] = <<1554.8298, 827.8248, 174.8822>>
|
|
SetPieceCarQuatX[0] = -0.0040
|
|
SetPieceCarQuatY[0] = 0.0024
|
|
SetPieceCarQuatZ[0] = 0.5941
|
|
SetPieceCarQuatW[0] = 0.8044
|
|
SetPieceCarRecording[0] = 13
|
|
SetPieceCarStartime[0] = 57200.0000
|
|
SetPieceCarRecordingSpeed[0] = 1.2500
|
|
SetPieceCarModel[0] = buzzard
|
|
|
|
SetPieceCarPos[1] = <<1097.6914, 1844.3870, 323.2633>>
|
|
SetPieceCarQuatX[1] = 0.0052
|
|
SetPieceCarQuatY[1] = -0.0054
|
|
SetPieceCarQuatZ[1] = 0.9983
|
|
SetPieceCarQuatW[1] = -0.0575
|
|
SetPieceCarRecording[1] = 15
|
|
SetPieceCarStartime[1] = 59300.0000
|
|
SetPieceCarRecordingSpeed[1] = 1.2500
|
|
SetPieceCarModel[1] = buzzard
|
|
|
|
SetPieceCarPos[2] = <<1091.0607, 1849.5540, 322.3521>>
|
|
SetPieceCarQuatX[2] = 0.0000
|
|
SetPieceCarQuatY[2] = 0.0034
|
|
SetPieceCarQuatZ[2] = 0.9989
|
|
SetPieceCarQuatW[2] = -0.0478
|
|
SetPieceCarRecording[2] = 14
|
|
SetPieceCarStartime[2] = 58900.0000
|
|
SetPieceCarRecordingSpeed[2] = 1.2500
|
|
SetPieceCarModel[2] = buzzard
|
|
|
|
//Have some specific set-pieces if the good gunman was picked to accompany Franklin to the tunnels.
|
|
IF b_picked_good_franklin_gunman
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC CLEAR_TRIGGERED_LABELS()
|
|
INT i = 0
|
|
REPEAT COUNT_OF(b_has_text_label_triggered) i
|
|
b_has_text_label_triggered[i] = FALSE
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
FUNC PED_INDEX CREATE_ENEMY_PED(MODEL_NAMES model, VECTOR v_pos, FLOAT f_heading, REL_GROUP_HASH group,
|
|
INT i_health = 200, INT i_armour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED, PED_TYPE e_ped_type = PEDTYPE_MISSION)
|
|
PED_INDEX ped = CREATE_PED(e_ped_type, model, v_pos, f_heading)
|
|
GIVE_WEAPON_TO_PED(ped, weapon, INFINITE_AMMO, TRUE)
|
|
SET_PED_INFINITE_AMMO(ped, TRUE, weapon)
|
|
SET_PED_MAX_HEALTH(ped, i_health)
|
|
SET_ENTITY_HEALTH(ped, i_health)
|
|
//Need to reset the armour first, in case the ped already has armour
|
|
ADD_ARMOUR_TO_PED(ped, -GET_PED_ARMOUR(ped))
|
|
ADD_ARMOUR_TO_PED(ped, i_armour)
|
|
SET_PED_DIES_WHEN_INJURED(ped, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ped, group)
|
|
SET_PED_AS_ENEMY(ped, TRUE)
|
|
SET_PED_TARGET_LOSS_RESPONSE(ped, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_DisableHurt, TRUE)
|
|
SET_PED_PATH_CAN_USE_CLIMBOVERS(ped, FALSE)
|
|
SET_PED_MONEY(ped, 0)
|
|
|
|
RETURN ped
|
|
ENDFUNC
|
|
|
|
FUNC PED_INDEX CREATE_ENEMY_PED_IN_VEHICLE(MODEL_NAMES model, VEHICLE_INDEX veh, VEHICLE_SEAT e_seat, REL_GROUP_HASH group,
|
|
INT i_health = 200, INT i_armour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED)
|
|
PED_INDEX ped
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
ped = CREATE_ENEMY_PED(model, GET_ENTITY_COORDS(veh) + <<0.0, 0.0, 3.0>>, 0.0, group, i_health, i_armour, weapon)
|
|
SET_PED_INTO_VEHICLE(ped, veh, e_seat)
|
|
ENDIF
|
|
|
|
RETURN ped
|
|
ENDFUNC
|
|
|
|
PROC SET_PED_COMBAT_PARAMS(PED_INDEX &ped, INT i_accuracy, COMBAT_MOVEMENT e_movement, COMBAT_ABILITY_LEVEL e_ability, COMBAT_RANGE e_range,
|
|
COMBAT_TARGET_LOSS_RESPONSE e_tlr)
|
|
SET_PED_COMBAT_MOVEMENT(ped, e_movement)
|
|
SET_PED_COMBAT_ABILITY(ped, e_ability)
|
|
SET_PED_COMBAT_RANGE(ped, e_range)
|
|
SET_PED_ACCURACY(ped, i_accuracy)
|
|
SET_PED_TARGET_LOSS_RESPONSE(ped, e_tlr)
|
|
ENDPROC
|
|
|
|
PROC SET_PED_COMBAT_AI(PED_INDEX &ped, INT accuracy, COMBAT_MOVEMENT movement, COMBAT_ABILITY_LEVEL ability, COMBAT_RANGE range, COMBAT_ATTRIBUTE active_attributes,
|
|
VECTOR v_defensive_sphere_pos, FLOAT f_defensive_sphere_radius = 0.0)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SET_PED_COMBAT_MOVEMENT(ped, movement)
|
|
SET_PED_COMBAT_ABILITY(ped, ability)
|
|
SET_PED_COMBAT_RANGE(ped, range)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_COVER, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_DO_DRIVEBYS, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_LEAVE_VEHICLES, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_CAN_INVESTIGATE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, active_attributes, TRUE)
|
|
SET_PED_ACCURACY(ped, accuracy)
|
|
|
|
IF f_defensive_sphere_radius != 0.0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(ped, v_defensive_sphere_pos, f_defensive_sphere_radius)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_ENEMY_PED(ENEMY_DATA &s_enemy, STRING str_name, INT i_index, BOOL b_allow_targetting = TRUE)
|
|
IF NOT IS_PED_INJURED(s_enemy.ped)
|
|
TASK_STAND_STILL(s_enemy.ped, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_enemy.ped, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(s_enemy.ped, b_allow_targetting)
|
|
s_enemy.b_is_created = TRUE
|
|
s_enemy.i_event = 0
|
|
s_enemy.i_timer = 0
|
|
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(s_enemy.ped)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL_31 debug_name = str_name
|
|
debug_name += i_index
|
|
SET_PED_NAME_DEBUG(s_enemy.ped, debug_name)
|
|
#ENDIF
|
|
|
|
#IF NOT IS_DEBUG_BUILD
|
|
str_name = str_name // to prevent an Unreferenced variable error
|
|
i_index = i_index
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_ENEMY_GROUP(ENEMY_DATA &s_enemies[], STRING name, BOOL b_allow_targetting = TRUE)
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(s_enemies) i
|
|
INITIALISE_ENEMY_PED(s_enemies[i], name, i, b_allow_targetting)
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC CLEAN_UP_ENEMY_PED(ENEMY_DATA &s_enemy, BOOL b_reset_variables = FALSE)
|
|
IF DOES_BLIP_EXIST(s_enemy.blip)
|
|
REMOVE_BLIP(s_enemy.blip)
|
|
ENDIF
|
|
|
|
//Increment the kill stat if this ped was killed by the player.
|
|
IF NOT IS_PED_INJURED(s_enemy.ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(s_enemy.ped, NORMAL_BLEND_OUT, TRUE)
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(s_enemy.ped)
|
|
ENTITY_INDEX entity_death_source = GET_PED_SOURCE_OF_DEATH(s_enemy.ped)
|
|
|
|
IF DOES_ENTITY_EXIST(entity_death_source)
|
|
AND IS_ENTITY_A_PED(entity_death_source)
|
|
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entity_death_source) = PLAYER_PED_ID()
|
|
REL_GROUP_HASH e_enemy_hash = GET_PED_RELATIONSHIP_GROUP_HASH(s_enemy.ped)
|
|
|
|
IF e_enemy_hash = rel_group_cops
|
|
OR e_enemy_hash = RELGROUPHASH_COP
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_KILLS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEANUP_AI_PED_BLIP(s_enemy.s_blip_data)
|
|
|
|
REMOVE_COVER_POINT(s_enemy.cover)
|
|
SET_PED_AS_NO_LONGER_NEEDED(s_enemy.ped)
|
|
|
|
IF b_reset_variables
|
|
s_enemy.b_is_created = FALSE
|
|
s_enemy.i_event = 0
|
|
s_enemy.i_timer = 0
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets a ped as "ignored" in combat, this means they won't be targetable and buddies won't fire at them.
|
|
/// This is useful for when creating peds in advance for shootouts, you can prevent buddies from firing at them until the right time.
|
|
/// PARAMS:
|
|
/// ped - The ped to ignore
|
|
/// b_ignore - If TRUE, the ped will be ignored.
|
|
/// rgh_neutral - If the ped is being ignored they will be placed in this group
|
|
/// rgh_enemy - If the ped is being treated as an enemy they will be placed in this group
|
|
PROC SET_PED_AS_IGNORED_IN_COMBAT(PED_INDEX ped, BOOL b_ignore, REL_GROUP_HASH &rgh_neutral, REL_GROUP_HASH &rgh_enemy)
|
|
SET_PED_CAN_BE_TARGETTED(ped, NOT b_ignore)
|
|
|
|
IF b_ignore
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ped, rgh_neutral)
|
|
ELSE
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ped, rgh_enemy)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC KILL_ENEMY_GROUP_INSTANTLY(ENEMY_DATA &s_enemies[])
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(s_enemies) i
|
|
s_enemies[i].b_is_created = TRUE
|
|
|
|
IF NOT IS_PED_INJURED(s_enemies[i].ped)
|
|
SET_ENTITY_HEALTH(s_enemies[i].ped, 0)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
FUNC INT GET_NUM_ENEMIES_ALIVE_IN_GROUP(ENEMY_DATA &s_enemies[])
|
|
INT i_num_alive = 0
|
|
INT i = 0
|
|
INT i_num_enemies_in_group = COUNT_OF(s_enemies)
|
|
|
|
IF s_enemies[0].b_is_created
|
|
REPEAT i_num_enemies_in_group i
|
|
IF s_enemies[i].b_is_created
|
|
IF NOT IS_PED_INJURED(s_enemies[i].ped)
|
|
i_num_alive++
|
|
ENDIF
|
|
ELSE
|
|
i_num_alive++
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
//Group hasn't been created yet, so just count them all as alive.
|
|
i_num_alive = i_num_enemies_in_group
|
|
ENDIF
|
|
|
|
RETURN i_num_alive
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Helper function to set up a ped's personal cover point and defensive sphere in one go.
|
|
PROC SET_PED_COVER_POINT_AND_SPHERE(PED_INDEX ped, COVERPOINT_INDEX &cover, VECTOR v_pos, FLOAT f_heading, FLOAT f_sphere_radius,
|
|
COVERPOINT_USAGE cov_usage, COVERPOINT_HEIGHT cov_height, COVERPOINT_ARC cov_arc)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF cover != NULL
|
|
REMOVE_COVER_POINT(cover)
|
|
ENDIF
|
|
cover = ADD_COVER_POINT(v_pos, f_heading, cov_usage, cov_height, cov_arc)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(ped, v_pos, f_sphere_radius, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_PED_PREFERRED_COVER_POINT(PED_INDEX &ped, COVERPOINT_INDEX &cover)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
ITEMSET_INDEX item_cover = CREATE_ITEMSET(TRUE)
|
|
ADD_TO_ITEMSET(cover, item_cover)
|
|
|
|
SET_PED_PREFERRED_COVER_SET(ped, item_cover)
|
|
DESTROY_ITEMSET(item_cover)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the player is currently hanging around where the given ped is trying to get to. This is useful for checking if peds
|
|
/// playing synced scenes need to break into AI due to the player getting in the way.
|
|
/// PARAMS:
|
|
/// ped - The ped moving towards the destination.
|
|
/// v_destination - The destination
|
|
/// f_max_dist_before_check - The ped must be within this distance of the destination before we start checking what the player is doing.
|
|
/// b_player_must_be_in_cover - If TRUE then the player must be in cover for them to be considered in the way.
|
|
FUNC BOOL IS_PLAYER_STEALING_PEDS_DESTINATION(PED_INDEX ped, VECTOR v_destination, FLOAT f_max_dist_before_check, FLOAT f_max_player_dist_from_point = 2.0, BOOL b_player_must_be_in_cover = FALSE,
|
|
BOOL b_player_must_be_closer = TRUE)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR v_ped_pos = GET_ENTITY_COORDS(ped)
|
|
|
|
FLOAT f_dist_from_ped_to_dest = VDIST(v_ped_pos, v_destination)
|
|
FLOAT f_dist_from_player_to_dest = VDIST(v_player_pos, v_destination)
|
|
|
|
IF f_dist_from_ped_to_dest < f_max_dist_before_check
|
|
IF (f_dist_from_player_to_dest < f_dist_from_ped_to_dest OR NOT b_player_must_be_closer)
|
|
AND f_dist_from_player_to_dest < f_max_player_dist_from_point
|
|
IF b_player_must_be_in_cover
|
|
IF IS_PED_IN_COVER(PLAYER_PED_ID())
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//Checks if ped1 is in front of ped2
|
|
FUNC BOOL IS_PED_BLOCKING_TARGET(PED_INDEX ped1, PED_INDEX ped2, VECTOR vTarget)
|
|
VECTOR vPedPos1 = GET_ENTITY_COORDS(ped1)
|
|
VECTOR vPedPos2 = GET_ENTITY_COORDS(ped2)
|
|
FLOAT fDistBetweenPeds = VDIST2(vPedPos1, vPedPos2)
|
|
FLOAT fHeadingBetweenPedAndTarget = GET_HEADING_FROM_VECTOR_2D(vTarget.x - vPedPos2.x, vTarget.y - vPedPos2.y)
|
|
FLOAT fHeadingBetweenPeds = GET_HEADING_FROM_VECTOR_2D(vPedPos1.x - vPedPos2.x, vPedPos1.y - vPedPos2.y)
|
|
FLOAT fHeadingDiff = ABSF(fHeadingBetweenPeds - fHeadingBetweenPedAndTarget)
|
|
|
|
IF fHeadingDiff > 180.0
|
|
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
|
|
ENDIF
|
|
|
|
IF fDistBetweenPeds < 9.0
|
|
IF fHeadingDiff < 40.0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF fHeadingDiff < 20.0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a given ped is currently hanging around where another given ped is trying to task to.
|
|
/// PARAMS:
|
|
/// pedToCheckForSteal - The ped that we want to check is stealing cover from our AI ped.
|
|
/// pedToMove - The AI ped that we want to move to the given destination.
|
|
/// vDestination - The destination
|
|
/// fMaxDistBeforeCheck - The moving ped must be within this distance of the destination before we start checking what the other ped is doing.
|
|
/// fMaxDistConsideredAsStealing - pedToCheckForSteal must be within this distance of the destination to be considered stealing it.
|
|
/// bPlayerMustBeInCover - If TRUE then the ped must be in cover for them to be considered in the way.
|
|
FUNC BOOL IS_PED_STEALING_PEDS_DESTINATION(PED_INDEX pedToCheckForSteal, PED_INDEX pedToMove, VECTOR vDestination, FLOAT fMaxDistBeforeCheck, FLOAT fMaxDistConsideredAsStealing = 2.0, BOOL bMustBeInCover = FALSE)
|
|
IF NOT IS_PED_INJURED(pedToMove)
|
|
AND NOT IS_PED_INJURED(pedToCheckForSteal)
|
|
VECTOR vPed1Pos = GET_ENTITY_COORDS(pedToCheckForSteal)
|
|
VECTOR vPed2Pos = GET_ENTITY_COORDS(pedToMove)
|
|
|
|
FLOAT fDistFromPed2ToDest = VDIST(vPed2Pos, vDestination)
|
|
FLOAT fDistFromPed1ToDest = VDIST(vPed1Pos, vDestination)
|
|
|
|
IF fDistFromPed2ToDest < fMaxDistBeforeCheck
|
|
IF fDistFromPed1ToDest < fDistFromPed2ToDest
|
|
AND fDistFromPed1ToDest < fMaxDistConsideredAsStealing
|
|
IF bMustBeInCover
|
|
IF IS_PED_IN_COVER(pedToCheckForSteal)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Tells a ped to go to cover while aiming at either a coord or a given entity, and then go into general combat.
|
|
PROC SEQ_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, INT i_time_spent_in_cover, BOOL b_shoot, VECTOR v_aim_pos,
|
|
FLOAT f_target_distance = 0.5, FLOAT f_slow_distance = 4.0, BOOL b_use_navmesh = TRUE, ENTITY_INDEX entity_aim = NULL)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
IF IS_ENTITY_DEAD(entity_aim)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
|
|
ENDIF
|
|
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, v_destination, i_time_spent_in_cover)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Tells a ped to go to cover while aiming at either a coord or a given entity.
|
|
PROC SEQ_GO_TO_COVER_WHILE_AIMING(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, INT i_time_spent_in_cover, BOOL b_shoot, VECTOR v_aim_pos,
|
|
FLOAT f_target_distance = 0.5, FLOAT f_slow_distance = 4.0, BOOL b_use_navmesh = TRUE, ENTITY_INDEX entity_aim = NULL)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF IS_ENTITY_DEAD(entity_aim)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
|
|
ENDIF
|
|
|
|
TASK_SEEK_COVER_TO_COORDS(NULL, v_destination, v_aim_pos, i_time_spent_in_cover)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Tells a ped to run to a location and then puts them into cover there
|
|
PROC SEQ_GO_TO_COVER(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, INT i_time_spent_in_cover, BOOL b_block_non_temp_events = TRUE, BOOL b_use_navmesh = TRUE,
|
|
INT i_time = DEFAULT_TIME_BEFORE_WARP, FLOAT f_radius = DEFAULT_NAVMESH_RADIUS, ENAV_SCRIPT_FLAGS nav_flags = ENAV_DEFAULT)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF b_use_navmesh
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, v_destination, move_state, i_time, f_radius, nav_flags)
|
|
ELSE
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, v_destination, move_state, i_time)
|
|
ENDIF
|
|
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, v_destination, i_time_spent_in_cover)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, b_block_non_temp_events)
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a generic sequence where a ped will go to a coord while aiming at something (either a coord or entity), then transition into combat
|
|
PROC SEQ_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, VECTOR v_aim_pos, ENTITY_INDEX entity_aim = NULL, BOOL b_shoot = TRUE,
|
|
FLOAT f_target_dist = 0.5, FLOAT f_slow_dist = 0.5, BOOL b_use_navmesh = TRUE,
|
|
PED_INDEX ped_to_attack = NULL, FLOAT f_combat_range = 100.0)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
IF IS_ENTITY_DEAD(entity_aim)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped_to_attack)
|
|
TASK_COMBAT_PED(NULL, ped_to_attack)
|
|
ELSE
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, f_combat_range)
|
|
ENDIF
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a generic sequence where a ped will go to a coord while aiming at something (either a coord or entity), then either continue aiming or shoot at the target.
|
|
PROC SEQ_GO_TO_COORD_WHILE_AIMING_THEN_AIM(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, VECTOR v_aim_pos, ENTITY_INDEX entity_aim = NULL, BOOL b_shoot = TRUE,
|
|
FLOAT f_target_dist = 0.5, FLOAT f_slow_dist = 0.5, BOOL b_use_navmesh = TRUE, BOOL b_block_non_temp_events = TRUE,
|
|
BOOL b_shoot_when_stopped = TRUE, FIRING_TYPE fire_type = FIRING_TYPE_RANDOM_BURSTS)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF IS_ENTITY_DEAD(entity_aim)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
|
|
|
|
IF b_shoot_when_stopped
|
|
TASK_SHOOT_AT_COORD(NULL, v_aim_pos, -1, fire_type)
|
|
ELSE
|
|
TASK_AIM_GUN_AT_COORD(NULL, v_aim_pos, -1)
|
|
ENDIF
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
|
|
|
|
IF b_shoot_when_stopped
|
|
TASK_SHOOT_AT_ENTITY(NULL, entity_aim, -1, fire_type)
|
|
ELSE
|
|
TASK_AIM_GUN_AT_ENTITY(NULL, entity_aim, -1)
|
|
ENDIF
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, b_block_non_temp_events)
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Shorthand function for checking multiple peds against a single angled area at the same time.
|
|
FUNC BOOL ARE_PEDS_IN_ANGLED_AREA(PED_INDEX ped_1, PED_INDEX ped_2, PED_INDEX ped_3, VECTOR v_pos_1, VECTOR v_pos_2, FLOAT f_width)
|
|
IF NOT IS_PED_INJURED(ped_1)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(ped_1, v_pos_1, v_pos_2, f_width, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped_2)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(ped_2, v_pos_1, v_pos_2, f_width, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped_3)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(ped_3, v_pos_1, v_pos_2, f_width, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Shorthand function for checking multiple peds against a single area at the same time.
|
|
FUNC BOOL ARE_PEDS_AT_COORD(PED_INDEX ped_1, PED_INDEX ped_2, PED_INDEX ped_3, VECTOR v_pos, VECTOR v_size)
|
|
IF NOT IS_PED_INJURED(ped_1)
|
|
IF IS_ENTITY_AT_COORD(ped_1, v_pos, v_size, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped_2)
|
|
IF IS_ENTITY_AT_COORD(ped_2, v_pos, v_size, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped_3)
|
|
IF IS_ENTITY_AT_COORD(ped_3, v_pos, v_size, FALSE, TRUE, TM_ANY)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
//PURPOSE: triggers multiple bullet hits around an entity at given intervals.
|
|
//AUTHOR: Ross Wallace
|
|
PROC DO_EXCITING_NEAR_BULLET_MISS_ON_ENTITY(ENTITY_INDEX entityToMiss, ENTITY_INDEX sourceOfBullets, INT &iControlTimer, VECTOR sourceOffset,
|
|
INT timeBetweenBullets = 60, FLOAT minXrange = -3.9, FLOAT maxXrange = -1.0, FLOAT minYRange = -2.9, FLOAT maxYrange = 3.9)
|
|
INT currentBulletTime = GET_GAME_TIMER()
|
|
VECTOR bulletHit
|
|
VECTOR bulletOrigin
|
|
|
|
IF ((currentBulletTime - iControlTimer) > timeBetweenBullets)
|
|
IF NOT IS_ENTITY_DEAD(entityToMiss)
|
|
AND NOT IS_ENTITY_DEAD(sourceOfBullets)
|
|
bulletHit = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityToMiss, <<GET_RANDOM_FLOAT_IN_RANGE(minXrange, maxXrange), GET_RANDOM_FLOAT_IN_RANGE(minYRange, maxYrange), 0.0>>)
|
|
bulletOrigin = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sourceOfBullets, sourceOffset)
|
|
GET_GROUND_Z_FOR_3D_COORD(bulletHit, bulletHit.z)
|
|
SHOOT_SINGLE_BULLET_BETWEEN_COORDS(bulletOrigin, bulletHit, 1)
|
|
iControlTimer = currentBulletTime
|
|
|
|
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
//DRAW_DEBUG_SPHERE(bulletOrigin, 0.2)
|
|
//DRAW_DEBUG_SPHERE(bulletHit, 0.2)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_OBJECT(OBJECT_INDEX &obj, BOOL b_force_delete = FALSE)
|
|
IF DOES_ENTITY_EXIST(obj)
|
|
IF IS_ENTITY_ATTACHED(obj)
|
|
DETACH_ENTITY(obj)
|
|
ENDIF
|
|
|
|
IF b_force_delete
|
|
DELETE_OBJECT(obj)
|
|
ELSE
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(obj)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_VEHICLE(VEHICLE_INDEX &veh, BOOL b_force_delete = FALSE)
|
|
IF DOES_ENTITY_EXIST(veh)
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(veh, NORMAL_BLEND_OUT, TRUE)
|
|
|
|
IF IS_ENTITY_ATTACHED(veh)
|
|
DETACH_ENTITY(veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh, FALSE)
|
|
IF b_force_delete
|
|
DELETE_VEHICLE(veh)
|
|
ELSE
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_PED(PED_INDEX &ped, BOOL b_force_delete = FALSE)
|
|
IF DOES_ENTITY_EXIST(ped)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(ped, NORMAL_BLEND_OUT, TRUE)
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(ped, TRUE)
|
|
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(ped)
|
|
IF IS_ENTITY_ATTACHED_TO_ANY_OBJECT(ped)
|
|
OR IS_ENTITY_ATTACHED_TO_ANY_PED(ped)
|
|
OR IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(ped)
|
|
DETACH_ENTITY(ped)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(ped)
|
|
SET_ENTITY_COLLISION(ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PED_KEEP_TASK(ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF b_force_delete
|
|
DELETE_PED(ped)
|
|
ELSE
|
|
SET_PED_AS_NO_LONGER_NEEDED(ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ENEMY_GROUP(ENEMY_DATA &peds[], BOOL b_force_delete = FALSE, BOOL b_put_into_combat_on_cleanup = TRUE)
|
|
INT i = 0
|
|
REPEAT COUNT_OF(peds) i
|
|
IF DOES_BLIP_EXIST(peds[i].blip)
|
|
REMOVE_BLIP(peds[i].blip)
|
|
ENDIF
|
|
|
|
CLEANUP_AI_PED_BLIP(peds[i].s_blip_data)
|
|
|
|
REMOVE_COVER_POINT(peds[i].cover)
|
|
|
|
IF b_put_into_combat_on_cleanup
|
|
AND NOT b_force_delete
|
|
AND NOT IS_PED_INJURED(peds[i].ped)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(peds[i].ped, 200.0)
|
|
SET_PED_KEEP_TASK(peds[i].ped, TRUE)
|
|
ENDIF
|
|
|
|
REMOVE_PED(peds[i].ped, b_force_delete)
|
|
|
|
peds[i].b_is_created = FALSE
|
|
peds[i].i_event = 0
|
|
peds[i].i_rope_event = 0
|
|
peds[i].i_timer = 0
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Mission vehicles are structs containing a vehicle and some extra data associated with that vehicle (e.g. blips, timers, etc). This cleans up the vehicle and resets
|
|
/// the extra data.
|
|
PROC REMOVE_MISSION_VEHICLE(MISSION_VEHICLE &s_veh, BOOl b_force_delete = FALSE)
|
|
IF DOES_BLIP_EXIST(s_veh.blip)
|
|
REMOVE_BLIP(s_veh.blip)
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE(s_veh.veh, b_force_delete)
|
|
|
|
s_veh.i_event = 0
|
|
ENDPROC
|
|
|
|
PROC SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(VEHICLE_INDEX &veh, FLOAT f_time)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh, f_time - GET_TIME_POSITION_IN_RECORDING(veh))
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Based on Ross's proc in rural_bank_heist.sc: applies extra damage to vehicle components as it is shot.
|
|
PROC DO_VEHICLE_DAMAGE_WHEN_SHOT(VEHICLE_INDEX &veh)
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, 1.4000, 0.1000>>), 0.738)
|
|
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_DAMAGE(veh, <<-1.0000, 1.0000, 0.2000>>, 100.0, 100.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, 1.4000, 0.1000>>), 0.738)
|
|
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_DAMAGE(veh, <<1.0000, 1.0000, 0.2000>>, 100.0, 100.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, -1.4000, 0.1000>>), 0.738)
|
|
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_DAMAGE(veh, <<-1.0000, -1.0000, 0.2000>>, 100.0, 100.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, -1.5000, 0.1000>>), 0.738)
|
|
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_DAMAGE(veh, <<1.0000, -1.0000, 0.2000>>, 100.0, 100.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_FRONT_LEFT)
|
|
AND NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_REAR_LEFT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, 0.0000, 0.1000>>), 0.538)
|
|
INT iDoorToBreak = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
IF iDoorToBreak = 0
|
|
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_FRONT_LEFT)
|
|
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_FRONT_LEFT, FALSE)
|
|
ELSE
|
|
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_REAR_LEFT)
|
|
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_REAR_LEFT, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_FRONT_RIGHT)
|
|
AND NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_REAR_RIGHT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, 0.0000, 0.1000>>), 0.538)
|
|
INT iDoorToBreak = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
IF iDoorToBreak = 0
|
|
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_FRONT_RIGHT)
|
|
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
ELSE
|
|
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_REAR_RIGHT)
|
|
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_REAR_RIGHT, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Converges a value towards a given destination, by adding/removing a given amount.
|
|
PROC CONVERGE_VALUE(FLOAT &val, FLOAT desired_val, FLOAT amount_to_converge, BOOL adjust_for_framerate = FALSE)
|
|
IF val != desired_val
|
|
FLOAT converge_amount_this_frame = amount_to_converge
|
|
IF adjust_for_framerate
|
|
converge_amount_this_frame = 0.0 +@ (amount_to_converge * 30.0)
|
|
ENDIF
|
|
|
|
IF val - desired_val > converge_amount_this_frame
|
|
val -= converge_amount_this_frame
|
|
ELIF val - desired_val < -converge_amount_this_frame
|
|
val += converge_amount_this_frame
|
|
ELSE
|
|
val = desired_val
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Checks the three player chars and makes sure they're assigned the correct speakers in dialogue. This is useful for when switches occur, as these
|
|
///make current speaker peds invalid.
|
|
PROC REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF s_conversation_peds.PedInfo[0].Index != s_selector_peds.pedID[SELECTOR_PED_MICHAEL]
|
|
OR NOT s_conversation_peds.PedInfo[0].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, s_selector_peds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF s_conversation_peds.PedInfo[0].Index != PLAYER_PED_ID()
|
|
OR NOT s_conversation_peds.PedInfo[0].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ENDIF
|
|
ELSE
|
|
IF s_conversation_peds.PedInfo[0].Index != NULL
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF s_conversation_peds.PedInfo[1].Index != s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]
|
|
OR NOT s_conversation_peds.PedInfo[1].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
IF s_conversation_peds.PedInfo[1].Index != PLAYER_PED_ID()
|
|
OR NOT s_conversation_peds.PedInfo[1].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
ENDIF
|
|
ELSE
|
|
IF s_conversation_peds.PedInfo[1].Index != NULL
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
IF s_conversation_peds.PedInfo[2].Index != s_selector_peds.pedID[SELECTOR_PED_TREVOR]
|
|
OR NOT s_conversation_peds.PedInfo[2].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, s_selector_peds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF s_conversation_peds.PedInfo[2].Index != PLAYER_PED_ID()
|
|
OR NOT s_conversation_peds.PedInfo[2].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, PLAYER_PED_ID(), "TREVOR")
|
|
ENDIF
|
|
ELSE
|
|
IF s_conversation_peds.PedInfo[2].Index != NULL
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Creates a gunman conversation: each conversation in D* contains a postfix referring to which specific gunman speaks the line.
|
|
FUNC BOOL CREATE_GUNMAN_CONVERSATION(INT iGunmanID, PED_INDEX pedGunman, structPedsForConversation &sConvData, STRING strTextBlock, STRING strConvRootWithoutPostfix,
|
|
enumConversationPriority ePriority = CONV_PRIORITY_MEDIUM, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
|
|
TEXT_LABEL strConvRoot = strConvRootWithoutPostfix
|
|
TEXT_LABEL strCrewVoiceName = ""
|
|
|
|
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, iGunmanID)
|
|
|
|
SWITCH eCrewID
|
|
CASE CM_GUNMAN_G_GUSTAV
|
|
strConvRoot += "_GM"
|
|
strCrewVoiceName = "GUSTAVO"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_G_KARL
|
|
strConvRoot += "_KA"
|
|
strCrewVoiceName = "KARL"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_G_PACKIE_UNLOCK
|
|
strConvRoot += "_PM"
|
|
strCrewVoiceName = "PACKIE"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_G_CHEF_UNLOCK
|
|
strConvRoot += "_CH"
|
|
strCrewVoiceName = "CHEF"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_M_HUGH
|
|
strConvRoot += "_HW"
|
|
strCrewVoiceName = "HUGH"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_B_NORM
|
|
strConvRoot += "_NR"
|
|
strCrewVoiceName = "NORM"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_B_DARYL
|
|
strConvRoot += "_DJ"
|
|
strCrewVoiceName = "DARYL"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strCrewVoiceName)
|
|
TEXT_LABEL strRandomRoot = strConvRoot
|
|
strRandomRoot += "_01"
|
|
TEXT_LABEL strNonRandomRoot = strConvRoot
|
|
strNonRandomRoot += "_1"
|
|
|
|
IF DOES_TEXT_LABEL_EXIST(strRandomRoot)
|
|
OR DOES_TEXT_LABEL_EXIST(strNonRandomRoot)
|
|
IF NOT IS_PED_INJURED(pedGunman)
|
|
IF VDIST2(GET_ENTITY_COORDS(pedGunman), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 3600.0
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, pedGunman, strCrewVoiceName)
|
|
ELSE
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
|
|
ENDIF
|
|
ELSE
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConvData, strTextBlock, strConvRoot, ePriority, eSubtitles)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
//If the label doesn't exist then just return TRUE.
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL CREATE_DRIVER_CONVERSATION(INT iDriverID, PED_INDEX pedDriver, structPedsForConversation &sConvData, STRING strTextBlock, STRING strConvRootWithoutPostfix,
|
|
enumConversationPriority ePriority = CONV_PRIORITY_MEDIUM, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
|
|
TEXT_LABEL strConvRoot = strConvRootWithoutPostfix
|
|
TEXT_LABEL strCrewVoiceName = ""
|
|
|
|
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, iDriverID)
|
|
|
|
SWITCH eCrewID
|
|
CASE CM_DRIVER_G_EDDIE
|
|
strConvRoot += "_ET"
|
|
strCrewVoiceName = "EDDIE"
|
|
BREAK
|
|
|
|
CASE CM_DRIVER_G_TALINA_UNLOCK
|
|
strConvRoot += "_TM"
|
|
strCrewVoiceName = "TALINA"
|
|
BREAK
|
|
|
|
CASE CM_DRIVER_B_KARIM
|
|
strConvRoot += "_KD"
|
|
strCrewVoiceName = "KARIM"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strCrewVoiceName)
|
|
TEXT_LABEL strRandomRoot = strConvRoot
|
|
strRandomRoot += "_01"
|
|
TEXT_LABEL strNonRandomRoot = strConvRoot
|
|
strNonRandomRoot += "_1"
|
|
|
|
IF DOES_TEXT_LABEL_EXIST(strRandomRoot)
|
|
OR DOES_TEXT_LABEL_EXIST(strNonRandomRoot)
|
|
IF DOES_ENTITY_EXIST(pedDriver)
|
|
IF sConvData.PedInfo[4].Index != pedDriver
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, pedDriver, strCrewVoiceName)
|
|
ENDIF
|
|
ELSE
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConvData, strTextBlock, strConvRoot, ePriority, eSubtitles)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
PROC REMOVE_ALL_SHOOTOUT_ENEMIES()
|
|
REMOVE_ENEMY_GROUP(s_cops_heli_bridge)
|
|
REMOVE_ENEMY_GROUP(s_cops_heli_bridge_2)
|
|
REMOVE_ENEMY_GROUP(s_cops_heli_ramp)
|
|
REMOVE_ENEMY_GROUP(s_cops_after_bridge)
|
|
REMOVE_ENEMY_GROUP(s_cops_pillars)
|
|
REMOVE_ENEMY_GROUP(s_cops_pillars_end)
|
|
REMOVE_ENEMY_GROUP(s_cops_start)
|
|
REMOVE_ENEMY_GROUP(s_cops_under_bridge)
|
|
REMOVE_ENEMY_GROUP(s_cops_after_ramp_blockade)
|
|
REMOVE_ENEMY_GROUP(s_cops_bridge_start)
|
|
REMOVE_ENEMY_GROUP(s_cops_bridge)
|
|
REMOVE_ENEMY_GROUP(s_cops_bridge_2)
|
|
REMOVE_ENEMY_GROUP(s_cops_bridge_flank)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_bridge)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_turn)
|
|
REMOVE_ENEMY_GROUP(s_cops_blockade_by_car_park)
|
|
REMOVE_ENEMY_GROUP(s_cops_courtyard_1)
|
|
REMOVE_ENEMY_GROUP(s_cops_courtyard_2)
|
|
REMOVE_ENEMY_GROUP(s_cops_car_park_1)
|
|
REMOVE_ENEMY_GROUP(s_cops_car_park_2)
|
|
REMOVE_ENEMY_GROUP(s_cops_car_park_3)
|
|
REMOVE_ENEMY_GROUP(s_cops_after_courtyard)
|
|
REMOVE_ENEMY_GROUP(s_merry_heli)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_car_park)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_garage_blockade)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_garage_blockade_2)
|
|
|
|
REMOVE_VEHICLE(veh_cops_bridge_heli)
|
|
REMOVE_VEHICLE(veh_cops_heli_bridge_2)
|
|
REMOVE_VEHICLE(veh_cops_heli_ramp)
|
|
REMOVE_VEHICLE(veh_cops_car_park_1)
|
|
REMOVE_VEHICLE(veh_cops_car_park_2)
|
|
REMOVE_VEHICLE(veh_cops_car_park_3)
|
|
REMOVE_VEHICLE(veh_merry_heli)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(veh_bridge_cops) i
|
|
REMOVE_VEHICLE(veh_bridge_cops[i])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_car_park_cars) i
|
|
REMOVE_VEHICLE(veh_car_park_cars[i])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_after_ramp_blockade) i
|
|
REMOVE_VEHICLE(veh_cops_after_ramp_blockade[i])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_before_garage_blockade) i
|
|
REMOVE_VEHICLE(veh_cops_before_garage_blockade[i])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_before_garage_blockade_2) i
|
|
REMOVE_VEHICLE(veh_cops_before_garage_blockade_2[i])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_blockade_by_car_park) i
|
|
REMOVE_VEHICLE(veh_cops_blockade_by_car_park[i])
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_car)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
ENDPROC
|
|
|
|
//Loops a vehicle recording on a heli to make it look like it's hovering.
|
|
//NOTE: The proc assumes that a recordining is already playing on the vehicle.
|
|
PROC HOVER_HELI_USING_RECORDING(VEHICLE_INDEX veh_heli, FLOAT &f_playback_speed, FLOAT f_min_time, FLOAT f_max_time)
|
|
IF IS_VEHICLE_DRIVEABLE(veh_heli)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_heli)
|
|
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_heli)
|
|
|
|
IF f_max_time - f_playback_time < 4000.0
|
|
CONVERGE_VALUE(f_playback_speed, -1.0, 0.5, TRUE)
|
|
ENDIF
|
|
|
|
IF f_playback_time < f_min_time
|
|
CONVERGE_VALUE(f_playback_speed, 1.0, 0.5, TRUE)
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(veh_heli, f_playback_speed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_FADE_OUT_WITH_WAIT()
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_FADE_IN_WITH_WAIT()
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_BLIPS()
|
|
IF DOES_BLIP_EXIST(blip_current_objective)
|
|
REMOVE_BLIP(blip_current_objective)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(blip_gold)
|
|
REMOVE_BLIP(blip_gold)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_michael.blip)
|
|
REMOVE_BLIP(s_michael.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_franklin.blip)
|
|
REMOVE_BLIP(s_franklin.blip)
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(s_crew) i
|
|
IF DOES_BLIP_EXIST(s_crew[i].blip)
|
|
REMOVE_BLIP(s_crew[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(blip_vault_doors) i
|
|
IF DOES_BLIP_EXIST(blip_vault_doors[i])
|
|
REMOVE_BLIP(blip_vault_doors[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(blip_chase_cops) i
|
|
IF DOES_BLIP_EXIST(blip_chase_cops[i])
|
|
REMOVE_BLIP(blip_chase_cops[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(s_gold_choppers) i
|
|
IF DOES_BLIP_EXIST(s_gold_choppers[i].blip)
|
|
REMOVE_BLIP(s_gold_choppers[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_OBJECTS(BOOL b_force_delete = FALSE)
|
|
INT i = 0
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
REPEAT COUNT_OF(obj_gold_trolleys) i
|
|
REMOVE_OBJECT(obj_gold_trolleys[i], b_force_delete)
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(obj_rope_weights) i
|
|
REMOVE_OBJECT(obj_rope_weights[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(obj_pallets) i
|
|
REMOVE_OBJECT(obj_pallets[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
REPEAT COUNT_OF(obj_gold_containers) i
|
|
REMOVE_OBJECT(obj_gold_containers[i], b_force_delete)
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_rockets) i
|
|
REMOVE_OBJECT(s_rockets[i].obj, b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(obj_tunnel_crates) i
|
|
REMOVE_OBJECT(obj_tunnel_crates[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REMOVE_OBJECT(obj_vault_gates[0], FALSE)
|
|
REMOVE_OBJECT(obj_vault_gates[1], FALSE)
|
|
REMOVE_OBJECT(obj_cutscene_weapons[0], TRUE)
|
|
REMOVE_OBJECT(obj_cutscene_weapons[1], TRUE)
|
|
REMOVE_OBJECT(obj_rope_hook, TRUE)
|
|
REMOVE_OBJECT(obj_winch_cutscene_helper[0], TRUE)
|
|
REMOVE_OBJECT(obj_winch_cutscene_helper[1], TRUE)
|
|
REMOVE_OBJECT(obj_lesters_rpg, b_force_delete)
|
|
REMOVE_OBJECT(obj_single_rocket, b_force_delete)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_PEDS(BOOL b_force_delete = FALSE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], b_force_delete)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], b_force_delete)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], b_force_delete)
|
|
REMOVE_PED(s_lester.ped, b_force_delete)
|
|
REMOVE_PED(ped_fake_chopper, TRUE)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(s_crew) i
|
|
REMOVE_PED(s_crew[i].ped, b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(ped_cutscene_cops) i
|
|
REMOVE_PED(ped_cutscene_cops[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_1, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_2, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_2b, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_3, b_force_delete)
|
|
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_new_1, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_new_2, b_force_delete)
|
|
|
|
REMOVE_ENEMY_GROUP(s_cops_heli_bridge, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_heli_bridge_2, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_heli_ramp, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_after_bridge, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_pillars, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_pillars_end, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_start, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_under_bridge, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_after_ramp_blockade, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_after_ramp_blockade_2, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_bridge_flank, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_bridge_start, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_bridge, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_bridge_2, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_bridge, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_courtyard_1, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_courtyard_1b, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_courtyard_2, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_courtyard_heli, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_merry_heli, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_after_courtyard, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_car_park_1, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_car_park_2, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_car_park_3, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_car_park, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_garage_blockade, b_force_delete)
|
|
REMOVE_ENEMY_GROUP(s_cops_before_garage_blockade_2, b_force_delete)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_VEHICLES(BOOL b_force_delete = FALSE)
|
|
REMOVE_VEHICLE(veh_franklins_car, b_force_delete)
|
|
REMOVE_VEHICLE(veh_trevors_car, b_force_delete)
|
|
REMOVE_VEHICLE(veh_cutter, b_force_delete)
|
|
REMOVE_VEHICLE(veh_cops_bridge_heli, b_force_delete)
|
|
REMOVE_VEHICLE(veh_cops_heli_bridge_2, b_force_delete)
|
|
REMOVE_VEHICLE(veh_chase_cam, TRUE)
|
|
REMOVE_VEHICLE(veh_pre_mission_car, FALSE)
|
|
REMOVE_VEHICLE(veh_chase_van, b_force_delete)
|
|
REMOVE_VEHICLE(veh_final_trailer, b_force_delete)
|
|
REMOVE_VEHICLE(veh_final_car, b_force_delete)
|
|
REMOVE_VEHICLE(veh_merry_heli, b_force_delete)
|
|
REMOVE_VEHICLE(veh_cops_car_park_1, b_force_delete)
|
|
REMOVE_VEHICLE(veh_cops_car_park_2, b_force_delete)
|
|
REMOVE_VEHICLE(veh_cops_car_park_3, b_force_delete)
|
|
REMOVE_VEHICLE(veh_cops_courtyard_heli, b_force_delete)
|
|
REMOVE_VEHICLE(veh_cops_heli_ramp, b_force_delete)
|
|
REMOVE_VEHICLE(veh_fake_chopper, TRUE)
|
|
REMOVE_VEHICLE(veh_getaway_car)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
REMOVE_VEHICLE(veh_debug, TRUE)
|
|
#ENDIF
|
|
|
|
REMOVE_MISSION_VEHICLE(s_start_car, b_force_delete)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(s_gold_choppers) i
|
|
REMOVE_MISSION_VEHICLE(s_gold_choppers[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_bridge_cops) i
|
|
REMOVE_VEHICLE(veh_bridge_cops[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_train_hover_helpers) i
|
|
REMOVE_VEHICLE(veh_train_hover_helpers[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_after_ramp_blockade) i
|
|
REMOVE_VEHICLE(veh_cops_after_ramp_blockade[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_after_ramp_blockade_2) i
|
|
REMOVE_VEHICLE(veh_cops_after_ramp_blockade_2[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_before_garage_blockade) i
|
|
REMOVE_VEHICLE(veh_cops_before_garage_blockade[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_before_garage_blockade_2) i
|
|
REMOVE_VEHICLE(veh_cops_before_garage_blockade_2[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_cops_blockade_by_car_park) i
|
|
REMOVE_VEHICLE(veh_cops_blockade_by_car_park[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(SetPieceCarID) i
|
|
REMOVE_VEHICLE(SetPieceCarID[i], b_force_delete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(veh_car_park_cars) i
|
|
REMOVE_VEHICLE(veh_car_park_cars[i], b_force_delete)
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_CAMERAS()
|
|
IF DOES_CAM_EXIST(cam_main)
|
|
DESTROY_CAM(cam_main)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(cam_attach)
|
|
DESTROY_CAM(cam_attach)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(cam_interp)
|
|
DESTROY_CAM(cam_interp)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(cam_chase)
|
|
DESTROY_CAM(cam_chase)
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_WIDESCREEN_BORDERS(FALSE, 0)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDPROC
|
|
|
|
FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR vRot)
|
|
RETURN <<-SIN(vRot.z) * COS(vRot.x), COS(vRot.z) * COS(vRot.x), SIN(vRot.x)>>
|
|
ENDFUNC
|
|
|
|
//Creates/removes the bank vault gates as forced objects.
|
|
PROC SET_VAULT_GATES_AS_FORCED_OBJECTS(BOOL b_set_active, BOOL b_is_skipping_stages = FALSE)
|
|
IF b_set_active
|
|
CREATE_FORCED_OBJECT(v_vault_gate_pos_1, 20.0, model_vault_gates, TRUE)
|
|
CREATE_FORCED_OBJECT(v_vault_gate_pos_2, 20.0, model_vault_gates, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2b.sc - Created forced objects for vault.")
|
|
#ENDIF
|
|
ELSE
|
|
REMOVE_FORCED_OBJECT(v_vault_gate_pos_1, 20.0, model_vault_gates)
|
|
REMOVE_FORCED_OBJECT(v_vault_gate_pos_2, 20.0, model_vault_gates)
|
|
|
|
IF b_is_skipping_stages
|
|
CLEAR_AREA_OF_OBJECTS(v_vault_gate_pos_1, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2b.sc - Removed forced objects for vault.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Grabs the vault gate objects and sets them as owned by the script, this is so they can be kept in the correct state if the player leaves the area.
|
|
PROC GRAB_VAULT_GATES(BOOL b_warp_to_start_pos = TRUE)
|
|
IF NOT DOES_ENTITY_EXIST(obj_vault_gates[0])
|
|
obj_vault_gates[0] = GET_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_1, 20.0, model_vault_gates)
|
|
|
|
//If we've just grabbed the door make sure it's in the right spot.
|
|
IF b_warp_to_start_pos
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_vault_gates[0], v_vault_gate_pos_1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(obj_vault_gates[1])
|
|
obj_vault_gates[1] = GET_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_2, 20.0, model_vault_gates)
|
|
|
|
IF b_warp_to_start_pos
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_vault_gates[1], v_vault_gate_pos_2)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Moves the vault gates so they don't get in the way of enemy peds during the shootout.
|
|
PROC REPOSITION_VAULT_GATES_FOR_SHOOTOUT()
|
|
OBJECT_INDEX obj_temp_gate[2]
|
|
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
|
|
obj_temp_gate[0] = obj_vault_gates[0]
|
|
ELSE
|
|
obj_temp_gate[0] = GET_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_1, 20.0, model_vault_gates, FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(obj_temp_gate[0])
|
|
SET_ENTITY_COORDS(obj_temp_gate[0], <<1.883441,-659.381042,15.201376>>)
|
|
SET_ENTITY_ROTATION(obj_temp_gate[0], <<0.0,-89.415482,157.947311>>)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
|
|
obj_temp_gate[1] = obj_vault_gates[1]
|
|
ELSE
|
|
obj_temp_gate[1] = GET_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_2, 20.0, model_vault_gates, FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(obj_temp_gate[1])
|
|
SET_ENTITY_COORDS(obj_temp_gate[1], <<9.199343,-663.593689,15.201376>>)
|
|
SET_ENTITY_ROTATION(obj_temp_gate[1], <<0.0,-89.901085,18.381920>>)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(PED_INDEX ped)
|
|
IF NOT IS_PED_RAGDOLL(ped)
|
|
AND NOT IS_PED_GETTING_UP(ped)
|
|
AND NOT IS_PED_IN_COMBAT(ped)
|
|
AND NOT IS_PED_RELOADING(ped)
|
|
AND IS_PED_WEAPON_READY_TO_SHOOT(ped)
|
|
WEAPON_TYPE eCurrentWeapon
|
|
WEAPON_GROUP eCurrentGroup
|
|
|
|
GET_CURRENT_PED_WEAPON(ped, eCurrentWeapon)
|
|
eCurrentGroup = GET_WEAPONTYPE_GROUP(eCurrentWeapon)
|
|
|
|
IF eCurrentGroup != WEAPONGROUP_MELEE
|
|
AND eCurrentGroup != WEAPONGROUP_INVALID
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC DISABLE_ROADS_FOR_CITY_SHOOTOUT(BOOL bDisable)
|
|
IF bDisable
|
|
SET_ROADS_IN_ANGLED_AREA(<<-73.934547,-579.552673,39.355595>>, <<-164.055222,-830.317749,27.963964>>, 42.250000, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<-280.868896,-836.965088,38.505768>>, <<-226.580948,-691.600830,30.429825>>, 42.250000, FALSE, FALSE)
|
|
ELSE
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-73.934547,-579.552673,39.355595>>, <<-164.055222,-830.317749,27.963964>>, 42.250000)
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-280.868896,-836.965088,38.505768>>, <<-226.580948,-691.600830,30.429825>>, 42.250000)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Returns if the cutter is spinning.
|
|
FUNC BOOL IS_CUTTER_SPINNING()
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
///Returns whether a ped is touching the blades at the front of the cutter, if so the ped needs to react (e.g. kill them).
|
|
FUNC BOOL IS_PED_TOUCHING_CUTTER_BLADES(PED_INDEX ped)
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
AND NOT IS_PED_INJURED(ped)
|
|
IF IS_ENTITY_TOUCHING_ENTITY(ped, veh_cutter)
|
|
VECTOR v_offset_1 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<-2.1, 6.85, -0.5>>)
|
|
VECTOR v_offset_2 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<2.1, 6.85, 4.0>>)
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(ped, v_offset_1, v_offset_2, 2.0)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//Forces a stop of the cutter blades, resetting the anims and audio.
|
|
PROC STOP_CUTTER_SPINNING()
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
|
|
OR IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_spinup")
|
|
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spindown", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
|
|
STOP_SOUND(i_cutter_sound_id)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// Handles the spinning of the cutter blades if the player is driving it.
|
|
PROC UPDATE_CUTTER_SPINNING()
|
|
IF NOT IS_ENTITY_DEAD(veh_cutter)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
REQUEST_ANIM_DICT(str_anim_cutter)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), veh_cutter, TRUE)
|
|
SET_FOLLOW_VEHICLE_CAM_HIGH_ANGLE_MODE_THIS_UPDATE(FALSE)
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL_ABILITY_FRANKLIN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
ENDIF
|
|
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_01")
|
|
AND REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_02")
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), veh_cutter)
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
b_spin_cutter_blades = NOT b_spin_cutter_blades
|
|
ENDIF
|
|
ELSE
|
|
b_spin_cutter_blades = FALSE
|
|
ENDIF
|
|
|
|
IF b_spin_cutter_blades
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_spinup")
|
|
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spinup", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
|
|
ELIF GET_ENTITY_ANIM_CURRENT_TIME(veh_cutter, str_anim_cutter, "cutter_spinup") > 0.99
|
|
PLAY_ENTITY_ANIM(veh_cutter, "cutter_run", str_anim_cutter, NORMAL_BLEND_IN, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_SOUND_FINISHED(i_cutter_sound_id)
|
|
PLAY_SOUND_FROM_ENTITY(i_cutter_sound_id, "CUTTER", veh_cutter, "BIG_SCORE_3B_SOUNDS")
|
|
ENDIF
|
|
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 100)
|
|
ELSE
|
|
IF IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
|
|
OR IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_spinup")
|
|
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spindown", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
|
|
STOP_SOUND(i_cutter_sound_id)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_TROLLEY_ARM_IK(PED_INDEX ped, OBJECT_INDEX obj_trolley, BOOL b_instant_blend = FALSE)
|
|
INT i_ik_blend_time = -1
|
|
|
|
IF b_instant_blend
|
|
i_ik_blend_time = 0
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(obj_trolley, ped)
|
|
SET_IK_TARGET(ped, IK_PART_ARM_LEFT, obj_trolley, GOLD_TROLLEY_BONE_GRIP_LEFT, v_trolley_left_hand_attach, ITF_ARM_TARGET_WRT_IKHELPER, i_ik_blend_time)
|
|
SET_IK_TARGET(ped, IK_PART_ARM_RIGHT, obj_trolley, GOLD_TROLLEY_BONE_GRIP_RIGHT, v_trolley_right_hand_attach, ITF_ARM_TARGET_WRT_IKHELPER, i_ik_blend_time)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(PED_INDEX ped, OBJECT_INDEX obj_trolley, BOOL b_instant_blend = FALSE, BOOL b_force_ai_update = FALSE, BOOL b_force_walking_anim = FALSE)
|
|
FLOAT f_blend_time = WALK_BLEND_IN
|
|
|
|
IF b_instant_blend
|
|
f_blend_time = INSTANT_BLEND_IN
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_trolley_push_out)
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(obj_trolley, ped)
|
|
IF IS_PED_WALKING(ped)
|
|
OR b_force_walking_anim
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(ped, str_anim_trolley_push_out, "push_trolly_walk")
|
|
TASK_PLAY_ANIM(ped, str_anim_trolley_push_out, "push_trolly_walk", f_blend_time, -2, -1,
|
|
AF_UPPERBODY | AF_SECONDARY | AF_LOOPING | AF_TAG_SYNC_CONTINUOUS)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(ped, str_anim_trolley_push_out, "push_trolly_stand")
|
|
TASK_PLAY_ANIM(ped, str_anim_trolley_push_out, "push_trolly_stand", f_blend_time, -2, -1,
|
|
AF_UPPERBODY | AF_SECONDARY | AF_LOOPING | AF_TAG_SYNC_CONTINUOUS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_TROLLEY_ARM_IK(ped, obj_trolley, b_instant_blend)
|
|
ELSE
|
|
IF IS_ENTITY_PLAYING_ANIM(ped, str_anim_trolley_push_out, "push_trolly_walk")
|
|
OR IS_ENTITY_PLAYING_ANIM(ped, str_anim_trolley_push_out, "push_trolly_stand")
|
|
CLEAR_PED_SECONDARY_TASK(ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF b_force_ai_update
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(ped)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_CREW_MEMBER_DURING_DRILL_SECTION()
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
VECTOR v_default_pos = <<22.8719, -638.4583, 15.0881>>
|
|
FLOAT f_default_heading = 133.7838
|
|
FLOAT f_heading_diff = ABSF(GET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped) - f_default_heading)
|
|
IF f_heading_diff > 180.0
|
|
f_heading_diff = ABSF(f_heading_diff - 360.0)
|
|
ENDIF
|
|
|
|
REQUEST_ANIM_DICT(str_anim_ig_2)
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped), v_default_pos) > 4.0
|
|
OR (f_heading_diff > 45.0 AND GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK)
|
|
OR IS_PED_RAGDOLL(s_crew[CREW_FRANKLIN_ID].ped)
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
|
|
IF NOT IS_POSITION_OCCUPIED(v_default_pos, 0.5, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(s_crew[CREW_FRANKLIN_ID].ped, v_default_pos, PEDMOVE_WALK, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, f_default_heading)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_ig_2)
|
|
IF IS_ENTITY_PLAYING_ANIM(s_crew[CREW_FRANKLIN_ID].ped, str_anim_ig_2, "base")
|
|
IF s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
TASK_LOOK_AT_ENTITY(s_crew[CREW_FRANKLIN_ID].ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_FRANKLIN_ID].i_timer > 0
|
|
INT i_random = GET_RANDOM_INT_IN_RANGE(0, 6)
|
|
|
|
SEQUENCE_INDEX seq
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF i_random = 0
|
|
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
ELIF i_random = 1
|
|
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_b", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
ELIF i_random = 2
|
|
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_c", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
ELIF i_random = 3
|
|
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_d", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
ELIF i_random = 4
|
|
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_e", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
ELIF i_random = 5
|
|
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "idle_f", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
ENDIF
|
|
|
|
TASK_PLAY_ANIM(NULL, str_anim_ig_2, "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
ENDIF
|
|
ELIF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
TASK_PLAY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, str_anim_ig_2, "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player drives the cutter into the crew, kill them and fail the mission.
|
|
IF IS_CUTTER_SPINNING()
|
|
IF IS_PED_TOUCHING_CUTTER_BLADES(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_PED_TO_RAGDOLL(s_crew[CREW_FRANKLIN_ID].ped, 1000, 3000, TASK_NM_BALANCE)
|
|
APPLY_DAMAGE_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped) + 50, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// Handles the behaviour for the crew member while he collects the gold and loads it into the containers.
|
|
PROC UPDATE_CREW_MEMBER_COLLECTING_GOLD()
|
|
VECTOR v_sync_scene_pos_first_trolley = <<8.862, -659.407, 15.130>>
|
|
VECTOR v_sync_scene_rot_first_trolley = <<0.000, -0.000, -110.000>>
|
|
VECTOR v_sync_scene_pos_second_trolley = <<8.862, -659.407, 15.130>>
|
|
VECTOR v_sync_scene_rot_second_trolley = <<0.000, -0.000, -110.000>>
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
INT iPrevEvent = s_crew[CREW_FRANKLIN_ID].i_event
|
|
#ENDIF
|
|
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_gold_enter_left)
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_gold_exit_left)
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_gold_enter_right)
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_gold_exit_right)
|
|
REQUEST_ANIM_DICT(str_anim_trolley_push_out)
|
|
REQUEST_ANIM_DICT(str_anim_trolley_push_in)
|
|
REQUEST_ANIM_DICT(str_anim_crew_action_idle)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_gold_enter_left)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_gold_exit_left)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_gold_enter_right)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_gold_exit_right)
|
|
SEQUENCE_INDEX seq
|
|
VECTOR v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped)
|
|
FLOAT f_dist_to_destination
|
|
BOOL b_is_in_combat = (IS_PED_IN_COMBAT(s_crew[CREW_FRANKLIN_ID].ped) OR GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
BOOL b_safe_to_warp
|
|
INT i_num_nodes
|
|
|
|
//1410350 - The gold trolley has been moved further away from the door, however this doesn't match the anim so move it back when it's off-screen.
|
|
IF NOT b_gold_trolley_warped_for_anim
|
|
IF e_mission_stage = STAGE_COLLECT_GOLD
|
|
IF NOT IS_SPHERE_VISIBLE(<<1.913392,-660.422180,15.524313>>, 5.0)
|
|
OR IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_trolleys[1], <<1.913392,-660.422180,15.524313>>)
|
|
b_gold_trolley_warped_for_anim = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH s_crew[CREW_FRANKLIN_ID].i_event
|
|
CASE 0 //Run up to the first trolley.
|
|
IF e_mission_stage = STAGE_COLLECT_GOLD //Don't start collecting the gold until the player has blown up the doors.
|
|
OR (e_mission_stage = STAGE_BLOW_UP_DOORS AND b_vault_door_blown_up[0] AND b_vault_door_blown_up[1])
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_trolley_push_out)
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<11.9118, -664.0375, 15.1306>>
|
|
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(str_waypoint_gold_enter_left, i_num_nodes)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<9.8700, -647.2407, 15.0856>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_enter_left, 0,
|
|
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END, -1)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_RUN, 20000, 0.25, ENAV_STOP_EXACTLY | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, 74.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
TASK_CLEAR_LOOK_AT(s_crew[CREW_FRANKLIN_ID].ped)
|
|
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_AvoidTearGas, FALSE)
|
|
//SET_ENTITY_LOAD_COLLISION_FLAG(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
ELSE
|
|
//If the shootout started early then put him into combat.
|
|
IF s_tunnel_cops_new_1[0].i_event > 0
|
|
IF NOT IS_PED_IN_COMBAT(s_crew[CREW_FRANKLIN_ID].ped)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) = 0
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) != 0
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<7.6011, -643.7367, 15.0968>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0, TRUE)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_FRANKLIN_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE, -1, "DEFAULT_ACTION")
|
|
ENDIF
|
|
ELSE
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.6473, -644.7507, 15.0884>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0, TRUE)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_FRANKLIN_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE, -1, "DEFAULT_ACTION")
|
|
TASK_CLEAR_LOOK_AT(s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_CREW_MEMBER_DURING_DRILL_SECTION()
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Take the first trolley to a container.
|
|
IF VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 100.0
|
|
AND NOT IS_ENTITY_ON_SCREEN(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND NOT IS_ENTITY_ON_SCREEN(obj_gold_trolleys[0])
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<6.524613,-658.553345,14.880713>>, <<3.670824,-666.549072,18.166275>>, 17.250000)
|
|
b_safe_to_warp = TRUE
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
|
|
IF IS_ENTITY_STATIC(obj_vault_gates[1])
|
|
ACTIVATE_PHYSICS(obj_vault_gates[1])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
LOAD_STREAM("Gold_Cart_Push_Anim_01", "BIG_SCORE_3B_SOUNDS")
|
|
|
|
IF (VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 4.0
|
|
AND ABSF(GET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped) - 74.0) < 20.0)
|
|
OR b_safe_to_warp
|
|
//FREEZE_ENTITY_POSITION(obj_gold_trolleys[0], FALSE)
|
|
//ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[0], s_crew[CREW_FRANKLIN_ID].ped, -1, v_trolley_attach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_sync_scene = CREATE_SYNCHRONIZED_SCENE(v_sync_scene_pos_first_trolley, v_sync_scene_rot_first_trolley)
|
|
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].i_sync_scene, str_anim_trolley_push_out, "push_out_vault_l",
|
|
SLOW_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS,
|
|
RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_IMPACT_OBJECT | RBF_MELEE, SLOW_BLEND_IN)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene, 0.0)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(s_crew[CREW_FRANKLIN_ID].ped)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
IF LOAD_STREAM("Gold_Cart_Push_Anim_01", "BIG_SCORE_3B_SOUNDS")
|
|
PLAY_STREAM_FROM_OBJECT(obj_gold_trolleys[0])
|
|
ENDIF
|
|
|
|
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Once the sync scene finishes go into walking
|
|
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_UseKinematicPhysics, TRUE)
|
|
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_DontWalkRoundObjects, TRUE)
|
|
|
|
IF NOT IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.05)
|
|
FREEZE_ENTITY_POSITION(obj_gold_trolleys[0], FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[0], s_crew[CREW_FRANKLIN_ID].ped, -1, v_trolley_attach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
|
|
ENDIF
|
|
|
|
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
|
|
IF IS_ENTITY_STATIC(obj_vault_gates[1])
|
|
ACTIVATE_PHYSICS(obj_vault_gates[1])
|
|
ENDIF
|
|
|
|
IF NOT b_moved_doors_out_of_way[1]
|
|
VECTOR vRot
|
|
vRot = GET_ENTITY_ROTATION(obj_vault_gates[1])
|
|
|
|
IF NOT (vRot.y < 95.0 AND vRot.y > 85.0)
|
|
AND NOT (vRot.y < 275.0 AND vRot.y > 265.0)
|
|
APPLY_FORCE_TO_ENTITY(obj_vault_gates[1], APPLY_TYPE_IMPULSE, <<-0.2, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE, FALSE, FALSE)
|
|
b_moved_doors_out_of_way[1] = TRUE
|
|
i_door_force_timer[1] = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() - i_door_force_timer[1] < 1000
|
|
APPLY_FORCE_TO_ENTITY(obj_vault_gates[1], APPLY_TYPE_FORCE, <<-0.2, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.95)
|
|
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, WALK_BLEND_OUT, TRUE)
|
|
s_crew[CREW_FRANKLIN_ID].i_sync_scene = -1
|
|
ENDIF
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<19.6414, -636.7057, 15.2876>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_exit_right, 0,
|
|
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<10.8, -643.7, 15.3>>, PEDMOVE_WALK, DEFAULT)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_WALK, DEFAULT, -69.5523)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
|
|
//If the player gets in the way while the synced scene is running then make them ragdoll.
|
|
IF NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
AND GET_ENTITY_SPEED(PLAYER_PED_ID()) < 0.1
|
|
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), obj_gold_trolleys[0])
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.0>>),
|
|
1.5)
|
|
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 1000, 3000, TASK_NM_BALANCE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Play synced scene of pushing the gold into the trolley.
|
|
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_UseKinematicPhysics, TRUE)
|
|
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_DontWalkRoundObjects, TRUE)
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
|
|
|
|
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
//DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 3.0, 0.0>>), 0.5)
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.5>>),
|
|
2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.0>>),
|
|
2.5)
|
|
|
|
b_trolley_sequence_is_being_blocked = TRUE
|
|
ELSE
|
|
b_trolley_sequence_is_being_blocked = FALSE
|
|
ENDIF
|
|
|
|
IF NOT b_trolley_sequence_is_being_blocked
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_exit_right, 0,
|
|
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<10.8, -643.7, 15.3>>, PEDMOVE_WALK, DEFAULT)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_WALK, DEFAULT, -69.5523)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF VDIST(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 1.0
|
|
s_crew[CREW_FRANKLIN_ID].i_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(s_crew[CREW_FRANKLIN_ID].i_sync_scene, obj_gold_containers[0], -1)
|
|
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].i_sync_scene, str_anim_trolley_push_in, "put_to_container_r", WALK_BLEND_IN, WALK_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_IMPACT_OBJECT | RBF_MELEE, WALK_BLEND_IN)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene, 0.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
|
|
//Play some general dialogue about not getting shot.
|
|
IF NOT b_has_text_label_triggered[BS2B_MTL1]
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_MTL")
|
|
b_has_text_label_triggered[BS2B_MTL1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_STAND_STILL) != PERFORMING_TASK
|
|
TASK_STAND_STILL(s_crew[CREW_FRANKLIN_ID].ped, -1)
|
|
ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_MOVE1]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_MOVE")
|
|
b_has_text_label_triggered[BS2B_MOVE1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - i_time_since_player_last_shot > 7000
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_crew[CREW_FRANKLIN_ID].ped, PLAYER_PED_ID())
|
|
IF GET_GAME_TIMER() - i_gunman_trouble_dialogue_timer > 15000
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) > 0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_TRB")
|
|
i_gunman_trouble_dialogue_timer = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
ELSE
|
|
i_gunman_trouble_dialogue_timer = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4 //Once the synced scene is finished then run to the next trolley.
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
|
|
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[0])
|
|
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.84)
|
|
VECTOR v_attach_offset, v_attach_rot
|
|
v_attach_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(obj_gold_containers[0], GET_ENTITY_COORDS(obj_gold_trolleys[0]))
|
|
v_attach_rot = GET_ENTITY_ROTATION(obj_gold_trolleys[0]) - GET_ENTITY_ROTATION(obj_gold_containers[0])
|
|
|
|
DETACH_ENTITY(obj_gold_trolleys[0], FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0], 0, v_attach_offset, v_attach_rot)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.98)
|
|
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<0.300851,-659.911865, 15.1306>>
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, WALK_BLEND_OUT, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<9.8700, -647.2407, 15.0856>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_enter_right, 0,
|
|
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END, -1)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_RUN, 20000, 0.25, ENAV_STOP_EXACTLY | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, 250.2183)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
STOP_STREAM()
|
|
|
|
i_current_take += MAX_OVERALL_TAKE / 2
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5 //Take the second trolley to the container.
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
|
|
|
|
//Say a line about the first container being loaded.
|
|
IF NOT b_has_text_label_triggered[BS2B_CRGOLD1]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_GLD1")
|
|
b_has_text_label_triggered[BS2B_CRGOLD1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
|
|
IF IS_ENTITY_STATIC(obj_vault_gates[0])
|
|
ACTIVATE_PHYSICS(obj_vault_gates[0])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 100.0
|
|
AND NOT IS_ENTITY_ON_SCREEN(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND NOT IS_ENTITY_ON_SCREEN(obj_gold_trolleys[1])
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<6.524613,-658.553345,14.880713>>, <<3.670824,-666.549072,18.166275>>, 17.250000)
|
|
b_safe_to_warp = TRUE
|
|
ENDIF
|
|
|
|
LOAD_STREAM("Gold_Cart_Push_Anim_02", "BIG_SCORE_3B_SOUNDS")
|
|
|
|
IF (VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 4.0
|
|
AND ABSF(GET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped) - 250.2183) < 20.0)
|
|
OR b_safe_to_warp
|
|
//FREEZE_ENTITY_POSITION(obj_gold_trolleys[1], FALSE)
|
|
//ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[1], s_crew[CREW_FRANKLIN_ID].ped, -1, v_trolley_attach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_sync_scene = CREATE_SYNCHRONIZED_SCENE(v_sync_scene_pos_second_trolley, v_sync_scene_rot_second_trolley)
|
|
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].i_sync_scene, str_anim_trolley_push_out, "push_out_vault_r", SLOW_BLEND_IN, WALK_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_IMPACT_OBJECT | RBF_MELEE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene, 0.0)
|
|
|
|
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
IF LOAD_STREAM("Gold_Cart_Push_Anim_02", "BIG_SCORE_3B_SOUNDS")
|
|
PLAY_STREAM_FROM_OBJECT(obj_gold_trolleys[1])
|
|
ENDIF
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6 //Once the sync scene finishes go into walking
|
|
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_UseKinematicPhysics, TRUE)
|
|
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_DontWalkRoundObjects, TRUE)
|
|
|
|
IF NOT IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.05)
|
|
FREEZE_ENTITY_POSITION(obj_gold_trolleys[1], FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[1], s_crew[CREW_FRANKLIN_ID].ped, -1, v_trolley_attach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
|
|
IF IS_ENTITY_STATIC(obj_vault_gates[0])
|
|
ACTIVATE_PHYSICS(obj_vault_gates[0])
|
|
ENDIF
|
|
|
|
IF NOT b_moved_doors_out_of_way[0]
|
|
VECTOR vRot
|
|
vRot = GET_ENTITY_ROTATION(obj_vault_gates[0])
|
|
|
|
IF NOT (vRot.y < 95.0 AND vRot.y > 85.0)
|
|
AND NOT (vRot.y < 275.0 AND vRot.y > 265.0)
|
|
APPLY_FORCE_TO_ENTITY(obj_vault_gates[0], APPLY_TYPE_IMPULSE, <<0.2, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE, FALSE, FALSE)
|
|
b_moved_doors_out_of_way[0] = TRUE
|
|
i_door_force_timer[0] = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() - i_door_force_timer[0] < 1000
|
|
APPLY_FORCE_TO_ENTITY(obj_vault_gates[0], APPLY_TYPE_FORCE, <<0.2, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.95)
|
|
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, WALK_BLEND_OUT, TRUE)
|
|
s_crew[CREW_FRANKLIN_ID].i_sync_scene = -1
|
|
ENDIF
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.9730, -641.9811, 16.0158>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_exit_left, 0,
|
|
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<10.8, -643.7, 15.3>>, PEDMOVE_WALK, DEFAULT)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_WALK, DEFAULT, -84.4459)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
|
|
//If the player gets in the way while the synced scene is running then make them ragdoll.
|
|
IF NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
AND GET_ENTITY_SPEED(PLAYER_PED_ID()) < 0.1
|
|
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), obj_gold_trolleys[1])
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.0>>),
|
|
1.5)
|
|
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 1000, 3000, TASK_NM_BALANCE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 7 //Play final synced scene once hitting the locate.
|
|
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_UseKinematicPhysics, TRUE)
|
|
SET_PED_RESET_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PRF_DontWalkRoundObjects, TRUE)
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.5>>),
|
|
2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 2.0, -1.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<0.0, 5.0, 2.0>>),
|
|
2.5)
|
|
|
|
b_trolley_sequence_is_being_blocked = TRUE
|
|
ELSE
|
|
b_trolley_sequence_is_being_blocked = FALSE
|
|
ENDIF
|
|
|
|
IF NOT b_trolley_sequence_is_being_blocked
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, str_waypoint_gold_exit_left, 0,
|
|
EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<10.8, -643.7, 15.3>>, PEDMOVE_WALK, DEFAULT)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, PEDMOVE_WALK, DEFAULT, -84.4459)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF VDIST(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 0.25
|
|
OR (GET_ENTITY_SPEED(s_crew[CREW_FRANKLIN_ID].ped) < 0.1 AND VDIST(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest) < 1.0) //In case the player tries to block them.
|
|
s_crew[CREW_FRANKLIN_ID].i_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(s_crew[CREW_FRANKLIN_ID].i_sync_scene, obj_gold_containers[1], -1)
|
|
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].i_sync_scene, str_anim_trolley_push_in, "put_to_container_l", WALK_BLEND_IN, WALK_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FALLING | RBF_IMPACT_OBJECT | RBF_MELEE, WALK_BLEND_IN)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene, 0.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
|
|
|
|
b_crew_nearly_finished_trolleys = TRUE
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
|
|
//Play some general dialogue about not getting shot.
|
|
IF NOT b_has_text_label_triggered[BS2B_MTL2]
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_MTL")
|
|
b_has_text_label_triggered[BS2B_MTL2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - i_time_since_player_last_shot > 7000
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_crew[CREW_FRANKLIN_ID].ped, PLAYER_PED_ID())
|
|
IF GET_GAME_TIMER() - i_gunman_trouble_dialogue_timer > 15000
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) > 0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_TRB")
|
|
i_gunman_trouble_dialogue_timer = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
ELSE
|
|
i_gunman_trouble_dialogue_timer = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_STAND_STILL) != PERFORMING_TASK
|
|
TASK_STAND_STILL(s_crew[CREW_FRANKLIN_ID].ped, -1)
|
|
ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_MOVE2]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_MOVE")
|
|
b_has_text_label_triggered[BS2B_MOVE2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 8 //Go into combat after reaching the second container.
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(s_crew[CREW_FRANKLIN_ID].ped, PEDMOVE_WALK)
|
|
UPDATE_TROLLEY_ARM_IK(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
|
|
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.79)
|
|
VECTOR v_attach_offset, v_attach_rot
|
|
v_attach_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(obj_gold_containers[1], GET_ENTITY_COORDS(obj_gold_trolleys[1]))
|
|
v_attach_rot = GET_ENTITY_ROTATION(obj_gold_trolleys[1]) - GET_ENTITY_ROTATION(obj_gold_containers[1])
|
|
|
|
DETACH_ENTITY(obj_gold_trolleys[1], FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1], 0, v_attach_offset, v_attach_rot)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene) AND GET_SYNCHRONIZED_SCENE_PHASE(s_crew[CREW_FRANKLIN_ID].i_sync_scene) > 0.99)
|
|
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(s_crew[CREW_FRANKLIN_ID].i_sync_scene)
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.6473, -644.7507, 15.0884>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].cover, s_crew[CREW_FRANKLIN_ID].v_dest, -123.1, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_FRANKLIN_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE, -1, "DEFAULT_ACTION")
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_BULLET_REACTIONS, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_AvoidTearGas, TRUE)
|
|
|
|
STOP_STREAM()
|
|
|
|
i_current_take += MAX_OVERALL_TAKE / 2
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = TRUE
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event = 50
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50 //Fight the enemies if they're still alive.
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(s_crew[CREW_FRANKLIN_ID].ped, obj_gold_trolleys[1])
|
|
|
|
IF NOT s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
|
|
IF IS_PED_STEALING_PEDS_DESTINATION(PLAYER_PED_ID(), s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 4.0, 2.0)
|
|
IF s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.6473, -644.7507, 15.0884>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].cover, s_crew[CREW_FRANKLIN_ID].v_dest, -123.1, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<12.6860, -644.9421, 15.0881>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].cover, s_crew[CREW_FRANKLIN_ID].v_dest, 229.0679, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_crew_pos, s_crew[CREW_FRANKLIN_ID].v_dest)
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) = 0
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<7.6011, -643.7367, 15.0968>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].cover, s_crew[CREW_FRANKLIN_ID].v_dest, -141.1, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ELSE
|
|
IF s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
|
|
IF s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 51 //Run back to the trolleys once everyone is dead.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) = 0
|
|
AND HAS_ANIM_DICT_LOADED(str_anim_crew_action_idle)
|
|
WEAPON_TYPE e_current_weapon
|
|
GET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, e_current_weapon)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<22.4168, -640.2405, 15.0690>>, PEDMOVE_RUN, -1, 0.5, ENAV_SUPPRESS_EXACT_STOP)
|
|
|
|
IF e_current_weapon = WEAPONTYPE_UNARMED
|
|
TASK_PLAY_ANIM(NULL, str_anim_crew_action_idle, "idle", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Say a line about the second container.
|
|
IF NOT b_has_text_label_triggered[BS2B_CRGOLD2]
|
|
AND s_crew[CREW_FRANKLIN_ID].i_event >= 50
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_GLD2")
|
|
b_has_text_label_triggered[BS2B_CRGOLD2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
IF IS_PED_RAGDOLL(s_crew[CREW_FRANKLIN_ID].ped)
|
|
BOOL b_trolley_detached = FALSE
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
|
|
DETACH_ENTITY(obj_gold_trolleys[0], TRUE, FALSE)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[0], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
|
|
b_trolley_detached = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
|
|
DETACH_ENTITY(obj_gold_trolleys[1], TRUE, FALSE)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[1], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
|
|
b_trolley_detached = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF b_trolley_detached
|
|
STOP_STREAM()
|
|
APPLY_DAMAGE_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped) + 50, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ON_FIRE(s_crew[CREW_FRANKLIN_ID].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(s_crew[CREW_FRANKLIN_ID].ped, NORMAL_BLEND_OUT, TRUE)
|
|
SET_PED_TO_RAGDOLL(s_crew[CREW_FRANKLIN_ID].ped, 1000, 3000, TASK_NM_BALANCE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
|
|
DETACH_ENTITY(obj_gold_trolleys[0], TRUE, FALSE)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[0], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
|
|
DETACH_ENTITY(obj_gold_trolleys[1], TRUE, FALSE)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[1], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
STOP_STREAM()
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF iPrevEvent != s_crew[CREW_FRANKLIN_ID].i_event
|
|
PRINTLN("finale_heist2b.sc - Crew event changed from ", iPrevEvent, " to ", s_crew[CREW_FRANKLIN_ID].i_event)
|
|
ENDIF
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_GUNMAN_FOR_VAULT_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
BOOL b_is_in_combat = (IS_PED_IN_COMBAT(s_crew[CREW_FRANKLIN_ID].ped) OR GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
FLOAT f_dist_to_destination = 0.0
|
|
SEQUENCE_INDEX seq
|
|
|
|
SWITCH s_crew[CREW_FRANKLIN_ID].i_event
|
|
CASE 0
|
|
SET_PED_COMBAT_PARAMS(s_crew[CREW_FRANKLIN_ID].ped, i_crew_franklin_default_accuracy, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_MAX_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
|
|
SET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(s_crew[CREW_FRANKLIN_ID].ped, RBF_BULLET_IMPACT)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<9.6572, -657.1654, 15.0412>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = TRUE
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<9.6572, -657.1654, 15.0412>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<4.5155, -655.4434, 15.0952>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(GET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped), s_crew[CREW_FRANKLIN_ID].v_dest)
|
|
|
|
IF IS_PED_IN_COVER(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
IF b_picked_good_franklin_gunman
|
|
AND NOT s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover
|
|
IF s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
GIVE_WEAPON_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_GRENADE, 10, FALSE, TRUE)
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_FRANKLIN_ID].i_timer > 2000
|
|
SET_PED_ACCURACY(s_crew[CREW_FRANKLIN_ID].ped, 100)
|
|
//TASK_THROW_PROJECTILE(s_crew[CREW_FRANKLIN_ID].ped, <<-1.7, -675.2659, 18.5308>>)
|
|
TASK_THROW_PROJECTILE(s_crew[CREW_FRANKLIN_ID].ped, <<-0.6, -671.5, 16.6308>>)
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = GET_GAME_TIMER()
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
ELSE
|
|
//Update the tasks if a refresh is required (player stole cover or ped was knocked out of tasks in some way)
|
|
IF s_crew[CREW_FRANKLIN_ID].b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<12.3624, -644.3405, 15.0881>>, <<1.6, -671.4, 16.9>>, PEDMOVE_RUN, FALSE, 1.0, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, <<1.6, -671.4, 16.9>>, PEDMOVE_RUN, TRUE, 1.0, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, s_crew[CREW_FRANKLIN_ID].v_dest, -1, FALSE, SLOW_BLEND_DURATION, TRUE, FALSE, NULL, TRUE)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_FRANKLIN_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_THROW_PROJECTILE) != PERFORMING_TASK
|
|
OR GET_GAME_TIMER() - s_crew[CREW_FRANKLIN_ID].i_timer > 5000 //Just in case the grenade task fails.
|
|
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_FRANKLIN_ID].ped, 150.0)
|
|
SET_PED_ACCURACY(s_crew[CREW_FRANKLIN_ID].ped, i_crew_franklin_default_accuracy)
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2b) = 0
|
|
s_crew[CREW_FRANKLIN_ID].v_dest = <<21.0950, -658.6571, 15.1084>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_FRANKLIN_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, 2.0)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF b_has_text_label_triggered[F3B_SWITREV]
|
|
IF NOT IS_PED_IN_COVER(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_SEEK_COVER_TO_COORDS) != PERFORMING_TASK
|
|
TASK_SEEK_COVER_TO_COORDS(s_crew[CREW_FRANKLIN_ID].ped, s_crew[CREW_FRANKLIN_ID].v_dest, <<24.5, -637.6, 18.1>>, -1)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF IS_ENTITY_ON_FIRE(s_crew[CREW_FRANKLIN_ID].ped)
|
|
IF GET_GAME_TIMER() - s_crew[CREW_FRANKLIN_ID].i_fire_timer > 4000
|
|
APPLY_DAMAGE_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped) + 100, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
s_crew[CREW_FRANKLIN_ID].i_fire_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RUBBER_BAND_CHASE(FLOAT &fCurrentSpeed, VEHICLE_INDEX vehPlayer, VEHICLE_INDEX vehTrigger)
|
|
IF IS_VEHICLE_DRIVEABLE(vehTrigger)
|
|
AND IS_VEHICLE_DRIVEABLE(vehPlayer)
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(vehPlayer)
|
|
VECTOR vTriggerPos = GET_ENTITY_COORDS(vehTrigger)
|
|
|
|
//As it's a chopper chase remove the z from the calculations, otherwise the player could get ahead just by flying higher than the trigger.
|
|
vPlayerPos.z = 0.0
|
|
vTriggerPos.z = 0.0
|
|
|
|
//Rubber banding
|
|
FLOAT fDist = VDIST(vPlayerPos, vTriggerPos)
|
|
FLOAT fTouchingDist = 10.0
|
|
FLOAT fDesiredDist = 18.0
|
|
FLOAT fMaxDist = 50.0
|
|
FLOAT fSuperMaxDist = 100.0
|
|
FLOAT fDesiredPlaybackSpeed = 1.0
|
|
FLOAT fAccel = 0.01
|
|
FLOAT fPlayersSpeedModifier = 0.0
|
|
FLOAT fMaxDistInFront = 30.0
|
|
FLOAT fSpeedDiff = GET_ENTITY_SPEED(vehTrigger) - GET_ENTITY_SPEED(vehPlayer)
|
|
|
|
//Special cases: at these points we want the buddy to be further from or nearer to the player than normal
|
|
IF e_mission_stage >= STAGE_CHOPPER_CHASE
|
|
IF f_chase_playback_time > 100000.0
|
|
fTouchingDist = 30.0
|
|
fDesiredDist = 50.0
|
|
fMaxDist = 100.0
|
|
fSuperMaxDist = 150.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FLOAT fDistRatio = 0.0
|
|
//VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrigger, vPlayerPos)
|
|
|
|
IF NOT IS_PED_IN_FRONT_OF_CAR(PLAYER_PED_ID(), vehTrigger)
|
|
//Player is behind
|
|
IF fDist > fMaxDist
|
|
//Player is a long way behind, slow the trigger car down by a lot (if not on screen).
|
|
BOOl bInsanelyFarBehind = FALSE
|
|
IF fDist > fSuperMaxDist
|
|
IF fDist > 200.0
|
|
bInsanelyFarBehind = TRUE
|
|
ENDIF
|
|
fDist = fSuperMaxDist
|
|
ENDIF
|
|
|
|
fDistRatio = ((fDist - fMaxDist) / (fSuperMaxDist - fMaxDist))
|
|
|
|
IF IS_ENTITY_ON_SCREEN(vehTrigger) AND NOT bInsanelyFarBehind
|
|
IF fSpeedDiff > 10.0
|
|
fDesiredPlaybackSpeed = 0.7 - (0.2 * fDistRatio)
|
|
ELSE
|
|
fDesiredPlaybackSpeed = 0.7 - (0.1 * fDistRatio)
|
|
ENDIF
|
|
ELSE
|
|
fDesiredPlaybackSpeed = 0.7 - (0.25 * fDistRatio)
|
|
ENDIF
|
|
ELIF fDist > fDesiredDist
|
|
//Player is somewhat behind, slow the trigger car down relative to how far behind the player is.
|
|
fDistRatio = ((fDist - fDesiredDist) / (fMaxDist - fDesiredDist))
|
|
fDesiredPlaybackSpeed = 1.0 - (0.3 * fDistRatio)
|
|
ELSE
|
|
//Player is getting too close, speed up the trigger car relative to how close the player is.
|
|
IF fDist < fTouchingDist
|
|
fDist = fTouchingDist
|
|
ENDIF
|
|
|
|
fDistRatio = (fDesiredDist - fDist) / (fDesiredDist - fTouchingDist)
|
|
fDesiredPlaybackSpeed = 1.0 + (fDistRatio)
|
|
ENDIF
|
|
ELSE
|
|
//Player is in front, speed up trigger car based on the player's own speed.
|
|
IF fDist > fMaxDistInFront
|
|
fDist = fMaxDistInFront
|
|
ENDIF
|
|
fDistRatio = fDist / fMaxDistInFront
|
|
|
|
//If the player is already going slower then don't speed up the buddy as much.
|
|
IF fSpeedDiff > 0.0
|
|
fDistRatio = fDistRatio * 0.5
|
|
ENDIF
|
|
|
|
IF GET_ENTITY_SPEED(vehPlayer) < 5.0 //If the player has slowed down slow the buddy down so it's not as harsh if they plough through.
|
|
AND fSpeedDiff > 0.0
|
|
fDesiredPlaybackSpeed = 0.6 + fDistRatio
|
|
ELSE
|
|
fDesiredPlaybackSpeed = 1.0 + fDistRatio
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the trigger speed is trying to catch up from really slow then increase the acceleration.
|
|
IF fCurrentSpeed < 1.0
|
|
AND fDesiredPlaybackSpeed > fCurrentSpeed
|
|
fAccel *= 2.0
|
|
ENDIF
|
|
|
|
IF e_mission_stage >= STAGE_CHOPPER_CHASE
|
|
IF fDesiredPlaybackSpeed > 1.5
|
|
fDesiredPlaybackSpeed = 1.5
|
|
ENDIF
|
|
|
|
IF fDesiredPlaybackSpeed > 1.05
|
|
AND fDesiredPlaybackSpeed < fCurrentSpeed
|
|
fAccel *= 0.5
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
|
|
fDesiredPlaybackSpeed = 1.0
|
|
ENDIF
|
|
|
|
//Modify the player's speed further based on the desired speed.
|
|
IF fDesiredPlaybackSpeed > 1.0
|
|
fPlayersSpeedModifier = fPlayersSpeedModifier - ((fDesiredPlaybackSpeed - 1.0) * 10.0)
|
|
ENDIF
|
|
|
|
//Make the speed changes.
|
|
fCurrentSpeed = fCurrentSpeed +@ (((fDesiredPlaybackSpeed - fCurrentSpeed) * fAccel) * 30.0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF b_debug_show_chase_stats
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
SET_TEXT_DROP_SHADOW()
|
|
TEXT_LABEL_63 str_dist = "Distance: "
|
|
str_dist += GET_STRING_FROM_FLOAT(fDist)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.1, "STRING", str_dist)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
SET_TEXT_DROP_SHADOW()
|
|
TEXT_LABEL_63 str_desired_speed = "Desired playback speed: "
|
|
str_desired_speed += GET_STRING_FROM_FLOAT(fDesiredPlaybackSpeed)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", str_desired_speed)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
SET_TEXT_DROP_SHADOW()
|
|
TEXT_LABEL_63 str_speed = "Playback speed: "
|
|
str_speed += GET_STRING_FROM_FLOAT(fCurrentSpeed)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.2, "STRING", str_speed)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
SET_TEXT_DROP_SHADOW()
|
|
TEXT_LABEL_63 str_time = "Time: "
|
|
str_time += GET_STRING_FROM_FLOAT(f_chase_playback_time)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.25, "STRING", str_time)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
SET_TEXT_DROP_SHADOW()
|
|
TEXT_LABEL_63 str_diff = "Speed Diff: "
|
|
str_diff += GET_STRING_FROM_FLOAT(GET_ENTITY_SPEED(vehTrigger) - GET_ENTITY_SPEED(vehPlayer))
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.3, "STRING", str_diff)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
SET_TEXT_DROP_SHADOW()
|
|
TEXT_LABEL_63 strAccel = "Accel: "
|
|
strAccel += GET_STRING_FROM_FLOAT(fAccel)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.35, "STRING", strAccel)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
SET_TEXT_DROP_SHADOW()
|
|
TEXT_LABEL_63 str_state = "Trigger car state: "
|
|
IF IS_PED_IN_FRONT_OF_CAR(PLAYER_PED_ID(), vehTrigger)
|
|
str_state += "in front and "
|
|
ELSE
|
|
str_state += "behind and "
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ON_SCREEN(vehTrigger)
|
|
str_state += "on screen."
|
|
ELSE
|
|
str_state += "off screen."
|
|
ENDIF
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.4, "STRING", str_state)
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Handles the crew chopper behaviour during the collect gold stages. The crew recording has a number of sections where the chopper will hover
|
|
/// and wait for the mission to progress.
|
|
/// PARAMS:
|
|
/// e_current_stage - The current heli stage the recording should be at.
|
|
PROC UPDATE_CREW_HELI_PLAYBACK(CREW_HELI_STAGE e_heli_stage, BOOL b_dont_restart = FALSE)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
AND NOT b_dont_restart
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
|
|
IF e_heli_stage = HELI_STAGE_FLY_TO_BANK
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 1000.0)
|
|
ELIF e_heli_stage = HELI_STAGE_WAIT_FOR_TREVOR
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 25000.0)
|
|
ELIF e_heli_stage = HELI_STAGE_HOVER_OVER_TUNNEL
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 45000.0)
|
|
ELIF e_heli_stage = HELI_STAGE_LEAVE_BANK
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 58000.0)
|
|
ENDIF
|
|
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
|
|
//If the container is attached then it needs to be warped to match the recording warp.
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[1])
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, v_rope_heli_attach_offset + <<0.0, 0.0, -ROPE_START_LENGTH>>))
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh)
|
|
|
|
IF e_heli_stage = HELI_STAGE_FLY_TO_BANK
|
|
CONVERGE_VALUE(f_crew_heli_speed, 1.0, 0.5, TRUE)
|
|
ELIF e_heli_stage = HELI_STAGE_WAIT_FOR_TREVOR
|
|
IF f_playback_time < 27000.0
|
|
CONVERGE_VALUE(f_crew_heli_speed, 1.0, 0.5, TRUE)
|
|
ELIF f_playback_time > 30000.0
|
|
CONVERGE_VALUE(f_crew_heli_speed, -1.0, 0.5, TRUE)
|
|
ENDIF
|
|
ELIF e_heli_stage = HELI_STAGE_HOVER_OVER_TUNNEL
|
|
IF f_playback_time < 46000.0
|
|
CONVERGE_VALUE(f_crew_heli_speed, 1.0, 0.5, TRUE)
|
|
ELIF f_playback_time > 48000.0
|
|
CONVERGE_VALUE(f_crew_heli_speed, -1.0, 0.5, TRUE)
|
|
ENDIF
|
|
ELIF e_heli_stage = HELI_STAGE_LEAVE_BANK
|
|
IF f_playback_time < 57500.0
|
|
CONVERGE_VALUE(f_crew_heli_speed, 1.0, 0.5, TRUE)
|
|
ELSE
|
|
//Rubber band the heli to stay in front of the player
|
|
RUBBER_BAND_CHASE(f_crew_heli_speed, s_gold_choppers[0].veh, s_gold_choppers[1].veh)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, f_crew_heli_speed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_CHASE_RECORDINGS()
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(SetPieceCarID) i
|
|
IF SetPieceCarRecording[i] > 0
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(SetPieceCarRecording[i], str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[i], str_carrec)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(TrafficCarID) i
|
|
IF TrafficCarRecording[i] > 0
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(TrafficCarRecording[i], str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(TrafficCarRecording[i], str_carrec)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC RUBBER_BAND_TRAIN_TO_VEH(VEHICLE_INDEX veh_train, INT i_carriage, VEHICLE_INDEX veh, FLOAT f_preferred_dist_behind_train = 0.0)
|
|
CONST_FLOAT MAX_SPEED_INCREASE 2.0
|
|
CONST_FLOAT MAX_SPEED_DECREASE 0.75
|
|
CONST_FLOAT MAX_DIST_BEHIND 80.0
|
|
CONST_FLOAT MAX_DIST_IN_FRONT 50.0
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_train)
|
|
AND NOT IS_ENTITY_DEAD(veh)
|
|
VECTOR v_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(GET_TRAIN_CARRIAGE(veh_train, i_carriage), GET_ENTITY_COORDS(veh))
|
|
FLOAT f_veh_speed = GET_ENTITY_SPEED(veh)
|
|
FLOAT f_diff, f_desired_speed
|
|
|
|
v_offset.y = -v_offset.y //We want distance behind the train to be positive.
|
|
|
|
IF v_offset.y < f_preferred_dist_behind_train
|
|
//Vehicle is close or ahead of the train, speed the train up.
|
|
f_diff = ABSF(v_offset.y - f_preferred_dist_behind_train)
|
|
|
|
IF f_diff > MAX_DIST_IN_FRONT
|
|
f_diff = MAX_DIST_IN_FRONT
|
|
ENDIF
|
|
|
|
f_desired_speed = f_veh_speed * (1.0 + ((f_diff / MAX_DIST_IN_FRONT) * MAX_SPEED_INCREASE))
|
|
ELIF v_offset.y > f_preferred_dist_behind_train
|
|
//Vehicle is too far behind, slow the train down.
|
|
f_diff = ABSF(v_offset.y - f_preferred_dist_behind_train)
|
|
|
|
IF f_diff > MAX_DIST_BEHIND
|
|
f_diff = MAX_DIST_BEHIND
|
|
ENDIF
|
|
|
|
f_desired_speed = f_veh_speed * (1.0 - ((f_diff / MAX_DIST_BEHIND) * MAX_SPEED_DECREASE))
|
|
ELSE
|
|
//Vehicle is spot on, just maintain speed.
|
|
f_desired_speed = f_veh_speed
|
|
ENDIF
|
|
|
|
CONVERGE_VALUE(f_current_train_speed, f_desired_speed, 0.5, TRUE)
|
|
|
|
IF e_mission_stage = STAGE_CHOPPER_CHASE
|
|
IF f_current_train_speed < 1.0
|
|
f_current_train_speed = 1.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//PRINTLN(v_offset.y, " ", f_diff, " ", f_veh_speed, " ", f_desired_speed, " ", f_current_train_speed)
|
|
//PRINTLN(GET_ENTITY_SPEED(PLAYER_PED_ID()))
|
|
|
|
SET_TRAIN_CRUISE_SPEED(veh_train, f_current_train_speed)
|
|
SET_TRAIN_SPEED(veh_train, f_current_train_speed)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///PURPOSE:
|
|
PROC UPDATE_MERRYWEATHER_HELI_USING_AI(VEHICLE_INDEX &veh_heli, PED_INDEX &ped_pilot, ENEMY_HELI_STATE &e_state, BOOL b_force_task = FALSE)
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
AND NOT IS_ENTITY_DEAD(veh_heli)
|
|
AND NOT IS_PED_INJURED(ped_pilot)
|
|
FLOAT f_player_height = GET_ENTITY_HEIGHT_ABOVE_GROUND(s_gold_choppers[0].veh)
|
|
|
|
IF b_force_task
|
|
e_state = ENEMY_HELI_ATTACK_LOW
|
|
ENDIF
|
|
|
|
IF e_state = ENEMY_HELI_ATTACK_HIGH
|
|
IF f_player_height < 60.0
|
|
TASK_HELI_MISSION(ped_pilot, veh_heli, NULL, PLAYER_PED_ID(), <<0.0, 0.0, 0.0>>, MISSION_ATTACK, 70.0, 15.0, -1.0, 50, 20)
|
|
e_state = ENEMY_HELI_ATTACK_LOW
|
|
ENDIF
|
|
ELIF e_state = ENEMY_HELI_ATTACK_LOW
|
|
IF (f_player_height > 70.0 OR b_force_task)
|
|
TASK_HELI_MISSION(ped_pilot, veh_heli, NULL, PLAYER_PED_ID(), <<0.0, 0.0, 0.0>>, MISSION_ATTACK, 70.0, 15.0, -1.0, 170, 70)
|
|
e_state = ENEMY_HELI_ATTACK_HIGH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
FUNC ROCKET_LINE_UP_STATE GET_ROCKET_LINE_UP_STATE(VEHICLE_INDEX veh_target, VEHICLE_INDEX veh_player, BOOL bIncreaseMissChance = FALSE, FLOAT fMinDistance = 135.0)
|
|
VECTOR v_offset, v_rotation_vel
|
|
FLOAT f_vertical_angle, f_horizontal_angle, f_dist, f_rotation_speed
|
|
FLOAT f_speed_threshold = 0.85
|
|
ROCKET_LINE_UP_STATE e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE
|
|
|
|
IF bIncreaseMissChance
|
|
f_speed_threshold = 0.1
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_target)
|
|
AND NOT IS_ENTITY_DEAD(veh_player)
|
|
//Rules:
|
|
// - If the player is too far away, don't fire at all.
|
|
// - If the player is on the wrong side, don't fire at all.
|
|
// - If the the player is on the right side but the angle is too tight, then fire but miss.
|
|
f_dist = VDIST2(GET_ENTITY_COORDS(veh_target), GET_ENTITY_COORDS(veh_player))
|
|
v_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_player, GET_ENTITY_COORDS(veh_target))
|
|
|
|
IF f_dist < (fMinDistance * fMinDistance)
|
|
f_vertical_angle = ABSF(ATAN2(ABSF(v_offset.x), ABSF(v_offset.z)))
|
|
f_horizontal_angle = ABSF(ATAN2(ABSF(v_offset.x), ABSF(v_offset.y)))
|
|
|
|
IF f_vertical_angle > 18.5 AND f_horizontal_angle > 4.25
|
|
v_rotation_vel = GET_ENTITY_ROTATION_VELOCITY(veh_player)
|
|
f_rotation_speed = VMAG(v_rotation_vel)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Target offset = ", v_offset, " rotation speed = ", f_rotation_speed)
|
|
#ENDIF
|
|
|
|
IF f_rotation_speed < f_speed_threshold
|
|
IF v_offset.x < 0.0
|
|
e_rocket_state = LINE_UP_FIRE_LEFT_SIDE
|
|
ELSE
|
|
e_rocket_state = LINE_UP_FIRE_RIGHT_SIDE
|
|
ENDIF
|
|
ELSE
|
|
IF v_offset.x < 0.0
|
|
e_rocket_state = LINE_UP_FIRE_MISS_LEFT_SIDE
|
|
ELSE
|
|
e_rocket_state = LINE_UP_FIRE_MISS_RIGHT_SIDE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
b_trevor_chopper_too_high = FALSE
|
|
ELSE
|
|
//There's be some additional dialogue if the player is too high.
|
|
IF f_vertical_angle > 18.5
|
|
b_trevor_chopper_too_high = FALSE
|
|
ELSE
|
|
b_trevor_chopper_too_high = TRUE
|
|
ENDIF
|
|
|
|
IF v_offset.x < 0.0
|
|
e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE
|
|
ELSE
|
|
e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF v_offset.x < 0.0
|
|
e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE
|
|
ELSE
|
|
e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_RIGHT_SIDE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
//PRINTLN(f_dist, " ", v_offset, " ", f_vertical_angle, " ", f_horizontal_angle)
|
|
#ENDIF
|
|
|
|
RETURN e_rocket_state
|
|
ENDFUNC
|
|
|
|
//Updates Lester's rocket anims during the chase: Lester has a number of different states he can be in, these states link together different anims.
|
|
PROC UPDATE_LESTER_ROCKET_ANIMS()
|
|
REQUEST_ANIM_DICT(str_anim_rockets)
|
|
REQUEST_ANIM_DICT(str_anim_rocket_signal)
|
|
REQUEST_ANIM_DICT(str_anim_rocket_reload)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND NOT IS_PED_INJURED(s_lester.ped)
|
|
AND HAS_ANIM_DICT_LOADED(str_anim_rockets)
|
|
AND HAS_ANIM_DICT_LOADED(str_anim_rocket_signal)
|
|
AND HAS_ANIM_DICT_LOADED(str_anim_rocket_reload)
|
|
//Default to idle.
|
|
IF e_rocket_anim_state != ROCKET_ANIM_PUT_LAUNCHER_AWAY
|
|
IF NOT DOES_ENTITY_EXIST(obj_lesters_rpg)
|
|
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_RPG))
|
|
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
|
|
|
|
IF HAS_MODEL_LOADED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_RPG))
|
|
AND HAS_MODEL_LOADED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
|
|
obj_lesters_rpg = CREATE_OBJECT(GET_WEAPONTYPE_MODEL(WEAPONTYPE_RPG), GET_ENTITY_COORDS(s_lester.ped))
|
|
//ATTACH_ENTITY_TO_ENTITY(obj_lesters_rpg, s_lester.ped, GET_PED_BONE_INDEX(s_lester.ped, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_lesters_rpg, s_lester.ped, GET_PED_BONE_INDEX(s_lester.ped, BONETAG_PH_L_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
SET_ENTITY_VISIBLE(obj_lesters_rpg, FALSE)
|
|
|
|
obj_single_rocket = CREATE_OBJECT(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG), GET_ENTITY_COORDS(s_lester.ped))
|
|
ATTACH_ENTITY_TO_ENTITY(obj_single_rocket, obj_lesters_rpg, GET_ENTITY_BONE_INDEX_BY_NAME(obj_lesters_rpg, "gun_ammo"), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
SET_ENTITY_VISIBLE(obj_single_rocket, FALSE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_RPG))
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_VEHICLE(s_lester.ped, s_gold_choppers[0].veh)
|
|
IF DOES_ENTITY_EXIST(obj_lesters_rpg)
|
|
IF NOT IS_ENTITY_VISIBLE(obj_lesters_rpg)
|
|
SET_ENTITY_VISIBLE(obj_lesters_rpg, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
|
|
DETACH_ENTITY(s_lester.ped)
|
|
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH e_rocket_anim_state
|
|
CASE ROCKET_ANIM_GET_LAUNCHER_OUT_THEN_AIM
|
|
IF DOES_ENTITY_EXIST(obj_lesters_rpg)
|
|
IF NOT IS_ENTITY_VISIBLE(obj_lesters_rpg)
|
|
SET_ENTITY_VISIBLE(obj_lesters_rpg, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF i_lester_rocket_anim_event = 0
|
|
IF IS_ENTITY_ATTACHED(s_lester.ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
|
|
DETACH_ENTITY(s_lester.ped)
|
|
ENDIF
|
|
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "idle_to_leansit", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ELIF i_lester_rocket_anim_event = 1
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "intro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ENDIF
|
|
ELIF i_lester_rocket_anim_event = 2
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "sweep_medium", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.98)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 0.0)
|
|
|
|
e_rocket_anim_state = ROCKET_ANIM_AIMING
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ROCKET_ANIM_PUT_LAUNCHER_AWAY
|
|
IF i_lester_rocket_anim_event = 0
|
|
IF IS_ENTITY_ATTACHED(s_lester.ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
|
|
DETACH_ENTITY(s_lester.ped)
|
|
ENDIF
|
|
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "outro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ELIF i_lester_rocket_anim_event = 1
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "leansit_to_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ENDIF
|
|
ELIF i_lester_rocket_anim_event = 2
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
IF DOES_ENTITY_EXIST(obj_lesters_rpg)
|
|
SET_ENTITY_VISIBLE(obj_lesters_rpg, FALSE)
|
|
ENDIF
|
|
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.0)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ENDIF
|
|
ELIF i_lester_rocket_anim_event = 3
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(s_lester.ped, NORMAL_BLEND_OUT, TRUE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_PED_INTO_VEHICLE(s_lester.ped, s_gold_choppers[0].veh, VS_BACK_LEFT)
|
|
ENDIF
|
|
|
|
i_lester_rocket_anim_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ROCKET_ANIM_GET_CLOSER_THEN_AIM
|
|
IF i_lester_rocket_anim_event = 0
|
|
IF IS_ENTITY_ATTACHED(s_lester.ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
|
|
DETACH_ENTITY(s_lester.ped)
|
|
ENDIF
|
|
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "outro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ELIF i_lester_rocket_anim_event = 1
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rocket_signal, "signal_forward", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ENDIF
|
|
ELIF i_lester_rocket_anim_event = 2
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "intro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.3)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ENDIF
|
|
ELIF i_lester_rocket_anim_event = 3
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "sweep_medium", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.98)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 0.0)
|
|
|
|
e_rocket_anim_state = ROCKET_ANIM_AIMING
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ROCKET_ANIM_RELOAD_THEN_AIM
|
|
IF i_lester_rocket_anim_event = 0
|
|
IF IS_ENTITY_ATTACHED(s_lester.ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
|
|
DETACH_ENTITY(s_lester.ped)
|
|
ENDIF
|
|
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "outro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.5)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ELIF i_lester_rocket_anim_event = 1
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
IF DOES_ENTITY_EXIST(obj_single_rocket)
|
|
SET_ENTITY_VISIBLE(obj_single_rocket, TRUE)
|
|
DETACH_ENTITY(obj_single_rocket, FALSE, TRUE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_single_rocket, s_lester.ped, GET_PED_BONE_INDEX(s_lester.ped, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rocket_reload, "reload_rocket_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.5)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ENDIF
|
|
ELIF i_lester_rocket_anim_event = 2
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
IF DOES_ENTITY_EXIST(obj_single_rocket)
|
|
DETACH_ENTITY(obj_single_rocket, FALSE, TRUE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_single_rocket, obj_lesters_rpg, GET_ENTITY_BONE_INDEX_BY_NAME(obj_lesters_rpg, "gun_ammo"), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "intro_90r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 1.5)
|
|
|
|
i_lester_rocket_anim_event++
|
|
ENDIF
|
|
ELIF i_lester_rocket_anim_event = 3
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene) > 0.99
|
|
i_lester_rocket_sync_scene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(i_lester_rocket_sync_scene, s_gold_choppers[0].veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_gold_choppers[0].veh, "seat_dside_r"))
|
|
TASK_SYNCHRONIZED_SCENE(s_lester.ped, i_lester_rocket_sync_scene, str_anim_rockets, "sweep_medium", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_WATER_JET, DEFAULT, AIK_DISABLE_HEAD_IK)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(i_lester_rocket_sync_scene, TRUE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(i_lester_rocket_sync_scene, 0.98)
|
|
SET_SYNCHRONIZED_SCENE_RATE(i_lester_rocket_sync_scene, 0.0)
|
|
|
|
IF DOES_ENTITY_EXIST(obj_single_rocket)
|
|
SET_ENTITY_VISIBLE(obj_single_rocket, FALSE)
|
|
ENDIF
|
|
|
|
e_rocket_anim_state = ROCKET_ANIM_AIMING
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_STATE e_new_state)
|
|
e_rocket_anim_state = e_new_state
|
|
i_lester_rocket_anim_event = 0
|
|
ENDPROC
|
|
|
|
FUNC BOOL FIRE_ROCKET(VECTOR v_start, VEHICLE_INDEX veh_target, ENTITY_INDEX entity_owner, VECTOR v_offset, BOOL b_enemy_rocket = FALSE, BOOL b_track_target_speed = FALSE, FLOAT f_rocket_speed_multiplier = 1.0)
|
|
INT i = 0
|
|
INT i_rocket_index = -1
|
|
|
|
REPEAT COUNT_OF(s_rockets) i
|
|
IF NOT DOES_ENTITY_EXIST(s_rockets[i].obj)
|
|
i_rocket_index = i
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
IF HAS_MODEL_LOADED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
|
|
AND HAS_PTFX_ASSET_LOADED()
|
|
AND i_rocket_index > -1
|
|
s_rockets[i_rocket_index].obj = CREATE_OBJECT_NO_OFFSET(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG), v_start)
|
|
s_rockets[i_rocket_index].entity_owner = entity_owner
|
|
s_rockets[i_rocket_index].v_start = v_start
|
|
s_rockets[i_rocket_index].veh_target = veh_target
|
|
s_rockets[i_rocket_index].v_offset = v_offset
|
|
s_rockets[i_rocket_index].v_prev_pos = <<0.0, 0.0, 0.0>>
|
|
s_rockets[i_rocket_index].b_reached_target = FALSE
|
|
s_rockets[i_rocket_index].b_add_entity_speed = b_track_target_speed
|
|
s_rockets[i_rocket_index].b_rocket_belongs_to_player = NOT b_enemy_rocket
|
|
s_rockets[i_rocket_index].f_speed_multiplier = f_rocket_speed_multiplier
|
|
s_rockets[i_rocket_index].ptfx = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_rpg_trail", s_rockets[i_rocket_index].obj, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
PLAY_SOUND_FROM_ENTITY(s_rockets[i_rocket_index].i_sound, "SPL_RPG_DIST_FLIGHT_MASTER", s_rockets[i_rocket_index].obj)
|
|
PLAY_SOUND_FROM_ENTITY(-1, "SPL_RPG_NPC_SHOT_MASTER", s_rockets[i_rocket_index].obj)
|
|
|
|
SET_ENTITY_LOD_DIST(s_rockets[i_rocket_index].obj, 500)
|
|
SET_ENTITY_RECORDS_COLLISIONS(s_rockets[i_rocket_index].obj, TRUE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_AMMO_RPG))
|
|
|
|
IF NOT b_enemy_rocket
|
|
i_rocket_timer = 0 //When the timer = 0 no more rockets are allowed for the player.
|
|
ENDIF
|
|
|
|
//1414098 - The rocket can sometimes hit the gold and cause a mission fail, turn off collision in this case.
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[0])
|
|
SET_ENTITY_NO_COLLISION_ENTITY(s_rockets[i_rocket_index].obj, obj_gold_containers[0], FALSE)
|
|
ENDIF
|
|
|
|
//1979714 - Make sure the rocket object that's attached to Lester is removed at this point.
|
|
IF DOES_ENTITY_EXIST(obj_single_rocket)
|
|
SET_ENTITY_VISIBLE(obj_single_rocket, FALSE)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_ROCKETS()
|
|
CONST_FLOAT ROCKET_SPEED 60.0
|
|
CONST_FLOAT MAX_ROCKET_SPEED 79.0
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(s_rockets) i
|
|
IF DOES_ENTITY_EXIST(s_rockets[i].obj)
|
|
BOOL b_force_blow_up = FALSE
|
|
VECTOR v_current_pos = GET_ENTITY_COORDS(s_rockets[i].obj)
|
|
|
|
//Update direction to home into offset, this lets us control how close the missile is to the target.
|
|
IF NOT s_rockets[i].b_reached_target
|
|
AND NOT IS_ENTITY_DEAD(s_rockets[i].veh_target)
|
|
VECTOR v_dest = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_rockets[i].veh_target, s_rockets[i].v_offset)
|
|
s_rockets[i].v_dir = (v_dest - v_current_pos) / VMAG(v_dest - v_current_pos)
|
|
|
|
//Detect when rockets hit (or when they've missed and are flying away).
|
|
IF s_rockets[i].v_prev_pos.x != 0.0
|
|
FLOAT f_dist_from_target = VDIST2(v_current_pos, v_dest)
|
|
//FLOAT f_prev_dist_from_target = VDIST2(s_rockets[i].v_prev_pos, v_dest)
|
|
|
|
IF ABSF(s_rockets[i].v_offset.x) < 3.0 AND ABSF(s_rockets[i].v_offset.y) < 3.0 AND ABSF(s_rockets[i].v_offset.z) < 3.0
|
|
//The rocket is meant to be on target, once it gets close blow it up
|
|
IF f_dist_from_target < 25.0
|
|
b_force_blow_up = TRUE
|
|
s_rockets[i].b_reached_target = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF f_dist_from_target < 100.0
|
|
//IF f_prev_dist_from_target < f_dist_from_target //The rocket is moving away from the target.
|
|
s_rockets[i].b_reached_target = TRUE
|
|
|
|
//If the missed rocket was one the player fired then play some near-miss dialogue.
|
|
IF s_rockets[i].b_rocket_belongs_to_player
|
|
//i_time_since_last_rocket_missed = GET_GAME_TIMER()
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_rockets[i].b_reached_target
|
|
s_rockets[i].i_explode_timer = GET_GAME_TIMER()
|
|
|
|
//Start the timer for the player's next rocket (randomise a little).
|
|
IF i_rocket_timer = 0
|
|
AND s_rockets[i].b_rocket_belongs_to_player
|
|
//b_played_line_up_dialogue = FALSE
|
|
i_rocket_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0, 700)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
s_rockets[i].v_vel = s_rockets[i].v_dir * ROCKET_SPEED * s_rockets[i].f_speed_multiplier
|
|
|
|
IF s_rockets[i].b_add_entity_speed
|
|
s_rockets[i].v_vel = s_rockets[i].v_vel + GET_ENTITY_VELOCITY(s_rockets[i].veh_target)
|
|
ENDIF
|
|
|
|
//Fix for B*550927: check the velocity to make sure it cannot go over the max amount.
|
|
IF VMAG(s_rockets[i].v_vel) > MAX_ROCKET_SPEED
|
|
s_rockets[i].v_vel = (s_rockets[i].v_vel / VMAG(s_rockets[i].v_vel)) * MAX_ROCKET_SPEED
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Update rotation to match the direction of movement.
|
|
s_rockets[i].v_rot = <<0.0, 0.0, 0.0>>
|
|
s_rockets[i].v_rot.x = ATAN2(s_rockets[i].v_dir.z, VMAG(<<s_rockets[i].v_dir.x, s_rockets[i].v_dir.y, 0.0>>))
|
|
s_rockets[i].v_rot.z = ATAN2(s_rockets[i].v_dir.y, s_rockets[i].v_dir.x) - 90.0
|
|
|
|
//SET_ENTITY_COORDS(s_rockets[i].obj, v_current_pos +@ (s_rockets[i].v_dir * ROCKET_SPEED))
|
|
SET_ENTITY_VELOCITY(s_rockets[i].obj, s_rockets[i].v_vel)
|
|
SET_ENTITY_ROTATION(s_rockets[i].obj, s_rockets[i].v_rot)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF b_debug_draw_debug
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(s_rockets[i].obj), 0.3)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
//Explode on contact or if scripted to hit
|
|
IF (s_rockets[i].b_reached_target AND GET_GAME_TIMER() - s_rockets[i].i_explode_timer > 3000)
|
|
OR HAS_ENTITY_COLLIDED_WITH_ANYTHING(s_rockets[i].obj) AND NOT IS_ENTITY_TOUCHING_ENTITY(s_rockets[i].obj, s_rockets[i].entity_owner)
|
|
OR b_force_blow_up
|
|
IF NOT IS_ENTITY_DEAD(s_rockets[i].veh_target)
|
|
IF IS_ENTITY_TOUCHING_ENTITY(s_rockets[i].obj, s_rockets[i].veh_target)
|
|
OR b_force_blow_up
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_rockets[i].veh_target)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(s_rockets[i].veh_target)
|
|
ENDIF
|
|
|
|
PED_INDEX ped_pilot = GET_PED_IN_VEHICLE_SEAT(s_rockets[i].veh_target, VS_DRIVER)
|
|
IF NOT IS_PED_INJURED(ped_pilot)
|
|
SET_ENTITY_HEALTH(ped_pilot, 0)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(s_rockets[i].veh_target, -100.0)
|
|
//i_time_since_last_chopper_exploded = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ADD_EXPLOSION(v_current_pos, EXP_TAG_ROCKET, 1.0)
|
|
|
|
IF s_rockets[i].ptfx != NULL
|
|
STOP_PARTICLE_FX_LOOPED(s_rockets[i].ptfx)
|
|
s_rockets[i].ptfx = NULL
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(s_rockets[i].i_sound)
|
|
STOP_SOUND(s_rockets[i].i_sound)
|
|
ENDIF
|
|
|
|
REMOVE_OBJECT(s_rockets[i].obj, TRUE)
|
|
|
|
//Guarantee that the timer is set (in case the rocket blew up before hitting its target).
|
|
IF i_rocket_timer = 0
|
|
AND s_rockets[i].b_rocket_belongs_to_player
|
|
//b_played_line_up_dialogue = FALSE
|
|
i_rocket_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
s_rockets[i].v_prev_pos = v_current_pos
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates the heli chase: the chase works using two main car recordings for cop helicopters, these recordings last the entire length of the chase.
|
|
/// If there are no helicopters, then one is created behind the player, and told to catch up to the correct position in the chase. Once the chopper
|
|
/// dies a new one is created later.
|
|
/// PARAMS:
|
|
/// f_playback_time -
|
|
/// f_playback_speed -
|
|
PROC UPDATE_HELI_CHASE(FLOAT f_playback_time, FLOAT f_playback_speed)
|
|
//VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
INT i_closest_alive_chopper = -1
|
|
INT i_num_choppers_still_alive = 0
|
|
|
|
//Handle the spawning and rubber banding of enemy choppers.
|
|
IF f_playback_time < 125000.0
|
|
INT i = 0
|
|
FLOAT f_closest_alive_dist = 0.0
|
|
|
|
REPEAT MAX_NUM_CHOPPERS_IN_CHASE i
|
|
IF SetPieceCarRecording[i] != 0
|
|
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[i], str_carrec)
|
|
REQUEST_MODEL(model_merry)
|
|
REQUEST_MODEL(model_military_chopper)
|
|
|
|
VEHICLE_SEAT e_gunner_seat = VS_BACK_LEFT
|
|
IF i = 1 OR i = 2
|
|
e_gunner_seat = VS_BACK_RIGHT
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(SetPieceCarID[i])
|
|
IF DOES_BLIP_EXIST(blip_chase_cops[i])
|
|
REMOVE_BLIP(blip_chase_cops[i])
|
|
ENDIF
|
|
|
|
BOOL b_created_this_frame = FALSE
|
|
FLOAT f_start_time_offset = 0.0
|
|
//VECTOR v_creation_pos
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(SetPieceCarRecording[i], str_carrec)
|
|
AND HAS_MODEL_LOADED(model_merry)
|
|
AND HAS_MODEL_LOADED(model_military_chopper)
|
|
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
SWITCH i_current_chopper_wave
|
|
CASE 0 //Military choppers
|
|
//Order of attack in array: 2, 1, 0
|
|
|
|
IF f_playback_time < 70000.0
|
|
AND f_playback_time >= SetPieceCarStartime[i]
|
|
SetPieceCarID[i] = CREATE_VEHICLE(model_military_chopper, SetPieceCarPos[i], 0.0)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[i], SetPieceCarRecording[i], str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[i], (f_playback_time - SetPieceCarStartime[i] + f_start_time_offset) * SetPieceCarRecordingSpeed[i])
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(SetPieceCarID[i])
|
|
b_created_this_frame = TRUE
|
|
e_heli_state[i] = ENEMY_HELI_PLAY_RECORDING
|
|
|
|
//Once all choppers respawn as military ones don't create any more choppers.
|
|
IF i = 2
|
|
AND NOT IS_ENTITY_DEAD(SetPieceCarID[0]) AND GET_ENTITY_MODEL(SetPieceCarID[0]) = model_military_chopper
|
|
AND NOT IS_ENTITY_DEAD(SetPieceCarID[1]) AND GET_ENTITY_MODEL(SetPieceCarID[1]) = model_military_chopper
|
|
i_current_chopper_wave++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//When a chopper is created, add a ped inside.
|
|
IF b_created_this_frame
|
|
SET_VEHICLE_ENGINE_ON(SetPieceCarID[i], TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(SetPieceCarID[i])
|
|
SET_VEHICLE_LIGHTS(SetPieceCarID[i], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(SetPieceCarID[i], TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(SetPieceCarID[i], TRUE)
|
|
SET_ENTITY_INVINCIBLE(SetPieceCarID[i], TRUE)
|
|
|
|
PED_INDEX ped_temp = CREATE_PED_INSIDE_VEHICLE(SetPieceCarID[i], PEDTYPE_COP, model_merry)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ped_temp, rel_group_cops)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped_temp, TRUE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(ped_temp, FALSE)
|
|
SET_PED_CONFIG_FLAG(ped_temp, PCF_WillFlyThroughWindscreen, FALSE)
|
|
SET_PED_AS_NO_LONGER_NEEDED(ped_temp)
|
|
|
|
|
|
PED_INDEX ped_gunner = CREATE_PED_INSIDE_VEHICLE(SetPieceCarID[i], PEDTYPE_COP, model_merry, e_gunner_seat)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ped_gunner, rel_group_cops)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped_gunner, FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(ped_gunner, FALSE)
|
|
SET_PED_CONFIG_FLAG(ped_gunner, PCF_WillFlyThroughWindscreen, FALSE)
|
|
GIVE_WEAPON_TO_PED(ped_gunner, WEAPONTYPE_COMBATMG, INFINITE_AMMO, TRUE)
|
|
SET_PED_ACCURACY(ped_gunner, 0)
|
|
TASK_DRIVE_BY(ped_gunner, NULL, s_gold_choppers[0].veh, <<0.0, 0.0, 0.0>>, 1000.0, 50)
|
|
SET_PED_KEEP_TASK(ped_gunner, TRUE)
|
|
SET_PED_AS_NO_LONGER_NEEDED(ped_gunner)
|
|
|
|
IF i = 2
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_merry)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
|
|
ENDIF
|
|
|
|
i_heli_explosion_timers[i] = 0
|
|
ENDIF
|
|
ELIF NOT IS_ENTITY_DEAD(SetPieceCarID[i])
|
|
//Set the gunner to always shoot at the player.
|
|
PED_INDEX ped_gunner = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[i], e_gunner_seat)
|
|
PED_INDEX ped_pilot = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[i], VS_DRIVER)
|
|
|
|
IF NOT IS_PED_INJURED(ped_gunner)
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
IF GET_SCRIPT_TASK_STATUS(ped_gunner, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
|
|
AND f_chase_playback_time > 69000.0
|
|
TASK_DRIVE_BY(ped_gunner, NULL, s_gold_choppers[1].veh, <<0.0, 0.0, 0.0>>, 1000.0, 50, FALSE, FIRING_PATTERN_BURST_FIRE_DRIVEBY)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped_gunner, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF b_debug_kill_enemy_helis
|
|
IF NOT IS_PED_INJURED(ped_pilot)
|
|
SET_ENTITY_HEALTH(ped_pilot, 0)
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF e_heli_state[i] != ENEMY_HELI_BLOW_UP
|
|
IF IS_PED_INJURED(ped_pilot)
|
|
e_heli_state[i] = ENEMY_HELI_BLOW_UP
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(blip_chase_cops[i])
|
|
IF f_playback_time > 70000.0
|
|
blip_chase_cops[i] = CREATE_BLIP_FOR_ENTITY(SetPieceCarID[i], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i_num_choppers_still_alive++
|
|
FLOAT f_dist_to_chopper = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(SetPieceCarID[i]))
|
|
|
|
IF f_closest_alive_dist = 0.0
|
|
OR f_dist_to_chopper < f_closest_alive_dist
|
|
i_closest_alive_chopper = i
|
|
f_closest_alive_dist = f_dist_to_chopper
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_heli_state[i] = ENEMY_HELI_PLAY_RECORDING
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
|
|
FLOAT f_setpiece_speed = f_playback_speed * SetPieceCarRecordingSpeed[i]
|
|
|
|
SET_PLAYBACK_SPEED(SetPieceCarID[i], f_setpiece_speed)
|
|
|
|
//Once the chase is over set the choppers to attack the player
|
|
FLOAT f_stop_time = 0.0
|
|
IF i = 0
|
|
f_stop_time = 118000.0
|
|
ELIF i = 1
|
|
f_stop_time = 118700.0
|
|
ELIF i = 2
|
|
f_stop_time = 118300.0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF b_debug_switch_heli_to_ai
|
|
f_stop_time = 60000.0
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF f_stop_time > 0.0
|
|
IF f_chase_playback_time > f_stop_time
|
|
//Switch to AI.
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[i])
|
|
SET_CURRENT_PED_VEHICLE_WEAPON(ped_pilot, WEAPONTYPE_VEHICLE_PLAYER_BUZZARD)
|
|
UPDATE_MERRYWEATHER_HELI_USING_AI(SetPieceCarID[i], ped_pilot, e_heli_state[i], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//If playback stops for any reason other than AI then tell the chopper to blow up.
|
|
e_heli_state[i] = ENEMY_HELI_BLOW_UP
|
|
ENDIF
|
|
ELIF e_heli_state[i] = ENEMY_HELI_BLOW_UP
|
|
IF i_heli_explosion_timers[i] = 0
|
|
IF DOES_BLIP_EXIST(blip_chase_cops[i])
|
|
REMOVE_BLIP(blip_chase_cops[i])
|
|
ENDIF
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[i])
|
|
ENDIF
|
|
|
|
//Record footage of the first targetted chopper blowing up.
|
|
IF i = 2
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.5)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[i], -200.0)
|
|
SET_VEHICLE_OUT_OF_CONTROL(SetPieceCarID[i], TRUE, TRUE)
|
|
SET_ENTITY_INVINCIBLE(SetPieceCarID[i], TRUE)
|
|
i_heli_explosion_timers[i] = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_heli_explosion_timers[i] < 2000
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[i], -200.0)
|
|
|
|
IF i = 2
|
|
APPLY_FORCE_TO_ENTITY(SetPieceCarID[i], APPLY_TYPE_FORCE, <<25.0, 0.0, 0.0>>, <<0.0, -3.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
ELSE
|
|
APPLY_FORCE_TO_ENTITY(SetPieceCarID[i], APPLY_TYPE_FORCE, <<-25.0, 0.0, 0.0>>, <<0.0, -3.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
SET_ENTITY_INVINCIBLE(SetPieceCarID[i], FALSE)
|
|
SET_ENTITY_PROOFS(SetPieceCarID[i], FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
ADD_EXPLOSION(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(SetPieceCarID[i], <<0.0, 2.5, 0.0>>), EXP_TAG_ROCKET, 1.0)
|
|
|
|
IF GET_VEHICLE_ENGINE_HEALTH(SetPieceCarID[i]) > -599.0
|
|
SET_VEHICLE_ENGINE_HEALTH(SetPieceCarID[i], -600.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[i], -600.0)
|
|
ENDIF
|
|
EXPLODE_VEHICLE(SetPieceCarID[i])
|
|
SET_ENTITY_HEALTH(SetPieceCarID[i], 0)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(SetPieceCarID[i])
|
|
ENDIF
|
|
ELSE
|
|
//Chopper uses AI
|
|
UPDATE_MERRYWEATHER_HELI_USING_AI(SetPieceCarID[i], ped_pilot, e_heli_state[i])
|
|
ENDIF
|
|
ELSE
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(SetPieceCarID[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Lester rockets: don't do any of this stuff if we're in the military choppers.
|
|
ROCKET_LINE_UP_STATE e_rocket_state
|
|
FLOAT f_min_time_to_shoot, f_max_time_to_shoot, f_speed_multiplier
|
|
|
|
|
|
|
|
//Rockets: come from buddies, and later on enemies.
|
|
IF f_playback_time > 55000.0
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
BOOL b_increase_rocket_miss_chance
|
|
FLOAT f_max_fire_distance = 150.0
|
|
|
|
//Set Lester's target to be the closest helicopter.
|
|
IF i_player_rocket_event < 50 //This is bad!
|
|
IF i_closest_alive_chopper >= 0
|
|
i_current_lester_target = i_closest_alive_chopper
|
|
ENDIF
|
|
|
|
IF (i_num_choppers_still_alive < 2 AND f_playback_time < 101000.0)
|
|
OR (i_num_choppers_still_alive < 3 AND f_playback_time < 85000.0)
|
|
b_increase_rocket_miss_chance = TRUE
|
|
ENDIF
|
|
|
|
/*IF (i_current_lester_target = 2 AND i_num_rockets_for_current_target = 0 AND GET_RANDOM_INT_IN_RANGE(0, 2) = 0)
|
|
OR (i_num_choppers_still_alive < 2 AND f_playback_time < 101000.0)
|
|
OR (i_num_choppers_still_alive < 3 AND f_playback_time < 85000.0)
|
|
b_increase_rocket_miss_chance = TRUE
|
|
ENDIF*/
|
|
|
|
IF (i_current_lester_target = 2 AND i_num_rockets_for_current_target = 0)
|
|
f_max_fire_distance = 250.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Determine which chopper is the current target: each one has a time range where they can be shot, and a multiplier for the rocket speed.
|
|
IF i_current_lester_target = 2
|
|
f_min_time_to_shoot = 74000.0
|
|
f_max_time_to_shoot = 122502.700
|
|
f_speed_multiplier = 1.75
|
|
ELIF i_current_lester_target = 1
|
|
f_min_time_to_shoot = 80224.0
|
|
f_max_time_to_shoot = 122502.700
|
|
f_speed_multiplier = 1.4
|
|
ELIF i_current_lester_target = 0
|
|
f_min_time_to_shoot = 88224.0
|
|
f_max_time_to_shoot = 122502.700
|
|
f_speed_multiplier = 1.4
|
|
ENDIF
|
|
|
|
//Sequence of events for Lester rockets:
|
|
// - Waits for the player to get into position.
|
|
// - Fires the rocket.
|
|
// - Reloads.
|
|
// - If the rocket missed then repeat, otherwise pick a new target.
|
|
SWITCH i_player_rocket_event
|
|
CASE 0 //Lester gets the rocket launcher out.
|
|
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_USING_AI)
|
|
|
|
IF f_playback_time > 70500.0 //Just as the Merryweather choppers come into view.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_GET_LAUNCHER_OUT_THEN_AIM)
|
|
|
|
i_num_rockets_for_current_target = 0
|
|
i_current_lester_target = 2
|
|
i_player_rocket_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Lester waits for the player to get into a good position.
|
|
IF NOT b_has_text_label_triggered[F3B_ROCHELP]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
PRINT_HELP("F3B_ROCHELP", DEFAULT_HELP_TEXT_TIME + 5000)
|
|
b_has_text_label_triggered[F3B_ROCHELP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play reloading dialogue.
|
|
IF e_rocket_anim_state = ROCKET_ANIM_RELOAD_THEN_AIM
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT b_has_text_label_triggered[BS2B_RELOAD]
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RELOAD", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_RELOAD] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[BS2B_RELOAD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF f_playback_time > f_min_time_to_shoot AND f_playback_time < f_max_time_to_shoot
|
|
e_rocket_state = GET_ROCKET_LINE_UP_STATE(SetPieceCarID[i_current_lester_target], s_gold_choppers[0].veh, b_increase_rocket_miss_chance, f_max_fire_distance)
|
|
|
|
//Wait for any dialogue to finish and add a random timer.
|
|
IF IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
i_shoot_rocket_wait_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(300, 1550)
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - i_shoot_rocket_wait_timer > 0
|
|
OR GET_GAME_TIMER() - i_rocket_timer > 6000 //Failsafe in case dialogue screws up.
|
|
IF e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE
|
|
OR e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_RIGHT_SIDE
|
|
IF GET_GAME_TIMER() - i_rocket_line_up_dialogue_timer > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TOOFAR", CONV_PRIORITY_MEDIUM)
|
|
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_GET_CLOSER_THEN_AIM)
|
|
i_rocket_line_up_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 10000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE
|
|
OR e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE
|
|
IF GET_GAME_TIMER() - i_rocket_line_up_dialogue_timer > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LINEUP", CONV_PRIORITY_MEDIUM)
|
|
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_GET_CLOSER_THEN_AIM)
|
|
i_rocket_line_up_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 10000)
|
|
|
|
IF b_trevor_chopper_too_high
|
|
b_play_too_high_response = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF e_rocket_state = LINE_UP_FIRE_LEFT_SIDE
|
|
OR e_rocket_state = LINE_UP_FIRE_RIGHT_SIDE
|
|
OR e_rocket_state = LINE_UP_FIRE_MISS_LEFT_SIDE
|
|
OR e_rocket_state = LINE_UP_FIRE_MISS_RIGHT_SIDE
|
|
IF NOT b_has_text_label_triggered[BS2B_GOSHOT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOSHOT", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOSHOT] = TRUE
|
|
i_shoot_rocket_wait_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1900, 2600)
|
|
i_player_rocket_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If Trevor is too high then play a response to Lester's line.
|
|
IF b_play_too_high_response
|
|
IF e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE
|
|
OR e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TOOHI2", CONV_PRIORITY_MEDIUM)
|
|
b_play_too_high_response = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_play_too_high_response = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Lester is primed to fire: wait for the dialogue, check the fire state and fire. If the player moved since the dialogue triggered we may need to miss.
|
|
IF f_playback_time > f_min_time_to_shoot AND f_playback_time < f_max_time_to_shoot
|
|
e_rocket_state = GET_ROCKET_LINE_UP_STATE(SetPieceCarID[i_current_lester_target], s_gold_choppers[0].veh, b_increase_rocket_miss_chance, f_max_fire_distance)
|
|
|
|
IF NOT IS_ENTITY_DEAD(SetPieceCarID[i_current_lester_target])
|
|
AND (e_rocket_anim_state = ROCKET_ANIM_AIMING OR GET_GAME_TIMER() - i_shoot_rocket_wait_timer > 3500)
|
|
AND GET_GAME_TIMER() - i_shoot_rocket_wait_timer > 0
|
|
VECTOR v_start_pos, v_end_offset
|
|
|
|
IF e_rocket_state = LINE_UP_FIRE_LEFT_SIDE
|
|
v_start_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<-1.1, 3.0, 1.2>>)
|
|
v_end_offset = <<1.5, 2.0, 0.0>>
|
|
ELIF e_rocket_state = LINE_UP_FIRE_RIGHT_SIDE
|
|
v_start_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.3429, 3.6245, 0.8325>>)
|
|
v_end_offset = <<-1.5, 2.0, 0.0>>
|
|
ELIF e_rocket_state = LINE_UP_FIRE_MISS_LEFT_SIDE
|
|
OR e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_LEFT_SIDE
|
|
OR e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_LEFT_SIDE
|
|
v_start_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<-1.1, 3.0, 1.2>>)
|
|
v_end_offset = <<5.0 + GET_RANDOM_FLOAT_IN_RANGE(0.0, 3.0), -5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0), -5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0)>>
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
v_end_offset.z *= -1.0
|
|
ENDIF
|
|
ELIF e_rocket_state = LINE_UP_FIRE_MISS_RIGHT_SIDE
|
|
OR e_rocket_state = LINE_UP_DONT_FIRE_BAD_ANGLE_RIGHT_SIDE
|
|
OR e_rocket_state = LINE_UP_DONT_FIRE_TOO_FAR_AWAY_RIGHT_SIDE
|
|
v_start_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.3429, 3.6245, 0.8325>>)
|
|
v_end_offset = <<-5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 3.0), -5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0), -5.0 - GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0)>>
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
v_end_offset.z *= -1.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF FIRE_ROCKET(v_start_pos, SetPieceCarID[i_current_lester_target], s_gold_choppers[0].veh, v_end_offset, FALSE, FALSE, f_speed_multiplier)
|
|
b_has_text_label_triggered[BS2B_RELOAD] = FALSE
|
|
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_RELOAD_THEN_AIM)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_LESTER_RPG_scene")
|
|
START_AUDIO_SCENE("BS_2B_LESTER_RPG_scene")
|
|
ENDIF
|
|
|
|
b_has_text_label_triggered[BS2B_GOSHOT] = FALSE
|
|
|
|
i_player_rocket_event = 50
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50 //Reload and update target if they were hit.
|
|
INT i_random
|
|
|
|
IF i_rocket_timer != 0
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_LESTER_RPG_scene")
|
|
STOP_AUDIO_SCENE("BS_2B_LESTER_RPG_scene")
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - i_rocket_timer > 200
|
|
IF e_heli_state[i_current_lester_target] = ENEMY_HELI_BLOW_UP
|
|
OR NOT DOES_BLIP_EXIST(blip_chase_cops[i_current_lester_target]) //Chopper was blown up.
|
|
i_random = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
IF (i_random = 0 AND CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CHOHIT", CONV_PRIORITY_MEDIUM))
|
|
OR (i_random = 1 AND CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HITL", CONV_PRIORITY_MEDIUM))
|
|
i_rocket_timer = GET_GAME_TIMER()
|
|
|
|
IF i_num_choppers_still_alive = 0
|
|
i_player_rocket_event = 100 //All targets are dead.
|
|
ELSE
|
|
i_player_rocket_event = 1
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0)
|
|
|
|
i_num_rockets_for_current_target = 0
|
|
ENDIF
|
|
ELSE
|
|
i_random = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
IF (i_random = 0 AND CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CHOMISS", CONV_PRIORITY_MEDIUM))
|
|
OR (i_random = 1 AND CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MISSL", CONV_PRIORITY_MEDIUM))
|
|
i_rocket_timer = GET_GAME_TIMER()
|
|
i_player_rocket_event = 1
|
|
i_num_rockets_for_current_target++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
UPDATE_LESTER_ROCKET_ANIMS()
|
|
|
|
ENDIF
|
|
ELSE
|
|
//This is a good point to reset any variables (e.g. if we skipped here)
|
|
i_player_rocket_event = 0
|
|
//i_enemy_rocket_event = 0
|
|
i_rocket_timer = GET_GAME_TIMER()
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(i_heli_explosion_timers) i
|
|
i_heli_explosion_timers[i] = 0
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
UPDATE_ROCKETS()
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF b_debug_test_chopper_respawning
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1,LEFTSHOULDER1)
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[1])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[1])
|
|
ADD_EXPLOSION(GET_ENTITY_COORDS(SetPieceCarID[1]), EXP_TAG_PLANE, 1.0)
|
|
SET_ENTITY_HEALTH(SetPieceCarID[1], 0)
|
|
SET_VEHICLE_ENGINE_HEALTH(SetPieceCarID[1], -100)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[1], -100)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
/// Plays car horns on the nearest vehicle
|
|
PROC UPDATE_CHASE_HORNS(INT &i_horn_timer, VEHICLE_INDEX veh_closest)
|
|
//General horns for all vehicles: get the nearest vehicle and play horn
|
|
IF GET_GAME_TIMER() - i_horn_timer > 2000
|
|
IF IS_VEHICLE_DRIVEABLE(veh_closest)
|
|
PED_INDEX ped_closest = GET_PED_IN_VEHICLE_SEAT(veh_closest)
|
|
|
|
IF NOT IS_PED_INJURED(ped_closest)
|
|
START_VEHICLE_HORN(veh_closest, 2000)
|
|
|
|
i_horn_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Creates a new load scene sphere and waits until it has finished loading or it times out.
|
|
PROC NEW_LOAD_SCENE_SPHERE_WITH_WAIT(VECTOR vPos, FLOAT fRadius, NEWLOADSCENE_FLAGS controlFlags = 0, INT iMaxWaitTime = 10000)
|
|
INT iTimeOut = GET_GAME_TIMER()
|
|
|
|
WHILE GET_GAME_TIMER() - iTimeOut < iMaxWaitTime
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_START_SPHERE(vPos, fRadius, controlFlags)
|
|
ELIF IS_NEW_LOAD_SCENE_LOADED()
|
|
iTimeOut = 0
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDPROC
|
|
|
|
PROC UPDATE_VEHICLE_SPINNING_WHEN_SHOT(VEHICLE_INDEX &veh, INT &i_spin_timer, BOOL b_spin_left = FALSE)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
PED_INDEX ped_driver = GET_PED_IN_VEHICLE_SEAT(veh)
|
|
|
|
IF i_spin_timer = 0
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
|
|
i_spin_timer = 1
|
|
ENDIF
|
|
ELIF i_spin_timer = 1
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
|
|
IF ABSF(GET_ENTITY_SPEED(veh)) > 4.0
|
|
IF IS_PED_INJURED(ped_driver)
|
|
SET_VEHICLE_ENGINE_HEALTH(veh, 30.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh, 2000.0)
|
|
i_spin_timer = GET_GAME_TIMER()
|
|
ELSE
|
|
//Playback stopped naturally, kill the car off to stop it being driven.
|
|
SET_ENTITY_HEALTH(ped_driver, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - i_spin_timer < 600
|
|
INT i_force_modifier = 1
|
|
|
|
IF NOT b_spin_left
|
|
i_force_modifier = -1
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(veh, APPLY_TYPE_FORCE, <<35.0 * i_force_modifier, 0.0, 0.0>>, <<0.0, 1.8, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
ELSE
|
|
//Kill the car off
|
|
SET_VEHICLE_ENGINE_HEALTH(veh, -100.0)
|
|
SET_ENTITY_HEALTH(veh, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAS_TROLLEY_ROPE_ATTACHMENT_BEEN_BROKEN(INT &i_heli_detach_timer, INT i_heli_index)
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
AND DOES_ENTITY_EXIST(obj_gold_containers[i_heli_index])
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
VECTOR v_offset_from_chopper = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]))
|
|
|
|
//PRINTLN(v_offset_from_chopper)
|
|
|
|
IF v_offset_from_chopper.z > -1.0
|
|
OR NOT IS_ENTITY_IN_AIR(s_gold_choppers[i_heli_index].veh)
|
|
IF GET_GAME_TIMER() - i_heli_detach_timer > 500
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
i_heli_detach_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC DISPLAY_TAKE()
|
|
IF i_displayed_take != i_current_take
|
|
//IF HAS_SOUND_FINISHED(iMoneyCountSoundID)
|
|
// PLAY_SOUND_FRONTEND(iMoneyCountSoundID, "ROBBERY_MONEY_TOTAL", "HUD_FRONTEND_CUSTOM_SOUNDSET")
|
|
//ENDIF
|
|
|
|
IF i_displayed_take > i_current_take
|
|
i_displayed_take = i_displayed_take - ROUND(0 +@ 10000000)
|
|
|
|
IF i_displayed_take < i_current_take
|
|
i_displayed_take = i_current_take
|
|
ENDIF
|
|
ELSE
|
|
i_displayed_take = i_displayed_take + ROUND(0 +@ 10000000)
|
|
|
|
IF i_displayed_take > i_current_take
|
|
i_displayed_take = i_current_take
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//IF NOT HAS_SOUND_FINISHED(iMoneyCountSoundID)
|
|
// STOP_SOUND(iMoneyCountSoundID)
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
MPGlobalsScoreHud.bTitleExtraLeftJustified = TRUE
|
|
|
|
IF i_displayed_take > i_current_take
|
|
DRAW_GENERIC_SCORE(i_displayed_take, "CMN_TAKE", HEIST_TAKE_DISPLAY_FLASH_TIME, HUD_COLOUR_RED, HUDORDER_DONTCARE, FALSE, "HUD_CASH", FALSE, 0.0, HUDFLASHING_FLASHWHITE, 250)
|
|
ELSE
|
|
DRAW_GENERIC_SCORE(i_displayed_take, "CMN_TAKE", HEIST_TAKE_DISPLAY_FLASH_TIME, HUD_COLOUR_GREEN, HUDORDER_DONTCARE, FALSE, "HUD_CASH", FALSE, 0.0, HUDFLASHING_FLASHWHITE, 250)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(BOOL b_active)
|
|
INT i
|
|
|
|
IF b_active
|
|
IF cover_shootout[0] = NULL
|
|
cover_shootout[0] = ADD_COVER_POINT(<<-30.6895, -683.1865, 48.5083>>, 112.9372, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
ENDIF
|
|
|
|
IF cover_shootout[1] = NULL
|
|
cover_shootout[1] = ADD_COVER_POINT(<<-140.4568, -551.9787, 39.4984>>, 279.8140, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF cover_shootout[2] = NULL
|
|
cover_shootout[2] = ADD_COVER_POINT(<<-115.2832, -547.3452, 39.4987>>, 99.2825, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF cover_shootout[3] = NULL
|
|
cover_shootout[3] = ADD_COVER_POINT(<<-117.7532, -547.9827, 39.4984>>, 279.3659, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(cover_shootout) i
|
|
IF cover_shootout[i] != NULL
|
|
REMOVE_COVER_POINT(cover_shootout[i])
|
|
cover_shootout[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_SCRIPTED_TUNNEL_COVER_ACTIVE(BOOL b_active)
|
|
INT i
|
|
|
|
IF b_active
|
|
IF cover_tunnel[0] = NULL
|
|
cover_tunnel[0] = ADD_COVER_POINT(<<9.8065, -657.1228, 15.1062>>, 159.6641, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
ENDIF
|
|
|
|
IF cover_tunnel[1] = NULL
|
|
cover_tunnel[1] = ADD_COVER_POINT(<<4.7407, -655.3938, 15.0954>>, 165.0990, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(cover_tunnel) i
|
|
IF cover_tunnel[i] != NULL
|
|
REMOVE_COVER_POINT(cover_tunnel[i])
|
|
cover_tunnel[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC SET_CUTSCENE_PED_COMPONENT_VARIATIONS(STRING strCutsceneName)
|
|
INT iNameHash = GET_HASH_KEY(strCutsceneName)
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
IF iNameHash = HASH("bs_2b_mcs_3")
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
|
|
ELIF iNameHash = HASH("bs_2b_mcs_1")
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
|
|
ELIF iNameHash = HASH("bs_2b_ext_alt1a")
|
|
IF NOT IS_PED_INJURED(s_lester.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lester", s_lester.ped)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
|
|
|
|
//Gunman may not exist when the cutscene is created.
|
|
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_1", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID), CREW_OUTFIT_SUIT)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_DECL, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_HAIR, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_LEG, 5, 2)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_TORSO, 5, 2)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_FEET, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_BERD, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_SPECIAL, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_SPECIAL2, 0, 0)
|
|
|
|
//SET_CUTSCENE_PED_PROP_VARIATION("gunman_selection_1", ANCHOR_EARS, 0)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Driver_selection", s_crew[CREW_DRIVER_ID].ped)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TORSO, 0, 2)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_LEG, 0, 2)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_FEET, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL2, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_JBIB, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAND, 7, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_DECL, 0, 0)
|
|
//SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EARS, 0)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_TORSO, 18, 4)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_LEG, 15, 4)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_FEET, 10, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_SPECIAL, 14, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_SPECIAL2, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_JBIB, 5, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_HAND, 4, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_DECL, 0, 0)
|
|
//SET_CUTSCENE_PED_PROP_VARIATION("Franklin", ANCHOR_EARS, 0)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", PLAYER_PED_ID())
|
|
ELIF iNameHash = HASH("bs_2b_ext_alt2")
|
|
IF NOT IS_PED_INJURED(s_lester.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lester", s_lester.ped)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
|
|
|
|
//Gunman may not exist when the cutscene is created.
|
|
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_1", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID), CREW_OUTFIT_SUIT)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_DECL, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_HAIR, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_LEG, 5, 2)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_TORSO, 5, 2)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_FEET, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_BERD, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_SPECIAL, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_1", PED_COMP_SPECIAL2, 0, 0)
|
|
|
|
//SET_CUTSCENE_PED_PROP_VARIATION("gunman_selection_1", ANCHOR_EARS, 0)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Driver_selection", s_crew[CREW_DRIVER_ID].ped)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TORSO, 0, 2)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_LEG, 0, 2)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_FEET, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL2, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_JBIB, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAND, 7, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_DECL, 0, 0)
|
|
//SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EARS, 0) //Don't want the headset on.
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_TORSO, 18, 4)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_LEG, 15, 4)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_FEET, 10, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_SPECIAL, 14, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_SPECIAL2, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_JBIB, 5, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_HAND, 4, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Franklin", PED_COMP_DECL, 0, 0)
|
|
//SET_CUTSCENE_PED_PROP_VARIATION("Franklin", ANCHOR_EARS, 0)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// Cancels any music events from this mission that may
|
|
PROC CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
CANCEL_MUSIC_EVENT("FH2B_MISSION_START")
|
|
CANCEL_MUSIC_EVENT("FH2B_WALL_SMASH")
|
|
CANCEL_MUSIC_EVENT("FH2B_EXPLODE")
|
|
CANCEL_MUSIC_EVENT("FH2B_HELI_ARRIVE")
|
|
CANCEL_MUSIC_EVENT("FH2B_FIGHT_START")
|
|
CANCEL_MUSIC_EVENT("FH2B_SWITCH_2")
|
|
CANCEL_MUSIC_EVENT("FH2B_VAN_START")
|
|
CANCEL_MUSIC_EVENT("FH2B_TANKER")
|
|
CANCEL_MUSIC_EVENT("FH2B_SWITCH_3")
|
|
CANCEL_MUSIC_EVENT("FH2B_GOLD_DROPPED")
|
|
ENDPROC
|
|
|
|
///Fail cleanup cannot delete peds in the same group/vehicle as the player, so use this to force delete them.
|
|
PROC FORCE_DELETE_PED_FOR_FAIL(PED_INDEX ped)
|
|
IF NOT IS_ENTITY_DEAD(ped)
|
|
IF IS_PED_GROUP_MEMBER(ped, PLAYER_GROUP_ID())
|
|
OR ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), ped)
|
|
REMOVE_PED(ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MISSION_SETUP()
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
|
|
|
|
REQUEST_ADDITIONAL_TEXT("FINAL3B", MISSION_TEXT_SLOT)
|
|
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
|
|
ADD_RELATIONSHIP_GROUP("COPS", rel_group_cops)
|
|
ADD_RELATIONSHIP_GROUP("COPS2", rel_cops_buddy_ignore)
|
|
ADD_RELATIONSHIP_GROUP("NEUTRAL", rel_group_neutral)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, rel_group_cops)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, rel_group_neutral)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_PLAYER, rel_cops_buddy_ignore)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_cops, rel_group_cops)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rel_group_cops, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_cops, rel_group_neutral)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_cops, rel_cops_buddy_ignore)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_neutral, rel_group_neutral)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_neutral, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_neutral, rel_group_cops)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_group_neutral, rel_cops_buddy_ignore)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_cops_buddy_ignore, rel_group_neutral)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rel_cops_buddy_ignore, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_cops_buddy_ignore, rel_group_cops)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_cops_buddy_ignore, rel_cops_buddy_ignore)
|
|
|
|
i_cutter_sound_id = GET_SOUND_ID()
|
|
i_gold_container_sound_id = GET_SOUND_ID()
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(s_rockets) i
|
|
s_rockets[i].i_sound = GET_SOUND_ID()
|
|
ENDREPEAT
|
|
|
|
//group_player = GET_PLAYER_GROUP(PLAYER_ID())
|
|
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<2.1, -704.1, 15.1>>, TRUE)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<-0.6, -703.1, 15.1>>, TRUE)
|
|
|
|
//Lock the vault gates for the entire mission
|
|
i_bank_door_hashes[0] = HASH("Finale_Bank_Gate_1")
|
|
i_bank_door_hashes[1] = HASH("Finale_Bank_Gate_2")
|
|
i_bank_door_hashes[2] = HASH("Finale_Bank_Gate_3")
|
|
i_bank_door_hashes[3] = HASH("Finale_Bank_Gate_4")
|
|
i_bank_door_hashes[4] = HASH("Finale_Bank_Gate_5")
|
|
i_bank_door_hashes[5] = HASH("Finale_Bank_Gate_6")
|
|
i_bank_door_hashes[6] = HASH("Finale_Bank_Gate_7")
|
|
i_bank_door_hashes[7] = HASH("Finale_Bank_Gate_8")
|
|
i_bank_door_hashes[8] = HASH("Finale_Bank_Gate_9")
|
|
i_bank_door_hashes[9] = HASH("Finale_Bank_Gate_10")
|
|
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[0], V_ILEV_FINGATE, <<-7.4, -678.7, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[1], V_ILEV_FINGATE, <<4.4, -682.9, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[2], V_ILEV_FINGATE, <<-3.0, -676.6, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[3], V_ILEV_FINGATE, <<2.3, -678.6, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[4], V_ILEV_FINGATE, <<-1.0, -671.1, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[5], V_ILEV_FINGATE, <<4.3, -673.0, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[6], V_ILEV_FINGATE, <<8.2, -672.4, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[7], V_ILEV_FINGATE, <<-3.6, -668.2, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[8], V_ILEV_FINGATE, <<10.6, -666.6, 16.4>>)
|
|
ADD_DOOR_TO_SYSTEM(i_bank_door_hashes[9], V_ILEV_FINGATE, <<-1.7, -662.1, 16.4>>)
|
|
|
|
REPEAT COUNT_OF(i_bank_door_hashes) i
|
|
DOOR_SYSTEM_SET_DOOR_STATE(i_bank_door_hashes[i], DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDREPEAT
|
|
|
|
ROPE_LOAD_TEXTURES()
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_cutter, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_start_car, TRUE)
|
|
|
|
sbi_bank_guard = ADD_SCENARIO_BLOCKING_AREA(<<0.6, -713.0, 40.0>>, <<5.1, -704.0, 50.0>>)
|
|
sbi_tunnel_hole = ADD_SCENARIO_BLOCKING_AREA(<<-6.3514, -662.3804, 10.0184>>, <<73.9236, -587.0708, 52.0184>>)
|
|
|
|
//Don't disable strip clubs if we're triggering the mission from the timelapse, as peds are visibly cleared.
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DISABLE_STRIP_CLUBS()
|
|
ENDIF
|
|
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("clear", 20.0)
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_DESTROYED)
|
|
SET_BUILDING_STATE( BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_DESTROYED)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_DESTROYED)
|
|
|
|
b_were_ipls_reset_early = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CREATE_WIDGETS()
|
|
|
|
s_skip_menu[0].sTxtLabel = "START_CUTSCENE (BS_2B_MCS_3)"
|
|
s_skip_menu[1].sTxtLabel = "GO_TO_BANK"
|
|
s_skip_menu[2].sTxtLabel = "DRILL_THROUGH_WALL"
|
|
s_skip_menu[3].sTxtLabel = "BLOW_UP_DOORS"
|
|
s_skip_menu[4].sTxtLabel = "COLLECT_GOLD"
|
|
s_skip_menu[5].sTxtLabel = "WINCH_GOLD_CUTSCENE (BS_2B_MCS_1)"
|
|
s_skip_menu[6].sTxtLabel = "TUNNEL_SHOOTOUT"
|
|
s_skip_menu[7].sTxtLabel = "LEAVE_BANK"
|
|
s_skip_menu[8].sTxtLabel = "CITY_SHOOTOUT"
|
|
s_skip_menu[9].sTxtLabel = "CITY_SHOOTOUT_MID_POINT"
|
|
s_skip_menu[10].sTxtLabel = "LOSE_COPS"
|
|
s_skip_menu[11].sTxtLabel = "CHOPPER_CHASE"
|
|
s_skip_menu[12].sTxtLabel = "DROP_GOLD_ON_TRAIN"
|
|
s_skip_menu[13].sTxtLabel = "DROP_GOLD_CUTSCENE"
|
|
s_skip_menu[14].sTxtLabel = "LAND_AT_AIRFIELD"
|
|
s_skip_menu[15].sTxtLabel = "END_CUTSCENE (BS_2B_EXT_ALT)"
|
|
#ENDIF
|
|
|
|
b_has_changed_clothes_michael = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
|
|
b_has_changed_clothes_franklin = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN)
|
|
b_has_changed_clothes_trevor = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
|
|
|
|
//Store the skill levels of the crew members for use later
|
|
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID)) = CMSK_GOOD
|
|
b_picked_good_driver = TRUE
|
|
b_crew_driver_set_to_die = FALSE
|
|
ELSE
|
|
b_picked_good_driver = FALSE
|
|
b_crew_driver_set_to_die = TRUE //This can also be set if the good driver accidentally dies in the chase, but for the bad driver they will always die.
|
|
ENDIF
|
|
|
|
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FRANKLIN_ID)) = CMSK_GOOD
|
|
b_picked_good_franklin_gunman = TRUE
|
|
i_crew_franklin_default_accuracy = 10
|
|
ELSE
|
|
b_picked_good_franklin_gunman = FALSE
|
|
i_crew_franklin_default_accuracy = 5
|
|
ENDIF
|
|
|
|
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID)) != CMSK_BAD
|
|
b_picked_good_michael_gunman = TRUE
|
|
i_crew_michael_default_accuracy = 10
|
|
ELSE
|
|
b_picked_good_michael_gunman = FALSE
|
|
i_crew_michael_default_accuracy = 5
|
|
ENDIF
|
|
|
|
str_crew_names[CREW_MICHAEL_ID] = GET_CREW_MEMBER_NAME_LABEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID))
|
|
str_crew_names[CREW_FRANKLIN_ID] = GET_CREW_MEMBER_NAME_LABEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FRANKLIN_ID))
|
|
str_crew_names[CREW_DRIVER_ID] = GET_CREW_MEMBER_NAME_LABEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID))
|
|
|
|
IF b_crew_driver_set_to_die
|
|
i_max_take_considering_crew = MAX_OVERALL_TAKE / 2
|
|
i_take_penalty_crew_died = MAX_OVERALL_TAKE / 2
|
|
ELSE
|
|
i_max_take_considering_crew = MAX_OVERALL_TAKE
|
|
i_take_penalty_crew_died = 0
|
|
ENDIF
|
|
|
|
RESET_GENERIC_SCORE_FLASHING(0)
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
|
|
ENDPROC
|
|
|
|
PROC MISSION_CLEANUP()
|
|
CLEAR_HELP()
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_NUMBER_OF_PARKED_VEHICLES(-1)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
SET_POLICE_RADAR_BLIPS(TRUE)
|
|
DISABLE_CELLPHONE(FALSE)
|
|
HIDE_ACTIVE_PHONE(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
CLEAR_FOCUS()
|
|
SET_TIME_SCALE(1.0)
|
|
NEW_LOAD_SCENE_STOP()
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
END_SRL()
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(PLAYER_PED_ID())
|
|
DETACH_ENTITY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
SET_PLAYER_SPRINT(PLAYER_ID(), TRUE)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_FAKE_WANTED_LEVEL(0)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF b_is_jumping_directly_to_stage
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Only reset the rayfire if the player didn't die, otherwise it needs to go through the delayed cleanup header.
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_RESET)
|
|
ENDIF
|
|
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_RESET)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//SET_VAULT_GATES_AS_FORCED_OBJECTS(FALSE, b_is_jumping_directly_to_stage)
|
|
|
|
IF interior_tunnels[0] != NULL
|
|
UNPIN_INTERIOR(interior_tunnels[0])
|
|
interior_tunnels[0] = NULL
|
|
ENDIF
|
|
|
|
IF interior_tunnels[1] != NULL
|
|
UNPIN_INTERIOR(interior_tunnels[1])
|
|
interior_tunnels[1] = NULL
|
|
ENDIF
|
|
|
|
IF interior_vault != NULL
|
|
UNPIN_INTERIOR(interior_vault)
|
|
interior_vault = NULL
|
|
ENDIF
|
|
|
|
IF i_tunnel_navmesh_block != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_tunnel_navmesh_block)
|
|
i_tunnel_navmesh_block = -1
|
|
ENDIF
|
|
|
|
IF i_bridge_navmesh_block != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_bridge_navmesh_block)
|
|
i_bridge_navmesh_block = -1
|
|
ENDIF
|
|
|
|
IF i_stairs_navmesh_block != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_stairs_navmesh_block)
|
|
i_stairs_navmesh_block = -1
|
|
ENDIF
|
|
|
|
IF i_ramp_navmesh_block_1 != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_1)
|
|
i_ramp_navmesh_block_1 = -1
|
|
ENDIF
|
|
|
|
IF i_ramp_navmesh_block_2 != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_2)
|
|
i_ramp_navmesh_block_2 = -1
|
|
ENDIF
|
|
|
|
REMOVE_COVER_POINT(cover_player)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF s_heli_ropes_new[i].rope != NULL
|
|
DELETE_ROPE(s_heli_ropes_new[i].rope)
|
|
s_heli_ropes_new[i].rope = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_ROPE_EXIST(rope_cutscene)
|
|
DELETE_ROPE(rope_cutscene)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_rockets) i
|
|
IF s_rockets[i].ptfx != NULL
|
|
STOP_PARTICLE_FX_LOOPED(s_rockets[i].ptfx)
|
|
s_rockets[i].ptfx = NULL
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(s_rockets[i].i_sound)
|
|
STOP_SOUND(s_rockets[i].i_sound)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
|
|
STOP_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", b_is_jumping_directly_to_stage)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
|
|
STOP_SOUND(i_cutter_sound_id)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_gold_container_sound_id)
|
|
STOP_SOUND(i_gold_container_sound_id)
|
|
ENDIF
|
|
|
|
REMOVE_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT")
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_MISSION_FAIL")
|
|
|
|
IF NOT HAS_CUTSCENE_FINISHED()
|
|
STOP_CUTSCENE()
|
|
ENDIF
|
|
|
|
REMOVE_CUTSCENE()
|
|
|
|
IF b_is_jumping_directly_to_stage
|
|
WHILE IS_CUTSCENE_ACTIVE()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
//If we started a replay recording then make sure it's cancelled if we're performing cleanup.
|
|
IF b_replay_event_started
|
|
REPLAY_STOP_EVENT()
|
|
b_replay_event_started = FALSE
|
|
ENDIF
|
|
|
|
REMOVE_PTFX_ASSET()
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
SET_NOISEOVERIDE(FALSE)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 9)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 8)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 7)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 6)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 5)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 4)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 3)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 2)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 1)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, 0)
|
|
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_heli_end)
|
|
|
|
REMOVE_ALL_BLIPS()
|
|
REMOVE_ALL_CAMERAS()
|
|
REMOVE_ALL_OBJECTS(b_is_jumping_directly_to_stage)
|
|
REMOVE_ALL_PEDS(b_is_jumping_directly_to_stage)
|
|
REMOVE_ALL_VEHICLES(b_is_jumping_directly_to_stage)
|
|
|
|
REMOVE_MODEL_HIDE(v_vault_gate_pos_1, 2.0, model_vault_gates, TRUE)
|
|
REMOVE_MODEL_HIDE(v_vault_gate_pos_2, 2.0, model_vault_gates, TRUE)
|
|
|
|
STOP_AUDIO_SCENES()
|
|
STOP_STREAM()
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
|
|
|
|
IF model_suppressed_getaway != DUMMY_MODEL_FOR_SCRIPT
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_suppressed_getaway, FALSE)
|
|
ENDIF
|
|
|
|
DISABLE_ROADS_FOR_CITY_SHOOTOUT(FALSE)
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(FALSE)
|
|
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(FALSE)
|
|
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
SET_SELECTOR_PED_ACTIVITY(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_ACTIVITY_DEFAULT)
|
|
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-91.637230,-575.683105,40.183411>>, <<-171.572296,-794.956055,30.708052>>, 229.750000)
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-227.156067,-518.369263,40.960091>>, <<-303.200714,-689.523193,31.132313>>, 87.000000)
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>, TRUE)
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
REPEAT COUNT_OF(sbi_airfield) i
|
|
IF sbi_airfield[i] != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbi_airfield[i])
|
|
sbi_airfield[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF sbi_shootout != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbi_shootout)
|
|
sbi_shootout = NULL
|
|
ENDIF
|
|
|
|
IF sbi_chase_start != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbi_chase_start)
|
|
sbi_chase_start = NULL
|
|
ENDIF
|
|
|
|
SET_SCENARIO_GROUP_ENABLED("Grapeseed_Planes", TRUE)
|
|
|
|
IF NOT b_is_jumping_directly_to_stage
|
|
//Clean up anything that was created in the initial setup (this stuff must not be cleaned up if p-skipping)
|
|
#IF IS_DEBUG_BUILD
|
|
DESTROY_WIDGETS()
|
|
#ENDIF
|
|
|
|
IF sbi_bank_guard != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbi_bank_guard)
|
|
sbi_bank_guard = NULL
|
|
ENDIF
|
|
|
|
IF sbi_tunnel_hole != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbi_tunnel_hole)
|
|
sbi_tunnel_hole = NULL
|
|
ENDIF
|
|
|
|
IF NOT b_were_ipls_reset_early
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_NORMAL, TRUE)
|
|
SET_BUILDING_STATE( BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_NORMAL, TRUE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_NORMAL, TRUE)
|
|
ENDIF
|
|
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENABLE_STRIP_CLUBS()
|
|
|
|
RELEASE_SOUND_ID(i_cutter_sound_id)
|
|
RELEASE_SOUND_ID(i_gold_container_sound_id)
|
|
|
|
UNREGISTER_SCRIPT_WITH_AUDIO()
|
|
|
|
ROPE_UNLOAD_TEXTURES()
|
|
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<2.1, -704.1, 15.1>>, FALSE)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<-0.6, -703.1, 15.1>>, FALSE)
|
|
|
|
//Reset the vault gates
|
|
REPEAT COUNT_OF(i_bank_door_hashes) i
|
|
DOOR_SYSTEM_SET_DOOR_STATE(i_bank_door_hashes[i], DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
REMOVE_DOOR_FROM_SYSTEM(i_bank_door_hashes[i])
|
|
ENDREPEAT
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_cutter, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_start_car, FALSE)
|
|
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
ELSE
|
|
CLEAR_TRIGGERED_LABELS()
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
CLEAR_AREA(v_zero, 10000.0, TRUE, TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(veh_gold_train)
|
|
DELETE_MISSION_TRAIN(veh_gold_train)
|
|
ENDIF
|
|
|
|
CLEANUP_UBER_PLAYBACK()
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_car)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_merry)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cutter)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_trevor_gold_chopper)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_container)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_tunnel_crate)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_tunnel_crate_2)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_tunnel_crate_3)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_rope_weight)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_engine)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_carriage)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_rocket_helper)
|
|
|
|
REMOVE_ANIM_DICT(str_anim_cutter)
|
|
REMOVE_ANIM_DICT(str_anim_ig_2)
|
|
REMOVE_ANIM_DICT(str_anim_rocket_reload)
|
|
REMOVE_ANIM_DICT(str_anim_rocket_signal)
|
|
REMOVE_ANIM_DICT(str_anim_rockets)
|
|
REMOVE_ANIM_DICT(str_anim_trolley_push_out)
|
|
REMOVE_ANIM_DICT(str_anim_trolley_push_in)
|
|
REMOVE_ANIM_DICT(str_anim_crew_action_idle)
|
|
REMOVE_ANIM_DICT(str_anim_custom_switch)
|
|
REMOVE_ANIM_DICT(str_anim_custom_switch2)
|
|
REMOVE_ANIM_DICT(str_anim_cam_shake)
|
|
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
|
|
REMOVE_VEHICLE_ASSET(model_cop_car)
|
|
REMOVE_VEHICLE_ASSET(model_cop_heli)
|
|
REMOVE_VEHICLE_ASSET(model_swat_van)
|
|
REMOVE_VEHICLE_ASSET(model_start_car)
|
|
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_enter_left)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_enter_right)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_exit_left)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_exit_right)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_left)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_right)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_1, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_3, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_4, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_5, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_6, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_1, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_RAMP, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_1, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_COURTYARD, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_MERRY_HELI, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
STOP_STREAM()
|
|
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DISABLE_VEH_CONTROLS_THIS_FRAME()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_DOWN_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_UP_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_LEFT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_RIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UP_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL_ABILITY_FRANKLIN)
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_DOWN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_DOWN_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UP_ONLY)
|
|
ENDPROC
|
|
|
|
PROC SET_HEIST_CREW_END_SCREEN_STATUSES()
|
|
INT i
|
|
REPEAT GET_HEIST_CREW_SIZE(HEIST_FINALE) i
|
|
IF i = CREW_DRIVER_ID
|
|
IF NOT b_crew_driver_set_to_die
|
|
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
|
|
ELSE
|
|
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_KILLED)
|
|
ENDIF
|
|
ELIF i = CREW_MICHAEL_ID
|
|
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
|
|
ELSE
|
|
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC SET_END_SCREEN_TAKE()
|
|
SET_HEIST_CREW_END_SCREEN_STATUSES()
|
|
|
|
SET_HEIST_END_SCREEN_POTENTIAL_TAKE(HEIST_FINALE, MAX_OVERALL_TAKE)
|
|
SET_HEIST_END_SCREEN_ACTUAL_TAKE(HEIST_FINALE, MAX_OVERALL_TAKE)
|
|
|
|
ADD_PENALTY_TO_HEIST(HEIST_FINALE, HEIST_PENALTY_MONEY_DROPPED, i_take_penalty_crew_died)
|
|
ENDPROC
|
|
|
|
PROC MISSION_PASSED(BOOL bPassScreenAlreadyDisplayed = FALSE)
|
|
IF NOT bPassScreenAlreadyDisplayed
|
|
SET_END_SCREEN_TAKE()
|
|
ENDIF
|
|
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, b_has_changed_clothes_franklin)
|
|
|
|
AWARD_ACHIEVEMENT_FOR_MISSION(ACH09) // The Big One
|
|
Mission_Flow_Mission_Passed()
|
|
MISSION_CLEANUP()
|
|
ENDPROC
|
|
|
|
PROC JUMP_TO_STAGE(MISSION_STAGE stage, BOOL bIsDebugJump = FALSE)
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
b_is_jumping_directly_to_stage = TRUE
|
|
i_current_event = 0
|
|
e_mission_stage = stage
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
MISSION_CLEANUP()
|
|
|
|
//Update mission checkpoint in case they skipped the stages where it gets set.
|
|
IF bIsDebugJump
|
|
IF e_mission_stage >= STAGE_LAND_AT_AIRFIELD
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FLY_BACK, "LAND_AT_AIRFIELD", TRUE)
|
|
ELIF e_mission_stage >= STAGE_DROP_GOLD_ON_TRAIN
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DROPOFF_GOLD, "DROP_OFF_GOLD")
|
|
ELIF e_mission_stage >= STAGE_CHOPPER_CHASE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_HELI_CHASE, "CHOPPER_CHASE")
|
|
ELIF e_mission_stage >= STAGE_LOSE_COPS
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LOSE_COPS, "LOSE_COPS")
|
|
ELIF e_mission_stage >= STAGE_CITY_SHOOTOUT_MID_POINT
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT_MID, "CITY_SHOOTOUT_MID_POINT")
|
|
ELIF e_mission_stage >= STAGE_CITY_SHOOTOUT
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT, "CITY_SHOOTOUT")
|
|
ELIF e_mission_stage >= STAGE_TUNNEL_SHOOTOUT
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_TUNNEL_SHOOTOUT, "TUNNEL_SHOOTOUT")
|
|
ELIF e_mission_stage >= STAGE_DRILL_THROUGH_WALL
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DRILL, "DRILL_THROUGH_WALL")
|
|
ELIF e_mission_stage >= STAGE_GO_TO_BANK
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "GO_TO_BANK")
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DISABLE_WANTED_LEVEL_FOR_SHOOTOUT()
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_POLICE_RADAR_BLIPS(FALSE)
|
|
CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
ENDPROC
|
|
|
|
///Gets the ped index for a given player ped character, if the character is the player it returns PLAYER_PED_ID(), otherwise it returns the relevant selector ped.
|
|
FUNC PED_INDEX GET_PED_INDEX(enumCharacterList eChar)
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = eChar
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN s_selector_peds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(eChar)]
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
PROC SETUP_MICHAEL_OUTFIT(BOOL b_needs_balaclava = FALSE)
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
//Boiler suit
|
|
/*SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_BOILER_SUIT_4, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_BOILER_SUIT_4, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_FEET, FEET_P0_1, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL2, SPECIAL2_P0_NONE, FALSE)*/
|
|
|
|
//Dress suit
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_GREY_SUIT_2, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GREY_SUIT_02, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_FEET, FEET_P0_BLACK_SHOES, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL2, SPECIAL2_P0_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_JBIB, JBIB_P0_TIE, FALSE)
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_HAND, HAND_P0_BLACK_GLOVES, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL, SPECIAL_P0_NONE, FALSE)
|
|
|
|
IF b_needs_balaclava
|
|
//SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL, SPECIAL_P0_BALACLAVA, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_DECL, DECL_P0_MASK_3, FALSE)
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
|
|
ELSE
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_DECL, DECL_P0_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET, FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SETUP_TREVOR_OUTFIT()
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET, FALSE)
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_SPECIAL2, SPECIAL2_P2_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_SPECIAL, SPECIAL_P2_DUMMY, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_HAND, HAND_P2_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
|
|
|
|
//Boiler suit
|
|
/*SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_LEGS, LEGS_P2_BOILER_SUIT_BLUE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_TORSO, TORSO_P2_BOILER_SUIT_BLUE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_FEET, FEET_P2_BLACK_BOOTS, FALSE)*/
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_5, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_FEET, FEET_P2_LOAFERS, FALSE)
|
|
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SETUP_FRANKLIN_OUTFIT(BOOL b_needs_balaclava = FALSE, BOOL b_needs_gloves = TRUE)
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
IF b_needs_gloves
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_BLACK_GLOVES, FALSE)
|
|
ELSE
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_NONE, FALSE)
|
|
ENDIF
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
|
|
|
|
//Boiler suit
|
|
/*SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_LEGS, LEGS_P1_BLUE_BOILER, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_TORSO, TORSO_P1_BLUE_BOILER, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_FEET, FEET_P0_7, FALSE)*/
|
|
|
|
//Dress suit
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_LEGS, LEGS_P1_SUIT_4, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_TORSO, TORSO_P1_SUIT_4, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_FEET, FEET_P1_SMART_SHOES, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_JBIB, JBIB_P1_SHIRT_A, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_SPECIAL2, SPECIAL2_P1_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_SPECIAL, SPECIAL_P1_DUMMY, FALSE)
|
|
|
|
IF b_needs_balaclava
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_DECL, DECL_P1_MASK_3, FALSE)
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
|
|
ELSE
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_DECL, DECL_P1_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SETUP_GUNMAN_OUTFIT(PED_INDEX ped, BOOL b_needs_balaclava = FALSE)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_DECL, 1, 0)
|
|
IF b_needs_balaclava
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, 0, 0)
|
|
ELSE
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, 1, 0)
|
|
ENDIF
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 5, 2)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, 5, 2)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_FEET, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_BERD, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL2, 0, 0)
|
|
|
|
SET_PED_PROP_INDEX(ped, ANCHOR_EARS, 0)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SETUP_DRIVER_OUTFIT()
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID)
|
|
|
|
IF eCrewID = CM_DRIVER_G_TALINA_UNLOCK
|
|
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_HAIR, 2, 0)
|
|
ELSE
|
|
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_HAIR, 0, 0)
|
|
ENDIF
|
|
SET_PED_PROP_INDEX(s_crew[CREW_DRIVER_ID].ped, ANCHOR_EARS, 0)
|
|
|
|
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_LEG, 3, 2)
|
|
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_TORSO, 4, 2)
|
|
SET_PED_COMPONENT_VARIATION(s_crew[CREW_DRIVER_ID].ped, PED_COMP_SPECIAL, 1, 0)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL SETUP_REQ_FINAL_CAR(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(veh_final_car)
|
|
REQUEST_MODEL(TAILGATER)
|
|
REQUEST_VEHICLE_ASSET(TAILGATER, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(TAILGATER)
|
|
AND HAS_VEHICLE_ASSET_LOADED(TAILGATER)
|
|
IF NOT b_just_request_assets
|
|
veh_final_car = CREATE_VEHICLE(TAILGATER, v_pos, f_heading)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(veh_final_car, FALSE)
|
|
SET_VEHICLE_COLOURS(veh_final_car, 31, 31)
|
|
SET_VEHICLE_EXTRA_COLOURS(veh_final_car, 10, 0)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(veh_final_car, "54AJM610")
|
|
SET_VEHICLE_DIRT_LEVEL(veh_final_car, 3.0)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(TAILGATER)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(BOOL b_request_models_only = FALSE, BOOL b_force_create_closed_containers = FALSE, BOOL b_ignore_entity_exist_check = FALSE)
|
|
MODEL_NAMES model_container
|
|
|
|
IF e_mission_stage >= STAGE_WINCH_GOLD_CUTSCENE
|
|
OR b_force_create_closed_containers
|
|
model_container = model_gold_container
|
|
ELSE
|
|
model_container = model_gold_container_open
|
|
ENDIF
|
|
|
|
IF (NOT DOES_ENTITY_EXIST(obj_gold_containers[0]) OR b_ignore_entity_exist_check)
|
|
REQUEST_MODEL(model_container)
|
|
|
|
IF HAS_MODEL_LOADED(model_container)
|
|
IF NOT b_request_models_only
|
|
obj_gold_containers[0] = CREATE_OBJECT_NO_OFFSET(model_container, <<23.8434, -636.2329, 16.0034>>)
|
|
SET_ENTITY_HEADING(obj_gold_containers[0], -56.8800)
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[0], TRUE)
|
|
SET_CAN_AUTO_VAULT_ON_ENTITY(obj_gold_containers[0], FALSE)
|
|
SET_CAN_CLIMB_ON_ENTITY(obj_gold_containers[0], FALSE)
|
|
IF interior_tunnels[0] != NULL
|
|
RETAIN_ENTITY_IN_INTERIOR(obj_gold_containers[0], interior_tunnels[0])
|
|
ENDIF
|
|
|
|
obj_gold_containers[1] = CREATE_OBJECT_NO_OFFSET(model_container, <<24.9209, -639.1294, 16.0089>>)
|
|
IF model_container = model_gold_container_open
|
|
SET_ENTITY_HEADING(obj_gold_containers[1], -72.3600 + 180.0)
|
|
ELSE
|
|
SET_ENTITY_HEADING(obj_gold_containers[1], -72.3600)
|
|
ENDIF
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[1], TRUE)
|
|
SET_CAN_AUTO_VAULT_ON_ENTITY(obj_gold_containers[1], FALSE)
|
|
SET_CAN_CLIMB_ON_ENTITY(obj_gold_containers[1], FALSE)
|
|
IF interior_tunnels[0] != NULL
|
|
RETAIN_ENTITY_IN_INTERIOR(obj_gold_containers[1], interior_tunnels[0])
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_container)
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT(BOOL b_request_models_only = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(obj_gold_trolleys[0])
|
|
REQUEST_MODEL(model_large_gold_trolley)
|
|
|
|
IF HAS_MODEL_LOADED(model_large_gold_trolley)
|
|
IF NOT b_request_models_only
|
|
obj_gold_trolleys[0] = CREATE_OBJECT_NO_OFFSET(model_large_gold_trolley, <<10.411038,-663.455688, 15.524313>>)
|
|
SET_ENTITY_HEADING(obj_gold_trolleys[0], 161.475769)
|
|
|
|
//obj_gold_trolleys[1] = CREATE_OBJECT_NO_OFFSET(model_large_gold_trolley, <<1.913392,-660.422180,15.524313>>)
|
|
obj_gold_trolleys[1] = CREATE_OBJECT_NO_OFFSET(model_large_gold_trolley, <<0.1734, -659.6722, 15.5243>>)
|
|
SET_ENTITY_HEADING(obj_gold_trolleys[1], -17.945414)
|
|
|
|
IF e_mission_stage < STAGE_WINCH_GOLD_CUTSCENE
|
|
IF interior_vault != NULL
|
|
IF IS_INTERIOR_READY(interior_vault)
|
|
RETAIN_ENTITY_IN_INTERIOR(obj_gold_trolleys[0], interior_vault)
|
|
RETAIN_ENTITY_IN_INTERIOR(obj_gold_trolleys[1], interior_vault)
|
|
|
|
FORCE_ROOM_FOR_ENTITY(obj_gold_trolleys[0], interior_vault, HASH("GtaMloRoom010"))
|
|
FORCE_ROOM_FOR_ENTITY(obj_gold_trolleys[1], interior_vault, HASH("GtaMloRoom010"))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(obj_gold_trolleys[0], TRUE)
|
|
FREEZE_ENTITY_POSITION(obj_gold_trolleys[1], TRUE)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_large_gold_trolley)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_CONTAINER_WITH_TROLLEY_INSIDE(INT i_container)
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[i_container])
|
|
AND DOES_ENTITY_EXIST(obj_gold_trolleys[i_container])
|
|
DETACH_ENTITY(obj_gold_trolleys[i_container])
|
|
DETACH_ENTITY(obj_gold_containers[i_container], FALSE)
|
|
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[i_container], FALSE)
|
|
FREEZE_ENTITY_POSITION(obj_gold_trolleys[i_container], FALSE)
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_trolleys[i_container], obj_gold_containers[i_container], 0, <<0.0, 0.0, -0.45>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
IF SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
|
|
AND SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
|
|
IF SETUP_REQ_GOLD_CONTAINER_WITH_TROLLEY_INSIDE(0)
|
|
AND SETUP_REQ_GOLD_CONTAINER_WITH_TROLLEY_INSIDE(1)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC SETUP_TUNNEL_CREW_FOR_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_PED_COMBAT_PARAMS(s_crew[CREW_FRANKLIN_ID].ped, i_crew_franklin_default_accuracy, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_MAX_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
|
|
SET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
|
|
|
|
SET_RAGDOLL_BLOCKING_FLAGS(s_crew[CREW_FRANKLIN_ID].ped, RBF_BULLET_IMPACT | RBF_IMPACT_OBJECT | RBF_PLAYER_IMPACT | RBF_ELECTROCUTION | RBF_MELEE | RBF_FIRE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_FRANKLIN_ID].ped, CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_DisableHurt, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL SETUP_REQ_FRANKLIN(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE, BOOL b_with_balaclava = TRUE)
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF b_just_request_assets
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_FRANKLIN)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_FRANKLIN)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], CHAR_FRANKLIN, v_pos, f_heading)
|
|
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], RELGROUPHASH_PLAYER)
|
|
s_franklin.i_event = 0
|
|
s_franklin.i_timer = 0
|
|
s_franklin.b_is_waypoint_aiming = FALSE
|
|
REMOVE_COVER_POINT(s_franklin.cover)
|
|
|
|
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_APPISTOL, 500, FALSE)
|
|
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
|
|
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
SETUP_FRANKLIN_OUTFIT(b_with_balaclava)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF s_conversation_peds.PedInfo[1].Index != s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]
|
|
OR NOT s_conversation_peds.PedInfo[1].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TREVOR(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
IF b_just_request_assets
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_TREVOR)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(s_selector_peds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, v_pos, f_heading)
|
|
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
|
|
//s_trevor.i_event = 0
|
|
|
|
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_COMBATMG, 500, TRUE)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, s_selector_peds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
SETUP_TREVOR_OUTFIT()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF s_conversation_peds.PedInfo[2].Index != s_selector_peds.pedID[SELECTOR_PED_TREVOR]
|
|
OR NOT s_conversation_peds.PedInfo[2].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, s_selector_peds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MICHAEL(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE, BOOL b_with_balaclava = TRUE)
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF b_just_request_assets
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_MICHAEL)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, v_pos, f_heading)
|
|
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], RELGROUPHASH_PLAYER)
|
|
s_michael.i_event = 0
|
|
s_michael.i_timer = 0
|
|
s_michael.b_is_waypoint_aiming = FALSE
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
|
|
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, s_selector_peds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
SET_PED_COMP_ITEM_CURRENT_SP(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
SETUP_MICHAEL_OUTFIT(b_with_balaclava)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF s_conversation_peds.PedInfo[0].Index != s_selector_peds.pedID[SELECTOR_PED_MICHAEL]
|
|
OR NOT s_conversation_peds.PedInfo[0].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, s_selector_peds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_AS_FRANKLIN()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN)
|
|
ELSE
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
IF s_conversation_peds.PedInfo[1].Index != PLAYER_PED_ID()
|
|
OR NOT s_conversation_peds.PedInfo[1].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_AS_MICHAEL()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_MICHAEL)
|
|
ELSE
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
IF s_conversation_peds.PedInfo[0].Index != PLAYER_PED_ID()
|
|
OR NOT s_conversation_peds.PedInfo[0].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_AS_TREVOR()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR)
|
|
ELSE
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
IF s_conversation_peds.PedInfo[2].Index != PLAYER_PED_ID()
|
|
OR NOT s_conversation_peds.PedInfo[2].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, PLAYER_PED_ID(), "TREVOR")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_START_CAR(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(s_start_car.veh)
|
|
REQUEST_MODEL(model_start_car)
|
|
REQUEST_VEHICLE_ASSET(model_start_car)
|
|
|
|
IF HAS_MODEL_LOADED(model_start_car)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_start_car)
|
|
IF NOT b_just_request_assets
|
|
s_start_car.veh = CREATE_VEHICLE(model_start_car, v_pos, f_heading)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(s_start_car.veh, FALSE)
|
|
SET_VEHICLE_STRONG(s_start_car.veh, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(s_start_car.veh, TRUE)
|
|
SET_VEHICLE_COLOURS(s_start_car.veh, 17, 17)
|
|
SET_VEHICLE_EXTRA_COLOURS(s_start_car.veh, 17, 0)
|
|
SET_VEHICLE_DIRT_LEVEL(s_start_car.veh, 0.0)
|
|
SET_VEHICLE_CAN_LEAK_OIL(s_start_car.veh, FALSE)
|
|
SET_VEHICLE_CAN_LEAK_PETROL(s_start_car.veh, FALSE)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(s_start_car.veh, "81TDS937")
|
|
SET_VEH_RADIO_STATION(s_start_car.veh, "RADIO_01_CLASS_ROCK")
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_start_car)
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MAIN_CREW(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_DRIVER_ID].ped)
|
|
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
|
|
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_MICHAEL_ID].ped)
|
|
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
|
|
|
|
IF HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
|
|
IF NOT b_just_request_assets
|
|
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_DRIVER_ID].ped)
|
|
s_crew[CREW_DRIVER_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID, v_pos, f_heading)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
|
|
s_crew[CREW_FRANKLIN_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FRANKLIN_ID, v_pos + <<1.5, 0.0, 0.0>>, f_heading + 2.0)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_MICHAEL_ID].ped)
|
|
s_crew[CREW_MICHAEL_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID, v_pos + <<-1.5, 0.0, 0.0>>, f_heading + 2.0)
|
|
ENDIF
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(s_crew) i
|
|
IF NOT IS_PED_INJURED(s_crew[i].ped)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_crew[i].ped, RELGROUPHASH_PLAYER)
|
|
IF i = CREW_MICHAEL_ID
|
|
GIVE_WEAPON_TO_PED(s_crew[i].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
|
|
ELSE
|
|
GIVE_WEAPON_TO_PED(s_crew[i].ped, WEAPONTYPE_ADVANCEDRIFLE, INFINITE_AMMO, TRUE)
|
|
ENDIF
|
|
SET_ENTITY_HEALTH(s_crew[i].ped, 200)
|
|
SET_PED_MAX_HEALTH(s_crew[i].ped, 200)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_crew[i].ped, FALSE)
|
|
SET_PED_CAN_BE_TARGETTED(s_crew[i].ped, FALSE)
|
|
SET_PED_COMBAT_AI(s_crew[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, v_zero)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
SETUP_DRIVER_OUTFIT()
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CUTTER(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE, BOOL b_start_frozen = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(veh_cutter)
|
|
REQUEST_MODEL(model_cutter)
|
|
|
|
IF HAS_MODEL_LOADED(model_cutter)
|
|
IF NOT b_just_request_assets
|
|
veh_cutter = CREATE_VEHICLE(model_cutter, v_pos, f_heading)
|
|
SET_VEHICLE_RADIO_ENABLED(veh_cutter, FALSE)
|
|
SET_VEHICLE_STRONG(veh_cutter, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(veh_cutter, TRUE)
|
|
SET_VEHICLE_TYRES_CAN_BURST(veh_cutter, FALSE)
|
|
SET_VEHICLE_AS_RESTRICTED(veh_cutter, 0)
|
|
|
|
IF b_start_frozen
|
|
FREEZE_ENTITY_POSITION(veh_cutter, TRUE)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cutter)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND(BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
|
|
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
|
|
|
|
IF HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
|
|
IF NOT b_just_request_assets
|
|
s_crew[CREW_FRANKLIN_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FRANKLIN_ID, <<22.8719, -638.4583, 15.0881>>, 133.7838)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_crew[CREW_FRANKLIN_ID].ped, RELGROUPHASH_PLAYER)
|
|
GIVE_WEAPON_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE, INFINITE_AMMO, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_event = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_timer = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_sync_scene = -1
|
|
s_crew[CREW_FRANKLIN_ID].b_refresh_tasks = FALSE
|
|
s_crew[CREW_FRANKLIN_ID].b_is_using_secondary_cover = FALSE
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CREW_DRIVER_IN_CHOPPER(BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_DRIVER_ID].ped)
|
|
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
|
|
|
|
IF HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
|
|
IF NOT b_just_request_assets
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[CREW_DRIVER_ID].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
s_crew[CREW_DRIVER_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID, GET_ENTITY_COORDS(s_gold_choppers[1].veh) + <<0.0, 0.0, 10.0>>, 0.0)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_crew[CREW_DRIVER_ID].ped, RELGROUPHASH_PLAYER)
|
|
GIVE_WEAPON_TO_PED(s_crew[CREW_DRIVER_ID].ped, WEAPONTYPE_ADVANCEDRIFLE, INFINITE_AMMO, TRUE)
|
|
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
|
|
SET_PED_CAN_BE_TARGETTED(s_crew[CREW_DRIVER_ID].ped, FALSE)
|
|
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TREVOR_IN_CHOPPER(BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND SETUP_REQ_TREVOR(GET_ENTITY_COORDS(s_gold_choppers[0].veh) + <<0.0, 0.0, 10.0>>)
|
|
IF NOT b_just_request_assets
|
|
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(VECTOR v_pos, FLOAT f_heading = 0.0, BOOL b_just_request_assets = FALSE, BOOL b_need_balaclava = TRUE)
|
|
IF NOT DOES_ENTITY_EXIST(s_crew[CREW_MICHAEL_ID].ped)
|
|
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
|
|
|
|
IF HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
|
|
IF NOT b_just_request_assets
|
|
s_crew[CREW_MICHAEL_ID].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID, v_pos, f_heading)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_crew[CREW_MICHAEL_ID].ped, RELGROUPHASH_PLAYER)
|
|
SET_ENTITY_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 200)
|
|
SET_PED_MAX_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 200)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
GIVE_WEAPON_TO_PED(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
SET_PED_COMBAT_AI(s_crew[CREW_MICHAEL_ID].ped, i_crew_michael_default_accuracy, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, v_zero)
|
|
SET_PED_SHOOT_RATE(s_crew[CREW_MICHAEL_ID].ped, 80)
|
|
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, b_need_balaclava)
|
|
|
|
s_crew[CREW_MICHAEL_ID].i_event = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
|
|
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
|
|
AND DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) = RFMO_STATE_END
|
|
AND GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) = RFMO_STATE_END
|
|
RETURN TRUE
|
|
ELSE
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_END
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_ENDING
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_ENDING)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) != RFMO_STATE_END
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) != RFMO_STATE_ENDING
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_ENDING)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
|
|
rayfire_tunnel = GET_RAYFIRE_MAP_OBJECT(<<7.25, -656.98, 17.14>>, 50.0, "des_finale_tunnel")
|
|
ENDIF
|
|
|
|
IF NOT DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
|
|
rayfire_vault = GET_RAYFIRE_MAP_OBJECT(<<7.25, -656.98, 17.14>>, 50.0, "des_finale_vault")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
IF interior_tunnels[0] = NULL
|
|
interior_tunnels[0] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<10.44, -647.86, 16.33>>, "v_31_tun_02")
|
|
ENDIF
|
|
|
|
IF interior_tunnels[1] = NULL
|
|
interior_tunnels[1] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<36.4, -689.1, 17.6>>, "v_31_tun_03")
|
|
ENDIF
|
|
|
|
IF interior_vault = NULL
|
|
interior_vault = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<4.3929, -661.7692, 16.1308>>, "v_finalebank")
|
|
ENDIF
|
|
|
|
IF NOT IS_INTERIOR_READY(interior_tunnels[0])
|
|
PIN_INTERIOR_IN_MEMORY(interior_tunnels[0])
|
|
ENDIF
|
|
|
|
IF NOT IS_INTERIOR_READY(interior_tunnels[1])
|
|
PIN_INTERIOR_IN_MEMORY(interior_tunnels[1])
|
|
ENDIF
|
|
|
|
IF NOT IS_INTERIOR_READY(interior_vault)
|
|
PIN_INTERIOR_IN_MEMORY(interior_vault)
|
|
ENDIF
|
|
|
|
IF IS_INTERIOR_READY(interior_vault)
|
|
AND IS_INTERIOR_READY(interior_tunnels[0])
|
|
AND IS_INTERIOR_READY(interior_tunnels[1])
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
|
|
IF NOT IS_ENTITY_DEAD(veh_cutter)
|
|
SET_ENTITY_COORDS(veh_cutter, v_cutter_pos_after_drilling)
|
|
SET_ENTITY_HEADING(veh_cutter, f_cutter_heading_after_drilling)
|
|
//FREEZE_ENTITY_POSITION(veh_cutter, TRUE)
|
|
//SET_VEHICLE_DOORS_LOCKED(veh_cutter, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
SET_VEHICLE_LIGHTS(veh_cutter, FORCE_VEHICLE_LIGHTS_ON)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<20.1574, -638.8393, 15.0670>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 322.5426)
|
|
ENDIF
|
|
|
|
IF e_mission_stage != STAGE_LEAVE_BANK //Don't reposition the trolleys on this stage as they'll be attached to the choppers.
|
|
IF SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
//Don't reposition these objects if they're currently attached to the helicopter (this could potentially happen on a Z-skip).
|
|
IF NOT s_heli_ropes_new[0].b_is_attached
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], <<23.4634, -636.2529, 16.0034>>)
|
|
SET_ENTITY_HEADING(obj_gold_containers[0], 159.9524)
|
|
ENDIF
|
|
|
|
IF NOT s_heli_ropes_new[4].b_is_attached
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[1], <<23.4009, -639.7594, 16.0089>>)
|
|
|
|
IF e_mission_stage >= STAGE_WINCH_GOLD_CUTSCENE
|
|
SET_ENTITY_HEADING(obj_gold_containers[1], 223.2627)
|
|
ELSE
|
|
SET_ENTITY_HEADING(obj_gold_containers[1], 223.2627 - 180.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(BOOL bIsActive)
|
|
IF bIsActive
|
|
IF cover_rubble[0] = NULL
|
|
cover_rubble[0] = ADD_COVER_POINT(<<5.0604, -664.9948, 15.1306>>, 157.7793, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
cover_rubble[1] = ADD_COVER_POINT(<<3.4377, -664.0313, 15.1306>>, 160.3413, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
cover_rubble[2] = ADD_COVER_POINT(<<4.2783, -664.3798, 15.1306>>, 159.3272, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
INT i
|
|
REPEAT COUNT_OF(cover_rubble) i
|
|
REMOVE_COVER_POINT(cover_rubble[i])
|
|
cover_rubble[i] = NULL
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL SETUP_GOLD_CHOPPERS(VECTOR vChopper1Pos, FLOAT fChopper1Heading, VECTOR vChopper2Pos, FLOAT fChopper2Heading, BOOL bJustRequestAssets = FALSE, BOOL bFreezeOnCreation = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(s_gold_choppers[0].veh)
|
|
REQUEST_MODEL(model_gold_chopper)
|
|
REQUEST_MODEL(model_trevor_gold_chopper)
|
|
|
|
IF HAS_MODEL_LOADED(model_gold_chopper)
|
|
AND HAS_MODEL_LOADED(model_trevor_gold_chopper)
|
|
IF NOT bJustRequestAssets
|
|
s_gold_choppers[0].veh = CREATE_VEHICLE(model_trevor_gold_chopper, vChopper1Pos, fChopper1Heading)
|
|
s_gold_choppers[1].veh = CREATE_VEHICLE(model_gold_chopper, vChopper2Pos, fChopper2Heading)
|
|
|
|
SET_VEHICLE_AS_RESTRICTED(s_gold_choppers[0].veh, 1)
|
|
|
|
SET_VEHICLE_LIVERY(s_gold_choppers[0].veh, 1)
|
|
|
|
SET_VEHICLE_STRONG(s_gold_choppers[0].veh, TRUE)
|
|
SET_VEHICLE_STRONG(s_gold_choppers[1].veh, TRUE)
|
|
SET_VEHICLE_COLOURS(s_gold_choppers[1].veh, 62, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(s_gold_choppers[1].veh, 70, 0)
|
|
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
|
|
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[1].veh)
|
|
|
|
IF bFreezeOnCreation
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, TRUE)
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_trevor_gold_chopper)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/*FUNC BOOL SETUP_REQ_ROPES_ON_CHOPPER(INT i_rope_index, BOOL b_already_unwound = FALSE)
|
|
IF s_heli_ropes[i_rope_index].rope = NULL
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_rope_index].veh)
|
|
FLOAT f_start_length = ROPE_MIN_LENGTH
|
|
IF b_already_unwound
|
|
f_start_length = ROPE_MAX_LENGTH
|
|
ENDIF
|
|
|
|
s_heli_ropes[i_rope_index].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, ROPE_MAX_LENGTH, PHYSICS_ROPE_DEFAULT_WIRE, f_start_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes[i_rope_index].b_is_attached = FALSE
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(obj_rope_weights[i_rope_index])
|
|
REQUEST_MODEL(model_rope_weight)
|
|
|
|
IF HAS_MODEL_LOADED(model_rope_weight)
|
|
obj_rope_weights[i_rope_index] = CREATE_OBJECT(model_rope_weight,
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>)
|
|
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_rope_weights[i_rope_index], TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_rope_weights[i_rope_index], FALSE)
|
|
SET_ENTITY_VISIBLE(obj_rope_weights[i_rope_index], FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_rope_weight)
|
|
s_heli_ropes[i_rope_index].b_is_attached = FALSE
|
|
ENDIF
|
|
ELIF NOT s_heli_ropes[i_rope_index].b_is_attached
|
|
IF DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_rope_index].veh)
|
|
AND DOES_ENTITY_HAVE_PHYSICS(obj_rope_weights[i_rope_index])
|
|
APPLY_FORCE_TO_ENTITY(obj_rope_weights[i_rope_index], APPLY_TYPE_EXTERNAL_IMPULSE, <<0,0,-1.0>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes[i_rope_index].rope, s_gold_choppers[i_rope_index].veh, obj_rope_weights[i_rope_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>, ROPE_MIN_LENGTH,
|
|
0, 0)
|
|
|
|
s_heli_ropes[i_rope_index].b_is_attached = TRUE
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Sets up a rope on the chopper attached to the gold trolley, in the unwound position. i_rope_index is consistent for the chopper, rope and trolley.
|
|
FUNC BOOL SETUP_REQ_TROLLEY_ATTACHED_TO_UNWOUND_HELI_ROPE(INT i_rope_index)
|
|
IF s_heli_ropes[i_rope_index].rope = NULL
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_rope_index].veh)
|
|
s_heli_ropes[i_rope_index].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, ROPE_MAX_LENGTH, PHYSICS_ROPE_DEFAULT_WIRE, ROPE_MAX_LENGTH, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes[i_rope_index].b_is_attached = FALSE
|
|
s_heli_ropes[i_rope_index].b_attached_object_is_ready = FALSE
|
|
ENDIF
|
|
ELIF DOES_ENTITY_EXIST(obj_rope_weights[i_rope_index])
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes[i_rope_index].rope, obj_rope_weights[i_rope_index])
|
|
|
|
REMOVE_OBJECT(obj_rope_weights[i_rope_index], TRUE)
|
|
s_heli_ropes[i_rope_index].b_is_attached = FALSE
|
|
s_heli_ropes[i_rope_index].b_attached_object_is_ready = FALSE
|
|
ELIF NOT s_heli_ropes[i_rope_index].b_attached_object_is_ready
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[i_rope_index])
|
|
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_rope_index]), GET_ENTITY_COORDS(s_gold_choppers[i_rope_index].veh)) > 400.0
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_rope_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, <<0.0, 0.0, -5.0>>))
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_containers[i_rope_index])
|
|
DETACH_ENTITY(obj_gold_containers[i_rope_index])
|
|
ENDIF
|
|
|
|
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_gold_containers[i_rope_index], TRUE)
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[i_rope_index], FALSE) //Can be frozen in other stages.
|
|
ACTIVATE_PHYSICS(obj_gold_containers[i_rope_index])
|
|
|
|
IF DOES_ENTITY_HAVE_PHYSICS(obj_gold_containers[i_rope_index])
|
|
AND DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_rope_index].veh)
|
|
//Set the player's container to be lighter, so it can be carried more easily.
|
|
IF i_rope_index = 0
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[i_rope_index], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
|
|
ENDIF
|
|
|
|
s_heli_ropes[i_rope_index].b_attached_object_is_ready = TRUE
|
|
s_heli_ropes[i_rope_index].b_is_attached = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT s_heli_ropes[i_rope_index].b_is_attached
|
|
APPLY_FORCE_TO_ENTITY(s_gold_choppers[i_rope_index].veh, APPLY_TYPE_IMPULSE, <<0.0, 0.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes[i_rope_index].rope, s_gold_choppers[i_rope_index].veh, obj_gold_containers[i_rope_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_rope_index], <<0.0, 0.0, 0.6>>), ROPE_MAX_LENGTH,
|
|
0, 0)
|
|
s_heli_ropes[i_rope_index].b_is_attached = TRUE
|
|
|
|
//TEMP: currently the ropes are going crazy, disable collision for now.
|
|
//IF i_rope_index = 1
|
|
//IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_rope_index].veh)
|
|
// SET_ENTITY_NO_COLLISION_ENTITY(obj_gold_containers[i_rope_index], s_gold_choppers[i_rope_index].veh, FALSE)
|
|
//ENDIF
|
|
//ENDIF
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Sets up a rope on the chopper attached to the gold trolley, in the wound position. i_rope_index is consistent for the chopper, rope and trolley.
|
|
FUNC BOOL SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPE(INT i_rope_index)
|
|
IF s_heli_ropes[i_rope_index].rope = NULL
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_rope_index].veh)
|
|
s_heli_ropes[i_rope_index].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, ROPE_MAX_LENGTH, PHYSICS_ROPE_DEFAULT_WIRE, ROPE_START_LENGTH, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes[i_rope_index].b_is_attached = FALSE
|
|
s_heli_ropes[i_rope_index].b_attached_object_is_ready = FALSE
|
|
ENDIF
|
|
ELIF DOES_ENTITY_EXIST(obj_rope_weights[i_rope_index])
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes[i_rope_index].rope, obj_rope_weights[i_rope_index])
|
|
|
|
REMOVE_OBJECT(obj_rope_weights[i_rope_index], TRUE)
|
|
s_heli_ropes[i_rope_index].b_is_attached = FALSE
|
|
s_heli_ropes[i_rope_index].b_attached_object_is_ready = FALSE
|
|
ELIF NOT s_heli_ropes[i_rope_index].b_attached_object_is_ready
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[i_rope_index])
|
|
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_rope_index]), GET_ENTITY_COORDS(s_gold_choppers[i_rope_index].veh)) > 400.0
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_rope_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, <<0.0, 0.0, -5.0>>))
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_containers[i_rope_index])
|
|
DETACH_ENTITY(obj_gold_containers[i_rope_index])
|
|
ENDIF
|
|
|
|
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_gold_containers[i_rope_index], TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_gold_containers[i_rope_index], FALSE)
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[i_rope_index], FALSE) //Can be frozen in other stages.
|
|
ACTIVATE_PHYSICS(obj_gold_containers[i_rope_index])
|
|
|
|
IF DOES_ENTITY_HAVE_PHYSICS(obj_gold_containers[i_rope_index])
|
|
AND DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_rope_index].veh)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Big Score 2B - container is ready to attach.")
|
|
#ENDIF
|
|
|
|
IF i_rope_index = 0
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[i_rope_index], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
|
|
ENDIF
|
|
|
|
s_heli_ropes[i_rope_index].b_attached_object_is_ready = TRUE
|
|
s_heli_ropes[i_rope_index].b_is_attached = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT s_heli_ropes[i_rope_index].b_is_attached
|
|
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_rope_index]), GET_ENTITY_COORDS(s_gold_choppers[i_rope_index].veh)) > 400.0
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_rope_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, <<0.0, 0.0, -5.0>>))
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(s_gold_choppers[i_rope_index].veh, APPLY_TYPE_IMPULSE, <<0.0, 0.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes[i_rope_index].rope, s_gold_choppers[i_rope_index].veh, obj_gold_containers[i_rope_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_rope_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_rope_index], <<0.0, 0.0, 0.6>>), ROPE_MIN_LENGTH,
|
|
0, 0)
|
|
s_heli_ropes[i_rope_index].b_is_attached = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Big Score 2B - rope is attached.")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// Adds some invisible ropes attached to the corners of the gold trolley, this helps to stop the trolley swinging wildly during the fly heli sections.
|
|
FUNC BOOL SETUP_SUPPORT_ROPES_FOR_PLAYER_CHOPPER()
|
|
IF s_heli_ropes[0].b_is_attached
|
|
IF s_heli_support_ropes[0].rope = NULL
|
|
FLOAT f_dist_to_support_attach_point = SQRT(2.0) //x = 1, y = 1
|
|
FLOAT f_support_rope_length = SQRT((f_dist_to_support_attach_point * f_dist_to_support_attach_point) + (ROPE_START_LENGTH * ROPE_START_LENGTH))
|
|
|
|
s_heli_support_ropes[0].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
|
|
s_heli_support_ropes[1].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
|
|
s_heli_support_ropes[2].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
|
|
s_heli_support_ropes[3].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
|
|
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_support_ropes[0].rope, s_gold_choppers[0].veh, obj_gold_containers[0],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[0], <<-1.0, 1.0, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_support_ropes[1].rope, s_gold_choppers[0].veh, obj_gold_containers[0],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[0], <<-1.0, -1.0, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_support_ropes[2].rope, s_gold_choppers[0].veh, obj_gold_containers[0],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[0], <<1.0, 1.0, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_support_ropes[3].rope, s_gold_choppers[0].veh, obj_gold_containers[0],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[0], <<1.0, -1.0, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
|
|
ROPE_DRAW_ENABLED(s_heli_support_ropes[0].rope, FALSE)
|
|
ROPE_DRAW_ENABLED(s_heli_support_ropes[1].rope, FALSE)
|
|
ROPE_DRAW_ENABLED(s_heli_support_ropes[2].rope, FALSE)
|
|
ROPE_DRAW_ENABLED(s_heli_support_ropes[3].rope, FALSE)
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC*/
|
|
|
|
///Sets up four ropes hanging free.
|
|
FUNC BOOL SETUP_REQ_ROPES_HANGING_FREE_ON_CHOPPER(INT i_heli_index, BOOL b_already_unwound = FALSE, BOOL b_attach_weight = TRUE)
|
|
INT i_start_rope = i_heli_index * 4 //Heli 0 starts at 0, heli 1 starts at 4
|
|
INT i = 0
|
|
FLOAT f_attach_offset_x = 0.95
|
|
FLOAT f_attach_offset_y = 0.85
|
|
FLOAT f_start_length = ROPE_MIN_LENGTH
|
|
IF b_already_unwound
|
|
f_start_length = ROPE_MAX_LENGTH
|
|
ENDIF
|
|
FLOAT f_dist_to_support_attach_point = SQRT((f_attach_offset_x * f_attach_offset_x) + (f_attach_offset_y * f_attach_offset_y))
|
|
FLOAT f_support_rope_length = SQRT((f_dist_to_support_attach_point * f_dist_to_support_attach_point) + (f_start_length * f_start_length))
|
|
FLOAT f_rope_max_length = ROPE_MAX_LENGTH
|
|
IF f_support_rope_length > ROPE_MAX_LENGTH
|
|
f_rope_max_length = f_support_rope_length
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
IF s_heli_ropes_new[i_start_rope].rope = NULL
|
|
//Create the ropes if they're not created already
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
s_heli_ropes_new[i_start_rope].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_rope_max_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 1].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_rope_max_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 2].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_rope_max_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 3].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_rope_max_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i >= i_start_rope
|
|
AND i <= i_start_rope + 3
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(obj_rope_weights[i_heli_index])
|
|
REQUEST_MODEL(model_rope_weight)
|
|
|
|
IF HAS_MODEL_LOADED(model_rope_weight)
|
|
obj_rope_weights[i_heli_index] = CREATE_OBJECT(model_rope_weight,
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>)
|
|
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_rope_weights[i_heli_index], TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_rope_weights[i_heli_index], FALSE)
|
|
SET_ENTITY_VISIBLE(obj_rope_weights[i_heli_index], FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_rope_weight)
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i >= i_start_rope
|
|
AND i <= i_start_rope + 3
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ELIF NOT s_heli_ropes_new[i_start_rope].b_is_attached
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
IF DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_heli_index].veh)
|
|
AND DOES_ENTITY_HAVE_PHYSICS(obj_rope_weights[i_heli_index])
|
|
IF VDIST2(GET_ENTITY_COORDS(obj_rope_weights[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_rope_weights[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(obj_rope_weights[i_heli_index], APPLY_TYPE_IMPULSE, <<0,0,-1.0>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
|
|
|
|
IF b_attach_weight
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope].rope, s_gold_choppers[i_heli_index].veh, obj_rope_weights[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -f_support_rope_length>>, f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 1].rope, s_gold_choppers[i_heli_index].veh, obj_rope_weights[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -f_support_rope_length>>, f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 2].rope, s_gold_choppers[i_heli_index].veh, obj_rope_weights[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -f_support_rope_length>>, f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 3].rope, s_gold_choppers[i_heli_index].veh, obj_rope_weights[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -f_support_rope_length>>, f_support_rope_length,
|
|
0, 0)
|
|
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+1].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+2].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+3].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
|
|
ENDIF
|
|
|
|
s_heli_ropes_new[i_start_rope].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+1].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+2].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+3].b_is_attached = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Big Score 2B - ropes are attached.")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(INT i_heli_index, BOOL b_use_damping = TRUE)
|
|
INT i_start_rope = i_heli_index * 4 //Heli 0 starts at 0, heli 1 starts at 4
|
|
INT i = 0
|
|
FLOAT f_attach_offset_x = 0.95
|
|
FLOAT f_attach_offset_y = 0.85
|
|
FLOAT f_dist_to_support_attach_point = SQRT((f_attach_offset_x * f_attach_offset_x) + (f_attach_offset_y * f_attach_offset_y))
|
|
FLOAT f_support_rope_length = SQRT((f_dist_to_support_attach_point * f_dist_to_support_attach_point) + (ROPE_START_LENGTH * ROPE_START_LENGTH))
|
|
|
|
IF s_heli_ropes_new[i_start_rope].rope = NULL
|
|
//Create the ropes if they're not created already
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
s_heli_ropes_new[i_start_rope].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 1].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 2].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 3].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, f_support_rope_length, ROPE_SPEED)
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i >= i_start_rope
|
|
AND i <= i_start_rope + 3
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ELIF DOES_ENTITY_EXIST(obj_rope_weights[i_heli_index])
|
|
//If the ropes already existed check that the rope weight objects aren't still around.
|
|
REMOVE_OBJECT(obj_rope_weights[i_heli_index], TRUE)
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i >= i_start_rope
|
|
AND i <= i_start_rope + 3
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELIF NOT s_heli_ropes_new[i_start_rope].b_attached_object_is_ready
|
|
//Make sure the physics is ready on relevant entities before continuing.
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[i_heli_index])
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_containers[i_heli_index])
|
|
DETACH_ENTITY(obj_gold_containers[i_heli_index])
|
|
ENDIF
|
|
|
|
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_gold_containers[i_heli_index], TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_gold_containers[i_heli_index], FALSE)
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[i_heli_index], FALSE) //Can be frozen in other stages.
|
|
ACTIVATE_PHYSICS(obj_gold_containers[i_heli_index])
|
|
SET_ENTITY_LOD_DIST(obj_gold_containers[i_heli_index], 500)
|
|
|
|
IF DOES_ENTITY_HAVE_PHYSICS(obj_gold_containers[i_heli_index])
|
|
AND DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_heli_index].veh)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Big Score 2B - container is ready to attach.")
|
|
#ENDIF
|
|
|
|
//IF i_heli_index = 0
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[i_heli_index], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
|
|
//ENDIF
|
|
|
|
s_heli_ropes_new[i_start_rope].b_attached_object_is_ready = TRUE
|
|
s_heli_ropes_new[i_start_rope].b_is_attached = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT s_heli_ropes_new[i_start_rope].b_is_attached
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
//Attach the container to the ropes.
|
|
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(s_gold_choppers[i_heli_index].veh, APPLY_TYPE_IMPULSE, <<0.0, 0.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<-f_attach_offset_x, f_attach_offset_y, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 1].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<-f_attach_offset_x, -f_attach_offset_y, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 2].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<f_attach_offset_x, f_attach_offset_y, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 3].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<f_attach_offset_x, -f_attach_offset_y, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+1].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+2].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+3].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
|
|
IF b_use_damping
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index], -f_support_rope_length)
|
|
ENDIF
|
|
|
|
s_heli_ropes_new[i_start_rope].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+1].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+2].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+3].b_is_attached = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Big Score 2B - ropes are attached.")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Sets up four ropes attached to the trolley in a fully unwound state.
|
|
FUNC BOOL SETUP_REQ_TROLLEY_ATTACHED_TO_UNWOUND_HELI_ROPES(INT i_heli_index)
|
|
INT i_start_rope = i_heli_index * 4 //Heli 0 starts at 0, heli 1 starts at 4
|
|
INT i = 0
|
|
FLOAT f_attach_offset_x = 0.95
|
|
FLOAT f_attach_offset_y = 0.85
|
|
FLOAT f_dist_to_support_attach_point = SQRT((f_attach_offset_x * f_attach_offset_x) + (f_attach_offset_y * f_attach_offset_y))
|
|
FLOAT f_support_rope_length = SQRT((f_dist_to_support_attach_point * f_dist_to_support_attach_point) + (ROPE_MAX_LENGTH * ROPE_MAX_LENGTH))
|
|
|
|
IF s_heli_ropes_new[i_start_rope].rope = NULL
|
|
//Create the ropes if they're not created already
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
s_heli_ropes_new[i_start_rope].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 1].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 2].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
s_heli_ropes_new[i_start_rope + 3].rope = ADD_ROPE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
<<0.0, 90.0, 0.0>>, f_support_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_support_rope_length, ROPE_MIN_LENGTH, ROPE_SPEED)
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i >= i_start_rope
|
|
AND i <= i_start_rope + 3
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ELIF DOES_ENTITY_EXIST(obj_rope_weights[i_heli_index])
|
|
//If the ropes already existed check that the rope weight objects aren't still around.
|
|
REMOVE_OBJECT(obj_rope_weights[i_heli_index], TRUE)
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i >= i_start_rope
|
|
AND i <= i_start_rope + 3
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
s_heli_ropes_new[i].b_attached_object_is_ready = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELIF NOT s_heli_ropes_new[i_start_rope].b_attached_object_is_ready
|
|
//Make sure the physics is ready on relevant entities before continuing.
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[i_heli_index])
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_containers[i_heli_index])
|
|
DETACH_ENTITY(obj_gold_containers[i_heli_index])
|
|
ENDIF
|
|
|
|
SET_ACTIVATE_OBJECT_PHYSICS_AS_SOON_AS_IT_IS_UNFROZEN(obj_gold_containers[i_heli_index], TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_gold_containers[i_heli_index], FALSE)
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[i_heli_index], FALSE) //Can be frozen in other stages.
|
|
ACTIVATE_PHYSICS(obj_gold_containers[i_heli_index])
|
|
|
|
IF DOES_ENTITY_HAVE_PHYSICS(obj_gold_containers[i_heli_index])
|
|
AND DOES_ENTITY_HAVE_PHYSICS(s_gold_choppers[i_heli_index].veh)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Big Score 2B - container is ready to attach.")
|
|
#ENDIF
|
|
|
|
//IF i_heli_index = 0
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[i_heli_index], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
|
|
//ENDIF
|
|
|
|
s_heli_ropes_new[i_start_rope].b_attached_object_is_ready = TRUE
|
|
s_heli_ropes_new[i_start_rope].b_is_attached = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT s_heli_ropes_new[i_start_rope].b_is_attached
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[i_heli_index].veh)
|
|
//Attach the container to the ropes.
|
|
IF VDIST2(GET_ENTITY_COORDS(obj_gold_containers[i_heli_index]), GET_ENTITY_COORDS(s_gold_choppers[i_heli_index].veh)) > 400.0
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[i_heli_index], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, <<0.0, 0.0, -5.0>>))
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(s_gold_choppers[i_heli_index].veh, APPLY_TYPE_IMPULSE, <<0.0, 0.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<-f_attach_offset_x, f_attach_offset_y, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 1].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<-f_attach_offset_x, -f_attach_offset_y, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 2].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<f_attach_offset_x, f_attach_offset_y, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
ATTACH_ENTITIES_TO_ROPE(s_heli_ropes_new[i_start_rope + 3].rope, s_gold_choppers[i_heli_index].veh, obj_gold_containers[i_heli_index],
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[i_heli_index].veh, v_rope_heli_attach_offset),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_gold_containers[i_heli_index], <<f_attach_offset_x, -f_attach_offset_y, 0.6>>), f_support_rope_length,
|
|
0, 0)
|
|
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+1].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+2].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i_start_rope+3].rope, ROPES_REFVELOCITY_COLLIDERORDER )
|
|
|
|
s_heli_ropes_new[i_start_rope].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+1].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+2].b_is_attached = TRUE
|
|
s_heli_ropes_new[i_start_rope+3].b_is_attached = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Big Score 2B - ropes are attached.")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_VAULT_GATES_DESTROYED()
|
|
CREATE_MODEL_HIDE(v_vault_gate_pos_1, 2.0, model_vault_gates, FALSE)
|
|
CREATE_MODEL_HIDE(v_vault_gate_pos_2, 2.0, model_vault_gates, FALSE)
|
|
|
|
//SET_USES_COLLISION_OF_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_1, 2.0, model_vault_gates, FALSE) //TEMP: CREATE_MODEL_HIDE isn't removing collision.
|
|
//SET_USES_COLLISION_OF_CLOSEST_OBJECT_OF_TYPE(v_vault_gate_pos_2, 2.0, model_vault_gates, FALSE) //TEMP: CREATE_MODEL_HIDE isn't removing collision.
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_VAULT_ALARM(BOOL bSkipStartup, BOOL bJustRequestAlarm = FALSE)
|
|
IF PREPARE_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS")
|
|
IF bJustRequestAlarm
|
|
RETURN TRUE
|
|
ELSE
|
|
IF NOT IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
|
|
START_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", bSkipStartup)
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TUNNEL_RAYFIRE_READY_FOR_DRILLING(BOOL bDoResetOnGrab = TRUE)
|
|
BOOL b_tunnel_rayfire_primed = FALSE
|
|
BOOL b_vault_rayfire_primed = FALSE
|
|
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_PRIMED
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_PRIMING
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_PRIMING)
|
|
ENDIF
|
|
ELSE
|
|
b_tunnel_rayfire_primed = TRUE
|
|
ENDIF
|
|
ELSE
|
|
rayfire_tunnel = GET_RAYFIRE_MAP_OBJECT(<<7.25, -656.98, 17.14>>, 50.0, "des_finale_tunnel")
|
|
|
|
//Do a force reset the first time it's grabbed.
|
|
IF bDoResetOnGrab
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_tunnel)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_RESET)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) != RFMO_STATE_PRIMED
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) != RFMO_STATE_PRIMING
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_PRIMING)
|
|
ENDIF
|
|
ELSE
|
|
b_vault_rayfire_primed = TRUE
|
|
ENDIF
|
|
ELSE
|
|
rayfire_vault = GET_RAYFIRE_MAP_OBJECT(<<7.25, -656.98, 17.14>>, 50.0, "des_finale_vault")
|
|
|
|
IF bDoResetOnGrab
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rayfire_vault)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_RESET)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN (b_tunnel_rayfire_primed AND b_vault_rayfire_primed)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TUNNEL_COVER_OBJECTS(BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(obj_tunnel_crates[0])
|
|
REQUEST_MODEL(model_tunnel_crate)
|
|
|
|
IF HAS_MODEL_LOADED(model_tunnel_crate)
|
|
IF b_just_request_assets
|
|
RETURN TRUE
|
|
ELSE
|
|
obj_tunnel_crates[0] = CREATE_OBJECT_NO_OFFSET(model_tunnel_crate, <<-9.6200, -602.9300, 15.5900>>)
|
|
SET_ENTITY_ROTATION(obj_tunnel_crates[0], <<7.0000, -6.7000, 28.8000>>)
|
|
FREEZE_ENTITY_POSITION(obj_tunnel_crates[0], TRUE)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(obj_tunnel_crates) i
|
|
IF interior_tunnels[0] != NULL
|
|
RETAIN_ENTITY_IN_INTERIOR(obj_tunnel_crates[i], interior_tunnels[0])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_tunnel_crate)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_TRAIN(BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(veh_gold_train)
|
|
REQUEST_MODEL(model_train_engine)
|
|
REQUEST_MODEL(model_train_carriage)
|
|
|
|
IF HAS_MODEL_LOADED(model_train_engine)
|
|
AND HAS_MODEL_LOADED(model_train_carriage)
|
|
IF b_just_request_assets
|
|
RETURN TRUE
|
|
ELSE
|
|
veh_gold_train = CREATE_MISSION_TRAIN(0, <<2324.3, 2670.7, 44.45>>, TRUE)
|
|
SET_TRAIN_CRUISE_SPEED(veh_gold_train, 10.0)
|
|
SET_TRAIN_SPEED(veh_gold_train, 10.0)
|
|
f_current_train_speed = 10.0
|
|
|
|
VEHICLE_INDEX veh_train_carriage_1, veh_train_carriage_2
|
|
veh_train_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
|
|
veh_train_carriage_2 = GET_TRAIN_CARRIAGE(veh_gold_train, 2)
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
SET_ENTITY_LOD_DIST(veh_gold_train, 1000)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_train_carriage_1)
|
|
SET_ENTITY_LOD_DIST(veh_train_carriage_1, 1000)
|
|
ENDIF
|
|
|
|
//1418524 - only want one carriage
|
|
IF NOT IS_ENTITY_DEAD(veh_train_carriage_2)
|
|
DELETE_VEHICLE(veh_train_carriage_2)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_engine)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_carriage)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_DisableHurt, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_CAN_COWER_IN_COVER(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FIRE | RBF_PLAYER_IMPACT)
|
|
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE, -1)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], CA_REQUIRES_LOS_TO_SHOOT, FALSE)
|
|
SET_PED_ACCURACY(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], 10)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_PED_MAX_HEALTH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_ENTITY_HEALTH(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_DisableHurt, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_CAN_COWER_IN_COVER(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FIRE | RBF_PLAYER_IMPACT)
|
|
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE, -1)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], CA_REQUIRES_LOS_TO_SHOOT, FALSE)
|
|
SET_PED_ACCURACY(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], 10)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_PED_MAX_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 1800)
|
|
SET_ENTITY_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_DisableHurt, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_MICHAEL_ID].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_CAN_COWER_IN_COVER(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(s_crew[CREW_MICHAEL_ID].ped, RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FIRE | RBF_PLAYER_IMPACT)
|
|
SET_PED_USING_ACTION_MODE(s_crew[CREW_MICHAEL_ID].ped, TRUE, -1, "DEFAULT_ACTION")
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_MICHAEL_ID].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_crew[CREW_MICHAEL_ID].ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
|
|
SET_PED_ACCURACY(s_crew[CREW_MICHAEL_ID].ped, i_crew_michael_default_accuracy)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_LESTER_IN_CHOPPER(BOOL b_just_request_assets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(s_lester.ped)
|
|
REQUEST_NPC_PED_MODEL(CHAR_LESTER)
|
|
|
|
IF HAS_NPC_PED_MODEL_LOADED(CHAR_LESTER)
|
|
IF b_just_request_assets
|
|
RETURN TRUE
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
VEHICLE_SEAT e_seat = VS_BACK_LEFT
|
|
|
|
IF CREATE_NPC_PED_INSIDE_VEHICLE(s_lester.ped, CHAR_LESTER, s_gold_choppers[0].veh, e_seat)
|
|
SET_PED_CAN_BE_TARGETTED(s_lester.ped, FALSE)
|
|
SET_PED_MAX_HEALTH(s_lester.ped, 1800)
|
|
SET_ENTITY_HEALTH(s_lester.ped, 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_lester.ped, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_lester.ped, RELGROUPHASH_PLAYER)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_lester.ped, TRUE)
|
|
SET_PED_PROP_INDEX(s_lester.ped, ANCHOR_EYES, 0)
|
|
s_lester.i_event = 0
|
|
s_lester.i_timer = 0
|
|
REMOVE_COVER_POINT(s_lester.cover)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, s_lester.ped, "LESTER")
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_CUTTER_BLOCKING_PROGRESS()
|
|
BOOL b_cutter_blocking = FALSE
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cutter)
|
|
v_last_cutter_pos[0] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<2.6222, 6.5265, 1.7702>>)
|
|
v_last_cutter_pos[1] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<-2.5270, 6.7267, 1.8416>>)
|
|
v_last_cutter_pos[2] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<-2.0915, -4.0069, 0.7723>>)
|
|
v_last_cutter_pos[3] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<1.9142, -3.9661, 0.6946>>)
|
|
ENDIF
|
|
|
|
//If the cutter is dead then check the last position it was in, fail if it's blocking the location.
|
|
IF NOT IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF IS_POINT_IN_ANGLED_AREA(v_last_cutter_pos[i_cutter_pos_index], <<5.083910,-663.961853,14.880619>>, <<11.945152,-638.320679,19.838081>>, 7.000000)
|
|
OR IS_POINT_IN_ANGLED_AREA(v_last_cutter_pos[i_cutter_pos_index], <<29.294580,-636.268982,14.838079>>, <<15.562843,-646.079529,19.838079>>, 9.750000)
|
|
b_cutter_blocking = TRUE
|
|
ENDIF
|
|
|
|
i_cutter_pos_index++
|
|
|
|
IF i_cutter_pos_index >= COUNT_OF(v_last_cutter_pos)
|
|
i_cutter_pos_index = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN b_cutter_blocking
|
|
ENDFUNC
|
|
|
|
PROC GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
WEAPON_TYPE e_fail_weapon = Get_Fail_Weapon(ENUM_TO_INT(GET_PLAYER_PED_ENUM(PLAYER_PED_ID())))
|
|
|
|
IF e_fail_weapon = WEAPONTYPE_INVALID
|
|
OR e_fail_weapon = WEAPONTYPE_UNARMED
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
|
|
AND GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE) > 0
|
|
e_fail_weapon = WEAPONTYPE_ADVANCEDRIFLE
|
|
ELSE
|
|
e_fail_weapon = GET_BEST_PED_WEAPON(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_fail_weapon != WEAPONTYPE_INVALID
|
|
AND e_fail_weapon != WEAPONTYPE_UNARMED
|
|
INT i_ammo_per_clip = GET_MAX_AMMO_IN_CLIP(PLAYER_PED_ID(), e_fail_weapon)
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), e_fail_weapon) < i_ammo_per_clip
|
|
ADD_AMMO_TO_PED(PLAYER_PED_ID(), e_fail_weapon, i_ammo_per_clip * 2)
|
|
SET_AMMO_IN_CLIP(PLAYER_PED_ID(), e_fail_weapon, i_ammo_per_clip)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), e_fail_weapon, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// There are three slots being used for random enemy ped speakers. This adds a ped into a currently free slot. Once a ped dies the slot is cleared.
|
|
/// If i_speaker is set to something other than -1 it'll try to place the ped in the given slot.
|
|
PROC ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(PED_INDEX ped, INT i_speaker = -1, BOOL b_force_add = FALSE)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].Index != ped
|
|
AND s_conversation_peds.PedInfo[SWAT_SPEAKER_2].Index != ped
|
|
AND s_conversation_peds.PedInfo[SWAT_SPEAKER_3].Index != ped
|
|
IF i_speaker = -1
|
|
IF NOT s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_1, ped, "BS2BSwat1")
|
|
ELIF NOT s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_2, ped, "BS2BSwat2")
|
|
ELIF NOT s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_3, ped, "BS2BSwat3")
|
|
ENDIF
|
|
ELSE
|
|
IF NOT s_conversation_peds.PedInfo[i_speaker].ActiveInConversation
|
|
OR b_force_add
|
|
IF i_speaker = SWAT_SPEAKER_1
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, i_speaker, ped, "BS2BSwat1")
|
|
ELIF i_speaker = SWAT_SPEAKER_2
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, i_speaker, ped, "BS2BSwat2")
|
|
ELIF i_speaker = SWAT_SPEAKER_3
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, i_speaker, ped, "BS2BSwat3")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_ENEMY_SHOOTOUT_DIALOGUE(INT &i_dialogue_timer, BOOL b_force_dialogue = FALSE)
|
|
//Remove peds if they no longer exist, and randomly play dialogue on those that do exist.
|
|
//First clean up any dead/removed speakers.
|
|
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
|
|
IF IS_PED_INJURED(s_conversation_peds.PedInfo[SWAT_SPEAKER_1].Index)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
|
|
IF IS_PED_INJURED(s_conversation_peds.PedInfo[SWAT_SPEAKER_2].Index)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_2)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
|
|
IF IS_PED_INJURED(s_conversation_peds.PedInfo[SWAT_SPEAKER_3].Index)
|
|
REMOVE_PED_FOR_DIALOGUE(s_conversation_peds, SWAT_SPEAKER_3)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Then play dialogue on a random alive enemy ped.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND b_has_text_label_triggered[F3B_GOTOMICH] //This is the initial god text.
|
|
IF GET_GAME_TIMER() - i_dialogue_timer > 0
|
|
OR b_force_dialogue
|
|
INT i_speaker = -1
|
|
INT i_random = GET_RANDOM_INT_IN_RANGE(0, 3)
|
|
IF i_random = 0
|
|
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_1
|
|
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_2
|
|
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_3
|
|
ENDIF
|
|
ELIF i_random = 1
|
|
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_2
|
|
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_3
|
|
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_1
|
|
ENDIF
|
|
ELIF i_random = 2
|
|
IF s_conversation_peds.PedInfo[SWAT_SPEAKER_3].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_3
|
|
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_1].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_1
|
|
ELIF s_conversation_peds.PedInfo[SWAT_SPEAKER_2].ActiveInConversation
|
|
i_speaker = SWAT_SPEAKER_2
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF i_speaker != -1
|
|
IF NOT IS_PED_INJURED(s_conversation_peds.PedInfo[i_speaker].Index)
|
|
AND VDIST2(GET_ENTITY_COORDS(s_conversation_peds.PedInfo[i_speaker].Index), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 1600.0
|
|
IF IS_PED_IN_COMBAT(s_conversation_peds.PedInfo[i_speaker].Index)
|
|
OR IS_PED_SHOOTING(s_conversation_peds.PedInfo[i_speaker].Index)
|
|
OR b_force_dialogue
|
|
TEXT_LABEL str_label
|
|
IF i_speaker = SWAT_SPEAKER_1
|
|
str_label = "BS2B_CGENS1"
|
|
ELIF i_speaker = SWAT_SPEAKER_2
|
|
str_label = "BS2B_CGENS2"
|
|
ELIF i_speaker = SWAT_SPEAKER_3
|
|
str_label = "BS2B_CGENS3"
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, str_label, CONV_PRIORITY_MEDIUM)
|
|
i_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_TUNNEL_SHOOTOUT_ENEMIES(BOOL b_force_activate_peds = FALSE)
|
|
INT i = 0
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
SEQUENCE_INDEX seq
|
|
BOOl b_time_to_trigger = FALSE
|
|
//BOOL b_checked_trigger = FALSE
|
|
BOOL b_player_got_into_vault = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.387976,-686.162659,14.630766>>, <<3.554323,-668.402344,19.196697>>, 15.250000)
|
|
|
|
IF NOT s_tunnel_cops_3[0].b_is_created
|
|
REQUEST_MODEL(model_swat)
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_vault_charge_left)
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_vault_charge_right)
|
|
ENDIF
|
|
|
|
//First cops in vault: Take cover by the wall.
|
|
IF NOT s_tunnel_cops_1[0].b_is_created
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
s_tunnel_cops_1[0].ped = CREATE_ENEMY_PED(model_swat, <<-0.7845, -679.5873, 15.1306>>, 339.3133, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
s_tunnel_cops_1[1].ped = CREATE_ENEMY_PED(model_swat, <<-0.8462, -681.0955, 15.1308>>, 339.3115, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
s_tunnel_cops_1[2].ped = CREATE_ENEMY_PED(model_swat, <<-2.2295, -681.5751, 15.1308>>, 339.3114, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 3, s_tunnel_cops_1[0].ped, "BS2BCop1")
|
|
|
|
INITIALISE_ENEMY_GROUP(s_tunnel_cops_1, "1 ")
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_1) i
|
|
SET_PED_CONFIG_FLAG(s_tunnel_cops_1[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
|
|
SET_ENTITY_PROOFS(s_tunnel_cops_1[i].ped, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
|
|
IF HAS_PED_GOT_WEAPON(s_tunnel_cops_1[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_1[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(s_tunnel_cops_1[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_1[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
SET_ENTITY_VISIBLE(s_tunnel_cops_1[i].ped, FALSE)
|
|
ENDREPEAT
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_tunnel_cops_1) i
|
|
IF NOT IS_PED_INJURED(s_tunnel_cops_1[i].ped)
|
|
SWITCH s_tunnel_cops_1[i].i_event
|
|
CASE 0
|
|
IF (e_mission_stage = STAGE_WINCH_GOLD_CUTSCENE AND b_force_activate_peds)
|
|
OR e_mission_stage != STAGE_WINCH_GOLD_CUTSCENE
|
|
IF i = 0
|
|
s_tunnel_cops_1[i].v_dest = <<2.7797, -670.1835, 15.1306>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover, s_tunnel_cops_1[i].v_dest, 343.5278, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
|
|
SET_PED_PREFERRED_COVER_POINT(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover)
|
|
|
|
//ADD_EXPLOSION(<<10.0806, -647.2332, 15.0857>>, EXP_TAG_SMOKE_GRENADE)
|
|
ELIF i = 1
|
|
s_tunnel_cops_1[i].v_dest = <<3.2509, -671.1411, 15.1308>>
|
|
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover, s_tunnel_cops_1[i].v_dest, 343.5278, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
|
|
SET_PED_PREFERRED_COVER_POINT(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover)
|
|
ELIF i = 2
|
|
s_tunnel_cops_1[i].v_dest = <<0.7341, -670.1761, 15.1308>>
|
|
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover, s_tunnel_cops_1[i].v_dest, 343.5278, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
|
|
SET_PED_PREFERRED_COVER_POINT(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].cover)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_tunnel_cops_1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
|
|
SET_COMBAT_FLOAT(s_tunnel_cops_1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_ENTITY_VISIBLE(s_tunnel_cops_1[i].ped, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_tunnel_cops_1[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
s_tunnel_cops_1[i].i_timer = 0
|
|
s_tunnel_cops_1[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Once the next wave starts charging then break these guys into regular combat.
|
|
IF VDIST2(GET_ENTITY_COORDS(s_tunnel_cops_1[i].ped), s_tunnel_cops_1[i].v_dest) < 4.0
|
|
SET_ENTITY_PROOFS(s_tunnel_cops_1[i].ped, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF s_tunnel_cops_2[0].i_event > 0
|
|
OR b_player_got_into_vault
|
|
IF s_tunnel_cops_1[i].i_timer = 0
|
|
s_tunnel_cops_1[i].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_tunnel_cops_1[i].i_timer > 7000
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) = 0
|
|
OR b_player_got_into_vault
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_ENTITY_PROOFS(s_tunnel_cops_1[i].ped, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
|
|
s_tunnel_cops_1[i].i_timer = 0
|
|
s_tunnel_cops_1[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Have some of them charge forwards if the nxt group is already dead.
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_vault_charge_left)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_vault_charge_right)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) = 0
|
|
IF i = 0
|
|
s_tunnel_cops_1[i].v_dest = <<4.3919, -661.5233, 15.1306>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].v_dest, 2.0)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(s_tunnel_cops_1[i].ped, str_waypoint_vault_charge_left, 0,
|
|
EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_1[i].ped, TRUE)
|
|
|
|
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_1[i].ped, "MOVE_IN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
|
|
s_tunnel_cops_1[i].i_timer = 0
|
|
s_tunnel_cops_1[i].i_event++
|
|
ELIF i = 2
|
|
s_tunnel_cops_1[i].v_dest = <<6.7206, -662.2943, 15.1306>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].v_dest, 2.0)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(s_tunnel_cops_1[i].ped, str_waypoint_vault_charge_right, 0,
|
|
EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_1[i].ped, TRUE)
|
|
|
|
s_tunnel_cops_1[i].i_timer = 0
|
|
s_tunnel_cops_1[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //If the peds went on the waypoints
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(s_tunnel_cops_1[i].ped, PEDMOVE_RUN)
|
|
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_tunnel_cops_1[i].ped)
|
|
WAYPOINT_PLAYBACK_START_AIMING_AT_PED(s_tunnel_cops_1[i].ped, PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
VECTOR v_current_pos
|
|
v_current_pos = GET_ENTITY_COORDS(s_tunnel_cops_1[i].ped)
|
|
|
|
IF VDIST2(v_current_pos, v_player_pos) < 4.0
|
|
OR VDIST2(v_current_pos, s_tunnel_cops_1[i].v_dest) < 16.0
|
|
OR NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_tunnel_cops_1[i].ped)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_1[i].ped, v_current_pos, 2.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_1[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_1[i].ped, FALSE)
|
|
|
|
s_tunnel_cops_1[i].i_timer = 0
|
|
s_tunnel_cops_1[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_tunnel_cops_1[i].i_event > 0
|
|
SET_PED_RESET_FLAG(s_tunnel_cops_1[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
UPDATE_AI_PED_BLIP(s_tunnel_cops_1[i].ped, s_tunnel_cops_1[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_tunnel_cops_1[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Second wave: try to charge at the player through the side doors.
|
|
IF NOT s_tunnel_cops_2[0].b_is_created
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_vault_charge_left)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_vault_charge_right)
|
|
s_tunnel_cops_2[0].ped = CREATE_ENEMY_PED(model_swat, <<-3.9060, -690.9534, 15.1308>>, 338.8146, rel_group_cops, 200, 0, WEAPONTYPE_PUMPSHOTGUN)
|
|
s_tunnel_cops_2[1].ped = CREATE_ENEMY_PED(model_swat, <<-12.0647, -693.7500, 15.1307>>, 289.9279, rel_group_cops, 200, 0, WEAPONTYPE_PUMPSHOTGUN)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_tunnel_cops_2, "2 ")
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_2) i
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_2[i].ped, WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
SET_PED_CONFIG_FLAG(s_tunnel_cops_2[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
|
|
SET_ENTITY_PROOFS(s_tunnel_cops_2[i].ped, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
ENDREPEAT
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_tunnel_cops_2) i
|
|
IF NOT IS_PED_INJURED(s_tunnel_cops_2[i].ped)
|
|
SWITCH s_tunnel_cops_2[i].i_event
|
|
CASE 0
|
|
IF s_tunnel_cops_2[i].i_timer = 0
|
|
s_tunnel_cops_2[i].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_tunnel_cops_2[i].i_timer > 8000
|
|
OR b_player_got_into_vault
|
|
IF i = 0
|
|
s_tunnel_cops_2[i].v_dest = <<4.3919, -661.5233, 15.1306>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_2[i].ped, s_tunnel_cops_2[i].v_dest, 2.0)
|
|
ELIF i = 1
|
|
s_tunnel_cops_2[i].v_dest = <<6.7206, -662.2943, 15.1306>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_2[i].ped, s_tunnel_cops_2[i].v_dest, 2.0)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_tunnel_cops_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_tunnel_cops_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
IF i = 0
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(s_tunnel_cops_2[i].ped, str_waypoint_vault_charge_left, 0,
|
|
EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_2[i].ped, "MOVE_IN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ELSE
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(s_tunnel_cops_2[i].ped, str_waypoint_vault_charge_right, 0,
|
|
EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
ENDIF
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_2[i].ped, TRUE)
|
|
|
|
s_tunnel_cops_2[i].i_timer = 0
|
|
s_tunnel_cops_2[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Break out of waypoint recording once ready.
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(s_tunnel_cops_2[i].ped, PEDMOVE_RUN)
|
|
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_tunnel_cops_2[i].ped)
|
|
WAYPOINT_PLAYBACK_START_AIMING_AT_PED(s_tunnel_cops_2[i].ped, PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
VECTOR v_current_pos
|
|
v_current_pos = GET_ENTITY_COORDS(s_tunnel_cops_2[i].ped)
|
|
|
|
IF VDIST2(v_current_pos, v_player_pos) < 4.0
|
|
OR VDIST2(v_current_pos, s_tunnel_cops_2[i].v_dest) < 16.0
|
|
OR NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_tunnel_cops_2[i].ped)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_2[i].ped, v_current_pos, 2.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_2[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_2[i].ped, FALSE)
|
|
SET_ENTITY_PROOFS(s_tunnel_cops_2[i].ped, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
|
|
s_tunnel_cops_2[i].i_timer = 0
|
|
s_tunnel_cops_2[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_tunnel_cops_2[i].i_event > 0
|
|
SET_PED_RESET_FLAG(s_tunnel_cops_2[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
UPDATE_AI_PED_BLIP(s_tunnel_cops_2[i].ped, s_tunnel_cops_2[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_tunnel_cops_2[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//More cops arrive after the first two batches are dead.
|
|
IF NOT s_tunnel_cops_2b[0].b_is_created
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
s_tunnel_cops_2b[0].ped = CREATE_ENEMY_PED(model_swat, <<-12.8146, -694.0009, 15.1308>>, 301.6743, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
s_tunnel_cops_2b[1].ped = CREATE_ENEMY_PED(model_swat, <<-13.6107, -694.3180, 15.1309>>, 315.4348, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
s_tunnel_cops_2b[2].ped = CREATE_ENEMY_PED(model_swat, <<-14.3188, -695.0073, 15.1309>>, 319.8594, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_tunnel_cops_2b, "2b ")
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_2b) i
|
|
IF HAS_PED_GOT_WEAPON(s_tunnel_cops_2b[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_2b[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(s_tunnel_cops_2b[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_2b[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
|
|
SET_PED_CONFIG_FLAG(s_tunnel_cops_2b[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
|
|
SET_ENTITY_PROOFS(s_tunnel_cops_2b[i].ped, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
ENDREPEAT
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_tunnel_cops_2b) i
|
|
IF NOT IS_PED_INJURED(s_tunnel_cops_2b[i].ped)
|
|
SWITCH s_tunnel_cops_2b[i].i_event
|
|
CASE 0
|
|
b_time_to_trigger = ((GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2)) < 3
|
|
OR b_player_got_into_vault)
|
|
|
|
IF b_time_to_trigger
|
|
IF i = 0
|
|
s_tunnel_cops_2b[i].v_dest = <<2.4281, -671.4919, 15.1308>>
|
|
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_2b[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ELIF i = 1
|
|
s_tunnel_cops_2b[i].v_dest = <<3.2209, -672.1075, 15.1308>>
|
|
ELIF i = 2
|
|
s_tunnel_cops_2b[i].v_dest = <<0.4082, -671.0529, 15.1308>>
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_tunnel_cops_2b[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_2b[i].ped, s_tunnel_cops_2b[i].v_dest, 2.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2b[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_2b[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(s_tunnel_cops_2b[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_tunnel_cops_2b[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_2b[i].ped, FALSE)
|
|
|
|
s_tunnel_cops_2b[i].i_timer = 0
|
|
s_tunnel_cops_2b[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF VDIST2(s_tunnel_cops_2b[i].v_dest, GET_ENTITY_COORDS(s_tunnel_cops_2b[i].ped)) < 4.0
|
|
SET_ENTITY_PROOFS(s_tunnel_cops_2b[i].ped, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
s_tunnel_cops_2b[i].i_timer = 0
|
|
s_tunnel_cops_2b[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_tunnel_cops_2b[i].i_event > 0
|
|
SET_PED_RESET_FLAG(s_tunnel_cops_2b[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
UPDATE_AI_PED_BLIP(s_tunnel_cops_2b[i].ped, s_tunnel_cops_2b[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_tunnel_cops_2b[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Cops rappelling down.
|
|
IF NOT s_tunnel_cops_3[0].b_is_created
|
|
REQUEST_RAPPEL_ASSETS()
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAVE_RAPPEL_ASSETS_LOADED()
|
|
//Trigger after Trevor's line about leaving the area has finished.
|
|
IF b_has_text_label_triggered[BS2B_TLEAVE]
|
|
s_tunnel_cops_3[0].ped = CREATE_ENEMY_PED(model_swat, <<28.1363, -639.6749, 29.3101>>, 247.7011, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
s_tunnel_cops_3[1].ped = CREATE_ENEMY_PED(model_swat, <<18.7498, -638.1521, 29.3101>>, 70.5276, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
s_tunnel_cops_3[2].ped = CREATE_ENEMY_PED(model_swat, <<19.9, -635.0039, 29.3101>>, 69.8973, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_tunnel_cops_3, "rappel ")
|
|
|
|
INIT_RAPPEL_WITH_ROPE(s_tunnel_cops_3_rappel_data[0], NULL, <<28.1363, -639.6749, 29.3101>>, <<0,0,247.7011>>, -2.0, -13.2, 13.2,
|
|
FALSE, FALSE, TRUE, s_tunnel_cops_3[0].ped, TRUE, TRUE, 1.0, -1.0, FALSE)
|
|
INIT_RAPPEL_WITH_ROPE(s_tunnel_cops_3_rappel_data[1], NULL, <<18.7498, -638.1521, 29.3101>>, <<0,0,70.5276>>, -2.0, -13.2, 13.2,
|
|
FALSE, FALSE, TRUE, s_tunnel_cops_3[1].ped, TRUE, TRUE, 1.0, -1.0, FALSE)
|
|
INIT_RAPPEL_WITH_ROPE(s_tunnel_cops_3_rappel_data[2], NULL, <<19.9, -635.0039, 29.3101>>, <<0,0,69.8973>>, -2.0, -13.2, 13.2,
|
|
FALSE, FALSE, TRUE, s_tunnel_cops_3[2].ped, TRUE, TRUE, 1.0, -1.0, FALSE)
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_3) i
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_3[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
SET_RAPPEL_AI(s_tunnel_cops_3_rappel_data[i], RAPPEL_AI_STOP)
|
|
s_tunnel_cops_3_rappel_data[i].bSuppressUnpinAllVertices = TRUE
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_tunnel_cops_3[i].ped, "BS_2B_NOOSE_ABSEIL_GROUP")
|
|
s_tunnel_cops_3[i].i_timer = GET_GAME_TIMER()
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
INT iNumPedsFinishedRappelling = 0
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_3) i
|
|
IF NOT IS_PED_INJURED(s_tunnel_cops_3[i].ped)
|
|
SWITCH s_tunnel_cops_3[i].i_event
|
|
CASE 0
|
|
IF IS_SPHERE_VISIBLE(<<23.4, -636.1, 19.9>>, 5.0)
|
|
OR GET_GAME_TIMER() - s_tunnel_cops_3[i].i_timer > 15000
|
|
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2b) = 0)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_NOOSE_ABSEIL_SCENE")
|
|
START_AUDIO_SCENE("BS_2B_NOOSE_ABSEIL_SCENE")
|
|
ENDIF
|
|
|
|
s_tunnel_cops_3[i].blip = CREATE_BLIP_FOR_PED(s_tunnel_cops_3[i].ped, TRUE)
|
|
s_tunnel_cops_3[i].i_timer = GET_GAME_TIMER()
|
|
s_tunnel_cops_3[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
INT i_threshold
|
|
|
|
IF i = 0
|
|
i_threshold = 400
|
|
SET_RAPPEL_MAX_SLIDE_SPEED(s_tunnel_cops_3_rappel_data[i], 3.0)
|
|
ELIF i = 1
|
|
i_threshold = 0
|
|
ELIF i = 2
|
|
i_threshold = 750
|
|
SET_RAPPEL_MAX_SLIDE_SPEED(s_tunnel_cops_3_rappel_data[i], 2.8)
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - s_tunnel_cops_3[i].i_timer > i_threshold
|
|
SET_RAPPEL_AI(s_tunnel_cops_3_rappel_data[i], RAPPEL_AI_MOVE_FAST)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_tunnel_cops_3[i].ped, rel_group_cops)
|
|
|
|
IF i = 0 OR i = 2
|
|
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_3[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
s_tunnel_cops_3[i].i_timer = GET_GAME_TIMER()
|
|
s_tunnel_cops_3[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
HANDLE_RAPPEL(s_tunnel_cops_3_rappel_data[i], TRUE, FALSE)
|
|
VECTOR vPos
|
|
vPos = GET_ENTITY_COORDS(s_tunnel_cops_3[i].ped)
|
|
|
|
IF HAS_FREE_ROPING_FINISHED(s_tunnel_cops_3_rappel_data[i])
|
|
OR vPos.z < 16.25
|
|
//CANCEL_RAPPEL(s_tunnel_cops_3_rappel_data[i], FALSE, WEAPONTYPE_CARBINERIFLE, TRUE, FALSE)
|
|
DISMOUNT_RAPPEL(s_tunnel_cops_3_rappel_data[i], WEAPONTYPE_CARBINERIFLE)
|
|
SET_ENTITY_COLLISION(s_tunnel_cops_3[i].ped, TRUE)
|
|
|
|
s_tunnel_cops_3[i].i_timer = 0
|
|
s_tunnel_cops_3[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
HANDLE_RAPPEL(s_tunnel_cops_3_rappel_data[i], TRUE, FALSE)
|
|
|
|
IF s_tunnel_cops_3[i].i_timer = 0
|
|
s_tunnel_cops_3[i].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_tunnel_cops_3[i].i_timer > 700
|
|
CANCEL_RAPPEL(s_tunnel_cops_3_rappel_data[i], FALSE, WEAPONTYPE_CARBINERIFLE, TRUE, FALSE)
|
|
|
|
IF i = 0
|
|
s_tunnel_cops_3[i].v_dest = <<24.0304, -643.2753, 15.0881>>
|
|
ELIF i = 1
|
|
s_tunnel_cops_3[i].v_dest = <<16.9297, -638.2366, 15.0881>>
|
|
ELIF i = 2
|
|
s_tunnel_cops_3[i].v_dest = GET_ENTITY_COORDS(s_tunnel_cops_3[i].ped)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_tunnel_cops_3[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_3[i].ped, s_tunnel_cops_3[i].v_dest, 2.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_3[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_3[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_3[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_3[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_tunnel_cops_3[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
|
|
SET_COMBAT_FLOAT(s_tunnel_cops_3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
// TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_3[i].ped, 200.0)
|
|
TASK_COMBAT_PED(s_tunnel_cops_3[i].ped, PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_3[i].ped, FALSE)
|
|
|
|
REMOVE_BLIP(s_tunnel_cops_3[i].blip)
|
|
UPDATE_AI_PED_BLIP(s_tunnel_cops_3[i].ped, s_tunnel_cops_3[i].s_blip_data)
|
|
s_tunnel_cops_3[i].i_timer = 0
|
|
s_tunnel_cops_3[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
HANDLE_RAPPEL_ROPE(s_tunnel_cops_3_rappel_data[i], FALSE, FALSE, FALSE, TRUE)
|
|
iNumPedsFinishedRappelling++
|
|
|
|
UPDATE_AI_PED_BLIP(s_tunnel_cops_3[i].ped, s_tunnel_cops_3[i].s_blip_data)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_tunnel_cops_3[i].i_event > 1
|
|
SET_PED_RESET_FLAG(s_tunnel_cops_3[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
//If this is the first rappel ped to die then record some footage.
|
|
//IF COUNT_OF(s_tunnel_cops_3) - GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_3) = 1
|
|
IF NOT bRecordSomeRappelling
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.0)
|
|
bRecordSomeRappelling = TRUE
|
|
ENDIF
|
|
|
|
HANDLE_RAPPEL_ROPE(s_tunnel_cops_3_rappel_data[i], FALSE, FALSE, FALSE, TRUE)
|
|
iNumPedsFinishedRappelling++
|
|
|
|
CLEAN_UP_ENEMY_PED(s_tunnel_cops_3[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iNumPedsFinishedRappelling >= COUNT_OF(s_tunnel_cops_3)
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_NOOSE_ABSEIL_SCENE")
|
|
STOP_AUDIO_SCENE("BS_2B_NOOSE_ABSEIL_SCENE")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_TUNNEL_SHOOTOUT_ENEMIES_2(BOOL b_force_activate_peds = FALSE)
|
|
INT i = 0
|
|
VECTOR v_pos
|
|
//VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
SEQUENCE_INDEX seq
|
|
BOOL b_time_to_trigger = FALSE
|
|
//BOOL b_checked_trigger = FALSE
|
|
|
|
IF b_force_activate_peds
|
|
|
|
ENDIF
|
|
|
|
//Cops run down the tunnels
|
|
IF NOT s_tunnel_cops_new_1[0].b_is_created
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
IF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[0].ped)
|
|
b_time_to_trigger = (e_mission_stage = STAGE_COLLECT_GOLD)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<41.326279,-672.480347,14.733490>>, <<27.868965,-655.675354,19.991060>>, 36.750000)
|
|
//OR GET_GAME_TIMER() - i_time_since_bomb_section_started > 60000
|
|
OR s_tunnel_cops_new_1[0].i_event > 0
|
|
|
|
IF b_time_to_trigger
|
|
s_tunnel_cops_new_1[0].ped = CREATE_ENEMY_PED(model_swat, <<36.6492, -687.2292, 15.4872>>, 359.6833, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[1].ped)
|
|
s_tunnel_cops_new_1[1].ped = CREATE_ENEMY_PED(model_swat, <<35.7176, -689.4240, 15.5492>>, 359.2877, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[2].ped)
|
|
s_tunnel_cops_new_1[2].ped = CREATE_ENEMY_PED(model_swat, <<34.1383, -696.9333, 15.7245>>, 357.4622, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[3].ped)
|
|
s_tunnel_cops_new_1[3].ped = CREATE_ENEMY_PED(model_swat, <<32.2270, -699.9393, 15.6202>>, 356.0465, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[4].ped)
|
|
s_tunnel_cops_new_1[4].ped = CREATE_ENEMY_PED(model_swat, <<28.9658, -705.8560, 15.5606>>, 339.0316, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[5].ped)
|
|
s_tunnel_cops_new_1[5].ped = CREATE_ENEMY_PED(model_swat, <<27.2658, -707.4560, 15.5606>>, 339.0316, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[6].ped)
|
|
s_tunnel_cops_new_1[6].ped = CREATE_ENEMY_PED(model_swat, <<15.9690, -721.1433, 15.5305>>, 326.4022, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_1[7].ped)
|
|
s_tunnel_cops_new_1[7].ped = CREATE_ENEMY_PED(model_swat, <<7.7690, -729.8433, 15.5305>>, 326.4022, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_new_1) i
|
|
IF NOT IS_PED_INJURED(s_tunnel_cops_new_1[i].ped)
|
|
IF HAS_PED_GOT_WEAPON(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF i_tunnel_navmesh_block = -1
|
|
i_tunnel_navmesh_block = ADD_NAVMESH_BLOCKING_OBJECT(<<34.9, -675.5, 16.3>>, <<1.9, 1.9, 5.0>>, DEG_TO_RAD(-173.5))
|
|
ENDIF
|
|
|
|
INITIALISE_ENEMY_GROUP(s_tunnel_cops_new_1, "new 1 ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_time_to_trigger = FALSE
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_new_1) i
|
|
IF NOT IS_PED_INJURED(s_tunnel_cops_new_1[i].ped)
|
|
SWITCH s_tunnel_cops_new_1[i].i_event
|
|
CASE 0
|
|
IF i < 4
|
|
b_time_to_trigger = TRUE
|
|
ELSE
|
|
b_time_to_trigger = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<41.326279,-672.480347,14.733490>>, <<27.868965,-655.675354,19.991060>>, 36.750000)
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) < 8
|
|
ENDIF
|
|
|
|
IF b_time_to_trigger
|
|
IF i = 0
|
|
v_pos = <<38.5383, -671.1333, 15.4245>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
|
|
ELIF i = 1
|
|
v_pos = <<34.6138, -671.2228, 15.4835>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
|
|
ELIF i = 2
|
|
v_pos = <<27.0334, -648.3330, 15.0881>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
|
|
ELIF i = 3
|
|
v_pos = <<17.3964, -651.6926, 15.0881>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
|
|
ELIF i = 4
|
|
v_pos = <<35.2043, -663.0771, 15.4835>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
|
|
ELIF i = 5
|
|
v_pos = <<25.4105, -659.9389, 15.2536>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
|
|
ELIF i = 6
|
|
v_pos = <<33.7382, -670.4211, 15.4835>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
|
|
ELIF i = 7
|
|
v_pos = <<37.8303, -666.4304, 15.4835>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, v_pos, 2.0, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_tunnel_cops_new_1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_CAN_COWER_IN_COVER(s_tunnel_cops_new_1[i].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_tunnel_cops_new_1[i].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_tunnel_cops_new_1[i].ped)
|
|
SET_COMBAT_FLOAT(s_tunnel_cops_new_1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(s_tunnel_cops_new_1[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
|
|
IF i < 2
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_new_1[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_new_1[i].ped, FALSE)
|
|
ELIF i = 2 OR i = 3
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<37.1755, -675.1907, 15.5034>>, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.5, 4.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_tunnel_cops_new_1[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ELIF i >= 4
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
IF i = 4
|
|
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_new_1[i].ped, "MOVE_IN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_new_1[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_new_1[i].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF i = 0
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 3, s_tunnel_cops_new_1[i].ped, "BS2BSwat1")
|
|
ENDIF
|
|
|
|
s_tunnel_cops_new_1[i].i_timer = 0
|
|
s_tunnel_cops_new_1[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Have the front guy push forward if someone in the group dies.
|
|
IF i = 0 //First guy shouts when opening fire.
|
|
IF NOT b_has_text_label_triggered[BS2B_BCOPS]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BCOPS", CONV_PRIORITY_MEDIUM)
|
|
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_new_1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL)
|
|
b_has_text_label_triggered[BS2B_BCOPS] = TRUE
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Once the two rushing enemies get into position (or die) then allow the two covering enemies to push.
|
|
IF i = 0 OR i = 1
|
|
IF s_tunnel_cops_new_1[i].i_timer = 0
|
|
s_tunnel_cops_new_1[i].i_timer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF (i = 0 AND GET_GAME_TIMER() - s_tunnel_cops_new_1[i].i_timer > 15200)
|
|
OR (i = 1 AND GET_GAME_TIMER() - s_tunnel_cops_new_1[i].i_timer > 14800)
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, <<27.7524, -647.8356, 15.0881>>, 3.0)
|
|
ELSE
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_1[i].ped, <<25.1614, -659.1172, 15.2274>>, 3.0)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
s_tunnel_cops_new_1[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_tunnel_cops_new_1[i].i_event > 0
|
|
SET_PED_RESET_FLAG(s_tunnel_cops_new_1[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
UPDATE_AI_PED_BLIP(s_tunnel_cops_new_1[i].ped, s_tunnel_cops_new_1[i].s_blip_data)
|
|
ENDIF
|
|
|
|
//Kill these cops instantly if they're hit by the exploding gas cans or the cutter.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(s_tunnel_cops_new_1[i].ped, WEAPONTYPE_EXPLOSION)
|
|
APPLY_DAMAGE_TO_PED(s_tunnel_cops_new_1[i].ped, 200, TRUE)
|
|
ELIF IS_PED_TOUCHING_CUTTER_BLADES(s_tunnel_cops_new_1[i].ped)
|
|
APPLY_DAMAGE_TO_PED(s_tunnel_cops_new_1[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_tunnel_cops_new_1[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Cops run from the other side.
|
|
IF NOT s_tunnel_cops_new_2[0].b_is_created
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
IF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[0].ped)
|
|
b_time_to_trigger = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-8.604258,-606.761108,14.231360>>, <<-6.964643,-608.810669,18.422485>>, 6.750000)
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) < 2
|
|
|
|
IF b_time_to_trigger
|
|
s_tunnel_cops_new_2[0].ped = CREATE_ENEMY_PED(model_swat, <<-15.0140, -591.5684, 17.2677>>, 159.3242, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[1].ped)
|
|
s_tunnel_cops_new_2[1].ped = CREATE_ENEMY_PED(model_swat, <<-12.7972, -590.0397, 17.6131>>, 129.0517, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[2].ped)
|
|
s_tunnel_cops_new_2[2].ped = CREATE_ENEMY_PED(model_swat, <<-11.4219, -589.1260, 17.8536>>, 125.2921, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[3].ped)
|
|
s_tunnel_cops_new_2[3].ped = CREATE_ENEMY_PED(model_swat, <<-9.7856, -588.1921, 18.1903>>, 120.8828, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[4].ped)
|
|
s_tunnel_cops_new_2[4].ped = CREATE_ENEMY_PED(model_swat, <<-8.4372, -587.6932, 18.4802>>, 132.6740, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[5].ped)
|
|
s_tunnel_cops_new_2[5].ped = CREATE_ENEMY_PED(model_swat, <<-7.1320, -587.0947, 18.7958>>, 132.6740, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[6].ped)
|
|
s_tunnel_cops_new_2[6].ped = CREATE_ENEMY_PED(model_swat, <<-5.7203, -586.3234, 19.1201>>, 138.0245, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_tunnel_cops_new_2[7].ped)
|
|
s_tunnel_cops_new_2[7].ped = CREATE_ENEMY_PED(model_swat, <<-4.3026, -585.6801, 19.3491>>, 131.6877, rel_group_cops, 200, 0, WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_tunnel_cops_new_2, "new 2 ")
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_new_2) i
|
|
IF NOT IS_PED_INJURED(s_tunnel_cops_new_2[i].ped)
|
|
FREEZE_ENTITY_POSITION(s_tunnel_cops_new_2[i].ped, TRUE)
|
|
SET_ENTITY_INVINCIBLE(s_tunnel_cops_new_2[i].ped, TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(s_tunnel_cops_new_2[i].ped, TRUE)
|
|
|
|
IF HAS_PED_GOT_WEAPON(s_tunnel_cops_new_2[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_new_2[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(s_tunnel_cops_new_2[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(s_tunnel_cops_new_2[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
INT i_num_enemies_alive = GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2)
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_new_2) i
|
|
IF NOT IS_PED_INJURED(s_tunnel_cops_new_2[i].ped)
|
|
SWITCH s_tunnel_cops_new_2[i].i_event
|
|
CASE 0
|
|
IF i < 4
|
|
b_time_to_trigger = TRUE
|
|
ELIF i < 6
|
|
b_time_to_trigger = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-8.604258,-606.761108,14.231360>>, <<-6.964643,-608.810669,18.422485>>, 6.750000)
|
|
OR i_num_enemies_alive < 7
|
|
ELSE
|
|
b_time_to_trigger = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-8.604258,-606.761108,14.231360>>, <<-6.964643,-608.810669,18.422485>>, 6.750000)
|
|
OR i_num_enemies_alive < 6
|
|
ENDIF
|
|
|
|
IF b_time_to_trigger
|
|
IF i = 0
|
|
v_pos = <<-16.4908, -596.7791, 16.5802>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, TRUE)
|
|
ELIF i = 1
|
|
v_pos = <<-7.5370, -617.3412, 14.9065>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_new_2[i].ped, s_tunnel_cops_new_2[i].cover, v_pos, 201.3598, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 2
|
|
v_pos = <<-10.4712, -602.2746, 15.6628>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_new_2[i].ped, s_tunnel_cops_new_2[i].cover, v_pos, 203.7851, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 3
|
|
v_pos = <<-0.6758, -629.6381, 14.7396>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_tunnel_cops_new_2[i].ped, s_tunnel_cops_new_2[i].cover, v_pos, 248.4832, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 4
|
|
v_pos = <<-7.5370, -617.3412, 14.9065>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, FALSE)
|
|
ELIF i = 5
|
|
v_pos = <<-10.4712, -602.2746, 15.6628>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, FALSE)
|
|
ELIF i = 6
|
|
v_pos = <<-0.6758, -629.6381, 14.7396>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, FALSE)
|
|
ELIF i = 7
|
|
v_pos = <<-4.0, -637.0, 14.9>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0, FALSE)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(s_tunnel_cops_new_2[i].ped, FALSE)
|
|
SET_ENTITY_INVINCIBLE(s_tunnel_cops_new_2[i].ped, FALSE)
|
|
SET_PED_COMBAT_PARAMS(s_tunnel_cops_new_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_CAN_COWER_IN_COVER(s_tunnel_cops_new_2[i].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_tunnel_cops_new_2[i].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_tunnel_cops_new_2[i].ped)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, v_pos, 2.0)
|
|
SET_COMBAT_FLOAT(s_tunnel_cops_new_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(s_tunnel_cops_new_2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
|
|
IF i != 0
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
ENDIF
|
|
|
|
IF i = 0 OR i = 4
|
|
PLAY_PED_AMBIENT_SPEECH(s_tunnel_cops_new_2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_tunnel_cops_new_2[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_tunnel_cops_new_2[i].ped, FALSE)
|
|
|
|
|
|
//s_tunnel_cops_new_2[i].blip = CREATE_BLIP_FOR_ENTITY(s_tunnel_cops_new_2[i].ped, TRUE)
|
|
s_tunnel_cops_new_2[i].i_timer = 0
|
|
s_tunnel_cops_new_2[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //After some time have the covering enemies push forward.
|
|
IF i = 0
|
|
IF s_tunnel_cops_new_2[i].i_timer = 0
|
|
s_tunnel_cops_new_2[i].i_timer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF GET_GAME_TIMER() - s_tunnel_cops_new_2[i].i_timer > 12200
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_tunnel_cops_new_2[i].ped, <<2.8157, -626.8237, 14.6692>>, 3.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_tunnel_cops_new_2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
s_tunnel_cops_new_2[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Set enemies to charge if a certain number is dead.
|
|
IF i_num_enemies_alive = 1
|
|
OR (i = 2 AND i_num_enemies_alive < 3)
|
|
SET_PED_CONFIG_FLAG(s_tunnel_cops_new_2[i].ped, PCF_ShouldChargeNow, TRUE)
|
|
|
|
s_tunnel_cops_new_2[i].i_event++
|
|
ENDIF
|
|
|
|
//The buddy has a "more guys from the other side" line that ties in with the cops appearing, place here as the mission could potentially be in different stages.
|
|
IF NOT b_has_text_label_triggered[BS2B_CRCOPS4]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF s_tunnel_cops_new_1[0].i_event > 0 //Only trigger if the enemies were triggered in order.
|
|
IF s_tunnel_cops_new_1[i].i_timer = 0
|
|
s_tunnel_cops_new_1[i].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_tunnel_cops_new_2[i].i_timer > 3000
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SEC")
|
|
b_has_text_label_triggered[BS2B_CRCOPS4] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[BS2B_CRCOPS4] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_tunnel_cops_new_2[i].i_event > 0
|
|
SET_PED_RESET_FLAG(s_tunnel_cops_new_2[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
UPDATE_AI_PED_BLIP(s_tunnel_cops_new_2[i].ped, s_tunnel_cops_new_2[i].s_blip_data)
|
|
ENDIF
|
|
|
|
IF IS_PED_TOUCHING_CUTTER_BLADES(s_tunnel_cops_new_2[i].ped)
|
|
APPLY_DAMAGE_TO_PED(s_tunnel_cops_new_2[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_tunnel_cops_new_2[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_SHOOTOUT_COPS()
|
|
INT i = 0
|
|
VECTOR v_pos
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
SEQUENCE_INDEX seq
|
|
|
|
BOOL b_created_ped_this_frame = FALSE
|
|
BOOL b_created_vehicle_this_frame = FALSE
|
|
BOOL b_time_to_trigger_enemies = FALSE
|
|
BOOL b_already_checked_enemy_trigger = FALSE
|
|
|
|
IF e_mission_stage < STAGE_LOSE_COPS
|
|
REQUEST_MODEL(model_cop)
|
|
|
|
IF e_mission_stage > STAGE_LEAVE_BANK
|
|
REQUEST_MODEL(model_cop_car)
|
|
ENDIF
|
|
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_PISTOL)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
|
|
|
|
//First cops to appear when leaving the bank
|
|
REPEAT COUNT_OF(s_cops_start) i
|
|
IF NOT s_cops_start[i].b_is_created
|
|
IF NOT b_created_ped_this_frame
|
|
AND HAS_MODEL_LOADED(model_cop)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PISTOL)
|
|
SWITCH i
|
|
CASE 0 s_cops_start[0].ped = CREATE_ENEMY_PED(model_cop, <<-25.2, -680.9, 48.4766>>, -64.9392, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL) BREAK
|
|
CASE 1 s_cops_start[1].ped = CREATE_ENEMY_PED(model_cop, <<-11.0577, -674.1201, 48.5005>>, 273.1100, rel_group_cops, 200, 0, WEAPONTYPE_PUMPSHOTGUN) BREAK
|
|
CASE 2 s_cops_start[2].ped = CREATE_ENEMY_PED(model_cop, <<-37.5546, -681.1513, 48.4740>>, 338.5009, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL) BREAK
|
|
CASE 3 s_cops_start[3].ped = CREATE_ENEMY_PED(model_cop, <<-62.8, -701.6, 48.4740>>, -66.8, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE) BREAK
|
|
CASE 4 s_cops_start[4].ped = CREATE_ENEMY_PED(model_cop, <<-63.7075, -703.1475, 48.4740>>, 338.9530, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL) BREAK
|
|
ENDSWITCH
|
|
|
|
INITIALISE_ENEMY_PED(s_cops_start[i], "Start ", i)
|
|
SET_COMBAT_FLOAT(s_cops_start[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
|
|
SET_PED_CONFIG_FLAG(s_cops_start[i].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
b_created_ped_this_frame = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(s_cops_start[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_start[i].ped)
|
|
SWITCH s_cops_start[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_start[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_start[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_start[i].ped, 200.0)
|
|
|
|
s_cops_start[i].i_event = 100
|
|
ELSE
|
|
IF i != 4
|
|
IF i = 1 OR i = 2 OR IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF i = 0
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_start[i].ped, s_cops_start[i].cover, <<-16.4179, -671.3395, 48.4766>>, -18.4, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 1
|
|
v_pos = <<-11.0577, -674.1201, 48.5005>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_start[i].ped, s_cops_start[i].cover, v_pos, -63.0, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ELIF i = 2
|
|
v_pos = <<-37.3565, -681.3320, 48.5495>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_start[i].ped, s_cops_start[i].cover, v_pos, 336.9946, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 3
|
|
v_pos = <<-39.1769, -687.3491, 48.5495>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_start[i].ped, s_cops_start[i].cover, v_pos, -63.0, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_start[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_DISABLE_PINNED_DOWN, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF i = 1 OR i = 2
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, v_pos, 1000 + (i * 400), FALSE, 0.0, FALSE, FALSE, s_cops_start[i].cover, TRUE)
|
|
ENDIF
|
|
|
|
IF i = 3
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_PAUSE(NULL, 3400)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_cops_start[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_start[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
//s_cops_start[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_start[i].ped, TRUE)
|
|
s_cops_start[i].i_event++
|
|
ENDIF
|
|
ELIF ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, NULL, <<-42.12,-672.53,48.52>>, <<-35.51,-688.068,52.219>>, 1.75)
|
|
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) < 2 AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) < 2)
|
|
SET_PED_COMBAT_AI(s_cops_start[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, CA_USE_COVER, <<-50.6064, -688.0734, 48.4740>>, 2.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_start[i].ped, CA_CAN_CHARGE, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_start[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_start[i].ped, FALSE)
|
|
|
|
//s_cops_start[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_start[i].ped, TRUE)
|
|
s_cops_start[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF i = 0
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PED_CONFIG_FLAG(s_cops_start[i].ped, PCF_ShouldChargeNow, TRUE)
|
|
s_cops_start[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_cops_start[i].i_event > 0
|
|
UPDATE_AI_PED_BLIP(s_cops_start[i].ped, s_cops_start[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_start[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//More cops arrive as the player progresses
|
|
REPEAT COUNT_OF(s_cops_pillars) i
|
|
IF i = 0
|
|
b_created_ped_this_frame = FALSE
|
|
b_time_to_trigger_enemies = FALSE
|
|
b_already_checked_enemy_trigger = FALSE
|
|
ENDIF
|
|
|
|
IF NOT s_cops_pillars[i].b_is_created
|
|
IF NOT b_created_ped_this_frame
|
|
AND HAS_MODEL_LOADED(model_cop)
|
|
SWITCH i
|
|
CASE 0 s_cops_pillars[0].ped = CREATE_ENEMY_PED(model_cop, <<-65.4661, -705.5660, 48.4740>>, 329.6893, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE) BREAK
|
|
CASE 1 s_cops_pillars[1].ped = CREATE_ENEMY_PED(model_cop, <<-74.2775, -703.4993, 46.3202>>, 260.4156, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE) BREAK
|
|
ENDSWITCH
|
|
|
|
INITIALISE_ENEMY_PED(s_cops_pillars[i], "Pillars ", i)
|
|
SET_COMBAT_FLOAT(s_cops_pillars[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
|
|
SET_PED_CONFIG_FLAG(s_cops_pillars[i].ped, PCF_DontBlipCop, TRUE)
|
|
b_created_ped_this_frame = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(s_cops_pillars[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_pillars[i].ped)
|
|
IF s_cops_pillars[i].i_event = 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_pillars[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_pillars[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_pillars[i].ped, 200.0)
|
|
|
|
s_cops_pillars[i].i_event = 100
|
|
ELSE
|
|
IF NOT b_already_checked_enemy_trigger
|
|
b_time_to_trigger_enemies = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, NULL,
|
|
<<-42.129002,-672.534180,48.527149>>, <<-35.514149,-688.064148,52.214169>>, 1.750000)
|
|
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) < 4)
|
|
b_already_checked_enemy_trigger = TRUE
|
|
ENDIF
|
|
|
|
IF b_time_to_trigger_enemies
|
|
IF i = 0
|
|
v_pos = <<-44.7908, -684.3557, 48.4740>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_pillars[i].ped, v_pos, 2.0)
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_pillars[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ELIF i = 1
|
|
v_pos = <<-58.5649, -691.1188, 48.5495>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_pillars[i].ped, s_cops_pillars[i].cover, v_pos, 326.8453, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_pillars[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_pillars[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
|
|
SET_PED_COMBAT_PARAMS(s_cops_pillars[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_pillars[i].ped, 150.0)
|
|
//s_cops_pillars[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_pillars[i].ped, TRUE)
|
|
s_cops_pillars[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF s_cops_pillars[i].i_event = 1
|
|
UPDATE_AI_PED_BLIP(s_cops_pillars[i].ped, s_cops_pillars[i].s_blip_data)
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_pillars[i].ped)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_pillars[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
//Cop comes up the stairs at the end of the pillars.
|
|
IF NOT s_cops_pillars_end[0].b_is_created
|
|
IF s_cops_start[0].i_event > 0
|
|
AND e_mission_stage > STAGE_LEAVE_BANK
|
|
IF HAS_MODEL_LOADED(model_cop)
|
|
s_cops_pillars_end[0].ped = CREATE_ENEMY_PED(model_cop, <<-75.6078, -702.7124, 45.6410>>, 241.7591, rel_group_neutral, 200, 0, WEAPONTYPE_PUMPSHOTGUN)
|
|
SET_PED_CONFIG_FLAG(s_cops_pillars_end[0].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_pillars_end, "PillEnd ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
BOOL b_time_to_trigger = FALSE
|
|
|
|
REPEAT COUNT_OF(s_cops_pillars_end) i
|
|
IF DOES_ENTITY_EXIST(s_cops_pillars_end[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_pillars_end[i].ped)
|
|
SWITCH s_cops_pillars_end[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_pillars_end[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_pillars_end[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_pillars_end[i].ped, 200.0)
|
|
|
|
s_cops_pillars_end[i].i_event = 100
|
|
ELSE
|
|
b_time_to_trigger = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, NULL,
|
|
<<-56.933033,-697.963318,48.473969>>, <<-64.046089,-683.155457,51.723969>>, 1.750000)
|
|
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) = 0)
|
|
|
|
IF b_time_to_trigger
|
|
v_pos = <<-65.5606, -694.5168, 48.4740>>
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_pillars_end[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars_end[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars_end[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_pillars_end[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_AI(s_cops_pillars_end[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, v_pos, 2.0)
|
|
SEQ_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(s_cops_pillars_end[i].ped, v_pos, PEDMOVE_RUN, v_zero, PLAYER_PED_ID(), TRUE)
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_pillars_end[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
|
|
//s_cops_pillars_end[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_pillars_end[i].ped, TRUE)
|
|
s_cops_pillars_end[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
UPDATE_AI_PED_BLIP(s_cops_pillars_end[i].ped, s_cops_pillars_end[i].s_blip_data)
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_pillars_end[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Cops appear above the other side of the bridge
|
|
IF NOT s_cops_heli_bridge[0].b_is_created
|
|
IF s_cops_pillars_end[0].i_event > 0
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE, str_carrec)
|
|
REQUEST_MODEL(model_cop_heli)
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_MODEL_LOADED(model_cop_heli)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_HELI_BRIDGE, str_carrec)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-69.588188,-679.454834,56.489262>>, <<-67.637695,-678.490112,27.739422>>, 46.000000)
|
|
veh_cops_bridge_heli = CREATE_VEHICLE(model_cop_heli, <<-21.9836, -738.0031, 56.5109>>, 0.0)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
SET_VEHICLE_LIGHTS(veh_cops_bridge_heli, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_cops_bridge_heli, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_bridge_heli, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_bridge_heli, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(veh_cops_bridge_heli)
|
|
SET_VEHICLE_LIVERY(veh_cops_bridge_heli, 0)
|
|
SET_VEHICLE_STRONG(veh_cops_bridge_heli, TRUE)
|
|
SET_ENTITY_INVINCIBLE(veh_cops_bridge_heli, TRUE) //We need to control how and when this heli gets destroyed, so it doesn't block key routes when crashing.
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_bridge_heli, CARREC_COPS_HELI_BRIDGE, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_bridge_heli, 4000.0)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_bridge_heli, "BS_POLICE_HELI_01_group")
|
|
|
|
s_cops_heli_bridge[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_bridge_heli, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
s_cops_heli_bridge[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_bridge_heli, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
s_cops_heli_bridge[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_bridge_heli, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_heli_bridge, "HBridge ")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Look after the helicopter: keep track of when it is on the ground so the peds can get out at the right time.
|
|
BOOL b_heli_stopped = FALSE
|
|
FLOAT f_playback_time = 0.0
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_bridge_heli)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
|
|
f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_bridge_heli)
|
|
|
|
IF f_playback_time > 15000.0
|
|
IF f_playback_time < 18000.0
|
|
CONVERGE_VALUE(f_bridge_heli_playback_speed, 0.25, 0.02)
|
|
b_heli_stopped = TRUE
|
|
ELSE
|
|
CONVERGE_VALUE(f_bridge_heli_playback_speed, 1.0, 0.02)
|
|
ENDIF
|
|
ELSE
|
|
IF f_playback_time < 10000.0
|
|
f_bridge_heli_playback_speed = 0.85
|
|
ELSE
|
|
f_bridge_heli_playback_speed = 1.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(veh_cops_bridge_heli, f_bridge_heli_playback_speed)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_bridge_heli)
|
|
//Spin the chopper out if shot enough.
|
|
IF s_cops_heli_bridge[0].i_event != 100
|
|
IF IS_PED_INJURED(s_cops_heli_bridge[0].ped)
|
|
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
|
|
OR f_playback_time > 6000.0
|
|
IF IS_PED_INJURED(s_cops_heli_bridge[0].ped)
|
|
OR GET_ENTITY_HEALTH(veh_cops_bridge_heli) < 900
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_bridge_heli) < 700
|
|
OR GET_VEHICLE_ENGINE_HEALTH(veh_cops_bridge_heli) < 700
|
|
OR IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_bridge_heli, <<0.0, 5.0, -5.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_bridge_heli, <<0.0, -5.0, 5.0>>), 8.0)
|
|
SET_ENTITY_HEALTH(veh_cops_bridge_heli, 1000)
|
|
|
|
IF NOT IS_PED_INJURED(s_cops_heli_bridge[0].ped)
|
|
SET_ENTITY_HEALTH(s_cops_heli_bridge[0].ped, 0)
|
|
ENDIF
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_bridge_heli)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_bridge_heli, -200.0)
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_bridge_heli)
|
|
|
|
s_cops_heli_bridge[0].i_timer = GET_GAME_TIMER()
|
|
s_cops_heli_bridge[0].i_event = 100
|
|
ENDIF
|
|
ELSE
|
|
SET_ENTITY_HEALTH(veh_cops_bridge_heli, 1000)
|
|
ENDIF
|
|
ELSE
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_bridge_heli, -200.0)
|
|
|
|
IF GET_GAME_TIMER() - s_cops_heli_bridge[0].i_timer > 3000
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_bridge_heli)
|
|
SET_ENTITY_INVINCIBLE(veh_cops_bridge_heli, FALSE)
|
|
SET_ENTITY_PROOFS(veh_cops_bridge_heli, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_bridge_heli)
|
|
REMOVE_VEHICLE(veh_cops_bridge_heli)
|
|
s_cops_heli_bridge[0].i_event++
|
|
ELSE
|
|
APPLY_FORCE_TO_ENTITY(veh_cops_bridge_heli, APPLY_TYPE_FORCE, <<-10.0, -10.0, 7.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF DOES_ENTITY_EXIST(veh_cops_bridge_heli)
|
|
REMOVE_VEHICLE(veh_cops_bridge_heli)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_cops_heli_bridge) i
|
|
IF DOES_ENTITY_EXIST(s_cops_heli_bridge[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_heli_bridge[i].ped)
|
|
SWITCH s_cops_heli_bridge[i].i_event
|
|
CASE 0
|
|
IF i != 0
|
|
IF b_heli_stopped
|
|
IF i = 1
|
|
v_pos = <<-131.4572, -668.1079, 47.2191>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_heli_bridge[i].ped, s_cops_heli_bridge[i].cover, v_pos, -110.0, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_180)
|
|
ELIF i = 2
|
|
v_pos = <<-132.3714, -670.7834, 47.2191>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_heli_bridge[i].ped, s_cops_heli_bridge[i].cover, v_pos, -110.0, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_180)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_AI(s_cops_heli_bridge[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_USE_COVER, v_pos, 2.0)
|
|
SET_COMBAT_FLOAT(s_cops_heli_bridge[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
|
|
SET_COMBAT_FLOAT(s_cops_heli_bridge[i].ped, CCF_BURST_DURATION_IN_COVER, 5.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_heli_bridge[i].ped, CA_USE_COVER, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_cops_heli_bridge[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
|
|
//SET_COMBAT_FLOAT(s_cops_heli_bridge[i].ped, CCF_TIME_BETWEEN_PEEKS, 0.05)
|
|
|
|
SET_PED_SEEING_RANGE(s_cops_heli_bridge[i].ped, 150.0)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_LEAVE_ANY_VEHICLE(NULL, i * 50, ECF_DONT_CLOSE_DOOR)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_pos, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.5, 0.5, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_cops_heli_bridge[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
//s_cops_heli_bridge[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_heli_bridge[i].ped, TRUE)
|
|
s_cops_heli_bridge[i].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 3000)
|
|
s_cops_heli_bridge[i].i_event++
|
|
ENDIF
|
|
|
|
//If the pilot died before they got out then kill them.
|
|
IF IS_PED_INJURED(s_cops_heli_bridge[0].ped)
|
|
SET_ENTITY_HEALTH(s_cops_heli_bridge[i].ped, 0)
|
|
ENDIF
|
|
ELSE
|
|
//Once the heli gets out of view delete the driver and the heli.
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_bridge_heli)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
|
|
IF IS_ENTITY_OCCLUDED(veh_cops_bridge_heli)
|
|
REMOVE_PED(s_cops_heli_bridge[i].ped, TRUE)
|
|
REMOVE_VEHICLE(veh_cops_bridge_heli, TRUE)
|
|
ELSE
|
|
TASK_HELI_MISSION(s_cops_heli_bridge[i].ped, veh_cops_bridge_heli, NULL, NULL, <<685.2, 984.9, 316.0>>, MISSION_GOTO, 30.0, 10.0, -26.0, 200, 50)
|
|
SET_PED_KEEP_TASK(s_cops_heli_bridge[i].ped, TRUE)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_bridge_heli)
|
|
|
|
CLEAN_UP_ENEMY_PED(s_cops_heli_bridge[i])
|
|
REMOVE_VEHICLE(veh_cops_bridge_heli)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE, str_carrec)
|
|
|
|
s_cops_heli_bridge[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Remove blips if the player runs on and ignores them
|
|
//Manually handle cover times.
|
|
/*IF GET_GAME_TIMER() - s_cops_heli_bridge[i].i_timer < 10000
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_heli_bridge[i].ped, CA_USE_COVER, FALSE)
|
|
ELSE
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_heli_bridge[i].ped, CA_USE_COVER, TRUE)
|
|
|
|
IF GET_GAME_TIMER() - s_cops_heli_bridge[i].i_timer > 12000
|
|
s_cops_heli_bridge[i].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 3000)
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF s_cops_after_bridge[0].i_event > 0
|
|
s_cops_heli_bridge[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Delete them once the player goes up to the courtyard section.
|
|
IF s_cops_courtyard_1[0].i_event > 0
|
|
v_pos = GET_ENTITY_COORDS(s_cops_heli_bridge[i].ped, FALSE)
|
|
|
|
CLEAN_UP_ENEMY_PED(s_cops_heli_bridge[i])
|
|
|
|
CLEAR_AREA_OF_PEDS(v_pos, 2.0)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_heli_bridge[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF NOT s_cops_bridge_start[0].b_is_created
|
|
IF e_mission_stage > STAGE_LEAVE_BANK
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
//These cops are created straight away.
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_start[0].ped)
|
|
s_cops_bridge_start[0].ped = CREATE_ENEMY_PED(model_swat, <<-97.7897, -683.5250, 39.5162>>, 257.1212, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge_start[0].ped, PCF_DontBlipCop, TRUE)
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_start[1].ped)
|
|
s_cops_bridge_start[1].ped = CREATE_ENEMY_PED(model_swat, <<-104.3132, -685.7965, 39.5162>>, 258.7648, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge_start[1].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_bridge_start, "BridStart ")
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_bridge_start) i
|
|
IF DOES_ENTITY_EXIST(s_cops_bridge_start[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_bridge_start[i].ped)
|
|
SWITCH s_cops_bridge_start[i].i_event
|
|
CASE 0 //Put them into combat immediately (the player can potentially see these peds from far away).
|
|
IF i = 0
|
|
s_cops_bridge_start[i].v_dest = <<-97.7897, -683.5250, 39.5162>>
|
|
ELIF i = 1
|
|
s_cops_bridge_start[i].v_dest = <<-104.3132, -685.7965, 39.5162>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge_start[i].ped, s_cops_bridge_start[i].v_dest, 2.0)
|
|
SET_PED_COMBAT_PARAMS(s_cops_bridge_start[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_start[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_start[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_start[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_start[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_start[i].ped, FALSE)
|
|
|
|
s_cops_bridge_start[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_bridge_start[i].i_event++
|
|
BREAK
|
|
|
|
CASE 1 //Once the player gets closer to them set them to charge.
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-89.297874,-686.501404,42.274471>>, <<6.750000,7.000000,4.750000>>)
|
|
OR b_player_got_to_bridge
|
|
SET_PED_COMBAT_PARAMS(s_cops_bridge_start[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_start[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_start[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_bridge_start[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
s_cops_bridge_start[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_bridge_start[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_cops_bridge_start[i].i_event > 0
|
|
UPDATE_AI_PED_BLIP(s_cops_bridge_start[i].ped, s_cops_bridge_start[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_bridge_start[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
IF NOT s_cops_bridge[0].b_is_created
|
|
IF e_mission_stage > STAGE_LEAVE_BANK
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_bridge[0].ped)
|
|
//Three potential trigger areas for these enemies, as the player could potentially walk around the bank or go down the stairs at the start.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-76.852043,-704.108032,45.154190>>, <<-75.870018,-701.383789,49.154129>>, 8.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-67.761673,-708.226929,42.242195>>, <<-70.335564,-715.258911,46.063213>>, 5.750000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.310922,-656.394409,38.490685>>, <<-9.158315,-654.127136,43.241711>>, 8.000000)
|
|
OR (IS_SELECTOR_CAM_ACTIVE() AND s_cops_pillars_end[0].b_is_created) //In case the player switches to Franklin before reaching the locates.
|
|
s_cops_bridge[0].ped = CREATE_ENEMY_PED(model_swat, <<-125.2105, -678.0999, 39.5162>>, 244.2533, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge[0].ped, PCF_DontBlipCop, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_bridge[1].ped)
|
|
s_cops_bridge[1].ped = CREATE_ENEMY_PED(model_swat, <<-118.8595, -676.0781, 39.5162>>, 249.4472, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_bridge[2].ped)
|
|
s_cops_bridge[2].ped = CREATE_ENEMY_PED(model_swat, <<-150.4314, -671.3599, 39.4888>>, 240.4354, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge[2].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_bridge[3].ped)
|
|
s_cops_bridge[3].ped = CREATE_ENEMY_PED(model_swat, <<-123.0884, -651.0028, 39.4888>>, 150.6339, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge[3].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
//Add a navmesh blocking area to prevent these guys from running down the side (we want them to run across the bridge).
|
|
IF i_bridge_navmesh_block = -1
|
|
i_bridge_navmesh_block = ADD_NAVMESH_BLOCKING_OBJECT(<<-121.6, -637.8, 39.2>>, <<3.0, 3.0, 5.0>>, DEG_TO_RAD(69.6))
|
|
ENDIF
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_bridge, "Bridge ")
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
BOOL b_checked_first_wave_trigger = FALSE
|
|
BOOL b_checked_second_wave_trigger = FALSE
|
|
BOOL b_trigger_first_wave = FALSE
|
|
BOOL b_trigger_second_wave = FALSE
|
|
|
|
REPEAT COUNT_OF(s_cops_bridge) i
|
|
IF DOES_ENTITY_EXIST(s_cops_bridge[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_bridge[i].ped)
|
|
SWITCH s_cops_bridge[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_bridge[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge[i].ped, 200.0)
|
|
|
|
s_cops_bridge[i].i_event = 100
|
|
ELSE
|
|
IF i = 0
|
|
v_pos = <<-125.2105, -678.0999, 39.5162>>
|
|
ELIF i = 1
|
|
v_pos = <<-118.8595, -676.0781, 39.5162>>
|
|
ELIF i = 2
|
|
v_pos = <<-132.6517, -680.5043, 39.4888>>
|
|
ELIF i = 3
|
|
v_pos = <<-128.4617, -668.9617, 39.4888>>
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_bridge[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge[i].ped, v_pos, 2.0)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge[i].ped, FALSE)
|
|
|
|
s_cops_bridge[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_bridge[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Each set of enemies pushes forwards after certain events.
|
|
IF i = 0 OR i = 1
|
|
IF NOT b_checked_first_wave_trigger
|
|
b_trigger_first_wave = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-83.250252,-691.094421,38.231274>>, <<-129.437363,-674.255249,46.516178>>, 5.750000)
|
|
OR GET_GAME_TIMER() - s_cops_bridge[i].i_timer > 10000
|
|
b_checked_first_wave_trigger = TRUE
|
|
ENDIF
|
|
|
|
IF b_trigger_first_wave
|
|
IF i = 0
|
|
v_pos = <<-114.7722, -681.9135, 39.5162>>
|
|
ELIF i = 1
|
|
v_pos = <<-108.3075, -679.6312, 39.5162>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge[i].ped, v_pos, 2.0)
|
|
SET_PED_COMBAT_RANGE(s_cops_bridge[i].ped, CR_NEAR)
|
|
SET_COMBAT_FLOAT(s_cops_bridge[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
s_cops_bridge[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_bridge[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_checked_second_wave_trigger
|
|
b_trigger_second_wave = (IS_PED_INJURED(s_cops_bridge[0].ped) AND IS_PED_INJURED(s_cops_bridge[1].ped))
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-104.569275,-683.346069,36.266178>>, <<-129.437363,-674.255249,46.516178>>, 5.750000)
|
|
b_checked_second_wave_trigger = TRUE
|
|
ENDIF
|
|
|
|
IF b_trigger_second_wave
|
|
IF i = 2
|
|
v_pos = <<-125.2105, -678.0999, 39.5162>>
|
|
ELIF i = 3
|
|
v_pos = <<-118.8595, -676.0781, 39.5162>>
|
|
ENDIF
|
|
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge[i].ped, v_pos, 2.0)
|
|
SET_PED_COMBAT_RANGE(s_cops_bridge[i].ped, CR_NEAR)
|
|
SET_COMBAT_FLOAT(s_cops_bridge[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
s_cops_bridge[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_bridge[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Once the player reaches the bridge then set the peds to charge.
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-89.297874,-686.501404,42.274471>>, <<6.750000,7.000000,4.750000>>)
|
|
OR b_player_got_to_bridge
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
s_cops_bridge[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_bridge[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_cops_bridge[i].i_event > 0
|
|
UPDATE_AI_PED_BLIP(s_cops_bridge[i].ped, s_cops_bridge[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_bridge[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Two cops flank on the side, they don't have to be killed.
|
|
IF NOT s_cops_bridge_flank[0].b_is_created
|
|
IF HAS_MODEL_LOADED(model_cop)
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_flank[0].ped)
|
|
IF s_cops_under_bridge[0].b_is_created
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-85.121323,-684.696716,41.481277>>, <<-88.585175,-694.255127,45.231049>>, 12.250000)
|
|
s_cops_bridge_flank[0].ped = CREATE_ENEMY_PED(model_cop, <<-50.8090, -676.5306, 39.7281>>, 113.7806, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_bridge_flank[1].ped)
|
|
s_cops_bridge_flank[1].ped = CREATE_ENEMY_PED(model_cop, <<-50.1772, -677.9645, 39.7281>>, 113.7806, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_bridge_flank, "Flank ")
|
|
|
|
REPEAT COUNT_OF(s_cops_bridge_flank) i
|
|
s_cops_bridge_flank[i].i_timer = GET_GAME_TIMER()
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_bridge_flank) i
|
|
IF DOES_ENTITY_EXIST(s_cops_bridge_flank[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_bridge_flank[i].ped)
|
|
SWITCH s_cops_bridge_flank[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_bridge_flank[i].ped, 1, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_flank[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_flank[i].ped, 200.0)
|
|
|
|
s_cops_bridge_flank[i].i_event = 100
|
|
ELSE
|
|
IF i = 0
|
|
OR (i = 1 AND GET_GAME_TIMER() - s_cops_bridge_flank[i].i_timer > 800)
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge_flank[i].ped, <<-55.7670, -660.6670, 39.7281>>, 5.0, TRUE)
|
|
ELIF i = 1
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_bridge_flank[i].ped, s_cops_bridge_flank[i].cover, <<-50.8090, -676.5306, 39.7281>>, 117.8575, 5.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_bridge_flank[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_flank[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_flank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_flank[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge_flank[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_bridge_flank[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_flank[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_flank[i].ped, FALSE)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_bridge_flank[i].ped, "SURROUNDED", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
s_cops_bridge_flank[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Clean up once the player gets far enough away.
|
|
IF s_cops_after_ramp_blockade[0].b_is_created
|
|
CLEAN_UP_ENEMY_PED(s_cops_bridge_flank[i])
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_bridge_flank[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Heli attacks the player.
|
|
IF NOT s_cops_heli_bridge_2[0].b_is_created
|
|
IF s_cops_bridge[0].b_is_created
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE_2, str_carrec)
|
|
REQUEST_MODEL(model_cop_heli)
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_MODEL_LOADED(model_cop_heli)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_HELI_BRIDGE_2, str_carrec)
|
|
IF NOT DOES_ENTITY_EXIST(veh_cops_heli_bridge_2)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-89.162170,-688.929138,36.935856>>, <<-129.603409,-674.280518,43.516178>>, 7.250000)
|
|
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0 AND NOT IS_POINT_VISIBLE(<<-27.3128, -736.0812, 56.3044>>, 5.0))
|
|
veh_cops_heli_bridge_2 = CREATE_VEHICLE(model_cop_heli, <<-27.3128, -736.0812, 56.3044>>, 0.0)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
SET_VEHICLE_LIGHTS(veh_cops_heli_bridge_2, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_LIVERY(veh_cops_heli_bridge_2, 0)
|
|
SET_VEHICLE_SIREN(veh_cops_heli_bridge_2, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_heli_bridge_2, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_heli_bridge_2, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(veh_cops_heli_bridge_2)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_bridge_2, CARREC_COPS_HELI_BRIDGE_2, str_carrec)
|
|
SET_VEHICLE_STRONG(veh_cops_heli_bridge_2, TRUE)
|
|
SET_ENTITY_INVINCIBLE(veh_cops_heli_bridge_2, TRUE)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_bridge_2, 4000.0)
|
|
f_heli_bridge_2_playback_speed = 1.0
|
|
i_time_bridge_heli_blew_up = 0
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_heli_bridge_2[0].ped)
|
|
s_cops_heli_bridge_2[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_bridge_2, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_PISTOL)
|
|
SET_PED_CONFIG_FLAG(s_cops_heli_bridge_2[0].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_heli_bridge_2[1].ped)
|
|
s_cops_heli_bridge_2[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_bridge_2, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_COMBATMG)
|
|
SET_PED_CONFIG_FLAG(s_cops_heli_bridge_2[1].ped, PCF_DontBlipCop, TRUE)
|
|
//s_cops_heli_bridge_2[1].blip = CREATE_BLIP_FOR_PED(s_cops_heli_bridge_2[1].ped, TRUE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_heli_bridge_2, "Heli 2 ")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Handle the chopper
|
|
HOVER_HELI_USING_RECORDING(veh_cops_heli_bridge_2, f_heli_bridge_2_playback_speed, 13000.0, 26000.0)
|
|
|
|
REPEAT COUNT_OF(s_cops_heli_bridge_2) i
|
|
IF DOES_ENTITY_EXIST(s_cops_heli_bridge_2[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[i].ped)
|
|
SWITCH s_cops_heli_bridge_2[i].i_event
|
|
CASE 0
|
|
IF i != 0
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_bridge_2)
|
|
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_bridge_2)
|
|
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_heli_bridge_2) > 8500.0
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_heli_bridge_2[i].ped, rel_group_cops)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_heli_bridge_2[i].ped, TRUE)
|
|
|
|
IF i = 1
|
|
SET_PED_COMBAT_PARAMS(s_cops_heli_bridge_2[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SHOOT_RATE(s_cops_heli_bridge_2[i].ped, 100)
|
|
TASK_DRIVE_BY(s_cops_heli_bridge_2[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, FALSE, FIRING_PATTERN_FULL_AUTO)
|
|
SET_PED_CAN_BE_TARGETTED(s_cops_heli_bridge_2[i].ped, TRUE)
|
|
SET_ENTITY_IS_TARGET_PRIORITY(s_cops_heli_bridge_2[i].ped, TRUE)
|
|
//GIVE_WEAPON_COMPONENT_TO_PED(s_cops_heli_bridge_2[i].ped, WEAPONTYPE_COMBATMG, WEAPONCOMPONENT_AT_AR_LASR)
|
|
ENDIF
|
|
|
|
s_cops_heli_bridge_2[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_heli_bridge_2[i].i_timer = 0
|
|
s_cops_heli_bridge_2[i].i_event = 100
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF i != 0
|
|
UPDATE_AI_PED_BLIP(s_cops_heli_bridge_2[i].ped, s_cops_heli_bridge_2[i].s_blip_data)
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_heli_bridge_2[i].ped)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_heli_bridge_2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//If the chopper was blown up then the player says a line.
|
|
IF NOT b_has_text_label_triggered[BS2B_DOWN1]
|
|
IF i_time_bridge_heli_blew_up != 0
|
|
AND GET_GAME_TIMER() - i_time_bridge_heli_blew_up < 3000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNF", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_DOWN1] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNM", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_DOWN1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle the chopper behaviour
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_heli_bridge_2)
|
|
//If the gunner is injured, the chopper flies off.
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_bridge_2)
|
|
IF IS_PED_INJURED(s_cops_heli_bridge_2[1].ped)
|
|
IF s_cops_heli_bridge_2[0].i_timer = 0
|
|
s_cops_heli_bridge_2[0].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_cops_heli_bridge_2[0].i_timer > 1400
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_bridge_2)
|
|
|
|
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[0].ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_HELI_MISSION(NULL, veh_cops_heli_bridge_2, NULL, NULL, <<29.1, -282.1, 55.0>>, MISSION_GOTO, 30.0, 10.0, -20.0, 55, 10)
|
|
TASK_HELI_MISSION(NULL, veh_cops_heli_bridge_2, NULL, NULL, <<685.2, 984.9, 66.0>>, MISSION_GOTO, 30.0, 10.0, -26.0, 50, 20)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_cops_heli_bridge_2[0].ped, seq)
|
|
SET_PED_KEEP_TASK(s_cops_heli_bridge_2[0].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Cleanup if the chopper flies off.
|
|
IF VDIST2(GET_ENTITY_COORDS(veh_cops_heli_bridge_2), v_player_pos) > 90000.0
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_bridge_2)
|
|
REMOVE_VEHICLE(veh_cops_heli_bridge_2)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Spin the chopper out if shot enough.
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_heli_bridge_2)
|
|
IF s_cops_heli_bridge_2[0].i_event = 100
|
|
IF IS_PED_INJURED(s_cops_heli_bridge_2[0].ped)
|
|
OR GET_ENTITY_HEALTH(veh_cops_heli_bridge_2) < 700
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_bridge_2) < 700
|
|
OR GET_VEHICLE_ENGINE_HEALTH(veh_cops_heli_bridge_2) < 700
|
|
OR IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_heli_bridge_2, <<0.0, 5.0, -5.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_heli_bridge_2, <<0.0, -5.0, 5.0>>), 8.0)
|
|
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[0].ped)
|
|
SET_ENTITY_HEALTH(s_cops_heli_bridge_2[0].ped, 0)
|
|
ENDIF
|
|
|
|
SET_ENTITY_HEALTH(veh_cops_heli_bridge_2, 1000)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_bridge_2)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_bridge_2)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_bridge_2, -200.0)
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.5)
|
|
|
|
i_time_bridge_heli_blew_up = GET_GAME_TIMER()
|
|
s_cops_heli_bridge_2[0].i_timer = GET_GAME_TIMER()
|
|
s_cops_heli_bridge_2[0].i_event++
|
|
ENDIF
|
|
ELIF s_cops_heli_bridge_2[0].i_event = 101
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_bridge_2, -200.0)
|
|
|
|
IF GET_GAME_TIMER() - s_cops_heli_bridge_2[0].i_timer < 2000
|
|
APPLY_FORCE_TO_ENTITY(veh_cops_heli_bridge_2, APPLY_TYPE_FORCE, <<5.0, 20.0, 5.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
APPLY_FORCE_TO_ENTITY(veh_cops_heli_bridge_2, APPLY_TYPE_FORCE, <<4.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
ELSE
|
|
SET_ENTITY_INVINCIBLE(veh_cops_heli_bridge_2, FALSE)
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_heli_bridge_2)
|
|
s_cops_heli_bridge_2[0].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF DOES_ENTITY_EXIST(veh_cops_heli_bridge_2)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_bridge_2)
|
|
REMOVE_VEHICLE(veh_cops_heli_bridge_2)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//Cop cars on either side of the bridge
|
|
IF NOT s_cops_under_bridge[COUNT_OF(s_cops_under_bridge) - 1].b_is_created
|
|
IF e_mission_stage > STAGE_LEAVE_BANK
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_1, str_carrec)
|
|
//REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_2, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_3, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_4, str_carrec)
|
|
//REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_5, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_6, str_carrec)
|
|
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(model_cop)
|
|
AND HAS_MODEL_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_1, str_carrec)
|
|
//AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_2, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_3, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_4, str_carrec)
|
|
//AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_5, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BRIDGE_6, str_carrec)
|
|
//Once the first cop is created there's no need to check the locates any more.
|
|
BOOL b_safe_to_create
|
|
BOOL b_create_car_straight_away = TRUE
|
|
|
|
IF s_cops_under_bridge[0].b_is_created
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.310922,-656.394409,38.490685>>, <<-9.158315,-654.127136,43.241711>>, 8.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-91.535706,-692.756287,40.349461>>, <<-79.282700,-697.252563,52.476322>>, 19.500000)
|
|
OR (s_cops_pillars_end[0].i_event > 0 AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-80.311104,-701.220520,43.460842>>, <<-78.256950,-701.993347,46.785755>>, 3.250000))
|
|
b_safe_to_create = TRUE
|
|
ENDIF
|
|
|
|
IF b_safe_to_create
|
|
OR b_create_car_straight_away
|
|
//Create vehicles: only create one per frame.
|
|
REPEAT COUNT_OF(veh_bridge_cops) i
|
|
IF b_safe_to_create
|
|
OR (b_create_car_straight_away AND i = 3)
|
|
IF NOT b_created_vehicle_this_frame
|
|
AND NOT DOES_ENTITY_EXIST(veh_bridge_cops[i])
|
|
SWITCH i
|
|
CASE 0
|
|
veh_bridge_cops[i] = CREATE_VEHICLE(model_cop_car, <<-174.2081, -649.0671, 31.9570>>, 0.0)
|
|
BREAK
|
|
|
|
CASE 1
|
|
veh_bridge_cops[i] = CREATE_VEHICLE(model_cop_car, <<-28.9355, -549.4929, 39.2717>>, 0.0)
|
|
BREAK
|
|
|
|
CASE 2
|
|
veh_bridge_cops[i] = CREATE_VEHICLE(model_cop_car, <<-233.6112, -716.5612, 33.2955>>, 0.0)
|
|
BREAK
|
|
|
|
CASE 3
|
|
veh_bridge_cops[i] = CREATE_VEHICLE(model_cop_car, <<-78.5712, -676.5475, 34.3735>>, 0.0)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_bridge_cops[i], TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(veh_bridge_cops[i], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_bridge_cops[i], TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_bridge_cops[i], TRUE)
|
|
|
|
|
|
b_created_vehicle_this_frame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Create peds inside the vehicles (only create one per frame).
|
|
IF b_safe_to_create
|
|
REPEAT COUNT_OF(s_cops_under_bridge) i
|
|
INT i_carrec = 0
|
|
FLOAT f_playback_speed = 1.0
|
|
INT i_car_index = 0
|
|
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
|
|
|
|
IF NOT b_created_ped_this_frame
|
|
AND NOT s_cops_under_bridge[i].b_is_created
|
|
SWITCH i
|
|
CASE 0
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_DRIVER
|
|
|
|
i_carrec = CARREC_COPS_BRIDGE_1
|
|
f_playback_speed = 0.8
|
|
BREAK
|
|
|
|
CASE 1
|
|
i_car_index = 1
|
|
e_vehicle_seat = VS_DRIVER
|
|
|
|
i_carrec = CARREC_COPS_BRIDGE_3
|
|
f_playback_speed = 0.8
|
|
BREAK
|
|
|
|
CASE 2
|
|
i_car_index = 2
|
|
e_vehicle_seat = VS_DRIVER
|
|
|
|
i_carrec = CARREC_COPS_BRIDGE_4
|
|
f_playback_speed = 0.95
|
|
BREAK
|
|
|
|
CASE 3
|
|
i_car_index = 3
|
|
e_vehicle_seat = VS_DRIVER
|
|
|
|
i_carrec = CARREC_COPS_BRIDGE_6
|
|
f_playback_speed = 0.8
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_bridge_cops[i_car_index])
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_bridge_cops[i_car_index])
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_bridge_cops[i_car_index], i_carrec, str_carrec)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_bridge_cops[i_car_index])
|
|
SET_PLAYBACK_SPEED(veh_bridge_cops[i_car_index], f_playback_speed)
|
|
ENDIF
|
|
|
|
s_cops_under_bridge[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_bridge_cops[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
|
|
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
|
|
SET_PED_INTO_VEHICLE(s_cops_under_bridge[i].ped, veh_bridge_cops[i_car_index], e_vehicle_seat)
|
|
INITIALISE_ENEMY_PED(s_cops_under_bridge[i], "Blockade ", i)
|
|
b_created_ped_this_frame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_under_bridge) i
|
|
IF DOES_ENTITY_EXIST(s_cops_under_bridge[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_under_bridge[i].ped)
|
|
SWITCH s_cops_under_bridge[i].i_event
|
|
CASE 0 //Wait for the car to stop.
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_under_bridge[i].ped)
|
|
VEHICLE_INDEX veh
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_under_bridge[i].ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_SPEED(veh) < 0.5
|
|
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
|
|
s_cops_under_bridge[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_under_bridge[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_under_bridge[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_under_bridge[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_under_bridge[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_under_bridge[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Get out and fight.
|
|
SET_PED_COMBAT_PARAMS(s_cops_under_bridge[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SEEING_RANGE(s_cops_under_bridge[i].ped, 150.0)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_under_bridge[i].ped, GET_ENTITY_COORDS(s_cops_under_bridge[i].ped) - <<0.0, 0.0, 1.0>>, 7.0, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_under_bridge[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_under_bridge[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_under_bridge[i].ped, CA_WILL_DRAG_INJURED_PEDS_TO_SAFETY, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_under_bridge[i].ped, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_under_bridge[i].ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
|
|
SET_COMBAT_FLOAT(s_cops_under_bridge[i].ped, CCF_MAX_SHOOTING_DISTANCE, 300.0)
|
|
SET_PED_ALERTNESS(s_cops_under_bridge[i].ped, AS_MUST_GO_TO_COMBAT)
|
|
SET_PED_CONFIG_FLAG(s_cops_under_bridge[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
|
|
SET_PED_DIES_WHEN_INJURED(s_cops_under_bridge[i].ped, FALSE) //Normally this is TRUE, but we want these guys to get dragged around.
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_under_bridge[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_under_bridge[i].ped, FALSE)
|
|
SET_PED_KEEP_TASK(s_cops_under_bridge[i].ped, TRUE)
|
|
|
|
s_cops_under_bridge[i].i_event++
|
|
BREAK
|
|
|
|
CASE 2 //Once the player is far enough away from these cops clean them up.
|
|
IF s_cops_after_ramp_blockade[0].i_event > 0
|
|
OR (s_cops_after_ramp_blockade[0].b_is_created AND IS_PED_INJURED(s_cops_after_ramp_blockade[0].ped))
|
|
CLEAN_UP_ENEMY_PED(s_cops_under_bridge[i])
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_under_bridge[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
|
|
REPEAT COUNT_OF(veh_bridge_cops) i
|
|
//DO_VEHICLE_DAMAGE_WHEN_SHOT(veh_bridge_cops[i])
|
|
|
|
IF s_cops_after_ramp_blockade[0].i_event > 0
|
|
OR (s_cops_after_ramp_blockade[0].b_is_created AND IS_PED_INJURED(s_cops_after_ramp_blockade[0].ped))
|
|
REMOVE_VEHICLE(veh_bridge_cops[i])
|
|
ENDIF
|
|
|
|
//Blow up one of the cars if the player shoots it
|
|
IF i = 4
|
|
IF IS_VEHICLE_DRIVEABLE(veh_bridge_cops[i])
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(veh_bridge_cops[i], PLAYER_PED_ID())
|
|
IF GET_ENTITY_HEALTH(veh_bridge_cops[i]) < 800
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_bridge_cops[i]) < 800
|
|
OR GET_VEHICLE_ENGINE_HEALTH(veh_bridge_cops[i]) < 800
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_bridge_cops[i], -100)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//More cops arrive as the player crosses the bridge.
|
|
IF NOT s_cops_bridge_2[0].b_is_created
|
|
IF e_mission_stage > STAGE_LEAVE_BANK
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_2[0].ped)
|
|
IF ARE_PEDS_AT_COORD(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, <<-116.736267,-678.848328,40.266178>>,<<12.500000,15.750000,6.250000>>)
|
|
s_cops_bridge_2[0].ped = CREATE_ENEMY_PED(model_swat, <<-127.3615, -654.2029, 41.8522>>, 340.3756, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge_2[0].ped, PCF_DontBlipCop, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_bridge_2[1].ped)
|
|
s_cops_bridge_2[1].ped = CREATE_ENEMY_PED(model_swat, <<-127.9446, -655.8145, 42.0630>>, 340.6406, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge_2[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_bridge_2[2].ped)
|
|
s_cops_bridge_2[2].ped = CREATE_ENEMY_PED(model_swat, <<-128.5191, -657.4022, 42.9372>>, 340.6406, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_bridge_2[2].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_bridge_2, "Bridge 2 ")
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_bridge_2) i
|
|
IF DOES_ENTITY_EXIST(s_cops_bridge_2[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_bridge_2[i].ped)
|
|
SWITCH s_cops_bridge_2[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_bridge_2[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_2[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_2[i].ped, 200.0)
|
|
|
|
s_cops_bridge_2[i].i_event = 100
|
|
ELSE
|
|
IF i = 0
|
|
v_pos = <<-131.4433, -676.8610, 39.4974>>
|
|
ELIF i = 1
|
|
v_pos = <<-129.3374, -671.1276, 39.5026>>
|
|
ELIF i = 2
|
|
v_pos = <<-126.9097, -664.9212, 39.5048>>
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_bridge_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_bridge_2[i].ped, v_pos, 2.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_2[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_bridge_2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_bridge_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_bridge_2[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_bridge_2[i].ped, FALSE)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_bridge_2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
s_cops_bridge_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_bridge_2[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_cops_bridge_2[i].i_event > 0
|
|
UPDATE_AI_PED_BLIP(s_cops_bridge_2[i].ped, s_cops_bridge_2[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_bridge_2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//Cops run up the ramp after crossing the bridge.
|
|
IF NOT s_cops_after_bridge[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_after_bridge[0].ped)
|
|
IF s_cops_heli_bridge_2[0].i_event > 0
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped,
|
|
<<-221.509293,-640.804016,71.972031>>, <<-124.449242,-676.107483,28.016178>>, 120.000000)
|
|
s_cops_after_bridge[0].ped = CREATE_ENEMY_PED(model_swat, <<-181.1778, -663.5786, 37.7780>>, 248.2368, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_after_bridge[0].ped, PCF_DontBlipCop, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_after_bridge[1].ped)
|
|
s_cops_after_bridge[1].ped = CREATE_ENEMY_PED(model_swat, <<-182.4772, -663.4427, 37.3071>>, 245.7573, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_after_bridge[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_after_bridge[2].ped)
|
|
s_cops_after_bridge[2].ped = CREATE_ENEMY_PED(model_swat, <<-211.9646, -650.1057, 39.4888>>, 246.6968, rel_group_neutral, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_after_bridge[2].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_after_bridge, "Ramp ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
BOOL b_time_to_trigger = FALSE
|
|
BOOL b_checked_trigger = FALSE
|
|
|
|
REPEAT COUNT_OF(s_cops_after_bridge) i
|
|
IF DOES_ENTITY_EXIST(s_cops_after_bridge[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_after_bridge[i].ped)
|
|
SWITCH s_cops_after_bridge[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_after_bridge[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_bridge[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_bridge[i].ped, 200.0)
|
|
|
|
s_cops_after_bridge[i].i_event = 100
|
|
ELSE
|
|
//Only run the angled area check once, as all the peds in this group are triggered off the same check.
|
|
IF NOT b_time_to_trigger
|
|
AND NOT b_checked_trigger
|
|
b_time_to_trigger = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy],
|
|
<<-221.509293,-640.804016,71.972031>>, <<-124.449242,-676.107483,28.016178>>, 120.000000)
|
|
b_checked_trigger = TRUE
|
|
ENDIF
|
|
|
|
IF b_time_to_trigger
|
|
IF i = 0
|
|
v_pos = <<-165.4060, -667.7348, 39.4761>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_after_bridge[i].ped, s_cops_after_bridge[i].cover, v_pos, 246.9576, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 1
|
|
v_pos = <<-167.0893, -663.7800, 39.4888>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_after_bridge[i].ped, s_cops_after_bridge[i].cover, v_pos, 247.3722, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
ELSE
|
|
v_pos = <<-173.4099, -663.5237, 39.4843>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_after_bridge[i].ped, v_pos, 2.0, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_after_bridge[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_PARAMS(s_cops_after_bridge[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_bridge[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_after_bridge[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_bridge[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_bridge[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_bridge[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_after_bridge[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
IF i = 1
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(s_cops_after_bridge[i].ped, TRUE)
|
|
ELIF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_after_bridge[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
s_cops_after_bridge[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Set to can charge once the buddies arrive (or the player gets close).
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF VDIST2(GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped), <<-150.2, -673.3, 40.0>>) < 25.0
|
|
OR VDIST2(v_player_pos, GET_ENTITY_COORDS(s_cops_after_bridge[i].ped)) < 25.0
|
|
//SET_PED_COMBAT_ATTRIBUTES(s_cops_after_bridge[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(s_cops_after_bridge[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
s_cops_after_bridge[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_cops_after_bridge[i].i_event > 0
|
|
UPDATE_AI_PED_BLIP(s_cops_after_bridge[i].ped, s_cops_after_bridge[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_after_bridge[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Another heli arrives after the bridge: tracks the crew until shot down.
|
|
IF NOT s_cops_heli_ramp[0].b_is_created
|
|
IF s_cops_after_bridge[0].b_is_created
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_HELI_RAMP, str_carrec)
|
|
REQUEST_MODEL(model_cop_heli)
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_MODEL_LOADED(model_cop_heli)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_HELI_RAMP, str_carrec)
|
|
IF NOT DOES_ENTITY_EXIST(veh_cops_heli_ramp)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-151.240479,-672.489746,24.737293>>, <<-195.994110,-655.863098,80.738068>>, 119.250000)
|
|
OR (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0 AND NOT IS_POINT_VISIBLE(<<-126.5, -674.0, 546.8>>, 5.0))
|
|
veh_cops_heli_ramp = CREATE_VEHICLE(model_cop_heli, <<-27.3128, -736.0812, 56.3044>>, 0.0)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
SET_VEHICLE_LIGHTS(veh_cops_heli_ramp, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_LIVERY(veh_cops_heli_ramp, 0)
|
|
SET_VEHICLE_SIREN(veh_cops_heli_ramp, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_heli_ramp, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_heli_ramp, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(veh_cops_heli_ramp)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_ramp, CARREC_COPS_HELI_RAMP, str_carrec)
|
|
SET_VEHICLE_STRONG(veh_cops_heli_ramp, TRUE)
|
|
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, TRUE)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_ramp, 5000.0)
|
|
f_heli_ramp_playback_speed = 1.0
|
|
i_time_ramp_heli_blew_up = 0
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_heli_ramp[0].ped)
|
|
s_cops_heli_ramp[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_ramp, VS_DRIVER, rel_group_cops, 300, 0, WEAPONTYPE_PISTOL)
|
|
SET_PED_CONFIG_FLAG(s_cops_heli_ramp[0].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_heli_ramp[1].ped)
|
|
s_cops_heli_ramp[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_ramp, VS_BACK_RIGHT, rel_group_cops, 300, 0, WEAPONTYPE_COMBATMG)
|
|
SET_PED_CONFIG_FLAG(s_cops_heli_ramp[1].ped, PCF_DontBlipCop, TRUE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_cops_heli_ramp[1].ped, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_heli_ramp[2].ped)
|
|
s_cops_heli_ramp[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_heli_ramp, VS_BACK_LEFT, rel_group_cops, 300, 0, WEAPONTYPE_COMBATMG)
|
|
SET_PED_CONFIG_FLAG(s_cops_heli_ramp[2].ped, PCF_DontBlipCop, TRUE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_cops_heli_ramp[2].ped, TRUE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_heli_ramp, "Heli ramp ")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_heli_ramp) i
|
|
IF DOES_ENTITY_EXIST(s_cops_heli_ramp[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_heli_ramp[i].ped)
|
|
SWITCH s_cops_heli_ramp[i].i_event
|
|
CASE 0
|
|
IF i = 0
|
|
//Hover the recording until the player and crew progress closer to the stairs.
|
|
HOVER_HELI_USING_RECORDING(veh_cops_heli_ramp, f_heli_ramp_playback_speed, 16000.0, 24000.0)
|
|
|
|
IF ARE_PEDS_AT_COORD(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, <<-203.768814,-653.964172,38.738064>>,<<18.500000,8.750000,6.000000>>)
|
|
s_cops_heli_ramp[i].i_timer = 0
|
|
s_cops_heli_ramp[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
|
|
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_ramp)
|
|
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_heli_ramp) > 8500.0
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_heli_ramp[i].ped, rel_group_cops)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_heli_ramp[i].ped, TRUE)
|
|
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(veh_cops_heli_ramp, TRUE)
|
|
|
|
IF i = 1
|
|
SET_PED_COMBAT_PARAMS(s_cops_heli_ramp[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SHOOT_RATE(s_cops_heli_ramp[i].ped, 100)
|
|
TASK_DRIVE_BY(s_cops_heli_ramp[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, FALSE, FIRING_PATTERN_FULL_AUTO)
|
|
SET_PED_CAN_BE_TARGETTED(s_cops_heli_ramp[i].ped, TRUE)
|
|
SET_ENTITY_IS_TARGET_PRIORITY(s_cops_heli_ramp[i].ped, TRUE)
|
|
//GIVE_WEAPON_COMPONENT_TO_PED(s_cops_heli_ramp[i].ped, WEAPONTYPE_COMBATMG, WEAPONCOMPONENT_AT_AR_LASR)
|
|
ENDIF
|
|
|
|
b_ramp_heli_is_active = TRUE
|
|
s_cops_heli_ramp[i].i_timer = 0
|
|
s_cops_heli_ramp[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF i = 0
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_ramp)
|
|
IF GET_TIME_POSITION_IN_RECORDING(veh_cops_heli_ramp) < 23500.0
|
|
CONVERGE_VALUE(f_heli_ramp_playback_speed, 1.5, 1.0, TRUE)
|
|
SET_PLAYBACK_SPEED(veh_cops_heli_ramp, f_heli_ramp_playback_speed)
|
|
ELSE
|
|
HOVER_HELI_USING_RECORDING(veh_cops_heli_ramp, f_heli_ramp_playback_speed, 33000.0, 38000.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF i = 2
|
|
IF IS_PED_INJURED(s_cops_heli_ramp[1].ped)
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
|
|
IF GET_PED_IN_VEHICLE_SEAT(veh_cops_heli_ramp, VS_BACK_RIGHT) != s_cops_heli_ramp[i].ped
|
|
IF IS_PED_IN_VEHICLE(s_cops_heli_ramp[i].ped, veh_cops_heli_ramp)
|
|
IF GET_SCRIPT_TASK_STATUS(s_cops_heli_ramp[i].ped, SCRIPT_TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT) != PERFORMING_TASK
|
|
TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT(s_cops_heli_ramp[i].ped, veh_cops_heli_ramp)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
s_cops_heli_ramp[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_heli_ramp[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF i = 2
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
|
|
IF GET_SCRIPT_TASK_STATUS(s_cops_heli_ramp[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
|
|
SET_PED_COMBAT_PARAMS(s_cops_heli_ramp[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SHOOT_RATE(s_cops_heli_ramp[i].ped, 100)
|
|
TASK_DRIVE_BY(s_cops_heli_ramp[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, FALSE, FIRING_PATTERN_FULL_AUTO)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF i != 0
|
|
AND s_cops_heli_ramp[i].i_event > 0
|
|
UPDATE_AI_PED_BLIP(s_cops_heli_ramp[i].ped, s_cops_heli_ramp[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_heli_ramp[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//If the chopper was blown up before the peds got out then the player says a line.
|
|
IF NOT b_has_text_label_triggered[BS2B_DOWN2]
|
|
IF i_time_ramp_heli_blew_up != 0
|
|
AND GET_GAME_TIMER() - i_time_ramp_heli_blew_up < 3000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DOWN2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DOWN2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle the chopper behaviour
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_heli_ramp)
|
|
//If the gunner is injured, the chopper flies off.
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_ramp)
|
|
IF IS_PED_INJURED(s_cops_heli_ramp[1].ped)
|
|
AND IS_PED_INJURED(s_cops_heli_ramp[2].ped)
|
|
IF s_cops_heli_ramp[0].i_timer = 0
|
|
s_cops_heli_ramp[0].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0, 500)
|
|
ELIF GET_GAME_TIMER() - s_cops_heli_ramp[0].i_timer > 2500
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_ramp)
|
|
|
|
IF NOT IS_PED_INJURED(s_cops_heli_ramp[0].ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_HELI_MISSION(NULL, veh_cops_heli_ramp, NULL, NULL, <<-712.7, -654.7, 50.1>>, MISSION_GOTO, 30.0, 10.0, -20.0, 15, 10)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_cops_heli_ramp[0].ped, seq)
|
|
SET_PED_KEEP_TASK(s_cops_heli_ramp[0].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Cleanup if the chopper flies off.
|
|
IF VDIST2(GET_ENTITY_COORDS(veh_cops_heli_ramp), v_player_pos) > 90000.0
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_ramp)
|
|
REMOVE_VEHICLE(veh_cops_heli_ramp)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Spin the chopper out if shot enough.
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_heli_ramp)
|
|
IF s_cops_heli_ramp[0].i_event < 100
|
|
BOOL b_hit_by_explosion = IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_heli_ramp, <<0.0, 5.0, -5.0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cops_heli_ramp, <<0.0, -5.0, 5.0>>), 8.0)
|
|
|
|
IF IS_PED_INJURED(s_cops_heli_ramp[0].ped)
|
|
OR GET_ENTITY_HEALTH(veh_cops_heli_ramp) < 600
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_ramp) < 600
|
|
OR GET_VEHICLE_ENGINE_HEALTH(veh_cops_heli_ramp) < 600
|
|
OR b_hit_by_explosion
|
|
IF NOT IS_PED_INJURED(s_cops_heli_ramp[0].ped)
|
|
SET_ENTITY_HEALTH(s_cops_heli_ramp[0].ped, 0)
|
|
ENDIF
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_ramp)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_heli_ramp)
|
|
ENDIF
|
|
|
|
IF b_hit_by_explosion
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_ramp, -300.0)
|
|
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, FALSE)
|
|
SET_ENTITY_HEALTH(veh_cops_heli_ramp, 0)
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_heli_ramp)
|
|
EXPLODE_VEHICLE(veh_cops_heli_ramp, TRUE)
|
|
s_cops_heli_ramp[0].i_event = 101
|
|
ELSE
|
|
SET_ENTITY_HEALTH(veh_cops_heli_ramp, 1000)
|
|
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, TRUE)
|
|
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_ramp, -200.0)
|
|
|
|
s_cops_heli_ramp[0].i_timer = GET_GAME_TIMER()
|
|
s_cops_heli_ramp[0].i_event = 100
|
|
ENDIF
|
|
|
|
//Record footage of the chopper blowing up.
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.5)
|
|
|
|
i_time_ramp_heli_blew_up = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF s_cops_heli_ramp[0].i_event = 100
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_heli_ramp, -200.0)
|
|
|
|
IF GET_GAME_TIMER() - s_cops_heli_ramp[0].i_timer < 1500
|
|
APPLY_FORCE_TO_ENTITY(veh_cops_heli_ramp, APPLY_TYPE_FORCE, <<-15.0, -8.0, 5.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
APPLY_FORCE_TO_ENTITY(veh_cops_heli_ramp, APPLY_TYPE_FORCE, <<4.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
ELSE
|
|
SET_ENTITY_INVINCIBLE(veh_cops_heli_ramp, FALSE)
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_heli_ramp)
|
|
s_cops_heli_ramp[0].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF DOES_ENTITY_EXIST(veh_cops_heli_ramp)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_ramp)
|
|
REMOVE_VEHICLE(veh_cops_heli_ramp)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Cops form a blockade ahead of the ramp.
|
|
IF NOT s_cops_after_ramp_blockade[COUNT_OF(s_cops_after_ramp_blockade) - 1].b_is_created
|
|
IF s_cops_after_bridge[0].b_is_created
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_1, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_2, str_carrec)
|
|
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(model_cop)
|
|
AND HAS_MODEL_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BLOCKADE_1, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BLOCKADE_2, str_carrec)
|
|
IF s_cops_after_ramp_blockade[0].b_is_created //Once the first cop is created there's no need to check the locates any more.
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-151.013657,-641.056641,62.759335>>, <<-182.292191,-724.088806,28.454020>>, 13.500000)
|
|
//Create vehicles: only create one per frame.
|
|
REPEAT COUNT_OF(veh_cops_after_ramp_blockade) i
|
|
INT i_carrec = 0
|
|
FLOAT f_playback_speed = 1.0
|
|
FLOAT f_playback_time = 0.0
|
|
|
|
IF NOT b_created_vehicle_this_frame
|
|
AND NOT DOES_ENTITY_EXIST(veh_cops_after_ramp_blockade[i])
|
|
SWITCH i
|
|
CASE 0
|
|
veh_cops_after_ramp_blockade[i] = CREATE_VEHICLE(model_cop_car, <<-174.2081, -649.0671, 31.9570>>, 0.0)
|
|
i_carrec = CARREC_COPS_BLOCKADE_1
|
|
f_playback_speed = 0.95
|
|
f_playback_time = 2000.0
|
|
BREAK
|
|
|
|
CASE 1
|
|
veh_cops_after_ramp_blockade[i] = CREATE_VEHICLE(model_cop_car, <<-176.1406, -641.4283, 32.1534>>, 0.0)
|
|
i_carrec = CARREC_COPS_BLOCKADE_2
|
|
f_playback_speed = 0.95
|
|
f_playback_time = 2000.0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_after_ramp_blockade[i], TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(veh_cops_after_ramp_blockade[i], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_cops_after_ramp_blockade[i], TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_after_ramp_blockade[i], TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_after_ramp_blockade[i], i_carrec, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_after_ramp_blockade[i], f_playback_time)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_after_ramp_blockade[i])
|
|
SET_PLAYBACK_SPEED(veh_cops_after_ramp_blockade[i], f_playback_speed)
|
|
|
|
b_created_vehicle_this_frame = TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Create peds inside the vehicles (only create one per frame).
|
|
REPEAT COUNT_OF(s_cops_after_ramp_blockade) i
|
|
INT i_car_index = 0
|
|
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
|
|
|
|
IF NOT b_created_ped_this_frame
|
|
AND NOT s_cops_after_ramp_blockade[i].b_is_created
|
|
SWITCH i
|
|
CASE 0
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_DRIVER
|
|
BREAK
|
|
|
|
CASE 1
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_FRONT_RIGHT
|
|
BREAK
|
|
|
|
CASE 2
|
|
i_car_index = 1
|
|
e_vehicle_seat = VS_DRIVER
|
|
BREAK
|
|
|
|
CASE 3
|
|
i_car_index = 1
|
|
e_vehicle_seat = VS_FRONT_RIGHT
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_after_ramp_blockade[i_car_index])
|
|
s_cops_after_ramp_blockade[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_cops_after_ramp_blockade[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
|
|
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
|
|
SET_PED_INTO_VEHICLE(s_cops_after_ramp_blockade[i].ped, veh_cops_after_ramp_blockade[i_car_index], e_vehicle_seat)
|
|
INITIALISE_ENEMY_PED(s_cops_after_ramp_blockade[i], "RampB ", i)
|
|
b_created_ped_this_frame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_after_ramp_blockade) i
|
|
IF DOES_ENTITY_EXIST(s_cops_after_ramp_blockade[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_after_ramp_blockade[i].ped)
|
|
SWITCH s_cops_after_ramp_blockade[i].i_event
|
|
CASE 0 //Wait for the car to stop.
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_after_ramp_blockade[i].ped)
|
|
VEHICLE_INDEX veh
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_after_ramp_blockade[i].ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_SPEED(veh) < 0.5
|
|
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
|
|
s_cops_after_ramp_blockade[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_after_ramp_blockade[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_after_ramp_blockade[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_after_ramp_blockade[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_after_ramp_blockade[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_after_ramp_blockade[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Get out and fight.
|
|
SET_PED_COMBAT_PARAMS(s_cops_after_ramp_blockade[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_after_ramp_blockade[i].ped, GET_ENTITY_COORDS(s_cops_after_ramp_blockade[i].ped) - <<0.0, 0.0, 1.0>>, 5.0, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_after_ramp_blockade[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_ramp_blockade[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_cops_after_ramp_blockade[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_ramp_blockade[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_ramp_blockade[i].ped, FALSE)
|
|
|
|
s_cops_after_ramp_blockade[i].i_event++
|
|
BREAK
|
|
|
|
CASE 2 //Once the player is far enough away from these cops clean them up.
|
|
IF s_cops_courtyard_2[0].i_event > 0
|
|
OR (s_cops_courtyard_2[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
|
|
CLEAN_UP_ENEMY_PED(s_cops_after_ramp_blockade[i])
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_after_ramp_blockade[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
|
|
REPEAT COUNT_OF(veh_cops_after_ramp_blockade) i
|
|
//DO_VEHICLE_DAMAGE_WHEN_SHOT(veh_cops_after_ramp_blockade[i])
|
|
|
|
IF s_cops_courtyard_2[0].i_event > 0
|
|
OR (s_cops_courtyard_2[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
|
|
REMOVE_VEHICLE(veh_cops_after_ramp_blockade[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//Second blockade arrives after the ramp.
|
|
IF NOT s_cops_after_ramp_blockade_2[COUNT_OF(s_cops_after_ramp_blockade_2) - 1].b_is_created
|
|
IF s_cops_after_bridge[0].b_is_created
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_3, str_carrec)
|
|
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(model_cop)
|
|
AND HAS_MODEL_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BLOCKADE_3, str_carrec)
|
|
IF s_cops_after_ramp_blockade_2[0].b_is_created //Once the first cop is created there's no need to check the locates any more.
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-172.374329,-594.539063,63.220547>>, <<-214.174149,-716.375549,31.956020>>, 13.500000)
|
|
//Create vehicles: only create one per frame.
|
|
REPEAT COUNT_OF(veh_cops_after_ramp_blockade_2) i
|
|
INT i_carrec = 0
|
|
FLOAT f_playback_speed = 1.0
|
|
FLOAT f_playback_start_time = 0.0
|
|
|
|
IF NOT b_created_vehicle_this_frame
|
|
AND NOT DOES_ENTITY_EXIST(veh_cops_after_ramp_blockade_2[i])
|
|
SWITCH i
|
|
CASE 0
|
|
veh_cops_after_ramp_blockade_2[i] = CREATE_VEHICLE(model_cop_car, <<-350.7944, -730.3459, 33.7211>>, -15.8839)
|
|
i_carrec = CARREC_COPS_BLOCKADE_3
|
|
f_playback_speed = 1.0
|
|
f_playback_start_time = 2000.0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_after_ramp_blockade_2[i], TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(veh_cops_after_ramp_blockade_2[i], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_cops_after_ramp_blockade_2[i], TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_after_ramp_blockade_2[i], TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_after_ramp_blockade_2[i], i_carrec, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_after_ramp_blockade_2[i], f_playback_start_time)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_after_ramp_blockade_2[i])
|
|
SET_PLAYBACK_SPEED(veh_cops_after_ramp_blockade_2[i], f_playback_speed)
|
|
|
|
b_created_vehicle_this_frame = TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Create peds inside the vehicles (only create one per frame).
|
|
REPEAT COUNT_OF(s_cops_after_ramp_blockade_2) i
|
|
INT i_car_index = 0
|
|
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
|
|
|
|
IF NOT b_created_ped_this_frame
|
|
AND NOT s_cops_after_ramp_blockade_2[i].b_is_created
|
|
SWITCH i
|
|
CASE 0
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_DRIVER
|
|
BREAK
|
|
|
|
CASE 1
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_FRONT_RIGHT
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_after_ramp_blockade_2[i_car_index])
|
|
s_cops_after_ramp_blockade_2[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_cops_after_ramp_blockade_2[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
|
|
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
|
|
SET_PED_INTO_VEHICLE(s_cops_after_ramp_blockade_2[i].ped, veh_cops_after_ramp_blockade_2[i_car_index], e_vehicle_seat)
|
|
INITIALISE_ENEMY_PED(s_cops_after_ramp_blockade_2[i], "RampC ", i)
|
|
b_created_ped_this_frame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_after_ramp_blockade_2) i
|
|
IF DOES_ENTITY_EXIST(s_cops_after_ramp_blockade_2[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_after_ramp_blockade_2[i].ped)
|
|
SWITCH s_cops_after_ramp_blockade_2[i].i_event
|
|
CASE 0 //Wait for the car to stop.
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_after_ramp_blockade_2[i].ped)
|
|
VEHICLE_INDEX veh
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_after_ramp_blockade_2[i].ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_SPEED(veh) < 0.5
|
|
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
|
|
s_cops_after_ramp_blockade_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_after_ramp_blockade_2[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_after_ramp_blockade_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_after_ramp_blockade_2[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_after_ramp_blockade_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_after_ramp_blockade_2[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Get out and fight.
|
|
SET_PED_COMBAT_PARAMS(s_cops_after_ramp_blockade_2[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_after_ramp_blockade_2[i].ped, GET_ENTITY_COORDS(s_cops_after_ramp_blockade_2[i].ped) - <<0.0, 0.0, 1.0>>, 10.0, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_after_ramp_blockade_2[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_ramp_blockade_2[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_cops_after_ramp_blockade_2[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_ramp_blockade_2[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_ramp_blockade_2[i].ped, FALSE)
|
|
|
|
s_cops_after_ramp_blockade_2[i].i_event++
|
|
BREAK
|
|
|
|
CASE 2 //Once the player is far enough away from these cops clean them up.
|
|
IF s_cops_courtyard_2[0].i_event > 0
|
|
OR (s_cops_courtyard_2[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
|
|
CLEAN_UP_ENEMY_PED(s_cops_after_ramp_blockade_2[i])
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_after_ramp_blockade_2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
|
|
REPEAT COUNT_OF(veh_cops_after_ramp_blockade_2) i
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_after_ramp_blockade_2[i])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_after_ramp_blockade_2[i])
|
|
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_after_ramp_blockade_2[i])
|
|
FLOAT f_playback_speed = 1.0
|
|
|
|
IF f_playback_time < 2000.0
|
|
f_playback_speed += (1.0 - ((f_playback_time / 3000.0) * 0.5))
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(veh_cops_after_ramp_blockade_2[i], f_playback_speed)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_cops_courtyard_2[0].i_event > 0
|
|
OR (s_cops_courtyard_2[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
|
|
REMOVE_VEHICLE(veh_cops_after_ramp_blockade_2[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Cops outside the business park building.
|
|
IF NOT s_cops_courtyard_1[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1[0].ped)
|
|
IF s_cops_after_bridge[0].i_event > 0
|
|
OR e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
IF ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped,
|
|
<<-199.341995,-652.362793,44.292439>>, <<-200.206345,-654.693542,47.222027>>, 2.000000)
|
|
OR e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
|
|
s_cops_courtyard_1[0].ped = CREATE_ENEMY_PED(model_swat, <<-162.2765, -580.2377, 47.2257>>, 165.3703, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_1[0].ped, PCF_DontBlipCop, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1[1].ped)
|
|
s_cops_courtyard_1[1].ped = CREATE_ENEMY_PED(model_swat, <<-165.0926, -603.0400, 47.2208>>, 182.7348, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_1[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1[2].ped)
|
|
s_cops_courtyard_1[2].ped = CREATE_ENEMY_PED(model_swat, <<-181.6499, -613.3109, 47.2185>>, 174.4213, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_1[2].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1[3].ped)
|
|
s_cops_courtyard_1[3].ped = CREATE_ENEMY_PED(model_swat, <<-201.5549, -579.9914, 47.2264>>, 158.9434, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_1[3].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_courtyard_1, "Plaza ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_courtyard_1) i
|
|
IF DOES_ENTITY_EXIST(s_cops_courtyard_1[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_courtyard_1[i].ped)
|
|
SWITCH s_cops_courtyard_1[i].i_event
|
|
CASE 0
|
|
IF i = 0
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_1[i].ped, s_cops_courtyard_1[i].cover, <<-174.4371, -598.7026, 47.2283>>,
|
|
159.6471, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 1
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_1[i].ped, s_cops_courtyard_1[i].cover, <<-165.0926, -603.0400, 47.2208>>,
|
|
182.7348, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 2
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_1[i].ped, s_cops_courtyard_1[i].cover, <<-179.0030, -627.6848, 47.9718>>,
|
|
147.9208, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
ELSE
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_courtyard_1[i].ped, <<-199.4786, -597.8848, 47.2195>>, 5.0)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_courtyard_1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_1[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_1[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_courtyard_1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_courtyard_1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
//s_cops_courtyard_1[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_courtyard_1[i].ped, TRUE)
|
|
s_cops_courtyard_1[i].i_event++
|
|
BREAK
|
|
|
|
CASE 1
|
|
UPDATE_AI_PED_BLIP(s_cops_courtyard_1[i].ped, s_cops_courtyard_1[i].s_blip_data)
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_courtyard_1[i].ped)
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_courtyard_1[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Second wave of enemies turn up
|
|
IF NOT s_cops_courtyard_1b[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1b[0].ped)
|
|
IF s_cops_courtyard_1[0].i_event > 0
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
IF ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped,
|
|
<<-199.341995,-652.362793,44.292439>>, <<-200.206345,-654.693542,47.222027>>, 2.000000)
|
|
OR e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
|
|
s_cops_courtyard_1b[0].ped = CREATE_ENEMY_PED(model_swat, <<-130.4501, -618.1221, 47.2228>>, 37.4470, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_1b[0].ped, PCF_DontBlipCop, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_1b[1].ped)
|
|
s_cops_courtyard_1b[1].ped = CREATE_ENEMY_PED(model_swat, <<-129.0058, -619.6517, 47.2241>>, 45.9230, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_1b[1].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_courtyard_1b, "PlazaB ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_courtyard_1b) i
|
|
IF DOES_ENTITY_EXIST(s_cops_courtyard_1b[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_courtyard_1b[i].ped)
|
|
SWITCH s_cops_courtyard_1b[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_courtyard_1b[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_1b[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_1b[i].ped, 200.0)
|
|
|
|
s_cops_courtyard_1b[i].i_event = 100
|
|
ELSE
|
|
IF (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1 AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1) <= 1)
|
|
OR ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped,
|
|
<<-218.940857,-624.044250,46.721035>>, <<-127.287636,-658.595459,133.219131>>, 2.500000)
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_courtyard_1b[i].ped, <<-155.6902, -613.2861, 47.5365>>, 2.0)
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_courtyard_1b[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ELIF i = 1
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_courtyard_1b[i].ped, <<-155.7195, -620.4007, 47.5010>>, 2.0)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_courtyard_1b[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1b[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_1b[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_1b[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1b[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_1b[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_courtyard_1b[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
s_cops_courtyard_1b[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
UPDATE_AI_PED_BLIP(s_cops_courtyard_1b[i].ped, s_cops_courtyard_1b[i].s_blip_data)
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_courtyard_1b[i].ped)
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_courtyard_1b[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Cops in a chopper get dropped off at the courtyard.
|
|
IF NOT s_cops_courtyard_heli[0].b_is_created
|
|
IF s_cops_after_bridge[0].i_event > 0
|
|
OR e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_HELI_COURTYARD, str_carrec)
|
|
REQUEST_MODEL(model_cop_heli)
|
|
REQUEST_MODEL(model_swat)
|
|
REQUEST_VEHICLE_ASSET(model_cop_heli, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_MODEL_LOADED(model_cop_heli)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_HELI_COURTYARD, str_carrec)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_cop_heli)
|
|
IF NOT DOES_ENTITY_EXIST(veh_cops_courtyard_heli)
|
|
IF v_player_pos.z > 47.0
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-183.073105,-660.491577,40.232239>>, <<-147.523422,-555.349487,72.347198>>, 115.250000)
|
|
veh_cops_courtyard_heli = CREATE_VEHICLE(model_cop_heli, <<-179.3185, -529.7585, 54.6964>>, 0.0)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
SET_VEHICLE_LIGHTS(veh_cops_courtyard_heli, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_LIVERY(veh_cops_courtyard_heli, 0)
|
|
SET_VEHICLE_SIREN(veh_cops_courtyard_heli, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_courtyard_heli, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_courtyard_heli, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(veh_cops_courtyard_heli)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(veh_cops_courtyard_heli, FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_courtyard_heli, CARREC_COPS_HELI_COURTYARD, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_courtyard_heli, 1000.0)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_courtyard_heli, "BS_POLICE_HELI_02_group")
|
|
|
|
//Clear the previous area of cops to help with CPU time.
|
|
CLEAR_AREA(<<-111.3153, -679.9694, 34.8729>>, 80.0, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_heli[0].ped)
|
|
s_cops_courtyard_heli[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_courtyard_heli, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_heli[0].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_heli[1].ped)
|
|
s_cops_courtyard_heli[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_courtyard_heli, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_heli[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_heli[2].ped)
|
|
s_cops_courtyard_heli[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_courtyard_heli, VS_BACK_LEFT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_heli[2].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_heli[3].ped)
|
|
s_cops_courtyard_heli[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_courtyard_heli, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_heli[3].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_courtyard_heli, "Bridge ")
|
|
i_time_plaza_heli_blew_up = 0
|
|
|
|
REPEAT COUNT_OF(s_cops_courtyard_heli) i
|
|
IF NOT IS_PED_INJURED(s_cops_courtyard_heli[i].ped)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_cops_courtyard_heli[i].ped, FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Look after the helicopter: keep track of when it is on the ground so the peds can get out at the right time.
|
|
BOOL b_heli_stopped = FALSE
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_courtyard_heli)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_courtyard_heli)
|
|
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_courtyard_heli)
|
|
|
|
IF f_playback_time > 15000.0
|
|
IF f_playback_time < 18800.0
|
|
b_heli_stopped = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Send the chopper out of control if the pilot is shot.
|
|
IF IS_PED_INJURED(s_cops_courtyard_heli[0].ped)
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_courtyard_heli)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_courtyard_heli)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_courtyard_heli)
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_cops_courtyard_heli)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_courtyard_heli)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the chopper was blown up before the peds got out then the player says a line.
|
|
IF NOT b_has_text_label_triggered[BS2B_DOWN3]
|
|
IF i_time_plaza_heli_blew_up != 0
|
|
AND GET_GAME_TIMER() - i_time_plaza_heli_blew_up < 3000
|
|
IF s_cops_courtyard_heli[1].i_event = 0
|
|
AND s_cops_courtyard_heli[2].i_event = 0
|
|
AND s_cops_courtyard_heli[3].i_event = 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DOWN3] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DOWN3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_cops_courtyard_heli) i
|
|
IF DOES_ENTITY_EXIST(s_cops_courtyard_heli[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_courtyard_heli[i].ped)
|
|
SWITCH s_cops_courtyard_heli[i].i_event
|
|
CASE 0
|
|
IF i != 0
|
|
IF i > 1
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_courtyard_heli[i].ped)
|
|
IF GET_SCRIPT_TASK_STATUS(s_cops_courtyard_heli[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
|
|
TASK_DRIVE_BY(s_cops_courtyard_heli[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF b_heli_stopped
|
|
SET_PED_COMBAT_AI(s_cops_courtyard_heli[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0)
|
|
SET_CURRENT_PED_WEAPON(s_cops_courtyard_heli[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_heli[i].ped, CA_USE_VEHICLE, FALSE)
|
|
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_heli[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_heli[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_heli[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_heli[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_heli[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_courtyard_heli[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_cops_courtyard_heli[i].ped, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_LEAVE_ANY_VEHICLE(NULL, i * 50, ECF_DONT_CLOSE_DOOR)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_cops_courtyard_heli[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
//s_cops_courtyard_heli[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_courtyard_heli[i].ped, TRUE)
|
|
s_cops_courtyard_heli[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
//Once the heli gets out of view delete the driver and the heli.
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_courtyard_heli)
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_courtyard_heli)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(veh_cops_courtyard_heli, PLAYER_PED_ID())
|
|
IF GET_ENTITY_HEALTH(veh_cops_courtyard_heli) < 700
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_courtyard_heli) < 700
|
|
OR GET_VEHICLE_ENGINE_HEALTH(veh_cops_courtyard_heli) < 700
|
|
IF GET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_courtyard_heli) > -100
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cops_courtyard_heli, -100)
|
|
i_time_plaza_heli_blew_up = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_courtyard_heli)
|
|
TASK_HELI_MISSION(s_cops_courtyard_heli[i].ped, veh_cops_courtyard_heli, NULL, NULL, <<685.2, 984.9, 316.0>>, MISSION_GOTO, 30.0, 10.0, -26.0, 200, 50)
|
|
SET_PED_KEEP_TASK(s_cops_courtyard_heli[i].ped, TRUE)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_courtyard_heli)
|
|
|
|
CLEAN_UP_ENEMY_PED(s_cops_courtyard_heli[i])
|
|
REMOVE_VEHICLE(veh_cops_courtyard_heli)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_COURTYARD, str_carrec)
|
|
|
|
s_cops_courtyard_heli[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
APPLY_DAMAGE_TO_PED(s_cops_courtyard_heli[i].ped, 200, TRUE)
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Remove blips if the player runs on and ignores them
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
UPDATE_AI_PED_BLIP(s_cops_courtyard_heli[i].ped, s_cops_courtyard_heli[i].s_blip_data)
|
|
ELSE
|
|
REMOVE_VEHICLE_ASSET(model_cop_heli) //This is the last police chopper, so the exit anims are no longer needed.
|
|
|
|
CLEAN_UP_ENEMY_PED(s_cops_courtyard_heli[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//More cops show up as the player progresses through the plaza.
|
|
IF NOT s_cops_courtyard_2[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_2[0].ped)
|
|
IF s_cops_courtyard_1b[0].i_event > 0
|
|
OR (s_cops_courtyard_1b[0].b_is_created AND IS_PED_INJURED(s_cops_courtyard_2[0].ped))
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
s_cops_courtyard_2[0].ped = CREATE_ENEMY_PED(model_swat, <<-167.3500, -576.5425, 47.2208>>, 163.6350, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_2[0].ped, PCF_DontBlipCop, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_courtyard_2[1].ped)
|
|
s_cops_courtyard_2[1].ped = CREATE_ENEMY_PED(model_swat, <<-158.5129, -558.8813, 45.9982>>, 107.3095, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_2[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_courtyard_2[2].ped)
|
|
s_cops_courtyard_2[2].ped = CREATE_ENEMY_PED(model_swat, <<-156.6866, -558.4078, 44.9105>>, 107.3066, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_courtyard_2[2].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_courtyard_2, "Plaza2 ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
BOOL b_time_to_trigger = FALSE
|
|
BOOL b_checked_trigger = FALSE
|
|
|
|
REPEAT COUNT_OF(s_cops_courtyard_2) i
|
|
IF DOES_ENTITY_EXIST(s_cops_courtyard_2[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_courtyard_2[i].ped)
|
|
SWITCH s_cops_courtyard_2[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_courtyard_2[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_2[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_2[i].ped, 200.0)
|
|
|
|
s_cops_courtyard_2[i].i_event = 100
|
|
ELSE
|
|
IF NOT b_time_to_trigger
|
|
AND NOT b_checked_trigger
|
|
b_time_to_trigger = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy],
|
|
<<-203.360443,-581.705017,44.493492>>, <<-130.864227,-667.531921,94.220375>>, 2.000000)
|
|
b_checked_trigger = TRUE
|
|
ENDIF
|
|
|
|
IF b_time_to_trigger
|
|
IF i = 0
|
|
v_pos = <<-158.8138, -580.5103, 47.2301>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_2[i].ped, s_cops_courtyard_2[i].cover, v_pos, 164.2663, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_courtyard_2[i].ped, "MOVE_IN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ELIF i = 1
|
|
v_pos = <<-162.2717, -564.3132, 47.2208>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_courtyard_2[i].ped, s_cops_courtyard_2[i].cover, v_pos, 163.5161, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELSE
|
|
v_pos = <<-150.2652, -562.8853, 47.2216>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_courtyard_2[i].ped, v_pos, 2.0, FALSE)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_courtyard_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_2[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_courtyard_2[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_courtyard_2[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_courtyard_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_courtyard_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
//s_cops_courtyard_2[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_courtyard_2[i].ped, TRUE)
|
|
s_cops_courtyard_2[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
UPDATE_AI_PED_BLIP(s_cops_courtyard_2[i].ped, s_cops_courtyard_2[i].s_blip_data)
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_courtyard_2[i].ped)
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_courtyard_2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Merryweather helicopter shows up at the business centre (now SWAT).
|
|
IF NOT s_merry_heli[0].b_is_created
|
|
IF s_cops_courtyard_2[0].b_is_created
|
|
REQUEST_VEHICLE_RECORDING(CARREC_MERRY_HELI, str_carrec)
|
|
REQUEST_MODEL(model_swat)
|
|
REQUEST_MODEL(model_military_chopper)
|
|
REQUEST_MODEL(model_rocket_helper)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_MODEL_LOADED(model_military_chopper)
|
|
AND HAS_MODEL_LOADED(model_rocket_helper)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_MERRY_HELI, str_carrec)
|
|
IF NOT DOES_ENTITY_EXIST(veh_merry_heli)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-159.953873,-583.151306,46.982475>>, <<-166.073624,-580.664673,50.724922>>, 1.250000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-129.271210,-574.096619,46.970215>>, <<-134.197693,-578.311279,49.970215>>, 2.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-100.208809,-579.424438,46.728283>>, <<-96.472244,-569.563354,51.727242>>, 6.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-147.122269,-579.817139,45.225082>>, <<-150.993530,-555.962891,52.719139>>, 106.250000)
|
|
veh_merry_heli = CREATE_VEHICLE(model_military_chopper, <<-27.3128, -736.0812, 56.3044>>, 0.0)
|
|
SET_ENTITY_PROOFS(veh_merry_heli, FALSE, FALSE, TRUE, FALSE, FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_merry_heli, CARREC_MERRY_HELI, str_carrec)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_merry_heli, "BS_BUZZARD_group")
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_merry_heli, 2000.0)
|
|
f_merry_heli_playback_speed = 1.0
|
|
i_time_merry_heli_blew_up = 0
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_merry_heli[0].ped)
|
|
s_merry_heli[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_merry_heli, VS_DRIVER, rel_group_cops, 800, 0, WEAPONTYPE_UNARMED)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_merry_heli[0].ped, TRUE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_merry_heli[0].ped, FALSE)
|
|
SET_PED_ACCURACY(s_merry_heli[0].ped, 1)
|
|
SET_PED_FIRING_PATTERN(s_merry_heli[0].ped, FIRING_PATTERN_BURST_FIRE_HELI)
|
|
SET_PED_SHOOT_RATE(s_merry_heli[0].ped, 80)
|
|
SET_PED_CAN_BE_TARGETTED(s_merry_heli[0].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_merry_heli[0].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_merry_heli)
|
|
SET_VEHICLE_ENGINE_ON(veh_merry_heli, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(veh_merry_heli)
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_CHOPPER_ARRIVES")
|
|
START_AUDIO_SCENE("BS_2B_CHOPPER_ARRIVES")
|
|
ENDIF
|
|
|
|
obj_merry_rocket_helper = CREATE_OBJECT_NO_OFFSET(model_rocket_helper, <<-27.3128, -736.0812, 66.3044>>)
|
|
FREEZE_ENTITY_POSITION(obj_merry_rocket_helper, TRUE)
|
|
SET_ENTITY_COLLISION(obj_merry_rocket_helper, FALSE)
|
|
SET_ENTITY_VISIBLE(obj_merry_rocket_helper, FALSE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_merry_heli, "mHeli ")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(veh_merry_heli)
|
|
//Handle the chopper
|
|
HOVER_HELI_USING_RECORDING(veh_merry_heli, f_merry_heli_playback_speed, 16000.0, 30000.0)
|
|
|
|
//Spin the chopper out if shot enough.
|
|
IF s_merry_heli[0].i_event < 100
|
|
BOOL b_hit_by_explosion = IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_merry_heli, <<0.0, 5.0, -5.0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_merry_heli, <<0.0, -5.0, 5.0>>), 8.0)
|
|
|
|
IF IS_PED_INJURED(s_merry_heli[0].ped)
|
|
OR GET_ENTITY_HEALTH(veh_merry_heli) < 500
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli) < 500
|
|
OR GET_VEHICLE_ENGINE_HEALTH(veh_merry_heli) < 500
|
|
OR b_hit_by_explosion
|
|
IF NOT IS_PED_INJURED(s_merry_heli[0].ped)
|
|
SET_ENTITY_HEALTH(s_merry_heli[0].ped, 0)
|
|
ENDIF
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_merry_heli)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_merry_heli)
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_MERRY_HELI, str_carrec)
|
|
|
|
/*IF b_hit_by_explosion
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -150.0)
|
|
SET_ENTITY_INVINCIBLE(veh_merry_heli, FALSE)
|
|
SET_ENTITY_HEALTH(veh_merry_heli, 0)
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_merry_heli)
|
|
EXPLODE_VEHICLE(veh_merry_heli, TRUE)
|
|
s_merry_heli[0].i_event = 101
|
|
ELSE
|
|
SET_ENTITY_HEALTH(veh_merry_heli, 1000)
|
|
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -150.0)
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_merry_heli)
|
|
|
|
b_merry_heli_is_active = FALSE
|
|
s_merry_heli[0].i_timer = GET_GAME_TIMER()
|
|
s_merry_heli[0].i_event = 100
|
|
ENDIF*/
|
|
|
|
SET_ENTITY_HEALTH(veh_merry_heli, 1000)
|
|
|
|
IF b_hit_by_explosion
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -300.0)
|
|
ELSE
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -150.0)
|
|
ENDIF
|
|
SET_VEHICLE_OUT_OF_CONTROL(veh_merry_heli)
|
|
|
|
b_merry_heli_is_active = FALSE
|
|
s_merry_heli[0].i_timer = GET_GAME_TIMER()
|
|
s_merry_heli[0].i_event = 100
|
|
|
|
//Record footage of the chopper blowing up.
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.5)
|
|
|
|
i_time_merry_heli_blew_up = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF s_merry_heli[0].i_event = 100
|
|
IF GET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli) < -299
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -300.0)
|
|
ELSE
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_merry_heli, -150.0)
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - s_merry_heli[0].i_timer > 3000
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_merry_heli)
|
|
SET_ENTITY_PROOFS(veh_merry_heli, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
EXPLODE_VEHICLE(veh_merry_heli)
|
|
s_merry_heli[0].i_event++
|
|
ELSE
|
|
APPLY_FORCE_TO_ENTITY(veh_merry_heli, APPLY_TYPE_FORCE, <<-10.0, 10.0, 9.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, FALSE, TRUE)
|
|
APPLY_FORCE_TO_ENTITY(veh_merry_heli, APPLY_TYPE_FORCE, <<3.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF DOES_ENTITY_EXIST(veh_merry_heli)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_merry_heli)
|
|
REMOVE_VEHICLE(veh_merry_heli)
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_CHOPPER_ARRIVES")
|
|
STOP_AUDIO_SCENE("BS_2B_CHOPPER_ARRIVES")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the chopper was blown up then the player says a line.
|
|
IF NOT b_has_text_label_triggered[BS2B_DOWN4]
|
|
IF i_time_merry_heli_blew_up != 0
|
|
AND GET_GAME_TIMER() - i_time_merry_heli_blew_up < 3000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DOWN4] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWNM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DOWN4] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_merry_heli) i
|
|
IF DOES_ENTITY_EXIST(s_merry_heli[i].ped)
|
|
IF NOT IS_PED_INJURED(s_merry_heli[i].ped)
|
|
SWITCH s_merry_heli[i].i_event
|
|
CASE 0
|
|
IF IS_VEHICLE_DRIVEABLE(veh_merry_heli)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_merry_heli)
|
|
IF GET_TIME_POSITION_IN_RECORDING(veh_merry_heli) > 5000.0
|
|
//TASK_VEHICLE_SHOOT_AT_PED(s_merry_heli[i].ped, PLAYER_PED_ID())
|
|
|
|
b_merry_heli_is_active = TRUE
|
|
f_merry_heli_rocket_multiplier = 5.0
|
|
s_merry_heli[0].i_event++
|
|
s_merry_heli[0].i_timer = GET_GAME_TIMER() + 1000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Shoot rockets after timer is hit, with each rocket the heli becomes more accurate.
|
|
UPDATE_AI_PED_BLIP(s_merry_heli[i].ped, s_merry_heli[i].s_blip_data)
|
|
|
|
VECTOR vRocketTargetPos
|
|
FLOAT fXOffsetModifier, fYOffsetModifier
|
|
|
|
IF GET_GAME_TIMER() - s_merry_heli[i].i_timer > 0
|
|
SET_CURRENT_PED_VEHICLE_WEAPON(s_merry_heli[i].ped, WEAPONTYPE_VEHICLE_SPACE_ROCKET)
|
|
|
|
IF v_player_pos.z > 43.5
|
|
AND v_player_pos.x > -165.0
|
|
AND v_player_pos.x < -140.5
|
|
vRocketTargetPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
ELSE
|
|
vRocketTargetPos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
fXOffsetModifier = -1.0
|
|
ELSE
|
|
fXOffsetModifier = 1.0
|
|
ENDIF
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
fYOffsetModifier = -1.0
|
|
ELSE
|
|
fYOffsetModifier = 1.0
|
|
ENDIF
|
|
|
|
vRocketTargetPos.x = vRocketTargetPos.x + ((f_merry_heli_rocket_multiplier + GET_RANDOM_FLOAT_IN_RANGE(0.0, 2.0)) * fXOffsetModifier)
|
|
vRocketTargetPos.y = vRocketTargetPos.y + (((f_merry_heli_rocket_multiplier / 2.5) + GET_RANDOM_FLOAT_IN_RANGE(0.0, 1.0)) * fYOffsetModifier)
|
|
vRocketTargetPos.z = vRocketTargetPos.z + (f_merry_heli_rocket_multiplier / 2.0)
|
|
|
|
//For the first rocket make sure it always misses.
|
|
IF f_merry_heli_rocket_multiplier >= 5.0
|
|
vRocketTargetPos.z = 55.8
|
|
ENDIF
|
|
|
|
//PRINTLN(vRocketTargetPos, " ", f_merry_heli_rocket_multiplier)
|
|
|
|
SET_PED_ACCURACY(s_merry_heli[i].ped, 100)
|
|
//SET_VEHICLE_SHOOT_AT_TARGET(s_merry_heli[i].ped, PLAYER_PED_ID(), <<0.0, 0.0, 0.0>>)
|
|
//SET_VEHICLE_SHOOT_AT_TARGET(s_merry_heli[i].ped, NULL, vRocketTargetPos)
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_merry_rocket_helper, vRocketTargetPos)
|
|
SET_VEHICLE_SHOOT_AT_TARGET(s_merry_heli[i].ped, obj_merry_rocket_helper, <<0.0, 0.0, 0.0>>)
|
|
//SET_CURRENT_PED_VEHICLE_WEAPON(s_merry_heli[i].ped, WEAPONTYPE_VEHICLE_PLAYER_BUZZARD)
|
|
|
|
CONVERGE_VALUE(f_merry_heli_rocket_multiplier, 0.0, 0.75)
|
|
s_merry_heli[i].i_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
|
|
ENDIF
|
|
|
|
//If a rocket explodes and the player ran off then class it as hitting the crew member.
|
|
IF v_player_pos.z < 43.5
|
|
IF IS_EXPLOSION_IN_AREA(EXP_TAG_PLANE_ROCKET, <<-174.9, -581.7, 46.5>>, <<-139.0, -548.8, 59.3>>)
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
VECTOR v_crew_pos
|
|
v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)
|
|
|
|
IF v_crew_pos.z > 46.0
|
|
APPLY_DAMAGE_TO_PED(s_crew[CREW_MICHAEL_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_MICHAEL_ID].ped) + 50, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_merry_heli[i])
|
|
REMOVE_OBJECT(obj_merry_rocket_helper, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//When leaving the courtyard down the stairs some guys appear at the opposite end.
|
|
IF NOT s_cops_after_courtyard[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_after_courtyard[0].ped)
|
|
IF s_merry_heli[0].b_is_created
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
s_cops_after_courtyard[0].ped = CREATE_ENEMY_PED(model_swat, <<-105.0238, -551.9466, 39.4899>>, 107.3095, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_after_courtyard[0].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_after_courtyard, "After court ")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
BOOL b_time_to_trigger = FALSE
|
|
BOOL b_checked_trigger = FALSE
|
|
|
|
REPEAT COUNT_OF(s_cops_after_courtyard) i
|
|
IF DOES_ENTITY_EXIST(s_cops_after_courtyard[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_after_courtyard[i].ped)
|
|
SWITCH s_cops_after_courtyard[i].i_event
|
|
CASE 0
|
|
IF b_mission_failed
|
|
SET_PED_COMBAT_PARAMS(s_cops_after_courtyard[i].ped, 10, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_courtyard[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_courtyard[i].ped, 200.0)
|
|
|
|
s_cops_after_courtyard[i].i_event = 100
|
|
ELSE
|
|
IF i < 2
|
|
IF NOT b_time_to_trigger
|
|
AND NOT b_checked_trigger
|
|
b_time_to_trigger = ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy],
|
|
<<-148.950745,-555.908875,41.092220>>, <<-148.632355,-558.330444,44.841061>>, 1.750000)
|
|
b_checked_trigger = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF b_time_to_trigger
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_after_courtyard[i].ped, <<-111.6535, -547.5443, 39.4983>>, 2.0, TRUE)
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_after_courtyard[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_after_courtyard[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_courtyard[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_after_courtyard[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_after_courtyard[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_after_courtyard[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_courtyard[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_courtyard[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_after_courtyard[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_after_courtyard[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
//s_cops_after_courtyard[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_after_courtyard[i].ped, TRUE)
|
|
s_cops_after_courtyard[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
UPDATE_AI_PED_BLIP(s_cops_after_courtyard[i].ped, s_cops_after_courtyard[i].s_blip_data)
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_after_courtyard[i].ped)
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_after_courtyard[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Two more cops pop out from the corner when heading for the car park.
|
|
IF NOT s_cops_before_car_park[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_before_car_park[0].ped)
|
|
IF s_merry_heli[0].b_is_created
|
|
REQUEST_MODEL(model_swat)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
IF ARE_PEDS_IN_ANGLED_AREA(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy],
|
|
<<-145.489563,-553.322083,46.248287>>, <<-194.477005,-562.312744,38.997589>>, 3.000000)
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_courtyard) = 0
|
|
s_cops_before_car_park[0].ped = CREATE_ENEMY_PED(model_swat, <<-196.6814, -568.4095, 39.4899>>, 340.8683, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_before_car_park[0].ped, PCF_DontBlipCop, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_before_car_park[1].ped)
|
|
s_cops_before_car_park[1].ped = CREATE_ENEMY_PED(model_swat, <<-197.0649, -569.5699, 39.4889>>, 340.8626, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_before_car_park[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_before_car_park[2].ped)
|
|
s_cops_before_car_park[2].ped = CREATE_ENEMY_PED(model_swat, <<-201.5502, -580.5303, 39.4881>>, 340.0840, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_before_car_park[2].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_before_car_park, "Before car park ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_before_car_park) i
|
|
IF DOES_ENTITY_EXIST(s_cops_before_car_park[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_before_car_park[i].ped)
|
|
SWITCH s_cops_before_car_park[i].i_event
|
|
CASE 0
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_before_car_park[i].ped, <<-186.1787, -561.3795, 39.5001>>, 2.0, TRUE)
|
|
PLAY_PED_AMBIENT_SPEECH(s_cops_before_car_park[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ELIF i = 1
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_cops_before_car_park[i].ped, s_cops_before_car_park[i].cover, <<-188.8791, -565.5320, 39.4921>>, 273.8708, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 2
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_before_car_park[i].ped, <<-191.8576, -563.6796, 39.4959>>, 2.0, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(s_cops_before_car_park[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_car_park[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_before_car_park[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_before_car_park[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_before_car_park[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_car_park[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_car_park[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_car_park[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_before_car_park[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
//s_cops_before_car_park[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_before_car_park[i].ped, TRUE)
|
|
s_cops_before_car_park[i].i_event++
|
|
BREAK
|
|
|
|
CASE 1
|
|
UPDATE_AI_PED_BLIP(s_cops_before_car_park[i].ped, s_cops_before_car_park[i].s_blip_data)
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_before_car_park[i].ped)
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_before_car_park[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF NOT s_cops_before_garage_blockade[COUNT_OF(s_cops_before_garage_blockade) - 1].b_is_created
|
|
IF e_mission_stage > STAGE_LEAVE_BANK
|
|
AND s_cops_before_car_park[0].b_is_created
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_1, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_2, str_carrec)
|
|
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(model_cop)
|
|
AND HAS_MODEL_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BEFORE_CAR_PARK_1, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BEFORE_CAR_PARK_2, str_carrec)
|
|
IF s_cops_before_garage_blockade[0].b_is_created //Once the first cop is created there's no need to check the locates any more.
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-196.893082,-564.165466,28.103390>>, <<-158.514581,-556.676257,42.747276>>, 13.000000)
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) <= 1
|
|
//Create vehicles: only create one per frame.
|
|
REPEAT COUNT_OF(veh_cops_before_garage_blockade) i
|
|
INT i_carrec = 0
|
|
FLOAT f_playback_speed = 1.0
|
|
FLOAT f_playback_time = 0.0
|
|
|
|
IF NOT b_created_vehicle_this_frame
|
|
AND NOT DOES_ENTITY_EXIST(veh_cops_before_garage_blockade[i])
|
|
SWITCH i
|
|
CASE 0
|
|
veh_cops_before_garage_blockade[i] = CREATE_VEHICLE(model_cop_car, <<-257.5987, -334.0827, 29.6645>>, 0.0)
|
|
i_carrec = CARREC_COPS_BEFORE_CAR_PARK_1
|
|
f_playback_speed = 1.0
|
|
f_playback_time = 500.0
|
|
BREAK
|
|
|
|
CASE 1
|
|
veh_cops_before_garage_blockade[i] = CREATE_VEHICLE(model_cop_car, <<-260.6430, -317.7758, 29.8408>>, 0.0)
|
|
i_carrec = CARREC_COPS_BEFORE_CAR_PARK_2
|
|
f_playback_speed = 1.0
|
|
f_playback_time = 500.0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_before_garage_blockade[i], TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(veh_cops_before_garage_blockade[i], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_cops_before_garage_blockade[i], TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_before_garage_blockade[i], TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_before_garage_blockade[i], i_carrec, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_before_garage_blockade[i], f_playback_time)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_before_garage_blockade[i])
|
|
SET_PLAYBACK_SPEED(veh_cops_before_garage_blockade[i], f_playback_speed)
|
|
|
|
b_created_vehicle_this_frame = TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Create peds inside the vehicles (only create one per frame).
|
|
REPEAT COUNT_OF(s_cops_before_garage_blockade) i
|
|
INT i_car_index = 0
|
|
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
|
|
|
|
IF NOT b_created_ped_this_frame
|
|
AND NOT s_cops_before_garage_blockade[i].b_is_created
|
|
SWITCH i
|
|
CASE 0
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_DRIVER
|
|
BREAK
|
|
|
|
CASE 1
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_FRONT_RIGHT
|
|
BREAK
|
|
|
|
CASE 2
|
|
i_car_index = 1
|
|
e_vehicle_seat = VS_DRIVER
|
|
BREAK
|
|
|
|
CASE 3
|
|
i_car_index = 1
|
|
e_vehicle_seat = VS_FRONT_RIGHT
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_before_garage_blockade[i_car_index])
|
|
s_cops_before_garage_blockade[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_cops_before_garage_blockade[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
|
|
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
|
|
SET_PED_INTO_VEHICLE(s_cops_before_garage_blockade[i].ped, veh_cops_before_garage_blockade[i_car_index], e_vehicle_seat)
|
|
INITIALISE_ENEMY_PED(s_cops_before_garage_blockade[i], "RampB ", i)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_before_garage_blockade[i].ped, TRUE)
|
|
b_created_ped_this_frame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_before_garage_blockade) i
|
|
IF DOES_ENTITY_EXIST(s_cops_before_garage_blockade[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_before_garage_blockade[i].ped)
|
|
SWITCH s_cops_before_garage_blockade[i].i_event
|
|
CASE 0 //Switch to AI after a few seconds (so the cars can avoid traffic).
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_before_garage_blockade[i].ped)
|
|
VEHICLE_INDEX veh
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_before_garage_blockade[i].ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
|
|
IF GET_TIME_POSITION_IN_RECORDING(veh) > 7000.0
|
|
SET_PLAYBACK_TO_USE_AI(veh, DRIVINGMODE_AVOIDCARS)
|
|
|
|
s_cops_before_garage_blockade[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_before_garage_blockade[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_before_garage_blockade[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Wait for the car to stop.
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_before_garage_blockade[i].ped)
|
|
VEHICLE_INDEX veh
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_before_garage_blockade[i].ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_SPEED(veh) < 0.5
|
|
AND ((NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(veh))
|
|
OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0 AND VDIST2(GET_ENTITY_COORDS(veh), <<-196.9, -566.7, 40.5>>) < 225.0))
|
|
s_cops_before_garage_blockade[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_before_garage_blockade[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_before_garage_blockade[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_before_garage_blockade[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_before_garage_blockade[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_before_garage_blockade[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Get out and fight.
|
|
SET_PED_COMBAT_PARAMS(s_cops_before_garage_blockade[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_before_garage_blockade[i].ped, GET_ENTITY_COORDS(s_cops_before_garage_blockade[i].ped) - <<0.0, 0.0, 1.0>>, 7.0, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_before_garage_blockade[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_garage_blockade[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_cops_before_garage_blockade[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_before_garage_blockade[i].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_before_garage_blockade[i].ped, FALSE)
|
|
|
|
s_cops_before_garage_blockade[i].i_event++
|
|
BREAK
|
|
|
|
CASE 3 //Once the player is far enough away from these cops clean them up.
|
|
IF s_cops_car_park_2[0].i_event > 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_2) = 0
|
|
CLEAN_UP_ENEMY_PED(s_cops_before_garage_blockade[i])
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_before_garage_blockade[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
|
|
REPEAT COUNT_OF(veh_cops_before_garage_blockade) i
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_before_garage_blockade[i])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_before_garage_blockade[i])
|
|
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_before_garage_blockade[i])
|
|
FLOAT f_playback_speed = 1.0
|
|
|
|
IF f_playback_time < 3000.0
|
|
f_playback_speed += (1.0 - ((f_playback_time / 3000.0) * 0.5))
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(veh_cops_before_garage_blockade[i], f_playback_speed)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_cops_car_park_2[0].i_event > 0
|
|
OR (s_cops_car_park_2[0].b_is_created AND IS_PED_INJURED(s_cops_car_park_2[0].ped))
|
|
REMOVE_VEHICLE(veh_cops_before_garage_blockade[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//More cops show up by the car park entrance, just as the player gets near.
|
|
IF NOT s_cops_before_garage_blockade_2[COUNT_OF(s_cops_before_garage_blockade_2) - 1].b_is_created
|
|
IF s_cops_before_garage_blockade[0].b_is_created
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_3, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_4, str_carrec)
|
|
REQUEST_VEHICLE_ASSET(model_cop_car, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(model_cop)
|
|
AND HAS_MODEL_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_cop_car)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BEFORE_CAR_PARK_3, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_BEFORE_CAR_PARK_4, str_carrec)
|
|
IF s_cops_before_garage_blockade_2[0].b_is_created //Once the first cop is created there's no need to check the locates any more.
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-201.765411,-591.722046,70.663177>>, <<-351.272980,-558.346436,19.204063>>, 16.500000)
|
|
//Create vehicles: only create one per frame.
|
|
REPEAT COUNT_OF(veh_cops_before_garage_blockade_2) i
|
|
INT i_carrec = 0
|
|
FLOAT f_playback_speed = 1.0
|
|
FLOAT f_playback_time = 0.0
|
|
|
|
IF NOT b_created_vehicle_this_frame
|
|
AND NOT DOES_ENTITY_EXIST(veh_cops_before_garage_blockade_2[i])
|
|
SWITCH i
|
|
CASE 0
|
|
veh_cops_before_garage_blockade_2[i] = CREATE_VEHICLE(model_cop_car, <<-257.5987, -334.0827, 29.6645>>, 0.0)
|
|
i_carrec = CARREC_COPS_BEFORE_CAR_PARK_3
|
|
f_playback_speed = 1.0
|
|
f_playback_time = 500.0
|
|
BREAK
|
|
|
|
CASE 1
|
|
veh_cops_before_garage_blockade_2[i] = CREATE_VEHICLE(model_cop_car, <<-260.6430, -317.7758, 29.8408>>, 0.0)
|
|
i_carrec = CARREC_COPS_BEFORE_CAR_PARK_4
|
|
f_playback_speed = 1.0
|
|
f_playback_time = 500.0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_before_garage_blockade_2[i], TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(veh_cops_before_garage_blockade_2[i], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_cops_before_garage_blockade_2[i], TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_before_garage_blockade_2[i], TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_before_garage_blockade_2[i], i_carrec, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_before_garage_blockade_2[i], f_playback_time)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_before_garage_blockade_2[i])
|
|
SET_PLAYBACK_SPEED(veh_cops_before_garage_blockade_2[i], f_playback_speed)
|
|
|
|
b_created_vehicle_this_frame = TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Create peds inside the vehicles (only create one per frame).
|
|
REPEAT COUNT_OF(s_cops_before_garage_blockade_2) i
|
|
INT i_car_index = 0
|
|
VEHICLE_SEAT e_vehicle_seat = VS_DRIVER
|
|
|
|
IF NOT b_created_ped_this_frame
|
|
AND NOT s_cops_before_garage_blockade_2[i].b_is_created
|
|
SWITCH i
|
|
CASE 0
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_DRIVER
|
|
BREAK
|
|
|
|
CASE 1
|
|
i_car_index = 0
|
|
e_vehicle_seat = VS_FRONT_RIGHT
|
|
BREAK
|
|
|
|
CASE 2
|
|
i_car_index = 1
|
|
e_vehicle_seat = VS_DRIVER
|
|
BREAK
|
|
|
|
CASE 3
|
|
i_car_index = 1
|
|
e_vehicle_seat = VS_FRONT_RIGHT
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_before_garage_blockade_2[i_car_index])
|
|
s_cops_before_garage_blockade_2[i].ped = CREATE_ENEMY_PED(model_cop, GET_ENTITY_COORDS(veh_cops_before_garage_blockade_2[i_car_index]) + <<0.0, 0.0, 2.0>>, 0.0,
|
|
rel_cops_buddy_ignore, 200, 0, WEAPONTYPE_PISTOL, PEDTYPE_COP)
|
|
SET_PED_INTO_VEHICLE(s_cops_before_garage_blockade_2[i].ped, veh_cops_before_garage_blockade_2[i_car_index], e_vehicle_seat)
|
|
INITIALISE_ENEMY_PED(s_cops_before_garage_blockade_2[i], "RampB ", i)
|
|
b_created_ped_this_frame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_before_garage_blockade_2) i
|
|
IF DOES_ENTITY_EXIST(s_cops_before_garage_blockade_2[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_before_garage_blockade_2[i].ped)
|
|
SWITCH s_cops_before_garage_blockade_2[i].i_event
|
|
CASE 0 //Wait for the car to stop.
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_before_garage_blockade_2[i].ped)
|
|
VEHICLE_INDEX veh
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_before_garage_blockade_2[i].ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_SPEED(veh) < 0.5
|
|
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
|
|
s_cops_before_garage_blockade_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_before_garage_blockade_2[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_before_garage_blockade_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_before_garage_blockade_2[i].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_cops_before_garage_blockade_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_before_garage_blockade_2[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Get out and fight.
|
|
SET_PED_COMBAT_PARAMS(s_cops_before_garage_blockade_2[i].ped, 1, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_before_garage_blockade_2[i].ped, GET_ENTITY_COORDS(s_cops_before_garage_blockade_2[i].ped) - <<0.0, 0.0, 1.0>>, 7.0, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_before_garage_blockade_2[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_before_garage_blockade_2[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_before_garage_blockade_2[i].ped, 200.0)
|
|
SET_PED_CONFIG_FLAG(s_cops_before_garage_blockade_2[i].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_before_garage_blockade_2[i].ped, FALSE)
|
|
|
|
s_cops_before_garage_blockade_2[i].i_event++
|
|
BREAK
|
|
|
|
CASE 2 //Once the player is far enough away from these cops clean them up.
|
|
IF s_cops_car_park_2[0].i_event > 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_2) = 0
|
|
CLEAN_UP_ENEMY_PED(s_cops_before_garage_blockade_2[i])
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(s_cops_before_garage_blockade_2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Handle the vehicles: do damage to them when shot and remove them once the player leaves.
|
|
REPEAT COUNT_OF(veh_cops_before_garage_blockade_2) i
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_before_garage_blockade_2[i])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_before_garage_blockade_2[i])
|
|
FLOAT f_playback_time = GET_TIME_POSITION_IN_RECORDING(veh_cops_before_garage_blockade_2[i])
|
|
FLOAT f_playback_speed = 1.0
|
|
|
|
IF f_playback_time < 2000.0
|
|
f_playback_speed += (1.0 - ((f_playback_time / 3000.0) * 0.5))
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(veh_cops_before_garage_blockade_2[i], f_playback_speed)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_cops_car_park_2[0].i_event > 0
|
|
OR (s_cops_car_park_2[0].b_is_created AND IS_PED_INJURED(s_cops_car_park_2[0].ped))
|
|
REMOVE_VEHICLE(veh_cops_before_garage_blockade_2[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//First SWAT van arrives in the car park.
|
|
IF NOT s_cops_car_park_1[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(veh_cops_car_park_1)
|
|
IF s_cops_after_courtyard[0].b_is_created
|
|
REQUEST_MODEL(model_swat)
|
|
REQUEST_MODEL(model_swat_van)
|
|
REQUEST_VEHICLE_ASSET(model_swat_van, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_1, str_carrec)
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_MODEL_LOADED(model_swat_van)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_CAR_PARK_1, str_carrec)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_swat_van)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-212.946976,-638.482788,31.595699>>, <<-208.236359,-625.890503,36.576645>>, 6.250000)
|
|
OR (ARE_PEDS_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, s_selector_peds.pedID[e_current_buddy], NULL,
|
|
<<-212.946976,-638.482788,31.595699>>, <<-208.236359,-625.890503,36.576645>>, 6.250000)
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 2500.0)
|
|
veh_cops_car_park_1 = CREATE_VEHICLE(model_swat_van, <<-118.4678, -676.4661, 34.7534>>)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_1, CARREC_COPS_CAR_PARK_1, str_carrec)
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_car_park_1, TRUE, TRUE)
|
|
SET_VEHICLE_STRONG(veh_cops_car_park_1, TRUE)
|
|
SET_VEHICLE_LIGHTS(veh_cops_car_park_1, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_cops_car_park_1, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_car_park_1, TRUE)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_car_park_1, "BS_ENEMY_VANS_group")
|
|
//NOTE: need to wrap this up in a visiblity check in case the player goes a different route.
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_1, 3000.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_car_park_1[0].ped)
|
|
s_cops_car_park_1[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_1, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_1[0].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_1[1].ped)
|
|
s_cops_car_park_1[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_1, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_1[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_1[2].ped)
|
|
s_cops_car_park_1[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_1, VS_BACK_LEFT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_1[2].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_1[3].ped)
|
|
s_cops_car_park_1[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_1, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_1[3].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
REPEAT COUNT_OF(s_cops_car_park_1) i
|
|
IF i = 2 OR i = 3
|
|
IF NOT IS_PED_INJURED(s_cops_car_park_1[i].ped)
|
|
SET_PED_ACCURACY(s_cops_car_park_1[i].ped, 1)
|
|
TASK_DRIVE_BY(s_cops_car_park_1[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VANS_ARRIVE")
|
|
START_AUDIO_SCENE("BS_2B_VANS_ARRIVE")
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_car_park_1, "garage1 ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_car_park_1) i
|
|
IF DOES_ENTITY_EXIST(s_cops_car_park_1[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_car_park_1[i].ped)
|
|
SWITCH s_cops_car_park_1[i].i_event
|
|
CASE 0
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_1[i].ped)
|
|
IF i = 2 OR i = 3
|
|
IF GET_SCRIPT_TASK_STATUS(s_cops_car_park_1[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
|
|
TASK_DRIVE_BY(s_cops_car_park_1[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX veh
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_car_park_1[i].ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_SPEED(veh) < 0.5
|
|
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
|
|
s_cops_car_park_1[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_car_park_1[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
s_cops_car_park_1[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_car_park_1[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
INT i_delay
|
|
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_1[i].ped, <<-170.3, -635.9, 31.7>>, 3.0, TRUE)
|
|
i_delay = 1200
|
|
ELIF i = 1
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_1[i].ped, <<-160.6, -639.4, 31.7>>, 3.0, TRUE)
|
|
i_delay = 850
|
|
ELIF i = 2
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_1[i].ped, <<-173.9, -645.4, 31.7>>, 3.0, TRUE)
|
|
i_delay = 0
|
|
ELIF i = 3
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_1[i].ped, <<-164.1, -648.9, 31.7>>, 3.0, TRUE)
|
|
i_delay = 400
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - s_cops_car_park_1[i].i_timer > i_delay
|
|
SET_PED_COMBAT_PARAMS(s_cops_car_park_1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_car_park_1[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_1[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_car_park_1[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_1[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_1[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_car_park_1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
//s_cops_car_park_1[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_car_park_1[i].ped, TRUE)
|
|
s_cops_car_park_1[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_car_park_1[i].ped)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
UPDATE_AI_PED_BLIP(s_cops_car_park_1[i].ped, s_cops_car_park_1[i].s_blip_data)
|
|
ELSE
|
|
//Make sure the vehicle is stopped if the driver dies.
|
|
IF i = 0
|
|
AND NOT IS_ENTITY_DEAD(veh_cops_car_park_1)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_car_park_1)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(s_cops_car_park_1[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//DO_VEHICLE_DAMAGE_WHEN_SHOT(veh_cops_car_park_1)
|
|
ENDIF
|
|
|
|
|
|
//Second SWAT van arrives in the car park after the first one.
|
|
IF NOT s_cops_car_park_2[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(veh_cops_car_park_2)
|
|
IF s_cops_before_garage_blockade_2[0].b_is_created
|
|
REQUEST_MODEL(model_swat)
|
|
REQUEST_MODEL(model_swat_van)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_2, str_carrec)
|
|
REQUEST_VEHICLE_ASSET(model_swat_van, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_MODEL_LOADED(model_swat_van)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_CAR_PARK_2, str_carrec)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_swat_van)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-167.229630,-724.514282,24.954021>>, <<-98.497353,-553.928406,78.740616>>, 58.000000)
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_1) <= 1
|
|
veh_cops_car_park_2 = CREATE_VEHICLE(model_swat_van, <<-118.4678, -676.4661, 34.7534>>)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_2, CARREC_COPS_CAR_PARK_2, str_carrec)
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_car_park_2, TRUE, TRUE)
|
|
SET_VEHICLE_STRONG(veh_cops_car_park_2, TRUE)
|
|
SET_VEHICLE_LIGHTS(veh_cops_car_park_2, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_cops_car_park_2, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_car_park_2, TRUE)
|
|
//NOTE: need to wrap this up in a visiblity check in case the player goes a different route.
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_2, 2000.0)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_car_park_2, "BS_ENEMY_VANS_group")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_car_park_2[0].ped)
|
|
s_cops_car_park_2[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_2, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_2[0].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_2[1].ped)
|
|
s_cops_car_park_2[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_2, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_2[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_2[2].ped)
|
|
s_cops_car_park_2[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_2, VS_BACK_LEFT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_2[2].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_2[3].ped)
|
|
s_cops_car_park_2[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_2, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_2[3].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
REPEAT COUNT_OF(s_cops_car_park_2) i
|
|
IF i = 2 OR i = 3
|
|
IF NOT IS_PED_INJURED(s_cops_car_park_2[i].ped)
|
|
SET_PED_ACCURACY(s_cops_car_park_2[i].ped, 1)
|
|
TASK_DRIVE_BY(s_cops_car_park_2[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_2[i].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_car_park_2, "garage2 ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_car_park_2) i
|
|
IF DOES_ENTITY_EXIST(s_cops_car_park_2[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_car_park_2[i].ped)
|
|
VEHICLE_INDEX veh
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_2[i].ped)
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_car_park_2[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH s_cops_car_park_2[i].i_event
|
|
CASE 0
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_2[i].ped)
|
|
IF i = 2 OR i = 3
|
|
IF GET_SCRIPT_TASK_STATUS(s_cops_car_park_2[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
|
|
TASK_DRIVE_BY(s_cops_car_park_2[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_2[i].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_SPEED(veh) < 0.5
|
|
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
|
|
s_cops_car_park_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_car_park_2[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
s_cops_car_park_2[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_car_park_2[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
INT i_delay
|
|
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_2[i].ped, <<-169.0, -599.3, 31.7>>, 3.0, TRUE)
|
|
i_delay = 1100
|
|
ELIF i = 1
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_2[i].ped, <<-149.3, -606.5, 31.7>>, 3.0, TRUE)
|
|
i_delay = 700
|
|
ELIF i = 2
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_2[i].ped, <<-159.2, -602.9, 31.7>>, 3.0, TRUE)
|
|
i_delay = 0
|
|
ELIF i = 3
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_2[i].ped, <<-148.8, -617.5, 31.7>>, 3.0, TRUE)
|
|
i_delay = 400
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - s_cops_car_park_2[i].i_timer > i_delay
|
|
SET_PED_COMBAT_PARAMS(s_cops_car_park_2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_car_park_2[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_2[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_car_park_2[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_2[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_2[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_car_park_2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
//s_cops_car_park_2[i].blip = CREATE_BLIP_FOR_ENTITY(s_cops_car_park_2[i].ped, TRUE)
|
|
s_cops_car_park_2[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
UPDATE_AI_PED_BLIP(s_cops_car_park_2[i].ped, s_cops_car_park_2[i].s_blip_data)
|
|
//ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(s_cops_car_park_2[i].ped)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_cops_car_park_2[i].i_event > 0
|
|
OR (IS_VEHICLE_DRIVEABLE(veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0)
|
|
UPDATE_AI_PED_BLIP(s_cops_car_park_2[i].ped, s_cops_car_park_2[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
//Make sure the vehicle is stopped if the driver dies.
|
|
IF i = 0
|
|
AND NOT IS_ENTITY_DEAD(veh_cops_car_park_2)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_car_park_2)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_2)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(s_cops_car_park_2[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//DO_VEHICLE_DAMAGE_WHEN_SHOT(veh_cops_car_park_2)
|
|
ENDIF
|
|
|
|
|
|
//Third SWAT van shows up.
|
|
IF NOT s_cops_car_park_3[0].b_is_created
|
|
IF NOT DOES_ENTITY_EXIST(veh_cops_car_park_3)
|
|
IF s_cops_car_park_1[0].b_is_created
|
|
REQUEST_MODEL(model_swat)
|
|
REQUEST_MODEL(model_swat_van)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_3, str_carrec)
|
|
REQUEST_VEHICLE_ASSET(model_swat_van, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_MODEL_LOADED(model_swat_van)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_CAR_PARK_3, str_carrec)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_swat_van)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-167.229630,-724.514282,24.954021>>, <<-98.497353,-553.928406,78.740616>>, 58.000000)
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_2) <= 3
|
|
veh_cops_car_park_3 = CREATE_VEHICLE(model_swat_van, <<-118.4678, -676.4661, 34.7534>>)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_3, CARREC_COPS_CAR_PARK_3, str_carrec)
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_cops_car_park_3, TRUE, TRUE)
|
|
SET_VEHICLE_STRONG(veh_cops_car_park_3, TRUE)
|
|
SET_VEHICLE_LIGHTS(veh_cops_car_park_3, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(veh_cops_car_park_3, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(veh_cops_car_park_3, TRUE)
|
|
//NOTE: need to wrap this up in a visiblity check in case the player goes a different route.
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_3, 1500.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cops_car_park_3)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cops_car_park_3, "BS_ENEMY_VANS_group")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(s_cops_car_park_3[0].ped)
|
|
s_cops_car_park_3[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_3, VS_DRIVER, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_3[0].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_3[1].ped)
|
|
s_cops_car_park_3[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_3, VS_FRONT_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_3[1].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_3[2].ped)
|
|
s_cops_car_park_3[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_3, VS_BACK_LEFT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_3[2].ped, PCF_DontBlipCop, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(s_cops_car_park_3[3].ped)
|
|
s_cops_car_park_3[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(model_swat, veh_cops_car_park_3, VS_BACK_RIGHT, rel_group_cops, 200, 0, WEAPONTYPE_CARBINERIFLE)
|
|
SET_PED_CONFIG_FLAG(s_cops_car_park_3[3].ped, PCF_DontBlipCop, TRUE)
|
|
|
|
REPEAT COUNT_OF(s_cops_car_park_3) i
|
|
IF i = 2 OR i = 3
|
|
IF NOT IS_PED_INJURED(s_cops_car_park_3[i].ped)
|
|
SET_PED_ACCURACY(s_cops_car_park_3[i].ped, 1)
|
|
TASK_DRIVE_BY(s_cops_car_park_3[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
|
|
|
|
INITIALISE_ENEMY_GROUP(s_cops_car_park_3, "garage3 ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPEAT COUNT_OF(s_cops_car_park_3) i
|
|
IF DOES_ENTITY_EXIST(s_cops_car_park_3[i].ped)
|
|
IF NOT IS_PED_INJURED(s_cops_car_park_3[i].ped)
|
|
VEHICLE_INDEX veh
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_3[i].ped)
|
|
veh = GET_VEHICLE_PED_IS_IN(s_cops_car_park_3[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH s_cops_car_park_3[i].i_event
|
|
CASE 0
|
|
IF IS_PED_IN_ANY_VEHICLE(s_cops_car_park_3[i].ped)
|
|
IF i = 2 OR i = 3
|
|
IF GET_SCRIPT_TASK_STATUS(s_cops_car_park_3[i].ped, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
|
|
TASK_DRIVE_BY(s_cops_car_park_3[i].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_SPEED(veh) < 0.5
|
|
AND (NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0))
|
|
s_cops_car_park_3[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_car_park_3[i].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
s_cops_car_park_3[i].i_timer = GET_GAME_TIMER()
|
|
s_cops_car_park_3[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
INT i_delay
|
|
|
|
IF i = 0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_3[i].ped, <<-153.6068, -587.0838, 31.4245>>, 3.0, TRUE)
|
|
i_delay = 1100
|
|
ELIF i = 1
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_3[i].ped, <<-163.3693, -583.5307, 31.4245>>, 3.0, TRUE)
|
|
i_delay = 700
|
|
ELIF i = 2
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_3[i].ped, <<-143.7290, -590.6827, 31.4245>>, 3.0, TRUE)
|
|
i_delay = 0
|
|
ELIF i = 3
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_cops_car_park_3[i].ped, <<-160.4481, -582.0713, 31.4245>>, 3.0, TRUE)
|
|
i_delay = 400
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - s_cops_car_park_3[i].i_timer > i_delay
|
|
SET_PED_COMBAT_PARAMS(s_cops_car_park_3[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_cops_car_park_3[i].ped, rel_group_cops)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_3[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_cops_car_park_3[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_cops_car_park_3[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_3[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_3[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_cops_car_park_3[i].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_COMBAT_FLOAT(s_cops_car_park_3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
s_cops_car_park_3[i].i_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF s_cops_car_park_3[i].i_event > 0
|
|
OR (IS_VEHICLE_DRIVEABLE(veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh) AND GET_TIME_POSITION_IN_RECORDING(veh) > 2000.0)
|
|
UPDATE_AI_PED_BLIP(s_cops_car_park_3[i].ped, s_cops_car_park_3[i].s_blip_data)
|
|
ENDIF
|
|
ELSE
|
|
//Make sure the vehicle is stopped if the driver dies.
|
|
IF i = 0
|
|
AND NOT IS_ENTITY_DEAD(veh_cops_car_park_3)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_car_park_3)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cops_car_park_3)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(s_cops_car_park_3[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Pedestrian vehicles in the car park.
|
|
IF NOT b_created_car_park_cars
|
|
//Only create one car a frame to keep down execution time.
|
|
IF NOT DOES_ENTITY_EXIST(veh_car_park_cars[0])
|
|
IF s_cops_before_car_park[0].b_is_created
|
|
OR e_mission_stage = STAGE_LOSE_COPS
|
|
REQUEST_MODEL(baller2)
|
|
REQUEST_MODEL(oracle2)
|
|
|
|
IF HAS_MODEL_LOADED(baller2)
|
|
AND HAS_MODEL_LOADED(oracle2)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-214.209686,-618.228821,32.065613>>, <<-286.469269,-559.749695,45.950104>>, 2.250000)
|
|
OR e_mission_stage = STAGE_LOSE_COPS
|
|
veh_car_park_cars[0] = CREATE_VEHICLE(baller2, <<-182.0917, -624.2522, 31.4281>>, 251.3879)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[1])
|
|
veh_car_park_cars[1] = CREATE_VEHICLE(baller2, <<-149.4820, -618.5926, 31.4271>>, 67.6452)
|
|
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[2])
|
|
veh_car_park_cars[2] = CREATE_VEHICLE(oracle2, <<-169.4180, -588.6669, 31.4281>>, 253.2657)
|
|
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[3])
|
|
veh_car_park_cars[3] = CREATE_VEHICLE(oracle2, <<-178.3785, -612.2272, 31.4245>>, 69.1812)
|
|
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[4])
|
|
veh_car_park_cars[4] = CREATE_VEHICLE(oracle2, <<-156.8075, -637.6180, 31.4244>>, 252.0134)
|
|
ELIF NOT DOES_ENTITY_EXIST(veh_car_park_cars[5])
|
|
veh_car_park_cars[5] = CREATE_VEHICLE(baller2, <<-138.5987, -590.7236, 31.4245>>, 69.4967)
|
|
ELIF NOT DOES_ENTITY_EXIST(veh_getaway_car)
|
|
BOOL bCreateDummyVehicle = TRUE
|
|
BOOL bCreateVehGenVehicle = FALSE
|
|
|
|
//Grab the vehicle gen car if available and use that as the getaway car.
|
|
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(VEHGEN_MISSION_VEH_FBI4_PREP, VEHGEN_S_FLAG_AVAILABLE)
|
|
IF NOT IS_ENTITY_DEAD(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH_FBI4_PREP))
|
|
veh_getaway_car = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH_FBI4_PREP)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2b.sc - successfully grabbed getaway car")
|
|
#ENDIF
|
|
|
|
SET_ENTITY_AS_MISSION_ENTITY(veh_getaway_car, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(veh_getaway_car, 68.0133)
|
|
SET_ENTITY_COORDS(veh_getaway_car, <<-166.1555, -621.9833, 31.4281>>)
|
|
|
|
bCreateVehGenVehicle = FALSE
|
|
bCreateDummyVehicle = FALSE
|
|
ELSE
|
|
//Car failed to grab but is available, so try to create below using the global data.
|
|
bCreateVehGenVehicle = TRUE
|
|
bCreateDummyVehicle = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//Car not available, create a default car instead.
|
|
bCreateVehGenVehicle = FALSE
|
|
bCreateDummyVehicle = TRUE
|
|
ENDIF
|
|
|
|
//If the car failed to create but is available then use the global data to create it.
|
|
IF bCreateVehGenVehicle
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2b.sc - car was available but couldn't be grabbed, creating fake vehicle instead.")
|
|
#ENDIF
|
|
|
|
VEHICLE_GEN_DATA_STRUCT sVehGenData
|
|
|
|
IF GET_VEHICLE_GEN_DATA(sVehGenData, VEHGEN_MISSION_VEH_FBI4_PREP)
|
|
REQUEST_MODEL(sVehGenData.model)
|
|
|
|
IF HAS_MODEL_LOADED(sVehGenData.model)
|
|
veh_getaway_car = CREATE_VEHICLE(sVehGenData.model, <<-166.1555, -621.9833, 31.4281>>, 68.0133)
|
|
SET_VEHICLE_COLOURS(veh_getaway_car, sVehGenData.colour1, sVehGenData.colour2)
|
|
SET_VEHICLE_EXTRA_COLOURS(veh_getaway_car, 0, 0)
|
|
SET_VEHICLE_STRONG(veh_getaway_car, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(veh_getaway_car, TRUE)
|
|
SET_VEHICLE_TYRES_CAN_BURST(veh_getaway_car, FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sVehGenData.model)
|
|
SET_VEHICLE_GEN_SAVED_FLAG_STATE(VEHGEN_MISSION_VEH_FBI4_PREP, VEHGEN_S_FLAG_AVAILABLE, FALSE)
|
|
b_vehicle_gen_set_to_unavailable = TRUE
|
|
|
|
bCreateVehGenVehicle = FALSE
|
|
bCreateDummyVehicle = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bCreateVehGenVehicle = FALSE
|
|
bCreateDummyVehicle = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//The getaway car doesn't exist, just create a default one instead.
|
|
IF bCreateDummyVehicle
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2b.sc - getaway car doesn't exist, creating backup")
|
|
#ENDIF
|
|
|
|
veh_getaway_car = CREATE_VEHICLE(oracle2, <<-166.1555, -621.9833, 31.4281>>, 68.0133)
|
|
SET_VEHICLE_COLOURS(veh_getaway_car, 0, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(veh_getaway_car, 0, 0)
|
|
SET_VEHICLE_STRONG(veh_getaway_car, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(veh_getaway_car, TRUE)
|
|
SET_VEHICLE_TYRES_CAN_BURST(veh_getaway_car, FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(veh_getaway_car)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(baller2)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(oracle2)
|
|
|
|
REPEAT COUNT_OF(veh_car_park_cars) i
|
|
IF NOT IS_ENTITY_DEAD(veh_car_park_cars[i])
|
|
SET_VEHICLE_DOORS_LOCKED(veh_car_park_cars[i], VEHICLELOCK_LOCKED_BUT_CAN_BE_DAMAGED)
|
|
SET_VEHICLE_STRONG(veh_car_park_cars[i], TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(veh_car_park_cars[i], TRUE)
|
|
SET_VEHICLE_ALARM(veh_car_park_cars[i], TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_getaway_car)
|
|
SET_VEHICLE_STRONG(veh_getaway_car, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(veh_getaway_car, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(veh_getaway_car, TRUE)
|
|
ENDIF
|
|
|
|
b_created_car_park_cars = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Set alarms off on the cars when they've been shot.
|
|
REPEAT COUNT_OF(veh_car_park_cars) i
|
|
IF NOT IS_ENTITY_DEAD(veh_car_park_cars[i])
|
|
IF NOT IS_VEHICLE_ALARM_ACTIVATED(veh_car_park_cars[i])
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(veh_car_park_cars[i], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
|
|
IF i != 2
|
|
START_VEHICLE_ALARM(veh_car_park_cars[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Clean up the cars once the player reaches the car park (they're not required by the script and the player is close enough for them to not stream out).
|
|
IF DOES_ENTITY_EXIST(veh_car_park_cars[0])
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_3) = 0
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-181.347168,-649.545044,30.315771>>, <<-155.179962,-577.773804,35.445507>>, 39.750000)
|
|
AND IS_SCREEN_FADED_IN()
|
|
REPEAT COUNT_OF(veh_car_park_cars) i
|
|
REMOVE_VEHICLE(veh_car_park_cars[i])
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Make sure the getaway car doesn't fall through the map before the player gets there.
|
|
IF NOT s_cops_car_park_1[0].b_is_created
|
|
AND e_mission_stage < STAGE_LOSE_COPS
|
|
IF NOT IS_ENTITY_DEAD(veh_getaway_car)
|
|
VECTOR v_getaway_car_start_pos = <<-166.1555, -621.9833, 31.4281>>
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(veh_getaway_car), v_getaway_car_start_pos) > 100.0
|
|
AND VDIST2(v_player_pos, GET_ENTITY_COORDS(veh_getaway_car)) > 100.0
|
|
AND VDIST2(v_player_pos, v_getaway_car_start_pos) > 100.0
|
|
SET_ENTITY_HEADING(veh_getaway_car, 68.0133)
|
|
SET_ENTITY_COORDS(veh_getaway_car, v_getaway_car_start_pos)
|
|
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), "] ", "Getaway car moved before the player reached the car park: warping back to start pos.")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle dialogue (shouldn't be needed with ambient stuff).
|
|
//UPDATE_ENEMY_SHOOTOUT_DIALOGUE(i_swat_dialogue_timer)
|
|
ENDPROC
|
|
|
|
|
|
PROC UPDATE_SHOOTOUT_SWITCH()
|
|
BOOL bAllowSwitch = TRUE
|
|
|
|
SWITCH i_switch_stage
|
|
CASE 0
|
|
//Don't allow switching if the player is flying.
|
|
IF IS_PED_IN_ANY_PLANE(PLAYER_PED_ID())
|
|
OR IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
|
|
bAllowSwitch = FALSE
|
|
ENDIF
|
|
|
|
IF bAllowSwitch
|
|
IF UPDATE_SELECTOR_HUD(s_selector_peds)
|
|
CLEAR_HELP()
|
|
DESTROY_ALL_CAMS()
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
|
|
|
|
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
|
|
i_health_before_switch = GET_ENTITY_HEALTH(PLAYER_PED_ID())
|
|
|
|
i_switch_stage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_SHORT_RANGE(s_selector_cam)
|
|
i_switch_stage = 0
|
|
ELSE
|
|
IF s_selector_cam.bOKToSwitchPed
|
|
IF NOT s_selector_cam.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE, TRUE)
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed])
|
|
IF i_health_before_switch < 110
|
|
i_health_before_switch = 110
|
|
ENDIF
|
|
|
|
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_DIES_WHEN_INJURED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_PARAMS(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_ENTITY_HEALTH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], i_health_before_switch)
|
|
SET_PED_MAX_HEALTH_WITH_SCALE(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 1800)
|
|
SET_PED_CAN_COWER_IN_COVER(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], PCF_DisableHurt, TRUE)
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_FIRE | RBF_PLAYER_IMPACT)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_REQUIRES_LOS_TO_SHOOT, FALSE)
|
|
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], TRUE, -1)
|
|
|
|
IF HAS_PED_GOT_WEAPON(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], WEAPONTYPE_ADVANCEDRIFLE)
|
|
SET_CURRENT_PED_WEAPON(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], WEAPONTYPE_ADVANCEDRIFLE) < 50
|
|
ADD_AMMO_TO_PED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], WEAPONTYPE_ADVANCEDRIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
e_current_buddy = s_selector_peds.ePreviousSelectorPed
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
s_selector_cam.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
///Handles AI tasks for either Franklin or Michael, depending on who the player is at the moment.
|
|
///(e.g. if the player is Michael then Franklin will use this behaviour).
|
|
PROC UPDATE_SELECTOR_PED_DURING_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
|
|
BOOL b_player_stole_cover = FALSE
|
|
BOOL b_player_went_to_bridge = FALSE
|
|
BOOL b_is_in_combat = (IS_PED_IN_COMBAT(s_selector_peds.pedID[e_current_buddy]) OR GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
VECTOR v_ped_pos = GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT f_dist_from_player = VDIST2(v_ped_pos, v_player_pos)
|
|
FLOAT f_dist_to_destination
|
|
SEQUENCE_INDEX seq
|
|
INT i = 0
|
|
INT i_closest_node_to_buddy = 0
|
|
INT i_closest_node_to_player = 0
|
|
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_shootout_route)
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_crew_shootout)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_shootout_route)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_crew_shootout)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_ped_pos, i_closest_node_to_buddy)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_player_pos, i_closest_node_to_player)
|
|
ELSE
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_ped_pos, i_closest_node_to_buddy)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_player_pos, i_closest_node_to_player)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_RESET_FLAG(s_selector_peds.pedID[e_current_buddy], PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
SWITCH s_michael.i_event
|
|
CASE 0 //This runs as soon as the selector ped is created: run to cover point while aiming (aim at the ped that pops out at the stairs if he exists).
|
|
s_michael.v_dest = <<-91.9914, -695.8475, 43.2512>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 59.4266, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
IF NOT IS_PED_INJURED(s_cops_before_bridge[0].ped)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, s_michael.v_dest, s_cops_before_bridge[0].ped, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(s_cops_before_bridge[0].ped)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, GET_ENTITY_COORDS(s_cops_before_bridge[0].ped, FALSE), PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-132.2, -674.7, 41.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ENDIF
|
|
ENDIF
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-132.2, -674.7, 41.6>>, 1000)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
BREAK
|
|
|
|
CASE 1 //Run to cover to take on the bridge enemies.
|
|
//Check if the player is stealing cover.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-91.9914, -695.8475, 43.2512>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 59.4266, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-88.5532, -694.7739, 43.2481>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 67.1871, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat)
|
|
AND s_cops_bridge[0].b_is_created)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-132.2, -674.7, 41.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-132.2, -674.7, 41.6>>, 1000)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Check if the player went to the bridge while the buddy was hanging around further up. If this happens the player says a "let's go" line.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-86.694138,-694.010742,45.085995>>, <<-84.451782,-687.800415,39.489246>>, 15.500000)
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGOBRIDGE]
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGOBRIDGE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGOBRIDGE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
b_player_went_to_bridge = TRUE
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) < 4
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_start) < 2
|
|
OR b_player_went_to_bridge
|
|
s_michael.v_dest = <<-85.5955, -686.9423, 41.4885>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 69.9291, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Push forward closer to the bridge
|
|
//Check if the player is stealing cover.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-85.5955, -686.9423, 41.4885>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 69.9291, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-87.5926, -692.6145, 41.9286>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 68.5747, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-132.2, -674.7, 41.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-132.2, -674.7, 41.6>>, 1000)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
BOOL b_time_to_move
|
|
|
|
IF f_dist_to_destination < 9.0
|
|
IF s_michael.i_timer = 0
|
|
s_michael.i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_michael.i_timer > 7000
|
|
IF v_player_pos.z < 45.0
|
|
b_time_to_move = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-86.694138,-694.010742,45.085995>>, <<-84.451782,-687.800415,39.489246>>, 15.500000)
|
|
b_player_went_to_bridge = TRUE
|
|
ENDIF
|
|
|
|
//Play a line if the player is hanging around before the bridge.
|
|
IF NOT b_player_went_to_bridge
|
|
IF f_dist_to_destination < 9.0
|
|
IF NOT b_has_text_label_triggered[BS2B_DBRID]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DBRIDM", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_DBRID] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DBRIDF", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_DBRID] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Progress once there's only one ped left alive, or if the player went down to the bridge.
|
|
IF b_time_to_move
|
|
OR b_player_went_to_bridge
|
|
IF IS_PED_INJURED(s_cops_bridge_start[0].ped)
|
|
AND IS_PED_INJURED(s_cops_bridge_start[1].ped)
|
|
s_michael.v_dest = <<-100.7743, -686.8337, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0)
|
|
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Go onto the bridge, progress once the two enemies at the front are dead.
|
|
//Check if the player is stealing cover.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-100.7743, -686.8337, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-101.3149, -683.7056, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some dialogue telling the player to cross the bridge.
|
|
IF NOT b_has_text_label_triggered[BS2B_BRIDG2]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BRIDG2M", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BRIDG2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BRIDG2F", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BRIDG2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Progress once there's only one ped left alive, or if the player went down to the bridge.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) < 4
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_start) = 0
|
|
IF IS_PED_INJURED(s_cops_bridge[0].ped)
|
|
AND IS_PED_INJURED(s_cops_bridge[1].ped)
|
|
s_michael.v_dest = <<-111.3170, -683.3491, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
i_wait_dialogue_timer = 0
|
|
b_played_wait_line = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4 //Fight the heli and remaining bridge guys, once they're dead progress.
|
|
//Check if the player is stealing cover.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-111.3170, -683.3491, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-115.2356, -676.8964, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[1].ped)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, s_michael.v_dest, s_cops_heli_bridge_2[1].ped, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Progress fully across the bridge once the heli is dead.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0
|
|
IF i_closest_node_to_buddy - i_closest_node_to_player < 5
|
|
OR s_cops_after_bridge[0].i_event > 0
|
|
s_michael.v_dest = <<-121.6736, -679.2559, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ELSE
|
|
//Play some dialogue here to tell the player to catch up.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 400.0
|
|
AND f_dist_from_player < 2500.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BWAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
//ENDIF
|
|
ELSE
|
|
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BWAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Play some dialogue telling the player to kill the bridge enemies.
|
|
IF NOT b_has_text_label_triggered[BS2B_BHELI] //Kill the heli
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
|
|
b_has_text_label_triggered[BS2B_BHELI] = TRUE
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_bridge_2)
|
|
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_heli_bridge_2)
|
|
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_heli_bridge_2) > 8500.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BHELIM", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_BHELI] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BHELIF", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_BHELI] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_BRIDGE] //Kill the bridge peds
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BRIDGEM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BRIDGE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BRIDGEF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BRIDGE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5 //Fight any remaining bridge enemies then progress.
|
|
//Check if the player is stealing cover.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-121.6736, -679.2559, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-118.3590, -677.3660, 39.5162>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<-129.8, -674.0, 40.0>>, 20.0)
|
|
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Progress fully across the bridge once the heli is dead.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) = 0
|
|
IF i_closest_node_to_buddy - i_closest_node_to_player < 5
|
|
OR s_cops_after_bridge[0].i_event > 0
|
|
s_michael.v_dest = <<-151.0778, -674.5917, 39.4882>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
b_buddy_crossed_bridge = TRUE
|
|
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ELSE
|
|
//Play some dialogue here to tell the player to catch up.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 400.0
|
|
AND f_dist_from_player < 4900.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BWAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
//ENDIF
|
|
ELSE
|
|
//IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BWAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6 //Fight the SWAT that come up the ramp.
|
|
//Check if the player is stealing cover.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-151.0778, -674.5917, 39.4882>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-146.8298, -673.8439, 39.4947>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF f_dist_to_destination > VDIST2(<<-129.4, -675.5, 39.4888>>, s_michael.v_dest)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-129.4, -675.5, 39.4888>>, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 1.0, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<-172.55, -664.63, 40.0>>, 10.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some "let's go" dialogue while running to the ramp.
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGO4]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO4] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO4] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Progress once there's just one enemy left.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
|
|
AND f_dist_to_destination < 100.0
|
|
s_michael.v_dest = <<-212.2528, -650.0736, 39.4881>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0)
|
|
|
|
//Now is a good time to remove the navmesh blocking areas at the bottom of the ramps.
|
|
IF i_ramp_navmesh_block_1 != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_1)
|
|
i_ramp_navmesh_block_1 = -1
|
|
ENDIF
|
|
|
|
IF i_ramp_navmesh_block_2 != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_2)
|
|
i_ramp_navmesh_block_2 = -1
|
|
ENDIF
|
|
|
|
i_wait_dialogue_timer = 0
|
|
b_played_wait_line = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.i_timer = GET_GAME_TIMER()
|
|
s_michael.i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 7 //Push to the bottom of the stairs, wait for the player to arrive.
|
|
//Damage any remaining bridge peds.
|
|
IF GET_GAME_TIMER() - s_michael.i_timer < 2000
|
|
AND GET_GAME_TIMER() - s_michael.i_timer > 500
|
|
REPEAT COUNT_OF(s_cops_after_bridge) i
|
|
IF NOT IS_PED_INJURED(s_cops_after_bridge[i].ped)
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
|
|
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], GET_ENTITY_COORDS(s_cops_after_bridge[i].ped))
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - s_michael.i_timer > 1000
|
|
APPLY_DAMAGE_TO_PED(s_cops_after_bridge[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-237.0136, -711.0485, 34.2278>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some "go up the stairs" dialogue.
|
|
IF NOT b_has_text_label_triggered[BS2B_HIGH]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGHM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_HIGH] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGHF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_HIGH] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_HELI2] //Dialogue when the chopper shows up.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF b_ramp_heli_is_active
|
|
AND IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HELI2M", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_HELI2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HELI2F", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_HELI2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_MENT1]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MENT1", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MENT1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue if the player goes down the ramp here.
|
|
IF NOT b_has_text_label_triggered[BS2B_NOLORAMP]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF v_player_pos.z < 39.5
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NOLOM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_NOLORAMP] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NOLOF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_NOLORAMP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_selector_peds.pedID[e_current_buddy], <<-194.867493,-656.806824,39.488064>>, <<-167.274139,-665.861633,42.720985>>, 7.500000)
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], GET_ENTITY_COORDS(veh_cops_heli_ramp))
|
|
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], GET_ENTITY_COORDS(veh_cops_heli_ramp))
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
ENDIF
|
|
ELIF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_ramp_blockade) != 0
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], <<-232.8978, -694.9381, 36.0902>>)
|
|
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], <<-232.8978, -694.9381, 36.0902>>)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Continue once the buddy reaches the area and a certain amount of enemies are dead.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_ramp) <= 1
|
|
IF f_dist_to_destination < 16.0
|
|
IF i_closest_node_to_buddy - i_closest_node_to_player < 3
|
|
AND (f_dist_from_player < 64.0 OR i_closest_node_to_buddy - i_closest_node_to_player < -2)
|
|
IF i_closest_node_to_buddy - i_closest_node_to_player < -2
|
|
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-210.915771,-651.131226,39.511784>>, <<-229.199402,-644.067200,43.001026>>, 6.500000)
|
|
AND IS_SPHERE_VISIBLE(<<-209.0352, -650.2074, 40.9769>>, 0.25)
|
|
AND IS_ENTITY_ON_SCREEN(s_selector_peds.pedID[e_current_buddy]))
|
|
s_michael.v_dest = <<-201.8401, -644.1752, 47.6733>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 2.7610, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event = 50
|
|
ENDIF
|
|
ELSE
|
|
//Play some dialogue if the player goes past the stairs
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-215.509857,-649.067505,36.238064>>, <<-229.233154,-644.159912,43.627552>>, 7.250000)
|
|
IF NOT b_has_text_label_triggered[BS2B_HIGH2]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 1600.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGH2M", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_HIGH2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGH2F", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_HIGH2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue if the player lags behind.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 400.0
|
|
AND f_dist_from_player < 2500.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGHM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGHF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50 //Push forwards to the business centre, go into combat on arrival.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-201.8401, -644.1752, 47.6733>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 2.7610, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-190.6709, -648.3492, 47.6726>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 348.9619, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
INT i_closest_node_to_ped, i_closest_node_to_dest_1, i_closest_node_to_dest_2
|
|
|
|
//Don't perform the early parts of the sequence if the ped has already gone past those points (e.g. if the player switched half-way through the path).
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_ped_pos, i_closest_node_to_ped)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-211.0997, -649.6271, 39.4888>>, i_closest_node_to_dest_1)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-194.1727, -655.5215, 47.2264>>, i_closest_node_to_dest_2)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF i_closest_node_to_ped < i_closest_node_to_dest_1
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-211.0997, -649.6271, 39.4888>>, <<-237.0136, -711.0485, 34.2278>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
IF i_closest_node_to_ped < i_closest_node_to_dest_2
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-194.1727, -655.5215, 47.2264>>, PEDMOVE_SPRINT, 30000, 0.5, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, TRUE, 0.5, 1.0)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-154.0717, -549.3301, 48.7064>>, 1000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play dialogue when they reach the top of the stairs.
|
|
IF NOT b_has_text_label_triggered[BS2B_TOP]
|
|
IF v_ped_pos.z > 47.0
|
|
AND IS_PED_SHOOTING(s_selector_peds.pedID[e_current_buddy])
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TOPM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_TOP] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TOPF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_TOP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGOSTAIRS]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGH2M", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGOSTAIRS] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HIGH2F", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGOSTAIRS] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Continue once the buddy reaches the area and a certain amount of enemies are dead.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1
|
|
IF v_ped_pos.z > 47.0
|
|
s_michael.v_dest = <<-169.6940, -613.6614, 47.2191>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 3.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_courtyard_heli)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_courtyard_heli)
|
|
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_courtyard_heli) > 5000.0
|
|
IF NOT b_has_text_label_triggered[BS2B_PHELI]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PHELIM", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_PHELI] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PHELIF", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_PHELI] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 51 //Push half-way through the plaza, then fight any enemies still around.
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some let's go dialogue
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGOPLAZA]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGOPLAZA] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGOPLAZA] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_RIGHTPLAZA]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF s_cops_courtyard_1b[0].i_event > 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1b) != 0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RIGHTM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_RIGHTPLAZA] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RIGHTF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_RIGHTPLAZA] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_COVER]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_COVERM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_COVER] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_COVERF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_COVER] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Progress once all the enemies are dead.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1b) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1
|
|
s_michael.v_dest = <<-163.9965, -594.8786, 47.2226>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 335.7135, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
|
|
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 52 //Push forwards through the business centre, and fight the next wave.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-163.9965, -594.8786, 47.2226>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 335.7135, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-167.5977, -598.7238, 47.2214>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
|
|
|
|
IF s_michael.cover != NULL
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_michael.cover, <<-154.0717, -549.3301, 48.7064>>, 1000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some "let's go" dialogue while running to the next destination.
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGO5]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(v_ped_pos, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO5] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO5] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some "stick together" dialogue if the player runs off.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 900.0
|
|
AND f_dist_from_player < 2500.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_2) = 0
|
|
s_michael.v_dest = <<-153.2118, -560.0645, 47.2208>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 12.9, 3.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 53 //Run to the chopper location, once the chopper arrives dive to cover.
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some let's go dialogue.
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGOMERRY]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TUNNELM", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_GOGOMERRY] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TUNNELF", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_GOGOMERRY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) != 0
|
|
IF b_merry_heli_is_active
|
|
AND IS_ENTITY_IN_ANGLED_AREA(s_selector_peds.pedID[e_current_buddy], <<-164.167935,-584.824866,45.725426>>, <<-154.954956,-559.742920,51.469128>>, 21.500000)
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
ELSE
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = FALSE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 54 //Run into cover and fight the helicopter.
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) = 0
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(i_closest_node_to_buddy, " ", i_closest_node_to_player)
|
|
#ENDIF
|
|
|
|
IF (i_closest_node_to_buddy - i_closest_node_to_player < 8 AND f_dist_to_destination < 16.0)
|
|
OR s_cops_after_courtyard[0].i_event > 0
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-158.399490,-557.349121,44.969173>>, <<-156.922089,-565.438049,51.718651>>, 15.250000)
|
|
s_michael.v_dest = <<-139.2620, -556.2374, 39.4933>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ELSE
|
|
IF NOT IS_PED_IN_COVER(s_selector_peds.pedID[e_current_buddy])
|
|
AND NOT IS_PED_GOING_INTO_COVER(s_selector_peds.pedID[e_current_buddy])
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_SEEK_COVER_TO_COORDS) != PERFORMING_TASK
|
|
TASK_SEEK_COVER_TO_COORDS(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, <<-166.8, -518.0, 52.7>>, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[e_current_buddy], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some "stick together" dialogue if the player runs off.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 400.0
|
|
AND f_dist_from_player < 2500.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, s_michael.v_dest, PEDMOVE_SPRINT, DEFAULT, 2.0, ENAV_NO_STOPPING)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-154.0717, -549.3301, 51.7064>>, PEDMOVE_SPRINT, TRUE, 2.0, 2.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, s_michael.v_dest, 1000, FALSE, 0.0, FALSE, FALSE, s_michael.cover, TRUE)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some dialogue when the ped spots the Merryweather chopper.
|
|
IF NOT b_has_text_label_triggered[BS2B_MERRY]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF s_merry_heli[0].b_is_created
|
|
IF s_michael.i_timer = 0
|
|
s_michael.i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_michael.i_timer > 3000
|
|
IF f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MERRYM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MERRY] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MERRYF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MERRY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 55 //Run down the stairs, fight the enemies that appear there.
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-146.4362, -556.7252, 40.9678>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some "let's go" dialogue while running to the next destination.
|
|
IF NOT b_has_text_label_triggered[BS2B_PDOWN]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PDOWNM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_PDOWN] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PDOWNF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_PDOWN] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_MENT2]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MENT2", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MENT2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some "stick together" dialogue if the player runs off.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 400.0
|
|
AND f_dist_from_player < 2500.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_courtyard) = 0
|
|
s_michael.v_dest = <<-195.2280, -564.3157, 39.4934>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 56 //Begin running to car park, switch to combat once the peds pop out.
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
INT i_closest_node_to_ped, i_closest_node_to_dest_1
|
|
|
|
//Don't perform the early parts of the sequence if the ped has already gone past those points (e.g. if the player switched half-way through the path).
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_ped_pos, i_closest_node_to_ped)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-142.6308, -553.0471, 39.4983>>, i_closest_node_to_dest_1)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF i_closest_node_to_ped < i_closest_node_to_dest_1
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-142.6308, -553.0471, 39.4983>>, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some "let's go" dialogue while running to the next destination.
|
|
IF NOT b_has_text_label_triggered[BS2B_BACK]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BACKM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BACK] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BACKF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BACK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_WAITCOURT]
|
|
//Play a line if the player goes the wrong way.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 10000.0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-136.001709,-553.247864,39.496075>>, <<-102.206711,-547.259033,42.747730>>, 7.500000)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_WAITCOURT] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_WAITCOURT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_cops_before_car_park[0].i_event > 0
|
|
s_michael.v_dest = <<-170.0670, -562.4701, 39.4993>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 98.3922, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 57 //Fight the enemies, once dead continue to the car park.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-170.0670, -562.4701, 39.4993>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 98.3922, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-168.0697, -559.9905, 39.5001>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
INT i_enemies_alive
|
|
i_enemies_alive = GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park)
|
|
|
|
IF s_michael.i_timer = 0
|
|
AND i_enemies_alive = 1
|
|
s_michael.i_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
IF i_enemies_alive = 0
|
|
OR (i_enemies_alive = 1
|
|
AND (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-181.360565,-561.776001,39.499413>>, <<-196.067978,-564.505859,42.994396>>, 7.000000) OR GET_GAME_TIMER() - s_michael.i_timer > 1500))
|
|
s_michael.v_dest = <<-191.8480, -564.3631, 39.4953>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
|
|
//Play some "stick together" dialogue if the player runs off.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 400.0
|
|
AND f_dist_from_player < 4900.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a line if the player goes the wrong way.
|
|
IF NOT b_has_text_label_triggered[BS2B_WAITCOURT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 10000.0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-136.001709,-553.247864,39.496075>>, <<-102.206711,-547.259033,42.747730>>, 7.500000)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_WAITCOURT] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_WAITCOURT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 58 //Run to the corner, wait for Franklin to arrive.
|
|
//Kill any remaining enemies on the way.
|
|
REPEAT COUNT_OF(s_cops_before_car_park) i
|
|
IF NOT IS_PED_INJURED(s_cops_before_car_park[i].ped)
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
|
|
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], GET_ENTITY_COORDS(s_cops_before_car_park[i].ped))
|
|
APPLY_DAMAGE_TO_PED(s_cops_before_car_park[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF VDIST2(<<-171.7854, -560.7704, 39.4947>>, s_michael.v_dest) < f_dist_to_destination
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-171.7854, -560.7704, 39.4947>>, <<-254.7373, -602.8020, 40.9296>>, PEDMOVE_RUN, FALSE, 0.5, 1.0, TRUE,
|
|
ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
IF f_dist_to_destination > 4.0
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-254.7373, -602.8020, 40.9296>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
|
|
ENDIF
|
|
|
|
TASK_AIM_GUN_AT_COORD(NULL, <<-254.7373, -602.8020, 40.9296>>, -1)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Play some "let's go" dialogue while running to the next destination.
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGO8]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(v_ped_pos, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO8] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO8] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue when the cops arrive.
|
|
IF NOT b_has_text_label_triggered[BS2B_RIGHTRAMP]
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_before_garage_blockade[0])
|
|
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_before_garage_blockade[0])
|
|
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_before_garage_blockade[0]) > 5000.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RIGHTM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_RIGHTRAMP] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RIGHTF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_RIGHTRAMP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (i_closest_node_to_buddy - i_closest_node_to_player < 5 AND f_dist_to_destination < 16.0)
|
|
AND v_player_pos.z < 45.0
|
|
s_michael.v_dest = <<-209.6340, -597.2145, 39.4953>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ELSE
|
|
//Play some "stick together" dialogue if the player runs off.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 400.0
|
|
AND f_dist_from_player < 4900.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 59 //Push to the top of the ramp, wait for the player to arrive.
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-236.2467, -565.2051, 38.0008>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Fire at the cop cars.
|
|
IF f_dist_to_destination > 16.0
|
|
AND NOT b_is_in_combat
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_garage_blockade) > 0
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], <<-236.2467, -565.2051, 38.0008>>)
|
|
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], <<-236.2467, -565.2051, 38.0008>>)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some general chat here.
|
|
IF NOT b_has_text_label_triggered[BS2B_SCHAT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
If GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_SCHAT1", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_SCHAT] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_SCHAT2", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_SCHAT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF f_dist_to_destination < 64.0
|
|
//Play some dialogue telling the player to go down the ramp
|
|
IF NOT b_has_text_label_triggered[BS2B_DRAMP]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DRAMPM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DRAMP] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DRAMPF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DRAMP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Continue once the buddy reaches the area and a certain amount of enemies are dead.
|
|
IF f_dist_to_destination < 16.0
|
|
BOOL b_player_went_down_other_side
|
|
b_player_went_down_other_side = IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-230.208069,-574.921448,35.299747>>,<<28.750000,3.000000,2.500000>>)
|
|
|
|
IF (i_closest_node_to_buddy - i_closest_node_to_player < 3 AND (f_dist_from_player < 64.0 OR i_closest_node_to_buddy - i_closest_node_to_player < 0))
|
|
OR b_player_went_down_other_side
|
|
IF (i_closest_node_to_buddy - i_closest_node_to_player < 0 AND v_player_pos.z < 40.5)
|
|
OR b_player_went_down_other_side
|
|
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-204.007278,-597.495117,42.238064>>, <<-211.373444,-594.653809,38.937641>>, 5.500000)
|
|
AND IS_ENTITY_ON_SCREEN(s_selector_peds.pedID[e_current_buddy]))
|
|
s_michael.v_dest = <<-184.9264, -623.4516, 31.4281>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
b_played_wait_line = FALSE
|
|
i_wait_dialogue_timer = 0
|
|
b_buddy_is_going_to_car_park = TRUE
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = GET_GAME_TIMER()
|
|
s_michael.i_event++
|
|
ENDIF
|
|
ELSE
|
|
//Play some dialogue here if the player runs past the ramp without going down.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-207.951157,-601.452576,42.238064>>, <<-213.683884,-617.953308,39.386734>>, 4.750000)
|
|
IF NOT b_has_text_label_triggered[BS2B_WAITRAMP]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 4900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_WAITRAMP] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_WAITRAMP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some "stick together" dialogue if the player runs off.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 625.0
|
|
AND f_dist_from_player < 4900.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 60 //Run all the way to the car park, then fight the first van.
|
|
IF NOT s_michael.b_refresh_tasks
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_michael.b_is_using_secondary_cover
|
|
s_michael.v_dest = <<-184.9264, -623.4516, 31.4281>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 2.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_michael.v_dest = <<-175.7344, -615.4920, 31.4281>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 248.8329, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
s_michael.b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
b_player_stole_cover = TRUE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_dist_to_destination = VDIST2(v_ped_pos, s_michael.v_dest)
|
|
|
|
INT i_closest_node_to_ped, i_closest_node_to_dest_1, i_closest_node_to_dest_2, i_closest_node_to_dest_3
|
|
|
|
//Don't perform the early parts of the sequence if the ped has already gone past those points (e.g. if the player switched half-way through the path).
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_ped_pos, i_closest_node_to_ped)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-195.2280, -564.3157, 39.4934>>, i_closest_node_to_dest_1)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-210.8291, -596.9030, 39.4888>>, i_closest_node_to_dest_2)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, <<-217.0694, -624.0117, 32.4958>>, i_closest_node_to_dest_3)
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (f_dist_to_destination > 4.0 OR NOT b_is_in_combat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF f_dist_to_destination > 4.0
|
|
AND NOT b_player_stole_cover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF i_closest_node_to_ped < i_closest_node_to_dest_1
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-195.2280, -564.3157, 39.4934>>, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
|
|
ENDIF
|
|
|
|
IF i_closest_node_to_ped < i_closest_node_to_dest_2
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-210.8291, -596.9030, 39.4888>>, <<-217.2492, -614.3069, 40.8903>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
|
|
ENDIF
|
|
|
|
IF i_closest_node_to_ped < i_closest_node_to_dest_3
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-217.0694, -624.0117, 32.4958>>, <<-258.6456, -637.2813, 34.0890>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_michael.v_dest, <<-151.4, -649.4, 33.6759>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
//Shoot at the next batch of cop cars.
|
|
IF i_closest_node_to_ped < i_closest_node_to_dest_3 - 1
|
|
AND NOT b_is_in_combat
|
|
IF GET_GAME_TIMER() - s_michael.i_timer > 1000
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_garage_blockade_2) > 0
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], <<-258.6456, -637.2813, 34.0890>>)
|
|
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], <<-258.6456, -637.2813, 34.0890>>)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_car_park_1)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_selector_peds.pedID[e_current_buddy], <<-201.288651,-633.703491,30.983559>>, <<-184.850479,-640.012512,35.400841>>, 13.000000)
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_selector_peds.pedID[e_current_buddy])
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy], <<-158.3629, -647.3505, 32.9995>>)
|
|
SET_PED_SHOOTS_AT_COORD(s_selector_peds.pedID[e_current_buddy], <<-158.3629, -647.3505, 32.9995>>)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some "let's go" dialogue while running to the next destination.
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGO9]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOVEUP", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO9] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LETSGO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO9] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue indicating they should go to the car park.
|
|
IF NOT b_has_text_label_triggered[BS2B_CPARK]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 625.0
|
|
AND VDIST2(v_ped_pos, <<-220.7790, -624.0447, 32.4813>>) < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PARK", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_CPARK] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PARK", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_CPARK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue when arriving at the car park and the enemies show up.
|
|
IF NOT b_has_text_label_triggered[BS2B_CPARK2]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF s_cops_car_park_1[0].i_event > 0
|
|
OR IS_PED_INJURED(s_cops_car_park_1[0].ped)
|
|
IF v_ped_pos.x > -192.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CPARK2M", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_CPARK2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CPARK2F", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_CPARK2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some "stick together" dialogue if the player runs off.
|
|
IF NOT b_played_wait_line
|
|
AND f_dist_from_player > 900.0
|
|
AND f_dist_from_player < 4900.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF i_wait_dialogue_timer = 0
|
|
i_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_wait_dialogue_timer > 2000
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITM", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAITF", CONV_PRIORITY_MEDIUM)
|
|
b_played_wait_line = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_1) <= 1
|
|
IF s_michael.i_timer = 0
|
|
s_michael.i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_michael.i_timer > 2500
|
|
s_michael.v_dest = <<-164.9733, -623.7012, 31.4281>>
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_selector_peds.pedID[e_current_buddy], s_michael.v_dest, 3.0, TRUE)
|
|
|
|
s_michael.b_is_using_secondary_cover = FALSE
|
|
s_michael.b_refresh_tasks = TRUE
|
|
s_michael.i_timer = 0
|
|
s_michael.i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 61 //Fight the final enemies.
|
|
IF NOT b_has_text_label_triggered[BS2B_WAGON]
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_car_park_2)
|
|
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_car_park_2)
|
|
AND GET_TIME_POSITION_IN_RECORDING(veh_cops_car_park_2) > 3000.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND f_dist_from_player < 900.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAGONM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_WAGON] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_WAGONF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_WAGON] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_michael.b_refresh_tasks
|
|
OR (GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[e_current_buddy], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND NOT b_is_in_combat)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[e_current_buddy], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_AMMO_IN_CLIP(s_selector_peds.pedID[e_current_buddy], WEAPONTYPE_ADVANCEDRIFLE, 30)
|
|
|
|
s_michael.b_refresh_tasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF b_debug_show_crew_state
|
|
TEXT_LABEL str_index = ""
|
|
str_index += s_michael.i_event
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
DRAW_DEBUG_TEXT(str_index, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_selector_peds.pedID[e_current_buddy], <<0.0, 0.0, 2.0>>))
|
|
ENDIF
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_CREW_DURING_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
VECTOR v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
INT i_closest_node
|
|
//INT i
|
|
SEQUENCE_INDEX seq
|
|
|
|
INT i_closest_node_to_buddy = 0
|
|
INT i_closest_node_to_player = 0
|
|
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_shootout_route)
|
|
REQUEST_WAYPOINT_RECORDING(str_waypoint_crew_shootout)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_shootout_route)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_crew_shootout)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_crew_pos, i_closest_node_to_buddy)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_shootout_route, v_player_pos, i_closest_node_to_player)
|
|
ELSE
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_crew_pos, i_closest_node_to_buddy)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_player_pos, i_closest_node_to_player)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_RESET_FLAG(s_crew[CREW_MICHAEL_ID].ped, PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
SWITCH s_crew[CREW_MICHAEL_ID].i_event
|
|
CASE 0 //Leave bank, combat cops that are waiting outside.
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(str_waypoint_crew_shootout)
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-2.5532, -670.1262, 48.5509>>
|
|
|
|
IF IS_SCREEN_FADED_OUT() //The crew is already given tasks on a switch, so only do this on a skip
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 118.6997, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
IF VDIST2(v_crew_pos, s_crew[CREW_MICHAEL_ID].v_dest) > 4.0
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-74.5, -702.1, 50.0>>, PEDMOVE_RUN, FALSE, 1.0, 4.0)
|
|
ENDIF
|
|
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, s_crew[CREW_MICHAEL_ID].v_dest, 1000, FALSE, 0.0, FALSE, FALSE, s_crew[CREW_MICHAEL_ID].cover, TRUE)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF s_cops_start[0].b_is_created
|
|
AND IS_PED_INJURED(s_cops_start[0].ped)
|
|
AND IS_PED_INJURED(s_cops_start[1].ped)
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-30.6679, -683.2444, 48.5509>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
|
|
|
|
BOOL b_shoot_while_run
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) != 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) != 0
|
|
b_shoot_while_run = TRUE
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-74.5, -702.1, 50.0>>, PEDMOVE_RUN, b_shoot_while_run, 1.0, 4.0)
|
|
//TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-74.5, -702.1, 50.0>>, 1000)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Push a bit further once most of the enemies are dead.
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-30.6679, -683.2444, 48.5509>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 125.5623, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-29.0067, -677.4194, 48.5439>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 119.3390, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_CPUSH1]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(v_crew_pos, v_player_pos) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_PSH")
|
|
b_has_text_label_triggered[BS2B_CPUSH1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_cops_pillars[0].b_is_created
|
|
AND IS_PED_INJURED(s_cops_pillars[0].ped)
|
|
AND IS_PED_INJURED(s_cops_start[2].ped)
|
|
AND IS_PED_INJURED(s_cops_start[3].ped)
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-37.7259, -686.4499, 48.5495>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 118.4274, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
BOOL b_shoot_while_run
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) != 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) != 0
|
|
b_shoot_while_run = TRUE
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-74.5, -702.1, 50.0>>, PEDMOVE_RUN, b_shoot_while_run, 1.0, 4.0)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-74.5, -702.1, 50.0>>, 1000)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Run to the end of pillars section
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-37.7259, -686.4499, 48.5495>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 118.4274, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-36.4270, -680.7614, 48.5394>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 76.3381, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
/*IF NOT b_has_text_label_triggered[BS2B_CPUSH2]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(v_crew_pos, v_player_pos) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_PSH")
|
|
b_has_text_label_triggered[BS2B_CPUSH2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) = 0
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_crew_pos, i_closest_node)
|
|
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(s_crew[CREW_MICHAEL_ID].ped, str_waypoint_crew_shootout, i_closest_node + 2, EWAYPOINT_DEFAULT)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4 //Once the cops at the end of the walkway pop out, start fighting them.
|
|
IF NOT s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
WAYPOINT_PLAYBACK_START_AIMING_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-78.6, -702.2, 50.0>>, TRUE)
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_CPUSH3]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(v_crew_pos, v_player_pos) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_PSH")
|
|
b_has_text_label_triggered[BS2B_CPUSH3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_cops_pillars_end[0].i_event > 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars_end) = 0
|
|
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 2000
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-60.9122, -696.5268, 48.4733>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5 //Run down the stairs while aiming forwards
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars_end) = 0
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(str_waypoint_crew_shootout, v_crew_pos, i_closest_node)
|
|
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(s_crew[CREW_MICHAEL_ID].ped, str_waypoint_crew_shootout, i_closest_node + 2, EWAYPOINT_DEFAULT)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6 //When ped at bottom of stairs pops out, start shooting at him.
|
|
IF NOT s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
WAYPOINT_PLAYBACK_START_AIMING_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-113.2, -689.0, 44.3>>, TRUE)
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue for going down the stairs.
|
|
IF NOT b_has_text_label_triggered[BS2B_STAIRS]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF v_player_pos.z > 49.2 //Don't play if the player already went down the stairs.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-64.070358,-707.475342,51.801304>>, <<-80.975197,-701.118713,42.984421>>, 30.000000)
|
|
IF VDIST2(v_crew_pos, v_player_pos) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_STR")
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_STAIRS] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Once reaching the stairs progress to next task.
|
|
IF v_crew_pos.z < 48.5
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-92.8086, -698.7925, 43.2513>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 77.3724, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-132.2, -674.7, 41.6>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-132.2, -674.7, 41.6>>, 1000)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 7 //Once the player makes a move onto the bridge follow them on.
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-92.8086, -698.7925, 43.2513>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 77.3724, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-94.4246, -701.6109, 43.2255>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 60.9092, 2.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF b_player_got_to_bridge
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-94.3734, -684.6033, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[1].ped)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, s_crew[CREW_MICHAEL_ID].v_dest, s_cops_heli_bridge_2[1].ped, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
b_crew_have_reached_bridge = TRUE
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 8 //Once first two bridge guys are dead continue across the bridge.
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-94.3734, -684.6033, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-96.9391, -686.5752, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) < 4
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_start) = 0
|
|
IF IS_PED_INJURED(s_cops_bridge[0].ped)
|
|
AND IS_PED_INJURED(s_cops_bridge[1].ped)
|
|
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 600
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-104.8503, -680.8834, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
IF NOT IS_PED_INJURED(s_cops_heli_bridge_2[1].ped)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, s_crew[CREW_MICHAEL_ID].v_dest, s_cops_heli_bridge_2[1].ped, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
b_crew_have_reached_bridge = TRUE
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 9 //Once heli guy dies finish going across the bridge.
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-104.8503, -680.8834, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-100.7857, -687.0374, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 150.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
|
|
IF i_closest_node_to_buddy - i_closest_node_to_player < 5
|
|
OR s_cops_after_bridge[0].i_event > 0
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-115.2149, -676.9531, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<-129.8, -674.0, 40.0>>, 20.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 10 //Finish off the last bridge enemies then progress.
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-115.2149, -676.9531, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-115.8660, -680.0275, 39.5162>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 150.0)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-129.8, -674.0, 40.0>>, 20.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
|
|
IF i_closest_node_to_buddy - i_closest_node_to_player < 5
|
|
OR s_cops_after_bridge[0].i_event > 0
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-150.7710, -673.4553, 39.4888>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 68.1787, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-129.4, -675.5, 39.4888>>, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 1.0, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-173.89, -654.68, 33.69>>, PEDMOVE_RUN, FALSE, 0.5, 0.5)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-173.89, -654.68, 33.69>>, 1000)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<-172.55, -664.63, 40.0>>, 5.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
b_crew_member_crossed_bridge = TRUE
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 11 //Push forwards when one ramp enemy left
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-150.7710, -673.4553, 39.4888>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 68.1787, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-146.6174, -672.2836, 39.4997>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
|
|
AND VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 100.0
|
|
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 1400
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-213.0200, -647.9929, 39.4881>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-237.0136, -711.0485, 34.2278>>, PEDMOVE_SPRINT,
|
|
FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
i_crew_wait_dialogue_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 12 //Once the player reaches the stairs then keep moving.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-194.867493,-656.806824,39.488064>>, <<-167.274139,-665.861633,42.720985>>, 7.500000)
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_heli_ramp)
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, GET_ENTITY_COORDS(veh_cops_heli_ramp))
|
|
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, GET_ENTITY_COORDS(veh_cops_heli_ramp))
|
|
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
|
|
ENDIF
|
|
ELIF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_ramp_blockade) != 0
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, <<-232.8978, -694.9381, 36.0902>>)
|
|
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-232.8978, -694.9381, 36.0902>>)
|
|
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 100.0
|
|
IF s_michael.i_event >= 50
|
|
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 1200
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-192.6817, -647.4163, 47.6727>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 316.5104, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-194.1727, -655.5215, 47.2264>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, TRUE, 0.5, 1.0)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-154.0717, -549.3301, 48.7064>>, 1000)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
s_crew[CREW_MICHAEL_ID].i_event = 50
|
|
ENDIF
|
|
ELSE
|
|
//Play some dialogue if the crew are waiting on the player.
|
|
IF NOT b_has_text_label_triggered[BS2B_COM1]
|
|
IF i_crew_wait_dialogue_timer = 0
|
|
i_crew_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_crew_wait_dialogue_timer > 12000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(v_crew_pos, v_player_pos) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COM")
|
|
b_has_text_label_triggered[BS2B_COM1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50 //Fight the first business centre enemies, once they're dead push forwards.
|
|
//Change the crew member's cover point if the player steals their default one.
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
OR s_crew[CREW_MICHAEL_ID].b_refresh_tasks
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-192.6817, -647.4163, 47.6727>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 316.5104, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-215.1918, -639.5822, 47.2214>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 343.7635, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = FALSE
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1
|
|
AND v_crew_pos.z > 47.0
|
|
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-177.7119, -604.4832, 47.2191>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 3.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
//TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
//TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-169.3, -610.2, 49.0>>, PEDMOVE_SPRINT, TRUE,
|
|
// 0.5, 1.0, TRUE, ENAV_DEFAULT, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 51 //Fight the rest of the business centre enemies, then push to the end.
|
|
//Progress once all the enemies are dead.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_1b) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_heli) <= 1
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-170.5575, -592.5718, 47.2322>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 348.7640, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-154.0717, -549.3301, 48.7064>>, 1000)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 52 //Fight the second wave of enemies at the business centre, once dead push forwards.
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-170.7304, -592.4411, 47.2220>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 343.8275, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-167.0552, -592.7778, 47.2284>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_2) = 0
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-159.9476, -561.1776, 47.2208>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 12.9, 3.0,
|
|
COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-154.0717, -549.3301, 48.7064>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 53 //Have the ped dive for cover once the merryweather chopper show up.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) != 0
|
|
IF b_merry_heli_is_active
|
|
AND IS_ENTITY_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-164.167935,-584.824866,45.725426>>, <<-154.954956,-559.742920,51.469128>>, 21.500000)
|
|
BOOL b_shoot
|
|
b_shoot = (GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) != 0)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-154.0717, -549.3301, 51.7064>>, PEDMOVE_SPRINT, b_shoot, 2.0, 2.0, TRUE, ENAV_NO_STOPPING)
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, PEDMOVE_SPRINT, DEFAULT, 2.0, ENAV_NO_STOPPING)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, s_crew[CREW_MICHAEL_ID].v_dest, 1000, FALSE, 0.0, FALSE, FALSE, s_crew[CREW_MICHAEL_ID].cover, TRUE)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 54 //Fight the Merryweather chopper, once dead continue down the stairs.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_merry_heli) = 0
|
|
IF (i_closest_node_to_buddy - i_closest_node_to_player < 8 AND VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 16.0)
|
|
OR s_cops_after_courtyard[0].i_event > 0
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-158.399490,-557.349121,44.969173>>, <<-156.922089,-565.438049,51.718651>>, 15.250000)
|
|
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-144.1131, -553.1654, 39.4983>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-146.4362, -556.7252, 40.9678>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_NO_STOPPING)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_COVER(s_crew[CREW_MICHAEL_ID].ped)
|
|
AND NOT IS_PED_GOING_INTO_COVER(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_SEEK_COVER_TO_COORDS) != PERFORMING_TASK
|
|
TASK_SEEK_COVER_TO_COORDS(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, <<-166.8, -518.0, 52.7>>, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 55 //Fight the enemies at the bottom of the stairs, once done start running to the car park.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_courtyard) = 0
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-195.2280, -564.3157, 39.4934>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-142.6308, -553.0471, 39.4983>>, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-214.2396, -558.9496, 40.5242>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 56 //When the next group of enemies pop out switch to combat.
|
|
IF s_cops_before_car_park[0].i_event > 0
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) != 0
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-169.6723, -557.6520, 39.4983>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 57 //Once the enemies are dead continue running to the car park.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) <= 0
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-190.6681, -561.5054, 39.4977>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-254.7373, -602.8020, 40.9296>>, PEDMOVE_SPRINT, FALSE,
|
|
0.5, 1.0, TRUE, ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
|
|
TASK_AIM_GUN_AT_COORD(NULL, <<-254.7373, -602.8020, 40.9296>>, -1)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
i_crew_wait_dialogue_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 58 // Wait at the corner for the player.
|
|
IF (i_closest_node_to_buddy - i_closest_node_to_player < 5 AND VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 16.0)
|
|
AND v_player_pos.z < 45.0
|
|
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-210.4501, -593.2936, 39.5092>>
|
|
REMOVE_COVER_POINT(s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 2.0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-240.9469, -573.4080, 38.2711>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE,
|
|
ENAV_NO_STOPPING | ENAV_DONT_AVOID_OBJECTS)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
i_crew_wait_dialogue_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ELSE
|
|
//Play some dialogue if the crew are waiting on the player.
|
|
IF NOT b_has_text_label_triggered[BS2B_COM2]
|
|
IF i_crew_wait_dialogue_timer = 0
|
|
i_crew_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_crew_wait_dialogue_timer > 12000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(v_crew_pos, v_player_pos) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COM")
|
|
b_has_text_label_triggered[BS2B_COM2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 59 //Once the player reaches the ramp progress.
|
|
IF VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) > 16.0
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_garage_blockade) > 0
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, <<-240.9469, -573.4080, 38.2711>>)
|
|
IF s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
|
|
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-240.9469, -573.4080, 38.2711>>)
|
|
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VDIST2(s_crew[CREW_MICHAEL_ID].v_dest, v_crew_pos) < 100.0
|
|
IF b_buddy_is_going_to_car_park
|
|
IF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 10000 //Timer may have already been set above, so check that the difference isn't large.
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 700
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-181.7385, -631.7137, 31.4281>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 254.9355, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-217.6269, -623.7309, 32.4973>>, <<-246.0434, -647.4365, 33.9782>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, s_crew[CREW_MICHAEL_ID].v_dest, <<-151.4, -649.4, 33.6759>>, PEDMOVE_SPRINT, FALSE, 0.5, 1.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_SEEK_COVER_TO_COVER_POINT(NULL, s_crew[CREW_MICHAEL_ID].cover, <<-151.4, -649.4, 33.6759>>, 1000)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_MICHAEL_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_waypoint_aiming = FALSE
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = GET_GAME_TIMER()
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
ELSE
|
|
//Play some dialogue if the crew are waiting on the player.
|
|
IF NOT b_has_text_label_triggered[BS2B_COM3]
|
|
IF i_crew_wait_dialogue_timer = 0
|
|
i_crew_wait_dialogue_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_crew_wait_dialogue_timer > 12000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(v_crew_pos, v_player_pos) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COM")
|
|
b_has_text_label_triggered[BS2B_COM3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 60 //Fight the first van in the car park, then push forward to the next one.
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-181.7385, -631.7137, 31.4281>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 254.9355, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-185.2314, -641.2884, 31.3864>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 245.8032, 2.0,
|
|
COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
//Shoot at nearby cops
|
|
IF v_crew_pos.z > 35.0
|
|
AND GET_GAME_TIMER() - s_crew[CREW_MICHAEL_ID].i_timer > 1200
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_garage_blockade_2) > 0
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, <<-246.0434, -647.4365, 33.9782>>)
|
|
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-246.0434, -647.4365, 33.9782>>)
|
|
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_car_park_1)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_crew[CREW_MICHAEL_ID].ped, <<-201.288651,-633.703491,30.983559>>, <<-184.850479,-640.012512,35.400841>>, 13.000000)
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
AND NOT IS_PED_BLOCKING_TARGET(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped, <<-158.3629, -647.3505, 32.9995>>)
|
|
SET_PED_SHOOTS_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-158.3629, -647.3505, 32.9995>>)
|
|
SET_AMMO_IN_CLIP(s_crew[CREW_MICHAEL_ID].ped, WEAPONTYPE_CARBINERIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_1) = 0
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-175.3369, -616.4162, 31.4281>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 6.8686 , 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_timer = 0
|
|
s_crew[CREW_MICHAEL_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 61 //Fight the second van, once dead take cover.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_3) != 0
|
|
IF IS_PLAYER_STEALING_PEDS_DESTINATION(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 5.0, 2.0, FALSE, FALSE)
|
|
IF s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-175.3369, -616.4162, 31.4281>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 6.8686 , 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = FALSE
|
|
ELSE
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-166.4209, -623.2525, 31.4281>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].v_dest, 4.0, TRUE)
|
|
|
|
s_crew[CREW_MICHAEL_ID].b_is_using_secondary_cover = TRUE
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Have some special stuff happen if the good gunman was picked to protect Michael.
|
|
IF NOT b_picked_good_michael_gunman
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF b_debug_show_crew_state
|
|
TEXT_LABEL str_index = ""
|
|
str_index += s_crew[CREW_MICHAEL_ID].i_event
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
DRAW_DEBUG_TEXT(str_index, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_crew[CREW_MICHAEL_ID].ped, <<0.0, 0.0, 2.0>>))
|
|
ENDIF
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
PROC MANAGE_VAN_CHASE_SWITCHING()
|
|
SWITCH i_switch_stage
|
|
CASE 0
|
|
IF UPDATE_SELECTOR_HUD(s_selector_peds)
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
|
|
|
|
CLEAR_HELP()
|
|
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
|
|
|
|
DESTROY_ALL_CAMS()
|
|
s_selector_cam.camID = CREATE_CAM("DEFAULT_SPLINE_CAMERA", FALSE)
|
|
SET_CAM_SPLINE_SMOOTHING_STYLE(s_selector_cam.camID, CAM_SPLINE_SLOW_IN_OUT_SMOOTH)
|
|
|
|
s_selector_cam.camInterpIDs[0] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
VECTOR v_start_pos
|
|
v_start_pos = GET_FINAL_RENDERED_CAM_COORD() + (GET_ENTITY_VELOCITY(veh_chase_van) * GET_FRAME_TIME())
|
|
ATTACH_CAM_TO_ENTITY(s_selector_cam.camInterpIDs[0], veh_chase_van, GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_chase_van, v_start_pos))
|
|
SET_CAM_ROT(s_selector_cam.camInterpIDs[0], GET_FINAL_RENDERED_CAM_ROT())
|
|
SET_CAM_FOV(s_selector_cam.camInterpIDs[0], GET_FINAL_RENDERED_CAM_FOV())
|
|
s_selector_cam.camInterpIDs[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
ATTACH_CAM_TO_ENTITY(s_selector_cam.camInterpIDs[1], veh_chase_van, <<-0.0244, 5.2763, 2.0373>>)
|
|
POINT_CAM_AT_ENTITY(s_selector_cam.camInterpIDs[1], veh_chase_van, <<-0.1910, 2.3076, 1.6382>>)
|
|
SET_CAM_FOV(s_selector_cam.camInterpIDs[1], 50.0319)
|
|
|
|
ADD_CAM_SPLINE_NODE_USING_CAMERA(s_selector_cam.camID, s_selector_cam.camInterpIDs[0], 0)
|
|
ADD_CAM_SPLINE_NODE_USING_CAMERA(s_selector_cam.camID, s_selector_cam.camInterpIDs[1], 1000)
|
|
ADD_CAM_SPLINE_NODE_USING_GAMEPLAY_FRAME(s_selector_cam.camID, 1000)
|
|
|
|
s_selector_cam.bSplineCreated = TRUE
|
|
|
|
i_switch_stage++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
//NOTE: setting the rotation outside of the -360.0 - 360.0 range tells the proc to not modify it (this is what we want).
|
|
IF NOT RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(s_selector_cam, 1000.0, 1000.0, SELECTOR_CAM_STRAIGHT_INTERP, 0)
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE)
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed])
|
|
SET_PED_CAN_BE_TARGETTED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_DIES_WHEN_INJURED(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_AI(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, v_zero)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_MAX_HEALTH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 1800)
|
|
SET_ENTITY_HEALTH(s_selector_peds.pedID[s_selector_peds.ePreviousSelectorPed], 1800)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
i_switch_stage = 0
|
|
ENDIF
|
|
ELSE
|
|
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(s_selector_cam.pedTo)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC UPDATE_PLAYER_TUNNEL_SHOOTOUT_DIALOGUE()
|
|
IF GET_GAME_TIMER() - i_player_combat_dialogue_timer > 0
|
|
AND IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_FFIGHT", CONV_PRIORITY_MEDIUM)
|
|
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_PLAYER_DEFEND_CREW_DIALOGUE()
|
|
IF GET_GAME_TIMER() - i_player_combat_dialogue_timer > 0
|
|
AND IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TUNNEL1", CONV_PRIORITY_MEDIUM)
|
|
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
INT i_crew_dialogue_timer = 0
|
|
|
|
PROC UPDATE_BUDDY_SHOOTOUT_DIALOGUE(VECTOR v_player_pos, BOOL b_ignore_buddy = FALSE)
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF GET_GAME_TIMER() - i_combat_dialogue_wait_time > 0
|
|
//Player dialogue
|
|
IF GET_GAME_TIMER() - i_player_combat_dialogue_timer > 0
|
|
AND IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
AND (VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0 OR b_ignore_buddy)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CGEN", CONV_PRIORITY_MEDIUM)
|
|
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ELSE
|
|
//If the player is Michael and hasn't reached Franklin yet then there are some specific lines to play.
|
|
IF NOT IS_ENTITY_VISIBLE(s_selector_peds.pedID[e_current_buddy])
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_SHOUT", CONV_PRIORITY_MEDIUM)
|
|
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CGENM", CONV_PRIORITY_MEDIUM)
|
|
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Buddy dialogue
|
|
IF GET_GAME_TIMER() - i_buddy_combat_dialogue_timer > 0
|
|
AND b_has_text_label_triggered[BS2B_FRANARR] //Don't start checking until Franklin's arrival line has played.
|
|
IF IS_ENTITY_VISIBLE(s_selector_peds.pedID[e_current_buddy])
|
|
IF (IS_PED_IN_COMBAT(s_selector_peds.pedID[e_current_buddy]) OR IS_PED_SHOOTING(s_selector_peds.pedID[e_current_buddy]))
|
|
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CGENM", CONV_PRIORITY_MEDIUM)
|
|
i_buddy_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CGEN", CONV_PRIORITY_MEDIUM)
|
|
i_buddy_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Add a small delay so that peds don't start shouting if they trigger combat for a single frame.
|
|
i_buddy_combat_dialogue_timer = GET_GAME_TIMER() + 250
|
|
ENDIF
|
|
ELSE
|
|
//If the buddy hasn't joined the fight yet then keep the timer updated.
|
|
i_buddy_combat_dialogue_timer = GET_GAME_TIMER() + 10000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Crew member dialogue.
|
|
IF GET_GAME_TIMER() - i_crew_dialogue_timer > 0
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF (IS_PED_IN_COMBAT(s_crew[CREW_MICHAEL_ID].ped) OR IS_PED_SHOOTING(s_crew[CREW_MICHAEL_ID].ped))
|
|
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)) < 400.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_ATT")
|
|
i_crew_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(18000, 23000)
|
|
i_combat_dialogue_wait_time = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Add a small delay so that peds don't start shouting if they trigger combat for a single frame.
|
|
i_crew_dialogue_timer = GET_GAME_TIMER() + 250
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Some specific lines:
|
|
//Play a "more cops" line when the guys at the end of the bridge show up.
|
|
IF NOT b_has_text_label_triggered[BS2B_MORE1]
|
|
IF s_cops_bridge_2[0].b_is_created
|
|
IF s_cops_bridge_2[0].i_event > 0
|
|
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer > 2000
|
|
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer < 7000
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) > 0
|
|
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MORE1] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MORE1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[BS2B_MORE1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
i_more_cops_dialogue_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a "more cops" line when the guys at the other end of the plaza show up.
|
|
IF NOT b_has_text_label_triggered[BS2B_MORE2]
|
|
IF s_cops_courtyard_2[0].b_is_created
|
|
IF s_cops_courtyard_2[0].i_event > 0
|
|
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer > 2000
|
|
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer < 5000
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_2) > 0
|
|
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MORE2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MORE2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[BS2B_MORE2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
i_more_cops_dialogue_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a "more cops" line when the guys before the car park show up.
|
|
IF NOT b_has_text_label_triggered[BS2B_MORE3]
|
|
IF s_cops_before_car_park[0].b_is_created
|
|
IF s_cops_before_car_park[0].i_event > 0
|
|
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer > 2000
|
|
IF GET_GAME_TIMER() - i_more_cops_dialogue_timer < 7000
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) > 0
|
|
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])) < 400.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MORE3] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MOREF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MORE3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[BS2B_MORE3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
i_more_cops_dialogue_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MISSION_FAILED(FAILED_REASON reason)
|
|
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
|
|
IF NOT b_mission_failed
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
KILL_ANY_CONVERSATION()
|
|
|
|
Store_Fail_Weapon(PLAYER_PED_ID(), ENUM_TO_INT(GET_PLAYER_PED_ENUM(PLAYER_PED_ID())))
|
|
|
|
IF reason = FAILED_ALERTED_BANK
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
TASK_SMART_FLEE_PED(s_crew[CREW_MICHAEL_ID].ped, PLAYER_PED_ID(), 200.0, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Make sure the trolleys are detached from the crew member on a fail.
|
|
IF e_mission_stage = STAGE_COLLECT_GOLD
|
|
IF DOES_ENTITY_EXIST(obj_gold_trolleys[0])
|
|
AND DOES_ENTITY_EXIST(obj_gold_containers[0])
|
|
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
|
|
DETACH_ENTITY(obj_gold_trolleys[0], TRUE, FALSE)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[0], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(obj_gold_trolleys[1])
|
|
AND DOES_ENTITY_EXIST(obj_gold_containers[1])
|
|
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
|
|
SET_ENTITY_COLLISION(obj_gold_containers[1], TRUE)
|
|
DETACH_ENTITY(obj_gold_trolleys[1], TRUE, FALSE)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[1], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If Trevor's chopper is playing a recording then make sure it stops if appropriate.
|
|
IF reason = FAILED_DESTROYED_CHOPPER
|
|
OR reason = FAILED_CREW_MEMBER_DIED
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
SET_VEHICLE_OUT_OF_CONTROL(s_gold_choppers[1].veh, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH reason
|
|
CASE FAILED_GENERIC
|
|
str_fail_label = ""
|
|
BREAK
|
|
|
|
CASE FAILED_ALERTED_BANK
|
|
str_fail_label = "F3B_BANKALERT"
|
|
BREAK
|
|
|
|
CASE FAILED_CREW_MEMBER_DIED
|
|
str_fail_label = "F3B_CREWDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_CREW_MEMBERS_DIED
|
|
str_fail_label = "F3B_CREWDEAD2"
|
|
BREAK
|
|
|
|
CASE FAILED_DESTROYED_CHOPPER
|
|
str_fail_label = "F3B_HELIDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_DESTROYED_FRANKLINS_CAR
|
|
str_fail_label = "F3B_FCARDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_DESTROYED_START_CAR
|
|
str_fail_label = "F3B_CARDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_DESTROYED_END_CAR
|
|
str_fail_label = "F3B_CARDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_DESTROYED_TREVORS_CAR
|
|
str_fail_label = "F3B_TCARDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_FRANKLIN_DIED
|
|
str_fail_label = "F3B_FRANDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_LEFT_CHOPPER_BEHIND
|
|
str_fail_label = "F3B_LEFTHELI"
|
|
BREAK
|
|
|
|
CASE FAILED_LOST_CREW_MEMBER
|
|
str_fail_label = "F3B_CREWLOST"
|
|
BREAK
|
|
|
|
CASE FAILED_LOST_CREW_MEMBERS
|
|
str_fail_label = "F3B_CREWLOST2"
|
|
BREAK
|
|
|
|
CASE FAILED_MICHAEL_DIED
|
|
str_fail_label = "F3B_MICHDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_RAN_OUT_OF_CHARGES
|
|
str_fail_label = "F3B_CHARGEGONE"
|
|
BREAK
|
|
|
|
CASE FAILED_STUCK_CHOPPER
|
|
str_fail_label = "F3B_HELISTUCK"
|
|
BREAK
|
|
|
|
CASE FAILED_STUCK_START_CAR
|
|
str_fail_label = "F3B_CARSTUCK"
|
|
BREAK
|
|
|
|
CASE FAILED_STUCK_CUTTER
|
|
str_fail_label = "F3B_CUTSTUCK"
|
|
BREAK
|
|
|
|
CASE FAILED_TREVOR_DIED
|
|
str_fail_label = "F3B_TREVDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_ABANDONED_CREW_IN_TUNNELS
|
|
str_fail_label = "F3B_FABANCREW"
|
|
BREAK
|
|
|
|
CASE FAILED_ABANDONED_CREW_IN_SHOOTOUT
|
|
str_fail_label = "F3B_FABANCREW"
|
|
BREAK
|
|
|
|
CASE FAILED_ABANDONED_CREW_IN_CHASE
|
|
str_fail_label = "F3B_FABANCREW"
|
|
BREAK
|
|
|
|
CASE FAILED_ABANDONED_HEIST
|
|
str_fail_label = "F3B_FABANHEIST"
|
|
BREAK
|
|
|
|
CASE FAILED_BAILED_OUT_OF_CHOPPER
|
|
str_fail_label = "F3B_BAILFAIL"
|
|
BREAK
|
|
|
|
CASE FAILED_LESTER_DIED
|
|
str_fail_label = "F3B_LESTDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_ABANDONED_LESTER
|
|
str_fail_label = "F3B_LESTLOST"
|
|
BREAK
|
|
|
|
CASE FAILED_CUTTER_BLOCKING_TUNNEL
|
|
str_fail_label = "F3B_CUTBLOCK"
|
|
BREAK
|
|
|
|
CASE FAILED_TROLLEY_DETACHED
|
|
str_fail_label = "F3B_DETACHFAIL"
|
|
BREAK
|
|
|
|
CASE FAILED_DIDNT_KILL_MERRYWEATHER
|
|
str_fail_label = "F3B_MERRYFAIL"
|
|
BREAK
|
|
|
|
CASE FAILED_MISSED_TRAIN
|
|
str_fail_label = "F3B_TRAINFAIL"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
b_mission_failed = TRUE
|
|
ENDIF
|
|
|
|
REMOVE_ALL_BLIPS()
|
|
TRIGGER_MUSIC_EVENT("FH2B_MISSION_FAIL")
|
|
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON(str_fail_label)
|
|
|
|
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
|
IF e_mission_stage < STAGE_LEAVE_BANK
|
|
UPDATE_CUTTER_SPINNING()
|
|
ENDIF
|
|
|
|
//Maintain anything that could look weird during fade out (e.g. enemies walking off).
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
UPDATE_SHOOTOUT_COPS()
|
|
ENDIF
|
|
|
|
//1496283 - Lester must be deleted before the restricted helicopter.
|
|
IF IS_SCREEN_FADED_OUT()
|
|
REMOVE_OBJECT(obj_lesters_rpg, TRUE)
|
|
REMOVE_OBJECT(obj_single_rocket, TRUE)
|
|
REMOVE_PED(s_lester.ped, TRUE)
|
|
|
|
i_lester_rocket_sync_scene = -1
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
//Deal with group members and same vehicle cleanup.
|
|
FORCE_DELETE_PED_FOR_FAIL(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
FORCE_DELETE_PED_FOR_FAIL(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
FORCE_DELETE_PED_FOR_FAIL(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
FORCE_DELETE_PED_FOR_FAIL(s_crew[CREW_DRIVER_ID].ped)
|
|
FORCE_DELETE_PED_FOR_FAIL(s_crew[CREW_FRANKLIN_ID].ped)
|
|
FORCE_DELETE_PED_FOR_FAIL(s_crew[CREW_MICHAEL_ID].ped)
|
|
FORCE_DELETE_PED_FOR_FAIL(s_lester.ped)
|
|
|
|
//Remove balaclava and gloves from the player.
|
|
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_SPECIAL, SPECIAL_P0_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_DECL, DECL_P0_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_HAND, HAND_P0_NONE, FALSE)
|
|
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_SPECIAL, SPECIAL_P1_DUMMY, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_DECL, DECL_P1_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_NONE, FALSE)
|
|
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_HAND, HAND_P2_NONE, FALSE)
|
|
ENDIF
|
|
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, b_has_changed_clothes_michael)
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, b_has_changed_clothes_franklin)
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR, b_has_changed_clothes_trevor)
|
|
|
|
IF (e_mission_stage >= STAGE_DRILL_THROUGH_WALL AND e_mission_stage <= STAGE_LEAVE_BANK)
|
|
OR e_mission_stage = STAGE_CHOPPER_CHASE
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<70.1244, -618.3326, 30.6703>>, 123.7843)
|
|
|
|
//2229928 - If the player failed near the bank then force reset the interiors while the screen is faded.
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_NORMAL, FALSE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_NORMAL, FALSE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_NORMAL, FALSE)
|
|
b_were_ipls_reset_early = TRUE
|
|
ELIF (e_mission_stage = STAGE_DROP_GOLD_ON_TRAIN OR e_mission_stage = STAGE_LAND_AT_AIRFIELD)
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<2088.3970, 2604.4448, 52.1730>>, 0.8348)
|
|
ENDIF
|
|
|
|
IF b_vehicle_gen_set_to_unavailable
|
|
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MISSION_VEH_FBI4_PREP, TRUE)
|
|
b_vehicle_gen_set_to_unavailable = FALSE
|
|
ENDIF
|
|
|
|
// check if we need to respawn the player in a different position,
|
|
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
|
|
//MISSION_FLOW_SET_FAIL_WARP_LOCATION(<< 144.2238, -1311.4945, 28.0306 >>, 53.4660)
|
|
//SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<< 145.1657, -1304.0176, 28.0517 >>, 118.8119)
|
|
|
|
MISSION_CLEANUP()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//=======================================
|
|
// CUSTOM SWITCH CAM STUFFS
|
|
//=======================================
|
|
ENUM BIGSCORE2B_SWITCH_CAM_STATE
|
|
SWITCH_CAM_IDLE,
|
|
SWITCH_CAM_START_SPLINE1,
|
|
SWITCH_CAM_PLAYING_SPLINE1,
|
|
SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
ENDENUM
|
|
BIGSCORE2B_SWITCH_CAM_STATE eSwitchCamState = SWITCH_CAM_IDLE
|
|
|
|
SWITCH_CAM_STRUCT scsSwitchCamMichaelToFranklin
|
|
|
|
INT iSyncSceneCustomSwitch
|
|
|
|
FLOAT fSyncSceneCustomSwitchPhase = 0.15
|
|
FLOAT fMichaelCrewConvoStartPhase = 0.300
|
|
|
|
FLOAT fWooshStartPhase = 0.732713
|
|
FLOAT fWooshStopPhase = 0.866397
|
|
FLOAT fSwitchSceneFX1StartPhase = 0.732713
|
|
FLOAT fSwitchSceneFX2StartPhase = 0.764283
|
|
|
|
INT iWooshSoundID = -1
|
|
|
|
BOOL bCrewMemberWalkToCar = FALSE
|
|
BOOL bWooshStarted = FALSE
|
|
BOOL bWooshStopped = FALSE
|
|
BOOL bSwitchSceneFX1Started = FALSE
|
|
BOOL bSwitchSceneFX2Started = FALSE
|
|
BOOL bSwitchedToFranklin = FALSE
|
|
BOOL bCustomSwitchSRLRequested = FALSE
|
|
BOOL bSetSRLPostCutsceneCam = FALSE
|
|
|
|
STRING strCustomSwitchSRL = "fin_2b_customswitch"
|
|
FLOAT fSRLTime = -9999.0
|
|
|
|
/*#IF IS_DEBUG_BUILD
|
|
BOOL bWarpPlayerToSwitchLocation = FALSE
|
|
#ENDIF*/
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX viVeh1, VEHICLE_INDEX viVeh2)
|
|
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN")
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
//--- Start of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[0].iNodeTime = 0
|
|
thisSwitchCam.nodes[0].vNodePos = <<-2.0834, 0.9941, 0.9668>>
|
|
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[0].vNodeDir = <<0.1204, 0.2895, 0.8984>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].iNodeToClone = 0
|
|
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 0.2000
|
|
thisSwitchCam.nodes[0].iCamEaseType = 1
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 0.7000
|
|
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[0].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[0].bUseCustomDOF = TRUE
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 50.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.8000
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 2600
|
|
thisSwitchCam.nodes[1].vNodePos = <<-2.1614, 0.7546, 0.9048>>
|
|
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[1].vNodeDir = <<0.0425, 0.0507, 0.8354>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].iNodeToClone = 0
|
|
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 0.2000
|
|
thisSwitchCam.nodes[1].iCamEaseType = 0
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[1].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[1].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[1].bUseCustomDOF = TRUE
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 50.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.8000
|
|
|
|
thisSwitchCam.nodes[2].bIsCamCutNode = TRUE
|
|
|
|
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[3].iNodeTime = 0
|
|
thisSwitchCam.nodes[3].vNodePos = <<1.9790, 0.6067, 0.9139>>
|
|
thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[3].vNodeDir = <<-0.0404, 0.1328, 0.8930>>
|
|
thisSwitchCam.nodes[3].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[3].fNodeFOV = 35.0000
|
|
thisSwitchCam.nodes[3].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].iNodeToClone = 0
|
|
thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[3].fNodeCamShake = 0.2000
|
|
thisSwitchCam.nodes[3].iCamEaseType = 1
|
|
thisSwitchCam.nodes[3].fCamEaseScaler = 1.0000
|
|
thisSwitchCam.nodes[3].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[3].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[3].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[3].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[3].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[3].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[3].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[3].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[3].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[3].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[3].iHoldDuration = 0
|
|
thisSwitchCam.nodes[3].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[3].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_FarDOF = 50.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.8000
|
|
|
|
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[4].iNodeTime = 6400
|
|
thisSwitchCam.nodes[4].vNodePos = <<1.8804, 0.5757, 0.9129>>
|
|
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[4].vNodeDir = <<-0.0387, 0.1253, 0.8931>>
|
|
thisSwitchCam.nodes[4].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[4].fNodeFOV = 35.0000
|
|
thisSwitchCam.nodes[4].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].iNodeToClone = 0
|
|
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[4].fNodeCamShake = 0.2000
|
|
thisSwitchCam.nodes[4].iCamEaseType = 2
|
|
thisSwitchCam.nodes[4].fCamEaseScaler = 0.5
|
|
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[4].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[4].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[4].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[4].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[4].iHoldDuration = 0
|
|
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 50.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.8000
|
|
|
|
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[5].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[5].iNodeTime = 600
|
|
thisSwitchCam.nodes[5].vNodePos = <<1.8908, 0.5751, -0.0736>>
|
|
thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[5].vNodeDir = <<-0.0283, 0.1247, -0.0935>>
|
|
thisSwitchCam.nodes[5].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[5].fNodeFOV = 35.0000
|
|
thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].iNodeToClone = 0
|
|
thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[5].fNodeCamShake = 0.2000
|
|
thisSwitchCam.nodes[5].iCamEaseType = 0
|
|
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0
|
|
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[5].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[5].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[5].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[5].bFlashEnabled = TRUE
|
|
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelIn
|
|
thisSwitchCam.nodes[5].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[5].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[5].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[5].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[5].iHoldDuration = 0
|
|
thisSwitchCam.nodes[5].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[5].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[5].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_FarDOF = 50.0000
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 0.8000
|
|
|
|
thisSwitchCam.nodes[6].bIsCamCutNode = TRUE
|
|
|
|
thisSwitchCam.nodes[7].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[7].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[7].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[7].iNodeTime = 0
|
|
thisSwitchCam.nodes[7].vNodePos = <<-2.8515, 1.6151, 3.2973>> //<<-3.6654, 2.6977, 3.2973>>
|
|
thisSwitchCam.nodes[7].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[7].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[7].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[7].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[7].vNodeDir = <<-0.4965, -0.2387, 3.1747>> //<<-0.0146, -0.1552, 3.1747>>
|
|
thisSwitchCam.nodes[7].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[7].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[7].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[7].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[7].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[7].iNodeToClone = 0
|
|
thisSwitchCam.nodes[7].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[7].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[7].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[7].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[7].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[7].fNodeCamShake = 0.0
|
|
thisSwitchCam.nodes[7].iCamEaseType = 0
|
|
thisSwitchCam.nodes[7].fCamEaseScaler = 0.0
|
|
thisSwitchCam.nodes[7].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[7].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[7].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[7].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[7].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[7].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[7].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[7].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[7].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[7].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[7].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[7].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[7].iHoldDuration = 0
|
|
thisSwitchCam.nodes[7].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[7].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[7].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[7].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[7].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[7].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[8].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[8].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[8].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[8].iNodeTime = 400
|
|
thisSwitchCam.nodes[8].vNodePos = <<-2.8515, 1.6151, 1.2940>>
|
|
thisSwitchCam.nodes[8].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[8].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[8].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[8].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[8].vNodeDir = <<-0.4965, -0.2387, 1.2255>>
|
|
thisSwitchCam.nodes[8].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[8].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[8].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[8].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[8].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[8].iNodeToClone = 0
|
|
thisSwitchCam.nodes[8].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[8].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[8].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[8].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[8].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[8].fNodeCamShake = 0.0
|
|
thisSwitchCam.nodes[8].iCamEaseType = 1
|
|
thisSwitchCam.nodes[8].fCamEaseScaler = 0.5
|
|
thisSwitchCam.nodes[8].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[8].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[8].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[8].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[8].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[8].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[8].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[8].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[8].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[8].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[8].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[8].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[8].iHoldDuration = 0
|
|
thisSwitchCam.nodes[8].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[8].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[8].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[9].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[9].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[9].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[9].iNodeTime = 600
|
|
thisSwitchCam.nodes[9].vNodePos = <<-2.8515, 1.6151, 0.8940>> //<<-3.7233, 2.7130, 1.2147>>
|
|
thisSwitchCam.nodes[9].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[9].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[9].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[9].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[9].vNodeDir = <<-0.4965, -0.2387, 1.0255>> //<<-0.0726, -0.1398, 1.0920>>
|
|
thisSwitchCam.nodes[9].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[9].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[9].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[9].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[9].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[9].iNodeToClone = 0
|
|
thisSwitchCam.nodes[9].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[9].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[9].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[9].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[9].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[9].fNodeCamShake = 0.0
|
|
thisSwitchCam.nodes[9].iCamEaseType = 0
|
|
thisSwitchCam.nodes[9].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[9].fCamNodeVelocityScale = -0.7060
|
|
thisSwitchCam.nodes[9].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[9].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[9].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[9].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[9].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[9].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[9].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[9].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[9].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[9].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[9].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[9].iHoldDuration = 0
|
|
thisSwitchCam.nodes[9].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[9].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[9].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[10].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[10].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[10].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[10].iNodeTime = 1750
|
|
thisSwitchCam.nodes[10].vNodePos = <<-2.8515, 1.6151, 0.8940>> //<<-3.7233, 2.7130, 1.2147>>
|
|
thisSwitchCam.nodes[10].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[10].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[10].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[10].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[10].vNodeDir = <<-0.4965, -0.2387, 1.0255>> //<<-0.0726, -0.1398, 1.0920>>
|
|
thisSwitchCam.nodes[10].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[10].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[10].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[10].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[10].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[10].iNodeToClone = 0
|
|
thisSwitchCam.nodes[10].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[10].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[10].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[10].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[10].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[10].fNodeCamShake = 0.0
|
|
thisSwitchCam.nodes[10].iCamEaseType = 0
|
|
thisSwitchCam.nodes[10].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[10].fCamNodeVelocityScale = 0.5000
|
|
thisSwitchCam.nodes[10].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[10].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[10].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[10].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[10].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[10].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[10].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[10].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[10].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[10].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[10].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[10].iHoldDuration = 0
|
|
thisSwitchCam.nodes[10].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[10].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[10].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[10].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[10].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[10].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
|
|
|
|
thisSwitchCam.iNumNodes = 11
|
|
thisSwitchCam.iCamSwitchFocusNode = 6
|
|
thisSwitchCam.fSwitchSoundAudioStartPhase = -1.0000
|
|
thisSwitchCam.fSwitchSoundAudioEndPhase = -1.0000
|
|
thisSwitchCam.bSplineNoSmoothing = TRUE
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
|
|
thisSwitchCam.iGameplayNodeBlendDuration = 0
|
|
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
|
|
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_BigScore2B_MichaelToFranklin.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_BigScore2B_MichaelToFranklin.xml"
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.viVehicles[0] = viVeh1
|
|
thisSwitchCam.viVehicles[1] = viVeh2
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
//CDEBUG3LN(DEBUG_MISSION, "HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN")
|
|
|
|
//1991361 - HD interior is popping during the switch.
|
|
IF NOT IS_ENTITY_DEAD(veh_cutter)
|
|
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(veh_cutter)
|
|
ENDIF
|
|
|
|
INT iCurrentNode
|
|
FLOAT fCamPhase
|
|
|
|
SWITCH eSwitchCamState
|
|
|
|
CASE SWITCH_CAM_IDLE
|
|
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_START_SPLINE1
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_START_SPLINE1")
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(thisSwitchCam, s_start_car.veh, veh_cutter)
|
|
CREATE_SPLINE_CAM(thisSwitchCam)
|
|
|
|
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(s_start_car.veh)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
SET_ENTITY_HEADING(s_start_car.veh, 69.5421)
|
|
SET_ENTITY_COORDS(s_start_car.veh, <<-7.1097, -741.5182, 43.1419>>)
|
|
SET_VEHICLE_ENGINE_HEALTH(s_start_car.veh, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(s_start_car.veh, 1000.0)
|
|
|
|
CLEAR_AREA(<<-7.1097, -741.5182, 43.1419>>, 20.0, TRUE)
|
|
|
|
iSyncSceneCustomSwitch = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncSceneCustomSwitch, s_start_car.veh, GET_ENTITY_BONE_INDEX_BY_NAME(s_start_car.veh, "seat_dside_f"))
|
|
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncSceneCustomSwitch, str_anim_custom_switch, "michael_call_franklin", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
TASK_SYNCHRONIZED_SCENE(s_crew[CREW_MICHAEL_ID].ped, iSyncSceneCustomSwitch, str_anim_custom_switch, "michael_call_franklin_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCustomSwitch, fSyncSceneCustomSwitchPhase)
|
|
|
|
PLAY_ENTITY_ANIM(s_start_car.veh, "michael_call_franklin_cardoor", str_anim_custom_switch, INSTANT_BLEND_IN, FALSE, FALSE, DEFAULT, fSyncSceneCustomSwitchPhase)
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(s_crew[CREW_MICHAEL_ID].ped)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(s_start_car.veh)
|
|
ENDIF
|
|
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
|
|
|
|
BEGIN_SRL()
|
|
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
|
|
|
|
fSRLTime = -9999.0 //Just setting to large negative so first frame i actually set to zero in UPDATE_SRL_FRAME_TIME()
|
|
|
|
bWooshStarted = FALSE
|
|
bWooshStopped = FALSE
|
|
bSwitchSceneFX1Started = FALSE
|
|
bSwitchSceneFX2Started = FALSE
|
|
bSwitchedToFranklin = FALSE
|
|
bSetSRLPostCutsceneCam = FALSE
|
|
|
|
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
|
|
FALLTHRU
|
|
|
|
|
|
CASE SWITCH_CAM_PLAYING_SPLINE1
|
|
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
|
|
|
|
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
|
|
|
|
fSRLTime += (GET_FRAME_TIME() * 1000)
|
|
IF fSRLTime < 0.0
|
|
fSRLTime = 0.0
|
|
ENDIF
|
|
CDEBUG3LN(DEBUG_MISSION, "SRL Time = ", fSRLTime)
|
|
SET_SRL_TIME(fSRLTime)
|
|
|
|
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
|
|
|
|
iCurrentNode = iCurrentNode
|
|
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam)
|
|
fCamPhase = fCamPhase
|
|
fCamPhase = GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN: fCamPhase = ", fCamPhase, " iCurrentNode = ", iCurrentNode, "TIMERB = ", TIMERB())
|
|
#ENDIF
|
|
|
|
IF NOT bSetSRLPostCutsceneCam
|
|
IF iCurrentNode > 2
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_START(<<-4.6, -615.3, 18.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-1.4, 0.0, -143.5>>), 90.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
//SET_SRL_POST_CUTSCENE_CAMERA(<<-4.6, -615.3, 18.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-1.4, 0.0, -143.5>>))
|
|
//SET_SRL_POST_CUTSCENE_CAMERA(<<-4.6, -615.3, 18.1>>, <<-1.4, 0.0, -143.5>>)
|
|
ELSE
|
|
bSetSRLPostCutsceneCam = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(s_start_car.veh)
|
|
//Play a quick convo with the crew member.
|
|
IF NOT b_has_text_label_triggered[BS2B_MBANK]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
OR b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
|
|
FLOAT fSyncScenePhase
|
|
fSyncScenePhase = 0.0
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneCustomSwitch)
|
|
fSyncScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCustomSwitch)
|
|
ENDIF
|
|
|
|
IF fSyncScenePhase >= fMichaelCrewConvoStartPhase
|
|
IF b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
|
|
BEGIN_PRELOADED_CONVERSATION()
|
|
b_has_text_label_triggered[BS2B_MBANK] = TRUE
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MBANK", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MBANK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
|
|
KILL_FACE_TO_FACE_CONVERSATION() //In case the in-car convo from the previous section is still going.
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_BANK]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
CrewMember eCrewID
|
|
eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID)
|
|
|
|
TEXT_LABEL strLabel
|
|
INT iNumTimesGunmanHired
|
|
iNumTimesGunmanHired = GET_NUMBER_OF_TIMES_CREW_MEMBER_HIRED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_MICHAEL_ID))
|
|
|
|
IF iNumTimesGunmanHired > 0
|
|
OR eCrewID = CM_GUNMAN_G_KARL
|
|
strLabel = "BS2B_BANK"
|
|
ELSE
|
|
strLabel = "BS2B_BNK2"
|
|
ENDIF
|
|
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, strLabel)
|
|
b_has_text_label_triggered[BS2B_BANK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT bSwitchedToFranklin
|
|
IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
|
|
CDEBUG3LN(DEBUG_MISSION, "Switching to Franklin...")
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
FREEZE_ENTITY_POSITION(veh_cutter, FALSE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(veh_cutter)
|
|
SET_VEHICLE_DOORS_SHUT(veh_cutter)
|
|
SET_VEHICLE_FIXED(veh_cutter)
|
|
SET_VEHICLE_ENGINE_ON(veh_cutter, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
s_selector_peds.pedID[SELECTOR_PED_MICHAEL] = PLAYER_PED_ID()
|
|
SET_SELECTOR_PED_FAKE_STATE(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_STATE_AVAILABLE)
|
|
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_FRANKLIN)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, FALSE, TRUE)
|
|
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), str_anim_custom_switch2, "start_engine", SLOW_BLEND_IN, WALK_BLEND_OUT, -1, DEFAULT, 0.0) //"we_got_your_gear_franklin")
|
|
|
|
SHAKE_SCRIPT_GLOBAL("HAND_SHAKE", 1.0)
|
|
|
|
/*VECTOR vPostCamPos
|
|
VECTOR vPostCamDir
|
|
vPostCamPos = <<438.9, -1068.8, 31.1>>
|
|
vPostCamDir = <<-1.6, 0.0, 97.0>>
|
|
SET_SRL_POST_CUTSCENE_CAMERA(vPostCamPos, vPostCamDir)*/
|
|
|
|
bSwitchedToFranklin = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bSwitchedToFranklin
|
|
UPDATE_CUTTER_SPINNING()
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_BORE]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BORE", CONV_PRIORITY_MEDIUM)
|
|
SETTIMERB(0)
|
|
b_has_text_label_triggered[BS2B_BORE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSwitchSceneFX1Started
|
|
IF fCamPhase >= fSwitchSceneFX1StartPhase
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN: Triggering Hit_Out audio, TIMERB = ", TIMERB())
|
|
//ANIMPOSTFX_PLAY("SwitchShortMichaelIn", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bSwitchSceneFX1Started = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSwitchSceneFX2Started
|
|
IF fCamPhase >= fSwitchSceneFX2StartPhase
|
|
CDEBUG3LN(DEBUG_MISSION, "FX2 Started...")
|
|
ANIMPOSTFX_PLAY("SwitchShortFranklinMid", 0, FALSE)
|
|
bSwitchSceneFX2Started = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bWooshStarted
|
|
IF fCamPhase >= 0.749
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN: Triggering Short_Transition_Int audio, TIMERB = ", TIMERB())
|
|
|
|
PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bWooshStarted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Old version: remove when new sound is verified.
|
|
IF NOT bWooshStarted
|
|
IF fCamPhase >= fWooshStartPhase
|
|
//iWooshSoundID = GET_SOUND_ID()
|
|
//PLAY_SOUND_FRONTEND(iWooshSoundID, "In", "SHORT_PLAYER_SWITCH_SOUND_SET")
|
|
//bWooshStarted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bWooshStopped
|
|
IF fCamPhase >= fWooshStopPhase
|
|
//STOP_SOUND(iWooshSoundID)
|
|
bWooshStopped = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fCamPhase >= 1.0
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, FALSE)
|
|
DESTROY_CAM(thisSwitchCam.ciSpline)
|
|
ENDIF
|
|
DESTROY_ALL_CAMS()
|
|
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
IF iWooshSoundID != -1
|
|
STOP_SOUND(iWooshSoundID)
|
|
ENDIF
|
|
STOP_SCRIPT_GLOBAL_SHAKING(TRUE)
|
|
|
|
END_SRL()
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
|
|
|
|
eSwitchCamState = SWITCH_CAM_IDLE
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
/*#IF IS_DEBUG_BUILD
|
|
|
|
WIDGET_GROUP_ID widWidgetDebug
|
|
|
|
PROC CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS(WIDGET_GROUP_ID widParentGroup)
|
|
CDEBUG3LN(DEBUG_MISSION, "CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS")
|
|
|
|
SET_CURRENT_WIDGET_GROUP(widParentGroup)
|
|
START_WIDGET_GROUP("Custom Switch Cameras - Extra Tunables -")
|
|
ADD_WIDGET_BOOL("Warp Player to switch location", bWarpPlayerToSwitchLocation)
|
|
ADD_WIDGET_FLOAT_SLIDER("Michael and Crew Sync Scene Start Phase", fSyncSceneCustomSwitchPhase, 0.0, 1.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("Michael and Crew Start Convo Phase", fMichaelCrewConvoStartPhase, 0.0, 1.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("Woosh start phase", fWooshStartPhase, 0.0, 1.0, 0.001)
|
|
ADD_WIDGET_FLOAT_SLIDER("Woosh stop phase", fWooshStopPhase, 0.0, 1.0, 0.001)
|
|
STOP_WIDGET_GROUP()
|
|
CLEAR_CURRENT_WIDGET_GROUP(widParentGroup)
|
|
|
|
ENDPROC
|
|
|
|
PROC UPDATE_SPLINE_CAM_SCRIPT_SPECIFIC_WIDGETS()
|
|
//CDEBUG3LN(DEBUG_MISSION, "UPDATE_SPLINE_CAM_SCRIPT_SPECIFIC_WIDGETS")
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
|
|
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
|
|
OR IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
|
|
|
|
bWarpPlayerToSwitchLocation = TRUE
|
|
|
|
ENDIF
|
|
|
|
IF bWarpPlayerToSwitchLocation
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
IF DOES_ENTITY_EXIST(s_start_car.veh)
|
|
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_start_car.veh)
|
|
ENDIF
|
|
SET_ENTITY_COORDS(s_start_car.veh, <<6.6858, -749.8281, 43.1635>>)
|
|
SET_ENTITY_HEADING(s_start_car.veh, 71.4844)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bWarpPlayerToSwitchLocation = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
#ENDIF*/
|
|
|
|
PROC REQUEST_ASSETS_FOR_SWITCH_TO_CUTTER()
|
|
|
|
SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, TRUE)
|
|
SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(TRUE)
|
|
SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT(TRUE)
|
|
SETUP_REQ_TUNNEL_COVER_OBJECTS(TRUE)
|
|
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND(TRUE)
|
|
|
|
REQUEST_ANIM_DICT(str_anim_cutter)
|
|
REQUEST_ANIM_DICT(str_anim_ig_2)
|
|
REQUEST_ANIM_DICT(str_anim_custom_switch)
|
|
REQUEST_ANIM_DICT(str_anim_custom_switch2)
|
|
REQUEST_ANIM_DICT(str_anim_cam_shake)
|
|
|
|
IF NOT bCustomSwitchSRLRequested
|
|
PREFETCH_SRL(strCustomSwitchSRL)
|
|
SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
|
|
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_FORCE_OFF)
|
|
bCustomSwitchSRLRequested = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAVE_ASSETS_FOR_SWITCH_TO_CUTTER_LOADED()
|
|
|
|
IF SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, TRUE)
|
|
CDEBUG3LN(DEBUG_MISSION, "Cutter Setup.")
|
|
IF SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
CDEBUG3LN(DEBUG_MISSION, "Interior Setup.")
|
|
IF SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(TRUE)
|
|
CDEBUG3LN(DEBUG_MISSION, "Gold Containers Setup.")
|
|
IF SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT(TRUE)
|
|
CDEBUG3LN(DEBUG_MISSION, "Gold Trolleys Setup.")
|
|
IF SETUP_REQ_TUNNEL_COVER_OBJECTS(TRUE)
|
|
CDEBUG3LN(DEBUG_MISSION, "Tunnel Cover Objects Setup.")
|
|
IF SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND(TRUE)
|
|
CDEBUG3LN(DEBUG_MISSION, "One Crew Member Underground Setup.")
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_cutter)
|
|
CDEBUG3LN(DEBUG_MISSION, "Anim Cutter Anims Loaded.")
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_ig_2)
|
|
CDEBUG3LN(DEBUG_MISSION, "ig2 Anims Loaded.")
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_custom_switch)
|
|
CDEBUG3LN(DEBUG_MISSION, "Custom switch Anims Loaded.")
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_custom_switch2)
|
|
CDEBUG3LN(DEBUG_MISSION, "Custom switch 2 Anims Loaded.")
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_cam_shake)
|
|
CDEBUG3LN(DEBUG_MISSION, "Cam shake anims Loaded.")
|
|
IF IS_SRL_LOADED()
|
|
CDEBUG3LN(DEBUG_MISSION, "SRL is loaded.")
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC DO_START_CUTSCENE()
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_TREVOR
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET)
|
|
ELIF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
ELSE
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
ENDIF
|
|
|
|
i_current_event = 0
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ELSE
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_TREVOR
|
|
//1. Bug #3705257 CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT flag added by request of Graeme Sales.
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(str_mocap_int, CS_SECTION_1 | CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4, CUTSCENE_REQUESTED_IN_MISSION | CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT)
|
|
ELIF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
|
|
//2. Bug #3705257 CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT flag added by request of Graeme Sales.
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(str_mocap_int, CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4, CUTSCENE_REQUESTED_IN_MISSION | CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT)
|
|
ELSE
|
|
//3. Bug #3705257 CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT flag added by request of Graeme Sales.
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(str_mocap_int, CS_SECTION_3 | CS_SECTION_4, CUTSCENE_REQUESTED_IN_MISSION | CUTSCENE_PLAYBACK_FORCE_LOAD_AUDIO_EVENT)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(str_mocap_int)
|
|
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
|
|
|
|
IF i_current_event < 99
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
AND NOT g_FH2_bTimelapseTriggeredInside
|
|
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
|
|
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<151.2816, -1309.2737, 28.2024>>, 65.7988)
|
|
ENDIF
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<129.082687,-1299.175659,28.232706>>, <<136.970322,-1312.649536,33.186874>>, 19.750000, <<151.2816, -1309.2737, 28.2024>>, 65.7988,
|
|
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES()
|
|
|
|
CLEAR_AREA_OF_PEDS(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
|
|
CLEAR_AREA_OF_OBJECTS(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
|
|
CLEAR_AREA_OF_PROJECTILES(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
|
|
CLEAR_AREA_OF_VEHICLES(<<-17.1615, -1439.0176, 30.1015>>, 400.0, TRUE)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(<<-17.1615, -1439.0176, 30.1015>>, 50.0)
|
|
|
|
structTimelapseSettings sTimelapseSettings
|
|
GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTES(SP_HEIST_FINALE_2B, sTimelapseSettings)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<147.032776,-1310.506592,29.858635>>, <<10.395594,-0.000021,49.974117>>, 39.402699, TRUE)
|
|
SET_CAM_PARAMS(cam_main, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.fCamFOV, 3000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SETTIMERB(0)
|
|
i_current_event = 99
|
|
ELSE
|
|
SETTIMERB(0)
|
|
i_current_event = 99
|
|
ENDIF
|
|
ELIF i_current_event = 99
|
|
IF TIMERB() > 3000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
OR g_FH2_bTimelapseTriggeredInside
|
|
IF DO_TIMELAPSE(SP_HEIST_FINALE_2B, sTimelapse, FALSE, FALSE)
|
|
i_current_event = 100
|
|
ENDIF
|
|
|
|
IF i_timelapse_timer = 0
|
|
i_timelapse_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_timelapse_timer > 100 AND GET_GAME_TIMER() - i_timelapse_timer < 200
|
|
DISABLE_STRIP_CLUBS()
|
|
i_timelapse_timer = 1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
AND NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF i_current_event = 100
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
DISABLE_STRIP_CLUBS()
|
|
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_TREVOR
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_MICHAEL
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Michael", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
|
|
ENDIF
|
|
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_FRANKLIN
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Franklin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
i_current_event = 0
|
|
b_skipped_mocap = FALSE
|
|
b_reset_decals_in_cutscene = FALSE
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
AND NOT b_skipped_mocap
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
e_section_stage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0 //Do any setup on first frame of cutscene.
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
|
|
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
|
|
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<151.2816, -1309.2737, 28.2024>>, 65.7988)
|
|
ENDIF
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<129.082687,-1299.175659,28.232706>>, <<136.970322,-1312.649536,33.186874>>, 19.750000, <<151.2816, -1309.2737, 28.2024>>, 65.7988,
|
|
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
CLEAR_AREA_OF_PEDS(<<0.0, 0.0, 0.0>>, 5000.0)
|
|
CLEAR_AREA_OF_OBJECTS(<<0.0, 0.0, 0.0>>, 5000.0)
|
|
CLEAR_AREA_OF_COPS(<<0.0, 0.0, 0.0>>, 5000.0)
|
|
CLEAR_AREA_OF_PROJECTILES(<<0.0, 0.0, 0.0>>, 5000.0)
|
|
|
|
SET_SRL_POST_CUTSCENE_CAMERA(<<128.2, -1303.4, 30.0>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-3.0, 0.0, -146.1>>))
|
|
//SET_SRL_POST_CUTSCENE_CAMERA(<<128.2, -1303.4, 30.0>>, <<-3.0, 0.0, -146.1>>)
|
|
|
|
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_HEIST_FINALE_2B)
|
|
|
|
DO_FADE_IN_WITH_WAIT() //In case this is a mission replay, the game will be faded out at this point
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //When Michael and Trevor are off-screen change them into the outfits.
|
|
SETUP_REQ_MAIN_CREW(<<132.3231, -1305.5222, 28.1893>>, 218.3951)
|
|
|
|
ENTITY_INDEX entity_trevor, entity_michael, entity_franklin
|
|
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
entity_trevor = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor")
|
|
IF DOES_ENTITY_EXIST(entity_trevor)
|
|
s_selector_peds.pedID[SELECTOR_PED_TREVOR] = GET_PED_INDEX_FROM_ENTITY_INDEX(entity_trevor)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
|
|
entity_michael = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michael")
|
|
IF DOES_ENTITY_EXIST(entity_michael)
|
|
s_selector_peds.pedID[SELECTOR_PED_MICHAEL] = GET_PED_INDEX_FROM_ENTITY_INDEX(entity_michael)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
|
|
entity_franklin = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")
|
|
IF DOES_ENTITY_EXIST(entity_franklin)
|
|
s_selector_peds.pedID[SELECTOR_PED_FRANKLIN] = GET_PED_INDEX_FROM_ENTITY_INDEX(entity_franklin)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//1748559 - Some of the new outfits have decals that can stay when Trevor is getting changed.
|
|
IF NOT b_reset_decals_in_cutscene
|
|
IF GET_CUTSCENE_TIME() > 17366
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_DECL, DECL_P2_NONE, FALSE)
|
|
b_reset_decals_in_cutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_CUTSCENE_TIME() > 34250
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SETUP_MICHAEL_OUTFIT(FALSE)
|
|
SETUP_FRANKLIN_OUTFIT(FALSE)
|
|
SETUP_TREVOR_OUTFIT()
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SETUP_DRIVER_OUTFIT()
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF i_current_event >= 1
|
|
|
|
IF NOT DOES_ENTITY_EXIST(s_start_car.veh)
|
|
SETUP_REQ_START_CAR(<<132.5750, -1307.5503, 28.0729>>, 122.3149)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(veh_franklins_car)
|
|
CREATE_PLAYER_VEHICLE(veh_franklins_car, CHAR_FRANKLIN, <<138.9697, -1306.2550, 27.9471>>, 298.8787, TRUE, VEHICLE_TYPE_CAR)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(veh_trevors_car)
|
|
CREATE_PLAYER_VEHICLE(veh_trevors_car, CHAR_TREVOR, <<126.8221, -1314.4611, 28.0071>>, 121.0992)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
|
|
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_MICHAEL)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<129.9813, -1305.5826, 28.2125>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 213.8997)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, FALSE, FAUS_CUTSCENE_EXIT)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_VEHICLE_DRIVEABLE(veh_trevors_car)
|
|
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF IS_VEHICLE_DRIVEABLE(veh_franklins_car)
|
|
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
//IF IS_VEHICLE_DRIVEABLE(veh_trevors_car)
|
|
// SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car, VS_FRONT_RIGHT)
|
|
//ENDIF
|
|
|
|
SET_ENTITY_COORDS(s_crew[CREW_DRIVER_ID].ped, <<126.5602, -1310.9265, 28.0974>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_DRIVER_ID].ped, 222.3256)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_franklins_car)
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_PED_INTO_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
//Fixes issues with LODs popping in after the cutscene.
|
|
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
|
|
SET_FORCE_HD_VEHICLE(s_start_car.veh, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_franklins_car)
|
|
SET_FORCE_HD_VEHICLE(veh_franklins_car, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_trevors_car)
|
|
SET_FORCE_HD_VEHICLE(veh_trevors_car, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
REPLAY_STOP_EVENT()
|
|
IF b_skipped_mocap
|
|
//For now just do a skip to the next stage.
|
|
JUMP_TO_STAGE(STAGE_GO_TO_BANK)
|
|
ELSE
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
e_mission_stage = STAGE_GO_TO_BANK
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_CUTSCENE()
|
|
b_skipped_mocap = TRUE
|
|
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC GO_TO_BANK()
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF SETUP_REQ_PLAYER_AS_MICHAEL()
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(<<129.9813, -1305.5826, 28.2125>>, 100.0, FALSE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<129.9813, -1305.5826, 28.2125>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 100.0)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
WHILE NOT DOES_ENTITY_EXIST(veh_trevors_car)
|
|
OR NOT DOES_ENTITY_EXIST(veh_franklins_car)
|
|
OR NOT DOES_ENTITY_EXIST(s_start_car.veh)
|
|
OR NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
|
|
REQUEST_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
|
|
REQUEST_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
|
|
|
|
CREATE_PLAYER_VEHICLE(veh_trevors_car, CHAR_TREVOR, <<126.8221, -1314.4611, 28.0071>>, 121.0992)
|
|
CREATE_PLAYER_VEHICLE(veh_franklins_car, CHAR_FRANKLIN, <<138.9697, -1306.2550, 27.9471>>, 298.8787, TRUE, VEHICLE_TYPE_CAR)
|
|
SETUP_REQ_TREVOR(<<129.0483, -1315.0841, 28.1318>>, 306.4064)
|
|
SETUP_REQ_MAIN_CREW(<<123.3231, -1311.5222, 28.1893>>, 218.3951)
|
|
SETUP_REQ_START_CAR(<<132.5750, -1307.5503, 28.0729>>, 122.3149)
|
|
SETUP_REQ_FRANKLIN(<<139.6429, -1304.3286, 27.9994>>, 293.0838)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_franklins_car)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(veh_franklins_car)
|
|
ENDIF
|
|
|
|
SETUP_MICHAEL_OUTFIT(FALSE)
|
|
SETUP_FRANKLIN_OUTFIT(FALSE)
|
|
SETUP_TREVOR_OUTFIT()
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
//If the screen is faded out use this chance to chack all the streaming requests.
|
|
WHILE NOT (NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
OR NOT (NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_selector_peds.pedID[SELECTOR_PED_TREVOR]))
|
|
OR NOT (NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_DRIVER_ID].ped))
|
|
OR NOT (NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_FRANKLIN_ID].ped))
|
|
OR NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<129.9813, -1305.5826, 28.2125>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 213.8997)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_start_car.veh)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
//Position the other two crew members next to their cars.
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_DRIVER_ID].ped, <<126.5602, -1310.9265, 28.0974>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_DRIVER_ID].ped, 222.3256)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<141.9831, -1306.0529, 28.0581>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 71.9209)
|
|
ENDIF
|
|
|
|
CLEAR_AREA(<<132.8943, -1305.1912, 28.1806>>, 100.0, TRUE, TRUE)
|
|
|
|
bCrewMemberWalkToCar = FALSE
|
|
|
|
i_current_event = 0
|
|
b_skipped_mocap = TRUE
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SETTIMERB(0)
|
|
|
|
WHILE TIMERB() < 10000
|
|
IF (IS_VEHICLE_DRIVEABLE(veh_franklins_car) AND HAVE_VEHICLE_MODS_STREAMED_IN(veh_franklins_car))
|
|
AND (IS_VEHICLE_DRIVEABLE(veh_trevors_car) AND HAVE_VEHICLE_MODS_STREAMED_IN(veh_trevors_car))
|
|
AND (IS_VEHICLE_DRIVEABLE(s_start_car.veh) AND HAVE_VEHICLE_MODS_STREAMED_IN(s_start_car.veh))
|
|
SETTIMERB(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_franklins_car)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(veh_franklins_car, FALSE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(veh_franklins_car, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND NOT IS_PED_IN_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car)
|
|
TASK_ENTER_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car)
|
|
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car, DEFAULT_TIME_BEFORE_WARP)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_trevors_car)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(veh_trevors_car, FALSE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(veh_trevors_car, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
AND NOT IS_PED_IN_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car)
|
|
TASK_ENTER_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car)
|
|
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car, DEFAULT_TIME_BEFORE_WARP)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_GET_TO_BANK")
|
|
START_AUDIO_SCENE("BS_2B_GET_TO_BANK")
|
|
ENDIF
|
|
|
|
//Michael's crew member is already at the bank: create him closer to arriving there.
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
SETTIMERB(0)
|
|
|
|
//TODO 548046: get the peds already walking into their cars before the fade in.
|
|
WHILE TIMERB() < 500
|
|
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
|
|
SET_FORCE_HD_VEHICLE(s_start_car.veh, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_franklins_car)
|
|
SET_FORCE_HD_VEHICLE(veh_franklins_car, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_trevors_car)
|
|
SET_FORCE_HD_VEHICLE(veh_trevors_car, TRUE)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
|
|
SET_FORCE_HD_VEHICLE(s_start_car.veh, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_franklins_car)
|
|
SET_FORCE_HD_VEHICLE(veh_franklins_car, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_trevors_car)
|
|
SET_FORCE_HD_VEHICLE(veh_trevors_car, TRUE)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
REMOVE_VEHICLE(veh_pre_mission_car, FALSE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bCrewMemberWalkToCar = FALSE
|
|
|
|
b_crew_member_is_in_audio_group = FALSE
|
|
b_switch_has_been_unpaused = FALSE
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(s_locates_data)
|
|
#ENDIF
|
|
|
|
VECTOR vBlipLocation = <<-7.3800, -741.8743, 43.1540>>
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_start_car.veh)
|
|
SET_FORCE_HD_VEHICLE(s_start_car.veh, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_franklins_car)
|
|
SET_FORCE_HD_VEHICLE(veh_franklins_car, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_trevors_car)
|
|
SET_FORCE_HD_VEHICLE(veh_trevors_car, TRUE)
|
|
ENDIF
|
|
|
|
//Michael's crew member waits for him at the bank: create based on distance.
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_outside_bank) < 62500.0
|
|
SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(<<-6.5194, -732.2536, 43.2273>>, 166.8456, FALSE, FALSE)
|
|
ELIF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_outside_bank) > 90000.0
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF i_current_event = 0 //Drive to the bank, park up near the entrance.
|
|
|
|
IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_locates_data, vBlipLocation, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, s_start_car.veh, "F3B_GOBANK", "F3B_GETINCAR", "F3B_GETBACKCAR", TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vBlipLocation) <= 10000 //100m * 100m
|
|
REQUEST_ASSETS_FOR_SWITCH_TO_CUTTER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Once all other dialogue has finished preload the start conversation for the next cutscene.
|
|
IF NOT b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
|
|
IF b_has_text_label_triggered[BS2B_FRANK]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF PRELOAD_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MBANK", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MBANK_PRELOAD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
//Progress once the player hits the parking spot.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-15.328293,-739.265625,42.917812>>, <<-3.549676,-743.407959,45.884602>>, 4.000000)
|
|
|
|
IF NOT bCrewMemberWalkToCar
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
CDEBUG3LN(DEBUG_MISSION, "Michaels crew member walk to car...")
|
|
TASK_GO_TO_ENTITY(s_crew[CREW_MICHAEL_ID].ped, s_start_car.veh, DEFAULT, DEFAULT, PEDMOVEBLENDRATIO_WALK)
|
|
bCrewMemberWalkToCar = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_start_car.veh)
|
|
AND CAN_PLAYER_START_CUTSCENE(TRUE, TRUE)
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(s_start_car.veh, 5.0)
|
|
AND HAVE_ASSETS_FOR_SWITCH_TO_CUTTER_LOADED()
|
|
//Guarantee that the Franklin and Trevor assets are removed at this point.
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
REMOVE_VEHICLE(veh_franklins_car, TRUE)
|
|
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_VEHICLE(veh_trevors_car, TRUE)
|
|
|
|
IF DOES_BLIP_EXIST(blip_current_objective)
|
|
REMOVE_BLIP(blip_current_objective)
|
|
ENDIF
|
|
|
|
//Don't kill the current conversation if we're currently preloading the next cutscene convo.
|
|
IF NOT b_has_text_label_triggered[BS2B_MBANK_PRELOAD]
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(9.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
|
|
SETTIMERB(0)
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Dialogue: should only play during the journey.
|
|
IF NOT b_has_text_label_triggered[BS2B_LOGIC]
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LOGIC", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_LOGIC] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_RENT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, NULL, s_conversation_peds, str_dialogue_block, "BS2B_RENT")
|
|
b_has_text_label_triggered[BS2B_RENT] = TRUE
|
|
i_main_conversation_timer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_FRANK]
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF i_main_conversation_timer = 0
|
|
i_main_conversation_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 3000
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_FRANK", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_FRANK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(blip_current_objective)
|
|
REMOVE_BLIP(blip_current_objective)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bCrewMemberWalkToCar
|
|
//The crew member stands and smokes at the bank.
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
VECTOR v_crew_pos = <<1.7534, -715.5212, 44.9741>>
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped), v_crew_pos) > 2.0
|
|
AND ABSF(GET_ENTITY_HEADING(s_crew[CREW_MICHAEL_ID].ped) - 202.0588) < 20.0
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(s_crew[CREW_MICHAEL_ID].ped, v_crew_pos, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_DEFAULT, 202.0588)
|
|
ENDIF
|
|
ELIF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_START_SCENARIO_IN_PLACE) != PERFORMING_TASK
|
|
TASK_START_SCENARIO_IN_PLACE(s_crew[CREW_MICHAEL_ID].ped, "WORLD_HUMAN_SMOKING")
|
|
ENDIF
|
|
|
|
IF NOT b_crew_member_is_in_audio_group
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_crew[CREW_MICHAEL_ID].ped, "BS_HEIST_BUDDY_group")
|
|
b_crew_member_is_in_audio_group = TRUE
|
|
ENDIF
|
|
ELSE
|
|
b_crew_member_is_in_audio_group = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Request some assets in advance
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_inside_bank) < 10000.0
|
|
SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, TRUE)
|
|
SETUP_REQ_FRANKLIN(<<15.9272, -642.3282, 15.0883>>, 0.0, TRUE)
|
|
ENDIF
|
|
|
|
//Fail if the main car gets stuck
|
|
IF IS_VEHICLE_DRIVEABLE(s_start_car.veh)
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(s_start_car.veh)
|
|
MISSION_FAILED(FAILED_STUCK_START_CAR)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX vehCurrent
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
vehCurrent = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
//Fail if the player drives vehicles into the area.
|
|
IF NOT IS_ENTITY_DEAD(vehCurrent)
|
|
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehCurrent))
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<4.757608,-706.329834,42.472942>>, <<17.995380,-734.747559,68.216003>>, 30.750000, FALSE, TRUE, TM_ANY)
|
|
MISSION_FAILED(FAILED_ALERTED_BANK)
|
|
ENDIF
|
|
ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<4.726292,-706.276855,43.224064>>, <<9.202497,-715.744324,48.092426>>, 22.750000, FALSE, TRUE, TM_ANY)
|
|
MISSION_FAILED(FAILED_ALERTED_BANK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Also fail if the player's last vehicle is in the bank area (e.g. they jumped out and it travelled into the bank area).
|
|
VEHICLE_INDEX vehLast = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehLast)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(vehLast, <<4.726292,-706.276855,43.224064>>, <<9.202497,-715.744324,48.092426>>, 22.750000, FALSE, TRUE, TM_ANY)
|
|
MISSION_FAILED(FAILED_ALERTED_BANK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if the player tries to follow Trevor.
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<2144.2202, 2670.7727, 48.7379>>) < VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_inside_bank)
|
|
MISSION_FAILED(FAILED_ABANDONED_HEIST)
|
|
ENDIF
|
|
|
|
//Fail if the player tries to follow Franklin.
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<899.3143, -2250.0337, 29.4995>>) < 160000.0
|
|
MISSION_FAILED(FAILED_ABANDONED_HEIST)
|
|
ENDIF
|
|
|
|
//Fail for trying to use a firetruck in the area.
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF GET_ENTITY_MODEL(veh) = FIRETRUK
|
|
AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<4.459524,-706.075989,57.974064>>, <<25.487049,-750.868225,39.808624>>, 64.250000)
|
|
MISSION_FAILED(FAILED_ALERTED_BANK)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(s_start_car.veh)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(s_start_car.veh)
|
|
ENDIF
|
|
|
|
//Fudge fix for the pre-streamed tunnel crew member falling: freeze him for now
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
FREEZE_ENTITY_POSITION(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
PREPARE_MUSIC_EVENT("FH2B_MISSION_START")
|
|
|
|
SWITCH i_current_event
|
|
CASE 1 //Once everything is ready do the switch.
|
|
REQUEST_ASSETS_FOR_SWITCH_TO_CUTTER()
|
|
|
|
IF HAVE_ASSETS_FOR_SWITCH_TO_CUTTER_LOADED()
|
|
AND SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, FALSE, TRUE)
|
|
AND SETUP_REQ_FRANKLIN(<<15.9272, -642.3282, 15.0883>>) //NOTE: Franklin may or may not have existed before this point, so need to go through creation process just to be sure.
|
|
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF) OR TIMERB() > 10000 OR b_has_text_label_triggered[BS2B_MBANK_PRELOAD])
|
|
SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading, FALSE, TRUE)
|
|
SETUP_REQ_FRANKLIN(<<15.9272, -642.3282, 15.0883>>)
|
|
SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
|
|
SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
|
|
SETUP_REQ_TUNNEL_COVER_OBJECTS()
|
|
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_cutter)
|
|
SET_ENTITY_COORDS(veh_cutter, v_cutter_start_pos)
|
|
SET_ENTITY_HEADING(veh_cutter, f_cutter_start_heading)
|
|
FREEZE_ENTITY_POSITION(veh_cutter, TRUE)
|
|
ENDIF
|
|
|
|
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
SET_SELECTOR_PED_ACTIVITY(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_ACTIVITY_CAR)
|
|
SET_SELECTOR_PED_PRIORITY(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR)
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
|
|
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_FRANKLIN)
|
|
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
|
|
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
SET_SELECTOR_PED_ACTIVITY(s_selector_peds, SELECTOR_PED_FRANKLIN, SELECTOR_ACTIVITY_DEFAULT)
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_ENTITY_INVINCIBLE(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_PRINTS()
|
|
DESTROY_ALL_CAMS()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_MISSION_START")
|
|
|
|
eSwitchCamState = SWITCH_CAM_START_SPLINE1
|
|
|
|
SETTIMERB(0)
|
|
|
|
i_current_event = 50
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50
|
|
IF HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN(scsSwitchCamMichaelToFranklin)
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
REMOVE_VEHICLE(s_start_car.veh, TRUE)
|
|
REMOVE_VEHICLE(veh_franklins_car, TRUE)
|
|
REMOVE_VEHICLE(veh_trevors_car, TRUE)
|
|
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
b_performed_rayfire_force_reset = b_performed_rayfire_force_reset
|
|
b_switch_has_been_unpaused = b_switch_has_been_unpaused
|
|
|
|
b_performed_rayfire_force_reset = FALSE
|
|
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//Fail if the player does anything dodgy around the bank area.
|
|
IF i_current_event < 50
|
|
IF IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-23.453369,-738.772583,29.263611>>, <<10.948552,-649.322937,272.377960>>, 87.500000)
|
|
OR IS_BULLET_IN_BOX(<<-23.453369,-738.772583,29.263611>>, <<10.948552,-649.322937,272.377960>>, FALSE)
|
|
MISSION_FAILED(FAILED_ALERTED_BANK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Trevor and the chopper pilot drive off together
|
|
IF DOES_ENTITY_EXIST(veh_trevors_car)
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(veh_trevors_car)
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car)
|
|
OR NOT IS_PED_SITTING_IN_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car)
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
AND NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car, TRUE)
|
|
AND NOT IS_PED_RAGDOLL(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_GETTING_UP(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], veh_trevors_car, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_DRIVER_ID].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
AND NOT IS_PED_IN_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car, TRUE)
|
|
AND NOT IS_PED_RAGDOLL(s_crew[CREW_DRIVER_ID].ped)
|
|
AND NOT IS_PED_GETTING_UP(s_crew[CREW_DRIVER_ID].ped)
|
|
TASK_ENTER_VEHICLE(s_crew[CREW_DRIVER_ID].ped, veh_trevors_car, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_TREVOR]), <<94.8243, -1333.8383, 28.3518>>) < 10000.0
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<94.8243, -1333.8383, 28.3518>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
|
|
ENDIF
|
|
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<175.1965, -1242.2568, 37.3161>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<1598.2593, -977.4659, 60.1755>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<2180.5105, -541.6199, 93.0735>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<2499.6746, -71.3421, 90.2445>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<2412.8171, 1017.2548, 84.1214>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_trevors_car, <<2144.2202, 2670.7727, 48.7379>>, 30.0, DRIVINGMODE_AVOIDCARS, 3.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_TREVOR])) > 10000.0
|
|
IF NOT IS_ENTITY_ON_SCREEN(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
DELETE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
DELETE_PED(s_crew[CREW_DRIVER_ID].ped)
|
|
DELETE_VEHICLE(veh_trevors_car)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Franklin and one gunman drive off together
|
|
IF DOES_ENTITY_EXIST(veh_franklins_car)
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(veh_franklins_car)
|
|
FLOAT f_dist_from_franklin = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car)
|
|
OR NOT IS_PED_SITTING_IN_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car)
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
AND NOT IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car)
|
|
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_franklins_car, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_FRANKLIN_ID].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
AND NOT IS_PED_SITTING_IN_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car)
|
|
TASK_ENTER_VEHICLE(s_crew[CREW_FRANKLIN_ID].ped, veh_franklins_car, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]), <<899.3143, -2250.0337, 29.4995>>) > 100.0
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]), <<205.6445, -1286.6569, 28.2408>>) < 10000.0
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_franklins_car, <<205.6445, -1286.6569, 28.2408>>, 30.0, DRIVINGMODE_AVOIDCARS, 10.0)
|
|
ENDIF
|
|
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, veh_franklins_car, <<899.3143, -2250.0337, 29.4995>>, 30.0, DRIVINGMODE_AVOIDCARS, 3.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF f_dist_from_franklin > 10000.0
|
|
IF NOT IS_ENTITY_ON_SCREEN(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
DELETE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
DELETE_PED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
DELETE_VEHICLE(veh_franklins_car)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//General fail for the start car being destroyed.
|
|
IF DOES_ENTITY_EXIST(s_start_car.veh)
|
|
IF NOT IS_VEHICLE_DRIVEABLE(s_start_car.veh)
|
|
MISSION_FAILED(FAILED_DESTROYED_START_CAR)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
|
|
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
REMOVE_ALL_BLIPS()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
REMOVE_PED(s_crew[0].ped, TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
REMOVE_VEHICLE(s_start_car.veh, TRUE)
|
|
REMOVE_VEHICLE(veh_franklins_car, TRUE)
|
|
REMOVE_VEHICLE(veh_trevors_car, TRUE)
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
|
|
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
|
|
REMOVE_VEHICLE_ASSET(model_start_car)
|
|
|
|
REMOVE_ANIM_DICT(str_anim_custom_switch)
|
|
REMOVE_ANIM_DICT(str_anim_custom_switch2)
|
|
REMOVE_ANIM_DICT(str_anim_cam_shake)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_GET_TO_BANK")
|
|
STOP_AUDIO_SCENE("BS_2B_GET_TO_BANK")
|
|
ENDIF
|
|
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
|
|
|
|
e_mission_stage = STAGE_DRILL_THROUGH_WALL
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_DRILL_THROUGH_WALL)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DRILL_THROUGH_WALL()
|
|
CONST_FLOAT MAX_DRILL_SPEED 1.0
|
|
CONST_FLOAT MAX_DRILL_ACCEL 0.1
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(v_cutter_start_pos, 24.2033, FALSE, TRUE)
|
|
|
|
i_current_event = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_cutter_start_pos)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 24.2033)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
|
|
WHILE NOT SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
OR NOT DOES_ENTITY_EXIST(veh_cutter)
|
|
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
|
|
OR NOT DOES_ENTITY_EXIST(obj_gold_containers[0])
|
|
OR NOT DOES_ENTITY_EXIST(obj_gold_trolleys[0])
|
|
OR NOT DOES_ENTITY_EXIST(obj_tunnel_crates[0])
|
|
REQUEST_ANIM_DICT(str_anim_cutter)
|
|
REQUEST_ANIM_DICT(str_anim_ig_2)
|
|
SETUP_REQ_CUTTER(v_cutter_start_pos, f_cutter_start_heading)
|
|
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
|
|
SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
|
|
SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
|
|
SETUP_REQ_TUNNEL_COVER_OBJECTS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), veh_cutter)
|
|
|
|
SET_ENTITY_COORDS(veh_cutter, v_cutter_start_pos)
|
|
SET_ENTITY_HEADING(veh_cutter, f_cutter_start_heading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(veh_cutter)
|
|
ENDIF
|
|
|
|
SETUP_FRANKLIN_OUTFIT(TRUE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_CUTTER_SPINNING()
|
|
|
|
REQUEST_ANIM_DICT(str_anim_cutter)
|
|
REQUEST_ANIM_DICT(str_anim_ig_2)
|
|
|
|
IF HAS_ANIM_DICT_LOADED(str_anim_cutter)
|
|
AND HAS_ANIM_DICT_LOADED(str_anim_ig_2)
|
|
DESTROY_ALL_CAMS()
|
|
|
|
//Crew member may have been frozen from earlier (to prevent bugs with him falling through the map), now's the time to unfreeze him.
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
FREEZE_ENTITY_POSITION(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2B_DRILL_RESTART")
|
|
|
|
SETTIMERB(0)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-162.9016 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
/*//If we skipped here spend some time setting up the tunnel rayfire.
|
|
WHILE NOT SETUP_REQ_TUNNEL_RAYFIRE_READY_FOR_DRILLING()
|
|
AND TIMERB() < 3000
|
|
WAIT(0)
|
|
ENDWHILE*/
|
|
ENDIF
|
|
|
|
//Need to freeze some props here as they interfere with the drill.
|
|
OBJECT_INDEX objBoxes[3]
|
|
|
|
objBoxes[0] = GET_CLOSEST_OBJECT_OF_TYPE(<<13.9814, -646.0353, 15.9349>>, 3.0, PROP_PARTSBOX_01, FALSE)
|
|
objBoxes[1] = GET_CLOSEST_OBJECT_OF_TYPE(<<13.9814, -646.0353, 15.9349>>, 3.0, PROP_PARTSBOX_01, FALSE)
|
|
objBoxes[2] = GET_CLOSEST_OBJECT_OF_TYPE(<<13.9814, -646.0353, 15.9349>>, 3.0, PROP_PARTSBOX_01, FALSE)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(objBoxes) i
|
|
IF DOES_ENTITY_EXIST(objBoxes[i])
|
|
FREEZE_ENTITY_POSITION(objBoxes[i], TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_DRILL_THROUGH_VAULT")
|
|
START_AUDIO_SCENE("BS_2B_DRILL_THROUGH_VAULT")
|
|
ENDIF
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
//If we skipped here then make sure the gates are force cleared (in case we were on a stage where they were blown up).
|
|
CLEAR_AREA_OF_OBJECTS(v_vault_gate_pos_1, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS)
|
|
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
UPDATE_CUTTER_SPINNING()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
i_current_music_event = 0
|
|
b_spin_cutter_blades = FALSE
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
NEW_LOAD_SCENE_STOP() //May have carried over from the switch scene.
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DRILL, "DRILL_THROUGH_WALL")
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cutter)
|
|
REMOVE_VEHICLE_HIGH_DETAIL_MODEL(veh_cutter)
|
|
ENDIF
|
|
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
//PRINTLN(GET_GAMEPLAY_CAM_RELATIVE_HEADING(), " ", GET_GAMEPLAY_CAM_RELATIVE_PITCH())
|
|
|
|
//Update crew behaviour during this section: play idle anims
|
|
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND() //The crew member sometimes isn't getting created in time.
|
|
UPDATE_CREW_MEMBER_DURING_DRILL_SECTION()
|
|
UPDATE_CUTTER_SPINNING()
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CUTTER_ENTER, str_carrec)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
|
|
LOAD_STREAM("DRILL_WALL", "BIG_SCORE_3B_SOUNDS")
|
|
|
|
FLOAT f_dist_from_cutter_to_trigger, f_cutter_heading, f_heading_diff
|
|
f_dist_from_cutter_to_trigger = VDIST2(GET_ENTITY_COORDS(veh_cutter), <<7.6676, -653.8835, 15.0823>>)
|
|
f_cutter_heading = GET_ENTITY_HEADING(veh_cutter)
|
|
|
|
IF NOT DOES_BLIP_EXIST(blip_current_objective)
|
|
blip_current_objective = CREATE_BLIP_FOR_COORD(<<7.2064, -656.3232, 16.0789>>)
|
|
ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_HEAR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR", CONV_PRIORITY_MEDIUM)
|
|
SETTIMERB(0)
|
|
b_has_text_label_triggered[BS2B_HEAR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_WALL]
|
|
IF NOT b_has_text_label_triggered[F3B_DRILLHELP]
|
|
IF TIMERB() > 2000
|
|
PRINT_HELP("F3B_DRILLHELP", 60000)
|
|
b_has_text_label_triggered[F3B_DRILLHELP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_WALL")
|
|
b_has_text_label_triggered[BS2B_WALL] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[F3B_DRILL]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3B_DRILL", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_DRILL] = TRUE
|
|
SETTIMERB(0)
|
|
ENDIF
|
|
ELSE
|
|
//Cops come in on the radio.
|
|
IF NOT b_has_text_label_triggered[BS2B_POLICE]
|
|
IF TIMERB() > 500
|
|
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2B_01")
|
|
|
|
b_has_text_label_triggered[BS2B_POLICE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Crew member says a line if the player hangs around
|
|
IF NOT b_has_text_label_triggered[BS2B_REM]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF TIMERB() > 13200
|
|
AND f_dist_from_cutter_to_trigger > 225.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_REM")
|
|
b_has_text_label_triggered[BS2B_REM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_HOLD] //Another reminder.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF TIMERB() > 21200
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_HOLD")
|
|
b_has_text_label_triggered[BS2B_HOLD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Crew member says a line if the player goes the wrong way.
|
|
IF NOT b_has_text_label_triggered[BS2B_WAY]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<18.989424,-646.675842,15.088079>>, <<39.385719,-680.171082,22.002810>>, 13.250000)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_WAY")
|
|
b_has_text_label_triggered[BS2B_WAY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR v_cutter_front_pos
|
|
v_cutter_front_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<-0.0359, 5.7960, 1.6637>>)
|
|
|
|
//When the cutter approaches slow it down.
|
|
IF f_dist_from_cutter_to_trigger <= 225.0
|
|
f_heading_diff = ABSF(f_cutter_heading - 162.0)
|
|
|
|
IF f_heading_diff > 180.0
|
|
f_heading_diff = ABSF(f_heading_diff - 360.0)
|
|
ENDIF
|
|
|
|
IF f_heading_diff < 45.0
|
|
FLOAT f_speed_modifier, f_dist_adjusted, f_current_speed
|
|
|
|
f_current_speed = GET_ENTITY_SPEED(veh_cutter)
|
|
|
|
f_dist_adjusted = f_dist_from_cutter_to_trigger
|
|
f_speed_modifier = (1.0 - (f_dist_adjusted - 64.0) / (225.0 - 64.0)) * 80.0
|
|
|
|
IF f_prev_distance_from_cutter_to_wall < f_dist_from_cutter_to_trigger
|
|
f_speed_modifier = 0.0
|
|
ELSE
|
|
IF f_current_speed > 2.0
|
|
SET_ENTITY_VELOCITY(veh_cutter, GET_ENTITY_VELOCITY(veh_cutter) * 0.97)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
MODIFY_VEHICLE_TOP_SPEED(veh_cutter, -f_speed_modifier)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player is about to hit the wall and doesn't have the cutters moving don't go any further.
|
|
IF f_dist_from_cutter_to_trigger < 64.0
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(veh_cutter, str_anim_cutter, "cutter_run")
|
|
|
|
ENDIF
|
|
|
|
//Don't start priming the rayfire until the tunnel is properly streamed in.
|
|
IF TIMERA() > 2000
|
|
SETUP_REQ_TUNNEL_RAYFIRE_READY_FOR_DRILLING(FALSE)
|
|
ENDIF
|
|
|
|
IF IS_POINT_IN_ANGLED_AREA(v_cutter_front_pos, <<4.426229,-664.508057,15.130619>>, <<7.489964,-654.724365,20.332310>>, 4.000000)
|
|
IF IS_CUTTER_SPINNING()
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CUTTER_ENTER, str_carrec)
|
|
AND GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) = RFMO_STATE_PRIMED
|
|
AND LOAD_STREAM("DRILL_WALL", "BIG_SCORE_3B_SOUNDS")
|
|
AND f_dist_from_cutter_to_trigger <= f_prev_distance_from_cutter_to_wall //Cutter is going towards the wall or is stationary.
|
|
MODIFY_VEHICLE_TOP_SPEED(veh_cutter, 0.0)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_cutter, CARREC_CUTTER_ENTER, str_carrec, FALSE)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cutter, 650.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cutter, FALSE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(veh_cutter, TRUE)
|
|
RESET_VEHICLE_WHEELS(veh_cutter, FALSE)
|
|
f_cutter_playback_speed = 0.55
|
|
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
|
|
|
|
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0, TRUE, TRUE)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
|
|
STOP_ENTITY_FIRE(veh_cutter)
|
|
SET_VEHICLE_ENGINE_HEALTH(veh_cutter, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_cutter, 1000.0)
|
|
|
|
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<17.829350,-655.785889,17.536486>>,<<-2.166965,-0.006385,90.217682>>,29.275511, TRUE)
|
|
SET_CAM_PARAMS(cam_main,<<17.831120,-656.252747,17.536448>>,<<-2.166965,-0.006385,90.217682>>,29.275511, 7000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
SET_FRONTEND_RADIO_ACTIVE(FALSE)
|
|
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) //Can't turn control off as it stops the pad shake.
|
|
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
|
|
PLAY_STREAM_FRONTEND()
|
|
|
|
//ADD_ENTITY_TO_AUDIO_MIX_GROUP(veh_cutter, "BS_2B_VAULT_RAYFIRE")
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_RAYFIRE")
|
|
START_AUDIO_SCENE("BS_2B_VAULT_RAYFIRE")
|
|
ENDIF
|
|
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_START_ANIM)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_DRILL_START")
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
//Add this cutscene to the captured footage.
|
|
IF NOT b_replay_event_started
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
b_replay_event_started = TRUE
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ELSE
|
|
//Play dialogue if the player drove up to the wall without turning on the cutter.
|
|
IF NOT b_has_text_label_triggered[BS2B_DRIL]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_DRIL")
|
|
b_has_text_label_triggered[BS2B_DRIL] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
f_prev_distance_from_cutter_to_wall = f_dist_from_cutter_to_trigger
|
|
|
|
//Fail checks
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
//Fail if the cutter gets stuck
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(veh_cutter)
|
|
MISSION_FAILED(FAILED_STUCK_CUTTER)
|
|
ENDIF
|
|
|
|
//Fail if the cutter is driven into the tunnels.
|
|
IF NOT IS_ENTITY_DEAD(veh_cutter)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<-21.860806,-579.642761,16.917259>>, <<-23.791729,-570.581726,34.792725>>, 55.250000)
|
|
MISSION_FAILED(FAILED_ABANDONED_HEIST)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Start second part of rayfire inside the vault
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
CONVERGE_VALUE(f_cutter_playback_speed, 0.49, 0.05, TRUE)
|
|
|
|
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
|
|
ENDIF
|
|
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
|
|
|
|
//Play dialogue from Franklin when cutscene starts.
|
|
IF NOT b_has_text_label_triggered[BS2B_INTO]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_INTO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_INTO] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_RAYFIRE_MAP_OBJECT_ANIM_PHASE(rayfire_tunnel) > 0.6
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_ENDING)
|
|
|
|
//Need to wait to prevent visible pops with changing the rayfire state.
|
|
SETTIMERB(0) //Safety timer in case the rayfire never resets.
|
|
WHILE GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_END
|
|
AND TIMERB() < 1000
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault) = RFMO_STATE_PRIMED
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_START_ANIM)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
|
|
SET_VARIABLE_ON_SOUND(i_cutter_sound_id, "Muffling", 1.0)
|
|
ENDIF
|
|
|
|
SET_CAM_PARAMS(cam_main, <<0.046478,-670.565002,15.832479>>,<<3.964742,0.023400,-32.681709>>,33.154215)
|
|
SET_CAM_PARAMS(cam_main, <<-0.497207,-671.412476,15.762693>>,<<7.658487,0.023399,-33.584625>>,33.154217, 20000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
|
|
|
|
REMOVE_PARTICLE_FX_IN_RANGE(<<0.046478,-670.565002,15.832479>>, 200.0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_cutter, 2800.0)
|
|
SET_GLOBAL_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(veh_cutter, <<-0.2, 0.0, 0.0>>)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_cutter, FALSE)
|
|
f_cutter_playback_speed = 0.1
|
|
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Start the alarm
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
CONVERGE_VALUE(f_cutter_playback_speed, 0.3, 0.001, TRUE)
|
|
|
|
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
|
|
ENDIF
|
|
|
|
//Music event triggers here when the cutter gets through the wall.
|
|
IF i_current_music_event = 0
|
|
PREPARE_MUSIC_EVENT("FH2B_WALL_SMASH")
|
|
|
|
IF TIMERB() > 2000
|
|
TRIGGER_MUSIC_EVENT("FH2B_WALL_SMASH")
|
|
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
|
|
i_current_music_event++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF TIMERB() < 5000
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
|
|
ENDIF
|
|
|
|
IF TIMERB() > 5000
|
|
AND SETUP_REQ_VAULT_ALARM(FALSE, TRUE)
|
|
SETUP_REQ_VAULT_ALARM(FALSE)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Drill reverses out
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
|
|
IF TIMERB() < 6000
|
|
CONVERGE_VALUE(f_cutter_playback_speed, 0.275, 0.03, TRUE)
|
|
ELSE
|
|
CONVERGE_VALUE(f_cutter_playback_speed, 0.15, 0.03, TRUE)
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(veh_cutter, f_cutter_playback_speed)
|
|
ENDIF
|
|
|
|
IF TIMERB() > 10000
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_ENDING)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_ENDING)
|
|
|
|
SETTIMERB(0) //Safety timer in case the rayfire never resets.
|
|
WHILE GET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel) != RFMO_STATE_END
|
|
AND TIMERB() < 1000
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_cutter_sound_id)
|
|
SET_VARIABLE_ON_SOUND(i_cutter_sound_id, "Muffling", 0.0)
|
|
ENDIF
|
|
|
|
IF b_replay_event_started
|
|
REPLAY_STOP_EVENT()
|
|
b_replay_event_started = FALSE
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cutter)
|
|
ENDIF
|
|
|
|
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spindown", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
|
|
SET_ENTITY_HEADING(veh_cutter, 164.9295)
|
|
SET_ENTITY_COORDS(veh_cutter, <<8.1528, -652.3942, 15.0973>>)
|
|
SET_ENTITY_VELOCITY(veh_cutter, <<0.0, 0.0, 0.0>>)
|
|
|
|
//REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cutter)
|
|
ENDIF
|
|
|
|
//Reposition entities at this point in case something went wrong
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<17.7703, -646.9630, 15.0883>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 317.3096)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], <<23.8434, -636.2329, 16.0034>>)
|
|
SET_ENTITY_HEADING(obj_gold_containers[0], -56.8800)
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[1], <<24.9209, -639.1294, 16.0089>>)
|
|
SET_ENTITY_HEADING(obj_gold_containers[1], -72.3600 + 180.0)
|
|
|
|
STOP_STREAM()
|
|
TRIGGER_MUSIC_EVENT("FH2B_PARK_CUTTER")
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_RAYFIRE")
|
|
STOP_AUDIO_SCENE("BS_2B_VAULT_RAYFIRE")
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
WAIT(500)
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 100)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ELSE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 200, 200)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
|
|
IF NOT DOES_BLIP_EXIST(blip_current_objective)
|
|
blip_current_objective = CREATE_BLIP_FOR_COORD(<<12.1850, -633.0806, 16.0882>>)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
IF NOT b_has_text_label_triggered[BS2B_MADE]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MADE", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MADE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[F3B_CUTOUT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3B_CUTOUT", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_CUTOUT] = TRUE
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_JAM]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_JAM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_JAM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//2001826 - As part of the fixes for this we need to adjust the path of the cutter slightly so it easily hits the smaller locate.
|
|
SET_VEHICLE_STEER_BIAS(veh_cutter, 0.0)
|
|
|
|
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
AND NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
|
|
VECTOR vPointBehindCutter
|
|
FLOAT fCutterHeading
|
|
|
|
vPointBehindCutter = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<0.0, -3.9057, 0.5031>>)
|
|
fCutterHeading = GET_ENTITY_HEADING(veh_cutter)
|
|
|
|
IF fCutterHeading < 0.0
|
|
fCutterHeading += 360.0
|
|
ENDIF
|
|
|
|
IF fCutterHeading > 164.0
|
|
AND fCutterHeading < 170.0
|
|
IF IS_POINT_IN_ANGLED_AREA(vPointBehindCutter, <<11.451782,-635.602539,15.088079>>, <<10.528242,-641.369690,23.104958>>, 7.250000)
|
|
SET_VEHICLE_STEER_BIAS(veh_cutter, -0.02)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<11.953387,-626.074402,14.782672>>, <<10.861650,-634.806152,21.588079>>, 7.000000)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<11.921734,-626.025146,14.871298>>, <<10.923436,-632.279480,21.588079>>, 7.250000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(veh_cutter, <<-0.105172,-623.442566,14.245301>>, <<8.899252,-634.569153,19.838383>>, 14.250000)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ELSE
|
|
//Backing up dialogue.
|
|
IF b_has_text_label_triggered[BS2B_JAM]
|
|
//Player says a line once he starts reversing.
|
|
IF NOT b_has_text_label_triggered[BS2B_BACKDRILL]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BACK", CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
b_has_text_label_triggered[BS2B_BACKDRILL] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Crew says a line.
|
|
IF NOT b_has_text_label_triggered[BS2B_BUP]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped)) < 100.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_BUP")
|
|
b_has_text_label_triggered[BS2B_BUP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail in this section if the cutter gets stuck
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
AND IS_VEHICLE_PERMANENTLY_STUCK(veh_cutter)
|
|
MISSION_FAILED(FAILED_STUCK_CUTTER)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5
|
|
IF TIMERB() > 500
|
|
AND IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
AND ABSF(GET_ENTITY_SPEED(veh_cutter)) < 0.5
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Skip the drill cutscene
|
|
IF i_current_event > 0
|
|
AND NOT IS_GAMEPLAY_CAM_RENDERING()
|
|
IF IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_SKIP_CUTSCENE)
|
|
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
|
|
IF NOT IS_PAUSE_MENU_ACTIVE()
|
|
AND TIMERA() > CUTSCENE_SKIP_DELAY
|
|
//Stop any footage recording before the fade.
|
|
IF b_replay_event_started
|
|
REPLAY_STOP_EVENT()
|
|
b_replay_event_started = FALSE
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) //Player control isn't turned off during the cutscene, so do it here.
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_tunnel, RFMO_STATE_ENDING)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(rayfire_vault, RFMO_STATE_ENDING)
|
|
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
|
|
WAIT(2000)
|
|
|
|
WHILE NOT SETUP_REQ_VAULT_ALARM(TRUE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
|
|
SKIP_TO_END_AND_STOP_PLAYBACK_RECORDED_VEHICLE(veh_cutter)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETTIMERB(100000)
|
|
|
|
i_current_music_event = 100
|
|
i_current_event = 3 //Cutscene cleanup
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CUTTER_ENTER, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CUTTER_LEAVE, str_carrec)
|
|
|
|
STOP_CUTTER_SPINNING()
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
//IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
// REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cutter)
|
|
//ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_01")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_02")
|
|
REMOVE_ANIM_DICT(str_anim_cutter)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_BLOW_UP_DOORS
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cutter)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(veh_cutter, v_cutter_pos_after_drilling)
|
|
SET_ENTITY_HEADING(veh_cutter, f_cutter_heading_after_drilling)
|
|
|
|
PLAY_ENTITY_ANIM(veh_cutter, "cutter_spindown", str_anim_cutter, NORMAL_BLEND_IN, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
WHILE NOT SETUP_REQ_VAULT_ALARM(TRUE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
STOP_STREAM()
|
|
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
|
|
|
|
DESTROY_ALL_CAMS()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC BLOW_UP_DOORS()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<23.3, -642.8, 15.3>>)
|
|
|
|
//Need to load the scene first in this case, otherwise everything falls through the ground.
|
|
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
|
|
AND SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
LOAD_SCENE(v_cutter_start_pos)
|
|
i_current_event = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
|
|
AND SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
|
|
AND SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
|
|
AND SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
|
|
AND SETUP_REQ_VAULT_ALARM(TRUE)
|
|
AND SETUP_REQ_TUNNEL_COVER_OBJECTS()
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), veh_cutter)
|
|
ENDIF
|
|
|
|
SETUP_FRANKLIN_OUTFIT(TRUE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
SETTIMERB(0)
|
|
|
|
//Wait for clothes to stream in
|
|
WHILE TIMERB() < 5000
|
|
IF (NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID()))
|
|
SETTIMERB(10000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
//If we skipped here then make sure the gates are force cleared (in case we were on a stage where they were blown up).
|
|
CLEAR_AREA_OF_OBJECTS(v_vault_gate_pos_1, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS)
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//There's a chance the crew member was frozen before, make sure they're unfrozen in all cases.
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_crew[CREW_FRANKLIN_ID].ped)
|
|
REMOVE_ANIM_DICT(str_anim_ig_2)
|
|
FREEZE_ENTITY_POSITION(s_crew[CREW_FRANKLIN_ID].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_FRANKLIN_ID].ped, PCF_DisableExplosionReactions, TRUE)
|
|
ENDIF
|
|
|
|
//Give the player 5 sticky bombs (give them less if they already have some).
|
|
i_prev_num_sticky_bombs = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STICKYBOMB)
|
|
|
|
IF i_prev_num_sticky_bombs < 16
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_STICKYBOMB, 16 - i_prev_num_sticky_bombs, FALSE, FALSE)
|
|
ENDIF
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2B_BOMBS_RESTART")
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2B_PLANT_BOMBS")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_PLANT_C4")
|
|
START_AUDIO_SCENE("BS_2B_PLANT_C4")
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0, TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
//If we skipped here then make sure the gates are force cleared (in case we were on a stage where they were blown up).
|
|
CLEAR_AREA_OF_OBJECTS(v_vault_gate_pos_1, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS)
|
|
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_event = 0
|
|
|
|
b_vault_door_blown_up[0] = FALSE
|
|
b_vault_door_blown_up[1] = FALSE
|
|
b_cutter_warped = FALSE
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
|
|
i_prev_num_sticky_bombs = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STICKYBOMB)
|
|
i_time_since_last_bomb_activity = GET_GAME_TIMER() + 5000
|
|
//i_time_since_bomb_section_started = GET_GAME_TIMER()
|
|
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(model_vault_door, v_vault_door_pos, TRUE, 0.0, 0.0)
|
|
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
SETTIMERB(0)
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED() //B*617956: Rayfire resets itself if walking away from the area.
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_BLIMIT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BLIMIT", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BLIMIT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//The player can trigger the shootout enemies early if they do the wrong thing, so make sure the buddy and enemies are kept up to date.
|
|
UPDATE_TUNNEL_SHOOTOUT_ENEMIES_2()
|
|
UPDATE_CREW_MEMBER_COLLECTING_GOLD()
|
|
UPDATE_CUTTER_SPINNING()
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) < 1600.0
|
|
IF DOES_BLIP_EXIST(s_crew[CREW_FRANKLIN_ID].blip)
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
BOOL b_explosion_fired
|
|
|
|
PREPARE_MUSIC_EVENT("FH2B_EXPLODE")
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_VAULT_EXPLOSION")
|
|
|
|
//Continue once both doors have been exploded.
|
|
IF b_vault_door_blown_up[0]
|
|
AND b_vault_door_blown_up[1]
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_EXPLODE")
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ELSE
|
|
IF NOT b_vault_door_blown_up[0]
|
|
AND NOT b_vault_door_blown_up[1]
|
|
//Play dialogue after the player fits the first sticky bomb (if neither door has blown up yet).
|
|
IF b_has_text_label_triggered[BS2B_BLIMIT] //Don't play god text until after the crew member says his line about the time limit.
|
|
IF NOT b_has_text_label_triggered[F3B_CHARGE] //God text fir planting both charges.
|
|
IF DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
OR DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3B_CHARGE", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_CHARGE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_TWO] //Dialogue after planting the first charge.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF (DOES_BLIP_EXIST(blip_vault_doors[0]) AND NOT DOES_BLIP_EXIST(blip_vault_doors[1]))
|
|
OR (DOES_BLIP_EXIST(blip_vault_doors[1]) AND NOT DOES_BLIP_EXIST(blip_vault_doors[0]))
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_TWO")
|
|
b_has_text_label_triggered[BS2B_TWO] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_BLOW] //Gunman dialogue after planting both charges.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BLOW", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_BLOW] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_OUT] //Gunman dialogue after planting both charges.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_OUT")
|
|
b_has_text_label_triggered[BS2B_OUT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[F3B_CHARGE2] //God text for blowing up the charges.
|
|
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3B_CHARGE2", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_CHARGE2] = TRUE
|
|
i_main_conversation_timer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_SET] //Reminder dialogue if the bombs haven't blown up yet.
|
|
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_DO_ALL_CHECKS)
|
|
IF i_main_conversation_timer = 0
|
|
i_main_conversation_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 7200
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SET")
|
|
b_has_text_label_triggered[BS2B_SET] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//One of the doors wasn't blown up, gunman says to blow up the other.
|
|
IF NOT b_has_text_label_triggered[BS2B_ONE]
|
|
IF DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
OR DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_ONE")
|
|
b_has_text_label_triggered[BS2B_ONE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
GRAB_VAULT_GATES(TRUE)
|
|
|
|
IF NOT b_vault_door_blown_up[0]
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[0])
|
|
IF TIMERB() > 500
|
|
b_explosion_fired = IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_STICKYBOMB, <<2.363872,-662.097778,15.012270>>, <<3.228940,-659.719604,18.044346>>, 0.750000)
|
|
|
|
IF b_explosion_fired
|
|
OR VDIST(GET_ENTITY_COORDS(obj_vault_gates[0]), v_vault_gate_pos_1) > 0.5
|
|
//FREEZE_ENTITY_POSITION(obj_vault_gates[0], TRUE)
|
|
//SET_ENTITY_COORDS_NO_OFFSET(obj_vault_gates[0], v_vault_gate_pos_1 + <<0.0, 0.0, 5.0>>)
|
|
|
|
IF b_explosion_fired
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Gold_Vault_Explosions", obj_vault_gates[0], "BIG_SCORE_3B_SOUNDS")
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
REMOVE_BLIP(blip_vault_doors[0])
|
|
ENDIF
|
|
|
|
//Record footage of the doors blowing up.
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0)
|
|
|
|
b_vault_door_blown_up[0] = TRUE
|
|
i_time_since_last_bomb_activity = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle the blip: remove if a sticky bomb is in the right place, add if there are no sticky bombs and no explosions.
|
|
IF IS_PROJECTILE_TYPE_IN_ANGLED_AREA(<<2.363872,-662.097778,15.012270>>, <<3.228940,-659.719604,18.044346>>, 0.750000, WEAPONTYPE_STICKYBOMB)
|
|
OR VDIST(GET_ENTITY_COORDS(obj_vault_gates[0]), v_vault_gate_pos_1) > 0.5
|
|
IF DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
IF GET_GAME_TIMER() - i_vault_blip_remove_timer[0] > 500 //Delay the removal of the blip in case the sticky bomb is just passing through the locate.
|
|
REMOVE_BLIP(blip_vault_doors[0])
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
i_time_since_last_bomb_activity = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i_vault_blip_timer[0] = GET_GAME_TIMER()
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
AND NOT b_vault_door_blown_up[0] //In case it was set this frame
|
|
AND GET_GAME_TIMER() - i_vault_blip_timer[0] > 500 //In case an explosion just triggered but wasn't detected yet.
|
|
blip_vault_doors[0] = CREATE_BLIP_FOR_COORD(<<3.2056, -660.8693, 15.1561>>)
|
|
ENDIF
|
|
|
|
i_vault_blip_remove_timer[0] = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT b_vault_door_blown_up[1]
|
|
IF DOES_ENTITY_EXIST(obj_vault_gates[1])
|
|
IF TIMERB() > 500
|
|
b_explosion_fired = IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_STICKYBOMB, <<8.365052,-661.627136,15.011101>>, <<7.536329,-663.902588,17.999533>>, 0.750000)
|
|
|
|
IF b_explosion_fired
|
|
OR VDIST(GET_ENTITY_COORDS(obj_vault_gates[1]), v_vault_gate_pos_2) > 0.5
|
|
//FREEZE_ENTITY_POSITION(obj_vault_gates[1], TRUE)
|
|
//SET_ENTITY_COORDS_NO_OFFSET(obj_vault_gates[1], v_vault_gate_pos_2 + <<0.0, 0.0, 5.0>>)
|
|
|
|
IF b_explosion_fired
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Gold_Vault_Explosions", obj_vault_gates[1], "BIG_SCORE_3B_SOUNDS")
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
REMOVE_BLIP(blip_vault_doors[1])
|
|
ENDIF
|
|
|
|
b_vault_door_blown_up[1] = TRUE
|
|
i_time_since_last_bomb_activity = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle the blip: remove if a sticky bomb is in the right place, add if there are no sticky bombs and no explosions.
|
|
IF IS_PROJECTILE_TYPE_IN_ANGLED_AREA(<<8.365052,-661.627136,15.011101>>, <<7.536329,-663.902588,17.999533>>, 0.750000, WEAPONTYPE_STICKYBOMB)
|
|
OR VDIST(GET_ENTITY_COORDS(obj_vault_gates[1]), v_vault_gate_pos_2) > 0.5
|
|
IF DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF GET_GAME_TIMER() - i_vault_blip_remove_timer[1] > 500 //Delay the removal of the blip in case the sticky bomb is just passing through the locate.
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
REMOVE_BLIP(blip_vault_doors[1])
|
|
i_time_since_last_bomb_activity = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i_vault_blip_timer[1] = GET_GAME_TIMER()
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
AND NOT b_vault_door_blown_up[1] //In case it was set this frame
|
|
AND GET_GAME_TIMER() - i_vault_blip_timer[1] > 500 //In case an explosion just triggered but wasn't detected yet.
|
|
blip_vault_doors[1] = CREATE_BLIP_FOR_COORD(<<7.3349, -662.4049, 15.1561>>)
|
|
ENDIF
|
|
|
|
i_vault_blip_remove_timer[1] = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
//Audio scenes.
|
|
IF NOT DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
AND NOT DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_PLANT_C4")
|
|
STOP_AUDIO_SCENE("BS_2B_PLANT_C4")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_WAIT_FOR_DETONATION")
|
|
START_AUDIO_SCENE("BS_2B_WAIT_FOR_DETONATION")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
//TODO 396831 - Move the cutter further back when it's safe to do so.
|
|
IF NOT b_cutter_warped
|
|
AND NOT IS_ENTITY_DEAD(veh_cutter)
|
|
IF IS_POINT_IN_ANGLED_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<0.0536, 6.7800, 1.5680>>),
|
|
<<9.034413,-647.950317,15.085551>>, <<10.894372,-638.945435,18.838383>>, 6.250000)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_cutter)) > 400.0
|
|
AND NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(veh_cutter), 8.0)
|
|
AND NOT IS_SPHERE_VISIBLE(v_cutter_pos_after_drilling, 8.0)
|
|
SET_ENTITY_COORDS(veh_cutter, v_cutter_pos_after_drilling)
|
|
SET_ENTITY_HEADING(veh_cutter, f_cutter_heading_after_drilling)
|
|
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ", "Cutter has been warped while planting bombs.")
|
|
|
|
b_cutter_warped = TRUE
|
|
ENDIF
|
|
ELSE
|
|
b_cutter_warped = TRUE //No need to warp the cutter as it's not in the way.
|
|
ENDIF
|
|
ENDIF
|
|
|
|
INT i_num_sticky_bombs
|
|
i_num_sticky_bombs = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STICKYBOMB)
|
|
|
|
IF i_num_sticky_bombs < i_prev_num_sticky_bombs
|
|
i_time_of_last_sticky_bomb_throw = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//Fail the mission if the player doesn't have enough sticky bombs to progress
|
|
IF GET_GAME_TIMER() - i_time_of_last_sticky_bomb_throw > 2000
|
|
IF i_num_sticky_bombs = 0
|
|
//Player has no bombs left, but there's still at least one door to blow up.
|
|
IF (NOT b_vault_door_blown_up[0] AND DOES_BLIP_EXIST(blip_vault_doors[0]))
|
|
OR (NOT b_vault_door_blown_up[1] AND DOES_BLIP_EXIST(blip_vault_doors[1]))
|
|
MISSION_FAILED(FAILED_RAN_OUT_OF_CHARGES)
|
|
ENDIF
|
|
ELIF i_num_sticky_bombs = 1
|
|
//Player has a single bomb left, but both doors need to be blown up.
|
|
IF (NOT b_vault_door_blown_up[0] AND DOES_BLIP_EXIST(blip_vault_doors[0]))
|
|
AND (NOT b_vault_door_blown_up[0] AND DOES_BLIP_EXIST(blip_vault_doors[1]))
|
|
MISSION_FAILED(FAILED_RAN_OUT_OF_CHARGES)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i_prev_num_sticky_bombs = i_num_sticky_bombs
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_WAIT_FOR_DETONATION")
|
|
STOP_AUDIO_SCENE("BS_2B_WAIT_FOR_DETONATION")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_01")
|
|
START_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_01")
|
|
ENDIF
|
|
|
|
//Play a police report once the god text has displayed.
|
|
IF NOT b_has_text_label_triggered[POLICE_REPORT_2]
|
|
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2B_02")
|
|
b_has_text_label_triggered[POLICE_REPORT_2] = TRUE
|
|
ENDIF
|
|
|
|
IF TIMERB() > 500
|
|
IF NOT b_has_text_label_triggered[BS2B_OPEN]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OPEN", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_OPEN] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ELIF TIMERB() > 3000
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(s_crew[CREW_FRANKLIN_ID].blip)
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
s_crew[CREW_FRANKLIN_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[F3B_ABANCREW]
|
|
PRINT_NOW("F3B_ABANCREW", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_ABANCREW] = TRUE
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) > 6400.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_TUNNELS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Check if the shootout started early due to the player taking too long or leaving the area.
|
|
IF s_tunnel_cops_new_1[0].i_event > 0
|
|
OR s_tunnel_cops_new_2[0].i_event > 0
|
|
//If the player ran out of time and the shootout started then play some dialogue.
|
|
IF b_has_text_label_triggered[BS2B_BCOPS]
|
|
IF NOT b_has_text_label_triggered[BS2B_BCOPS2]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COP")
|
|
b_has_text_label_triggered[BS2B_BCOPS2] = TRUE
|
|
SETUP_TUNNEL_CREW_FOR_SHOOTOUT() //Put him into combat mode: increased health, disable ragdoll, etc.
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//"Hurry up" dialogue, if the player doesn't plant any bombs or blow any doors after a set amount of time then play a line.
|
|
IF GET_GAME_TIMER() - i_time_since_last_bomb_activity > 8000
|
|
IF DOES_BLIP_EXIST(blip_vault_doors[0])
|
|
OR DOES_BLIP_EXIST(blip_vault_doors[1])
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT b_has_text_label_triggered[BS2B_TAKE]
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_TAKE")
|
|
b_has_text_label_triggered[BS2B_TAKE] = TRUE
|
|
i_time_since_last_bomb_activity = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_GEN]
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_GEN")
|
|
b_has_text_label_triggered[BS2B_GEN] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for destroying the cutter in a location that blocks progress.
|
|
IF IS_CUTTER_BLOCKING_PROGRESS()
|
|
MISSION_FAILED(FAILED_CUTTER_BLOCKING_TUNNEL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cutter)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_cutter)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_PLANT_C4")
|
|
STOP_AUDIO_SCENE("BS_2B_PLANT_C4")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_WAIT_FOR_DETONATION")
|
|
STOP_AUDIO_SCENE("BS_2B_WAIT_FOR_DETONATION")
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CREW_DRIVE_CUTTER, str_carrec)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_COLLECT_GOLD
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
//SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(model_door_1, v_vault_door_1, FALSE, 0.0)
|
|
//SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(model_door_2, v_vault_door_2, FALSE, 0.0)
|
|
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// New version of COLLECT_GOLD: The crew member collects the gold by hand, while the player defends them.
|
|
PROC DEFEND_CREW_IN_TUNNELS()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<14.7575, -642.5212, 15.0884>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 222.1138)
|
|
|
|
//Need to load the scene first in this case, otherwise everything falls through the ground.
|
|
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
|
|
AND SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
LOAD_SCENE(v_cutter_start_pos)
|
|
|
|
WAIT(1000)
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
|
|
AND SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
|
|
AND SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL()
|
|
AND SETUP_REQ_LARGE_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
|
|
AND SETUP_REQ_TUNNEL_COVER_OBJECTS()
|
|
//AND SETUP_REQ_VAULT_GATES_DESTROYED()
|
|
AND SETUP_REQ_VAULT_ALARM(TRUE)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<14.7575, -642.5212, 15.0884>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 222.1138)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<17.1605, -643.1400, 15.0884>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 123.1396)
|
|
ENDIF
|
|
|
|
GRAB_VAULT_GATES(FALSE)
|
|
|
|
//Frag the gates
|
|
ADD_EXPLOSION(<<2.7727, -660.9886, 16.7971>>, EXP_TAG_GRENADE, 0.5)
|
|
ADD_EXPLOSION(<<7.8554, -662.5552, 16.5439>>, EXP_TAG_GRENADE, 0.5)
|
|
|
|
SETUP_FRANKLIN_OUTFIT(TRUE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
SETTIMERB(0)
|
|
|
|
//Wait for clothes to stream in
|
|
WHILE TIMERB() < 5000
|
|
IF (NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID()))
|
|
SETTIMERB(10000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
WAIT(1000) //This is to allow the explosions to finish before fading back in.
|
|
|
|
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
|
|
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(model_vault_door, v_vault_door_pos, TRUE, 0.0, 0.0)
|
|
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
SETUP_TUNNEL_CREW_FOR_SHOOTOUT()
|
|
DISABLE_WANTED_LEVEL_FOR_SHOOTOUT()
|
|
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(TRUE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_NOOSE_FIGHT_RESTART")
|
|
i_current_music_event = 1
|
|
ELSE
|
|
i_current_music_event = 0
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_01")
|
|
START_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_01")
|
|
ENDIF
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0, TRUE)
|
|
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
s_crew[CREW_FRANKLIN_ID].i_event = 0
|
|
i_time_since_player_last_shot = GET_GAME_TIMER()
|
|
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 7000)
|
|
b_gold_trolley_warped_for_anim = FALSE
|
|
b_moved_doors_out_of_way[0] = FALSE
|
|
b_moved_doors_out_of_way[1] = FALSE
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
|
|
|
|
b_crew_nearly_finished_trolleys = FALSE
|
|
b_trolley_sequence_is_being_blocked = FALSE
|
|
i_current_take = 0
|
|
i_displayed_take = 0
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED() //B*617956: Rayfire resets itself if walking away from the area.
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_LOCK")
|
|
|
|
SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(TRUE)
|
|
UPDATE_CUTTER_SPINNING() //In case the player decides to get in it again.
|
|
UPDATE_CREW_MEMBER_COLLECTING_GOLD()
|
|
UPDATE_TUNNEL_SHOOTOUT_ENEMIES_2()
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_crew[CREW_FRANKLIN_ID].blip)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
s_crew[CREW_FRANKLIN_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
|
|
INT i_num_enemies_left = GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2)
|
|
|
|
IF i_current_music_event = 0
|
|
IF NOT IS_MUSIC_ONESHOT_PLAYING()
|
|
TRIGGER_MUSIC_EVENT("FH2B_NOOSE_FIGHT")
|
|
i_current_music_event++
|
|
ENDIF
|
|
ELSE
|
|
//Prepare the music event for the next cutscene in advance.
|
|
PREPARE_MUSIC_EVENT("FH2B_HELI_ARRIVE")
|
|
ENDIF
|
|
|
|
//God text and start dialogue.
|
|
IF NOT b_has_text_label_triggered[BS2B_BCOPS2] //Crew member spots the cops.
|
|
IF b_has_text_label_triggered[BS2B_BCOPS] //Don't trigger until the cops line plays.
|
|
IF i_num_enemies_left > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_COP")
|
|
b_has_text_label_triggered[BS2B_BCOPS2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[BS2B_BCOPS2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_BCOPS3] //Franklin tells the crew member to load the gold.
|
|
IF i_num_enemies_left > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BCOPS3", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BCOPS3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[BS2B_BCOPS3] = TRUE
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[F3B_DEFGOLD2] //God text to defend the crew member.
|
|
IF i_num_enemies_left > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_STRING_IN_STRING_NOW("F3B_DEFGOLD2", str_crew_names[CREW_FRANKLIN_ID], DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_DEFGOLD2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[F3B_DEFGOLD2] = TRUE
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_HEAR2] //More shouts from Michael at the bank
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR2", CONV_PRIORITY_MEDIUM)
|
|
i_michael_headset_dialogue_timer = GET_GAME_TIMER()
|
|
b_has_text_label_triggered[BS2B_HEAR2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_HEAR3] //More shouts from Michael at the bank
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND GET_GAME_TIMER() - i_michael_headset_dialogue_timer > 19000
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR3", CONV_PRIORITY_MEDIUM)
|
|
i_michael_headset_dialogue_timer = GET_GAME_TIMER()
|
|
b_has_text_label_triggered[BS2B_HEAR3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
IF i_num_enemies_left > 0
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
i_time_since_player_last_shot = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_time_since_player_last_shot > 12000
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_crew[CREW_FRANKLIN_ID].ped, PLAYER_PED_ID())
|
|
APPLY_DAMAGE_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, GET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped) + 50, TRUE)
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[0])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
|
|
DETACH_ENTITY(obj_gold_trolleys[0], TRUE, FALSE)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[0], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_trolleys[1])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
|
|
DETACH_ENTITY(obj_gold_trolleys[1], TRUE, FALSE)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_trolleys[1], 10000.0, 10.0, <<1000.0, 1000.0, 1000.0>>, <<1000.0, 1000.0, 1000.0>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the "more cops" line triggered and the gold hasn't been loaded yet Franklin says a response.
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
|
|
IF b_has_text_label_triggered[BS2B_CRCOPS4]
|
|
IF NOT b_has_text_label_triggered[BS2B_GOTIT] //Franklin finds out where Trevor is
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOTIT", CONV_PRIORITY_MEDIUM)
|
|
i_main_conversation_timer = 0
|
|
b_has_text_label_triggered[BS2B_GOTIT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_HEAR4] //More shouts from Michael at the bank.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND b_has_text_label_triggered[BS2B_HEAR3]
|
|
IF i_main_conversation_timer = 0
|
|
i_main_conversation_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 2200
|
|
AND GET_GAME_TIMER() - i_michael_headset_dialogue_timer > 19000
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR4", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_HEAR4] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play random shouts: make sure these can't interfere with the response dialogue above.
|
|
IF (b_has_text_label_triggered[BS2B_CRCOPS4] AND b_has_text_label_triggered[BS2B_GOTIT])
|
|
OR NOT b_has_text_label_triggered[BS2B_CRCOPS4]
|
|
UPDATE_PLAYER_DEFEND_CREW_DIALOGUE()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_THELI] //Franklin finds out where Trevor is
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_THELI", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_THELI] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[0], obj_gold_containers[0])
|
|
AND IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_trolleys[1], obj_gold_containers[1])
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
BOOL bDialogueFinished
|
|
|
|
IF b_has_text_label_triggered[BS2B_CRGOLD2] //Crew member's line about finishing loading the gold, this is triggered in his AI behaviour.
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
bDialogueFinished = TRUE
|
|
ENDIF
|
|
|
|
IF (bDialogueFinished AND TIMERB() > 2000)
|
|
OR (NOT bDialogueFinished AND TIMERB() > 10000)
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT DOES_ENTITY_EXIST(veh_fake_chopper)
|
|
REQUEST_MODEL(model_gold_chopper)
|
|
REQUEST_MODEL(model_swat)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
|
|
|
|
IF i_num_enemies_left <= 5
|
|
|
|
IF b_crew_nearly_finished_trolleys
|
|
AND i_num_enemies_left <= 2
|
|
IF HAS_MODEL_LOADED(model_gold_chopper)
|
|
AND HAS_MODEL_LOADED(model_swat)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
|
|
veh_fake_chopper = CREATE_VEHICLE(model_gold_chopper, <<211.7976, -246.2731, 120.3408>>, 149.6132)
|
|
SET_ENTITY_INVINCIBLE(veh_fake_chopper, TRUE)
|
|
SET_ENTITY_VISIBLE(veh_fake_chopper, FALSE)
|
|
SET_ENTITY_COLLISION(veh_fake_chopper, FALSE)
|
|
SET_VEHICLE_ENGINE_ON(veh_fake_chopper, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(veh_fake_chopper)
|
|
|
|
ped_fake_chopper = CREATE_PED_INSIDE_VEHICLE(veh_fake_chopper, PEDTYPE_MISSION, model_swat)
|
|
SET_ENTITY_VISIBLE(ped_fake_chopper, FALSE)
|
|
SET_ENTITY_INVINCIBLE(ped_fake_chopper, TRUE)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_fake_chopper, CARREC_HELI_ARRIVE_TREVOR, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_fake_chopper, 8000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_fake_chopper)
|
|
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(veh_fake_chopper, <<0.0, 0.0, -10.0>>)
|
|
ENDIF
|
|
|
|
//Pre-stream some map above the tunnels for the next cutscene.
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_START_SPHERE(<<19.5, -649.9, 31.9>>, 50.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(veh_fake_chopper)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_fake_chopper)
|
|
IF GET_TIME_POSITION_IN_RECORDING(veh_fake_chopper) > 16000.0
|
|
SET_PLAYBACK_SPEED(veh_fake_chopper, 0.0)
|
|
ELSE
|
|
SET_PLAYBACK_SPEED(veh_fake_chopper, 0.5)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Pre-stream some assets in advance.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_new_2) < 3
|
|
SETUP_GOLD_CHOPPERS(v_zero, 0.0, v_zero, 0.0, TRUE)
|
|
SETUP_REQ_CREW_DRIVER_IN_CHOPPER(TRUE)
|
|
SETUP_REQ_TREVOR(v_zero, 0.0, TRUE)
|
|
SETUP_LESTER_IN_CHOPPER(TRUE)
|
|
REQUEST_MODEL(model_rope_hook)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_CREW, str_carrec)
|
|
ENDIF
|
|
|
|
//2001826 - If the cutter wasn't moved in the previous section then we need to move it at the first opportunity.
|
|
IF NOT b_cutter_warped
|
|
AND NOT IS_ENTITY_DEAD(veh_cutter)
|
|
IF IS_POINT_IN_ANGLED_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_cutter, <<0.0536, 6.7800, 1.5680>>),
|
|
<<9.034413,-647.950317,15.085551>>, <<10.894372,-638.945435,18.838383>>, 6.250000)
|
|
IF NOT IS_ENTITY_ON_SCREEN(veh_cutter)
|
|
AND NOT IS_SPHERE_VISIBLE(v_cutter_pos_after_drilling, 8.0)
|
|
SET_ENTITY_COORDS(veh_cutter, v_cutter_pos_after_drilling)
|
|
SET_ENTITY_HEADING(veh_cutter, f_cutter_heading_after_drilling)
|
|
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ", "Cutter has been warped during shootout.")
|
|
|
|
b_cutter_warped = TRUE
|
|
ENDIF
|
|
ELSE
|
|
b_cutter_warped = TRUE //No need to warp the cutter as it's not in the way.
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) > 6400.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_TUNNELS)
|
|
ENDIF
|
|
|
|
IF IS_CUTTER_BLOCKING_PROGRESS()
|
|
MISSION_FAILED(FAILED_CUTTER_BLOCKING_TUNNEL)
|
|
ENDIF
|
|
|
|
//Display the current take once the first gold trolley is loaded.
|
|
IF b_has_text_label_triggered[BS2B_CRGOLD1]
|
|
DISPLAY_TAKE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
UPDATE_TUNNEL_SHOOTOUT_ENEMIES_2() //Guarantees cleanup runs at least once after all enemies are dead (e.g. to make sure stats are tracked).
|
|
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_new_1)
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_new_2)
|
|
|
|
REMOVE_ANIM_DICT(str_anim_trolley_push_out)
|
|
REMOVE_ANIM_DICT(str_anim_trolley_push_in)
|
|
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_enter_left)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_enter_right)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_exit_left)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_gold_exit_right)
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_VAULT_EXPLOSION")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_LOCK")
|
|
|
|
IF i_tunnel_navmesh_block != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_tunnel_navmesh_block)
|
|
i_tunnel_navmesh_block = -1
|
|
ENDIF
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_WINCH_GOLD_CUTSCENE
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_WINCH_GOLD_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC WINCH_GOLD_CUTSCENE()
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<18.8869, -656.3212, 15.0978>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 80.4371)
|
|
|
|
//Need to load the scene first in this case, otherwise everything falls through the ground.
|
|
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
|
|
AND SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
LOAD_SCENE(v_cutter_start_pos)
|
|
|
|
WAIT(1000)
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
|
|
AND SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
|
|
AND SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
|
|
AND SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
|
|
AND SETUP_REQ_VAULT_ALARM(TRUE)
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
GRAB_VAULT_GATES(FALSE)
|
|
|
|
//Frag the gates
|
|
ADD_EXPLOSION(<<2.7727, -660.9886, 16.7971>>, EXP_TAG_GRENADE, 0.5)
|
|
ADD_EXPLOSION(<<7.8554, -662.5552, 16.5439>>, EXP_TAG_GRENADE, 0.5)
|
|
|
|
SETUP_FRANKLIN_OUTFIT(TRUE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_CREW, str_carrec)
|
|
REQUEST_CUTSCENE("bs_2b_mcs_1")
|
|
REQUEST_MODEL(model_rope_hook)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_mcs_1")
|
|
|
|
IF SETUP_GOLD_CHOPPERS(<<211.7976, -246.2731, 120.3408>>, 149.6132, <<244.2724, -264.6229, 127.8352>>, 148.9453)
|
|
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
AND SETUP_REQ_TREVOR(<<136.4691, -347.8948, 81.6682>>)
|
|
AND SETUP_LESTER_IN_CHOPPER()
|
|
AND SETUP_REQ_TUNNEL_COVER_OBJECTS(TRUE)
|
|
AND SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(TRUE, TRUE, TRUE)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_ARRIVE_CREW, str_carrec)
|
|
AND HAS_MODEL_LOADED(model_rope_hook)
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
SETUP_REQ_TUNNEL_COVER_OBJECTS()
|
|
SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
|
|
|
|
SETUP_TREVOR_OUTFIT()
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
REMOVE_PED(ped_fake_chopper, TRUE)
|
|
REMOVE_VEHICLE(veh_fake_chopper, TRUE)
|
|
|
|
//Remove the open gold containers, replace them with the closed ones and reattach the trolleys.
|
|
REMOVE_OBJECT(obj_gold_containers[0], TRUE)
|
|
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
|
|
SETUP_REQ_EMPTY_GOLD_CONTAINERS_IN_TUNNEL(FALSE, TRUE, TRUE)
|
|
SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
|
|
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), e_weapon_before_cutscene)
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<20.6039, -636.3605, 15.0772>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 277.6608)
|
|
|
|
obj_rope_hook = CREATE_OBJECT(model_rope_hook, <<44.9, -634.2, 10.5>>)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_rope_hook)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], s_gold_choppers[0].veh, VS_DRIVER)
|
|
ENDIF
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HELI_ARRIVE_TREVOR, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 12000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_ARRIVE_CREW, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 11000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
REPOSITION_VAULT_GATES_FOR_SHOOTOUT()
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_PED_MAX_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
|
|
SET_ENTITY_HEALTH(s_crew[CREW_FRANKLIN_ID].ped, 1800)
|
|
ENDIF
|
|
|
|
//NOTE: can't do clear area here as it will repair the vault doors.
|
|
STOP_FIRE_IN_RANGE(<<20.6039, -636.3605, 15.0772>>, 100.0)
|
|
CLEAR_AREA_OF_PROJECTILES(<<20.6039, -636.3605, 15.0772>>, 100.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(<<20.6039, -636.3605, 15.0772>>, 100.0)
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<22.065281,-603.449951,55.915459>>,<<-42.069878,-0.005891,-175.491959>>,32.632004, TRUE)
|
|
SET_CAM_PARAMS(cam_main, <<21.285315,-606.179077,55.915459>>,<<-25.890034,-0.005891,-176.476944>>,32.632004, 5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
SHAKE_CAM(cam_main, "HAND_SHAKE", 0.5)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("GtaMloRoomTun2")
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(model_vault_door, v_vault_door_pos, TRUE, 0.0, 0.0, 1.0)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2B_HELI_RESTART")
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2B_HELI_ARRIVE")
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
i_current_music_event = 0
|
|
f_heli_hover_speed = 1.0
|
|
i_current_take = MAX_OVERALL_TAKE
|
|
i_displayed_take = i_current_take
|
|
|
|
SETTIMERB(0)
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ELSE
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
DISPLAY_TAKE()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2294801
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
|
|
REQUEST_CUTSCENE("bs_2b_mcs_1")
|
|
REQUEST_MODEL(PROP_GOLF_BALL)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_mcs_1")
|
|
|
|
IF TIMERB() > 4500
|
|
AND HAS_MODEL_LOADED(PROP_GOLF_BALL)
|
|
AND HAS_CUTSCENE_LOADED()
|
|
//Setup all the weapons
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 100)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
|
|
obj_cutscene_weapons[0] = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(obj_cutscene_weapons[0], "Franklins_Weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(s_crew[CREW_FRANKLIN_ID].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_TO_PED(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
|
|
obj_cutscene_weapons[1] = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(s_crew[CREW_FRANKLIN_ID].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(obj_cutscene_weapons[1], "HC_Gunman1_2_Handedweapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
obj_winch_cutscene_helper[0] = CREATE_OBJECT(PROP_GOLF_BALL, <<22.065281,-603.449951,105.915459>>)
|
|
obj_winch_cutscene_helper[1] = CREATE_OBJECT(PROP_GOLF_BALL, <<22.065281,-603.449951,106.915459>>)
|
|
SET_ENTITY_VISIBLE(obj_winch_cutscene_helper[0], FALSE)
|
|
SET_ENTITY_VISIBLE(obj_winch_cutscene_helper[1], FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_GOLF_BALL)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(obj_gold_containers[0], "Prop_Gold_Cont_01", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(obj_gold_containers[1], "Prop_Gold_Cont_01^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(obj_rope_hook, "prop_rope_hook_01", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SETTIMERB(0)
|
|
b_skipped_mocap = FALSE
|
|
i_current_event++
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
e_section_stage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
AND NOT b_skipped_mocap
|
|
e_section_stage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
//Delete the scripted cam and get both helicopters onto their hover recordings once the mocap starts
|
|
IF DOES_CAM_EXIST(cam_main)
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 6000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 25000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
DESTROY_CAM(cam_main)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Update the rope to match the cutscene object)
|
|
IF IS_CUTSCENE_PLAYING()
|
|
AND DOES_ENTITY_EXIST(obj_rope_hook)
|
|
//#IF IS_DEBUG_BUILD
|
|
// SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
// DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(obj_rope_hook, <<0.0, 0.0, 0.1>>), 0.05)
|
|
//#ENDIF
|
|
|
|
IF NOT DOES_ROPE_EXIST(rope_cutscene)
|
|
SET_ENTITY_COORDS(obj_winch_cutscene_helper[0], <<23.1, -636.9, 22.4>>)
|
|
FREEZE_ENTITY_POSITION(obj_winch_cutscene_helper[0], TRUE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_winch_cutscene_helper[1], obj_rope_hook, GET_ENTITY_BONE_INDEX_BY_NAME(obj_rope_hook, "ROPE_ATTATCH"), <<0.0, 0.0, -0.01>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
VECTOR v_helper_pos, v_hook_pos
|
|
FLOAT f_rope_length
|
|
|
|
v_helper_pos = GET_ENTITY_COORDS(obj_winch_cutscene_helper[0])
|
|
v_hook_pos = GET_ENTITY_COORDS(obj_winch_cutscene_helper[1])
|
|
f_rope_length = VMAG(v_helper_pos - v_hook_pos)
|
|
|
|
IF f_rope_length < 20.0 //Don't attach the rope until the cutscene hook is animating in the right place.
|
|
rope_cutscene = ADD_ROPE(v_helper_pos, <<0.0, 90.0, 0.0>>, f_rope_length, PHYSICS_ROPE_DEFAULT_WIRE, f_rope_length, f_rope_length)
|
|
|
|
ATTACH_ENTITIES_TO_ROPE(rope_cutscene, obj_winch_cutscene_helper[0], obj_winch_cutscene_helper[1],
|
|
v_helper_pos, v_hook_pos, f_rope_length, 0, 0)
|
|
ROPE_SET_UPDATE_ORDER(rope_cutscene, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_TUNNEL_SHOOTOUT_ENEMIES()
|
|
HOVER_HELI_USING_RECORDING(s_gold_choppers[0].veh, f_heli_hover_speed, 4000.0, 12000.0)
|
|
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_WAIT_FOR_TREVOR)
|
|
REQUEST_ACTION_MODE_ASSET("FRANKLIN_ACTION")
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
|
|
//SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<20.2, -639.9, 15.0882>>)
|
|
//SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 117.3504)
|
|
//SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Gunman1_2_Handedweapon")
|
|
GIVE_WEAPON_OBJECT_TO_PED(obj_cutscene_weapons[1], s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
|
|
|
|
IF HAS_ACTION_MODE_ASSET_LOADED("FRANKLIN_ACTION")
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ACTIONMODE_IDLE, FALSE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
|
|
SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklins_Weapon")
|
|
GIVE_WEAPON_OBJECT_TO_PED(obj_cutscene_weapons[0], PLAYER_PED_ID())
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE) < 200
|
|
SET_PED_AMMO(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("prop_rope_hook_01")
|
|
IF DOES_ROPE_EXIST(rope_cutscene)
|
|
DELETE_ROPE(rope_cutscene)
|
|
ENDIF
|
|
|
|
REMOVE_OBJECT(obj_winch_cutscene_helper[0], TRUE)
|
|
REMOVE_OBJECT(obj_winch_cutscene_helper[1], TRUE)
|
|
REMOVE_OBJECT(obj_rope_hook, TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(127.1 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF i_current_music_event = 0
|
|
IF NOT IS_MUSIC_ONESHOT_PLAYING()
|
|
i_current_music_event++
|
|
ENDIF
|
|
ELIF i_current_music_event = 1
|
|
PREPARE_MUSIC_EVENT("FH2B_FIGHT_START")
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
DESTROY_ALL_CAMS()
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
IF DOES_ROPE_EXIST(rope_cutscene)
|
|
DELETE_ROPE(rope_cutscene)
|
|
ENDIF
|
|
|
|
REMOVE_OBJECT(obj_cutscene_weapons[0], TRUE)
|
|
REMOVE_OBJECT(obj_cutscene_weapons[1], TRUE)
|
|
REMOVE_OBJECT(obj_winch_cutscene_helper[0], TRUE)
|
|
REMOVE_OBJECT(obj_winch_cutscene_helper[1], TRUE)
|
|
|
|
REMOVE_ANIM_DICT(str_anim_crew_action_idle)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_GOLF_BALL)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_TUNNEL_SHOOTOUT
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
IF IS_CUTSCENE_PLAYING()
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_CUTSCENE()
|
|
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
b_skipped_mocap = TRUE
|
|
ELSE
|
|
JUMP_TO_STAGE(STAGE_TUNNEL_SHOOTOUT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TUNNEL_SHOOTOUT()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
INT i = 0
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF SETUP_REQ_PLAYER_AS_FRANKLIN()
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(<<19.3153, -636.0062, 15.0881>>, 155.6458, FALSE, TRUE)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<19.3153, -636.0062, 15.0881>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 155.6458)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
SETUP_FRANKLIN_OUTFIT(TRUE)
|
|
|
|
WHILE NOT SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
OR NOT SETUP_REQ_VAULT_ALARM(TRUE)
|
|
OR NOT SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
|
|
OR NOT DOES_ENTITY_EXIST(veh_cutter)
|
|
OR NOT DOES_ENTITY_EXIST(s_crew[CREW_FRANKLIN_ID].ped)
|
|
OR NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(obj_gold_containers[0])
|
|
OR NOT DOES_ENTITY_EXIST(obj_gold_trolleys[0])
|
|
OR NOT DOES_ENTITY_EXIST(obj_tunnel_crates[0])
|
|
OR NOT DOES_ENTITY_EXIST(s_gold_choppers[0].veh)
|
|
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
|
|
SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
|
|
SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
|
|
SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
SETUP_GOLD_CHOPPERS(<<32.0823, -604.9429, 61.9758>>, 159.2227, <<38.0823, -594.9429, 64.9758>>, 159.2227)
|
|
SETUP_REQ_TREVOR(<<18.8869, -656.3212, 15.0978>>)
|
|
SETUP_REQ_TUNNEL_COVER_OBJECTS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
WHILE NOT SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
OR NOT SETUP_LESTER_IN_CHOPPER()
|
|
OR NOT SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
|
|
OR NOT SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
|
|
OR NOT s_tunnel_cops_1[0].b_is_created
|
|
OR NOT s_tunnel_cops_2[0].b_is_created
|
|
UPDATE_TUNNEL_SHOOTOUT_ENEMIES()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_TREVOR_OUTFIT()
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
IF b_has_used_checkpoint
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
ELSE
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<19.3153, -636.0062, 15.0881>>, 40.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
|
|
WHILE TIMERB() < 10000
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND ((NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_FRANKLIN_ID].ped))
|
|
OR IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped))
|
|
SETTIMERB(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_TREVOR], s_gold_choppers[0].veh)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 20000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
|
|
|
|
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 45000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
|
|
IF DOES_ENTITY_EXIST(obj_rope_weights[1])
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_rope_weights[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<19.3153, -636.0062, 15.0881>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 155.6458)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(127.1 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
GRAB_VAULT_GATES(FALSE)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE) < 200
|
|
SET_PED_AMMO(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
REMOVE_COVER_POINT(s_franklin.cover)
|
|
|
|
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
|
|
|
|
i_current_take = MAX_OVERALL_TAKE
|
|
i_displayed_take = i_current_take
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ELSE
|
|
DISABLE_WANTED_LEVEL_FOR_SHOOTOUT()
|
|
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(TRUE)
|
|
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[0], FALSE)
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[1], FALSE)
|
|
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(model_vault_door, v_vault_door_pos, TRUE, 0.0, 0.0, 1.0)
|
|
|
|
//Get the choppers into their start positions at the shootout:
|
|
// - Trevor has already picked up one container and flown off.
|
|
// - The crew member has just attached the second container.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 21000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
|
|
|
|
//Update the gold container to match the chopper's new position otherwise the attachment will screw up.
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 45000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
|
|
//Update the weight to match, and also the container in preparation for the attach that takes place during the shootout (this should take place off-screen).
|
|
IF DOES_ENTITY_EXIST(obj_rope_weights[1])
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_rope_weights[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MIN_LENGTH>>)
|
|
ENDIF
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, v_rope_heli_attach_offset) + <<0.0, 0.0, -ROPE_MAX_LENGTH>>)
|
|
|
|
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_HOVER_OVER_TUNNEL)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
//If we skipped here just set up the second trolley ropes now.
|
|
WHILE NOT SETUP_REQ_TROLLEY_ATTACHED_TO_UNWOUND_HELI_ROPES(1)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
//If the player skipped from the previous cutscene then give them the weapon they had in the shootout. If they came here via checkpoint then give them a fail weapon.
|
|
IF e_weapon_before_cutscene != WEAPONTYPE_UNARMED
|
|
AND e_weapon_before_cutscene != WEAPONTYPE_INVALID
|
|
AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), e_weapon_before_cutscene)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), e_weapon_before_cutscene, FALSE)
|
|
ELSE
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_FIGHT_1_RESTART")
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2B_FIGHT_START")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_02")
|
|
START_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_02")
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0, TRUE)
|
|
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
|
|
|
|
//Unlock some of the vault gates, so SWAT peds can come through.
|
|
DOOR_SYSTEM_SET_DOOR_STATE(i_bank_door_hashes[8], DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(i_bank_door_hashes[9], DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
s_crew[CREW_DRIVER_ID].i_timer = 0
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_FRANKLIN_ID].ped, <<20.2, -639.9, 15.0882>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_FRANKLIN_ID].ped, 126.3504)
|
|
SET_PED_USING_ACTION_MODE(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
WHILE TIMERB() < 500
|
|
UPDATE_GUNMAN_FOR_VAULT_SHOOTOUT()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
//Frag the gates
|
|
ADD_EXPLOSION(<<2.7727, -660.9886, 16.7971>>, EXP_TAG_ROCKET, 1.0, FALSE, TRUE, 0.0)
|
|
ADD_EXPLOSION(<<7.8554, -662.5552, 16.5439>>, EXP_TAG_ROCKET, 1.0, FALSE, TRUE, 0.0)
|
|
|
|
//REPOSITION_VAULT_GATES_FOR_SHOOTOUT()
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
UPDATE_GUNMAN_FOR_VAULT_SHOOTOUT()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
DISPLAY_TAKE()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ELSE
|
|
s_crew[CREW_DRIVER_ID].i_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
|
|
|
|
i_player_combat_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 7000)
|
|
i_current_music_event = 0
|
|
s_crew[CREW_FRANKLIN_ID].i_event = 0
|
|
s_crew[CREW_DRIVER_ID].i_event = 0
|
|
|
|
f_heli_hover_speed = 1.0
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_TUNNEL_SHOOTOUT, "TUNNEL_SHOOTOUT")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
|
|
|
|
SETTIMERB(0)
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2294801
|
|
|
|
SET_POLICE_RADAR_BLIPS(FALSE)
|
|
|
|
IF i_current_event = 0
|
|
SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(TRUE)
|
|
ENDIF
|
|
UPDATE_TUNNEL_SHOOTOUT_ENEMIES()
|
|
SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED() //B*617956: Rayfire resets itself if walking away from the area.
|
|
DISPLAY_TAKE()
|
|
UPDATE_GUNMAN_FOR_VAULT_SHOOTOUT()
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
IF s_tunnel_cops_3[0].b_is_created
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_3) < 3
|
|
NEW_LOAD_SCENE_START(<<29.8, -604.5, 71.6>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-36.7, 0.0, -22.1>>), 150.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
UPDATE_CUTTER_SPINNING()
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_crew[CREW_FRANKLIN_ID].blip)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_FRANKLIN_ID].ped)
|
|
s_crew[CREW_FRANKLIN_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_FRANKLIN_ID].ped)
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2b) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_3) = 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
//Trevor says a line indicating to switch.
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TRAPPEL", CONV_PRIORITY_MEDIUM)
|
|
|
|
IF b_has_text_label_triggered[BS2B_TRAPPEL] = FALSE
|
|
REPLAY_RECORD_BACK_FOR_TIME(6.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
b_has_text_label_triggered[BS2B_TRAPPEL] = TRUE
|
|
|
|
SET_RAPPEL_ASSETS_AS_NO_LONGER_NEEDED()
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_TREVOR, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(s_selector_peds, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
|
|
IF interior_tunnels[0] != NULL
|
|
UNPIN_INTERIOR(interior_tunnels[0])
|
|
interior_tunnels[0] = NULL
|
|
ENDIF
|
|
|
|
IF interior_tunnels[1] != NULL
|
|
UNPIN_INTERIOR(interior_tunnels[1])
|
|
interior_tunnels[1] = NULL
|
|
ENDIF
|
|
|
|
IF interior_vault != NULL
|
|
UNPIN_INTERIOR(interior_vault)
|
|
interior_vault = NULL
|
|
ENDIF
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_OPENTUNNEL] //Crew member says a line to get the shootout going
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_OPEN")
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_OPENTUNNEL] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[F3B_DEFGOLD]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3B_DEFGOLD", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_DEFGOLD] = TRUE
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_TFIGHT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TFIGHT", CONV_PRIORITY_MEDIUM)
|
|
i_main_conversation_timer = 0
|
|
b_has_text_label_triggered[BS2B_TFIGHT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_HEAR5] //Final lines for Michael shouting.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF i_main_conversation_timer = 0
|
|
i_main_conversation_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 1700
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_HEAR5", CONV_PRIORITY_MEDIUM)
|
|
i_main_conversation_timer = 0
|
|
b_has_text_label_triggered[BS2B_HEAR5] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Player shouts during combat.
|
|
UPDATE_PLAYER_TUNNEL_SHOOTOUT_DIALOGUE()
|
|
ENDIF
|
|
|
|
IF i_current_music_event = 0
|
|
IF NOT IS_MUSIC_ONESHOT_PLAYING()
|
|
i_current_music_event++
|
|
ENDIF
|
|
ELIF i_current_music_event = 1
|
|
PREPARE_MUSIC_EVENT("FH2B_SWITCH_2")
|
|
ENDIF
|
|
|
|
//Fail if player tries to run away
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) > 6400.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_TUNNELS)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
UPDATE_CUTTER_SPINNING()
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_02")
|
|
STOP_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_02")
|
|
ENDIF
|
|
|
|
IF UPDATE_SELECTOR_HUD(s_selector_peds, FALSE)
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
CLEAR_PRINTS()
|
|
DESTROY_ALL_CAMS()
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
|
|
|
|
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
|
|
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_TREVOR, FALSE)
|
|
|
|
//Stop playback on Trevor's chopper once the switch starts, update the container to match the new position.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(s_gold_choppers[0].veh, <<0.0, 0.0, 10.0>>)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 20000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Clean up the cutter.
|
|
STOP_CUTTER_SPINNING()
|
|
|
|
REMOVE_ANIM_DICT(str_anim_cutter)
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_01")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_CUTTER_02")
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_SWITCH_2")
|
|
|
|
SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(FALSE)
|
|
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(FALSE)
|
|
|
|
REPEAT COUNT_OF(obj_tunnel_crates) i
|
|
REMOVE_OBJECT(obj_tunnel_crates[i], FALSE)
|
|
ENDREPEAT
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[F3B_SWITREV]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3B_SWITREV", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_SWITREV] = TRUE
|
|
i_main_conversation_timer = 0
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_USURE]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_DO_ALL_CHECKS)
|
|
IF i_main_conversation_timer = 0
|
|
i_main_conversation_timer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_main_conversation_timer > 5000
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_USURE", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_USURE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if player tries to run away
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_vault_area_centre) > 6400.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_TUNNELS)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(s_selector_cam, SWITCH_TYPE_SHORT)
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF s_selector_cam.bPedSwitched
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_selector_cam.bOKToSwitchPed
|
|
IF NOT s_selector_cam.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE, TRUE)
|
|
//Warp the buddy chopper into a better position when returning to gameplay
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 57500.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 1.0)
|
|
|
|
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.5)
|
|
SET_VEHICLE_ENGINE_HEALTH(s_gold_choppers[0].veh, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[0].veh, 1000.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REMOVE_ALL_BLIPS()
|
|
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
|
|
REPEAT COUNT_OF(s_tunnel_cops_3_rappel_data) i
|
|
CLEANUP_RAPPEL(s_tunnel_cops_3_rappel_data[i])
|
|
ENDREPEAT
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-25.0)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
s_selector_cam.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF s_selector_cam.bPedSwitched
|
|
// IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_JUMPCUT_DESCENT
|
|
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10.0)
|
|
// ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Disable climbing over the rubble.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<4.070398,-665.754761,14.744704>>, <<5.399380,-662.305359,19.130619>>, 5.250000)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
ENDIF
|
|
|
|
//Handle the sequence of events for winching the gold, the player should just see the last trolley going up.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
FLOAT f_trevor_playback_time, f_crew_playback_time
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
f_trevor_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
f_crew_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
SWITCH s_crew[CREW_DRIVER_ID].i_event
|
|
CASE 0 //Attach the last trolley off-screen.
|
|
IF SETUP_REQ_TROLLEY_ATTACHED_TO_UNWOUND_HELI_ROPES(1)
|
|
STOP_ROPE_UNWINDING_FRONT(s_heli_ropes_new[4].rope)
|
|
STOP_ROPE_UNWINDING_FRONT(s_heli_ropes_new[5].rope)
|
|
STOP_ROPE_UNWINDING_FRONT(s_heli_ropes_new[6].rope)
|
|
STOP_ROPE_UNWINDING_FRONT(s_heli_ropes_new[7].rope)
|
|
s_crew[CREW_DRIVER_ID].i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //lift the second trolley up and keep hovering.
|
|
//Just before the rappelling peds start to show up move the chopper away.
|
|
IF NOT b_has_text_label_triggered[BS2B_TLEAVE]
|
|
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_HOVER_OVER_TUNNEL)
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_1) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2) + GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_tunnel_cops_2b) <= 2
|
|
//Trevor says a line about the guys rappelling in.
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TLEAVE", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_TLEAVE] = TRUE
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Once the chopper is out of view then freeze it until the next section.
|
|
IF f_crew_playback_time < 67000.0
|
|
IF f_crew_playback_time < 49000.0
|
|
AND NOT IS_ENTITY_ON_SCREEN(s_gold_choppers[1].veh)
|
|
AND NOT s_selector_cam.bPedSwitched
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 49500.0)
|
|
ENDIF
|
|
|
|
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_LEAVE_BANK)
|
|
ELSE
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
START_ROPE_WINDING(s_heli_ropes_new[4].rope)
|
|
START_ROPE_WINDING(s_heli_ropes_new[5].rope)
|
|
START_ROPE_WINDING(s_heli_ropes_new[6].rope)
|
|
START_ROPE_WINDING(s_heli_ropes_new[7].rope)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Wind up Trevor's rope off-screen.
|
|
IF SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
|
|
START_ROPE_WINDING(s_heli_ropes_new[0].rope)
|
|
START_ROPE_WINDING(s_heli_ropes_new[1].rope)
|
|
START_ROPE_WINDING(s_heli_ropes_new[2].rope)
|
|
START_ROPE_WINDING(s_heli_ropes_new[3].rope)
|
|
ENDIF
|
|
|
|
//Once Trevor has the gold keep him hovering until the player starts the switch sequence (don't do after switching).
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF f_trevor_playback_time > 22000.0
|
|
AND e_section_stage != SECTION_STAGE_CLEANUP
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Gunman's behaviour.
|
|
|
|
|
|
IF IS_CUTTER_BLOCKING_PROGRESS()
|
|
MISSION_FAILED(FAILED_CUTTER_BLOCKING_TUNNEL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
STOP_ROPE_WINDING(s_heli_ropes_new[i].rope)
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DESTROY_ALL_CAMS()
|
|
|
|
//Call once more to guarantee cleanup for all enemies.
|
|
UPDATE_TUNNEL_SHOOTOUT_ENEMIES()
|
|
|
|
REPEAT COUNT_OF(obj_tunnel_crates) i
|
|
REMOVE_OBJECT(obj_tunnel_crates[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REMOVE_OBJECT(obj_vault_gates[0])
|
|
REMOVE_OBJECT(obj_vault_gates[1])
|
|
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_1)
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_2)
|
|
REMOVE_ENEMY_GROUP(s_tunnel_cops_2b)
|
|
|
|
SET_COVER_POINTS_BY_RUBBLE_RAYFIRE_ACTIVE(FALSE)
|
|
SET_SCRIPTED_TUNNEL_COVER_ACTIVE(FALSE)
|
|
REMOVE_COVER_POINT(s_crew[CREW_FRANKLIN_ID].cover)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_VAULT_SHOOTOUT_02")
|
|
STOP_AUDIO_SCENE("BS_2B_VAULT_SHOOTOUT_02")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_NOOSE_ABSEIL_SCENE")
|
|
STOP_AUDIO_SCENE("BS_2B_NOOSE_ABSEIL_SCENE")
|
|
ENDIF
|
|
|
|
SET_RAPPEL_ASSETS_AS_NO_LONGER_NEEDED()
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
REMOVE_ACTION_MODE_ASSET("FRANKLIN_ACTION")
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_LEAVE_BANK
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_LEAVE_BANK)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC LEAVE_BANK()
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<38.0410, -599.7668, 41.6337>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 80.4371)
|
|
|
|
//Need to load the scene first in this case, otherwise everything falls through the ground.
|
|
IF SETUP_REQ_PLAYER_AS_TREVOR()
|
|
AND SETUP_REQ_TUNNEL_INTERIOR_READY()
|
|
AND SETUP_GOLD_CHOPPERS(<<32.0823, -604.9429, 61.9758>>, 159.2227, <<38.0823, -594.9429, 64.9758>>, 159.2227)
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
LOAD_SCENE(<<32.0823, -604.9429, 61.9758>>)
|
|
|
|
WAIT(1000)
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
|
|
IF SETUP_REQ_CUTTER(v_cutter_pos_after_drilling, f_cutter_heading_after_drilling)
|
|
AND SETUP_REQ_ONE_CREW_MEMBER_UNDERGROUND()
|
|
AND SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
AND SETUP_REQ_RAYFIRE_WALL_ALREADY_DRILLED()
|
|
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
AND SETUP_LESTER_IN_CHOPPER()
|
|
AND SETUP_REQ_FRANKLIN(<<18.8869, -656.3212, 15.0978>>)
|
|
AND SETUP_REQ_TUNNEL_ENTITIES_IN_PLACE_FOR_SHOOTOUT()
|
|
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0) //New test version: 4 ropes
|
|
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(1)
|
|
AND SETUP_REQ_VAULT_ALARM(TRUE)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
SETUP_FRANKLIN_OUTFIT(TRUE)
|
|
SETUP_TREVOR_OUTFIT()
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cutter)
|
|
FREEZE_ENTITY_POSITION(veh_cutter, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(veh_cutter, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_ENTITY_COORDS(s_gold_choppers[0].veh, <<38.0410, -599.7668, 41.6337>>)
|
|
SET_ENTITY_HEADING(s_gold_choppers[0].veh, 342.4966)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 18000.0)
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(s_gold_choppers[0].veh, <<0.0, 0.0, 10.0>>)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 1.0)
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, v_rope_heli_attach_offset + <<0.0, 0.0, -ROPE_START_LENGTH>>))
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh))
|
|
ENDIF
|
|
|
|
//Hide Franklin out of the way for now
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], <<12.8530, -647.5173, 9.7693>>)
|
|
ENDIF
|
|
|
|
SET_PORTAL_SETTINGS_OVERRIDE("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN")
|
|
|
|
i_current_take = MAX_OVERALL_TAKE
|
|
i_displayed_take = i_current_take
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
|
|
IF interior_tunnels[0] != NULL
|
|
UNPIN_INTERIOR(interior_tunnels[0])
|
|
interior_tunnels[0] = NULL
|
|
ENDIF
|
|
|
|
IF interior_tunnels[1] != NULL
|
|
UNPIN_INTERIOR(interior_tunnels[1])
|
|
interior_tunnels[1] = NULL
|
|
ENDIF
|
|
|
|
IF interior_vault != NULL
|
|
UNPIN_INTERIOR(interior_vault)
|
|
interior_vault = NULL
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2B_LEAVE_RESTART")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_HELI_TAKE_GOLD")
|
|
START_AUDIO_SCENE("BS_2B_HELI_TAKE_GOLD")
|
|
ENDIF
|
|
|
|
//Make sure the crew recording is reset is turned off if arriving here from the previous section (the recording updates below will make sure it's restarted in the right place).
|
|
//IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
// IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
// STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
|
|
// ENDIF
|
|
//ENDIF
|
|
|
|
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
s_crew[CREW_DRIVER_ID].i_event = 0
|
|
SETTIMERA(0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF TIMERA() > 1000
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_TREVOR_COLLECT_GOLD, str_carrec)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
|
|
AND GET_ENTITY_HEIGHT_ABOVE_GROUND(s_gold_choppers[0].veh) > 5.0
|
|
MISSION_FAILED(FAILED_BAILED_OUT_OF_CHOPPER)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(s_locates_data)
|
|
#ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
IF NOT DOES_BLIP_EXIST(s_gold_choppers[1].blip)
|
|
s_gold_choppers[1].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_DRIVER_ID].ped)
|
|
ENDIF
|
|
|
|
IF s_crew[CREW_DRIVER_ID].i_event = 0
|
|
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_LEAVE_BANK)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
s_crew[CREW_DRIVER_ID].i_event++
|
|
ENDIF
|
|
ELIF s_crew[CREW_DRIVER_ID].i_event = 1
|
|
UPDATE_CREW_HELI_PLAYBACK(HELI_STAGE_LEAVE_BANK, TRUE)
|
|
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
TASK_HELI_MISSION(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh, NULL, NULL, v_airfield_pos, MISSION_GOTO, 20.0, 5.0, -30.0, 50, 30)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
|
|
s_crew[CREW_DRIVER_ID].i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
IF NOT b_has_text_label_triggered[BS2B_GOGO]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOGO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOGO] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_CHAT]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, s_lester.ped, "LESTER")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CHAT", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_CHAT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, 0.001>>, FALSE, s_gold_choppers[0].veh,
|
|
"F3B_GOFIELD", "", "F3B_GETBACKHELI", TRUE)
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETUP_REQ_MICHAEL(<<12.8530, -647.5173, 9.7693>>, f_michael_shootout_start_heading, TRUE)
|
|
|
|
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT b_has_text_label_triggered[BS2B_GOBACK]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_gold_pickup_pos) > 90000.0 //300m
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOBACK", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GOBACK] = TRUE
|
|
SETTIMERB(0)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_OTH]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_FRANKLIN_ID, s_crew[CREW_FRANKLIN_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_OTH")
|
|
b_has_text_label_triggered[BS2B_OTH] = TRUE
|
|
SETTIMERB(0)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_OKAY]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OKAY", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_OKAY] = TRUE
|
|
SETTIMERB(0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data) AND b_has_text_label_triggered[BS2B_OKAY])
|
|
OR TIMERB() > 20000 //TEMP: currently the dialogue gets stuck, this timer prevents a PT where the mission doesn't progress.
|
|
IF TIMERB() > 20000
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 7.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_MICHAEL, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(s_selector_peds, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
PRINT_NOW("F3B_SWIMICH", DEFAULT_GOD_TEXT_TIME, 0)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
REMOVE_VEHICLE(veh_cutter, TRUE)
|
|
|
|
//Create Michael in a hidden spot.
|
|
SETUP_REQ_MICHAEL(<<12.8530, -647.5173, 9.7693>>, f_michael_shootout_start_heading)
|
|
|
|
If NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF UPDATE_SELECTOR_HUD(s_selector_peds, FALSE)
|
|
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<4.0, -665.6, 49.6>>) < 40000.0 //Auto-switch if the player tries to fly back to the vault.
|
|
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<4.0, -665.6, 49.6>>) > 3610000.0 //Auto-switch if the player flies miles away.
|
|
CLEAR_PRINTS()
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(obj_gold_containers[0], s_gold_choppers[0].veh, FALSE)
|
|
ENDIF
|
|
|
|
//Move Michael to the switch location
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], v_michael_shootout_start_pos)
|
|
SET_ENTITY_HEADING(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], f_michael_shootout_start_heading)
|
|
GIVE_WEAPON_TO_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_ADVANCEDRIFLE, 500, TRUE)
|
|
FREEZE_ENTITY_POSITION(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_MICHAEL)
|
|
s_selector_cam.pedTo = s_selector_peds.pedID[SELECTOR_PED_MICHAEL]
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
FLOAT f_heading
|
|
VECTOR v_dest, v_pos, v_dir
|
|
f_heading = GET_ENTITY_HEADING(s_gold_choppers[0].veh)
|
|
v_dir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, f_heading>>)
|
|
v_pos = GET_ENTITY_COORDS(s_gold_choppers[0].veh)
|
|
v_dest = v_pos + (v_dir * 200.0) + <<0.0, 0.0, 200.0>>
|
|
|
|
TASK_HELI_MISSION(PLAYER_PED_ID(), s_gold_choppers[0].veh, NULL, NULL, v_dest, MISSION_GOTO, 30.0, 5.0, f_heading, 200, 100)
|
|
ENDIF
|
|
|
|
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_LEAVE_BANK")
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
IF IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
|
|
STOP_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", TRUE)
|
|
ENDIF
|
|
|
|
s_michael.i_event = 0
|
|
|
|
SETTIMERB(0)
|
|
i_current_event = 50
|
|
ELSE
|
|
IF TIMERB() > 10000
|
|
SET_SELECTOR_PED_DAMAGED(s_selector_peds, SELECTOR_PED_MICHAEL, TRUE)
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_NSWITCH]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NSWITCH", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_NSWITCH] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50
|
|
SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(v_gunman_shootout_start_pos, f_crew_shootout_start_heading)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_SHOOT_AT_COORD) != PERFORMING_TASK
|
|
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
|
|
|
|
SET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, <<-3.1672, -669.1010, 48.4785>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_MICHAEL_ID].ped, 113.6377)
|
|
|
|
TASK_SHOOT_AT_COORD(s_crew[CREW_MICHAEL_ID].ped, <<-53.3699, -691.1768, 49.7996>>, -1, FIRING_TYPE_CLIP)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
/*IF NOT IS_PED_IN_COVER(s_crew[CREW_MICHAEL_ID].ped)
|
|
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
|
|
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, v_gunman_shootout_start_pos, f_crew_shootout_start_heading,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(s_crew[CREW_MICHAEL_ID].ped, v_gunman_shootout_start_pos, -1, FALSE, 0.0, TRUE, FALSE, s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF*/
|
|
ENDIF
|
|
|
|
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(s_selector_cam, SWITCH_TYPE_LONG)
|
|
//As a failsafe put Michael back if he falls through the map.
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_michael_shootout_start_pos) > 25.0
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_michael_shootout_start_pos)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), f_michael_shootout_start_heading)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
SET_PED_COVER_POINT_AND_SPHERE(PLAYER_PED_ID(), s_michael.cover, v_michael_shootout_start_pos, f_michael_shootout_start_heading,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), v_michael_shootout_start_pos, -1, TRUE, 0.0, TRUE, TRUE, s_michael.cover)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
//DISTANT_COP_CAR_SIRENS(TRUE)
|
|
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
IF s_selector_cam.bOKToSwitchPed
|
|
IF NOT s_selector_cam.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE, TRUE)
|
|
SETUP_MICHAEL_OUTFIT(TRUE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
IF IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
|
|
STOP_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", TRUE)
|
|
ENDIF
|
|
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
//Cleanup everything from the tunnel section.
|
|
INT i
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF s_heli_ropes_new[i].rope != NULL
|
|
DELETE_ROPE(s_heli_ropes_new[i].rope)
|
|
s_heli_ropes_new[i].rope = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(obj_gold_trolleys) i
|
|
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REMOVE_OBJECT(obj_pallets[0], TRUE)
|
|
REMOVE_OBJECT(obj_pallets[1], TRUE)
|
|
|
|
REMOVE_OBJECT(obj_gold_containers[0], TRUE)
|
|
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
|
|
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_left)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_right)
|
|
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
REMOVE_PED(s_lester.ped, TRUE)
|
|
|
|
REMOVE_VEHICLE(s_gold_choppers[0].veh, TRUE)
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
REMOVE_VEHICLE(veh_cutter, TRUE)
|
|
|
|
s_michael.i_event = 0
|
|
s_selector_cam.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_selector_cam.bPedSwitched
|
|
UPDATE_SHOOTOUT_COPS() //Get these peds created before the switch finishes
|
|
|
|
SWITCH s_michael.i_event
|
|
CASE 0
|
|
IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_OUTRO
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_michael_shootout_start_pos)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), -153.0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
SET_PED_COVER_POINT_AND_SPHERE(PLAYER_PED_ID(), s_michael.cover, v_michael_shootout_start_pos, f_michael_shootout_start_heading,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), v_michael_shootout_start_pos, -1, TRUE, 0.0, TRUE, TRUE, s_michael.cover)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
|
|
|
|
/*IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, v_gunman_shootout_start_pos)
|
|
SET_ENTITY_HEADING(s_crew[CREW_MICHAEL_ID].ped, f_crew_shootout_start_heading)
|
|
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, v_gunman_shootout_start_pos, f_crew_shootout_start_heading,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(s_crew[CREW_MICHAEL_ID].ped, v_gunman_shootout_start_pos, -1, FALSE, 0.0, TRUE, FALSE, s_crew[CREW_MICHAEL_ID].cover)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF*/
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(117.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
s_michael.i_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), v_michael_shootout_start_pos, -1, TRUE, 0.0, TRUE, TRUE, s_michael.cover)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(117.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Gold container collision audio.
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[0])
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_COLLISIONS")
|
|
IF HAS_SOUND_FINISHED(i_gold_container_sound_id)
|
|
PLAY_SOUND_FROM_ENTITY(i_gold_container_sound_id, "Gold_Cage_Collisions", obj_gold_containers[0], "BIG_SCORE_3B_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if the trolley starts swinging into the chopper.
|
|
IF i_current_event < 50
|
|
AND TIMERA() > 1000
|
|
IF HAS_TROLLEY_ROPE_ATTACHMENT_BEEN_BROKEN(i_rope_detach_timer, 0)
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[0].rope)
|
|
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[0].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[1].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[2].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[3].rope, s_gold_choppers[0].veh)
|
|
|
|
DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
|
|
|
|
s_heli_ropes_new[0].b_is_attached = FALSE
|
|
s_heli_ropes_new[1].b_is_attached = FALSE
|
|
s_heli_ropes_new[2].b_is_attached = FALSE
|
|
s_heli_ropes_new[3].b_is_attached = FALSE
|
|
ENDIF
|
|
|
|
MISSION_FAILED(FAILED_TROLLEY_DETACHED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF i_current_event < 50
|
|
DISPLAY_TAKE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
|
|
IF IS_ALARM_PLAYING("BIG_SCORE_HEIST_VAULT_ALARMS")
|
|
STOP_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", TRUE)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_gold_container_sound_id)
|
|
STOP_SOUND(i_gold_container_sound_id)
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF s_heli_ropes_new[i].rope != NULL
|
|
DELETE_ROPE(s_heli_ropes_new[i].rope)
|
|
s_heli_ropes_new[i].rope = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(obj_gold_trolleys) i
|
|
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REMOVE_OBJECT(obj_pallets[0], TRUE)
|
|
REMOVE_OBJECT(obj_pallets[1], TRUE)
|
|
|
|
REMOVE_OBJECT(obj_gold_containers[0], TRUE)
|
|
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
|
|
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_left)
|
|
REMOVE_WAYPOINT_RECORDING(str_waypoint_vault_charge_right)
|
|
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_PED(s_crew[CREW_FRANKLIN_ID].ped, TRUE)
|
|
REMOVE_PED(s_lester.ped, TRUE)
|
|
|
|
REMOVE_VEHICLE(s_gold_choppers[0].veh, TRUE)
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
REMOVE_VEHICLE(veh_cutter, TRUE)
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_CITY_SHOOTOUT)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CITY_SHOOTOUT()
|
|
CONST_FLOAT TREVOR_HELI_START_TIME 60000.0
|
|
CONST_FLOAT CREW_HELI_START_TIME 62000.0
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
VECTOR v_michael_start_pos = v_michael_shootout_start_pos
|
|
FLOAT f_michael_start_heading = f_michael_shootout_start_heading
|
|
|
|
IF e_mission_stage != STAGE_CITY_SHOOTOUT
|
|
v_michael_start_pos = <<-190.7969, -648.4908, 47.6731>>
|
|
f_michael_start_heading = 10.0965
|
|
ENDIF
|
|
|
|
IF i_current_event != 99
|
|
IF SETUP_REQ_PLAYER_AS_MICHAEL()
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(v_michael_start_pos, f_michael_start_heading, FALSE)
|
|
|
|
i_current_event = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_michael_start_pos)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), f_michael_start_heading)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(v_gunman_shootout_start_pos, f_crew_shootout_start_heading)
|
|
SETUP_MICHAEL_OUTFIT(TRUE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
SETTIMERB(0)
|
|
|
|
WHILE TIMERB() < 10000
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND (NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_MICHAEL_ID].ped))
|
|
SETTIMERB(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
//Request some extra stuff if jumping to mid-point.
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
|
|
WHILE NOT SETUP_REQ_FRANKLIN(<<-202.2140, -645.3587, 47.6737>>, 347.1321)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
i_current_take = MAX_OVERALL_TAKE
|
|
i_displayed_take = i_current_take
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(v_gunman_shootout_start_pos, f_crew_shootout_start_heading)
|
|
s_selector_peds.ePreviousSelectorPed = SELECTOR_PED_FRANKLIN
|
|
e_current_buddy = SELECTOR_PED_FRANKLIN
|
|
|
|
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
|
|
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, v_gunman_shootout_start_pos, f_crew_shootout_start_heading,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(s_crew[CREW_MICHAEL_ID].ped, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, <<-214.9014, -639.8576, 47.2236>>)
|
|
SET_ENTITY_HEADING(s_crew[CREW_MICHAEL_ID].ped, 335.4802)
|
|
|
|
s_crew[CREW_MICHAEL_ID].v_dest = <<-215.1918, -639.5822, 47.2214>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_crew[CREW_MICHAEL_ID].ped, s_crew[CREW_MICHAEL_ID].cover, s_crew[CREW_MICHAEL_ID].v_dest, 343.7635, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
|
|
s_crew[CREW_MICHAEL_ID].b_refresh_tasks = TRUE
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
|
|
s_michael.v_dest = <<-201.8401, -644.1752, 47.6733>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(s_selector_peds.pedID[e_current_buddy], s_michael.cover, s_michael.v_dest, 2.7610, 2.0,
|
|
COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, 500, FALSE)
|
|
ENDIF
|
|
|
|
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_ADVANCEDRIFLE_CLIP_02)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
|
|
SET_PLAYER_SPRINT(PLAYER_ID(), TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
|
|
REMOVE_COVER_POINT(s_michael.cover)
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
cover_player = ADD_COVER_POINT(v_michael_shootout_start_pos, f_michael_shootout_start_heading, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), v_michael_shootout_start_pos, -1, TRUE, 0.0, TRUE, TRUE, cover_player)
|
|
ELSE
|
|
cover_player = ADD_COVER_POINT(<<-190.7969, -648.4908, 47.6731>>, 10.0965, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), <<-190.7969, -648.4908, 47.6731>>, -1, TRUE, 0.0, TRUE, FALSE, cover_player)
|
|
ENDIF
|
|
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
ENDIF
|
|
|
|
SET_NUMBER_OF_PARKED_VEHICLES(0)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
SET_PED_POPULATION_BUDGET(0)
|
|
b_traffic_enabled_for_shootout = FALSE
|
|
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(TRUE)
|
|
DISABLE_ROADS_FOR_CITY_SHOOTOUT(TRUE)
|
|
sbi_shootout = ADD_SCENARIO_BLOCKING_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>)
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>, FALSE)
|
|
|
|
//SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 5)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_FAKE_WANTED_LEVEL(5)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_POLICE_RADAR_BLIPS(FALSE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_HELICOPTER, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
|
|
IF i_stairs_navmesh_block = -1
|
|
i_stairs_navmesh_block = ADD_NAVMESH_BLOCKING_OBJECT(<<-72.0, -643.7, 37.4>>, <<3.5, 12.5, 10.0>>, DEG_TO_RAD(160.2))
|
|
ENDIF
|
|
|
|
IF i_ramp_navmesh_block_1 = -1
|
|
//i_ramp_navmesh_block_1 = ADD_NAVMESH_BLOCKING_OBJECT(<<-150.7, -674.4, 34.7>>, <<3.5, 3.5, 5.0>>, DEG_TO_RAD(68.6))
|
|
ENDIF
|
|
|
|
IF i_ramp_navmesh_block_2 = -1
|
|
//i_ramp_navmesh_block_2 = ADD_NAVMESH_BLOCKING_OBJECT(<<-195.0, -658.6, 34.0>>, <<3.5, 12.5, 5.0>>, DEG_TO_RAD(-108.8))
|
|
ENDIF
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SETTIMERB(0)
|
|
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
WHILE NOT s_cops_start[COUNT_OF(s_cops_start) - 1].b_is_created //The peds are created one at a time, so need to check that the last one is created.
|
|
UPDATE_SHOOTOUT_COPS()
|
|
UPDATE_CREW_DURING_SHOOTOUT()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ELSE
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_start)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_pillars)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_pillars_end)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_under_bridge)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_bridge)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_bridge_2)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_heli_ramp)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_after_bridge)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_after_ramp_blockade)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_after_ramp_blockade_2)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_bridge)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_bridge_start)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_bridge_2)
|
|
KILL_ENEMY_GROUP_INSTANTLY(s_cops_bridge_flank)
|
|
|
|
WHILE NOT s_cops_courtyard_1[COUNT_OF(s_cops_courtyard_1) - 1].b_is_created //The peds are created one at a time, so need to check that the last one is created.
|
|
UPDATE_SHOOTOUT_COPS()
|
|
UPDATE_CREW_DURING_SHOOTOUT()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
|
|
WHILE TIMERB() < 1000
|
|
UPDATE_SHOOTOUT_COPS()
|
|
UPDATE_CREW_DURING_SHOOTOUT()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_ESCAPE_RESTART")
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2B_CREW_ESCAPE")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_ESCAPE_START")
|
|
START_AUDIO_SCENE("BS_2B_ESCAPE_START")
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
|
|
CLEAR_AREA_OF_PEDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
|
|
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0, TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
UPDATE_SHOOTOUT_COPS()
|
|
UPDATE_CREW_DURING_SHOOTOUT()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
i_shootout_ascend_audio_event = 0
|
|
i_current_music_event = 0
|
|
i_switch_stage = 0
|
|
b_player_jumped_over_wall = FALSE
|
|
b_player_primed_to_die = FALSE
|
|
b_created_car_park_cars = FALSE
|
|
b_crew_have_reached_bridge = FALSE
|
|
b_buddy_crossed_bridge = FALSE
|
|
b_crew_member_crossed_bridge = FALSE
|
|
b_reached_end_of_shootout = FALSE
|
|
b_traffic_enabled_for_shootout = FALSE
|
|
b_cleared_first_section_corpses = FALSE
|
|
b_buddy_is_going_to_car_park = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_event = 0
|
|
s_michael.i_event = 0
|
|
b_player_got_to_bridge = FALSE
|
|
b_ramp_heli_is_active = FALSE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT, "CITY_SHOOTOUT")
|
|
i_current_event = 0
|
|
ELSE
|
|
i_shootout_ascend_audio_event = 50
|
|
i_current_music_event = 0
|
|
i_switch_stage = 0
|
|
b_player_jumped_over_wall = FALSE
|
|
b_player_primed_to_die = FALSE
|
|
b_created_car_park_cars = FALSE
|
|
b_crew_have_reached_bridge = TRUE
|
|
b_buddy_crossed_bridge = TRUE
|
|
b_crew_member_crossed_bridge = TRUE
|
|
b_reached_end_of_shootout = FALSE
|
|
b_traffic_enabled_for_shootout = FALSE
|
|
b_cleared_first_section_corpses = TRUE
|
|
b_buddy_is_going_to_car_park = FALSE
|
|
s_crew[CREW_MICHAEL_ID].i_event = 50
|
|
s_michael.i_event = 50
|
|
b_player_got_to_bridge = TRUE
|
|
b_ramp_heli_is_active = FALSE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT_MID, "CITY_SHOOTOUT_MID_POINT")
|
|
i_current_event = 1
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
DISTANT_COP_CAR_SIRENS(TRUE)
|
|
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
//Keep track of the current buddy.
|
|
IF GET_PLAYER_PED_MODEL(CHAR_MICHAEL) = GET_PLAYER_MODEL()
|
|
e_current_buddy = SELECTOR_PED_FRANKLIN
|
|
ELSE
|
|
e_current_buddy = SELECTOR_PED_MICHAEL
|
|
ENDIF
|
|
|
|
//Keep traffic and peds disabled until later on in the shootout (parked cars are always off)
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
REQUEST_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
IF NOT b_traffic_enabled_for_shootout
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF s_cops_courtyard_2[0].b_is_created
|
|
IF s_cops_courtyard_2[0].i_event > 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_courtyard_2) = 0
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>, TRUE)
|
|
|
|
b_traffic_enabled_for_shootout = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
|
|
ENDIF
|
|
|
|
VECTOR v_player_pos, v_crew_pos, v_buddy_pos
|
|
v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
|
|
v_buddy_pos = GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])
|
|
ELSE
|
|
//Buddy hasn't shown up yet (or is dead), in either case we don't want to fail for abandoning them.
|
|
v_buddy_pos = v_player_pos
|
|
ENDIF
|
|
|
|
//Warning and fail if the player starts moving a distance away from the crew.
|
|
BOOL b_allow_shootout_switch = TRUE
|
|
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
FLOAT f_crew_fail_dist = 1600.0
|
|
|
|
//Increase the fail distance when reaching the last ramp.
|
|
IF s_cops_before_garage_blockade[0].b_is_created
|
|
f_crew_fail_dist = 2500.0
|
|
ENDIF
|
|
|
|
IF VDIST2(v_player_pos, v_crew_pos) > f_crew_fail_dist
|
|
OR VDIST2(v_player_pos, v_buddy_pos) > f_crew_fail_dist
|
|
OR (NOT b_crew_have_reached_bridge AND v_player_pos.z < 42.0)
|
|
b_allow_shootout_switch = FALSE
|
|
|
|
IF (i_current_event != 0 AND i_current_event < 50)
|
|
OR (NOT b_crew_have_reached_bridge AND v_player_pos.z < 42.0)
|
|
IF NOT b_has_text_label_triggered[F3B_ABANCREW]
|
|
PRINT_NOW("F3B_ABANCREW", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_ABANCREW] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF i_current_event = 0 //be more lenient if the player hasn't met Franklin yet.
|
|
IF VDIST2(v_player_pos, v_crew_pos) > 22500.0
|
|
OR VDIST2(v_player_pos, v_buddy_pos) > 22500.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
|
|
ENDIF
|
|
ELSE
|
|
IF VDIST2(v_player_pos, v_crew_pos) > 10000.0
|
|
OR VDIST2(v_player_pos, v_buddy_pos) > 10000.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
|
|
ENDIF
|
|
|
|
//If the player went all the way down to the bottom while the crew are still fighting at the top then fail.
|
|
IF NOT b_crew_have_reached_bridge
|
|
IF v_player_pos.z < 36.5
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//Instant fail if the player goes in these areas (these are normally alternate exits that mean the player is trying to go somewhere else).
|
|
//Stagger over multiple frames to help with execution time.
|
|
IF NOT b_reached_end_of_shootout
|
|
IF i_shootout_fail_index = 0
|
|
IF NOT b_player_got_to_bridge
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-24.422255,-629.864685,38.427891>>, <<48.428841,-656.828247,30.378513>>, 28.500000)
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF i_shootout_fail_index = 1
|
|
IF NOT b_player_got_to_bridge
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-72.939621,-641.094116,38.765491>>, <<-75.345497,-640.220337,35.015427>>, 30.000000)
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF i_shootout_fail_index = 2
|
|
IF NOT b_player_got_to_bridge
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<26.817902,-742.593018,46.688881>>, <<12.609173,-782.953308,30.339386>>, 92.500000)
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF i_shootout_fail_index = 3
|
|
IF NOT b_player_got_to_bridge
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-30.434286,-686.885437,33.316105>>, <<-53.188824,-634.624023,45.447689>>, 10.000000)
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_start) != 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars) != 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_pillars_end) != 0
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_ENTITY_HEALTH(s_crew[CREW_MICHAEL_ID].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT b_crew_member_crossed_bridge OR NOT b_buddy_crossed_bridge
|
|
//Disable climbing if the player is on the bridge and the buddies haven't crossed it yet (to stop the player jumping down).
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-109.079002,-681.708069,42.266190>>,<<21.500000,10.500000,3.250000>>)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
ENDIF
|
|
|
|
//Fail if the player goes too far down.
|
|
IF v_player_pos.z < 36.5
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i_shootout_fail_index++
|
|
IF i_shootout_fail_index > 3
|
|
i_shootout_fail_index = 0
|
|
ENDIF
|
|
|
|
//Disable climbing over the railings around the stairs, as this can screw up the shootout spawns (the staircase is the only safe point to spawn).
|
|
IF NOT s_cops_bridge[0].b_is_created
|
|
OR NOT s_cops_under_bridge[0].b_is_created
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-86.426544,-701.010803,47.549473>>, <<-83.277954,-692.184021,51.049473>>, 5.750000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-64.566696,-708.274963,47.549473>>, <<-87.001091,-700.258118,51.174416>>, 5.750000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-80.382095,-699.304993,47.549473>>, <<-81.743042,-702.775452,51.049473>>, 5.750000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-68.870926,-702.858337,47.549473>>, <<-79.697258,-699.030640,51.049473>>, 5.750000)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
SET_PED_PATH_CAN_USE_CLIMBOVERS(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF IS_PED_JUMPING(PLAYER_PED_ID())
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_RELOAD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
//Some general locates checks.
|
|
IF NOT b_player_got_to_bridge
|
|
//Kill the player if they try to jump over the side of the bank down to the bottom (to prevent them trying to skip the first part of the shootout)).
|
|
IF NOT b_player_jumped_over_wall
|
|
IF v_player_pos.z > 47.0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.223616,-652.224670,39.005672>>, <<-84.830887,-690.504395,48.491180>>, 3.250000)
|
|
b_player_jumped_over_wall = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_player_primed_to_die
|
|
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
AND v_player_pos.z < 42.0
|
|
b_player_primed_to_die = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF b_player_primed_to_die
|
|
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
|
|
SET_ENTITY_HEALTH(PLAYER_PED_ID(), 0)
|
|
//APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), GET_ENTITY_HEALTH(PLAYER_PED_ID()) + 50, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_cops_bridge[0].i_event > 0
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge) = 0
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-85.344025,-689.497864,42.731506>>,<<6.750000,4.750000,4.000000>>)
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-102.836800,-684.035767,41.266190>>,<<16.750000,7.750000,2.750000>>)
|
|
OR GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_heli_bridge_2) < 2
|
|
b_player_got_to_bridge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0 //Michael and crew member push through cops, Franklin eventually joins them.
|
|
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
|
|
|
|
UPDATE_SHOOTOUT_COPS()
|
|
UPDATE_CREW_DURING_SHOOTOUT()
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_crew[CREW_MICHAEL_ID].blip)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
s_crew[CREW_MICHAEL_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_MICHAEL_ID].ped)
|
|
ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_MSWITCH]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MSWITCH", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_MSWITCH] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[F3B_GOTOMICH]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_STRING_IN_STRING_NOW("F3B_GOTOMICH", str_crew_names[CREW_MICHAEL_ID], DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_GOTOMICH] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a police report once the god text has displayed.
|
|
IF NOT b_has_text_label_triggered[POLICE_REPORT_3]
|
|
AND b_has_text_label_triggered[F3B_GOTOMICH]
|
|
AND e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2B_03")
|
|
b_has_text_label_triggered[POLICE_REPORT_3] = TRUE
|
|
ENDIF
|
|
|
|
VECTOR v_franklin_start_pos
|
|
FLOAT f_franklin_start_heading, f_dist_to_franklin
|
|
BOOL b_hit_franklin_create_locate, b_hit_alternate_franklin_create_locate
|
|
|
|
//Create an invisible Franklin to start (this gives time for his outfit to stream in).
|
|
IF NOT DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF SETUP_REQ_FRANKLIN(<<-13.9, -719.3, 74.1>>, 0.0)
|
|
SET_ENTITY_VISIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_ENTITY_INVINCIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
FREEZE_ENTITY_POSITION(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT IS_ENTITY_VISIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
//b_hit_franklin_create_locate = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-80.671684,-701.176636,43.234303>>, <<-82.549141,-700.484253,46.484303>>, 3.000000)
|
|
b_hit_franklin_create_locate = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-75.126038,-703.198730,43.146358>>, <<-81.553040,-700.846863,48.233311>>, 3.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-85.292641,-696.182678,48.477474>>, <<-83.135193,-696.947510,51.474876>>, 10.250000)
|
|
b_hit_alternate_franklin_create_locate = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-84.339615,-687.004700,40.989578>>, <<-83.304123,-686.471924,44.564587>>, 12.250000)
|
|
|
|
IF b_hit_franklin_create_locate
|
|
OR b_hit_alternate_franklin_create_locate
|
|
IF b_hit_franklin_create_locate
|
|
v_franklin_start_pos = <<-86.1804, -696.4077, 43.2485>>
|
|
f_franklin_start_heading = 76.0034
|
|
ELSE
|
|
v_franklin_start_pos = <<-86.0959, -701.9257, 43.2362>>
|
|
f_franklin_start_heading = 332.1051
|
|
ENDIF
|
|
|
|
SET_ENTITY_VISIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
SET_ENTITY_INVINCIBLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
FREEZE_ENTITY_POSITION(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], v_franklin_start_pos)
|
|
SET_ENTITY_HEADING(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], f_franklin_start_heading)
|
|
|
|
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
UPDATE_BUDDY_SHOOTOUT_DIALOGUE(v_player_pos, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_SELECTOR_PED_DURING_SHOOTOUT()
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_franklin.blip)
|
|
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
s_franklin.blip = CREATE_BLIP_FOR_ENTITY(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ENDIF
|
|
|
|
IF NOT b_cleared_first_section_corpses
|
|
IF v_player_pos.z < 45.0
|
|
CLEAR_AREA_OF_PEDS(<<-43.7, -685.8, 49.3>>, 25.0)
|
|
b_cleared_first_section_corpses = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Franklin says a line when he arrives
|
|
IF NOT b_has_text_label_triggered[BS2B_FRANARR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
f_dist_to_franklin = VDIST2(v_player_pos, GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
|
|
IF f_dist_to_franklin < 400.0
|
|
IF NOT IS_ENTITY_OCCLUDED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
OR f_dist_to_franklin < 9.0
|
|
IF IS_PED_INJURED(s_cops_before_bridge[0].ped)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_FRANARR", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_FRANARR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//If the player hasn't reached Franklin yet but the crew member has then he says a line.
|
|
IF NOT b_has_text_label_triggered[BS2B_SEE]
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]), GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)) < 100.0
|
|
//1851223 - Conversation now obsolete: Franklin's line will always trigger first as there's no longer an enemy to hold up the conversation.
|
|
//IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SEE")
|
|
b_has_text_label_triggered[BS2B_SEE] = TRUE
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue from the gunman when the chopper arrives.
|
|
IF NOT b_has_text_label_triggered[BS2B_CHP]
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF IS_VEHICLE_DRIVEABLE(veh_cops_bridge_heli)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_cops_bridge_heli)
|
|
IF GET_TIME_POSITION_IN_RECORDING(veh_cops_bridge_heli) > 5000.0
|
|
IF VDIST2(v_player_pos, GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)) < 625.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_CHP")
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_CHP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Michael, Franklin and the crew member have joined up, allow switching.
|
|
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
|
|
|
|
UPDATE_CREW_DURING_SHOOTOUT()
|
|
UPDATE_SELECTOR_PED_DURING_SHOOTOUT()
|
|
UPDATE_SHOOTOUT_COPS()
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_crew[CREW_MICHAEL_ID].blip)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
s_crew[CREW_MICHAEL_ID].blip = CREATE_BLIP_FOR_ENTITY(s_crew[CREW_MICHAEL_ID].ped)
|
|
ENDIF
|
|
|
|
IF NOT b_cleared_first_section_corpses
|
|
IF v_player_pos.z < 45.0
|
|
CLEAR_AREA_OF_PEDS(<<-43.7, -685.8, 49.3>>, 25.0)
|
|
b_cleared_first_section_corpses = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Update blips to reflect current player ped.
|
|
IF e_current_buddy = SELECTOR_PED_FRANKLIN
|
|
IF DOES_BLIP_EXIST(s_michael.blip)
|
|
REMOVE_BLIP(s_michael.blip)
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_franklin.blip)
|
|
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
s_franklin.blip = CREATE_BLIP_FOR_ENTITY(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(s_franklin.blip)
|
|
REMOVE_BLIP(s_franklin.blip)
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_michael.blip)
|
|
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
s_michael.blip = CREATE_BLIP_FOR_ENTITY(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Once the player has triggered the car park enemies play a music event.
|
|
IF i_current_music_event = 0
|
|
IF s_cops_car_park_1[0].i_event > 0
|
|
TRIGGER_MUSIC_EVENT("FH2B_CARPARK")
|
|
i_current_music_event++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_3) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_2) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_car_park_1) = 0
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
//AND IS_PED_INJURED(s_cops_heli_ramp[1].ped)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data)
|
|
AND GET_GAME_TIMER() - i_shootout_end_timer > 500
|
|
AND i_switch_stage = 0
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_car_park_1)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_car_park_1)
|
|
REMOVE_VEHICLE(veh_cops_car_park_1)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_car_park_2)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_car_park_2)
|
|
REMOVE_VEHICLE(veh_cops_car_park_2)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_cops_car_park_3)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(veh_cops_car_park_3)
|
|
REMOVE_VEHICLE(veh_cops_car_park_3)
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_VANS_ARRIVE")
|
|
STOP_AUDIO_SCENE("BS_2B_VANS_ARRIVE")
|
|
ENDIF
|
|
ELSE
|
|
//Allow switching between Michael and Franklin during the shootout.
|
|
IF b_allow_shootout_switch
|
|
UPDATE_SHOOTOUT_SWITCH()
|
|
ENDIF
|
|
|
|
//Shootout dialogue
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
//Play a line from the player when the Merryweather chopper arrives.
|
|
IF NOT IS_ENTITY_DEAD(veh_merry_heli)
|
|
IF NOT b_has_text_label_triggered[BS2B_MERCOV]
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_merry_heli)
|
|
IF GET_TIME_POSITION_IN_RECORDING(veh_merry_heli) > 4000.0
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_merry_heli)) < 10000.0
|
|
IF e_current_buddy = SELECTOR_PED_FRANKLIN
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MERCOVM", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_MERCOV] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_MERCOVF", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_MERCOV] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//General lines
|
|
UPDATE_BUDDY_SHOOTOUT_DIALOGUE(v_player_pos)
|
|
ENDIF
|
|
|
|
//Update the checkpoint when appropriate.
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) = 0
|
|
AND v_player_pos.z > 47.0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-183.073105,-660.491577,40.232239>>, <<-147.523422,-555.349487,72.347198>>, 115.250000)
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CITY_SHOOTOUT_MID, "CITY_SHOOTOUT_MID_POINT")
|
|
e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Audio scenes.
|
|
SWITCH i_shootout_ascend_audio_event
|
|
CASE 0 //Going down the first stairs.
|
|
IF v_player_pos.z < 46.7
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-82.497536,-674.991699,41.474552>>, <<-94.017052,-706.526367,47.711830>>, 9.250000)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_SHOOTOUT_ACROSS_STREET")
|
|
START_AUDIO_SCENE("BS_2B_SHOOTOUT_ACROSS_STREET")
|
|
ENDIF
|
|
|
|
i_shootout_ascend_audio_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //After crossing the bridge.
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_bridge) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_bridge_2) = 0
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_SHOOTOUT_ACROSS_STREET")
|
|
STOP_AUDIO_SCENE("BS_2B_SHOOTOUT_ACROSS_STREET")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_ASCEND_TO_NEXT_AREA")
|
|
START_AUDIO_SCENE("BS_2B_ASCEND_TO_NEXT_AREA")
|
|
ENDIF
|
|
|
|
i_shootout_ascend_audio_event = 50
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50 //Once reaching the large courtyard area.
|
|
IF v_player_pos.z > 47.0
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-183.073105,-660.491577,40.232239>>, <<-147.523422,-555.349487,72.347198>>, 115.250000)
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_ASCEND_TO_NEXT_AREA")
|
|
STOP_AUDIO_SCENE("BS_2B_ASCEND_TO_NEXT_AREA")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_SHOOTOUT_CONT")
|
|
START_AUDIO_SCENE("BS_2B_SHOOTOUT_CONT")
|
|
ENDIF
|
|
|
|
i_shootout_ascend_audio_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 51
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_before_car_park) = 0
|
|
AND GET_NUM_ENEMIES_ALIVE_IN_GROUP(s_cops_after_courtyard) = 0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-215.143021,-630.299561,31.054901>>, <<-134.248795,-659.825623,37.041439>>, 13.750000)
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_SHOOTOUT_CONT")
|
|
STOP_AUDIO_SCENE("BS_2B_SHOOTOUT_CONT")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_ESCAPE_START")
|
|
STOP_AUDIO_SCENE("BS_2B_ESCAPE_START")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_UNDERGROUND_GARAGE")
|
|
START_AUDIO_SCENE("BS_2B_UNDERGROUND_GARAGE")
|
|
ENDIF
|
|
|
|
//This is a good time to also play the final police report for the shootout.
|
|
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2B_04")
|
|
|
|
i_shootout_ascend_audio_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
i_shootout_end_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
|
|
UPDATE_SHOOTOUT_COPS() //To guarantee any remaining cleanup is done (e.g. flagging dead enemies for the kill stat).
|
|
REMOVE_ALL_SHOOTOUT_ENEMIES()
|
|
SET_SCRIPTED_SHOOTOUT_COVER_ACTIVE(FALSE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_swat_van)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_car)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_cop_heli)
|
|
|
|
REMOVE_VEHICLE_ASSET(model_cop_car)
|
|
REMOVE_VEHICLE_ASSET(model_cop_heli)
|
|
REMOVE_VEHICLE_ASSET(model_swat_van)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_TREVOR, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_ARRIVE_CREW, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CREW_HELI_COLLECT_GOLD, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_1, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_3, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_4, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_5, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BRIDGE_6, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_1, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_CAR_PARK_3, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_BRIDGE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_RAMP, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_HELI_COURTYARD, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_MERRY_HELI, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_1, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_3, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_1, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_3, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BEFORE_CAR_PARK_4, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_1, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_BLOCKADE_3, str_carrec)
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
|
|
|
|
IF i_bridge_navmesh_block != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_bridge_navmesh_block)
|
|
i_bridge_navmesh_block = -1
|
|
ENDIF
|
|
|
|
IF i_stairs_navmesh_block != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_stairs_navmesh_block)
|
|
i_stairs_navmesh_block = -1
|
|
ENDIF
|
|
|
|
IF i_ramp_navmesh_block_1 != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_1)
|
|
i_ramp_navmesh_block_1 = -1
|
|
ENDIF
|
|
|
|
IF i_ramp_navmesh_block_2 != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(i_ramp_navmesh_block_2)
|
|
i_ramp_navmesh_block_2 = -1
|
|
ENDIF
|
|
|
|
REMOVE_COVER_POINT(cover_player)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_LOSE_COPS
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
IF e_mission_stage = STAGE_CITY_SHOOTOUT
|
|
JUMP_TO_STAGE(STAGE_CITY_SHOOTOUT_MID_POINT)
|
|
ELIF e_mission_stage = STAGE_CITY_SHOOTOUT_MID_POINT
|
|
JUMP_TO_STAGE(STAGE_LOSE_COPS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Once the player reaches the car park after the shootout they have to lose a 5-star wanted level, then switch to Trevor.
|
|
PROC LOSE_COPS()
|
|
CONST_FLOAT TREVOR_HELI_START_TIME 60000.0
|
|
CONST_FLOAT CREW_HELI_START_TIME 62000.0
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
VECTOR v_michael_start_pos = <<-161.3123, -620.1779, 31.4244>>
|
|
FLOAT f_michael_start_heading = 122.4834
|
|
|
|
SELECTOR_SLOTS_ENUM e_current_player = SELECTOR_PED_TREVOR
|
|
|
|
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
e_current_player = SELECTOR_PED_MICHAEL
|
|
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
|
|
e_current_player = SELECTOR_PED_FRANKLIN
|
|
ENDIF
|
|
|
|
IF i_current_event != 99
|
|
IF e_current_player = SELECTOR_PED_MICHAEL OR e_current_player = SELECTOR_PED_FRANKLIN
|
|
OR SETUP_REQ_PLAYER_AS_FRANKLIN()
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(v_michael_start_pos, f_michael_start_heading, FALSE)
|
|
|
|
i_current_event = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), v_michael_start_pos)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), f_michael_start_heading)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(<<-158.5508, -619.2999, 31.4244>>, 123.1897)
|
|
AND ((e_current_player = SELECTOR_PED_MICHAEL AND SETUP_REQ_FRANKLIN(<<-167.5823, -617.2461, 31.4244>>, 206.7324))
|
|
OR (e_current_player = SELECTOR_PED_FRANKLIN AND SETUP_REQ_MICHAEL(<<-167.5823, -617.2461, 31.4244>>, 206.7324)))
|
|
SETUP_MICHAEL_OUTFIT(TRUE)
|
|
SETUP_FRANKLIN_OUTFIT(TRUE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
SETTIMERB(0)
|
|
|
|
WHILE TIMERB() < 10000
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND (NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_crew[CREW_MICHAEL_ID].ped))
|
|
AND ((NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
OR IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
AND ((NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL]))
|
|
OR IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL]))
|
|
SETTIMERB(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
i_current_take = MAX_OVERALL_TAKE
|
|
i_displayed_take = i_current_take
|
|
|
|
b_created_car_park_cars = FALSE
|
|
s_selector_peds.ePreviousSelectorPed = SELECTOR_PED_FRANKLIN
|
|
e_current_buddy = SELECTOR_PED_FRANKLIN
|
|
|
|
SETUP_REQ_CREW_READY_FOR_SHOOTOUT()
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_MICHAEL, TRUE)
|
|
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
|
|
SET_NUMBER_OF_PARKED_VEHICLES(0)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
|
|
//Set a real wanted level to attract cops.
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 5)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_FAKE_WANTED_LEVEL(0)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 1.0)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
SET_POLICE_RADAR_BLIPS(TRUE)
|
|
|
|
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
|
|
SET_PLAYER_WANTED_CENTRE_POSITION(PLAYER_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
REPORT_POLICE_SPOTTED_PLAYER(PLAYER_ID())
|
|
|
|
sbi_shootout = ADD_SCENARIO_BLOCKING_AREA(v_michael_shootout_start_pos + <<-1000.0, -1000.0, -100.0>>, v_michael_shootout_start_pos + <<1000.0, 1000.0, 1000.0>>)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_ESCAPE_START")
|
|
START_AUDIO_SCENE("BS_2B_ESCAPE_START")
|
|
ENDIF
|
|
|
|
i_current_event = 0
|
|
i_current_music_event = 0
|
|
i_switch_stage = 0
|
|
i_lose_cops_event = 0
|
|
i_num_lose_cops_lines_played = 0
|
|
b_reached_end_of_shootout = TRUE
|
|
b_allow_any_vehicle_for_getaway = FALSE
|
|
b_cops_relationship_still_active = TRUE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LOSE_COPS, "LOSE_COPS")
|
|
|
|
//Reset some attributes from the shootout.
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_getaway_car)
|
|
model_suppressed_getaway = GET_ENTITY_MODEL(veh_getaway_car)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_suppressed_getaway, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
GIVE_PLAYER_CORRECT_WEAPON_AFTER_FAIL()
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_ESCAPE_RESTART")
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_USING_ACTION_MODE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_PED_USING_ACTION_MODE(s_crew[CREW_MICHAEL_ID].ped, TRUE, -1)
|
|
ENDIF
|
|
|
|
WHILE NOT b_created_car_park_cars
|
|
UPDATE_SHOOTOUT_COPS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, TRUE, FALSE) //Can we clear cargen cars? It might delete the getaway car.
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
UPDATE_SHOOTOUT_COPS()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_ENTER_VEHICLE")
|
|
DISTANT_COP_CAR_SIRENS(TRUE)
|
|
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 6, NULL, "LESTER")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 2, NULL, "TREVOR")
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
//Keep track of the current buddy.
|
|
IF GET_PLAYER_PED_MODEL(CHAR_MICHAEL) = GET_PLAYER_MODEL()
|
|
e_current_buddy = SELECTOR_PED_FRANKLIN
|
|
ELSE
|
|
e_current_buddy = SELECTOR_PED_MICHAEL
|
|
ENDIF
|
|
|
|
UPDATE_SHOOTOUT_COPS()
|
|
|
|
//Keep traffic and peds disabled until later on in the shootout (parked cars are always off)
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
REQUEST_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
//Keep track of crew positions.
|
|
VECTOR v_player_pos, v_crew_pos, v_buddy_pos
|
|
v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
v_crew_pos = GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
|
|
v_buddy_pos = GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy])
|
|
ENDIF
|
|
|
|
//Fail for leaving buddies behind.
|
|
IF i_current_event = 0 OR i_current_event = 1
|
|
IF VDIST2(v_player_pos, v_crew_pos) > 40000.0
|
|
OR VDIST2(v_player_pos, v_buddy_pos) > 40000.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_SHOOTOUT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Check when to switch to any vehicle locate instead.
|
|
IF NOT b_allow_any_vehicle_for_getaway
|
|
IF NOT IS_VEHICLE_DRIVEABLE(veh_getaway_car)
|
|
b_allow_any_vehicle_for_getaway = TRUE
|
|
ELSE
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF veh != veh_getaway_car
|
|
b_allow_any_vehicle_for_getaway = TRUE
|
|
ENDIF
|
|
ELSE
|
|
//If the getaway car has moved too far from the start point and the player then ignore it.
|
|
IF VDIST2(GET_ENTITY_COORDS(veh_getaway_car), <<-166.1555, -621.9833, 31.4281>>) > 40000.0
|
|
AND VDIST2(GET_ENTITY_COORDS(veh_getaway_car), v_player_pos) > 10000.0
|
|
b_allow_any_vehicle_for_getaway = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0 //Player has to lose the cops
|
|
PREPARE_MUSIC_EVENT("FH2B_SWITCH_3")
|
|
UPDATE_SHOOTOUT_COPS()
|
|
|
|
TEXT_LABEL str_leave_buddy_label, str_get_back_in_car_label
|
|
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
str_leave_buddy_label = "F3B_LEFTMICH"
|
|
ELSE
|
|
str_leave_buddy_label = "F3B_LEFTFRAN"
|
|
ENDIF
|
|
|
|
IF b_has_text_label_triggered[F3B_SWITREV]
|
|
str_get_back_in_car_label = ""
|
|
ELSE
|
|
str_get_back_in_car_label = "CMN_GENGETBCK"
|
|
ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_JACK]
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF VDIST2(GET_ENTITY_COORDS(s_selector_peds.pedID[e_current_buddy]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 625.0
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GETAWAY", CONV_PRIORITY_MEDIUM)
|
|
SETTIMERB(0)
|
|
b_has_text_label_triggered[BS2B_JACK] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GETAWAY", CONV_PRIORITY_MEDIUM)
|
|
SETTIMERB(0)
|
|
b_has_text_label_triggered[BS2B_JACK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
b_has_text_label_triggered[BS2B_JACK] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(s_crew[CREW_MICHAEL_ID].blip)
|
|
REMOVE_BLIP(s_crew[CREW_MICHAEL_ID].blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_michael.blip)
|
|
REMOVE_BLIP(s_michael.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_franklin.blip)
|
|
REMOVE_BLIP(s_franklin.blip)
|
|
ENDIF
|
|
|
|
IF b_allow_any_vehicle_for_getaway
|
|
IS_PLAYER_AT_LOCATION_WITH_CREW_MEMBERS_IN_ANY_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, 0.001>>, FALSE, s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, NULL,
|
|
"LOSE_WANTED", str_leave_buddy_label, "F3B_LEFTMEMBER", "", "F3B_ABANCREW", "", str_crew_names[CREW_MICHAEL_ID], "",
|
|
"F3B_FINDCAR", str_get_back_in_car_label, FALSE, FALSE, 2)
|
|
ELSE
|
|
IS_PLAYER_AT_LOCATION_WITH_CREW_MEMBERS_IN_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, 0.001>>, FALSE, s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, NULL,
|
|
veh_getaway_car, "LOSE_WANTED", str_leave_buddy_label, "F3B_LEFTMEMBER", "", "F3B_ABANCREW", "F3B_GETINCAR", "F3B_GETBACKCAR",
|
|
"", str_crew_names[CREW_MICHAEL_ID], "")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
IF i_lose_cops_event = 0
|
|
IF TIMERB() > 60000
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.5)
|
|
i_lose_cops_event++
|
|
ENDIF
|
|
ELIF i_lose_cops_event = 1
|
|
IF TIMERB() > 30000
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.35)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
|
|
i_lose_cops_event++
|
|
ENDIF
|
|
ELIF i_lose_cops_event = 2
|
|
IF TIMERB() > 30000
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.2)
|
|
i_lose_cops_event++
|
|
ENDIF
|
|
ELIF i_lose_cops_event = 3
|
|
IF TIMERB() > 30000
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.1)
|
|
i_lose_cops_event++
|
|
ENDIF
|
|
ELIF i_lose_cops_event = 4
|
|
IF TIMERB() > 30000
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.0)
|
|
i_lose_cops_event++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Make sure buddies don't attack cops after losing the wanted level.
|
|
IF b_cops_relationship_still_active
|
|
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, RELGROUPHASH_COP)
|
|
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, rel_group_cops)
|
|
b_cops_relationship_still_active = FALSE
|
|
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_DRIVE_BY) = PERFORMING_TASK
|
|
OR GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_COMBAT) = PERFORMING_TASK
|
|
CLEAR_PED_TASKS(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_PED_CONFIG_FLAG(s_crew[CREW_MICHAEL_ID].ped, PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_DRIVE_BY) = PERFORMING_TASK
|
|
OR GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_COMBAT) = PERFORMING_TASK
|
|
CLEAR_PED_TASKS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_DRIVE_BY) = PERFORMING_TASK
|
|
OR GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_COMBAT) = PERFORMING_TASK
|
|
CLEAR_PED_TASKS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_PED_CONFIG_FLAG(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
|
|
SET_BLIP_ROUTE(s_locates_data.LocationBlip, FALSE)
|
|
|
|
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 1.0)
|
|
|
|
i_current_event++
|
|
ELSE
|
|
//Dialogue while losing the wanted level.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
//Play some "let's go" dialogue while running to the next destination.
|
|
IF b_has_text_label_triggered[BS2B_JACK]
|
|
IF NOT b_has_text_label_triggered[BS2B_JACK2]
|
|
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy])
|
|
AND ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_JACK2M", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_JACK2] = TRUE
|
|
i_lose_cops_dialogue_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_JACK2F", CONV_PRIORITY_MEDIUM)
|
|
i_lose_cops_dialogue_timer = GET_GAME_TIMER()
|
|
b_has_text_label_triggered[BS2B_JACK2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Play a line from the buddy if the player hasn't got in a car yet after the god text.
|
|
IF NOT b_has_text_label_triggered[BS2B_GETCAR]
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GETCARM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GETCAR] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GETCARF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_GETCAR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Gunman shouts to go (not a priority).
|
|
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy])
|
|
AND ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), s_crew[CREW_MICHAEL_ID].ped)
|
|
IF NOT b_has_text_label_triggered[BS2B_GO]
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_MICHAEL_ID, s_crew[CREW_MICHAEL_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_GO")
|
|
b_has_text_label_triggered[BS2B_GO] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Dialogue while losing the cops.
|
|
IF b_has_text_label_triggered[BS2B_JACK]
|
|
IF GET_GAME_TIMER() - i_lose_cops_dialogue_timer > 21000 + (i_num_lose_cops_lines_played * 500)
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[e_current_buddy])
|
|
AND ARE_CHARS_SITTING_IN_SAME_VEHICLE(PLAYER_PED_ID(), s_selector_peds.pedID[e_current_buddy])
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF i_num_lose_cops_lines_played < 8
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LOSE", CONV_PRIORITY_MEDIUM)
|
|
i_lose_cops_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 2000)
|
|
i_num_lose_cops_lines_played++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF e_current_buddy = SELECTOR_PED_FRANKLIN
|
|
IF i_num_lose_cops_lines_played < 9
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LOSEF", CONV_PRIORITY_MEDIUM)
|
|
i_lose_cops_dialogue_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 2000)
|
|
i_num_lose_cops_lines_played++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_DRIVE_AWAY")
|
|
START_AUDIO_SCENE("BS_2B_DRIVE_AWAY")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_UNDERGROUND_GARAGE")
|
|
STOP_AUDIO_SCENE("BS_2B_UNDERGROUND_GARAGE")
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Player has lost the cops, get ready for the switch.
|
|
TEXT_LABEL str_leave_buddy_label_2, str_get_back_in_car_label_2
|
|
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
str_leave_buddy_label_2 = "F3B_LEFTMICH"
|
|
ELSE
|
|
str_leave_buddy_label_2 = "F3B_LEFTFRAN"
|
|
ENDIF
|
|
|
|
IF b_has_text_label_triggered[F3B_SWITREV]
|
|
str_get_back_in_car_label_2 = ""
|
|
ELSE
|
|
str_get_back_in_car_label_2 = "CMN_GENGETBCK"
|
|
ENDIF
|
|
|
|
IS_PLAYER_AT_LOCATION_WITH_CREW_MEMBERS_IN_ANY_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, 0.001>>, FALSE, s_selector_peds.pedID[e_current_buddy], s_crew[CREW_MICHAEL_ID].ped, NULL,
|
|
"F3B_LEAVEAREA", str_leave_buddy_label_2, "F3B_LEFTMEMBER", "", "F3B_ABANCREW", "", str_crew_names[CREW_MICHAEL_ID], "",
|
|
"F3B_FINDCAR", str_get_back_in_car_label_2, FALSE, FALSE, 2)
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT b_has_text_label_triggered[BS2B_LOST]
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LOST", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_LOST] = TRUE
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_RADIO]
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RADIO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_RADIO] = TRUE
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_VSAFEM]
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_VSAFEM", CONV_PRIORITY_MEDIUM)
|
|
i_switch_dialogue_timer = GET_GAME_TIMER()
|
|
b_has_text_label_triggered[BS2B_VSAFEM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
|
|
SET_BLIP_ROUTE(s_locates_data.LocationBlip, FALSE)
|
|
ENDIF
|
|
|
|
//Request all of the chase assets, once they're ready we can switch.
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
|
|
IF SETUP_GOLD_CHOPPERS(<<683.8, 981.4, 150.3>>, -30.0, <<673.8, 981.4, 150.3>>, -30.0, FALSE, TRUE)
|
|
AND SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
AND SETUP_REQ_TREVOR_IN_CHOPPER()
|
|
AND SETUP_LESTER_IN_CHOPPER()
|
|
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
|
|
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(1)
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT b_has_text_label_triggered[F3B_SWITREV]
|
|
IF b_has_text_label_triggered[BS2B_VSAFEM]
|
|
AND DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_DO_ALL_CHECKS)
|
|
OR (GET_GAME_TIMER() - i_switch_dialogue_timer > 15000 AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF))
|
|
PRINT_NOW("F3B_SWITREV", DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_SWITREV] = TRUE
|
|
|
|
SET_SELECTOR_PED_HINT(s_selector_peds, SELECTOR_PED_TREVOR, TRUE)
|
|
SET_SELECTOR_PED_PRIORITY(s_selector_peds, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN)
|
|
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_MICHAEL, TRUE)
|
|
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
|
|
i_switch_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF UPDATE_SELECTOR_HUD(s_selector_peds, FALSE)
|
|
OR GET_GAME_TIMER() - i_switch_timer > 20000
|
|
CLEAR_PRINTS()
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2B_SWITCHES)
|
|
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[1].veh, FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CREW_HELI_START_TIME)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.0)
|
|
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, TREVOR_HELI_START_TIME)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
|
|
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
|
|
//TODO 1173037: Remove scenarios around chase start location.
|
|
VECTOR v_chase_start
|
|
v_chase_start = GET_ENTITY_COORDS(obj_gold_containers[0])
|
|
|
|
IF sbi_chase_start = NULL
|
|
sbi_chase_start = ADD_SCENARIO_BLOCKING_AREA(v_chase_start + <<-1000.0, -1000.0, -1000.0>>, v_chase_start + <<1000.0, 1000.0, 1000.0>>)
|
|
ENDIF
|
|
|
|
CLEAR_ANGLED_AREA_OF_VEHICLES(v_chase_start + <<-1000.0, -1000.0, -100.0>>, v_chase_start + <<1000.0, 1000.0, 1000.0>>, 1000.0)
|
|
|
|
//NEW_LOAD_SCENE_START(<<746.879639,1030.785645,317.191681>>,<<2.575815,-0.000000,-5.936784>>, 100.0)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_SWITCH_3")
|
|
STOP_AUDIO_SCENES()
|
|
|
|
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_TREVOR)
|
|
s_selector_cam.pedTo = s_selector_peds.pedID[s_selector_peds.eNewSelectorPed]
|
|
|
|
i_trevor_switch_event = 0
|
|
i_current_event++
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_NOSM]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
AND GET_GAME_TIMER() - i_switch_timer > 11300
|
|
IF e_current_buddy = SELECTOR_PED_MICHAEL
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NOSM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_NOSM] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NOSF", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_NOSM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
REQUEST_MODEL(model_merry)
|
|
REQUEST_MODEL(model_military_chopper)
|
|
|
|
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_LONG_RANGE(s_selector_cam)
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
//SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(s_selector_cam.pedTo)
|
|
|
|
IF s_selector_cam.bOKToSwitchPed
|
|
IF NOT s_selector_cam.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE, TRUE)
|
|
//Turn off wanted level again here
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_FAKE_WANTED_LEVEL(0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_HELICOPTER, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
|
|
UPDATE_SHOOTOUT_COPS() //To guarantee any remaining cleanup is done (e.g. flagging dead enemies for the kill stat).
|
|
REMOVE_ALL_SHOOTOUT_ENEMIES()
|
|
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
REMOVE_VEHICLE(veh_getaway_car, TRUE)
|
|
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
s_selector_cam.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Keep the choppers frozen until the final cut.
|
|
SWITCH i_trevor_switch_event
|
|
CASE 0
|
|
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
|
|
IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_JUMPCUT_DESCENT
|
|
IF GET_PLAYER_SWITCH_JUMP_CUT_INDEX() = 0
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, TREVOR_HELI_START_TIME)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.5)
|
|
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[0], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[0])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CREW_HELI_START_TIME)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.5)
|
|
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i_trevor_switch_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_OUTRO_SWOOP
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, TREVOR_HELI_START_TIME)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.5)
|
|
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[0], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[0])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CREW_HELI_START_TIME)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.5)
|
|
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(s_gold_choppers[1].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i_trevor_switch_event++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Remove assets as soon as the switch takes them off-screen
|
|
IF DOES_ENTITY_EXIST(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF NOT IS_ENTITY_DEAD(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF VDIST2(GET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped), GET_FINAL_RENDERED_CAM_COORD()) > 1600.0
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
|
|
LOAD_HELI_CHASE_UBER_DATA()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
|
|
UPDATE_SHOOTOUT_COPS() //To guarantee any remaining cleanup is done (e.g. flagging dead enemies for the kill stat).
|
|
REMOVE_ALL_SHOOTOUT_ENEMIES()
|
|
|
|
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_BLOCKED(s_selector_peds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped)
|
|
|
|
REMOVE_VEHICLE(veh_getaway_car, TRUE)
|
|
|
|
SET_NUMBER_OF_PARKED_VEHICLES(-1)
|
|
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
|
|
STOP_AUDIO_SCENES()
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
IF model_suppressed_getaway != DUMMY_MODEL_FOR_SCRIPT
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(model_suppressed_getaway, FALSE)
|
|
ENDIF
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(s_selector_peds)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_CHOPPER_CHASE
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_CHOPPER_CHASE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CHOPPER_CHASE()
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
IF SETUP_REQ_PLAYER_AS_TREVOR()
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(<<632.2070, 983.7871, 248.9346>>, 0.0, FALSE)
|
|
|
|
i_current_event = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<632.2070, 983.7871, 248.9346>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
LOAD_HELI_CHASE_UBER_DATA()
|
|
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[0], str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[1],str_carrec)
|
|
REQUEST_MODEL(model_merry)
|
|
REQUEST_MODEL(model_military_chopper)
|
|
|
|
IF SETUP_REQ_PLAYER_AS_TREVOR()
|
|
AND SETUP_GOLD_CHOPPERS(<<-336.4547, -750.0684, 59.2059>>, -100.0, <<-290.0, -763.0684, 64.2059>>, -100.0)
|
|
AND SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
AND SETUP_LESTER_IN_CHOPPER()
|
|
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
|
|
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(1)
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SetPieceCarRecording[0], str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SetPieceCarRecording[1], str_carrec)
|
|
SETUP_TREVOR_OUTFIT()
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
IF b_has_used_checkpoint
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[1].veh, FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 58000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 0.5)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
|
|
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(s_gold_choppers[1].veh, TRUE)
|
|
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 56000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.5)
|
|
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[0], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[0])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
|
|
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
|
|
i_current_take = MAX_OVERALL_TAKE
|
|
i_displayed_take = i_current_take
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[0].rope)
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[0], CONTAINER_WEIGHT, -1.0, <<0.0001, 0.0001, 0.0001>>, <<0.1, 0.1, 0.1>>, -1.0, -1.0, -1.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//TEMP: Stop the chopper from being damaged by the windmill blades.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
SET_ENTITY_INVINCIBLE(s_gold_choppers[1].veh, TRUE)
|
|
SET_ENTITY_PROOFS(s_gold_choppers[1].veh, TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
//SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
//SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
|
|
//SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.9)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
DESTROY_ALL_CAMS() //Destroys the switch splines from the previous stage after they're done.
|
|
|
|
//Reset the wanted level modifiers, but disable wanted level for the chase.
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_FAKE_WANTED_LEVEL(0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_POLICE_RADAR_BLIPS(TRUE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2B_HELI_CHASE_RESTART")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_HELI_CHASE")
|
|
START_AUDIO_SCENE("BS_2B_HELI_CHASE")
|
|
ENDIF
|
|
|
|
SET_AMBIENT_ZONE_LIST_STATE("AZL_BIG_SCORE_2B_WINDFARM_TURBINES", TRUE, TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
WAIT(1000)
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
DISPLAY_TAKE()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
f_chase_playback_speed = 0.5
|
|
i_time_last_chopper_killed = 0
|
|
i_current_chopper_wave = 0
|
|
i_player_rocket_event = 0
|
|
//i_enemy_rocket_event = 0
|
|
i_rocket_timer = GET_GAME_TIMER()
|
|
i_num_times_played_fall_behind_dialogue = 0
|
|
f_current_buddy_chopper_health = 1000.0
|
|
b_crew_gold_dropped_onto_train = FALSE
|
|
b_force_train_creation = FALSE
|
|
b_play_too_high_response = FALSE
|
|
b_trevor_chopper_too_high = FALSE
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(i_heli_explosion_timers) i
|
|
i_heli_explosion_timers[i] = 0
|
|
e_heli_state[i] = ENEMY_HELI_PLAY_RECORDING
|
|
ENDREPEAT
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_HELI_CHASE, "CHOPPER_CHASE")
|
|
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
//Player's vehicle recording carries over to the main chase for a bit.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
IF TIMERA() > 1500
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
|
|
AND GET_ENTITY_HEIGHT_ABOVE_GROUND(s_gold_choppers[0].veh) > 5.0
|
|
MISSION_FAILED(FAILED_BAILED_OUT_OF_CHOPPER)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//#IF IS_DEBUG_BUILD
|
|
// SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[0], f_debug_trolley_mass, f_debug_trolley_gravity_factor,
|
|
// <<-1.0, -1.0, 1.0>>, <<-1.0, -1.0, -1.0>>, -1.0, -1.0, f_debug_trolley_buoyancy)
|
|
//#ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
f_chase_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh)
|
|
|
|
RUBBER_BAND_CHASE(f_chase_playback_speed, s_gold_choppers[0].veh, s_gold_choppers[1].veh)
|
|
UPDATE_HELI_CHASE(f_chase_playback_time, f_chase_playback_speed)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, f_chase_playback_speed)
|
|
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, s_gold_choppers[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_GAMEPLAY_HINT_ACTIVE()
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_FOCUS_ON_HELI")
|
|
START_AUDIO_SCENE("BS_2B_FOCUS_ON_HELI")
|
|
ENDIF
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_FOCUS_ON_HELI")
|
|
STOP_AUDIO_SCENE("BS_2B_FOCUS_ON_HELI")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Remove any cops from earlier once the chase progresses
|
|
IF f_chase_playback_time > 20000.0
|
|
IF DOES_ENTITY_EXIST(ped_cutscene_cops[0])
|
|
REMOVE_PED(ped_cutscene_cops[0])
|
|
REMOVE_PED(ped_cutscene_cops[1])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fake locate: handles all the stuff for leaving the chopper, but the locate isn't considered.
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(s_locates_data)
|
|
#ENDIF
|
|
|
|
IF NOT b_has_text_label_triggered[BS2B_INFO]
|
|
//Dialogue before god text: Lester gives instructions.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_INFO", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_INFO] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_locates_data, v_outside_bank, <<0.001, 0.001, 0.001>>, FALSE, s_gold_choppers[0].veh,
|
|
"", "", "F3B_GETBACKHELI")
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
|
|
SET_BLIP_ROUTE(s_locates_data.LocationBlip, FALSE)
|
|
|
|
//Need to do a custom print here to show the crew member name.
|
|
IF NOT b_has_text_label_triggered[F3B_FOLLOWCREW]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_STRING_IN_STRING_NOW("F3B_FOLLOWCREW", str_crew_names[CREW_DRIVER_ID], DEFAULT_GOD_TEXT_TIME, 0)
|
|
b_has_text_label_triggered[F3B_FOLLOWCREW] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_gold_choppers[1].blip)
|
|
s_gold_choppers[1].blip = CREATE_BLIP_FOR_ENTITY(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(s_gold_choppers[1].blip)
|
|
REMOVE_BLIP(s_gold_choppers[1].blip)
|
|
ENDIF
|
|
|
|
//Fail for abandoning the chopper.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
VECTOR v_chopper_pos = GET_ENTITY_COORDS(s_gold_choppers[0].veh)
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_gold_choppers[0].veh)) > 10000.0
|
|
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
|
|
ELSE
|
|
IF v_chopper_pos.z - v_player_pos.z > 10.0
|
|
IF NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh)
|
|
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
|
|
OR v_player_pos.z < 1.0
|
|
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FLOAT f_dist_between_choppers
|
|
|
|
//Fail if the player abandons the crew during the chase.
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR v_heli_pos = GET_ENTITY_COORDS(s_gold_choppers[1].veh)
|
|
f_dist_between_choppers = VDIST2(<<v_player_pos.x, v_player_pos.y, 0.0>>, <<v_heli_pos.x, v_heli_pos.y, 0.0>>)
|
|
|
|
IF f_dist_between_choppers > 160000.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_CHASE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Keep track of how many choppers are still alive.
|
|
BOOL b_choppers_still_alive = FALSE
|
|
INT i_num_choppers_still_alive = 0
|
|
INT i = 0
|
|
REPEAT COUNT_OF(i_heli_explosion_timers) i
|
|
IF i_heli_explosion_timers[i] = 0
|
|
i_num_choppers_still_alive++
|
|
b_choppers_still_alive = TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF i_time_last_chopper_killed = 0
|
|
IF f_chase_playback_time > 90000.0
|
|
AND NOT b_choppers_still_alive
|
|
i_time_last_chopper_killed = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0 //Progress once either all the choppers are killed or the bad driver reaches the point where they're guaranteed to explode.
|
|
//Control the buddy chopper's health during the chase: gradually reduce while the enemies are still alive.
|
|
IF b_choppers_still_alive
|
|
FLOAT f_health_ratio, f_adjusted_playback_time
|
|
|
|
f_adjusted_playback_time = f_chase_playback_time
|
|
|
|
IF f_adjusted_playback_time < 75000.0
|
|
f_adjusted_playback_time = 75000.0
|
|
ELIF f_adjusted_playback_time > 117650.0
|
|
f_adjusted_playback_time = 117650.0
|
|
ENDIF
|
|
|
|
f_health_ratio = (f_adjusted_playback_time - 75000.0) / (117650.0 - 75000.0)
|
|
|
|
IF b_picked_good_driver
|
|
f_current_buddy_chopper_health = 1000.0 - (f_health_ratio * 900.0)
|
|
ELSE
|
|
f_current_buddy_chopper_health = 1000.0 - (f_health_ratio * 1000.0)
|
|
|
|
IF i_num_choppers_still_alive <= 1
|
|
IF f_current_buddy_chopper_health > 0.0
|
|
f_current_buddy_chopper_health = 0.0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh, f_current_buddy_chopper_health)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF f_chase_playback_time > 117650.0
|
|
OR (NOT b_choppers_still_alive AND i_time_last_chopper_killed != 0 AND GET_GAME_TIMER() - i_time_last_chopper_killed > 4000)
|
|
IF NOT b_picked_good_driver
|
|
OR b_choppers_still_alive
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
b_crew_driver_set_to_die = TRUE
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
IF GET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh) < 200.0
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh, 200.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ELSE
|
|
//Dialogue if the player is too far away.
|
|
IF i_num_times_played_fall_behind_dialogue < 4
|
|
IF f_dist_between_choppers > 22500.0
|
|
IF GET_GAME_TIMER() - i_fall_behind_chase_timer > 0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OFFPATH", CONV_PRIORITY_MEDIUM)
|
|
i_fall_behind_chase_timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
i_num_times_played_fall_behind_dialogue++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
i_fall_behind_chase_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Initial conversation: They see Merryweather, Lester gets the rocket launcher out.
|
|
IF NOT b_has_text_label_triggered[BS2B_SEES]
|
|
IF f_chase_playback_time > 68500.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SEES")
|
|
b_has_text_label_triggered[BS2B_SEES] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//NOTE: these lines are no longer needed, they've been replaced by the first lines after switching.
|
|
//If subtitles are off then slot these lines in after the god text.
|
|
/*IF NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
|
|
AND b_has_text_label_triggered[F3B_FOLLOWCREW]
|
|
AND f_chase_playback_time < 68500.0
|
|
IF NOT b_has_text_label_triggered[BS2B_TREVOR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TREVOR", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_TREVOR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_REPLY]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_REPLY", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_REPLY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_RESPOND]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_RESPOND", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_RESPOND] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
ELIF NOT b_has_text_label_triggered[BS2B_LSEES]
|
|
IF f_chase_playback_time < 74000.0
|
|
AND f_chase_playback_speed >= 0.7
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_LSEES", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_LSEES] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_DROP] //Driver says they're going to drop altitude.
|
|
IF f_chase_playback_time > 72500.0
|
|
AND f_chase_playback_time < 75000.0
|
|
AND f_chase_playback_speed >= 0.7
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_DROP")
|
|
b_has_text_label_triggered[BS2B_DROP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//Dialogue for the driver going to the wind farm.
|
|
IF f_chase_playback_time > 87000.0 AND f_chase_playback_time < 95000.0
|
|
IF NOT b_has_text_label_triggered[BS2B_OVER]
|
|
IF f_chase_playback_speed > 0.7
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
CrewMember eCrewID
|
|
eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID)
|
|
|
|
IF eCrewID = CM_DRIVER_G_EDDIE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OVER_ET", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_OVER] = TRUE
|
|
ENDIF
|
|
ELIF eCrewID = CM_DRIVER_G_TALINA_UNLOCK
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OVER_TM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_OVER] = TRUE
|
|
ENDIF
|
|
ELIF eCrewID = CM_DRIVER_B_KARIM
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_OVER_KD", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_OVER] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//If the player is behind then just skip this.
|
|
b_has_text_label_triggered[BS2B_OVER] = TRUE
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_WIND]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_WIND")
|
|
b_has_text_label_triggered[BS2B_WIND] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
//Lester warns that the choppers need to be taken out.
|
|
/*IF f_chase_playback_time > 104000.0
|
|
AND e_rocket_anim_state = ROCKET_ANIM_AIMING
|
|
IF NOT b_has_text_label_triggered[BS2B_BEFORE]
|
|
AND b_choppers_still_alive
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BEFORE", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BEFORE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
//Crew driver says they're in trouble.
|
|
IF f_chase_playback_time > 104000.0
|
|
AND e_rocket_anim_state = ROCKET_ANIM_AIMING
|
|
IF NOT b_has_text_label_triggered[BS2B_HLP2]
|
|
AND b_choppers_still_alive
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_HLP2")
|
|
b_has_text_label_triggered[BS2B_HLP2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF b_crew_driver_set_to_die
|
|
IF NOT b_has_text_label_triggered[BS2B_CRS]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_CRS")
|
|
b_has_text_label_triggered[BS2B_CRS] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh, -200.0)
|
|
ENDIF
|
|
|
|
IF TIMERB() < 2000
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
APPLY_FORCE_TO_ENTITY(s_gold_choppers[1].veh, APPLY_TYPE_FORCE, <<-15.0, 0.0, 0.0>>, <<0.0, -3.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
APPLY_FORCE_TO_ENTITY(s_gold_choppers[1].veh, APPLY_TYPE_FORCE, <<5.0, 5.0, -10.0>>, v_zero, 0, FALSE, TRUE, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
SET_ENTITY_PROOFS(s_gold_choppers[1].veh, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_INVINCIBLE(s_gold_choppers[1].veh, FALSE)
|
|
SET_VEHICLE_OUT_OF_CONTROL(s_gold_choppers[1].veh)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[1].veh, -300.0)
|
|
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[4].rope)
|
|
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, s_gold_choppers[1].veh)
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[1].veh, NULL, 0.0)
|
|
|
|
s_heli_ropes_new[4].b_is_attached = FALSE
|
|
s_heli_ropes_new[5].b_is_attached = FALSE
|
|
s_heli_ropes_new[6].b_is_attached = FALSE
|
|
s_heli_ropes_new[7].b_is_attached = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ADD_EXPLOSION(GET_ENTITY_COORDS(s_gold_choppers[1].veh, FALSE), EXP_TAG_ROCKET, 1.0)
|
|
|
|
i_take_penalty_crew_died = MAX_OVERALL_TAKE / 2
|
|
i_current_take -= i_take_penalty_crew_died
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ELSE
|
|
i_current_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT b_crew_driver_set_to_die
|
|
IF b_choppers_still_alive
|
|
IF f_chase_playback_time > 124000.0
|
|
MISSION_FAILED(FAILED_DIDNT_KILL_MERRYWEATHER)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_SAF]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_SAF")
|
|
b_has_text_label_triggered[BS2B_SAF] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Dialogue commenting on the crew dying.
|
|
IF NOT b_has_text_label_triggered[BS2B_DOWN]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DOWN", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DOWN] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF b_choppers_still_alive
|
|
IF TIMERB() > 4000
|
|
MISSION_FAILED(FAILED_DIDNT_KILL_MERRYWEATHER)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_BAD]
|
|
IF b_picked_good_driver
|
|
//Player picked a good driver, but didn't kill Merryweather in time.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
CrewMember eCrewID
|
|
eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER_ID)
|
|
|
|
//Need to play different lines based on gender.
|
|
IF eCrewID = CM_DRIVER_G_EDDIE OR eCrewID = CM_DRIVER_B_KARIM
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOOD_EK", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BAD] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOOD_TM", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BAD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Player picked bad driver who was always going to crash.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_BAD", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_BAD] = TRUE
|
|
b_force_train_creation = TRUE //2046008 - If all the enemies are killed really early and the bad driver dies, then the player is stuck waiting for the train to spawn.
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF TIMERB() > 2000
|
|
AND NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Create and update the train.
|
|
IF NOT DOES_ENTITY_EXIST(veh_gold_train)
|
|
IF b_force_train_creation
|
|
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<2216.3, 2628.0, 52.0>>) < 250000.0
|
|
SETUP_REQ_GOLD_TRAIN()
|
|
ENDIF
|
|
ELIF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
IF b_crew_driver_set_to_die
|
|
CONVERGE_VALUE(f_current_train_speed, 15.0, 0.1)
|
|
SET_TRAIN_CRUISE_SPEED(veh_gold_train, f_current_train_speed)
|
|
SET_TRAIN_SPEED(veh_gold_train, f_current_train_speed)
|
|
ELSE
|
|
RUBBER_BAND_TRAIN_TO_VEH(veh_gold_train, 1, s_gold_choppers[1].veh, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Gold container collision audio.
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[0])
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_COLLISIONS")
|
|
IF HAS_SOUND_FINISHED(i_gold_container_sound_id)
|
|
PLAY_SOUND_FROM_ENTITY(i_gold_container_sound_id, "Gold_Cage_Collisions", obj_gold_containers[0], "BIG_SCORE_3B_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if the trolley starts swinging into the chopper.
|
|
IF TIMERA() > 2000
|
|
IF HAS_TROLLEY_ROPE_ATTACHMENT_BEEN_BROKEN(i_rope_detach_timer, 0)
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[0].rope)
|
|
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[0].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[1].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[2].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[3].rope, s_gold_choppers[0].veh)
|
|
|
|
DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
|
|
|
|
s_heli_ropes_new[0].b_is_attached = FALSE
|
|
s_heli_ropes_new[1].b_is_attached = FALSE
|
|
s_heli_ropes_new[2].b_is_attached = FALSE
|
|
s_heli_ropes_new[3].b_is_attached = FALSE
|
|
ENDIF
|
|
|
|
MISSION_FAILED(FAILED_TROLLEY_DETACHED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISPLAY_TAKE()
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
|
|
STOP_CAM_PLAYBACK(veh_chase_cam)
|
|
REMOVE_VEHICLE(veh_chase_cam, TRUE)
|
|
REMOVE_CAM_RECORDING(CARREC_CHASE_CAM_ANGLE_1, str_carrec)
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
REMOVE_VEHICLE(SetPieceCarID[0], FALSE)
|
|
REMOVE_VEHICLE(SetPieceCarID[1], FALSE)
|
|
REMOVE_VEHICLE(SetPieceCarID[2], FALSE)
|
|
|
|
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[0], str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[1], str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[2], str_carrec)
|
|
|
|
REMOVE_OBJECT(obj_single_rocket, TRUE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_merry)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_military_chopper)
|
|
REMOVE_PTFX_ASSET()
|
|
|
|
IF sbi_chase_start != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbi_chase_start)
|
|
sbi_chase_start = NULL
|
|
ENDIF
|
|
|
|
IF b_crew_driver_set_to_die
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
REMOVE_OBJECT(obj_gold_containers[1])
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped)
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_DROP_GOLD_ON_TRAIN
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_DROP_GOLD_ON_TRAIN)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DROP_GOLD_ON_TRAIN()
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
IF SETUP_REQ_PLAYER_AS_TREVOR()
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(<<2098.3, 2464.01, 87.0>>, -38.24, FALSE)
|
|
|
|
i_current_event = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2098.3, 2464.01, 87.0>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), -38.24)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
LOAD_HELI_CHASE_UBER_DATA()
|
|
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
|
|
IF SETUP_REQ_PLAYER_AS_TREVOR()
|
|
AND SETUP_GOLD_CHOPPERS(<<2107.78, 2443.01, 117.60>>, -38.24, <<2176.8989, 2575.7715, 62.2540>>, 328.2068)
|
|
AND SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
AND SETUP_LESTER_IN_CHOPPER()
|
|
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
|
|
AND (b_crew_driver_set_to_die OR (NOT b_crew_driver_set_to_die AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(1)))
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
SETUP_TREVOR_OUTFIT()
|
|
|
|
IF b_has_used_checkpoint
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_ENTITY_COORDS(s_gold_choppers[0].veh, <<2107.78, 2443.01, 117.60>>)
|
|
SET_ENTITY_HEADING(s_gold_choppers[0].veh, -38.24)
|
|
SET_ENTITY_COORDS(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[0].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[0], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[0])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
IF NOT b_crew_driver_set_to_die
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
SETUP_DRIVER_OUTFIT()
|
|
ENDIF
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 122000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(s_gold_choppers[1].veh, TRUE)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
|
|
SET_ENTITY_COORDS(obj_gold_containers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_gold_choppers[1].veh, <<0.0, 0.0, -ROPE_MIN_LENGTH>>))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[1], <<0.0, 0.0, GET_ENTITY_HEADING(obj_gold_containers[1])>>)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh) * 0.5)
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
|
|
i_current_take = i_max_take_considering_crew
|
|
i_displayed_take = i_current_take
|
|
|
|
//Don't play Lester's rocket anims on a skip.
|
|
e_rocket_anim_state = ROCKET_ANIM_PUT_LAUNCHER_AWAY
|
|
i_lester_rocket_anim_event = 99
|
|
i_lester_rocket_sync_scene = -1
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_GOLD_TRAIN()
|
|
//SET_OBJECT_PHYSICS_PARAMS(obj_gold_containers[0], -1.0, -1.0, <<-1.0, -1.0, 1.0>>, <<-1.0, -1.0, -1.0>>)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
DELETE_ALL_TRAINS()
|
|
|
|
//Disable wanted level.
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_GET_TO_TRAIN")
|
|
START_AUDIO_SCENE("BS_2B_GET_TO_TRAIN")
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
//In case it was frozen in the Z-skip.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, FALSE)
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_DROP_GOLD_RESTART")
|
|
SET_AMBIENT_ZONE_LIST_STATE("AZL_BIG_SCORE_2B_WINDFARM_TURBINES", TRUE, TRUE)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_VEHICLE_FORWARD_SPEED(s_gold_choppers[0].veh, 20.0)
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(s_gold_choppers[0].veh) * 0.5)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
b_player_got_close_enough_to_train = FALSE
|
|
b_set_improved_heli_handling = FALSE
|
|
i_current_music_event = 0
|
|
i_time_train_help_displayed = 0
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DROPOFF_GOLD, "DROP_OFF_GOLD")
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FH2B_GOLD_DROP_TIME)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
b_crew_gold_dropped_onto_train = FALSE
|
|
i_time_crew_gold_dropped = 0
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
f_chase_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh)
|
|
RUBBER_BAND_CHASE(f_chase_playback_speed, s_gold_choppers[0].veh, s_gold_choppers[1].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, f_chase_playback_speed)
|
|
ENDIF
|
|
|
|
IF f_chase_playback_time > 120000.0
|
|
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
SET_ENTITY_INVINCIBLE(s_gold_choppers[1].veh, FALSE)
|
|
SET_ENTITY_PROOFS(s_gold_choppers[1].veh, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
|
|
AND GET_ENTITY_HEIGHT_ABOVE_GROUND(s_gold_choppers[0].veh) > 5.0
|
|
MISSION_FAILED(FAILED_BAILED_OUT_OF_CHOPPER)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
IF NOT b_set_improved_heli_handling
|
|
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), GET_ENTITY_COORDS(veh_gold_train)) < 10000.0
|
|
SET_HELI_TURBULENCE_SCALAR(s_gold_choppers[0].veh, 0.0)
|
|
SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(s_gold_choppers[0].veh, 0.0)
|
|
ENDIF
|
|
ELSE
|
|
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), GET_ENTITY_COORDS(veh_gold_train)) > 22500.0
|
|
SET_HELI_TURBULENCE_SCALAR(s_gold_choppers[0].veh, 1.0)
|
|
SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(s_gold_choppers[0].veh, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fake locate: handles all the stuff for leaving the chopper, but the locate isn't considered.
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(s_locates_data)
|
|
#ENDIF
|
|
|
|
//Dialogue before god text: varies depending on if the driver survived.
|
|
IF NOT b_has_text_label_triggered[BS2B_CLEAR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF b_crew_driver_set_to_die
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_CLEAR", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_CLEAR] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_GOING", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_CLEAR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_locates_data, v_outside_bank, <<0.001, 0.001, 0.001>>, FALSE, s_gold_choppers[0].veh,
|
|
"F3B_DROPGOLD", "", "F3B_GETBACKHELI")
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF i_current_music_event = 0
|
|
IF NOT IS_MUSIC_ONESHOT_PLAYING()
|
|
i_current_music_event++
|
|
ENDIF
|
|
ELIF i_current_music_event = 1
|
|
PREPARE_MUSIC_EVENT("FH2B_GOLD_DROPPED")
|
|
ENDIF
|
|
|
|
//Request assets for next cutscene.
|
|
REQUEST_MODEL(model_gold_chopper)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
LOAD_STREAM("Gold_Drop_Train", "BIG_SCORE_3B_SOUNDS")
|
|
|
|
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
SET_BLIP_ALPHA(s_locates_data.LocationBlip, 0)
|
|
SET_BLIP_ROUTE(s_locates_data.LocationBlip, FALSE)
|
|
|
|
IF NOT DOES_BLIP_EXIST(blip_current_objective)
|
|
AND NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
blip_current_objective = CREATE_BLIP_FOR_ENTITY(GET_TRAIN_CARRIAGE(veh_gold_train, 1))
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX veh_train_carriage_1
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
veh_train_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
|
|
ENDIF
|
|
BOOL b_safe_to_drop_gold = TRUE
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_train_carriage_1)
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
//Check that the train isn't about to go under a bridge.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(veh_gold_train, <<2520.433350,2815.515381,35.313625>>, <<2473.084961,2762.365723,44.206718>>, 9.750000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(veh_train_carriage_1, <<2520.433350,2815.515381,35.313625>>, <<2473.084961,2762.365723,44.206718>>, 9.750000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(veh_gold_train, <<2901.285889,3585.482910,41.650940>>, <<2874.897461,3763.112549,50.441540>>, 51.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(veh_train_carriage_1, <<2901.285889,3585.482910,41.650940>>, <<2874.897461,3763.112549,50.441540>>, 51.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(veh_gold_train, <<2657.047852,3913.478760,39.682320>>, <<2489.471924,3882.476563,46.098293>>, 51.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(veh_train_carriage_1, <<2657.047852,3913.478760,39.682320>>, <<2489.471924,3882.476563,46.098293>>, 51.000000)
|
|
b_safe_to_drop_gold = FALSE
|
|
ENDIF
|
|
|
|
//Draw a corona if it's currently safe to drop.
|
|
IF b_safe_to_drop_gold
|
|
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_carriage_1, <<0.0, 0.0, -0.4>>),
|
|
<<0.01, 0.01, LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
ENDIF
|
|
|
|
BOOL b_above_carriage_1
|
|
b_above_carriage_1 = IS_ENTITY_IN_ANGLED_AREA(s_gold_choppers[0].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_carriage_1, <<0.0, 9.0, 7.0>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_carriage_1, <<0.0, -20.0, 24.0>>),
|
|
10.0)
|
|
|
|
IF b_above_carriage_1
|
|
IF b_safe_to_drop_gold
|
|
IF NOT b_has_text_label_triggered[F3B_DROPHELP]
|
|
IF GET_GAME_TIMER() - i_time_train_help_cleared > 1000
|
|
OR i_time_train_help_displayed = 0 //This is so there's no delay the first time the help is printed.
|
|
PRINT_HELP_FOREVER("F3B_DROPHELP")
|
|
b_has_text_label_triggered[F3B_DROPHELP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF b_has_text_label_triggered[BS2B_NODROP]
|
|
IF NOT b_has_text_label_triggered[BS2B_YESDROP]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_YESDROP", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_NODROP] = FALSE
|
|
b_has_text_label_triggered[BS2B_YESDROP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
|
|
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_GRAPPLING_HOOK)
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
i_time_train_help_displayed = GET_GAME_TIMER()
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_NODROP]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_NODROP", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_NODROP] = TRUE
|
|
b_has_text_label_triggered[BS2B_YESDROP] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF b_has_text_label_triggered[F3B_DROPHELP]
|
|
IF GET_GAME_TIMER() - i_time_train_help_displayed > 1000
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3B_DROPHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
b_has_text_label_triggered[F3B_DROPHELP] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i_time_train_help_cleared = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
//The buddy chopper drops it's gold first (if they're still alive). Once it's dropped go at a speed that the player can catch up to.
|
|
IF b_crew_gold_dropped_onto_train
|
|
OR b_crew_driver_set_to_die
|
|
CONVERGE_VALUE(f_current_train_speed, 15.0, 0.1)
|
|
SET_TRAIN_CRUISE_SPEED(veh_gold_train, f_current_train_speed)
|
|
SET_TRAIN_SPEED(veh_gold_train, f_current_train_speed)
|
|
|
|
//Play some dialogue after dropping the gold.
|
|
IF b_crew_gold_dropped_onto_train
|
|
IF NOT b_has_text_label_triggered[BS2B_PACK1]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_PACK")
|
|
b_has_text_label_triggered[BS2B_PACK1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Make sure the crew's trolley is attached on falling.
|
|
IF NOT IS_ENTITY_DEAD(veh_train_carriage_1)
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(obj_gold_containers[1], veh_train_carriage_1)
|
|
//Apply a force that'll guide the container onto the train
|
|
IF GET_GAME_TIMER() - i_time_crew_gold_dropped < 1500
|
|
VECTOR v_container_pos = GET_ENTITY_COORDS(obj_gold_containers[1])
|
|
VECTOR v_desired_attach_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_carriage_1, <<0.0, -2.0, 0.0>>)
|
|
VECTOR v_diff = <<v_desired_attach_pos.x, v_desired_attach_pos.y, 0.0>> - <<v_container_pos.x, v_container_pos.y, 0.0>>
|
|
VECTOR v_dir = v_diff / VMAG(v_diff)
|
|
|
|
APPLY_FORCE_TO_ENTITY(obj_gold_containers[1], APPLY_TYPE_FORCE, v_dir * 30.0, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_TOUCHING_ENTITY(obj_gold_containers[1], veh_train_carriage_1)
|
|
IF GET_GAME_TIMER() - i_time_crew_gold_dropped > 1600
|
|
VECTOR v_attach_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_carriage_1, GET_ENTITY_COORDS(obj_gold_containers[1]))
|
|
VECTOR v_attach_rotation = GET_ENTITY_ROTATION(obj_gold_containers[1]) - GET_ENTITY_ROTATION(veh_train_carriage_1)
|
|
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, obj_gold_containers[1])
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, obj_gold_containers[1])
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, obj_gold_containers[1])
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, obj_gold_containers[1])
|
|
|
|
DETACH_ENTITY(obj_gold_containers[1], TRUE, FALSE)
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[1].veh, NULL, 0.0)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[1], veh_train_carriage_1, 0, v_attach_offset, v_attach_rotation, FALSE, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
RUBBER_BAND_TRAIN_TO_VEH(veh_gold_train, 1, s_gold_choppers[1].veh, 2.0)
|
|
|
|
IF f_chase_playback_time > 135450.0 AND f_chase_playback_time < 140000.0
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[4].rope)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, s_gold_choppers[1].veh)
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[1].veh, NULL, 0.0)
|
|
|
|
/*DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, obj_gold_containers[1])
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, obj_gold_containers[1])
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, obj_gold_containers[1])
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, obj_gold_containers[1])
|
|
|
|
DETACH_ENTITY(obj_gold_containers[1], TRUE, FALSE)*/
|
|
SET_ENTITY_VELOCITY(obj_gold_containers[1], GET_ENTITY_VELOCITY(s_gold_choppers[1].veh))
|
|
|
|
s_heli_ropes_new[4].b_is_attached = FALSE
|
|
s_heli_ropes_new[5].b_is_attached = FALSE
|
|
s_heli_ropes_new[6].b_is_attached = FALSE
|
|
s_heli_ropes_new[7].b_is_attached = FALSE
|
|
ENDIF
|
|
|
|
i_time_crew_gold_dropped = GET_GAME_TIMER()
|
|
b_crew_gold_dropped_onto_train = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Do a hint cam to the train.
|
|
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, veh_gold_train)
|
|
|
|
//Dialogue:
|
|
//Train driver says a line as the choppers get closer.
|
|
IF NOT b_has_text_label_triggered[BS2B_TRN]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_gold_train)) < 62500.0
|
|
IF b_crew_driver_set_to_die
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_TRAIN_DRIVER_ID, NULL, s_conversation_peds, str_dialogue_block, "BS2B_TRN1")
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_TRN] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_TRAIN_DRIVER_ID, NULL, s_conversation_peds, str_dialogue_block, "BS2B_TRN2")
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_TRN] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR v_train_pos = GET_ENTITY_COORDS(veh_gold_train)
|
|
FLOAT f_dist_from_train = VDIST2(<<v_player_pos.x, v_player_pos.y, 0.0>>, <<v_train_pos.x, v_train_pos.y, 0.0>>)
|
|
|
|
//2046008 - If we had to trigger the train early then make sure the player doesn't fail immediately for being too far away.
|
|
IF NOT b_player_got_close_enough_to_train
|
|
IF f_dist_from_train < 360000.0
|
|
b_player_got_close_enough_to_train = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF f_dist_from_train > 490000.0
|
|
AND b_player_got_close_enough_to_train
|
|
MISSION_FAILED(FAILED_ABANDONED_CREW_IN_CHASE)
|
|
ENDIF
|
|
|
|
//Fail if the player just follows the train indefinitely.
|
|
IF VDIST2(v_train_pos, <<-448.7, 4089.8, 85.0>>) < 100.0
|
|
MISSION_FAILED(FAILED_MISSED_TRAIN)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(blip_current_objective)
|
|
REMOVE_BLIP(blip_current_objective)
|
|
ENDIF
|
|
|
|
//Fail for abandoning the chopper.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
VECTOR v_chopper_pos = GET_ENTITY_COORDS(s_gold_choppers[0].veh)
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_gold_choppers[0].veh)) > 10000.0
|
|
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
|
|
ELSE
|
|
IF v_chopper_pos.z - v_player_pos.z > 10.0
|
|
IF NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh)
|
|
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
|
|
OR v_player_pos.z < 1.0
|
|
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3B_DROPHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_GAMEPLAY_HINT_ACTIVE()
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_FOCUS_ON_TRAIN")
|
|
START_AUDIO_SCENE("BS_2B_FOCUS_ON_TRAIN")
|
|
ENDIF
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_FOCUS_ON_TRAIN")
|
|
STOP_AUDIO_SCENE("BS_2B_FOCUS_ON_TRAIN")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Carry over the cleanup of Lester's anims
|
|
IF NOT IS_PED_INJURED(s_lester.ped)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
IF e_rocket_anim_state != ROCKET_ANIM_PUT_LAUNCHER_AWAY
|
|
SET_LESTER_ROCKET_ANIM_STATE(ROCKET_ANIM_PUT_LAUNCHER_AWAY)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_LESTER_ROCKET_ANIMS()
|
|
ENDIF
|
|
|
|
//Gold container collision audio.
|
|
IF DOES_ENTITY_EXIST(obj_gold_containers[0])
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_COLLISIONS")
|
|
IF HAS_SOUND_FINISHED(i_gold_container_sound_id)
|
|
PLAY_SOUND_FROM_ENTITY(i_gold_container_sound_id, "Gold_Cage_Collisions", obj_gold_containers[0], "BIG_SCORE_3B_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_TROLLEY_ROPE_ATTACHMENT_BEEN_BROKEN(i_rope_detach_timer, 0)
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[0].rope)
|
|
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[0].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[1].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[2].rope, s_gold_choppers[0].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[3].rope, s_gold_choppers[0].veh)
|
|
|
|
DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
|
|
|
|
s_heli_ropes_new[0].b_is_attached = FALSE
|
|
s_heli_ropes_new[1].b_is_attached = FALSE
|
|
s_heli_ropes_new[2].b_is_attached = FALSE
|
|
s_heli_ropes_new[3].b_is_attached = FALSE
|
|
ENDIF
|
|
|
|
MISSION_FAILED(FAILED_TROLLEY_DETACHED)
|
|
ENDIF
|
|
|
|
DISPLAY_TAKE()
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
REMOVE_OBJECT(obj_lesters_rpg, TRUE)
|
|
REMOVE_ANIM_DICT(str_anim_rocket_reload)
|
|
REMOVE_ANIM_DICT(str_anim_rocket_signal)
|
|
REMOVE_ANIM_DICT(str_anim_rockets)
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(FALSE, FH2B_GOLD_DROP_TIME)
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_DROP_GOLD_ON_TRAIN_CUTSCENE
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_LAND_AT_AIRFIELD)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DROP_GOLD_ON_TRAIN_CUTSCENE()
|
|
INT i = 0
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2720.3782, 3131.4307, 42.5514>>)
|
|
|
|
//Need to load the scene first in this case, otherwise some physics don't work correctly
|
|
IF SETUP_REQ_PLAYER_AS_TREVOR()
|
|
AND SETUP_GOLD_CHOPPERS(<<2720.3782, 3131.4307, 72.1530>>, 334.9478, <<2786.2661, 3303.3547, 85.3582>>, 347.3535)
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, TRUE)
|
|
|
|
LOAD_SCENE(<<2169.7993, 2490.4705, 79.5050>>)
|
|
|
|
WAIT(1000)
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
|
|
IF SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
AND SETUP_LESTER_IN_CHOPPER()
|
|
AND SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0)
|
|
//AND SETUP_SUPPORT_ROPES_FOR_PLAYER_CHOPPER()
|
|
AND SETUP_REQ_GOLD_TRAIN()
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_HELI_TURBULENCE_SCALAR(s_gold_choppers[0].veh, 1.0)
|
|
SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(s_gold_choppers[0].veh, 1.0)
|
|
|
|
IF NOT b_crew_driver_set_to_die
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
SETUP_DRIVER_OUTFIT()
|
|
ENDIF
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 140000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_gold_choppers) i
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[i].veh)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[i].veh, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[i].veh)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[i].veh, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
|
|
SETUP_TREVOR_OUTFIT()
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
SET_MISSION_TRAIN_COORDS(veh_gold_train, <<2795.0928, 3279.0688, 45.8408>>)
|
|
SET_TRAIN_CRUISE_SPEED(veh_gold_train, 15.0)
|
|
SET_TRAIN_SPEED(veh_gold_train, 15.0)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
|
|
i_current_take = i_max_take_considering_crew
|
|
i_displayed_take = i_current_take
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
REQUEST_MODEL(model_gold_chopper)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_GOLD, str_carrec)
|
|
|
|
IF LOAD_STREAM("Gold_Drop_Train", "BIG_SCORE_3B_SOUNDS")
|
|
AND HAS_MODEL_LOADED(model_gold_chopper)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN_GOLD, str_carrec)
|
|
//Buddy heli just flies off
|
|
//IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
//AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
// TASK_HELI_MISSION(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh, NULL, NULL, <<2109.1042, 4802.0615, 40.1387>>, MISSION_LAND_AND_WAIT, 30.0, 2.0, 193.5127,
|
|
// 120, 80)
|
|
//ENDIF
|
|
|
|
//Create two helper vehicles that'll play a recording of a helicopter hovering above a train.
|
|
veh_train_hover_helpers[0] = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 45.4778>>, 324.5322)
|
|
SET_ENTITY_COLLISION(veh_train_hover_helpers[0], FALSE)
|
|
SET_ENTITY_VISIBLE(veh_train_hover_helpers[0], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[0], CARREC_HOVER_TRAIN, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[0], 8000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_train_hover_helpers[0], FALSE)
|
|
|
|
veh_train_hover_helpers[1] = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 55.4778>>, 324.5322)
|
|
SET_ENTITY_COLLISION(veh_train_hover_helpers[1], FALSE)
|
|
SET_ENTITY_VISIBLE(veh_train_hover_helpers[1], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[1], CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[1], 8000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_train_hover_helpers[1], FALSE)
|
|
|
|
veh_train_hover_helpers[2] = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 50.4778>>, 324.5322)
|
|
SET_ENTITY_COLLISION(veh_train_hover_helpers[2], FALSE)
|
|
SET_ENTITY_VISIBLE(veh_train_hover_helpers[2], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[2], CARREC_HOVER_TRAIN_GOLD, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[2], 0.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_train_hover_helpers[2], FALSE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
|
|
|
|
//Set the player's heli to copy the offset of the helper heli from the train it's hovering over.
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
AND NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[0])
|
|
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[1])
|
|
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[2])
|
|
VEHICLE_INDEX veh_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
|
|
VECTOR v_helper_heli_rotation = GET_ENTITY_ROTATION(veh_train_hover_helpers[1])
|
|
VECTOR v_helper_gold_rotation = GET_ENTITY_ROTATION(veh_train_hover_helpers[2])
|
|
FLOAT f_helper_train_heading = GET_ENTITY_HEADING(veh_train_hover_helpers[0])
|
|
FLOAT f_heading_diff = v_helper_heli_rotation.z - f_helper_train_heading
|
|
FLOAT f_gold_heading_diff = v_helper_gold_rotation.z - f_helper_train_heading
|
|
|
|
|
|
VECTOR v_heli_offset_from_helper_train = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_hover_helpers[0], GET_ENTITY_COORDS(veh_train_hover_helpers[1]))
|
|
VECTOR v_gold_offset_from_helper_train = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_hover_helpers[0], GET_ENTITY_COORDS(veh_train_hover_helpers[2]))
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(s_gold_choppers[0].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_carriage_1, v_heli_offset_from_helper_train))
|
|
SET_ENTITY_ROTATION(s_gold_choppers[0].veh, <<v_helper_heli_rotation.x, v_helper_heli_rotation.y, f_heading_diff + GET_ENTITY_HEADING(veh_carriage_1)>>)
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_carriage_1, v_gold_offset_from_helper_train))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[0], <<v_helper_gold_rotation.x, v_helper_gold_rotation.y, f_gold_heading_diff + GET_ENTITY_HEADING(veh_carriage_1)>>)
|
|
ENDIF
|
|
|
|
PLAY_STREAM_FROM_VEHICLE(s_gold_choppers[0].veh)
|
|
|
|
//If the buddy gold wasn't dropped yet then just do it now.
|
|
IF NOT b_crew_driver_set_to_die
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[4].rope)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[4].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[5].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[6].rope, s_gold_choppers[1].veh)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[7].rope, s_gold_choppers[1].veh)
|
|
|
|
DELETE_ROPE(s_heli_ropes_new[4].rope)
|
|
DELETE_ROPE(s_heli_ropes_new[5].rope)
|
|
DELETE_ROPE(s_heli_ropes_new[6].rope)
|
|
DELETE_ROPE(s_heli_ropes_new[7].rope)
|
|
|
|
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[1].veh, NULL, 0.0)
|
|
|
|
s_heli_ropes_new[4].b_is_attached = FALSE
|
|
s_heli_ropes_new[5].b_is_attached = FALSE
|
|
s_heli_ropes_new[6].b_is_attached = FALSE
|
|
s_heli_ropes_new[7].b_is_attached = FALSE
|
|
ENDIF
|
|
|
|
DETACH_ENTITY(obj_gold_containers[1])
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[1], veh_carriage_1, 0, <<0.0, -2.0, 0.55>>, <<0.0, 0.0, 2.7>>, FALSE, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX veh_carriage_cam = veh_gold_train
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_carriage_cam)
|
|
DESTROY_ALL_CAMS()
|
|
cam_main = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
ATTACH_CAM_TO_ENTITY(cam_main, veh_carriage_cam, <<-2.6097, -5.1243, 1.6098>>)
|
|
POINT_CAM_AT_ENTITY(cam_main, veh_carriage_cam, <<-2.0230, -8.0717, 1.5609>>)
|
|
SET_CAM_FOV(cam_main, 42.0)
|
|
SHAKE_CAM(cam_main, "ROAD_VIBRATION_SHAKE", 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i < 4
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
|
|
ROPE_SET_UPDATE_ORDER(s_heli_ropes_new[i].rope, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF b_crew_driver_set_to_die
|
|
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
SETTIMERB(0)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2B_DROPPED_RESTART")
|
|
SET_AMBIENT_ZONE_LIST_STATE("AZL_BIG_SCORE_2B_WINDFARM_TURBINES", TRUE, TRUE)
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2B_GOLD_DROPPED")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_DROP_GOLD_CUTSCENE")
|
|
START_AUDIO_SCENE("BS_2B_DROP_GOLD_CUTSCENE")
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
IF NOT b_replay_event_started
|
|
REPLAY_START_EVENT()
|
|
b_replay_event_started = TRUE
|
|
ENDIF
|
|
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
VEHICLE_INDEX veh_carriage_1, veh_carriage_cam
|
|
|
|
//Update the heli's position every frame: Set the heli to copy the offset of the helper heli from the train it's hovering over.
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
AND NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[0])
|
|
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[1])
|
|
AND NOT IS_ENTITY_DEAD(veh_train_hover_helpers[2])
|
|
//TEMP: used to make it easier to grab cam offsets
|
|
//SET_TRAIN_CRUISE_SPEED(veh_gold_train, 0.0)
|
|
//SET_TRAIN_SPEED(veh_gold_train, 0.0)
|
|
|
|
veh_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
|
|
veh_carriage_cam = veh_gold_train
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
|
|
VECTOR v_helper_heli_rotation = GET_ENTITY_ROTATION(veh_train_hover_helpers[1])
|
|
VECTOR v_helper_gold_rotation = GET_ENTITY_ROTATION(veh_train_hover_helpers[2])
|
|
FLOAT f_helper_train_heading = GET_ENTITY_HEADING(veh_train_hover_helpers[0])
|
|
FLOAT f_heading_diff = v_helper_heli_rotation.z - f_helper_train_heading
|
|
FLOAT f_gold_heading_diff = v_helper_gold_rotation.z - f_helper_train_heading
|
|
|
|
VECTOR v_heli_offset_from_helper_train = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_hover_helpers[0], GET_ENTITY_COORDS(veh_train_hover_helpers[1]))
|
|
VECTOR v_gold_offset_from_helper_train = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_train_hover_helpers[0], GET_ENTITY_COORDS(veh_train_hover_helpers[2]))
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(s_gold_choppers[0].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_carriage_1, v_heli_offset_from_helper_train))
|
|
SET_ENTITY_ROTATION(s_gold_choppers[0].veh, <<v_helper_heli_rotation.x, v_helper_heli_rotation.y, f_heading_diff + GET_ENTITY_HEADING(veh_carriage_1)>>)
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(obj_gold_containers[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_carriage_1, v_gold_offset_from_helper_train))
|
|
SET_ENTITY_ROTATION(obj_gold_containers[0], <<v_helper_gold_rotation.x, v_helper_gold_rotation.y, f_gold_heading_diff + GET_ENTITY_HEADING(veh_carriage_1)>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH i_current_event
|
|
CASE 0 //Start the cam interp
|
|
IF TIMERB() > 150
|
|
IF NOT IS_ENTITY_DEAD(veh_carriage_cam)
|
|
cam_interp = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
ATTACH_CAM_TO_ENTITY(cam_interp, veh_carriage_cam, <<-2.6100, -5.1185, 1.6098>>)
|
|
POINT_CAM_AT_ENTITY(cam_interp, veh_carriage_cam, <<-1.9070, -8.0153, 1.2721>>)
|
|
SET_CAM_FOV(cam_interp, 42.0)
|
|
SHAKE_CAM(cam_interp, "ROAD_VIBRATION_SHAKE", 1.0)
|
|
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_interp, cam_main, 1700, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Drop the gold.
|
|
IF TIMERB() > 350
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i < 4
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
|
|
ROPE_SET_REFFRAMEVELOCITY_COLLIDERORDER(s_heli_ropes_new[i].rope, 0)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[i].rope, s_gold_choppers[0].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
|
|
//FREEZE_ENTITY_POSITION(obj_gold_containers[0], FALSE)
|
|
//SET_ENTITY_VELOCITY(obj_gold_containers[0], GET_ENTITY_VELOCITY(veh_gold_train) * 1.5)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF TIMERB() > 300
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i < 4
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
|
|
AND s_heli_ropes_new[i].b_is_attached
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[i].rope, obj_gold_containers[0])
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
|
|
IF IS_ENTITY_ATTACHED(obj_gold_containers[0])
|
|
DETACH_ENTITY(obj_gold_containers[0])
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF TIMERB() > 600
|
|
SHAKE_CAM(cam_main, "SMALL_EXPLOSION_SHAKE", 0.05)
|
|
SHAKE_CAM(cam_interp, "SMALL_EXPLOSION_SHAKE", 0.05)
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_gold_container_sound_id)
|
|
STOP_SOUND(i_gold_container_sound_id)
|
|
ENDIF
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF TIMERB() > 1000
|
|
SHAKE_CAM(cam_main, "ROAD_VIBRATION_SHAKE", 1.0)
|
|
SHAKE_CAM(cam_interp, "ROAD_VIBRATION_SHAKE", 1.0)
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF TIMERB() > 3000
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
//Stop any footage recording.
|
|
IF b_replay_event_started
|
|
REPLAY_STOP_EVENT()
|
|
b_replay_event_started = FALSE
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF s_heli_ropes_new[i].rope != NULL
|
|
DELETE_ROPE(s_heli_ropes_new[i].rope)
|
|
s_heli_ropes_new[i].rope = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REMOVE_VEHICLE(veh_train_hover_helpers[0], TRUE)
|
|
REMOVE_VEHICLE(veh_train_hover_helpers[1], TRUE)
|
|
REMOVE_VEHICLE(veh_train_hover_helpers[2], TRUE)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_GOLD, str_carrec)
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
VEHICLE_INDEX veh_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
|
|
FREEZE_ENTITY_POSITION(obj_gold_containers[0], FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[0], veh_carriage_1, 0, <<0.0, 2.0, 0.55>>, <<0.0, 0.0, 0.0>>, FALSE, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_VEHICLE_FORWARD_SPEED(s_gold_choppers[0].veh, 15.0)
|
|
|
|
IF NOT IS_PED_INJURED(s_lester.ped)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(i_lester_rocket_sync_scene)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(s_lester.ped, NORMAL_BLEND_OUT, TRUE)
|
|
i_lester_rocket_sync_scene = -1
|
|
ENDIF
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(s_lester.ped)
|
|
SET_PED_INTO_VEHICLE(s_lester.ped, s_gold_choppers[0].veh, VS_BACK_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
IF GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[1].veh) < 151000.0
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 151000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(i_gold_container_sound_id)
|
|
STOP_SOUND(i_gold_container_sound_id)
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2B_DROP_GOLD_CUTSCENE")
|
|
STOP_AUDIO_SCENE("BS_2B_DROP_GOLD_CUTSCENE")
|
|
ENDIF
|
|
|
|
STOP_STREAM()
|
|
|
|
//Clean up the other pilot here if the bad driver was picked, they're no longer needed.
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_LAND_AT_AIRFIELD
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i < 4
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[i].rope, obj_gold_containers[0])
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
DETACH_ENTITY(obj_gold_containers[0])
|
|
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC LAND_AT_AIRFIELD()
|
|
INT i = 0
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
IF SETUP_REQ_PLAYER_AS_TREVOR()
|
|
AND SETUP_GOLD_CHOPPERS(<<2720.3782, 3131.4307, 72.1530>>, 334.9478, <<2786.2661, 3303.3547, 85.3582>>, 347.3535)
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(<<2720.3782, 3131.4307, 42.5514>>, 0.0, FALSE)
|
|
|
|
i_current_event = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2720.3782, 3131.4307, 42.5514>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
|
|
IF SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
AND SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
AND SETUP_LESTER_IN_CHOPPER()
|
|
AND SETUP_REQ_GOLD_TRAIN()
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF NOT b_crew_driver_set_to_die
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
SETUP_DRIVER_OUTFIT()
|
|
ENDIF
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 146000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_gold_choppers[1].veh, "BS_GOLD_TARGET_HELI_group")
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_OBJECT(obj_gold_containers[1], TRUE)
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_gold_choppers) i
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[i].veh)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[i].veh, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[i].veh)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[i].veh, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
|
|
SETUP_TREVOR_OUTFIT()
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_gold_train)
|
|
SET_MISSION_TRAIN_COORDS(veh_gold_train, <<2755.4928, 3190.4688, 45.8408>>)
|
|
SET_TRAIN_CRUISE_SPEED(veh_gold_train, 15.0)
|
|
SET_TRAIN_SPEED(veh_gold_train, 15.0)
|
|
|
|
VEHICLE_INDEX veh_carriage_1 = GET_TRAIN_CARRIAGE(veh_gold_train, 1)
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_carriage_1)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[0], veh_carriage_1, 0, <<0.0, 2.0, 0.55>>, <<0.0, 0.0, 0.0>>, FALSE, FALSE, TRUE)
|
|
|
|
IF NOT b_crew_driver_set_to_die
|
|
ATTACH_ENTITY_TO_ENTITY(obj_gold_containers[1], veh_carriage_1, 0, <<0.0, 5.0, 0.55>>, <<0.0, 0.0, 0.0>>, FALSE, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
|
|
i_current_take = i_max_take_considering_crew
|
|
i_displayed_take = i_current_take
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Re-enable wanted level
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2B_DROPPED_RESTART")
|
|
ENDIF
|
|
|
|
sbi_airfield[0] = ADD_SCENARIO_BLOCKING_AREA(<<1670.5116, 4589.3999, 30.0>>, <<1703.1768, 4620.1318, 127.7757>>)
|
|
sbi_airfield[1] = ADD_SCENARIO_BLOCKING_AREA(<<1774.1407, 4628.9160, 30.0>>, <<1817.5054, 4693.5049, 127.7757>>)
|
|
sbi_airfield[2] = ADD_SCENARIO_BLOCKING_AREA(<<1862.7349, 4663.5698, 30.0>>, <<2196.0427, 4909.0830, 127.7757>>)
|
|
SET_SCENARIO_GROUP_ENABLED("Grapeseed_Planes", FALSE)
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_FLY_BACK, "LAND_AT_AIRFIELD", TRUE)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2B_GET_TO_AIRSTRIP")
|
|
START_AUDIO_SCENE("BS_2B_GET_TO_AIRSTRIP")
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
SET_AMBIENT_ZONE_LIST_STATE("AZL_BIG_SCORE_2B_WINDFARM_TURBINES", TRUE, TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
SET_VEHICLE_FORWARD_SPEED(s_gold_choppers[0].veh, 15.0)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_HEIST_CREW_END_SCREEN_STATUSES()
|
|
INCREMENT_ALL_CREW_MEMBER_STATS_DURING_HEIST(HEIST_FINALE, TRUE)
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE) //This section has streaming issues on next-gen, so block the vehicle gens.
|
|
|
|
s_michael.i_event = 0
|
|
s_crew[CREW_DRIVER_ID].i_event = 0
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(s_locates_data)
|
|
#ENDIF
|
|
|
|
//Play Trevor's line for dropping the gold immediately, different variations based on if the driver died.
|
|
IF NOT b_has_text_label_triggered[BS2B_PACK2]
|
|
IF NOT b_crew_driver_set_to_die
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PACK2", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_PACK2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_PACK2B", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
b_has_text_label_triggered[BS2B_PACK2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play "go to airfield" line first.
|
|
IF NOT b_has_text_label_triggered[BS2B_AIR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_AIR", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_AIR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PLAYER_AT_LOCATION_WITH_BUDDIES_IN_VEHICLE(s_locates_data, v_airfield_pos, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, s_lester.ped, NULL, NULL, s_gold_choppers[0].veh,
|
|
"F3B_LANDFIELD", "F3B_LEFTLEST", "", "", "F3B_LEFTLEST", "F3B_GETINHELI", "F3B_GETBACKHELI", FALSE, TRUE)
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
VECTOR v_chopper_pos = GET_ENTITY_COORDS(s_gold_choppers[0].veh)
|
|
|
|
IF DOES_BLIP_EXIST(s_locates_data.LocationBlip)
|
|
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_gold_choppers[0].veh, <<2164.553467,4824.145020,39.388706>>, <<2081.562988,4784.206055,51.811592>>, 24.250000)
|
|
AND NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh)
|
|
AND v_chopper_pos.z < 42.0
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
//Dialogue.
|
|
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), v_airfield_pos) > 2500.0
|
|
IF NOT b_has_text_label_triggered[BS2B_SEEAIR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT b_has_text_label_triggered[BS2B_DIDIT]
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DIDIT", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DIDIT] = TRUE
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_WOO]
|
|
IF b_crew_driver_set_to_die
|
|
b_has_text_label_triggered[BS2B_WOO] = TRUE
|
|
ELSE
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER_ID, s_crew[CREW_DRIVER_ID].ped, s_conversation_peds, str_dialogue_block, "BS2B_WOO")
|
|
b_has_text_label_triggered[BS2B_WOO] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_DRIVE]
|
|
IF b_crew_driver_set_to_die
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DRIVE1", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DRIVE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_DRIVE2", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_DRIVE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT b_has_text_label_triggered[BS2B_TALK]
|
|
//Michael and Franklin don't exist, so add null peds for dialogue.
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
|
|
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 1, NULL, "FRANKLIN")
|
|
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_TALK", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_TALK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT b_has_text_label_triggered[BS2B_SEEAIR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(s_locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(s_conversation_peds, str_dialogue_block, "BS2B_SEEAIR", CONV_PRIORITY_MEDIUM)
|
|
b_has_text_label_triggered[BS2B_SEEAIR] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
IF b_has_text_label_triggered[BS2B_DIDIT]
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR v_player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_gold_choppers[0].veh)) > 10000.0
|
|
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
|
|
ELSE
|
|
IF v_chopper_pos.z - v_player_pos.z > 6.0
|
|
IF NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh)
|
|
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
|
|
OR v_player_pos.z < 1.0
|
|
MISSION_FAILED(FAILED_LEFT_CHOPPER_BEHIND)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/*IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_airfield_pos) < 40000.0
|
|
IF NOT b_crew_driver_set_to_die
|
|
REQUEST_CUTSCENE("bs_2b_ext_alt1a")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_ext_alt1a")
|
|
ELSE
|
|
REQUEST_CUTSCENE("bs_2b_ext_alt2")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_ext_alt2")
|
|
ENDIF
|
|
ELIF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_airfield_pos) > 62500.0
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
SWITCH s_crew[CREW_DRIVER_ID].i_event
|
|
CASE 0
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
//SET_HELI_BLADES_SPEED(s_gold_choppers[1].veh, 0.0)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, FALSE, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_LEAVE_ANY_VEHICLE(NULL)
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<2151.3, 4801.1, 42.6>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_crew[CREW_DRIVER_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
TASK_LOOK_AT_ENTITY(s_crew[CREW_DRIVER_ID].ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(s_gold_choppers[1].veh, TRUE)
|
|
|
|
s_crew[CREW_DRIVER_ID].i_event++
|
|
ELSE
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Delete the train once the player is far away from it.
|
|
IF DOES_ENTITY_EXIST(veh_gold_train)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_gold_train, FALSE)) > 90000.0
|
|
REPEAT COUNT_OF(obj_gold_trolleys) i
|
|
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(obj_gold_containers) i
|
|
REMOVE_OBJECT(obj_gold_containers[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
IF DOES_ENTITY_EXIST(veh_gold_train)
|
|
DELETE_MISSION_TRAIN(veh_gold_train)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//The crew turn up in their car as the player comes in to land.
|
|
SWITCH s_michael.i_event
|
|
CASE 0 //Create the assets.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), v_airfield_pos) < 40000.0
|
|
//If the train wasn't deleted already it should be safe to do it now.
|
|
IF DOES_ENTITY_EXIST(veh_gold_train)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_gold_train, FALSE)) > 2500.0
|
|
IF NOT IS_ENTITY_ON_SCREEN(veh_gold_train)
|
|
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(veh_gold_train, FALSE)) > 40000.0
|
|
REPEAT COUNT_OF(obj_gold_trolleys) i
|
|
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(obj_gold_containers) i
|
|
REMOVE_OBJECT(obj_gold_containers[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
IF DOES_ENTITY_EXIST(veh_gold_train)
|
|
DELETE_MISSION_TRAIN(veh_gold_train)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SETUP_REQ_FRANKLIN(<<2132.6914, 4776.3657, 39.9703>>, 98.5572)
|
|
AND SETUP_REQ_MICHAEL(<<2135.0344, 4778.0078, 39.9703>>, 63.7681)
|
|
AND SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(<<2137.6624, 4778.7617, 39.9702>>, 288.5962)
|
|
AND SETUP_REQ_FINAL_CAR(<<2136.8210, 4775.6343, 39.9703>>, 291.3345)
|
|
IF IS_VEHICLE_DRIVEABLE(veh_final_car)
|
|
//Remove balaclavas and gloves in advance.
|
|
SETUP_FRANKLIN_OUTFIT(FALSE, FALSE)
|
|
SETUP_MICHAEL_OUTFIT(FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_INTO_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], veh_final_car, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_PED_INTO_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, veh_final_car, VS_BACK_LEFT)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(veh_final_car, <<2136.8210, 4775.6343, 19.9703>>)
|
|
FREEZE_ENTITY_POSITION(veh_final_car, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(veh_final_car, TRUE)
|
|
//SET_ENTITY_LOAD_COLLISION_FLAG(veh_final_car, TRUE)
|
|
|
|
s_michael.i_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Place the car into position based on where the player is looking.
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(veh_final_car)
|
|
IF VDIST2(GET_ENTITY_COORDS(s_gold_choppers[0].veh), v_airfield_pos) < 12500.0
|
|
FREEZE_ENTITY_POSITION(veh_final_car, FALSE)
|
|
|
|
IF NOT IS_SPHERE_VISIBLE(<<2089.0110, 4705.9326, 40.1857>>, 5.0)
|
|
CLEAR_AREA(<<2089.0110, 4705.9326, 40.1857>>, 5.0, TRUE)
|
|
SET_ENTITY_HEADING(veh_final_car, 313.1474)
|
|
SET_ENTITY_COORDS(veh_final_car, <<2089.0110, 4705.9326, 40.1857>>)
|
|
ELSE
|
|
CLEAR_AREA(<<2195.9761, 4747.8091, 39.8789>>, 5.0, TRUE)
|
|
SET_ENTITY_HEADING(veh_final_car, 74.5414)
|
|
SET_ENTITY_COORDS(veh_final_car, <<2195.9761, 4747.8091, 39.8789>>)
|
|
ENDIF
|
|
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(veh_final_car, TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(veh_final_car, TRUE)
|
|
|
|
s_michael.i_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Handle tasks
|
|
IF IS_VEHICLE_DRIVEABLE(veh_final_car)
|
|
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND NOT IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
IF IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car)
|
|
AND IS_PED_SITTING_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], veh_final_car)
|
|
AND IS_PED_SITTING_IN_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, veh_final_car)
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK
|
|
TASK_VEHICLE_DRIVE_TO_COORD(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car, <<2125.8513, 4794.7520, 40.1405>>, 40.0, DRIVINGSTYLE_NORMAL,
|
|
GET_ENTITY_MODEL(veh_final_car), DRIVINGMODE_AVOIDCARS, 5.0, 8.0)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car)
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN], veh_final_car)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], veh_final_car)
|
|
IF GET_SCRIPT_TASK_STATUS(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], veh_final_car, DEFAULT, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, veh_final_car)
|
|
IF GET_SCRIPT_TASK_STATUS(s_crew[CREW_MICHAEL_ID].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, veh_final_car, DEFAULT, VS_BACK_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF DOES_ENTITY_EXIST(veh_final_car)
|
|
IF NOT IS_VEHICLE_DRIVEABLE(veh_final_car)
|
|
MISSION_FAILED(FAILED_DESTROYED_END_CAR)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
CLEAR_MISSION_LOCATE_STUFF(s_locates_data)
|
|
|
|
REPEAT COUNT_OF(obj_gold_trolleys) i
|
|
REMOVE_OBJECT(obj_gold_trolleys[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(obj_gold_containers) i
|
|
REMOVE_OBJECT(obj_gold_containers[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
IF DOES_ENTITY_EXIST(veh_gold_train)
|
|
DELETE_MISSION_TRAIN(veh_gold_train)
|
|
ENDIF
|
|
|
|
i_cutscene_request_delay_timer = GET_GAME_TIMER()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_END_CUTSCENE
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(s_gold_choppers[0].veh, v_airfield_pos)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_END_CUTSCENE()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
DISABLE_VEH_CONTROLS_THIS_FRAME()
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
IF b_is_jumping_directly_to_stage
|
|
IF i_current_event != 99
|
|
IF SETUP_REQ_PLAYER_AS_TREVOR()
|
|
AND SETUP_GOLD_CHOPPERS(<<2135.937988,4807.837402,41.783092>>, 119.467896, <<2129.158447,4817.372559,41.710297>>, 119.467896)
|
|
IF b_has_used_checkpoint
|
|
START_REPLAY_SETUP(<<2124.3782, 4801.4307, 41.5514>>, 0.0, FALSE)
|
|
|
|
i_current_event = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2124.3782, 4801.4307, 41.5514>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
i_current_event = 99
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
FREEZE_ENTITY_POSITION(s_gold_choppers[0].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_CREW_DRIVER_IN_CHOPPER()
|
|
AND SETUP_LESTER_IN_CHOPPER()
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
|
|
IF NOT IS_PED_INJURED(s_lester.ped)
|
|
SET_PED_INTO_VEHICLE(s_lester.ped, s_gold_choppers[0].veh, VS_BACK_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETUP_TREVOR_OUTFIT()
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
IF NOT b_crew_driver_set_to_die
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_PED_INTO_VEHICLE(s_crew[CREW_DRIVER_ID].ped, s_gold_choppers[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
i_current_take = i_max_take_considering_crew
|
|
i_displayed_take = i_current_take
|
|
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
ENDIF
|
|
|
|
//2002346 - Once the player is locked into the cutscene request sequence then make the crew ped invincible so the mission doesn't fail.
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
SET_ENTITY_INVINCIBLE(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF SETUP_REQ_FRANKLIN(<<2146.3652, 4770.1538, 40.4926>>, 17.2965)
|
|
AND SETUP_REQ_MICHAEL(<<2148.3652, 4770.1538, 40.4926>>, 17.2965)
|
|
AND SETUP_REQ_CREW_MEMBER_DEFENDING_MICHAEL(<<2146.3652, 4772.1538, 40.4926>>, 17.2965)
|
|
AND SETUP_REQ_FINAL_CAR(<<2141.2652, 4762.1538, 41.4926>>, 101.2965)
|
|
SETUP_MICHAEL_OUTFIT(FALSE)
|
|
SETUP_FRANKLIN_OUTFIT(FALSE, FALSE)
|
|
SETUP_GUNMAN_OUTFIT(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
SETUP_DRIVER_OUTFIT()
|
|
|
|
//1902301 - Delay the cutscene request to prevent streaming issues.
|
|
IF GET_GAME_TIMER() - i_cutscene_request_delay_timer > 2000
|
|
IF NOT b_crew_driver_set_to_die
|
|
REQUEST_CUTSCENE("bs_2b_ext_alt1a")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_ext_alt1a")
|
|
ELSE
|
|
REQUEST_CUTSCENE("bs_2b_ext_alt2")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2b_ext_alt2")
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_LOADED()
|
|
IF NOT IS_PED_INJURED(s_lester.ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(s_lester.ped, "Lester", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(s_gold_choppers[0].veh, "Main_heli", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(s_gold_choppers[1].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(s_gold_choppers[1].veh, "Background_heli", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ELSE
|
|
//REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Background_heli", CU_DONT_ANIMATE_ENTITY, model_gold_chopper)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
REGISTER_ENTITY_FOR_CUTSCENE(GET_PED_INDEX(CHAR_MICHAEL), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
REGISTER_ENTITY_FOR_CUTSCENE(GET_PED_INDEX(CHAR_FRANKLIN), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
REGISTER_ENTITY_FOR_CUTSCENE(GET_PED_INDEX(CHAR_TREVOR), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_final_car)
|
|
SET_VEHICLE_ENGINE_HEALTH(veh_final_car, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(veh_final_car, 1000.0)
|
|
SET_VEHICLE_RADIO_ENABLED(veh_final_car, FALSE)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(veh_final_car, "BS_2B_Tailgater", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_NONE, FALSE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2B_MISSION_END")
|
|
|
|
b_mission_passed_screen_displayed = FALSE
|
|
b_players_car_exit_state_hit = FALSE
|
|
b_turned_on_heli_engine = FALSE
|
|
i_current_event = 0
|
|
b_skipped_mocap = FALSE
|
|
bHasFirstPersonFlashTriggered = FALSE
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//If all the assets haven't loaded yet then delay when the cutscene is requested to prevent a stack of asset requests.
|
|
i_cutscene_request_delay_timer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
SET_VEHICLE_ENGINE_HEALTH(s_gold_choppers[0].veh, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(s_gold_choppers[0].veh, 1000.0)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, FALSE, FALSE)
|
|
SET_VEHICLE_RADIO_ENABLED(s_gold_choppers[0].veh, FALSE)
|
|
SET_VEHICLE_FIXED(s_gold_choppers[0].veh)
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh)
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, FALSE, FALSE)
|
|
SET_VEHICLE_RADIO_ENABLED(s_gold_choppers[1].veh, FALSE)
|
|
ENDIF
|
|
|
|
//Remove the headsets for this scene.
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_DRIVER_ID].ped)
|
|
CLEAR_PED_PROP(s_crew[CREW_DRIVER_ID].ped, ANCHOR_EARS)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
CLEAR_PED_PROP(s_crew[CREW_MICHAEL_ID].ped, ANCHOR_EARS)
|
|
ENDIF
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_HAND, HAND_P1_NONE, FALSE)
|
|
|
|
CLEAR_AREA_OF_PEDS(<<2124.3782, 4801.4307, 41.5514>>, 200.0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
REMOVE_PED(s_crew[CREW_DRIVER_ID].ped, TRUE)
|
|
|
|
//Michael's crew member is going to be used as an invisible pilot so we can turn the engine on during the cutscene.
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_ENTITY_COORDS(s_crew[CREW_MICHAEL_ID].ped, <<2124.0, 4788.2, 40.7>>)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
SET_ENTITY_VISIBLE(s_crew[CREW_MICHAEL_ID].ped, FALSE)
|
|
STOP_PED_SPEAKING(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
SET_ENTITY_INVINCIBLE(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
i_current_event++
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
AND NOT b_skipped_mocap
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
e_section_stage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
IF NOT b_turned_on_heli_engine
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF (NOT b_crew_driver_set_to_die AND GET_CUTSCENE_TIME() > 48000)
|
|
OR (b_crew_driver_set_to_die AND GET_CUTSCENE_TIME() > 54500)
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
IF NOT IS_PED_INJURED(s_crew[CREW_MICHAEL_ID].ped)
|
|
SET_PED_INTO_VEHICLE(s_crew[CREW_MICHAEL_ID].ped, s_gold_choppers[0].veh, VS_DRIVER)
|
|
SET_PED_KEEP_TASK(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
b_turned_on_heli_engine = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_final_car)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("BS_2B_Tailgater")
|
|
SET_VEHICLE_DOORS_SHUT(veh_final_car, TRUE)
|
|
|
|
SET_ENTITY_HEADING(veh_final_car, 117.0281)
|
|
SET_ENTITY_COORDS(veh_final_car, <<2114.8843, 4800.6284, 40.1790>>)
|
|
SET_VEH_RADIO_STATION(veh_final_car, "OFF")
|
|
SET_VEHICLE_RADIO_ENABLED(veh_final_car, FALSE)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CAR_LEAVE, str_carrec)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_final_car, CARREC_CAR_LEAVE, str_carrec, FALSE)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_final_car, 1000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_final_car, FALSE)
|
|
SET_PLAYBACK_SPEED(veh_final_car, 1.0)
|
|
ENDIF
|
|
|
|
b_players_car_exit_state_hit = TRUE
|
|
ELIF NOT b_players_car_exit_state_hit
|
|
//SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(veh_final_car)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
IF NOT IS_ENTITY_DEAD(veh_final_car)
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), veh_final_car)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
|
|
//TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(PLAYER_PED_ID(), veh_final_car, <<1925.3854, 4707.9507, 40.1959>>, 20.0, DRIVINGMODE_PLOUGHTHROUGH | DF_UseSwitchedOffNodes, 5.0)
|
|
//SET_VEHICLE_FORWARD_SPEED(veh_final_car, 20.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(GET_PED_INDEX(CHAR_FRANKLIN), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Main_heli")
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_LEAVE, str_carrec)
|
|
SET_VEHICLE_DOORS_SHUT(s_gold_choppers[0].veh)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, FALSE)
|
|
//SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
|
|
//SET_ENTITY_VELOCITY(s_gold_choppers[0].veh, <<0.0, 0.0, 10.0>>)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HELI_LEAVE, str_carrec, FALSE)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh, FALSE)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.9)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), s_gold_choppers[0].veh, VS_DRIVER)
|
|
//TASK_HELI_MISSION(GET_PED_INDEX(CHAR_TREVOR), s_gold_choppers[0].veh, NULL, NULL, <<386.2, 1471.8, 368.3>>, MISSION_GOTO, 50.0, 10.0, -20.0, 10, 8)
|
|
SET_PED_KEEP_TASK(GET_PED_INDEX(CHAR_TREVOR), TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(GET_PED_INDEX(CHAR_TREVOR), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
//The crew members are deleted during the cutscene, so use Michael as the pilot for the second chopper.
|
|
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_MICHAEL), s_gold_choppers[1].veh, VS_DRIVER)
|
|
ELSE
|
|
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_MICHAEL), s_gold_choppers[0].veh, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
SET_PED_KEEP_TASK(GET_PED_INDEX(CHAR_MICHAEL), TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(GET_PED_INDEX(CHAR_MICHAEL), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(s_lester.ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lester")
|
|
SET_PED_INTO_VEHICLE(s_lester.ped, s_gold_choppers[0].veh, VS_BACK_LEFT)
|
|
SET_PED_KEEP_TASK(s_lester.ped, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_lester.ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[1].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Background_heli")
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_LEAVE_2, str_carrec)
|
|
SET_VEHICLE_DOORS_SHUT(s_gold_choppers[1].veh)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[1].veh, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[1].veh)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, CARREC_HELI_LEAVE_2, str_carrec, FALSE)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[1].veh, 1000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[1].veh, FALSE)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[1].veh, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
OR b_skipped_mocap
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<2155.057373,4837.334961,43.127262>>,<<5.583202,0.000000,140.558350>>,47.291622, TRUE)
|
|
SET_CAM_PARAMS(cam_main, <<2157.028809,4838.927734,52.013939>>,<<7.445146,-0.000000,134.473083>>,47.291622, 8000, GRAPH_TYPE_ACCEL, GRAPH_TYPE_ACCEL)
|
|
SHAKE_CAM(cam_main, "HAND_SHAKE", 0.05)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event = 50
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
//i_current_event = 50
|
|
//e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50
|
|
IF TIMERB() > 5000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
AND NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(3000)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
AND NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 51 //Once the screen has faded out trigger the mission passed screen.
|
|
IF TIMERB() > 3000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
INT i
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF s_heli_ropes_new[i].rope != NULL
|
|
DELETE_ROPE(s_heli_ropes_new[i].rope)
|
|
s_heli_ropes_new[i].rope = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) != GET_ENTITY_MODEL(PLAYER_PED_ID())
|
|
MAKE_SELECTOR_PED_SELECTION(s_selector_peds, SELECTOR_PED_FRANKLIN)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(s_selector_peds, TRUE)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ENDIF
|
|
|
|
REMOVE_PED(s_lester.ped, TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
|
|
REMOVE_VEHICLE(s_gold_choppers[0].veh, TRUE) //Remove the chopper after the cutscene has ended, this fixes B*730413.
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
SET_END_SCREEN_TAKE()
|
|
TRIGGER_MISSION_STATS_UI(TRUE, TRUE)
|
|
|
|
IF NOT IS_REPEAT_PLAY_ACTIVE()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
CLEAR_AREA(<<1339.5610, 642.0800, 79.4907>>, 100.0, TRUE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_final_car)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), veh_final_car)
|
|
SET_VEHICLE_DOORS_SHUT(veh_final_car)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_final_car)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(veh_final_car)
|
|
ENDIF
|
|
|
|
SET_ENTITY_HEADING(veh_final_car, 133.7396)
|
|
SET_ENTITY_COORDS(veh_final_car, <<1339.5610, 642.0800, 79.4907>>)
|
|
|
|
FREEZE_ENTITY_POSITION(veh_final_car, TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
//NEW_LOAD_SCENE_START_SPHERE(<<1339.5610, 642.0800, 79.4907>>, 300.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
NEW_LOAD_SCENE_START(<<1324.267700,628.066162,85.775108>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-2.527736, 0.0, 133.285507>>), 300.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 52 //Wait for the screen to display, then continue
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF g_bResultScreenDisplaying
|
|
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1
|
|
b_mission_passed_screen_displayed = TRUE
|
|
i_current_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 53 //Progress once the screen is gone.
|
|
IF NOT g_bResultScreenDisplaying
|
|
IF IS_REPEAT_PLAY_ACTIVE()
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
IF (IS_NEW_LOAD_SCENE_ACTIVE() AND IS_NEW_LOAD_SCENE_LOADED())
|
|
OR TIMERB() > 15000
|
|
CLEAR_AREA(<<1339.5610, 642.0800, 79.4907>>, 50.0, TRUE)
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_final_car)
|
|
SET_VEHICLE_FIXED(veh_final_car)
|
|
FREEZE_ENTITY_POSITION(veh_final_car, FALSE)
|
|
|
|
SET_ENTITY_HEADING(veh_final_car, 133.7396)
|
|
SET_ENTITY_COORDS(veh_final_car, <<1339.5610, 642.0800, 79.4907>>)
|
|
|
|
SET_VEHICLE_ENGINE_ON(veh_final_car, TRUE, TRUE)
|
|
SET_VEHICLE_RADIO_ENABLED(veh_final_car, TRUE)
|
|
SET_VEH_RADIO_STATION(veh_final_car, "RADIO_03_HIPHOP_NEW")
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
cam_main = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1324.220093,628.036438,87.027969>>,<<-2.527736,0.512502,133.285507>>,50.000000, TRUE)
|
|
SET_CAM_PARAMS(cam_main, <<1324.267700,628.066162,85.775108>>,<<-2.527736,0.512502,133.285507>>,50.000000, 4000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
SHAKE_CAM(cam_main, "HAND_SHAKE", 0.05)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
SETTIMERB(0)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
DISABLE_VEH_CONTROLS_THIS_FRAME()
|
|
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh_final_car)
|
|
SET_VEHICLE_FORWARD_SPEED(veh_final_car, 15.0)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
DISABLE_VEH_CONTROLS_THIS_FRAME()
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 54 //Finish final shot.
|
|
IF NOT IS_ENTITY_DEAD(veh_final_car)
|
|
SET_VEHICLE_FORWARD_SPEED(veh_final_car, 15.0)
|
|
ENDIF
|
|
|
|
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
//Do different transitions back to gameplay depending on cam view, as the default transition looks bad for first-person.
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
|
|
OR GET_FOLLOW_VEHICLE_CAM_ZOOM_LEVEL() = VEHICLE_ZOOM_LEVEL_BONNET
|
|
IF NOT bHasFirstPersonFlashTriggered
|
|
AND NOT IS_SCREEN_FADED_OUT()
|
|
IF TIMERB() > 2700
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Triggering flash: TIMERB = ", TIMERB())
|
|
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bHasFirstPersonFlashTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERB() > 3000
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ELSE
|
|
IF TIMERB() > 2000
|
|
//DESTROY_ALL_CAMS()
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, 2000, FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 55 //Wait for interp to finish.
|
|
IF NOT IS_ENTITY_DEAD(veh_final_car)
|
|
SET_VEHICLE_FORWARD_SPEED(veh_final_car, 15.0)
|
|
ENDIF
|
|
|
|
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF TIMERB() > 2000
|
|
OR (bHasFirstPersonFlashTriggered AND TIMERB() > 500)
|
|
DESTROY_ALL_CAMS()
|
|
|
|
e_section_stage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
IF b_skipped_mocap
|
|
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF s_heli_ropes_new[i].rope != NULL
|
|
DELETE_ROPE(s_heli_ropes_new[i].rope)
|
|
s_heli_ropes_new[i].rope = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REMOVE_PED(s_crew[CREW_MICHAEL_ID].ped, TRUE)
|
|
REMOVE_PED(s_lester.ped, TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_PED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
|
|
REMOVE_VEHICLE(s_gold_choppers[0].veh, TRUE) //Remove the chopper after the cutscene has ended, this fixes B*730413.
|
|
REMOVE_VEHICLE(s_gold_choppers[1].veh, TRUE)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_HELI_LEAVE_2, str_carrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CAR_LEAVE, str_carrec)
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
MISSION_PASSED(TRUE)
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_CUTSCENE()
|
|
|
|
SET_FOCUS_ENTITY(PLAYER_PED_ID())
|
|
|
|
b_skipped_mocap = TRUE
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PROC UPDATE_WIDGETS()
|
|
IF b_debug_record_heli_chase_setpieces
|
|
b_is_jumping_directly_to_stage = TRUE
|
|
MISSION_CLEANUP()
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_DEBUG_RECORD_HELI_CHASE_SETPIECES
|
|
b_debug_record_heli_chase_setpieces = FALSE
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
|
|
IF b_debug_record_camera
|
|
b_is_jumping_directly_to_stage = TRUE
|
|
MISSION_CLEANUP()
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_DEBUG_RECORD_CAMERA
|
|
b_debug_record_camera = FALSE
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
|
|
IF b_debug_playback_camera
|
|
b_is_jumping_directly_to_stage = TRUE
|
|
MISSION_CLEANUP()
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_DEBUG_PLAYBACK_CAMERA
|
|
b_debug_playback_camera = FALSE
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
|
|
IF b_debug_record_train_heli_hover
|
|
b_is_jumping_directly_to_stage = TRUE
|
|
MISSION_CLEANUP()
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_DEBUG_RECORD_HELI_TRAIN_HOVER
|
|
b_debug_record_train_heli_hover = FALSE
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
|
|
IF b_debug_record_gold_drop
|
|
b_is_jumping_directly_to_stage = TRUE
|
|
MISSION_CLEANUP()
|
|
|
|
e_section_stage = SECTION_STAGE_SETUP
|
|
e_mission_stage = STAGE_DEBUG_RECORD_GOLD_DROP
|
|
b_debug_record_gold_drop = FALSE
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
ENDIF
|
|
|
|
IF b_debug_force_activate
|
|
VEHICLE_INDEX veh
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF IS_BUTTON_PRESSED(PAD1, SQUARE)
|
|
APPLY_FORCE_TYPE e_force_type
|
|
|
|
IF i_debug_force_type = 0
|
|
e_force_type = APPLY_TYPE_FORCE
|
|
ELIF i_debug_force_type = 1
|
|
e_force_type = APPLY_TYPE_IMPULSE
|
|
ELIF i_debug_force_type = 2
|
|
e_force_type = APPLY_TYPE_EXTERNAL_FORCE
|
|
ELIF i_debug_force_type = 3
|
|
e_force_type = APPLY_TYPE_EXTERNAL_IMPULSE
|
|
ELIF i_debug_force_type = 4
|
|
e_force_type = APPLY_TYPE_TORQUE
|
|
ELIF i_debug_force_type = 5
|
|
e_force_type = APPLY_TYPE_ANGULAR_IMPULSE
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(veh, e_force_type, v_debug_force_dir, v_debug_force_offset, i_debug_force_component,
|
|
b_debug_force_local_force, b_debug_force_local_offset, b_debug_force_scale_by_mass)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_DEBUG()
|
|
UPDATE_WIDGETS()
|
|
|
|
//Reset any skipping from the previous frame
|
|
IF e_section_stage = SECTION_STAGE_SKIP
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
AND NOT b_mission_passed_screen_displayed
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
|
|
MISSION_PASSED()
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
|
|
MISSION_FAILED(FAILED_GENERIC)
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
e_section_stage = SECTION_STAGE_SKIP
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
|
//Work out which stage we want to reach based on the current stage
|
|
INT i_current_stage = ENUM_TO_INT(e_mission_stage)
|
|
|
|
IF i_current_stage > 0
|
|
MISSION_STAGE e_stage = INT_TO_ENUM(MISSION_STAGE, i_current_stage - 1)
|
|
JUMP_TO_STAGE(e_stage, TRUE)
|
|
ELSE
|
|
JUMP_TO_STAGE(STAGE_START_CUTSCENE, TRUE)
|
|
ENDIF
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1)
|
|
OUTPUT_DEBUG_CAM_RELATIVE_TO_ENTITY(GET_FOCUS_ENTITY_INDEX())
|
|
ENDIF
|
|
|
|
IF LAUNCH_MISSION_STAGE_MENU(s_skip_menu, i_debug_jump_stage)
|
|
MISSION_STAGE e_stage = INT_TO_ENUM(MISSION_STAGE, i_debug_jump_stage)
|
|
JUMP_TO_STAGE(e_stage, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RECORD_HELI_CHASE_SETPIECES()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(model_gold_chopper)
|
|
|
|
IF HAS_MODEL_LOADED(model_gold_chopper)
|
|
s_gold_choppers[0].veh = CREATE_VEHICLE(model_gold_chopper, <<-336.4547, -750.0684, 54.2059>>, 0.0)
|
|
SET_ENTITY_COLLISION(s_gold_choppers[0].veh, FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
IF IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF i_current_event = 0
|
|
INITIALISE_UBER_PLAYBACK(str_carrec, CARREC_HELI_CHASE_TRIGGER)
|
|
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
|
|
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
|
|
LOAD_HELI_CHASE_UBER_DATA()
|
|
|
|
i_current_event++
|
|
ELIF i_current_event = 1
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HELI_CHASE_TRIGGER, str_carrec)
|
|
IF SET_CAR_AT_PLAYBACK_POSITION(s_gold_choppers[0].veh, CARREC_HELI_CHASE_TRIGGER, 0.0, TRUE, FALSE)
|
|
SET_ENTITY_COLLISION(s_gold_choppers[0].veh, FALSE)
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF i_current_event = 2
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(s_gold_choppers[0].veh)
|
|
f_chase_playback_time = GET_TIME_POSITION_IN_RECORDING(s_gold_choppers[0].veh)
|
|
f_chase_playback_speed = 1.0
|
|
SET_ENTITY_COLLISION(s_gold_choppers[0].veh, FALSE)
|
|
SET_ENTITY_INVINCIBLE(s_gold_choppers[0].veh, TRUE)
|
|
|
|
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
|
|
CREATE_ALL_WAITING_UBER_CARS()
|
|
UPDATE_UBER_PLAYBACK(s_gold_choppers[0].veh, 1.0)
|
|
|
|
//Draw spheres in front of the trigger: this is useful for recording cars that need to be in front.
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
VECTOR v_pos_1 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_HELI_CHASE_TRIGGER, f_chase_playback_time + 500.0, str_carrec)
|
|
VECTOR v_pos_2 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_HELI_CHASE_TRIGGER, f_chase_playback_time + 1500.0, str_carrec)
|
|
VECTOR v_pos_3 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_HELI_CHASE_TRIGGER, f_chase_playback_time + 5000.0, str_carrec)
|
|
|
|
DRAW_DEBUG_SPHERE(v_pos_1, 1.0, 0, 255, 0, 128)
|
|
DRAW_DEBUG_SPHERE(v_pos_2, 1.0, 0, 255, 0, 128)
|
|
DRAW_DEBUG_SPHERE(v_pos_3, 1.0, 0, 255, 0, 128)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(SetPieceCarID) i
|
|
IF NOT IS_ENTITY_DEAD(SetPieceCarID[i])
|
|
SET_ENTITY_COLLISION(SetPieceCarID[i], FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
i_current_event = 1
|
|
|
|
CLEANUP_UBER_PLAYBACK(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RECORD_TRAIN_HELI_HOVER()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(FREIGHTCAR)
|
|
REQUEST_MODEL(FROGGER)
|
|
|
|
IF HAS_MODEL_LOADED(FREIGHTCAR)
|
|
AND HAS_MODEL_LOADED(FROGGER)
|
|
veh_debug = CREATE_VEHICLE(FREIGHTCAR, <<2552.4368, 2927.5645, 45.4778>>, 324.5322)
|
|
|
|
s_gold_choppers[0].veh = CREATE_VEHICLE(FROGGER, <<2552.4368, 2927.5645, 65.4778>>, 324.5322)
|
|
SET_VEHICLE_ENGINE_ON(s_gold_choppers[0].veh, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(s_gold_choppers[0].veh)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(FREIGHTCAR)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(FROGGER)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
IF NOT IS_ENTITY_DEAD(veh_debug)
|
|
AND IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh)
|
|
IF i_current_event = 0
|
|
SET_ENTITY_COORDS(s_gold_choppers[0].veh, <<2552.4368, 2927.5645, 65.4778>>)
|
|
SET_ENTITY_HEADING(s_gold_choppers[0].veh, 324.5322)
|
|
|
|
i_current_event++
|
|
ELIF i_current_event = 1
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
START_RECORDING_VEHICLE(veh_debug, CARREC_HOVER_TRAIN, str_carrec, TRUE)
|
|
START_RECORDING_VEHICLE(s_gold_choppers[0].veh, CARREC_HOVER_TRAIN_HELI, str_carrec, TRUE)
|
|
|
|
i_current_event++
|
|
ENDIF
|
|
ELIF i_current_event = 2
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
STOP_RECORDING_VEHICLE(veh_debug)
|
|
STOP_RECORDING_VEHICLE(s_gold_choppers[0].veh)
|
|
|
|
i_current_event = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RECORD_GOLD_DROP()
|
|
INT i = 0
|
|
|
|
IF e_section_stage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(model_gold_chopper)
|
|
REQUEST_MODEL(model_train_carriage)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
|
|
IF HAS_MODEL_LOADED(model_gold_chopper)
|
|
AND HAS_MODEL_LOADED(model_train_carriage)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
//Create two helper vehicles that'll play a recording of a helicopter hovering above a train.
|
|
veh_train_hover_helpers[0] = CREATE_VEHICLE(model_train_carriage, <<2552.4368, 2927.5645, 45.4778>>, 324.5322)
|
|
START_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[0], CARREC_HOVER_TRAIN, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh_train_hover_helpers[0], 8000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(veh_train_hover_helpers[0])
|
|
SET_PLAYBACK_SPEED(veh_train_hover_helpers[0], 0.0)
|
|
SET_ENTITY_COLLISION(veh_train_hover_helpers[0], FALSE)
|
|
|
|
veh_train_hover_helpers[1] = CREATE_VEHICLE(model_train_carriage, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<-2.8, 0.0, 0.0>>),
|
|
GET_ENTITY_HEADING(veh_train_hover_helpers[0]))
|
|
SET_ENTITY_COORDS_NO_OFFSET(veh_train_hover_helpers[1], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<-2.8, 0.0, 0.0>>))
|
|
FREEZE_ENTITY_POSITION(veh_train_hover_helpers[1], TRUE)
|
|
|
|
veh_train_hover_helpers[2] = CREATE_VEHICLE(model_train_carriage, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<2.8, 0.0, 0.0>>),
|
|
GET_ENTITY_HEADING(veh_train_hover_helpers[0]))
|
|
SET_ENTITY_COORDS_NO_OFFSET(veh_train_hover_helpers[2], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<2.8, 0.0, 0.0>>))
|
|
FREEZE_ENTITY_POSITION(veh_train_hover_helpers[2], TRUE)
|
|
|
|
veh_train_hover_helpers[3] = CREATE_VEHICLE(model_train_carriage, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<0.0, 0.0, -1.0>>),
|
|
GET_ENTITY_HEADING(veh_train_hover_helpers[0]))
|
|
SET_ENTITY_COORDS_NO_OFFSET(veh_train_hover_helpers[3], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh_train_hover_helpers[0], <<0.0, 0.0, -1.0>>))
|
|
FREEZE_ENTITY_POSITION(veh_train_hover_helpers[3], TRUE)
|
|
|
|
|
|
s_gold_choppers[0].veh = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 55.4778>>, 324.5322)
|
|
START_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(s_gold_choppers[0].veh, 8000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(s_gold_choppers[0].veh)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 0.0)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_gold_choppers[0].veh)
|
|
|
|
veh_debug = CREATE_VEHICLE(model_gold_chopper, <<2552.4368, 2927.5645, 55.4778>>, 324.5322)
|
|
FREEZE_ENTITY_POSITION(veh_debug, TRUE)
|
|
SET_ENTITY_COLLISION(veh_debug, FALSE)
|
|
SET_ENTITY_INVINCIBLE(veh_debug, TRUE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_gold_chopper)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_train_carriage)
|
|
|
|
WHILE NOT SETUP_REQ_GOLD_CONTAINERS_WITH_TROLLEYS_INSIDE()
|
|
OR NOT SETUP_REQ_TROLLEY_ATTACHED_TO_WOUND_HELI_ROPES(0, FALSE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
i_current_event = 0
|
|
e_section_stage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
IF NOT IS_ENTITY_DEAD(veh_train_hover_helpers[0])
|
|
AND NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
AND NOT IS_ENTITY_DEAD(veh_debug)
|
|
VECTOR v_dir
|
|
v_dir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(GET_ENTITY_ROTATION(veh_train_hover_helpers[0]))
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(veh_debug, GET_ENTITY_COORDS(obj_gold_containers[0]))
|
|
SET_ENTITY_ROTATION(veh_debug, GET_ENTITY_ROTATION(obj_gold_containers[0]))
|
|
|
|
SWITCH i_current_event
|
|
CASE 0
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN, str_carrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN, str_carrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_HOVER_TRAIN_HELI, str_carrec)
|
|
AND IS_BUTTON_PRESSED(PAD1, SQUARE)
|
|
SET_PLAYBACK_SPEED(veh_train_hover_helpers[0], 1.0)
|
|
SET_PLAYBACK_SPEED(s_gold_choppers[0].veh, 1.0)
|
|
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(veh_train_hover_helpers[0], FALSE)
|
|
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(veh_train_hover_helpers[0], TRUE)
|
|
|
|
APPLY_FORCE_TO_ENTITY(obj_gold_containers[0], APPLY_TYPE_IMPULSE, <<v_dir.x * 5.0, v_dir.y * 5.0, 1.0>>, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
|
|
START_RECORDING_VEHICLE(veh_debug, CARREC_HOVER_TRAIN_GOLD, str_carrec, TRUE)
|
|
|
|
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING", DEFAULT_GOD_TEXT_TIME, 1)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF TIMERB() > 500
|
|
REPEAT COUNT_OF(s_heli_ropes_new) i
|
|
IF i < 4
|
|
IF DOES_ROPE_EXIST(s_heli_ropes_new[i].rope)
|
|
DETACH_ROPE_FROM_ENTITY(s_heli_ropes_new[i].rope, s_gold_choppers[0].veh)
|
|
s_heli_ropes_new[i].b_is_attached = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
DETACH_ENTITY(obj_gold_containers[0], TRUE, FALSE)
|
|
STABILISE_ENTITY_ATTACHED_TO_HELI(s_gold_choppers[0].veh, NULL, 0.0)
|
|
|
|
SETTIMERB(0)
|
|
i_current_event++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
//Apply a force to keep the container moving towards the train.
|
|
IF TIMERB() < 1500
|
|
//APPLY_FORCE_TO_ENTITY(obj_gold_containers[0], APPLY_TYPE_FORCE, <<v_dir.x * 10.0, v_dir.y * 10.0, 0.0>> , <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
//Stop recording.
|
|
IF IS_BUTTON_PRESSED(PAD1, SQUARE)
|
|
STOP_RECORDING_VEHICLE(veh_debug)
|
|
|
|
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING STOPPED", DEFAULT_GOD_TEXT_TIME, 1)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
SCRIPT
|
|
SET_MISSION_FLAG(TRUE)
|
|
IF HAS_FORCE_CLEANUP_OCCURRED()
|
|
Mission_Flow_Mission_Force_Cleanup()
|
|
b_is_jumping_directly_to_stage = FALSE
|
|
SET_CLEANUP_TO_RUN_ON_RESPAWN(RCI_BIGSCORE2B)
|
|
MISSION_CLEANUP()
|
|
ENDIF
|
|
|
|
MISSION_SETUP()
|
|
|
|
//SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(scsSwitchCamMichaelToFranklin, INT_TO_NATIVE(VEHICLE_INDEX, 0), INT_TO_NATIVE(VEHICLE_INDEX, 0))
|
|
//CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichaelToFranklin, "Michael", "Franklin", widget_debug)
|
|
|
|
IF Is_Replay_In_Progress()
|
|
INT i_stage = Get_Replay_Mid_Mission_Stage()
|
|
|
|
IF g_bShitskipAccepted
|
|
i_stage++
|
|
ENDIF
|
|
|
|
IF i_stage = 0
|
|
JUMP_TO_STAGE(STAGE_GO_TO_BANK)
|
|
ELIF i_stage = CHECKPOINT_DRILL
|
|
JUMP_TO_STAGE(STAGE_DRILL_THROUGH_WALL)
|
|
ELIF i_stage = CHECKPOINT_TUNNEL_SHOOTOUT
|
|
JUMP_TO_STAGE(STAGE_TUNNEL_SHOOTOUT)
|
|
ELIF i_stage = CHECKPOINT_CITY_SHOOTOUT
|
|
JUMP_TO_STAGE(STAGE_CITY_SHOOTOUT)
|
|
ELIF i_stage = CHECKPOINT_CITY_SHOOTOUT_MID
|
|
JUMP_TO_STAGE(STAGE_CITY_SHOOTOUT_MID_POINT)
|
|
ELIF i_stage = CHECKPOINT_LOSE_COPS
|
|
JUMP_TO_STAGE(STAGE_LOSE_COPS)
|
|
ELIF i_stage = CHECKPOINT_HELI_CHASE
|
|
JUMP_TO_STAGE(STAGE_CHOPPER_CHASE)
|
|
ELIF i_stage = CHECKPOINT_DROPOFF_GOLD
|
|
JUMP_TO_STAGE(STAGE_DROP_GOLD_ON_TRAIN)
|
|
ELIF i_stage = CHECKPOINT_FLY_BACK
|
|
JUMP_TO_STAGE(STAGE_LAND_AT_AIRFIELD)
|
|
ELIF i_stage > CHECKPOINT_FLY_BACK
|
|
JUMP_TO_STAGE(STAGE_END_CUTSCENE)
|
|
ENDIF
|
|
|
|
b_has_used_checkpoint = TRUE
|
|
ELSE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "GO_TO_BANK")
|
|
ENDIF
|
|
|
|
WHILE (TRUE)
|
|
WAIT(0)
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BigScoreObvious")
|
|
|
|
INT i = 0
|
|
INT i_num_crew_dead = 0
|
|
|
|
//UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichaelToFranklin)
|
|
|
|
//Global fail conditions
|
|
IF e_section_stage = SECTION_STAGE_RUNNING
|
|
AND NOT b_mission_failed
|
|
AND NOT b_mission_passed_screen_displayed
|
|
IF b_has_used_checkpoint
|
|
b_has_used_checkpoint = FALSE
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_MICHAEL])
|
|
MISSION_FAILED(FAILED_MICHAEL_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
AND IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_TREVOR])
|
|
MISSION_FAILED(FAILED_TREVOR_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND IS_PED_INJURED(s_selector_peds.pedID[SELECTOR_PED_FRANKLIN])
|
|
MISSION_FAILED(FAILED_FRANKLIN_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_lester.ped)
|
|
AND IS_PED_INJURED(s_lester.ped)
|
|
MISSION_FAILED(FAILED_LESTER_DIED)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(s_crew) i
|
|
IF DOES_ENTITY_EXIST(s_crew[i].ped)
|
|
AND IS_PED_INJURED(s_crew[i].ped)
|
|
IF NOT (e_mission_stage > STAGE_CITY_SHOOTOUT AND i = CREW_MICHAEL_ID AND NOT b_picked_good_michael_gunman)
|
|
AND NOT (e_mission_stage >= STAGE_CHOPPER_CHASE AND i = CREW_DRIVER_ID AND b_crew_driver_set_to_die)
|
|
AND e_mission_stage < STAGE_END_CUTSCENE
|
|
i_num_crew_dead++
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF i_num_crew_dead > 0
|
|
IF i_num_crew_dead > 1
|
|
MISSION_FAILED(FAILED_CREW_MEMBERS_DIED)
|
|
ELSE
|
|
MISSION_FAILED(FAILED_CREW_MEMBER_DIED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(veh_franklins_car)
|
|
AND NOT IS_VEHICLE_DRIVEABLE(veh_franklins_car)
|
|
MISSION_FAILED(FAILED_DESTROYED_FRANKLINS_CAR)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(veh_trevors_car)
|
|
AND NOT IS_VEHICLE_DRIVEABLE(veh_trevors_car)
|
|
MISSION_FAILED(FAILED_DESTROYED_TREVORS_CAR)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_gold_choppers[0].veh)
|
|
IF e_mission_stage < STAGE_END_CUTSCENE
|
|
IF NOT IS_ENTITY_DEAD(s_gold_choppers[0].veh)
|
|
IF IS_ENTITY_ON_FIRE(s_gold_choppers[0].veh)
|
|
OR (NOT IS_VEHICLE_DRIVEABLE(s_gold_choppers[0].veh) AND NOT IS_ENTITY_IN_AIR(s_gold_choppers[0].veh) AND GET_ENTITY_SPEED(s_gold_choppers[0].veh) < 1.0)
|
|
MISSION_FAILED(FAILED_DESTROYED_CHOPPER)
|
|
ENDIF
|
|
ELSE
|
|
MISSION_FAILED(FAILED_DESTROYED_CHOPPER)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_gold_choppers[1].veh)
|
|
AND NOT IS_VEHICLE_DRIVEABLE(s_gold_choppers[1].veh)
|
|
IF e_mission_stage < STAGE_LAND_AT_AIRFIELD
|
|
IF e_mission_stage >= STAGE_CHOPPER_CHASE
|
|
IF NOT b_crew_driver_set_to_die
|
|
MISSION_FAILED(FAILED_DESTROYED_CHOPPER)
|
|
ENDIF
|
|
ELSE
|
|
MISSION_FAILED(FAILED_DESTROYED_CHOPPER)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Stats.
|
|
IF NOT b_mission_passed_screen_displayed
|
|
AND e_section_stage = SECTION_STAGE_RUNNING
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
//Track the vehicle speed/damage stat.
|
|
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
|
|
OR NOT IS_ENTITY_A_VEHICLE(g_MissionStatSingleDamageWatchEntity)
|
|
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleDamageWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity) != veh)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(veh, FH2B_CAR_DAMAGE)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleSpeedWatchEntity)
|
|
OR NOT IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity)
|
|
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleSpeedWatchEntity) != veh)
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(veh)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Track the player damage stat.
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
|
|
OR NOT IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity)
|
|
OR (IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity) AND GET_PED_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity) != PLAYER_PED_ID())
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), FH2B_DAMAGE)
|
|
ENDIF
|
|
|
|
//Remove any vehicles from the speed tracking stat.
|
|
IF g_MissionStatSingleSpeedWatchEntity != NULL
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Mission stages
|
|
SWITCH e_mission_stage
|
|
CASE STAGE_START_CUTSCENE
|
|
DO_START_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_GO_TO_BANK
|
|
GO_TO_BANK()
|
|
BREAK
|
|
|
|
CASE STAGE_DRILL_THROUGH_WALL
|
|
DRILL_THROUGH_WALL()
|
|
BREAK
|
|
|
|
CASE STAGE_BLOW_UP_DOORS
|
|
BLOW_UP_DOORS()
|
|
BREAK
|
|
|
|
CASE STAGE_COLLECT_GOLD
|
|
DEFEND_CREW_IN_TUNNELS()
|
|
BREAK
|
|
|
|
CASE STAGE_WINCH_GOLD_CUTSCENE
|
|
WINCH_GOLD_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_TUNNEL_SHOOTOUT
|
|
TUNNEL_SHOOTOUT()
|
|
BREAK
|
|
|
|
CASE STAGE_LEAVE_BANK
|
|
LEAVE_BANK()
|
|
BREAK
|
|
|
|
CASE STAGE_CITY_SHOOTOUT
|
|
CASE STAGE_CITY_SHOOTOUT_MID_POINT
|
|
CITY_SHOOTOUT()
|
|
BREAK
|
|
|
|
CASE STAGE_LOSE_COPS
|
|
LOSE_COPS()
|
|
BREAK
|
|
|
|
CASE STAGE_CHOPPER_CHASE
|
|
CHOPPER_CHASE()
|
|
BREAK
|
|
|
|
CASE STAGE_DROP_GOLD_ON_TRAIN
|
|
DROP_GOLD_ON_TRAIN()
|
|
BREAK
|
|
|
|
CASE STAGE_DROP_GOLD_ON_TRAIN_CUTSCENE
|
|
DROP_GOLD_ON_TRAIN_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_LAND_AT_AIRFIELD
|
|
LAND_AT_AIRFIELD()
|
|
BREAK
|
|
|
|
CASE STAGE_END_CUTSCENE
|
|
DO_END_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_HELI_CHASE_SETPIECES
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_HELI_CHASE_SETPIECES()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_HELI_TRAIN_HOVER
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_TRAIN_HELI_HOVER()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_GOLD_DROP
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_GOLD_DROP()
|
|
#ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DO_DEBUG()
|
|
#ENDIF
|
|
ENDWHILE
|
|
ENDSCRIPT
|
|
|