Files
2025-09-29 00:52:08 +02:00

22409 lines
746 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : Exile 3 - Train Crash //
// AUTHOR : Rob Bray //
// DESCRIPTION : Player engineers a train crash to steal an item //
// //
//////////////////////////////////////////////////////////////////////////////////////////
//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 "brains.sch"
USING "script_player.sch"
USING "commands_script.sch"
USING "commands_pad.sch"
USING "commands_graphics.sch"
USING "commands_camera.sch"
USING "commands_streaming.sch"
USING "commands_interiors.sch"
USING "commands_object.sch"
USING "commands_vehicle.sch"
USING "commands_fire.sch"
USING "commands_physics.sch"
USING "commands_cutscene.sch"
USING "selector_public.sch"
USING "dialogue_public.sch"
USING "rappel_public.sch"
USING "trains_control_public.sch"
USING "flow_public_core_override.sch"
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
USING "script_blips.sch"
USING "script_buttons.sch"
USING "script_ped.sch"
USING "select_mission_stage.sch"
USING "replay_public.sch"
USING "cutscene_public.sch"
USING "mission_stat_public.sch"
USING "seamless_cuts.sch"
USING "clearMissionArea.sch"
USING "CompletionPercentage_public.sch"
USING "locates_public.sch"
USING "building_control_public.sch"
USING "taxi_functions.sch"
USING "flip_off_public.sch"
USING "respawn_location_private.sch"
USING "commands_pad.sch"
USING "spline_cam_edit.sch"
USING "net_fps_cam.sch"
USING "commands_recording.sch"
USING "push_in_public.sch"
// RE ADD FOUND BOMB DELAY TIME AND remove WIDE EXPLOSION SPHERE CHECK
// REMEMBER TO REMOVE DEBUG PLAYTHROUGH WEAPON GIVES!
// FIGURE OUT WHAT'S GOING ON WITH GUYS NOT DYING IN WATER
// Enums
ENUM MISSION_INIT_STAGE_ENUM
MISSION_INIT_PRE_INTRO = 0,
MISSION_INIT_REQUEST_INTRO,
MISSION_INIT_WAIT_FOR_INTRO,
MISSION_INIT_PRE_TIMELAPSE,
MISSION_INIT_PLAY_INTRO,
MISSION_INIT_DONE
ENDENUM
ENUM MISSION_STAGE_ENUM
STAGE_INTERCEPT_TRAIN = 0,
STAGE_CHASE_TRAIN,
STAGE_DRIVE_ALONG_TRAIN,
STAGE_GET_TO_BRIDGE,
STAGE_GO_TO_CONTAINER,
STAGE_STEAL_FROM_CONTAINER,
STAGE_RAPIDS_CHASE,
STAGE_GET_HOME
ENDENUM
ENUM FAIL_REASON_ENUM
FAIL_MICHAEL_DEAD = 0,
FAIL_TREVOR_DEAD,
FAIL_MISSED_JUMPS,
FAIL_TRAIN_STOPPED,
FAIL_TRAIN_DEAD,
FAIL_LOST_TRAIN,
FAIL_FELL_OFF_TRAIN,
FAIL_CAR_DEAD,
FAIL_BIKE_DEAD,
FAIL_BOAT_DEAD,
FAIL_BOAT_GROUNDED,
FAIL_CONTAINER_INACCESSIBLE,
FAIL_NO_STICKY_BOMBS,
FAIL_ABANDONED_TREVOR,
FAIL_ABANDONED_MICHAEL,
FAIL_ABANDONED_CONTAINER,
FAIL_ABANDONED_GETAWAY_VEHICLES,
FAIL_ABANDONED_BIKE,
FAIL_ABANDONED_DINGHY,
FAIL_ABANDONED_ESCAPE_ROUTE,
FAIL_BEACH_CAR_DEAD,
FAIL_TOO_LATE_BRIDGE,
FAIL_BIKE_STUCK,
FAIL_RON_DEAD,
FAIL_PATRICIA_DEAD
ENDENUM
ENUM MISSION_FAIL_STATE_ENUM
MISSION_FAIL_STATE_NOT_FAILED = 0,
MISSION_FAIL_STATE_WAIT_FOR_FADE
ENDENUM
ENUM MISSION_HOTSWAP_STAGE_ENUM
MISSION_HOTSWAP_STAGE_SELECT_CHARACTER = 0,
MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM,
MISSION_HOTSWAP_STAGE_DONE
ENDENUM
ENUM MISSION_STREAMING_STAGE_ENUM
MISSION_STREAMING_STAGE_REQUEST = 0,
MISSION_STREAMING_STAGE_WAIT,
MISSION_STREAMING_STAGE_COMPLETE
ENDENUM
ENUM MOCAP_STREAMING_STAGE_ENUM
MOCAP_STREAMING_STAGE_REQUEST = 0,
MOCAP_STREAMING_STAGE_WAIT,
MOCAP_STREAMING_STAGE_COMPLETE
ENDENUM
ENUM TRAIN_CRASH_MODEL_ENUM
TCM_MICHAEL = 0,
TCM_TREVOR,
TCM_ENGINEER,
TCM_SOLDIER,
TCM_TRAIN_ENGINE,
TCM_TRAIN_CONTAINER2,
TCM_TRAIN_FLATBED,
TCM_BIKE,
TCM_MICHAEL_CAR,
TCM_CHASE_CHOPPER,
TCM_BEACH_CAR,
TCM_BEACH_TRUCK,
TCM_DINGHY,
TCM_ENEMY_DINGHY,
TCM_MERC_CAR,
TCM_MERC_TRUCK,
TCM_CONTAINER_DOORS,
TCM_CRATE,
TCM_CASE,
TCM_ANCHOR,
TCM_DEBRIS_CRATE,
TCM_DEBRIS_BARREL,
TCM_DOOR_COLLISION_SHUT,
TCM_DOOR_OPEN,
TCM_TRAILER_DOOR,
TCM_PATRICIA,
TCM_RON
ENDENUM
ENUM TRAIN_CRASH_VECTOR_ENUM
TCVEC_PLAYER_INIT = 0,
TCVEC_MICHAEL_INIT,
TCVEC_MICHAEL_AT_CONTAINER,
TCVEC_MICHAEL_IN_CONTAINER,
TCVEC_MICHAEL_AT_BEACH,
TCVEC_BIKE_INIT,
TCVEC_BIKE_CHASE,
TCVEC_MICHAEL_CAR_INIT,
TCVEC_SECOND_TRAIN_INIT,
TCVEC_TRAIN_CRASH_INIT,
TCVEC_BIKE_DRIVE_ALONG_TRAIN,
TCVEC_PURSUIT_FOLLOW_STAGE,
TCVEC_TREVOR_BRIDGE,
TCVEC_TREVOR_WATER,
TCVEC_TREVOR_IN_WATER_INIT,
TCVEC_TREVOR_SHOOTOUT_INIT,
TCVEC_TREVOR_SHOOTOUT_INIT_REPLAY,
TCVEC_TREVOR_AT_BEACH,
TCVEC_BRIDGE_TRIGGER,
TCVEC_DINGHY_INIT,
TCVEC_DINGHY_AT_BRIDGE,
TCVEC_DINGHY_AT_CONTAINER,
TCVEC_DINGHY_AT_CONTAINER_ROTATION,
TCVEC_DINGHY_AT_RAPIDS,
TCVEC_DINGHY_AT_BEACH,
TCVEC_BEACH_CAR_INIT,
TCVEC_SILOS,
TCVEC_PATH_START,
TCVEC_RAPPEL_ANCHOR_POS,
TCVEC_RAPPEL_ANCHOR_ROT,
TCVEC_CONTAINER_IN_RIVER,
TCVEC_ACCESS_CONTAINER,
TCVEC_BLIP_CONTAINER,
TCVEC_IN_CONTAINER,
TCVEC_PACKAGE,
TCVEC_RIVER_MOUTH,
TCVEC_BOAT_ATTACH,
TCVEC_BEACH,
TCVEC_BEACH_VEHICLES,
TCVEC_RON_HOUSE,
TCVEC_CLIMB_DOWN_START,
TCVEC_ATTACH_BIKE_OFFSET,
TCVEC_TRAIN_SWAY_INIT,
TCVEC_TRAIN_CAM_ATTACH,
TCVEC_TRAIN_CAM_POINT,
TCVEC_CRASH,
TCVEC_GUNS_CHOPPER_HOVER,
TCVEC_DROPOFF_CHOPPER_HOVER,
TCVEC_MOVE_LAST_PLAYER_VEHICLE,
TCVEC_CONTAINER_ANIM_POS,
TCVEC_CONTAINER_ANIM_ROT,
TCVEC_TAKE_COVER,
TCVEC_INIT_BIKE_CAM_OFFSET,
TCVEC_END_BIKE_CAM_OFFSET
ENDENUM
ENUM TRAIN_CRASH_VEHICLE_ENUM
TCV_BIKE = 0,
TCV_DINGHY,
TCV_MICHAEL_CAR,
TCV_BEACH_CAR,
TCV_BEACH_TRUCK
ENDENUM
ENUM TRAIN_CRASH_SHOT_DETAILS_ENUM
TC_SHOT_JUMP1 = 0,
TC_SHOT_JUMP1B,
TC_SHOT_JUMP2,
TC_SHOT_JUMP2B,
TC_SHOT_JUMP3,
TC_SHOT_JUMP3B,
TC_SHOT_JUMP4,
TC_SHOT_JUMP4B,
TC_SHOT_JUMP5,
TC_SHOT_JUMP5B,
TC_SHOT_CRASH_BRIDGE,
TC_SHOT_START_DRILL,
TC_SHOT_START_DRILLB,
TC_SHOT_PLANT_BOMB,
TC_SHOT_INTO_BOAT,
TC_SHOT_EXPLODE_DOORS,
TC_SHOT_ENTER_CONTAINER,
TC_SHOT_WATERFALL,
TC_SHOT_WATERFALLB,
TC_SHOT_END
ENDENUM
ENUM TRAIN_CRASH_ANIM_DICT_ENUM
TC_ANIM_DICT_MISSION = 0,
TC_ANIM_DICT_TRAIN,
TC_ANIM_DICT_BIKE_LAND,
//TC_ANIM_DICT_RAPPEL,
TC_ANIM_DICT_RPG,
TC_ANIM_DICT_DOORS,
TC_ANIM_DICT_TREVOR_IDLE_ENTER,
TC_ANIM_DICT_TREVOR_IDLE_BASE,
TC_ANIM_DICT_TREVOR_IDLE_VAR,
TC_ANIM_DICT_TREVOR_IDLE_EXIT,
TC_ANIM_DICT_CRASH,
TC_ANIM_DICT_SWITCH
//TC_ANIM_DICT_GESTURE_ENT,
//TC_ANIM_DICT_GESTURES
ENDENUM
ENUM TRAIN_CRASH_WEAPON_ENUM
TC_WEAPON_SMG = 0,
TC_WEAPON_PISTOL,
TC_WEAPON_SHOTGUN,
TC_WEAPON_STICKY_BOMB,
TC_WEAPON_MERC_RIFLE,
TC_WEAPON_MG,
TC_WEAPON_BACKUP_RIFLE,
TC_WEAPON_SNIPER_RIFLE,
TC_WEAPON_CASE
ENDENUM
ENUM TRAIN_CRASH_PTFX_ENUM
TC_PTFX_SCRIPT = 0
ENDENUM
ENUM TRAIN_CRASH_SFX_ENUM
TC_SFX_TRAIN_FALL = 0
ENDENUM
ENUM TRAIN_CRASH_MISC_ASSET_ENUM
TC_MISC_ASSET_DINGHY_ANIMS = 0
//TC_MISC_ASSET_TOWN_PATHS
//TC_MISC_ASSET_BRIEFCASE_CLIPSET
ENDENUM
ENUM ENEMY_VEHICLE_ENUM
EV_SHOOTOUT_FIRST_WAVE_BOAT_1 = 0,
EV_SHOOTOUT_FIRST_WAVE_BOAT_2,
EV_SHOOTOUT_FIRST_WAVE_BOAT_3,
EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1,
EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1,
EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1,
EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1,
EV_CHASE_FIRST_BOAT_WAVE_BOAT_1,
EV_CHASE_FIRST_BOAT_WAVE_BOAT_2,
EV_CHASE_FIRST_CAR_WAVE_CAR_1
ENDENUM
ENUM ENEMY_PED_ENUM
EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER = 0,
EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR,
EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER,
EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR,
EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER,
EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR,
EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT,
EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL,
EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR,
EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT,
EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL,
EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR,
EP_SHOOTOUT_THIRD_WAVE_FOOT_1,
EP_SHOOTOUT_THIRD_WAVE_FOOT_2,
EP_SHOOTOUT_THIRD_WAVE_FOOT_3,
EP_SHOOTOUT_THIRD_WAVE_FOOT_4,
EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT,
EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL,
EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR,
EP_SHOOTOUT_FIFTH_WAVE_FOOT_1,
EP_SHOOTOUT_FIFTH_WAVE_FOOT_2,
//EP_SHOOTOUT_FIFTH_WAVE_FOOT_3,
//EP_SHOOTOUT_FIFTH_WAVE_FOOT_4,
EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT,
EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER,
EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_PASSFR,
EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER,
EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR,
EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER,
EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSFR,
EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
ENDENUM
ENUM ENEMY_WAVE_ENUM
EW_SHOOTOUT_FIRST_WAVE = 0,
EW_SHOOTOUT_SECOND_WAVE,
EW_SHOOTOUT_THIRD_WAVE,
EW_SHOOTOUT_FOURTH_WAVE,
EW_SHOOTOUT_FIFTH_WAVE,
EW_CHASE_FIRST_HELI_WAVE,
EW_CHASE_FIRST_BOAT_WAVE,
EW_CHASE_FIRST_CAR_WAVE
ENDENUM
ENUM ENEMY_VEHICLE_AI_ENUM
EVAI_FOLLOW_RECORDING = 0,
EVAI_TEMPACTION,
EVAI_DRIVE_TO_COORD,
EVAI_FOLLOW_DINGHY,
EVAI_FOLLOW_WAYPOINT,
EVAI_ANCHOR,
EVAI_FLY_TO_COORD,
EVAI_FLY_ACHIEVE_HEADING,
EVAI_CHOPPER_STRAFE,
EVAI_CHOPPER_GUNS_STATIC,
EVAI_CHOPPER_ATTACK,
EVAI_CHOPPER_ATTACK_COORD,
EVAI_CAR_DRIVE_ALONG_RIVER,
EVAI_NONE
ENDENUM
ENUM TRAIN_CRASH_CUTSCENE_STAGE_ENUM
TC_CUT_STAGE_INIT = 0,
TC_CUT_STAGE_RUNNING,
TC_CUT_STAGE_CLEANUP
ENDENUM
ENUM TRAIN_RIDE_STATE_ENUM
TRAIN_RIDE_STATE_LOW = 0,
TRAIN_RIDE_STATE_CLIMB_LADDER,
TRAIN_RIDE_STATE_HIGH
ENDENUM
ENUM TRAIN_CAM_ENUM
TRAIN_CAM_RIDE_LOW = 0,
TRAIN_CAM_RIDE_HIGH,
TRAIN_CAM_OFF_BIKE,
TRAIN_CAM_CLIMB_DOWN,
TRAIN_CAM_CLIMB_UP,
TRAIN_CAM_BASHING
ENDENUM
ENUM JACKING_TRAIN_SHOT_ENUM
JACKING_TRAIN_OFF_BIKE = 0,
JACKING_TRAIN_BASH_DRIVER,
JACKING_TRAIN_READY_TO_JUMP
ENDENUM
ENUM TRAIN_CRASH_SHOT_ENUM
TRAIN_CRASH_RAYFIRE = 0,
TRAIN_CRASH_MICHAEL_ONTO_CONTAINER
ENDENUM
ENUM PLANT_BOMB_SHOT_ENUM
PLANT_BOMB_DOOR = 0,
PLANT_BOMB_BOAT
ENDENUM
ENUM ENTER_CONTAINER_SHOT_ENUM
ENTER_CONTAINER_EXPLODE_DOORS = 0,
ENTER_CONTAINER_WALK_IN
ENDENUM
ENUM TRAIN_MOVEMENT_STATE_ENUM
TRAIN_MOVEMENT_STOPPED = 0,
TRAIN_MOVEMENT_VERY_SLOW,
TRAIN_MOVEMENT_SLOW,
TRAIN_MOVEMENT_FAST,
TRAIN_MOVEMENT_CATCHUP
ENDENUM
ENUM TRAIN_HOTSWAP_STATE_ENUM
TRAIN_HOTSWAP_ON_TREVOR = 0,
TRAIN_HOTSWAP_ON_MICHAEL,
TRAIN_HOTSWAP_TO_TREVOR,
TRAIN_HOTSWAP_TO_MICHAEL
ENDENUM
ENUM BOAT_HOTSWAP_STATE_ENUM
BOAT_HOTSWAP_ON_TREVOR = 0,
BOAT_HOTSWAP_ON_MICHAEL,
BOAT_HOTSWAP_TO_TREVOR,
BOAT_HOTSWAP_TO_MICHAEL
ENDENUM
ENUM HOTSWAP_CAM_ENUM
HOTSWAP_CAM_DEFAULT = 0,
HOTSWAP_CAM_SHORT,
HOTSWAP_CAM_STRAIGHT,
HOTSWAP_CAM_FORCE_ON_EXPLOSION,
HOTSWAP_CAM_TRAIN_TO_BOAT,
HOTSWAP_CAM_BOAT_TO_TRAIN,
HOTSWAP_CAM_THROUGH_TUNNEL_TO_TRAIN,
HOTSWAP_CAM_WRECKAGE_TO_BOAT
ENDENUM
ENUM BOAT_RPG_STATE_ENUM
BOAT_RPG_NOT_STARTED = 0,
BOAT_RPG_GET_IN_POSITION,
BOAT_RPG_USING,
BOAT_RPG_RETURN_TO_SEAT,
BOAT_RPG_DONE
ENDENUM
ENUM ENEMY_RAPPEL_STATE_ENUM
ENEMY_RAPPEL_STATE_CLAMBERING = 0,
ENEMY_RAPPEL_STATE_WAIT_ON_ROPE,
ENEMY_RAPPEL_STATE_RAPPELLING,
ENEMY_RAPPEL_STATE_SHOOTING
ENDENUM
ENUM ENEMY_BRIDGE_STATE_ENUM
ENEMY_BRIDGE_STATE_NOT_STARTED = 0,
ENEMY_BRIDGE_STATE_AIMING,
ENEMY_BRIDGE_STATE_SHOOTING_EAST,
ENEMY_BRIDGE_STATE_MOVE_SIDES,
ENEMY_BRIDGE_STATE_SHOOTING_WEST,
ENEMY_BRIDGE_STATE_COMBAT
ENDENUM
ENUM MICHAEL_TREVOR_ARGUE_STAGE_ENUM
MT_ARGUE_WAIT = 0,
MT_ARGUE_TREVOR,
MT_ARGUE_MICHAEL
ENDENUM
ENUM BEACH_CREATION_STAGE
BEACH_CREATION_NOT_STARTED = 0,
BEACH_CREATION_REQUESTING,
BEACH_CREATION_DONE
ENDENUM
ENUM CREATE_MERC_PICKUP_STAGE_ENUM
CREATE_MERC_PICKUP_STAGE_NOT_STARTED = 0,
CREATE_MERC_PICKUP_STAGE_WAITING,
CREATE_MERC_PICKUP_STAGE_DONE
ENDENUM
ENUM CASE_STATE_ENUM
CASE_IN_HAND_ANIM = 0,
CASE_IN_HAND_ANIM_2,
CASE_IN_HAND_GAMEPLAY,
CASE_UNDER_SEAT
ENDENUM
ENUM RAPIDS_SPEECH_INTERRUPT_ENUM
RSI_CHOPPER_INTRO = 0,
RSI_CHOPPER_REMINDER,
RSI_BOATS_INTRO,
RSI_BOATS_REMINDER_1,
RSI_BOATS_REMINDER_2,
RSI_BOATS_REMINDER_3,
RSI_CARS_INTRO,
RSI_CARS_REMINDER,
RSI_CARS_REMINDER_2,
RSI_M_DEST_CHOPPER,
RSI_M_DEST_BOAT,
RSI_T_DEST_CHOPPER,
RSI_T_DEST_BOAT
ENDENUM
ENUM CREATE_TRAIN_STAGE_ENUM
CREATE_TRAIN_STAGE_NOT_STARTED = 0,
CREATE_TRAIN_STAGE_WAITING,
CREATE_TRAIN_STAGE_DONE
ENDENUM
ENUM CREATE_ENGINEER_STAGE_ENUM
CREATE_ENGINEER_STAGE_NOT_STARTED = 0,
CREATE_ENGINEER_STAGE_WAITING,
CREATE_ENGINEER_STAGE_DONE
ENDENUM
ENUM CLIMB_ENEMY_STATE_ENUM
CLIMB_ENEMY_STATE_NOT_CREATED = 0,
CLIMB_ENEMY_STATE_CLIMBING,
CLIMB_ENEMY_STATE_SHOOTING,
CLIMB_ENEMY_STATE_KNOCKED_OFF
ENDENUM
ENUM MICHAEL_DRIVEBY_STATE_ENUM
MICHAEL_DRIVEBY_WAITING = 0,
MICHAEL_DRIVEBY_FIND_TARGET,
MICHAEL_DRIVEBY_SHOOTING
ENDENUM
ENUM CHECK_FIRST_JUMP_STATE_ENUM
CHECK_FIRST_JUMP_STATE_NOT_STARTED = 0,
CHECK_FIRST_JUMP_STATE_CHECKING,
CHECK_FIRST_JUMP_STATE_DONE
ENDENUM
ENUM TRAIN_CRASH_AUDIO_SCENE_ENUM
TRAIN_CRASH_AUDIO_SCENE_BIKE_START = 0,
TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN,
TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP,
TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE,
TRAIN_CRASH_AUDIO_SCENE_HIJACK_TRAIN,
TRAIN_CRASH_AUDIO_SCENE_RIDE_TRAIN,
TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL,
TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL,
TRAIN_CRASH_AUDIO_SCENE_GET_TO_BRIDGE,
TRAIN_CRASH_AUDIO_SCENE_COLLISION,
TRAIN_CRASH_AUDIO_SCENE_RAYFIRE,
TRAIN_CRASH_AUDIO_SCENE_PLANT_BOMB,
TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL,
TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR,
TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL,
TRAIN_CRASH_AUDIO_SCENE_GET_TO_BEACH,
TRAIN_CRASH_AUDIO_SCENE_HELI_1,
TRAIN_CRASH_AUDIO_SCENE_HELI_2,
TRAIN_CRASH_AUDIO_SCENE_HELI_3,
TRAIN_CRASH_AUDIO_SCENE_HELI_4,
TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL
ENDENUM
ENUM TREVOR_IDLE_STATE_ENUM
TREVOR_IDLE_STATE_NOT_STARTED = 0,
TREVOR_IDLE_STATE_ENTERING,
TREVOR_IDLE_STATE_BASE,
TREVOR_IDLE_STATE_VAR,
TREVOR_IDLE_STATE_CLEAR,
TREVOR_IDLE_STATE_DONE
ENDENUM
ENUM SWAP_CARRIAGE_STATE_ENUM
SWAP_CARRIAGE_STATE_NOT_STARTED = 0,
SWAP_CARRIAGE_STATE_WAITING,
SWAP_CARRIAGE_STATE_DONE
ENDENUM
ENUM GOTO_FOAM_STATE_ENUM
GOTO_FOAM_STATE_NOT_STARTED = 0,
GOTO_FOAM_STATE_WAITING,
GOTO_FOAM_STATE_DONE
ENDENUM
// Consts
CONST_INT NUMBER_MODEL_REQUEST_SLOTS COUNT_OF(TRAIN_CRASH_MODEL_ENUM)
CONST_INT NUMBER_RECORDING_REQUEST_SLOTS 23
CONST_INT NUMBER_WAYPOINT_REQUEST_SLOTS 9
CONST_INT NUMBER_ENGINEERS 1
CONST_INT NUMBER_BEACH_PEDS 2
CONST_INT NUMBER_MERC_PICKUP_PEDS 5
CONST_INT NUMBER_MERC_PICKUP_VEHICLES 5
CONST_INT NUMBER_CLIMB_ENEMIES 2
CONST_INT NUMBER_JUMPS 4//5
CONST_INT NUMBER_SPLINE_CAMS 20
CONST_INT NUMBER_CRASH_FIRES 2
//CONST_INT NUMBER_RAPPEL_ENEMIES 2
CONST_INT NUMBER_BRIDGE_ENEMIES 4
CONST_INT NUMBER_CRATES 5
CONST_INT NUMBER_DEBRIS 8
CONST_INT NUMBER_SPLASHES 14
CONST_INT NUMBER_POSITION_TREVOR_CHECKS 18
CONST_INT NUMBER_CHOPPER_NODES 7
CONST_INT MAX_SKIP_MENU_LENGTH 10
CONST_INT SKIP_FADE_WAIT_TIME 200
CONST_INT SKIP_FADE_LONG_WAIT_TIME 1000
CONST_INT PLAYER_VEHICLE_SEARCH_FLAGS VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES | VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES | VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_GROUP_MEMBERS | VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_PLAYER | VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED | VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_WITH_PEDS_ENTERING_OR_EXITING | VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK
CONST_INT MIN_RANDOM_SPEECH_TIME 7000
CONST_INT MAX_RANDOM_SPEECH_TIME 12000
CONST_INT PURSUIT_VEHICLE_INITIAL_REC_TIME 16000
CONST_INT PURSUIT_VEHICLE_SKIP_REC_TIME 26000
CONST_FLOAT CLEAR_POS_RADIUS 3.2
CONST_FLOAT TRAVERSE_MOVING_TRAIN_SPEED 1.6
CONST_FLOAT TRAVERSE_HANGING_TRAIN_SPEED 0.68
CONST_FLOAT CATCHUP_Y_COORD 5150.0
CONST_FLOAT FAIL_STOP_X 50.0
CONST_FLOAT TRAIN_STOP_X 10.0
CONST_FLOAT LOSE_TRAIN_DISTANCE 600.0
CONST_FLOAT STANDARD_RUBBERBAND_DISTANCE 100.0
CONST_FLOAT DRIVE_ALONG_TRAIN_SPEED 11.0//13.0//14.0//0.0//20.0
CONST_FLOAT MIN_STANDARD_TRAIN_SPEED 35.0//18.0//20.0
CONST_FLOAT MAX_STANDARD_TRAIN_SPEED 40.0//30.0//38.0
CONST_FLOAT JACK_TRAIN_SPEED 25.0
CONST_FLOAT GET_TO_BRIDGE_TRAIN_SPEED 55.0
CONST_FLOAT GET_TO_BRIDGE_SLOW_TRAIN_SPEED 30.0
CONST_FLOAT TRAIN_CHASE_ACCELERATION 1.86
CONST_FLOAT TRAIN_CHASE_DECELERATION 3.5
CONST_FLOAT TRAIN_CATCHUP_ACCELERATION 0.8//1.60
CONST_FLOAT TRAIN_CATCHUP_DECELERATION 1.0//4.0
CONST_FLOAT TRAIN_STANDARD_ACCELERATION 1.0
CONST_FLOAT TRAIN_STANDARD_DECELERATION 0.8
CONST_FLOAT TRAIN_SABOTAGE_ACCELERATION 1.2
CONST_FLOAT TRAIN_SABOTAGE_DECELERATION 0.35
CONST_FLOAT SKIP_REC_AFTER_WATERFALL 7900.0//9500.0
CONST_FLOAT TRAIN_CAM_FOV 33.5
CONST_FLOAT PLAYER_INIT_ROT -49.6//-13.5//11.49
CONST_FLOAT MICHAEL_INIT_ROT 9.2//-135.82
CONST_FLOAT MICHAEL_AT_CONTAINER_ROT 62.98
CONST_FLOAT MICHAEL_IN_CONTAINER_ROT 63.81
CONST_FLOAT MICHAEL_AT_BEACH_ROT -109.12
CONST_FLOAT BIKE_INIT_ROT -30.45
CONST_FLOAT BIKE_CHASE_ROT 14.71
CONST_FLOAT MICHAEL_CAR_INIT_ROT -52.22
CONST_FLOAT BEACH_CAR_INIT_ROT -42.14
CONST_FLOAT PURSUIT_FOLLOW_STAGE_ROT 84.4
CONST_FLOAT PURSUIT_CLIMB_DOWN_STAGE_ROT -140.04
CONST_FLOAT TREVOR_BRIDGE_ROT -172.41
CONST_FLOAT TREVOR_WATER_ROT 40.9
CONST_FLOAT TREVOR_IN_WATER_INIT_ROT -153.6
CONST_FLOAT TREVOR_SHOOTOUT_INIT_ROT 5.4//-52.43
CONST_FLOAT TREVOR_AT_BEACH_ROT 132.53
CONST_FLOAT DINGHY_INIT_ROT 45.39
CONST_FLOAT DINGHY_AT_BRIDGE_ROT 91.60
CONST_FLOAT DINGHY_AT_CONTAINER_ROT 155.20
CONST_FLOAT DINGHY_AT_RAPIDS_ROT 90.21
CONST_FLOAT DINGHY_AT_BEACH_ROT 132.53
CONST_FLOAT CONTAINER_IN_RIVER_ROT 121.16
CONST_FLOAT STEALING_ROT -63.67
CONST_FLOAT IN_CONTAINER_ROT -154.83
CONST_FLOAT OUTSIDE_CONTAINER_ROT 115.56
CONST_FLOAT MOVE_LAST_PLAYER_VEHICLE_ROT -243.0
CONST_FLOAT TOWN_PATHS_MIN_X 592.95
CONST_FLOAT TOWN_PATHS_MIN_Y 3533.08
CONST_FLOAT TOWN_PATHS_MAX_X 2145.54
CONST_FLOAT TOWN_PATHS_MAX_Y 4089.31
CONST_FLOAT SKIP_MICHAEL_INTO_CONTAINER_PHASE 0.44
// Structs
//STRUCT SCRIPT_QUAT
// FLOAT x,y,z,w
//ENDSTRUCT
STRUCT ENEMY_VEHICLE
VEHICLE_INDEX veh
//BLIP_INDEX blip
ENEMY_VEHICLE_AI_ENUM aiEnum
VECTOR vTarget
VECTOR vTargetRadius
INT iAiStage
INT iTerminateActionTime
FLOAT fPlaybackSpeed
BOOL bCommentedOnDestruction
BOOL bExplodedVehicle
BOOL binSlowDownArea
BOOL bOccupantsDead
ENDSTRUCT
STRUCT ENEMY_PED
PED_INDEX ped
//BLIP_INDEX blip
AI_BLIP_STRUCT blipStruct
INT iRecheckDrivebyTime
INT iRagdollTime
INT iKillTime
BOOL bRegisteredDead
BOOL bRagdolled
BOOL bBlipped
BOOL bPauseGuns
ENDSTRUCT
STRUCT CLIMB_ENEMY
PED_INDEX ped
CLIMB_ENEMY_STATE_ENUM state
INT iSyncScene
BOOL bDoneSpeech
ENDSTRUCT
STRUCT ENEMY_RAPPEL_DATA
ENEMY_RAPPEL_STATE_ENUM rappelState
RAPPEL_DATA rappelData
INT iStateStartTime
ENDSTRUCT
STRUCT CRATE_BOB_DATA
OBJECT_INDEX obj
FLOAT fDisplacement
FLOAT fSpeed
INT iDir
ENDSTRUCT
/*
STRUCT DEBRIS_DATA
OBJECT_INDEX obj
BOOL bReleased
FLOAT fOnScreenTime
ENDSTRUCT
*/
// Script-specific variables
MISSION_INIT_STAGE_ENUM missionInitStage = MISSION_INIT_PRE_INTRO
MISSION_FAIL_STATE_ENUM missionFailState = MISSION_FAIL_STATE_NOT_FAILED
MISSION_STAGE_ENUM currentMissionStage
FAIL_REASON_ENUM savedFailReason
MISSION_HOTSWAP_STAGE_ENUM hotswapStage
MISSION_STREAMING_STAGE_ENUM streamingStage
MOCAP_STREAMING_STAGE_ENUM mocapStreamingStage
TRAIN_CRASH_CUTSCENE_STAGE_ENUM cutsceneStage
JACKING_TRAIN_SHOT_ENUM jackingTrainShot
TRAIN_CRASH_SHOT_ENUM trainCrashShot
//ENTER_CONTAINER_SHOT_ENUM enterContainerShot
TRAIN_MOVEMENT_STATE_ENUM trainMovementState
SELECTOR_PED_STRUCT sSelectorPeds
SELECTOR_CAM_STRUCT sCamDetails
ENEMY_PED enemyPed[COUNT_OF(ENEMY_PED_ENUM)]
ENEMY_VEHICLE enemyVehicle[COUNT_OF(ENEMY_VEHICLE_ENUM)]
TRAIN_HOTSWAP_STATE_ENUM trainHotswapState
TRAIN_RIDE_STATE_ENUM trainRideState
//ENEMY_RAPPEL_DATA enemyRappelData[NUMBER_RAPPEL_ENEMIES]
MICHAEL_TREVOR_ARGUE_STAGE_ENUM michaelTrevorArgueStage
//CRASH_HOTSWAP_STATE_ENUM crashHotswapState
BOAT_HOTSWAP_STATE_ENUM boatHotswapState
HOTSWAP_CAM_ENUM hotswapToTrainCamType
BOAT_RPG_STATE_ENUM boatRPGState
BEACH_CREATION_STAGE beachCreationStage
CRATE_BOB_DATA crateBob[NUMBER_CRATES]
//DEBRIS_DATA debris[NUMBER_DEBRIS]
//ENEMY_BRIDGE_STATE_ENUM enemyBridgeState[NUMBER_BRIDGE_ENEMIES]
CLIMB_ENEMY climbEnemy[NUMBER_CLIMB_ENEMIES]
RAPIDS_SPEECH_INTERRUPT_ENUM pendingRapidsSpeechInterrupt
CREATE_TRAIN_STAGE_ENUM createTrainStage
CREATE_ENGINEER_STAGE_ENUM createEngineerStage
CREATE_MERC_PICKUP_STAGE_ENUM createMercPickupStage
//MICHAEL_DRIVEBY_STATE_ENUM michaelDrivebyState
CHECK_FIRST_JUMP_STATE_ENUM checkFirstJumpState
TREVOR_IDLE_STATE_ENUM trevorIdleState
SWAP_CARRIAGE_STATE_ENUM swapCarriageState
GOTO_FOAM_STATE_ENUM gotoFoamState
FIRST_PERSON_CAM_STRUCT fpsCam
structTimelapse sTimelapse
// Peds
PED_INDEX engineerPed[NUMBER_ENGINEERS]
PED_INDEX mercPickupPed[NUMBER_MERC_PICKUP_PEDS]
//PED_INDEX dummyBoatPed
PED_INDEX trevorTargetPed
//PED_INDEX michaelTargetPed
PED_INDEX patriciaPed
PED_INDEX ronPed
// Vehicles
VEHICLE_INDEX trainCrashVehicle[COUNT_OF(TRAIN_CRASH_VEHICLE_ENUM)]
VEHICLE_INDEX missionTrain
VEHICLE_INDEX crashTrain
VEHICLE_INDEX hangingCarriageVehicle
VEHICLE_INDEX mercPickupVehicle[NUMBER_MERC_PICKUP_VEHICLES]
VEHICLE_INDEX explodeVehicle
// Objects
OBJECT_INDEX doorsObject
OBJECT_INDEX doorCollisionObject
OBJECT_INDEX caseObject
OBJECT_INDEX trainJumpAnchorObject
OBJECT_INDEX targetObject
OBJECT_INDEX trevorDoorObject
// Blips
BLIP_INDEX gotoBlip
BLIP_INDEX trainBlip
BLIP_INDEX buddyBlip
BLIP_INDEX containerBlip
BLIP_INDEX vehicleBlip
BLIP_INDEX carBlip[2]
// Cameras
CAMERA_INDEX staticCam
CAMERA_INDEX interpCam
CAMERA_INDEX animCam
// Bools
BOOL bModelRequestTracker[COUNT_OF(TRAIN_CRASH_MODEL_ENUM)]
BOOL bVehicleRecordingRequestTracker[NUMBER_RECORDING_REQUEST_SLOTS]
BOOL bWaypointRequestTracker[NUMBER_WAYPOINT_REQUEST_SLOTS]
BOOL bAnimDictRequestTracker[COUNT_OF(TRAIN_CRASH_ANIM_DICT_ENUM)]
BOOL bWeaponRequestTracker[COUNT_OF(TRAIN_CRASH_WEAPON_ENUM)]
BOOL bPTFXRequestTracker[COUNT_OF(TRAIN_CRASH_PTFX_ENUM)]
BOOL bSFXRequestTracker[COUNT_OF(TRAIN_CRASH_SFX_ENUM)]
BOOL bMiscAssetRequestTracker[COUNT_OF(TRAIN_CRASH_MISC_ASSET_ENUM)]
BOOL bThoroughCleanup
BOOL bForcePassOnShitskip
BOOL bClearedForCutscene
BOOL bRunningCutscene
BOOL bSkippedCutscene
BOOL bCutsceneWaitStarted
//BOOL bDoingTrevorFocusCam
BOOL bClearedVehiclesDuringIntro
BOOL bStartingAsTrevor
BOOL bShownGodText
BOOL bDoneGotoSpeech
BOOL bShouldDoGetInText
BOOL bSavedBanter
//BOOL bDoneIntroPlayerHotswap
BOOL bDoneIntroCreateEntities
BOOL bDoneIntroClearStart
//BOOL bPreStreamingSeamlessCutscene
BOOL bWaitForBuddyPrompt
BOOL bGetBuddyPrompt
BOOL bDoneMichaelNoFollowPrompt
BOOL bRemovedMichael
BOOL bDoneTrainBanter
BOOL bDoneSeeTrainSpeech
BOOL bTrainIsPastSilos
BOOL bSlowDownTrainForCatchup
BOOL bObjectiveIsJump
BOOL bShownJumpPrompt
BOOL bDoneJumpSpeech
BOOL bDetachedBike
BOOL bDoneEnterCabSpeech
BOOL bDoPathHelp
BOOL bShownPathHelp
BOOL bDoneRidingTrainSpeech
BOOL bDoneRidingTrainSpeech2
BOOL bDoneAlmostThereSpeech
//BOOL bDoneSeeTrainSpeech
BOOL bStartedPlaybackDinghy
BOOL bStoppedPlaybackDinghy
BOOL bArrivedAtBridge
BOOL bSelectorLocked
//BOOL bSetTrainLocationForCrash
//BOOL bRepositionedMichaelAtAnchor
BOOL bStopTrain
BOOL bCreatedCrashTrain
BOOL bDoingRideIdle1
BOOL bRemovedMercPickup
BOOL bDoneMercAngeredAnims
BOOL bDoneMercsRun
BOOL bDoneTrevorTauntMercsSpeech
//BOOL bExplodedTrackMercs
//BOOL bDoneTrackMercsShoot
BOOL bDoneGoingToCrashSpeech
BOOL bLoadedCrashStream
//BOOL bChangedToLadderCam
//BOOL bDoneLookForTrainSpeech
//BOOL bGettingReadySpeech
BOOL bDoneJumpOff
//BOOL bSelectedMichael
BOOL bForceIntoDinghy
BOOL bSuccessfullyForcedIntoDinghy
BOOL bShownSwitchPrompt
BOOL bShownBombHelp
BOOL bDoneSwitchToBombHelp
BOOL bFoundBomb
BOOL bForceDoorsOpen
//BOOL bAtSafeDistance
BOOL bExplodedDoors
BOOL bSwappedToTrevor
BOOL bMichaelSearching
BOOL bRepositionedDinghy
BOOL bDoneHurrySpeech
//BOOL bDoneEnterCover
BOOL bDoneMichaelSearchSpeech
BOOL bTrevorEquippedWeapon
//BOOL bShownCoverPrompt
BOOL bDoneFoundUsSpeech
//BOOL bCreatedCustomSpline
BOOL bDoneFoundItem
BOOL bDoneTrevorRespondSpeech
BOOL bDoneHeliOnMichaelSpeech
BOOL bSetToJump
BOOL bSetupMichaelForShootout
BOOL bDoneDropOnBridgeSpeech
BOOL bDoneUseThermalSpeech
BOOL bDoChopperSpinOut
BOOL bDoneCarriageFall
BOOL bDoneCarriageExplosion
BOOL bDoneCarriageSplash
BOOL bMichaelInDinghy
BOOL bMichaelAnchoredDinghy
BOOL bMichaelStopForTrevorSwimming
BOOL bFinishedFollowRapids
BOOL bDoneWaterfallCutaway
//BOOL bPreventUpWaterfall
BOOL bGivenRPG
//BOOL bDoneMortarSpeech
BOOL bDoneDriveHomeBanter
BOOL bKilledDriveHomeBanter
BOOL bDoneCarSpeech
//BOOL bSetExplosionProofs
//BOOL bDoHoverChopperHovering
BOOL bEnemyWaveState[COUNT_OF(ENEMY_WAVE_ENUM)]
BOOL bTriggeredEnemyWave[COUNT_OF(ENEMY_WAVE_ENUM)]
BOOL bDoneRapidsSpeechInterrupt[COUNT_OF(RAPIDS_SPEECH_INTERRUPT_ENUM)]
BOOL bRapidsSpeechInterruptPending
BOOL bDoMopUp
//BOOL bDoneBugOut
//BOOL bDoneBoatsFlee
//BOOL bChopperUsingRockets
BOOL bDoneLeaveBoatWithCase
BOOL bGotToBeach
BOOL bDoHelperForceOnTrain
BOOL bCreatedSmoothCam
BOOL bSmoothCamBackToGameplay
//BOOL bEnemiesExplosionProof
BOOL bMichaelDroveOff
BOOL bTrevorPutAwayGun
BOOL bDoneImmediateGetInSpeech
BOOL bDoneFailSpeech
BOOL bDoneGetBombsSpeech
BOOL bCamHighEnoughToFreezeTrain
BOOL bRemovedCrashModels
BOOL bTempSuppressVehicleSpawning
BOOL bTempPreventStillVehicleState
BOOL bReadyToEscape
BOOL bCachedShownGodText
BOOL bJumpedToShootout
BOOL bBlippedCarWave
BOOL bSetTrevorExitIntro
BOOL bForcedTrevorOutOfBoat
BOOL bBeenAtGetawayVehicles
BOOL bDoMerryweatherMassacre
BOOL bCreatedMerryweatherMassacre
BOOL bDoneForceDinghyStop
BOOL bDoneMichaelGoOnFoot
BOOL bMichaelWasInVehicle
BOOL bIncreasedBoatAccuracy
BOOL bStartedChopper1AudioScene
BOOL bStartedChopper2AudioScene
BOOL bStartedChopper3AudioScene
BOOL bStartedChopper4AudioScene
BOOL bStoppedChopper3AudioScene
BOOL bRemovedChopper1Audio
BOOL bRemovedChopper2Audio
BOOL bDoneBoatSound[2]
BOOL bEnteredTrailer
BOOL bWasTimeLapseRunning
BOOL bDidntPullAwayFromContainer
BOOL bLateAimAtRapids
BOOL bThermalOn
BOOL bThermalSwitchedOn
BOOL bDoneSniperHelp1
BOOL bDoneSniperHelp2
BOOL bShouldDoSniperHelp
BOOL bDoneKilledSnipersSpeech
BOOL bDoneSeenParachutesSpeech
BOOL bDoneParachute1
BOOL bDoneParachute2
BOOL bDoTrevorBoom
BOOL bForceMichaelSwitch
BOOL bDoneCamShake
BOOL bSlowedDown
BOOL bSpedUp
BOOL bReloadingSniperRifle
BOOL bDonePushIn
BOOL bHitSound
BOOL bWooshStarted
BOOL bDoneMissionStartCue
BOOL bPreparedSeeTrainCue
BOOL bDoneSeeTrainCue
BOOL bPreparedLandOnTrainCue
BOOL bDoneLandOnTrainCue
BOOL bPreparedSwapToMichaelCue
BOOL bDoneSwapToMichaelCue
BOOL bPreparedSideOnCue
//BOOL bPreparedCollisionCue
BOOL bDoneCollisionCue
//BOOL bPreparedHitWaterCue
BOOL bDoneHitWaterCue
//BOOL bPreparedSwapToTrevorCue
BOOL bDoneSwapToTrevorCue
BOOL bPreparedEnemiesArriveCue
BOOL bDoneEnemiesArriveCue
BOOL bPreparedRapidsStartCue
BOOL bDoneRapidsStartCue
BOOL bDoneLandAtBeachCue
BOOL bDoneAtBeachCue
BOOL bDoneEncourageOpenSpeech
BOOL bDoneFirstHurryUpSpeech
BOOL bDoneThrowBombSpeech
BOOL bDoneFindLootSpeech
BOOL bDoLastBoatCircle
BOOL bUppedAccuracyForCircle
BOOL bLoadedHitDriverAudio
BOOL bSetSceneAudioEntity
BOOL bResetGameCamHeading
BOOL bDoneBikeJumpAudioScene
BOOL bDoneBoatHitWaterSound
BOOL bSkippedWaterfallCutaway
BOOL bExtendMichaelAbandon
BOOL bDoneBrakePressSound
BOOL bDoneBrakeReleaseSound
BOOL bDeletedRonAndPatricia
BOOL bGotFirstSniperSpeech
BOOL bCreatedTrucks
BOOL bPutWeaponAway
BOOL bStoppingDinghy
BOOL bForceResetTrevorTask
BOOL bAddedSplash[NUMBER_SPLASHES]
BOOL bDoneEnterTrailerSpeech
BOOL bDoneWaterTrail[3]
BOOL bSetTrevorHelmet
BOOL bDoneSetTrevorHelmetSpeech
BOOL bRemovedStreamVol
BOOL bTurnOffUnderwaterDialogue
BOOL bRestoredControl
BOOL bSuppressRemoveTrevorMG
BOOL bAttachedCaseToHand
BOOL bStartedDebrisFX
BOOL bExplodedChopperFromCarriage
BOOL bStartedIPLSwap
BOOL bSwappedDoors
BOOL bDoneBikeStartAudioScene
BOOL bDoneSeeTrainAudioScene
BOOL bStoppedDefendMichaelAudioScene
BOOL bDoneTrainAccelerationAudioScene
BOOL bDoneTrainDecelerationAudioScene
BOOL bCheckedInitialMG
BOOL bSuppressFutureReplaySetups
BOOL bHasChanged
BOOL bToBoatSwitchFirstPerson
BOOL bFromTrainSwitchFirstPerson
BOOL bContainerSwitchFirstPerson
BOOL bRapidsSwitchFirstPerson
BOOL bDoneFlash
// Vectors
VECTOR vTrevorAttachToBoatPos
VECTOR vTrevorAttachToBoatRot
VECTOR vMichaelAttachToBoatPos
VECTOR vMichaelAttachToBoatRot
VECTOR vFirstPersonCamRot
//VECTOR vHangingCarriagePos
//VECTOR vHangingCarriageRot
VECTOR vCurrentBikeCamOffset
// Floats
FLOAT fTrainCruiseSpeed
FLOAT fPlayerIsOnTrainTimer
//FLOAT fAttackChopperHoverSpeed
FLOAT fTrainOnScreenTime
FLOAT fRepositionBoatTime
//FLOAT fTrainClearBridgeMod
FLOAT fBoatRPGPhase
//FLOAT fCachedChopperSpeed
//FLOAT fChopperSpinForce
FLOAT fPushChopperToWallForce
FLOAT fTrainSpeedMod
FLOAT fHangingCarriageOnScreenTime
FLOAT fTrainTooLowSpeedTime
FLOAT fEnemyBoatSpeed
FLOAT fSeeTrainSpeechTime
FLOAT fBikeCamHeight
FLOAT fForceBeachTime
FLOAT fThirdWaveAccuracy
FLOAT fFifthWaveAccuracy
FLOAT fTrainAccelerationTime
FLOAT fTrainDecelerationTime
FLOAT fMopUpAccuracy
FLOAT fMichaelToIslandPlaybackSpeed
FLOAT fWaterOverride
FLOAT fTimeScale
FLOAT fRayfireEvolution
// Ints
INT iReplayAttempt
INT iStageStartTime
INT iGetInTextStage
INT iCurrentJump
INT iClosestCarriage
//INT iFightStage
//INT iBashedDriverCount
//INT iBashSpeechStage
//INT iChopperHoverStage
INT iAllowSkipCutsceneTime
INT iTrainCrashCutsceneTime
INT iCutsceneTriggerTime
INT iTrainMovementStartTime
INT iCheckClosestCarriageTime
INT iOnFlatbedTime
INT iFoundBombTime
INT iNoBombsTime
//INT iSafeDistanceTime
INT iNextArgueTime
INT iHeliOnMichaelTime
INT iCurrentSearch
INT iNextRandomSpeechTime
INT iSyncScene
INT iDeadSyncScene
INT iRecheckTrevorDrivebyTime
//INT iRecheckMichaelDrivebyTime
//INT iTriggerFleeWaveTime
INT iClearHelpTime
INT iBridgeSmashStage
INT iShootoutStartTime
INT iCreateSnipersTime
//INT iChopperWeaponsTime
INT iInterceptTrainTime
INT iRapidsSpeechStage
INT iRapidsSpeechInterruptTime
INT iAdvanceToGetHomeTime
INT iInitialMGAmmo
INT iLastExplodeTime
INT iMichaelBoatStartTime
INT iMichaelDriveOffTime
INT iPrepareLandOnTrainCueTime
INT iJumpSucceedingTime
INT iCreatedMountainChopperTime
INT iPromptedToBlowTime
INT iBombHelpTime
INT iNextHeliRocketTime
INT iMichaelDriveCarStage
INT iSuppressVehicleSpawnTime
INT iDetachMichaelTime
INT iLastBoatReminderTime
INT iCreatedWaveTime[COUNT_OF(ENEMY_WAVE_ENUM)]
INT iCreateMountainChopperTime
INT iLastTrevorVariationTime
INT iDelayFindItemTime
INT iCreateMerryweatherMassacreTime
INT iDoTrainBanterTime
INT iRemovedJumpBlipTime
INT iMichaelTaskTime
INT iEncourageOpenSpeechTime
INT iSniperSpeechTime
INT iBeenAtBridgeTime
INT iGotSniperTime
INT iCachedCarriage
INT iCreateTruckFrame
INT iDelete
INT iCheckInBoxcarTime
INT iSwappedToTrevorTime
INT iFoundUsSpeechTime
INT iPerformSequenceTime
INT iDelayFirstLineTime
INT iCheckFirstJumpStateTime
INT iStartIPLSwapTime
INT iReloadSniperRifleTime
INT iExplodedDoorsTime
INT iLastSwitchTime
INT iHitTime
INT iFlashTime
//INT iChopperSpinModifier
// Other variables
SEQUENCE_INDEX sequence
structPedsForConversation trainCrashConversation
TEXT_LABEL_23 tSavedBanterRoot
TEXT_LABEL_23 tResumeBanterLabel
PTFX_ID firePTFX[NUMBER_CRASH_FIRES]
BOOL bFirePTFXActive[NUMBER_CRASH_FIRES]
PTFX_ID wadePTFX
PTFX_ID debrisFallPTFX1
PTFX_ID debrisFallPTFX2
PTFX_ID debrisFallPTFX3
PTFX_ID debrisSplashPTFX
RAYFIRE_INDEX bridgeRayfire
STREAMVOL_ID bridgeVolume
COVERPOINT_INDEX islandCover
RAGDOLL_BLOCKING_FLAGS blockingAllRagdoll = RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_FIRE | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_IMPACT_OBJECT | RBF_MELEE | RBF_RUBBER_BULLET | RBF_FALLING | RBF_WATER_JET | RBF_DROWNING
REL_GROUP_HASH enemyRelGroup
SCENARIO_BLOCKING_INDEX rapidsScenarioBlocking
//SCENARIO_BLOCKING_INDEX beachScenarioBlocking
SCENARIO_BLOCKING_INDEX roadScenarioBlocking
SCENARIO_BLOCKING_INDEX road2ScenarioBlocking
INTERIOR_INSTANCE_INDEX trailerInterior
FLIP_OFF_DATA flipOffData
CAM_VIEW_MODE cachedCamMode
PUSH_IN_DATA pushInData
// Debug
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID trainCrashWidgets
TEXT_WIDGET_ID RBCamPosWidget, RBCamRotWidget
BOOL bDebugOverrideSpeed
FLOAT fDebugOverrideSpeed = 0.0
BOOL bDebugDontDoDistanceFail
VECTOR vDebugTrainCamOffset = <<0,0,0>>
VECTOR vDebugTrainCamPoint = <<0,0,0>>
FLOAT fDebugTrainCamFOV = 50
INT iDebugTrainPositions = -1
VECTOR vRBDebugCamPos, vRBDebugCamRot
FLOAT fRBDebugCamFOV
BOOL bRBDebugCamDoDump
BOOL bDebugWarpToJumps
BOOL bDebugWarpedTrainToBridge
BOOL bDebugJSkip
MissionStageMenuTextStruct stageMenu[MAX_SKIP_MENU_LENGTH]
INT iMenuMissionStage
INT iDebugStage = -1
#ENDIF
ENUM SELECT_PEDS
SEL_MICHAEL = 0,
SEL_FRANKLIN,
SEL_TREVOR
ENDENUM
//PURPOSE: If the ped is controlled by the player, return player. Else, return the ped.
FUNC PED_INDEX GET_SELECT_PED(SELECT_PEDS PedToGet)
SWITCH PedToGet
CASE SEL_MICHAEL
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) = SELECTOR_PED_MICHAEL
RETURN PLAYER_PED_ID()
ELSE
RETURN sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
ENDIF
BREAK
CASE SEL_FRANKLIN
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) = SELECTOR_PED_FRANKLIN
RETURN PLAYER_PED_ID()
ELSE
RETURN sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
ENDIF
BREAK
CASE SEL_TREVOR
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) = SELECTOR_PED_TREVOR
RETURN PLAYER_PED_ID()
ELSE
RETURN sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ENDIF
BREAK
ENDSWITCH
RETURN PLAYER_PED_ID()
ENDFUNC
//---------------------------¦ EXILE 3 SWITCH CAM ¦----------------------------
ENUM EXILE_SWITCH_CAM_STATE
SWITCH_CAM_IDLE,
SWITCH_CAM_REQUEST_ASSETS,
SWITCH_CAM_SETUP_GAMEPLAY,
SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_1,
SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_1,
SWITCH_CAM_SHUTDOWN_TRAIN_TO_BOAT_SPLINE_1,
SWITCH_CAM_TRAIN_TO_BOAT_CODE_CAM,
SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_2,
SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_2,
SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_CONTAINER_SPLINE,
SWITCH_CAM_SETUP_TREVOR_TO_MICHAEL_SPLINE,
SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_SPLINE,
SWITCH_CAM_PLAYING_SPLINE1,
SWITCH_CAM_SHUTDOWN_SPLINE1,
SWITCH_CAM_RETURN_TO_GAMEPLAY
ENDENUM
EXILE_SWITCH_CAM_STATE eSwitchCamState = SWITCH_CAM_IDLE
SWITCH_CAM_STRUCT scsSwitchCamTrainToBoat_Intro
SWITCH_CAM_STRUCT scsSwitchCamTrainToBoat_Outro
SWITCH_CAM_STRUCT scsSwitchCamMichealToTrevorContainer
//SWITCH_CAM_STRUCT scsSwitchCamMichaelToTrevorRiver
//SWITCH_CAM_STRUCT scsSwitchCamTrevorToMichaelRiver
//Container Switch Cam Switch Variables
//#IF IS_DEBUG_BUILD
//VECTOR vContainerSwitchTrevorTeleportPos = <<-483.6, 4395.3, 31.0>>
//FLOAT fContainerSwitchTrevorTeleportRot = 0.0
//#ENDIF
PED_INDEX piMichaelContainerSwitch
#IF IS_DEBUG_BUILD
BOOL bSwitchCamDebugScenarioEnabled = FALSE
BOOL bResetDebugScenario = FALSE
#ENDIF
FLOAT fGameplayCamHeadingTrainToBoat = 0.0
FLOAT fGameplayCamPitchTrainToBoat = 0.0
FLOAT fSwitchCamTrainToBoat_DingyWarp_JumpcutDescent = 6700
FLOAT fSwitchCamTrainToBoat_DingyWarp_OutroSwoop = 5000
FLOAT fSwitchCamTrainToBoat_DingyWarp_EndingCam = 13000
VECTOR vDinghyInitLoc = <<475.5, 3944.2, 30.7>>
FLOAT fGameplayCamHeadingMichaelToTrevorContainer = 0.0
FLOAT fGameplayCamPitchMichaelToTrevorContainer = 0.0
INT iSwitchCam_Explosion_StartBoatMoveNode = 0
FLOAT fRiverChaseGameplayCamHeadingTrevor = 0.0
FLOAT fRiverChaseGameplayCamPitchTrevor = 0.0
FLOAT fRiverChaseGameplayCamHeadingMichael = 0.0
FLOAT fRiverChaseGameplayCamPitchMichael = -3.0
FLOAT fAudioRiverToMichaelSwitchSplinePhase = 0.9
FLOAT fAudioRiverToTrevorSwitchSplinePhase = 0.9
INT iWooshSND_ID = -1
//BOOL bWooshPlaying = FALSE
BOOL bWooshOut = FALSE
BOOL bPlayerControlGiven = FALSE
BOOL bPreventMissionFail_SwitchCamDebug = FALSE //[MF] Prevent the mission from failing.
BOOL bTrainSwitch_CodeCam_DingyPlaybacK
BOOL bTrainSwitchRestartDinghyRecording
BOOL bHasContainerSwitchCamExplosionHappened
//FLOAT fAudioContainerSwitchSplinePhaseStart = 0.25
//FLOAT fAudioContainerSwitchSplinePhaseEnd = 0.59
BOOL bAreShowingMichaelReverseSwitchCam
//FLOAT fMichaelReverseSwitchCamHeading = 189.0
//FLOAT fMichaelReverseSwitchCamPitch = -12.0
INT iContainerSwitch_ExplosionDelay = 250
BOOL bContainerSwitch_ExplosionHappened
BOOL bContainerSwitch_ShakeStopped
FLOAT fContainerSwitch_ShakeStoppedPhase = 0.22
VECTOR vContainerSwitch_ExplosionLocation = <<-491.0, 4434.7, 31.4>>
FLOAT fContainerSwitch_ExplosionScale = 2.7
FLOAT fContainerSwitch_StartTrevDialogue = 0.5//0.8
BOOL bContainerSwitch_PlayTrevFlash
FLOAT fContainerSwitch_StartTrevFlashPhase = 0.37
BOOL bTrevorSetupAfterContainerSwitch
BOOL bMichaelSearchAnimStarted
PROC Set_Ped_Position(PED_INDEX aPed, VECTOR aPosition, FLOAT aHeading = -1.0)
FLOAT ActualGroundPosition
GET_GROUND_Z_FOR_3D_COORD(aPosition, ActualGroundPosition)
IF NOT IS_ENTITY_DEAD(aPed)
/*SET_ENTITY_COORDS*/ SET_PED_COORDS_KEEP_VEHICLE(aPed, <<aPosition.x, aPosition.y, ActualGroundPosition>>)
IF aHeading > -1
SET_ENTITY_HEADING(aPed, aHeading)
ENDIF
ENDIF
ENDPROC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_INTRO(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viSwitchTrain)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_INTRO")
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[0].iNodeTime = 0
thisSwitchCam.nodes[0].vNodePos = <<6.8388, 6.4832, 3.3791>>
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[0].vNodeDir = <<-1.1998, 4.6534, 0.3761>>
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 60.0000
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].fNodeCamShake = 0.0000
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = 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].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[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 1000
thisSwitchCam.nodes[1].vNodePos = <<6.5636, 2.4718, 19.5047>>
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[1].vNodeDir = <<0.0918, 1.7148, -0.0965>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].fNodeFOV = 60.0000
thisSwitchCam.nodes[1].NodeTimePostFX_Type = SCANLINE_EFFECT
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 2.0000
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[1].fNodeCamShake = 0.0000
thisSwitchCam.nodes[1].iCamEaseType = 0
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[1].bCamEaseForceLinear = 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].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[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[2].iNodeTime = 1000
thisSwitchCam.nodes[2].vNodePos = <<30.6156, 16.5366, 321.1555>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[2].vNodeDir = <<24.1739, 0.4516, -0.5067>>
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 60.0000
thisSwitchCam.nodes[2].NodeTimePostFX_Type = SCANLINE_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[2].fNodeCamShake = 0.0000
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[2].fTimeScale = 1.0000
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
thisSwitchCam.nodes[2].fMinExposure = 0.0000
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
thisSwitchCam.nodes[2].iRampUpDuration = 0
thisSwitchCam.nodes[2].iRampDownDuration = 0
thisSwitchCam.nodes[2].iHoldDuration = 0
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[3].iNodeTime = 1000
thisSwitchCam.nodes[3].vNodePos = <<30.6160, 16.5370, 321.1560>>
thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[3].vNodeDir = <<24.1740, 0.4520, -0.5070>>
thisSwitchCam.nodes[3].bPointAtEntity = TRUE
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[3].fNodeFOV = 60.0000
thisSwitchCam.nodes[3].NodeTimePostFX_Type = SCANLINE_EFFECT
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[3].fNodeCamShake = 0.0000
thisSwitchCam.nodes[3].iCamEaseType = 0
thisSwitchCam.nodes[3].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[3].bCamEaseForceLinear = 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].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.iNumNodes = 4
thisSwitchCam.iCamSwitchFocusNode = 0
thisSwitchCam.bSplineNoSmoothing = TRUE
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_TrainToBoat_intro.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_TrainToBoat_intro.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.viVehicles[0] = viSwitchTrain
ENDPROC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viSwitchBoat)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO")
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 = 2000
thisSwitchCam.nodes[0].vNodePos = <<-0.6110, 7.8007, 19.1691>>
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 = <<-79.0547, -0.0056, -109.0105>>
thisSwitchCam.nodes[0].bPointAtEntity = FALSE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 50.0000
thisSwitchCam.nodes[0].NodeTimePostFX_Type = SCANLINE_EFFECT
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
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 = FALSE
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 2000
thisSwitchCam.nodes[1].vNodePos = <<-0.5746, 5.8001, 2.5385>>
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.2796, -0.1720, 0.4529>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].fNodeFOV = 50.0000
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 2.0000
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.5000
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[1].fNodeCamShake = 1.0000
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 = FALSE
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[2].iNodeTime = 1500
thisSwitchCam.nodes[2].vNodePos = <<-1.5050, 4.3221, 1.7765>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
//thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
//thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[2].vNodeDir = <<-0.5112, -0.2806, 0.9605>>
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 50.0000
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[2].fNodeCamShake = 1.0000
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[2].fTimeScale = 1.0000
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[2].fMinExposure = 0.0000
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
thisSwitchCam.nodes[2].iRampUpDuration = 0
thisSwitchCam.nodes[2].iRampDownDuration = 0
thisSwitchCam.nodes[2].iHoldDuration = 0
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[3].iNodeTime = 1000
thisSwitchCam.nodes[3].vNodePos = <<-3.4175, -1.8931, 1.2862>>
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 = <<-9.1707, -0.1333, -65.9724>>
thisSwitchCam.nodes[3].bPointAtEntity = FALSE
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[3].fNodeFOV = 50.0000
thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[3].fNodeCamShake = 1.0000
thisSwitchCam.nodes[3].iCamEaseType = 0
thisSwitchCam.nodes[3].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[3].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[3].bCamEaseForceLinear = FALSE
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 = 0.0000
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[4].iNodeTime = 1000
thisSwitchCam.nodes[4].vNodePos = <<-3.6304, -3.7962, 1.2638>>
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.2337, -0.1776, 1.0037>>
thisSwitchCam.nodes[4].bPointAtEntity = TRUE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[4].fNodeCamShake = 0.5000
thisSwitchCam.nodes[4].iCamEaseType = 0
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[4].bCamEaseForceLinear = FALSE
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 = 0.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[5].bIsGameplayCamCopy = TRUE
thisSwitchCam.nodes[5].iNodeTime = 1000
thisSwitchCam.nodes[5].vNodePos = <<0.0000, 0.0000, 0.0000>>
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.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[5].bPointAtEntity = FALSE
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[5].fNodeFOV = 0.0000
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_DEFAULT
thisSwitchCam.nodes[5].fNodeCamShake = 0.0000
thisSwitchCam.nodes[5].iCamEaseType = 0
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[5].bCamEaseForceLinear = FALSE
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 = FALSE
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
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 = 0.0000
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.camVelocityOverrides[0].fStartPoint = 0.0000
thisSwitchCam.camVelocityOverrides[0].fSpeed = 7.0000
thisSwitchCam.camVelocityOverrides[1].fStartPoint = 2.0000
thisSwitchCam.camVelocityOverrides[1].fSpeed = 7.0000
thisSwitchCam.camVelocityOverrides[2].fStartPoint = 3.0000
thisSwitchCam.camVelocityOverrides[2].fSpeed = 15.0000
thisSwitchCam.camVelocityOverrides[3].fStartPoint = 4.0000
thisSwitchCam.camVelocityOverrides[3].fSpeed = 15.0000
thisSwitchCam.camVelocityOverrides[4].fStartPoint = 4.9000
thisSwitchCam.camVelocityOverrides[4].fSpeed = 10.0000
thisSwitchCam.camVelocityOverrides[5].fStartPoint = 5.0000
thisSwitchCam.camVelocityOverrides[5].fSpeed = 3.0000
thisSwitchCam.iNumNodes = 6
thisSwitchCam.iCamSwitchFocusNode = 0
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_TrainToBoat_outro.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_TrainToBoat_outro.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.viVehicles[0] = viSwitchBoat
ENDPROC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viSwitchBoat)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO")
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 = 2000
thisSwitchCam.nodes[0].vNodePos = <<0.0746, 7.8007, 19.1691>>
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 = <<-79.0547, -0.0056, -118.0105>>
thisSwitchCam.nodes[0].bPointAtEntity = FALSE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 48.0000
thisSwitchCam.nodes[0].NodeTimePostFX_Type = SCANLINE_EFFECT
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
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 = FALSE
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 2000
thisSwitchCam.nodes[1].vNodePos = <<-0.5746, 5.8001, 2.5385>>
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, -0.1720, 0.4529>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].fNodeFOV = 48.0000
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 2.0000
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.5000
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[1].fNodeCamShake = 1.0000
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 = FALSE
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
/*
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[2].iNodeTime = 1500
thisSwitchCam.nodes[2].vNodePos = <<-1.5050, 4.8221, 1.7765>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
//thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
//thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[2].vNodeDir = <<0, -0.2806, 0.9605>>
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 48.0000
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[2].fNodeCamShake = 1.0000
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[2].fTimeScale = 1.0000
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[2].fMinExposure = 0.0000
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
thisSwitchCam.nodes[2].iRampUpDuration = 0
thisSwitchCam.nodes[2].iRampDownDuration = 0
thisSwitchCam.nodes[2].iHoldDuration = 0
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
*/
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[2].iNodeTime = 1000
thisSwitchCam.nodes[2].vNodePos = <<-4.0175, -0.8931, 1.6862>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
//thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
//thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[2].vNodeDir = <<-14.1707, -0.1333, -75.9724>>
thisSwitchCam.nodes[2].bPointAtEntity = FALSE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[2].fNodeFOV = 48.0000
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[2].fNodeCamShake = 1.0000
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[2].fTimeScale = 1.0000
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[2].fMinExposure = 0.0000
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
thisSwitchCam.nodes[2].iRampUpDuration = 0
thisSwitchCam.nodes[2].iRampDownDuration = 0
thisSwitchCam.nodes[2].iHoldDuration = 10000
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
/*
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[4].iNodeTime = 1000
thisSwitchCam.nodes[4].vNodePos = <<-4.4175, -1.8931, 1.6862>>
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 = <<-9.1707, -0.1333, -65.9724>>
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[4].fNodeCamShake = 1.0000
thisSwitchCam.nodes[4].iCamEaseType = 0
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[4].bCamEaseForceLinear = FALSE
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 = 10000
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 = 0.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
*/
/*
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[4].iNodeTime = 1000
thisSwitchCam.nodes[4].vNodePos = <<-3.6304, -3.7962, 1.2638>>
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.2337, -0.1776, 1.0037>>
thisSwitchCam.nodes[4].bPointAtEntity = TRUE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[4].fNodeCamShake = 0.5000
thisSwitchCam.nodes[4].iCamEaseType = 0
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[4].bCamEaseForceLinear = FALSE
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 = 0.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[5].bIsGameplayCamCopy = TRUE
thisSwitchCam.nodes[5].iNodeTime = 1000
thisSwitchCam.nodes[5].vNodePos = <<0.0000, 0.0000, 0.0000>>
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.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[5].bPointAtEntity = FALSE
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[5].fNodeFOV = 0.0000
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_DEFAULT
thisSwitchCam.nodes[5].fNodeCamShake = 0.0000
thisSwitchCam.nodes[5].iCamEaseType = 0
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[5].bCamEaseForceLinear = FALSE
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 = FALSE
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
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 = 0.0000
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 0.0000
*/
thisSwitchCam.camVelocityOverrides[0].fStartPoint = 0.0000
thisSwitchCam.camVelocityOverrides[0].fSpeed = 6.0000
thisSwitchCam.camVelocityOverrides[1].fStartPoint = 1.0000
thisSwitchCam.camVelocityOverrides[1].fSpeed = 6.0000
thisSwitchCam.camVelocityOverrides[2].fStartPoint = 1.9500
thisSwitchCam.camVelocityOverrides[2].fSpeed = 1.0
thisSwitchCam.camVelocityOverrides[3].fStartPoint = 2.0000
thisSwitchCam.camVelocityOverrides[3].fSpeed = 0.12
//thisSwitchCam.camVelocityOverrides[2].fStartPoint = 3.0000
//thisSwitchCam.camVelocityOverrides[2].fSpeed = 0.25//15.0000
//thisSwitchCam.camVelocityOverrides[3].fStartPoint = 4.0000
//thisSwitchCam.camVelocityOverrides[3].fSpeed = 0//15.0000
//thisSwitchCam.camVelocityOverrides[4].fStartPoint = 4.9000
//thisSwitchCam.camVelocityOverrides[4].fSpeed = 10.0000
//thisSwitchCam.camVelocityOverrides[5].fStartPoint = 5.0000
//thisSwitchCam.camVelocityOverrides[5].fSpeed = 3.0000
thisSwitchCam.iNumNodes = 3
thisSwitchCam.iCamSwitchFocusNode = 0
thisSwitchCam.bSplineNoSmoothing = FALSE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_TrainToBoat_outro.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_TrainToBoat_outro.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.viVehicles[0] = viSwitchBoat
ENDPROC
FUNC BOOL PRELOAD_ASCENT_SHOT()
CDEBUG3LN(DEBUG_MISSION, "PRELOAD_ASCENT_SHOT")
RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, DEFAULT, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO | SWITCH_FLAG_PAUSE_BEFORE_ASCENT | SWITCH_FLAG_SKIP_OUTRO))
IF IS_SWITCH_READY_FOR_ASCENT()
CDEBUG3LN(DEBUG_MISSION, "Ascent Shot Ready.")
RETURN TRUE
ENDIF
CDEBUG3LN(DEBUG_MISSION, "Ascent Shot NOT READY!")
RETURN FALSE
ENDFUNC
FUNC BOOL HANDLE_SWITCH_CAM_TRAIN_TO_BOAT(SWITCH_CAM_STRUCT &thisSwitchCam1, SWITCH_CAM_STRUCT &thisSwitchCam2)
INT iCurrentNode
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_REQUEST_ASSETS
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS")
//LOAD_CAM_SHAKE_LIBRARIES(thisSwitchCam1)
BREAK
CASE SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_1
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE1")
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_INTRO(thisSwitchCam1, missionTrain)
CREATE_SPLINE_CAM(thisSwitchCam1)
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
OR GET_FOLLOW_VEHICLE_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
bFromTrainSwitchFirstPerson = TRUE
ELSE
bFromTrainSwitchFirstPerson = FALSE
ENDIF
IF NOT bFromTrainSwitchFirstPerson
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ELSE
SET_CAM_ACTIVE(fpsCam.theCam, TRUE)
ENDIF
CASCADE_SHADOWS_INIT_SESSION()
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
bPlayerControlGiven = FALSE
bTrainSwitch_CodeCam_DingyPlayback = FALSE
bTrainSwitchRestartDinghyRecording = FALSE
SETTIMERB(0)
eSwitchCamState = SWITCH_CAM_TRAIN_TO_BOAT_CODE_CAM
BREAK
CASE SWITCH_CAM_TRAIN_TO_BOAT_CODE_CAM
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_CODE_DRIVEN_SWITCH")
SWITCH_FLAGS switchFlags
IF NOT bFromTrainSwitchFirstPerson
switchFlags = SWITCH_FLAG_SKIP_INTRO | SWITCH_FLAG_SKIP_OUTRO
ELSE
switchFlags = SWITCH_FLAG_SKIP_INTRO | SWITCH_FLAG_SKIP_OUTRO | SWITCH_FLAG_PAUSE_BEFORE_ASCENT
ENDIF
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, DEFAULT, ENUM_TO_INT(switchFlags))
if GET_PLAYER_SWITCH_STATE() >= SWITCH_STATE_OUTRO_HOLD
sCamDetails.bSplineComplete = true
RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, switch_type_auto)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 001, "trcrash")
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], fSwitchCamTrainToBoat_DingyWarp_EndingCam)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(trainCrashVehicle[TCV_DINGHY], (<<0.0, 0.0, 0.7>>))
eSwitchCamState = SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_2
else
IF TIMERB() >= 250
OR NOT bFromTrainSwitchFirstPerson
ALLOW_PLAYER_SWITCH_ASCENT()
ENDIF
//[MF] Make sure that the boat is in it's proper end position so we don't encounter a streaming issue.
IF GET_PLAYER_SWITCH_STATE() >= SWITCH_STATE_JUMPCUT_DESCENT
IF NOT bTrainSwitch_CodeCam_DingyPlaybacK
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 001, "trcrash")
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], fSwitchCamTrainToBoat_DingyWarp_JumpcutDescent)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(trainCrashVehicle[TCV_DINGHY], (<<0.0, 0.0, 0.7>>))
bTrainSwitch_CodeCam_DingyPlayback = TRUE
ENDIF
ENDIF
IF GET_PLAYER_SWITCH_STATE() >= SWITCH_STATE_OUTRO_SWOOP
IF NOT bTrainSwitchRestartDinghyRecording
PRINTLN("Skipping to recording point in vehicle...")
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 001, "trcrash")
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], fSwitchCamTrainToBoat_DingyWarp_OutroSwoop)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(trainCrashVehicle[TCV_DINGHY], (<<0.0, 0.0, 0.7>>))
bTrainSwitchRestartDinghyRecording = TRUE
ENDIF
ENDIF
RETURN FALSE
endif
ENDIF
FALLTHRU
CASE SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_2
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_2")
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON
PRINTSTRING("first person boat!") PRINTNL()
bToBoatSwitchFirstPerson = TRUE
ELSE
PRINTSTRING("NOT first person boat!") PRINTNL()
bToBoatSwitchFirstPerson = FALSE
ENDIF
IF NOT bToBoatSwitchFirstPerson
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO(thisSwitchCam2, trainCrashVehicle[TCV_DINGHY])
ELSE
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO_FIRST_PERSON(thisSwitchCam2, trainCrashVehicle[TCV_DINGHY])
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
CREATE_SPLINE_CAM(thisSwitchCam2)
SET_SELECTOR_CAM_ACTIVE(FALSE)
SET_CAM_ACTIVE(thisSwitchCam2.ciSpline, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
bPlayerControlGiven = FALSE
IF bToBoatSwitchFirstPerson
FILL_PUSH_IN_DATA(pushInData, trainCrashVehicle[TCV_DINGHY], CHAR_MICHAEL, PUSH_IN_DISTANCE, PUSH_IN_INTERP_TIME, PUSH_IN_CUT_TIME, PUSH_IN_POSTFX_TIME, PUSH_IN_SPEED_UP_TIME)
SET_PUSH_IN_DIRECTION_MODIFIER(pushInData, <<13,0,-10>>)
ENDIF
SETTIMERB(0)
WAIT(0)//[MF] To allow time-cycle to exit out properly. Fix for assert in B* 1319699
eSwitchCamState = SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_2
FALLTHRU
CASE SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_2
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_2")
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam2)
IF IS_CAM_ACTIVE(thisSwitchCam2.ciSpline)
IF iCurrentNode >= thisSwitchCam2.iCamSwitchFocusNode
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fGameplayCamHeadingTrainToBoat)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fGameplayCamPitchTrainToBoat)
ENDIF
IF iCurrentNode >= 6
IF NOT sCamDetails.bOKToSwitchPed
sCamDetails.bOKToSwitchPed = TRUE
ENDIF
ENDIF
IF GET_CAM_SPLINE_PHASE(thisSwitchCam2.ciSpline) >= 1.00
IF bToBoatSwitchFirstPerson
WHILE NOT HANDLE_PUSH_IN(pushInData, TRUE, true, true, false, false)
WAIT(0)
ENDWHILE
ENDIF
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fGameplayCamHeadingTrainToBoat)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fGameplayCamPitchTrainToBoat)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
ENDIF
ENDIF
BREAK
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
SET_TIME_SCALE(1.0)
//STOP_SOUND(iWooshOut_ID)
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = DESTROY_CAM(thisSwitchCam1.ciSpline)")
IF DOES_CAM_EXIST(thisSwitchCam2.ciSpline)
SET_CAM_ACTIVE(thisSwitchCam2.ciSpline, FALSE)
DESTROY_CAM(thisSwitchCam2.ciSpline)
ENDIF
DESTROY_ALL_CAMS()
IF NOT bPlayerControlGiven
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
bPlayerControlGiven = TRUE
ENDIF
SETTIMERA(0)
//UNLOAD_ALL_CAM_SHAKE_ANIM_LIBRARIES()
eSwitchCamState = SWITCH_CAM_IDLE
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX &piMichael, PED_INDEX &piTrevor)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER")
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[0].iNodeTime = 0
thisSwitchCam.nodes[0].vNodePos = <<-489.2911, 4425.7729, 31.1429>>
thisSwitchCam.nodes[0].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
thisSwitchCam.nodes[0].fNodeOffsetDist = 5.0000
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[0].vNodeDir = <<-1.4144, 0.1731, 15.1899>>
thisSwitchCam.nodes[0].bPointAtEntity = FALSE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 50.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.3030
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[0].fNodeCamShake = 2.9700
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 1.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[0].fTimeScale = 0.5000
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.5000
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 = FALSE
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 1000
thisSwitchCam.nodes[1].vNodePos = <<-489.2911, 4425.7729, 31.1429>>
thisSwitchCam.nodes[1].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[1].vNodeDir = <<-1.4144, 0.1731, 15.1899>>
thisSwitchCam.nodes[1].bPointAtEntity = FALSE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[1].fNodeFOV = 50.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.2000
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[1].fNodeCamShake = 1.00
thisSwitchCam.nodes[1].iCamEaseType = 0
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 1.0000
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
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 = TRUE
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.0
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[2].iNodeTime = 1000
thisSwitchCam.nodes[2].vNodePos = <<-488.22, 4421.98, 31.26>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 5.0000
thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[2].vNodeDir = <<-1.32, 0.29, 15.23>>
thisSwitchCam.nodes[2].bPointAtEntity = FALSE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 50.0000
thisSwitchCam.nodes[2].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].iNodeToClone = 0
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.2
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[2].fNodeCamShake = 0.0
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[2].fTimeScale = 1.0
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.5000
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[2].fMinExposure = 0.0000
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
thisSwitchCam.nodes[2].iRampUpDuration = 0
thisSwitchCam.nodes[2].iRampDownDuration = 0
thisSwitchCam.nodes[2].iHoldDuration = 0
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[3].iNodeTime = 600
thisSwitchCam.nodes[3].vNodePos = <<-484.8558, 4397.1348, 32.2383>>
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 = <<-4.0959, 0.0000, 6.5427>>
thisSwitchCam.nodes[3].bPointAtEntity = FALSE
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[3].fNodeFOV = 50.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.3000
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.2000
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[3].fNodeCamShake = 0.0000
thisSwitchCam.nodes[3].iCamEaseType = 0
thisSwitchCam.nodes[3].fCamEaseScaler = 0.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 = 0.0000
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[4].bIsGameplayCamCopy = TRUE
thisSwitchCam.nodes[4].iNodeTime = 500
thisSwitchCam.nodes[4].vNodePos = <<0.0000, 0.0000, 0.0000>>
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.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].fNodeFOV = 0.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.2000
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[4].fNodeCamShake = 0.0000
thisSwitchCam.nodes[4].iCamEaseType = 0
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
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 = 0.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.iNumNodes = 5
thisSwitchCam.iCamSwitchFocusNode = 0
thisSwitchCam.fSwitchSoundAudioStartPhase = -1.0000
thisSwitchCam.fSwitchSoundAudioEndPhase = -1.0000
thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE
thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE
thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_MichaelToTrevor_Container.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_MichaelToTrevor_Container.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.piPeds[0] = piMichael
thisSwitchCam.piPeds[1] = piTrevor
ENDPROC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX &piMichael, PED_INDEX &piTrevor)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER")
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[0].iNodeTime = 0
thisSwitchCam.nodes[0].vNodePos = <<-489.2911, 4425.7729, 31.1429>>
thisSwitchCam.nodes[0].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
thisSwitchCam.nodes[0].fNodeOffsetDist = 5.0000
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[0].vNodeDir = <<-1.4144, 0.1731, 15.1899>>
thisSwitchCam.nodes[0].bPointAtEntity = FALSE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 50.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.3030
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[0].fNodeCamShake = 2.9700
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[0].fTimeScale = 0.5000
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.5000
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 = FALSE
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 1000
thisSwitchCam.nodes[1].vNodePos = <<-489.2911, 4425.7729, 31.1429>>
thisSwitchCam.nodes[1].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[1].vNodeDir = <<-1.4144, 0.1731, 15.1899>>
thisSwitchCam.nodes[1].bPointAtEntity = FALSE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[1].fNodeFOV = 50.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.2000
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[1].fNodeCamShake = 1.00
thisSwitchCam.nodes[1].iCamEaseType = 0
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
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 = TRUE
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.0
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[2].iNodeTime = 1000
thisSwitchCam.nodes[2].vNodePos = <<-488.22, 4421.98, 31.26>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 5.0000
thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[2].vNodeDir = <<-1.32, 0.29, 15.23>>
thisSwitchCam.nodes[2].bPointAtEntity = FALSE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 50.0000
thisSwitchCam.nodes[2].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].iNodeToClone = 0
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.2
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[2].fNodeCamShake = 0.0
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[2].fTimeScale = 1.0
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.5000
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[2].fMinExposure = 0.0000
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
thisSwitchCam.nodes[2].iRampUpDuration = 0
thisSwitchCam.nodes[2].iRampDownDuration = 0
thisSwitchCam.nodes[2].iHoldDuration = 0
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[3].iNodeTime = 600
thisSwitchCam.nodes[3].vNodePos = <<-484.8558, 4397.1348, 32.2383>>
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 = <<-4.0959, 0.0000, 6.5427>>
thisSwitchCam.nodes[3].bPointAtEntity = FALSE
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[3].fNodeFOV = 50.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.3000
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.2000
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[3].fNodeCamShake = 0.0000
thisSwitchCam.nodes[3].iCamEaseType = 0
thisSwitchCam.nodes[3].fCamEaseScaler = 0.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 = 0.0000
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[4].iNodeTime = 500
thisSwitchCam.nodes[4].vNodePos = <<-484.8558, 4397.0348, 32.2383>>
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 = <<-4.0959, 0.0000, 6.5427>>
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].fNodeFOV = 50.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.3000
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.2000
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[4].fNodeCamShake = 0.0000
thisSwitchCam.nodes[4].iCamEaseType = 0
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
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 = 0.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
/*
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[3].bIsGameplayCamCopy = TRUE
thisSwitchCam.nodes[3].iNodeTime = 2500
thisSwitchCam.nodes[3].vNodePos = <<0.0000, 0.0000, 0.0000>>
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.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[3].bPointAtEntity = FALSE
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[3].fNodeFOV = 0.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.2000
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[3].fNodeCamShake = 0.0000
thisSwitchCam.nodes[3].iCamEaseType = 0
thisSwitchCam.nodes[3].fCamEaseScaler = 0.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 = 0.0000
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.0000
*/
thisSwitchCam.iNumNodes = 5
thisSwitchCam.iCamSwitchFocusNode = 0
thisSwitchCam.fSwitchSoundAudioStartPhase = -1.0000
thisSwitchCam.fSwitchSoundAudioEndPhase = -1.0000
thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE
thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE
thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_MichaelToTrevor_Container.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_MichaelToTrevor_Container.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.piPeds[0] = piMichael
thisSwitchCam.piPeds[1] = piTrevor
ENDPROC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_TREVOR_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viTrevor, VEHICLE_INDEX &viMichael)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_TREVOR_TO_MICHAEL")
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[0].iNodeTime = 1000
thisSwitchCam.nodes[0].vNodePos = <<-0.5993, -3.4630, 1.5224>>
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[0].vNodeDir = <<0.1295, 0.1181, 0.5124>>
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[0].fNodeFOV = 60.0000
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.2
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[0].fTimeScale = 0.1000
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
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[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 500
thisSwitchCam.nodes[1].vNodePos = <<-0.3493, -5.2114, 1.5501>>
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[1].vNodeDir = <<-0.0687, 0.1011, 0.4874>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[1].fNodeFOV = 60.0000
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.2
thisSwitchCam.nodes[1].fNodeCamShake = 0.0000
thisSwitchCam.nodes[1].iCamEaseType = 0
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[1].fTimeScale = 0.5000
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
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[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[2].bIsGameplayCamCopy = TRUE
thisSwitchCam.nodes[2].iNodeTime = 300
thisSwitchCam.nodes[2].vNodePos = <<9.9178, -1.3892, 1.2530>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[2].vNodeDir = <<-0.1290, 0.1343, 0.7490>>
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[2].fNodeFOV = 60.0000
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.2
thisSwitchCam.nodes[2].fNodeCamShake = 0.0000
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].fTimeScale = 1.0000
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
thisSwitchCam.nodes[2].fMinExposure = 0.0000
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
thisSwitchCam.nodes[2].iRampUpDuration = 0
thisSwitchCam.nodes[2].iRampDownDuration = 0
thisSwitchCam.nodes[2].iHoldDuration = 0
thisSwitchCam.iNumNodes = 3
thisSwitchCam.iCamSwitchFocusNode = 3
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = TRUE
thisSwitchCam.iGameplayNodeBlendDuration = 1000
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_TrevorToMichael.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_TrevorToMichael.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.viVehicles[0] = viTrevor
thisSwitchCam.viVehicles[1] = viMichael
ENDPROC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viMichael, VEHICLE_INDEX &viTrevor)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICAEL_TO_TREVOR")
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[0].bIsGameplayCamCopy = TRUE
thisSwitchCam.nodes[0].iNodeTime = 0
thisSwitchCam.nodes[0].vNodePos = <<-1588.2013, 4397.1216, 3.4046>>
thisSwitchCam.nodes[0].vNodeDir = <<-11.1489, 0.0000, -161.3704>>
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[0].fNodeFOV = 50.0000
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.2
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = 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].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[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 300
thisSwitchCam.nodes[1].vNodePos = <<-0.9217, 0.5790, 1.6262>>
thisSwitchCam.nodes[1].vNodeDir = <<-0.8974, -0.3626, 1.3974>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[1].fNodeFOV = 60.0000
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.2
thisSwitchCam.nodes[1].fNodeCamShake = 0.0000
thisSwitchCam.nodes[1].iCamEaseType = 0
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[1].bCamEaseForceLinear = 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].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.iNumNodes = 2
thisSwitchCam.iCamSwitchFocusNode = 0
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = TRUE
thisSwitchCam.iGameplayNodeBlendDuration = 200
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_MichaelToTrevor.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_MichaelToTrevor.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.viVehicles[0] = viMichael
thisSwitchCam.viVehicles[1] = viTrevor
ENDPROC
/*
#IF IS_DEBUG_BUILD
PROC CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS()
CDEBUG3LN(DEBUG_MISSION, "CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS")
START_WIDGET_GROUP("Custom Switch Cameras - Extra Tunables")
START_WIDGET_GROUP("Train To Boat")
START_WIDGET_GROUP("Boat Gameplay Cam Tuner")
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading Michael", fGameplayCamHeadingTrainToBoat, -180.0, 180.0, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch Michael", fGameplayCamPitchTrainToBoat, -180.0, 180.0, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Dinghy Rec Skip JumpCutDescent", fSwitchCamTrainToBoat_DingyWarp_JumpcutDescent, 0, 20000.0, 500.0)
ADD_WIDGET_FLOAT_SLIDER("Dinghy Rec Skip OutroSwoop", fSwitchCamTrainToBoat_DingyWarp_OutroSwoop, 0, 20000.0, 500.0)
ADD_WIDGET_FLOAT_SLIDER("Dinghy Rec Skip Ending Cam", fSwitchCamTrainToBoat_DingyWarp_EndingCam, 0, 20000.0, 500.0)
ADD_WIDGET_VECTOR_SLIDER("Dinghy Start Loc", vDinghyInitLoc, -10000, 10000, 10.0)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Micheal To Trevor Container")
START_WIDGET_GROUP("Explosion Tuner")
ADD_WIDGET_INT_SLIDER("Explosion Delay (ms)", iContainerSwitch_ExplosionDelay, 0, 5000, 100)
ADD_WIDGET_VECTOR_SLIDER("Explosion Location", vContainerSwitch_ExplosionLocation, -10000, 10000, 0.3)
ADD_WIDGET_FLOAT_SLIDER("Explosion Scale", fContainerSwitch_ExplosionScale, 0.0, 10.0, 0.2)
ADD_WIDGET_FLOAT_SLIDER("Explosion Shake Stop Phase", fContainerSwitch_ShakeStoppedPhase, 0.0, 1.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Trevor Cam Switch Teleport Position Tuner")
ADD_WIDGET_VECTOR_SLIDER("Trevor Position", vContainerSwitchTrevorTeleportPos, -100000, 100000, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Trevor Heading", fContainerSwitchTrevorTeleportRot, 0.0, 500.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Trevor Gameplay Cam Tuner")
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading Trevor", fGameplayCamHeadingMichaelToTrevorContainer, -180.0, 180.0, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch Trevor", fGameplayCamPitchMichaelToTrevorContainer, -180.0, 180.0, 0.25)
STOP_WIDGET_GROUP()
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound Start Phase", fAudioContainerSwitchSplinePhaseStart, 0.0, 1.0, 0.05)
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound End Phase", fAudioContainerSwitchSplinePhaseEnd, 0.0, 1.0, 0.05)
ADD_WIDGET_INT_SLIDER("Start Boat Movement Node", iSwitchCam_Explosion_StartBoatMoveNode, 0, 10, 1)
ADD_WIDGET_FLOAT_SLIDER("Play Trevor Dialogue Phase", fContainerSwitch_StartTrevDialogue, 0.0, 1.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Play Trev Switch APFX", fContainerSwitch_StartTrevFlashPhase, 0.0, 1.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("River Chase")
START_WIDGET_GROUP("Michael to Trevor Tuner")
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading Trevor", fRiverChaseGameplayCamHeadingTrevor, -180.0, 180.0, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch Trevor", fRiverChaseGameplayCamPitchTrevor, -180.0, 180.0, 0.25)
//ADD_WIDGET_FLOAT_SLIDER("Michael Reverse Angle Cam Heading", fMichaelReverseSwitchCamHeading, -360.0, 360.0, 1.0)
//ADD_WIDGET_FLOAT_SLIDER("Michael Reverse Angle Cam Pitch", fMichaelReverseSwitchCamPitch, -360.0, 360.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound Start Phase", fAudioRiverToTrevorSwitchSplinePhase, 0.0, 1.0, 0.05)
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound End Phase", fAudioRiverToTrevorSwitchSplinePhase, 0.0, 1.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Trevor To Michael Tuner")
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading Michael", fRiverChaseGameplayCamHeadingMichael, -180.0, 180.0, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch Michael", fRiverChaseGameplayCamPitchMichael, -180.0, 180.0, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound Start Phase", fAudioRiverToMichaelSwitchSplinePhase, 0.0, 1.0, 0.05)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
#ENDIF
*/
// get model for a train crash model enum
FUNC MODEL_NAMES GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TRAIN_CRASH_MODEL_ENUM tcModel)
SWITCH tcModel
CASE TCM_MICHAEL
RETURN GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
BREAK
CASE TCM_TREVOR
RETURN GET_PLAYER_PED_MODEL(CHAR_TREVOR)
BREAK
CASE TCM_ENGINEER
RETURN S_M_M_LSMETRO_01
BREAK
CASE TCM_SOLDIER
RETURN S_M_Y_BLACKOPS_01
BREAK
CASE TCM_TRAIN_ENGINE
RETURN FREIGHT
BREAK
//CASE TCM_TRAIN_CONTAINER1
// RETURN FREIGHTCONT1
//BREAK
CASE TCM_TRAIN_CONTAINER2
RETURN FREIGHTCONT2
BREAK
CASE TCM_TRAIN_FLATBED
RETURN FREIGHTCAR
BREAK
CASE TCM_BIKE
RETURN SANCHEZ
BREAK
CASE TCM_MICHAEL_CAR
RETURN GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
BREAK
CASE TCM_MERC_CAR
RETURN MESA3
BREAK
CASE TCM_MERC_TRUCK
RETURN BARRACKS
BREAK
CASE TCM_CHASE_CHOPPER
RETURN BUZZARD
BREAK
CASE TCM_DINGHY
RETURN DINGHY2
BREAK
CASE TCM_ENEMY_DINGHY
RETURN DINGHY
BREAK
CASE TCM_BEACH_CAR
RETURN BFINJECTION
BREAK
CASE TCM_BEACH_TRUCK
RETURN SADLER
BREAK
CASE TCM_CONTAINER_DOORS
RETURN P_CS1_14B_TRAIN_S
BREAK
CASE TCM_CRATE
RETURN PROP_BOX_AMMO04A
BREAK
CASE TCM_CASE
RETURN PROP_IDOL_CASE_02
BREAK
CASE TCM_DEBRIS_CRATE
RETURN Prop_Box_Wood01A
BREAK
CASE TCM_DEBRIS_BARREL
RETURN Prop_Barrel_01A
BREAK
CASE TCM_ANCHOR
RETURN GET_RAPPEL_ANCHOR_MODEL_NAME()
BREAK
CASE TCM_DOOR_COLLISION_SHUT
RETURN P_CS1_14b_Train_S_col
BREAK
CASE TCM_DOOR_OPEN
RETURN P_CS1_14B_TRAIN_ESDOOR //P_CS1_14b_Train_S_colOpen
BREAK
CASE TCM_TRAILER_DOOR
RETURN v_ilev_trevtraildr
BREAK
CASE TCM_PATRICIA
RETURN GET_NPC_PED_MODEL(CHAR_PATRICIA)
BREAK
CASE TCM_RON
RETURN GET_NPC_PED_MODEL(CHAR_RON)
BREAK
ENDSWITCH
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
PROC CREATE_OPEN_DOORS()
IF DOES_ENTITY_EXIST(doorCollisionObject)
DELETE_OBJECT(doorCollisionObject)
ENDIF
IF DOES_ENTITY_EXIST(doorsObject)
DELETE_OBJECT(doorsObject)
ENDIF
doorsObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DOOR_OPEN), <<0,1,2>>)
SET_ENTITY_COORDS(doorsObject,<<-491.690, 4434.900, 31.100>>)
SET_ENTITY_ROTATION(doorsObject,<<344.520, 343.820, 64.240>>)
FREEZE_ENTITY_POSITION(doorsObject, TRUE)
ENDPROC
FUNC BOOL HANDLE_SWITCH_CAM_MICHAEL_TO_TREVOR_CONTAINER(SWITCH_CAM_STRUCT &thisSwitchCam1)
INT iCurrentNode
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_REQUEST_ASSETS
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS")
LOAD_CAM_SHAKE_LIBRARIES(thisSwitchCam1)
BREAK
CASE SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_CONTAINER_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE1")
DESTROY_ALL_CAMS()
IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES()
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
PRINTSTRING("first person container!") PRINTNL()
bContainerSwitchFirstPerson = TRUE
ELSE
PRINTSTRING("NOT first person container!") PRINTNL()
bContainerSwitchFirstPerson = FALSE
ENDIF
ELSE
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
bContainerSwitchFirstPerson = TRUE
ELSE
bContainerSwitchFirstPerson = FALSE
ENDIF
ENDIF
piMichaelContainerSwitch = PLAYER_PED_ID()
IF NOT bContainerSwitchFirstPerson
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER(thisSwitchCam1, piMichaelContainerSwitch, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ELSE
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER_FIRST_PERSON(thisSwitchCam1, piMichaelContainerSwitch, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
CREATE_SPLINE_CAM(thisSwitchCam1)
SET_CAM_SPLINE_SMOOTHING_STYLE(thisSwitchCam1.ciSPline, CAM_SPLINE_SLOW_IN_SMOOTH)
SET_CAM_ACTIVE(thisSwitchCam1.ciSpline, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
IF bContainerSwitchFirstPerson
cachedCamMode = CAM_VIEW_MODE_FIRST_PERSON
SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON)
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
ENDIF
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-438, 4443, 30>>)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
//bWooshPlaying = FALSE
bPlayerControlGiven = FALSE
bContainerSwitch_ExplosionHappened = FALSE
bContainerSwitch_ShakeStopped = FALSE
bContainerSwitch_PlayTrevFlash = FALSE
SETTIMERB(0)
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
FALLTHRU
CASE SWITCH_CAM_PLAYING_SPLINE1
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1 Phase:", GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline))
IF IS_CAM_ACTIVE(thisSwitchCam1.ciSpline)
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam1)
IF iCurrentNode >= thisSwitchCam1.iCamSwitchFocusNode
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fGameplayCamHeadingMichaelToTrevorContainer)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fGameplayCamPitchMichaelToTrevorContainer)
ENDIF
IF iCurrentNode >= thisSwitchCam1.iCamSwitchFocusNode
sCamDetails.bOKToSwitchPed = TRUE
ENDIF
IF NOT bContainerSwitch_ExplosionHappened
IF TIMERB() >= iContainerSwitch_ExplosionDelay
PRINTLN("Playing container explosion effect....")
ADD_EXPLOSION(vContainerSwitch_ExplosionLocation, EXP_TAG_ROCKET, fContainerSwitch_ExplosionScale)
bContainerSwitch_ExplosionHappened = TRUE
ENDIF
ENDIF
IF NOT bContainerSwitch_PlayTrevFlash
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) > fContainerSwitch_StartTrevFlashPhase
ANIMPOSTFX_PLAY("SwitchShortMichaelMid", 0, false)
bContainerSwitch_PlayTrevFlash = TRUE
iFlashTime = GET_GAME_TIMER()
ENDIF
ENDIF
IF NOT bHitSound
IF bContainerSwitch_PlayTrevFlash
IF GET_GAME_TIMER() >= iFlashTime + 80
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
iHitTime = GET_GAME_TIMER()
bHitSound = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bWooshStarted
IF bHitSound
IF GET_GAME_TIMER() >= iHitTime + 250
PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bWooshStarted = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bContainerSwitch_ShakeStopped
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) > fContainerSwitch_ShakeStoppedPhase
PRINTLN("Stopping Cam Shake...")
SHAKE_CAM(thisSwitchCam1.ciSpline, "SKY_DIVING_SHAKE", 0.0)
bContainerSwitch_ShakeStopped = TRUE
ENDIF
ENDIF
/*
IF bWooshPlaying = FALSE
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= fAudioContainerSwitchSplinePhaseStart
AND GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) < fAudioContainerSwitchSplinePhaseEnd
//woosh in
iWooshSND_ID = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(iWooshSND_ID , "All", "SHORT_PLAYER_SWITCH_SOUND_SET")
CDEBUG3LN(DEBUG_MISSION, "Playing: In")
bWooshPlaying = TRUE
ENDIF
ENDIF
IF bWooshPlaying = TRUE
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= fAudioContainerSwitchSplinePhaseEnd
STOP_SOUND(iWooshSND_ID)
bWooshPlaying = FALSE
ENDIF
ENDIF
*/
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= 0.99
FILL_PUSH_IN_DATA(pushInData, PLAYER_PED_ID(), CHAR_TREVOR, PUSH_IN_DISTANCE, PUSH_IN_INTERP_TIME, PUSH_IN_CUT_TIME, PUSH_IN_POSTFX_TIME, PUSH_IN_SPEED_UP_TIME, PUSH_IN_SPEED_UP_PROPORTION)
//SET_PUSH_IN_DIRECTION_MODIFIER(pushInData, <<0,0,0>>)
eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1
ENDIF
ENDIF
BREAK
CASE SWITCH_CAM_SHUTDOWN_SPLINE1
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1")
BOOL bProgress
bProgress = FALSE
IF NOT bContainerSwitchFirstPerson
IF DOES_CAM_EXIST(thisSwitchCam1.ciSpline)
DESTROY_CAM(thisSwitchCam1.ciSpline)
DESTROY_ALL_CAMS()
ENDIF
bProgress = TRUE
ELSE
bProgress = HANDLE_PUSH_IN(pushInData, FALSE, FALSE)
ENDIF
IF bProgress
IF bContainerSwitchFirstPerson
PRINTSTRING("setting cam ") PRINTINT(ENUM_TO_INT(cachedCamMode)) PRINTNL()
SET_FOLLOW_PED_CAM_VIEW_MODE(cachedCamMode)
ENDIF
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
ENDIF
BREAK
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
STOP_SOUND(iWooshSND_ID)
SET_TIME_SCALE(1.0)
IF bContainerSwitchFirstPerson
DESTROY_PUSH_IN_CAMS(pushInData)
// CLEAR_PED_TASKS(PLAYER_PED_ID())
ELSE
ENDIF
IF bContainerSwitchFirstPerson
CREATE_OPEN_DOORS()
STOP_FIRE_IN_RANGE(<<-491.2, 4435.3, 31.7>>, 5)
REMOVE_DECALS_IN_RANGE(<<-491.2, 4435.3, 31.7>>, 5)
ENDIF
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SETTIMERA(0)
eSwitchCamState = SWITCH_CAM_IDLE
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL HANDLE_SWITCH_CAM_RIVER_CHASE_TREVOR_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam1)
INT iCurrentNode
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_SETUP_TREVOR_TO_MICHAEL_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_TREVOR_TO_MICHAEL_SPLINE")
DESTROY_ALL_CAMS()
IF bPreventMissionFail_SwitchCamDebug
SET_ENTITY_INVINCIBLE(GET_SELECT_PED(SEL_MICHAEL), TRUE)
SET_ENTITY_CAN_BE_DAMAGED(GET_SELECT_PED(SEL_MICHAEL), FALSE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
SET_ENTITY_CAN_BE_DAMAGED(PLAYER_PED_ID(), FALSE)
ENDIF
SETUP_SPLINE_CAM_NODE_ARRAY_TREVOR_TO_MICHAEL(thisSwitchCam1, trainCrashVehicle[TCV_DINGHY], trainCrashVehicle[TCV_DINGHY])
CREATE_SPLINE_CAM(thisSwitchCam1)
SET_CAM_ACTIVE(thisSwitchCam1.ciSpline, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
//woosh in
iWooshSND_ID = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(iWooshSND_ID , "All", "SHORT_PLAYER_SWITCH_SOUND_SET")
bWooshOut = FALSE
bPlayerControlGiven = FALSE
SETTIMERB(0)
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
BREAK
CASE SWITCH_CAM_PLAYING_SPLINE1
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
IF IS_CAM_ACTIVE(thisSwitchCam1.ciSpline)
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam1)
IF iCurrentNode >= 1
IF GET_SELECT_PED(SEL_MICHAEL) = PLAYER_PED_ID()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fRiverChaseGameplayCamHeadingMichael)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRiverChaseGameplayCamPitchMichael)
ENDIF
ENDIF
//woosh out audio
IF bWooshOut = FALSE
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= fAudioRiverToMichaelSwitchSplinePhase
STOP_SOUND(iWooshSND_ID)
bWooshOut = TRUE
ENDIF
ENDIF
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= 0.99
eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1
ENDIF
ENDIF
BREAK
CASE SWITCH_CAM_SHUTDOWN_SPLINE1
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1")
IF DOES_CAM_EXIST(thisSwitchCam1.ciSpline)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fRiverChaseGameplayCamHeadingMichael)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRiverChaseGameplayCamPitchMichael)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
BREAK
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
STOP_SOUND(iWooshSND_ID)
SET_TIME_SCALE(1.0)
IF DOES_CAM_EXIST(thisSwitchCam1.ciSpline)
SET_CAM_ACTIVE(thisSwitchCam1.ciSpline, FALSE)
DESTROY_CAM(thisSwitchCam1.ciSpline)
ENDIF
DESTROY_ALL_CAMS()
IF NOT bPlayerControlGiven
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
bPlayerControlGiven = TRUE
ENDIF
SETTIMERA(0)
eSwitchCamState = SWITCH_CAM_IDLE
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL HANDLE_SWITCH_CAM_RIVER_CHASE_MICHAEL_TO_TREVOR(SWITCH_CAM_STRUCT &thisSwitchCam)
INT iCurrentNode
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_SPLINE")
DESTROY_ALL_CAMS()
IF bPreventMissionFail_SwitchCamDebug
SET_ENTITY_INVINCIBLE(GET_SELECT_PED(SEL_TREVOR), TRUE)
SET_ENTITY_CAN_BE_DAMAGED(GET_SELECT_PED(SEL_TREVOR), FALSE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
SET_ENTITY_CAN_BE_DAMAGED(PLAYER_PED_ID(), FALSE)
ENDIF
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR(thisSwitchCam, trainCrashVehicle[TCV_DINGHY], trainCrashVehicle[TCV_DINGHY])
CREATE_SPLINE_CAM(thisSwitchCam)
IF thisSwitchCam.nodes[0].SwitchCamType != SWITCH_CAM_GAMEPLAY_CAM_COPY
AND thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
ELSE
SET_CAM_ACTIVE(CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, thisSwitchCam.nodes[0].vNodePos, thisSwitchCam.nodes[0].vNodeDir, thisSwitchCam.nodes[0].fNodeFOV, TRUE), TRUE)
ENDIF
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
//woosh in
iWooshSND_ID = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(iWooshSND_ID , "All", "SHORT_PLAYER_SWITCH_SOUND_SET")
bWooshOut = FALSE
bPlayerControlGiven = FALSE
SETTIMERB(0)
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
BREAK
CASE SWITCH_CAM_PLAYING_SPLINE1
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
IF NOT IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam)
CDEBUG3LN(DEBUG_MISSION, "iCurrentNode = ", iCurrentNode)
IF iCurrentNode >= 1
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fRiverChaseGameplayCamHeadingTrevor)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRiverChaseGameplayCamPitchTrevor)
ENDIF
//woosh out audio
IF bWooshOut = FALSE
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= fAudioRiverToTrevorSwitchSplinePhase
STOP_SOUND(iWooshSND_ID)
bWooshOut = TRUE
ENDIF
ENDIF
ENDIF
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 0.99
eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1
ENDIF
endif
ELSE
CDEBUG3LN(DEBUG_MISSION, "CAM NOT ACTIVE... HOW IS THIS POSSIBLE?")
ENDIF
BREAK
CASE SWITCH_CAM_SHUTDOWN_SPLINE1
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1")
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fRiverChaseGameplayCamHeadingTrevor)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRiverChaseGameplayCamPitchTrevor)
RENDER_SCRIPT_CAMS(FALSE, TRUE, 30)
ENDIF
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
BREAK
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
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()
STOP_SOUND(iWooshSND_ID)
IF NOT bPlayerControlGiven
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
bPlayerControlGiven = TRUE
ENDIF
SETTIMERA(0)
eSwitchCamState = SWITCH_CAM_IDLE
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
PROC UPDATE_SPLINE_CAM_HELPERS()
//CDEBUG3LN(DEBUG_MISSION, "UPDATE_SPLINE_CAM_HELPERS")
IF bResetDebugScenario
bResetDebugScenario = FALSE
ENDIF
ENDPROC
#ENDIF
// get cutscene name
FUNC STRING GET_EXILE3_INTRO_CUTSCENE_NAME()
RETURN "exile_3_int"
ENDFUNC
// get recording prefix
FUNC STRING GET_TRAIN_CRASH_RECORDING_PREFIX()
RETURN "trcrash"
ENDFUNC
FUNC STRING GET_DESCRIPTION_FOR_STAGE_AS_STRING(MISSION_STAGE_ENUM thisStage)
SWITCH thisStage
CASE STAGE_INTERCEPT_TRAIN
RETURN "Intercept train"
BREAK
CASE STAGE_CHASE_TRAIN
RETURN "Chase and board train"
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
RETURN "Drive along train to engine"
BREAK
CASE STAGE_GET_TO_BRIDGE
RETURN "Get to bridge"
BREAK
CASE STAGE_GO_TO_CONTAINER
RETURN "Enter container"
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
RETURN "Protect Michael from mercs"
BREAK
CASE STAGE_RAPIDS_CHASE
RETURN "Rapids chase"
BREAK
CASE STAGE_GET_HOME
RETURN "Get to cars"
BREAK
ENDSWITCH
RETURN "invalid"
ENDFUNC
// can advance mission
FUNC BOOL CAN_ADVANCE_MISSION()
IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED
AND NOT IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// do mission god text
FUNC BOOL DO_MISSION_GOD_TEXT(STRING sGodText, BOOL bSupercedeText = TRUE, BOOL bSupercedeSpeech = FALSE, INT iTime = DEFAULT_GOD_TEXT_TIME)
IF bSupercedeText OR NOT IS_MESSAGE_BEING_DISPLAYED()
IF bSupercedeSpeech
OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
IF CAN_ADVANCE_MISSION()
PRINT_NOW(sGodText, iTime, 1)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// do mission help text
FUNC BOOL DO_MISSION_HELP_TEXT(STRING sHelpText, BOOL bForever = FALSE, INT iTime = -1)
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
IF CAN_ADVANCE_MISSION()
IF NOT bForever
PRINT_HELP(sHelpText, iTime)
ELSE
PRINT_HELP_FOREVER(sHelpText)
ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// do mission speech
FUNC BOOL DO_MISSION_SPEECH(STRING sSpeech, BOOL bSupercedeText = FALSE, INT iLine = 0, BOOL bFromSpecifiedLine = FALSE, BOOL bAllowSpeechAfterFail = FALSE)
IF bSupercedeText OR NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (CAN_ADVANCE_MISSION() OR (bAllowSpeechAfterFail AND NOT IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()))
IF iLine = 0
RETURN CREATE_CONVERSATION(trainCrashConversation, "EXL3AUD", sSpeech, CONV_PRIORITY_HIGH)
ELSE
TEXT_LABEL tLine
tLine = sSpeech
tLine+="_"
tLine+=iLine
IF NOT bFromSpecifiedLine
RETURN PLAY_SINGLE_LINE_FROM_CONVERSATION(trainCrashConversation, "EXL3AUD", sSpeech, tLine, CONV_PRIORITY_HIGH)
ELSE
RETURN CREATE_CONVERSATION_FROM_SPECIFIC_LINE(trainCrashConversation, "EXL3AUD", sSpeech, tLine, CONV_PRIORITY_HIGH)
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// remove mission text
PROC REMOVE_MISSION_TEXT(BOOL bClearSpeech = TRUE, BOOL bClearGodText = TRUE, BOOL bClearHelpText = TRUE, BOOL bKeepSubs = FALSE)
IF bClearSpeech
KILL_ANY_CONVERSATION()
ENDIF
IF bClearGodText
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
OR (bClearSpeech AND NOT bKeepSubs)
CLEAR_PRINTS()
ENDIF
CLEAR_REMINDER_MESSAGE()
ENDIF
IF bClearHelpText
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
CLEAR_HELP()
iClearHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDPROC
FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_VEHICLE(VEHICLE_INDEX vehicle, bool isEnemyVehicle=FALSE)
IF CAN_ADVANCE_MISSION()
RETURN CREATE_BLIP_FOR_VEHICLE(vehicle, isEnemyVehicle)
ENDIF
RETURN NULL
ENDFUNC
FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_PED(PED_INDEX ped, BOOL isEnemyPed=FALSE)
IF CAN_ADVANCE_MISSION()
RETURN CREATE_BLIP_FOR_PED(ped, isEnemyPed)
ENDIF
RETURN NULL
ENDFUNC
FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_OBJECT(OBJECT_INDEX object)
IF CAN_ADVANCE_MISSION()
RETURN CREATE_BLIP_FOR_OBJECT(object)
ENDIF
RETURN NULL
ENDFUNC
FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_COORD(VECTOR vCoords, BOOL bSetRoute = FALSE)
IF CAN_ADVANCE_MISSION()
RETURN CREATE_BLIP_FOR_COORD(vCoords, bSetRoute)
ENDIF
RETURN NULL
ENDFUNC
FUNC BOOL TRIGGER_MISSION_MUSIC_EVENT(STRING sEvent)
RETURN TRIGGER_MUSIC_EVENT(sEvent)
ENDFUNC
// get michael ped
FUNC PED_INDEX GET_MICHAEL_PED()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
RETURN PLAYER_PED_ID()
ELSE
RETURN sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
ENDIF
RETURN NULL
ENDFUNC
// get trevor ped
FUNC PED_INDEX GET_TREVOR_PED()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
RETURN PLAYER_PED_ID()
ELSE
RETURN sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ENDIF
RETURN NULL
ENDFUNC
// get a weapon enum as a weapontype
FUNC WEAPON_TYPE GET_TRAIN_CRASH_WEAPON_TYPE(TRAIN_CRASH_WEAPON_ENUM weapon)
SWITCH weapon
CASE TC_WEAPON_SMG
RETURN WEAPONTYPE_MICROSMG
BREAK
CASE TC_WEAPON_PISTOL
RETURN WEAPONTYPE_PISTOL
BREAK
CASE TC_WEAPON_SHOTGUN
RETURN WEAPONTYPE_SAWNOFFSHOTGUN
BREAK
CASE TC_WEAPON_STICKY_BOMB
RETURN WEAPONTYPE_STICKYBOMB
BREAK
CASE TC_WEAPON_MERC_RIFLE
RETURN WEAPONTYPE_CARBINERIFLE
BREAK
CASE TC_WEAPON_MG
RETURN WEAPONTYPE_COMBATMG
BREAK
CASE TC_WEAPON_SNIPER_RIFLE
RETURN WEAPONTYPE_SNIPERRIFLE
BREAK
CASE TC_WEAPON_BACKUP_RIFLE
RETURN WEAPONTYPE_ASSAULTRIFLE
BREAK
CASE TC_WEAPON_CASE
RETURN WEAPONTYPE_BRIEFCASE
BREAK
ENDSWITCH
RETURN WEAPONTYPE_UNARMED
ENDFUNC
// remove trevor MG
PROC REMOVE_TREVOR_MG()
PRINTSTRING("REMOVE MG") PRINTNL()
PED_INDEX trevorPed = GET_TREVOR_PED()
WEAPON_TYPE MGWeapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)
SET_PED_INFINITE_AMMO(trevorPed, FALSE)
IF NOT IS_PED_INJURED(trevorPed)
SET_PED_INFINITE_AMMO_CLIP(trevorPed, FALSE)
ENDIF
printstring("here1") PRINTNL()
IF HAS_PED_GOT_WEAPON(trevorPed, MGWeapon)
SET_PED_INFINITE_AMMO(trevorPed, FALSE, MGWeapon)
IF NOT IS_PED_INJURED(trevorPed)
printstring("here2") PRINTNL()
IF bCheckedInitialMG
printstring("here3") PRINTNL()
IF iInitialMGAmmo >= 0
printstring("here4") PRINTNL()
SET_CURRENT_PED_WEAPON(trevorPed, WEAPONTYPE_UNARMED, TRUE)
SET_PED_AMMO(trevorPed, MGWeapon, iInitialMGAmmo)
ELSE
printstring("here5") PRINTNL()
SET_CURRENT_PED_WEAPON(trevorPed, WEAPONTYPE_UNARMED, TRUE)
REMOVE_WEAPON_FROM_PED(trevorPed, MGWeapon)
ENDIF
ELSE
printstring("here6") PRINTNL()
SET_CURRENT_PED_WEAPON(trevorPed, WEAPONTYPE_UNARMED, TRUE)
REMOVE_WEAPON_FROM_PED(trevorPed, MGWeapon)
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(trevorPed)
SET_CURRENT_PED_WEAPON(trevorPed, WEAPONTYPE_UNARMED, TRUE)
SET_PED_CURRENT_WEAPON_VISIBLE(trevorPed, FALSE)
ENDIF
IF HAS_PED_GOT_WEAPON(trevorPed, WEAPONTYPE_MG)
IF iInitialMGAmmo >= 0
IF NOT IS_PED_INJURED(trevorPed)
SET_PED_AMMO(trevorPed, WEAPONTYPE_MG, iInitialMGAmmo)
ENDIF
ENDIF
SET_PED_INFINITE_AMMO(trevorPed, FALSE, WEAPONTYPE_MG)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
ENDIF
STORE_PLAYER_PED_WEAPONS(trevorPed)
ENDPROC
// suppress vehicles
PROC SUPPRESS_MISSION_VEHICLES(BOOL bSuppress, BOOL bDoCountryVehicles = FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BIKE), bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL_CAR), bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BEACH_CAR), bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BEACH_TRUCK), bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_CAR), bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_TRUCK), bSuppress)
SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), bSuppress)
SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ENGINEER), bSuppress)
IF bDoCountryVehicles
OR NOT bSuppress
SET_VEHICLE_MODEL_IS_SUPPRESSED(PRANGER, bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(SCORCHER, bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(BLAZER, bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(CUBAN800, bSuppress)
SET_VEHICLE_MODEL_IS_SUPPRESSED(LAZER, bSuppress)
ENDIF
ENDPROC
// set player out of any vehicle
PROC SET_PLAYER_OUT_OF_ANY_VEHICLE()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VECTOR vCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<vCoords.x, vCoords.y, vCoords.z + 1>>)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
ENDIF
ENDPROC
// disable/reenable cargens
PROC ENABLE_CARGENS_FOR_MISSION(BOOL bEnable)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-1643, 4346, -10>>, <<-1570, 4432, 100>>, bEnable)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-42, 6240, -10>>, <<118, 6365, 100>>, bEnable)
ENDPROC
// switch off roads for mission
PROC SET_MISSION_ROADS_OFF(BOOL bSwitchOff)
INT i
VECTOR vMin
VECTOR vMax
REPEAT 2 i
SWITCH i
CASE 0
vMin = <<2777.7, 4396.9, 30.0>>
vMax = <<2799.2, 4427.3, 80.0>>
BREAK
CASE 1
vMin = <<2914.04346, 4436.28662, 0.21060>>
vMax = <<2991.63892, 4757.14990, 100.69784>>
BREAK
ENDSWITCH
IF bSwitchOff
SET_ROADS_IN_AREA(vMin, vMax, FALSE)
ELSE
SET_ROADS_BACK_TO_ORIGINAL(vMin, vMax)
ENDIF
ENDREPEAT
ENDPROC
FUNC STRING GET_TRAIN_CRASH_AUDIO_SCENE_AS_STRING(TRAIN_CRASH_AUDIO_SCENE_ENUM thisScene)
SWITCH thisScene
CASE TRAIN_CRASH_AUDIO_SCENE_BIKE_START
RETURN "EXILE_3_TREVOR_BIKE_START"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN
RETURN "EXILE_3_TREVOR_BIKE_SEE_TRAIN"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP
RETURN "EXILE_3_TREVOR_BIKE_JUMP"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE
RETURN "EXILE_3_TREVOR_GET_TO_ENGINE"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_HIJACK_TRAIN
RETURN "EXILE_3_HIJACK_TRAIN"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_RIDE_TRAIN
RETURN "EXILE_3_TREVOR_TRAIN_RIDE"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL
RETURN "EXILE_3_TRAIN_ACCEL_CONTROL_SCENE"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL
RETURN "EXILE_3_TRAIN_DECEL_CONTROL_SCENE"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_GET_TO_BRIDGE
RETURN "EXILE_3_MICHAEL_GET_TO_BRIDGE"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_COLLISION
RETURN "EXILE_3_TRAIN_COLLISION"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_RAYFIRE
RETURN "EXILE_3_RAYFIRE"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_PLANT_BOMB
RETURN "EXILE_3_PLANT_BOMB"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL
RETURN "EXILE_3_DEFEND_MICHAEL"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR
RETURN "EXILE_3_RAPIDS_CHASE_TREVOR"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL
RETURN "EXILE_3_RAPIDS_CHASE_MICHAEL"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_GET_TO_BEACH
RETURN "EXILE_3_GET_TO_BEACH"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_HELI_1
RETURN "EXILE_3_HELI_ARRIVES_01"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_HELI_2
RETURN "EXILE_3_HELI_ARRIVES_02"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_HELI_3
RETURN "EXILE_3_HELI_ARRIVES_03"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_HELI_4
RETURN "EXILE_3_HELI_ARRIVES_04"
BREAK
CASE TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL
RETURN "EXILE_3_TRAIN_FALL"
BREAK
ENDSWITCH
RETURN ""
ENDFUNC
// start train crash audio scene
FUNC BOOL START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_ENUM thisScene)
RETURN START_AUDIO_SCENE(GET_TRAIN_CRASH_AUDIO_SCENE_AS_STRING(thisScene))
ENDFUNC
// stop train crash audio scene
PROC STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_ENUM thisScene)
STOP_AUDIO_SCENE(GET_TRAIN_CRASH_AUDIO_SCENE_AS_STRING(thisScene))
ENDPROC
// stop all train crash audio scenes
PROC STOP_ALL_TRAIN_CRASH_AUDIO_SCENES()
INT i
REPEAT COUNT_OF(TRAIN_CRASH_AUDIO_SCENE_ENUM) i
STOP_TRAIN_CRASH_AUDIO_SCENE(INT_TO_ENUM(TRAIN_CRASH_AUDIO_SCENE_ENUM, i))
ENDREPEAT
ENDPROC
// multiply 2 script quaternions
/*
FUNC SCRIPT_QUAT MULTIPLY_SCRIPT_QUATS(SCRIPT_QUAT quat1, SCRIPT_QUAT quat2)
SCRIPT_QUAT returnQuat
returnQuat.w = (quat1.w * quat2.w) - (quat1.x * quat2.x) - (quat1.y * quat2.y) - (quat1.z * quat2.z)
returnQuat.x = (quat1.w * quat2.x) + (quat1.x * quat2.w) + (quat1.y * quat2.z) - (quat1.z * quat2.y)
returnQuat.y = (quat1.w * quat2.y) + (quat1.y * quat2.w) + (quat1.z * quat2.x) - (quat1.x * quat2.z)
returnQuat.z = (quat1.w * quat2.z) + (quat1.z * quat2.w) + (quat1.x * quat2.y) - (quat1.y * quat2.x)
RETURN returnQuat
ENDFUNC
// convert vector to quaternion
FUNC SCRIPT_QUAT CONVERT_ROTATION_TO_SCRIPT_QUAT(VECTOR vRot)
SCRIPT_QUAT xQuat, yQuat, zQuat
xQuat.w = COS(vRot.x/2)
xQuat.x = SIN(vRot.x/2)
xQuat.y = 0
xQuat.z = 0
yQuat.w = COS(vRot.y/2)
yQuat.x = 0
yQuat.y = SIN(vRot.y/2)
yQuat.z = 0
zQuat.w = COS(vRot.z/2)
zQuat.x = 0
xQuat.y = 0
zQuat.z = SIN(vRot.z/2)
RETURN MULTIPLY_SCRIPT_QUATS(MULTIPLY_SCRIPT_QUATS(xQuat, yQuat), zQuat)
ENDFUNC
*/
// make bike easy to land
PROC MAKE_BIKE_EASY_TO_LAND()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_BIKE], FALSE, FALSE, FALSE, TRUE, FALSE)
ENDIF
ENDPROC
// block the gps for jumps
PROC BLOCK_GPS_FOR_JUMPS()
SET_GPS_DISABLED_ZONE(<<2470.08276, 4942.88281, -43.04004>>, <<2561.70410, 5594.36475, 120.12917>>)
ENDPROC
// detach player from train
PROC DETACH_PLAYER_FROM_TRAIN()
IF (IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(PLAYER_PED_ID()) OR IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene))
AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND NOT GET_IS_PED_GADGET_EQUIPPED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
AND GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = NULL
// detach and set down player, hopefully somewhere he won't get whacked by a speeding train
IF IS_VEHICLE_DRIVEABLE(missionTrain)
VECTOR vDetachOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, <<2.3, 0, 1.0>>)
DETACH_ENTITY(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS_NO_OFFSET(PLAYER_PED_ID(), vDetachOffset)
ENDIF
ENDIF
ENDPROC
// remove blips
PROC REMOVE_ALL_BLIPS()
INT i
IF DOES_BLIP_EXIST(gotoBlip)
REMOVE_BLIP(gotoBlip)
ENDIF
IF DOES_BLIP_EXIST(trainBlip)
REMOVE_BLIP(trainBlip)
ENDIF
IF DOES_BLIP_EXIST(buddyBlip)
REMOVE_BLIP(buddyBlip)
ENDIF
IF DOES_BLIP_EXIST(containerBlip)
REMOVE_BLIP(containerBlip)
ENDIF
IF DOES_BLIP_EXIST(vehicleBlip)
REMOVE_BLIP(vehicleBlip)
ENDIF
REPEAT 2 i
IF DOES_BLIP_EXIST(carBlip[i])
REMOVE_BLIP(carBlip[i])
ENDIF
ENDREPEAT
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
CLEANUP_AI_PED_BLIP(enemyPed[i].blipStruct)
ENDREPEAT
/*
REPEAT COUNT_OF(ENEMY_VEHICLE_ENUM) i
IF DOES_BLIP_EXIST(enemyVehicle[i].blip)
REMOVE_BLIP(enemyVehicle[i].blip)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
IF DOES_BLIP_EXIST(enemyPed[i].blip)
REMOVE_BLIP(enemyPed[i].blip)
ENDIF
ENDREPEAT
*/
ENDPROC
// delete train stuff
PROC DELETE_TRAIN_CRASH_TRAINS(BOOL bHardDelete = TRUE)
// get rid of engineer
IF DOES_ENTITY_EXIST(engineerPed[0])
DELETE_PED(engineerPed[0])
ENDIF
// get rid of all trains
//DELETE_ALL_TRAINS()
//DELETE_MISSION_TRAINS()
IF bHardDelete
IF DOES_ENTITY_EXIST(missionTrain)
DELETE_MISSION_TRAIN(missionTrain)
ENDIF
IF DOES_ENTITY_EXIST(crashTrain)
DELETE_MISSION_TRAIN(crashTrain)
ENDIF
ELSE
IF DOES_ENTITY_EXIST(missionTrain)
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(missionTrain)
ENDIF
IF DOES_ENTITY_EXIST(crashTrain)
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(crashTrain)
ENDIF
ENDIF
ENDPROC
// common player and cam cleanup stuff
PROC DO_COMMON_PLAYER_AND_CAM_CLEANUP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_PLAYER_INVINCIBLE(PLAYER_ID(), FALSE)
ENDIF
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISABLE_CELLPHONE(FALSE)
RESET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
ENDPROC
// cleanup the mission
PROC MISSION_CLEANUP()
INT i
BLOCK_MISSION_TITLE(FALSE)
TRIGGER_MUSIC_EVENT("EXL3_MISSION_FAIL")
STOP_ALL_TRAIN_CRASH_AUDIO_SCENES()
SET_TIME_SCALE(1.0)
CLEAR_WEATHER_TYPE_PERSIST()
CLEAR_TIMECYCLE_MODIFIER()
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
SET_WIND(-1.0)
SET_WIND_DIRECTION(-1.0)
SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>)
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
REMOVE_MISSION_TEXT()
CASCADE_SHADOWS_INIT_SESSION()
WATER_OVERRIDE_SET_STRENGTH(0.0)
ALLOW_DIALOGUE_IN_WATER(FALSE)
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(FALSE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(wadePTFX)
STOP_PARTICLE_FX_LOOPED(wadePTFX)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX1)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX1)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX2)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX2)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX3)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX3)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisSplashPTFX)
STOP_PARTICLE_FX_LOOPED(debrisSplashPTFX)
ENDIF
SET_SEETHROUGH(FALSE)
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH, BUILDINGSTATE_NORMAL)
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH_2, BUILDINGSTATE_NORMAL)
//REQUEST_IPL("canyonriver01")
//REMOVE_IPL("canyonriver01_traincrash")
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_AUTO_GIVE_SCUBA_GEAR_WHEN_EXIT_VEHICLE(PLAYER_ID(), TRUE)
ENDIF
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_WATER_VEHICLE_SCUBA_GEAR_UNLOCKED, TRUE)
//IF bPreStreamingSeamlessCutscene
// REMOVE_CUTSCENE()
//ENDIF
REMOVE_COVER_POINT(islandCover)
IF STREAMVOL_IS_VALID(bridgeVolume)
STREAMVOL_DELETE(bridgeVolume)
ENDIF
//ALLOW_DIALOGUE_IN_WATER(FALSE)
IF gotoFoamState = GOTO_FOAM_STATE_WAITING
OR swapCarriageState = SWAP_CARRIAGE_STATE_WAITING
OR bStartedIPLSwap
IPL_GROUP_SWAP_CANCEL()
ENDIF
SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE)
// detach ped if he is attached to anything
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
RESET_PED_WEAPON_MOVEMENT_CLIPSET(PLAYER_PED_ID())
RESET_PED_MOVEMENT_CLIPSET(PLAYER_PED_ID())
SET_PED_INFINITE_AMMO_CLIP(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_GetOutUndriveableVehicle, TRUE)
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), FALSE)
IF currentMissionStage = STAGE_DRIVE_ALONG_TRAIN
OR (currentMissionStage = STAGE_GET_TO_BRIDGE AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR)
DETACH_PLAYER_FROM_TRAIN()
ELSE
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
IF NOT GET_IS_PED_GADGET_EQUIPPED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = NULL
// CLEAR_PED_TASKS(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//SET_PLAYER_WEAPON_DEFENSE_MODIFIER(PLAYER_ID(), 1.0)
//IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
// SET_PED_HELMET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
//ENDIF
DO_COMMON_PLAYER_AND_CAM_CLEANUP()
// kill anim cam
IF DOES_CAM_EXIST(animCam)
DESTROY_CAM(animCam)
ENDIF
// fix ptfx
REPEAT NUMBER_CRASH_FIRES i
IF bFirePTFXActive[i]
STOP_PARTICLE_FX_LOOPED(firePTFX[i])
ENDIF
ENDREPEAT
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
CLEAR_PARTICLE_FX_SHOOTOUT_BOAT()
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_VEHICLE_STRONG(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT bSuppressRemoveTrevorMG
REMOVE_TREVOR_MG()
ENDIF
ENDIF
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE))
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE))
ENDIF
//IF DOES_ENTITY_EXIST(dummyBoatPed)
// DELETE_PED(dummyBoatPed)
//ENDIF
IF DOES_ENTITY_EXIST(caseObject)
IF IS_ENTITY_ATTACHED(caseObject)
DETACH_ENTITY(caseObject)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_MICHAEL_CAR])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_MICHAEL_CAR], TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
SET_VEHICLE_HAS_STRONG_AXLES(trainCrashVehicle[TCV_BIKE], FALSE)
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[TCV_BIKE], TRUE)
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_BIKE], FALSE, FALSE, FALSE, FALSE, FALSE)
IF IS_ENTITY_ATTACHED(trainCrashVehicle[TCV_BIKE])
DETACH_ENTITY(trainCrashVehicle[TCV_BIKE])
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_DEFAULT)
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PLAYER_PED_ID(), FALSE)
SET_PED_DIES_IN_WATER(PLAYER_PED_ID(), TRUE)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_PROOFS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
IF bThoroughCleanup
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(engineerPed[0])
DELETE_PED(engineerPed[0])
ENDIF
// TEMP - REMOVE ALL CALLS TO THIS WHEN KENNETH HAS FIXED 210001
//SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
//REPEAT NUMBER_RAPPEL_ENEMIES i
// CLEANUP_RAPPEL(enemyRappelData[i].rappelData)
//ENDREPEAT
// reset trains
SET_RANDOM_BOATS(TRUE)
SET_RANDOM_TRAINS(TRUE)
SET_IGNORE_NO_GPS_FLAG(FALSE)
SUPPRESS_MISSION_VEHICLES(FALSE)
ENABLE_CARGENS_FOR_MISSION(TRUE)
SET_MISSION_ROADS_OFF(FALSE)
REMOVE_SCENARIO_BLOCKING_AREA(rapidsScenarioBlocking)
//REMOVE_SCENARIO_BLOCKING_AREA(beachScenarioBlocking)
REMOVE_SCENARIO_BLOCKING_AREA(roadScenarioBlocking)
REMOVE_SCENARIO_BLOCKING_AREA(road2ScenarioBlocking)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_MAX_WANTED_LEVEL(5)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
STOP_STREAM()
//IF mocapStreamingStage >= MOCAP_STREAMING_STAGE_WAIT
REMOVE_CUTSCENE()
//ENDIF
// delete trains
BOOL bHardDeleteTrains
IF NOT bThoroughCleanup
bHardDeleteTrains = FALSE
ELSE
bHardDeleteTrains = TRUE
ENDIF
DELETE_TRAIN_CRASH_TRAINS(bHardDeleteTrains)
//SET_MISSION_TRAINS_AS_NO_LONGER_NEEDED()
bHasContainerSwitchCamExplosionHappened = FALSE
#IF IS_DEBUG_BUILD
IF DOES_TEXT_WIDGET_EXIST(RBCamPosWidget)
DELETE_TEXT_WIDGET(RBCamPosWidget)
ENDIF
IF DOES_TEXT_WIDGET_EXIST(RBCamRotWidget)
DELETE_TEXT_WIDGET(RBCamRotWidget)
ENDIF
IF DOES_WIDGET_GROUP_EXIST(trainCrashWidgets)
DELETE_WIDGET_GROUP(trainCrashWidgets)
ENDIF
#ENDIF
TERMINATE_THIS_THREAD()
ENDPROC
// mission passed
PROC MISSION_PASSED()
Mission_Flow_Mission_Passed()
MISSION_CLEANUP()
ENDPROC
// mission failed
PROC MISSION_FAILED(FAIL_REASON_ENUM reasonForFail)
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_DINGHY])
IF IS_ENTITY_DEAD(trainCrashVehicle[TCV_DINGHY])
OR NOT IS_ENTITY_DEAD(trainCrashVehicle[TCV_DINGHY])
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
ENDIF
ENDIF
IF CAN_ADVANCE_MISSION()
REMOVE_ALL_BLIPS()
SET_TIME_SCALE(1.0)
REMOVE_MISSION_TEXT(TRUE, TRUE, TRUE, TRUE)
TRIGGER_MUSIC_EVENT("EXL3_MISSION_FAIL")
missionFailState = MISSION_FAIL_STATE_WAIT_FOR_FADE
savedFailReason = reasonForFail
STRING failText
SWITCH savedFailReason
CASE FAIL_MICHAEL_DEAD
failText = "CMN_MDIED"
BREAK
CASE FAIL_TREVOR_DEAD
failText = "CMN_TDIED"
BREAK
CASE FAIL_MISSED_JUMPS
failText = "TC_FAIL4"
BREAK
CASE FAIL_TRAIN_STOPPED
failText = "TC_FAIL5"
BREAK
CASE FAIL_TRAIN_DEAD
failText = "TC_FAIL6"
BREAK
CASE FAIL_LOST_TRAIN
failText = "TC_FAIL7"
BREAK
CASE FAIL_FELL_OFF_TRAIN
failText = "TC_FAIL3"
BREAK
CASE FAIL_CAR_DEAD
failText = "CMN_MDEST"
BREAK
CASE FAIL_BIKE_DEAD
failText = "TC_FAIL8"
BREAK
CASE FAIL_BOAT_DEAD
failText = "TC_FAIL9"
BREAK
CASE FAIL_BOAT_GROUNDED
failText = "TC_FAIL10"
BREAK
CASE FAIL_CONTAINER_INACCESSIBLE
failText = "TC_FAIL2"
BREAK
CASE FAIL_NO_STICKY_BOMBS
failText = "TC_FAIL1"
BREAK
CASE FAIL_ABANDONED_MICHAEL
failText = "TC_FAIL13"
BREAK
CASE FAIL_ABANDONED_TREVOR
failText = "TC_FAIL11"
BREAK
CASE FAIL_ABANDONED_CONTAINER
failText = "TC_FAIL14"
BREAK
CASE FAIL_ABANDONED_GETAWAY_VEHICLES
failText = "TC_FAIL15"
BREAK
CASE FAIL_ABANDONED_BIKE
failText = "TC_FAIL16"
BREAK
CASE FAIL_ABANDONED_DINGHY
failText = "TC_FAIL17"
BREAK
CASE FAIL_ABANDONED_ESCAPE_ROUTE
failText = "TC_FAIL18"
BREAK
CASE FAIL_BEACH_CAR_DEAD
failText = "TC_FAIL12"
BREAK
CASE FAIL_TOO_LATE_BRIDGE
failText = "TC_FAIL19"
BREAK
CASE FAIL_BIKE_STUCK
failText = "TC_FAIL20"
BREAK
CASE FAIL_RON_DEAD
failText = "TC_FAIL21"
BREAK
CASE FAIL_PATRICIA_DEAD
failText = "TC_FAIL22"
BREAK
ENDSWITCH
MISSION_FLOW_MISSION_FAILED_WITH_REASON(failText)
ENDIF
ENDPROC
// remove bike blip and text
PROC REMOVE_BIKE_BLIP_AND_TEXT()
IF DOES_BLIP_EXIST(vehicleBlip)
REMOVE_BLIP(vehicleBlip)
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETBCKBK")
OR IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETINBK")
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
ENDIF
ENDPROC
// remove dinghy blip and text
PROC REMOVE_DINGHY_BLIP_AND_TEXT()
IF DOES_BLIP_EXIST(vehicleBlip)
REMOVE_BLIP(vehicleBlip)
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_DINGHY2")
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_DINGHY")
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
ENDIF
ENDPROC
// get mission vector
FUNC VECTOR GET_TRAIN_CRASH_VECTOR(TRAIN_CRASH_VECTOR_ENUM tcVec)
SWITCH tcVec
CASE TCVEC_PLAYER_INIT
RETURN <<1981.93579, 3818.08301, 31.31574>>//<<1985.25, 3825.79, 31.34>>
BREAK
CASE TCVEC_MICHAEL_INIT
RETURN <<1982.97742, 3822.15894, 31.45785>>//<<1982.69, 3833.00, 31.43>>
BREAK
CASE TCVEC_MICHAEL_AT_CONTAINER
RETURN <<-490.92, 4434.74, 30.25>>
BREAK
CASE TCVEC_MICHAEL_IN_CONTAINER
RETURN <<-492.81, 4436.04, 30.00>>
BREAK
CASE TCVEC_BIKE_INIT
RETURN <<1984.80, 3826.80, 31.59>>
BREAK
CASE TCVEC_BIKE_CHASE
RETURN <<2980.71, 4623.17, 52.01>>
BREAK
CASE TCVEC_MICHAEL_CAR_INIT
RETURN <<1984.40, 3831.00, 32.10>>
BREAK
CASE TCVEC_MICHAEL_AT_BEACH
RETURN <<-2566.23, 3687.51, 1.27>>
BREAK
CASE TCVEC_SECOND_TRAIN_INIT
RETURN <<-496.65, 4294.85, 87.97>>
BREAK
CASE TCVEC_TRAIN_CRASH_INIT
RETURN <<-533.65, 4563.88, 87.87>>
BREAK
CASE TCVEC_BIKE_DRIVE_ALONG_TRAIN
RETURN <<2340.45142, 5952.72852, 59.92357>>
BREAK
CASE TCVEC_PURSUIT_FOLLOW_STAGE
RETURN <<1211.04370, 6435.66943, 30.60235>>
BREAK
CASE TCVEC_TREVOR_BRIDGE
RETURN <<-522.08, 4463.91, 88.02>>
BREAK
CASE TCVEC_TREVOR_WATER
RETURN <<-482.89, 4396.48, 29.62>>
BREAK
CASE TCVEC_TREVOR_IN_WATER_INIT
RETURN <<-488.70, 4415.90, 29.0>>
BREAK
CASE TCVEC_TREVOR_SHOOTOUT_INIT
RETURN <<-485.32956, 4399.53662, 30.39912>>
BREAK
CASE TCVEC_TREVOR_SHOOTOUT_INIT_REPLAY
RETURN <<-485.2, 4400.3, 30.4>>//<<-485.11133, 4399.73877, 30.66846>>
BREAK
CASE TCVEC_TREVOR_AT_BEACH
RETURN <<-2570.33, 3684.61, 1.32>>
BREAK
CASE TCVEC_BRIDGE_TRIGGER
RETURN <<-502.94, 4426.99, 30.93>>//<<-480.40, 4432.08, 26.72>>
BREAK
CASE TCVEC_DINGHY_INIT
RETURN vDinghyInitLoc//<<530.5, 3922.2, 30.7>>//<<638.6, 3882.0, 30.6>> //<<608.76, 3894.39, 30.73>>
BREAK
CASE TCVEC_DINGHY_AT_BRIDGE
RETURN <<-402.89, 4441.2, 29.40>>
BREAK
CASE TCVEC_DINGHY_AT_CONTAINER
//RETURN <<-488.87, 4432.35, 30.0388>>
RETURN << -489.47, 4432.35, 30.0388 >>
BREAK
CASE TCVEC_DINGHY_AT_CONTAINER_ROTATION
RETURN <<0, 0, 156.682>>
BREAK
CASE TCVEC_DINGHY_AT_RAPIDS
RETURN <<-492.51, 4402.91, 29.73>>
BREAK
CASE TCVEC_DINGHY_AT_BEACH
RETURN <<-2174.28, 4753.77, -0.23>>
BREAK
CASE TCVEC_BEACH_CAR_INIT
RETURN <<-2522.44, 3657.84, 11.94>>
BREAK
CASE TCVEC_SILOS
RETURN <<2853.61, 4426.40, 47.94>>
BREAK
CASE TCVEC_PATH_START
RETURN <<2703.25, 5245.23, 61.06>>
BREAK
CASE TCVEC_RAPPEL_ANCHOR_POS
RETURN <<-499.27, 4412.00, 85.38>>
BREAK
CASE TCVEC_RAPPEL_ANCHOR_ROT
RETURN <<0,-5,0>>
BREAK
CASE TCVEC_CONTAINER_IN_RIVER
RETURN <<-493.91, 4414.20, 29.73>>
BREAK
CASE TCVEC_ACCESS_CONTAINER
RETURN <<-489.11, 4434.11, 30.32>>
BREAK
CASE TCVEC_BLIP_CONTAINER
RETURN <<-491.36, 4435.06, 30.00>>
BREAK
CASE TCVEC_IN_CONTAINER
RETURN <<-487.96, 4416.91, 29.93>>
BREAK
CASE TCVEC_PACKAGE
RETURN <<-486.43, 4414.22, 30.33>>
BREAK
CASE TCVEC_BOAT_ATTACH
RETURN <<0,-1.5,1.2>>
BREAK
CASE TCVEC_RIVER_MOUTH
RETURN <<-1770.94849, 4546.36279, 0.90>>
BREAK
CASE TCVEC_BEACH
RETURN <<-2464.23315, 4261.13916, 0.96957>>
BREAK
CASE TCVEC_BEACH_VEHICLES
RETURN <<-2431.49976, 4255.95166, 5.46902>>
BREAK
CASE TCVEC_RON_HOUSE
RETURN <<1679.28, 3726.58, 32.94>>
BREAK
CASE TCVEC_CLIMB_DOWN_START
RETURN <<-515.01, 4441.82, 88.99>>
BREAK
CASE TCVEC_ATTACH_BIKE_OFFSET
RETURN <<1.92, 3.27, -0.79>>
BREAK
CASE TCVEC_TRAIN_SWAY_INIT
RETURN <<-86.99, 0.0, -92.21>>
BREAK
CASE TCVEC_TRAIN_CAM_ATTACH
RETURN <<2.4, 0.0, 2.0>>
BREAK
CASE TCVEC_TRAIN_CAM_POINT
RETURN <<1.0,12.0,0.0>>
BREAK
CASE TCVEC_CRASH
RETURN <<-498.81, 4429.76, 30.9>>
BREAK
CASE TCVEC_GUNS_CHOPPER_HOVER
RETURN <<-513.18, 4406.67, 34.53>>//<<-472.80, 4435.28, 32.45>>
BREAK
CASE TCVEC_DROPOFF_CHOPPER_HOVER
RETURN <<-485.96, 4445.42, 40.72>>//<<-472.80, 4435.28, 32.45>>
BREAK
CASE TCVEC_MOVE_LAST_PLAYER_VEHICLE
RETURN <<1977.52, 3827.25, 31.34350>>
BREAK
CASE TCVEC_CONTAINER_ANIM_POS
RETURN <<-489.69, 4435.79, 30.59>>
BREAK
CASE TCVEC_CONTAINER_ANIM_ROT
RETURN <<0,0,64.2>>
BREAK
CASE TCVEC_TAKE_COVER
RETURN <<-485.27374, 4399.02393, 30.65386>>
BREAK
CASE TCVEC_INIT_BIKE_CAM_OFFSET
RETURN <<0.5, 3.0, 0>>
BREAK
CASE TCVEC_END_BIKE_CAM_OFFSET
RETURN <<0.5, 2.2, 0>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
// is boat at beach
FUNC BOOL IS_BOAT_AT_BEACH(BOOL bIncrement)
IF IS_ENTITY_IN_ANGLED_AREA(trainCrashVehicle[TCV_DINGHY], <<-2406.739, 4235.841, -10.000>>, <<-2474.212, 4272.588, 15.000>>, 180.0)
RETURN TRUE
ELIF IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH), <<300,300,300>>, FALSE, FALSE) AND NOT IS_ENTITY_IN_WATER(trainCrashVehicle[TCV_DINGHY])
IF bIncrement
fForceBeachTime = fForceBeachTime +@ 1.0
ENDIF
IF fForceBeachTime >= 4.0
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// headsets
PROC SET_PLAYER_PED_WITH_HEADSET(enumCharacterList headSetCharacter, BOOL bHasHeadset)
PED_INDEX headsetPed
PED_COMP_NAME_ENUM componentEnum
SWITCH headSetCharacter
CASE CHAR_MICHAEL
componentEnum = PROPS_P0_HEADSET
BREAK
CASE CHAR_FRANKLIN
componentEnum = PROPS_P1_HEADSET
BREAK
CASE CHAR_TREVOR
componentEnum = PROPS_P2_HEADSET
BREAK
ENDSWITCH
IF GET_CURRENT_PLAYER_PED_ENUM() = headSetCharacter
headsetPed = PLAYER_PED_ID()
ELSE
headsetPed = sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(headSetCharacter)]
ENDIF
IF NOT IS_PED_INJURED(headsetPed)
IF bHasHeadset
SET_PED_COMP_ITEM_CURRENT_SP(headsetPed, COMP_TYPE_PROPS, componentEnum)
ELSE
REMOVE_PED_COMP_ITEM_SP(headsetPed, COMP_TYPE_PROPS, componentEnum)
ENDIF
ENDIF
ENDPROC
// check all peds and vehicles for fail
PROC HANDLE_MISSION_FAIL_CHECKS()
INT i
IF NOT bRunningCutscene
// character peds
REPEAT COUNT_OF(sSelectorPeds.pedID) i
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i])
IF IS_PED_INJURED(sSelectorPeds.pedID[i])
enumCharacterList injuredChar = INT_TO_ENUM(enumCharacterList, i)
IF injuredChar <> GET_CURRENT_PLAYER_PED_ENUM()
IF DOES_BLIP_EXIST(buddyBlip)
REMOVE_BLIP(buddyBlip)
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_GETTREV")
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_GETMIKE")
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_SWCHM")
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_SWCHT")
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_WAITT")
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
ENDIF
SWITCH injuredChar
CASE CHAR_MICHAEL
// michael
IF currentMissionStage >= STAGE_GET_TO_BRIDGE
OR currentMissionStage <= STAGE_CHASE_TRAIN
MISSION_FAILED(FAIL_MICHAEL_DEAD)
ENDIF
BREAK
CASE CHAR_TREVOR
// trevor
MISSION_FAILED(FAIL_TREVOR_DEAD)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDREPEAT
// vehicles
REPEAT COUNT_OF(trainCrashVehicle) i
TRAIN_CRASH_VEHICLE_ENUM vEnum = INT_TO_ENUM(TRAIN_CRASH_VEHICLE_ENUM, i)
IF NOT IS_VEHICLE_DRIVEABLE(trainCrashVehicle[i])
SWITCH vEnum
CASE TCV_BIKE
// bike
IF currentMissionStage <= STAGE_DRIVE_ALONG_TRAIN
REMOVE_BIKE_BLIP_AND_TEXT()
MISSION_FAILED(FAIL_BIKE_DEAD)
ENDIF
BREAK
CASE TCV_MICHAEL_CAR
IF DOES_ENTITY_EXIST(trainCrashVehicle[i])
IF currentMissionStage = STAGE_INTERCEPT_TRAIN
MISSION_FAILED(FAIL_CAR_DEAD)
ENDIF
ENDIF
BREAK
CASE TCV_DINGHY
// boat
IF currentMissionStage >= STAGE_GET_TO_BRIDGE
IF currentMissionStage < STAGE_GET_HOME
OR NOT bDoneLeaveBoatWithCase
REMOVE_DINGHY_BLIP_AND_TEXT()
IF NOT HAS_PLAYER_LEFT_THE_WORLD(PLAYER_ID())
PED_INDEX trevorPed
trevorPed = GET_TREVOR_PED()
IF NOT IS_PED_INJURED(trevorPed)
IF IS_ENTITY_ATTACHED(trevorPed)
IF boatRPGState >= BOAT_RPG_GET_IN_POSITION AND boatRPGState <= BOAT_RPG_RETURN_TO_SEAT
DETACH_ENTITY(trevorPed)
ENDIF
ENDIF
ENDIF
MISSION_FAILED(FAIL_BOAT_DEAD)
ELSE
MISSION_FAILED(FAIL_ABANDONED_ESCAPE_ROUTE)
ENDIF
ENDIF
ENDIF
BREAK
CASE TCV_BEACH_CAR
CASE TCV_BEACH_TRUCK
// car
IF beachCreationStage = BEACH_CREATION_DONE
AND currentMissionStage >= STAGE_RAPIDS_CHASE
IF NOT bMichaelDroveOff
IF vEnum = TCV_BEACH_CAR
IF DOES_BLIP_EXIST(carblip[0])
REMOVE_BLIP(carblip[0])
ENDIF
ELSE
IF DOES_BLIP_EXIST(carblip[1])
REMOVE_BLIP(carblip[1])
ENDIF
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_CAR")
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
ENDIF
MISSION_FAILED(FAIL_BEACH_CAR_DEAD)
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
// stuck checks
SWITCH vEnum
CASE TCV_BIKE
// bike
IF currentMissionStage <= STAGE_CHASE_TRAIN
OR currentMissionStage = STAGE_GET_TO_BRIDGE
IF IS_VEHICLE_STUCK_TIMER_UP(trainCrashVehicle[i], VEH_STUCK_JAMMED, JAMMED_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(trainCrashVehicle[i], VEH_STUCK_HUNG_UP, HUNG_UP_TIME)
REMOVE_BIKE_BLIP_AND_TEXT()
MISSION_FAILED(FAIL_BIKE_STUCK)
ENDIF
ENDIF
BREAK
CASE TCV_DINGHY
// boat
IF currentMissionStage = STAGE_GO_TO_CONTAINER
OR currentMissionStage = STAGE_RAPIDS_CHASE
OR (currentMissionStage = STAGE_GET_HOME AND NOT (IS_BOAT_AT_BEACH(FALSE) OR bDoneLeaveBoatWithCase OR bGotToBeach))
OR (currentMissionStage = STAGE_GET_TO_BRIDGE AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
OR (currentMissionStage = STAGE_STEAL_FROM_CONTAINER AND bReadyToEscape)
IF IS_VEHICLE_STUCK_TIMER_UP(trainCrashVehicle[i], VEH_STUCK_JAMMED, JAMMED_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(trainCrashVehicle[i], VEH_STUCK_HUNG_UP, BEACHED_TIME)
REMOVE_DINGHY_BLIP_AND_TEXT()
MISSION_FAILED(FAIL_BOAT_GROUNDED)
ENDIF
ENDIF
BREAK
ENDSWITCH
// abandon checks
SWITCH vEnum
CASE TCV_BIKE
IF currentMissionStage <= STAGE_CHASE_TRAIN
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), trainCrashVehicle[i], FALSE) > STUCK_FAIL_RANGE_m
MISSION_FAILED(FAIL_ABANDONED_BIKE)
ENDIF
ENDIF
BREAK
CASE TCV_DINGHY
IF (currentMissionStage = STAGE_GET_TO_BRIDGE AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
OR (currentMissionStage = STAGE_GO_TO_CONTAINER AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
OR currentMissionStage = STAGE_RAPIDS_CHASE
OR (currentMissionStage = STAGE_STEAL_FROM_CONTAINER AND bReadyToEscape)
OR (currentMissionStage = STAGE_GET_HOME AND NOT (IS_BOAT_AT_BEACH(FALSE) OR bDoneLeaveBoatWithCase OR bGotToBeach))
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), trainCrashVehicle[i], FALSE) > STUCK_FAIL_RANGE_m
MISSION_FAILED(FAIL_ABANDONED_DINGHY)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDREPEAT
IF currentMissionStage < STAGE_GET_TO_BRIDGE
OR (currentMissionStage = STAGE_GET_TO_BRIDGE AND NOT bDoneJumpOff)
// trains
IF DOES_ENTITY_EXIST(missionTrain)
IF NOT IS_VEHICLE_DRIVEABLE(missionTrain)
MISSION_FAILED(FAIL_TRAIN_DEAD)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// handle the mission fail state
PROC HANDLE_MISSION_FAIL_STATE()
HANDLE_MISSION_FAIL_CHECKS()
SWITCH missionFailState
CASE MISSION_FAIL_STATE_NOT_FAILED
BREAK
CASE MISSION_FAIL_STATE_WAIT_FOR_FADE
// special fail speech
IF NOT bDoneFailSpeech
SWITCH savedFailReason
CASE FAIL_MISSED_JUMPS
IF IS_VEHICLE_DRIVEABLE(missionTrain)
VEHICLE_INDEX lastCarriage
lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
IF IS_VEHICLE_DRIVEABLE(lastCarriage)
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<140,140,140>>, FALSE, FALSE)
IF (IS_ENTITY_ON_SCREEN(lastCarriage) AND NOT IS_ENTITY_OCCLUDED(lastCarriage))
OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<30,30,30>>)
bDoneFailSpeech = DO_MISSION_SPEECH("EXL3_NOJUMPS", FALSE, 0, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE FAIL_TOO_LATE_BRIDGE
IF trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
bDoneFailSpeech = DO_MISSION_SPEECH("EXL3_MISSEDW", FALSE, 0, FALSE, TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
// safe to cleanup
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
ENDIF
// get rid of hanging carriage
IF DOES_ENTITY_EXIST(hangingCarriageVehicle)
DELETE_VEHICLE(hangingCarriageVehicle)
ENDIF
SET_PLAYER_PED_WITH_HEADSET(GET_CURRENT_PLAYER_PED_ENUM(), FALSE)
// 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
SWITCH currentMissionStage
CASE STAGE_GET_TO_BRIDGE
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-129.66879, 6216.20801, 30.20451>>, 28.3)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-130.09, 6220.78, 30.62437>>, 45.9)
ENDIF
BREAK
CASE STAGE_RAPIDS_CHASE
CASE STAGE_GET_HOME
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
BOOL bCreateAtRoad
bCreateAtRoad = TRUE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
OR (boatRPGState >= BOAT_RPG_GET_IN_POSITION AND boatRPGState <= BOAT_RPG_RETURN_TO_SEAT)
PED_INDEX driverPed
driverPed = GET_PED_IN_VEHICLE_SEAT(trainCrashVehicle[TCV_DINGHY])
IF DOES_ENTITY_EXIST(driverPed)
DELETE_PED(driverPed)
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
bCreateAtRoad = FALSE
ENDIF
ENDIF
IF bCreateAtRoad
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-2236.63208, 4322.58154, 47.55075>>, -78.1)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-2231.14, 4321.16, 47.99>>, -20.8)
ENDIF
ENDIF
BREAK
ENDSWITCH
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, bHasChanged)
bThoroughCleanup = TRUE
MISSION_CLEANUP() // must only take 1 frame and terminate the thread
ELSE
//Maintain anything that could look weird during fade out (e.g. enemies walking off).
ENDIF
BREAK
ENDSWITCH
ENDPROC
// do train speed
PROC HANDLE_TRAIN_SPEED()
#IF IS_DEBUG_BUILD
IF NOT bDebugOverrideSpeed
#ENDIF
IF currentMissionStage <= STAGE_GET_TO_BRIDGE
IF cutsceneStage <> TC_CUT_STAGE_RUNNING
OR bStopTrain
IF IS_VEHICLE_DRIVEABLE(missionTrain)
VECTOR vFrontCarriagePos = GET_ENTITY_COORDS(missionTrain)
VECTOR vRearCarriagePos = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE))
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR vPlayerOffsetFromRearCarriage = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE), vPlayerPos)
FLOAT fDistanceToFront
FLOAT fDistanceToRear
FLOAT fTrainTargetSpeed
// check is past silos
IF NOT bTrainIsPastSilos
IF vRearCarriagePos.y >= 4550.00
bTrainIsPastSilos = TRUE
ENDIF
ENDIF
// if following the train, tweak speed so rubberbands catchup
SWITCH currentMissionStage
CASE STAGE_INTERCEPT_TRAIN
CASE STAGE_CHASE_TRAIN
IF NOT bRunningCutscene
fDistanceToFront = GET_DISTANCE_BETWEEN_COORDS(vFrontCarriagePos, vPlayerPos)
fDistanceToRear = GET_DISTANCE_BETWEEN_COORDS(vRearCarriagePos, vPlayerPos)
//PRINTSTRING("front = ") PRINTFLOAT(fDistanceToFront) PRINTNL()
//PRINTSTRING("rear = ") PRINTFLOAT(fDistanceToRear) PRINTNL()
SWITCH trainMovementState
CASE TRAIN_MOVEMENT_STOPPED
// set vehicle density
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.8)
IF fDistanceToRear <= 540
OR fDistanceToFront <= 550
trainMovementState = TRAIN_MOVEMENT_VERY_SLOW
iTrainMovementStartTime = GET_GAME_TIMER()
ELSE
fTrainTargetSpeed = 0.0
ENDIF
BREAK
CASE TRAIN_MOVEMENT_VERY_SLOW
IF fDistanceToRear <= 400
trainMovementState = TRAIN_MOVEMENT_SLOW
ELSE
IF fDistanceToRear <= 450
fTrainTargetSpeed = 12.0
ELSE
fTrainTargetSpeed = 10.0
ENDIF
ENDIF
BREAK
CASE TRAIN_MOVEMENT_SLOW
IF fDistanceToRear <= 300
trainMovementState = TRAIN_MOVEMENT_FAST
ELSE
IF fDistanceToRear <= 350
fTrainTargetSpeed = 21.0
ELSE
fTrainTargetSpeed = 20.0
ENDIF
ENDIF
BREAK
CASE TRAIN_MOVEMENT_FAST
IF vRearCarriagePos.y >= 5248.0
trainMovementState = TRAIN_MOVEMENT_CATCHUP
ELIF vRearCarriagePos.y >= 4918.0
IF vPlayerOffsetFromRearCarriage.y < 0
IF fDistanceToRear > 300
fTrainTargetSpeed = 14
ELIF fDistanceToRear > 150
fTrainTargetSpeed = 22
ELIF fDistanceToRear > 60
fTrainTargetSpeed = 26
ELIF fDistanceToRear > 40
fTrainTargetSpeed = 27
ELIF fDistanceToRear > 28
fTrainTargetSpeed = 28
ELSE
fTrainTargetSpeed = 29
ENDIF
ELSE
fTrainTargetSpeed = 30
ENDIF
ELSE
IF vPlayerOffsetFromRearCarriage.y < 0
IF fDistanceToRear > 300
fTrainTargetSpeed = 12
ELIF fDistanceToRear > 150
fTrainTargetSpeed = 21
ELIF fDistanceToRear > 60
fTrainTargetSpeed = 26
ELIF fDistanceToRear > 40
fTrainTargetSpeed = 27
ELIF fDistanceToRear > 28
fTrainTargetSpeed = 28
ELSE
fTrainTargetSpeed = 29//32
ENDIF
ELSE
fTrainTargetSpeed = 30//33
ENDIF
ENDIF
BREAK
CASE TRAIN_MOVEMENT_CATCHUP
IF fDistanceToRear > 140
AND vPlayerOffsetFromRearCarriage.y < 0
fTrainTargetSpeed = 10
ELIF fDistanceToRear > 70
AND vPlayerOffsetFromRearCarriage.y < 0
SWITCH iCurrentJump
CASE 0
fTrainTargetSpeed = 12//15
BREAK
CASE 1
fTrainTargetSpeed = 11//14
BREAK
CASE 2
fTrainTargetSpeed = 10//13
BREAK
CASE 3
fTrainTargetSpeed = 9//12
BREAK
DEFAULT
fTrainTargetSpeed = 8//11
BREAK
ENDSWITCH
ELSE
SWITCH iCurrentJump
CASE 0
fTrainTargetSpeed = 16//23
BREAK
CASE 1
fTrainTargetSpeed = 15//22
BREAK
CASE 2
fTrainTargetSpeed = 14//21
BREAK
CASE 3
fTrainTargetSpeed = 13//20
BREAK
DEFAULT
fTrainTargetSpeed = 12//19
BREAK
ENDSWITCH
ENDIF
BREAK
ENDSWITCH
ENDIF
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
IF bStopTrain
fTrainTargetSpeed = 0
ELSE
fTrainTargetSpeed = DRIVE_ALONG_TRAIN_SPEED
ENDIF
BREAK
CASE STAGE_GET_TO_BRIDGE
IF trainHotswapState = TRAIN_HOTSWAP_ON_MICHAEL
IF bCreatedCrashTrain
fTrainTargetSpeed = GET_TO_BRIDGE_SLOW_TRAIN_SPEED
fTrainCruiseSpeed = GET_TO_BRIDGE_SLOW_TRAIN_SPEED
ELSE
fTrainTargetSpeed = 0
fTrainCruiseSpeed = 0
ENDIF
ELIF trainHotswapState = TRAIN_HOTSWAP_TO_MICHAEL
IF bCamHighEnoughToFreezeTrain
fTrainTargetSpeed = 0
fTrainCruiseSpeed = 0
ELSE
fTrainTargetSpeed = fTrainCruiseSpeed
ENDIF
ELIF trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
IF NOT IS_SELECTOR_ONSCREEN()
BOOL bTrainIsAcceleratingForAudio
BOOL bTrainIsDeceleratingForAudio
BOOL bBrakePressed
bBrakePressed = FALSE
IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
fTrainSpeedMod = fTrainSpeedMod +@ 0.2
IF fTrainSpeedMod > 1.0
fTrainSpeedMod = 1.0
bTrainIsAcceleratingForAudio = FALSE
ELSE
bTrainIsAcceleratingForAudio = TRUE
ENDIF
bTrainIsDeceleratingForAudio = FALSE
ELIF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
bBrakePressed = TRUE
fTrainSpeedMod = fTrainSpeedMod -@ 0.2
IF fTrainSpeedMod < 0.35
fTrainSpeedMod = 0.35
bTrainIsDeceleratingForAudio = FALSE
ELSE
bTrainIsDeceleratingForAudio = TRUE
ENDIF
bTrainIsAcceleratingForAudio = FALSE
ELSE
bTrainIsAcceleratingForAudio = FALSE
bTrainIsDeceleratingForAudio = FALSE
ENDIF
IF bBrakePressed
IF NOT bDoneBrakePressSound
PLAY_SOUND_FRONTEND(-1, "EXILE_3_TRAIN_BRAKE_PULL_MASTER")
bDoneBrakePressSound = TRUE
ENDIF
bDoneBrakeReleaseSound = FALSE
ELSE
IF NOT bDoneBrakeReleaseSound
PLAY_SOUND_FRONTEND(-1, "EXILE_3_TRAIN_BRAKE_RELEASE_MASTER")
bDoneBrakeReleaseSound = TRUE
ENDIF
bDoneBrakePressSound = FALSE
ENDIF
IF bTrainIsAcceleratingForAudio
fTrainAccelerationTime = fTrainAccelerationTime +@ 1.0
fTrainDecelerationTime = 0.0
IF NOT bDoneTrainAccelerationAudioScene
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL)
bDoneTrainAccelerationAudioScene = TRUE
bDoneTrainDecelerationAudioScene = FALSE
ELSE
SET_AUDIO_SCENE_VARIABLE("EXILE_3_TRAIN_ACCEL_CONTROL_SCENE","TimeAccelerateHeldDown", fTrainAccelerationTime)
//PRINTSTRING("accel = ") PRINTFLOAT(fTrainAccelerationTime) PRINTNL()
ENDIF
ELIF bTrainIsDeceleratingForAudio
fTrainDecelerationTime = fTrainDecelerationTime +@ 1.0
fTrainAccelerationTime = 0.0
IF NOT bDoneTrainDecelerationAudioScene
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL)
bDoneTrainDecelerationAudioScene = TRUE
bDoneTrainAccelerationAudioScene = FALSE
ELSE
SET_AUDIO_SCENE_VARIABLE("EXILE_3_TRAIN_DECEL_CONTROL_SCENE","TimeDecelerateHeldDown", fTrainDecelerationTime)
//PRINTSTRING("decel = ") PRINTFLOAT(fTrainDecelerationTime) PRINTNL()
ENDIF
ELSE
fTrainAccelerationTime = 0.0
fTrainDecelerationTime = 0.0
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL)
bDoneTrainDecelerationAudioScene = FALSE
bDoneTrainAccelerationAudioScene = FALSE
ENDIF
fTrainTargetSpeed = GET_TO_BRIDGE_TRAIN_SPEED * fTrainSpeedMod
ENDIF
ENDIF
BREAK
ENDSWITCH
FLOAT fAcceleration
FLOAT fDeceleration
IF currentMissionStage <= STAGE_CHASE_TRAIN
IF NOT bSlowDownTrainForCatchup
fAcceleration = TRAIN_CHASE_ACCELERATION
fDeceleration = TRAIN_CHASE_DECELERATION
ELSE
fAcceleration = TRAIN_CATCHUP_ACCELERATION
fDeceleration = TRAIN_CATCHUP_DECELERATION
ENDIF
ELIF currentMissionStage = STAGE_DRIVE_ALONG_TRAIN
fAcceleration = TRAIN_SABOTAGE_ACCELERATION
fDeceleration = TRAIN_SABOTAGE_DECELERATION
ELIF currentMissionStage = STAGE_GET_TO_BRIDGE
fAcceleration = 5.0
fDeceleration = 5.0
ELSE
fAcceleration = TRAIN_STANDARD_ACCELERATION
fDeceleration = TRAIN_STANDARD_DECELERATION
ENDIF
IF bStopTrain
fDeceleration = 12.0
ENDIF
// modify current cruise speed based on target
IF fTrainTargetSpeed < fTrainCruiseSpeed
fTrainCruiseSpeed = fTrainCruiseSpeed -@ fDeceleration
IF fTrainCruiseSpeed < fTrainTargetSpeed
fTrainCruiseSpeed = fTrainTargetSpeed
ENDIF
ELIF fTrainTargetSpeed > fTrainCruiseSpeed
fTrainCruiseSpeed = fTrainCruiseSpeed +@ fAcceleration
IF fTrainCruiseSpeed > fTrainTargetSpeed
fTrainCruiseSpeed = fTrainTargetSpeed
ENDIF
ENDIF
ENDIF
// set speed
IF IS_VEHICLE_DRIVEABLE(missionTrain)
SET_TRAIN_CRUISE_SPEED(missionTrain, fTrainCruiseSpeed)
SET_TRAIN_SPEED(missionTrain, fTrainCruiseSpeed)
PRINTSTRING("speed = ") PRINTFLOAT(fTrainCruiseSpeed) PRINTNL()
ENDIF
ENDIF
ENDIF
// override speed as requested by Klaas
#IF IS_DEBUG_BUILD
ELSE
IF NOT bDebugDontDoDistanceFail
bDebugDontDoDistanceFail = TRUE
ENDIF
IF IS_VEHICLE_DRIVEABLE(missionTrain)
SET_TRAIN_CRUISE_SPEED(missionTrain, fDebugOverrideSpeed)
SET_TRAIN_SPEED(missionTrain, fDebugOverrideSpeed)
ENDIF
ENDIF
#ENDIF
ENDPROC
// get closest train carriage to player
FUNC INT GET_CLOSEST_CARRIAGE(VECTOR vOverrideCoord, BOOL bOverrideCoord = FALSE)
INT i = EXILE3_LAST_CARRIAGE
INT iClosest = EXILE3_LAST_CARRIAGE
FLOAT fClosestDistance = 99999999
FLOAT fDistance
BOOL bDoneLoop = FALSE
VECTOR vCheckCoord
IF bOverrideCoord
vCheckCoord = vOverrideCoord
ELSE
vCheckCoord = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF IS_VEHICLE_DRIVEABLE(missionTrain)
WHILE NOT bDoneLoop
IF IS_VEHICLE_DRIVEABLE(GET_TRAIN_CARRIAGE(missionTrain, i))
fDistance = GET_DISTANCE_BETWEEN_COORDS(vCheckCoord, GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(missionTrain, i)), FALSE)
IF fDistance < fClosestDistance
fClosestDistance = fDistance
iClosest = i
ENDIF
ENDIF
i--
IF i < 0
bDoneLoop = TRUE
ENDIF
ENDWHILE
ENDIF
RETURN iClosest
ENDFUNC
PROC DO_DOORS_BLOW_OPEN(BOOL bSkip = FALSE)
IF DOES_ENTITY_EXIST(doorsObject)
PLAY_ENTITY_ANIM(doorsObject, "p_cs1_14b_train_s", "p_cs1_14b_train_s_break", INSTANT_BLEND_IN, FALSE, TRUE)
IF bSkip
WAIT(0)
IF IS_ENTITY_PLAYING_ANIM(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s")
SET_ENTITY_ANIM_CURRENT_TIME(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s", 1)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(doorCollisionObject)
DELETE_OBJECT(doorCollisionObject)
ENDIF
ENDIF
ENDPROC
PROC START_CRASH_PTFX()
IF NOT bFirePTFXActive[0]
firePTFX[0] = START_PARTICLE_FX_LOOPED_AT_COORD("scr_ex3_engine_fire", <<-507.46, 4452.73, 34.69>>, <<0,0,0>>)
bFirePTFXActive[0] = TRUE
ENDIF
IF NOT bFirePTFXActive[1]
firePTFX[1] = START_PARTICLE_FX_LOOPED_AT_COORD("scr_ex3_container_smoke", <<-494.47, 4433.65, 33.11>>, <<0,0,0>>)
bFirePTFXActive[1] = TRUE
ENDIF
ENDPROC
PROC START_DEBRIS_FX()
IF NOT bStartedDebrisFX
debrisFallPTFX1 = START_PARTICLE_FX_LOOPED_AT_COORD("ent_ray_train_falling_debris", <<-515.7, 4428.5, 88.0>>, <<0,0,0>>)
debrisFallPTFX2 = START_PARTICLE_FX_LOOPED_AT_COORD("ent_ray_train_falling_debris", <<-514.0, 4403.2, 88.0>>, <<0,0,0>>)
debrisFallPTFX3 = START_PARTICLE_FX_LOOPED_AT_COORD("ent_ray_train_falling_debris", <<-519.9, 4457.7, 88.0>>, <<0,0,0>>)
debrisSplashPTFX = START_PARTICLE_FX_LOOPED_AT_COORD("ent_ray_train_debris_splash", <<-506.1, 4414.6, 30.0>>, <<0,0,0>>)
bStartedDebrisFX = TRUE
ENDIF
ENDPROC
PROC SET_DEBRIS_EVOLUTION(FLOAT fEvolution)
SET_PARTICLE_FX_LOOPED_EVOLUTION(debrisFallPTFX1, "debris", fEvolution)
SET_PARTICLE_FX_LOOPED_EVOLUTION(debrisFallPTFX2, "debris", fEvolution)
SET_PARTICLE_FX_LOOPED_EVOLUTION(debrisFallPTFX3, "debris", fEvolution)
SET_PARTICLE_FX_LOOPED_EVOLUTION(debrisSplashPTFX, "splashes", fEvolution)
ENDPROC
// set train crash geo
PROC SET_TRAIN_CRASH_GEO(BOOL bOn, BOOL bCarriageHanging = TRUE, BOOL bCreateDoorCollision = FALSE, BOOL bSetFoam = TRUE, BOOL bSetPTFX = TRUE)
IF bOn
// geo
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH, BUILDINGSTATE_DESTROYED)
IF bSetFoam
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH_2, BUILDINGSTATE_DESTROYED)
ENDIF
//REQUEST_IPL("canyonriver01_traincrash")
//REMOVE_IPL("canyonriver01")
IF bCarriageHanging
IF NOT DOES_ENTITY_EXIST(hangingCarriageVehicle)
// create the hanging carriage
hangingCarriageVehicle = CREATE_VEHICLE(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_TRAIN_CONTAINER2), <<-509.800, 4453.300, 80.200>>)
SET_ENTITY_ROTATION(hangingCarriageVehicle, <<90.000, 0.000, 87.060>>)
SET_VEHICLE_COLOUR_COMBINATION(hangingCarriageVehicle, 2)
FREEZE_ENTITY_POSITION(hangingCarriageVehicle, TRUE)
ENDIF
ENDIF
// doors
IF NOT DOES_ENTITY_EXIST(doorsObject)
IF bCreateDoorCollision
doorsObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_CONTAINER_DOORS), <<0,1,2>>)
SET_ENTITY_COORDS(doorsObject,<<-491.690, 4434.900, 31.100>>)
SET_ENTITY_ROTATION(doorsObject,<<344.520, 343.820, 64.240>>)
FREEZE_ENTITY_POSITION(doorsObject, TRUE)
ELSE
CREATE_OPEN_DOORS()
ENDIF
ENDIF
IF bCreateDoorCollision
IF DOES_ENTITY_EXIST(doorCollisionObject)
DELETE_OBJECT(doorCollisionObject)
ENDIF
doorCollisionObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DOOR_COLLISION_SHUT), <<0,1,2>>)
SET_ENTITY_COORDS(doorCollisionObject, GET_ENTITY_COORDS(doorsObject))
SET_ENTITY_ROTATION(doorCollisionObject, GET_ENTITY_ROTATION(doorsObject))
FREEZE_ENTITY_POSITION(doorCollisionObject, TRUE)
ENDIF
// ptfx
IF bSetPTFX
START_CRASH_PTFX()
ENDIF
ELSE
IF DOES_ENTITY_EXIST(hangingCarriageVehicle)
DELETE_VEHICLE(hangingCarriageVehicle)
ENDIF
IF DOES_ENTITY_EXIST(doorsObject)
DELETE_OBJECT(doorsObject)
ENDIF
IF DOES_ENTITY_EXIST(doorCollisionObject)
DELETE_OBJECT(doorCollisionObject)
ENDIF
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH, BUILDINGSTATE_NORMAL)
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH_2, BUILDINGSTATE_NORMAL)
//REQUEST_IPL("canyonriver01")
//REMOVE_IPL("canyonriver01_traincrash")
ENDIF
ENDPROC
// get crate inside car pos
FUNC VECTOR GET_CRATE_POS(INT i)
SWITCH i
CASE 0
RETURN <<-495.07, 4436.97, 29.53>>
BREAK
CASE 1
RETURN <<-497.61, 4437.93, 29.63>>
BREAK
CASE 2
RETURN <<-497.34, 4436.72, 29.56>>
BREAK
CASE 3
RETURN <<-496.85, 4437.59, 28.82>>
BREAK
CASE 4
RETURN <<-499.36, 4439.40, 28.67>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
// get crate inside car rot
FUNC VECTOR GET_CRATE_ROT(INT i)
SWITCH i
CASE 0
RETURN <<-15.11, 0.0, -134.85>>
BREAK
CASE 1
RETURN <<20.76, 0.0, 35.61>>
BREAK
CASE 2
RETURN <<3.25, 0.0, -103.47>>
BREAK
CASE 3
RETURN <<-48.92, 0.0, 87.75>>
BREAK
CASE 4
RETURN <<0.77, 0.0, -106.11>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
// create crates inside traincar
PROC CREATE_CRATES_INSIDE_TRAINCAR()
INT i
REPEAT NUMBER_CRATES i
crateBob[i].obj = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_CRATE), GET_CRATE_POS(i))
SWITCH i
CASE 0
crateBob[i].fDisplacement = 0.01
crateBob[i].fSpeed = 0.03
crateBob[i].iDir = 1
BREAK
CASE 1
crateBob[i].fDisplacement = -0.02
crateBob[i].fSpeed = -0.01
crateBob[i].iDir = -1
BREAK
CASE 2
crateBob[i].fDisplacement = 0
crateBob[i].fSpeed = 0.04
crateBob[i].iDir = 1
BREAK
CASE 3
crateBob[i].fDisplacement = -0.01
crateBob[i].fSpeed = 0.02
crateBob[i].iDir = 1
BREAK
CASE 4
crateBob[i].fDisplacement = 0.02
crateBob[i].fSpeed = 0
crateBob[i].iDir = -1
BREAK
ENDSWITCH
SET_ENTITY_ROTATION(crateBob[i].obj, GET_CRATE_ROT(i))
FREEZE_ENTITY_POSITION(crateBob[i].obj, TRUE)
ENDREPEAT
ENDPROC
// remove crates inside traincar
PROC REMOVE_CRATES_INSIDE_TRAINCAR()
INT i
REPEAT NUMBER_CRATES i
IF DOES_ENTITY_EXIST(crateBob[i].obj)
DELETE_OBJECT(crateBob[i].obj)
ENDIF
ENDREPEAT
ENDPROC
// handle crates bobbing inside car
CONST_FLOAT CRATE_BOB_MAX_SPEED 0.05
CONST_FLOAT CRATE_BOB_ACCEL 0.09
CONST_FLOAT CRATE_BOB_MAX_DISPLACE 0.04
PROC HANDLE_CRATE_BOB()
INT i
REPEAT NUMBER_CRATES i
IF DOES_ENTITY_EXIST(crateBob[i].obj)
crateBob[i].fSpeed = crateBob[i].fSpeed +@ (CRATE_BOB_ACCEL * crateBob[i].iDir)
IF crateBob[i].fSpeed >= CRATE_BOB_MAX_SPEED
crateBob[i].fSpeed = CRATE_BOB_MAX_SPEED
ELIF crateBob[i].fSpeed <= -CRATE_BOB_MAX_SPEED
crateBob[i].fSpeed = -CRATE_BOB_MAX_SPEED
ENDIF
crateBob[i].fDisplacement = crateBob[i].fDisplacement +@ crateBob[i].fSpeed
IF crateBob[i].fDisplacement >= CRATE_BOB_MAX_DISPLACE
crateBob[i].iDir = -1
ELIF crateBob[i].fDisplacement <= -CRATE_BOB_MAX_DISPLACE
crateBob[i].iDir = 1
ENDIF
//SET_ENTITY_COORDS(crateBob[i].obj, GET_CRATE_POS(i) + <<0,0,crateBob[i].fDisplacement>>)
SLIDE_OBJECT(crateBob[i].obj, GET_CRATE_POS(i) + <<0,0,crateBob[i].fDisplacement>>, <<1,1,1>>, FALSE)
SET_ENTITY_ROTATION(crateBob[i].obj, GET_CRATE_ROT(i))
SET_ENTITY_LOD_DIST(crateBob[i].obj, 100)
FREEZE_ENTITY_POSITION(crateBob[i].obj, TRUE)
ENDIF
ENDREPEAT
ENDPROC
// create debris
/*
PROC CREATE_DEBRIS()
INT i
VECTOR vPos
FLOAT fRot
BOOL bIsCrate
MODEL_NAMES model
REPEAT NUMBER_DEBRIS i
IF NOT DOES_ENTITY_EXIST(debris[i].obj)
SWITCH i
CASE 0
vPos = <<-472.4, 4419.0, 25.9>>
fRot = 142.5
bIsCrate = TRUE
BREAK
CASE 1
vPos = <<-474.6, 4426.0, 26.0>>
fRot = -50.5
bIsCrate = FALSE
BREAK
CASE 2
vPos = <<-468.4, 4430.8, 26.6>>
fRot = -24.5
bIsCrate = TRUE
BREAK
CASE 3
vPos = <<-496.8, 4422.6, 26.2>>
fRot = 10.0
bIsCrate = FALSE
BREAK
CASE 4
vPos = <<-502.2, 4414.1, 24.3>>
fRot = -10.0
bIsCrate = TRUE
BREAK
CASE 5
vPos = <<-492.0, 4420.6, 25.6>>
fRot = -70.0
bIsCrate = TRUE
BREAK
CASE 6
vPos = <<-520.7, 4410.2, 24.4>>
fRot = 70.0
bIsCrate = TRUE
BREAK
CASE 7
vPos = <<-516.0, 4423.9, 25.7>>
fRot = 40.0
bIsCrate = TRUE
BREAK
ENDSWITCH
IF bIsCrate
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DEBRIS_CRATE)
ELSE
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DEBRIS_BARREL)
ENDIF
debris[i].obj = CREATE_OBJECT(model, vPos)
SET_ENTITY_HEADING(debris[i].obj, fRot)
FREEZE_ENTITY_POSITION(debris[i].obj, TRUE)
debris[i].bReleased = FALSE
debris[i].fOnScreenTime = 0.0
ENDIF
ENDREPEAT
ENDPROC
// handle debris
PROC HANDLE_DEBRIS()
INT i
FLOAT fTime
REPEAT NUMBER_DEBRIS i
IF NOT debris[i].bReleased
SWITCH i
CASE 0
fTime = 0.0
BREAK
CASE 1
fTime = 2.0
BREAK
CASE 2
fTime = 2.5
BREAK
CASE 3
fTime = 1.0
BREAK
CASE 4
fTime = 0.6
BREAK
CASE 5
fTime = 1.3
BREAK
CASE 6
fTime = 1.7
BREAK
CASE 7
fTime = 0.4
BREAK
ENDSWITCH
IF DOES_ENTITY_EXIST(debris[i].obj)
IF IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(debris[i].obj), 1.0)
debris[i].fOnScreenTime = debris[i].fOnScreenTime +@ 1.0
IF debris[i].fOnScreenTime >= fTime
OR IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID())
FREEZE_ENTITY_POSITION(debris[i].obj, FALSE)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(debris[i].obj, APPLY_TYPE_IMPULSE, <<0,0,0.1>>, 0, TRUE, TRUE)
debris[i].bReleased = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
*/
// set case state
PROC SET_CASE_STATE(CASE_STATE_ENUM caseState)
PED_INDEX michaelPed = GET_MICHAEL_PED()
IF NOT IS_PED_INJURED(michaelPed)
IF DOES_ENTITY_EXIST(caseObject)
IF IS_ENTITY_ATTACHED(caseObject)
DETACH_ENTITY(caseObject)
ENDIF
SWITCH caseState
CASE CASE_IN_HAND_ANIM
ATTACH_ENTITY_TO_ENTITY(caseObject, michaelPed, GET_PED_BONE_INDEX(michaelPed, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>)
BREAK
CASE CASE_IN_HAND_ANIM_2
ATTACH_ENTITY_TO_ENTITY(caseObject, michaelPed, GET_PED_BONE_INDEX(michaelPed, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,180,-90>>)
GIVE_WEAPON_TO_PED(michaelPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE), INFINITE_AMMO, TRUE, TRUE)
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
BREAK
CASE CASE_IN_HAND_GAMEPLAY
//ATTACH_ENTITY_TO_ENTITY(caseObject, michaelPed, GET_PED_BONE_INDEX(michaelPed, BONETAG_PH_R_HAND), <<0,0,0.04>>, <<-90,0,0>>)
IF DOES_ENTITY_EXIST(caseObject)
DELETE_OBJECT(caseObject)
//CLEAR_PED_TASKS(michaelPed)
//FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed)
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), FALSE)
GIVE_WEAPON_TO_PED(michaelPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE), INFINITE_AMMO, TRUE, TRUE)
ENDIF
BREAK
CASE CASE_UNDER_SEAT
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
//ATTACH_ENTITY_TO_ENTITY(caseObject, trainCrashVehicle[TCV_DINGHY], 0, <<-0.499178,0.0651846, 0.579191 >>, <<-90,-90,0>>, FALSE, FALSE, TRUE)
ATTACH_ENTITY_TO_ENTITY(caseObject, trainCrashVehicle[TCV_DINGHY], 0, <<-0.599678,0.0851846, 0.549191 >>, <<-90,-90,0>>, FALSE, FALSE, FALSE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
// create the case
PROC CREATE_CASE(CASE_STATE_ENUM caseState)
IF NOT DOES_ENTITY_EXIST(caseObject)
caseObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_CASE), GET_ENTITY_COORDS(PLAYER_PED_ID()))
ENDIF
SET_CASE_STATE(caseState)
ENDPROC
// destroy a scripted cam if it exists
PROC DESTROY_MISSION_STATIC_CAM(CAMERA_INDEX &camIndex)
IF DOES_CAM_EXIST(camIndex)
DESTROY_CAM(camIndex)
ENDIF
ENDPROC
// create a scripted stationary cam if it doesn't already exist
PROC CREATE_MISSION_STATIC_CAM(CAMERA_INDEX &camIndex, BOOL bCreateActive = TRUE)
// get rid of any existing interp cams
IF DOES_CAM_EXIST(interpCam)
DESTROY_CAM(interpCam)
ENDIF
IF DOES_CAM_EXIST(camIndex)
DESTROY_CAM(camIndex)
ENDIF
IF NOT DOES_CAM_EXIST(camIndex)
camIndex = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", bCreateActive)
ENDIF
ENDPROC
// destroy anim cam
PROC DESTROY_MISSION_ANIM_CAM()
IF DOES_CAM_EXIST(animCam)
DESTROY_CAM(animCam)
ENDIF
ENDPROC
// load objects if screen faded out
PROC LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
IF IS_SCREEN_FADED_OUT()
LOAD_ALL_OBJECTS_NOW()
ENDIF
ENDPROC
// get correct model for mission vehicle
FUNC TRAIN_CRASH_MODEL_ENUM GET_MODEL_ENUM_FOR_TRAIN_CRASH_VEHICLE(TRAIN_CRASH_VEHICLE_ENUM tcVehicle)
SWITCH tcVehicle
CASE TCV_BIKE
RETURN TCM_BIKE
BREAK
CASE TCV_DINGHY
RETURN TCM_DINGHY
BREAK
CASE TCV_MICHAEL_CAR
RETURN TCM_MICHAEL_CAR
BREAK
CASE TCV_BEACH_CAR
RETURN TCM_BEACH_CAR
BREAK
CASE TCV_BEACH_TRUCK
RETURN TCM_BEACH_TRUCK
BREAK
ENDSWITCH
RETURN TCM_BIKE
ENDFUNC
// is this model required on this stage?
FUNC BOOL IS_MODEL_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_MODEL_ENUM tcModel, MISSION_STAGE_ENUM reqStage)
SWITCH tcModel
CASE TCM_MICHAEL
CASE TCM_TREVOR
RETURN TRUE
BREAK
CASE TCM_TRAIN_ENGINE
IF reqStage <= STAGE_GET_TO_BRIDGE
AND reqStage > STAGE_INTERCEPT_TRAIN
RETURN TRUE
ENDIF
BREAK
CASE TCM_TRAIN_CONTAINER2
IF reqStage < STAGE_RAPIDS_CHASE
AND reqStage > STAGE_INTERCEPT_TRAIN
RETURN TRUE
ENDIF
BREAK
CASE TCM_BIKE
IF reqStage <= STAGE_DRIVE_ALONG_TRAIN
RETURN TRUE
ENDIF
BREAK
CASE TCM_MICHAEL_CAR
IF reqStage = STAGE_INTERCEPT_TRAIN
RETURN TRUE
ENDIF
BREAK
CASE TCM_CHASE_CHOPPER
IF reqStage >= STAGE_STEAL_FROM_CONTAINER
AND reqStage < STAGE_GET_HOME
RETURN TRUE
ENDIF
BREAK
CASE TCM_DINGHY
IF reqStage >= STAGE_GET_TO_BRIDGE
//IF reqStage >= STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TCM_ENEMY_DINGHY
IF reqStage = STAGE_STEAL_FROM_CONTAINER
OR reqStage = STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
CASE TCM_MERC_CAR
IF reqStage = STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
CASE TCM_BEACH_CAR
CASE TCM_BEACH_TRUCK
//IF reqStage >= STAGE_GET_HOME
// RETURN TRUE
//ENDIF
BREAK
CASE TCM_SOLDIER
IF (reqStage >= STAGE_STEAL_FROM_CONTAINER
AND reqStage < STAGE_GET_HOME)
//OR reqStage = STAGE_DRIVE_ALONG_TRAIN
RETURN TRUE
ENDIF
BREAK
CASE TCM_ENGINEER
IF reqStage = STAGE_GET_TO_BRIDGE
RETURN TRUE
ENDIF
BREAK
CASE TCM_TRAIN_FLATBED
IF reqStage = STAGE_GET_TO_BRIDGE
RETURN TRUE
ENDIF
BREAK
CASE TCM_CONTAINER_DOORS
IF reqStage >= STAGE_GO_TO_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TCM_CRATE
IF reqStage >= STAGE_GO_TO_CONTAINER
AND reqStage <= STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
CASE TCM_CASE
IF reqStage >= STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TCM_DEBRIS_CRATE
CASE TCM_DEBRIS_BARREL
IF reqStage = STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TCM_ANCHOR
//IF reqStage = STAGE_STEAL_FROM_CONTAINER
IF reqStage = STAGE_GET_TO_BRIDGE
OR reqStage = STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TCM_DOOR_COLLISION_SHUT
IF reqStage = STAGE_GO_TO_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TCM_DOOR_OPEN
IF reqStage >= STAGE_GO_TO_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TCM_PATRICIA
CASE TCM_RON
IF reqStage = STAGE_INTERCEPT_TRAIN
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// add a request for a model
PROC ADD_MODEL_REQUEST(INT i)
MODEL_NAMES mModelToRequest = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i))
REQUEST_MODEL(mModelToRequest)
bModelRequestTracker[i] = TRUE
ENDPROC
// remove request
PROC CLEAR_MODEL_REQUEST(INT i)
IF bModelRequestTracker[i]
MODEL_NAMES mModelToRequest = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i))
IF HAS_MODEL_LOADED(mModelToRequest)
SET_MODEL_AS_NO_LONGER_NEEDED(mModelToRequest)
ENDIF
bModelRequestTracker[i] = FALSE
ENDIF
ENDPROC
// have all requests for models succeeded?
FUNC BOOL HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
INT i
// loop through and check for empty
REPEAT NUMBER_MODEL_REQUEST_SLOTS i
IF bModelRequestTracker[i] = TRUE
IF NOT HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i)))
// a full slot is not loaded, return false
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
// request the models for a particular stage
PROC REQUEST_MODELS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepModelsForCurrentStage)
INT i
REPEAT NUMBER_MODEL_REQUEST_SLOTS i
IF IS_MODEL_REQUIRED_FOR_MISSION_STAGE(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i), requestStage)
// if we need this model, request it
ADD_MODEL_REQUEST(i)
ELSE
// otherwise try and get rid of it
IF NOT IS_MODEL_REQUIRED_FOR_MISSION_STAGE(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i), currentMissionStage)
OR NOT bKeepModelsForCurrentStage
CLEAR_MODEL_REQUEST(i)
ENDIF
ENDIF
ENDREPEAT
// if wait for load, don't quit out 'til all the models are in
IF bWaitForLoad
IF NOT HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
// is this recording required on this stage?
FUNC BOOL IS_RECORDING_REQUIRED_FOR_MISSION_STAGE(INT iRec, MISSION_STAGE_ENUM reqStage)
SWITCH iRec
CASE 001 // dinghy towards bridge
SWITCH reqStage
CASE STAGE_GET_TO_BRIDGE
RETURN TRUE
BREAK
ENDSWITCH
BREAK
//CASE 004 // bike jumps
//CASE 005
//CASE 007
//CASE 008
// IF reqStage = STAGE_CHASE_TRAIN
// RETURN TRUE
// ENDIF
//BREAK
CASE 004 // off waterfall
CASE 005 // bad guy 1 waterfall
CASE 007 // bad guy 2 waterfall
IF reqStage = STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
CASE 008 // michael drive at end
IF reqStage = STAGE_GET_HOME
RETURN TRUE
ENDIF
BREAK
// enemy vehicles - shootout
CASE 003 // wave 1 boat 1
CASE 002 // wave 1 boat 2
CASE 010 // wave 1 boat 3
CASE 011 // wave 1 heli 1
CASE 015 // wave 2 heli 1
CASE 017 // wave 4 heli 1
IF reqStage = STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
//CASE 010 // 4wd pull out in front of train
// IF reqStage = STAGE_GET_TO_BRIDGE
// RETURN TRUE
// ENDIF
//BREAK
CASE 006 // dinghy pull up to containers
IF reqStage = STAGE_GET_TO_BRIDGE
RETURN TRUE
ENDIF
BREAK
//CASE 021 // dinghy backup from rapids
// IF reqStage = STAGE_GO_TO_CONTAINER
// RETURN TRUE
// ENDIF
//BREAK
CASE 014 // dinghy pickup trevor
IF reqStage = STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
// enemy vehicles - chase
CASE 009 // first bad guy boats - centre
CASE 016 // first bad guy boats - left
//CASE 017 // first bad guy boats - right
CASE 022 // second bad guy boats - right
//CASE 023 // second bad guy boats - right
//CASE 018 // third bad guy boats - left
//CASE 019 // third bad guy boats - right
CASE 020 // chopper
CASE 012 // flee boat 1
CASE 013 // flee boat 2
IF reqStage = STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// add a request for a model
PROC ADD_RECORDING_REQUEST(INT iRec)
bVehicleRecordingRequestTracker[iRec-1] = TRUE
REQUEST_VEHICLE_RECORDING(iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
ENDPROC
// clear a recording request slot
PROC CLEAR_RECORDING_REQUEST(INT iRec)
IF bVehicleRecordingRequestTracker[iRec-1]
bVehicleRecordingRequestTracker[iRec-1] = FALSE
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
REMOVE_VEHICLE_RECORDING(iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
ENDIF
ENDIF
ENDPROC
// have all requests for models succeeded?
FUNC BOOL HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()
INT i
// loop through and check for empty
REPEAT NUMBER_RECORDING_REQUEST_SLOTS i
IF bVehicleRecordingRequestTracker[i]
IF NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(i+1, GET_TRAIN_CRASH_RECORDING_PREFIX())
// a full slot is not loaded, return false
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
// get recordings for particular stage
PROC REQUEST_VEHICLE_RECORDINGS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepRecordingsForCurrentStage)
INT i
REPEAT NUMBER_RECORDING_REQUEST_SLOTS i
IF IS_RECORDING_REQUIRED_FOR_MISSION_STAGE(i+1, requestStage)
// if we need this recording, request it
ADD_RECORDING_REQUEST(i+1)
ELSE
// otherwise try and get rid of it
IF NOT IS_RECORDING_REQUIRED_FOR_MISSION_STAGE(i+1, currentMissionStage)
OR NOT bKeepRecordingsForCurrentStage
CLEAR_RECORDING_REQUEST(i+1)
ENDIF
ENDIF
ENDREPEAT
// if wait for load, don't quit out 'til all the recordings are in
IF bWaitForLoad
IF NOT HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
// is this waypoint required on this stage?
FUNC BOOL IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(INT iWaypoint, MISSION_STAGE_ENUM reqStage)
SWITCH iWaypoint + 1
CASE 1 // player escape
CASE 2 // 1 centre
CASE 3 // 1 left
CASE 4 // car
//CASE 8 // 2 left
//CASE 9 // 2 right
//CASE 6 // 3 right
//CASE 7 // 4 centre
IF reqStage = STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
CASE 6 // l hand circle
CASE 7 // middle circle
CASE 8 // r hand circle
IF reqStage = STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE 5 // drive to beach
IF reqStage >= STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC TEXT_LABEL GET_WAYPOINT_LABEL_FROM_INT(INT iWaypoint)
TEXT_LABEL tWaypoint = "exile3"
tWaypoint += (iWaypoint+1)
RETURN tWaypoint
ENDFUNC
// add a request for a waypoint
PROC ADD_WAYPOINT_REQUEST(INT iWaypoint)
bWaypointRequestTracker[iWaypoint] = TRUE
TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(iWaypoint)
REQUEST_WAYPOINT_RECORDING(tWaypoint)
ENDPROC
// clear a waypoint request slot
PROC CLEAR_WAYPOINT_REQUEST(INT iWaypoint)
IF bWaypointRequestTracker[iWaypoint]
bWaypointRequestTracker[iWaypoint] = FALSE
TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(iWaypoint)
IF GET_IS_WAYPOINT_RECORDING_LOADED(tWaypoint) = FALSE
REMOVE_WAYPOINT_RECORDING(tWaypoint)
ENDIF
ENDIF
ENDPROC
// have all requests for waypoints succeeded?
FUNC BOOL HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED()
INT i
// loop through and check for empty
REPEAT NUMBER_WAYPOINT_REQUEST_SLOTS i
IF bWaypointRequestTracker[i]
TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(i)
IF NOT GET_IS_WAYPOINT_RECORDING_LOADED(tWaypoint)
// a full slot is not loaded, return false
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
// get recordings for particular stage
PROC REQUEST_WAYPOINT_RECORDINGS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepWaypointsForCurrentStage)
INT i
REPEAT NUMBER_WAYPOINT_REQUEST_SLOTS i
IF IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(i, requestStage)
// if we need this waypoint, request it
ADD_WAYPOINT_REQUEST(i)
ELSE
// otherwise try and get rid of it
IF NOT IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(i, currentMissionStage)
OR NOT bKeepWaypointsForCurrentStage
CLEAR_WAYPOINT_REQUEST(i)
ENDIF
ENDIF
ENDREPEAT
// if wait for load, don't quit out 'til all the waypoints are in
IF bWaitForLoad
IF NOT HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED()
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
// get an anim dict enum as string
FUNC STRING GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TRAIN_CRASH_ANIM_DICT_ENUM animDict)
SWITCH animDict
CASE TC_ANIM_DICT_MISSION
RETURN "MISSTRCRASH"
BREAK
CASE TC_ANIM_DICT_TRAIN
RETURN "MISSEXILE3"
BREAK
CASE TC_ANIM_DICT_BIKE_LAND
RETURN "MISSEXILE3@TRAIN_"
BREAK
//CASE TC_ANIM_DICT_RAPPEL
// RETURN GET_RAPPEL_ANIM_DICT_NAME()
//BREAK
CASE TC_ANIM_DICT_RPG
RETURN "MISSEXILE3_RPG"
BREAK
CASE TC_ANIM_DICT_DOORS
RETURN "p_cs1_14b_train_s_break"
BREAK
CASE TC_ANIM_DICT_TREVOR_IDLE_ENTER
RETURN "missexile3@trevor_idle@enter"
BREAK
CASE TC_ANIM_DICT_TREVOR_IDLE_BASE
RETURN "missexile3@trevor_idle@base"
BREAK
CASE TC_ANIM_DICT_TREVOR_IDLE_VAR
RETURN "missexile3@trevor_idle@idle_a"
BREAK
CASE TC_ANIM_DICT_TREVOR_IDLE_EXIT
RETURN "missexile3@trevor_idle@exit"
BREAK
CASE TC_ANIM_DICT_CRASH
RETURN "MISSEXILE3@TRAINCRASH"
BREAK
CASE TC_ANIM_DICT_SWITCH
RETURN "MISSEXILE3SWITCH"
BREAK
//CASE TC_ANIM_DICT_GESTURE_ENT
// RETURN "amb@standwatch@shocked@male@enter"
//BREAK
//CASE TC_ANIM_DICT_GESTURES
// RETURN "amb@standwatch@shocked@male@idle_b"
//BREAK
ENDSWITCH
RETURN "invalid!"
ENDFUNC
// is this anim dict required on this stage?
FUNC BOOL IS_ANIM_DICT_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_ANIM_DICT_ENUM animDict, MISSION_STAGE_ENUM reqStage)
SWITCH animDict
CASE TC_ANIM_DICT_MISSION
IF (reqStage >= STAGE_DRIVE_ALONG_TRAIN
AND reqStage <= STAGE_GET_TO_BRIDGE)
RETURN TRUE
ENDIF
BREAK
CASE TC_ANIM_DICT_TRAIN
IF reqStage >= STAGE_DRIVE_ALONG_TRAIN
RETURN TRUE
ENDIF
BREAK
CASE TC_ANIM_DICT_BIKE_LAND
IF reqStage = STAGE_DRIVE_ALONG_TRAIN
OR reqStage = STAGE_GET_TO_BRIDGE
RETURN TRUE
ENDIF
BREAK
//CASE TC_ANIM_DICT_RAPPEL
// IF reqStage = STAGE_STEAL_FROM_CONTAINER
// RETURN TRUE
// ENDIF
//BREAK
//CASE TC_ANIM_DICT_GESTURES
//CASE TC_ANIM_DICT_GESTURE_ENT
// IF reqStage = STAGE_GET_TO_BRIDGE
// RETURN TRUE
// ENDIF
//BREAK
CASE TC_ANIM_DICT_RPG
IF reqStage >= STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
CASE TC_ANIM_DICT_DOORS
IF reqStage >= STAGE_GO_TO_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TC_ANIM_DICT_TREVOR_IDLE_ENTER
CASE TC_ANIM_DICT_TREVOR_IDLE_EXIT
CASE TC_ANIM_DICT_TREVOR_IDLE_BASE
CASE TC_ANIM_DICT_TREVOR_IDLE_VAR
CASE TC_ANIM_DICT_SWITCH
IF reqStage = STAGE_GO_TO_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TC_ANIM_DICT_CRASH
IF reqStage = STAGE_GET_TO_BRIDGE
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// add a request for an anim
PROC ADD_ANIM_DICT_REQUEST(TRAIN_CRASH_ANIM_DICT_ENUM animDict)
bAnimDictRequestTracker[animDict] = TRUE
STRING sAnimDict = GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(animDict)
REQUEST_ANIM_DICT(sAnimDict)
ENDPROC
// clear an anim request slot
PROC CLEAR_ANIM_DICT_REQUEST(TRAIN_CRASH_ANIM_DICT_ENUM animDict)
IF bAnimDictRequestTracker[animDict]
bAnimDictRequestTracker[animDict] = FALSE
STRING sAnimDict = GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(animDict)
IF HAS_ANIM_DICT_LOADED(sAnimDict)
REMOVE_ANIM_DICT(sAnimDict)
ENDIF
ENDIF
ENDPROC
// have all requests for anims succeeded?
FUNC BOOL HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
INT i
// loop through and check for empty
REPEAT COUNT_OF(TRAIN_CRASH_ANIM_DICT_ENUM) i
IF bAnimDictRequestTracker[i]
IF NOT HAS_ANIM_DICT_LOADED(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(INT_TO_ENUM(TRAIN_CRASH_ANIM_DICT_ENUM, i)))
// a full slot is not loaded, return false
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
// get anims for particular stage
PROC REQUEST_ANIM_DICTS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepAnimsForCurrentStage)
INT i
REPEAT COUNT_OF(TRAIN_CRASH_ANIM_DICT_ENUM) i
TRAIN_CRASH_ANIM_DICT_ENUM thisAnimDict = INT_TO_ENUM(TRAIN_CRASH_ANIM_DICT_ENUM, i)
IF IS_ANIM_DICT_REQUIRED_FOR_MISSION_STAGE(thisAnimDict, requestStage)
// if we need this recording, request it
ADD_ANIM_DICT_REQUEST(thisAnimDict)
ELSE
// otherwise try and get rid of it
IF NOT IS_ANIM_DICT_REQUIRED_FOR_MISSION_STAGE(thisAnimDict, currentMissionStage)
OR NOT bKeepAnimsForCurrentStage
CLEAR_ANIM_DICT_REQUEST(thisAnimDict)
ENDIF
ENDIF
ENDREPEAT
// if wait for load, don't quit out 'til all the recordings are in
IF bWaitForLoad
IF NOT HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
// is this weapon required on this stage?
FUNC BOOL IS_WEAPON_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_WEAPON_ENUM weapon, MISSION_STAGE_ENUM reqStage)
SWITCH weapon
CASE TC_WEAPON_STICKY_BOMB
IF reqStage = STAGE_GO_TO_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TC_WEAPON_SHOTGUN
//IF reqStage = STAGE_DRIVE_ALONG_TRAIN
// RETURN TRUE
//ENDIF
BREAK
CASE TC_WEAPON_SMG
IF reqStage >= STAGE_GO_TO_CONTAINER
AND reqStage < STAGE_GET_HOME
RETURN TRUE
ENDIF
BREAK
CASE TC_WEAPON_PISTOL
IF reqStage = STAGE_RAPIDS_CHASE
OR reqStage = STAGE_DRIVE_ALONG_TRAIN
RETURN TRUE
ENDIF
BREAK
CASE TC_WEAPON_MERC_RIFLE
IF (reqStage >= STAGE_GO_TO_CONTAINER
AND reqStage < STAGE_GET_HOME)
OR reqStage = STAGE_DRIVE_ALONG_TRAIN
OR reqStage = STAGE_GET_TO_BRIDGE
RETURN TRUE
ENDIF
BREAK
CASE TC_WEAPON_MG
IF reqStage = STAGE_RAPIDS_CHASE
RETURN TRUE
ENDIF
BREAK
CASE TC_WEAPON_SNIPER_RIFLE
IF reqStage = STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TC_WEAPON_BACKUP_RIFLE
IF reqStage = STAGE_STEAL_FROM_CONTAINER
OR reqStage = STAGE_GO_TO_CONTAINER
RETURN TRUE
ENDIF
BREAK
CASE TC_WEAPON_CASE
IF reqStage = STAGE_GET_HOME
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// add a request for a weapon
PROC ADD_WEAPON_REQUEST(TRAIN_CRASH_WEAPON_ENUM weapon)
bWeaponRequestTracker[weapon] = TRUE
WEAPON_TYPE weaponType = GET_TRAIN_CRASH_WEAPON_TYPE(weapon)
REQUEST_WEAPON_ASSET(weaponType)
ENDPROC
// clear a weapon request slot
PROC CLEAR_WEAPON_REQUEST(TRAIN_CRASH_WEAPON_ENUM weapon)
IF bWeaponRequestTracker[weapon]
bWeaponRequestTracker[weapon] = FALSE
WEAPON_TYPE weaponType = GET_TRAIN_CRASH_WEAPON_TYPE(weapon)
IF HAS_WEAPON_ASSET_LOADED(weaponType)
REMOVE_WEAPON_ASSET(weaponType)
ENDIF
ENDIF
ENDPROC
// have all requests for weapons succeeded?
FUNC BOOL HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED()
INT i
// loop through and check for empty
REPEAT COUNT_OF(TRAIN_CRASH_WEAPON_ENUM) i
IF bWeaponRequestTracker[i]
IF NOT HAS_WEAPON_ASSET_LOADED(GET_TRAIN_CRASH_WEAPON_TYPE(INT_TO_ENUM(TRAIN_CRASH_WEAPON_ENUM, i)))
// a full slot is not loaded, return false
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
// get weapons for particular stage
PROC REQUEST_WEAPONS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepWeaponsForCurrentStage)
INT i
REPEAT COUNT_OF(TRAIN_CRASH_WEAPON_ENUM) i
TRAIN_CRASH_WEAPON_ENUM thisWeapon = INT_TO_ENUM(TRAIN_CRASH_WEAPON_ENUM, i)
IF IS_WEAPON_REQUIRED_FOR_MISSION_STAGE(thisWeapon, requestStage)
// if we need this recording, request it
ADD_WEAPON_REQUEST(thisWeapon)
ELSE
// otherwise try and get rid of it
IF NOT IS_WEAPON_REQUIRED_FOR_MISSION_STAGE(thisWeapon, currentMissionStage)
OR NOT bKeepWeaponsForCurrentStage
CLEAR_WEAPON_REQUEST(thisWeapon)
ENDIF
ENDIF
ENDREPEAT
// if wait for load, don't quit out 'til all the recordings are in
IF bWaitForLoad
IF NOT HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED()
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
/*
// get a ptfx enum as string
FUNC STRING GET_TRAIN_CRASH_PTFX_AS_STRING(TRAIN_CRASH_PTFX_ENUM ptfx)
SWITCH ptfx
CASE TC_PTFX_SCRIPT
RETURN "script"
BREAK
ENDSWITCH
RETURN "invalid!"
ENDFUNC
*/
// is this ptfx required on this stage?
FUNC BOOL IS_PTFX_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_PTFX_ENUM ptfx, MISSION_STAGE_ENUM reqStage)
SWITCH ptfx
CASE TC_PTFX_SCRIPT
IF reqStage >= STAGE_GO_TO_CONTAINER
AND reqStage < STAGE_GET_HOME
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// add a request for a ptfx
PROC ADD_PTFX_REQUEST(TRAIN_CRASH_PTFX_ENUM ptfx)
bPTFXRequestTracker[ptfx] = TRUE
// STRING sPTFX = GET_TRAIN_CRASH_PTFX_AS_STRING(ptfx)
REQUEST_PTFX_ASSET()
ENDPROC
// clear a ptfx request slot
PROC CLEAR_PTFX_REQUEST(TRAIN_CRASH_PTFX_ENUM ptfx)
IF bPTFXRequestTracker[ptfx]
bPTFXRequestTracker[ptfx] = FALSE
// STRING sPTFX = GET_TRAIN_CRASH_PTFX_AS_STRING(ptfx)
IF HAS_PTFX_ASSET_LOADED()
REMOVE_PTFX_ASSET()
ENDIF
ENDIF
ENDPROC
// have all requests for ptfx succeeded?
FUNC BOOL HAVE_ALL_PTFX_REQUESTS_SUCCEEDED()
INT i
// loop through and check for empty
REPEAT COUNT_OF(TRAIN_CRASH_PTFX_ENUM) i
IF bPTFXRequestTracker[i]
IF NOT HAS_PTFX_ASSET_LOADED()
// a full slot is not loaded, return false
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
// get ptfx for particular stage
PROC REQUEST_PTFX_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepPTFXForCurrentStage)
INT i
REPEAT COUNT_OF(TRAIN_CRASH_PTFX_ENUM) i
TRAIN_CRASH_PTFX_ENUM thisPTFX = INT_TO_ENUM(TRAIN_CRASH_PTFX_ENUM, i)
IF IS_PTFX_REQUIRED_FOR_MISSION_STAGE(thisPTFX, requestStage)
// if we need this recording, request it
ADD_PTFX_REQUEST(thisPTFX)
ELSE
// otherwise try and get rid of it
IF NOT IS_PTFX_REQUIRED_FOR_MISSION_STAGE(thisPTFX, currentMissionStage)
OR NOT bKeepPTFXForCurrentStage
CLEAR_PTFX_REQUEST(thisPTFX)
ENDIF
ENDIF
ENDREPEAT
// if wait for load, don't quit out 'til all the recordings are in
IF bWaitForLoad
IF NOT HAVE_ALL_PTFX_REQUESTS_SUCCEEDED()
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_PTFX_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
// get a sfx enum as string
FUNC STRING GET_TRAIN_CRASH_SFX_AS_STRING(TRAIN_CRASH_SFX_ENUM sfx)
SWITCH sfx
CASE TC_SFX_TRAIN_FALL
RETURN "EXILE_3_TRAIN_FALL"
BREAK
ENDSWITCH
RETURN "invalid!"
ENDFUNC
// is this sfx required on this stage?
FUNC BOOL IS_SFX_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_SFX_ENUM sfx, MISSION_STAGE_ENUM reqStage)
SWITCH sfx
CASE TC_SFX_TRAIN_FALL
IF reqStage = STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// add a request for a sfx
PROC ADD_SFX_REQUEST(TRAIN_CRASH_SFX_ENUM sfx)
bSFXRequestTracker[sfx] = TRUE
STRING sSFX = GET_TRAIN_CRASH_SFX_AS_STRING(sfx)
REQUEST_SCRIPT_AUDIO_BANK(sSFX)
ENDPROC
// clear a sfx request slot
PROC CLEAR_SFX_REQUEST(TRAIN_CRASH_SFX_ENUM sfx)
IF bSFXRequestTracker[sfx]
bSFXRequestTracker[sfx] = FALSE
STRING sSFX = GET_TRAIN_CRASH_SFX_AS_STRING(sfx)
RELEASE_NAMED_SCRIPT_AUDIO_BANK(sSFX)
ENDIF
ENDPROC
// have all requests for sfx succeeded?
FUNC BOOL HAVE_ALL_SFX_REQUESTS_SUCCEEDED()
INT i
// loop through and check for empty
REPEAT COUNT_OF(TRAIN_CRASH_SFX_ENUM) i
IF bSFXRequestTracker[i]
IF NOT REQUEST_SCRIPT_AUDIO_BANK(GET_TRAIN_CRASH_SFX_AS_STRING(INT_TO_ENUM(TRAIN_CRASH_SFX_ENUM, i)))
// a full slot is not loaded, return false
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
// get sfx for particular stage
PROC REQUEST_SFX_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepSFXForCurrentStage)
INT i
REPEAT COUNT_OF(TRAIN_CRASH_SFX_ENUM) i
TRAIN_CRASH_SFX_ENUM thisSFX = INT_TO_ENUM(TRAIN_CRASH_SFX_ENUM, i)
IF IS_SFX_REQUIRED_FOR_MISSION_STAGE(thisSFX, requestStage)
// if we need this recording, request it
ADD_SFX_REQUEST(thisSFX)
ELSE
// otherwise try and get rid of it
IF NOT IS_SFX_REQUIRED_FOR_MISSION_STAGE(thisSFX, currentMissionStage)
OR NOT bKeepSFXForCurrentStage
CLEAR_SFX_REQUEST(thisSFX)
ENDIF
ENDIF
ENDREPEAT
// if wait for load, don't quit out 'til all the recordings are in
IF bWaitForLoad
IF NOT HAVE_ALL_SFX_REQUESTS_SUCCEEDED()
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_SFX_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
// is this misc asset required on this stage?
FUNC BOOL IS_MISC_ASSET_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_MISC_ASSET_ENUM miscAsset, MISSION_STAGE_ENUM reqStage)
SWITCH miscAsset
CASE TC_MISC_ASSET_DINGHY_ANIMS
IF reqStage >= STAGE_GET_TO_BRIDGE
RETURN TRUE
ENDIF
BREAK
//CASE TC_MISC_ASSET_TOWN_PATHS
// IF reqStage = STAGE_INTERCEPT_TRAIN
// RETURN TRUE
// ENDIF
//BREAK
//CASE TC_MISC_ASSET_BRIEFCASE_CLIPSET
// IF reqStage = STAGE_GET_HOME
// RETURN TRUE
// ENDIF
//BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// add a request for a misc asset
PROC ADD_MISC_ASSET_REQUEST(TRAIN_CRASH_MISC_ASSET_ENUM miscAsset)
bMiscAssetRequestTracker[miscAsset] = TRUE
SWITCH miscAsset
CASE TC_MISC_ASSET_DINGHY_ANIMS
REQUEST_VEHICLE_ASSET(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DINGHY))
BREAK
//CASE TC_MISC_ASSET_BRIEFCASE_CLIPSET
// REQUEST_CLIP_SET("move_m@briefcase")
//BREAK
ENDSWITCH
ENDPROC
// clear a misc asset slot
PROC CLEAR_MISC_ASSET_REQUEST(TRAIN_CRASH_MISC_ASSET_ENUM miscAsset)
IF bMiscAssetRequestTracker[miscAsset]
bMiscAssetRequestTracker[miscAsset] = FALSE
SWITCH miscAsset
CASE TC_MISC_ASSET_DINGHY_ANIMS
REMOVE_VEHICLE_ASSET(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DINGHY))
BREAK
//CASE TC_MISC_ASSET_BRIEFCASE_CLIPSET
// REMOVE_CLIP_SET("move_m@briefcase")
//BREAK
ENDSWITCH
ENDIF
ENDPROC
// have all requests for misc assets succeeded?
FUNC BOOL HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED()
INT i
// loop through and check for empty
REPEAT COUNT_OF(TRAIN_CRASH_MISC_ASSET_ENUM) i
IF bMiscAssetRequestTracker[i]
SWITCH INT_TO_ENUM(TRAIN_CRASH_MISC_ASSET_ENUM, i)
CASE TC_MISC_ASSET_DINGHY_ANIMS
IF NOT HAS_VEHICLE_ASSET_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DINGHY))
RETURN FALSE
ENDIF
BREAK
//CASE TC_MISC_ASSET_TOWN_PATHS
/// IF NOT ARE_NODES_LOADED_FOR_AREA(TOWN_PATHS_MIN_X, TOWN_PATHS_MIN_Y, TOWN_PATHS_MAX_X, TOWN_PATHS_MAX_Y)
// RETURN FALSE
// ENDIF
//BREAK
ENDSWITCH
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
// get misc assets for particular stage
PROC REQUEST_MISC_ASSETS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepMiscAssetsForCurrentStage)
INT i
REPEAT COUNT_OF(TRAIN_CRASH_MISC_ASSET_ENUM) i
TRAIN_CRASH_MISC_ASSET_ENUM thisMiscAsset = INT_TO_ENUM(TRAIN_CRASH_MISC_ASSET_ENUM, i)
IF IS_MISC_ASSET_REQUIRED_FOR_MISSION_STAGE(thisMiscAsset, requestStage)
// if we need this asset, request it
ADD_MISC_ASSET_REQUEST(thisMiscAsset)
ELSE
// otherwise try and get rid of it
IF NOT IS_MISC_ASSET_REQUIRED_FOR_MISSION_STAGE(thisMiscAsset, currentMissionStage)
OR NOT bKeepMiscAssetsForCurrentStage
CLEAR_MISC_ASSET_REQUEST(thisMiscAsset)
ENDIF
ENDIF
ENDREPEAT
// if wait for load, don't quit out 'til all the recordings are in
IF bWaitForLoad
IF NOT HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED()
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
// request the text for the mission
PROC REQUEST_TEXT(BOOL bWaitForLoad)
REQUEST_ADDITIONAL_TEXT("TCRASH", MISSION_TEXT_SLOT)
IF bWaitForLoad
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
// set all common variables to what they should be when a new stage starts
PROC RESET_ALL_COMMON_VARIABLES()
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
streamingStage = MISSION_STREAMING_STAGE_REQUEST
cutsceneStage = TC_CUT_STAGE_INIT
bRunningCutscene = FALSE
bSkippedCutscene = FALSE
bClearedForCutscene = FALSE
bCutsceneWaitStarted = FALSE
bShownGodText = FALSE
bDoneGotoSpeech = FALSE
bShouldDoGetInText = FALSE
bSavedBanter = FALSE
bWaitForBuddyPrompt = FALSE
bGetBuddyPrompt = FALSE
bForceIntoDinghy = FALSE
bSuccessfullyForcedIntoDinghy = FALSE
bSuppressRemoveTrevorMG = FALSE
iNextRandomSpeechTime = -1
ENDPROC
// get all variables in the correct state for this stage
PROC RESET_VARIABLES_FOR_STAGE(MISSION_STAGE_ENUM resetStage)
RESET_ALL_COMMON_VARIABLES()
INT i
SWITCH resetStage
CASE STAGE_INTERCEPT_TRAIN
createTrainStage = CREATE_TRAIN_STAGE_NOT_STARTED
createEngineerStage = CREATE_ENGINEER_STAGE_NOT_STARTED
trainMovementState = TRAIN_MOVEMENT_STOPPED
bDoneMichaelNoFollowPrompt = FALSE
bDoneTrainBanter = FALSE
bTrainIsPastSilos = FALSE
bDoneMissionStartCue = FALSE
bDoneSeeTrainSpeech = FALSE
bPreparedSeeTrainCue = FALSE
bDoneBikeStartAudioScene = FALSE
bDoneSeeTrainAudioScene = FALSE
bDoneMichaelGoOnFoot = FALSE
bMichaelWasInVehicle = FALSE
bRemovedMichael = FALSE
bDeletedRonAndPatricia = FALSE
iTrainMovementStartTime = -1
iGetInTextStage = 0
iMichaelDriveCarStage = 0
iInterceptTrainTime = GET_GAME_TIMER()
fTrainOnScreenTime = 0.0
fSeeTrainSpeechTime = 0.0
#IF IS_DEBUG_BUILD
bDebugWarpToJumps = FALSE
#ENDIF
BREAK
CASE STAGE_CHASE_TRAIN
trainMovementState = TRAIN_MOVEMENT_FAST
bSlowDownTrainForCatchup = FALSE
bObjectiveIsJump = FALSE
bShownJumpPrompt = FALSE
bShownPathHelp = FALSE
bDoPathHelp = FALSE
bDoneJumpSpeech = FALSE
bDoneGetBombsSpeech = FALSE
bTempSuppressVehicleSpawning = FALSE
bTempPreventStillVehicleState = FALSE
bDoneBikeJumpAudioScene = FALSE
iCurrentJump = -1
fPlayerIsOnTrainTimer = 0.0
#IF IS_DEBUG_BUILD
bDebugWarpToJumps = FALSE
#ENDIF
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
jackingTrainShot = JACKING_TRAIN_OFF_BIKE
trainRideState = TRAIN_RIDE_STATE_LOW
createMercPickupStage = CREATE_MERC_PICKUP_STAGE_NOT_STARTED
bDoneEnterCabSpeech = FALSE
bDetachedBike = FALSE
bTempPreventStillVehicleState = FALSE
bLoadedHitDriverAudio = FALSE
bSetSceneAudioEntity = FALSE
//iFightStage = 0
//iBashedDriverCount = 0
//iBashSpeechStage = 0
iGetInTextStage = 2
REPEAT NUMBER_CLIMB_ENEMIES i
climbEnemy[i].state = CLIMB_ENEMY_STATE_NOT_CREATED
climbEnemy[i].bDoneSpeech = FALSE
ENDREPEAT
BREAK
CASE STAGE_GET_TO_BRIDGE
RESET_PUSH_IN(pushInData)
trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
trainRideState = TRAIN_RIDE_STATE_LOW
trainCrashShot = TRAIN_CRASH_RAYFIRE
gotoFoamState = GOTO_FOAM_STATE_NOT_STARTED
swapCarriageState = SWAP_CARRIAGE_STATE_NOT_STARTED
//fTrainClearBridgeMod = 0.0
//bPreStreamingSeamlessCutscene = FALSE
bShownJumpPrompt = FALSE
bDoneRidingTrainSpeech = FALSE
bDoneRidingTrainSpeech2 = FALSE
bDoneAlmostThereSpeech = FALSE
//bDoneSeeTrainSpeech = FALSE
bShownSwitchPrompt = FALSE
bStartedPlaybackDinghy = FALSE
bStoppedPlaybackDinghy = FALSE
bArrivedAtBridge = FALSE
bSelectorLocked = FALSE
bSetToJump = FALSE
bCreatedCrashTrain = FALSE
bDoneForceDinghyStop = FALSE
//bSetTrainLocationForCrash = FALSE
//bRepositionedMichaelAtAnchor = FALSE
bCreatedCrashTrain = FALSE
bDoingRideIdle1 = FALSE
bCamHighEnoughToFreezeTrain = FALSE
//bChangedToLadderCam = FALSE
//bDoneLookForTrainSpeech = FALSE
//bGettingReadySpeech = FALSE
bDoneJumpOff = FALSE
bDoneJumpSpeech = FALSE
bStopTrain = FALSE
bRemovedMercPickup = FALSE
bDoneMercAngeredAnims = FALSE
bDoneMercsRun = FALSE
bDoneTrevorTauntMercsSpeech = FALSE
//bExplodedTrackMercs = FALSE
//bDoneTrackMercsShoot = FALSE
bDoneGoingToCrashSpeech = FALSE
bLoadedCrashStream = FALSE
bPreparedSwapToMichaelCue = FALSE
bDoneSwapToMichaelCue = FALSE
bPreparedSideOnCue = FALSE
//bPreparedCollisionCue = FALSE
bDoneCollisionCue = FALSE
//bPreparedHitWaterCue = FALSE
bDoneHitWaterCue = FALSE
bTrevorPutAwayGun = FALSE
bDoneTrainAccelerationAudioScene = FALSE
bDoneTrainDecelerationAudioScene = FALSE
bDoneBrakePressSound = FALSE
bDoneBrakeReleaseSound = TRUE
bCreatedTrucks = FALSE
bDoneCamShake = FALSE
bSlowedDown = FALSE
bSpedUp = FALSE
bStartedDebrisFX = FALSE
bStartedIPLSwap = FALSE
//bDoneEncourageOpenSpeech = FALSE
iCreateTruckFrame = 0
iGetInTextStage = 2
iBeenAtBridgeTime = -1
iBridgeSmashStage = 0
fRepositionBoatTime = 0//3000
fTrainSpeedMod = 0.5
fTrainTooLowSpeedTime = 0.0
fTrainAccelerationTime = 0.0
fTrainDecelerationTime = 0.0
fWaterOverride = 0.25
fRayfireEvolution = 0.0
REPEAT NUMBER_SPLASHES i
bAddedSplash[i] = FALSE
ENDREPEAT
#IF IS_DEBUG_BUILD
bDebugWarpedTrainToBridge = FALSE
#ENDIF
BREAK
CASE STAGE_GO_TO_CONTAINER
RESET_PUSH_IN(pushInData)
trevorIdleState = TREVOR_IDLE_STATE_NOT_STARTED
bShownBombHelp = FALSE
bDoneSwitchToBombHelp = FALSE
bFoundBomb = FALSE
bForceDoorsOpen = FALSE
// bAtSafeDistance = FALSE
bShownSwitchPrompt = FALSE
bExplodedDoors = FALSE
bSwappedToTrevor = FALSE
bRepositionedDinghy = FALSE
//bPreparedSwapToTrevorCue = FALSE
bDoneSwapToTrevorCue = FALSE
bPreparedEnemiesArriveCue = FALSE
bDoneEnemiesArriveCue = FALSE
bDoneHurrySpeech = FALSE
//bDoneEnterCover = FALSE
// bShownCoverPrompt = FALSE
bDoneEncourageOpenSpeech = FALSE
bDoneFirstHurryUpSpeech = FALSE
bDoneThrowBombSpeech = FALSE
bDoneFindLootSpeech = FALSE
bDoneMichaelSearchSpeech = FALSE
bDoMerryweatherMassacre = FALSE
bCreatedMerryweatherMassacre = FALSE
bTrevorEquippedWeapon = FALSE
bDoneFoundUsSpeech = FALSE
bThermalOn = FALSE
bThermalSwitchedOn = FALSE
bRemovedStreamVol = FALSE
bTurnOffUnderwaterDialogue = FALSE
bRestoredControl = FALSE
bTriggeredEnemyWave[EW_SHOOTOUT_FIRST_WAVE] = FALSE
bSwappedDoors = FALSE
bDonePushIn = FALSE
bHitSound = FALSE
bWooshStarted = FALSE
iNoBombsTime = -1
iGetInTextStage = 2
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
//crashHotswapState = CRASH_HOTSWAP_ON_TREVOR
boatRPGState = BOAT_RPG_NOT_STARTED
boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
michaelTrevorArgueStage = MT_ARGUE_WAIT
iNextArgueTime = GET_GAME_TIMER() + 12000
REPEAT COUNT_OF(bTriggeredEnemyWave) i
bEnemyWaveState[i] = FALSE
bTriggeredEnemyWave[i] = FALSE
ENDREPEAT
// REPEAT NUMBER_RAPPEL_ENEMIES i
// enemyRappelData[i].rappelState = ENEMY_RAPPEL_STATE_CLAMBERING
// ENDREPEAT
bMichaelSearching = FALSE
bShownSwitchPrompt = FALSE
bDoneFoundItem = FALSE
bDoneTrevorRespondSpeech = FALSE
bSetupMichaelForShootout = FALSE
bMichaelInDinghy = FALSE
bMichaelAnchoredDinghy = FALSE
bMichaelStopForTrevorSwimming = FALSE
bSkippedWaterfallCutaway = FALSE
bDoneDropOnBridgeSpeech = FALSE
bDoneUseThermalSpeech = FALSE
bDoChopperSpinOut = FALSE
bDoneHeliOnMichaelSpeech = FALSE
bDoneFoundUsSpeech = FALSE
bDoneCarriageFall = FALSE
bDoneCarriageExplosion = FALSE
bDoneCarriageSplash = false
bDoneImmediateGetInSpeech = FALSE
bStoppedDefendMichaelAudioScene = FALSE
bDoneWaterfallCutaway = FALSE
bReadyToEscape = FALSE
bPreparedRapidsStartCue = FALSE
bDoneRapidsStartCue = FALSE
bDoLastBoatCircle = FALSE
bUppedAccuracyForCircle = FALSE
bDoMerryweatherMassacre = FALSE
bIncreasedBoatAccuracy = FALSE
bDoneBoatHitWaterSound = FALSE
bDidntPullAwayFromContainer = FALSE
bLateAimAtRapids = FALSE
bDoneSniperHelp1 = FALSE
bDoneSniperHelp2 = FALSE
bShouldDoSniperHelp = FALSE
bGotFirstSniperSpeech = FALSE
bDoneKilledSnipersSpeech = FALSE
bDoneSeenParachutesSpeech = FALSE
bDoneParachute1 = FALSE
bDoneParachute2 = FALSE
bStoppingDinghy = FALSE
bDoneWaterTrail[0] = FALSE
bDoneWaterTrail[1] = FALSE
bDoneWaterTrail[2] = FALSE
bSetTrevorHelmet = FALSE
bDoneSetTrevorHelmetSpeech = FALSE
bExplodedChopperFromCarriage = FALSE
bReloadingSniperRifle = FALSE
bStartedChopper1AudioScene = FALSE
bStartedChopper2AudioScene = FALSE
bStartedChopper3AudioScene = FALSE
bStoppedChopper3AudioScene = FALSE
bRemovedChopper1Audio = FALSE
bRemovedChopper2Audio = FALSE
iGetInTextStage = 0
iCurrentSearch = 0
iHeliOnMichaelTime = -1
iDelayFindItemTime = -1
iGotSniperTime = -1
fHangingCarriageOnScreenTime = 0.0
fThirdWaveAccuracy = 0.0
fFifthWaveAccuracy = 0.0
fMichaelToIslandPlaybackSpeed = 1.0
//iChopperSpinModifier = 0
//fChopperSpinForce = 0.0
//fPushChopperToWallForce = 0.0
BREAK
CASE STAGE_RAPIDS_CHASE
beachCreationStage = BEACH_CREATION_NOT_STARTED
//michaelDrivebyState = MICHAEL_DRIVEBY_WAITING
trevorTargetPed = NULL
//michaelTargetPed = NULL
REPEAT COUNT_OF(bTriggeredEnemyWave) i
bEnemyWaveState[i] = FALSE
bTriggeredEnemyWave[i] = FALSE
ENDREPEAT
bDoneBoatSound[0] = false
bDoneBoatSound[1] = false
//REPEAT NUMBER_BRIDGE_ENEMIES i
// enemyBridgeState[i] = ENEMY_BRIDGE_STATE_NOT_STARTED
//ENDREPEAT
REPEAT COUNT_OF(RAPIDS_SPEECH_INTERRUPT_ENUM) i
bDoneRapidsSpeechInterrupt[i] = FALSE
ENDREPEAT
//bChopperUsingRockets = FALSE
bFinishedFollowRapids = FALSE
bDoneWaterfallCutaway = TRUE
//bPreventUpWaterfall = FALSE
bGivenRPG = FALSE
//bDoneMortarSpeech = FALSE
//bSetExplosionProofs = FALSE
//bDoHoverChopperHovering = FALSE
bDoMopUp = FALSE
bStartedChopper4AudioScene = FALSE
// bDoneBugOut = FALSE
// bDoneBoatsFlee = FALSE
bShownSwitchPrompt = FALSE
bSelectorLocked = FALSE
bRapidsSpeechInterruptPending = FALSE
bCreatedSmoothCam = FALSE
bSmoothCamBackToGameplay = FALSE
// bEnemiesExplosionProof = FALSE
bRemovedCrashModels = FALSE
bBlippedCarWave = FALSE
bDoMerryweatherMassacre = FALSE
bForceResetTrevorTask = FALSE
bForceMichaelSwitch = FALSE
iGetInTextStage = 2
//iChopperHoverStage = 0
//iStartMortarTime = -1
//iTriggerFleeWaveTime = -1
//fAttackChopperHoverSpeed = 1.0
fEnemyBoatSpeed = 1.2
fBoatRPGPhase = 0.0
fMopUpAccuracy = 4.0
iRapidsSpeechStage = 0
iAdvanceToGetHomeTime = -1
BREAK
CASE STAGE_GET_HOME
bGotToBeach = FALSE
bDoneLeaveBoatWithCase = FALSE
bDoneDriveHomeBanter = FALSE
bKilledDriveHomeBanter = FALSE
bDoneCarSpeech = FALSE
bFinishedFollowRapids = TRUE
bDoneLandAtBeachCue = FALSE
bDoneAtBeachCue = FALSE
bMichaelDroveOff = FALSE
bForcedTrevorOutOfBoat = FALSE
bBeenAtGetawayVehicles = FALSE
bDoneForceDinghyStop = FALSE
bExtendMichaelAbandon = FALSE
bPutWeaponAway = FALSE
bDoTrevorBoom = FALSE
bForceMichaelSwitch = FALSE
bAttachedCaseToHand = FALSE
fForceBeachTime = 0.0
BREAK
ENDSWITCH
ENDPROC
// return the correct character to start a particular stage on
FUNC enumCharacterList GET_CHARACTER_FOR_MISSION_STAGE(MISSION_STAGE_ENUM getStage)
SWITCH getStage
CASE STAGE_INTERCEPT_TRAIN
RETURN CHAR_TREVOR
BREAK
CASE STAGE_CHASE_TRAIN
RETURN CHAR_TREVOR
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
RETURN CHAR_TREVOR
BREAK
CASE STAGE_GET_TO_BRIDGE
RETURN CHAR_TREVOR
BREAK
CASE STAGE_GO_TO_CONTAINER
RETURN CHAR_MICHAEL
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
RETURN CHAR_TREVOR
BREAK
CASE STAGE_RAPIDS_CHASE
RETURN CHAR_TREVOR
BREAK
CASE STAGE_GET_HOME
RETURN CHAR_MICHAEL
BREAK
ENDSWITCH
RETURN CHAR_MICHAEL
ENDFUNC
// create a player vehicle for the mission
PROC TRAIN_CRASH_CREATE_VEHICLE(TRAIN_CRASH_VEHICLE_ENUM tcVehicle, VECTOR vCreatePos, FLOAT fCreateRot, BOOL bKeepModel = TRUE, BOOL bKeepVehicle = TRUE, BOOL bMakeInvincible = FALSE)
INT i
IF NOT IS_VEHICLE_DRIVEABLE(trainCrashVehicle[tcVehicle])
TRAIN_CRASH_MODEL_ENUM vehicleModelEnum = GET_MODEL_ENUM_FOR_TRAIN_CRASH_VEHICLE(tcVehicle)
// if using a specific player vehicle
IF tcVehicle = TCV_MICHAEL_CAR
CREATE_PLAYER_VEHICLE(trainCrashVehicle[tcVehicle], CHAR_MICHAEL, vCreatePos, fCreateRot, FALSE)
ELSE
trainCrashVehicle[tcVehicle] = CREATE_VEHICLE(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(vehicleModelEnum), vCreatePos, fCreateRot)
ENDIF
//IF tcVehicle <> TCV_DINGHY
SET_VEHICLE_ON_GROUND_PROPERLY(trainCrashVehicle[tcVehicle])
//ENDIF
IF NOT bKeepModel
CLEAR_MODEL_REQUEST(ENUM_TO_INT(vehicleModelEnum))
ENDIF
IF bMakeInvincible
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(trainCrashVehicle[tcVehicle], FALSE)
SET_VEHICLE_CAN_BREAK(trainCrashVehicle[tcVehicle], FALSE)
SET_ENTITY_PROOFS(trainCrashVehicle[tcVehicle], TRUE, TRUE, TRUE, TRUE, TRUE)
ENDIF
IF NOT bKeepVehicle
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[tcVehicle])
ENDIF
SET_VEHICLE_CAN_LEAK_OIL(trainCrashVehicle[tcVehicle], FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(trainCrashVehicle[tcVehicle], FALSE)
SWITCH tcVehicle
CASE TCV_BIKE
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(trainCrashVehicle[tcVehicle])
SET_VEHICLE_COLOUR_COMBINATION(trainCrashVehicle[tcVehicle], 0)
SET_VEHICLE_LIVERY(trainCrashVehicle[tcVehicle], 2)
SET_VEHICLE_HAS_STRONG_AXLES(trainCrashVehicle[tcVehicle], TRUE)
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[tcVehicle], FALSE)
BREAK
CASE TCV_DINGHY
SET_VEHICLE_COLOUR_COMBINATION(trainCrashVehicle[tcVehicle], 0)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(trainCrashVehicle[tcVehicle], TRUE)
SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(trainCrashVehicle[tcVehicle], TRUE)
SET_VEHICLE_EXTRA(trainCrashVehicle[tcVehicle], 1, TRUE)
SET_VEHICLE_EXTRA(trainCrashVehicle[tcVehicle], 2, TRUE)
SET_VEHICLE_COLOURS(trainCrashVehicle[tcVehicle], 1, 46)
SET_VEHICLE_EXTRA_COLOURS(trainCrashVehicle[tcVehicle], 132, 0)
BREAK
CASE TCV_MICHAEL_CAR
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[tcVehicle], FALSE)
BREAK
CASE TCV_BEACH_CAR
SET_VEHICLE_COLOUR_COMBINATION(trainCrashVehicle[tcVehicle], 3)
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[tcVehicle], VEHICLELOCK_LOCKED)
FOR i=1 TO 8
SET_VEHICLE_EXTRA(trainCrashVehicle[tcVehicle], i, TRUE)
ENDFOR
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[tcVehicle], FALSE)
BREAK
CASE TCV_BEACH_TRUCK
//SET_VEHICLE_COLOUR_COMBINATION(trainCrashVehicle[tcVehicle], 6)
SET_VEHICLE_COLOURS(trainCrashVehicle[tcVehicle], 48, 48)
SET_VEHICLE_EXTRA_COLOURS(trainCrashVehicle[tcVehicle], 48, 48)
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[tcVehicle], VEHICLELOCK_LOCKED)
REMOVE_VEHICLE_WINDOW(trainCrashVehicle[tcVehicle], SC_WINDOW_FRONT_LEFT)
FOR i=1 TO 8
SET_VEHICLE_EXTRA(trainCrashVehicle[tcVehicle], i, TRUE)
ENDFOR
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[tcVehicle], FALSE)
BREAK
ENDSWITCH
ENDIF
ENDPROC
// setup player character with their correct variations
PROC SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PED_INDEX ped, enumCharacterList createChar, MISSION_STAGE_ENUM setStage)
IF NOT IS_PED_INJURED(ped)
SWITCH createChar
CASE CHAR_MICHAEL
IF setStage >= STAGE_GET_TO_BRIDGE
SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_OUTFIT, OUTFIT_P0_COMMANDO, FALSE)
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
// commando suit
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_DECL, 0, 0)
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_BERD, 0, 0)
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_FEET, 4, 0)
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, 4, 0)
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 4, 0)
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAND, 6, 0)
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, 4, 0)
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL2, 0, 0)
//CLEAR_ALL_PED_PROPS(ped)
ENDIF
BREAK
CASE CHAR_TREVOR
IF setStage >= STAGE_RAPIDS_CHASE
IF GET_PED_PROP_INDEX(ped, ANCHOR_HEAD) < 0
//SET_PED_PROP_INDEX(ped, ANCHOR_HEAD, 9)
SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_PROPS, PROPS_P2_CRASH_HELMET, FALSE)
bSetTrevorHelmet = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
// apply attributes
PROC APPLY_PLAYER_ATTRIBUTES(PED_INDEX ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(ped, RELGROUPHASH_PLAYER)
SET_PED_CAN_BE_TARGETTED(ped, FALSE)
SET_PED_KEEP_TASK(ped, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(ped, TRUE)
SET_PED_CONFIG_FLAG(ped, PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_CONFIG_FLAG(ped, PCF_GetOutBurningVehicle, FALSE)
SET_PED_CONFIG_FLAG(ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(ped, PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(ped, PCF_GetOutUndriveableVehicle, FALSE)
SET_PED_DIES_IN_WATER(ped, FALSE)
SET_ENTITY_AS_MISSION_ENTITY(ped, TRUE, TRUE)
ENDPROC
// create player character
PROC TRAIN_CRASH_CREATE_PLAYER_CHARACTER(enumCharacterList createChar, MISSION_STAGE_ENUM setStage, VECTOR vPos, FLOAT fRot, VEHICLE_INDEX veh = NULL, VEHICLE_SEAT seat = VS_DRIVER)
SELECTOR_SLOTS_ENUM selectorSlot = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(createChar)
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[selectorSlot])
IF NOT IS_ENTITY_DEAD(veh)
// create in vehicle
IF NOT CREATE_PLAYER_PED_INSIDE_VEHICLE(sSelectorPeds.pedID[selectorSlot], createChar, veh, seat, FALSE)
SCRIPT_ASSERT("could not create train crash player ped (vehicle is not dead)!")
IF NOT HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(createChar))
SCRIPT_ASSERT("ped was not created because the ped model was not loaded, please give rob a shout! thanks")
ENDIF
ENDIF
ELSE
// create on foot
CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[selectorSlot], createChar, vPos, fRot, FALSE)
ENDIF
SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(sSelectorPeds.pedID[selectorSlot], createChar, setStage)
ENDIF
// apply the attributes
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[selectorSlot])
APPLY_PLAYER_ATTRIBUTES(sSelectorPeds.pedID[selectorSlot])
// specific attributes
SWITCH createChar
CASE CHAR_MICHAEL
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, sSelectorPeds.pedID[selectorSlot], "MICHAEL")
IF setStage > STAGE_INTERCEPT_TRAIN
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[selectorSlot], PCF_GetOutUndriveableVehicle, FALSE)
ENDIF
BREAK
CASE CHAR_TREVOR
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 1, sSelectorPeds.pedID[selectorSlot], "TREVOR")
BREAK
ENDSWITCH
ENDIF
ENDPROC
// set player in vehicle if not already in
PROC SET_PLAYER_PED_INTO_TRAIN_CRASH_VEHICLE(TRAIN_CRASH_VEHICLE_ENUM tcVehicle, VEHICLE_SEAT seat, BOOL bKeepVehicle = TRUE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[tcVehicle])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[tcVehicle])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[tcVehicle], seat)
IF NOT bKeepVehicle
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[tcVehicle])
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// create the player characters, and transport if appropriate, for a mission stage
PROC CREATE_PLAYER_CHARACTERS_WITH_TRANSPORT_IN_MISSION_STAGE(MISSION_STAGE_ENUM setStage, BOOL bIsIntro = FALSE)
// create transport
SWITCH setStage
CASE STAGE_INTERCEPT_TRAIN
TRAIN_CRASH_CREATE_VEHICLE(TCV_MICHAEL_CAR, GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_CAR_INIT), MICHAEL_CAR_INIT_ROT)
TRAIN_CRASH_CREATE_VEHICLE(TCV_BIKE, GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_INIT), BIKE_INIT_ROT)
BREAK
CASE STAGE_CHASE_TRAIN
TRAIN_CRASH_CREATE_VEHICLE(TCV_BIKE, GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_CHASE), BIKE_CHASE_ROT)
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
TRAIN_CRASH_CREATE_VEHICLE(TCV_BIKE, GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_DRIVE_ALONG_TRAIN), 0)
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
BREAK
CASE STAGE_GET_TO_BRIDGE
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_INIT), DINGHY_INIT_ROT)
BREAK
CASE STAGE_GO_TO_CONTAINER
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BRIDGE), DINGHY_AT_BRIDGE_ROT)
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_CONTAINER), DINGHY_AT_CONTAINER_ROT)
BREAK
CASE STAGE_RAPIDS_CHASE
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, <<-565, 4424, 15>>, 82)
BREAK
CASE STAGE_GET_HOME
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BEACH), DINGHY_AT_BEACH_ROT)
BREAK
ENDSWITCH
// create the player characters
SWITCH setStage
CASE STAGE_INTERCEPT_TRAIN
// michael
IF NOT bIsIntro
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_INIT), MICHAEL_INIT_ROT)
ENDIF
BREAK
CASE STAGE_CHASE_TRAIN
// trevor
//SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
// trevor
//SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
BREAK
CASE STAGE_GET_TO_BRIDGE
//trevor
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
BREAK
CASE STAGE_GO_TO_CONTAINER
// trevor
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_IN_WATER_INIT), TREVOR_IN_WATER_INIT_ROT)
// michael
//SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
// trevor
//SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_SHOOTOUT_INIT_REPLAY))
//SET_ENTITY_HEADING(PLAYER_PED_ID(), TREVOR_SHOOTOUT_INIT_ROT)
//michael
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_IN_CONTAINER), MICHAEL_IN_CONTAINER_ROT)
BREAK
CASE STAGE_RAPIDS_CHASE
// michael
// SET_PLAYER_PED_INTO_TRAIN_CRASH_VEHICLE(TCV_DINGHY, VS_DRIVER)
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
// trevor
// TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
//SET_PLAYER_PED_INTO_TRAIN_CRASH_VEHICLE(TCV_DINGHY, VS_FRONT_RIGHT)
BREAK
CASE STAGE_GET_HOME
// michael
//SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_AT_BEACH))
//SET_ENTITY_HEADING(PLAYER_PED_ID(), MICHAEL_AT_BEACH_ROT)
//SET_PLAYER_PED_INTO_TRAIN_CRASH_VEHICLE(TCV_DINGHY, VS_DRIVER)
// trevor
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
BREAK
ENDSWITCH
ENDPROC
// fill train init
FUNC VECTOR GET_TRAIN_INIT(MISSION_STAGE_ENUM trainStage)
SWITCH trainStage
CASE STAGE_INTERCEPT_TRAIN
RETURN <<2842.66, 4938.20, 63.03>>
BREAK
CASE STAGE_CHASE_TRAIN
RETURN <<2726.87, 5179.56, 62.90>>
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
RETURN <<1835.16, 6277.90, 50.30>>
BREAK
CASE STAGE_GET_TO_BRIDGE
//RETURN <<-541, 5059, 91>>
//RETURN <<1213.76, 6433.22, 31.44>>
RETURN <<1042.66089, 6435.62305, 31.04007>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
// set init train speed for stage
PROC SET_TRAIN_SPEED_FOR_STAGE(MISSION_STAGE_ENUM trainStage)
SWITCH trainStage
CASE STAGE_INTERCEPT_TRAIN
fTrainCruiseSpeed = 0.0
BREAK
CASE STAGE_CHASE_TRAIN
fTrainCruiseSpeed = 30//40.0 // 35.0
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
fTrainCruiseSpeed = DRIVE_ALONG_TRAIN_SPEED
BREAK
CASE STAGE_GET_TO_BRIDGE
fTrainCruiseSpeed = GET_TO_BRIDGE_TRAIN_SPEED * fTrainSpeedMod
BREAK
ENDSWITCH
ENDPROC
// setup playback of recording
PROC START_TRAIN_MOVEMENT_FOR_STAGE(MISSION_STAGE_ENUM playbackStage)
// set recording to play and time to start
VECTOR vStartCoords = GET_TRAIN_INIT(playbackStage)
SET_TRAIN_SPEED_FOR_STAGE(playbackStage)
IF IS_VEHICLE_DRIVEABLE(missionTrain)
SET_MISSION_TRAIN_COORDS(missionTrain, vStartCoords)
SET_TRAIN_CRUISE_SPEED(missionTrain, fTrainCruiseSpeed)
SET_TRAIN_SPEED(missionTrain, fTrainCruiseSpeed)
ENDIF
ENDPROC
// check fail for losing train
PROC DO_LOSE_TRAIN_CHECK()
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE), FALSE) > LOSE_TRAIN_DISTANCE
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), missionTrain, FALSE) > LOSE_TRAIN_DISTANCE
MISSION_FAILED(FAIL_LOST_TRAIN)
ENDIF
ENDPROC
// get crashed train carriage pos
FUNC VECTOR GET_CRASHED_CARRIAGE_POSITION(INT iCarriage)
SWITCH iCarriage
CASE 0
RETURN <<-475.50, 4399.24, 30.50>>
BREAK
CASE 1
RETURN <<-499.00, 4412.00, 57.00>>
BREAK
CASE 2
RETURN <<-505.70, 4453.00, 76.00>>
BREAK
CASE 3
RETURN <<-513.20, 4458.50, 88.50>>
BREAK
CASE 4
RETURN <<-522.53, 4473.74, 90.32>>
BREAK
CASE 5
RETURN <<-504.70, 4453.00, 57.00>>
BREAK
CASE 6
RETURN <<-524.20, 4514.00, 89.20>>
BREAK
CASE 7
RETURN <<-524.20, 4496.00, 88.70>>
BREAK
CASE 8
RETURN <<-520.70, 4474.50, 88.70>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
// get crashed train carriage rot
FUNC VECTOR GET_CRASHED_CARRIAGE_ROTATION(INT iCarriage)
SWITCH iCarriage
CASE 0
RETURN <<55.12, 40.48, 207.44>>
BREAK
CASE 1
RETURN <<202.20, 93.16, 68.12>>
BREAK
CASE 2
RETURN <<202.20, 94.16, 68.12>>
BREAK
CASE 3
RETURN <<154.20, 143.16, 68.12>>
BREAK
CASE 4
RETURN <<169.56, 180.32, 198.56>>
BREAK
CASE 5
RETURN <<202.20, 93.16, 68.12>>
BREAK
CASE 6
RETURN <<154.08, 276.48, 154.08>>
BREAK
CASE 7
RETURN <<186.48, 218.40, 189.48>>
BREAK
CASE 8
RETURN <<182.48, 199.40, 189.48>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
// fill position, rotation, FOV for a camera shot
PROC FILL_CAMERA_PROPERTIES_FOR_TRAIN_CRASH_SHOT(TRAIN_CRASH_SHOT_DETAILS_ENUM cutsceneShot, VECTOR &vCamPos, VECTOR &vCamRot, FLOAT &fCamFOV)
SWITCH cutsceneShot
CASE TC_SHOT_JUMP1
vCamPos = <<2680.14, 5341.57, 68.52>>
vCamRot = <<-5.9, 0.3, 169.60>>
fCamFOV = 38.33
BREAK
CASE TC_SHOT_JUMP1B
vCamPos = <<2680.14, 5341.57, 68.52>>
vCamRot = <<-5.9, 0.3, 50.15>>
fCamFOV = 38.33
BREAK
CASE TC_SHOT_JUMP2
vCamPos = <<2595.74, 5503.83, 68.45>>
vCamRot = <<-4.64, -1.21, -121.86>>
fCamFOV = 21.48
BREAK
CASE TC_SHOT_JUMP2B
vCamPos = <<2595.74, 5503.83, 68.45>>
vCamRot = <<-7.41, -1.21, -46.16>>
fCamFOV = 21.48
BREAK
CASE TC_SHOT_JUMP3
vCamPos = <<2597.16, 5543.30, 66.14>>
vCamRot = <<-1.76, 0.29, 28.17>>
fCamFOV = 38.33
BREAK
CASE TC_SHOT_JUMP3B
vCamPos = <<2580.29, 5574.52, 65.55>>
vCamRot = <<-1.76, 0.29, 28.17>>
fCamFOV = 38.33
BREAK
CASE TC_SHOT_JUMP4
vCamPos = <<2479.43, 5758.67, 69.68>>
vCamRot = <<4.76, 0.30, -126.79>>
fCamFOV = 45.00
BREAK
CASE TC_SHOT_JUMP4B
vCamPos = <<2457.69, 5776.81, 70.24>>
vCamRot = <<-18.54, 0.60, -125.20>>
fCamFOV = 45.00
BREAK
CASE TC_SHOT_JUMP5
vCamPos = <<2382.67, 5925.39, 76.14>>
vCamRot = <<-8.39, 0.75, 165.33>>
fCamFOV = 39.35
BREAK
CASE TC_SHOT_JUMP5B
vCamPos = <<2383.38, 5926.52, 76.21>>
vCamRot = <<-22.62, 0.29, 77.40>>
fCamFOV = 39.35
BREAK
CASE TC_SHOT_CRASH_BRIDGE
vCamPos = <<-474.7, 4432.8, 35.5>>
vCamRot = <<-43.4, 0.0, 96.1>>
fCamFOV = 49.5
BREAK
CASE TC_SHOT_START_DRILL
vCamPos = <<-484.61, 4404.90, 31.72>>
vCamRot = <<0.89, 0.0, 159.48>>
fCamFOV = 26.922
BREAK
CASE TC_SHOT_START_DRILLB
vCamPos = <<-484.61, 4404.90, 31.72>>
vCamRot = <<0.89, 0.0, 16.16>>
fCamFOV = 26.922
BREAK
CASE TC_SHOT_EXPLODE_DOORS
vCamPos = <<-483.73, 4417.28, 32.86>>
vCamRot = <<-16.86, 0.0, 86.55>>
fCamFOV = 41.33
BREAK
CASE TC_SHOT_ENTER_CONTAINER
vCamPos = <<-488.40, 4429.60, 31.69>>
vCamRot = <<-5.74, 0.0, 38.66>>
fCamFOV = 36.400
BREAK
CASE TC_SHOT_PLANT_BOMB
vCamPos = <<-490.93, 4431.94, 31.13>>
vCamRot = <<0.16, 0.0, 4.61>>
fCamFOV = 30.486
BREAK
CASE TC_SHOT_INTO_BOAT
vCamPos = <<-487.22, 4429.32, 31.45>>
vCamRot = <<-6.79, 0.0, 29.80>>
fCamFOV = 33.061
BREAK
CASE TC_SHOT_WATERFALL
vCamPos = <<-559.99, 4425.27, 33.36>>
vCamRot =<<-6.92, -1.99, -104.29>>
fCamFOV = 52.0
BREAK
CASE TC_SHOT_WATERFALLB
vCamPos = <<-554.15, 4424.10, 31.95>>
vCamRot = <<-6.93, -2, -104.30>>
fCamFOV = 52.0
BREAK
CASE TC_SHOT_END
vCamPos = <<-2518.27, 3659.61, 13.59>>
vCamRot = <<-8.47, 0.0, 102.94>>
fCamFOV = 32.14
BREAK
ENDSWITCH
ENDPROC
//HUD elements
PROC SET_CUTSCENE_HUD_ELEMENTS()
DISABLE_CELLPHONE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDPROC
// setup mocap cutscene
PROC SET_MISSION_MOCAP_CUTSCENE()
REMOVE_MISSION_TEXT()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_CUTSCENE_HUD_ELEMENTS()
ENDPROC
// setup stuff for train crash cutscene
PROC SET_MISSION_CUTSCENE(BOOL bStart, BOOL bResetControlAndCameras = TRUE, BOOL bDoFade = TRUE, BOOL bInterpToGameCam = FALSE, BOOL bJustResetHUD = FALSE, BOOL bClearText = TRUE, BOOL bResetHeading = TRUE, BOOL bToggleMultihead = TRUE)
IF bClearText
REMOVE_MISSION_TEXT()
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(bStart, DEFAULT, bToggleMultihead)
IF bStart
SET_CUTSCENE_HUD_ELEMENTS()
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
iAllowSkipCutsceneTime = GET_GAME_TIMER()
ELSE
IF bResetControlAndCameras
IF NOT bJustResetHUD
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
DISABLE_CELLPHONE(FALSE)
IF NOT bJustResetHUD
RENDER_SCRIPT_CAMS(FALSE, bInterpToGameCam)
ENDIF
DESTROY_MISSION_ANIM_CAM()
DESTROY_MISSION_STATIC_CAM(staticCam)
DESTROY_MISSION_STATIC_CAM(interpCam)
IF NOT bJustResetHUD
IF bResetHeading
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
ENDIF
ENDIF
bRunningCutscene = FALSE
bSkippedCutscene = FALSE
bClearedForCutscene = FALSE
bCutsceneWaitStarted = FALSE
cutsceneStage = TC_CUT_STAGE_INIT
IF bDoFade
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDIF
ENDIF
ENDPROC
// prevent wanted level for cut
PROC PREVENT_WANTED_LEVEL_FOR_CUTSCENE()
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_MAX_WANTED_LEVEL(0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDPROC
// force the engineer dead
PROC FORCE_ENGINEER_DEAD(BOOL bDeadStraightAway)
IF NOT IS_PED_INJURED(engineerPed[0])
AND IS_VEHICLE_DRIVEABLE(missionTrain)
iDeadSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iDeadSyncScene, missionTrain, 0)
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iDeadSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_outro_driver", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_NONE, RBF_VEHICLE_IMPACT)
IF NOT bDeadStraightAway
SET_SYNCHRONIZED_SCENE_PHASE(iDeadSyncScene, 0.277)
ELSE
SET_SYNCHRONIZED_SCENE_PHASE(iDeadSyncScene, 1.0)
ENDIF
FORCE_PED_AI_AND_ANIMATION_UPDATE(engineerPed[0])
ENDIF
ENDPROC
// create train engineer
PROC CREATE_TRAIN_ENGINEER(MISSION_STAGE_ENUM createStage)
engineerPed[0] = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ENGINEER), <<5,6,7>>)
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_HEAD, 1, 1)
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_HAIR, 2, 0)
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_TORSO, 1, 0)
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_LEG, 0, 0)
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_DECL, 0, 0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(engineerPed[0], TRUE)
IF createStage >= STAGE_GET_TO_BRIDGE
FORCE_ENGINEER_DEAD(TRUE)
ELSE
SET_PED_INTO_VEHICLE(engineerPed[0], missionTrain, VS_FRONT_RIGHT)
ENDIF
SET_ENTITY_PROOFS(engineerPed[0], TRUE, TRUE, TRUE, TRUE, TRUE)
SET_PED_KEEP_TASK(engineerPed[0], TRUE)
ENDPROC
// handle create the negineer
PROC HANDLE_CREATE_ENGINEER(BOOL bIgnoreDistance = FALSE)
SWITCH createEngineerStage
CASE CREATE_ENGINEER_STAGE_NOT_STARTED
IF IS_VEHICLE_DRIVEABLE(missionTrain)
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), missionTrain, <<220,220,220>>, FALSE, FALSE)
OR bIgnoreDistance
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_ENGINEER))
createEngineerStage = CREATE_ENGINEER_STAGE_WAITING
ENDIF
ENDIF
BREAK
CASE CREATE_ENGINEER_STAGE_WAITING
IF NOT bModelRequestTracker[TCM_ENGINEER]
createEngineerStage = CREATE_ENGINEER_STAGE_NOT_STARTED
ELSE
IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
CREATE_TRAIN_ENGINEER(currentMissionStage)
createEngineerStage = CREATE_ENGINEER_STAGE_DONE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
// create das train
PROC CREATE_TRAIN_FOR_STAGE(MISSION_STAGE_ENUM createStage, BOOL bCreateEngineer = TRUE)
IF createStage <= STAGE_GET_TO_BRIDGE
// create a moving train for all stages up to train crash
IF NOT DOES_ENTITY_EXIST(missionTrain)
// create the train
missionTrain = CREATE_MISSION_TRAIN(17, GET_TRAIN_INIT(createStage), FALSE)
SET_ENTITY_PROOFS(missionTrain, TRUE, TRUE, TRUE, TRUE, TRUE)
SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(missionTrain, FALSE)
IF bCreateEngineer
CREATE_TRAIN_ENGINEER(createStage)
ENDIF
IF IS_VEHICLE_DRIVEABLE(missionTrain)
// colour carriages
INT i
FOR i=0 TO EXILE3_LAST_CARRIAGE
VEHICLE_INDEX thisCarriage = GET_TRAIN_CARRIAGE(missionTrain, i)
IF IS_VEHICLE_DRIVEABLE(thisCarriage)
SET_ENTITY_LOD_DIST(thisCarriage, 350)
IF i>=0
INT iColour
SWITCH i
CASE 0
iColour = 0
BREAK
CASE 1
iColour = 3
BREAK
CASE 2
iColour = 1
BREAK
CASE 3
iColour = 0
BREAK
CASE 4
iColour = 1
BREAK
CASE 5
iColour = 2
BREAK
CASE 6
iColour = 2
BREAK
CASE 7
iColour = 3
BREAK
CASE 8
iColour = 3
BREAK
CASE 9
iColour = 3
BREAK
CASE 10
iColour = 0
BREAK
CASE 11
iColour = 2
BREAK
CASE 12
iColour = 0
BREAK
CASE 13
iColour = 1
BREAK
CASE 14
iColour = 1
BREAK
CASE 15
iColour = 1
BREAK
CASE 16
iColour = 1
BREAK
CASE 17
iColour = 2
BREAK
CASE 18
iColour = 0
BREAK
CASE 19
iColour = 1
BREAK
CASE 20
iColour = 3
BREAK
CASE 21
iColour = 0
BREAK
CASE 22
iColour = 0
BREAK
CASE 23
iColour = 3
BREAK
CASE 24
iColour = 2
BREAK
CASE 25
iColour = 0
BREAK
CASE 26
iColour = 1
BREAK
CASE 27
iColour = 0
BREAK
CASE 28
iColour = 2
BREAK
CASE 29
iColour = 2
BREAK
CASE 30
iColour = 0
BREAK
CASE 31
iColour = 0
BREAK
CASE 32
iColour = 0
BREAK
CASE 33
iColour = 2
BREAK
CASE 34
iColour = 0
BREAK
CASE 35
iColour = 3
BREAK
CASE 36
iColour = 1
BREAK
CASE 37
iColour = 0
BREAK
CASE 38
iColour = 3
BREAK
CASE 39
iColour = 3
BREAK
CASE 40
iColour = 1
BREAK
DEFAULT
iColour = 4
BREAK
ENDSWITCH
SET_VEHICLE_COLOUR_COMBINATION(thisCarriage, iColour)
IF i=EXILE3_LAST_CARRIAGE
IF createStage = STAGE_INTERCEPT_TRAIN
TRACK_VEHICLE_VISIBILITY(thisCarriage)
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
START_TRAIN_MOVEMENT_FOR_STAGE(createStage)
ENDIF
// setup attributes
IF IS_VEHICLE_DRIVEABLE(missionTrain)
// blip if appropriate
IF NOT DOES_BLIP_EXIST(trainBlip)
IF createStage = STAGE_DRIVE_ALONG_TRAIN
trainBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(GET_TRAIN_CARRIAGE(missionTrain, 0))
ENDIF
ENDIF
// set horn on/off
// IF createStage >= STAGE_GET_TO_BRIDGE
// SET_HORN_ENABLED(missionTrain, FALSE)
// ENDIF
ENDIF
ENDIF
ENDPROC
// create crash train
PROC CREATE_CRASH_TRAIN()
crashTrain = CREATE_MISSION_TRAIN(0, <<-498.41226, 4304.29980, 88.40305>>, TRUE)
CONST_FLOAT CRASH_TRAIN_SPEED 20.0
SET_TRAIN_CRUISE_SPEED(crashTrain, CRASH_TRAIN_SPEED)
SET_TRAIN_SPEED(crashTrain, CRASH_TRAIN_SPEED)
SET_VEHICLE_COLOUR_COMBINATION(GET_TRAIN_CARRIAGE(crashTrain, 0), 0)
INT i
FOR i=0 TO 2
SET_ENTITY_LOD_DIST(GET_TRAIN_CARRIAGE(crashTrain,i), 500)
ENDFOR
ENDPROC
// apply anti rapids force to dinghy
PROC APPLY_ANTI_RAPIDS_FORCE_TO_DINGHY()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_ENTITY_IN_ANGLED_AREA(trainCrashVehicle[TCV_DINGHY], <<-487.820, 4422.430, 28.000>>, <<-497.780, 4427.270, 34.710>>, 24.0)
APPLY_FORCE_TO_ENTITY(trainCrashVehicle[TCV_DINGHY], APPLY_TYPE_FORCE, <<45,0,0>>, <<0,0,-0.25>>, 0, FALSE, TRUE, TRUE)
ENDIF
ENDIF
ENDPROC
// delete all enemies
PROC DELETE_ALL_ENEMIES()
INT i
REPEAT COUNT_OF(enemyPed) i
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
DELETE_PED(enemyPed[i].ped)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(enemyVehicle) i
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
DELETE_VEHICLE(enemyVehicle[i].veh)
ENDIF
ENDREPEAT
CLEAR_AREA(<<-497.30844, 4425.88330, 29.99993>>, 100, TRUE)
ENDPROC
// create enemy vehicle
PROC CREATE_ENEMY_VEHICLE(ENEMY_VEHICLE_ENUM vehicleEnum, MISSION_STAGE_ENUM createStage)
// vehicle
MODEL_NAMES model
INT iRec = 000
VECTOR vPos = <<2000 + ENUM_TO_INT(vehicleEnum) * 10, 0, 1000>>
FLOAT fRot = 0.0
FLOAT fSkip = 0.0
FLOAT fSpeed = 1.0
//BOOL bOnlyDamagedByPlayer = FALSE
//BOOL bCollisionDamage = FALSE
//BOOL bDamagedByOthersExploding = TRUE
BOOL bExtra1 = FALSE
BOOL bExtra2 = FALSE
// reset ai
enemyVehicle[vehicleEnum].aiEnum = EVAI_FOLLOW_RECORDING
enemyVehicle[vehicleEnum].iAiStage = 0
// model
SWITCH vehicleEnum
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ENEMY_DINGHY)
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
//CASE EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_CHASE_CHOPPER)
BREAK
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_CAR)
BREAK
ENDSWITCH
// details
SWITCH vehicleEnum
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
iRec = 003
IF createStage = STAGE_GO_TO_CONTAINER
fSkip = 8600//9300//7300
ELSE
fSkip = 16600//17300//1500//3500.0
ENDIF
//bOnlyDamagedByPlayer = TRUE
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
iRec = 002
IF createStage = STAGE_GO_TO_CONTAINER
fSkip = 10600//9600
ELSE
fSkip = 18600//2000.0
ENDIF
bExtra1 = TRUE
//bOnlyDamagedByPlayer = TRUE
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
iRec = 010
IF createStage = STAGE_GO_TO_CONTAINER
fSkip = 4600//9600
ELSE
fSkip = 12600//2000.0
ENDIF
//bOnlyDamagedByPlayer = TRUE
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
iRec = 011
IF createStage = STAGE_GO_TO_CONTAINER
fSkip = 0//1000.0//4000//2000
ELSE
fSkip = 6000//7000.0//10000//2000.0
ENDIF
fSpeed = 0.8
//bOnlyDamagedByPlayer = TRUE
//bDamagedByOthersExploding = TRUE
//bCollisionDamage = TRUE
BREAK
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
iRec = 015
fSkip = 5000.0
fSpeed = 1.09
//bOnlyDamagedByPlayer = TRUE
//bDamagedByOthersExploding = TRUE
//bCollisionDamage = TRUE
BREAK
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
iRec = 017
fSkip = 4000.0
fSpeed = 1.10
//bOnlyDamagedByPlayer = TRUE
//bDamagedByOthersExploding = TRUE
//bCollisionDamage = TRUE
BREAK
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
iRec = 020
fSkip = 4000
fSpeed = 1.1//1.25
//vPos = <<-1291.28491, 4400.72119, 23.5>>
//fRot = -91.0
//bDamagedByOthersExploding = TRUE
//bCollisionDamage = TRUE
BREAK
//CASE EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
// iRec = 010
// bDamagedByOthersExploding = TRUE
// bCollisionDamage = TRUE
//BREAK
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
IF createStage = STAGE_STEAL_FROM_CONTAINER
iRec = 007
fSkip = 2000//1800
fSpeed = 1.07
ELSE
iRec = 009
IF bSkippedWaterfallCutaway
fSkip = 0
ELSE
fSkip = 3300//1200
ENDIF
fSpeed = 0.96//1.0
ENDIF
BREAK
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
IF createStage = STAGE_STEAL_FROM_CONTAINER
iRec = 005
fSkip = 2200
fSpeed = 1.07
ELSE
iRec = 016
IF bSkippedWaterfallCutaway
fSkip = 1300
ELSE
fSkip = 4600//1200
ENDIF
fSpeed = 1.0
ENDIF
BREAK
//CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_3
// iRec = 017
// fSkip = 1200
// fSpeed = 1.27
//BREAK
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
// iRec = 022
// fSkip = 2300
// fSpeed = 1.25//1.36
//BREAK
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
// iRec = 023
// fSkip = 2300
// fSpeed = 1.5//1.36
//BREAK
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
// iRec = 018
// fSkip = 2500
// fSpeed = 1.5//1.38
//BREAK
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
// iRec = 019
// fSkip = 2500
// fSpeed = 1.5//1.38
//BREAK
//CASE EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
// iRec = 020
// fSkip = 1500
// fSpeed = 1.35//1.40
//BREAK
//CASE EV_FLEE_WAVE_BOAT_1
// iRec = 012
// fSkip = 6500
// fSpeed = 1.26//1.24//1.07
//BREAK
//CASE EV_FLEE_WAVE_BOAT_2
// iRec = 013
// fSkip = 6800
// fSpeed = 1.26//1.24//1.03
//BREAK
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
vPos = << -892.0786, 4424.8315, 19.8953 >>
fRot = 244.1
BREAK
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
// vPos = << -886.65851, 4430.65674, 20.03022 >>
// fRot = 170.4
//BREAK
ENDSWITCH
enemyVehicle[vehicleEnum].veh = CREATE_VEHICLE(model, vPos, fRot)
SET_VEHICLE_ENGINE_ON(enemyVehicle[vehicleEnum].veh, TRUE, TRUE)
SET_VEHICLE_CAN_BE_TARGETTED(enemyVehicle[vehicleEnum].veh, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(enemyVehicle[vehicleEnum].veh, FALSE)
SET_VEHICLE_DOORS_LOCKED(enemyVehicle[vehicleEnum].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
//SET_ENTITY_ONLY_DAMAGED_BY_RELATIONSHIP_GROUP(enemyVehicle[vehicleEnum].veh, TRUE, RELGROUPHASH_PLAYER)
SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(enemyVehicle[vehicleEnum].veh, FALSE, enemyRelGroup)
//SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyVehicle[vehicleEnum].veh, bOnlyDamagedByPlayer)
//SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(enemyVehicle[vehicleEnum].veh, FALSE)
// vehicle extras
IF IS_THIS_MODEL_A_BOAT(model)
SET_VEHICLE_COLOURS(enemyVehicle[vehicleEnum].veh, 1, 0)
SET_VEHICLE_EXTRA_COLOURS(enemyVehicle[vehicleEnum].veh, 8, 0)
SET_VEHICLE_EXTRA(enemyVehicle[vehicleEnum].veh, 1, NOT bExtra1)
SET_VEHICLE_EXTRA(enemyVehicle[vehicleEnum].veh, 2, NOT bExtra2)
SET_BOAT_SINKS_WHEN_WRECKED(enemyVehicle[vehicleEnum].veh, TRUE)
ENDIF
IF IS_THIS_MODEL_A_CAR(model)
SET_VEHICLE_COLOUR_COMBINATION(enemyVehicle[vehicleEnum].veh, 0)
SET_VEHICLE_USE_ALTERNATE_HANDLING(enemyVehicle[vehicleEnum].veh, TRUE)
//SCRIPT_ASSERT("here3")
ENDIF
IF IS_THIS_MODEL_A_HELI(model)
SET_HELI_BLADES_FULL_SPEED(enemyVehicle[vehicleEnum].veh)
ENDIF
IF iRec > 000
START_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh, iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
SET_PLAYBACK_SPEED(enemyVehicle[vehicleEnum].veh, fSpeed)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh, fSkip)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyVehicle[vehicleEnum].veh)
ENDIF
IF vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
OR vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
TRACK_VEHICLE_VISIBILITY(enemyVehicle[vehicleEnum].veh)
ENDIF
IF vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
SET_VEHICLE_DISABLE_HEIGHT_MAP_AVOIDANCE(enemyVehicle[vehicleEnum].veh, TRUE)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(enemyVehicle[vehicleEnum].veh, "EXILE_3_HELI_01_Group")
ELIF vehicleEnum = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
SET_VEHICLE_DISABLE_HEIGHT_MAP_AVOIDANCE(enemyVehicle[vehicleEnum].veh, TRUE)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(enemyVehicle[vehicleEnum].veh, "EXILE_3_HELI_02_Group")
ENDIF
//IF NOT bCollisionDamage
// SET_ENTITY_PROOFS(enemyVehicle[vehicleEnum].veh, FALSE, TRUE, FALSE, TRUE, TRUE)
//ENDIF
//IF NOT bDamagedByOthersExploding
// SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(enemyVehicle[vehicleEnum].veh, FALSE)
//printstring("set explode on high explosion damage false ") printint(ENUM_TO_INT(vehicleEnum)) printnl()
//ENDIF
//IF bBlip
// enemyVehicle[vehicleEnum].blip = CREATE_MISSION_BLIP_FOR_VEHICLE(enemyVehicle[vehicleEnum].veh, TRUE)
//ENDIF
enemyVehicle[vehicleEnum].bCommentedOnDestruction = FALSE
enemyVehicle[vehicleEnum].bExplodedVehicle = FALSE
enemyVehicle[vehicleEnum].bOccupantsDead = FALSE
enemyVehicle[vehicleEnum].bInSlowDownArea = FALSE
enemyVehicle[vehicleEnum].fPlaybackSpeed = fSpeed
ENDPROC
// setup the variations on an enemy ped
PROC SET_ENEMY_VARIATIONS(ENEMY_PED_ENUM enemyEnum)
PED_INDEX ped = enemyPed[enemyEnum].ped
IF NOT IS_PED_INJURED(ped)
INT iHairVar
INT iHeadVar
INT iHeadTex
INT iTorsoVar
INT iTorsoTex
INT iLegTex
INT iAccVar
INT iAccTex
INT iShadesVar = -1
INT iShadesTex = -1
INT iHatVar = -1
INT iHatTex = -1
BOOL bHasVariation = TRUE
SWITCH enemyEnum
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
iHairVar = 0
iHeadVar = 0
iHeadTex = 2
iTorsoVar = 1
iTorsoTex = 1
iLegTex = 2
iAccVar = 1
iAccTex = 0
iShadesVar = 0
iShadesTex = 0
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
iHairVar = 1
iHeadVar = 1
iHeadTex = 2
iTorsoVar = 1
iTorsoTex = 3
iLegTex = 0
iAccVar = 0
iAccTex = 2
iShadesVar = 0
iShadesTex = 0
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER
iHairVar = 0
iHeadVar = 1
iHeadTex = 2
iTorsoVar = 0
iTorsoTex = 4
iLegTex = 0
iAccVar = 0
iAccTex = 0
iShadesVar = 0
iShadesTex = 1
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
iHairVar = 1
iHeadVar = 0
iHeadTex = 1
iTorsoVar = 1
iTorsoTex = 2
iLegTex = 2
iAccVar = 1
iAccTex = 0
iHatVar = 0
iHatTex = 0
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
iHairVar = 1
iHeadVar = 0
iHeadTex = 0
iTorsoVar = 1
iTorsoTex = 0
iLegTex = 0
iAccVar = 0
iAccTex = 2
iHatVar = 0
iHatTex = 1
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
iHairVar = 0
iHeadVar = 1
iHeadTex = 0
iTorsoVar = 0
iTorsoTex = 5
iLegTex = 2
iAccVar = 0
iAccTex = 1
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
iHairVar = 0
iHeadVar = 0
iHeadTex = 2
iTorsoVar = 0
iTorsoTex = 1
iLegTex = 1
iAccVar = 1
iAccTex = 0
iShadesVar = 0
iShadesTex = 0
iHatVar = 1
iHatTex = 0
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
iHairVar = 1
iHeadVar = 1
iHeadTex = 0
iTorsoVar = 0
iTorsoTex = 4
iLegTex = 0
iAccVar = 0
iAccTex = 1
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
iHairVar = 1
iHeadVar = 0
iHeadTex = 1
iTorsoVar = 1
iTorsoTex = 1
iLegTex = 2
iAccVar = 1
iAccTex = 0
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
iHairVar = 1
iHeadVar = 1
iHeadTex = 2
iTorsoVar = 1
iTorsoTex = 1
iLegTex = 0
iAccVar = 1
iAccTex = 0
iShadesVar = 0
iShadesTex = 0
BREAK
DEFAULT
bHasVariation = FALSE
BREAK
ENDSWITCH
IF bHasVariation
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, iHairVar, 0)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HEAD, iHeadVar, iHeadTex)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, iTorsoVar, iTorsoTex)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 0, iLegTex)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, iAccVar, iAccTex)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL2, 0, 0)
CLEAR_PED_PROP(ped, ANCHOR_EYES)
CLEAR_PED_PROP(ped, ANCHOR_HEAD)
IF iShadesVar >= 0
SET_PED_PROP_INDEX(ped, ANCHOR_EYES, iShadesVar, iShadesTex)
ENDIF
IF iHatVar >= 0
SET_PED_PROP_INDEX(ped, ANCHOR_HEAD, iHatVar, iHatTex)
ENDIF
ENDIF
ENDIF
ENDPROC
// should do nm fall
FUNC BOOL SHOULD_THIS_SNIPER_FALL_ON_DEATH(ENEMY_PED_ENUM pedEnum)
SWITCH pedEnum
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_1
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_2
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_4
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
//CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// enemy blip time
FUNC INT GET_BLIP_ENEMY_PED_TIME(ENEMY_PED_ENUM pedEnum)
SWITCH pedEnum
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
IF NOT bJumpedToShootout
RETURN 8245
ENDIF
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
IF NOT bJumpedToShootout
RETURN 6965
ENDIF
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
IF NOT bJumpedToShootout
RETURN 9401
ENDIF
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
IF NOT bJumpedToShootout
RETURN 23956//19035
ELSE
RETURN 16434//11477
ENDIF
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
RETURN 11726
BREAK
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_1
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_2
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_3
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_4
BREAK
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
RETURN 8740
BREAK
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
//CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
//CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_4
BREAK
CASE EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
RETURN 2918
BREAK
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_PASSFR
BREAK
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
BREAK
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSFR
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
RETURN 999999999
BREAK
ENDSWITCH
RETURN 0
ENDFUNC
// create enemy ped
PROC CREATE_ENEMY_PED(ENEMY_PED_ENUM pedEnum)
VECTOR vPos = <<0,0,0>>
FLOAT fRot = 0.0
BOOL bInVehicle = TRUE
ENEMY_VEHICLE_ENUM vehicleEnum
VEHICLE_SEAT seat = VS_DRIVER
BOOL bDriveByPed = TRUE
BOOL bCritProof = FALSE
BOOL bBoostHealth = FALSE
BOOL bOnlyDamagedByPlayer = FALSE
INT iAccuracy = 2
WEAPON_TYPE weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SMG)
SWITCH pedEnum
// SHOOTOUT
// wave 1 boat 1
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_1
bOnlyDamagedByPlayer = TRUE
iAccuracy = 2
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_1
seat = VS_FRONT_RIGHT
bOnlyDamagedByPlayer = TRUE
iAccuracy = 2
BREAK
// wave 1 boat 2
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_2
bOnlyDamagedByPlayer = TRUE
iAccuracy = 2
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_2
seat = VS_FRONT_RIGHT
bOnlyDamagedByPlayer = TRUE
iAccuracy = 2
BREAK
// wave 1 boat 3
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_3
bOnlyDamagedByPlayer = TRUE
iAccuracy = 3
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_3
seat = VS_FRONT_RIGHT
bOnlyDamagedByPlayer = TRUE
iAccuracy = 3
BREAK
// wave 1 chopper 1
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
//bCritProof = TRUE
//bBoostHealth = TRUE
bOnlyDamagedByPlayer = TRUE
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
seat = VS_BACK_LEFT
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
bOnlyDamagedByPlayer = TRUE
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
seat = VS_BACK_RIGHT
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
bOnlyDamagedByPlayer = TRUE
BREAK
// wave 2 chopper 1
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
vehicleEnum = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
bOnlyDamagedByPlayer = TRUE
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
vehicleEnum = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
seat = VS_BACK_LEFT
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
bOnlyDamagedByPlayer = TRUE
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
vehicleEnum = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
seat = VS_BACK_RIGHT
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
bOnlyDamagedByPlayer = TRUE
BREAK
// wave 3 foot 1
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_1
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
iAccuracy = 0
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
vPos = <<-510.41333, 4453.61816, 89.10837>>
fRot = -166.3
BREAK
// wave 3 foot 2
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_2
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
iAccuracy = 0
vPos = <<-522.07892, 4437.87119, 80.63990>>
fRot = -146.1
BREAK
// wave 3 foot 3
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_3
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
iAccuracy = 0
vPos = <<-523.91626, 4451.52188, 75.71128>>
fRot = -137.6
BREAK
// wave 3 foot 4
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_4
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
iAccuracy = 0
vPos = <<-527.52893, 4479.11475, 61.24358>>
fRot = -162.6
BREAK
// wave 4 chopper 1
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
vehicleEnum = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
bOnlyDamagedByPlayer = TRUE
//iAccuracy = 100
BREAK
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL
vehicleEnum = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
seat = VS_BACK_LEFT
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
bOnlyDamagedByPlayer = TRUE
BREAK
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
vehicleEnum = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
seat = VS_BACK_RIGHT
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
bOnlyDamagedByPlayer = TRUE
BREAK
// wave 5 foot 1
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
iAccuracy = 0
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
vPos = <<-543.41663, 4738.74414, 338.56232>>
fRot = -166.3
BREAK
// wave 5 foot 2
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
iAccuracy = 0
vPos = <<-508.26, 4680.58, 286.96>>//<<-519.7, 4682.61816, 296.10837>>
fRot = -162.8
BREAK
// wave 5 foot 3
/*
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
iAccuracy = 0
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
vPos = <<-502.05472, 4477.52783, 67.80651>>
fRot = -166.3
BREAK
// wave 5 foot 4
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_4
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
iAccuracy = 0
vPos = <<-487.31683, 4500.89746, 80.46754>>
fRot = -177.7
BREAK
*/
// CHASE
// heli wave 1 chopper 1
CASE EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
vehicleEnum = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
iAccuracy = 7
BREAK
/*
CASE EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PASSBL
vehicleEnum = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
seat = VS_BACK_LEFT
weapon = GET_ENEMY_WEAPON(EWEAPON_RIFLE)
BREAK
CASE EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PASSBR
vehicleEnum = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
seat = VS_BACK_RIGHT
weapon = GET_ENEMY_WEAPON(EWEAPON_RIFLE)
BREAK
*/
// heli wave 2 chopper 1
//CASE EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PILOT
// vehicleEnum = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
// bDriveByPed = FALSE
//BREAK
/*
CASE EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PASSBL
vehicleEnum = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
seat = VS_BACK_LEFT
weapon = GET_ENEMY_WEAPON(EWEAPON_RIFLE)
BREAK
CASE EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PASSBR
vehicleEnum = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
seat = VS_BACK_RIGHT
weapon = GET_ENEMY_WEAPON(EWEAPON_RIFLE)
BREAK
*/
// boat wave 1 boat 1
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
iAccuracy = 1
BREAK
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_PASSFR
vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
seat = VS_FRONT_RIGHT
iAccuracy = 1
BREAK
// boat wave 1 boat 2
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER
vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
iAccuracy = 1
BREAK
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
seat = VS_FRONT_RIGHT
iAccuracy = 1
BREAK
// boat wave 1 boat 2
//CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_3_DRIVER
// vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_3
//BREAK
//CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_3_PASSFR
// vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_3
// seat = VS_FRONT_RIGHT
//BREAK
// boat wave 2 boat 1
//CASE EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_DRIVER
// vehicleEnum = EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
//BREAK
//CASE EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_PASSFR
// vehicleEnum = EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
// seat = VS_FRONT_RIGHT
//BREAK
// boat wave 2 boat 2
//CASE EP_CHASE_SECOND_BOAT_WAVE_BOAT_2_DRIVER
// vehicleEnum = EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
//BREAK
//CASE EP_CHASE_SECOND_BOAT_WAVE_BOAT_2_PASSFR
/// vehicleEnum = EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
// seat = VS_FRONT_RIGHT
//BREAK
// boat wave 3 boat 1
//CASE EP_CHASE_THIRD_BOAT_WAVE_BOAT_1_DRIVER
// vehicleEnum = EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
//BREAK
//CASE EP_CHASE_THIRD_BOAT_WAVE_BOAT_1_PASSFR
// vehicleEnum = EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
// seat = VS_FRONT_RIGHT
//BREAK
// boat wave 3 boat 2
//CASE EP_CHASE_THIRD_BOAT_WAVE_BOAT_2_DRIVER
// vehicleEnum = EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
//BREAK
//CASE EP_CHASE_THIRD_BOAT_WAVE_BOAT_2_PASSFR
// vehicleEnum = EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
// seat = VS_FRONT_RIGHT
//BREAK
// boat wave 4 boat 1
//CASE EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_DRIVER
// vehicleEnum = EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
//BREAK
//CASE EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_PASSFR
// vehicleEnum = EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
// seat = VS_FRONT_RIGHT
//BREAK
// bridge wave foot
/*
CASE EP_CHASE_BRIDGE_WAVE_FOOT_1
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
vPos = <<-876.64, 4412.65, 19.91>>
fRot = -52.8
BREAK
CASE EP_CHASE_BRIDGE_WAVE_FOOT_2
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
vPos = <<-881.08, 4418.78, 19.91>>
fRot = -68.6
BREAK
CASE EP_CHASE_BRIDGE_WAVE_FOOT_3
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
vPos = <<-883.33, 4425.17, 19.84>>
fRot = -76.1
BREAK
CASE EP_CHASE_BRIDGE_WAVE_FOOT_4
bOnlyDamagedByPlayer = TRUE
bInVehicle = FALSE
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
vPos = <<-882.87, 4429.75, 19.83>>
fRot = 0.0
BREAK
*/
// car wave 1
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER
vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_1
iAccuracy = 1
BREAK
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSFR
vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_1
seat = VS_FRONT_RIGHT
iAccuracy = 2
BREAK
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_1
seat = VS_BACK_RIGHT
iAccuracy = 1
BREAK
//CASE EP_CHASE_FIRST_CAR_WAVE_CAR_2_DRIVER
// vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_2
//BREAK
//CASE EP_CHASE_FIRST_CAR_WAVE_CAR_2_PASSFR
// vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_2
// seat = VS_FRONT_RIGHT
//BREAK
//CASE EP_CHASE_FIRST_CAR_WAVE_CAR_2_PASSBR
// vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_2
// seat = VS_BACK_RIGHT
//BREAK
// FLEE
// boat 1
//CASE EP_FLEE_WAVE_BOAT_1_DRIVER
// vehicleEnum = EV_FLEE_WAVE_BOAT_1
//BREAK
//CASE EP_FLEE_WAVE_BOAT_1_PASSFR
// vehicleEnum = EV_FLEE_WAVE_BOAT_1
// seat = VS_FRONT_RIGHT
//BREAK
// boat 2
//CASE EP_FLEE_WAVE_BOAT_2_DRIVER
// vehicleEnum = EV_FLEE_WAVE_BOAT_2
//BREAK
//CASE EP_FLEE_WAVE_BOAT_2_PASSFR
// vehicleEnum = EV_FLEE_WAVE_BOAT_2
// seat = VS_FRONT_RIGHT
//BREAK
ENDSWITCH
IF bInVehicle
enemyPed[pedEnum].ped = CREATE_PED_INSIDE_VEHICLE(enemyVehicle[vehicleEnum].veh, PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), seat)
ELSE
enemyPed[pedEnum].ped = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), vPos, fRot)
//IF bBlip
//printstring("adding ped blip ") PRINTINT(ENUM_TO_INT(pedEnum)) PRINTNL()
//enemyPed[pedEnum].blip = CREATE_MISSION_BLIP_FOR_PED(enemyPed[pedEnum].ped, TRUE)
//ENDIF
ENDIF
IF bDriveByPed
GIVE_WEAPON_TO_PED(enemyPed[pedEnum].ped, weapon, INFINITE_AMMO, TRUE, TRUE)
enemyPed[pedEnum].iRecheckDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
ELSE
enemyPed[pedEnum].iRecheckDrivebyTime = -1
ENDIF
IF bCritProof
SET_PED_SUFFERS_CRITICAL_HITS(enemyPed[pedEnum].ped, FALSE)
ENDIF
IF bBoostHealth
CONST_INT BOOST_HEALTH 250
SET_PED_MAX_HEALTH(enemyPed[pedEnum].ped, BOOST_HEALTH)
SET_ENTITY_HEALTH(enemyPed[pedEnum].ped, BOOST_HEALTH)
ENDIF
IF bDoMerryweatherMassacre
iAccuracy = 100
ENDIF
SET_PED_ACCURACY(enemyPed[pedEnum].ped, iAccuracy)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(enemyPed[pedEnum].ped, TRUE)
//SET_ENTITY_ONLY_DAMAGED_BY_RELATIONSHIP_GROUP(enemyPed[pedEnum].ped, TRUE, RELGROUPHASH_PLAYER)
SET_PED_RELATIONSHIP_GROUP_HASH(enemyPed[pedEnum].ped, enemyRelGroup)
SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(enemyPed[pedEnum].ped, FALSE, enemyRelGroup)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyPed[pedEnum].ped, bOnlyDamagedByPlayer)
SET_PED_KEEP_TASK(enemyPed[pedEnum].ped, TRUE)
SET_PED_DIES_WHEN_INJURED(enemyPed[pedEnum].ped, TRUE)
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_GetOutBurningVehicle, FALSE)
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_GetOutUndriveableVehicle, FALSE)
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_DisableHurt, TRUE)
IF pedEnum = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
OR pedEnum = EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
OR pedEnum = EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_PreventAutoShuffleToDriversSeat, TRUE)
ENDIF
IF pedEnum = EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
OR pedEnum = EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
OR pedEnum = EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
OR pedEnum = EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[pedEnum].ped, WEAPONTYPE_VEHICLE_PLAYER_BUZZARD)
ENDIF
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(enemyPed[pedEnum].ped)
SET_ENEMY_VARIATIONS(pedEnum)
enemyPed[pedEnum].bRegisteredDead = FALSE
enemyPed[pedEnum].bRagdolled = FALSE
enemyPed[pedEnum].bBlipped = FALSE
enemyPed[pedEnum].bPauseGuns = FALSE
enemyPed[pedEnum].iKillTime = -1
IF pedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_1
OR pedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_2
OR pedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_3
OR pedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_4
OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
//OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
//OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_4
IF NOT SHOULD_THIS_SNIPER_FALL_ON_DEATH(pedEnum)
SET_ENTITY_HEALTH(enemyPed[pedEnum].ped, 100)
ENDIF
SET_PED_COMBAT_MOVEMENT(enemyPed[pedEnum].ped, CM_STATIONARY)
SET_PED_COMBAT_ATTRIBUTES(enemyPed[pedEnum].ped, CA_USE_COVER, FALSE)
IF pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
TASK_SKY_DIVE(enemyPed[pedEnum].ped)
SET_ENTITY_LOD_DIST(enemyPed[pedEnum].ped, 1000)
SET_PED_PARACHUTE_TINT_INDEX(enemyPed[pedEnum].ped, 6)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(enemyPed[pedEnum].ped, FALSE)
ELSE
TASK_SHOOT_AT_ENTITY(enemyPed[pedEnum].ped, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
ENDIF
SET_PED_SHOOT_RATE(enemyPed[pedEnum].ped, 65)
SET_PED_COMBAT_ATTRIBUTES(enemyPed[pedEnum].ped, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(enemyPed[pedEnum].ped, CA_DISABLE_PINNED_DOWN, TRUE)
ENDIF
ENDPROC
// fill wave properties
PROC FILL_ENEMY_WAVE_PROPERTIES(ENEMY_WAVE_ENUM waveEnum, ENEMY_VEHICLE_ENUM &firstVehicle, ENEMY_VEHICLE_ENUM &lastVehicle, ENEMY_PED_ENUM &firstPed, ENEMY_PED_ENUM &lastPed, BOOL &bHasVehicles)
bHasVehicles = TRUE
SWITCH waveEnum
CASE EW_SHOOTOUT_FIRST_WAVE
firstVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_1
lastVehicle = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
firstPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
lastPed = EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
BREAK
CASE EW_SHOOTOUT_SECOND_WAVE
firstVehicle = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
lastVehicle = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
firstPed = EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
lastPed = EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
BREAK
CASE EW_SHOOTOUT_THIRD_WAVE
firstPed = EP_SHOOTOUT_THIRD_WAVE_FOOT_1
lastPed = EP_SHOOTOUT_THIRD_WAVE_FOOT_4
bHasVehicles = FALSE
BREAK
CASE EW_SHOOTOUT_FOURTH_WAVE
firstVehicle = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
lastVehicle = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
firstPed = EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
lastPed = EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
BREAK
CASE EW_SHOOTOUT_FIFTH_WAVE
firstPed = EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
lastPed = EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
bHasVehicles = FALSE
BREAK
CASE EW_CHASE_FIRST_HELI_WAVE
firstVehicle = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
lastVehicle = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
firstPed = EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
lastPed = EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
BREAK
//CASE EW_CHASE_SECOND_HELI_WAVE
// firstVehicle = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
// lastVehicle = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
// firstPed = EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PILOT
// lastPed = EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PILOT
//BREAK
CASE EW_CHASE_FIRST_BOAT_WAVE
firstVehicle = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
lastVehicle = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
firstPed = EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
lastPed = EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
BREAK
//CASE EW_CHASE_SECOND_BOAT_WAVE
// firstVehicle = EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
// lastVehicle = EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
// firstPed = EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_DRIVER
// lastPed = EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_PASSFR
//BREAK
//CASE EW_CHASE_THIRD_BOAT_WAVE
// firstVehicle = EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
// lastVehicle = EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
// firstPed = EP_CHASE_THIRD_BOAT_WAVE_BOAT_1_DRIVER
// lastPed = EP_CHASE_THIRD_BOAT_WAVE_BOAT_1_PASSFR
//BREAK
//CASE EW_CHASE_FOURTH_BOAT_WAVE
// firstVehicle = EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
// lastVehicle = EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
// firstPed = EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_DRIVER
// lastPed = EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_PASSFR
//BREAK
//CASE EW_CHASE_BRIDGE_WAVE
// firstPed = EP_CHASE_BRIDGE_WAVE_FOOT_1
// lastPed = EP_CHASE_BRIDGE_WAVE_FOOT_4
// bHasVehicles = FALSE
//BREAK
CASE EW_CHASE_FIRST_CAR_WAVE
firstVehicle = EV_CHASE_FIRST_CAR_WAVE_CAR_1
lastVehicle = EV_CHASE_FIRST_CAR_WAVE_CAR_1
firstPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER
lastPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
BREAK
//CASE EW_FLEE_WAVE
// firstVehicle = EV_FLEE_WAVE_BOAT_1
// lastVehicle = EV_FLEE_WAVE_BOAT_2
// firstPed = EP_FLEE_WAVE_BOAT_1_DRIVER
// lastPed = EP_FLEE_WAVE_BOAT_2_PASSFR
//BREAK
ENDSWITCH
ENDPROC
// blip enemy wave
PROC BLIP_ENEMY_WAVE(ENEMY_WAVE_ENUM waveEnum, BOOL bBlip = TRUE)
INT i
ENEMY_VEHICLE_ENUM firstVehicle
ENEMY_VEHICLE_ENUM lastVehicle
ENEMY_PED_ENUM firstPed
ENEMY_PED_ENUM lastPed
BOOL bHasVehicles
FILL_ENEMY_WAVE_PROPERTIES(waveEnum, firstVehicle, lastVehicle, firstPed, lastPed, bHasVehicles)
FOR i=firstPed TO lastPed
enemyPed[i].bBlipped = bBlip
ENDFOR
ENDPROC
// create enemy wave
PROC CREATE_ENEMY_WAVE(ENEMY_WAVE_ENUM waveEnum, BOOL bBlip, MISSION_STAGE_ENUM createStage)
INT i
ENEMY_VEHICLE_ENUM firstVehicle
ENEMY_VEHICLE_ENUM lastVehicle
ENEMY_PED_ENUM firstPed
ENEMY_PED_ENUM lastPed
BOOL bHasVehicles
FILL_ENEMY_WAVE_PROPERTIES(waveEnum, firstVehicle, lastVehicle, firstPed, lastPed, bHasVehicles)
IF bHasVehicles
FOR i=firstVehicle TO lastVehicle
CREATE_ENEMY_VEHICLE(INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i), createStage)
ENDFOR
ENDIF
FOR i=firstPed TO lastPed
CREATE_ENEMY_PED(INT_TO_ENUM(ENEMY_PED_ENUM, i))
ENDFOR
// special attribs.
SWITCH waveEnum
CASE EW_SHOOTOUT_FIRST_WAVE
BREAK
CASE EW_CHASE_FIRST_HELI_WAVE
BREAK
ENDSWITCH
iCreatedWaveTime[waveEnum] = GET_GAME_TIMER()
BLIP_ENEMY_WAVE(waveEnum, bBlip)
ENDPROC
// get health to explode enemy
FUNC INT GET_ENEMY_VEHICLE_EXPLODE_HEALTH(ENEMY_VEHICLE_ENUM vehicleEnum)
SWITCH vehicleEnum
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
RETURN 800
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
RETURN 450
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
RETURN 600
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
RETURN 860//600
BREAK
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
RETURN 860//550
BREAK
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
RETURN 870//660
BREAK
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
RETURN 820//650
BREAK
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
RETURN 600
BREAK
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
RETURN 500
BREAK
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
// RETURN 700
//BREAK
//CASE EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
// RETURN 550
//BREAK
//CASE EV_FLEE_WAVE_BOAT_1
// RETURN 400
//BREAK
//CASE EV_FLEE_WAVE_BOAT_2
// RETURN 550
//BREAK
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
// CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
RETURN 600
BREAK
ENDSWITCH
RETURN -1000
ENDFUNC
// should we stop playback on this vehicle
FUNC BOOL HANDLE_STOP_PLAYBACK_FOR_ENEMY_VEHICLE(ENEMY_VEHICLE_ENUM vehicleEnum)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[vehicleEnum].veh)
FLOAT fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(enemyVehicle[vehicleEnum].veh)
FLOAT fStopDistance = -1
FLOAT fStopTime = 99999999
BOOL bStopGreaterX = FALSE
VEHICLE_INDEX stopForVehicle = NULL
SWITCH vehicleEnum
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
fStopTime = 30500
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
// fStopTime = 4000.0
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
fStopTime = 22800.0
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
// fStopTime = 13000.0
BREAK
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
fStopTime = 25000.0
BREAK
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
fStopTime = 13800.0
BREAK
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
stopForVehicle = enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh
fStopDistance = 60.0
bStopGreaterX = TRUE
BREAK
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
stopForVehicle = enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh
fStopDistance = 40.0
bStopGreaterX = TRUE
BREAK
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
fStopDistance = 35.0
BREAK
ENDSWITCH
IF fPlaybackTime >= fStopTime
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
RETURN TRUE
ELSE
IF fStopDistance >= 0.0
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), enemyVehicle[vehicleEnum].veh, FALSE) < fStopDistance
AND NOT enemyVehicle[vehicleEnum].bInSlowdownArea
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF bStopGreaterX
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR vVehiclePos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
IF vVehiclePos.x < vPlayerPos.x + 20
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
RETURN TRUE
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(stopForVehicle)
IF IS_ENTITY_AT_COORD(stopForVehicle, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(enemyVehicle[vehicleEnum].veh, <<0,12,0>>), <<5,5,5>>)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(stopForVehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
RETURN TRUE
ENDIF
ENDIF
ENDIF
//IF vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
// IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
/// IF IS_ENTITY_AT_ENTITY(enemyVehicle[vehicleEnum].veh, enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, <<6,6,6>>, FALSE, FALSE)
// STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
// RETURN TRUE
// ENDIF
// ENDIF
//ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// convert rot to dir
FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR v_rot)
RETURN <<-SIN(v_rot.z) * COS(v_rot.x), COS(v_rot.z) * COS(v_rot.x), SIN(v_rot.x)>>
ENDFUNC
// handle sniper ragdoll
PROC HANDLE_SNIPER_RAGDOLL(ENEMY_PED_ENUM thisPed)
IF NOT enemyPed[thisPed].bRagdolled
IF NOT IS_PED_INJURED(enemyPed[thisPed].ped)
IF SHOULD_THIS_SNIPER_FALL_ON_DEATH(thisPed)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyPed[thisPed].ped, PLAYER_PED_ID())
IF CAN_PED_RAGDOLL(enemyPed[thisPed].ped)
FLOAT fHeading
SWITCH thisPed
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_1
fHeading = -95.1
BREAK
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_2
fHeading = -97.4
BREAK
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_4
fHeading = -93.7
BREAK
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
fHeading = -108.1
BREAK
//CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
// fHeading = -148.6
//BREAK
ENDSWITCH
SET_PED_CAN_BE_TARGETTED(enemyPed[thisPed].ped, FALSE)
SET_PED_TO_RAGDOLL_WITH_FALL(enemyPed[thisPed].ped, 10000, 20000, TYPE_DIE_FROM_HIGH, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0,0,fHeading>>), 29.4, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
enemyPed[thisPed].bRagdolled = TRUE
enemyPed[thisPed].iRagdollTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(enemyPed[thisPed].ped)
VECTOR vSniperPos = GET_ENTITY_COORDS(enemyPed[thisPed].ped)
IF vSniperPos.z < 30.0
OR GET_GAME_TIMER() >= enemyPed[thisPed].iRagdollTime + 6000
APPLY_DAMAGE_TO_PED(enemyPed[thisPed].ped, 1000, TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
// should slow down?
FUNC BOOL IS_VEHICLE_AT_RAPIDS_SLOW_DOWN_AREA(VEHICLE_INDEX veh, BOOL bIsPlayer = TRUE)
IF IS_VEHICLE_DRIVEABLE(veh)
INT i
REPEAT 7 i
FLOAT fDistance
VECTOR vPos
SWITCH i
CASE 0
vPos = <<-877.51624, 4415.30225, 14.12306>>
fDistance = 25
BREAK
CASE 1
vPos = <<-957.37915, 4373.69629, 9.68289>>
IF bIsPlayer
fDistance = 18
ELSE
fDistance = 18//30
ENDIF
BREAK
CASE 2
vPos = <<-1126.07434, 4400.73340, 9.71688>>
IF bIsPlayer
fDistance = 50
ELSE
fDistance = 50
//fDistance = 55
ENDIF
BREAK
CASE 3
vPos = <<-1251.55200, 4377.40820, 4.73851>>
fDistance = 23
BREAK
CASE 4
vPos = <<-1358.41895, 4329.70166, 1.44652>>
fDistance = 45
BREAK
CASE 5
vPos = <<-1567.03735, 4360.92529, 0.04132>>
IF bIsPlayer
fDistance = 28
ELSE
fDistance = 28
//fDistance = 35
ENDIF
BREAK
CASE 6
vPos = <<-1716.22656, 4484.72266, 0.00000>>
IF bIsPlayer
fDistance = 0
ELSE
fDistance = 0
//fDistance = 45
ENDIF
BREAK
ENDSWITCH
IF IS_ENTITY_AT_COORD(veh, vPos, <<fDistance,fDistance,fDistance>>, FALSE, FALSE)
RETURN TRUE
ENDIF
ENDREPEAT
ENDIF
RETURN FALSE
ENDFUNC
// get goto pos for chase chopper
FUNC VECTOR GET_CHOPPER_NODE(INT iPos)
SWITCH iPos
CASE 0
RETURN <<-571.55, 4427.86, 34.62>>
BREAK
CASE 1
RETURN <<-865.79, 4416.12, 34.57>>
BREAK
CASE 2
RETURN <<-988.98, 4367.28, 27.33>>
BREAK
CASE 3
RETURN <<-1174.79, 4397.0, 27.97>>
BREAK
CASE 4
RETURN <<-1372.43, 4324.25, 18.53>>
BREAK
CASE 5
RETURN <<-1572.65, 4370.89, 16.13>>
BREAK
CASE 6
RETURN <<-1883.87, 4703.35, 20.73>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
// get a heading normalised between 0 and 360
FUNC FLOAT NORMALISE_HEADING(FLOAT fHeading)
FLOAT fReturn = fHeading
IF fReturn < 0
fReturn += 360
ELIF fReturn > 360
fReturn -= 360
ENDIF
RETURN fReturn
ENDFUNC
// get closest waypoint
FUNC INT GET_CLOSEST_BOAT_WAYPOINT(VEHICLE_INDEX boatVeh, STRING sRoute, BOOL bEnforceXGreater = TRUE, BOOL bAdd = FALSE)
INT iClosestWaypoint
VECTOR vClosestWaypoint
VECTOR vBoatPos
vBoatPos = GET_ENTITY_COORDS(boatVeh)
BOOL bFoundLaterWaypoint
bFoundLaterWaypoint = FALSE
INT iWaypointSearchCounter
iWaypointSearchCounter = 1
WHILE NOT bFoundLaterWaypoint
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(sRoute, vBoatPos + <<-15 * iWaypointSearchCounter,0,0>>, iClosestWaypoint)
WAYPOINT_RECORDING_GET_COORD(sRoute, iClosestWaypoint, vClosestWaypoint)
IF vClosestWaypoint.x < vBoatPos.x
OR NOT bEnforceXGreater
bFoundLaterWaypoint = TRUE
ELSE
iWaypointSearchCounter++
IF iWaypointSearchCounter > 3
iClosestWaypoint = -1
bFoundLaterWaypoint = TRUE
ENDIF
ENDIF
ENDWHILE
IF bAdd
INT iAddedWaypoint = iClosestWaypoint + 10
INT iNumpoints
WAYPOINT_RECORDING_GET_NUM_POINTS(sRoute, iNumpoints)
IF iAddedWaypoint < iNumpoints - 1
iClosestWaypoint = iAddedWaypoint
ELSE
iClosestWaypoint = iNumpoints - 1
ENDIF
ENDIF
RETURN iClosestWaypoint
ENDFUNC
FUNC BOOL CAN_BOAT_DRIVE(VEHICLE_INDEX veh)
IF IS_VEHICLE_DRIVEABLE(veh)
IF GET_ENTITY_HEALTH(veh) > 550
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// get the enemy ai from the stage
PROC SET_ENEMY_VEHICLE_AI_FOR_STAGE(ENEMY_VEHICLE_ENUM vehicleEnum, PED_INDEX vehicleDriver)
ENEMY_VEHICLE_AI_ENUM setAIEnum = EVAI_NONE
VECTOR vTarget
FLOAT fTargetRadius = 3.0
TEMPACTION temporaryAction
VEHICLE_MISSION vehicleMission = MISSION_NONE
INT iActionTime = -1
FLOAT fSpeed = 20.0
FLOAT fOrientation = -1
INT iFlightHeight = 10
INT iHeightAboveTerrain = 5
STRING sRoute
// get the task details
SWITCH vehicleEnum
// FIRST WAVE
// boat 1
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
SWITCH enemyVehicle[vehicleEnum].iAiStage
CASE 1
setAIEnum = EVAI_ANCHOR
BREAK
CASE 20
setAIEnum = EVAI_FOLLOW_WAYPOINT
fSpeed = 5.0
vTarget = <<-460.66696, 4443.94824, 29.99993>>
fTargetRadius = 3.5
BREAK
CASE 21
setAIEnum = EVAI_TEMPACTION
temporaryAction = TEMPACT_SWERVERIGHT_STOP
iActionTime = 4000
BREAK
CASE 22
setAIEnum = EVAI_ANCHOR
BREAK
ENDSWITCH
BREAK
// boat 2
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
SWITCH enemyVehicle[vehicleEnum].iAiStage
CASE 1
setAIEnum = EVAI_ANCHOR
BREAK
CASE 20
setAIEnum = EVAI_FOLLOW_WAYPOINT
fSpeed = 5.0
vTarget = <<-460.88925, 4433.06152, 29.99993>>
fTargetRadius = 6
BREAK
CASE 21
setAIEnum = EVAI_TEMPACTION
temporaryAction = TEMPACT_SWERVERIGHT_STOP
iActionTime = 4000
BREAK
CASE 22
setAIEnum = EVAI_ANCHOR
BREAK
ENDSWITCH
BREAK
// boat 3
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
SWITCH enemyVehicle[vehicleEnum].iAiStage
CASE 1
setAIEnum = EVAI_ANCHOR
BREAK
CASE 20
setAIEnum = EVAI_FOLLOW_WAYPOINT
fSpeed = 5.0
vTarget = <<-481.99393, 4407.47803, 29.99993>>
fTargetRadius = 6
BREAK
CASE 21
setAIEnum = EVAI_TEMPACTION
temporaryAction = TEMPACT_SWERVERIGHT_STOP
iActionTime = 4000
BREAK
CASE 22
setAIEnum = EVAI_ANCHOR
BREAK
ENDSWITCH
BREAK
// chopper 1
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
SWITCH enemyVehicle[vehicleEnum].iAiStage
CASE 1
setAIEnum = EVAI_CHOPPER_ATTACK
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID())
iFlightHeight = 48
iHeightAboveTerrain = 4
iActionTime = 7000
BREAK
CASE 2
setAIEnum = EVAI_FLY_TO_COORD
vTarget = <<-508.31, 4448.87, 48.27>>
fTargetRadius = 8.0
fSpeed = 25.0
iFlightHeight = 48
iHeightAboveTerrain = 5
fOrientation = 161//-1//124
BREAK
CASE 3
/*
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
fOrientation = 200
iActionTime = 2000
*/
setAIEnum = EVAI_CHOPPER_ATTACK
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID())
iFlightHeight = 48
iHeightAboveTerrain = 4
iActionTime = 7000
BREAK
CASE 4
setAIEnum = EVAI_FLY_TO_COORD
//vTarget = <<-524.90, 4401.21, 35.61>>
vTarget = <<-522.73, 4410.99, 37.33>>
fTargetRadius = 10.0
fSpeed = 20.0
iFlightHeight = 37
iHeightAboveTerrain = 2
fOrientation = -106//179//200
BREAK
CASE 5
/*
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
fOrientation = 200
iActionTime = 2000
*/
setAIEnum = EVAI_CHOPPER_ATTACK
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID())
iFlightHeight = 34
iHeightAboveTerrain = 4
BREAK
/*
// rotate to face opposite way
CASE 50
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
fOrientation = 320
iActionTime = 4000
BREAK
// escape
CASE 99
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
fOrientation = 270
iActionTime = 4000
BREAK
CASE 100
setAIEnum = EVAI_CHOPPER_ATTACK
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID()) + 3.0
iFlightHeight = 34
iHeightAboveTerrain = 4
BREAK
CASE 101
setAIEnum = EVAI_FLY_TO_COORD
vTarget = GET_TRAIN_CRASH_VECTOR(TCVEC_GUNS_CHOPPER_HOVER)
fTargetRadius = 0.1
fSpeed = 15.0
iFlightHeight = CEIL(vTarget.z)
iHeightAboveTerrain = 4
VECTOR vChopperPos
vChopperPos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
VECTOR vTargetPos
vTargetPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
fOrientation = GET_HEADING_FROM_VECTOR_2D(vTargetPos.x - vChopperPos.x, vTargetPos.y - vChopperPos.y)
fOrientation = NORMALISE_HEADING(fOrientation)
BREAK
*/
ENDSWITCH
BREAK
// chopper 2
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
SWITCH enemyVehicle[vehicleEnum].iAiStage
CASE 1
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
fOrientation = 156
iActionTime = 100
BREAK
CASE 2
setAIEnum = EVAI_FLY_TO_COORD
vTarget = <<-475.15, 4444.42, 39.26>>
fTargetRadius = 5.0
fSpeed = 30.0
iFlightHeight = 30
iHeightAboveTerrain = 7
fOrientation = 113
BREAK
CASE 3
setAIEnum = EVAI_CHOPPER_ATTACK_COORD
vTarget = <<-491.76651, 4435.12305, 30.49994>>
fTargetRadius = 25
iFlightHeight = 30
iHeightAboveTerrain = 7
iActionTime = GET_RANDOM_INT_IN_RANGE(9000, 13000)
BREAK
CASE 4
setAIEnum = EVAI_FLY_TO_COORD
vTarget = <<-475.2, 4438.42, 39.26>>
fTargetRadius = 7.0
fSpeed = 30.0
iFlightHeight = 30
iHeightAboveTerrain = 7
fOrientation = 92
BREAK
CASE 5
setAIEnum = EVAI_CHOPPER_ATTACK_COORD
vTarget = <<-491.76651, 4435.12305, 30.49994>>
fTargetRadius = 25
iFlightHeight = 30
iHeightAboveTerrain = 7
iActionTime = GET_RANDOM_INT_IN_RANGE(9000, 13000)
BREAK
/*
CASE 3
setAIEnum = EVAI_FLY_TO_COORD
vTarget = GET_TRAIN_CRASH_VECTOR(TCVEC_DROPOFF_CHOPPER_HOVER)
fTargetRadius = 0.1
fSpeed = 10.0
iFlightHeight = CEIL(vTarget.z)
iHeightAboveTerrain = 15
VECTOR vChopperPos
vChopperPos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
VECTOR vTargetPos
vTargetPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
fOrientation = GET_HEADING_FROM_VECTOR_2D(vTargetPos.x - vChopperPos.x, vTargetPos.y - vChopperPos.y)
fOrientation = NORMALISE_HEADING(fOrientation)
BREAK
*/
ENDSWITCH
BREAK
// chopper 3
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
SWITCH enemyVehicle[vehicleEnum].iAiStage
CASE 1
/*
setAIEnum = EVAI_CHOPPER_ATTACK
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID()) + 3.0
iFlightHeight = 81
iHeightAboveTerrain = 2
*/
//vTarget = <<-524.90, 4401.21, 35.61>>
setAIEnum = EVAI_FLY_TO_COORD
vTarget = <<-505.21, 4467.72, 79.31>>
fTargetRadius = 8.0
fSpeed = 30.0
iFlightHeight = 93
iHeightAboveTerrain = 5
fOrientation = 200
BREAK
/*
CASE 3
setAIEnum = EVAI_FLY_TO_COORD
vTarget = GET_TRAIN_CRASH_VECTOR(TCVEC_DROPOFF_CHOPPER_HOVER)
fTargetRadius = 0.1
fSpeed = 10.0
iFlightHeight = CEIL(vTarget.z)
iHeightAboveTerrain = 15
VECTOR vChopperPos
vChopperPos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
VECTOR vTargetPos
vTargetPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
fOrientation = GET_HEADING_FROM_VECTOR_2D(vTargetPos.x - vChopperPos.x, vTargetPos.y - vChopperPos.y)
fOrientation = NORMALISE_HEADING(fOrientation)
BREAK
*/
ENDSWITCH
BREAK
// FIRST HELI WAVE
// chopper 1
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
SWITCH enemyVehicle[vehicleEnum].iAiStage
/*
CASE 1
setAIEnum = EVAI_FLY_TO_COORD
vTarget = <<-1154.83, 4402.65, 14.95>>
fTargetRadius = 20.0
fSpeed = 40.0
iFlightHeight = 14
iHeightAboveTerrain = 5
BREAK
*/
CASE 1
setAIEnum = EVAI_CHOPPER_STRAFE
BREAK
ENDSWITCH
BREAK
// SECOND HELI WAVE
// chopper 1
//CASE EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
// SWITCH enemyVehicle[vehicleEnum].iAiStage
// CASE 99
// setAIEnum = EVAI_CHOPPER_GUNS_STATIC
// BREAK
// ENDSWITCH
//BREAK
// FIRST BOAT WAVE
// boat 1
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
//CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_3
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
//CASE EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
SWITCH enemyVehicle[vehicleEnum].iAiStage
CASE 1
setAIEnum = EVAI_FOLLOW_WAYPOINT
fSpeed = 20.0
BREAK
CASE 2
setAIEnum = EVAI_FOLLOW_DINGHY
IF vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
vehicleMission = MISSION_ESCORT_LEFT
ELSE
vehicleMission = MISSION_ESCORT_RIGHT
ENDIF
fSpeed = 50.0
BREAK
ENDSWITCH
BREAK
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
SWITCH enemyVehicle[vehicleEnum].iAiStage
CASE 99
setAIEnum = EVAI_CAR_DRIVE_ALONG_RIVER
BREAK
ENDSWITCH
BREAK
// FLEE WAVE
// boat 1
//CASE EV_FLEE_WAVE_BOAT_1
//CASE EV_FLEE_WAVE_BOAT_2
// SWITCH enemyVehicle[vehicleEnum].iAiStage
// CASE 99
// setAIEnum = EVAI_FOLLOW_DINGHY
// fSpeed = 32.0
// BREAK
// ENDSWITCH
//BREAK
ENDSWITCH
// apply the task
SWITCH setAIEnum
CASE EVAI_TEMPACTION
TASK_VEHICLE_TEMP_ACTION(vehicleDriver, enemyVehicle[vehicleEnum].veh, temporaryAction, iActionTime)
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
BREAK
CASE EVAI_DRIVE_TO_COORD
TASK_VEHICLE_DRIVE_TO_COORD(vehicleDriver, enemyVehicle[vehicleEnum].veh, vTarget, fSpeed, DRIVINGSTYLE_ACCURATE, GET_ENTITY_MODEL(enemyVehicle[vehicleEnum].veh), DRIVINGMODE_PLOUGHTHROUGH, 1.0, 300.0)
enemyVehicle[vehicleEnum].vTarget = vTarget
enemyVehicle[vehicleEnum].vTargetRadius = <<fTargetRadius,fTargetRadius,fTargetRadius>>
IF iActionTime > 0
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
ELSE
enemyVehicle[vehicleEnum].iTerminateActionTime = -1
ENDIF
BREAK
CASE EVAI_FOLLOW_DINGHY
IF vehicleMission = MISSION_NONE
vehicleMission = MISSION_ESCORT_REAR
ENDIF
TASK_VEHICLE_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, trainCrashVehicle[TCV_DINGHY], vehicleMission, fSpeed, DRIVINGMODE_AVOIDCARS, 35, -1)
BREAK
CASE EVAI_FOLLOW_WAYPOINT
INT iClosestWaypoint
SWITCH vehicleEnum
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
sRoute = "exile32"
BREAK
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
sRoute = "exile33"
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
sRoute = "exile36"
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
sRoute = "exile37"
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
sRoute = "exile38"
BREAK
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
/// sRoute = "exile38"
//BREAK
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
// sRoute = "exile39"
//BREAK
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
// sRoute = "exile35"
//BREAK
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
// sRoute = "exile36"
//BREAK
//CASE EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
// sRoute = "exile37"
//BREAK
ENDSWITCH
IF currentMissionStage <> STAGE_STEAL_FROM_CONTAINER
iClosestWaypoint = GET_CLOSEST_BOAT_WAYPOINT(enemyVehicle[vehicleEnum].veh, sRoute)
ELSE
enemyVehicle[vehicleEnum].vTarget = vTarget
enemyVehicle[vehicleEnum].vTargetRadius = <<fTargetRadius,fTargetRadius,fTargetRadius>>
iClosestWaypoint = 0
ENDIF
IF iClosestWaypoint >= 0
SET_BOAT_ANCHOR(enemyVehicle[vehicleEnum].veh, FALSE)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(vehicleDriver, enemyVehicle[vehicleEnum].veh, sRoute, DRIVINGMODE_PLOUGHTHROUGH, iClosestWaypoint, EWAYPOINT_DEFAULT, -1, fSpeed)
SET_BOAT_DISABLE_AVOIDANCE(enemyVehicle[vehicleEnum].veh, TRUE)
ENDIF
BREAK
CASE EVAI_ANCHOR
//FREEZE_ENTITY_POSITION(enemyVehicle[vehicleEnum].veh, TRUE)
//SET_ENTITY_LOAD_COLLISION_FLAG(enemyVehicle[vehicleEnum].veh, TRUE)
//TASK_VEHICLE_TEMP_ACTION(vehicleDriver, enemyVehicle[vehicleEnum].veh, TEMPACT_WAIT, 2000)
BREAK
CASE EVAI_FLY_TO_COORD
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, NULL, vTarget, MISSION_GOTO, fSpeed, fTargetRadius, fOrientation, iFlightHeight, iHeightAboveTerrain)
enemyVehicle[vehicleEnum].vTarget = vTarget
enemyVehicle[vehicleEnum].vTargetRadius = <<fTargetRadius,fTargetRadius,fTargetRadius>>
BREAK
CASE EVAI_FLY_ACHIEVE_HEADING
VECTOR vChopperPos
vChopperPos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, NULL, vChopperPos, MISSION_GOTO, 10, 10, fOrientation, FLOOR(vChopperPos.z), 1)
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
BREAK
CASE EVAI_CHOPPER_ATTACK
SET_PED_FIRING_PATTERN(vehicleDriver, FIRING_PATTERN_FULL_AUTO)
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, PLAYER_PED_ID(), <<0,0,0>>, MISSION_ATTACK, 10, fTargetRadius, fOrientation, iFlightHeight, iHeightAboveTerrain)
IF iActionTime > 0
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
ELSE
enemyVehicle[vehicleEnum].iTerminateActionTime = -1
ENDIF
BREAK
CASE EVAI_CHOPPER_ATTACK_COORD
SET_PED_FIRING_PATTERN(vehicleDriver, FIRING_PATTERN_FULL_AUTO)
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, NULL, vTarget, MISSION_ATTACK, 10, fTargetRadius, fOrientation, iFlightHeight, iHeightAboveTerrain)
IF iActionTime > 0
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
ELSE
enemyVehicle[vehicleEnum].iTerminateActionTime = -1
ENDIF
BREAK
CASE EVAI_CHOPPER_STRAFE
//IF NOT IS_PED_INJURED(dummyBoatPed)
SET_PED_FIRING_PATTERN(vehicleDriver, FIRING_PATTERN_FULL_AUTO)
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, trainCrashVehicle[TCV_DINGHY], NULL, <<0,0,0>>, MISSION_ATTACK, 65, 25.0, -1, 16, 6) // 35.0 dist 19 height
// FLOAT CruiseSpeed, FLOAT TargetReachedDist, FLOAT HeliOrientation, INT FlightHeight, INT MinHeightAboveTerrain)
//ENDIF
BREAK
CASE EVAI_CHOPPER_GUNS_STATIC
SET_PED_FIRING_PATTERN(vehicleDriver, FIRING_PATTERN_FULL_AUTO)
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, PLAYER_PED_ID(), <<0,0,0>>, MISSION_ATTACK, 0, 5.0, 0, 0, 0)
BREAK
CASE EVAI_CAR_DRIVE_ALONG_RIVER
INT iStart
SWITCH vehicleEnum
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
sRoute = "exile34"
iStart = 4
BREAK
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
// sRoute = "exile39"
// iStart = 4
//BREAK
ENDSWITCH
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(vehicleDriver, enemyVehicle[vehicleEnum].veh, sRoute, DRIVINGMODE_PLOUGHTHROUGH, iStart)
BREAK
ENDSWITCH
enemyVehicle[vehicleEnum].aiEnum = setAIEnum
ENDPROC
// do enemy vehicle AI
PROC DO_ENEMY_VEHICLE_AI(ENEMY_VEHICLE_ENUM vehicleEnum)
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[vehicleEnum].veh)
IF enemyVehicle[vehicleEnum].aiEnum <> EVAI_NONE
PED_INDEX vehicleDriver = GET_PED_IN_VEHICLE_SEAT(enemyVehicle[vehicleEnum].veh, VS_DRIVER)
IF NOT IS_PED_INJURED(vehicleDriver)
BOOL bDoNextAIStage = FALSE
BOOL bRepeatStage = FALSE
SWITCH enemyVehicle[vehicleEnum].aiEnum
CASE EVAI_FOLLOW_RECORDING
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[vehicleEnum].veh)
OR HANDLE_STOP_PLAYBACK_FOR_ENEMY_VEHICLE(vehicleEnum)
bDoNextAIStage = TRUE
ENDIF
BREAK
CASE EVAI_FOLLOW_WAYPOINT
IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER
IF IS_ENTITY_AT_COORD(enemyVehicle[vehicleEnum].veh, enemyVehicle[vehicleEnum].vTarget, enemyVehicle[vehicleEnum].vTargetRadius, FALSE, FALSE)
bDoNextAIStage = TRUE
ENDIF
ENDIF
BREAK
CASE EVAI_TEMPACTION
IF GET_GAME_TIMER() >= enemyVehicle[vehicleEnum].iTerminateActionTime
bDoNextAIStage = TRUE
ENDIF
BREAK
CASE EVAI_DRIVE_TO_COORD
IF IS_ENTITY_AT_COORD(enemyVehicle[vehicleEnum].veh, enemyVehicle[vehicleEnum].vTarget, enemyVehicle[vehicleEnum].vTargetRadius, FALSE, FALSE)
OR (enemyVehicle[vehicleEnum].iTerminateActionTime >= 0 AND GET_GAME_TIMER() >= enemyVehicle[vehicleEnum].iTerminateActionTime)
bDoNextAIStage = TRUE
ENDIF
BREAK
CASE EVAI_FLY_TO_COORD
IF IS_ENTITY_AT_COORD(enemyVehicle[vehicleEnum].veh, enemyVehicle[vehicleEnum].vTarget, enemyVehicle[vehicleEnum].vTargetRadius)
bDoNextAIStage = TRUE
ENDIF
BREAK
CASE EVAI_FLY_ACHIEVE_HEADING
IF GET_GAME_TIMER() >= enemyVehicle[vehicleEnum].iTerminateActionTime
bDoNextAIStage = TRUE
ENDIF
BREAK
CASE EVAI_CHOPPER_STRAFE
BREAK
CASE EVAI_CHOPPER_ATTACK
CASE EVAI_CHOPPER_ATTACK_COORD
IF enemyVehicle[vehicleEnum].iTerminateActionTime >= 0 AND GET_GAME_TIMER() >= enemyVehicle[vehicleEnum].iTerminateActionTime
bDoNextAIStage = TRUE
ENDIF
BREAK
CASE EVAI_ANCHOR
//IF NOT HAS_ENTITY_COLLIDED_WITH_ANYTHING(enemyVehicle[vehicleEnum].veh)
printstring("anchor ") printint(enum_to_int(vehicleEnum)) PRINTNL()
SET_BOAT_ANCHOR(enemyVehicle[vehicleEnum].veh, TRUE)
//FREEZE_ENTITY_POSITION(enemyVehicle[vehicleEnum].veh, TRUE)
bDoNextAIStage = TRUE
//ELSE
// printstring("colliding ") printint(enum_to_int(vehicleEnum)) PRINTNL()
//ENDIF
BREAK
ENDSWITCH
IF bDoNextAIStage
enemyVehicle[vehicleEnum].iAiStage++
SET_ENEMY_VEHICLE_AI_FOR_STAGE(vehicleEnum, vehicleDriver)
ELIF bRepeatStage
SET_ENEMY_VEHICLE_AI_FOR_STAGE(vehicleEnum, vehicleDriver)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// force enemy ai stage
PROC FORCE_ENEMY_VEHICLE_AI_STAGE(ENEMY_VEHICLE_ENUM vehicleEnum, INT iStage)
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[vehicleEnum].veh)
PED_INDEX vehicleDriver = GET_PED_IN_VEHICLE_SEAT(enemyVehicle[vehicleEnum].veh, VS_DRIVER)
IF NOT IS_PED_INJURED(vehicleDriver)
enemyVehicle[vehicleEnum].iAiStage = iStage
SET_ENEMY_VEHICLE_AI_FOR_STAGE(vehicleEnum, vehicleDriver)
ENDIF
ENDIF
ENDPROC
// get the closest point in the recording to where the vehicle currently is
PROC CALCULATE_POINT_TO_START_DRIVE_RECORDING(VEHICLE_INDEX veh, INT iRec, FLOAT &fReturnTime, VECTOR &vReturnPos)
IF IS_VEHICLE_DRIVEABLE(veh)
VECTOR vStartCalculationPos
vStartCalculationPos = GET_ENTITY_COORDS(veh)
VECTOR vUpPointPos
VECTOR vDownPointPos
VECTOR vBestPointPos
FLOAT fCheckRecordingTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iRec, GET_TRAIN_CRASH_RECORDING_PREFIX()) / 2
FLOAT fSearchUpDownTime = fCheckRecordingTime / 2
FLOAT fUpTime
FLOAT fDownTime
FLOAT fUpDistanceFromPos
FLOAT fDownDistanceFromPos
INT iChecksPerformed = 0
WHILE iChecksPerformed < 80
// check up distance
fUpTime = fCheckRecordingTime + fSearchUpDownTime
vUpPointPos = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iRec, fUpTime, GET_TRAIN_CRASH_RECORDING_PREFIX())
fUpDistanceFromPos = GET_DISTANCE_BETWEEN_COORDS(vStartCalculationPos, vUpPointPos)
// check down distance
fDownTime = fCheckRecordingTime - fSearchUpDownTime
vDownPointPos = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iRec, fDownTime, GET_TRAIN_CRASH_RECORDING_PREFIX())
fDownDistanceFromPos = GET_DISTANCE_BETWEEN_COORDS(vStartCalculationPos, vDownPointPos)
// work out if we should be going up or down
IF fUpDistanceFromPos < fDownDistanceFromPos
fCheckRecordingTime = fUpTime
vBestPointPos = vUpPointPos
ELSE
fCheckRecordingTime = fDownTime
vBestPointPos = vDownPointPos
ENDIF
fSearchUpDownTime = fSearchUpDownTime / 2
iChecksPerformed++
ENDWHILE
fReturnTime = fCheckRecordingTime
vReturnPos = vBestPointPos
ENDIF
ENDPROC
// try and accelerate the shootout boats as they come round the corner
PROC HANDLE_SHOOTOUT_BOAT_SPEEDS()
INT i
FOR i=ENUM_TO_INT(EV_SHOOTOUT_FIRST_WAVE_BOAT_1) TO ENUM_TO_INT(EV_SHOOTOUT_FIRST_WAVE_BOAT_3)
ENEMY_VEHICLE_ENUM thisVehicle = INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[thisVehicle].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[thisVehicle].veh)
FLOAT fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(enemyVehicle[thisVehicle].veh)
FLOAT fAccelerateTime
FLOAT fAcceleration
FLOAT fDecelerateTime
FLOAT fDeceleration
FLOAT fMaxSpeed
FLOAT fMinSpeed
SWITCH thisVehicle
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
fAccelerateTime = 17800.0
fDecelerateTime = 24300.0
fAcceleration = 0.1
fDeceleration = 0.15
fMaxSpeed = 1.23
fMinSpeed = 0.0
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
fAccelerateTime = 19100.0
fDecelerateTime = 22300.0
fAcceleration = 0.3
fDeceleration = 0.2
fMaxSpeed = 1.5
fMinSpeed = 0.0
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
fAccelerateTime = 14300.0
fDecelerateTime = 18000.0
fAcceleration = 0.3
fDeceleration = 0.2
fMaxSpeed = 1.5
fMinSpeed = 0.0
BREAK
ENDSWITCH
IF fPlaybackTime >= fDecelerateTime
enemyVehicle[thisVehicle].fPlaybackSpeed = enemyVehicle[thisVehicle].fPlaybackSpeed -@ fDeceleration
ELIF fPlaybackTime >= fAccelerateTime
enemyVehicle[thisVehicle].fPlaybackSpeed = enemyVehicle[thisVehicle].fPlaybackSpeed +@ fAcceleration
ENDIF
IF enemyVehicle[thisVehicle].fPlaybackSpeed > fMaxSpeed
enemyVehicle[thisVehicle].fPlaybackSpeed = fMaxSpeed
ELIF enemyVehicle[thisVehicle].fPlaybackSpeed < fMinSpeed
enemyVehicle[thisVehicle].fPlaybackSpeed = fMinSpeed
ENDIF
SET_PLAYBACK_SPEED(enemyVehicle[thisVehicle].veh, enemyVehicle[thisVehicle].fPlaybackSpeed)
ENDIF
IF enemyVehicle[thisVehicle].fPlaybackSpeed = 0
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[thisVehicle].veh)
IF bDoLastBoatCircle
#IF IS_DEBUG_BUILD
OR (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD6)
AND thisVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_1)
#ENDIF
IF enemyVehicle[thisVehicle].iAIStage < 20
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[thisVehicle].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[thisVehicle].veh)
ENDIF
FORCE_ENEMY_VEHICLE_AI_STAGE(thisVehicle, 20)
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDPROC
// handle comment on vehicle destruction
PROC HANDLE_COMMENT_ON_VEHICLE_DESTRUCTION(ENEMY_VEHICLE_ENUM thisVehicle)
IF currentMissionStage = STAGE_RAPIDS_CHASE
PED_INDEX michaelPed = GET_MICHAEL_PED()
PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT IS_PED_INJURED(michaelPed)
AND NOT IS_PED_INJURED(trevorPed)
IF NOT enemyVehicle[thisVehicle].bCommentedOnDestruction
IF DOES_ENTITY_EXIST(enemyVehicle[thisVehicle].veh)
IF NOT bRapidsSpeechInterruptPending
AND GET_GAME_TIMER() >= iRapidsSpeechInterruptTime + 3000
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[thisVehicle].veh))
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[thisVehicle].veh, michaelPed)
pendingRapidsSpeechInterrupt = RSI_M_DEST_CHOPPER
bRapidsSpeechInterruptPending = TRUE
ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[thisVehicle].veh, trevorPed)
pendingRapidsSpeechInterrupt = RSI_T_DEST_CHOPPER
bRapidsSpeechInterruptPending = TRUE
ENDIF
ELIF IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(enemyVehicle[thisVehicle].veh))
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[thisVehicle].veh, michaelPed)
pendingRapidsSpeechInterrupt = RSI_M_DEST_BOAT
bRapidsSpeechInterruptPending = TRUE
ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[thisVehicle].veh, trevorPed)
pendingRapidsSpeechInterrupt = RSI_T_DEST_BOAT
bRapidsSpeechInterruptPending = TRUE
ENDIF
ENDIF
IF bRapidsSpeechInterruptPending
iRapidsSpeechInterruptTime = GET_GAME_TIMER()
ENDIF
ENDIF
// cancel
IF NOT bShownGodText AND boatHotswapState <> BOAT_HOTSWAP_ON_TREVOR
bRapidsSpeechInterruptPending = FALSE
ENDIF
PRINTSTRING("comment on destruction ") PRINTINT(ENUM_TO_INT(thisVehicle)) PRINTNL()
enemyVehicle[thisVehicle].bCommentedOnDestruction = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/*
// proof enemies against explosions
PROC PROOF_ENEMIES_AGAINST_EXPLOSIONS(VEHICLE_INDEX dontProofVehicle, BOOL bDoProof)
INT i
IF bDoProof
REPEAT COUNT_OF(enemyVehicle) i
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
IF enemyVehicle[i].veh <> dontProofVehicle
IF IS_ENTITY_AT_ENTITY(enemyVehicle[i].veh, dontProofVehicle, <<20,20,20>>, FALSE, FALSE)
SET_ENTITY_PROOFS(enemyVehicle[i].veh, FALSE, TRUE, TRUE, TRUE, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyVehicle[i].veh, TRUE)
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT COUNT_OF(enemyPed) i
IF NOT IS_PED_INJURED(enemyPed[i].ped)
IF IS_ENTITY_AT_ENTITY(enemyPed[i].ped, dontProofVehicle, <<20,20,20>>, FALSE, FALSE)
BOOL bProof = TRUE
IF IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
IF GET_VEHICLE_PED_IS_IN(enemyPed[i].ped) = dontProofVehicle
bProof = FALSE
ENDIF
ELSE
bProof = FALSE
ENDIF
IF bProof
SET_ENTITY_PROOFS(enemyPed[i].ped, FALSE, TRUE, TRUE, TRUE, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyPed[i].ped, TRUE)
ENDIF
ENDIF
ENDIF
ENDREPEAT
bEnemiesExplosionProof = TRUE
iLastExplodeTime = GET_GAME_TIMER()
ELSE
REPEAT COUNT_OF(enemyVehicle) i
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
SET_ENTITY_PROOFS(enemyVehicle[i].veh, FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyVehicle[i].veh, FALSE)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(enemyPed) i
IF NOT IS_PED_INJURED(enemyPed[i].ped)
SET_ENTITY_PROOFS(enemyPed[i].ped, FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyPed[i].ped, FALSE)
ENDIF
ENDREPEAT
bEnemiesExplosionProof = FALSE
ENDIF
ENDPROC
*/
FUNC BOOL SHOULD_VEHICLE_HAVE_SEARCHLIGHT_ON(ENEMY_VEHICLE_ENUM thisVehicle)
INT iHours = GET_CLOCK_HOURS()
IF iHours <= 5
OR iHours >= 21
INT iMinutes
SWITCH thisVehicle
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
iMinutes = 1
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
iMinutes = 4
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
iMinutes = 2
BREAK
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
iMinutes = 1
BREAK
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
iMinutes = 5
BREAK
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
iMinutes = 3
BREAK
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
iMinutes = 0
BREAK
ENDSWITCH
IF iHours = 21
IF GET_CLOCK_MINUTES() >= iMinutes
RETURN TRUE
ENDIF
ELIF iHours = 5
IF GET_CLOCK_MINUTES() <= iMinutes
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// handle enemy wave
FUNC BOOL HANDLE_ENEMY_WAVE(ENEMY_WAVE_ENUM waveEnum, BOOL bDoDrivebys = TRUE, BOOL bAllowBlip = TRUE)
INT i, j
BOOL bWaveExists = FALSE
BOOL bHasVehicles
ENEMY_VEHICLE_ENUM firstVehicle
ENEMY_VEHICLE_ENUM lastVehicle
ENEMY_PED_ENUM firstPed
ENEMY_PED_ENUM lastPed
FILL_ENEMY_WAVE_PROPERTIES(waveEnum, firstVehicle, lastVehicle, firstPed, lastPed, bHasVehicles)
// vehicle stuff
IF bHasVehicles
FOR i=firstVehicle TO lastVehicle
ENEMY_VEHICLE_ENUM thisVehicle = INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
BOOL bDoExplode = FALSE
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
// vehicle ai
DO_ENEMY_VEHICLE_AI(thisVehicle)
// lights
IF thisVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_1
OR thisVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_2
OR thisVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_3
OR thisVehicle = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
OR thisVehicle = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
OR thisVehicle = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
OR thisVehicle = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
IF NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[thisVehicle].veh, VS_DRIVER))
OR NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[thisVehicle].veh, VS_FRONT_RIGHT))
IF SHOULD_VEHICLE_HAVE_SEARCHLIGHT_ON(thisVehicle)
IF NOT IS_VEHICLE_SEARCHLIGHT_ON(enemyVehicle[i].veh)
SET_VEHICLE_SEARCHLIGHT(enemyVehicle[i].veh, TRUE)
ENDIF
ELSE
IF IS_VEHICLE_SEARCHLIGHT_ON(enemyVehicle[i].veh)
SET_VEHICLE_SEARCHLIGHT(enemyVehicle[i].veh, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
// check to stop playback
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
IF IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh, VS_DRIVER))
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[i].veh)
ENDIF
ENDIF
// occupants dead check
BOOL bOccupantsDead = TRUE
BOOL bDriverDead = FALSE
FOR j=-1 TO 2
IF NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh, INT_TO_ENUM(VEHICLE_SEAT, j)))
bOccupantsDead = FALSE
ELSE
IF j=-1
bDriverDead = TRUE
ENDIF
ENDIF
ENDFOR
IF bDriverDead AND NOT bOccupantsDead
/*
IF IS_ENTITY_OCCLUDED(enemyVehicle[i].veh)
IF IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(enemyVehicle[i].veh))
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), enemyVehicle[i].veh, FALSE) > 30
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, 0)
SET_VEHICLE_PETROL_TANK_HEALTH(enemyVehicle[i].veh, 0)
ENDIF
ENDIF
ENDIF
*/
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
SET_VEHICLE_OUT_OF_CONTROL(enemyVehicle[i].veh, FALSE)
ELSE
IF currentMissionStage = STAGE_RAPIDS_CHASE
// force restart AI in case the passenger feels like taking over
enemyVehicle[i].aiEnum = EVAI_FOLLOW_RECORDING
enemyVehicle[i].iAiStage = 0
ENDIF
ENDIF
ENDIF
// remove blip
IF bOccupantsDead
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
SET_VEHICLE_CAN_BE_TARGETTED(enemyVehicle[i].veh, FALSE)
IF IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(enemyVehicle[i].veh))
SET_BOAT_ANCHOR(enemyVehicle[i].veh, FALSE)
ENDIF
ENDIF
enemyVehicle[i].bOccupantsDead = TRUE
HANDLE_COMMENT_ON_VEHICLE_DESTRUCTION(thisVehicle)
ENDIF
// exploding
IF IS_ENTITY_ON_FIRE(enemyVehicle[i].veh)
bDoExplode = TRUE
ELSE
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
OR IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(enemyVehicle[i].veh))
IF GET_ENTITY_HEALTH(enemyVehicle[i].veh) <= GET_ENEMY_VEHICLE_EXPLODE_HEALTH(thisVehicle)
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[i].veh, GET_TREVOR_PED())
bDoExplode = TRUE
ELSE
enemyVehicle[i].bExplodedVehicle = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF GET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh) <= GET_ENEMY_VEHICLE_EXPLODE_HEALTH(thisVehicle)
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[i].veh, GET_TREVOR_PED())
bDoExplode = TRUE
ELSE
enemyVehicle[i].bExplodedVehicle = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// get rid of if too far away
IF currentMissionStage = STAGE_RAPIDS_CHASE
BOOL bSetNoLongerNeeded = FALSE
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[i].veh, <<200,200,200>>, FALSE, FALSE)//<<200, 200, 200>>)
//IF DOES_BLIP_EXIST(GET_BLIP_FROM_ENTITY(enemyVehicle[i].veh))
//IF bDoMopUp
//IF enemyVehicle[i].veh
IF thisVehicle <> EV_CHASE_FIRST_CAR_WAVE_CAR_1 OR bBlippedCarWave
bSetNoLongerNeeded = TRUE
ENDIF
ELIF waveEnum = EW_CHASE_FIRST_CAR_WAVE
IF bDoMopUp
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[i].veh, <<40, 40, 40>>)
bSetNoLongerNeeded = TRUE
ENDIF
ENDIF
ELIF waveEnum = EW_CHASE_FIRST_BOAT_WAVE
IF bDoMopUp
IF NOT CAN_BOAT_DRIVE(enemyVehicle[i].veh)
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[i].veh, <<70, 70, 70>>)
bSetNoLongerNeeded = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF bSetNoLongerNeeded
PED_INDEX driverPed = GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh)
IF NOT IS_PED_INJURED(driverPed)
CLEAR_PED_TASKS(driverPed)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyVehicle[i].veh)
ENDIF
ENDIF
ELSE
// remove blip if destroyed
//IF DOES_BLIP_EXIST(enemyVehicle[i].blip)
// REMOVE_BLIP(enemyVehicle[i].blip)
//ENDIF
// exploding
IF NOT IS_ENTITY_DEAD(enemyVehicle[i].veh)
IF NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
bDoExplode = TRUE
ENDIF
ENDIF
ENDIF
// handle explosions
IF bDoExplode
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
IF (currentMissionStage = STAGE_RAPIDS_CHASE OR NOT IS_ENTITY_ON_FIRE(enemyVehicle[i].veh))
OR IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[i].veh)
ENDIF
// comment on destruction
HANDLE_COMMENT_ON_VEHICLE_DESTRUCTION(thisVehicle)
IF thisVehicle <> EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
IF NOT enemyVehicle[i].bExplodedVehicle
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, -100)
SET_VEHICLE_PETROL_TANK_HEALTH(enemyVehicle[i].veh, -100)
SET_VEHICLE_OUT_OF_CONTROL(enemyVehicle[i].veh, FALSE)
ELIF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(enemyVehicle[i].veh))
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, -100)
SET_VEHICLE_PETROL_TANK_HEALTH(enemyVehicle[i].veh, -100)
PED_INDEX driverPed = GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh)
IF NOT IS_PED_INJURED(driverPed)
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
IF GET_ENTITY_SPEED(enemyVehicle[i].veh) >= 10
TASK_VEHICLE_TEMP_ACTION(NULL, enemyVehicle[i].veh, TEMPACT_TURNRIGHT, 3000)
ENDIF
TASK_VEHICLE_TEMP_ACTION(NULL, enemyVehicle[i].veh, TEMPACT_WAIT, 100000)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(driverPed, sequence)
ENDIF
ELSE
//IF IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(enemyVehicle[i].veh))
// SET_BOAT_ANCHOR(enemyVehicle[i].veh, FALSE)
//FREEZE_ENTITY_POSITION(enemyVehicle[i].veh, FALSE)
//ENDIF
IF currentMissionStage >= STAGE_RAPIDS_CHASE
//PROOF_ENEMIES_AGAINST_EXPLOSIONS(enemyVehicle[i].veh, TRUE)
explodeVehicle = enemyVehicle[i].veh
ELSE
//EXPLODE_VEHICLE(enemyVehicle[i].veh)
ENDIF
ENDIF
enemyVehicle[i].bExplodedVehicle = TRUE
ENDIF
ELSE
// special case - spin out into wall
IF NOT IS_ENTITY_DEAD(enemyVehicle[i].veh)
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, -100)
SET_VEHICLE_PETROL_TANK_HEALTH(enemyVehicle[i].veh, -100)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyVehicle[i].veh)
ENDIF
ENDIF
ENDFOR
ENDIF
// ped AI
FOR i=firstPed TO lastPed
//ENEMY_PED_ENUM thisPed = INT_TO_ENUM(ENEMY_PED_ENUM, i)
IF enemyPed[i].bBlipped
IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED
BOOL bForceBlip = FALSE
IF NOT IS_PED_INJURED(enemyPed[i].ped)
IF IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
OR GET_PED_PARACHUTE_STATE(enemyPed[i].ped) > PPS_INVALID
bForceBlip = TRUE
ENDIF
ENDIF
IF NOT enemyPed[i].bRagdolled
UPDATE_AI_PED_BLIP(enemyPed[i].ped, enemyPed[i].blipStruct, -1, NULL, bForceBlip, FALSE, 10000)
ELSE
CLEANUP_AI_PED_BLIP(enemyPed[i].blipStruct)
ENDIF
IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER
IF DOES_BLIP_EXIST(enemyPed[i].blipStruct.BlipID)
IF NOT IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
SET_BLIP_SCALE(enemyPed[i].blipStruct.BlipID, 0.85)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(enemyPed[i].ped)
IF NOT enemyPed[i].bRagdolled
bWaveExists = TRUE
ENDIF
WEAPON_TYPE thisWeapon = WEAPONTYPE_UNARMED
IF enemyPed[i].iRecheckDrivebyTime >= 0
IF GET_GAME_TIMER() >= enemyPed[i].iRecheckDrivebyTime
IF IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
AND bDoDrivebys
ENEMY_PED_ENUM thisPed = INT_TO_ENUM(ENEMY_PED_ENUM, i)
IF thisPed = EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
OR thisPed = EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
OR thisPed = EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
OR thisPed = EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
GET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[i].ped, thisWeapon)
IF thisWeapon = WEAPONTYPE_VEHICLE_PLAYER_BUZZARD
IF NOT enemyPed[i].bPauseGuns
enemyPed[i].bPauseGuns = TRUE
SET_PED_FIRING_PATTERN(enemyPed[i].ped, FIRING_PATTERN_SINGLE_SHOT)
enemyPed[i].iRecheckDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2500, 4000)
ELSE
enemyPed[i].bPauseGuns = FALSE
SET_PED_FIRING_PATTERN(enemyPed[i].ped, FIRING_PATTERN_FULL_AUTO)
enemyPed[i].iRecheckDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5500)
ENDIF
ENDIF
ELSE
// get the closest target between player and michael
PED_INDEX target = PLAYER_PED_ID()
IF bDoMerryweatherMassacre
IF i%2 = 0
target = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ENDIF
ENDIF
//IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER
// target = GET_TREVOR_PED()
//ELSE
// target = GET_MICHAEL_PED()
//ENDIF
IF NOT IS_PED_INJURED(target)
IF HAS_PED_GOT_WEAPON(enemyPed[i].ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SMG))
SET_CURRENT_PED_WEAPON(enemyPed[i].ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SMG), TRUE)
ENDIF
//IF NOT bDoMerryweatherMassacre
FIRING_PATTERN_HASH firingPattern
IF thisPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER
OR thisPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSFR
OR thisPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
firingPattern = FIRING_PATTERN_BURST_FIRE_DRIVEBY
ELIF thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
firingPattern = FIRING_PATTERN_BURST_FIRE
ELSE
firingPattern = FIRING_PATTERN_BURST_FIRE_MICRO
ENDIF
TASK_DRIVE_BY(enemyPed[i].ped, target, NULL, <<0,0,0>>, 500, 100, TRUE, firingPattern)
//ELSE
// TASK_DRIVE_BY(enemyPed[i].ped, target, NULL, <<0,0,0>>, 500, 100, TRUE, FIRING_PATTERN_FULL_AUTO)
//ENDIF
ENDIF
enemyPed[i].iRecheckDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
ENDIF
ENDIF
ENDIF
ENDIF
// TEMP kill them off if vehicle destroyed
IF IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
IF IS_ENTITY_DEAD(GET_VEHICLE_PED_IS_IN(enemyPed[i].ped))
IF enemyPed[i].iKillTime < 0
INT iAddTime
iAddTime = 0
SWITCH INT_TO_ENUM(ENEMY_PED_ENUM, i)
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
iAddTime = 0
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
iAddTime = 700
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
iAddTime = 0
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
iAddTime = 700
BREAK
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL
iAddTime = 0
BREAK
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
iAddTime = 700
BREAK
ENDSWITCH
enemyPed[i].iKillTime = GET_GAME_TIMER() + iAddTime
printstring("set kill time") printnl()
ELSE
IF GET_GAME_TIMER() >= enemyPed[i].iKillTime
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
printstring("do kill") printnl()
ENDIF
ENDIF
ELIF NOT IS_ENTITY_A_MISSION_ENTITY(GET_VEHICLE_PED_IS_IN(enemyPed[i].ped))
//IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER
INT iAddTime
iAddTime = 0
SWITCH INT_TO_ENUM(ENEMY_PED_ENUM, i)
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
iAddTime = 0
BREAK
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
iAddTime = 700
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
iAddTime = 0
BREAK
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
iAddTime = 700
BREAK
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL
iAddTime = 0
BREAK
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
iAddTime = 700
BREAK
ENDSWITCH
IF enemyPed[i].iKillTime < 0
enemyPed[i].iKillTime = GET_GAME_TIMER() + iAddTime
printstring("set kill time") printnl()
ELSE
IF GET_GAME_TIMER() >= enemyPed[i].iKillTime
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
printstring("do kill") printnl()
ENDIF
ENDIF
//ENDIF
//IF NOT IS_PED_INJURED(enemyPed[i].ped)
// CLEAR_PED_TASKS(enemyPed[i].ped)
//ENDIF
//CLEANUP_AI_PED_BLIP(enemyPed[i].blipStruct)
//SET_PED_AS_NO_LONGER_NEEDED(enemyPed[i].ped)
ENDIF
ELSE
IF IS_ENTITY_IN_WATER(enemyPed[i].ped)
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
ENDIF
IF currentMissionStage = STAGE_RAPIDS_CHASE
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyPed[i].ped, <<200,200,200>>, FALSE, FALSE)
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
//IF NOT IS_PED_INJURED(enemyPed[i].ped)
// CLEAR_PED_TASKS(enemyPed[i].ped)
//ENDIF
//CLEANUP_AI_PED_BLIP(enemyPed[i].blipStruct)
//SET_PED_AS_NO_LONGER_NEEDED(enemyPed[i].ped)
ENDIF
ENDIF
ENDIF
// blip
IF NOT enemyPed[i].bBlipped
IF GET_GAME_TIMER() >= iCreatedWaveTime[waveEnum] + GET_BLIP_ENEMY_PED_TIME(INT_TO_ENUM(ENEMY_PED_ENUM, i))
IF bAllowBlip
enemyPed[i].bBlipped = TRUE
ENDIF
ELSE
IF IS_ENTITY_ON_SCREEN(enemyPed[i].ped)
AND NOT IS_ENTITY_OCCLUDED(enemyPed[i].ped)
enemyPed[i].bBlipped = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//IF DOES_BLIP_EXIST(enemyPed[i].blip)
// REMOVE_BLIP(enemyPed[i].blip)
//ENDIF
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
IF NOT enemyPed[i].bRegisteredDead
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyPed[i].ped, PLAYER_PED_ID())
INFORM_MISSION_STATS_OF_INCREMENT(EXL3_KILLS)
ENDIF
enemyPed[i].bRegisteredDead = TRUE
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(enemyPed[i].ped)
ENDIF
ENDIF
ENDFOR
RETURN bWaveExists
ENDFUNC
// rappel enemies
/*
PROC HANDLE_RAPPEL_ENEMIES()
// handle rappel enemies
INT i
BOOL bRappelAreaOnScreen = FALSE
IF IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 57>>, 3)
OR IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 51>>, 3)
OR IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 45>>, 3)
OR IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 39>>, 3)
OR IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 33>>, 3)
bRappelAreaOnScreen = TRUE
ENDIF
REPEAT NUMBER_RAPPEL_ENEMIES i
PED_INDEX rappelPed
ENEMY_PED_ENUM thisPedEnum
SWITCH i
CASE 0
thisPedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_1
BREAK
CASE 1
thisPedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_2
BREAK
ENDSWITCH
rappelPed = enemyPed[thisPedEnum].ped
SWITCH enemyRappelData[i].rappelState
CASE ENEMY_RAPPEL_STATE_CLAMBERING
IF NOT IS_PED_INJURED(rappelPed)
FLOAT fRappelTime
VECTOR vAnchorPos
FLOAT fStartZ
FLOAT fLimitZ
FLOAT fAttachHeading
FLOAT fRopeLength
SWITCH i
CASE 0
fRappelTime = 200
vAnchorPos = <<-502.99, 4385.78, 63.88>>
fStartZ = -2
fLimitZ = -32.5
fAttachHeading = -39.39
fRopeLength = 32
BREAK
CASE 1
fRappelTime = 500
vAnchorPos = <<-504.34, 4385.37, 63.98>>
fStartZ = -1.8
fLimitZ = -32.5
fAttachHeading = -42.11
fRopeLength = 32
BREAK
ENDSWITCH
IF GET_GAME_TIMER() >= enemyRappelData[i].iStateStartTime + fRappelTime
INIT_RAPPEL_WITH_ROPE(enemyRappelData[i].rappelData, NULL, vAnchorPos, <<0,0,fAttachHeading>>, fStartZ, fLimitZ, fRopeLength, FALSE, FALSE, TRUE, rappelPed, TRUE, FALSE, 1.0)
SET_RAPPEL_AI(enemyRappelData[i].rappelData, RAPPEL_AI_STOP)
enemyRappelData[i].iStateStartTime = GET_GAME_TIMER()
enemyRappelData[i].rappelState = ENEMY_RAPPEL_STATE_WAIT_ON_ROPE
ENDIF
ENDIF
BREAK
CASE ENEMY_RAPPEL_STATE_WAIT_ON_ROPE
IF NOT IS_PED_INJURED(rappelPed)
IF IS_ENTITY_ON_SCREEN(rappelPed)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-502.93, 4385.83, 45.3>>, <<10,10,10>>, FALSE, FALSE)
OR bRappelAreaOnScreen
OR (bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE] AND NOT bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE] AND NOT bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE])
FLOAT fSpeed
SWITCH i
CASE 0
fSpeed = 4.2
BREAK
CASE 1
fSpeed = 4.7
BREAK
ENDSWITCH
SET_RAPPEL_AI(enemyRappelData[i].rappelData, RAPPEL_AI_MOVE_FAST)
SET_RAPPEL_MAX_SLIDE_SPEED(enemyRappelData[i].rappelData, fSpeed)
enemyRappelData[i].iStateStartTime = GET_GAME_TIMER()
enemyRappelData[i].rappelState = ENEMY_RAPPEL_STATE_RAPPELLING
ENDIF
ENDIF
BREAK
CASE ENEMY_RAPPEL_STATE_RAPPELLING
HANDLE_RAPPEL(enemyRappelData[i].rappelData, TRUE, FALSE)
IF HAS_FREE_ROPING_FINISHED(enemyRappelData[i].rappelData)
CANCEL_RAPPEL(enemyRappelData[i].rappelData)
IF NOT IS_PED_INJURED(rappelPed)
TASK_SHOOT_AT_ENTITY(rappelPed, PLAYER_PED_ID(), -1, FIRING_TYPE_CONTINUOUS)
enemyRappelData[i].iStateStartTime = GET_GAME_TIMER()
enemyRappelData[i].rappelState = ENEMY_RAPPEL_STATE_SHOOTING
ENDIF
ENDIF
BREAK
CASE ENEMY_RAPPEL_STATE_SHOOTING
BREAK
ENDSWITCH
ENDREPEAT
ENDPROC
*/
// target pos to switch sides on bridge
FUNC VECTOR GET_BRIDGE_ENEMY_MOVE_SIDES_TARGET(INT iEnemy)
SWITCH iEnemy
CASE 0
RETURN <<-881.11, 4408.80, 19.91>>
BREAK
CASE 1
RETURN <<-884.63, 4413.92, 19.91>>
BREAK
CASE 2
RETURN <<-891.17, 4419.68, 19.94>>
BREAK
CASE 3
RETURN <<-896.33, 4419.17, 20.71>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
CONST_FLOAT TREVOR_TARGET_MAX_RANGE 90.0
CONST_FLOAT TREVOR_TARGET_MIN_RANGE 10.0
// trevor shooting
PROC HANDLE_TREVOR_SHOOTING()
INT i
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
BOOL bRecheck = FALSE
IF GET_GAME_TIMER() >= iRecheckTrevorDrivebyTime
bRecheck = TRUE
ELIF DOES_ENTITY_EXIST(trevorTargetPed)
IF IS_PED_INJURED(trevorTargetPed)
bRecheck = TRUE
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PLAY_ANIM) = FINISHED_TASK
AND NOT DOES_ENTITY_EXIST(trevorTargetPed)
bRecheck = TRUE
ENDIF
IF bRecheck
// get closest enemy vehicle
INT iClosestPed = -1
FLOAT fClosestDistance = 999999.0
FLOAT fThisDistance
REPEAT COUNT_OF(enemyPed) i
IF NOT IS_PED_INJURED(enemyPed[i].ped)
fThisDistance = GET_DISTANCE_BETWEEN_ENTITIES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], enemyPed[i].ped, FALSE)
//VECTOR vDinghyOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], GET_ENTITY_COORDS(enemyPed[i].ped))
IF fThisDistance < TREVOR_TARGET_MAX_RANGE
//AND fThisDistance > TREVOR_TARGET_MIN_RANGE
//AND vDinghyOffset.y < -4.0
IF fThisDistance < fClosestDistance
iClosestPed = i
fClosestDistance = fThisDistance
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF iClosestPed >= 0
IF enemyPed[iClosestPed].ped <> trevorTargetPed
IF boatRPGState = BOAT_RPG_USING
INT iAccuracy
IF NOT bDoMopUp
iAccuracy = 50
ELSE
iAccuracy = 80
ENDIF
SET_PED_ACCURACY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iAccuracy)
bForceResetTrevorTask=bForceResetTrevorTask
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_AIM_GUN_SCRIPTED) = FINISHED_TASK
OR bForceResetTrevorTask
TASK_AIM_GUN_SCRIPTED_WITH_TARGET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], enemyPed[iClosestPed].ped, <<0,0,0>>, SCRIPTED_GUN_TASK_DINGY_RPG)
bForceResetTrevorTask = FALSE
ELSE
UPDATE_TASK_AIM_GUN_SCRIPTED_TARGET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], enemyPed[iClosestPed].ped, <<0,0,0>>)
ENDIF
trevorTargetPed = enemyPed[iClosestPed].ped
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 5000
ENDIF
ELSE
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 2000
ENDIF
ELSE
IF DOES_ENTITY_EXIST(trevorTargetPed)
IF boatRPGState = BOAT_RPG_DONE
OR boatRPGState = BOAT_RPG_NOT_STARTED
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ELIF boatRPGState = BOAT_RPG_USING
TASK_PLAY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_RPG), "idle", REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
ENDIF
trevorTargetPed = NULL
ELSE
IF boatRPGState = BOAT_RPG_USING
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PLAY_ANIM) = FINISHED_TASK
TASK_PLAY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_RPG), "idle", REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
ENDIF
ENDIF
ENDIF
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 1000
ENDIF
ENDIF
ENDIF
ENDPROC
// michael follow to pos
PROC DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(INT iStart, BOOL bAllowPlayer = FALSE, FLOAT fSpeed = 26.0)
PED_INDEX michaelPed = GET_MICHAEL_PED()
IF NOT IS_PED_INJURED(michaelPed)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_MICHAEL OR bAllowPlayer
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(michaelPed, trainCrashVehicle[TCV_DINGHY], "exile31", DRIVINGMODE_PLOUGHTHROUGH, iStart, EWAYPOINT_DEFAULT, -1, fSpeed)
SET_BOAT_DISABLE_AVOIDANCE(trainCrashVehicle[TCV_DINGHY], TRUE)
ENDIF
ENDIF
ENDPROC
// mikhail driving
PROC HANDLE_MICHAEL_DRIVING()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_ENTER_VEHICLE) <> FINISHED_TASK
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
BRING_VEHICLE_TO_HALT(trainCrashVehicle[TCV_DINGHY], 15.0, 1)
ENDIF
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_ENTER_VEHICLE) = FINISHED_TASK
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY], 40000)
ENDIF
ELSE
IF NOT bFinishedFollowRapids
VECTOR vBoatPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
IF vBoatPos.x < -1785
TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY], <<-2091.73, 4779.18, 0.73>>, 45, DRIVINGSTYLE_NORMAL, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DINGHY), DRIVINGMODE_AVOIDCARS, 10, 1000)
bFinishedFollowRapids = TRUE
ELIF currentMissionStage = STAGE_GET_HOME
bFinishedFollowRapids = TRUE
ELSE
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = FINISHED_TASK
INT iClosestWaypoint
iClosestWaypoint = GET_CLOSEST_BOAT_WAYPOINT(trainCrashVehicle[TCV_DINGHY], "exile31")
IF iClosestWaypoint >= 0
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(iClosestWaypoint)
ENDIF
ENDIF
ENDIF
ELSE
IF currentMissionStage = STAGE_GET_HOME
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = FINISHED_TASK
INT iClosestWaypoint
iClosestWaypoint = GET_CLOSEST_BOAT_WAYPOINT(trainCrashVehicle[TCV_DINGHY], "exile35", FALSE, TRUE)
IF iClosestWaypoint >= 0
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY], "exile35", DRIVINGMODE_PLOUGHTHROUGH, iClosestWaypoint)
SET_BOAT_DISABLE_AVOIDANCE(trainCrashVehicle[TCV_DINGHY], FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/*
CONST_FLOAT MICHAEL_TARGET_MAX_RANGE 90.0
CONST_FLOAT MICHAEL_TARGET_MIN_RANGE 10.0
// michael shooting
PROC HANDLE_MICHAEL_SHOOTING()
INT i
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SWITCH michaelDrivebyState
CASE MICHAEL_DRIVEBY_WAITING
IF GET_GAME_TIMER() >= iRecheckMichaelDrivebyTime
michaelDrivebyState = MICHAEL_DRIVEBY_FIND_TARGET
ENDIF
BREAK
CASE MICHAEL_DRIVEBY_FIND_TARGET
IF GET_GAME_TIMER() >= iRecheckMichaelDrivebyTime
// get closest enemy vehicle
INT iClosestPed
iClosestPed = -1
FLOAT fClosestDistance
fClosestDistance = 999999.0
FLOAT fThisDistance
REPEAT COUNT_OF(enemyPed) i
IF NOT IS_PED_INJURED(enemyPed[i].ped)
fThisDistance = GET_DISTANCE_BETWEEN_ENTITIES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], enemyPed[i].ped, FALSE)
IF fThisDistance < MICHAEL_TARGET_MAX_RANGE
//AND fThisDistance > MICHAEL_TARGET_MIN_RANGE
IF fThisDistance < fClosestDistance
iClosestPed = i
fClosestDistance = fThisDistance
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF iClosestPed >= 0
AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
IF enemyPed[iClosestPed].ped <> michaelTargetPed
SET_PED_ACCURACY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 0)
TASK_DRIVE_BY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], enemyPed[iClosestPed].ped, NULL, <<0,0,0>>, MICHAEL_TARGET_MAX_RANGE, 100, TRUE)
michaelTargetPed = enemyPed[iClosestPed].ped
iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000)
michaelDrivebyState = MICHAEL_DRIVEBY_SHOOTING
ENDIF
ELSE
iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + 1000
ENDIF
ENDIF
BREAK
CASE MICHAEL_DRIVEBY_SHOOTING
IF GET_GAME_TIMER() >= iRecheckMichaelDrivebyTime
OR IS_PED_INJURED(michaelTargetPed)
IF DOES_ENTITY_EXIST(michaelTargetPed)
IF IS_PED_IN_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF IS_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
CLEAR_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
ENDIF
ENDIF
michaelTargetPed = NULL
michaelDrivebyState = MICHAEL_DRIVEBY_WAITING
iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 9000)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
*/
// attach
PROC ATTACH_TREVOR_TO_BOAT()
PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT IS_PED_INJURED(trevorPed)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
ATTACH_ENTITY_TO_ENTITY(trevorPed, trainCrashVehicle[TCV_DINGHY], 0, vTrevorAttachToBoatPos, vTrevorAttachToBoatRot, TRUE, FALSE, TRUE, TRUE)
ENDIF
//PRINTSTRING("vTrevorAttachToBoatPos = ") printvector(vTrevorAttachToBoatPos) PRINTNL()
ENDPROC
PROC ATTACH_MICHAEL_TO_BOAT()
PED_INDEX michaelPed = GET_MICHAEL_PED()
IF NOT IS_PED_INJURED(michaelPed)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
ATTACH_ENTITY_TO_ENTITY(michaelPed, trainCrashVehicle[TCV_DINGHY], 0, vMichaelAttachToBoatPos, vMichaelAttachToBoatRot, TRUE, FALSE, TRUE, TRUE)
ENDIF
ENDPROC
// set boat RPG state
PROC SET_BOAT_RPG_STATE(BOAT_RPG_STATE_ENUM newState, BOOL bFromPhase = FALSE, BOOL bSetCoords = TRUE)
PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT IS_PED_INJURED(trevorPed)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SWITCH newState
CASE BOAT_RPG_GET_IN_POSITION
IF bSetCoords
SET_ENTITY_COORDS(trevorPed, GET_ENTITY_COORDS(trevorPed) + <<0,0,1>>)
ENDIF
IF NOT bFromPhase
fBoatRPGPhase = 0.0
ENDIF
vTrevorAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
vTrevorAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
ATTACH_TREVOR_TO_BOAT()
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE | AF_FORCE_START, fBoatRPGPhase)
//TASK_VEHICLE_PLAY_ANIM(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_DINGY")
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
BREAK
CASE BOAT_RPG_USING
trevorTargetPed = NULL
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 2000
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(TRUE)
// double check has mg
WEAPON_TYPE MGWeapon
MGWeapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)
IF NOT HAS_PED_GOT_WEAPON(trevorPed, MGWeapon)
GIVE_WEAPON_TO_PED(trevorPed, MGWeapon, INFINITE_AMMO, TRUE)
ENDIF
IF GET_AMMO_IN_PED_WEAPON(trevorPed, MGWeapon) = 0
SET_PED_AMMO(trevorPed, MGWeapon, 1)
ENDIF
SET_PED_INFINITE_AMMO(trevorPed, TRUE, MGWeapon)
SET_PED_INFINITE_AMMO_CLIP(trevorPed, TRUE)
IF trevorPed = PLAYER_PED_ID()
// SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE)
TASK_AIM_GUN_SCRIPTED(PLAYER_PED_ID(), SCRIPTED_GUN_TASK_DINGY_RPG)
ENDIF
ATTACH_TREVOR_TO_BOAT()
// set bad guys to have accuracy
INT i
FOR i=EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER TO EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
IF NOT IS_PED_INJURED(enemyPed[i].ped)
INT iAccuracy
SWITCH INT_TO_ENUM(ENEMY_PED_ENUM, i)
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER
iAccuracy = 2
BREAK
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_PASSFR
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
iAccuracy = 3
BREAK
ENDSWITCH
SET_PED_ACCURACY(enemyPed[i].ped, iAccuracy)
ENDIF
ENDFOR
BREAK
CASE BOAT_RPG_RETURN_TO_SEAT
FLOAT fBlendIn
IF NOT bFromPhase
fBoatRPGPhase = 0.0
fBlendIn = NORMAL_BLEND_IN
ELSE
vTrevorAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
vTrevorAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
fBlendIn = INSTANT_BLEND_IN
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ENDIF
ATTACH_TREVOR_TO_BOAT()
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", fBlendIn, INSTANT_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE | AF_FORCE_START, fBoatRPGPhase)
//TASK_VEHICLE_PLAY_ANIM(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_DINGY")
IF bFromPhase
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
ENDIF
BREAK
CASE BOAT_RPG_DONE
REMOVE_TREVOR_MG()
SET_PED_CAN_SWITCH_WEAPON(trevorPed, TRUE)
DETACH_ENTITY(trevorPed)
SET_PED_INTO_VEHICLE(trevorPed, trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
AND GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
IF NOT bCreatedSmoothCam
FLOAT fHeading
FLOAT fPitch
fHeading = GET_GAMEPLAY_CAM_RELATIVE_HEADING()
fPitch = GET_GAMEPLAY_CAM_RELATIVE_PITCH()
CREATE_MISSION_STATIC_CAM(staticCam)
SET_CAM_COORD(staticCam, GET_FINAL_RENDERED_CAM_COORD())
SET_CAM_ROT(staticCam, GET_FINAL_RENDERED_CAM_ROT())
SET_CAM_FOV(staticCam, GET_FINAL_RENDERED_CAM_FOV())
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fHeading)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fPitch)
bCreatedSmoothCam = TRUE
ENDIF
ENDIF
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
BREAK
ENDSWITCH
ENDIF
boatRPGState = newState
ENDPROC
// handle the rpg
PROC HANDLE_BOAT_RPG(BOOL bForce = FALSE)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
VECTOR vBoatPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT IS_PED_INJURED(trevorPed)
SWITCH boatRPGState
CASE BOAT_RPG_NOT_STARTED
IF vBoatPos.x < -548
AND vBoatPos.z < 20.90
AND (bForce OR NOT bRunningCutscene)
SET_BOAT_RPG_STATE(BOAT_RPG_GET_IN_POSITION)
ENDIF
BREAK
CASE BOAT_RPG_GET_IN_POSITION
BOOL bAllowSetUsing
bAllowSetUsing = FALSE
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR")
fBoatRPGPhase = GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR")
IF fBoatRPGPhase >= 0
IF NOT bGivenRPG
IF fBoatRPGPhase >= 0.636
WEAPON_TYPE MGWeapon
MGWeapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)
IF NOT bCheckedInitialMG
IF HAS_PED_GOT_WEAPON(trevorPed, MGWeapon)
iInitialMGAmmo = GET_AMMO_IN_PED_WEAPON(trevorPed, MGWeapon)
ELSE
iInitialMGAmmo = -1
ENDIF
bCheckedInitialMG = TRUE
ENDIF
GIVE_WEAPON_TO_PED(trevorPed, MGWeapon, INFINITE_AMMO, TRUE)
IF GET_AMMO_IN_PED_WEAPON(trevorPed, MGWeapon) = 0
SET_PED_AMMO(trevorPed, MGWeapon, 1)
ENDIF
SET_PED_INFINITE_AMMO(trevorPed, TRUE, MGWeapon)
SET_PED_INFINITE_AMMO_CLIP(trevorPed, TRUE)
bGivenRPG = TRUE
ENDIF
ENDIF
IF fBoatRPGPhase >= 0.98
bAllowSetUsing = TRUE
ELSE
vTrevorAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
vTrevorAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
ATTACH_TREVOR_TO_BOAT()
ENDIF
ELSE
fBoatRPGPhase = 0.0
ENDIF
ELSE
bAllowSetUsing = TRUE
ENDIF
IF bAllowSetUsing
SET_BOAT_RPG_STATE(BOAT_RPG_USING)
ENDIF
BREAK
CASE BOAT_RPG_USING
WEAPON_TYPE weapon
GET_CURRENT_PED_WEAPON(trevorPed, weapon)
IF weapon <> GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)
SET_CURRENT_PED_WEAPON(trevorPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG), TRUE)
ENDIF
IF GET_AMMO_IN_PED_WEAPON(trevorPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)) = 0
SET_PED_AMMO(trevorPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG), 1)
ENDIF
SET_PED_INFINITE_AMMO(trevorPed, TRUE, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG))
SET_PED_INFINITE_AMMO_CLIP(trevorPed, TRUE)
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR
SET_PED_CAN_TORSO_IK(trevorPed, FALSE)
ENDIF
IF NOT bForceMichaelSwitch
IF currentMissionStage = STAGE_GET_HOME
bForceMichaelSwitch = TRUE
ENDIF
ELSE
SET_BOAT_RPG_STATE(BOAT_RPG_RETURN_TO_SEAT)
ENDIF
BREAK
CASE BOAT_RPG_RETURN_TO_SEAT
BOOL bAllowSetDone
bAllowSetDone = FALSE
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR")
fBoatRPGPhase = GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR")
IF fBoatRPGPhase >= 0
IF NOT bTrevorPutAwayGun
IF fBoatRPGPhase >= 0.0636
//IF HAS_ANIM_EVENT_FIRED(trevorPed, GET_HASH_KEY("DESTROY"))
PRINTSTRING("remove gun!") printnl()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
REMOVE_TREVOR_MG()
bTrevorPutAwayGun = TRUE
ENDIF
ENDIF
IF fBoatRPGPhase >= 0.98
bAllowSetDone = TRUE
ELSE
vTrevorAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
vTrevorAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
ATTACH_TREVOR_TO_BOAT()
ENDIF
ELSE
fBoatRPGPhase = 0.0
ENDIF
ELSE
bAllowSetDone = TRUE
ENDIF
IF bAllowSetDone
SET_BOAT_RPG_STATE(BOAT_RPG_DONE)
ENDIF
BREAK
CASE BOAT_RPG_DONE
// cam back to gameplay
IF bCreatedSmoothCam
IF NOT bSmoothCamBackToGameplay
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
RENDER_SCRIPT_CAMS(FALSE, TRUE, 1300)
ENDIF
IF DOES_CAM_EXIST(staticCam)
DESTROY_CAM(staticCam)
ENDIF
bSmoothCamBackToGameplay = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
IF boatRPGState <> BOAT_RPG_NOT_STARTED
AND boatRPGState <> BOAT_RPG_DONE
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
IF boatRPGState <> BOAT_RPG_USING
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
ENDIF
ENDIF
SET_PED_CAN_SWITCH_WEAPON(trevorPed, FALSE)
ENDIF
ENDIF
ENDIF
ENDPROC
// create the beach
PROC CREATE_BEACH()
// car
TRAIN_CRASH_CREATE_VEHICLE(TCV_BEACH_CAR, <<-2430.87, 4260.73, 5.37>>, -154.2)
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BEACH_CAR], << 7.84188, 9.1192, -154.234 >>)
// truck
TRAIN_CRASH_CREATE_VEHICLE(TCV_BEACH_TRUCK, <<-2433.61, 4249.80, 5.78>>, -40.9)
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BEACH_TRUCK], << 5.84714, -12.8294, -40.5084 >> )
ENDPROC
// handle beach creation
PROC HANDLE_BEACH_CREATION(BOOL bForceRequest = FALSE)
SWITCH beachCreationStage
CASE BEACH_CREATION_NOT_STARTED
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), <<400,400,400>>, FALSE, FALSE)
OR bForceRequest
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_BEACH_CAR))
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_BEACH_TRUCK))
beachCreationStage = BEACH_CREATION_REQUESTING
ENDIF
BREAK
CASE BEACH_CREATION_REQUESTING
IF NOT bModelRequestTracker[TCM_BEACH_CAR]
OR NOT bModelRequestTracker[TCM_BEACH_TRUCK]
beachCreationStage = BEACH_CREATION_NOT_STARTED
ELSE
IF HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BEACH_CAR))
AND HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BEACH_TRUCK))
CREATE_BEACH()
beachCreationStage = BEACH_CREATION_DONE
ENDIF
ENDIF
BREAK
CASE BEACH_CREATION_DONE
BREAK
ENDSWITCH
ENDPROC
// create ron and patricia
PROC CREATE_RON_AND_PATRICIA(BOOL bWaitForStreaming)
IF NOT DOES_ENTITY_EXIST(ronPed)
CREATE_NPC_PED_ON_FOOT(ronPed, CHAR_RON, <<1971.79114, 3818.23218, 32.42871>>, -147.9, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(ronPed, RELGROUPHASH_PLAYER)
TASK_LOOK_AT_ENTITY(ronPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_START_SCENARIO_IN_PLACE(ronPed, "WORLD_HUMAN_STAND_IMPATIENT", -1, FALSE)
SET_PED_KEEP_TASK(ronPed, TRUE)
SET_PED_PROP_INDEX(ronPed, ANCHOR_HEAD, 0)
SET_PED_PROP_INDEX(ronPed, ANCHOR_EYES, 0)
SET_PED_DIES_WHEN_INJURED(ronPed, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ronPed, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(ronPed, TRUE)
IF bWaitForStreaming
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
BOOL bRonStreamingCompleted = FALSE
WHILE NOT bRonStreamingCompleted
IF NOT IS_PED_INJURED(ronPed)
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(ronPed)
bRonStreamingCompleted = TRUE
ENDIF
ELSE
bRonStreamingCompleted = TRUE
ENDIF
WAIT(0)
ENDWHILE
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(patriciaPed)
CREATE_NPC_PED_ON_FOOT(patriciaPed, CHAR_PATRICIA, <<1975.44312, 3820.43066, 32.45007>>, 139.6, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(patriciaPed, RELGROUPHASH_PLAYER)
TASK_LOOK_AT_ENTITY(patriciaPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_START_SCENARIO_IN_PLACE(patriciaPed, "WORLD_HUMAN_HANG_OUT_STREET", -1, FALSE)
SET_PED_COMPONENT_VARIATION(patriciaPed, PED_COMP_TORSO, 0, 0)
SET_PED_COMPONENT_VARIATION(patriciaPed, PED_COMP_LEG, 0, 0)
SET_PED_COMPONENT_VARIATION(patriciaPed, PED_COMP_FEET, 0, 0)
SET_PED_COMPONENT_VARIATION(patriciaPed, PED_COMP_SPECIAL, 0, 0)
SET_PED_DIES_WHEN_INJURED(patriciaPed, TRUE)
SET_PED_KEEP_TASK(patriciaPed, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(patriciaPed, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(patriciaPed, TRUE)
IF bWaitForStreaming
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
BOOL bPatriciaStreamingCompleted = FALSE
WHILE NOT bPatriciaStreamingCompleted
IF NOT IS_PED_INJURED(patriciaPed)
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(patriciaPed)
bPatriciaStreamingCompleted = TRUE
ENDIF
ELSE
bPatriciaStreamingCompleted = TRUE
ENDIF
WAIT(0)
ENDWHILE
ENDIF
ENDIF
ENDPROC
PROC DELETE_RON_AND_PATRICIA()
IF DOES_ENTITY_EXIST(ronPed)
SET_PED_AS_NO_LONGER_NEEDED(ronPed)
ENDIF
IF DOES_ENTITY_EXIST(patriciaPed)
SET_PED_AS_NO_LONGER_NEEDED(patriciaPed)
ENDIF
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_RON))
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_PATRICIA))
ENDPROC
// handle the mercs waiting for pickup
PROC HANDLE_MERC_PICKUP()
SWITCH createMercPickupStage
CASE CREATE_MERC_PICKUP_STAGE_NOT_STARTED
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<197.35889, 6379.99902, 30.41866>>, <<500,500,500>>, FALSE, FALSE)
//ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_CAR))
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_TRUCK))
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_SOLDIER))
//ADD_ANIM_DICT_REQUEST(TC_ANIM_DICT_GESTURE_ENT)
//ADD_ANIM_DICT_REQUEST(TC_ANIM_DICT_GESTURES)
createMercPickupStage = CREATE_MERC_PICKUP_STAGE_WAITING
ENDIF
BREAK
CASE CREATE_MERC_PICKUP_STAGE_WAITING
//IF HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_CAR))
IF HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_TRUCK))
AND HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER))
//AND HAS_ANIM_DICT_LOADED(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_GESTURE_ENT))
//AND HAS_ANIM_DICT_LOADED(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_GESTURES))
VECTOR vPos
FLOAT fRot
TRAIN_CRASH_MODEL_ENUM model
IF NOT bCreatedTrucks
SWITCH iCreateTruckFrame
CASE 0
vPos = <<36.87, 6284.69, 30.23>>
fRot = -62.4
model = TCM_MERC_TRUCK
BREAK
CASE 1
vPos = <<39.98, 6292.61, 30.23>>
fRot = 100.3
model = TCM_MERC_TRUCK
BREAK
CASE 2
vPos = <<15.55501, 6279.98584, 30.23803>>
fRot = 120.8
model = TCM_MERC_TRUCK
BREAK
CASE 3
vPos = <<51.32214, 6298.79297, 30.24123>>
fRot = -103.3
model = TCM_MERC_TRUCK
BREAK
CASE 4
vPos = <<9.62969, 6270.75879, 30.28201>>
fRot = 112.2
model = TCM_MERC_TRUCK
BREAK
ENDSWITCH
mercPickupVehicle[iCreateTruckFrame] = CREATE_VEHICLE(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(model), vPos, fRot)
IF iCreateTruckFrame=0
SET_VEHICLE_ON_GROUND_PROPERLY(mercPickupVehicle[iCreateTruckFrame])
ELSE
SET_VEHICLE_ON_GROUND_PROPERLY(mercPickupVehicle[iCreateTruckFrame])
//START_PLAYBACK_RECORDED_VEHICLE(mercPickupVehicle[i], 10, GET_TRAIN_CRASH_RECORDING_PREFIX())
//SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(mercPickupVehicle[i], 3700)
//PAUSE_PLAYBACK_RECORDED_VEHICLE(mercPickupVehicle[i])
//SET_VEHICLE_ENGINE_ON(mercPickupVehicle[i], TRUE, TRUE)
ENDIF
IF iCreateTruckFrame = 4
bCreatedTrucks = TRUE
iCreateTruckFrame = 0
ELSE
iCreateTruckFrame++
ENDIF
ELSE
SWITCH iCreateTruckFrame
CASE 0
vPos = <<46.15843, 6285.14063, 30.36095>>
fRot = -122.5
BREAK
CASE 1
vPos = <<43.52159, 6289.26025, 30.26134>>
fRot = -132.5
BREAK
CASE 2
vPos = <<54.12662, 6297.37256, 30.25145>>
fRot = -121.1
BREAK
CASE 3
vPos = <<13.17000, 6281.27393, 30.23184>>
fRot = 116.2
BREAK
CASE 4
vPos = <<10.33347, 6281.09961, 30.22844>>
fRot = 116.2
BREAK
ENDSWITCH
mercPickupPed[iCreateTruckFrame] = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), vPos, fRot)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mercPickupPed[iCreateTruckFrame], TRUE)
SET_PED_KEEP_TASK(mercPickupPed[iCreateTruckFrame], TRUE)
TASK_LOOK_AT_ENTITY(mercPickupPed[iCreateTruckFrame], PLAYER_PED_ID(), -1, SLF_WIDEST_PITCH_LIMIT | SLF_WIDEST_YAW_LIMIT)
IF iCreateTruckFrame = 3
createMercPickupStage = CREATE_MERC_PICKUP_STAGE_DONE
ELSE
iCreateTruckFrame++
ENDIF
ENDIF
ENDIF
BREAK
CASE CREATE_MERC_PICKUP_STAGE_DONE
INT i
IF currentMissionStage >= STAGE_GET_TO_BRIDGE
IF NOT bDoneMercsRun
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<53.56557, 6294.45654, 30.26339>>, <<80,80,100>>, FALSE, FALSE)
FOR i=3 TO 4
IF NOT IS_PED_INJURED(mercPickupPed[i])
VECTOR vRunToPos
SWITCH i
CASE 3
vRunToPos = <<-55.75646, 6271.71875, 30.39299>>
BREAK
CASE 4
vRunToPos = <<-69.33340, 6323.51172, 30.33929>>
BREAK
ENDSWITCH
TASK_FOLLOW_NAV_MESH_TO_COORD(mercPickupPed[i], vRunToPos, PEDMOVE_RUN)
ENDIF
ENDFOR
bDoneMercsRun = TRUE
ENDIF
ENDIF
IF NOT bDoneMercAngeredAnims
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<53.56557, 6294.45654, 30.26339>>, <<35,35,50>>, FALSE, FALSE)
FOR i=0 TO 2
IF NOT IS_PED_INJURED(mercPickupPed[i])
INT iWait
STRING sAnim
SWITCH i
CASE 0
iWait = 0
sAnim = "REACTION_FORWARD_BIG_INTRO_A"
BREAK
CASE 1
iWait = 300
sAnim = "REACTION_FORWARD_BIG_INTRO_B"
BREAK
CASE 2
iWait = 700
sAnim = "REACTION_FORWARD_BIG_INTRO_D"
BREAK
ENDSWITCH
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
TASK_PAUSE(NULL, iWait)
TASK_PLAY_ANIM(NULL, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(mercPickupPed[i], sequence)
ENDIF
ENDFOR
bDoneMercAngeredAnims = TRUE
ENDIF
ELSE
IF NOT bDoneTrevorTauntMercsSpeech
bDoneTrevorTauntMercsSpeech = DO_MISSION_SPEECH("EXL3_STATION")
ENDIF
/*
FOR i=0 TO iLastPed
IF NOT IS_PED_INJURED(mercPickupPed[i])
STRING sAnim
SWITCH i
CASE 0
sAnim = "REACTION_FORWARD_BIG_INTRO_A"
BREAK
CASE 1
sAnim = "REACTION_FORWARD_BIG_INTRO_B"
BREAK
CASE 2
sAnim = "REACTION_FORWARD_BIG_INTRO_D"
BREAK
ENDSWITCH
IF IS_ENTITY_PLAYING_ANIM(mercPickupPed[i], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim)
IF GET_ENTITY_ANIM_CURRENT_TIME(mercPickupPed[i], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim) >= 0.98
TASK_PLAY_ANIM(mercPickupPed[i], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EXIT_TO_GENERIC", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
ENDIF
ENDIF
ENDIF
ENDFOR
*/
ENDIF
IF NOT bRemovedMercPickup
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<197.35889, 6379.99902, 30.41866>>, <<600,600,600>>, FALSE, FALSE)
REPEAT NUMBER_MERC_PICKUP_VEHICLES i
IF DOES_ENTITY_EXIST(mercPickupVehicle[i])
DELETE_VEHICLE(mercPickupVehicle[i])
ENDIF
ENDREPEAT
REPEAT NUMBER_MERC_PICKUP_PEDS i
IF DOES_ENTITY_EXIST(mercPickupPed[i])
DELETE_PED(mercPickupPed[i])
ENDIF
ENDREPEAT
//CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_CAR))
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_TRUCK))
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_SOLDIER))
bRemovedMercPickup = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC INT GET_CARRIAGE_FOR_CLIMB_ENEMY(INT iEnemy)
SWITCH iEnemy
CASE 0
RETURN 20
BREAK
CASE 1
RETURN 6
BREAK
ENDSWITCH
RETURN 50
ENDFUNC
PROC HANDLE_KNOCK_CLIMB_ENEMY_PED_OFF(INT iEnemy)
IF climbEnemy[iEnemy].state < CLIMB_ENEMY_STATE_KNOCKED_OFF
IF NOT IS_PED_INJURED(climbEnemy[iEnemy].ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(climbEnemy[iEnemy].ped, PLAYER_PED_ID())
DETACH_ENTITY(climbEnemy[iEnemy].ped)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(climbEnemy[iEnemy].ped, APPLY_TYPE_IMPULSE, <<4,0,0>>, 0, TRUE, TRUE)
climbEnemy[iEnemy].state = CLIMB_ENEMY_STATE_KNOCKED_OFF
ENDIF
ENDIF
ENDIF
ENDPROC
// handle climb enemies
PROC HANDLE_CLIMB_ENEMIES()
INT i
IF IS_VEHICLE_DRIVEABLE(missionTrain)
REPEAT NUMBER_CLIMB_ENEMIES i
VEHICLE_INDEX carriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, GET_CARRIAGE_FOR_CLIMB_ENEMY(i))
IF IS_VEHICLE_DRIVEABLE(carriageVehicle)
SWITCH climbEnemy[i].state
CASE CLIMB_ENEMY_STATE_NOT_CREATED
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), carriageVehicle, <<150, 150, 150>>, FALSE, FALSE)
climbEnemy[i].ped = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), GET_ENTITY_COORDS(carriageVehicle), 0.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(climbEnemy[i].ped, TRUE)
SET_PED_KEEP_TASK(climbEnemy[i].ped, TRUE)
GIVE_WEAPON_TO_PED(climbEnemy[i].ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE), INFINITE_AMMO)
SET_PED_ACCURACY(climbEnemy[i].ped, 0)
climbEnemy[i].iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-0.6,0,0.5>>, <<0,0,180>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(climbEnemy[i].iSyncScene, carriageVehicle, 0)
TASK_SYNCHRONIZED_SCENE(climbEnemy[i].ped, climbEnemy[i].iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "ex03_climb_ladder", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_NONE, RBF_VEHICLE_IMPACT)
SET_SYNCHRONIZED_SCENE_PHASE(climbEnemy[i].iSyncScene, 0.4)
//SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(climbEnemy[i].iSyncScene, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(climbEnemy[i].ped)
SWITCH i
CASE 0
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 3, climbEnemy[i].ped, "EX3MERC1")
BREAK
CASE 1
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 4, climbEnemy[i].ped, "EX3MERC2")
BREAK
ENDSWITCH
climbEnemy[i].state = CLIMB_ENEMY_STATE_CLIMBING
ENDIF
BREAK
CASE CLIMB_ENEMY_STATE_CLIMBING
IF NOT IS_PED_INJURED(climbEnemy[i].ped)
IF IS_SYNCHRONIZED_SCENE_RUNNING(climbEnemy[i].iSyncScene)
IF GET_SYNCHRONIZED_SCENE_PHASE(climbEnemy[i].iSyncScene) >= 0.98
ATTACH_ENTITY_TO_ENTITY(climbEnemy[i].ped, carriageVehicle, 0, <<-0.6,0,4.3>>, <<0,0,180>>, TRUE, TRUE, TRUE, FALSE)
TASK_SHOOT_AT_ENTITY(climbEnemy[i].ped, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
climbEnemy[i].state = CLIMB_ENEMY_STATE_SHOOTING
ENDIF
ENDIF
ENDIF
BREAK
CASE CLIMB_ENEMY_STATE_SHOOTING
BREAK
ENDSWITCH
IF NOT IS_PED_INJURED(climbEnemy[i].ped)
IF climbEnemy[i].state >= CLIMB_ENEMY_STATE_CLIMBING
HANDLE_KNOCK_CLIMB_ENEMY_PED_OFF(i)
IF NOT climbEnemy[i].bDoneSpeech
IF climbEnemy[i].state < CLIMB_ENEMY_STATE_KNOCKED_OFF
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), climbEnemy[i].ped, <<50, 50, 50>>, FALSE, FALSE)
IF i=0
//climbEnemy[i].bDoneSpeech = DO_MISSION_SPEECH("EXL3_MWTRN1")
ELSE
//climbEnemy[i].bDoneSpeech = DO_MISSION_SPEECH("EXL3_MWTRN2")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
// create an anim cam for sync scenes
PROC CREATE_MISSION_ANIM_CAM(BOOL bStartActivated = TRUE, BOOL bRender = TRUE)
DESTROY_MISSION_ANIM_CAM()
IF bStartActivated
animCam = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", bStartActivated)
ENDIF
IF bRender
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
ENDPROC
// cam for a cutscene shot
PROC CREATE_CAM_FOR_TRAIN_CRASH_SHOT(TRAIN_CRASH_SHOT_DETAILS_ENUM cutsceneShot, BOOL bIsInterp = FALSE, INT iInterpTime = 10000)
VECTOR vCamPos, vCamRot
FLOAT fCamFOV
FILL_CAMERA_PROPERTIES_FOR_TRAIN_CRASH_SHOT(cutsceneShot, vCamPos, vCamRot, fCamFOV)
CREATE_MISSION_STATIC_CAM(staticCam)
DETACH_CAM(staticCam)
// pointing
STOP_CAM_POINTING(staticCam)
SET_CAM_COORD(staticCam, vCamPos)
SET_CAM_ROT(staticCam, vCamRot)
SET_CAM_FOV(staticCam, fCamFOV)
// setup for interpolation
IF bIsInterp
FILL_CAMERA_PROPERTIES_FOR_TRAIN_CRASH_SHOT(INT_TO_ENUM(TRAIN_CRASH_SHOT_DETAILS_ENUM, ENUM_TO_INT(cutsceneShot)+1), vCamPos, vCamRot, fCamFOV)
CREATE_MISSION_STATIC_CAM(interpCam)
SET_CAM_COORD(interpCam, vCamPos)
SET_CAM_ROT(interpCam, vCamRot)
SET_CAM_FOV(interpCam, fCamFOV)
SET_CAM_ACTIVE_WITH_INTERP(interpCam, staticCam, iInterpTime)
ENDIF
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDPROC
// create cam attached to train
PROC CREATE_CAM_ATTACHED_TO_TRAIN(STRING sCam, BOOL bActivated = TRUE, BOOL bRender = TRUE)
IF IS_VEHICLE_DRIVEABLE(missionTrain)
CREATE_MISSION_ANIM_CAM(bActivated, bRender)
PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, sCam, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND))
ENDIF
ENDPROC
PROC INTERP_FLOAT_TO_FLOAT_OVER_TIME(FLOAT f1, FLOAT f2, FLOAT &fChangeVar, FLOAT fTime)
FLOAT fTimeSinceLastFrame = GET_FRAME_TIME()
FLOAT fDiff = f2 - f1
FLOAT fTimePerMS = (fDiff / fTime)
fChangeVar += (fTimePerMS * fTimeSinceLastFrame)
ENDPROC
PROC INTERP_VECTOR_TO_VECTOR_OVER_TIME(VECTOR v1, VECTOR v2, VECTOR &vChangeVar, FLOAT fTime)
INTERP_FLOAT_TO_FLOAT_OVER_TIME(v1.x, v2.x, vChangeVar.x, fTime)
INTERP_FLOAT_TO_FLOAT_OVER_TIME(v1.y, v2.y, vChangeVar.y, fTime)
INTERP_FLOAT_TO_FLOAT_OVER_TIME(v1.z, v2.z, vChangeVar.z, fTime)
ENDPROC
PROC SET_BIKE_CAM_ROTATION()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
SET_CAM_ROT(staticCam, <<12.1,-6.2,GET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE]) - 195>>) // 5.5
VECTOR vCamPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_BIKE], vCurrentBikeCamOffset)
SET_CAM_COORD(staticCam, <<vCamPos.x, vCamPos.y, fBikeCamHeight>>)
SET_CAM_FOV(staticCam, 37.5)
ENDIF
ENDPROC
// create cam attached to train
PROC CREATE_CAM_AT_BIKE()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
CREATE_MISSION_STATIC_CAM(staticCam)
DETACH_CAM(staticCam)
SET_BIKE_CAM_ROTATION()
SHAKE_CAM(staticCam, "SMALL_EXPLOSION_SHAKE", 0.25)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
ENDPROC
PROC APPLY_TEMP_DEAD_ZONE(INT &iMod)
IF iMod > 0
AND iMod < 10
iMod = 0
ENDIF
IF iMod < 0
AND iMod > -10
iMod = 0
ENDIF
ENDPROC
// update train cam
CONST_FLOAT FIRST_PERSON_CAM_SPEED 0.5
CONST_FLOAT FIRST_PERSON_CAM_X_LIMIT 10.0
CONST_FLOAT FIRST_PERSON_CAM_Z_MAX_LIMIT 64.0
CONST_FLOAT FIRST_PERSON_CAM_Z_MIN_LIMIT -79.0
PROC UPDATE_TRAIN_FIRST_PERSON_CAM(BOOL bForceUpdate)
IF IS_VEHICLE_DRIVEABLE(missionTrain)
IF bForceUpdate
OR NOT IS_SELECTOR_ONSCREEN()
vFirstPersonCamRot=vFirstPersonCamRot
/*
VECTOR vTrainRot = GET_ENTITY_ROTATION(missionTrain)
INT iLX, iLY, iRX, iRY
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLX, iLY, iRX, iRY)
APPLY_TEMP_DEAD_ZONE(iRX)
APPLY_TEMP_DEAD_ZONE(iRY)
vFirstPersonCamRot.z = vFirstPersonCamRot.z +@ iRX * FIRST_PERSON_CAM_SPEED * -1
IF vFirstPersonCamRot.z > FIRST_PERSON_CAM_Z_MAX_LIMIT
vFirstPersonCamRot.z = FIRST_PERSON_CAM_Z_MAX_LIMIT
ELIF vFirstPersonCamRot.z < FIRST_PERSON_CAM_Z_MIN_LIMIT
vFirstPersonCamRot.z = FIRST_PERSON_CAM_Z_MIN_LIMIT
ENDIF
FLOAT fMult = -1
IF IS_LOOK_INVERTED()
fMult = 1
ENDIF
vFirstPersonCamRot.x = vFirstPersonCamRot.x +@ iRY * FIRST_PERSON_CAM_SPEED * fMult
IF vFirstPersonCamRot.x > FIRST_PERSON_CAM_X_LIMIT
vFirstPersonCamRot.x = FIRST_PERSON_CAM_X_LIMIT
ELIF vFirstPersonCamRot.x < -FIRST_PERSON_CAM_X_LIMIT
vFirstPersonCamRot.x = -FIRST_PERSON_CAM_X_LIMIT
ENDIF
SET_CAM_ROT(firstPersonCam, vTrainRot + vFirstPersonCamRot)
*/
//SET_CAM_COORD(fpsCam.theCam, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, <<1.3, 4.7, 2.1>>))
fpsCam.vInitCamPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, <<1.2, 4.7, 2.1>>)
fpsCam.vInitCamRot = GET_ENTITY_ROTATION(missionTrain)
UPDATE_FIRST_PERSON_CAMERA(fpsCam, FALSE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
//ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), missionTrain, 0, <<1.23, 4.5, 1.5>>, <<0,0,vFirstPersonCamRot.z>>)
ENDIF
ENDIF
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDPROC
// create cam attached to train
PROC CREATE_TRAIN_FIRST_PERSON_CAM()
IF IS_VEHICLE_DRIVEABLE(missionTrain)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), missionTrain)
ENDIF
INIT_FIRST_PERSON_CAMERA(fpsCam, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, <<1.3, 4.7, 2.1>>), GET_ENTITY_ROTATION(missionTrain), 40.0, 64, 10)
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(TRUE)
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(1.2)
CASCADE_SHADOWS_SET_SPLIT_Z_EXP_WEIGHT(1)
//CREATE_MISSION_STATIC_CAM(firstPersonCam, TRUE)
//ATTACH_CAM_TO_ENTITY(firstPersonCam, missionTrain, <<1.3, 4.7, 2.1>>)
//vFirstPersonCamRot = <<0,0,0>>
//UPDATE_TRAIN_FIRST_PERSON_CAM(TRUE)
//SET_CAM_FOV(firstPersonCam, 40.0)
//RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
ENDPROC
// set next random speech time
PROC SET_NEXT_RANDOM_SPEECH_TIME(INT iTime = -1, INT iRandomMin = -1, INT iRandomMax = -1)
IF iTime >= 0
// if supplied an argument, set it to that
iNextRandomSpeechTime = GET_GAME_TIMER() + iTime
ELSE
INT iNextTimeMin
INT iNextTimeMax
IF iRandomMin < 0
iNextTimeMin = MIN_RANDOM_SPEECH_TIME
ELSE
iNextTimeMin = iRandomMin
ENDIF
IF iRandomMax < 0
iNextTimeMax = MAX_RANDOM_SPEECH_TIME
ELSE
iNextTimeMax = iRandomMax
ENDIF
iNextRandomSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iNextTimeMin, iNextTimeMax)
ENDIF
ENDPROC
// handle random speech
PROC DO_RANDOM_SPEECH(STRING sSpeech, INT iNextTime = -1, INT iRandomMin = -1, INT iRandomMax = -1)
// initialise next speech time if not yet done so
IF iNextRandomSpeechTime < 0
SET_NEXT_RANDOM_SPEECH_TIME()
ENDIF
IF GET_GAME_TIMER() >= iNextRandomSpeechTime
IF DO_MISSION_SPEECH(sSpeech)
IF iNextTime >= 0
SET_NEXT_RANDOM_SPEECH_TIME(iNextTime)
ELSE
SET_NEXT_RANDOM_SPEECH_TIME(-1, iRandomMin, iRandomMax)
ENDIF
ENDIF
ENDIF
ENDPROC
// set bike on the train
PROC SET_BIKE_ON_TRAIN()
IF IS_VEHICLE_DRIVEABLE(missionTrain)
VEHICLE_INDEX lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_BIKE])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_BIKE])
ENDIF
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_BIKE], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(lastCarriage, <<0, -6.0, 3.7>>)) //-7
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BIKE], <<0,0,GET_ENTITY_HEADING(lastCarriage)>>)
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BIKE], 38) // 35
TASK_VEHICLE_TEMP_ACTION(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], TEMPACT_GOFORWARD, 100)
ENDIF
ENDIF
ENDPROC
// synced scene attached to train
PROC CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(VECTOR vAttach)
IF IS_VEHICLE_DRIVEABLE(missionTrain)
iSyncScene = CREATE_SYNCHRONIZED_SCENE(vAttach, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, missionTrain, 0)
ENDIF
ENDPROC
// set trev ready to jump from train
PROC SET_TREVOR_READY_TO_JUMP(BOOL bForce = FALSE)
PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT IS_PED_INJURED(trevorPed)
VECTOR vAttach
STRING sAnim
BOOL bLooped
SWITCH trainRideState
CASE TRAIN_RIDE_STATE_LOW
vAttach = <<0,0,0>>
IF NOT bDoingRideIdle1
sAnim = "EX03_TRAIN_SIDE_IDLE_BASE"
bDoingRideIdle1 = TRUE
ELSE
sAnim = "EX03_TRAIN_SIDE_IDLE_A"
bDoingRideIdle1 = FALSE
ENDIF
bLooped = TRUE
BREAK
CASE TRAIN_RIDE_STATE_HIGH
vAttach = <<0,0,0>>
sAnim = "EX03_TRAIN_ROOF_IDLE"
bLooped = TRUE
BREAK
CASE TRAIN_RIDE_STATE_CLIMB_LADDER
vAttach = <<0,0,0>>
sAnim = "EX03_CLIMB_LADDER"
bLooped = FALSE
BREAK
ENDSWITCH
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(vAttach)
FLOAT fBlend
IF bForce
fBlend = INSTANT_BLEND_IN
ELSE
fBlend = NORMAL_BLEND_IN
ENDIF
//DETACH_ENTITY(trevorPed)
IF IS_PED_IN_ANY_VEHICLE(trevorPed)
SET_ENTITY_COORDS(trevorPed, GET_ENTITY_COORDS(trevorPed) + <<0,0,1>>)
ENDIF
TASK_SYNCHRONIZED_SCENE(trevorPed, iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim, fBlend, NORMAL_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, bLooped)
IF bForce
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
ENDIF
ENDIF
ENDPROC
// equip best player weapon
PROC EQUIP_BEST_PED_WEAPON(PED_INDEX ped, BOOL bForceIntoHand)
IF NOT IS_PED_INJURED(ped)
WEAPON_TYPE bestWeapon = GET_BEST_PED_WEAPON(ped)
WEAPON_GROUP weaponGroup = GET_WEAPONTYPE_GROUP(bestWeapon)
INT iWeaponAmmo = GET_AMMO_IN_PED_WEAPON(ped, bestWeapon)
INT iGiveAmmo = -1
BOOL bWeaponIsSuitable = TRUE
//IF weaponGroup <> WEAPONGROUP_PISTOL
//IF weaponGroup <> WEAPONGROUP_SMG
IF weaponGroup <> WEAPONGROUP_RIFLE
AND weaponGroup <> WEAPONGROUP_MG
//AND weaponGroup <> WEAPONGROUP_SHOTGUN
bWeaponIsSuitable = FALSE
ELSE
INT iReasonableAmmo
SWITCH weaponGroup
CASE WEAPONGROUP_PISTOL
iReasonableAmmo = 240
BREAK
CASE WEAPONGROUP_SMG
iReasonableAmmo = 240
BREAK
CASE WEAPONGROUP_RIFLE
iReasonableAmmo = 240
BREAK
CASE WEAPONGROUP_MG
iReasonableAmmo = 300
BREAK
CASE WEAPONGROUP_SHOTGUN
iReasonableAmmo = 12
BREAK
ENDSWITCH
IF iWeaponAmmo < iReasonableAmmo
iGiveAmmo = iReasonableAmmo
ENDIF
ENDIF
IF bWeaponIsSuitable
SET_CURRENT_PED_WEAPON(ped, bestWeapon, bForceIntoHand)
IF iGiveAmmo >= 0
SET_AMMO_IN_CLIP(ped, bestWeapon, GET_MAX_AMMO_IN_CLIP(ped, bestWeapon))
SET_PED_AMMO(ped, bestWeapon, iGiveAmmo)
ENDIF
ELSE
GIVE_WEAPON_TO_PED(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_BACKUP_RIFLE), 240, TRUE)
ENDIF
ENDIF
ENDPROC
// give ped pistol for boat chase
CONST_INT PISTOL_AMMO 128
PROC GIVE_PED_PISTOL_FOR_BOAT_CHASE(PED_INDEX ped)
IF NOT IS_PED_INJURED(ped)
IF NOT HAS_PED_GOT_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL))
GIVE_WEAPON_TO_PED(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), PISTOL_AMMO)
ELSE
IF GET_AMMO_IN_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL)) < PISTOL_AMMO
SET_PED_AMMO(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), PISTOL_AMMO)
ENDIF
ENDIF
SET_CURRENT_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), TRUE)
ENDIF
ENDPROC
// give player smg for boat chase
PROC GIVE_PED_PISTOL_FOR_DRIVE_ON_TRAIN(PED_INDEX ped)
IF NOT IS_PED_INJURED(ped)
IF NOT HAS_PED_GOT_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL))
GIVE_WEAPON_TO_PED(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), PISTOL_AMMO)
ELSE
IF GET_AMMO_IN_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL)) < PISTOL_AMMO
SET_PED_AMMO(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), PISTOL_AMMO)
ENDIF
ENDIF
SET_CURRENT_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), TRUE)
ENDIF
ENDPROC
CONST_INT SNIPER_AMMO 30
// give player sniper rifle for shootout
PROC GIVE_PED_SNIPER_RIFLE_FOR_SHOOTOUT(PED_INDEX ped)
IF NOT IS_PED_INJURED(ped)
IF NOT HAS_PED_GOT_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE))
AND NOT HAS_PED_GOT_WEAPON(ped, WEAPONTYPE_HEAVYSNIPER)
GIVE_WEAPON_TO_PED(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE), SNIPER_AMMO)
ELSE
IF GET_AMMO_IN_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)) < SNIPER_AMMO
AND GET_AMMO_IN_PED_WEAPON(ped, WEAPONTYPE_HEAVYSNIPER) < SNIPER_AMMO
IF HAS_PED_GOT_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE))
SET_PED_AMMO(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE), SNIPER_AMMO)
ELSE
SET_PED_AMMO(ped, WEAPONTYPE_HEAVYSNIPER, SNIPER_AMMO)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_RIFLE_THERMAL()
WEAPON_TYPE weapon
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
IF weapon = WEAPONTYPE_SNIPERRIFLE
OR weapon = WEAPONTYPE_HEAVYSNIPER
IF bShouldDoSniperHelp
bDoneSniperHelp1 = TRUE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_SNPHLP")
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
CLEAR_HELP(FALSE)
iClearHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
IF bReloadingSniperRifle
IF GET_GAME_TIMER() >= iReloadSniperRifleTime + 2000
bReloadingSniperRifle = FALSE
ENDIF
ENDIF
IF NOT bThermalOn
BOOL bTurnOn = FALSE
IF weapon = WEAPONTYPE_SNIPERRIFLE
OR weapon = WEAPONTYPE_HEAVYSNIPER
IF (IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL_TWO)
OR bThermalSwitchedOn)
AND GET_CONTROL_VALUE(PLAYER_CONTROL, INPUT_AIM) >= 132
AND NOT bReloadingSniperRifle
IF IS_FIRST_PERSON_AIM_CAM_ACTIVE()
bThermalSwitchedOn = TRUE
bTurnOn = TRUE
ENDIF
ENDIF
IF bTurnOn
IF NOT GET_USINGSEETHROUGH()
SET_SEETHROUGH(TRUE)
ENDIF
bThermalOn = TRUE
ENDIF
ENDIF
ELSE
REPLAY_PREVENT_RECORDING_THIS_FRAME()
bDoneSniperHelp1 = TRUE
bDoneSniperHelp2 = TRUE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_SNPHLP2")
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
CLEAR_HELP(FALSE)
iClearHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
INT iClip
BOOL bTurnOff = FALSE
IF weapon <> WEAPONTYPE_SNIPERRIFLE
AND weapon <> WEAPONTYPE_HEAVYSNIPER
bTurnOff = TRUE
ELSE
GET_AMMO_IN_CLIP(PLAYER_PED_ID(), weapon, iClip)
ENDIF
BOOL bLessThanMax = FALSE
IF weapon = WEAPONTYPE_SNIPERRIFLE
IF iClip < 10
bLessThanMax = TRUE
ENDIF
ELIF weapon = WEAPONTYPE_HEAVYSNIPER
IF iClip < 6
bLessThanMax = TRUE
ENDIF
ENDIF
IF bLessThanMax AND IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_RELOAD)
OR iClip = 0
bReloadingSniperRifle = TRUE
iReloadSniperRifleTime = GET_GAME_TIMER()
ENDIF
IF NOT IS_FIRST_PERSON_AIM_CAM_ACTIVE()
OR GET_CONTROL_VALUE(PLAYER_CONTROL, INPUT_AIM) < 132
OR bReloadingSniperRifle
bTurnOff = TRUE
ENDIF
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL_TWO)
IF IS_FIRST_PERSON_AIM_CAM_ACTIVE()
bThermalSwitchedOn = FALSE
bTurnOff = TRUE
ENDIF
ENDIF
IF bTurnOff
IF GET_USINGSEETHROUGH()
SET_SEETHROUGH(FALSE)
ENDIF
bThermalOn = FALSE
ENDIF
ENDIF
ENDPROC
// move the last player vehicle if at coord
PROC CLEAR_INIT_POS(VECTOR vCheckPos)
CLEAR_AREA(vCheckPos, CLEAR_POS_RADIUS, TRUE, TRUE)
ENDPROC
// position player at init pos for mission
PROC POSITION_PLAYER_AT_MISSION_INIT()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT))
SET_ENTITY_HEADING(PLAYER_PED_ID(), PLAYER_INIT_ROT)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDIF
ENDPROC
// set michael into the car
PROC DO_MICHAEL_INTO_CAR()
printstring("here3") printnl()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
printstring("here5") printnl()
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_MICHAEL_CAR])
printstring("here6") printnl()
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_MICHAEL_CAR])
printstring("here4") printnl()
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL],MS_ON_FOOT_WALK,FALSE,FAUS_CUTSCENE_EXIT)
SET_PED_MIN_MOVE_BLEND_RATIO(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL],PEDMOVE_WALK)
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
TASK_ENTER_VEHICLE(NULL, trainCrashVehicle[TCV_MICHAEL_CAR], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVEBLENDRATIO_WALK)
TASK_VEHICLE_DRIVE_TO_COORD(NULL, trainCrashVehicle[TCV_MICHAEL_CAR], <<1992.65, 3839.31, 31.33>>, 5.0, DRIVINGSTYLE_NORMAL, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL_CAR), DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, 5, -1)
//TASK_VEHICLE_DRIVE_WANDER(NULL, trainCrashVehicle[TCV_MICHAEL_CAR], 20.0, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sequence)
ENDIF
ENDPROC
// disable leave bike
PROC DISABLE_LEAVE_BIKE_ON_TRAIN()
IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
ENDIF
ENDPROC
// apply helper force
PROC APPLY_HELPER_FORCE_TO_BIKE_ON_TRAIN()
IF bDoHelperForceOnTrain
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_BIKE], APPLY_TYPE_FORCE, <<0,10,0>>, 0, TRUE, TRUE)
ENDIF
ENDIF
ENDPROC
// chopper weapons swap
/*
PROC HANDLE_CHOPPER_WEAPON_SWAP(PED_INDEX ped, INT &iTime, BOOL &bRockets)
IF NOT IS_PED_INJURED(ped)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
AND NOT IS_PED_INJURED(dummyBoatPed)
IF NOT bRockets
IF GET_GAME_TIMER() >= iTime
SET_PED_FIRING_PATTERN(ped, FIRING_PATTERN_FULL_AUTO)
SET_CURRENT_PED_VEHICLE_WEAPON(ped, WEAPONTYPE_VEHICLE_SPACE_ROCKET)
iTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
bRockets = TRUE
ELSE
ATTACH_ENTITY_TO_ENTITY(dummyBoatPed, trainCrashVehicle[TCV_DINGHY], 0, <<0,0,0>>, <<0,0,0>>)
ENDIF
ELSE
IF GET_GAME_TIMER() >= iTime
SET_PED_FIRING_PATTERN(ped, FIRING_PATTERN_FULL_AUTO)
SET_CURRENT_PED_VEHICLE_WEAPON(ped, WEAPONTYPE_VEHICLE_PLAYER_BULLET)
iTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 10000)
bRockets = FALSE
ELSE
ATTACH_ENTITY_TO_ENTITY(dummyBoatPed, trainCrashVehicle[TCV_DINGHY], 0, <<0,7.1,1.8>>, <<0,0,0>>)
ENDIF
ENDIF
ENDIF
ENDPROC
*/
// set michael searching in container
PROC SET_MICHAEL_SEARCHING_IN_CONTAINER(INT iSearchAnim, BOOL bInstant)
PED_INDEX michaelPed = GET_MICHAEL_PED()
IF NOT IS_PED_INJURED(michaelPed)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
//iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<1,0.1,0>>, <<0,0,0>>)
iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_POS), GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_ROT))
//ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, trainCrashVehicle[TCV_DINGHY], 0)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, TRUE)
STRING sAnim
SWITCH iSearchAnim
CASE 0
sAnim = "EX03_DINGY_SEARCH_CASE_BASE_MICHAEL"
BREAK
CASE 1
sAnim = "EX03_DINGY_SEARCH_CASE_A_MICHAEL"
BREAK
CASE 2
sAnim = "EX03_DINGY_SEARCH_CASE_B_MICHAEL"
BREAK
ENDSWITCH
FLOAT fBlendIn
IF bInstant
fBlendIn = INSTANT_BLEND_IN
ELSE
fBlendIn = SLOW_BLEND_IN
ENDIF
TASK_SYNCHRONIZED_SCENE(michaelPed, iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim, fBlendIn, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, blockingAllRagdoll)
IF bInstant
FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed)
ENDIF
ENDIF
ENDPROC
// step into container
PROC SET_MICHAEL_STEP_INTO_CONTAINER(BOOL bSkipToPhase)
PED_INDEX michaelPed = GET_MICHAEL_PED()
IF NOT IS_PED_INJURED(michaelPed)
SET_ENTITY_COORDS(michaelPed, GET_ENTITY_COORDS(michaelPed) + <<0,0,1>>)
iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_POS), GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_ROT))
TASK_SYNCHRONIZED_SCENE(michaelPed, iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_CLIMB_DOWN_ENTER_MICHAEL", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, blockingAllRagdoll)
IF bSkipToPhase
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, SKIP_MICHAEL_INTO_CONTAINER_PHASE)
ENDIF
FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed)
ENDIF
ENDPROC
int iContDriveSyncScene
PROC DRIVE_BOAT_TO_COINTAINER()
PED_INDEX michaelPed = GET_MICHAEL_PED()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
AND NOT IS_PED_INJURED(michaelPed)
IF NOT IS_PED_IN_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
iContDriveSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_POS) + <<0.04, 0.03, -0.0017>>, GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_ROT) + <<-1,0,-1.0>>)
PLAY_SYNCHRONIZED_ENTITY_ANIM(trainCrashVehicle[TCV_DINGHY], iContDriveSyncScene, "EX03_DINGY_DRIVE_UP_DINGY", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), INSTANT_BLEND_IN)
SET_SYNCHRONIZED_SCENE_PHASE(iContDriveSyncScene, 0.2)//0.15)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(trainCrashVehicle[TCV_DINGHY])
ENDPROC
/// PURPOSE:
/// Check if the dingy has finished playing it's sync scene of it driving up to the container.
/// RETURNS:
///
FUNC BOOL HAS_BOAT_DRIVEN_TO_CONTAINER()
IF GET_SYNCHRONIZED_SCENE_PHASE(iContDriveSyncScene) > 0.4
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// handle michael searching in container
PROC HANDLE_MICHAEL_SEARCHING_IN_CONTAINER()
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
FLOAT fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene)
IF fPhase >= 0.0
IF fPhase >= 0.98
INT iNewSearch
SWITCH iCurrentSearch
CASE 0
iNewSearch = 0
BREAK
CASE 1
iNewSearch = 1
BREAK
CASE 2
iNewSearch = 0
BREAK
CASE 3
iNewSearch = 2
BREAK
CASE 4
iNewSearch = 0
BREAK
ENDSWITCH
SET_MICHAEL_SEARCHING_IN_CONTAINER(iNewSearch, FALSE)
iCurrentSearch++
IF iCurrentSearch > 4
iCurrentSearch = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC BLIP_RIVER_MOUTH()
IF NOT DOES_BLIP_EXIST(gotoBlip)
IF NOT bDoMopUp
IF DOES_BLIP_EXIST(vehicleBlip)
REMOVE_BLIP(vehicleBlip)
ENDIF
IF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_RIVER_MOUTH))
ENDIF
ENDIF
ELSE
IF boatHotswapState <> BOAT_HOTSWAP_ON_MICHAEL
REMOVE_BLIP(gotoBlip)
ENDIF
ENDIF
IF NOT bShownGodText
IF NOT bDoMopup
IF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
AND ((currentMissionStage = STAGE_STEAL_FROM_CONTAINER AND bDoneGotoSpeech) OR (bDoneRapidsSpeechInterrupt[RSI_BOATS_INTRO] AND NOT bRapidsSpeechInterruptPending))
bShownGodText = DO_MISSION_GOD_TEXT("TC_ESCAPE")
ENDIF
ENDIF
ENDIF
ENDPROC
// reposition dinghy
PROC REPOSITION_DINGHY()
//PRINTSTRING("TRY REPOS") PRINTNL()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
STOP_SYNCHRONIZED_ENTITY_ANIM(trainCrashVehicle[TCV_DINGHY], INSTANT_BLEND_OUT, TRUE)
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_CONTAINER))
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_CONTAINER_ROTATION))
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], TRUE)
//printstring("reposition dinghY") printnl()
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_LOCKED)
bRepositionedDinghy = TRUE
ENDIF
ENDPROC
// set trevor into cover for shootout
PROC SET_TREVOR_INTO_COVER_FOR_SHOOTOUT(BOOL bInstant = TRUE)
PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT IS_PED_INJURED(trevorPed)
islandCover = ADD_COVER_POINT(<<-485.2, 4400.4, 30.4>>, 11.3, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
IF bInstant
TASK_PUT_PED_DIRECTLY_INTO_COVER(trevorPed, <<-485.16, 4399.73, 30.67>>, -1, FALSE, 0, TRUE, FALSE, islandCover)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
ELSE
TASK_SEEK_COVER_TO_COVER_POINT(trevorPed, islandCover, <<-488.99, 4436.39, 31.15>>, -1, TRUE)
ENDIF
ENDIF
ENDPROC
// should we set the checkpoint for replay on this stage init?
FUNC BOOL SHOULD_SET_CHECKPOINT_FOR_THIS_STAGE(MISSION_STAGE_ENUM setStage)
SWITCH setStage
CASE STAGE_INTERCEPT_TRAIN
CASE STAGE_CHASE_TRAIN
CASE STAGE_DRIVE_ALONG_TRAIN
CASE STAGE_GET_TO_BRIDGE
CASE STAGE_GO_TO_CONTAINER
CASE STAGE_STEAL_FROM_CONTAINER
CASE STAGE_RAPIDS_CHASE
CASE STAGE_GET_HOME
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// clear the start area
PROC CLEAR_START_AREA()
// clear init areas
CLEAR_INIT_POS(GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT))
CLEAR_INIT_POS(GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_INIT))
CLEAR_INIT_POS(GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_INIT))
CLEAR_INIT_POS(GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_CAR_INIT))
ENDPROC
// set michael at init pos
PROC SET_MICHAEL_AT_INIT()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_INIT))
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], MICHAEL_INIT_ROT)
ENDIF
ENDPROC
// boat at beach
PROC SETUP_BOAT_AND_BEACH()
WHILE beachCreationStage <> BEACH_CREATION_DONE
WAIT(0)
HANDLE_BEACH_CREATION(TRUE)
ENDWHILE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-2462.42725, 4278.47510, 0.18656>>)
ENDIF
ENDPROC
// start a particular stage of the mission
PROC SET_MISSION_STAGE(MISSION_STAGE_ENUM setStage, BOOL bJumpingToStage = FALSE, BOOL bClearTextAndSpeech = TRUE, BOOL bInitialisingAfterIntro = FALSE, BOOL bRemoveAllBlips = TRUE, BOOL bClearMap = TRUE, BOOL bHandleFadeIn = TRUE)
// no helmet plz
//SET_PED_HELMET(PLAYER_PED_ID(), FALSE)
IF bJumpingToStage
// clear area and load scene around start pos
VECTOR vStartPos
FLOAT fStartRot
SWITCH setStage
CASE STAGE_INTERCEPT_TRAIN
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT)
fStartRot = PLAYER_INIT_ROT
BREAK
CASE STAGE_CHASE_TRAIN
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_CHASE)
fStartRot = BIKE_CHASE_ROT
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_DRIVE_ALONG_TRAIN)
fStartRot = 45.8
BREAK
CASE STAGE_GET_TO_BRIDGE
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_PURSUIT_FOLLOW_STAGE)
fStartRot = PURSUIT_FOLLOW_STAGE_ROT
BREAK
CASE STAGE_GO_TO_CONTAINER
vStartPos = <<-402,4435,30>>
fStartRot = DINGHY_AT_BRIDGE_ROT
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_SHOOTOUT_INIT_REPLAY)
fStartRot = -80.0
BREAK
CASE STAGE_RAPIDS_CHASE
vStartPos = <<-590.82245, 4401.20459, 15.17075>>
fStartRot = -92.7
BREAK
CASE STAGE_GET_HOME
IF NOT bForcePassOnShitskip
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BEACH)
fStartRot = DINGHY_AT_BEACH_ROT
ELSE
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES)
fStartRot = -107.9
ENDIF
BREAK
ENDSWITCH
// clear area for replay
SET_PLAYER_OUT_OF_ANY_VEHICLE()
IF bClearMap
CLEAR_AREA(vStartPos, 10000, TRUE)
ENDIF
WAIT(0)
// set weather
SET_WEATHER_TYPE_NOW_PERSIST("extrasunny")
IF IS_REPLAY_IN_PROGRESS()
AND NOT bSuppressFutureReplaySetups
START_REPLAY_SETUP(vStartPos, fStartRot)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vStartPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fStartRot)
ENDIF
ENDIF
// get the models and force their load
REQUEST_MODELS_FOR_STAGE(setStage, TRUE, FALSE)
// get the recordings and force their load
REQUEST_VEHICLE_RECORDINGS_FOR_STAGE(setStage, TRUE, FALSE)
// get the waypoints and force their load
REQUEST_WAYPOINT_RECORDINGS_FOR_STAGE(setStage, TRUE, FALSE)
// get the anims and force their load
REQUEST_ANIM_DICTS_FOR_STAGE(setStage, TRUE, FALSE)
// get the weapons and force their load
REQUEST_WEAPONS_FOR_STAGE(setStage, TRUE, FALSE)
// reset vars
IF setStage = STAGE_RAPIDS_CHASE
IF NOT bJumpingToStage
bCachedShownGodText = bShownGodText
ENDIF
ENDIF
RESET_VARIABLES_FOR_STAGE(setStage)
// get the ptfx and force their load
REQUEST_PTFX_FOR_STAGE(setStage, TRUE, FALSE)
// get the sfx and force their load
REQUEST_SFX_FOR_STAGE(setStage, TRUE, FALSE)
// get the misc assets and force their load
REQUEST_MISC_ASSETS_FOR_STAGE(setStage, TRUE, FALSE)
// get the text and force its load
REQUEST_TEXT(TRUE)
// reset mocap streaming
//IF mocapStreamingStage >= MOCAP_STREAMING_STAGE_WAIT
REMOVE_CUTSCENE()
mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST
//ENDIF
// get rid of blips and text
IF bRemoveAllBlips
REMOVE_ALL_BLIPS()
ENDIF
REMOVE_MISSION_TEXT(bClearTextAndSpeech OR bJumpingToStage, bClearTextAndSpeech OR bJumpingToStage)
// kill chase cam
RESET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
#IF IS_DEBUG_BUILD
bDebugJSkip = FALSE
#ENDIF
IF bJumpingToStage
// set the correct player character if not already
enumCharacterList stageCharacter = GET_CHARACTER_FOR_MISSION_STAGE(setStage)
SELECTOR_SLOTS_ENUM selectorSlot = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(stageCharacter)
IF GET_CURRENT_PLAYER_PED_ENUM() <> stageCharacter
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[selectorSlot], stageCharacter, GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0,0,1>>, GET_ENTITY_HEADING(PLAYER_PED_ID()), FALSE)
WAIT(0)
ENDWHILE
WHILE NOT MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, selectorSlot)
WAIT(0)
ENDWHILE
WHILE NOT TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE)
WAIT(0)
ENDWHILE
INT i
REPEAT 3 i
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i])
DELETE_PED(sSelectorPeds.pedID[i])
ENDIF
ENDREPEAT
ENDIF
ENDIF
IF bJumpingToStage
OR bInitialisingAfterIntro
// remove all dialogue
IF bJumpingToStage
INT i
FOR i=0 TO 9
REMOVE_PED_FOR_DIALOGUE(trainCrashConversation, i)
ENDFOR
ENDIF
// setup player with dialogue
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, PLAYER_PED_ID(), "MICHAEL")
BREAK
CASE CHAR_TREVOR
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 1, PLAYER_PED_ID(), "TREVOR")
BREAK
ENDSWITCH
sSelectorPeds.eCurrentSelectorPed = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CHARACTER_FOR_MISSION_STAGE(setStage))
// create the player characters for the stage
CREATE_PLAYER_CHARACTERS_WITH_TRANSPORT_IN_MISSION_STAGE(setStage)
SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PLAYER_PED_ID(), GET_CHARACTER_FOR_MISSION_STAGE(setStage), setStage)
IF bJumpingToStage
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
WAIT(0)
ENDWHILE
ENDIF
// create the train at correct point for the stage
IF setStage = STAGE_INTERCEPT_TRAIN
IF bJumpingToStage
CLEAR_AREA_OF_VEHICLES(GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT), 1000, TRUE) // temp?
WAIT(0)
ENDIF
ELSE
CREATE_TRAIN_FOR_STAGE(setStage, setStage >= STAGE_GET_TO_BRIDGE)
ENDIF
ENDIF
IF (setStage <> STAGE_GET_TO_BRIDGE AND setStage <> STAGE_STEAL_FROM_CONTAINER AND setStage <> STAGE_INTERCEPT_TRAIN)
OR bJumpingToStage
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
// headsets
IF bJumpingToStage
OR setStage = STAGE_INTERCEPT_TRAIN
SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, TRUE)
SET_PLAYER_PED_WITH_HEADSET(CHAR_TREVOR, TRUE)
ENDIF
// suppress
IF setStage >= STAGE_GET_TO_BRIDGE
SUPPRESS_MISSION_VEHICLES(TRUE, TRUE)
ENDIF
// geo
IF setStage >= STAGE_GO_TO_CONTAINER
AND setStage < STAGE_GET_HOME
IF bJumpingToStage
SET_TRAIN_CRASH_GEO(TRUE, setStage < STAGE_RAPIDS_CHASE, setStage = STAGE_GO_TO_CONTAINER, DEFAULT, NOT bJumpingToStage)
ENDIF
IF bJumpingToStage
OR setStage = STAGE_GO_TO_CONTAINER
CREATE_CRATES_INSIDE_TRAINCAR()
ENDIF
// wait on jump
IF bJumpingToStage
//WAIT(100)
//LOAD_SCENE(<<-494.65686, 4433.42822, 29.99994>>)
//WAIT(500)
ENDIF
ELSE
SET_TRAIN_CRASH_GEO(FALSE)
REMOVE_CRATES_INSIDE_TRAINCAR()
ENDIF
//IF bJumpingToStage
// IF setStage >= STAGE_STEAL_FROM_CONTAINER
// DO_DOORS_BLOW_OPEN(TRUE)
// ENDIF
//ENDIF
// do any other necessary setup for the stage
SWITCH setStage
CASE STAGE_INTERCEPT_TRAIN
IF bJumpingToStage
WAIT(0)
SET_MICHAEL_AT_INIT()
DO_MICHAEL_INTO_CAR()
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
//SET_PED_HELMET(PLAYER_PED_ID(), TRUE)
ENDIF
// michael earpiece
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_GetOutUndriveableVehicle, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_CAN_TAUNT_IN_VEHICLE, TRUE)
ENDIF
INIT_FLIP_OFF_PED(flipOffData, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
CREATE_RON_AND_PATRICIA(bJumpingToStage)
//gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_PATH_START), TRUE)
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
BREAK
CASE STAGE_CHASE_TRAIN
IF bJumpingToStage
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
ENDIF
ENDIF
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
createEngineerStage = CREATE_ENGINEER_STAGE_NOT_STARTED
GIVE_PED_HELMET(PLAYER_PED_ID(), FALSE)
iGetInTextStage = 2
bRemovedMichael = TRUE
bDoneSeeTrainSpeech = TRUE
bPreparedSeeTrainCue = TRUE
bDoneSeeTrainCue = TRUE
bPreparedLandOnTrainCue = FALSE
bDoneLandOnTrainCue = FALSE
bDoneSeeTrainAudioScene = FALSE
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_NOT_STARTED
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, TRUE)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
bTempSuppressVehicleSpawning = TRUE
bTempPreventStillVehicleState = TRUE
iSuppressVehicleSpawnTime = GET_GAME_TIMER()
TRIGGER_MISSION_MUSIC_EVENT("EXL3_SEE_TRAIN_RESTART")
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, NULL, "MICHAEL")
ELSE
bShownGodText = TRUE
ENDIF
DELETE_RON_AND_PATRICIA()
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_HARD)
SET_NEXT_RANDOM_SPEECH_TIME(10000)
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
IF bJumpingToStage
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
ENDIF
ENDIF
createEngineerStage = CREATE_ENGINEER_STAGE_NOT_STARTED
GIVE_PED_HELMET(PLAYER_PED_ID(), FALSE)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
// set the bike on the train
WAIT(0)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
TRIGGER_MISSION_MUSIC_EVENT("EXL3_BIKE_LAND_RESTART")
iClosestCarriage = EXILE3_LAST_CARRIAGE
bTempPreventStillVehicleState = TRUE
bDoHelperForceOnTrain = FALSE
ELSE
IF NOT bDoneLandOnTrainCue
IF bPreparedLandOnTrainCue
bDoneLandOnTrainCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_BIKE_LAND")
printstring("trigger event EXL3_BIKE_LAND") printnl()
ENDIF
ENDIF
bDoHelperForceOnTrain = FALSE//TRUE
ENDIF
iCachedCarriage = iClosestCarriage
BLOCK_GPS_FOR_JUMPS()
MAKE_BIKE_EASY_TO_LAND()
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_MICHAEL_CAR])
DELETE_VEHICLE(trainCrashVehicle[TCV_MICHAEL_CAR])
ENDIF
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE)
//GIVE_PED_PISTOL_FOR_DRIVE_ON_TRAIN(PLAYER_PED_ID())
SET_NEXT_RANDOM_SPEECH_TIME(8000)
BREAK
CASE STAGE_GET_TO_BRIDGE
SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>)
SET_TRAIN_SPEED_FOR_STAGE(STAGE_GET_TO_BRIDGE)
IF NOT bJumpingToStage
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_BIKE])
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[TCV_BIKE])
ENDIF
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_INIT), DINGHY_INIT_ROT)
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, TRUE)
ELSE
createMercPickupStage = CREATE_MERC_PICKUP_STAGE_NOT_STARTED
// attach trevor to jump point
IF IS_VEHICLE_DRIVEABLE(missionTrain)
SET_MISSION_CUTSCENE(TRUE)
ENDIF
TRIGGER_MISSION_MUSIC_EVENT("EXL3_TRAIN_ROOF_RESTART")
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], TRUE, TRUE, TRUE, TRUE, TRUE)
ENDIF
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RIDE_TRAIN)
//CREATE_TRAIN_REVERSE_CAM()
DESTROY_MISSION_ANIM_CAM()
IF NOT IS_PED_INJURED(engineerPed[0])
SET_ENTITY_PROOFS(engineerPed[0], TRUE, TRUE, TRUE, TRUE, TRUE)
SET_PED_CAN_RAGDOLL(engineerPed[0], FALSE)
SET_PED_CONFIG_FLAG(engineerPed[0], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(engineerPed[0], PCF_DisableExplosionReactions, TRUE)
ENDIF
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(EXL3_TRAIN_TIME)
DISPLAY_RADAR(TRUE) // display the radar
PRINT_HELP("TC_TRNHLP")
//SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
BREAK
CASE STAGE_GO_TO_CONTAINER
ALLOW_DIALOGUE_IN_WATER(TRUE)
IF bJumpingToStage
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
ENDIF
ENDIF
ENDIF
//IF STREAMVOL_IS_VALID(bridgeVolume)
// STREAMVOL_DELETE(bridgeVolume)
//ENDIF
INT i
REPEAT NUMBER_MERC_PICKUP_VEHICLES i
IF DOES_ENTITY_EXIST(mercPickupVehicle[i])
DELETE_VEHICLE(mercPickupVehicle[i])
ENDIF
ENDREPEAT
REPEAT NUMBER_MERC_PICKUP_PEDS i
IF DOES_ENTITY_EXIST(mercPickupPed[i])
DELETE_PED(mercPickupPed[i])
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(trainJumpAnchorObject)
DELETE_OBJECT(trainJumpAnchorObject)
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
//STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
IF bJumpingToStage
ENDIF
ENDIF
ENDIF
WEAPON_TYPE weaponStickyBomb
weaponStickyBomb = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
WEAPON_TYPE currentVehicleWeapon
GET_CURRENT_PED_VEHICLE_WEAPON(PLAYER_PED_ID(), currentVehicleWeapon)
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), weaponStickyBomb)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), weaponStickyBomb, 5, FALSE, FALSE)
ELSE
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), weaponStickyBomb) < 5
SET_PED_AMMO(PLAYER_PED_ID(), weaponStickyBomb, 5)
ENDIF
ENDIF
IF currentVehicleWeapon <> weaponStickyBomb
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
SET_CURRENT_PED_VEHICLE_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
ENDIF
IF bJumpingToStage
TRIGGER_MISSION_MUSIC_EVENT("EXL3_STICKY_BOMB_RESTART")
ENDIF
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_PLANT_BOMB)
CLEAR_PED_WETNESS(PLAYER_PED_ID())
//EQUIP_BEST_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
//SET_TREVOR_INTO_COVER_FOR_SHOOTOUT()
//SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weaponStickyBomb, TRUE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF bJumpingToStage
REMOVE_PED_HELMET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
SET_PED_DIES_IN_WATER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
TASK_GO_STRAIGHT_TO_COORD(NULL, <<-477.46, 4401.26, 29.44>>, PEDMOVE_RUN)
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<-482.12469, 4396.74756, 29.99994>>, PEDMOVE_RUN)
TASK_GO_STRAIGHT_TO_COORD(NULL, GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_SHOOTOUT_INIT), PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, TREVOR_SHOOTOUT_INIT_ROT)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sequence)
buddyBlip = CREATE_BLIP_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
IF bJumpingToStage
bStartedDebrisFX = FALSE
ENDIF
SET_NEXT_RANDOM_SPEECH_TIME(8500)
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
//DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
//SET_MICHAEL_SEARCHING_IN_CONTAINER(0,bJumpingToStage)
//ALLOW_DIALOGUE_IN_WATER(TRUE)
//PRINTSTRING("JUMP TO STAGE") PRINTNL()
IF bJumpingToStage
//PRINTSTRING("INSIDE HERE") PRINTNL()
GIVE_PED_SNIPER_RIFLE_FOR_SHOOTOUT(PLAYER_PED_ID())
//CREATE_DEBRIS()
bThermalOn = FALSE
bThermalSwitchedOn = FALSE
bJumpedToShootout = TRUE
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
SET_MICHAEL_STEP_INTO_CONTAINER(TRUE)
EQUIP_BEST_PED_WEAPON(PLAYER_PED_ID(), TRUE)
SET_PED_WETNESS_HEIGHT(PLAYER_PED_ID(), 1.8)
//CREATE_ENEMY_WAVE(EW_SHOOTOUT_SECOND_WAVE, TRUE)
SET_TREVOR_INTO_COVER_FOR_SHOOTOUT()
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
ELSE
bJumpedToShootout = FALSE
//BLIP_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE)
ENDIF
SET_PED_PRELOAD_PROP_DATA(PLAYER_PED_ID(), ANCHOR_HEAD, 9, 0)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
STOP_SYNCHRONIZED_ENTITY_ANIM(trainCrashVehicle[TCV_DINGHY], INSTANT_BLEND_OUT, TRUE)
SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], TRUE, TRUE, TRUE, TRUE, TRUE)
SET_VEHICLE_STRONG(trainCrashVehicle[TCV_DINGHY], TRUE)
ENDIF
// IF bJumpingToStage
REPOSITION_DINGHY()
// ENDIF
IF bJumpingToStage
TRIGGER_MISSION_MUSIC_EVENT("EXL3_FIGHT_RESTART")
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL)
bStartedDebrisFX = FALSE
ENDIF
iShootoutStartTime = GET_GAME_TIMER()
BREAK
CASE STAGE_RAPIDS_CHASE
//SET_RAPPEL_ASSETS_AS_NO_LONGER_NEEDED()
//INT j
//REPEAT NUMBER_RAPPEL_ENEMIES j
/// CLEANUP_RAPPEL(enemyRappelData[j].rappelData)
//ENDREPEAT
//ALLOW_DIALOGUE_IN_WATER(TRUE)
IF bJumpingToStage
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
ENDIF
ENDIF
bSkippedWaterfallCutaway = FALSE
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_RESTART")
boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
CREATE_CASE(CASE_UNDER_SEAT)
boatRPGState = BOAT_RPG_NOT_STARTED
ENDIF
PED_INDEX michaelPed
michaelPed = GET_MICHAEL_PED()
IF NOT IS_PED_INJURED(michaelPed)
GIVE_PED_PISTOL_FOR_BOAT_CHASE(michaelPed)
ENDIF
/*
REPEAT NUMBER_DEBRIS i
IF DOES_ENTITY_EXIST(debris[i].obj)
SET_OBJECT_AS_NO_LONGER_NEEDED(debris[i].obj)
ENDIF
ENDREPEAT
*/
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], FALSE, FALSE, FALSE, FALSE, FALSE)
SET_VEHICLE_STRONG(trainCrashVehicle[TCV_DINGHY], FALSE)
// create dummy boat vehicle
/*
dummyBoatPed = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), <<0,1,2>>)
SET_ENTITY_VISIBLE(dummyBoatPed, FALSE)
SET_ENTITY_COLLISION(dummyBoatPed, FALSE)
SET_ENTITY_FLAG_SUPPRESS_SHADOW(dummyBoatPed, TRUE)
SET_ENTITY_PROOFS(dummyBoatPed, TRUE, TRUE, TRUE, TRUE, TRUE)
*/
ENDIF
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL)
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR)
SET_TIMECYCLE_MODIFIER("canyon_mission")
SET_TIMECYCLE_MODIFIER_STRENGTH(1.0)
IF NOT bJumpingToStage
bShownGodText = bCachedShownGodText
IF NOT bDoneRapidsStartCue
IF bPreparedRapidsStartCue
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_START")
ENDIF
ENDIF
ENDIF
//iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + 8000
IF bJumpingToStage
bStartedDebrisFX = FALSE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 004, GET_TRAIN_CRASH_RECORDING_PREFIX())
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], SKIP_REC_AFTER_WATERFALL)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
WAIT(0)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
CREATE_ENEMY_WAVE(EW_CHASE_FIRST_BOAT_WAVE, TRUE, STAGE_RAPIDS_CHASE)
bTriggeredEnemyWave[EW_CHASE_FIRST_BOAT_WAVE] = TRUE
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(20)
ENDIF
BREAK
CASE STAGE_GET_HOME
CLEAR_TIMECYCLE_MODIFIER()
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
//SET_PLAYER_WEAPON_DEFENSE_MODIFIER(PLAYER_ID(), 1.0)
IF bJumpingToStage
IF NOT bForcePassOnShitskip
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
ENDIF
ENDIF
ENDIF
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_END_RESTART")
boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
beachCreationStage = BEACH_CREATION_NOT_STARTED
CREATE_CASE(CASE_UNDER_SEAT)
boatRPGState = BOAT_RPG_DONE
iGetInTextStage = 2
IF bForcePassOnShitskip
bGotToBeach = TRUE
//SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES))
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES) + <<2,0,0>>)
ENDIF
SETUP_BOAT_AND_BEACH()
//LOAD_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES))
ELSE
ENDIF
CLEAR_PED_WETNESS(PLAYER_PED_ID())
ELSE
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_END")
ENDIF
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL)
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_BEACH)
//IF DOES_ENTITY_EXIST(dummyBoatPed)
// DELETE_PED(dummyBoatPed)
//ENDIF
BREAK
ENDSWITCH
IF setStage <= STAGE_DRIVE_ALONG_TRAIN
SET_IGNORE_NO_GPS_FLAG(TRUE)
ELSE
SET_IGNORE_NO_GPS_FLAG(FALSE)
ENDIF
IF bJumpingToStage
IF setStage = STAGE_STEAL_FROM_CONTAINER
ELIF setStage = STAGE_RAPIDS_CHASE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180)
ELSE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
ENDIF
// set value for replay
BOOL bFinalCheckpoint = FALSE
IF ENUM_TO_INT(setStage) >= ENUM_TO_INT(STAGE_GET_HOME)
bFinalCheckpoint = TRUE // skipping from this point would end the mission
ENDIF
IF SHOULD_SET_CHECKPOINT_FOR_THIS_STAGE(setStage)
Set_Replay_Mid_Mission_Stage_With_Name(ENUM_TO_INT(setStage), GET_DESCRIPTION_FOR_STAGE_AS_STRING(setStage), bFinalCheckpoint)
IF ENUM_TO_INT(setStage) <> 0
AND NOT bJumpingToStage
iReplayAttempt = 0
ENDIF
ENDIF
IF setStage = STAGE_STEAL_FROM_CONTAINER
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
ELSE
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
ENDIF
// set wanted level
//IF setStage <= STAGE_GET_TO_BRIDGE
// SET_WANTED_LEVEL_MULTIPLIER(1.0)
// SET_MAX_WANTED_LEVEL(5)
// ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
// ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
//ELSE
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_MAX_WANTED_LEVEL(0)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
//ENDIF
// instance priority
IF setStage = STAGE_STEAL_FROM_CONTAINER
OR setStage = STAGE_RAPIDS_CHASE
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
ELIF setStage = STAGE_GET_TO_BRIDGE
OR setStage = STAGE_DRIVE_ALONG_TRAIN
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
ELSE
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
ENDIF
// shootout evo
IF setStage >= STAGE_STEAL_FROM_CONTAINER
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_PARTICLE_FX_SHOOTOUT_BOAT(trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
IF bJumpingToStage
WHILE IS_SCREEN_FADING_OUT()
WAIT(0)
ENDWHILE
IF NOT bSuppressFutureReplaySetups
IF IS_REPLAY_IN_PROGRESS()
IF IS_REPLAY_BEING_SET_UP()
VEHICLE_INDEX endReplayVehicle
SWITCH setStage
CASE STAGE_CHASE_TRAIN
//CASE STAGE_DRIVE_ALONG_TRAIN
endReplayVehicle = trainCrashVehicle[TCV_BIKE]
BREAK
CASE STAGE_GO_TO_CONTAINER
CASE STAGE_RAPIDS_CHASE
CASE STAGE_GET_HOME
IF NOT bForcePassOnShitskip
endReplayVehicle = trainCrashVehicle[TCV_DINGHY]
ENDIF
BREAK
ENDSWITCH
BOOL bReturnControl = TRUE
VEHICLE_SEAT seat = VS_DRIVER
IF setStage = STAGE_RAPIDS_CHASE
seat = VS_FRONT_RIGHT
ENDIF
END_REPLAY_SETUP(endReplayVehicle, seat, bReturnControl)
bSuppressFutureReplaySetups = TRUE
ENDIF
ENDIF
ENDIF
// post replay setup specific skip stuff
SWITCH setStage
CASE STAGE_INTERCEPT_TRAIN
IF NOT bSetTrevorExitIntro
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
ELSE
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_AIMING, TRUE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 1500)
ENDIF
ENDIF
BREAK
CASE STAGE_CHASE_TRAIN
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()))
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BIKE], <<0,0,GET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE])>>)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BIKE], 26.0)
TASK_VEHICLE_TEMP_ACTION(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], TEMPACT_GOFORWARD, 100)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
SET_BIKE_ON_STAND(trainCrashVehicle[TCV_BIKE],0, 0)
ENDIF
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
ENDIF
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
SET_BIKE_ON_TRAIN()
SET_BIKE_ON_STAND(trainCrashVehicle[TCV_BIKE],0, 0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
ENDIF
BREAK
CASE STAGE_GET_TO_BRIDGE
BREAK
CASE STAGE_GO_TO_CONTAINER
CASE STAGE_STEAL_FROM_CONTAINER
CASE STAGE_RAPIDS_CHASE
WAIT(0)
START_CRASH_PTFX()
START_DEBRIS_FX()
SET_DEBRIS_EVOLUTION(1)
IF setStage = STAGE_RAPIDS_CHASE
HANDLE_BOAT_RPG(TRUE)
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
WAIT(0)
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
CLEAR_PED_WETNESS(PLAYER_PED_ID())
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180)
ELIF setStage = STAGE_GO_TO_CONTAINER
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_DINGHY], << -402.866, 4441.25, 30.1213 >>)
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_DINGHY],<< 2.81146, -0.00711961, 91.4113 >>)
ENDIF
ELIF setStage = STAGE_STEAL_FROM_CONTAINER
SET_GAMEPLAY_CAM_RELATIVE_HEADING(40.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
WAIT(100)
ENDIF
BREAK
CASE STAGE_GET_HOME
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
//SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BEACH) + <<0,0,1>>)
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_DINGHY],<< 0, 0, DINGHY_AT_BEACH_ROT>>)
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_DINGHY], 26.0)
TASK_VEHICLE_TEMP_ACTION(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], TEMPACT_GOFORWARD, 100)
ENDIF
WAIT(0)
BREAK
ENDSWITCH
ENDIF
// after rest of setup common stuff
SWITCH setStage
CASE STAGE_GET_TO_BRIDGE
CREATE_TRAIN_FIRST_PERSON_CAM()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
BREAK
ENDSWITCH
IF bJumpingToStage
IF bHandleFadeIn
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDIF
ENDIF
iStageStartTime = GET_GAME_TIMER()
currentMissionStage = setStage
ENDPROC
// handle streaming mocap
PROC HANDLE_STREAMING_MOCAP(STRING sMocap, VECTOR vStreamPos, FLOAT fStreamInDistance, FLOAT fStreamOutDistance)
SWITCH mocapStreamingStage
CASE MOCAP_STREAMING_STAGE_REQUEST
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamPos, <<fStreamInDistance, fStreamInDistance, fStreamInDistance>>)
REQUEST_CUTSCENE(sMocap)
mocapStreamingStage = MOCAP_STREAMING_STAGE_WAIT
ENDIF
BREAK
CASE MOCAP_STREAMING_STAGE_WAIT
IF HAS_CUTSCENE_LOADED()
mocapStreamingStage = MOCAP_STREAMING_STAGE_COMPLETE
ENDIF
BREAK
CASE MOCAP_STREAMING_STAGE_COMPLETE
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamPos, <<fStreamOutDistance, fStreamOutDistance, fStreamOutDistance>>)
REMOVE_CUTSCENE()
mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST
ENDIF
BREAK
ENDSWITCH
ENDPROC
// should we start streaming for next mission stage?
FUNC BOOL SHOULD_START_STREAMING_FOR_NEXT_MISSION_STAGE()
SWITCH currentMissionStage
CASE STAGE_INTERCEPT_TRAIN
RETURN TRUE
BREAK
CASE STAGE_CHASE_TRAIN
//IF bRunningCutscene
RETURN TRUE
//ENDIF
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
IF bRunningCutscene
RETURN TRUE
ENDIF
BREAK
CASE STAGE_GET_TO_BRIDGE
IF bCreatedCrashTrain
RETURN TRUE
ENDIF
BREAK
CASE STAGE_GO_TO_CONTAINER
IF bFoundBomb
OR bDoMerryweatherMassacre
RETURN TRUE
ENDIF
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
RETURN TRUE
BREAK
CASE STAGE_RAPIDS_CHASE
IF bDoMopUp
RETURN TRUE
ENDIF
BREAK
CASE STAGE_GET_HOME
RETURN FALSE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// stream in assets for next mission stage during gameplay to cut down on load times
PROC DO_STREAMING_FOR_NEXT_MISSION_STAGE(BOOL bStreamDuringIntro)
SWITCH streamingStage
CASE MISSION_STREAMING_STAGE_REQUEST
IF SHOULD_START_STREAMING_FOR_NEXT_MISSION_STAGE()
OR bStreamDuringIntro
MISSION_STAGE_ENUM nextStageEnum
IF bStreamDuringIntro
nextStageEnum = INT_TO_ENUM(MISSION_STAGE_ENUM, 0)
ELSE
nextStageEnum = INT_TO_ENUM(MISSION_STAGE_ENUM, ENUM_TO_INT(currentMissionStage) + 1)
ENDIF
REQUEST_MODELS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
REQUEST_VEHICLE_RECORDINGS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
REQUEST_WAYPOINT_RECORDINGS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
REQUEST_ANIM_DICTS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
REQUEST_WEAPONS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
REQUEST_PTFX_FOR_STAGE(nextStageEnum, FALSE, TRUE)
REQUEST_SFX_FOR_STAGE(nextStageEnum, FALSE, TRUE)
REQUEST_MISC_ASSETS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
REQUEST_TEXT(FALSE)
streamingStage = MISSION_STREAMING_STAGE_WAIT
ENDIF
BREAK
CASE MISSION_STREAMING_STAGE_WAIT
IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
AND HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()
AND HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
AND HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED()
AND HAVE_ALL_PTFX_REQUESTS_SUCCEEDED()
AND HAVE_ALL_SFX_REQUESTS_SUCCEEDED()
AND HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED()
AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
streamingStage = MISSION_STREAMING_STAGE_COMPLETE
ENDIF
BREAK
ENDSWITCH
ENDPROC
// debug skip mocap
#IF IS_DEBUG_BUILD
PROC DEBUG_SKIP_MOCAP()
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
STOP_CUTSCENE()
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
#ENDIF
// get rid of everything
PROC CLEAR_MISSION_FOR_SKIP()
INT i
SET_PLAYER_OUT_OF_ANY_VEHICLE()
STOP_ALL_TRAIN_CRASH_AUDIO_SCENES()
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
SET_SEETHROUGH(FALSE)
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(FALSE)
CLEAR_TIMECYCLE_MODIFIER()
CASCADE_SHADOWS_INIT_SESSION()
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
IF DOES_PARTICLE_FX_LOOPED_EXIST(wadePTFX)
STOP_PARTICLE_FX_LOOPED(wadePTFX)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX1)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX1)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX2)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX2)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX3)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX3)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisSplashPTFX)
STOP_PARTICLE_FX_LOOPED(debrisSplashPTFX)
ENDIF
//IF bPreStreamingSeamlessCutscene
// REMOVE_CUTSCENE()
//ENDIF
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
REMOVE_COVER_POINT(islandCover)
IF STREAMVOL_IS_VALID(bridgeVolume)
STREAMVOL_DELETE(bridgeVolume)
ENDIF
IF gotoFoamState = GOTO_FOAM_STATE_WAITING
OR swapCarriageState = SWAP_CARRIAGE_STATE_WAITING
IPL_GROUP_SWAP_CANCEL()
ENDIF
WATER_OVERRIDE_SET_STRENGTH(0.0)
STOP_STREAM()
// delete entities
REPEAT 3 i
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i])
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[i])
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[i])
ENDIF
DELETE_PED(sSelectorPeds.pedID[i])
ENDIF
ENDREPEAT
REPEAT NUMBER_ENGINEERS i
IF DOES_ENTITY_EXIST(engineerPed[i])
DELETE_PED(engineerPed[i])
ENDIF
ENDREPEAT
REPEAT COUNT_OF(enemyPed) i
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
DELETE_PED(enemyPed[i].ped)
ENDIF
ENDREPEAT
REPEAT NUMBER_MERC_PICKUP_PEDS i
IF DOES_ENTITY_EXIST(mercPickupPed[i])
DELETE_PED(mercPickupPed[i])
ENDIF
ENDREPEAT
REPEAT NUMBER_CLIMB_ENEMIES i
IF DOES_ENTITY_EXIST(climbEnemy[i].ped)
DELETE_PED(climbEnemy[i].ped)
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(patriciaPed)
DELETE_PED(patriciaPed)
ENDIF
IF DOES_ENTITY_EXIST(ronPed)
DELETE_PED(ronPed)
ENDIF
REPEAT COUNT_OF(enemyVehicle) i
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
DELETE_VEHICLE(enemyVehicle[i].veh)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(trainCrashVehicle) i
IF DOES_ENTITY_EXIST(trainCrashVehicle[i])
DELETE_VEHICLE(trainCrashVehicle[i])
ENDIF
ENDREPEAT
REPEAT NUMBER_MERC_PICKUP_VEHICLES i
IF DOES_ENTITY_EXIST(mercPickupVehicle[i])
DELETE_VEHICLE(mercPickupVehicle[i])
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(hangingCarriageVehicle)
DELETE_VEHICLE(hangingCarriageVehicle)
ENDIF
// delete trains
DELETE_TRAIN_CRASH_TRAINS()
WAIT(0)
REPEAT NUMBER_CRASH_FIRES i
IF bFirePTFXActive[i]
STOP_PARTICLE_FX_LOOPED(firePTFX[i])
bFirePTFXActive[i] = FALSE
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(doorsObject)
DELETE_OBJECT(doorsObject)
ENDIF
IF DOES_ENTITY_EXIST(doorCollisionObject)
DELETE_OBJECT(doorCollisionObject)
ENDIF
IF DOES_ENTITY_EXIST(caseObject)
DELETE_OBJECT(caseObject)
ENDIF
REPEAT NUMBER_CRATES i
IF DOES_ENTITY_EXIST(crateBob[i].obj)
DELETE_OBJECT(crateBob[i].obj)
ENDIF
ENDREPEAT
/*
REPEAT NUMBER_DEBRIS i
IF DOES_ENTITY_EXIST(debris[i].obj)
DELETE_OBJECT(debris[i].obj)
ENDIF
ENDREPEAT
*/
IF DOES_ENTITY_EXIST(trainJumpAnchorObject)
DELETE_OBJECT(trainJumpAnchorObject)
ENDIF
IF DOES_ENTITY_EXIST(targetObject)
DELETE_OBJECT(targetObject)
ENDIF
CLEAR_AREA(GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_INIT), 4000, TRUE)
ENDPROC
// common stuff to clear mission
PROC COMMON_MISSION_CLEAR()
//INT i
//REPEAT NUMBER_RAPPEL_ENEMIES i
// CANCEL_RAPPEL(enemyRappelData[i].rappelData)
//ENDREPEAT
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
IF NOT GET_IS_PED_GADGET_EQUIPPED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = NULL
CLEAR_PED_TASKS(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_RESET)
ENDIF
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
//CLEAR_WEATHER_TYPE_PERSIST()
SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>)
RESET_MISSION_STATS_ENTITY_WATCH()
//SET_PLAYER_WEAPON_DEFENSE_MODIFIER(PLAYER_ID(), 1.0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
CLEAR_MISSION_FOR_SKIP()
ENDPROC
// handle shitskip
FUNC BOOL HANDLE_MISSION_SHITSKIP()
// new shitskip system
IF IS_REPLAY_IN_PROGRESS()
IF g_bShitskipAccepted = TRUE
CPRINTLN(DEBUG_REPLAY, "Exile 3: starting shitskip")
// get next replay stage
MISSION_STAGE_ENUM nextReplayStage
//BOOL bPassMission = FALSE
SWITCH INT_TO_ENUM(MISSION_STAGE_ENUM, Get_Replay_Mid_Mission_Stage())
CASE STAGE_INTERCEPT_TRAIN
nextReplayStage = STAGE_CHASE_TRAIN
BREAK
CASE STAGE_CHASE_TRAIN
nextReplayStage = STAGE_DRIVE_ALONG_TRAIN
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
nextReplayStage = STAGE_GET_TO_BRIDGE
BREAK
CASE STAGE_GET_TO_BRIDGE
nextReplayStage = STAGE_GO_TO_CONTAINER
BREAK
CASE STAGE_GO_TO_CONTAINER
nextReplayStage = STAGE_STEAL_FROM_CONTAINER
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
nextReplayStage = STAGE_RAPIDS_CHASE
BREAK
CASE STAGE_RAPIDS_CHASE
nextReplayStage = STAGE_GET_HOME
BREAK
CASE STAGE_GET_HOME
nextReplayStage = STAGE_GET_HOME
bForcePassOnShitskip = TRUE
BREAK
ENDSWITCH
// set the next mission stage nicely
COMMON_MISSION_CLEAR()
SET_MISSION_STAGE(nextReplayStage, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
//WAIT(SKIP_FADE_WAIT_TIME)
IF NOT bForcePassOnShitskip
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
ELSE
CPRINTLN(DEBUG_REPLAY, "Exile 3: no shitskip")
ENDIF
ENDIF
RETURN FALSE // did not do a shitskip
ENDFUNC
// do mission init start mission
PROC DO_MISSION_INIT_START_MISSION()
// relationships
ADD_RELATIONSHIP_GROUP("Enemy Group", enemyRelGroup)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, enemyRelGroup)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, enemyRelGroup, RELGROUPHASH_PLAYER)
// stats
//INFORM_MISSION_STATS_OF_MISSION_START_EXILE_THREE()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT Is_Replay_In_Progress()
// no replay - kick mission off normally
IF NOT WAS_CUTSCENE_SKIPPED()
#IF IS_DEBUG_BUILD
IF iDebugStage >= 0
SET_MISSION_STAGE(INT_TO_ENUM(MISSION_STAGE_ENUM, iDebugStage), TRUE)
ELSE
#ENDIF
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, FALSE, TRUE, TRUE)
iDelayFirstLineTime = GET_GAME_TIMER() + 1000
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
ELSE
CLEAR_START_AREA()
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
ENDIF
ELSE
IF HANDLE_MISSION_SHITSKIP()
CPRINTLN(DEBUG_REPLAY, "Exile 3: shitskip done")
ELSE
INT iReplayStage
iReplayStage = Get_Replay_Mid_Mission_Stage()
IF iReplayStage = 0
POSITION_PLAYER_AT_MISSION_INIT()
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
ELSE
SET_MISSION_STAGE(INT_TO_ENUM(MISSION_STAGE_ENUM, iReplayStage), TRUE)
ENDIF
ENDIF
ENDIF
IF NOT bForcePassOnShitskip
IF IS_SCREEN_FADED_OUT()
OR IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDIF
ENDIF
missionInitStage = MISSION_INIT_DONE
ENDPROC
PROC SET_TREVOR_AS_MISSION_START_CHAR()
printstring("here2!!!") printnl()
IF NOT bStartingAsTrevor
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
ENDIF
ENDPROC
PROC CLEAR_PRE_TIMELAPSE()
DESTROY_CAM(animCam)
IF DOES_ENTITY_EXIST(trevorDoorObject)
DELETE_OBJECT(trevorDoorObject)
ENDIF
CLEAR_ANIM_DICT_REQUEST(TC_ANIM_DICT_TRAIN)
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAILER_DOOR))
REMOVE_MODEL_HIDE(<<1972.3151, 3815.3379, 33.6879>>, 0.01, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_TRAILER_DOOR), FALSE)
ENDPROC
//INTERIOR_INSTANCE_INDEX trailerInterior
// initialise mission
FUNC BOOL INIT_MISSION()
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_Derailed")
SWITCH missionInitStage
CASE MISSION_INIT_PRE_INTRO
BLOCK_MISSION_TITLE(TRUE)
// TEMP
//REQUEST_IPL("canyonriver01")
//REMOVE_IPL("canyonriver01_traincrash")
bHasChanged = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_AUTO_GIVE_SCUBA_GEAR_WHEN_EXIT_VEHICLE(PLAYER_ID(), FALSE)
ENDIF
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_WATER_VEHICLE_SCUBA_GEAR_UNLOCKED, FALSE)
SET_WIND(0.2)
SET_WIND_DIRECTION(0.0)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REMOVE_MISSION_TEXT()
IF NOT Is_Replay_In_Progress()
iReplayAttempt = 0
ELSE
iReplayAttempt = g_savedGlobals.sFlow.missionSavedData[SP_MISSION_EXILE_3].missionFailsNoProgress + 1
ENDIF
SET_WEATHER_TYPE_OVERTIME_PERSIST("extrasunny", 30.0)
SUPPRESS_MISSION_VEHICLES(TRUE)
ENABLE_CARGENS_FOR_MISSION(FALSE)
SET_MISSION_ROADS_OFF(TRUE)
DISABLE_TAXI_HAILING(TRUE)
rapidsScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<-958.06500, 4353.00000, -10>>, <<-948.19800, 4363.93701, 125.66490>>)
//beachScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<-2769.7, 3571.1, -10>>, <<-2030.4, 4614.9, 28.8>>)
roadScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<2890.78174, 4458.23486, 0.21060>>, <<2912.66162, 4478.89795, 100.69784>>)
road2ScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<2944.97607, 4595.60059, 0.21060>>, <<2955.84082, 4604.47705, 100.69784>>)
g_savedGlobals.sAmbient.iChaseHelpTextDisplayed_mission = iCHASE_HINT_HELP_DISPLAY_MAX
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TREVOR))
WHILE NOT HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
DELETE_ALL_TRAINS()
SET_RANDOM_TRAINS(FALSE)
SET_RANDOM_BOATS(FALSE)
missionInitStage = MISSION_INIT_REQUEST_INTRO
BREAK
CASE MISSION_INIT_REQUEST_INTRO
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF NOT Is_Replay_In_Progress()
#IF IS_DEBUG_BUILD
AND iDebugStage < 0
#ENDIF
// if Michael
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(GET_EXILE3_INTRO_CUTSCENE_NAME(), CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5 | CS_SECTION_6)
ADD_ANIM_DICT_REQUEST(TC_ANIM_DICT_TRAIN)
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAILER_DOOR))
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TREVOR))
BOOL bPinnedInterior
bPinnedInterior = FALSE
trailerInterior = GET_INTERIOR_AT_COORDS(<<1972.08, 3817.64, 34.53>>)
IF IS_VALID_INTERIOR(trailerInterior)
NEW_LOAD_SCENE_START_SPHERE(<<1972.08, 3817.64, 34.53>>, 15.0)
PIN_INTERIOR_IN_MEMORY(trailerInterior)
bPinnedInterior = TRUE
ENDIF
WHILE NOT HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
OR NOT HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
WAIT(0)
ENDWHILE
IF bPinnedInterior
WHILE NOT IS_INTERIOR_READY(trailerInterior)
WAIT(0)
ENDWHILE
ENDIF
BLOCK_MISSION_TITLE(TRUE)
missionInitStage = MISSION_INIT_WAIT_FOR_INTRO
ELSE
BLOCK_MISSION_TITLE(FALSE)
STOP_CUTSCENE()
DO_MISSION_INIT_START_MISSION()
ENDIF
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_EXILE_3)
g_bAllowAmbientFriendLaunching = TRUE
BREAK
CASE MISSION_INIT_WAIT_FOR_INTRO
trevorDoorObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_TRAILER_DOOR), <<1972.3151, 3815.3379, -33.6879>>)
SET_ENTITY_VISIBLE(trevorDoorObject, FALSE)
WAIT(0)
IF IS_SCREEN_FADED_OUT()
SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA)
DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA, TRUE)
DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.8)
WAIT(1000)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, STAGE_INTERCEPT_TRAIN, <<1975.19727, 3820.14502, 32.44555>>, 0)
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
//FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
VECTOR vReposPos
FLOAT fReposRot
GET_CAR_RESPOT_POS_FOR_NEAREST_SAVEHOUSE(<<1963.174, 3812.489, 30.397>>, CHAR_TREVOR, vReposPos, fReposRot)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<1963.174, 3812.489, 30.397>>, <<2002.603, 3835.115, 36.268>>, 18, vReposPos, fReposRot, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE, TRUE)
CLEAR_AREA_OF_PROJECTILES(<<1973.85657, 3818.70776, 32.43631>>, 35)
STOP_FIRE_IN_RANGE(<<1973.85657, 3818.70776, 32.43631>>, 35)
REMOVE_PARTICLE_FX_IN_RANGE(<<1973.85657, 3818.70776, 32.43631>>, 35)
SET_MISSION_CUTSCENE(TRUE)
iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<1977.3151, 3817.3379, 32.5879>>, <<-23.9549, 178.062, 47.6687>>)
DESTROY_MISSION_STATIC_CAM(staticCam)
CREATE_MISSION_ANIM_CAM()
PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "_enter_trailer_cam", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN))
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_UNARMED, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "_enter_trailer", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_NONE, INSTANT_BLEND_IN, AIK_DISABLE_ARM_IK | AIK_DISABLE_LEG_IK | AIK_DISABLE_HEAD_IK | AIK_DISABLE_TORSO_IK | AIK_DISABLE_TORSO_REACT_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
//CREATE_MODEL_HIDE(<<1972.3151, 3815.3379, 33.6879>>, 0.0001, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_TRAILER_DOOR), FALSE)
SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA)
DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA, TRUE)
DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.8)
SET_ENTITY_VISIBLE(trevorDoorObject, TRUE)
//SET_ENTITY_COLLISION(PLAYER_PED_ID(), FALSE)
//SET_INTERIOR_ACTIVE(trailerInterior, TRUE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(trevorDoorObject, iSyncScene, "_enter_trailer_door", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), INSTANT_BLEND_IN)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(trevorDoorObject)
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
missionInitStage = MISSION_INIT_PRE_TIMELAPSE
BREAK
CASE MISSION_INIT_PRE_TIMELAPSE
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA)
DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA, TRUE)
DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.8)
IF NOT bEnteredTrailer
//DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_UNLOCKED, TRUE)
//DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.0)
BOOL bAdvance
bAdvance = FALSE
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
IF NOT bDoneEnterTrailerSpeech
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.20
bDoneEnterTrailerSpeech = DO_MISSION_SPEECH("EXL3_LI")
ENDIF
ENDIF
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99
bAdvance = TRUE
ENDIF
ELSE
bAdvance = TRUE
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED()
AND GET_GAME_TIMER() >= iAllowSkipCutsceneTime + 1000
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 1)
ENDIF
bAdvance = TRUE
ENDIF
IF bAdvance
bEnteredTrailer = TRUE
ENDIF
ELSE
IF DO_TIMELAPSE(SP_MISSION_EXILE_3, sTimelapse, TRUE)
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
// register entities and start cutscene
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL))
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
bStartingAsTrevor = TRUE
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
START_CUTSCENE(CUTSCENE_PLAYER_FP_FLASH_TREVOR)
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
missionInitStage = MISSION_INIT_PLAY_INTRO
ENDIF
ELSE
IF NOT bWasTimeLapseRunning
IF DOES_CAM_EXIST(sTimelapse.splineCamera)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
//SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_OPEN_THIS_FRAME)
bWasTimeLapseRunning = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_INIT_PLAY_INTRO
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF NOT bClearedForCutscene
IF IS_CUTSCENE_PLAYING()
CLEAR_PRE_TIMELAPSE()
RENDER_SCRIPT_CAMS(FALSE,FALSE)
BLOCK_MISSION_TITLE(FALSE)
IF bWasTimeLapseRunning
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
ENDIF
SET_MISSION_MOCAP_CUTSCENE()
//RESOLVE_VEHICLES_AT_MISSION_TRIGGER(GET_TRAIN_CRASH_VECTOR(TCVEC_MOVE_LAST_PLAYER_VEHICLE), MOVE_LAST_PLAYER_VEHICLE_ROT, GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL, VEHICLE_TYPE_DEFAULT, TRUE, FALSE, FALSE, FALSE)
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_MICHAEL)
SET_TREVOR_AS_MISSION_START_CHAR()
CLEAR_AREA_OF_PROJECTILES(<<1973.85657, 3818.70776, 32.43631>>, 35)
STOP_FIRE_IN_RANGE(<<1973.85657, 3818.70776, 32.43631>>, 35)
REMOVE_PARTICLE_FX_IN_RANGE(<<1973.85657, 3818.70776, 32.43631>>, 35)
STOP_ENTITY_FIRE(PLAYER_PED_ID())
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0,0,0>>, TRUE)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vReposPos, fReposRot)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
bClearedForCutscene = TRUE
ENDIF
ENDIF
// register trevor during mocap
IF NOT bStartingAsTrevor
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
ENDIF
ENDIF
ENDIF
// register michael during mocap
IF bStartingAsTrevor
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michael"))
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michael"))
ENDIF
ENDIF
ENDIF
// preload assets
IF GET_CUTSCENE_TIME() >= 112332//177000
DO_STREAMING_FOR_NEXT_MISSION_STAGE(TRUE)
ENDIF
IF GET_CUTSCENE_TIME() >= 119867
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
ENDIF
// clear all vehicles
IF NOT bClearedVehiclesDuringIntro
IF GET_CUTSCENE_TIME() >= 96264//20629
CLEAR_AREA_OF_VEHICLES(GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT), 1000, TRUE) // temp?
bClearedVehiclesDuringIntro = TRUE
ENDIF
ENDIF
// pre-create mission entities not involved in cut
IF NOT bDoneIntroCreateEntities
IF streamingStage = MISSION_STREAMING_STAGE_COMPLETE
IF NOT bDoneIntroClearStart
CLEAR_START_AREA()
bDoneIntroClearStart = TRUE
ELSE
CREATE_PLAYER_CHARACTERS_WITH_TRANSPORT_IN_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE)
bDoneIntroCreateEntities = TRUE
ENDIF
ENDIF
ENDIF
// set exit state
PED_INDEX trevorPed
trevorPed = GET_TREVOR_PED()
IF WAS_CUTSCENE_SKIPPED()
bSkippedCutscene = TRUE
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
//IF NOT bSkippedCutscene
// SET_TREVOR_AS_MISSION_START_CHAR()
//ENDIF
IF NOT IS_PED_INJURED(trevorPed)
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
FORCE_PED_MOTION_STATE(trevorPed, MS_ON_FOOT_WALK,FALSE,FAUS_CUTSCENE_EXIT)
SET_PED_MIN_MOVE_BLEND_RATIO(trevorPed, PEDMOVE_WALK)
ELSE
FORCE_PED_MOTION_STATE(trevorPed, MS_AIMING,FALSE,FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2500)
ENDIF
ENDIF
bSetTrevorExitIntro = TRUE
ELSE
IF NOT IS_PED_INJURED(trevorPed)
IF bSetTrevorExitIntro
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
SET_PED_MIN_MOVE_BLEND_RATIO(trevorPed, PEDMOVE_WALK)
ENDIF
ELSE
IF bStartingAsTrevor
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
DO_MICHAEL_INTO_CAR()
ENDIF
ENDIF
IF NOT bResetGameCamHeading
IF GET_CUTSCENE_TIME() >= 120500
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
REPLAY_STOP_EVENT()
bResetGameCamHeading = TRUE
ENDIF
ENDIF
IF NOT IS_CUTSCENE_PLAYING()
IF bSkippedCutscene
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
//SET_TREVOR_AS_MISSION_START_CHAR()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
WAIT(0)
ENDIF
BOOL bCutsceneWasSkipped
bCutsceneWasSkipped = bSkippedCutscene
SET_MISSION_CUTSCENE(FALSE, TRUE, FALSE, FALSE, TRUE)
DO_MISSION_INIT_START_MISSION()
NEW_LOAD_SCENE_STOP()
IF IS_VALID_INTERIOR(trailerInterior)
IF IS_INTERIOR_READY(trailerInterior)
UNPIN_INTERIOR(trailerInterior)
ENDIF
ENDIF
IF bCutsceneWasSkipped
DO_MICHAEL_INTO_CAR()
ENDIF
ENDIF
//IF CAN_SET_EXIT_STATE_FOR_CAMERA()
//
//ENDIF
#IF IS_DEBUG_BUILD
DEBUG_SKIP_MOCAP()
#ENDIF
BREAK
CASE MISSION_INIT_DONE
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// all player peds block non-temporary events and reset relationships
PROC REAPPLY_PLAYER_PED_ATTRIBUTES()
INT i
REPEAT COUNT_OF(sSelectorPeds.pedID) i
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[i])
APPLY_PLAYER_ATTRIBUTES(sSelectorPeds.pedID[i])
ENDIF
ENDREPEAT
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_DIES_IN_WATER(PLAYER_PED_ID(), TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PLAYER_PED_ID(), FALSE)
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
ENDPROC
// common start functions for creating a custom hotswap
PROC DO_COMMON_CUSTOM_HOTSWAP_START(CAMERA_TYPE camType)
INT i
REPEAT COUNT_OF(sCamDetails.camInterpIDs) i
IF DOES_CAM_EXIST(sCamDetails.camInterpIDs[i])
DESTROY_CAM(sCamDetails.camInterpIDs[i])
ENDIF
ENDREPEAT
IF DOES_CAM_EXIST(sCamDetails.camID)
DESTROY_CAM(sCamDetails.camID)
ENDIF
sCamDetails.camID = CREATE_CAMERA(camType, FALSE)
ENDPROC
// common end functions for creating a custom hotswap
PROC DO_COMMON_CUSTOM_HOTSWAP_END()
SET_CAM_SPLINE_PHASE(sCamDetails.camID, 0.0)
sCamDetails.bSplineCreated = TRUE
sCamDetails.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
sCamDetails.bRun = TRUE
ENDPROC
// constantly run the hotswap selector/spline cam, and return true when selected the target ped
FUNC BOOL DO_MISSION_HOTSWAP(SELECTOR_SLOTS_ENUM targetCharacter, BOOL bInstantSwap = FALSE, HOTSWAP_CAM_ENUM hotswapCam = HOTSWAP_CAM_DEFAULT, BOOL bKeepTasks = FALSE, TAKE_CONTROL_OF_PED_FLAGS tcfChecks = TCF_NONE)
CONST_FLOAT TO_BOAT_OFFSET_X 0.0
CONST_FLOAT TO_BOAT_OFFSET_Y -45.0
CONST_FLOAT TO_BOAT_OFFSET_Z 80.0
CONST_FLOAT TO_BOAT_ANGLE_DOWN -15.0
CONST_FLOAT BACK_TO_TRAIN_OFFSET_X 5.0
CONST_FLOAT BACK_TO_TRAIN_OFFSET_Y -95.0
CONST_FLOAT BACK_TO_TRAIN_OFFSET_Z 28.0
CONST_FLOAT BACK_TO_TRAIN_ANGLE_DOWN -15.0
SWITCH hotswapStage
CASE MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
REMOVE_MISSION_TEXT(FALSE)
sSelectorPeds.bInitialised = TRUE
sSelectorPeds.eNewSelectorPed = targetCharacter
sCamDetails.pedTo = sSelectorPeds.pedID[targetCharacter]
sCamDetails.bPedSwitched = FALSE
//sCamDetails.bSplineActive = FALSE
hotswapStage = MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
BREAK
CASE MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
IF NOT bInstantSwap
BOOL bDoingSwap
SWITCH hotswapCam
CASE HOTSWAP_CAM_DEFAULT
/*
FLOAT fHeading
FLOAT fPitch
fHeading = 0
fPitch = 0
IF hotswapCam = HOTSWAP_CAM_FORCE_ON_EXPLOSION
fHeading = 1000
fPitch = 1000
ENDIF
bDoingSwap = RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sCamDetails, fPitch, fHeading, camInterpType, 0)
*/
BOOL bOverrideSwitch
bOverrideSwitch = FALSE
IF currentMissionStage = STAGE_RAPIDS_CHASE
PED_INDEX michaelPed
michaelPed = GET_MICHAEL_PED()
IF NOT IS_PED_INJURED(michaelPed)
AND IS_VEHICLE_DRIVEABLE(trainCrashvehicle[TCV_DINGHY])
IF IS_PED_IN_VEHICLE(michaelPed, trainCrashvehicle[TCV_DINGHY])
bOverrideSwitch = TRUE
ENDIF
ENDIF
ENDIF
bDoingSwap = RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, SWITCH_TYPE_SHORT, 0,
999.0,999.0,
FALSE, FALSE,
"", bOverrideSwitch, SHORT_SWITCH_STYLE_ROTATION)
BREAK
CASE HOTSWAP_CAM_TRAIN_TO_BOAT
////SET_CAM_COORD(sCamDetails.camInterpIDs[4], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], <<TO_BOAT_OFFSET_X, TO_BOAT_OFFSET_Y, TO_BOAT_OFFSET_Z>>))
//SET_CAM_ROT(sCamDetails.camInterpIDs[4], <<TO_BOAT_ANGLE_DOWN, 0, GET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY])>>)
//bDoingSwap = RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sCamDetails, 0.0, 0.0, camInterpType)
//bDoingSwap = RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails)//RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sCamDetails)
//bDoingSwap = RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, SWITCH_TYPE_AUTO, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO | SWITCH_FLAG_START_FROM_CAMPOS))
IF HANDLE_SWITCH_CAM_TRAIN_TO_BOAT(scsSwitchCamTrainToBoat_Intro, scsSwitchCamTrainToBoat_Outro)
bDoingSwap = FALSE
ELSE
bDoingSwap = TRUE
ENDIF
BREAK
ENDSWITCH
IF bDoingSwap
IF sCamDetails.bOKToSwitchPed
IF NOT sCamDetails.bPedSwitched
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, bKeepTasks, tcfChecks)
REAPPLY_PLAYER_PED_ATTRIBUTES()
sCamDetails.bPedSwitched = TRUE
ENDIF
ENDIF
// IF hotswapCam = HOTSWAP_CAM_TRAIN_TO_BOAT
// IF DOES_CAM_EXIST(staticCam)
// DESTROY_CAM(staticCam)
// ENDIF
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// ENDIF
// ELSE
// IF hotswapCam = HOTSWAP_CAM_TRAIN_TO_BOAT
// RENDER_SCRIPT_CAMS(TRUE, FALSE)
// ENDIF
ENDIF
ELSE
IF GET_CURRENT_PLAYER_PED_ENUM() = GET_PLAYER_PED_ENUM_FROM_SELECTOR_SLOT(targetCharacter)
INT i
REPEAT COUNT_OF(sCamDetails.camInterpIDs) i
IF DOES_CAM_EXIST(sCamDetails.camInterpIDs[i])
DESTROY_CAM(sCamDetails.camInterpIDs[i])
ENDIF
ENDREPEAT
IF DOES_CAM_EXIST(sCamDetails.camID)
DESTROY_CAM(sCamDetails.camID)
ENDIF
IF NOT bPreventMissionFail_SwitchCamDebug
hotswapStage = MISSION_HOTSWAP_STAGE_DONE
ENDIF
#IF IS_DEBUG_BUILD
bDebugJSkip = FALSE
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, bKeepTasks, tcfChecks)
sCamDetails.bPedSwitched = TRUE
REAPPLY_PLAYER_PED_ATTRIBUTES()
hotswapStage = MISSION_HOTSWAP_STAGE_DONE
#IF IS_DEBUG_BUILD
bDebugJSkip = FALSE
#ENDIF
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// handle swap between michael and trevor
PROC HANDLE_MICHAEL_TREVOR_BOAT_SWAP_IN_RAPIDS()
IF boatHotswapState <> BOAT_HOTSWAP_ON_MICHAEL
// can't get out as trevor
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_LOCKED_PLAYER_INSIDE)
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
ENDIF
ENDIF
//
//IF NOT bSelectorLocked
// IF currentMissionStage = STAGE_GET_HOME
// IF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
// ENDIF
// ENDIF
//ENDIF
IF GET_GAME_TIMER() < iLastSwitchTime + 500
HIDE_SELECTOR_THIS_FRAME()
ENDIF
SWITCH boatHotswapState
// on trevor
CASE BOAT_HOTSWAP_ON_TREVOR
// HANDLE_MICHAEL_SHOOTING()
// IF bDoneWaterfallCutaway
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
IF NOT bSelectorLocked
// switch menu
IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE)
OR bForceMichaelSwitch
#IF IS_DEBUG_BUILD
OR bDebugJSkip
#ENDIF
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
OR bForceMichaelSwitch
IF currentMissionStage = STAGE_RAPIDS_CHASE
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR)
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL)
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(EXL3_SWITCHES)
sCamDetails.bPedSwitched = FALSE
IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES()
IF NOT IS_PED_INJURED(GET_MICHAEL_PED())
IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON AND IS_PED_IN_ANY_VEHICLE(GET_MICHAEL_PED()))
OR (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON AND NOT IS_PED_IN_ANY_VEHICLE(GET_MICHAEL_PED()))
bRapidsSwitchFirstPerson = TRUE
ELSE
bRapidsSwitchFirstPerson = FALSE
ENDIF
ENDIF
ELSE
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
bRapidsSwitchFirstPerson = TRUE
ELSE
bRapidsSwitchFirstPerson = FALSE
ENDIF
ENDIF
eSwitchCamState = SWITCH_CAM_SETUP_TREVOR_TO_MICHAEL_SPLINE
iLastSwitchTime = GET_GAME_TIMER()
boatHotswapState = BOAT_HOTSWAP_TO_MICHAEL
ENDIF
ENDIF
ENDIF
//ENDIF
BREAK
// on michael
CASE BOAT_HOTSWAP_ON_MICHAEL
// trevor shooting
HANDLE_TREVOR_SHOOTING()
IF currentMissionStage = STAGE_RAPIDS_CHASE
IF NOT bSelectorLocked
// switch menu
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
#IF IS_DEBUG_BUILD
OR bDebugJSkip
#ENDIF
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR
IF currentMissionStage = STAGE_RAPIDS_CHASE
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL)
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR)
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(EXL3_SWITCHES)
eSwitchCamState = SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_SPLINE
sCamDetails.bPedSwitched = FALSE
IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES()
IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
OR (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
bRapidsSwitchFirstPerson = TRUE
ELSE
bRapidsSwitchFirstPerson = FALSE
ENDIF
ELSE
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
bRapidsSwitchFirstPerson = TRUE
ELSE
bRapidsSwitchFirstPerson = FALSE
ENDIF
ENDIF
boatHotswapState = BOAT_HOTSWAP_TO_TREVOR
iLastSwitchTime = GET_GAME_TIMER()
bAreShowingMichaelReverseSwitchCam = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE BOAT_HOTSWAP_TO_TREVOR
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
// trevor shooting
HANDLE_TREVOR_SHOOTING()
TAKE_CONTROL_OF_PED_FLAGS tcfFlags
tcfFlags = TCF_NONE
IF boatRPGState = BOAT_RPG_USING
OR boatRPGState = BOAT_RPG_GET_IN_POSITION
OR boatRPGState = BOAT_RPG_RETURN_TO_SEAT
tcfFlags = TCF_CLEAR_TASK_INTERRUPT_CHECKS
ENDIF
IF DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, bRapidsSwitchFirstPerson, HOTSWAP_CAM_DEFAULT, TRUE, tcfFlags)
IF bRapidsSwitchFirstPerson
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, false)
PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDMichaelOut")
ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDTrevorOut")
ENDIF
//ANIMPOSTFX_PLAY("SwitchShortTrevorMid", 0, false)
// get michael to continue following waypoints
IF NOT bFinishedFollowRapids
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
INT iClosestWaypoint
iClosestWaypoint = GET_CLOSEST_BOAT_WAYPOINT(trainCrashVehicle[TCV_DINGHY], "exile31")
IF iClosestWaypoint >= 0
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(iClosestWaypoint)
ENDIF
ENDIF
ENDIF
ENDIF
IF boatRPGState = BOAT_RPG_USING
OR boatRPGState = BOAT_RPG_GET_IN_POSITION
OR boatRPGState = BOAT_RPG_RETURN_TO_SEAT
SET_BOAT_RPG_STATE(boatRPGState, TRUE, FALSE)
ENDIF
IF boatRPGState = BOAT_RPG_USING
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(TRUE)
SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE)
ELSE
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
ENDIF
//michaelDrivebyState = MICHAEL_DRIVEBY_WAITING
//iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 6000)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE)
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
sCamDetails.bRun = FALSE
sCamDetails.bOKToSwitchPed = FALSE
sCamDetails.bPedSwitched = FALSE
ENDIF
BREAK
CASE BOAT_HOTSWAP_TO_MICHAEL
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
// trevor shooting
HANDLE_TREVOR_SHOOTING()
IF DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, bRapidsSwitchFirstPerson, HOTSWAP_CAM_DEFAULT, TRUE)
IF bRapidsSwitchFirstPerson
ANIMPOSTFX_PLAY("SwitchSceneMichael", 0, false)
PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDMichaelOut")
ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDTrevorOut")
ENDIF
//ANIMPOSTFX_PLAY("SwitchShortMichaelMid", 0, false)
// reset trevor shooting
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 500
trevorTargetPed = NULL
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(PLAYER_PED_ID())
CLEAR_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(PLAYER_PED_ID())
ENDIF
ENDIF
IF boatRPGState = BOAT_RPG_USING
OR boatRPGState = BOAT_RPG_GET_IN_POSITION
OR boatRPGState = BOAT_RPG_RETURN_TO_SEAT
SET_BOAT_RPG_STATE(boatRPGState, TRUE, FALSE)
ENDIF
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(FALSE)
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
bForceResetTrevorTask = TRUE
sCamDetails.bOKToSwitchPed = FALSE
sCamDetails.bPedSwitched = FALSE
sCamDetails.bRun = FALSE
ENDIF
BREAK
ENDSWITCH
ENDPROC
// handle swap between michael and trevor at crash
/*
PROC HANDLE_MICHAEL_TREVOR_BOAT_SWAP_AT_CRASH()
SWITCH crashHotswapState
// on trevor
CASE CRASH_HOTSWAP_ON_TREVOR
// switch menu
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
#IF IS_DEBUG_BUILD
OR bDebugJSkip
#ENDIF
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
crashHotswapState = CRASH_HOTSWAP_TO_MICHAEL
ENDIF
ENDIF
BREAK
// on michael
CASE CRASH_HOTSWAP_ON_MICHAEL
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
ENDIF
// switch menu
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
#IF IS_DEBUG_BUILD
OR bDebugJSkip
#ENDIF
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR
crashHotswapState = CRASH_HOTSWAP_TO_TREVOR
ENDIF
ENDIF
BREAK
// to trevor
CASE CRASH_HOTSWAP_TO_TREVOR
IF DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, FALSE, HOTSWAP_CAM_STRAIGHT)
iSavedMichaelGetInTextStage = iGetInTextStage
iGetInTextStage = iSavedTrevorGetInTextStage
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
crashHotswapState = CRASH_HOTSWAP_ON_TREVOR
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER)
ENDIF
ENDIF
ELSE
REMOVE_ALL_BLIPS()
ENDIF
BREAK
// to michael
CASE CRASH_HOTSWAP_TO_MICHAEL
IF DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, FALSE, HOTSWAP_CAM_STRAIGHT)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], trainCrashVehicle[TCV_DINGHY])
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], trainCrashVehicle[TCV_DINGHY], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
ENDIF
ENDIF
ENDIF
iSavedTrevorGetInTextStage = iGetInTextStage
iGetInTextStage = iSavedMichaelGetInTextStage
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
crashHotswapState = CRASH_HOTSWAP_ON_MICHAEL
ELSE
REMOVE_ALL_BLIPS()
ENDIF
BREAK
ENDSWITCH
ENDPROC
*/
/*
// fail if train got too far without being sabotaged
PROC CHECK_FAIL_FOR_TRAIN_STOP()
IF IS_VEHICLE_DRIVEABLE(missionTrain)
IF NOT bRunningCutscene
VECTOR vTrainPos = GET_ENTITY_COORDS(missionTrain)
IF vTrainPos.x < FAIL_STOP_X
REQUEST_SCRIPT("delayTrainCleanup")
WHILE NOT HAS_SCRIPT_LOADED("delayTrainCleanup")
WAIT(0)
ENDWHILE
START_NEW_SCRIPT_WITH_ARGS("delayTrainCleanup", missionTrain, SIZE_OF(VEHICLE_INDEX), MINI_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED("delayTrainCleanup")
bLaunchedDelayTrainCleanupScript = TRUE
DETACH_PLAYER_FROM_TRAIN()
MISSION_FAILED(FAIL_TRAIN_STOPPED)
ENDIF
ENDIF
ENDIF
ENDPROC
*/
// fail if too far away from train
PROC CHECK_FAIL_FOR_LOSE_TRAIN()
#IF IS_DEBUG_BUILD
IF bDebugDontDoDistanceFail
EXIT // if train is jumping around cause of skipping, let's not fail because IT'S QUITE ANNOYING
ENDIF
#ENDIF
IF IS_VEHICLE_DRIVEABLE(missionTrain)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(missionTrain), GET_ENTITY_COORDS(PLAYER_PED_ID())) >= 3000
MISSION_FAILED(FAIL_LOST_TRAIN)
ENDIF
ENDIF
ENDPROC
// store banter
FUNC BOOL STORE_BANTER()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 tBanter = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF ARE_STRINGS_EQUAL(tBanter, "EXL3_RAD1")
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_RAD2")
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_ESCAPE1")
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_DOCK1")
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_BANTER")
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_ESCAP1b")
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_DOCK1b")
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_BANTER2")
bSavedBanter = TRUE
tSavedBanterRoot = tBanter
tResumeBanterLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// restore banter
FUNC BOOL RESTORE_BANTER()
IF bSavedBanter
IF CAN_ADVANCE_MISSION()
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(trainCrashConversation, "EXL3AUD", tSavedBanterRoot, tResumeBanterLabel, CONV_PRIORITY_HIGH)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// handle text for on bike
FUNC BOOL HANDLE_GET_TO_LOCATION(BOOL bWithVehicle, BOOL bWithBuddy)
TRAIN_CRASH_VEHICLE_ENUM vehicleEnum
SELECTOR_SLOTS_ENUM buddyEnum
BOOL bPlayerVehicleOK = TRUE
BOOL bBuddyVehicleOK = TRUE
BOOL bBuddyGroupOK = TRUE
BOOL bAllOK = FALSE
SWITCH currentMissionStage
CASE STAGE_INTERCEPT_TRAIN
CASE STAGE_CHASE_TRAIN
CASE STAGE_DRIVE_ALONG_TRAIN
vehicleEnum = TCV_BIKE
BREAK
CASE STAGE_GET_TO_BRIDGE
CASE STAGE_GO_TO_CONTAINER
CASE STAGE_STEAL_FROM_CONTAINER
CASE STAGE_RAPIDS_CHASE
CASE STAGE_GET_HOME
vehicleEnum = TCV_DINGHY
BREAK
ENDSWITCH
IF bWithBuddy
IF NOT IS_PED_GROUP_MEMBER(sSelectorPeds.pedID[buddyEnum], PLAYER_GROUP_ID())
bBuddyGroupOK = FALSE
ENDIF
ENDIF
IF bWithVehicle
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[vehicleEnum])
IF bWithBuddy
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[buddyEnum])
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[buddyEnum], trainCrashVehicle[vehicleEnum])
bBuddyVehicleOK = FALSE
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[vehicleEnum])
IF NOT bForceIntoDinghy
bPlayerVehicleOK = FALSE
ELSE
IF bSuccessfullyForcedIntoDinghy
bPlayerVehicleOK = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bBuddyGroupOK
// buddy is group member / not required to be in group
IF bPlayerVehicleOK
// player is in vehicle
bAllOK = TRUE
IF bBuddyVehicleOK
IF iGetInTextStage < 2
iGetInTextStage = 2
ENDIF
// buddy is in the vehicle / not required to be in vehicle
RETURN TRUE
ELSE
// buddy is not in the vehicle - blip him
IF NOT DOES_BLIP_EXIST(buddyBlip)
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
REMOVE_ALL_BLIPS()
buddyBlip = CREATE_MISSION_BLIP_FOR_PED(sselectorPeds.pedID[buddyEnum])
ENDIF
IF NOT bWaitForBuddyPrompt
bWaitForBuddyPrompt = DO_MISSION_GOD_TEXT("TC_WAITT")
ENDIF
ENDIF
ELSE
// player is not in the vehicle - blip it
IF NOT DOES_BLIP_EXIST(vehicleBlip)
IF currentMissionStage = STAGE_CHASE_TRAIN
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
REMOVE_ALL_BLIPS()
IF iGetInTextStage = 0
OR iGetInTextStage = 2
bShouldDoGetInText = TRUE
ENDIF
vehicleBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(trainCrashVehicle[vehicleEnum])
ENDIF
IF bShouldDoGetInText
STRING sGetInString
SWITCH iGetInTextStage
CASE 0
SWITCH vehicleEnum
CASE TCV_BIKE
sGetInString = "CMN_GENGETINBK"
BREAK
CASE TCV_DINGHY
sGetInString = "TC_DINGHY2"
BREAK
CASE TCV_BEACH_CAR
sGetInString = "TC_CAR"
BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH vehicleEnum
CASE TCV_BIKE
sGetInString = "CMN_GENGETBCKBK"
BREAK
CASE TCV_DINGHY
sGetInString = "TC_DINGHY"
BREAK
CASE TCV_BEACH_CAR
sGetInString = "TC_CAR1"
BREAK
ENDSWITCH
BREAK
ENDSWITCH
IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER AND (IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR NOT bDoneGotoSpeech)
ELSE
IF (currentMissionStage <> STAGE_GET_HOME AND currentMissionStage <> STAGE_STEAL_FROM_CONTAINER AND currentMissionStage <> STAGE_INTERCEPT_TRAIN)
OR bDoneGotoSpeech
IF DO_MISSION_GOD_TEXT(sGetInString)
bShouldDoGetInText = FALSE
iGetInTextStage++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// buddy is not group member
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sselectorPeds.pedID[buddyEnum], <<12, 12, 6>>)
// re-add to group
SET_PED_AS_GROUP_MEMBER(sselectorPeds.pedID[buddyEnum], PLAYER_GROUP_ID())
ELSE
// do blip and god text
IF NOT DOES_BLIP_EXIST(buddyBlip)
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
REMOVE_ALL_BLIPS()
buddyBlip = CREATE_MISSION_BLIP_FOR_PED(sselectorPeds.pedID[buddyEnum])
ENDIF
IF NOT bGetBuddyPrompt
bGetBuddyPrompt = DO_MISSION_GOD_TEXT("CMN_TLEAVE")
ENDIF
ENDIF
ENDIF
IF bAllOK
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
bAllOK = FALSE
ENDIF
ENDIF
IF NOT bAllOK
IF NOT bSavedBanter
IF STORE_BANTER()
KILL_ANY_CONVERSATION()
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// check is at heading
FUNC BOOL IS_PED_AT_CORRECT_HEADING(PED_INDEX ped, FLOAT fAngle, FLOAT allowAngleFrom0 = 25.0)
FLOAT fPedHeading = NORMALISE_HEADING(GET_ENTITY_HEADING(ped))
FLOAT fAnimHeading = NORMALISE_HEADING(fAngle)
FLOAT fHeadingDiff = fPedHeading - fAnimHeading
IF fHeadingDiff < 0
fHeadingDiff *= -1
ENDIF
IF fHeadingDiff <= allowAngleFrom0
OR fHeadingDiff >= 360 - allowAngleFrom0
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// get coords for jump
FUNC VECTOR GET_JUMP_COORDS(INT iJump)
SWITCH iJump
CASE 0
RETURN <<2679.41, 5326.92, 65.76>>
BREAK
CASE 1
RETURN <<2622.84, 5481.42, 65.60>>
BREAK
CASE 2
RETURN <<2470.84, 5788.90, 69.05>>
BREAK
CASE 3
RETURN <<2383.02, 5913.01, 71.68>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
// does bike heading match jump heading
CONST_FLOAT ALLOW_JUMP_ANGLE 40.0
FUNC BOOL DOES_BIKE_MATCH_JUMP_HEADING(INT iJump)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
FLOAT fJumpHeading
FLOAT fBikeHeading = NORMALISE_HEADING(GET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE]))
SWITCH iJump
CASE 0
fJumpHeading = 35.98
BREAK
CASE 1
fJumpHeading = 37.33
BREAK
CASE 2
fJumpHeading = 48.02
BREAK
CASE 3
fJumpHeading = 53.29
BREAK
ENDSWITCH
FLOAT fHeadingDiff = fBikeHeading - fJumpHeading
IF fHeadingDiff < 0
fHeadingDiff *= -1
ENDIF
IF fHeadingDiff <= ALLOW_JUMP_ANGLE
OR fHeadingDiff >= 360 - ALLOW_JUMP_ANGLE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// get track pos for jump
FUNC FLOAT GET_JUMP_TRACK_Y(INT iJump)
SWITCH iJump
CASE 0
RETURN 5338.80
BREAK
CASE 1
RETURN 5495.14
BREAK
CASE 2
//RETURN 5562.25
RETURN 5795.43
BREAK
CASE 3
//RETURN 5762.08
//RETURN 5908.77
RETURN 10000.0
BREAK
CASE 4
//RETURN 5870.79
BREAK
ENDSWITCH
RETURN 0.0
ENDFUNC
// get Y limit for jump
FUNC FLOAT GET_JUMP_Y_LIMIT(INT iJump)
SWITCH iJump
CASE 0
RETURN 5332.51
BREAK
CASE 1
RETURN 5487.61
BREAK
CASE 2
//RETURN 5564.55
RETURN 5795.04
BREAK
CASE 3
//RETURN 5795.04
//RETURN 5928.65
RETURN 10000.0
BREAK
CASE 4
RETURN 5944.21
BREAK
ENDSWITCH
RETURN 0.0
ENDFUNC
// is any carriage at jump
FUNC BOOL IS_CARRIAGE_AT_JUMP(INT iJump)
VEHICLE_INDEX carriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
IF IS_VEHICLE_DRIVEABLE(carriageVehicle)
VECTOR vCarriagePos = GET_ENTITY_COORDS(carriageVehicle)
FLOAT fTrackY = GET_JUMP_TRACK_Y(iJump)
//PRINTSTRING("carriage pos ") printvector(vCarriagePos) PRINTNL()
//PRINTSTRING("track y ") PRINTFLOAT(fTrackY) PRINTNL()
IF vCarriagePos.y < fTrackY
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// is player at jump
FUNC BOOL IS_PLAYER_AT_JUMP(INT iJump)
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_JUMP_COORDS(iJump), <<200.0, 200.0, 30.0>>)
IF vPlayerPos.y < GET_JUMP_Y_LIMIT(iJump)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// remove michael
PROC HANDLE_MICHAEL_CAR_DRIVE(BOOL bCanRemove)
IF NOT bRemovedMichael
BOOL bDoRemove = FALSE
REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(TOWN_PATHS_MIN_X, TOWN_PATHS_MIN_Y, TOWN_PATHS_MAX_X, TOWN_PATHS_MAX_Y)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<300,300,20>>, FALSE, FALSE)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
bDoRemove = TRUE
ELSE
HANDLE_FLIP_OFF_PED(flipOffData)
SWITCH iMichaelDriveCarStage
CASE 0
IF IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_MICHAEL_CAR], <<1992.65, 3839.31, 31.33>>, <<6.75,6.75,6.75>>)
TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_MICHAEL_CAR], <<1988.93, 3853.87, 31.37>>, 8.0, DRIVINGSTYLE_NORMAL, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL_CAR), DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, 5, -1)
iMichaelDriveCarStage++
ENDIF
BREAK
CASE 1
IF IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_MICHAEL_CAR], <<1988.93, 3853.87, 31.37>>, <<9,9,9>>)
TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_MICHAEL_CAR], <<676.07733, 3582.21680, 31.89429>>, 20.0, DRIVINGSTYLE_NORMAL, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL_CAR), DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, 5, -1)
iMichaelDriveCarStage++
ENDIF
BREAK
ENDSWITCH
IF NOT IS_PED_IN_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT bDoneMichaelGoOnFoot
IF bMichaelWasInVehicle
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
TASK_FOLLOW_NAV_MESH_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<676.07733, 3582.21680, 31.89429>>, PEDMOVE_RUN, -1, DEFAULT_NAVMESH_RADIUS, ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
bDoneMichaelGoOnFoot = TRUE
ENDIF
ENDIF
ELSE
bMichaelWasInVehicle = TRUE
ENDIF
IF NOT bDoneMichaelNoFollowPrompt
IF GET_GAME_TIMER() >= iInterceptTrainTime + 34000
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<40,40,40>>)
bDoneMichaelNoFollowPrompt = DO_MISSION_SPEECH("EXL3_MWHAT")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
bDoRemove = TRUE
ENDIF
ENDIF
IF bCanRemove
IF bDoRemove
SET_PED_AS_NO_LONGER_NEEDED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
REMOVE_PED_FOR_DIALOGUE(trainCrashConversation, 0)
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, NULL, "MICHAEL")
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_MICHAEL_CAR])
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[TCV_MICHAEL_CAR])
ENDIF
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_MICHAEL_CAR))
bRemovedMichael = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
// is the player on the train with the bike
FUNC BOOL IS_PLAYER_ON_TRAIN_WITH_BIKE()
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
IF iClosestCarriage > 0
AND iClosestCarriage <= EXILE3_LAST_CARRIAGE
VEHICLE_INDEX carriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage)
IF IS_VEHICLE_DRIVEABLE(carriageVehicle)
//PRINTSTRING("speed = ") PRINTFLOAT(GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE])) PRINTNL()
//IF GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE]) >= 5.0
IF IS_PED_AT_CORRECT_HEADING(PLAYER_PED_ID(), GET_ENTITY_HEADING(carriageVehicle), 40.0)
IF IS_ENTITY_IN_ANGLED_AREA(trainCrashVehicle[TCV_BIKE], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(carriageVehicle, <<0, 8, 2.5>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(carriageVehicle, <<0, -8, 3.9>>), 2.6) // height was prev 4.8
//AND IS_ENTITY_TOUCHING_ENTITY(trainCrashVehicle[TCV_BIKE], carriageVehicle)
RETURN TRUE
ENDIF
ENDIF
//ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// create blip for container
PROC CREATE_CONTAINER_BLIP()
containerBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_BLIP_CONTAINER))
IF DOES_BLIP_EXIST(containerBlip)
SET_BLIP_COLOUR(containerBlip, BLIP_COLOUR_GREEN)
SET_BLIP_SCALE(containerBlip, BLIP_SIZE_OBJECT)
SET_BLIP_NAME_FROM_TEXT_FILE(containerBlip, "TC_CBLIP")
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
PROC DO_DEBUG_TRAIN_CAM_POSITION()
IF DOES_CAM_EXIST(staticCam)
IF IS_VEHICLE_DRIVEABLE(missionTrain)
ATTACH_CAM_TO_ENTITY(staticCam, missionTrain, vDebugTrainCamOffset)
POINT_CAM_AT_ENTITY(staticCam, missionTrain, vDebugTrainCamPoint)
SET_CAM_FOV(staticCam, fDebugTrainCamFOV)
ENDIF
ENDIF
ENDPROC
#ENDIF
// common stuff for cutscene skip
PROC HANDLE_SKIP_CUTSCENE()
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED()
AND GET_GAME_TIMER() >= iAllowSkipCutsceneTime + 1000
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
KILL_ANY_CONVERSATION()
bSkippedCutscene = TRUE
cutsceneStage = TC_CUT_STAGE_CLEANUP
ENDIF
ENDPROC
PROC DO_SEE_TRAIN_SPEECH()
IF NOT bDoneSeeTrainSpeech
VEHICLE_INDEX lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<200, 200, 50>>)
AND IS_ENTITY_ON_SCREEN(lastCarriage)
AND IS_VEHICLE_VISIBLE(lastCarriage)
fSeeTrainSpeechTime = fSeeTrainSpeechTime +@ 1.0
IF fSeeTrainSpeechTime >= 1.2
bDoneSeeTrainSpeech = DO_MISSION_SPEECH("EXL3_SEETRN")
ENDIF
ELSE
fSeeTrainSpeechTime = 0.0
ENDIF
ENDIF
ENDPROC
// intercept train
PROC DO_STAGE_INTERCEPT_TRAIN()
SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_FORCE_LOCKED_THIS_FRAME, TRUE)
DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.0)
// create train
SWITCH createTrainStage
CASE CREATE_TRAIN_STAGE_NOT_STARTED
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAIN_ENGINE))
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAIN_CONTAINER2))
//ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_ENGINEER))
createTrainStage = CREATE_TRAIN_STAGE_WAITING
BREAK
CASE CREATE_TRAIN_STAGE_WAITING
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
CREATE_TRAIN_FOR_STAGE(STAGE_INTERCEPT_TRAIN, FALSE)
createTrainStage = CREATE_TRAIN_STAGE_DONE
ENDIF
BREAK
CASE CREATE_TRAIN_STAGE_DONE
BREAK
ENDSWITCH
HANDLE_CREATE_ENGINEER()
IF NOT bDeletedRonAndPatricia
//SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_OPEN_THIS_FRAME)
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1973.85730, 3814.53687, 32.42491>>, <<250,250,250>>, FALSE, FALSE)
DELETE_RON_AND_PATRICIA()
bDeletedRonAndPatricia = TRUE
ELSE
IF DOES_ENTITY_EXIST(ronPed)
IF IS_PED_INJURED(ronPed)
MISSION_FAILED(FAIL_RON_DEAD)
ELSE
SET_PED_RESET_FLAG(ronPed, PRF_DisablePlayerMeleeFriendlyAttacks, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(patriciaPed)
IF IS_PED_INJURED(patriciaPed)
MISSION_FAILED(FAIL_PATRICIA_DEAD)
ELSE
SET_PED_RESET_FLAG(patriciaPed, PRF_DisablePlayerMeleeFriendlyAttacks, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bDoneMissionStartCue
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
bDoneMissionStartCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_MISSION_START")
IF bDoneMissionStartCue
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
//ENDIF
ENDIF
// music cue
IF NOT bPreparedSeeTrainCue
bPreparedSeeTrainCue = PREPARE_MUSIC_EVENT("EXL3_SEE_TRAIN")
IF bPreparedSeeTrainCue
REPLAY_RECORD_BACK_FOR_TIME(00, 10.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ENDIF
IF GET_GAME_TIMER() <= iStageStartTime + 700
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
ENDIF
ENDIF
// remove michael when far away
HANDLE_MICHAEL_CAR_DRIVE(FALSE)
// check fail for lose train
IF iTrainMovementStartTime >= 0
IF GET_GAME_TIMER() >= iTrainMovementStartTime + 15000
DO_LOSE_TRAIN_CHECK()
ENDIF
ELSE
IF GET_GAME_TIMER() >= iInterceptTrainTime + 70000
DO_RANDOM_SPEECH("EXL3_HURRYT", -1, 16000, 24000)
ENDIF
IF GET_GAME_TIMER() >= iInterceptTrainTime + 150000
OR NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<2842.36, 4423.54, 48.09>>, <<1500, 1500, 1500>>, FALSE, FALSE)
MISSION_FAILED(FAIL_LOST_TRAIN)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(missionTrain)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
IF NOT bDoneGotoSpeech
IF GET_GAME_TIMER() >= iDelayFirstLineTime
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_GOBOAT")
ENDIF
ENDIF
// handle blipping of bike and train
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
IF NOT bDoneBikeStartAudioScene
bDoneBikeStartAudioScene = START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_START)
ENDIF
// add blip for intercept if doesn't exist
IF NOT DOES_BLIP_EXIST(gotoBlip)
REMOVE_ALL_BLIPS()
REMOVE_MISSION_TEXT(FALSE)
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_PATH_START), TRUE)
IF DOES_BLIP_EXIST(gotoBlip)
SET_BLIP_COLOUR(gotoBlip, BLIP_COLOUR_BLUE)
SET_BLIP_ROUTE_COLOUR(gotoBlip, BLIP_COLOUR_BLUE)
ENDIF
ENDIF
IF NOT bShownGodText
IF DO_MISSION_GOD_TEXT("TC_FOLTR")
bShownGodText = TRUE
iDoTrainBanterTime = GET_GAME_TIMER() + 12000
ENDIF
ELSE
// banter on way
IF NOT bDoneTrainBanter
IF GET_GAME_TIMER() >= iDoTrainBanterTime
IF iReplayAttempt % 2 = 0
bDoneTrainBanter = DO_MISSION_SPEECH("EXL3_RAD1")
ELSE
bDoneTrainBanter = DO_MISSION_SPEECH("EXL3_RAD2")
ENDIF
ENDIF
ELSE
IF bSavedBanter
IF RESTORE_BANTER()
bSavedBanter = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
VEHICLE_INDEX lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
DO_SEE_TRAIN_SPEECH()
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<220, 220, 50>>)
AND IS_ENTITY_ON_SCREEN(lastCarriage)
IF bTrainIsPastSilos
fTrainOnScreenTime = fTrainOnScreenTime +@ 1.0
ENDIF
ELSE
fTrainOnScreenTime = 0.0
ENDIF
IF bDoneSeeTrainSpeech
IF NOT bDoneSeeTrainAudioScene
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_START)
bDoneSeeTrainAudioScene = START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN)
ENDIF
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
BOOL bAdvance = FALSE
BOOL bResetSeeSpeech = FALSE
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_SILOS), <<10.0, 10.0, LOCATE_SIZE_HEIGHT>>)
OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<150, 150, 50>>)
OR (bTrainIsPastSilos AND fTrainOnScreenTime >= 0.5)
bAdvance = TRUE
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_PATH_START), <<120,120,120>>, FALSE, FALSE)
bAdvance = TRUE
bResetSeeSpeech = TRUE
ENDIF
IF bAdvance
//IF bPreparedSeeTrainCue
// bDoneSeeTrainCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_SEE_TRAIN")
//ENDIF
//bPreparedSeeTrainCue = FALSE
bDoneSeeTrainCue = FALSE
bPreparedLandOnTrainCue = FALSE
bDoneLandOnTrainCue = FALSE
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_NOT_STARTED
SET_MISSION_STAGE(STAGE_CHASE_TRAIN, FALSE, FALSE, FALSE, FALSE)
IF bResetSeeSpeech
bDoneSeeTrainSpeech = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// jump onto train cutscene procedure
PROC DO_JUMP_ONTO_TRAIN_CUTSCENE()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2160748
SWITCH cutsceneStage
CASE TC_CUT_STAGE_INIT
SET_MISSION_CUTSCENE(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE,DEFAULT,FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
iRemovedJumpBlipTime = 0
//REMOVE_MISSION_TEXT(FALSE, FALSE, TRUE)
CLEAR_HELP()
REMOVE_ALL_BLIPS()
RESET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
SET_TRAIN_SPEED_FOR_STAGE(STAGE_DRIVE_ALONG_TRAIN)
iClosestCarriage = GET_CLOSEST_CARRIAGE(<<0,0,0>>)
SET_BIKE_ON_TRAIN()
TASK_VEHICLE_TEMP_ACTION(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], TEMPACT_GOFORWARD, 1000)
STOP_VEHICLE_FIRE(trainCrashVehicle[TCV_BIKE])
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_BIKE], APPLY_TYPE_IMPULSE, <<0,0,-2>>, 0, TRUE, TRUE)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
VECTOR vBikePos
vBikePos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE])
fBikeCamHeight = vBikePos.Z - 0.1//- 0.2
bDoneFlash = FALSE
vCurrentBikeCamOffset = GET_TRAIN_CRASH_VECTOR(TCVEC_INIT_BIKE_CAM_OFFSET)
CREATE_CAM_AT_BIKE()
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
PLAY_SOUND_FROM_ENTITY(-1, "EXILE_3_LAND_ON_TRAIN_MASTER", trainCrashVehicle[TCV_BIKE])
iTrainCrashCutsceneTime = GET_GAME_TIMER()
cutsceneStage = TC_CUT_STAGE_RUNNING
BREAK
CASE TC_CUT_STAGE_RUNNING
//RESET_VEHICLE_WHEELS(trainCrashVehicle[TCV_BIKE], TRUE)
// jump speech
IF NOT bDoneJumpSpeech
bDoneJumpSpeech = DO_MISSION_SPEECH("EXL3_BOTRAIN")
ENDIF
IF NOT bDoneLandOnTrainCue
IF bPreparedLandOnTrainCue
bDoneLandOnTrainCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_BIKE_LAND")
printstring("trigger event EXL3_BIKE_LAND") printnl()
ENDIF
ENDIF
INTERP_VECTOR_TO_VECTOR_OVER_TIME(GET_TRAIN_CRASH_VECTOR(TCVEC_INIT_BIKE_CAM_OFFSET), GET_TRAIN_CRASH_VECTOR(TCVEC_END_BIKE_CAM_OFFSET), vCurrentBikeCamOffset, 0.69)
PRINTVECTOR(vCurrentBikeCamOffset) PRINTNL()
SET_BIKE_CAM_ROTATION()
//ATTACH_CAM_TO_ENTITY(staticCam, trainCrashVehicle[TCV_BIKE], vDebugTrainCamOffset)
//POINT_CAM_AT_ENTITY(staticCam, trainCrashVehicle[TCV_BIKE], vDebugTrainCamPoint)
//SET_CAM_FOV(staticCam, fDebugTrainCamFOV)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
VEHICLE_INDEX lastCarriage
IF IS_VEHICLE_DRIVEABLE(missionTrain)
lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage)
IF IS_VEHICLE_DRIVEABLE(lastCarriage)
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BIKE], <<0,0,GET_ENTITY_HEADING(lastCarriage)>>)
ENDIF
ENDIF
//SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BIKE], 35.0)
ENDIF
IF NOT bDoneFlash
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_BIKE) = CAM_VIEW_MODE_FIRST_PERSON
IF GET_GAME_TIMER() >= iTrainCrashCutsceneTime + 380
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bDoneFlash = TRUE
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER() >= iTrainCrashCutsceneTime + 680//600
cutsceneStage = TC_CUT_STAGE_CLEANUP
ENDIF
BREAK
CASE TC_CUT_STAGE_CLEANUP
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, FALSE, FALSE, FALSE,DEFAULT,FALSE)
SET_MISSION_STAGE(STAGE_DRIVE_ALONG_TRAIN, FALSE, FALSE)
SET_BIKE_ON_TRAIN()
BREAK
ENDSWITCH
ENDPROC
// chase the train and jump to it
PROC DO_STAGE_CHASE_TRAIN()
BOOL bDoBikeJumpAudioScene = FALSE
BOOL bJumpSucceeding = FALSE
IF bTempSuppressVehicleSpawning
IF GET_GAME_TIMER() <= iSuppressVehicleSpawnTime + 1500
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
ELSE
bTempSuppressVehicleSpawning = FALSE
ENDIF
ENDIF
IF bTempPreventStillVehicleState
IF GET_GAME_TIMER() <= iStageStartTime + 200
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
ELSE
bTempPreventStillVehicleState = FALSE
ENDIF
ENDIF
HANDLE_CREATE_ENGINEER()
IF NOT bRunningCutscene
IF IS_VEHICLE_DRIVEABLE(missionTrain)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
BOOL bOnBike = IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
IF NOT bOnBike
iRemovedJumpBlipTime = 0
ENDIF
DO_LOSE_TRAIN_CHECK()
IF NOT bDoneSeeTrainAudioScene
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_START)
//STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE)
bDoneSeeTrainAudioScene = START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN)
ENDIF
// remove michael when far away
HANDLE_MICHAEL_CAR_DRIVE(TRUE)
// music cues
IF NOT bDoneSeeTrainCue
IF bPreparedSeeTrainCue
IF TRIGGER_MISSION_MUSIC_EVENT("EXL3_SEE_TRAIN")
iPrepareLandOnTrainCueTime = GET_GAME_TIMER() + 8000
bDoneSeeTrainCue = TRUE
ENDIF
ELSE
CANCEL_MUSIC_EVENT("EXL3_SEE_TRAIN")
bDoneSeeTrainCue = TRUE
ENDIF
ELSE
IF NOT bPreparedLandOnTrainCue
IF GET_GAME_TIMER() >= iPrepareLandOnTrainCueTime
bPreparedLandOnTrainCue = PREPARE_MUSIC_EVENT("EXL3_BIKE_LAND")
IF bPreparedLandOnTrainCue
REPLAY_RECORD_BACK_FOR_TIME(8.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ENDIF
ENDIF
ENDIF
// handle blipping of bike and train
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
IF IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETINBK")
OR IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETBCKBK")
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
ENDIF
IF NOT bShownGodText
bShownGodText = DO_MISSION_GOD_TEXT("TC_FOLTR")
ELSE
//IF GET_GAME_TIMER() <= iStageStartTime + 6000
DO_SEE_TRAIN_SPEECH()
//ENDIF
IF NOT bDoneGetBombsSpeech
IF bDoneSeeTrainSpeech
VECTOR vPlayerPos
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF vPlayerPos. y > 4910
IF DO_MISSION_SPEECH("EXL3_STBOMBS")
bDoneGetBombsSpeech = TRUE
iNextRandomSpeechTime = GET_GAME_TIMER() + 15000
ENDIF
ENDIF
ENDIF
ENDIF
IF (IS_ENTITY_ON_SCREEN(missionTrain) OR IS_ENTITY_ON_SCREEN(GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)))
AND (GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), missionTrain, FALSE) <= 200 OR GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE), FALSE) <= 200)
IF bDoneSeeTrainSpeech
IF GET_GAME_TIMER() >= iJumpSucceedingTime + 2000
DO_RANDOM_SPEECH("EXL3_CHTRAIN")
ENDIF
ELSE
IF GET_GAME_TIMER() >= iNextRandomSpeechTime
SET_NEXT_RANDOM_SPEECH_TIME(GET_RANDOM_INT_IN_RANGE(4000, 6000))
ENDIF
ENDIF
ELSE
IF GET_GAME_TIMER() >= iNextRandomSpeechTime
SET_NEXT_RANDOM_SPEECH_TIME(GET_RANDOM_INT_IN_RANGE(1000, 3000))
ENDIF
ENDIF
ENDIF
IF NOT bObjectiveIsJump
IF NOT DOES_BLIP_EXIST(gotoBlip)
REMOVE_ALL_BLIPS()
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_PATH_START), TRUE)
IF DOES_BLIP_EXIST(gotoBlip)
SET_BLIP_COLOUR(gotoBlip, BLIP_COLOUR_BLUE)
SET_BLIP_ROUTE_COLOUR(gotoBlip, BLIP_COLOUR_BLUE)
ENDIF
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(gotoBlip)
IF iCurrentJump >= 0
AND iCurrentJump < 4
IF GET_GAME_TIMER() >= iRemovedJumpBlipTime + 1000
IF NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
REMOVE_ALL_BLIPS()
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_JUMP_COORDS(iCurrentJump), TRUE)
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), GET_JUMP_COORDS(iCurrentJump) + <<0,0,1.5>>, -1, SLF_WHILE_NOT_IN_FOV)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE))
ENDIF
INT i
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
//IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
IF NOT bObjectiveIsJump
IF bOnBike
// is player near a jump
IF vPlayerPos.z >= 59.0
INT iFoundPlayer = -1
INT iFoundTrain = -1
REPEAT NUMBER_JUMPS i
IF iFoundPlayer < 0
IF IS_PLAYER_AT_JUMP(i)
iFoundPlayer = i
ENDIF
ENDIF
ENDREPEAT
REPEAT NUMBER_JUMPS i
IF iFoundTrain < 0
IF IS_CARRIAGE_AT_JUMP(i)
iFoundTrain = i
ENDIF
ENDIF
ENDREPEAT
IF iFoundPlayer >= 0
AND iFoundTrain >= 0
iCurrentJump = iFoundTrain
MAKE_BIKE_EASY_TO_LAND()
REMOVE_ALL_BLIPS()
BLOCK_GPS_FOR_JUMPS()
bObjectiveIsJump = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF bOnBike
IF NOT bShownJumpPrompt
//bShownJumpPrompt = TRUE
bShownJumpPrompt = DO_MISSION_HELP_TEXT("TC_JUMP")
ENDIF
ELSE
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_JUMP")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_PATHLP")
CLEAR_HELP(FALSE)
iClearHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER() >= iCheckClosestCarriageTime
iClosestCarriage = GET_CLOSEST_CARRIAGE(<<0,0,0>>)
iCheckClosestCarriageTime = GET_GAME_TIMER() + 250
ENDIF
// check to see if player is on train through some gta pro techniques
IF IS_PLAYER_ON_TRAIN_WITH_BIKE()
bJumpSucceeding = TRUE
iJumpSucceedingTime = GET_GAME_TIMER()
DISABLE_LEAVE_BIKE_ON_TRAIN()
//APPLY_HELPER_FORCE_TO_BIKE_ON_TRAIN()
//IF missionFailState = MISSION_FAIL_STATE_WAIT_FOR_FADE
// missionFailState = MISSION_FAIL_STATE_NOT_FAILED
//ENDIF
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
fPlayerIsOnTrainTimer = fPlayerIsOnTrainTimer +@ 1.0
IF fPlayerIsOnTrainTimer >= 0.10//0.4
//iClosestCarriage = GET_CLOSEST_CARRIAGE(<<0,0,0>>)
IF checkFirstJumpState = CHECK_FIRST_JUMP_STATE_CHECKING
PRINTSTRING("better than CJ!") PRINTNL()
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(EXL3_JUMPED_AT_FIRST_OPPERTUNITY)
ENDIF
bRunningCutscene = TRUE
//SET_MISSION_STAGE(STAGE_DRIVE_ALONG_TRAIN)
ENDIF
ELSE
// helper forces to assist towards
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
VEHICLE_INDEX closestCarriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage)
IF IS_VEHICLE_DRIVEABLE(closestCarriageVehicle)
VECTOR vBikePos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE])
VECTOR vCarriagePos = GET_ENTITY_COORDS(closestCarriageVehicle)
//PRINTFLOAT(GET_ENTITY_HEIGHT_ABOVE_GROUND(trainCrashVehicle[TCV_BIKE])) printnl()
IF IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
IF NOT IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_BIKE], <<2533.68359, 5680.99170, 61.13281>>, <<42,42,42>>, FALSE, FALSE)
IF GET_ENTITY_HEIGHT_ABOVE_GROUND(trainCrashVehicle[TCV_BIKE]) >= 2//3
//IF IS_ENTITY_AT_ENTITY(trainCrashVehicle[TCV_BIKE], closestCarriageVehicle, <<12,12,12>>, FALSE, FALSE)
IF IS_ENTITY_IN_ANGLED_AREA(trainCrashVehicle[TCV_BIKE], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(closestCarriageVehicle, <<0, 14, 2.5>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(closestCarriageVehicle, <<0, -14, 6.9>>), 12.0) // height was prev 4.8
IF vBikePos.z >= vCarriagePos.z + 2.5//5.0//5.0
VECTOR vOffset = vBikePos - vCarriagePos
//PRINTSTRING("vOffset = ") PRINTVECTOR(vOffset) PRINTNL()
VECTOR vForce = <<-vOffset.x, -vOffset.y, 0>>
vForce *= <<1.7,1.7,1.7>>//<<3.4,3.4,3.4>>//<<5.0,5.0,5.0>>//<<3.15,3.15,3.15>>
//PRINTSTRING("vForce = ") PRINTVECTOR(vForce) PRINTNL()
VECTOR vVelocity = GET_ENTITY_VELOCITY(trainCrashVehicle[TCV_BIKE])
//PRINTSTRING("vVelocity = ") PRINTVECTOR(vVelocity) PRINTNL()
VECTOR vVelocityDiff = vOffset - vVelocity
//vVelocityDiff *= <<0.95,0.95,0.95>>
vVelocityDiff = <<2.7, 2.7, 2.7>>//<<5.4,5.4,5.4>>//<<8,8,8>>//<<10,10,10>>
//vVelocityDiff=vVelocityDiff
//PRINTSTRING("vVelocityDiff = ") PRINTVECTOR(vVelocityDiff) PRINTNL()
vForce.x += (vVelocityDiff.x)
vForce.y += (vVelocityDiff.y)
VECTOR vCarriageVelocity = GET_ENTITY_VELOCITY(closestCarriageVehicle)
vCarriageVelocity *= <<0.025, 0.025, 0.025>>//<<0.05,0.05,0>>//<<0.08, 0.08, 0>>
//PRINTSTRING("carriage vel = ") PRINTVECTOR(vCarriageVelocity) PRINTNL()
vForce += vCarriageVelocity
//PRINTSTRING("force = ") PRINTVECTOR(vForce) PRINTNL()
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_BIKE], APPLY_TYPE_FORCE, vForce, 0, FALSE, TRUE)
ENDIF
bJumpSucceeding = TRUE
iJumpSucceedingTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
//PRINTSTRING("bikepos = ") PRINTVECTOR(vBikePos) PRINTNl()
//PRINTSTRING("carriagepos = ") PRINTVECTOR(vCarriagePos) PRINTNl()
//PRINTSTRING("dist = ") PRINTFLOAT(GET_DISTANCE_BETWEEN_COORDS(vBikePos, vCarriagePos, FALSE)) PRINTNl()
//PRINTSTRING("speed = ") PRINTFLOAT(GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE])) PRINTNl()
// check to see if should be doing in air audio scene
IF vBikePos.z >= vCarriagePos.z + 4.5
AND GET_DISTANCE_BETWEEN_COORDS(vBikePos, vCarriagePos, FALSE) < 10.0
AND GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE]) >= 18.0
bDoBikeJumpAudioScene = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF bJumpSucceeding
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
ELSE
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_HARD)
ENDIF
fPlayerIsOnTrainTimer = 0.0
// otherwise update the next jump
IF iCurrentJump < 3
IF vPlayerPos.y > GET_JUMP_Y_LIMIT(iCurrentJump)
OR NOT IS_CARRIAGE_AT_JUMP(iCurrentJump)
BOOL bFoundNewJump = FALSE
FOR i=iCurrentJump+1 TO NUMBER_JUMPS-1
IF NOT bFoundNewJump
IF IS_CARRIAGE_AT_JUMP(i)
IF vPlayerPos.y < GET_JUMP_Y_LIMIT(i)
iCurrentJump = i
IF iCurrentJump < 4
bDoPathHelp = TRUE
IF DOES_BLIP_EXIST(gotoBlip)
REMOVE_BLIP(gotoBlip)
ENDIF
iRemovedJumpBlipTime = GET_GAME_TIMER()
bFoundNewJump = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
//IF NOT bFoundNewJump
// IF DOES_BLIP_EXIST(gotoBlip)
// REMOVE_BLIP(gotoBlip)
// ENDIF
// iCurrentJump = 3
//ENDIF
ENDIF
ELSE
VEHICLE_INDEX carriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
IF IS_VEHICLE_DRIVEABLE(carriageVehicle)
VECTOR vCarriagePos = GET_ENTITY_COORDS(carriageVehicle)
IF vCarriagePos.x < 2345.36
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_JUMP")
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_DRVTRN")
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
ENDIF
REMOVE_ALL_BLIPS()
MISSION_FAILED(FAIL_MISSED_JUMPS)
ENDIF
ENDIF
ENDIF
IF bOnBike
IF NOT bShownPathHelp
IF bDoPathHelp
IF CAN_ADVANCE_MISSION()
IF NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
AND NOT bJumpSucceeding
AND DOES_BLIP_EXIST(gotoBlip)
AND iCurrentJump < 4
IF vPlayerPos.y < 5900
bShownPathHelp = DO_MISSION_HELP_TEXT("TC_PATHLP")
ELSE
bShownPathHelp = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR vJumpCoords = GET_JUMP_COORDS(iCurrentJump)
CONST_FLOAT MARKER_SIZE 2.5
IF bOnBike
IF CAN_ADVANCE_MISSION()
//DRAW_MARKER(MARKER_CYLINDER, vJumpCoords, <<0,0,0>>, <<0,0,0>>, <<MARKER_SIZE,MARKER_SIZE,MARKER_SIZE>>, 255, 255, 0, 178)
IF DOES_BLIP_EXIST(gotoBlip)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vJumpCoords, <<LOCATE_SIZE_ON_FOOT_ONLY, LOCATE_SIZE_ON_FOOT_ONLY, LOCATE_SIZE_HEIGHT>>, TRUE)
ENDIF
ENDIF
/*
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vJumpCoords, <<3.0, 3.0, LOCATE_SIZE_HEIGHT>>)
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
IF GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE]) >= 12.0
IF DOES_BIKE_MATCH_JUMP_HEADING(iCurrentJump)
IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED
IF iCurrentJump = 0
//INFORM_STAT_EXILE_THREE_FIRST_JUMP_SUCCESS()
ENDIF
bRunningCutscene = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
*/
ENDIF
ENDIF
ENDIF
// check stat
SWITCH checkFirstJumpState
CASE CHECK_FIRST_JUMP_STATE_NOT_STARTED
IF bJumpSucceeding
VECTOR vPlayerPosForJump
vPlayerPosForJump = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF vPlayerPosForJump.y < 5408
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_CHECKING
iCheckFirstJumpStateTime = GET_GAME_TIMER()
ENDIF
ENDIF
BREAK
CASE CHECK_FIRST_JUMP_STATE_CHECKING
IF NOT bJumpSucceeding
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
IF NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
IF GET_GAME_TIMER() >= iCheckFirstJumpStateTime + 3000
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_DONE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//PRINTINT(ENUM_TO_INT(checkFirstJumpState)) PRINTNL()
ENDIF
//ENDIF
ENDIF
IF bDoBikeJumpAudioScene
IF NOT bDoneBikeJumpAudioScene
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
bDoneBikeJumpAudioScene = TRUE
ENDIF
ELSE
IF bDoneBikeJumpAudioScene
BOOL bAllowCancelScene = FALSE
IF fPlayerIsOnTrainTimer > 0.0
bAllowCancelScene = TRUE
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(trainCrashVehicle[TCV_BIKE])
OR NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
bAllowCancelScene = TRUE
ENDIF
ELSE
bAllowCancelScene = TRUE
ENDIF
IF bAllowCancelScene
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
bDoneBikeJumpAudioScene = FALSE
ENDIF
ENDIF
ENDIF
ELSE
DO_JUMP_ONTO_TRAIN_CUTSCENE()
ENDIF
ENDPROC
// set bike to player pos
PROC SET_BIKE_TO_PLAYER_POS(FLOAT fPhase)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
AND IS_VEHICLE_DRIVEABLE(missionTrain)
VECTOR vPos
vPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "EX03_TRAIN_BIKE_SCENE", <<0,0,0>>, <<0,0,0>>, fPhase), GET_ENTITY_HEADING(PLAYER_PED_ID()), <<0, 0.23, -0.69>>)) //+ <<0, 0.23 + (JACK_TRAIN_SPEED * GET_FRAME_TIME()), -0.69>>)
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_BIKE], vpos)
SET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE], GET_ENTITY_HEADING(PLAYER_PED_ID()))
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_BIKE], TRUE)
ENDIF
ENDPROC
// knock out driver cutscene procedure
PROC DO_KNOCK_OUT_DRIVER_CUTSCENE()
SWITCH cutsceneStage
CASE TC_CUT_STAGE_INIT
SET_MISSION_CUTSCENE(TRUE,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,FALSE)
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
TRIGGER_MISSION_MUSIC_EVENT("EXL3_TRAIN_ROOF")
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HIJACK_TRAIN)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE)
IF IS_VEHICLE_DRIVEABLE(missionTrain)
fTrainCruiseSpeed = JACK_TRAIN_SPEED
SET_TRAIN_CRUISE_SPEED(missionTrain, fTrainCruiseSpeed)
SET_TRAIN_SPEED(missionTrain, fTrainCruiseSpeed)
ENDIF
INT i
REPEAT NUMBER_CLIMB_ENEMIES i
IF DOES_ENTITY_EXIST(climbEnemy[i].ped)
DELETE_PED(climbEnemy[i].ped)
ENDIF
ENDREPEAT
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
AND IS_VEHICLE_DRIVEABLE(missionTrain)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(<<0,0,0>>)
BOOL bEnteredWithHelmet
INT iHelmet
INT iTex
iHelmet = GET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD)
IF iHelmet = 9
OR iHelmet = 11
OR iHelmet = 23
iTex = GET_PED_PROP_TEXTURE_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD)
bEnteredWithHelmet = TRUE
ELSE
bEnteredWithHelmet = FALSE
ENDIF
// trevor
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0,0,10>>)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "EX03_TRAIN_BIKE_SCENE", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
IF bEnteredWithHelmet
GIVE_PED_HELMET(PLAYER_PED_ID(), TRUE, PV_FLAG_DEFAULT_HELMET, iTex)
SET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD, iHelmet, iTex)
ENDIF
// driver
IF NOT IS_PED_INJURED(engineerPed[0])
SET_ENTITY_COORDS(engineerPed[0], GET_ENTITY_COORDS(engineerPed[0]) + <<0,0,10>>)
CLEAR_PED_TASKS_IMMEDIATELY(engineerPed[0])
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "EX03_TRAIN_BIKE_SCENE_DRIVER", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
SET_ENTITY_COLLISION(engineerPed[0], FALSE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(engineerPed[0])
ENDIF
// train
PLAY_SYNCHRONIZED_ENTITY_ANIM(missionTrain, iSyncScene, "EX03_TRAIN_BIKE_SCENE_TRAIN", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), INSTANT_BLEND_IN)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, FALSE)
IF bLoadedHitDriverAudio
PLAY_SYNCHRONIZED_AUDIO_EVENT(iSyncScene)
ENDIF
SET_BIKE_TO_PLAYER_POS(0)
// camera
CREATE_CAM_ATTACHED_TO_TRAIN("EX03_TRAIN_BIKE_SCENE_CAM")
ENDIF
bDoneFlash = FALSE
iTrainCrashCutsceneTime = GET_GAME_TIMER()
cutsceneStage = TC_CUT_STAGE_RUNNING
BREAK
CASE TC_CUT_STAGE_RUNNING
#IF IS_DEBUG_BUILD
// DO_DEBUG_TRAIN_CAM_POSITION()
#ENDIF
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SWITCH jackingTrainShot
CASE JACKING_TRAIN_OFF_BIKE
FLOAT fPhase
fPhase = 0.0
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene)
ENDIF
IF NOT bDetachedBike
SET_BIKE_TO_PLAYER_POS(fPhase)
IF GET_GAME_TIMER() >= iTrainCrashCutsceneTime + 200
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_BIKE], FALSE)
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BIKE], 32.0) // 43
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_BIKE], APPLY_TYPE_IMPULSE, <<-2.1,3.2,0>>, 0, TRUE, TRUE) //<<-3,4,0>>
bDetachedBike = TRUE
ENDIF
ENDIF
ENDIF
IF NOT IS_SCREEN_FADING_OUT()
IF NOT bDoneEnterCabSpeech
IF fPhase >= 0.85
bDoneEnterCabSpeech = DO_MISSION_SPEECH("EXL3_DRIVER", FALSE, 1)
ENDIF
ENDIF
ENDIF
IF NOT bDoneFlash
IF fPhase >= 0.982
PRINTSTRING("flash time = ") PRINTINT(GET_GAME_TIMER() - iTrainCrashCutsceneTime) PRINTNL()
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bDoneFlash = TRUE
ENDIF
ENDIF
IF fPhase >= 0.995
iTrainCrashCutsceneTime = GET_GAME_TIMER()
jackingTrainShot = JACKING_TRAIN_BASH_DRIVER
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
REPLAY_STOP_EVENT()
iTrainCrashCutsceneTime = GET_GAME_TIMER()
cutsceneStage = TC_CUT_STAGE_CLEANUP
//IF IS_VEHICLE_DRIVEABLE(missionTrain)
// SET_HORN_ENABLED(missionTrain, FALSE)
//ENDIF
ENDIF
BREAK
/*
CASE JACKING_TRAIN_BASH_DRIVER
IF iBashSpeechStage < iBashedDriverCount
IF DO_MISSION_SPEECH("EXL3_DRIVER", FALSE, 2)
iBashSpeechStage++
ENDIF
ENDIF
SWITCH iFightStage
CASE 0 // intro
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(<<0,0,0>>)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_idle_driver", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
CREATE_CAM_ATTACHED_TO_TRAIN("ex03_attack_driver_idle_cam")
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, TRUE)
bLoadedHitDriverAudio = FALSE
bSetSceneAudioEntity = FALSE
//PRINT_HELP_FOREVER("TC_FIGHLP1")
iFightStage = 1
ENDIF
BREAK
CASE 1 // loop
//DISPLAY_HELP_TEXT_THIS_FRAME("TC_FIGHLP1", FALSE)
//IF IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
IF NOT bLoadedHitDriverAudio
IF NOT bSetSceneAudioEntity
INIT_SYNCH_SCENE_AUDIO_WITH_ENTITY("EX03_ATTACK_DRIVER_OUTRO", PLAYER_PED_ID())
//SET_SYNCH_SCENE_AUDIO_ENTITY(PLAYER_PED_ID())
bSetSceneAudioEntity = TRUE
ENDIF
bLoadedHitDriverAudio = PREPARE_SYNCHRONIZED_AUDIO_EVENT("EX03_ATTACK_DRIVER_OUTRO", 0)
ELSE
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(<<0,0,0>>)
IF iBashedDriverCount < 0
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_impact", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_impact_driver", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
CREATE_CAM_ATTACHED_TO_TRAIN("ex03_attack_driver_impact_cam")
iFightStage = 2
ELSE
CLEAR_HELP(FALSE)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_outro", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_outro_driver", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_NONE, RBF_VEHICLE_IMPACT)
STOP_SYNCHRONIZED_ENTITY_ANIM(missionTrain, INSTANT_BLEND_OUT, TRUE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(missionTrain, iSyncScene, "ex03_attack_driver_outro_train", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), INSTANT_BLEND_IN)
PLAY_SYNCHRONIZED_AUDIO_EVENT(iSyncScene)
CREATE_CAM_ATTACHED_TO_TRAIN("ex03_attack_driver_outro_cam")
iFightStage = 3
ENDIF
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, FALSE)
iBashedDriverCount++
ENDIF
//ENDIF
BREAK
CASE 2 // hit
//DISPLAY_HELP_TEXT_THIS_FRAME("TC_FIGHLP1", FALSE)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.98
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(<<0,0,0>>)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_idle_driver", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
CREATE_CAM_ATTACHED_TO_TRAIN("ex03_attack_driver_idle_cam")
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, TRUE)
iFightStage = 1
ENDIF
BREAK
CASE 3 // outro
//IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.60
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.19
//CREATE_CAM_ATTACHED_TO_TRAIN(TRUE, FALSE, TRAIN_CAM_RIDE_LOW)
iTrainCrashCutsceneTime = GET_GAME_TIMER()
cutsceneStage = TC_CUT_STAGE_CLEANUP
//jackingTrainShot = JACKING_TRAIN_READY_TO_JUMP
ENDIF
BREAK
ENDSWITCH
BREAK
*/
CASE JACKING_TRAIN_READY_TO_JUMP
//IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.98
// SET_TREVOR_READY_TO_JUMP()
// cutsceneStage = TC_CUT_STAGE_CLEANUP
//ENDIF
BREAK
ENDSWITCH
HANDLE_SKIP_CUTSCENE()
ENDIF
BREAK
CASE TC_CUT_STAGE_CLEANUP
// back to gameplay
FORCE_ENGINEER_DEAD(FALSE)
IF bSkippedCutscene
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
STOP_SYNCHRONIZED_AUDIO_EVENT(iSyncScene)
ENDIF
ENDIF
PRINTSTRING("end time = ") PRINTINT(GET_GAME_TIMER() - iTrainCrashCutsceneTime) PRINTNL()
// WAIT(0)
//ENDIF
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HIJACK_TRAIN)
SET_MISSION_STAGE(STAGE_GET_TO_BRIDGE, FALSE, FALSE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
BREAK
ENDSWITCH
ENDPROC
// drive along the train on the bike
PROC DO_STAGE_DRIVE_ALONG_TRAIN()
HANDLE_MERC_PICKUP()
IF NOT bRunningCutscene
DISABLE_LEAVE_BIKE_ON_TRAIN()
IF NOT bLoadedHitDriverAudio
IF NOT bSetSceneAudioEntity
INIT_SYNCH_SCENE_AUDIO_WITH_ENTITY("EX03_TRAIN_BIKE_LAND", PLAYER_PED_ID())
bSetSceneAudioEntity = TRUE
ENDIF
bLoadedHitDriverAudio = PREPARE_SYNCHRONIZED_AUDIO_EVENT("EX03_TRAIN_BIKE_LAND", 0)
ENDIF
HANDLE_CREATE_ENGINEER(TRUE)
IF bTempPreventStillVehicleState
IF GET_GAME_TIMER() <= iStageStartTime + 200
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
ELSE
bTempPreventStillVehicleState = FALSE
ENDIF
ENDIF
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(missionTrain)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
// extra speed on bike
IF GET_GAME_TIMER() < iStageStartTime + 4000
APPLY_HELPER_FORCE_TO_BIKE_ON_TRAIN()
ENDIF
//PRINTSTRING("playerpos = ") PRINTVECTOR(vPlayerPos) PRINTNL()
//PRINTSTRING("enginepos = ") PRINTVECTOR(GET_ENTITY_COORDS(missionTrain)) PRINTNL()
VECTOR vTrainPos = GET_ENTITY_COORDS(missionTrain)
IF vTrainPos.x <= TRAIN_STOP_X
bStopTrain = TRUE
MISSION_FAILED(FAIL_TRAIN_STOPPED)
ENDIF
iClosestCarriage = GET_CLOSEST_CARRIAGE(<<0,0,0>>)
IF iClosestCarriage <> iCachedCarriage
IF IS_PLAYER_ON_TRAIN_WITH_BIKE()
PRINTSTRING("play sound!") printnl()
PLAY_SOUND_FROM_ENTITY(-1, "EXILE_3_TYRE_CHIRPS_MASTER", trainCrashVehicle[TCV_BIKE])
ENDIF
ENDIF
iCachedCarriage = iClosestCarriage
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
//DO_RANDOM_SPEECH("EXL3_DRTRAIN")
IF GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE]) >= 29
DO_RANDOM_SPEECH("EXL3_PANIC")
ENDIF
IF NOT DOES_BLIP_EXIST(trainBlip)
REMOVE_ALL_BLIPS()
REMOVE_MISSION_TEXT(FALSE)
trainBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(missionTrain)
ENDIF
IF NOT bShownGodText
bShownGodText = DO_MISSION_GOD_TEXT("TC_DRVTRN")
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), missionTrain, <<16.0, 16.0, 2.0>>, FALSE, FALSE)
VECTOR vEnginePos = GET_ENTITY_COORDS(missionTrain)
IF vPlayerPos.z > vEnginePos.z + 2.0
IF CAN_ADVANCE_MISSION()
bRunningCutscene = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// mission stage put back if falling off
IF NOT bRunningCutscene
IF IS_VEHICLE_DRIVEABLE(GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage))
VECTOR vClosestCarriageCoord = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage))
IF vPlayerPos.z < vClosestCarriageCoord.z + 1.6
IF vTrainPos.y >= 6247
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_JUMP")
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_DRVTRN")
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
ENDIF
REMOVE_ALL_BLIPS()
MISSION_FAILED(FAIL_FELL_OFF_TRAIN)
ELSE
IF CAN_ADVANCE_MISSION()
bPreparedSeeTrainCue = TRUE
bDoneSeeTrainCue = TRUE
bPreparedLandOnTrainCue = TRUE
bDoneLandOnTrainCue = TRUE
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_DONE
SET_MISSION_STAGE(STAGE_CHASE_TRAIN)
trainMovementState = TRAIN_MOVEMENT_CATCHUP
bSlowDownTrainForCatchup = TRUE
bDoneSeeTrainAudioScene = FALSE
bObjectiveIsJump = TRUE
bDoneJumpSpeech = TRUE
bShownJumpPrompt = TRUE
bDoneGetBombsSpeech = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
DO_KNOCK_OUT_DRIVER_CUTSCENE()
ENDIF
ENDPROC
// bridge smash
PROC HANDLE_BRIDGE_RAYFIRE(BOOL bDoSmashWhenPrimed, BOOL bSkipStraightToEnd = FALSE)
SWITCH iBridgeSmashStage
CASE 0
bridgeRayfire = GET_RAYFIRE_MAP_OBJECT(<<-532.305359, 4551.624023, 95.641785>>, 5, "DES_traincrash")
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) <> RFMO_STATE_SYNC_STARTING
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_RESET)
ENDIF
iBridgeSmashStage++
ENDIF
BREAK
CASE 1
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_PRIMING)
iBridgeSmashStage++
ELSE
iBridgeSmashStage = 0
ENDIF
BREAK
CASE 2
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_PRIMED
IF bDoSmashWhenPrimed
IF NOT bSkipStraightToEnd
IF bLoadedCrashStream
PLAY_STREAM_FRONTEND()
ENDIF
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_START_ANIM)
iBridgeSmashStage++
ELSE
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_ENDING)
iBridgeSmashStage++
ENDIF
ENDIF
ENDIF
ELSE
iBridgeSmashStage = 0
ENDIF
BREAK
ENDSWITCH
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
printint(enum_to_int(GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire))) printnl()
ENDIF
ENDPROC
PROC SET_MICHAEL_AT_BRIDGE()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_ENTITY_VISIBLE(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_DINGHY], TRUE, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 006, GET_TRAIN_CRASH_RECORDING_PREFIX())
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 5500)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
//ENDIF
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
ENDPROC
// train crash cutscene procedure
PROC DO_TRAIN_CRASH_CUTSCENE()
PED_INDEX trevorPed = GET_TREVOR_PED()
PED_INDEX michaelPed = GET_MICHAEL_PED()
SWITCH cutsceneStage
CASE TC_CUT_STAGE_INIT
REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<-490.5, 4407.6, 30.4>>)
//IF NOT bRegisteredJump
// DISPLAY_HELP_TEXT_THIS_FRAME("TC_JUMHLP", TRUE)
//ENDIF
IF NOT bStartedIPLSwap
IPL_GROUP_SWAP_START("railing_start", "railing_end")
ENDIF
bStartedIPLSwap = FALSE
HANDLE_BRIDGE_RAYFIRE(TRUE)
// temp before register
WAIT(0)
DELETE_TRAIN_CRASH_TRAINS()
CLEAR_AREA(<<-516.68, 4425.17, 92.99>>, 150.0, TRUE)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
SET_MISSION_CUTSCENE(TRUE)
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-508.64059, 4426.66016, 80.85294>>, <<0.0, 0.0, 7.81>>)
DESTROY_MISSION_STATIC_CAM(staticCam)
CREATE_MISSION_ANIM_CAM()
PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "Traincrash_revised_CAM", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_CRASH))
//SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.1063)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, FALSE)
RESET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
CLEAR_TIMECYCLE_MODIFIER()
DESTROY_MISSION_STATIC_CAM(fpsCam.theCam)
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAYFIRE)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_COLLISION)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_BRIDGE)
REPLAY_RECORD_BACK_FOR_TIME(8.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
//BEGIN_SRL()
// attach trevor to anchor
/*
VECTOR vTrainAnchorStart
VECTOR vTrainAnchorEnd
vTrainAnchorStart = <<-516.51398, 4430.62598, 89.83>> //<<-528.36, 4519.64, 89.83>>
vTrainAnchorEnd = <<-505.51242, 4353.57080, 89.83>> //<<-514.73, 4420.41, 89.83>>
fTrainAnchorAngle = GET_HEADING_FROM_VECTOR_2D(vTrainAnchorEnd.x - vTrainAnchorStart.x, vTrainAnchorEnd.y - vTrainAnchorStart.y)
vTrainJumpAnchorPos = vTrainAnchorStart
CONST_FLOAT TIME_TO_CRASH 2.77//2.75
vTrainJumpAnchorSpeed.x = (vTrainAnchorEnd.x - vTrainAnchorStart.x) / TIME_TO_CRASH
vTrainJumpAnchorSpeed.y = (vTrainAnchorEnd.y - vTrainAnchorStart.y) / TIME_TO_CRASH
trainJumpAnchorObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ANCHOR), vTrainJumpAnchorPos)
SET_ENTITY_COORDS(trainJumpAnchorObject, vTrainJumpAnchorPos)
SET_ENTITY_ROTATION(trainJumpAnchorObject, <<0,0,fTrainAnchorAngle>>)
FREEZE_ENTITY_POSITION(trainJumpAnchorObject, TRUE)
SET_ENTITY_VISIBLE(trainJumpAnchorObject, FALSE)
SET_ENTITY_COLLISION(trainJumpAnchorObject, FALSE)
IF NOT IS_PED_INJURED(trevorPed)
CLEAR_PED_TASKS_IMMEDIATELY(trevorPed)
DETACH_ENTITY(trevorPed)
CONST_FLOAT JUMP_INIT_PHASE 0.41//0.42
vTrainJumpRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_TRAIN_ROOF_JUMP", <<0,0,0>>, <<0,0,0>>, JUMP_INIT_PHASE)
vTrainJumpOffset = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_TRAIN_ROOF_JUMP", <<0,0,0>>, <<0,0,0>>, JUMP_INIT_PHASE)
ATTACH_ENTITY_TO_ENTITY(trevorPed, trainJumpAnchorObject, 0, vTrainJumpOffset, vTrainJumpRot)
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_TRAIN_ROOF_JUMP", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET, JUMP_INIT_PHASE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
bDoneJumpOff = TRUE
ENDIF
*/
IF NOT IS_PED_INJURED(trevorPed)
DETACH_ENTITY(trevorPed)
REMOVE_PED_HELMET(trevorPed, TRUE)
TASK_SYNCHRONIZED_SCENE(trevorPed, iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_CRASH), "traincrash_revised_trevor", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
bDoneJumpOff = TRUE
ENDIF
// sort out michael
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
AND NOT IS_PED_INJURED(michaelPed)
IF NOT IS_PED_IN_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
ENDIF
BRING_VEHICLE_TO_HALT(trainCrashVehicle[TCV_DINGHY], 25.0, 1)
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-490.5, 4407.6, 30.4>>)
SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], 79.0)
SET_ENTITY_VISIBLE(trainCrashVehicle[TCV_DINGHY], FALSE)
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_DINGHY], FALSE, TRUE)
ENDIF
STOP_VEHICLE_FIRE(trainCrashVehicle[TCV_DINGHY])
IF bPreparedSideOnCue
TRIGGER_MISSION_MUSIC_EVENT("EXL3_TUNNEL_EXIT")
ENDIF
iTrainCrashCutsceneTime = GET_GAME_TIMER()
IF STREAMVOL_IS_VALID(bridgeVolume)
STREAMVOL_DELETE(bridgeVolume)
ENDIF
//bridgeVolume = STREAMVOL_CREATE_FRUSTUM(<<-493.1, 4382.7, 99.2>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-13.4, 0.0, 35.0>>), 100, FLAG_MAPDATA)
bDoneFlash = FALSE
cutsceneStage = TC_CUT_STAGE_RUNNING
BREAK
CASE TC_CUT_STAGE_RUNNING
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
HANDLE_BRIDGE_RAYFIRE(TRUE)
//SET_SRL_TIME(TO_FLOAT(GET_GAME_TIMER() - iTrainCrashCutsceneTime))
SWITCH trainCrashShot
CASE TRAIN_CRASH_RAYFIRE
IF bSpedUp
fTimeScale = fTimeScale +@ 0.52
IF fTimeScale > 1
fTimeScale = 1
ENDIF
SET_TIME_SCALE(fTimeScale)
ENDIF
FLOAT fRayfirePhase
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
fRayfirePhase = GET_RAYFIRE_MAP_OBJECT_ANIM_PHASE(bridgeRayfire)
printstring("PHASE = ") PRINTFLOAT(fRayfirePhase) PRINTNL()
IF fRayfirePhase >= 0.0687
START_DEBRIS_FX()
fRayfireEvolution = fRayfireEvolution +@ 0.09
IF fRayfireEvolution > 1
fRayfireEvolution = 1
ENDIF
PRINTSTRING("evo = ") PRINTFLOAT(fRayfireEvolution) PRINTNL()
SET_DEBRIS_EVOLUTION(fRayfireEvolution)
ENDIF
IF NOT bDoneCamShake
IF fRayfirePhase >= 0.688
SHAKE_CAM(animCam, "SMALL_EXPLOSION_SHAKE", 0.15)
bDoneCamShake = TRUE
ENDIF
ENDIF
IF NOT bSlowedDown
IF fRayfirePhase >= 0.0274
fTimeScale = 0.5
SET_TIME_SCALE(fTimeScale)
bSlowedDown = TRUE
ENDIF
ENDIF
IF NOT bSpedUp
IF fRayfirePhase >= 0.127
bSpedUp = TRUE
ENDIF
ENDIF
SWITCH swapCarriageState
CASE SWAP_CARRIAGE_STATE_NOT_STARTED
printstring("here1") printnl()
swapCarriageState = SWAP_CARRIAGE_STATE_WAITING
BREAK
CASE SWAP_CARRIAGE_STATE_WAITING
printstring("here2") printnl()
IF fRayfirePhase >= 0.0
IF IPL_GROUP_SWAP_IS_READY()
printstring("ready") printnl()
ENDIF
ENDIF
//IF fRayfirePhase >= 0.15
// IF STREAMVOL_IS_VALID(bridgeVolume)
// STREAMVOL_DELETE(bridgeVolume)
// ENDIF
//ENDIF
IF fRayfirePhase >= 0.95
//BOOL bAdvance
//BOOL bCancel
//bAdvance = FALSE
//bCancel = FALSE
IF IPL_GROUP_SWAP_IS_READY()
printstring("here3A") printnl()
//bAdvance = TRUE
IPL_GROUP_SWAP_FINISH()
ELSE
printstring("here4") printnl()
IPL_GROUP_SWAP_CANCEL()
//bAdvance = TRUE
//bCancel = TRUE
ENDIF
//IF bAdvance
//SET_TRAIN_CRASH_GEO(TRUE, TRUE, TRUE, FALSE, TRUE)
SET_TRAIN_CRASH_GEO(TRUE, TRUE, TRUE, FALSE, TRUE)
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_ENDING)
swapCarriageState = SWAP_CARRIAGE_STATE_DONE
//ENDIF
//IF bCancel
//ENDIF
ENDIF
BREAK
CASE SWAP_CARRIAGE_STATE_DONE
SWITCH gotoFoamState
CASE GOTO_FOAM_STATE_NOT_STARTED
PRINTINT(ENUM_tO_iNT(GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire))) PRINTNL()
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_END
PRINTSTRING("here5") printnl()
IPL_GROUP_SWAP_START("canyonriver01", "canyonriver01_traincrash")
gotoFoamState = GOTO_FOAM_STATE_WAITING
ENDIF
BREAK
CASE GOTO_FOAM_STATE_WAITING
PRINTSTRING("here6") printnl()
BREAK
CASE GOTO_FOAM_STATE_DONE
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
IF NOT bDoneCollisionCue
IF fRayfirePhase >= 0.186
IF TRIGGER_MISSION_MUSIC_EVENT("EXL3_TRAIN_CRASH_OS")
bDoneCollisionCue = TRUE
ENDIF
ENDIF
ELSE
IF NOT bDoneHitWaterCue
IF fRayfirePhase >= 0.527
IF TRIGGER_MISSION_MUSIC_EVENT("EXL3_BRIDGE_FALL")
bDoneHitWaterCue = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(trevorPed)
IF NOT bDoneJumpOff
bDoneJumpOff = TRUE
ELSE
IF NOT bDoneJumpSpeech
bDoneJumpSpeech = DO_MISSION_SPEECH("EXL3_JUTRAIN")
ENDIF
ENDIF
ENDIF
FLOAT fSyncScenePhase
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
fSyncScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene)
ELSE
fSyncScenePhase = 1.0
ENDIF
// grey car
IF fSyncScenePhase >= 0.643
MODIFY_WATER( -508.0, 4419.3, 1.0, 0.5) // 1.4
ENDIF
IF fSyncScenePhase >= 0.643
MODIFY_WATER( -507.4, 4420.9, 1.0, 0.5)
ENDIF
IF fSyncScenePhase >= 0.643
MODIFY_WATER( -510.6, 4418.2, 1.0, 0.5)
ENDIF
// engine
IF fSyncScenePhase >= 0.670
MODIFY_WATER( -498.5, 4414.0, 1.0, 0.5)
ENDIF
IF fSyncScenePhase >= 0.670
MODIFY_WATER( -498.0, 4417.8, 1.0, 0.5)
ENDIF
// white car
IF fSyncScenePhase >= 0.649
MODIFY_WATER( -501.5, 4426.1, 5.0, 0.5)
ENDIF
IF fSyncScenePhase >= 0.806
MODIFY_WATER( -504.3, 4428.9, 5.0, 0.5)
ENDIF
IF fSyncScenePhase > 0.975
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
SET_MICHAEL_AT_BRIDGE()
ENDIF
ENDIF
IF NOT IS_PED_INJURED(trevorPed)
INT i
REPEAT NUMBER_SPLASHES i
IF NOT bAddedSplash[i]
FLOAT fTriggerPhase
STRING sString
fTriggerPhase = 2.0
PED_BONETAG bone
SWITCH i
CASE 0
fTriggerPhase = 0.489
sString = "water_splash_ped"
bone = BONETAG_HEAD
BREAK
CASE 1
fTriggerPhase = 0.495
sString = "cs_fam5_water_splash_ped_wade"
bone = BONETAG_SPINE3
BREAK
CASE 2
fTriggerPhase = 0.510
sString = "cs_fam5_water_splash_ped_in"
bone = BONETAG_R_HAND
BREAK
CASE 3
fTriggerPhase = 0.515
sString = "cs_fam5_water_splash_ped_in"
bone = BONETAG_L_FOREARM
BREAK
CASE 4
fTriggerPhase = 0.547
sString = "cs_fam5_water_splash_ped_out"
bone = BONETAG_R_FOREARM
BREAK
CASE 5
fTriggerPhase = 0.549
sString = "cs_fam5_water_splash_ped_out"
bone = BONETAG_L_FOREARM
BREAK
CASE 6
fTriggerPhase = 0.805
sString = "cs_fam5_water_splash_ped_out"
bone = BONETAG_L_HAND
BREAK
CASE 7
fTriggerPhase = 0.839
sString = "cs_fam5_water_splash_ped_in"
bone = BONETAG_R_FOREARM
BREAK
CASE 8
fTriggerPhase = 0.855
sString = "cs_fam5_water_splash_ped_out"
bone = BONETAG_L_FOREARM
BREAK
CASE 9
fTriggerPhase = 0.865
sString = "cs_fam5_water_splash_ped_out"
bone = BONETAG_L_HAND
BREAK
CASE 10
fTriggerPhase = 0.883
sString = "cs_fam5_water_splash_ped_in"
bone = BONETAG_L_HAND
BREAK
CASE 11
fTriggerPhase = 0.889
sString = "cs_fam5_water_splash_ped_out"
bone = BONETAG_L_FOOT
BREAK
CASE 12
fTriggerPhase = 0.910
sString = "cs_fam5_water_splash_ped_in"
bone = BONETAG_L_FOOT
BREAK
CASE 13
fTriggerPhase = 0.954
sString = "cs_fam5_water_splash_ped_in"
bone = BONETAG_R_HAND
BREAK
ENDSWITCH
IF fSyncScenePhase >= fTriggerPhase
IF i <> 1
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE(sString, trevorPed, <<0,0,0>>, <<0,0,0>>, bone)
ELSE
wadePTFX = START_PARTICLE_FX_LOOPED_ON_PED_BONE(sString, trevorPed, <<0,0,0>>, <<0,0,0>>, bone)
ENDIF
bAddedSplash[i] = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
//IF swapCarriageState >= SWAP_CARRIAGE_STATE_DONE
//IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_END
//IF fSyncScenePhase >= 0.6
// IF NOT STREAMVOL_IS_VALID(bridgeVolume)
// bridgeVolume = STREAMVOL_CREATE_SPHERE(<<-401.2, 4436.1, 30.7>>, 30, FLAG_MAPDATA | FLAG_COLLISIONS_MOVER)
// ENDIF
//ENDIF
//
// ENDIF
//ENDIF
IF NOT bDoneFlash
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON
IF fSyncScenePhase >= 0.971
PRINTSTRING("start time = ") PRINTINT(GET_GAME_TIMER() - iTrainCrashCutsceneTime) PRINTNL()
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bDoneFlash = TRUE
ENDIF
ENDIF
ENDIF
IF fSyncScenePhase >= 0.99
cutsceneStage = TC_CUT_STAGE_CLEANUP
ENDIF
HANDLE_SKIP_CUTSCENE()
BREAK
CASE TRAIN_CRASH_MICHAEL_ONTO_CONTAINER
BREAK
ENDSWITCH
BREAK
CASE TC_CUT_STAGE_CLEANUP
IF bSkippedCutscene
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX1)
REMOVE_PARTICLE_FX(debrisFallPTFX1)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX2)
REMOVE_PARTICLE_FX(debrisFallPTFX2)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX3)
REMOVE_PARTICLE_FX(debrisFallPTFX3)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisSplashPTFX)
REMOVE_PARTICLE_FX(debrisSplashPTFX)
ENDIF
bStartedDebrisFX = FALSE
REMOVE_PARTICLE_FX_IN_RANGE(<<-492, 4435, 34>>, 40)
WAIT(0)
ENDIF
REPLAY_STOP_EVENT()
//END_SRL()
// skip to the end...
//IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
// SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_ENDING)
//ENDIF
IF NOT IS_PED_INJURED(trevorPed)
CLEAR_PED_TASKS_IMMEDIATELY(trevorPed)
SET_ENTITY_COORDS(trevorPed, GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_IN_WATER_INIT))
SET_ENTITY_HEADING(trevorPed, TREVOR_IN_WATER_INIT_ROT)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
SET_MICHAEL_AT_BRIDGE()
ENDIF
ENDIF
IF STREAMVOL_IS_VALID(bridgeVolume)
STREAMVOL_DELETE(bridgeVolume)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(wadePTFX)
STOP_PARTICLE_FX_LOOPED(wadePTFX)
ENDIF
START_DEBRIS_FX()
SET_DEBRIS_EVOLUTION(1)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAYFIRE)
IF gotoFoamState = GOTO_FOAM_STATE_WAITING
PRINTSTRING("here7") printnl()
IF IPL_GROUP_SWAP_IS_READY()
PRINTSTRING("here8") printnl()
IPL_GROUP_SWAP_FINISH()
ELSE
PRINTSTRING("here9") printnl()
IPL_GROUP_SWAP_CANCEL()
ENDIF
gotoFoamState = GOTO_FOAM_STATE_DONE
ENDIF
IF bSkippedCutscene
gotoFoamState = GOTO_FOAM_STATE_DONE
swapCarriageState = SWAP_CARRIAGE_STATE_DONE
IF gotoFoamState = GOTO_FOAM_STATE_WAITING
IPL_GROUP_SWAP_CANCEL()
ENDIF
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) <> RFMO_STATE_END
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_ENDING)
ENDIF
SET_TRAIN_CRASH_GEO(TRUE, TRUE, TRUE, DEFAULT, TRUE)
STOP_STREAM()
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
PAUSE_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
INT iWaitTime
iWaitTime = GET_GAME_TIMER()
WHILE (GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) <> RFMO_STATE_END
AND GET_GAME_TIMER() < iWaitTime + 4000)
OR GET_GAME_TIMER() < iWaitTime + 2000
WAIT(0)
ENDWHILE
ENDIF
IF bSkippedCutscene
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
WAIT(0)
ENDIF
ENDIF
ENDIF
PRINTSTRING("end time = ") PRINTINT(GET_GAME_TIMER() - iTrainCrashCutsceneTime) PRINTNL()
SET_TIME_SCALE(1.0)
// back to gameplay
SET_MISSION_CUTSCENE(FALSE)
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
bDoneJumpOff = TRUE
bShownSwitchPrompt = FALSE
SET_MISSION_STAGE(STAGE_GO_TO_CONTAINER)
BREAK
ENDSWITCH
//REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<-401.2, 4436.1, 30.7>>)
ENDPROC
// pick up the character who cut the brakes, then follow the train again
CONST_FLOAT CLOSE_TO_CRASH_Y 5800.0//5100.0
PROC DO_STAGE_GET_TO_BRIDGE()
HANDLE_MERC_PICKUP()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2159601
IF NOT bRunningCutscene
IF NOT bDoneJumpOff
IF IS_VEHICLE_DRIVEABLE(missionTrain)
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
VECTOR vTrainPos = GET_ENTITY_COORDS(missionTrain)
IF NOT bPreparedSwapToMichaelCue
bPreparedSwapToMichaelCue = PREPARE_MUSIC_EVENT("EXL3_SWITCH_1")
ENDIF
// handle swapping back and forth to train
SWITCH trainHotswapState
// on trevor - jump
CASE TRAIN_HOTSWAP_ON_TREVOR
UPDATE_TRAIN_FIRST_PERSON_CAM(FALSE)
DISABLE_SELECTOR_THIS_FRAME()
IF NOT bDoneRidingTrainSpeech
IF iReplayAttempt % 2 = 0
bDoneRidingTrainSpeech = DO_MISSION_SPEECH("EXL3_RADIO1")
ELSE
bDoneRidingTrainSpeech = DO_MISSION_SPEECH("EXL3_RADIO1b")
ENDIF
ENDIF
IF NOT bDoneAlmostThereSpeech
IF vTrainPos.y < 5922.0
AND vTrainPos.x < 983
bDoneAlmostThereSpeech = DO_MISSION_SPEECH("EXL3_NEARBRG")
IF bDoneAlmostThereSpeech
REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS
ENDIF
ENDIF
//PRINTSTRING("speed = ") PRINTFLOAT(fTrainCruiseSpeed) PRINTNL()
IF fTrainCruiseSpeed < 10.0
fTrainTooLowSpeedTime = fTrainTooLowSpeedTime +@ 1.0
IF fTrainTooLowSpeedTime >= 30.0
IF NOT bPreventMissionFail_SwitchCamDebug
// MISSION_FAILED(FAIL_TOO_LATE_BRIDGE)
ENDIF
ENDIF
ELSE
fTrainTooLowSpeedTime = fTrainTooLowSpeedTime -@ 1.0
IF fTrainTooLowSpeedTime < 0
fTrainTooLowSpeedTime = 0
ENDIF
ENDIF
IF vTrainPos.y < 5647.0
AND vTrainPos.x < 983
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
#IF IS_DEBUG_BUILD
OR bDebugJSkip
#ENDIF
IF CAN_ADVANCE_MISSION()
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
bDoneRidingTrainSpeech = TRUE
bSetToJump = FALSE
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RIDE_TRAIN)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL)
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
trainHotswapState = TRAIN_HOTSWAP_TO_MICHAEL
eSwitchCamState = SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_1
ENDIF
ENDIF
BREAK
// on michael - get to bridge
CASE TRAIN_HOTSWAP_ON_MICHAEL
fWaterOverride = fWaterOverride -@ 0.07
IF fWaterOverride < 0
fWaterOverride = 0
ENDIF
WATER_OVERRIDE_SET_STRENGTH(fWaterOverride)
IF IPL_GROUP_SWAP_IS_READY()
PRINTSTRING("ready!") PRINTNL()
ELSE
PRINTSTRING("not ready!") PRINTNL()
ENDIF
// handle prime rayfire
HANDLE_BRIDGE_RAYFIRE(FALSE)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
VECTOR vMichaelPos
vMichaelPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF NOT bLoadedCrashStream
bLoadedCrashStream = LOAD_STREAM("EXILE_3_DERAILED_TRAIN_CRASH_MASTER")
ENDIF
IF bCreatedCrashTrain
REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<-490.5, 4407.6, 30.4>>)
//IF vTrainPos.y < 4549
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) <> CAM_VIEW_MODE_FIRST_PERSON
FORCE_CHASE_HINT_CAM(localChaseHintCamStruct, TRUE)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_UD)
ENDIF
SET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct, 3000)
CONTROL_VEHICLE_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, missionTrain)
//ENDIF
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_PRIMED
IF NOT bDoneForceDinghyStop
IF vMichaelPos.y > 4402.55908
BRING_VEHICLE_TO_HALT(trainCrashVehicle[TCV_DINGHY], 45.0, -1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
bDoneForceDinghyStop = TRUE
ENDIF
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
ENDIF
ENDIF
ENDIF
//ENDIF
IF NOT bDoneGoingToCrashSpeech
IF vTrainPos.y < 4480
bDoneGoingToCrashSpeech = DO_MISSION_SPEECH("EXL3_GONCRSH", TRUE)
ENDIF
ENDIF
ELSE
IF GET_GAME_TIMER() >= iMichaelBoatStartTime + 100000
IF NOT bPreventMissionFail_SwitchCamDebug
MISSION_FAILED(FAIL_TOO_LATE_BRIDGE)
ENDIF
ENDIF
ENDIF
// stop playback on dinghy
IF NOT bStoppedPlaybackDinghy
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
bStoppedPlaybackDinghy = TRUE
ENDIF
ENDIF
IF NOT bPreparedSideOnCue
bPreparedSideOnCue = PREPARE_MUSIC_EVENT("EXL3_TUNNEL_EXIT")
ENDIF
IF NOT bCreatedCrashTrain
IF NOT bStartedIPLSwap
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_PRIMED
IPL_GROUP_SWAP_START("railing_start", "railing_end")
bStartedIPLSwap = TRUE
iStartIPLSwapTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<350,350,350>>, FALSE, FALSE)
IF NOT STREAMVOL_IS_VALID(bridgeVolume)
bridgeVolume = STREAMVOL_CREATE_FRUSTUM(<<-468.9, 4430.8, 85.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<8.9, -1.2, 110.6>>), 500, FLAG_MAPDATA)
ENDIF
ELSE
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<400,400,400>>, FALSE, FALSE)
IF STREAMVOL_IS_VALID(bridgeVolume)
STREAMVOL_DELETE(bridgeVolume)
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<265,265,265>>, FALSE, FALSE)
BOOL bForceTrain
bForceTrain = FALSE
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<150,150,150>>, FALSE, FALSE)
IF iBeenAtBridgeTime < 0
iBeenAtBridgeTime = GET_GAME_TIMER()
ELSE
PRINTSTRING("force train countdown = ") PRINTINT(GET_GAME_TIMER() - iBeenAtBridgeTime) PRINTNL()
IF GET_GAME_TIMER() >= iBeenAtBridgeTime + 10000
bForceTrain = TRUE
ENDIF
ENDIF
endif
IF (DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
AND (IPL_GROUP_SWAP_IS_READY() OR (bStartedIPLSwap AND GET_GAME_TIMER() >= iStartIPLSwapTime+5000)))
OR bForceTrain
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_PRIMED
OR bForceTrain
IF IS_VEHICLE_DRIVEABLE(missionTrain)
SET_MISSION_TRAIN_COORDS(missionTrain, <<-531.47, 4544.52, 87.7>>)
// lod distance
INT i
FOR i=0 TO 15
VEHICLE_INDEX thisCarriage
thisCarriage = GET_TRAIN_CARRIAGE(missionTrain, i)
IF IS_VEHICLE_DRIVEABLE(thisCarriage)
SET_ENTITY_LOD_DIST(thisCarriage, 500)
ENDIF
ENDFOR
ENDIF
//PREFETCH_SRL("ex3crash")
//SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
//IPL_GROUP_SWAP_START("railing_start", "railing_end")
CREATE_CRASH_TRAIN()
//IF NOT bForceTrain
//
//ENDIF
bCreatedCrashTrain = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bArrivedAtBridge
IF NOT bShownSwitchPrompt
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
//IF CAN_ADVANCE_MISSION()
// IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>, TRUE)
///ENDIF
IF NOT DOES_BLIP_EXIST(gotoBlip)
REMOVE_ALL_BLIPS()
REMOVE_MISSION_TEXT(FALSE)
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER))
ENDIF
IF NOT bShownGodText
bShownGodText = DO_MISSION_GOD_TEXT("TC_GOBRG")
ELSE
IF NOT bDoneRidingTrainSpeech2
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<400, 400, 20>>, FALSE, FALSE)
IF iReplayAttempt % 2 = 0
bDoneRidingTrainSpeech2 = DO_MISSION_SPEECH("EXL3_RADIO2")
ELSE
bDoneRidingTrainSpeech2 = DO_MISSION_SPEECH("EXL3_RADIO2b")
ENDIF
ENDIF
ELSE
BOOL bDoCollisionAudioScene
bDoCollisionAudioScene = FALSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 tCurrentLabel
tCurrentLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF ARE_STRINGS_EQUAL(tCurrentLabel, "EXL3_RADIO2_3")
OR ARE_STRINGS_EQUAL(tCurrentLabel, "EXL3_RADIO2b_3")
bDoCollisionAudioScene = TRUE
ENDIF
ELSE
bDoCollisionAudioScene = TRUE
ENDIF
IF bDoCollisionAudioScene
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_COLLISION)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// handle crash
IF vTrainPos.y < 4420
// run the crash cutscene at appropriate point
IF CAN_ADVANCE_MISSION()
bRunningCutscene = TRUE
ENDIF
bSelectorLocked = TRUE
ENDIF
BREAK
CASE TRAIN_HOTSWAP_TO_TREVOR
IF DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, FALSE, hotswapToTrainCamType)
SET_MISSION_CUTSCENE(TRUE)
REMOVE_ALL_BLIPS()
DISPLAY_RADAR(TRUE) // display the radar
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
ENDIF
BREAK
CASE TRAIN_HOTSWAP_TO_MICHAEL
DISABLE_SELECTOR_THIS_FRAME()
HANDLE_BRIDGE_RAYFIRE(FALSE)
//[SP] Fix for bug# 1571021 - "Cut to overhead switch intro shot contains a few weird in between frames" - (due to first person cam not updating)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
AND (eSwitchCamState = SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_1 OR bFromTrainSwitchFirstPerson)
UPDATE_TRAIN_FIRST_PERSON_CAM(FALSE)
ENDIF
IF NOT bDoneSwapToMichaelCue
IF bPreparedSwapToMichaelCue
bDoneSwapToMichaelCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_SWITCH_1")
ENDIF
ENDIF
IF NOT bCamHighEnoughToFreezeTrain
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
IF IS_PLAYER_SWITCH_IN_PROGRESS()
IF GET_PLAYER_SWITCH_JUMP_CUT_INDEX() = 2
WATER_OVERRIDE_SET_SHOREWAVEAMPLITUDE(0)
WATER_OVERRIDE_SET_SHOREWAVEMINAMPLITUDE(0)
WATER_OVERRIDE_SET_SHOREWAVEMAXAMPLITUDE(0)
WATER_OVERRIDE_SET_OCEANNOISEMINAMPLITUDE(0)
WATER_OVERRIDE_SET_OCEANWAVEAMPLITUDE(0)
WATER_OVERRIDE_SET_OCEANWAVEMINAMPLITUDE(0)
WATER_OVERRIDE_SET_OCEANWAVEMAXAMPLITUDE(0)
WATER_OVERRIDE_SET_RIPPLEBUMPINESS(0)
WATER_OVERRIDE_SET_RIPPLEMINBUMPINESS(0)
WATER_OVERRIDE_SET_RIPPLEMAXBUMPINESS(0)
WATER_OVERRIDE_SET_RIPPLEDISTURB(0)
WATER_OVERRIDE_SET_STRENGTH(fWaterOverride)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
printstring("bcamhigh") printnl()
bCamHighEnoughToFreezeTrain = TRUE
ENDIF
ENDIF
ENDIF
// start dinghy
IF NOT bStartedPlaybackDinghy
IF eSwitchCamState = SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_1
IF DOES_CAM_EXIST(scsSwitchCamTrainToBoat_Intro.ciSpline)
IF GET_CAM_SPLINE_PHASE(scsSwitchCamTrainToBoat_Intro.ciSpline) >= 0.8
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 001, GET_TRAIN_CRASH_RECORDING_PREFIX())
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], fRepositionBoatTime)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(trainCrashVehicle[TCV_DINGHY], (<<0.0, 0.0, 0.7>>))
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
bStoppedPlaybackDinghy = FALSE
bStartedPlaybackDinghy = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// trevor onto train
IF NOT bSetToJump
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
trainRideState = TRAIN_RIDE_STATE_HIGH
SET_TREVOR_READY_TO_JUMP(TRUE)
bSetToJump = TRUE
ENDIF
ENDIF
IF DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, FALSE, HOTSWAP_CAM_TRAIN_TO_BOAT, TRUE)
SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, FALSE, TRUE)
//IF bArrivedAtBridge
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
//ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REMOVE_PED_HELMET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
SET_ENTITY_VISIBLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_BRIDGE)
iMichaelBoatStartTime = GET_GAME_TIMER()
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
trainHotswapState = TRAIN_HOTSWAP_ON_MICHAEL
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ELSE
// doing the train crash cutscene
DO_TRAIN_CRASH_CUTSCENE()
ENDIF
ENDPROC
// set found bomb
PROC SET_FOUND_BOMB()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], TRUE)
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
ENDIF
IF DOES_BLIP_EXIST(containerBlip)
REMOVE_BLIP(containerBlip)
ENDIF
SET_NEXT_RANDOM_SPEECH_TIME(4000)
//REMOVE_ALL_BLIPS()
//bShownGodText = FALSE
bShownBombHelp = FALSE
bFoundBomb = TRUE
ENDPROC
// maintain trevor idle
PROC MAINTAIN_TREVOR_IDLE()
PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT IS_PED_INJURED(trevorPed)
SWITCH trevorIdleState
CASE TREVOR_IDLE_STATE_NOT_STARTED
IF trevorPed <> PLAYER_PED_ID()
IF GET_SCRIPT_TASK_STATUS(trevorPed, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
AND IS_ENTITY_AT_COORD(trevorPed, GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_SHOOTOUT_INIT), <<2,2,2>>)
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_ENTER), "enter", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
trevorIdleState = TREVOR_IDLE_STATE_ENTERING
ENDIF
ENDIF
BREAK
CASE TREVOR_IDLE_STATE_ENTERING
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_ENTER), "enter")
IF GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_ENTER), "enter") >= 0.98
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_BASE), "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
trevorIdleState = TREVOR_IDLE_STATE_BASE
ENDIF
ENDIF
BREAK
CASE TREVOR_IDLE_STATE_BASE
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_BASE), "base")
IF GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_BASE), "base") >= 0.95
AND GET_GAME_TIMER() >= iLastTrevorVariationTime + 20000
iLastTrevorVariationTime = GET_GAME_TIMER()
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_VAR), "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
trevorIdleState = TREVOR_IDLE_STATE_VAR
ENDIF
ENDIF
BREAK
CASE TREVOR_IDLE_STATE_VAR
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_VAR), "idle_a")
IF GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_VAR), "idle_a") >= 0.98
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_BASE), "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
trevorIdleState = TREVOR_IDLE_STATE_BASE
ENDIF
ENDIF
BREAK
CASE TREVOR_IDLE_STATE_CLEAR
IF NOT IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_VAR), "exit")
CLEAR_PED_TASKS(trevorPed)
trevorIdleState = TREVOR_IDLE_STATE_DONE
ENDIF
BREAK
ENDSWITCH
IF trevorIdleState = TREVOR_IDLE_STATE_BASE
OR trevorIdleState = TREVOR_IDLE_STATE_VAR
IF trevorPed = PLAYER_PED_ID()
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
//TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_EXIT), "exit", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
trevorIdleState = TREVOR_IDLE_STATE_DONE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// go to the container
PROC DO_STAGE_GO_TO_CONTAINER()
//HANDLE_CRATE_BOB()
//PRINTINT(GET_GAME_TIMER() - iCreatedWaveTime[EW_SHOOTOUT_FIRST_WAVE]) PRINTNL()
IF NOT bRunningCutscene
/*
IF IS_VEHICLE_DRIVEABLE(hangingCarriageVehicle)
SET_ENTITY_COORDS_NO_OFFSET(hangingCarriageVehicle, vHangingCarriagePos)
SET_ENTITY_ROTATION(hangingCarriageVehicle, vHangingCarriageRot)
FREEZE_ENTITY_POSITION(hangingCarriageVehicle, TRUE)
ENDIF
*/
/*
IF DOES_ENTITY_EXIST(doorsObject)
SET_ENTITY_COORDS_NO_OFFSET(doorsObject, vHangingCarriagePos)
SET_ENTITY_ROTATION(doorsObject, vHangingCarriageRot)
FREEZE_ENTITY_POSITION(doorsObject, TRUE)
ENDIF
*/
MAINTAIN_TREVOR_IDLE()
//PRINTVECTOR(GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])) printnl()
//PRINTVECTOR(GET_ENTITY_rotATION(trainCrashVehicle[TCV_DINGHY])) printnl()
IF NOT bRemovedStreamVol
IF GET_GAME_TIMER() >= iStageStartTime + 1000
IF STREAMVOL_IS_VALID(bridgeVolume)
STREAMVOL_DELETE(bridgeVolume)
ENDIF
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
bRemovedStreamVol = TRUE
ENDIF
ENDIF
IF NOT bRestoredControl
IF GET_GAME_TIMER() >= iStageStartTime + 1000
OR HAS_COLLISION_LOADED_AROUND_ENTITY(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
bRestoredControl = TRUE
ENDIF
ENDIF
// fail for going off waterfall
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
//VECTOR vDinghyCoords = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
//IF vDinghyCoords.x <= -542.30
//AND vDinghyCoords.z <= 22.97
// MISSION_FAILED(FAIL_CONTAINER_INACCESSIBLE)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_TRAIN_CRASH_VECTOR(TCVEC_CRASH), FALSE) >= 195
MISSION_FAILED(FAIL_ABANDONED_CONTAINER)
ENDIF
IF NOT bExplodedDoors
IF NOT IS_PED_INJURED(sSelectorpeds.pedID[SELECTOR_PED_TREVOR])
IF NOT IS_PED_HEADTRACKING_ENTITY(sSelectorpeds.pedID[SELECTOR_PED_TREVOR], PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sSelectorpeds.pedID[SELECTOR_PED_TREVOR], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
ENDIF
ENDIF
IF bShownGodText
IF NOT bDoneFindLootSpeech
IF DO_MISSION_SPEECH("EXL3_LOOT")
bDoneFindLootSpeech = TRUE
ENDIF
ELSE
IF NOT bTurnOffUnderwaterDialogue
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
ALLOW_DIALOGUE_IN_WATER(FALSE)
bTurnOffUnderwaterDialogue = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bFoundBomb
IF NOT bDoneEncourageOpenSpeech
IF NOT bDoMerryweatherMassacre
IF GET_GAME_TIMER() >= iStageStartTime + 500
AND NOT IS_PED_RAGDOLL(GET_TREVOR_PED())
IF DO_MISSION_SPEECH("EXL3_INST1")
bDoneEncourageOpenSpeech = TRUE
iEncourageOpenSpeechTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDoMerryweatherMassacre
IF NOT bShownGodText
IF DO_MISSION_GOD_TEXT("TC_DOBOMB", TRUE, FALSE, DEFAULT_GOD_TEXT_TIME + 2000)
iPromptedToBlowTime = GET_GAME_TIMER()
iOnFlatbedTime = GET_GAME_TIMER() + 200
bShownGodText = TRUE
ENDIF
ELSE
IF NOT bDoneThrowBombSpeech
IF IS_PED_SHOOTING(PLAYER_PED_ID())
WEAPON_TYPE weapon
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
IF weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
bDoneThrowBombSpeech = DO_MISSION_SPEECH("EXL3_BOMB")
ENDIF
ENDIF
ENDIF
IF NOT bDoneFirstHurryUpSpeech
IF GET_GAME_TIMER() >= iOnFlatbedTime + 20000
IF DO_MISSION_SPEECH("EXL3_DOOPEN")
bDoneFirstHurryUpSpeech = TRUE
SET_NEXT_RANDOM_SPEECH_TIME()
ENDIF
ENDIF
ELSE
DO_RANDOM_SPEECH("EXL3_HIT")
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_BLIP_EXIST(containerBlip)
AND NOT bDoMerryweatherMassacre
CREATE_CONTAINER_BLIP()
ENDIF
// bomb help text
WEAPON_TYPE weapon
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLP3")
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
CLEAR_HELP(FALSE)
iClearHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_CYCLEW")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLP")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLPB")
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
CLEAR_HELP(FALSE)
iClearHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
IF NOT bShownBombHelp
IF NOT bFoundBomb
IF weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
bDoneSwitchToBombHelp = TRUE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_CYCLEW")
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
CLEAR_HELP(FALSE)
iClearHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
IF GET_GAME_TIMER() >= iOnFlatbedTime
AND NOT bDoMerryweatherMassacre
bDoneSwitchToBombHelp = TRUE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT GET_IS_USING_ALTERNATE_DRIVEBY()
IF DO_MISSION_HELP_TEXT("TC_BMBHLP", FALSE, 13000)
bShownBombHelp = TRUE
iBombHelpTime = GET_GAME_TIMER()
ENDIF
ELSE
IF DO_MISSION_HELP_TEXT("TC_BMBHLPB", FALSE, 13000)
bShownBombHelp = TRUE
iBombHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
IF DO_MISSION_HELP_TEXT("TC_BMBHLP3", FALSE, 13000)
bShownBombHelp = TRUE
iBombHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ELSE
IF weapon <> GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
IF NOT bDoneSwitchToBombHelp
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_GAME_TIMER() >= iEncourageOpenSpeechTime + 2000
IF bDoneEncourageOpenSpeech
AND NOT bDoMerryweatherMassacre
bDoneSwitchToBombHelp = DO_MISSION_HELP_TEXT("TC_CYCLEW", FALSE, 13000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLP")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLPB")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLP3")
IF (weapon <> GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
AND GET_GAME_TIMER() >= iBombHelpTime + 6000)
OR (IS_ENTITY_IN_WATER(PLAYER_PED_ID()) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
CLEAR_HELP(FALSE)
iClearHelpTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-492.590, 4433.520, 29.800>>, <<-491.360, 4436.400, 32.700>>, 1.5)
AND NOT IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_MOLOTOV, <<-492.590, 4433.520, 29.800>>, <<-491.360, 4436.400, 32.700>>, 1.5)
AND NOT IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_BZGAS, <<-492.590, 4433.520, 29.800>>, <<-491.360, 4436.400, 32.700>>, 1.5)
SET_FOUND_BOMB()
bShownBombHelp = TRUE
bForceDoorsOpen = TRUE
ELIF IS_PROJECTILE_TYPE_IN_ANGLED_AREA(<<-492.590, 4433.520, 29.800>>, <<-491.360, 4436.400, 32.700>>, 1.5, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB), TRUE)
IF iFoundBombTime < 0
iFoundBombTime = GET_GAME_TIMER()
eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS
HANDLE_SWITCH_CAM_MICHAEL_TO_TREVOR_CONTAINER(scsSwitchCamMichealToTrevorContainer)
ELSE
IF GET_GAME_TIMER() >= iFoundBombTime + 200//800
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
CLEAR_HELP(FALSE)
iClearHelpTime = GET_GAME_TIMER()
ENDIF
SET_FOUND_BOMB()
ENDIF
ENDIF
ELSE
iFoundBombTime = -1
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)) = 0
IF iNoBombsTime < 0
iNoBombsTime = GET_GAME_TIMER()
ELSE
IF GET_GAME_TIMER() >= iNoBombsTime + 3000
IF NOT bDoMerryweatherMassacre
MISSION_FAILED(FAIL_NO_STICKY_BOMBS)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
IF NOT bDoMerryweatherMassacre
IF DOES_BLIP_EXIST(vehicleBlip)
//REMOVE_ALL_BLIPS()
REMOVE_BLIP(vehicleBlip)
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
ENDIF
ENDIF
//IF NOT DOES_BLIP_EXIST(containerBlip)
// REMOVE_ALL_BLIPS()
// REMOVE_MISSION_TEXT(FALSE)
// CREATE_CONTAINER_BLIP()
//ENDIF
IF NOT bDoMerryweatherMassacre
DO_RANDOM_SPEECH("EXL3_HURRY2")
ENDIF
IF NOT bShownBombHelp
IF NOT bDoMerryweatherMassacre
bShownBombHelp = DO_MISSION_HELP_TEXT("TC_BMBHLP2")
ENDIF
ENDIF
//ENDIF
ENDIF
ENDIF
IF NOT bExplodedDoors
AND bFoundBomb
AND NOT bDoMerryWeatherMassacre
//IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-492.590, 4433.520, 29.400>>, <<-491.360, 4436.400, 32.900>>, 2.4)
//ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
IF NOT IS_CUSTOM_MENU_ON_SCREEN()
IF IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
OR bForceDoorsOpen
// CLEAR_AREA_OF_PROJECTILES(<<-492.590, 4433.520, 29.400>>, 2.4)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
EXPLODE_PROJECTILES(PLAYER_PED_ID(), GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB), TRUE)
CLEAR_HELP(FALSE)
ALLOW_DIALOGUE_IN_WATER(FALSE)
//REMOVE_ALL_BLIPS()
bForceIntoDinghy = FALSE
bShownGodText = FALSE
bExplodedDoors = TRUE
iExplodedDoorsTime = GET_GAME_TIMER()
eSwitchCamState = SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_CONTAINER_SPLINE
// DO_DOORS_BLOW_OPEN()
bHasContainerSwitchCamExplosionHappened = FALSE
ENDIF
ENDIF
//STOP_GAMEPLAY_HINT_BEING_CANCELLED_THIS_UPDATE(TRUE)
ENDIF
IF bExplodedDoors
INT iExplodeWaitTime
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-490.46805, 4434.51855, 30.25891>>, <<6,6,6>>)
iExplodeWaitTime = 100
ELSE
iExplodeWaitTime = 0
ENDIF
IF GET_GAME_TIMER() > iExplodedDoorsTime + iExplodeWaitTime
IF NOT bDoneSwapToTrevorCue
bDoneSwapToTrevorCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_FIGHT_START")
PRINTSTRING("started fight cue!") PRINTNL()
ENDIF
IF NOT bSwappedToTrevor
IF NOT bContainerSwitchFirstPerson
IF NOT bSwappedDoors
IF DOES_ENTITY_EXIST(doorsObject)
IF IS_ENTITY_PLAYING_ANIM(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s")
PRINTSTRING("phase ") printfloat(GET_ENTITY_ANIM_CURRENT_TIME(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s") ) printnl()
IF GET_ENTITY_ANIM_CURRENT_TIME(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s") >= 0.63
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
CREATE_OPEN_DOORS()
bSwappedDoors = TRUE
ENDIF
ENDIF
ENDIF
ELSE
STOP_FIRE_IN_RANGE(<<-491.2, 4435.3, 31.7>>, 5)
REMOVE_DECALS_IN_RANGE(<<-491.2, 4435.3, 31.7>>, 5)
ENDIF
ENDIF
IF NOT bDoMerryweatherMassacre
//AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CAN_ADVANCE_MISSION()
IF (HANDLE_SWITCH_CAM_MICHAEL_TO_TREVOR_CONTAINER(scsSwitchCamMichealToTrevorContainer)
OR (eSwitchCamState = SWITCH_CAM_IDLE AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR))
AND streamingStage = MISSION_STREAMING_STAGE_COMPLETE
//gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_TAKE_COVER))
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_PLANT_BOMB)
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL)
REMOVE_ALL_BLIPS()
GIVE_PED_SNIPER_RIFLE_FOR_SHOOTOUT(PLAYER_PED_ID())
iSwappedToTrevorTime = GET_GAME_TIMER()
bSwappedToTrevor = TRUE
bTrevorSetupAfterContainerSwitch = FALSE
ELSE
//[MF] Stop the look at container gameplay hint cam
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
IF NOT bHasContainerSwitchCamExplosionHappened
IF bContainerSwitch_ExplosionHappened
REPLAY_RECORD_BACK_FOR_TIME(10.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
DO_DOORS_BLOW_OPEN()
KILL_ANY_CONVERSATION()
bHasContainerSwitchCamExplosionHappened = TRUE
bMichaelSearchAnimStarted = FALSE
ENDIF
ENDIF
IF NOT bRepositionedDinghy
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCamMichealToTrevorContainer.ciSpline) > iSwitchCam_Explosion_StartBoatMoveNode
//REPOSITION_DINGHY()
DRIVE_BOAT_TO_COINTAINER()
//CREATE_DEBRIS()
bRepositionedDinghy = TRUE
ENDIF
ENDIF
ENDIF
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCamMichealToTrevorContainer.ciSpline) >= scsSwitchCamMichealToTrevorContainer.iCamSwitchFocusNode
DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, TRUE, HOTSWAP_CAM_DEFAULT, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
ENDIF
ENDIF
IF NOT bTrevorSetupAfterContainerSwitch
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCamMichealToTrevorContainer.ciSpline) > 0
SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON)
CLEAR_PED_TASKS_IMMEDIATELY(GET_TREVOR_PED())
CLEAR_PED_SECONDARY_TASK(GET_TREVOR_PED())
TASK_CLEAR_LOOK_AT(GET_TREVOR_PED())
trevorIdleState = TREVOR_IDLE_STATE_DONE
//WAIT(0)
SET_ENTITY_COORDS(GET_TREVOR_PED(), (<<-485.34943, 4399.22656, 29.37477>>))
SET_ENTITY_HEADING(GET_TREVOR_PED(), 5.16)
//CLEAR_PED_TASKS_IMMEDIATELY(GET_TREVOR_PED())
//CLEAR_PED_SECONDARY_TASK(GET_TREVOR_PED())
EQUIP_BEST_PED_WEAPON(GET_TREVOR_PED(), TRUE)
TASK_PLAY_ANIM(GET_TREVOR_PED(), GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_SWITCH), "ig_14_switch_mic_to_trev", INSTANT_BLEND_IN, -3, -1, AF_DEFAULT, 0.07)
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_TREVOR_PED())
bTrevorSetupAfterContainerSwitch = TRUE
ENDIF
ELSE
IF eSwitchCamState < SWITCH_CAM_RETURN_TO_GAMEPLAY
SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON)
ENDIF
//SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
IF NOT bDoneHurrySpeech
BOOL bDoDialogue
bDoDialogue = FALSE
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
IF GET_CAM_SPLINE_PHASE(scsSwitchCamMichealToTrevorContainer.ciSpline) >= fContainerSwitch_StartTrevDialogue
AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
AND IS_ENTITY_ON_SCREEN(PLAYER_PED_ID())
bDoDialogue = TRUE
ENDIF
ELSE
bDoDialogue = TRUE
ENDIF
IF bDoDialogue
INT iLine
SWITCH GET_RANDOM_INT_IN_RANGE(0,3)
CASE 0
iLine = 1
BREAK
CASE 1
iLine = 3
BREAK
CASE 2
iLine = 5
BREAK
ENDSWITCH
CDEBUG3LN(DEBUG_MISSION, "Playing Dialogue: EXL3_SWITCH3 Line: ", iLine)
bDoneHurrySpeech = DO_MISSION_SPEECH("EXL3_SWITCH3", FALSE, iLine)
ENDIF
ENDIF
ENDIF
/*
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT bRepositionedDinghy
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCamMichealToTrevorContainer.ciSpline) > scsSwitchCamMichealToTrevorContainer.iCamSwitchFocusNode
REPOSITION_DINGHY()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
*/
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDonePushIn
IF IS_GAMEPLAY_CAM_RENDERING()
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
SET_CAM_ACTIVE(scsSwitchCamMichealToTrevorContainer.ciSpline, FALSE)
DESTROY_CAM(scsSwitchCamMichealToTrevorContainer.ciSpline)
ENDIF
DESTROY_ALL_CAMS()
IF NOT bPlayerControlGiven
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
bPlayerControlGiven = TRUE
ENDIF
bDonePushIn = TRUE
ENDIF
ENDIF
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_FIRST_WAVE]
IF GET_GAME_TIMER() >= iSwappedToTrevorTime + 5000
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE, FALSE, STAGE_GO_TO_CONTAINER)
bTriggeredEnemyWave[EW_SHOOTOUT_FIRST_WAVE] = TRUE
ENDIF
ELSE
HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE)
ENDIF
HANDLE_RIFLE_THERMAL()
IF NOT bPreparedEnemiesArriveCue
IF bDoneSwapToTrevorCue
bPreparedEnemiesArriveCue = PREPARE_MUSIC_EVENT("EXL3_FIGHT_OS")
ENDIF
ENDIF
IF NOT bDoneHurrySpeech
// bDoneHurrySpeech = DO_MISSION_SPEECH("EXL3_INST2")
bDoneHurrySpeech = TRUE
ELSE
IF NOT bDoneMichaelSearchSpeech
bDoneMichaelSearchSpeech = DO_MISSION_SPEECH("EXL3_SCORE")
ENDIF
ENDIF
IF NOT bTrevorEquippedWeapon
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_SWITCH), "ig_14_switch_mic_to_trev")
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE)
EQUIP_BEST_PED_WEAPON(GET_TREVOR_PED(), FALSE)
bTrevorEquippedWeapon = TRUE
ENDIF
ENDIF
ENDIF
IF bMichaelSearchAnimStarted
BOOL bAdvanceStage
bAdvanceStage = FALSE
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= SKIP_MICHAEL_INTO_CONTAINER_PHASE
bAdvanceStage = TRUE
ENDIF
ELSE
bAdvanceStage = TRUE
ENDIF
IF bAdvanceStage
AND bTriggeredEnemyWave[EW_SHOOTOUT_FIRST_WAVE]
IF NOT bDoneEnemiesArriveCue
IF bPreparedEnemiesArriveCue
bDoneEnemiesArriveCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_FIGHT_OS")
ENDIF
ENDIF
iFoundUsSpeechTime = GET_GAME_TIMER() + 600
SET_MISSION_STAGE(STAGE_STEAL_FROM_CONTAINER, FALSE, FALSE, FALSE, FALSE)
ENDIF
ELSE
IF HAS_BOAT_DRIVEN_TO_CONTAINER()
STOP_FIRE_IN_RANGE(<<-490.79904, 4434.35205, 30.44730>>, 3)
REPOSITION_DINGHY()
SET_MICHAEL_STEP_INTO_CONTAINER(FALSE)
bMichaelSearchAnimStarted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bDoMerryweatherMassacre
OR NOT bExplodedDoors
// merryweather come in and massacre you.
IF NOT bDoMerryweatherMassacre
VECTOR vMurderCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF GET_GAME_TIMER() >= iPromptedToBlowTime + 80000
AND bDoneFindLootSpeech
AND vMurderCoords.x < -379.5
AND NOT IS_SPHERE_VISIBLE(<<-341.46375, 4425.03906, 30.61806>>, 50.0)
AND NOT IS_SPHERE_VISIBLE(<<-35, 4136, 61>>, 70.0)
REMOVE_ALL_BLIPS()
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(GET_TREVOR_PED(), FALSE)
ENDIF
bDoMerryweatherMassacre = TRUE
ENDIF
ELSE
IF NOT bCreatedMerryweatherMassacre
IF streamingStage = MISSION_STREAMING_STAGE_COMPLETE
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE, FALSE, STAGE_GO_TO_CONTAINER)
bCreatedMerryweatherMassacre = TRUE
iCreateMerryweatherMassacreTime = GET_GAME_TIMER()
ENDIF
ELSE
IF NOT bDoneFoundUsSpeech
bDoneFoundUsSpeech = DO_MISSION_SPEECH("EXL3_MEHERE")
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
AND NOT IS_PED_INJURED(enemyPed[0].ped)
TASK_SHOOT_AT_ENTITY(GET_TREVOR_PED(), enemyPed[0].ped, -1, FIRING_TYPE_RANDOM_BURSTS)
ENDIF
ENDIF
IF NOT HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE)
OR GET_GAME_TIMER() >= iCreateMerryweatherMassacreTime + 10000
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
APPLY_DAMAGE_TO_PED(GET_TREVOR_PED(), 1000, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/*
// cleanup find item cutscene
PROC CLEANUP_FIND_ITEM_CUTSCENE()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_POS), GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_ROT))
//ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, trainCrashVehicle[TCV_DINGHY], 0)
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_CARRY_CASE_MICHAEL", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, blockingAllRagdoll)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.6)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
CREATE_CASE(CASE_IN_HAND_ANIM)
ENDIF
// get rid of bad guys
INT i
REPEAT COUNT_OF(enemyPed) i
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
DELETE_PED(enemyPed[i].ped)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(enemyVehicle) i
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
DELETE_VEHICLE(enemyVehicle[i].veh)
ENDIF
ENDREPEAT
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
IF bSkippedCutscene
WAIT(500)
ENDIF
SET_MISSION_CUTSCENE(FALSE)
bDoneFoundItem = TRUE
ENDPROC
// end cutscene
PROC DO_FIND_ITEM_CUTSCENE()
SWITCH cutsceneStage
CASE TC_CUT_STAGE_INIT
SET_MISSION_CUTSCENE(TRUE)
// clear the area
CLEAR_AREA(GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_IN_CONTAINER), 4.0, TRUE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
START_CUTSCENE()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
cutsceneStage = TC_CUT_STAGE_RUNNING
BREAK
CASE TC_CUT_STAGE_RUNNING
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF WAS_CUTSCENE_SKIPPED()
bSkippedCutscene = TRUE
ENDIF
CLEANUP_FIND_ITEM_CUTSCENE()
ENDIF
#IF IS_DEBUG_BUILD
DEBUG_SKIP_MOCAP()
#ENDIF
BREAK
CASE TC_CUT_STAGE_CLEANUP
BREAK
ENDSWITCH
ENDPROC
*/
PROC SET_TREVOR_BOAT_HELMET()
IF GET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD) < 0
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P2_CRASH_HELMET, FALSE)
bSetTrevorHelmet = TRUE
ENDIF
RELEASE_PED_PRELOAD_PROP_DATA(PLAYER_PED_ID())
ENDPROC
// waterfall cutaway procedure
PROC DO_WATERFALL_CUTSCENE()
PED_INDEX trevorPed = GET_TREVOR_PED()
SWITCH cutsceneStage
CASE TC_CUT_STAGE_INIT
SET_MISSION_CUTSCENE(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE)
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
//DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(20, TRUE)
CLEAR_AREA(<<-592.17896, 4420.87158, 14.71700>>, 28, TRUE)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 004, GET_TRAIN_CRASH_RECORDING_PREFIX())
SET_PLAYBACK_SPEED(trainCrashVehicle[TCV_DINGHY], 0.75)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 4300)//4300)//4300)//3100)//6550)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(2.0)
INT i
REPEAT COUNT_OF(enemyPed) i
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
SET_ENTITY_VISIBLE(enemyPed[i].ped, FALSE)
SET_ENTITY_COLLISION(enemyPed[i].ped, FALSE)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(enemyVehicle) i
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
SET_ENTITY_VISIBLE(enemyVehicle[i].veh, FALSE)
SET_ENTITY_COLLISION(enemyVehicle[i].veh, FALSE)
ENDIF
ENDREPEAT
/*
REPEAT NUMBER_DEBRIS i
IF DOES_ENTITY_EXIST(debris[i].obj)
SET_ENTITY_VISIBLE(debris[i].obj, FALSE)
SET_ENTITY_COLLISION(debris[i].obj, FALSE)
ENDIF
ENDREPEAT
*/
//DELETE_ALL_ENEMIES()
//REMOVE_CRATES_INSIDE_TRAINCAR()
//INT i
//REPEAT NUMBER_DEBRIS i
// IF DOES_ENTITY_EXIST(debris[i].obj)
// DELETE_OBJECT(debris[i].obj)
// ENDIF
//ENDREPEAT
IF NOT IS_PED_INJURED(trevorPed)
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_TREVOR_LOOK_DINGHY", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE, 0.15)
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
ENDIF
CREATE_ENEMY_WAVE(EW_CHASE_FIRST_BOAT_WAVE, TRUE, STAGE_STEAL_FROM_CONTAINER)
IF NOT bDoneRapidsStartCue
IF bPreparedRapidsStartCue
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_START")
ENDIF
ENDIF
iDelete = 0
// position
//CREATE_CAM_FOR_TRAIN_CRASH_SHOT(TC_SHOT_WATERFALL, TRUE, 6000)//2700)
//iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-538.897, 4421.800, 28.188>>, <<0,0,2.0>>)
//CREATE_MISSION_ANIM_CAM(TRUE, TRUE)
//PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "WATERFALL_JUMP_CAM", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN))
CREATE_CAM_FOR_TRAIN_CRASH_SHOT(TC_SHOT_WATERFALL, TRUE, 6000)
IF LOAD_STREAM("Boats_Jump", "EXILE_3_SOUNDS")
PLAY_STREAM_FRONTEND()
ENDIF
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iTrainCrashCutsceneTime = GET_GAME_TIMER()
cutsceneStage = TC_CUT_STAGE_RUNNING
BREAK
CASE TC_CUT_STAGE_RUNNING
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
IF iDelete < COUNT_OF(enemyPed)
IF INT_TO_ENUM(ENEMY_PED_ENUM, iDelete) <= EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
IF DOES_ENTITY_EXIST(enemyPed[iDelete].ped)
DELETE_PED(enemyPed[iDelete].ped)
ENDIF
ENDIF
ENDIF
IF iDelete < COUNT_OF(enemyVehicle)
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, iDelete) <= EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
IF DOES_ENTITY_EXIST(enemyVehicle[iDelete].veh)
DELETE_VEHICLE(enemyVehicle[iDelete].veh)
ENDIF
ENDIF
ENDIF
/*
IF iDelete < COUNT_OF(debris)
IF DOES_ENTITY_EXIST(debris[iDelete].obj)
DELETE_OBJECT(debris[iDelete].obj)
ENDIF
ENDIF
*/
IF iDelete < COUNT_OF(crateBob)
IF DOES_ENTITY_EXIST(crateBob[iDelete].obj)
DELETE_OBJECT(crateBob[iDelete].obj)
ENDIF
ENDIF
iDelete++
IF NOT bDoneBoatHitWaterSound
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
IF GET_TIME_POSITION_IN_RECORDING(trainCrashVehicle[TCV_DINGHY]) >= 6215
PLAY_SOUND_FROM_ENTITY(-1, "BOAT_WAVE_HIT_SCRIPT", trainCrashVehicle[TCV_DINGHY])
bDoneBoatHitWaterSound = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR vDinghyPos
IF NOT bDoneWaterTrail[0]
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
vDinghyPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
IF vDinghyPos.y > 0
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_ex3_water_dinghy_wash", trainCrashVehicle[TCV_DINGHY], <<0,0,0>>, <<0,0,0>>, 1.0)
bDoneWaterTrail[0] = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bDoneWaterTrail[1]
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
vDinghyPos = GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
IF vDinghyPos.x < -541.0745
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_ex3_water_dinghy_wash", enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, <<0,0,0>>, <<0,0,0>>, 1.0)
bDoneWaterTrail[1] = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bDoneWaterTrail[2]
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
vDinghyPos = GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF vDinghyPos.x < -540.7183
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_ex3_water_dinghy_wash", enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, <<0,0,0>>, <<0,0,0>>, 1.0)
bDoneWaterTrail[2] = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bDoneSetTrevorHelmetSpeech
IF GET_GAME_TIMER() >= (iTrainCrashCutsceneTime + 200)
bDoneSetTrevorHelmetSpeech = DO_MISSION_SPEECH("EXL3_PANIC")
ENDIF
ENDIF
IF NOT bSetTrevorHelmet
IF GET_GAME_TIMER() >= (iTrainCrashCutsceneTime + 2500)
SET_TREVOR_BOAT_HELMET()
ENDIF
ENDIF
IF GET_GAME_TIMER() >= (iTrainCrashCutsceneTime + 5000)//3100) // 3000
cutsceneStage = TC_CUT_STAGE_CLEANUP
ENDIF
HANDLE_SKIP_CUTSCENE()
BREAK
CASE TC_CUT_STAGE_CLEANUP
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
IF NOT IS_PED_INJURED(trevorPed)
CLEAR_PED_TASKS(trevorPed)
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
IF bSkippedCutscene
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], SKIP_REC_AFTER_WATERFALL - GET_TIME_POSITION_IN_RECORDING(trainCrashVehicle[TCV_DINGHY]))
WAIT(0)
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, 009, GET_TRAIN_CRASH_RECORDING_PREFIX())
SET_PLAYBACK_SPEED(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, 0.96)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, 3300)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, 016, GET_TRAIN_CRASH_RECORDING_PREFIX())
SET_PLAYBACK_SPEED(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, 1.0)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, 4600)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, FALSE)
ENDIF
IF bSkippedCutscene
SET_TREVOR_BOAT_HELMET()
ENDIF
// back to gameplay
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
CLEAR_PED_TASKS(PLAYER_PED_ID())
ELSE
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(20)
ENDIF
SET_MISSION_CUTSCENE(FALSE)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-5)
ELSE
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
ENDIF
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
SET_MISSION_STAGE(STAGE_RAPIDS_CHASE)
//CREATE_ENEMY_WAVE(EW_CHASE_FIRST_BOAT_WAVE, TRUE, STAGE_RAPIDS_CHASE)
REPLAY_STOP_EVENT()
STOP_STREAM()
HANDLE_BOAT_RPG(TRUE)
bTriggeredEnemyWave[EW_CHASE_FIRST_BOAT_WAVE] = TRUE
bDoneWaterfallCutaway = TRUE
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_PLAYER_AT_ISLAND()
RETURN IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<-542.34875, 4300.08887, 61.29320>>, <<-450.49066, 4419.17041, 29.99992>>, FALSE, FALSE)
ENDFUNC
PROC PULL_BOAT_AWAY_FROM_CONTAINER()
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 014, GET_TRAIN_CRASH_RECORDING_PREFIX())
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 700)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
ENDPROC
// steal from the container
PROC DO_STAGE_STEAL_FROM_CONTAINER()
INT i
HANDLE_CRATE_BOB()
//HANDLE_DEBRIS()
HANDLE_RIFLE_THERMAL()
SET_PLAYER_LOCKON_RANGE_OVERRIDE(PLAYER_ID(), 120)
IF NOT bRunningCutscene
// PRINTINT(GET_GAME_TIMER() - iShootoutStartTime) PRINTNL()
// PRINTINT(GET_GAME_TIMER() - iCarriageFallTime) PRINTNL()
//PRINTINT(GET_GAME_TIMER() - iCreatedWaveTime[EW_SHOOTOUT_FIRST_WAVE]) PRINTNL()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE) >= ABANDON_BUDDY_FAIL_RANGE
MISSION_FAILED(FAIL_ABANDONED_TREVOR)
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE) >= ABANDON_BUDDY_FAIL_RANGE
MISSION_FAILED(FAIL_ABANDONED_MICHAEL)
ENDIF
ENDIF
ENDIF
IF NOT bReadyToEscape
IF NOT bDoneFoundUsSpeech
IF GET_GAME_TIMER() >= iFoundUsSpeechTime
bDoneFoundUsSpeech = DO_MISSION_SPEECH("EXL3_MEHERE")
ENDIF
ELSE
IF NOT bShownGodText
bShownGodText = DO_MISSION_GOD_TEXT("TC_KEEPOFF")
ENDIF
ENDIF
ENDIF
IF NOT bSetupMichaelForShootout
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_DIES_IN_WATER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
bSetupMichaelForShootout = TRUE
ENDIF
ENDIF
// carriage fall
IF IS_VEHICLE_DRIVEABLE(hangingCarriageVehicle)
IF NOT bDoneCarriageFall
IF GET_GAME_TIMER() >= iShootoutStartTime + 15000
IF IS_ENTITY_ON_SCREEN(hangingCarriageVehicle)
AND NOT IS_ENTITY_OCCLUDED(hangingCarriageVehicle)
fHangingCarriageOnScreenTime = fHangingCarriageOnScreenTime +@ 1.0
IF fHangingCarriageOnScreenTime >= 2.0
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL)
FREEZE_ENTITY_POSITION(hangingCarriageVehicle, FALSE)
PLAY_SOUND_FROM_ENTITY(-1, "EXILE_3_TRAIN_FALL_MASTER", hangingCarriageVehicle)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(hangingCarriageVehicle, APPLY_TYPE_IMPULSE, <<0,0,-1>>, 0, FALSE, TRUE)
bDoneCarriageFall = TRUE
ENDIF
ELSE
fHangingCarriageOnScreenTime = 0.0
ENDIF
ENDIF
ELSE
IF NOT bDoneCarriageExplosion
VECTOR vCarriagePos = GET_ENTITY_COORDS(hangingCarriageVehicle)
// blow up chopper if touching
IF NOT IS_ENTITY_DEAD(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
IF IS_ENTITY_TOUCHING_ENTITY(hangingCarriageVehicle, enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
EXPLODE_VEHICLE(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
bExplodedChopperFromCarriage = TRUE
ENDIF
ENDIF
IF vCarriagePos.z < 41
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(hangingCarriageVehicle)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL)
ADD_EXPLOSION(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hangingCarriageVehicle, <<0,-7,0>>), EXP_TAG_HI_OCTANE, 3.0)
bDoneCarriageExplosion = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bDoneCarriageSplash
VECTOR vPos = GET_ENTITY_COORDS(hangingCarriageVehicle)
IF vPos.z < 31.2
vPos.z = 29.9
// new ptfx
IF NOT bExplodedChopperFromCarriage
START_PARTICLE_FX_NON_LOOPED_AT_COORD("ent_ray_train_splash", vPos, <<0,0,0>>, 1.0)
ENDIF
bDoneCarriageSplash = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// handle enemies
// 1st wave
bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE)
HANDLE_SHOOTOUT_BOAT_SPEEDS()
// chopper 1 audio
IF NOT bStartedChopper1AudioScene
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
INT iSceneTime
IF NOT bJumpedToShootout
iSceneTime = 23500
ELSE
iSceneTime = 16000
ENDIF
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FIRST_WAVE] + iSceneTime
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_1)
bStartedChopper1AudioScene = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bRemovedChopper1Audio
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
//REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
bRemovedChopper1Audio = TRUE
ENDIF
ENDIF
// up boat accuracy
IF NOT bIncreasedBoatAccuracy
AND NOT bUppedAccuracyForCircle
IF GET_GAME_TIMER() >= iStageStartTime + 30000
FOR i=EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER TO EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
IF NOT IS_PED_INJURED(enemyPed[i].ped)
SET_PED_ACCURACY(enemyPed[i].ped, 8)
ENDIF
ENDFOR
bIncreasedBoatAccuracy = TRUE
ENDIF
ENDIF
// try and push dead boats over waterfall
FOR i=EV_SHOOTOUT_FIRST_WAVE_BOAT_1 TO EV_SHOOTOUT_FIRST_WAVE_BOAT_3
ENEMY_VEHICLE_ENUM thisBoat = INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[thisBoat].veh)
IF enemyVehicle[thisBoat].bOccupantsDead
VECTOR vBoatCoords = GET_ENTITY_COORDS(enemyVehicle[thisBoat].veh)
IF vBoatCoords.z < 22.4
SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyVehicle[thisBoat].veh)
ELSE
IF IS_ENTITY_IN_AREA(enemyVehicle[thisBoat].veh, <<-505.47385, 4400.38330, 27.99983>>, <<-481.51172, 4410.57764, 34.99983>>)
APPLY_FORCE_TO_ENTITY(enemyVehicle[thisBoat].veh, APPLY_TYPE_EXTERNAL_FORCE, <<-0.2,1.0,1>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
ELSE
APPLY_FORCE_TO_ENTITY(enemyVehicle[thisBoat].veh, APPLY_TYPE_EXTERNAL_FORCE, <<-0.16,0.35,1>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
//IF NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped)
// SET_VEHICLE_SHOOT_AT_TARGET(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped, NULL, <<0,0,0>>)
//ENDIF
INT iFirstWavePedsLeft = 0
FOR i = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER TO EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
IF NOT IS_PED_INJURED(enemyPed[i].ped)
iFirstWavePedsLeft++
ENDIF
ENDFOR
IF NOT bDoLastBoatCircle
// horrible but game needs done
IF (IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR].ped))
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER].ped)
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR].ped)
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR].ped, PCF_PreventAutoShuffleToDriversSeat, FALSE)
ENDIF
bDoLastBoatCircle = TRUE
ELIF (IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR].ped))
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER].ped)
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR].ped)
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR].ped, PCF_PreventAutoShuffleToDriversSeat, FALSE)
ENDIF
bDoLastBoatCircle = TRUE
ELIF (IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR].ped))
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER].ped)
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR].ped)
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR].ped, PCF_PreventAutoShuffleToDriversSeat, FALSE)
ENDIF
bDoLastBoatCircle = TRUE
ENDIF
ENDIF
IF NOT bUppedAccuracyForCircle
IF bDoLastBoatCircle
FOR i=EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER TO EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
IF NOT IS_PED_INJURED(enemyPed[i].ped)
SET_PED_ACCURACY(enemyPed[i].ped, 14)
ENDIF
ENDFOR
printstring("upped accuracy!") printnl()
bUppedAccuracyForCircle = TRUE
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
OR iFirstWavePedsLeft > 2
OR bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE]
iCreateSnipersTime = GET_GAME_TIMER() + 3000
ENDIF
// START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE)
// 2nd wave
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE]
//IF GET_GAME_TIMER() >= iShootoutStartTime + 21000
IF iFirstWavePedsLeft < 4
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
#ENDIF
CREATE_ENEMY_WAVE(EW_SHOOTOUT_SECOND_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE] = TRUE
bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE] = TRUE
ENDIF
ELSE
bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_SECOND_WAVE)
IF NOT bStartedChopper2AudioScene
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_SECOND_WAVE] + 12000
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_2)
bStartedChopper2AudioScene = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bRemovedChopper2Audio
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
//REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
bRemovedChopper2Audio = TRUE
ENDIF
ENDIF
// loop heli AI state
IF enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage > 5
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1, 2)
ENDIF
ENDIF
// 3rd wave
INT iThirdWavePedsLeft = 0
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE]
IF bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE]
AND NOT bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE]
AND NOT bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE]
AND (GET_GAME_TIMER() >= iCreateSnipersTime
OR NOT (IS_SPHERE_VISIBLE(<<-510.41333, 4453.61816, 89.10837>>, 1.0) OR IS_SPHERE_VISIBLE(<<-522.07892, 4437.87119, 80.63990>>, 1.0) OR IS_SPHERE_VISIBLE(<<-523.91626, 4451.52188, 75.71128>>, 1.0) OR IS_SPHERE_VISIBLE(<<-527.52893, 4479.11475, 61.24358>>, 1.0) ))
// IF GET_GAME_TIMER() >= iCreateSnipersTime
// PRINTSTRING("snipers timed out") PRINTNL()
// ELSE
// PRINTSTRING("snipers not on screen") PRINTNL()
// ENDIF
CREATE_ENEMY_WAVE(EW_SHOOTOUT_THIRD_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE] = TRUE
bEnemyWaveState[EW_SHOOTOUT_THIRD_WAVE] = TRUE
iThirdWavePedsLeft=4
ENDIF
ELSE
bEnemyWaveState[EW_SHOOTOUT_THIRD_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_THIRD_WAVE, TRUE, GET_GAME_TIMER() >= iCreateSnipersTime)
// gradually scale up sniper accuracy
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_THIRD_WAVE] + 8000
fThirdWaveAccuracy = fThirdWaveAccuracy +@ 0.3
IF fThirdWaveAccuracy > 100.0
fThirdWaveAccuracy = 100.0
ENDIF
ENDIF
FOR i=EP_SHOOTOUT_THIRD_WAVE_FOOT_1 TO EP_SHOOTOUT_THIRD_WAVE_FOOT_4
IF NOT IS_PED_INJURED(enemyPed[i].ped)
iThirdWavePedsLeft++
SET_PED_ACCURACY(enemyPed[i].ped, FLOOR(fThirdWaveAccuracy))
HANDLE_SNIPER_RAGDOLL(INT_TO_ENUM(ENEMY_PED_ENUM, i))
IF GET_GAME_TIMER() < iCreateSnipersTime
SET_PED_RESET_FLAG(enemyPed[i].ped, PRF_BlockWeaponFire, TRUE)
ENDIF
ENDIF
ENDFOR
ENDIF
// thermal help
IF NOT bShouldDoSniperHelp
IF bDoneUseThermalSpeech
AND GET_GAME_TIMER() >= iSniperSpeechTime + 2000
bShouldDoSniperHelp = TRUE
ENDIF
ELSE
IF NOT bDoneSniperHelp1
bDoneSniperHelp1 = DO_MISSION_HELP_TEXT("TC_SNPHLP")
ELSE
WEAPON_TYPE weapon
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
IF weapon = WEAPONTYPE_SNIPERRIFLE
OR weapon = WEAPONTYPE_HEAVYSNIPER
IF NOT bDoneSniperHelp2
bDoneSniperHelp2 = DO_MISSION_HELP_TEXT("TC_SNPHLP2", FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
IF bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE]
IF bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE]
iCreateMountainChopperTime = GET_GAME_TIMER() + 1400
ENDIF
ENDIF
IF iThirdWavePedsLeft > 1
iCreateMountainChopperTime = GET_GAME_TIMER() + 1400
ENDIF
// 4th wave
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE]
IF (bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE]
AND GET_GAME_TIMER() >= iCreateMountainChopperTime)
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD3)
#ENDIF
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FOURTH_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
iCreatedMountainChopperTime = GET_GAME_TIMER()
iNextHeliRocketTime = GET_GAME_TIMER() + 10000
bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE] = TRUE
bEnemyWaveState[EW_SHOOTOUT_FOURTH_WAVE] = TRUE
ENDIF
ELSE
bEnemyWaveState[EW_SHOOTOUT_FOURTH_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FOURTH_WAVE)
IF NOT bStartedChopper3AudioScene
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1].veh)
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FOURTH_WAVE] + 500
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_3)
bStartedChopper3AudioScene = TRUE
ENDIF
ENDIF
ELSE
IF NOT bStoppedChopper3AudioScene
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1].veh)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_3)
bStoppedChopper3AudioScene = TRUE
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1].veh)
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped)
IF GET_GAME_TIMER() >= iNextHeliRocketTime
SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, WEAPONTYPE_VEHICLE_SPACE_ROCKET)
IF DOES_ENTITY_EXIST(targetObject)
DELETE_OBJECT(targetObject)
ENDIF
VECTOR vMissOffset = <<0,0,0>>
IF GET_GAME_TIMER() <= iCreatedWaveTime[EW_SHOOTOUT_FOURTH_WAVE] + 45000
vMissOffset.z = GET_RANDOM_FLOAT_IN_RANGE(4,8)
vMissOffset.x = GET_RANDOM_FLOAT_IN_RANGE(5,12)
ELSE
vMissOffset.z = GET_RANDOM_FLOAT_IN_RANGE(1,2)
vMissOffset.x = GET_RANDOM_FLOAT_IN_RANGE(1,4)
ENDIF
IF GET_RANDOM_INT_IN_RANGE(0,2) = 0
vMissOffset.x *= -1
ENDIF
//vMissOffset.y = GET_RANDOM_FLOAT_IN_RANGE(2,7)
//IF GET_RANDOM_INT_IN_RANGE(0,2) = 0
// vMissOffset.y *= -1
//ENDIF
targetObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ANCHOR), GET_ENTITY_COORDS(PLAYER_PED_ID()) + vMissOffset)
SET_ENTITY_COLLISION(targetObject, FALSE)
SET_ENTITY_VISIBLE(targetObject, FALSE)
SET_VEHICLE_SHOOT_AT_TARGET(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, targetObject, <<0,0,0>>)
//GET_ENTITY_FROM_PED_OR_VEHICLE
//printstring("fire7!!") printnl()
//SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, WEAPONTYPE_VEHICLE_SPACE_ROCKET)
//SET_VEHICLE_SHOOT_AT_TARGET(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, NULL, <<0,0,0>>)
//SET_PED_FIRING_PATTERN(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, FIRING_PATTERN_SINGLE_SHOT)
iNextHeliRocketTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 7000)
//FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1, 1)
//SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, WEAPONTYPE_VEHICLE_PLAYER_BULLET)
//printstring("fire!") printnl()
SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, WEAPONTYPE_VEHICLE_PLAYER_BUZZARD)
ENDIF
ENDIF
ENDIF
// 5th wave
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_FIFTH_WAVE]
IF (bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE]
AND GET_GAME_TIMER() >= iCreatedMountainChopperTime + 2000)
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4)
#ENDIF
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FIFTH_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
bTriggeredEnemyWave[EW_SHOOTOUT_FIFTH_WAVE] = TRUE
bEnemyWaveState[EW_SHOOTOUT_FIFTH_WAVE] = TRUE
ENDIF
ELSE
bEnemyWaveState[EW_SHOOTOUT_FIFTH_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FIFTH_WAVE)
// gradually scale up sniper accuracy
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FIFTH_WAVE] + 30000
fFifthWaveAccuracy = fFifthWaveAccuracy +@ 0.3
IF fFifthWaveAccuracy > 100.0
fFifthWaveAccuracy = 100.0
ENDIF
ENDIF
IF NOT bDoneParachute1
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FIFTH_WAVE] + 0
SET_PED_USING_ACTION_MODE(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_1].ped, TRUE, -1, "DEFAULT_ACTION")
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
TASK_PARACHUTE_TO_TARGET(NULL, <<-506.35675, 4512.24414, 83.99497>>)
TASK_SWAP_WEAPON(NULL, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-501.51447, 4484.55518, 70.19113>>, PEDMOVE_RUN)
TASK_SHOOT_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_1].ped, sequence)
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_1].ped, PCF_IgnoreLegIkRestrictions, TRUE)
bDoneParachute1 = TRUE
ENDIF
ENDIF
IF NOT bDoneParachute2
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FIFTH_WAVE] + 800
SET_PED_USING_ACTION_MODE(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_2].ped, TRUE, -1, "DEFAULT_ACTION")
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
TASK_PARACHUTE_TO_TARGET(NULL, <<-488.58945, 4512.00732, 85.04370>>)
TASK_SWAP_WEAPON(NULL, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-490.32205, 4505.53662, 82.68779>>, PEDMOVE_RUN)
TASK_SHOOT_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_2].ped, sequence)
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_2].ped, PCF_IgnoreLegIkRestrictions, TRUE)
bDoneParachute2 = TRUE
ENDIF
ENDIF
WEAPON_TYPE weapon
FOR i=EP_SHOOTOUT_FIFTH_WAVE_FOOT_1 TO EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
IF NOT IS_PED_INJURED(enemyPed[i].ped)
GET_CURRENT_PED_WEAPON(enemyPed[i].ped, weapon)
IF weapon <> WEAPONTYPE_SNIPERRIFLE
IF GET_PED_PARACHUTE_STATE(enemyPed[i].ped) = PPS_INVALID
SET_CURRENT_PED_WEAPON(enemyPed[i].ped, WEAPONTYPE_SNIPERRIFLE, FALSE)
ENDIF
ENDIF
IF NOT bDoneSeenParachutesSpeech
IF IS_ENTITY_ON_SCREEN(enemyPed[i].ped)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(enemyPed[i].ped), FALSE) < 212
IF DO_MISSION_SPEECH("EXL3_PARA")
bDoneSeenParachutesSpeech = TRUE
iNextArgueTime = GET_GAME_TIMER() + 8000
michaelTrevorArgueStage = MT_ARGUE_WAIT
ENDIF
ENDIF
ENDIF
ENDIF
SET_PED_ACCURACY(enemyPed[i].ped, FLOOR(fFifthWaveAccuracy))
HANDLE_SNIPER_RAGDOLL(INT_TO_ENUM(ENEMY_PED_ENUM, i))
ENDIF
ENDFOR
ENDIF
// handle first chopper rotate on spot / fly away
/*
IF bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE]
// rotate
IF enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].iAiStage = 4
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL].ped)
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1, 50)
ENDIF
ENDIF
// escape
IF enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].iAiStage < 99
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL].ped)
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR].ped)
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1, 99)
ENDIF
ELSE
IF NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped)
// handle first chopper stay in one place
SWITCH enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].iAiStage
CASE 100
IF NOT IS_ENTITY_AT_COORD(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped, GET_TRAIN_CRASH_VECTOR(TCVEC_GUNS_CHOPPER_HOVER), <<6,6,6>>)
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1, 101)
ENDIF
BREAK
CASE 101
IF IS_ENTITY_AT_COORD(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped, GET_TRAIN_CRASH_VECTOR(TCVEC_GUNS_CHOPPER_HOVER), <<5.5,5.5,5.5>>)
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1, 100)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
*/
// handle second chopper stay in a good place like a sensible person
/*
IF NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped)
SWITCH enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage
CASE 2
IF NOT IS_ENTITY_AT_COORD(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped, GET_TRAIN_CRASH_VECTOR(TCVEC_DROPOFF_CHOPPER_HOVER), <<6,6,6>>)
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1, 3)
ENDIF
BREAK
CASE 3
IF IS_ENTITY_AT_COORD(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped, GET_TRAIN_CRASH_VECTOR(TCVEC_DROPOFF_CHOPPER_HOVER), <<5.5,5.5,5.5>>)
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1, 2)
ENDIF
BREAK
ENDSWITCH
ENDIF
*/
// prompt that they're dropping on rail bridge
IF bEnemyWaveState[EW_SHOOTOUT_THIRD_WAVE]
IF NOT bDoneDropOnBridgeSpeech
IF GET_GAME_TIMER() >= iCreateSnipersTime + 1500
IF DO_MISSION_SPEECH("EXL3_SNIPER")
iNextArgueTime = GET_GAME_TIMER() + 15000
iSniperSpeechTime = GET_GAME_TIMER()
michaelTrevorArgueStage = MT_ARGUE_WAIT
bDoneDropOnBridgeSpeech = TRUE
ENDIF
ENDIF
ELSE
IF NOT bDoneUseThermalSpeech
IF DO_MISSION_SPEECH("EXL3_THERMAL")
bDoneUseThermalSpeech = TRUE
iSniperSpeechTime = GET_GAME_TIMER()
ENDIF
ELSE
IF NOT bGotFirstSniperSpeech
IF iThirdWavePedsLeft < 4
IF iGotSniperTime < 0
iGotSniperTime = GET_GAME_TIMER()
ELSE
IF GET_GAME_TIMER() <= iGotSniperTime + 2000
IF DO_MISSION_SPEECH("EXL3_FIRST")
bGotFirstSniperSpeech = TRUE
iNextArgueTime = GET_GAME_TIMER() + 6000
michaelTrevorArgueStage = MT_ARGUE_WAIT
ENDIF
ELSE
bGotFirstSniperSpeech = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDoneKilledSnipersSpeech
IF bDoneDropOnBridgeSpeech
IF DO_MISSION_SPEECH("EXL3_DONE")
iNextArgueTime = GET_GAME_TIMER() + 10000
iSniperSpeechTime = GET_GAME_TIMER()
michaelTrevorArgueStage = MT_ARGUE_WAIT
bDoneKilledSnipersSpeech = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// exaggerated spin out on the chopper
IF bDoChopperSpinOut
IF DOES_ENTITY_EXIST(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
IF NOT IS_ENTITY_DEAD(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
fPushChopperToWallForce = fPushChopperToWallForce +@ 25
IF fPushChopperToWallForce >= 60
fPushChopperToWallForce = 60
ENDIF
IF NOT IS_HELI_PART_BROKEN(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, TRUE, TRUE, TRUE)
// APPLY_FORCE_TO_ENTITY(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, APPLY_TYPE_FORCE, <<fChopperSpinForce, 0, 0>>, <<0, 2.2, 0>>, 0, TRUE, TRUE, TRUE)
// APPLY_FORCE_TO_ENTITY(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, APPLY_TYPE_FORCE, <<-fChopperSpinForce, 0, 0>>, <<0, -2.2, 0>>, 0, TRUE, TRUE, TRUE)
APPLY_FORCE_TO_ENTITY(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, APPLY_TYPE_FORCE, <<0,fPushChopperToWallForce,0>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
OR IS_PED_INJURED(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped)
IF NOT IS_ENTITY_DEAD(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
SET_VEHICLE_OUT_OF_CONTROL(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, FALSE)
ENDIF
IF enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage > 0
bDoChopperSpinOut = TRUE
//fCachedChopperSpeed = 0
ENDIF
ENDIF
ENDIF
ENDIF
// handle heli on michael
BOOL bHeliOnMichael = FALSE
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped)
IF enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage >= 3
IF iHeliOnMichaelTime < 0
iHeliOnMichaelTime = GET_GAME_TIMER()
ENDIF
bHeliOnMichael = TRUE
ENDIF
ENDIF
IF bHeliOnMichael
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF GET_GAME_TIMER() >= iHeliOnMichaelTime + 30000//1000000//18000
IF enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage = 3
OR enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage = 5
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1000, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT bDoneFoundItem
// handle should michael be
IF GET_GAME_TIMER() >= iCheckInBoxcarTime
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<-502.47113, 4433.58203, 19.99993>>, <<-485.49841, 4439.79248, 35.99993>>)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
IF GET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) < 140
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1000, TRUE)
ENDIF
ELSE
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
ENDIF
ENDIF
iCheckInBoxcarTime = GET_GAME_TIMER() + 1000
ENDIF
// do shouting
IF NOT bHeliOnMichael
IF iDelayFindItemTime < 0
SWITCH michaelTrevorArgueStage
CASE MT_ARGUE_WAIT
IF GET_GAME_TIMER() >= iNextArgueTime
AND NOT IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID())
IF DO_MISSION_SPEECH("EXL3_TSHOOT")
michaelTrevorArgueStage = MT_ARGUE_TREVOR
ENDIF
ENDIF
BREAK
CASE MT_ARGUE_TREVOR
IF DO_MISSION_SPEECH("EXL3_MSHOOT")
michaelTrevorArgueStage = MT_ARGUE_MICHAEL
ENDIF
BREAK
CASE MT_ARGUE_MICHAEL
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iNextArgueTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 14000)
michaelTrevorArgueStage = MT_ARGUE_WAIT
ENDIF
BREAK
ENDSWITCH
ENDIF
ELSE
IF NOT bDoneHeliOnMichaelSpeech
IF DO_MISSION_SPEECH("EXL3_HELION")
bDoneHeliOnMichaelSpeech = TRUE
michaelTrevorArgueStage = MT_ARGUE_WAIT
SET_NEXT_RANDOM_SPEECH_TIME(12000)
ENDIF
ELSE
DO_RANDOM_SPEECH("EXL3_HELION2", -1, 12000, 20000)
ENDIF
ENDIF
// michael searching
IF NOT bMichaelSearching
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99
SET_MICHAEL_SEARCHING_IN_CONTAINER(0,FALSE)
bMichaelSearching = TRUE
ENDIF
ELSE
HANDLE_MICHAEL_SEARCHING_IN_CONTAINER()
ENDIF
IF NOT bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE]
AND NOT bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE]
AND NOT bEnemyWaveState[EW_SHOOTOUT_THIRD_WAVE]
AND NOT bEnemyWaveState[EW_SHOOTOUT_FOURTH_WAVE]
AND NOT bEnemyWaveState[EW_SHOOTOUT_FIFTH_WAVE]
AND bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE]
AND bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE]
AND bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE]
AND bTriggeredEnemyWave[EW_SHOOTOUT_FIFTH_WAVE]
IF iDelayFindItemTime < 0
iDelayFindItemTime = GET_GAME_TIMER()
ELSE
IF GET_GAME_TIMER() >= iDelayFindItemTime + GET_RANDOM_INT_IN_RANGE(3500, 5000)
IF CAN_ADVANCE_MISSION()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, trainCrashVehicle[TCV_DINGHY], 0)
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_CARRY_CASE_MICHAEL", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, blockingAllRagdoll)
//SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.2)
//SET_SYNCHRONIZED_SCENE_RATE(iSyncScene, 1.3)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
CREATE_CASE(CASE_IN_HAND_ANIM)
TRIGGER_MISSION_MUSIC_EVENT("EXL3_FIGHT_END")
bDoneFoundItem = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
PED_INDEX michaelPed = GET_MICHAEL_PED()
PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT bPreparedRapidsStartCue
bPreparedRapidsStartCue = PREPARE_MUSIC_EVENT("EXL3_RAPIDS_START")
ENDIF
IF NOT bReadyToEscape
IF NOT IS_PED_INJURED(michaelPed)
AND NOT IS_PED_INJURED(trevorPed)
IF NOT bDoneGotoSpeech
IF bDoneFoundItem
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_GOTIT")
ENDIF
ELSE
IF NOT bDoneTrevorRespondSpeech
bDoneTrevorRespondSpeech = DO_MISSION_SPEECH("EXL3_RESP")
ENDIF
ENDIF
IF iGetInTextStage = 0
SET_NEXT_RANDOM_SPEECH_TIME(12000)
ELSE
IF NOT bStoppedDefendMichaelAudioScene
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL)
bStoppedDefendMichaelAudioScene = TRUE
ENDIF
ENDIF
//IF crashHotswapState = CRASH_HOTSWAP_ON_MICHAEL
//OR crashHotswapState = CRASH_HOTSWAP_ON_TREVOR
HANDLE_GET_TO_LOCATION(TRUE, FALSE)
//ENDIF
// michael is making way into dinghy
IF NOT bMichaelInDinghy
BOOL bDoNextScene
bDoNextScene = FALSE
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99
bDoNextScene = TRUE
ENDIF
ELSE
bDoNextScene = TRUE
ENDIF
IF bDoNextScene
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
//STOP_SYNCHRONIZED_ENTITY_ANIM(trainCrashVehicle[TCV_DINGHY], 500, TRUE)
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_CASE_STATE(CASE_UNDER_SEAT)
IF IS_PLAYER_AT_ISLAND()
PULL_BOAT_AWAY_FROM_CONTAINER()
ELSE
bDidntPullAwayFromContainer = TRUE
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)//SLF_EXTEND_PITCH_LIMIT | SLF_EXTEND_YAW_LIMIT | )
ENDIF
bMichaelInDinghy = TRUE
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
FLOAT fDinghyPlaybackTime = 0
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
fDinghyPlaybackTime = GET_TIME_POSITION_IN_RECORDING(trainCrashVehicle[TCV_DINGHY])
ENDIF
IF NOT bMichaelStopForTrevorSwimming
IF ((IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], <<7,7,7>>, FALSE, FALSE)
OR NOT (IS_PLAYER_AT_ISLAND()))
AND NOT IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], <<-485.43494, 4398.68994, 30.64290>>, <<16,16,16>>, FALSE, FALSE))
OR bStoppingDinghy
IF (NOT HAS_ENTITY_COLLIDED_WITH_ANYTHING(trainCrashVehicle[TCV_DINGHY])
AND NOT bDidntPullAwayFromContainer)
OR bStoppingDinghy
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
fMichaelToIslandPlaybackSpeed = fMichaelToIslandPlaybackSpeed -@ 0.4
IF fMichaelToIslandPlaybackSpeed <= 0.1
fMichaelToIslandPlaybackSpeed = 0
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
CLEAR_PED_TASKS(michaelPed)
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], TRUE)
bMichaelStopForTrevorSwimming = TRUE
ELSE
bStoppingDinghy = TRUE
printstring("Here3") printnl()
SET_PLAYBACK_SPEED(trainCrashVehicle[TCV_DINGHY], fMichaelToIslandPlaybackSpeed)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bMichaelAnchoredDinghy
IF fDinghyPlaybackTime >= 10500
CLEAR_PED_TASKS(michaelPed)
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
IF NOT HAS_ENTITY_COLLIDED_WITH_ANYTHING(trainCrashVehicle[TCV_DINGHY])
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], TRUE)
ENDIF
bMichaelAnchoredDinghy = TRUE
ENDIF
ELSE
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_DINGHY], APPLY_TYPE_FORCE, <<-2.0,0,0>>, 0, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], FALSE)
IF GET_SEAT_PED_IS_TRYING_TO_ENTER(PLAYER_PED_ID()) = ENUM_TO_INT(VS_FRONT_RIGHT)
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
ELSE
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
ENDIF
ENDIF
//IF crashHotswapState = CRASH_HOTSWAP_ON_MICHAEL
//OR crashHotswapState = CRASH_HOTSWAP_ON_TREVOR
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PED_IN_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
AND IS_PED_IN_VEHICLE(trevorPed, trainCrashVehicle[TCV_DINGHY])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
//SET_MISSION_STAGE(STAGE_RAPIDS_CHASE)
IF NOT bDidntPullAwayFromContainer
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(8, FALSE)
ELSE
PULL_BOAT_AWAY_FROM_CONTAINER()
ENDIF
bShownGodText = FALSE
bDoneGotoSpeech = FALSE
bReadyToEscape = TRUE
ELSE
IF NOT IS_PED_IN_VEHICLE(trevorPed, trainCrashVehicle[TCV_DINGHY])
IF IS_PED_IN_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
IF bDoneGotoSpeech
IF iGetInTextStage > 0
IF NOT bDoneImmediateGetInSpeech
IF IS_ENTITY_AT_ENTITY(trevorPed, trainCrashVehicle[TCV_DINGHY], <<5,5,5>>)
OR GET_GAME_TIMER() >= iNextRandomSpeechTime
OR bMichaelStopForTrevorSwimming
iNextRandomSpeechTime = 0
bDoneImmediateGetInSpeech = TRUE
ENDIF
ENDIF
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], <<0, 4, 0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], <<0, -3.4, 3>>), 2.3)
DO_RANDOM_SPEECH("EXL3_GETIN")
ELSE
DO_RANDOM_SPEECH("EXL3_INSIT1")
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR vOffsetFromBoat
vOffsetFromBoat = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], GET_ENTITY_COORDS(PLAYER_PED_ID()))
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], <<4,4,4>>)
//AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-495.84711, 4432.77295, 28.41191>>, <<-491.86798, 4433.94775, 32.01966>>, 2.3)
//AND (vOffsetFromBoat.x < 1. OR NOT IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], <<-488.93961, 4433.09424, 30.26931>>, <<5,5,5>>) OR NOT IS_PED_SWIMMING(PLAYER_PED_ID()))
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ENTER)
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
IF vOffsetFromBoat.x > 0
AND vOffsetFromBoat.z < 0
AND IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], <<-488.93961, 4433.09424, 30.26931>>, <<5,5,5>>)
AND NOT IS_PED_ON_VEHICLE(PLAYER_PED_ID())
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], <<-2,0,0>>), PEDMOVE_RUN)
ENDIF
TASK_ENTER_VEHICLE(NULL, trainCrashVehicle[TCV_DINGHY], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), sequence)
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) <> FINISHED_TASK
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
ENDIF
ENDIF
ENDIF
ENDIF
//ENDIF
ENDIF
ENDIF
ENDIF
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
LOAD_STREAM("Boats_Jump", "EXILE_3_SOUNDS")
IF NOT IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<-3390, 3000, -10>>, <<-281, 5746, 100>>, FALSE)
MISSION_FAILED(FAIL_ABANDONED_ESCAPE_ROUTE)
ENDIF
IF NOT bLateAimAtRapids
IF bDidntPullAwayFromContainer
VECTOR vDinghyPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
IF vDinghyPos.y < 4428.5
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(8, FALSE)
bLateAimAtRapids = TRUE
ENDIF
ENDIF
ENDIF
//HANDLE_MICHAEL_TREVOR_BOAT_SWAP_IN_RAPIDS()
HANDLE_MICHAEL_DRIVING()
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(trainCrashVehicle[TCV_DINGHY], 24)
ENDIF
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
BLIP_RIVER_MOUTH()
IF NOT bDoneGotoSpeech
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_RAPIDS")
IF bDoneGotoSpeech
REPLAY_RECORD_BACK_FOR_TIME(8.0, 14.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ENDIF
ENDIF
// cutaway
VECTOR vPlayerCoords
vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF NOT bDoneWaterfallCutaway
// cutscene
IF vPlayerCoords.z < 19.0
bDoneWaterfallCutaway = TRUE
bSkippedWaterfallCutaway = TRUE
SET_MISSION_STAGE(STAGE_RAPIDS_CHASE)
ELSE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
AND NOT IS_PED_INJURED(GET_MICHAEL_PED())
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
IF hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
IF vPlayerCoords.y < 4431.22
AND vPlayerCoords.y > 4411.61
IF vPlayerCoords.x < -540.0
AND vPlayerCoords.z > 27.6
IF GET_ENTITY_SPEED(trainCrashVehicle[TCV_DINGHY]) >= 5.0
AND IS_PED_AT_CORRECT_HEADING(GET_MICHAEL_PED(), 84.8, 45)
IF CAN_ADVANCE_MISSION()
AND (boatHotswapState = BOAT_HOTSWAP_ON_TREVOR OR boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL)
bSkippedWaterfallCutaway = FALSE
bRunningCutscene = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
DO_WATERFALL_CUTSCENE()
ENDIF
ENDPROC
// should do a specific rapids speech interrupt?
FUNC BOOL SHOULD_DO_RAPIDS_SPEECH_INTERRUPT(RAPIDS_SPEECH_INTERRUPT_ENUM thisInterrupt)
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
VECTOR vBoatPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
SWITCH thisInterrupt
CASE RSI_CHOPPER_INTRO
IF bEnemyWaveState[EW_CHASE_FIRST_HELI_WAVE]
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh, <<120,120,120>>, FALSE, FALSE)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
IF GET_TIME_POSITION_IN_RECORDING(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh) >= 8000
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE RSI_CHOPPER_REMINDER
IF bEnemyWaveState[EW_CHASE_FIRST_HELI_WAVE]
IF vBoatPos.x < -1660
RETURN TRUE
ENDIF
ENDIF
BREAK
CASE RSI_BOATS_INTRO
IF bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
RETURN TRUE
ENDIF
BREAK
CASE RSI_BOATS_REMINDER_1
IF bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
IF vBoatPos.x < -885
AND GET_GAME_TIMER() >= iLastBoatReminderTime + 12000
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
AND CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
RETURN TRUE
ENDIF
ENDIF
//RETURN TRUE
ENDIF
BREAK
CASE RSI_BOATS_REMINDER_2
IF vBoatPos.x < -885
AND GET_GAME_TIMER() >= iLastBoatReminderTime + 12000
IF bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
BOOL b1, b2
b1 = CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
b2 = CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF (b1 OR b2)
AND NOT (b1 AND b2)
RETURN TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE RSI_BOATS_REMINDER_3
IF vBoatPos.x < -885
AND GET_GAME_TIMER() >= iLastBoatReminderTime + 12000
IF bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
OR CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
RETURN TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE RSI_CARS_INTRO
IF bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh)
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh, <<100,100,100>>, FALSE, FALSE)
IF vBoatPos.x < -955
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE RSI_CARS_REMINDER
IF bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh)
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh, <<100,100,100>>, FALSE, FALSE)
IF vBoatPos.x < -1100
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE RSI_CARS_REMINDER_2
IF bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh)
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh, <<100,100,100>>, FALSE, FALSE)
IF vBoatPos.x < -1310
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE RSI_M_DEST_CHOPPER
CASE RSI_M_DEST_BOAT
CASE RSI_T_DEST_CHOPPER
CASE RSI_T_DEST_BOAT
IF GET_GAME_TIMER() <= iRapidsSpeechInterruptTime + 3000
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
RETURN FALSE
ENDFUNC
// chased down the rapids
PROC DO_STAGE_RAPIDS_CHASE()
IF NOT bRunningCutscene
// remove crash
INT i
VECTOR vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF NOT bDoMopUp
IF NOT IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<-3390, 3000, -10>>, <<-281, 5746, 100>>, FALSE)
MISSION_FAILED(FAIL_ABANDONED_ESCAPE_ROUTE)
ENDIF
ENDIF
// remove freight container model
IF NOT bRemovedCrashModels
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-520.18628, 4423.46436, 29.99983>>, <<400,400,400>>, FALSE, FALSE)
IF DOES_ENTITY_EXIST(hangingCarriageVehicle)
SET_VEHICLE_AS_NO_LONGER_NEEDED(hangingCarriageVehicle)
ENDIF
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAIN_CONTAINER2))
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX1)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX1)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX2)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX2)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX3)
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX3)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisSplashPTFX)
STOP_PARTICLE_FX_LOOPED(debrisSplashPTFX)
ENDIF
bRemovedCrashModels = TRUE
ENDIF
ENDIF
// handle swap between michael and trevor
HANDLE_MICHAEL_TREVOR_BOAT_SWAP_IN_RAPIDS()
HANDLE_MICHAEL_DRIVING()
HANDLE_BOAT_RPG()
// handle beach creation
HANDLE_BEACH_CREATION()
// on trevor
IF NOT IS_SELECTOR_ONSCREEN()
IF bAreShowingMichaelReverseSwitchCam
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
bAreShowingMichaelReverseSwitchCam = FALSE
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(explodeVehicle)
IF GET_GAME_TIMER() >= iLastExplodeTime + 50
//EXPLODE_VEHICLE(explodeVehicle)
explodeVehicle = NULL
ENDIF
ELSE
explodeVehicle = NULL
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
IF IS_VEHICLE_AT_RAPIDS_SLOW_DOWN_AREA(trainCrashVehicle[TCV_DINGHY])
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(trainCrashVehicle[TCV_DINGHY], 18)
ELSE
//VEHICLE_WAYPOINT_PLAYBACK_USE_DEFAULT_SPEED(trainCrashVehicle[TCV_DINGHY])
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(trainCrashVehicle[TCV_DINGHY], 24) //25
ENDIF
ENDIF
ENDIF
//[MF] Prevent the player from making a switch while Trevor is still getting into position.
// we need to be able to do this - maybe short range code switches are the answer.
//IF boatRPGState <= BOAT_RPG_GET_IN_POSITION
// DISABLE_SELECTOR_THIS_FRAME()
//ENDIF
// chase enemies
FOR i=EW_CHASE_FIRST_HELI_WAVE TO EW_CHASE_FIRST_CAR_WAVE//EW_FLEE_WAVE
ENEMY_WAVE_ENUM thisWaveEnum = INT_TO_ENUM(ENEMY_WAVE_ENUM, i)
IF NOT bTriggeredEnemyWave[i]
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR AND boatRPGState >= BOAT_RPG_GET_IN_POSITION)
BOOL bTrigger = FALSE
BOOL bBlip = FALSE
SWITCH thisWaveEnum
CASE EW_CHASE_FIRST_HELI_WAVE
IF vPlayerCoords.x <= -1370.2
//AND vPlayerCoords.z <= 22.97
bTrigger = TRUE
//bBlip = FALSE
ENDIF
BREAK
//CASE EW_CHASE_SECOND_HELI_WAVE
// IF vPlayerCoords.x <= -987.23
// bTrigger = TRUE
// bBlip = FALSE
// ENDIF
//BREAK
CASE EW_CHASE_FIRST_BOAT_WAVE
IF vPlayerCoords.x <= -590.10
OR bDoneWaterfallCutaway
bTrigger = TRUE
ENDIF
BREAK
//CASE EW_CHASE_SECOND_BOAT_WAVE
// IF vPlayerCoords.x <= -910.23
//bTrigger = TRUE
// ENDIF
//BREAK
//CASE EW_CHASE_THIRD_BOAT_WAVE
// IF vPlayerCoords.x <= -1168.10
// bTrigger = TRUE
// ENDIF
//BREAK
//CASE EW_CHASE_FOURTH_BOAT_WAVE
// IF vPlayerCoords.x <= -1381.10
// bTrigger = TRUE
// ENDIF
//BREAK
//CASE EW_CHASE_BRIDGE_WAVE
// IF vPlayerCoords.x <= -590.10
// bTrigger = TRUE
// bBlip = FALSE
// ENDIF
//BREAK
CASE EW_CHASE_FIRST_CAR_WAVE
IF vPlayerCoords.x <= -590.10
bTrigger = TRUE
bBlip = FALSE
ENDIF
BREAK
//CASE EW_FLEE_WAVE
// IF vPlayerCoords.x <= -1615.10
// bTrigger = TRUE
// bBlip = FALSE
// ENDIF
//BREAK
ENDSWITCH
IF bTrigger
CREATE_ENEMY_WAVE(thisWaveEnum, bBlip, STAGE_RAPIDS_CHASE)
SWITCH thisWaveEnum
CASE EW_CHASE_FIRST_CAR_WAVE
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_CAR))
BREAK
CASE EW_CHASE_FIRST_HELI_WAVE
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_CHASE_CHOPPER))
BREAK
CASE EW_CHASE_FIRST_BOAT_WAVE
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_ENEMY_DINGHY))
BREAK
ENDSWITCH
bTriggeredEnemyWave[thisWaveEnum] = TRUE
ENDIF
ENDIF
ELSE
bEnemyWaveState[thisWaveEnum] = HANDLE_ENEMY_WAVE(thisWaveEnum)
ENDIF
ENDFOR
// boat transitions
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
FOR i=EV_CHASE_FIRST_BOAT_WAVE_BOAT_1 TO EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
VECTOR vBoatPos = GET_ENTITY_COORDS(enemyVehicle[i].veh)
FLOAT fDist = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[i].veh, PLAYER_PED_ID(), FALSE)
enemyVehicle[i].bInSlowDownArea = IS_VEHICLE_AT_RAPIDS_SLOW_DOWN_AREA(enemyVehicle[i].veh, FALSE)
INT iBoatSound
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
iBoatSound = 0
ELSE
iBoatSound = 1
ENDIF
IF NOT bDoneBoatSound[iBoatSound]
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
FLOAT fTimeToPlay
IF iBoatSound=0
fTimeToPlay = 4000
ELSE
fTimeToPlay = 4700
ENDIF
IF GET_TIME_POSITION_IN_RECORDING(enemyVehicle[i].veh) >= fTimeToPlay
PLAY_SOUND_FROM_ENTITY(-1, "BOAT_WAVE_HIT_SCRIPT", enemyVehicle[i].veh)
bDoneBoatSound[iBoatSound] = TRUE
ENDIF
ENDIF
ENDIF
// handle recording speed
IF enemyVehicle[i].iAiStage = 0
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF vBoatPos.x < -917
IF IS_ENTITY_AT_ENTITY(enemyVehicle[i].veh, enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, <<10,10,10>>, FALSE, FALSE)
fEnemyBoatSpeed = fEnemyBoatSpeed -@ 0.1
IF fEnemyBoatSpeed < 0.75
fEnemyBoatSpeed = 0.75
ENDIF
ELSE
fEnemyBoatSpeed = fEnemyBoatSpeed +@ 0.1
IF fEnemyBoatSpeed > 1.2
fEnemyBoatSpeed = 1.2
ENDIF
ENDIF
SET_PLAYBACK_SPEED(enemyVehicle[i].veh, fEnemyBoatSpeed)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF enemyVehicle[i].iAiStage = 1
IF bDoMopUp
AND vBoatPos.x < -1800//1915
IF CAN_BOAT_DRIVE(enemyVehicle[i].veh)
FORCE_ENEMY_VEHICLE_AI_STAGE(INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i), 2)
ENDIF
ELSE
IF NOT IS_VEHICLE_VISIBLE(enemyVehicle[i].veh)//(NOT IS_ENTITY_ON_SCREEN(enemyVehicle[i].veh) OR IS_ENTITY_OCCLUDED(enemyVehicle[i].veh))
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
AND fDist > 85//100
AND vBoatPos.x > vPlayerCoords.x
AND CAN_BOAT_DRIVE(enemyVehicle[i].veh)
AND NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh))
FLOAT fRecTime = 0.0
VECTOR vRecPos = <<0,0,0>>
INT iRec
SWITCH INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
iRec = 009
BREAK
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
iRec = 016
BREAK
ENDSWITCH
BOOL bDoRecording = TRUE
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF IS_ENTITY_AT_ENTITY(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, enemyVehicle[i].veh, <<12,12,12>>, FALSE, FALSE)
bDoRecording = FALSE
ENDIF
ENDIF
ENDIF
IF bDoRecording
CALCULATE_POINT_TO_START_DRIVE_RECORDING(enemyVehicle[i].veh, iRec, fRecTime, vRecPos)
START_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[i].veh, iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[i].veh, fRecTime)
SET_PLAYBACK_SPEED(enemyVehicle[i].veh, 1.2)
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
fEnemyBoatSpeed = 1.2
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyVehicle[i].veh, FALSE)
enemyVehicle[i].aiEnum = EVAI_FOLLOW_RECORDING
enemyVehicle[i].iAiStage = 0
ENDIF
ELSE
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
FLOAT fOverrideBoatSpeed = 26.0
//PRINTSTRING("speed = ") PRINTFLOAT(GET_ENTITY_SPEED(PLAYER_PED_ID())) PRINTNL()
IF NOT CAN_BOAT_DRIVE(enemyVehicle[i].veh)
AND NOT enemyVehicle[i].bInSlowDownArea
AND NOT (vBoatPos.x >= -923.2 AND vBoatPos.x <= -874.8)
IF GET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh) > 300
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, 300)
ENDIF
fOverrideBoatSpeed = 0
ELSE
IF vBoatPos.x < vPlayerCoords.x - 5
fOverrideBoatSpeed = 0
ELSE
IF fDist < 20
fOverrideBoatSpeed = GET_ENTITY_SPEED(PLAYER_PED_ID()) - 15
IF fOverrideBoatSpeed < 0
fOverrideBoatSpeed = 0
ENDIF
ENDIF
// slow down area
IF enemyVehicle[i].bInSlowDownArea
fOverrideBoatSpeed = 20//16//18
ENDIF
// special case for 2nd boat
VECTOR vOtherBoatPos
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF IS_ENTITY_AT_ENTITY(enemyVehicle[i].veh, enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, <<20,20,20>>, FALSE, FALSE) //15 //12
vOtherBoatPos = GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF vOtherBoatPos.x < vBoatPos.x - 4//5
fOverrideBoatSpeed = 6
ENDIF
ENDIF
ENDIF
ELIF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
IF IS_ENTITY_AT_ENTITY(enemyVehicle[i].veh, enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, <<20,20,20>>, FALSE, FALSE) //12
vOtherBoatPos = GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
IF vOtherBoatPos.x < vBoatPos.x - 5
fOverrideBoatSpeed = 8
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//IF i=enum_to_int(EV_CHASE_FIRST_BOAT_WAVE_BOAT_1)
// PRINTFLOAT(fOverrideBoatSpeed) printnl()
//ENDIF
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(enemyVehicle[i].veh, fOverrideBoatSpeed)
//printstring("override to 0") printnl()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
// cars
FOR i=EV_CHASE_FIRST_CAR_WAVE_CAR_1 TO EV_CHASE_FIRST_CAR_WAVE_CAR_1
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
IF NOT bBlippedCarWave
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[i].veh, <<100,100,100>>, FALSE, FALSE)
BLIP_ENEMY_WAVE(EW_CHASE_FIRST_CAR_WAVE)
bBlippedCarWave = TRUE
ENDIF
ENDIF
IF enemyVehicle[i].iAiStage = 1
FLOAT fStartDist
SWITCH INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
fStartDist = 30//100
BREAK
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
// fStartDist = 30
//BREAK
ENDSWITCH
IF GET_DISTANCE_BETWEEN_ENTITIES(trainCrashVehicle[TCV_DINGHY], enemyVehicle[i].veh) <= fStartDist
FORCE_ENEMY_VEHICLE_AI_STAGE(INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i), 99)
ENDIF
ELSE
VECTOR vCarPos = GET_ENTITY_COORDS(enemyVehicle[i].veh)
FLOAT fOverrideSpeed = -1
FLOAT fMaxSpeed = 80.0
FLOAT fMinSpeed = 0.0
FLOAT fDistanceAhead= -25.0//0.0
IF vCarPos.x > -895
// override at bridge
fOverrideSpeed = 30.0//60.0
ELSE
IF vCarPos.x < -1056
AND vCarPos.x > -1090
fMaxSpeed = 20.0
ENDIF
//IF vCarPos.x < -1559
//AND vCarPos.x > -1653
// fDistanceAhead = 20.0
//ENDIF
IF vPlayerCoords.x < vCarPos.x + fDistanceAhead
fOverrideSpeed = fMaxSpeed
ELSE
fOverrideSpeed = fMinSpeed
ENDIF
ENDIF
// avoid front car
/*
IF fOverrideSpeed > 0
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_CAR_WAVE_CAR_2
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh)
IF IS_ENTITY_AT_ENTITY(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh, enemyVehicle[i].veh, <<8,8,8>>, FALSE, FALSE)
fOverrideSpeed = 20
ENDIF
ENDIF
ENDIF
ENDIF
*/
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
IF fOverrideSpeed >= 0
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(enemyVehicle[i].veh, fOverrideSpeed)
ELSE
VEHICLE_WAYPOINT_PLAYBACK_USE_DEFAULT_SPEED(enemyVehicle[i].veh)
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
// chopper audio
IF NOT bStartedChopper4AudioScene
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_CHASE_FIRST_HELI_WAVE] + 2000
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_4)
bStartedChopper4AudioScene = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bDoMopUp
IF CAN_ADVANCE_MISSION()
//IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_RIVER_MOUTH), <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>, TRUE)
//IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_RIVER_MOUTH), <<100, 100, LOCATE_SIZE_HEIGHT>>, FALSE, FALSE)
IF vPlayerCoords.x < -1750//-1731.58
//OR (iTriggerFleeWaveTime > 0 AND GET_GAME_TIMER() >= iTriggerFleeWaveTime + 6000)
//REMOVE_ALL_BLIPS()
IF DOES_BLIP_EXIST(gotoBlip)
REMOVE_BLIP(gotoBlip)
ENDIF
REMOVE_MISSION_TEXT(FALSE)
bDoneGotoSpeech = TRUE
IF bEnemyWaveState[EW_CHASE_FIRST_HELI_WAVE]
OR bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
//OR bEnemyWaveState[EW_CHASE_SECOND_BOAT_WAVE]
//OR bEnemyWaveState[EW_CHASE_FOURTH_BOAT_WAVE]
OR bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
bShownGodText = FALSE
ELSE
bShownGodText = TRUE
ENDIF
bDoMopUp = TRUE
ENDIF
ENDIF
ELSE
fMopUpAccuracy = fMopUpAccuracy +@ 3.0
IF fMopUpAccuracy > 30
fMopUpAccuracy = 30
ENDIF
// increase enemy accuracy
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
IF NOT IS_PED_INJURED(enemyPed[i].ped)
SET_PED_ACCURACY(enemyPed[i].ped, FLOOR(fMopUpAccuracy))
ENDIF
ENDREPEAT
//IF NOT bEnemyWaveState[EW_FLEE_WAVE]
IF NOT bEnemyWaveState[EW_CHASE_FIRST_HELI_WAVE]
AND NOT bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
//AND NOT bEnemyWaveState[EW_CHASE_SECOND_BOAT_WAVE]
//AND NOT bEnemyWaveState[EW_CHASE_FOURTH_BOAT_WAVE]
AND NOT bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
IF iAdvanceToGetHomeTime < 0
iAdvanceToGetHomeTime = GET_GAME_TIMER() + 800
ELSE
IF GET_GAME_TIMER() >= iAdvanceToGetHomeTime
// chase no longer needed
REPEAT COUNT_OF(enemyPed) i
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
// clear the enemy driver tasks
IF NOT IS_PED_INJURED(enemyPed[i].ped)
ENEMY_PED_ENUM thisPedEnum = INT_TO_ENUM(ENEMY_PED_ENUM, i)
IF thisPedEnum = EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
OR thisPedEnum = EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER
//OR thisPedEnum = EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_DRIVER
//OR thisPedEnum = EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_DRIVER
CLEAR_PED_TASKS(enemyPed[i].ped)
ENDIF
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(enemyPed[i].ped)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(enemyVehicle) i
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyVehicle[i].veh)
ENDIF
ENDREPEAT
IF CAN_ADVANCE_MISSION()
AND hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = PERFORMING_TASK
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
ENDIF
ENDIF
SET_MISSION_STAGE(STAGE_GET_HOME)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BOOL bDoMopUpStuff = FALSE
IF currentMissionStage <> STAGE_GET_HOME
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR AND boatRPGState >= BOAT_RPG_GET_IN_POSITION AND boatRPGState < BOAT_RPG_DONE
bDoMopUpStuff = TRUE
ELSE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
bDoMopUpStuff = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF bDoMopUpStuff
// check interrupts
IF NOT bRapidsSpeechInterruptPending
FOR i=RSI_CHOPPER_INTRO TO RSI_CARS_REMINDER_2
IF NOT bDoneRapidsSpeechInterrupt[i]
IF bShownGodText OR INT_TO_ENUM(RAPIDS_SPEECH_INTERRUPT_ENUM, i) = RSI_BOATS_INTRO OR boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
IF SHOULD_DO_RAPIDS_SPEECH_INTERRUPT(INT_TO_ENUM(RAPIDS_SPEECH_INTERRUPT_ENUM, i))
pendingRapidsSpeechInterrupt = INT_TO_ENUM(RAPIDS_SPEECH_INTERRUPT_ENUM, i)
bDoneRapidsSpeechInterrupt[i] = TRUE
bRapidsSpeechInterruptPending = TRUE
ENDIF
ENDIF
ENDIF
ENDFOR
// banter
IF iRapidsSpeechStage < 3
//IF bShownGodText
IF NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
BOOL bCanDoBanter = FALSE
STRING sBanter
SWITCH iRapidsSpeechStage
CASE 0
IF vPlayerCoords.x < -719
bCanDoBanter = TRUE
ENDIF
IF iReplayAttempt % 2 = 0
sBanter = "EXL3_ESCAPE1"
ELSE
sBanter = "EXL3_ESCAP1b"
ENDIF
BREAK
CASE 1
IF vPlayerCoords.x < -1185
bCanDoBanter = TRUE
ENDIF
sBanter = "EXL3_COOL"
BREAK
CASE 2
IF vPlayerCoords.x < -1534
bCanDoBanter = TRUE
ENDIF
IF iReplayAttempt % 2 = 0
sBanter = "EXL3_DOCK1"
ELSE
sBanter = "EXL3_DOCK1b"
ENDIF
BREAK
ENDSWITCH
IF bCanDoBanter
IF bDoneRapidsSpeechInterrupt[RSI_BOATS_INTRO]
AND NOT bRapidsSpeechInterruptPending
IF bShownGodText OR boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
IF DO_MISSION_SPEECH(sBanter)
iRapidsSpeechStage++
ENDIF
ENDIF
ENDIF
ELSE
IF bSavedBanter
IF RESTORE_BANTER()
bSavedBanter = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
//ENDIF
ENDIF
ELSE
IF NOT SHOULD_DO_RAPIDS_SPEECH_INTERRUPT(pendingRapidsSpeechInterrupt)
bRapidsSpeechInterruptPending = FALSE
ELSE
STRING sRapidsSpeechInterrupt
VECTOR vOffset
SWITCH pendingRapidsSpeechInterrupt
CASE RSI_CHOPPER_INTRO
// get the offset
vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh))
IF vOffset.y < 0
sRapidsSpeechInterrupt = "EXL3_TCHOP2"
ELSE
sRapidsSpeechInterrupt = "EXL3_TCHOP1"
IF boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
IF NOT IS_ENTITY_ON_SCREEN(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
sRapidsSpeechInterrupt = "EXL3_SEECHP2"
ENDIF
ELIF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
IF IS_ENTITY_ON_SCREEN(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
AND NOT IS_ENTITY_OCCLUDED(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
sRapidsSpeechInterrupt = "EXL3_SEECHP2"
ENDIF
ENDIF
ENDIF
BREAK
CASE RSI_CHOPPER_REMINDER
sRapidsSpeechInterrupt = "EXL3_SEECHP1"
BREAK
CASE RSI_BOATS_INTRO
sRapidsSpeechInterrupt = "EXL3_TBOAT1"
BREAK
CASE RSI_BOATS_REMINDER_1
sRapidsSpeechInterrupt = "EXL3_SEEBT1"
BREAK
CASE RSI_BOATS_REMINDER_2
sRapidsSpeechInterrupt = "EXL3_TBOAT2"
BREAK
CASE RSI_BOATS_REMINDER_3
sRapidsSpeechInterrupt = "EXL3_SEEBT2"
BREAK
CASE RSI_CARS_INTRO
sRapidsSpeechInterrupt = "EXL3_CARS1"
BREAK
CASE RSI_CARS_REMINDER
sRapidsSpeechInterrupt = "EXL3_CARS2"
BREAK
CASE RSI_CARS_REMINDER_2
sRapidsSpeechInterrupt = "EXL3_CARS2"
BREAK
CASE RSI_M_DEST_CHOPPER
sRapidsSpeechInterrupt = "EXL3_MHELI"
BREAK
CASE RSI_M_DEST_BOAT
sRapidsSpeechInterrupt = "EXL3_MBOAT"
BREAK
CASE RSI_T_DEST_CHOPPER
sRapidsSpeechInterrupt = "EXL3_THELI"
BREAK
CASE RSI_T_DEST_BOAT
sRapidsSpeechInterrupt = "EXL3_TBOAT"
BREAK
ENDSWITCH
IF DO_MISSION_SPEECH(sRapidsSpeechInterrupt)
IF pendingRapidsSpeechInterrupt = RSI_BOATS_REMINDER_1
OR pendingRapidsSpeechInterrupt = RSI_BOATS_REMINDER_2
OR pendingRapidsSpeechInterrupt = RSI_BOATS_REMINDER_3
iLastBoatReminderTime = GET_GAME_TIMER()
ENDIF
bRapidsSpeechInterruptPending = FALSE
ENDIF
ENDIF
ENDIF
BLIP_RIVER_MOUTH()
/*
// temp
BOOL bCanDoBlockedSpeech = FALSE
VECTOR vBlockedOffset
FOR i=EV_FLEE_WAVE_BOAT_1 TO EV_FLEE_WAVE_BOAT_2
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
vBlockedOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], GET_ENTITY_COORDS(enemyVehicle[i].veh))
IF vBlockedOffset.y > 0
bCanDoBlockedSpeech = TRUE
ENDIF
ENDIF
ENDFOR
IF bCanDoBlockedSpeech
SWITCH GET_RANDOM_INT_IN_RANGE(0,3)
CASE 0
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_BLOCKED")
BREAK
CASE 1
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_BLOCK2")
BREAK
CASE 2
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_BLOCK")
BREAK
ENDSWITCH
ELSE
IF NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
bDoneGotoSpeech = TRUE
ENDIF
ENDIF
*/
IF NOT bShownGodText
IF bDoMopUp
bShownGodText = DO_MISSION_GOD_TEXT("TC_MOPUP")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// end cutscene
PROC DO_END_CUTSCENE()
PED_INDEX michaelPed = GET_MICHAEL_PED()
PED_INDEX trevorPed = GET_TREVOR_PED()
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SWITCH cutsceneStage
CASE TC_CUT_STAGE_INIT
IF NOT IS_PED_INJURED(michaelPed)
REGISTER_ENTITY_FOR_CUTSCENE(michaelPed, "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(trevorPed)
REGISTER_ENTITY_FOR_CUTSCENE(trevorPed, "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
REGISTER_ENTITY_FOR_CUTSCENE(trainCrashVehicle[TCV_BEACH_CAR], "EXL_3_Parked_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
REGISTER_ENTITY_FOR_CUTSCENE(trainCrashVehicle[TCV_BEACH_TRUCK], "EXL_3_Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
//IF DOES_ENTITY_EXIST(caseObject)
// DETACH_ENTITY(caseObject)
// REGISTER_ENTITY_FOR_CUTSCENE(caseObject, "P_IDOL_CASE_S", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
//ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
CUTSCENE_OPTION_FLAGS flags
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
flags = CUTSCENE_NO_OPTIONS
ELSE
flags = CUTSCENE_PLAYER_FP_FLASH_TREVOR
ENDIF
START_CUTSCENE(flags)
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
cutsceneStage = TC_CUT_STAGE_RUNNING
BREAK
CASE TC_CUT_STAGE_RUNNING
IF NOT bClearedForCutscene
IF IS_CUTSCENE_PLAYING()
SET_MISSION_MOCAP_CUTSCENE()
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
IF DOES_ENTITY_EXIST(caseObject)
DELETE_OBJECT(caseObject)
ENDIF
IF NOT IS_PED_INJURED(michaelPed)
REMOVE_WEAPON_FROM_PED(michaelPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE))
ENDIF
IF bSetTrevorHelmet
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
SET_PED_COMP_ITEM_CURRENT_SP(GET_TREVOR_PED(), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
ENDIF
ENDIF
SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, FALSE)
SET_PLAYER_PED_WITH_HEADSET(CHAR_TREVOR, FALSE)
// shift the boat
IF NOT IS_ENTITY_DEAD(trainCrashVehicle[TCV_DINGHY])
IF IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], <<-2429.61523, 4255.58350, 5.82557>>, <<12,12,12>>)
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-2445.39355, 4259.45508, 2.82917>>)
SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], 160.2)
//SET_VEHICLE_ON_GROUND_PROPERLY(trainCrashVehicle[TCV_DINGHY])
ENDIF
ELSE
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_DINGHY])
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
// clear the area
STOP_FIRE_IN_RANGE(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), 20)
REMOVE_PARTICLE_FX_IN_RANGE(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), 20)
CLEAR_AREA(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), 20.0, TRUE)
STOP_VEHICLE_FIRE(trainCrashVehicle[TCV_BEACH_CAR])
STOP_VEHICLE_FIRE(trainCrashVehicle[TCV_BEACH_TRUCK])
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
bDoTrevorBoom = TRUE
ENDIF
bClearedForCutscene = TRUE
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("P_IDOL_CASE_S")
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("EXL_3_Parked_car")
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
SET_VEHICLE_ON_GROUND_PROPERLY(trainCrashVehicle[TCV_BEACH_CAR])
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_BEACH_CAR], VEHICLELOCK_UNLOCKED)
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[TCV_BEACH_CAR], TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_BEACH_TRUCK])
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_GetOutUndriveableVehicle, TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
REMOVE_TREVOR_MG()
bSuppressRemoveTrevorMG = TRUE
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE)
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("EXL_3_Michaels_car")
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BEACH_TRUCK], TRUE, TRUE)
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BEACH_TRUCK], 12.0)
START_PLAYBACK_RECORDED_VEHICLE_USING_AI(trainCrashVehicle[TCV_BEACH_TRUCK], 008, GET_TRAIN_CRASH_RECORDING_PREFIX(), 21, DRIVINGMODE_PLOUGHTHROUGH)
SET_VEHICLE_DOOR_SHUT(trainCrashVehicle[TCV_BEACH_TRUCK], SC_DOOR_FRONT_LEFT)
//SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER(trainCrashVehicle[TCV_BEACH_TRUCK], 1000, DRIVINGMODE_PLOUGHTHROUGH)
//START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_BEACH_TRUCK], 008, GET_TRAIN_CRASH_RECORDING_PREFIX())
//SET_PLAYBACK_SPEED(trainCrashVehicle[TCV_BEACH_TRUCK], 1.2)
//SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_BEACH_TRUCK], 3440)
//FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_BEACH_TRUCK])
//PRINTSTRING("CAR EXIT STATE!") PRINTNL()
ENDIF
bMichaelDroveOff = TRUE
iMichaelDriveOffTime = GET_GAME_TIMER()
IF WAS_CUTSCENE_SKIPPED()
WAIT(500)
ENDIF
REPLAY_STOP_EVENT()
SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE)
IF bDoTrevorBoom
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
ENDIF
ENDIF
ENDIF
//IF CAN_SET_EXIT_STATE_FOR_CAMERA()
//ENDIF
#IF IS_DEBUG_BUILD
DEBUG_SKIP_MOCAP()
#ENDIF
BREAK
CASE TC_CUT_STAGE_CLEANUP
BREAK
ENDSWITCH
ENDPROC
PROC HIDE_AMMO_AS_MICHAEL()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
DISPLAY_AMMO_THIS_FRAME(FALSE)
ENDIF
ENDPROC
// get home
PROC DO_STAGE_GET_HOME()
IF NOT bRunningCutscene
IF NOT bMichaelDroveOff
IF NOT bGotToBeach
// handle swap between michael and trevor
HANDLE_MICHAEL_TREVOR_BOAT_SWAP_IN_RAPIDS()
HANDLE_MICHAEL_DRIVING()
HANDLE_BOAT_RPG()
// handle beach creation
HANDLE_BEACH_CREATION()
// [MF] Make sure we abort the character select preview cam if player releases button and it's active in this section
IF NOT IS_SELECTOR_ONSCREEN()
IF bAreShowingMichaelReverseSwitchCam
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
bAreShowingMichaelReverseSwitchCam = FALSE
ENDIF
ENDIF
BOOL bCanDoStuff = FALSE
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR //AND boatRPGState >= BOAT_RPG_GET_IN_POSITION AND boatRPGState < BOAT_RPG_DONE
REMOVE_DINGHY_BLIP_AND_TEXT()
bCanDoStuff = TRUE
ELSE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
bCanDoStuff = TRUE
ENDIF
ENDIF
ENDIF
IF bCanDoStuff
IF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
IF NOT DOES_BLIP_EXIST(gotoBlip)
REMOVE_ALL_BLIPS()
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH))
ELSE
IF CAN_ADVANCE_MISSION()
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH), <<7, 7, LOCATE_SIZE_HEIGHT>>, TRUE)
ENDIF
ENDIF
ELSE
IF DOES_BLIP_EXIST(gotoBlip)
REMOVE_BLIP(gotoBlip)
ENDIF
ENDIF
// goto speech
IF NOT bDoneGotoSpeech
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_GDOCK")
IF bDoneGotoSpeech
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ELSE
IF NOT bDoneLandAtBeachCue
bDoneLandAtBeachCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_BEACH")
ENDIF
// god text
IF NOT bShownGodText
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
bShownGodText = DO_MISSION_GOD_TEXT("TC_DROPOFF")
ENDIF
ENDIF
ENDIF
// banter stuff
IF bShownGodText OR boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
IF NOT bDoneDriveHomeBanter
IF IS_PED_SITTING_IN_VEHICLE(GET_TREVOR_PED(), trainCrashVehicle[TCV_DINGHY])
AND IS_PED_SITTING_IN_VEHICLE(GET_MICHAEL_PED(), trainCrashVehicle[TCV_DINGHY])
bDoneDriveHomeBanter = DO_MISSION_SPEECH("EXL3_BANTER2")
ENDIF
ENDIF
ENDIF
// kill banter
IF NOT bKilledDriveHomeBanter
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH), <<150, 150, 150>>, FALSE, FALSE)
KILL_ANY_CONVERSATION()
bKilledDriveHomeBanter = TRUE
bDoneDriveHomeBanter = TRUE
ELSE
IF bSavedBanter
IF IS_PED_SITTING_IN_VEHICLE(GET_TREVOR_PED(), trainCrashVehicle[TCV_DINGHY])
AND IS_PED_SITTING_IN_VEHICLE(GET_MICHAEL_PED(), trainCrashVehicle[TCV_DINGHY])
IF RESTORE_BANTER()
bSavedBanter = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDoneCarSpeech
bDoneCarSpeech = DO_MISSION_SPEECH("EXL3_RONCAR")
ENDIF
ENDIF
ENDIF
// next stage when hit beach
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_BOAT_AT_BEACH(TRUE)
AND hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
REMOVE_ALL_BLIPS()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_AS_GROUP_MEMBER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PLAYER_GROUP_ID())
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
carBlip[0] = CREATE_MISSION_BLIP_FOR_VEHICLE(trainCrashVehicle[TCV_BEACH_CAR])
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
carBlip[1] = CREATE_MISSION_BLIP_FOR_VEHICLE(trainCrashVehicle[TCV_BEACH_TRUCK])
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
ENDIF
KILL_ANY_CONVERSATION()
bShownGodText = FALSE
bGotToBeach = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDoneCarSpeech
bDoneCarSpeech = DO_MISSION_SPEECH("EXL3_RONCAR")
ENDIF
IF NOT bDoneAtBeachCue
bDoneAtBeachCue = TRIGGER_MUSIC_EVENT("EXL3_STOP")
ENDIF
PED_INDEX michaelPed = GET_MICHAEL_PED()
//PED_INDEX trevorPed = GET_TREVOR_PED()
IF NOT bShownGodText
bShownGodText = DO_MISSION_GOD_TEXT("TC_CAR")
ENDIF
IF NOT bDoneForceDinghyStop
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_ENTITY_IN_WATER(trainCrashVehicle[TCV_DINGHY])
AND NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_DINGHY])
BRING_VEHICLE_TO_HALT(trainCrashVehicle[TCV_DINGHY], 25.0, 5)
bDoneForceDinghyStop = TRUE
ENDIF
ENDIF
ENDIF
HANDLE_STREAMING_MOCAP("exl_3_ext", GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST)
// abandon trevor check
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE) > ABANDON_BUDDY_FAIL_RANGE
MISSION_FAILED(FAIL_ABANDONED_TREVOR)
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE) > ABANDON_BUDDY_FAIL_RANGE
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE) > 400
OR NOT bExtendMichaelAbandon
MISSION_FAILED(FAIL_ABANDONED_MICHAEL)
ENDIF
ENDIF
ENDIF
// abandon vehicles check
FLOAT fDistanceFromGetaway = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), FALSE)
IF bBeenAtGetawayVehicles
IF fDistanceFromGetaway > STUCK_FAIL_RANGE_m
MISSION_FAILED(FAIL_ABANDONED_GETAWAY_VEHICLES)
ENDIF
ELSE
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH), <<320,320,320>>, FALSE, FALSE)
MISSION_FAILED(FAIL_ABANDONED_GETAWAY_VEHICLES)
ELSE
IF fDistanceFromGetaway < 80
AND bDoneLeaveBoatWithCase
bBeenAtGetawayVehicles = TRUE
ENDIF
ENDIF
ENDIF
// disable get out of boat
IF NOT IS_ENTITY_DEAD(trainCrashVehicle[TCV_DINGHY])
IF NOT bDoneLeaveBoatWithCase
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
ENDIF
ENDIF
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ENTER)
OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
SET_ENTITY_COORDS(michaelPed, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0,0,1>>)
SET_CASE_STATE(CASE_IN_HAND_ANIM_2)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
DISABLE_CELLPHONE(TRUE)
ENDIF
//HANG_UP_AND_PUT_AWAY_PHONE()
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_DINGHY], FALSE, FALSE)
ENDIF
SET_CURRENT_PED_WEAPON(michaelPed, WEAPONTYPE_UNARMED, TRUE)
vMichaelAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", <<0,0,0>>, <<0,0,0>>, 0)
vMichaelAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", <<0,0,0>>, <<0,0,0>>, 0)
ATTACH_MICHAEL_TO_BOAT()
TASK_PLAY_ANIM(michaelPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
SET_PED_STEALTH_MOVEMENT(michaelPed, FALSE)
//SET_PED_WEAPON_MOVEMENT_CLIPSET(michaelPed, "move_m@briefcase")
FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed)
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_BEACH)
bDoneLeaveBoatWithCase = TRUE
ENDIF
ELSE
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT bPutWeaponAway
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
bPutWeaponAway = TRUE
ENDIF
SET_PED_CAN_SWITCH_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
//SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_KeepWeaponHolsteredUnlessFired, TRUE)
//printstring("don't switch") printnl()
//WEAPON_TYPE weapon
//GET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], weapon)
//IF weapon <> WEAPONTYPE_UNARMED
// SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
//ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(michaelPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL")
FLOAT fPhase = GET_ENTITY_ANIM_CURRENT_TIME(michaelPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL")
IF fPhase >= 0
IF NOT bForcedTrevorOutOfBoat
IF fPhase >= 0.42
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
TASK_LEAVE_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
bForcedTrevorOutOfBoat = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bAttachedCaseToHand
IF fPhase >= 0.65
SET_CASE_STATE(CASE_IN_HAND_GAMEPLAY)
HIDE_AMMO_AS_MICHAEL()
bAttachedCaseToHand = TRUE
ENDIF
ELSE
HIDE_AMMO_AS_MICHAEL()
ENDIF
IF fPhase >= 0.8
DETACH_ENTITY(michaelPed, FALSE, FALSE)
//CLEAR_PED_TASKS(michaelPed)
iDetachMichaelTime = GET_GAME_TIMER()
ELSE
vMichaelAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", <<0,0,0>>, <<0,0,0>>, fPhase)
vMichaelAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", <<0,0,0>>, <<0,0,0>>, fPhase)
HIDE_AMMO_AS_MICHAEL()
ATTACH_MICHAEL_TO_BOAT()
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
IF GET_GAME_TIMER() <= iDetachMichaelTime + 2000
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_PED_ID(), -1)
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
TASK_ACHIEVE_HEADING(NULL, GET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) + 90)
//TASK_JUMP(NULL, TRUE)
TASK_PAUSE(NULL, 800)
TASK_CLIMB(NULL, TRUE)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sequence)
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
iPerformSequenceTime = GET_GAME_TIMER()
ELSE
IF GET_GAME_TIMER() >= iPerformSequenceTime + 2000
AND GET_GAME_TIMER() <= iPerformSequenceTime + 4000
SET_PED_MIN_MOVE_BLEND_RATIO(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PEDMOVE_WALK)
ENDIF
IF NOT IS_ENTITY_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<-2431.49878, 4254.95313, 5.48735>>, <<15,15,15>>)
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<-2439.87695, 4259.56592, 3.72802>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP)
iMichaelTaskTime = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF GET_SEQUENCE_PROGRESS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) = 1
SET_PED_MIN_MOVE_BLEND_RATIO(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PEDMOVE_WALK)
ENDIF
ELIF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = PERFORMING_TASK
IF GET_GAME_TIMER() >= iMichaelTaskTime + 30000
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<-2439.87695, 4259.56592, 3.72802>>)
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
bExtendMichaelAbandon = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// TEMP - REMOVE
//IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(),trainCrashVehicle[TCV_DINGHY])
// SET_CASE_STATE(CASE_IN_HAND_GAMEPLAY)
// bDoneLeaveBoatWithCase = TRUE
//ENDIF
IF bDoneLeaveBoatWithCase
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
HIDE_AMMO_AS_MICHAEL()
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_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_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
ENDIF
ENDIF
IF NOT bCutsceneWaitStarted
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_BEACH_CAR], <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>)
OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_BEACH_TRUCK], <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), <<13, 13, LOCATE_SIZE_HEIGHT>>)
IF NOT IS_PED_IN_ANY_VEHICLE(GET_TREVOR_PED())
AND NOT IS_PED_IN_ANY_VEHICLE(GET_MICHAEL_PED())
AND NOT IS_ENTITY_ATTACHED(GET_MICHAEL_PED())
IF mocapStreamingStage > MOCAP_STREAMING_STAGE_REQUEST
IF CAN_PLAYER_START_CUTSCENE()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF IS_PED_IN_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
TASK_LEAVE_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ENDIF
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
//REMOVE_ALL_BLIPS()
KILL_ANY_CONVERSATION()
iCutsceneTriggerTime = GET_GAME_TIMER()
iCutsceneTriggerTime=iCutsceneTriggerTime
bCutsceneWaitStarted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//IF GET_GAME_TIMER() >= iCutsceneTriggerTime + DEFAULT_CAR_STOPPING_TO_CUTSCENE
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// PRINTSTRING("waiting for a conversation to finish") PRINTNL()
//ENDIF
//IF NOT HAS_CUTSCENE_LOADED()
// PRINTSTRING("waiting for the cutscene to load") PRINTNL()
//ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CAN_ADVANCE_MISSION()
AND hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
REMOVE_ALL_BLIPS()
bRunningCutscene = TRUE
ENDIF
ENDIF
ENDIF
//ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
MISSION_FAILED(FAIL_BEACH_CAR_DEAD)
ENDIF
//PRINTINT(GET_GAME_TIMER() - iMichaelDriveOffTime) PRINTNL()
IF GET_GAME_TIMER() >= iMichaelDriveOffTime + 9700//8500//7000
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_BEACH_TRUCK])
DELETE_VEHICLE(trainCrashVehicle[TCV_BEACH_TRUCK])
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
SET_LAST_DRIVEN_VEHICLE(trainCrashVehicle[TCV_BEACH_CAR])
ENDIF
ENDIF
MISSION_PASSED()
ENDIF
ENDIF
ELSE
DO_END_CUTSCENE()
ENDIF
ENDPROC
// debug only
#IF IS_DEBUG_BUILD
// create widgets
PROC CREATE_TRAIN_CRASH_WIDGETS()
trainCrashWidgets = START_WIDGET_GROUP("Train Crash")
//trainCrashWidgets = START_WIDGET_GROUP("MISSION DEBUG")
ADD_WIDGET_BOOL("Override Speed", bDebugOverrideSpeed)
ADD_WIDGET_FLOAT_SLIDER("Speed", fDebugOverrideSpeed, 0, 30, 1)
ADD_WIDGET_INT_SLIDER("Carriage to move", iDebugTrainPositions, -1, 9, 1)
ADD_WIDGET_VECTOR_SLIDER("Train cam Offset", vDebugTrainCamOffset, -20, 20, 0.1)
ADD_WIDGET_VECTOR_SLIDER("Train cam Point", vDebugTrainCamPoint, -20, 20, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Train cam FOV", fDebugTrainCamFOV, 0.0, 360.0, 0.5)
//ADD_WIDGET_VECTOR_SLIDER("Hanging carriage pos ", vHangingCarriagePos, -5000, 5000, 0.1)
//ADD_WIDGET_VECTOR_SLIDER("Hanging carriage rot ", vHangingCarriageRot, -360, 360, 0.1)
RBCamPosWidget = ADD_TEXT_WIDGET("Cam Position")
RBCamRotWidget = ADD_TEXT_WIDGET("Cam Rotation")
ADD_WIDGET_FLOAT_SLIDER("Cam FOV", fRBDebugCamFOV, 0, 80, 1.0)
ADD_WIDGET_BOOL("Do Dump", bRBDebugCamDoDump)
//CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS()//[MF] Add in Switch Cam Script Specific Widgets
STOP_WIDGET_GROUP()
ENDPROC
// setup the debug menu
PROC SETUP_TRAIN_CRASH_DEBUG_MENU()
stageMenu[0].sTxtLabel = "Cutscene EXILE_3_INT"
stageMenu[0].bSelectable = FALSE
stageMenu[1].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_INTERCEPT_TRAIN)
stageMenu[2].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_CHASE_TRAIN)
stageMenu[3].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_DRIVE_ALONG_TRAIN)
stageMenu[4].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GET_TO_BRIDGE)
stageMenu[5].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GO_TO_CONTAINER)
stageMenu[6].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_STEAL_FROM_CONTAINER)
stageMenu[7].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_RAPIDS_CHASE)
stageMenu[8].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GET_HOME)
stageMenu[9].sTxtLabel = "Cutscene EXL_3_EXT"
stageMenu[9].bSelectable = FALSE
//IF bEnabledTrainClimbers
// stageMenu[10].sTxtLabel = "Train climb enemies ENABLED"
//ELSE
// stageMenu[10].sTxtLabel = "Train climb enemies DISABLED"
//ENDIF
//IF bEnabledJeepOnTracks
// stageMenu[11].sTxtLabel = "Jeep on tracks ENABLED"
// stageMenu[11].sTxtLabel = "Jeep on tracks DISABLED"
//ENDIF
ENDPROC
// debug skips
PROC DO_DEBUG_SKIPS()
// mission pass S
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
bThoroughCleanup = TRUE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
ENDIF
MISSION_PASSED()
ENDIF
// mission fail F
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
MISSION_FAILED(FAIL_LOST_TRAIN)
ENDIF
// skip stage J
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
INT i
bDebugDontDoDistanceFail = TRUE // cheating so lets not do distance check
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
//AND (NOT bRunningCutscene OR currentMissionStage = STAGE_GO_TO_CONTAINER)
AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
AND NOT bRunningCutscene
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SWITCH currentMissionStage
CASE STAGE_INTERCEPT_TRAIN
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
COMMON_MISSION_CLEAR()
SET_MISSION_STAGE(STAGE_CHASE_TRAIN, TRUE)
DO_SCREEN_FADE_IN(500)
BREAK
CASE STAGE_CHASE_TRAIN
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
AND IS_VEHICLE_DRIVEABLE(missionTrain)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT bDebugWarpToJumps
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
ENDIF
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
SET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE], <<2695.6858, 5293.1099, 63.6167>>)
SET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE], 24.82)
IF IS_VEHICLE_DRIVEABLE(missionTrain)
SET_MISSION_TRAIN_COORDS(missionTrain, <<2693.48, 5273.51, 61.56>>)
ENDIF
trainMovementState = TRAIN_MOVEMENT_CATCHUP
fTrainCruiseSpeed = 24.0
IF DOES_BLIP_EXIST(gotoBlip)
REMOVE_BLIP(gotoBlip)
ENDIF
bDebugWarpToJumps = TRUE
ELSE
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
COMMON_MISSION_CLEAR()
SET_MISSION_STAGE(STAGE_DRIVE_ALONG_TRAIN, TRUE)
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
bRunningCutscene = TRUE
BREAK
CASE STAGE_GET_TO_BRIDGE
IF NOT bArrivedAtBridge
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_MICHAEL
sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
bDebugJSkip = TRUE
ELSE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BRIDGE))
SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], DINGHY_AT_BRIDGE_ROT)
ENDIF
ENDIF
ENDIF
ELSE
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR
sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR
bDebugJSkip = TRUE
ELSE
IF trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
IF NOT bDoneJumpOff
IF NOT bDebugWarpedTrainToBridge
IF IS_VEHICLE_DRIVEABLE(missionTrain)
SET_MISSION_TRAIN_COORDS(missionTrain, <<-539, 4681, 90>>)
bDebugWarpedTrainToBridge = TRUE
ENDIF
ELSE
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
COMMON_MISSION_CLEAR()
SET_MISSION_STAGE(STAGE_GO_TO_CONTAINER, TRUE)
DO_SCREEN_FADE_IN(500)
ENDIF
ELSE
//IF NOT bSelectedMichael
// sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
// bDebugJSkip = TRUE
//ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE STAGE_GO_TO_CONTAINER
IF NOT bFoundBomb
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
ENDIF
bFoundBomb = TRUE
ELSE
IF NOT bExplodedDoors
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
ENDIF
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
//SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-446.05, 4428.41, 30.00>>)
//SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], 80.10)
// ADD_EXPLOSION(<<-491.58, 4434.94, 30.74>>, EXP_TAG_GRENADE)
CLEAR_AREA(<<-491.58, 4434.94, 30.74>>, 10, TRUE)
// DO_DOORS_BLOW_OPEN()
eSwitchCamState = SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_CONTAINER_SPLINE
bHasContainerSwitchCamExplosionHappened = FALSE
bExplodedDoors = TRUE
ENDIF
ELSE
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.98)
ENDIF
ENDIF
ENDIF
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
IF NOT bMichaelInDinghy
bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE] = TRUE
bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE] = TRUE
bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE] = TRUE
bTriggeredEnemyWave[EW_SHOOTOUT_FIFTH_WAVE] = TRUE
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
IF NOT IS_PED_INJURED(enemyPed[i].ped)
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
ENDIF
ENDREPEAT
iDelayFindItemTime = 0
REMOVE_MISSION_TEXT()
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.98)
ENDIF
ELSE
IF NOT bReadyToEscape
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
ENDIF
bMichaelAnchoredDinghy = TRUE
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
ENDIF
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_RAPIDS))
SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], DINGHY_AT_RAPIDS_ROT)
ENDIF
ELSE
bRunningCutscene = TRUE
ENDIF
ENDIF
BREAK
CASE STAGE_RAPIDS_CHASE
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
ENDIF
ENDIF
IF NOT bDoMopUp
KILL_ANY_CONVERSATION()
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-1806.11, 4581.43, 0.74>>)
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_DINGHY], 20)
ELSE
KILL_ANY_CONVERSATION()
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
IF NOT IS_PED_INJURED(enemyPed[i].ped)
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
ENDIF
ENDREPEAT
ENDIF
ENDIF
BREAK
CASE STAGE_GET_HOME
IF NOT bGotToBeach
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_MICHAEL
KILL_ANY_CONVERSATION()
sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
bDebugJSkip = TRUE
ELSE
KILL_ANY_CONVERSATION()
SETUP_BOAT_AND_BEACH()
ENDIF
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES))
ENDIF
BREAK
ENDSWITCH
ELSE
IF bRunningCutscene
AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
SWITCH currentMissionStage
CASE STAGE_DRIVE_ALONG_TRAIN
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
COMMON_MISSION_CLEAR()
SET_MISSION_STAGE(STAGE_GET_TO_BRIDGE, TRUE)
DO_SCREEN_FADE_IN(500)
BREAK
CASE STAGE_GET_TO_BRIDGE
IF IS_CUTSCENE_ACTIVE()
STOP_CUTSCENE()
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
// previous stage P
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
TRIGGER_MUSIC_EVENT("EXL3_MISSION_FAIL")
IF currentMissionStage <> STAGE_CHASE_TRAIN
OR (currentMissionStage = STAGE_CHASE_TRAIN AND NOT bObjectiveIsJump)
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
COMMON_MISSION_CLEAR()
SWITCH currentMissionStage
CASE STAGE_INTERCEPT_TRAIN
POSITION_PLAYER_AT_MISSION_INIT()
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE)
BREAK
CASE STAGE_CHASE_TRAIN
POSITION_PLAYER_AT_MISSION_INIT()
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE)
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
SET_MISSION_STAGE(STAGE_CHASE_TRAIN, TRUE)
BREAK
CASE STAGE_GET_TO_BRIDGE
SET_MISSION_STAGE(STAGE_DRIVE_ALONG_TRAIN, TRUE)
BREAK
CASE STAGE_GO_TO_CONTAINER
SET_MISSION_STAGE(STAGE_GET_TO_BRIDGE, TRUE)
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
SET_MISSION_STAGE(STAGE_GO_TO_CONTAINER, TRUE)
BREAK
CASE STAGE_RAPIDS_CHASE
SET_MISSION_STAGE(STAGE_STEAL_FROM_CONTAINER, TRUE)
BREAK
CASE STAGE_GET_HOME
SET_MISSION_STAGE(STAGE_RAPIDS_CHASE, TRUE)
BREAK
ENDSWITCH
DO_SCREEN_FADE_IN(500)
ELSE
// custom p skip for jumps
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
AND IS_VEHICLE_DRIVEABLE(missionTrain)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
ENDIF
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
SET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE], <<2754.90259, 5111.79443, 61.78289>>)
SET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE], 11.62)
IF IS_VEHICLE_DRIVEABLE(missionTrain)
SET_MISSION_TRAIN_COORDS(missionTrain, <<2501.48, 5718.51, 61.56>>)
ENDIF
trainMovementState = TRAIN_MOVEMENT_CATCHUP
fTrainCruiseSpeed = 18.0
IF DOES_BLIP_EXIST(gotoBlip)
REMOVE_BLIP(gotoBlip)
ENDIF
bObjectiveIsJump = FALSE
bShownJumpPrompt = FALSE
bShownPathHelp = FALSE
bDoneJumpSpeech = FALSE
iCurrentJump = -1
fPlayerIsOnTrainTimer = 0.0
bDebugWarpToJumps = FALSE
REMOVE_ALL_BLIPS()
ENDIF
ENDIF
ENDIF
ENDIF
// stage menu
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
IF LAUNCH_MISSION_STAGE_MENU(stageMenu, iMenuMissionStage)
// convert debug stage to mission stage
MISSION_STAGE_ENUM setStage
SWITCH iMenuMissionStage
CASE 1
setStage = STAGE_INTERCEPT_TRAIN
BREAK
CASE 2
setStage = STAGE_CHASE_TRAIN
BREAK
CASE 3
setStage = STAGE_DRIVE_ALONG_TRAIN
BREAK
CASE 4
setStage = STAGE_GET_TO_BRIDGE
BREAK
CASE 5
setStage = STAGE_GO_TO_CONTAINER
BREAK
CASE 6
setStage = STAGE_STEAL_FROM_CONTAINER
BREAK
CASE 7
setStage = STAGE_RAPIDS_CHASE
BREAK
CASE 8
setStage = STAGE_GET_HOME
BREAK
ENDSWITCH
IF iMenuMissionStage <= 8
TRIGGER_MUSIC_EVENT("EXL3_MISSION_FAIL")
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
COMMON_MISSION_CLEAR()
IF setStage = STAGE_INTERCEPT_TRAIN
POSITION_PLAYER_AT_MISSION_INIT()
ENDIF
SET_MISSION_STAGE(setStage, TRUE)
DO_SCREEN_FADE_IN(500)
//ELIF iMenuMissionStage = 10
// bEnabledTrainClimbers = NOT bEnabledTrainClimbers
// SETUP_TRAIN_CRASH_DEBUG_MENU()
//ELIF iMenuMissionStage = 11
// bEnabledJeepOnTracks = NOT bEnabledJeepOnTracks
// SETUP_TRAIN_CRASH_DEBUG_MENU()
ENDIF
ENDIF
ENDIF
// stage specific stuff numpad 2
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
SWITCH currentMissionStage
CASE STAGE_CHASE_TRAIN
IF iCurrentJump >= 0
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
ENDIF
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
SET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE], GET_JUMP_COORDS(iCurrentJump))
ENDIF
ENDIF
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
BREAK
ENDSWITCH
ENDIF
ENDPROC
// there must be an easier way to do this
PROC FORMAT_FLOAT_FOR_RB_CAM_DUMP(FLOAT fInputFloat, INT &iBeforeDec, INT &iAfterDec)
IF fInputFloat >= 0
iBeforeDec = FLOOR(fInputFloat)
ELSE
iBeforeDec = CEIL(fInputFloat)
ENDIF
fInputFloat -= iBeforeDec
fInputFloat *= 100
IF fInputFloat < 0
fInputFloat *= (-1)
ENDIF
IF fInputFloat < 10
fInputFloat *= 10
ENDIF
iAfterDec = FLOOR(fInputFloat)
ENDPROC
// dump the cam coords to a widget
PROC DO_RB_DEBUG_CAM_DUMP()
IF bRBDebugCamDoDump
CAMERA_INDEX tempCam = GET_DEBUG_CAM()
vRBDebugCamPos = GET_CAM_COORD(tempCam)
vRBDebugCamRot = GET_CAM_ROT(tempCam)
fRBDebugCamFOV = GET_CAM_FOV(tempCam)
TEXT_LABEL_63 tPos
TEXT_LABEL_63 tRot
INT iBefore, iAfter
// fill position
tPos = "<<"
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.x, iBefore, iAfter)
tPos += iBefore
tPos += "."
tPos += iAfter
tPos += ", "
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.y, iBefore, iAfter)
tPos += iBefore
tPos += "."
tPos += iAfter
tPos += ", "
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.z, iBefore, iAfter)
tPos += iBefore
tPos += "."
tPos += iAfter
tPos += ">>"
// fill rotation
tRot = "<<"
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.x, iBefore, iAfter)
tRot += iBefore
tRot += "."
tRot += iAfter
tRot += ", "
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.y, iBefore, iAfter)
tRot += iBefore
tRot += "."
tRot += iAfter
tRot += ", "
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.z, iBefore, iAfter)
tRot += iBefore
tRot += "."
tRot += iAfter
tRot += ">>"
// set widgets
SET_CONTENTS_OF_TEXT_WIDGET(RBCamPosWidget, tPos)
SET_CONTENTS_OF_TEXT_WIDGET(RBCamRotWidget, tRot)
bRBDebugCamDoDump = FALSE
ENDIF
ENDPROC
#ENDIF
// main script
SCRIPT
SET_MISSION_FLAG(TRUE)
IF HAS_FORCE_CLEANUP_OCCURRED()
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, bHasChanged)
Mission_Flow_Mission_Force_Cleanup()
MISSION_CLEANUP()
ENDIF
#IF IS_DEBUG_BUILD
CREATE_TRAIN_CRASH_WIDGETS()
SETUP_TRAIN_CRASH_DEBUG_MENU()
#ENDIF
/*
#IF IS_DEBUG_BUILD
IF bSwitchCamDebugScenarioEnabled
//SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR(scsSwitchCamMichaelToTrevorRiver, trainCrashVehicle[TCV_DINGHY], trainCrashVehicle[TCV_DINGHY])
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER(scsSwitchCamMichealToTrevorContainer, piMichaelContainerSwitch, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
//SETUP_SPLINE_CAM_NODE_ARRAY_TREVOR_TO_MICHAEL(scsSwitchCamTrevorToMichaelRiver, trainCrashVehicle[TCV_DINGHY], trainCrashVehicle[TCV_DINGHY])
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_INTRO(scsSwitchCamTrainToBoat_Intro, missionTrain)
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO(scsSwitchCamTrainToBoat_Outro, trainCrashVehicle[TCV_DINGHY])
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrainToBoat_Intro, "Train", "", trainCrashWidgets)
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrainToBoat_Outro, "Boat", "", trainCrashWidgets)
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichealToTrevorContainer, "Michael Container", "Trevor Container", trainCrashWidgets)
//CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichaelToTrevorRiver, "Michael", "Trevor", trainCrashWidgets)
// CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrevorToMichaelRiver, "Trevor", "Michael", trainCrashWidgets)
ENDIF
#ENDIF
*/
//TRACE_NATIVE_COMMAND("set_gameplay_cam_relative_heading")
WHILE TRUE
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_Derailed")
//g_bDontLetBuddiesReactToNextPlayerDeath = TRUE
IF INIT_MISSION()
#IF IS_DEBUG_BUILD
IF bSwitchCamDebugScenarioEnabled
UPDATE_SPLINE_CAM_HELPERS()
// UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichaelToTrevorRiver)
// UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrevorToMichaelRiver)
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrainToBoat_Intro)
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrainToBoat_Outro)
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichealToTrevorContainer)
ENDIF
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// do streaming for next stage
DO_STREAMING_FOR_NEXT_MISSION_STAGE(FALSE)
// do fail checks
IF NOT bPreventMissionFail_SwitchCamDebug
HANDLE_MISSION_FAIL_STATE()
ENDIF
// handle train
IF currentMissionStage <= STAGE_GET_TO_BRIDGE
HANDLE_TRAIN_SPEED()
ENDIF
// damage stat
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID())
ENDIF
// head tracking
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
// run appropriate stage
SWITCH currentMissionStage
CASE STAGE_INTERCEPT_TRAIN
DO_STAGE_INTERCEPT_TRAIN()
BREAK
CASE STAGE_CHASE_TRAIN
DO_STAGE_CHASE_TRAIN()
BREAK
CASE STAGE_DRIVE_ALONG_TRAIN
DO_STAGE_DRIVE_ALONG_TRAIN()
BREAK
CASE STAGE_GET_TO_BRIDGE
DO_STAGE_GET_TO_BRIDGE()
BREAK
CASE STAGE_GO_TO_CONTAINER
DO_STAGE_GO_TO_CONTAINER()
BREAK
CASE STAGE_STEAL_FROM_CONTAINER
DO_STAGE_STEAL_FROM_CONTAINER()
BREAK
CASE STAGE_RAPIDS_CHASE
DO_STAGE_RAPIDS_CHASE()
BREAK
CASE STAGE_GET_HOME
DO_STAGE_GET_HOME()
BREAK
ENDSWITCH
ENDIF
#IF IS_DEBUG_BUILD
IF CAN_ADVANCE_MISSION()
DO_DEBUG_SKIPS()
ENDIF
DO_RB_DEBUG_CAM_DUMP()
#ENDIF
ENDIF
//printstring("pos = ") printvector(get_entity_coords(traincrashvehicle[tcv_dinghy])) printnl()
//printstring("rot = ") printvector(get_entity_rotation(traincrashvehicle[tcv_dinghy])) printnl()
//IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1)
// PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
//ENDIF
//IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
// PLAY_SOUND_FRONTEND(-1, "EXILE_3_TRAIN_BRAKE_RELEASE_MASTER")
//ENDIF
/*
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, 23000 - GET_TIME_POSITION_IN_RECORDING(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh))
ENDIF
ENDIF
ENDIF
*/
WAIT(0)
ENDWHILE
ENDSCRIPT