////////////////////////////////////////////////////////////////////////////////////////// // // // 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, <>) 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(), <>) 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, <>, 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 = <> 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 = <> 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 = <> 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, <>) 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, <>) 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, <>) 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], <>)) //SET_CAM_ROT(sCamDetails.camInterpIDs[4], <>) //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>>, <>, 255, 255, 0, 178) IF DOES_BLIP_EXIST(gotoBlip) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vJumpCoords, <>, 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), <>, 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, <>, <<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), <>, 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], <>) OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_BEACH_TRUCK], <>) 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