22409 lines
746 KiB
Python
Executable File
22409 lines
746 KiB
Python
Executable File
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// SCRIPT NAME : Exile 3 - Train Crash //
|
|
// AUTHOR : Rob Bray //
|
|
// DESCRIPTION : Player engineers a train crash to steal an item //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
USING "brains.sch"
|
|
USING "script_player.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_graphics.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_interiors.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_vehicle.sch"
|
|
USING "commands_fire.sch"
|
|
USING "commands_physics.sch"
|
|
USING "commands_cutscene.sch"
|
|
USING "selector_public.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "rappel_public.sch"
|
|
USING "trains_control_public.sch"
|
|
USING "flow_public_core_override.sch"
|
|
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
|
|
USING "script_blips.sch"
|
|
USING "script_buttons.sch"
|
|
USING "script_ped.sch"
|
|
USING "select_mission_stage.sch"
|
|
USING "replay_public.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "mission_stat_public.sch"
|
|
USING "seamless_cuts.sch"
|
|
USING "clearMissionArea.sch"
|
|
USING "CompletionPercentage_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "building_control_public.sch"
|
|
USING "taxi_functions.sch"
|
|
USING "flip_off_public.sch"
|
|
USING "respawn_location_private.sch"
|
|
USING "commands_pad.sch"
|
|
USING "spline_cam_edit.sch"
|
|
USING "net_fps_cam.sch"
|
|
USING "commands_recording.sch"
|
|
USING "push_in_public.sch"
|
|
|
|
// RE ADD FOUND BOMB DELAY TIME AND remove WIDE EXPLOSION SPHERE CHECK
|
|
// REMEMBER TO REMOVE DEBUG PLAYTHROUGH WEAPON GIVES!
|
|
// FIGURE OUT WHAT'S GOING ON WITH GUYS NOT DYING IN WATER
|
|
|
|
// Enums
|
|
ENUM MISSION_INIT_STAGE_ENUM
|
|
MISSION_INIT_PRE_INTRO = 0,
|
|
MISSION_INIT_REQUEST_INTRO,
|
|
MISSION_INIT_WAIT_FOR_INTRO,
|
|
MISSION_INIT_PRE_TIMELAPSE,
|
|
MISSION_INIT_PLAY_INTRO,
|
|
MISSION_INIT_DONE
|
|
ENDENUM
|
|
|
|
ENUM MISSION_STAGE_ENUM
|
|
STAGE_INTERCEPT_TRAIN = 0,
|
|
STAGE_CHASE_TRAIN,
|
|
STAGE_DRIVE_ALONG_TRAIN,
|
|
STAGE_GET_TO_BRIDGE,
|
|
STAGE_GO_TO_CONTAINER,
|
|
STAGE_STEAL_FROM_CONTAINER,
|
|
STAGE_RAPIDS_CHASE,
|
|
STAGE_GET_HOME
|
|
ENDENUM
|
|
|
|
ENUM FAIL_REASON_ENUM
|
|
FAIL_MICHAEL_DEAD = 0,
|
|
FAIL_TREVOR_DEAD,
|
|
FAIL_MISSED_JUMPS,
|
|
FAIL_TRAIN_STOPPED,
|
|
FAIL_TRAIN_DEAD,
|
|
FAIL_LOST_TRAIN,
|
|
FAIL_FELL_OFF_TRAIN,
|
|
FAIL_CAR_DEAD,
|
|
FAIL_BIKE_DEAD,
|
|
FAIL_BOAT_DEAD,
|
|
FAIL_BOAT_GROUNDED,
|
|
FAIL_CONTAINER_INACCESSIBLE,
|
|
FAIL_NO_STICKY_BOMBS,
|
|
FAIL_ABANDONED_TREVOR,
|
|
FAIL_ABANDONED_MICHAEL,
|
|
FAIL_ABANDONED_CONTAINER,
|
|
FAIL_ABANDONED_GETAWAY_VEHICLES,
|
|
FAIL_ABANDONED_BIKE,
|
|
FAIL_ABANDONED_DINGHY,
|
|
FAIL_ABANDONED_ESCAPE_ROUTE,
|
|
FAIL_BEACH_CAR_DEAD,
|
|
FAIL_TOO_LATE_BRIDGE,
|
|
FAIL_BIKE_STUCK,
|
|
FAIL_RON_DEAD,
|
|
FAIL_PATRICIA_DEAD
|
|
ENDENUM
|
|
|
|
ENUM MISSION_FAIL_STATE_ENUM
|
|
MISSION_FAIL_STATE_NOT_FAILED = 0,
|
|
MISSION_FAIL_STATE_WAIT_FOR_FADE
|
|
ENDENUM
|
|
|
|
ENUM MISSION_HOTSWAP_STAGE_ENUM
|
|
MISSION_HOTSWAP_STAGE_SELECT_CHARACTER = 0,
|
|
MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM,
|
|
MISSION_HOTSWAP_STAGE_DONE
|
|
ENDENUM
|
|
|
|
ENUM MISSION_STREAMING_STAGE_ENUM
|
|
MISSION_STREAMING_STAGE_REQUEST = 0,
|
|
MISSION_STREAMING_STAGE_WAIT,
|
|
MISSION_STREAMING_STAGE_COMPLETE
|
|
ENDENUM
|
|
|
|
ENUM MOCAP_STREAMING_STAGE_ENUM
|
|
MOCAP_STREAMING_STAGE_REQUEST = 0,
|
|
MOCAP_STREAMING_STAGE_WAIT,
|
|
MOCAP_STREAMING_STAGE_COMPLETE
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_MODEL_ENUM
|
|
TCM_MICHAEL = 0,
|
|
TCM_TREVOR,
|
|
TCM_ENGINEER,
|
|
TCM_SOLDIER,
|
|
TCM_TRAIN_ENGINE,
|
|
TCM_TRAIN_CONTAINER2,
|
|
TCM_TRAIN_FLATBED,
|
|
TCM_BIKE,
|
|
TCM_MICHAEL_CAR,
|
|
TCM_CHASE_CHOPPER,
|
|
TCM_BEACH_CAR,
|
|
TCM_BEACH_TRUCK,
|
|
TCM_DINGHY,
|
|
TCM_ENEMY_DINGHY,
|
|
TCM_MERC_CAR,
|
|
TCM_MERC_TRUCK,
|
|
TCM_CONTAINER_DOORS,
|
|
TCM_CRATE,
|
|
TCM_CASE,
|
|
TCM_ANCHOR,
|
|
TCM_DEBRIS_CRATE,
|
|
TCM_DEBRIS_BARREL,
|
|
TCM_DOOR_COLLISION_SHUT,
|
|
TCM_DOOR_OPEN,
|
|
TCM_TRAILER_DOOR,
|
|
TCM_PATRICIA,
|
|
TCM_RON
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_VECTOR_ENUM
|
|
TCVEC_PLAYER_INIT = 0,
|
|
TCVEC_MICHAEL_INIT,
|
|
TCVEC_MICHAEL_AT_CONTAINER,
|
|
TCVEC_MICHAEL_IN_CONTAINER,
|
|
TCVEC_MICHAEL_AT_BEACH,
|
|
TCVEC_BIKE_INIT,
|
|
TCVEC_BIKE_CHASE,
|
|
TCVEC_MICHAEL_CAR_INIT,
|
|
TCVEC_SECOND_TRAIN_INIT,
|
|
TCVEC_TRAIN_CRASH_INIT,
|
|
TCVEC_BIKE_DRIVE_ALONG_TRAIN,
|
|
TCVEC_PURSUIT_FOLLOW_STAGE,
|
|
TCVEC_TREVOR_BRIDGE,
|
|
TCVEC_TREVOR_WATER,
|
|
TCVEC_TREVOR_IN_WATER_INIT,
|
|
TCVEC_TREVOR_SHOOTOUT_INIT,
|
|
TCVEC_TREVOR_SHOOTOUT_INIT_REPLAY,
|
|
TCVEC_TREVOR_AT_BEACH,
|
|
TCVEC_BRIDGE_TRIGGER,
|
|
TCVEC_DINGHY_INIT,
|
|
TCVEC_DINGHY_AT_BRIDGE,
|
|
TCVEC_DINGHY_AT_CONTAINER,
|
|
TCVEC_DINGHY_AT_CONTAINER_ROTATION,
|
|
TCVEC_DINGHY_AT_RAPIDS,
|
|
TCVEC_DINGHY_AT_BEACH,
|
|
TCVEC_BEACH_CAR_INIT,
|
|
TCVEC_SILOS,
|
|
TCVEC_PATH_START,
|
|
TCVEC_RAPPEL_ANCHOR_POS,
|
|
TCVEC_RAPPEL_ANCHOR_ROT,
|
|
TCVEC_CONTAINER_IN_RIVER,
|
|
TCVEC_ACCESS_CONTAINER,
|
|
TCVEC_BLIP_CONTAINER,
|
|
TCVEC_IN_CONTAINER,
|
|
TCVEC_PACKAGE,
|
|
TCVEC_RIVER_MOUTH,
|
|
TCVEC_BOAT_ATTACH,
|
|
TCVEC_BEACH,
|
|
TCVEC_BEACH_VEHICLES,
|
|
TCVEC_RON_HOUSE,
|
|
TCVEC_CLIMB_DOWN_START,
|
|
TCVEC_ATTACH_BIKE_OFFSET,
|
|
TCVEC_TRAIN_SWAY_INIT,
|
|
TCVEC_TRAIN_CAM_ATTACH,
|
|
TCVEC_TRAIN_CAM_POINT,
|
|
TCVEC_CRASH,
|
|
TCVEC_GUNS_CHOPPER_HOVER,
|
|
TCVEC_DROPOFF_CHOPPER_HOVER,
|
|
TCVEC_MOVE_LAST_PLAYER_VEHICLE,
|
|
TCVEC_CONTAINER_ANIM_POS,
|
|
TCVEC_CONTAINER_ANIM_ROT,
|
|
TCVEC_TAKE_COVER,
|
|
TCVEC_INIT_BIKE_CAM_OFFSET,
|
|
TCVEC_END_BIKE_CAM_OFFSET
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_VEHICLE_ENUM
|
|
TCV_BIKE = 0,
|
|
TCV_DINGHY,
|
|
TCV_MICHAEL_CAR,
|
|
TCV_BEACH_CAR,
|
|
TCV_BEACH_TRUCK
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_SHOT_DETAILS_ENUM
|
|
TC_SHOT_JUMP1 = 0,
|
|
TC_SHOT_JUMP1B,
|
|
TC_SHOT_JUMP2,
|
|
TC_SHOT_JUMP2B,
|
|
TC_SHOT_JUMP3,
|
|
TC_SHOT_JUMP3B,
|
|
TC_SHOT_JUMP4,
|
|
TC_SHOT_JUMP4B,
|
|
TC_SHOT_JUMP5,
|
|
TC_SHOT_JUMP5B,
|
|
TC_SHOT_CRASH_BRIDGE,
|
|
TC_SHOT_START_DRILL,
|
|
TC_SHOT_START_DRILLB,
|
|
TC_SHOT_PLANT_BOMB,
|
|
TC_SHOT_INTO_BOAT,
|
|
TC_SHOT_EXPLODE_DOORS,
|
|
TC_SHOT_ENTER_CONTAINER,
|
|
TC_SHOT_WATERFALL,
|
|
TC_SHOT_WATERFALLB,
|
|
TC_SHOT_END
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_ANIM_DICT_ENUM
|
|
TC_ANIM_DICT_MISSION = 0,
|
|
TC_ANIM_DICT_TRAIN,
|
|
TC_ANIM_DICT_BIKE_LAND,
|
|
//TC_ANIM_DICT_RAPPEL,
|
|
TC_ANIM_DICT_RPG,
|
|
TC_ANIM_DICT_DOORS,
|
|
TC_ANIM_DICT_TREVOR_IDLE_ENTER,
|
|
TC_ANIM_DICT_TREVOR_IDLE_BASE,
|
|
TC_ANIM_DICT_TREVOR_IDLE_VAR,
|
|
TC_ANIM_DICT_TREVOR_IDLE_EXIT,
|
|
TC_ANIM_DICT_CRASH,
|
|
TC_ANIM_DICT_SWITCH
|
|
//TC_ANIM_DICT_GESTURE_ENT,
|
|
//TC_ANIM_DICT_GESTURES
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_WEAPON_ENUM
|
|
TC_WEAPON_SMG = 0,
|
|
TC_WEAPON_PISTOL,
|
|
TC_WEAPON_SHOTGUN,
|
|
TC_WEAPON_STICKY_BOMB,
|
|
TC_WEAPON_MERC_RIFLE,
|
|
TC_WEAPON_MG,
|
|
TC_WEAPON_BACKUP_RIFLE,
|
|
TC_WEAPON_SNIPER_RIFLE,
|
|
TC_WEAPON_CASE
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_PTFX_ENUM
|
|
TC_PTFX_SCRIPT = 0
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_SFX_ENUM
|
|
TC_SFX_TRAIN_FALL = 0
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_MISC_ASSET_ENUM
|
|
TC_MISC_ASSET_DINGHY_ANIMS = 0
|
|
//TC_MISC_ASSET_TOWN_PATHS
|
|
//TC_MISC_ASSET_BRIEFCASE_CLIPSET
|
|
ENDENUM
|
|
|
|
ENUM ENEMY_VEHICLE_ENUM
|
|
EV_SHOOTOUT_FIRST_WAVE_BOAT_1 = 0,
|
|
EV_SHOOTOUT_FIRST_WAVE_BOAT_2,
|
|
EV_SHOOTOUT_FIRST_WAVE_BOAT_3,
|
|
EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1,
|
|
EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1,
|
|
EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1,
|
|
EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1,
|
|
EV_CHASE_FIRST_BOAT_WAVE_BOAT_1,
|
|
EV_CHASE_FIRST_BOAT_WAVE_BOAT_2,
|
|
EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
ENDENUM
|
|
|
|
ENUM ENEMY_PED_ENUM
|
|
EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER = 0,
|
|
EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR,
|
|
EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER,
|
|
EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR,
|
|
EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER,
|
|
EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR,
|
|
EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT,
|
|
EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL,
|
|
EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR,
|
|
EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT,
|
|
EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL,
|
|
EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR,
|
|
EP_SHOOTOUT_THIRD_WAVE_FOOT_1,
|
|
EP_SHOOTOUT_THIRD_WAVE_FOOT_2,
|
|
EP_SHOOTOUT_THIRD_WAVE_FOOT_3,
|
|
EP_SHOOTOUT_THIRD_WAVE_FOOT_4,
|
|
EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT,
|
|
EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL,
|
|
EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR,
|
|
EP_SHOOTOUT_FIFTH_WAVE_FOOT_1,
|
|
EP_SHOOTOUT_FIFTH_WAVE_FOOT_2,
|
|
//EP_SHOOTOUT_FIFTH_WAVE_FOOT_3,
|
|
//EP_SHOOTOUT_FIFTH_WAVE_FOOT_4,
|
|
EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT,
|
|
EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER,
|
|
EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_PASSFR,
|
|
EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER,
|
|
EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR,
|
|
EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER,
|
|
EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSFR,
|
|
EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
|
|
ENDENUM
|
|
|
|
ENUM ENEMY_WAVE_ENUM
|
|
EW_SHOOTOUT_FIRST_WAVE = 0,
|
|
EW_SHOOTOUT_SECOND_WAVE,
|
|
EW_SHOOTOUT_THIRD_WAVE,
|
|
EW_SHOOTOUT_FOURTH_WAVE,
|
|
EW_SHOOTOUT_FIFTH_WAVE,
|
|
EW_CHASE_FIRST_HELI_WAVE,
|
|
EW_CHASE_FIRST_BOAT_WAVE,
|
|
EW_CHASE_FIRST_CAR_WAVE
|
|
ENDENUM
|
|
|
|
ENUM ENEMY_VEHICLE_AI_ENUM
|
|
EVAI_FOLLOW_RECORDING = 0,
|
|
EVAI_TEMPACTION,
|
|
EVAI_DRIVE_TO_COORD,
|
|
EVAI_FOLLOW_DINGHY,
|
|
EVAI_FOLLOW_WAYPOINT,
|
|
EVAI_ANCHOR,
|
|
EVAI_FLY_TO_COORD,
|
|
EVAI_FLY_ACHIEVE_HEADING,
|
|
EVAI_CHOPPER_STRAFE,
|
|
EVAI_CHOPPER_GUNS_STATIC,
|
|
EVAI_CHOPPER_ATTACK,
|
|
EVAI_CHOPPER_ATTACK_COORD,
|
|
EVAI_CAR_DRIVE_ALONG_RIVER,
|
|
EVAI_NONE
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_CUTSCENE_STAGE_ENUM
|
|
TC_CUT_STAGE_INIT = 0,
|
|
TC_CUT_STAGE_RUNNING,
|
|
TC_CUT_STAGE_CLEANUP
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_RIDE_STATE_ENUM
|
|
TRAIN_RIDE_STATE_LOW = 0,
|
|
TRAIN_RIDE_STATE_CLIMB_LADDER,
|
|
TRAIN_RIDE_STATE_HIGH
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CAM_ENUM
|
|
TRAIN_CAM_RIDE_LOW = 0,
|
|
TRAIN_CAM_RIDE_HIGH,
|
|
TRAIN_CAM_OFF_BIKE,
|
|
TRAIN_CAM_CLIMB_DOWN,
|
|
TRAIN_CAM_CLIMB_UP,
|
|
TRAIN_CAM_BASHING
|
|
ENDENUM
|
|
|
|
ENUM JACKING_TRAIN_SHOT_ENUM
|
|
JACKING_TRAIN_OFF_BIKE = 0,
|
|
JACKING_TRAIN_BASH_DRIVER,
|
|
JACKING_TRAIN_READY_TO_JUMP
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_SHOT_ENUM
|
|
TRAIN_CRASH_RAYFIRE = 0,
|
|
TRAIN_CRASH_MICHAEL_ONTO_CONTAINER
|
|
ENDENUM
|
|
|
|
ENUM PLANT_BOMB_SHOT_ENUM
|
|
PLANT_BOMB_DOOR = 0,
|
|
PLANT_BOMB_BOAT
|
|
ENDENUM
|
|
|
|
ENUM ENTER_CONTAINER_SHOT_ENUM
|
|
ENTER_CONTAINER_EXPLODE_DOORS = 0,
|
|
ENTER_CONTAINER_WALK_IN
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_MOVEMENT_STATE_ENUM
|
|
TRAIN_MOVEMENT_STOPPED = 0,
|
|
TRAIN_MOVEMENT_VERY_SLOW,
|
|
TRAIN_MOVEMENT_SLOW,
|
|
TRAIN_MOVEMENT_FAST,
|
|
TRAIN_MOVEMENT_CATCHUP
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_HOTSWAP_STATE_ENUM
|
|
TRAIN_HOTSWAP_ON_TREVOR = 0,
|
|
TRAIN_HOTSWAP_ON_MICHAEL,
|
|
TRAIN_HOTSWAP_TO_TREVOR,
|
|
TRAIN_HOTSWAP_TO_MICHAEL
|
|
ENDENUM
|
|
|
|
ENUM BOAT_HOTSWAP_STATE_ENUM
|
|
BOAT_HOTSWAP_ON_TREVOR = 0,
|
|
BOAT_HOTSWAP_ON_MICHAEL,
|
|
BOAT_HOTSWAP_TO_TREVOR,
|
|
BOAT_HOTSWAP_TO_MICHAEL
|
|
ENDENUM
|
|
|
|
ENUM HOTSWAP_CAM_ENUM
|
|
HOTSWAP_CAM_DEFAULT = 0,
|
|
HOTSWAP_CAM_SHORT,
|
|
HOTSWAP_CAM_STRAIGHT,
|
|
HOTSWAP_CAM_FORCE_ON_EXPLOSION,
|
|
HOTSWAP_CAM_TRAIN_TO_BOAT,
|
|
HOTSWAP_CAM_BOAT_TO_TRAIN,
|
|
HOTSWAP_CAM_THROUGH_TUNNEL_TO_TRAIN,
|
|
HOTSWAP_CAM_WRECKAGE_TO_BOAT
|
|
ENDENUM
|
|
|
|
ENUM BOAT_RPG_STATE_ENUM
|
|
BOAT_RPG_NOT_STARTED = 0,
|
|
BOAT_RPG_GET_IN_POSITION,
|
|
BOAT_RPG_USING,
|
|
BOAT_RPG_RETURN_TO_SEAT,
|
|
BOAT_RPG_DONE
|
|
ENDENUM
|
|
|
|
ENUM ENEMY_RAPPEL_STATE_ENUM
|
|
ENEMY_RAPPEL_STATE_CLAMBERING = 0,
|
|
ENEMY_RAPPEL_STATE_WAIT_ON_ROPE,
|
|
ENEMY_RAPPEL_STATE_RAPPELLING,
|
|
ENEMY_RAPPEL_STATE_SHOOTING
|
|
ENDENUM
|
|
|
|
ENUM ENEMY_BRIDGE_STATE_ENUM
|
|
ENEMY_BRIDGE_STATE_NOT_STARTED = 0,
|
|
ENEMY_BRIDGE_STATE_AIMING,
|
|
ENEMY_BRIDGE_STATE_SHOOTING_EAST,
|
|
ENEMY_BRIDGE_STATE_MOVE_SIDES,
|
|
ENEMY_BRIDGE_STATE_SHOOTING_WEST,
|
|
ENEMY_BRIDGE_STATE_COMBAT
|
|
ENDENUM
|
|
|
|
ENUM MICHAEL_TREVOR_ARGUE_STAGE_ENUM
|
|
MT_ARGUE_WAIT = 0,
|
|
MT_ARGUE_TREVOR,
|
|
MT_ARGUE_MICHAEL
|
|
ENDENUM
|
|
|
|
ENUM BEACH_CREATION_STAGE
|
|
BEACH_CREATION_NOT_STARTED = 0,
|
|
BEACH_CREATION_REQUESTING,
|
|
BEACH_CREATION_DONE
|
|
ENDENUM
|
|
|
|
ENUM CREATE_MERC_PICKUP_STAGE_ENUM
|
|
CREATE_MERC_PICKUP_STAGE_NOT_STARTED = 0,
|
|
CREATE_MERC_PICKUP_STAGE_WAITING,
|
|
CREATE_MERC_PICKUP_STAGE_DONE
|
|
ENDENUM
|
|
|
|
ENUM CASE_STATE_ENUM
|
|
CASE_IN_HAND_ANIM = 0,
|
|
CASE_IN_HAND_ANIM_2,
|
|
CASE_IN_HAND_GAMEPLAY,
|
|
CASE_UNDER_SEAT
|
|
ENDENUM
|
|
|
|
ENUM RAPIDS_SPEECH_INTERRUPT_ENUM
|
|
RSI_CHOPPER_INTRO = 0,
|
|
RSI_CHOPPER_REMINDER,
|
|
RSI_BOATS_INTRO,
|
|
RSI_BOATS_REMINDER_1,
|
|
RSI_BOATS_REMINDER_2,
|
|
RSI_BOATS_REMINDER_3,
|
|
RSI_CARS_INTRO,
|
|
RSI_CARS_REMINDER,
|
|
RSI_CARS_REMINDER_2,
|
|
RSI_M_DEST_CHOPPER,
|
|
RSI_M_DEST_BOAT,
|
|
RSI_T_DEST_CHOPPER,
|
|
RSI_T_DEST_BOAT
|
|
ENDENUM
|
|
|
|
ENUM CREATE_TRAIN_STAGE_ENUM
|
|
CREATE_TRAIN_STAGE_NOT_STARTED = 0,
|
|
CREATE_TRAIN_STAGE_WAITING,
|
|
CREATE_TRAIN_STAGE_DONE
|
|
ENDENUM
|
|
|
|
ENUM CREATE_ENGINEER_STAGE_ENUM
|
|
CREATE_ENGINEER_STAGE_NOT_STARTED = 0,
|
|
CREATE_ENGINEER_STAGE_WAITING,
|
|
CREATE_ENGINEER_STAGE_DONE
|
|
ENDENUM
|
|
|
|
ENUM CLIMB_ENEMY_STATE_ENUM
|
|
CLIMB_ENEMY_STATE_NOT_CREATED = 0,
|
|
CLIMB_ENEMY_STATE_CLIMBING,
|
|
CLIMB_ENEMY_STATE_SHOOTING,
|
|
CLIMB_ENEMY_STATE_KNOCKED_OFF
|
|
ENDENUM
|
|
|
|
ENUM MICHAEL_DRIVEBY_STATE_ENUM
|
|
MICHAEL_DRIVEBY_WAITING = 0,
|
|
MICHAEL_DRIVEBY_FIND_TARGET,
|
|
MICHAEL_DRIVEBY_SHOOTING
|
|
ENDENUM
|
|
|
|
ENUM CHECK_FIRST_JUMP_STATE_ENUM
|
|
CHECK_FIRST_JUMP_STATE_NOT_STARTED = 0,
|
|
CHECK_FIRST_JUMP_STATE_CHECKING,
|
|
CHECK_FIRST_JUMP_STATE_DONE
|
|
ENDENUM
|
|
|
|
ENUM TRAIN_CRASH_AUDIO_SCENE_ENUM
|
|
TRAIN_CRASH_AUDIO_SCENE_BIKE_START = 0,
|
|
TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN,
|
|
TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP,
|
|
TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE,
|
|
TRAIN_CRASH_AUDIO_SCENE_HIJACK_TRAIN,
|
|
TRAIN_CRASH_AUDIO_SCENE_RIDE_TRAIN,
|
|
TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL,
|
|
TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL,
|
|
TRAIN_CRASH_AUDIO_SCENE_GET_TO_BRIDGE,
|
|
TRAIN_CRASH_AUDIO_SCENE_COLLISION,
|
|
TRAIN_CRASH_AUDIO_SCENE_RAYFIRE,
|
|
TRAIN_CRASH_AUDIO_SCENE_PLANT_BOMB,
|
|
TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL,
|
|
TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR,
|
|
TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL,
|
|
TRAIN_CRASH_AUDIO_SCENE_GET_TO_BEACH,
|
|
TRAIN_CRASH_AUDIO_SCENE_HELI_1,
|
|
TRAIN_CRASH_AUDIO_SCENE_HELI_2,
|
|
TRAIN_CRASH_AUDIO_SCENE_HELI_3,
|
|
TRAIN_CRASH_AUDIO_SCENE_HELI_4,
|
|
TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL
|
|
ENDENUM
|
|
|
|
ENUM TREVOR_IDLE_STATE_ENUM
|
|
TREVOR_IDLE_STATE_NOT_STARTED = 0,
|
|
TREVOR_IDLE_STATE_ENTERING,
|
|
TREVOR_IDLE_STATE_BASE,
|
|
TREVOR_IDLE_STATE_VAR,
|
|
TREVOR_IDLE_STATE_CLEAR,
|
|
TREVOR_IDLE_STATE_DONE
|
|
ENDENUM
|
|
|
|
ENUM SWAP_CARRIAGE_STATE_ENUM
|
|
SWAP_CARRIAGE_STATE_NOT_STARTED = 0,
|
|
SWAP_CARRIAGE_STATE_WAITING,
|
|
SWAP_CARRIAGE_STATE_DONE
|
|
ENDENUM
|
|
|
|
ENUM GOTO_FOAM_STATE_ENUM
|
|
GOTO_FOAM_STATE_NOT_STARTED = 0,
|
|
GOTO_FOAM_STATE_WAITING,
|
|
GOTO_FOAM_STATE_DONE
|
|
ENDENUM
|
|
|
|
// Consts
|
|
CONST_INT NUMBER_MODEL_REQUEST_SLOTS COUNT_OF(TRAIN_CRASH_MODEL_ENUM)
|
|
CONST_INT NUMBER_RECORDING_REQUEST_SLOTS 23
|
|
CONST_INT NUMBER_WAYPOINT_REQUEST_SLOTS 9
|
|
CONST_INT NUMBER_ENGINEERS 1
|
|
CONST_INT NUMBER_BEACH_PEDS 2
|
|
CONST_INT NUMBER_MERC_PICKUP_PEDS 5
|
|
CONST_INT NUMBER_MERC_PICKUP_VEHICLES 5
|
|
CONST_INT NUMBER_CLIMB_ENEMIES 2
|
|
CONST_INT NUMBER_JUMPS 4//5
|
|
CONST_INT NUMBER_SPLINE_CAMS 20
|
|
CONST_INT NUMBER_CRASH_FIRES 2
|
|
//CONST_INT NUMBER_RAPPEL_ENEMIES 2
|
|
CONST_INT NUMBER_BRIDGE_ENEMIES 4
|
|
CONST_INT NUMBER_CRATES 5
|
|
CONST_INT NUMBER_DEBRIS 8
|
|
CONST_INT NUMBER_SPLASHES 14
|
|
CONST_INT NUMBER_POSITION_TREVOR_CHECKS 18
|
|
CONST_INT NUMBER_CHOPPER_NODES 7
|
|
CONST_INT MAX_SKIP_MENU_LENGTH 10
|
|
CONST_INT SKIP_FADE_WAIT_TIME 200
|
|
CONST_INT SKIP_FADE_LONG_WAIT_TIME 1000
|
|
CONST_INT PLAYER_VEHICLE_SEARCH_FLAGS VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES | VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES | VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_GROUP_MEMBERS | VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_PLAYER | VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED | VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_WITH_PEDS_ENTERING_OR_EXITING | VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK
|
|
|
|
CONST_INT MIN_RANDOM_SPEECH_TIME 7000
|
|
CONST_INT MAX_RANDOM_SPEECH_TIME 12000
|
|
CONST_INT PURSUIT_VEHICLE_INITIAL_REC_TIME 16000
|
|
CONST_INT PURSUIT_VEHICLE_SKIP_REC_TIME 26000
|
|
|
|
CONST_FLOAT CLEAR_POS_RADIUS 3.2
|
|
|
|
CONST_FLOAT TRAVERSE_MOVING_TRAIN_SPEED 1.6
|
|
CONST_FLOAT TRAVERSE_HANGING_TRAIN_SPEED 0.68
|
|
CONST_FLOAT CATCHUP_Y_COORD 5150.0
|
|
CONST_FLOAT FAIL_STOP_X 50.0
|
|
CONST_FLOAT TRAIN_STOP_X 10.0
|
|
CONST_FLOAT LOSE_TRAIN_DISTANCE 600.0
|
|
CONST_FLOAT STANDARD_RUBBERBAND_DISTANCE 100.0
|
|
CONST_FLOAT DRIVE_ALONG_TRAIN_SPEED 11.0//13.0//14.0//0.0//20.0
|
|
CONST_FLOAT MIN_STANDARD_TRAIN_SPEED 35.0//18.0//20.0
|
|
CONST_FLOAT MAX_STANDARD_TRAIN_SPEED 40.0//30.0//38.0
|
|
CONST_FLOAT JACK_TRAIN_SPEED 25.0
|
|
CONST_FLOAT GET_TO_BRIDGE_TRAIN_SPEED 55.0
|
|
CONST_FLOAT GET_TO_BRIDGE_SLOW_TRAIN_SPEED 30.0
|
|
CONST_FLOAT TRAIN_CHASE_ACCELERATION 1.86
|
|
CONST_FLOAT TRAIN_CHASE_DECELERATION 3.5
|
|
CONST_FLOAT TRAIN_CATCHUP_ACCELERATION 0.8//1.60
|
|
CONST_FLOAT TRAIN_CATCHUP_DECELERATION 1.0//4.0
|
|
CONST_FLOAT TRAIN_STANDARD_ACCELERATION 1.0
|
|
CONST_FLOAT TRAIN_STANDARD_DECELERATION 0.8
|
|
CONST_FLOAT TRAIN_SABOTAGE_ACCELERATION 1.2
|
|
CONST_FLOAT TRAIN_SABOTAGE_DECELERATION 0.35
|
|
|
|
CONST_FLOAT SKIP_REC_AFTER_WATERFALL 7900.0//9500.0
|
|
|
|
CONST_FLOAT TRAIN_CAM_FOV 33.5
|
|
|
|
CONST_FLOAT PLAYER_INIT_ROT -49.6//-13.5//11.49
|
|
CONST_FLOAT MICHAEL_INIT_ROT 9.2//-135.82
|
|
CONST_FLOAT MICHAEL_AT_CONTAINER_ROT 62.98
|
|
CONST_FLOAT MICHAEL_IN_CONTAINER_ROT 63.81
|
|
CONST_FLOAT MICHAEL_AT_BEACH_ROT -109.12
|
|
CONST_FLOAT BIKE_INIT_ROT -30.45
|
|
CONST_FLOAT BIKE_CHASE_ROT 14.71
|
|
CONST_FLOAT MICHAEL_CAR_INIT_ROT -52.22
|
|
CONST_FLOAT BEACH_CAR_INIT_ROT -42.14
|
|
CONST_FLOAT PURSUIT_FOLLOW_STAGE_ROT 84.4
|
|
CONST_FLOAT PURSUIT_CLIMB_DOWN_STAGE_ROT -140.04
|
|
CONST_FLOAT TREVOR_BRIDGE_ROT -172.41
|
|
CONST_FLOAT TREVOR_WATER_ROT 40.9
|
|
CONST_FLOAT TREVOR_IN_WATER_INIT_ROT -153.6
|
|
CONST_FLOAT TREVOR_SHOOTOUT_INIT_ROT 5.4//-52.43
|
|
CONST_FLOAT TREVOR_AT_BEACH_ROT 132.53
|
|
CONST_FLOAT DINGHY_INIT_ROT 45.39
|
|
CONST_FLOAT DINGHY_AT_BRIDGE_ROT 91.60
|
|
CONST_FLOAT DINGHY_AT_CONTAINER_ROT 155.20
|
|
CONST_FLOAT DINGHY_AT_RAPIDS_ROT 90.21
|
|
CONST_FLOAT DINGHY_AT_BEACH_ROT 132.53
|
|
CONST_FLOAT CONTAINER_IN_RIVER_ROT 121.16
|
|
CONST_FLOAT STEALING_ROT -63.67
|
|
CONST_FLOAT IN_CONTAINER_ROT -154.83
|
|
CONST_FLOAT OUTSIDE_CONTAINER_ROT 115.56
|
|
CONST_FLOAT MOVE_LAST_PLAYER_VEHICLE_ROT -243.0
|
|
|
|
CONST_FLOAT TOWN_PATHS_MIN_X 592.95
|
|
CONST_FLOAT TOWN_PATHS_MIN_Y 3533.08
|
|
CONST_FLOAT TOWN_PATHS_MAX_X 2145.54
|
|
CONST_FLOAT TOWN_PATHS_MAX_Y 4089.31
|
|
|
|
CONST_FLOAT SKIP_MICHAEL_INTO_CONTAINER_PHASE 0.44
|
|
|
|
// Structs
|
|
//STRUCT SCRIPT_QUAT
|
|
// FLOAT x,y,z,w
|
|
//ENDSTRUCT
|
|
|
|
STRUCT ENEMY_VEHICLE
|
|
VEHICLE_INDEX veh
|
|
//BLIP_INDEX blip
|
|
ENEMY_VEHICLE_AI_ENUM aiEnum
|
|
VECTOR vTarget
|
|
VECTOR vTargetRadius
|
|
INT iAiStage
|
|
INT iTerminateActionTime
|
|
FLOAT fPlaybackSpeed
|
|
BOOL bCommentedOnDestruction
|
|
BOOL bExplodedVehicle
|
|
BOOL binSlowDownArea
|
|
BOOL bOccupantsDead
|
|
ENDSTRUCT
|
|
|
|
STRUCT ENEMY_PED
|
|
PED_INDEX ped
|
|
//BLIP_INDEX blip
|
|
AI_BLIP_STRUCT blipStruct
|
|
INT iRecheckDrivebyTime
|
|
INT iRagdollTime
|
|
INT iKillTime
|
|
BOOL bRegisteredDead
|
|
BOOL bRagdolled
|
|
BOOL bBlipped
|
|
BOOL bPauseGuns
|
|
ENDSTRUCT
|
|
|
|
STRUCT CLIMB_ENEMY
|
|
PED_INDEX ped
|
|
CLIMB_ENEMY_STATE_ENUM state
|
|
INT iSyncScene
|
|
BOOL bDoneSpeech
|
|
ENDSTRUCT
|
|
|
|
STRUCT ENEMY_RAPPEL_DATA
|
|
ENEMY_RAPPEL_STATE_ENUM rappelState
|
|
RAPPEL_DATA rappelData
|
|
INT iStateStartTime
|
|
ENDSTRUCT
|
|
|
|
STRUCT CRATE_BOB_DATA
|
|
OBJECT_INDEX obj
|
|
FLOAT fDisplacement
|
|
FLOAT fSpeed
|
|
INT iDir
|
|
ENDSTRUCT
|
|
|
|
/*
|
|
STRUCT DEBRIS_DATA
|
|
OBJECT_INDEX obj
|
|
BOOL bReleased
|
|
FLOAT fOnScreenTime
|
|
ENDSTRUCT
|
|
*/
|
|
|
|
// Script-specific variables
|
|
MISSION_INIT_STAGE_ENUM missionInitStage = MISSION_INIT_PRE_INTRO
|
|
MISSION_FAIL_STATE_ENUM missionFailState = MISSION_FAIL_STATE_NOT_FAILED
|
|
MISSION_STAGE_ENUM currentMissionStage
|
|
FAIL_REASON_ENUM savedFailReason
|
|
MISSION_HOTSWAP_STAGE_ENUM hotswapStage
|
|
MISSION_STREAMING_STAGE_ENUM streamingStage
|
|
MOCAP_STREAMING_STAGE_ENUM mocapStreamingStage
|
|
TRAIN_CRASH_CUTSCENE_STAGE_ENUM cutsceneStage
|
|
JACKING_TRAIN_SHOT_ENUM jackingTrainShot
|
|
TRAIN_CRASH_SHOT_ENUM trainCrashShot
|
|
//ENTER_CONTAINER_SHOT_ENUM enterContainerShot
|
|
TRAIN_MOVEMENT_STATE_ENUM trainMovementState
|
|
SELECTOR_PED_STRUCT sSelectorPeds
|
|
SELECTOR_CAM_STRUCT sCamDetails
|
|
ENEMY_PED enemyPed[COUNT_OF(ENEMY_PED_ENUM)]
|
|
ENEMY_VEHICLE enemyVehicle[COUNT_OF(ENEMY_VEHICLE_ENUM)]
|
|
TRAIN_HOTSWAP_STATE_ENUM trainHotswapState
|
|
TRAIN_RIDE_STATE_ENUM trainRideState
|
|
//ENEMY_RAPPEL_DATA enemyRappelData[NUMBER_RAPPEL_ENEMIES]
|
|
MICHAEL_TREVOR_ARGUE_STAGE_ENUM michaelTrevorArgueStage
|
|
//CRASH_HOTSWAP_STATE_ENUM crashHotswapState
|
|
BOAT_HOTSWAP_STATE_ENUM boatHotswapState
|
|
HOTSWAP_CAM_ENUM hotswapToTrainCamType
|
|
BOAT_RPG_STATE_ENUM boatRPGState
|
|
BEACH_CREATION_STAGE beachCreationStage
|
|
CRATE_BOB_DATA crateBob[NUMBER_CRATES]
|
|
//DEBRIS_DATA debris[NUMBER_DEBRIS]
|
|
//ENEMY_BRIDGE_STATE_ENUM enemyBridgeState[NUMBER_BRIDGE_ENEMIES]
|
|
CLIMB_ENEMY climbEnemy[NUMBER_CLIMB_ENEMIES]
|
|
RAPIDS_SPEECH_INTERRUPT_ENUM pendingRapidsSpeechInterrupt
|
|
CREATE_TRAIN_STAGE_ENUM createTrainStage
|
|
CREATE_ENGINEER_STAGE_ENUM createEngineerStage
|
|
CREATE_MERC_PICKUP_STAGE_ENUM createMercPickupStage
|
|
//MICHAEL_DRIVEBY_STATE_ENUM michaelDrivebyState
|
|
CHECK_FIRST_JUMP_STATE_ENUM checkFirstJumpState
|
|
TREVOR_IDLE_STATE_ENUM trevorIdleState
|
|
SWAP_CARRIAGE_STATE_ENUM swapCarriageState
|
|
GOTO_FOAM_STATE_ENUM gotoFoamState
|
|
FIRST_PERSON_CAM_STRUCT fpsCam
|
|
structTimelapse sTimelapse
|
|
|
|
// Peds
|
|
PED_INDEX engineerPed[NUMBER_ENGINEERS]
|
|
PED_INDEX mercPickupPed[NUMBER_MERC_PICKUP_PEDS]
|
|
//PED_INDEX dummyBoatPed
|
|
PED_INDEX trevorTargetPed
|
|
//PED_INDEX michaelTargetPed
|
|
PED_INDEX patriciaPed
|
|
PED_INDEX ronPed
|
|
|
|
// Vehicles
|
|
VEHICLE_INDEX trainCrashVehicle[COUNT_OF(TRAIN_CRASH_VEHICLE_ENUM)]
|
|
VEHICLE_INDEX missionTrain
|
|
VEHICLE_INDEX crashTrain
|
|
VEHICLE_INDEX hangingCarriageVehicle
|
|
VEHICLE_INDEX mercPickupVehicle[NUMBER_MERC_PICKUP_VEHICLES]
|
|
VEHICLE_INDEX explodeVehicle
|
|
|
|
// Objects
|
|
OBJECT_INDEX doorsObject
|
|
OBJECT_INDEX doorCollisionObject
|
|
OBJECT_INDEX caseObject
|
|
OBJECT_INDEX trainJumpAnchorObject
|
|
OBJECT_INDEX targetObject
|
|
OBJECT_INDEX trevorDoorObject
|
|
|
|
// Blips
|
|
BLIP_INDEX gotoBlip
|
|
BLIP_INDEX trainBlip
|
|
BLIP_INDEX buddyBlip
|
|
BLIP_INDEX containerBlip
|
|
BLIP_INDEX vehicleBlip
|
|
BLIP_INDEX carBlip[2]
|
|
|
|
// Cameras
|
|
CAMERA_INDEX staticCam
|
|
CAMERA_INDEX interpCam
|
|
CAMERA_INDEX animCam
|
|
|
|
// Bools
|
|
BOOL bModelRequestTracker[COUNT_OF(TRAIN_CRASH_MODEL_ENUM)]
|
|
BOOL bVehicleRecordingRequestTracker[NUMBER_RECORDING_REQUEST_SLOTS]
|
|
BOOL bWaypointRequestTracker[NUMBER_WAYPOINT_REQUEST_SLOTS]
|
|
BOOL bAnimDictRequestTracker[COUNT_OF(TRAIN_CRASH_ANIM_DICT_ENUM)]
|
|
BOOL bWeaponRequestTracker[COUNT_OF(TRAIN_CRASH_WEAPON_ENUM)]
|
|
BOOL bPTFXRequestTracker[COUNT_OF(TRAIN_CRASH_PTFX_ENUM)]
|
|
BOOL bSFXRequestTracker[COUNT_OF(TRAIN_CRASH_SFX_ENUM)]
|
|
BOOL bMiscAssetRequestTracker[COUNT_OF(TRAIN_CRASH_MISC_ASSET_ENUM)]
|
|
BOOL bThoroughCleanup
|
|
BOOL bForcePassOnShitskip
|
|
BOOL bClearedForCutscene
|
|
BOOL bRunningCutscene
|
|
BOOL bSkippedCutscene
|
|
BOOL bCutsceneWaitStarted
|
|
//BOOL bDoingTrevorFocusCam
|
|
BOOL bClearedVehiclesDuringIntro
|
|
BOOL bStartingAsTrevor
|
|
BOOL bShownGodText
|
|
BOOL bDoneGotoSpeech
|
|
BOOL bShouldDoGetInText
|
|
BOOL bSavedBanter
|
|
//BOOL bDoneIntroPlayerHotswap
|
|
BOOL bDoneIntroCreateEntities
|
|
BOOL bDoneIntroClearStart
|
|
//BOOL bPreStreamingSeamlessCutscene
|
|
BOOL bWaitForBuddyPrompt
|
|
BOOL bGetBuddyPrompt
|
|
BOOL bDoneMichaelNoFollowPrompt
|
|
BOOL bRemovedMichael
|
|
BOOL bDoneTrainBanter
|
|
BOOL bDoneSeeTrainSpeech
|
|
BOOL bTrainIsPastSilos
|
|
BOOL bSlowDownTrainForCatchup
|
|
BOOL bObjectiveIsJump
|
|
BOOL bShownJumpPrompt
|
|
BOOL bDoneJumpSpeech
|
|
BOOL bDetachedBike
|
|
BOOL bDoneEnterCabSpeech
|
|
BOOL bDoPathHelp
|
|
BOOL bShownPathHelp
|
|
BOOL bDoneRidingTrainSpeech
|
|
BOOL bDoneRidingTrainSpeech2
|
|
BOOL bDoneAlmostThereSpeech
|
|
//BOOL bDoneSeeTrainSpeech
|
|
BOOL bStartedPlaybackDinghy
|
|
BOOL bStoppedPlaybackDinghy
|
|
BOOL bArrivedAtBridge
|
|
BOOL bSelectorLocked
|
|
//BOOL bSetTrainLocationForCrash
|
|
//BOOL bRepositionedMichaelAtAnchor
|
|
BOOL bStopTrain
|
|
BOOL bCreatedCrashTrain
|
|
BOOL bDoingRideIdle1
|
|
BOOL bRemovedMercPickup
|
|
BOOL bDoneMercAngeredAnims
|
|
BOOL bDoneMercsRun
|
|
BOOL bDoneTrevorTauntMercsSpeech
|
|
//BOOL bExplodedTrackMercs
|
|
//BOOL bDoneTrackMercsShoot
|
|
BOOL bDoneGoingToCrashSpeech
|
|
BOOL bLoadedCrashStream
|
|
//BOOL bChangedToLadderCam
|
|
//BOOL bDoneLookForTrainSpeech
|
|
//BOOL bGettingReadySpeech
|
|
BOOL bDoneJumpOff
|
|
//BOOL bSelectedMichael
|
|
BOOL bForceIntoDinghy
|
|
BOOL bSuccessfullyForcedIntoDinghy
|
|
BOOL bShownSwitchPrompt
|
|
BOOL bShownBombHelp
|
|
BOOL bDoneSwitchToBombHelp
|
|
BOOL bFoundBomb
|
|
BOOL bForceDoorsOpen
|
|
//BOOL bAtSafeDistance
|
|
BOOL bExplodedDoors
|
|
BOOL bSwappedToTrevor
|
|
BOOL bMichaelSearching
|
|
BOOL bRepositionedDinghy
|
|
BOOL bDoneHurrySpeech
|
|
//BOOL bDoneEnterCover
|
|
BOOL bDoneMichaelSearchSpeech
|
|
BOOL bTrevorEquippedWeapon
|
|
//BOOL bShownCoverPrompt
|
|
BOOL bDoneFoundUsSpeech
|
|
//BOOL bCreatedCustomSpline
|
|
BOOL bDoneFoundItem
|
|
BOOL bDoneTrevorRespondSpeech
|
|
BOOL bDoneHeliOnMichaelSpeech
|
|
BOOL bSetToJump
|
|
BOOL bSetupMichaelForShootout
|
|
BOOL bDoneDropOnBridgeSpeech
|
|
BOOL bDoneUseThermalSpeech
|
|
BOOL bDoChopperSpinOut
|
|
BOOL bDoneCarriageFall
|
|
BOOL bDoneCarriageExplosion
|
|
BOOL bDoneCarriageSplash
|
|
BOOL bMichaelInDinghy
|
|
BOOL bMichaelAnchoredDinghy
|
|
BOOL bMichaelStopForTrevorSwimming
|
|
BOOL bFinishedFollowRapids
|
|
BOOL bDoneWaterfallCutaway
|
|
//BOOL bPreventUpWaterfall
|
|
BOOL bGivenRPG
|
|
//BOOL bDoneMortarSpeech
|
|
BOOL bDoneDriveHomeBanter
|
|
BOOL bKilledDriveHomeBanter
|
|
BOOL bDoneCarSpeech
|
|
//BOOL bSetExplosionProofs
|
|
//BOOL bDoHoverChopperHovering
|
|
BOOL bEnemyWaveState[COUNT_OF(ENEMY_WAVE_ENUM)]
|
|
BOOL bTriggeredEnemyWave[COUNT_OF(ENEMY_WAVE_ENUM)]
|
|
BOOL bDoneRapidsSpeechInterrupt[COUNT_OF(RAPIDS_SPEECH_INTERRUPT_ENUM)]
|
|
BOOL bRapidsSpeechInterruptPending
|
|
BOOL bDoMopUp
|
|
//BOOL bDoneBugOut
|
|
//BOOL bDoneBoatsFlee
|
|
//BOOL bChopperUsingRockets
|
|
BOOL bDoneLeaveBoatWithCase
|
|
BOOL bGotToBeach
|
|
BOOL bDoHelperForceOnTrain
|
|
BOOL bCreatedSmoothCam
|
|
BOOL bSmoothCamBackToGameplay
|
|
//BOOL bEnemiesExplosionProof
|
|
BOOL bMichaelDroveOff
|
|
BOOL bTrevorPutAwayGun
|
|
BOOL bDoneImmediateGetInSpeech
|
|
BOOL bDoneFailSpeech
|
|
BOOL bDoneGetBombsSpeech
|
|
BOOL bCamHighEnoughToFreezeTrain
|
|
BOOL bRemovedCrashModels
|
|
BOOL bTempSuppressVehicleSpawning
|
|
BOOL bTempPreventStillVehicleState
|
|
BOOL bReadyToEscape
|
|
BOOL bCachedShownGodText
|
|
BOOL bJumpedToShootout
|
|
BOOL bBlippedCarWave
|
|
BOOL bSetTrevorExitIntro
|
|
BOOL bForcedTrevorOutOfBoat
|
|
BOOL bBeenAtGetawayVehicles
|
|
BOOL bDoMerryweatherMassacre
|
|
BOOL bCreatedMerryweatherMassacre
|
|
BOOL bDoneForceDinghyStop
|
|
BOOL bDoneMichaelGoOnFoot
|
|
BOOL bMichaelWasInVehicle
|
|
BOOL bIncreasedBoatAccuracy
|
|
BOOL bStartedChopper1AudioScene
|
|
BOOL bStartedChopper2AudioScene
|
|
BOOL bStartedChopper3AudioScene
|
|
BOOL bStartedChopper4AudioScene
|
|
BOOL bStoppedChopper3AudioScene
|
|
BOOL bRemovedChopper1Audio
|
|
BOOL bRemovedChopper2Audio
|
|
BOOL bDoneBoatSound[2]
|
|
BOOL bEnteredTrailer
|
|
BOOL bWasTimeLapseRunning
|
|
BOOL bDidntPullAwayFromContainer
|
|
BOOL bLateAimAtRapids
|
|
BOOL bThermalOn
|
|
BOOL bThermalSwitchedOn
|
|
BOOL bDoneSniperHelp1
|
|
BOOL bDoneSniperHelp2
|
|
BOOL bShouldDoSniperHelp
|
|
BOOL bDoneKilledSnipersSpeech
|
|
BOOL bDoneSeenParachutesSpeech
|
|
BOOL bDoneParachute1
|
|
BOOL bDoneParachute2
|
|
BOOL bDoTrevorBoom
|
|
BOOL bForceMichaelSwitch
|
|
BOOL bDoneCamShake
|
|
BOOL bSlowedDown
|
|
BOOL bSpedUp
|
|
BOOL bReloadingSniperRifle
|
|
BOOL bDonePushIn
|
|
BOOL bHitSound
|
|
BOOL bWooshStarted
|
|
|
|
BOOL bDoneMissionStartCue
|
|
BOOL bPreparedSeeTrainCue
|
|
BOOL bDoneSeeTrainCue
|
|
BOOL bPreparedLandOnTrainCue
|
|
BOOL bDoneLandOnTrainCue
|
|
BOOL bPreparedSwapToMichaelCue
|
|
BOOL bDoneSwapToMichaelCue
|
|
BOOL bPreparedSideOnCue
|
|
//BOOL bPreparedCollisionCue
|
|
BOOL bDoneCollisionCue
|
|
//BOOL bPreparedHitWaterCue
|
|
BOOL bDoneHitWaterCue
|
|
//BOOL bPreparedSwapToTrevorCue
|
|
BOOL bDoneSwapToTrevorCue
|
|
BOOL bPreparedEnemiesArriveCue
|
|
BOOL bDoneEnemiesArriveCue
|
|
BOOL bPreparedRapidsStartCue
|
|
BOOL bDoneRapidsStartCue
|
|
BOOL bDoneLandAtBeachCue
|
|
BOOL bDoneAtBeachCue
|
|
BOOL bDoneEncourageOpenSpeech
|
|
BOOL bDoneFirstHurryUpSpeech
|
|
BOOL bDoneThrowBombSpeech
|
|
BOOL bDoneFindLootSpeech
|
|
BOOL bDoLastBoatCircle
|
|
BOOL bUppedAccuracyForCircle
|
|
BOOL bLoadedHitDriverAudio
|
|
BOOL bSetSceneAudioEntity
|
|
BOOL bResetGameCamHeading
|
|
BOOL bDoneBikeJumpAudioScene
|
|
BOOL bDoneBoatHitWaterSound
|
|
BOOL bSkippedWaterfallCutaway
|
|
BOOL bExtendMichaelAbandon
|
|
BOOL bDoneBrakePressSound
|
|
BOOL bDoneBrakeReleaseSound
|
|
BOOL bDeletedRonAndPatricia
|
|
BOOL bGotFirstSniperSpeech
|
|
BOOL bCreatedTrucks
|
|
BOOL bPutWeaponAway
|
|
BOOL bStoppingDinghy
|
|
BOOL bForceResetTrevorTask
|
|
BOOL bAddedSplash[NUMBER_SPLASHES]
|
|
BOOL bDoneEnterTrailerSpeech
|
|
BOOL bDoneWaterTrail[3]
|
|
BOOL bSetTrevorHelmet
|
|
BOOL bDoneSetTrevorHelmetSpeech
|
|
BOOL bRemovedStreamVol
|
|
BOOL bTurnOffUnderwaterDialogue
|
|
BOOL bRestoredControl
|
|
BOOL bSuppressRemoveTrevorMG
|
|
BOOL bAttachedCaseToHand
|
|
BOOL bStartedDebrisFX
|
|
BOOL bExplodedChopperFromCarriage
|
|
BOOL bStartedIPLSwap
|
|
BOOL bSwappedDoors
|
|
|
|
BOOL bDoneBikeStartAudioScene
|
|
BOOL bDoneSeeTrainAudioScene
|
|
BOOL bStoppedDefendMichaelAudioScene
|
|
BOOL bDoneTrainAccelerationAudioScene
|
|
BOOL bDoneTrainDecelerationAudioScene
|
|
|
|
BOOL bCheckedInitialMG
|
|
BOOL bSuppressFutureReplaySetups
|
|
|
|
BOOL bHasChanged
|
|
|
|
BOOL bToBoatSwitchFirstPerson
|
|
BOOL bFromTrainSwitchFirstPerson
|
|
BOOL bContainerSwitchFirstPerson
|
|
BOOL bRapidsSwitchFirstPerson
|
|
BOOL bDoneFlash
|
|
|
|
// Vectors
|
|
VECTOR vTrevorAttachToBoatPos
|
|
VECTOR vTrevorAttachToBoatRot
|
|
VECTOR vMichaelAttachToBoatPos
|
|
VECTOR vMichaelAttachToBoatRot
|
|
VECTOR vFirstPersonCamRot
|
|
//VECTOR vHangingCarriagePos
|
|
//VECTOR vHangingCarriageRot
|
|
VECTOR vCurrentBikeCamOffset
|
|
|
|
// Floats
|
|
FLOAT fTrainCruiseSpeed
|
|
FLOAT fPlayerIsOnTrainTimer
|
|
//FLOAT fAttackChopperHoverSpeed
|
|
FLOAT fTrainOnScreenTime
|
|
FLOAT fRepositionBoatTime
|
|
//FLOAT fTrainClearBridgeMod
|
|
FLOAT fBoatRPGPhase
|
|
//FLOAT fCachedChopperSpeed
|
|
//FLOAT fChopperSpinForce
|
|
FLOAT fPushChopperToWallForce
|
|
FLOAT fTrainSpeedMod
|
|
FLOAT fHangingCarriageOnScreenTime
|
|
FLOAT fTrainTooLowSpeedTime
|
|
FLOAT fEnemyBoatSpeed
|
|
FLOAT fSeeTrainSpeechTime
|
|
FLOAT fBikeCamHeight
|
|
FLOAT fForceBeachTime
|
|
FLOAT fThirdWaveAccuracy
|
|
FLOAT fFifthWaveAccuracy
|
|
FLOAT fTrainAccelerationTime
|
|
FLOAT fTrainDecelerationTime
|
|
FLOAT fMopUpAccuracy
|
|
FLOAT fMichaelToIslandPlaybackSpeed
|
|
FLOAT fWaterOverride
|
|
FLOAT fTimeScale
|
|
FLOAT fRayfireEvolution
|
|
|
|
// Ints
|
|
INT iReplayAttempt
|
|
INT iStageStartTime
|
|
INT iGetInTextStage
|
|
INT iCurrentJump
|
|
INT iClosestCarriage
|
|
//INT iFightStage
|
|
//INT iBashedDriverCount
|
|
//INT iBashSpeechStage
|
|
//INT iChopperHoverStage
|
|
INT iAllowSkipCutsceneTime
|
|
INT iTrainCrashCutsceneTime
|
|
INT iCutsceneTriggerTime
|
|
INT iTrainMovementStartTime
|
|
INT iCheckClosestCarriageTime
|
|
INT iOnFlatbedTime
|
|
INT iFoundBombTime
|
|
INT iNoBombsTime
|
|
//INT iSafeDistanceTime
|
|
INT iNextArgueTime
|
|
INT iHeliOnMichaelTime
|
|
INT iCurrentSearch
|
|
INT iNextRandomSpeechTime
|
|
INT iSyncScene
|
|
INT iDeadSyncScene
|
|
INT iRecheckTrevorDrivebyTime
|
|
//INT iRecheckMichaelDrivebyTime
|
|
//INT iTriggerFleeWaveTime
|
|
INT iClearHelpTime
|
|
INT iBridgeSmashStage
|
|
INT iShootoutStartTime
|
|
INT iCreateSnipersTime
|
|
//INT iChopperWeaponsTime
|
|
INT iInterceptTrainTime
|
|
INT iRapidsSpeechStage
|
|
INT iRapidsSpeechInterruptTime
|
|
INT iAdvanceToGetHomeTime
|
|
INT iInitialMGAmmo
|
|
INT iLastExplodeTime
|
|
INT iMichaelBoatStartTime
|
|
INT iMichaelDriveOffTime
|
|
INT iPrepareLandOnTrainCueTime
|
|
INT iJumpSucceedingTime
|
|
INT iCreatedMountainChopperTime
|
|
INT iPromptedToBlowTime
|
|
INT iBombHelpTime
|
|
INT iNextHeliRocketTime
|
|
INT iMichaelDriveCarStage
|
|
INT iSuppressVehicleSpawnTime
|
|
INT iDetachMichaelTime
|
|
INT iLastBoatReminderTime
|
|
INT iCreatedWaveTime[COUNT_OF(ENEMY_WAVE_ENUM)]
|
|
INT iCreateMountainChopperTime
|
|
INT iLastTrevorVariationTime
|
|
INT iDelayFindItemTime
|
|
INT iCreateMerryweatherMassacreTime
|
|
INT iDoTrainBanterTime
|
|
INT iRemovedJumpBlipTime
|
|
INT iMichaelTaskTime
|
|
INT iEncourageOpenSpeechTime
|
|
INT iSniperSpeechTime
|
|
INT iBeenAtBridgeTime
|
|
INT iGotSniperTime
|
|
INT iCachedCarriage
|
|
INT iCreateTruckFrame
|
|
INT iDelete
|
|
INT iCheckInBoxcarTime
|
|
INT iSwappedToTrevorTime
|
|
INT iFoundUsSpeechTime
|
|
INT iPerformSequenceTime
|
|
INT iDelayFirstLineTime
|
|
INT iCheckFirstJumpStateTime
|
|
INT iStartIPLSwapTime
|
|
INT iReloadSniperRifleTime
|
|
INT iExplodedDoorsTime
|
|
INT iLastSwitchTime
|
|
INT iHitTime
|
|
INT iFlashTime
|
|
|
|
//INT iChopperSpinModifier
|
|
|
|
// Other variables
|
|
SEQUENCE_INDEX sequence
|
|
structPedsForConversation trainCrashConversation
|
|
TEXT_LABEL_23 tSavedBanterRoot
|
|
TEXT_LABEL_23 tResumeBanterLabel
|
|
PTFX_ID firePTFX[NUMBER_CRASH_FIRES]
|
|
BOOL bFirePTFXActive[NUMBER_CRASH_FIRES]
|
|
PTFX_ID wadePTFX
|
|
PTFX_ID debrisFallPTFX1
|
|
PTFX_ID debrisFallPTFX2
|
|
PTFX_ID debrisFallPTFX3
|
|
PTFX_ID debrisSplashPTFX
|
|
RAYFIRE_INDEX bridgeRayfire
|
|
STREAMVOL_ID bridgeVolume
|
|
COVERPOINT_INDEX islandCover
|
|
RAGDOLL_BLOCKING_FLAGS blockingAllRagdoll = RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_FIRE | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_IMPACT_OBJECT | RBF_MELEE | RBF_RUBBER_BULLET | RBF_FALLING | RBF_WATER_JET | RBF_DROWNING
|
|
REL_GROUP_HASH enemyRelGroup
|
|
SCENARIO_BLOCKING_INDEX rapidsScenarioBlocking
|
|
//SCENARIO_BLOCKING_INDEX beachScenarioBlocking
|
|
SCENARIO_BLOCKING_INDEX roadScenarioBlocking
|
|
SCENARIO_BLOCKING_INDEX road2ScenarioBlocking
|
|
INTERIOR_INSTANCE_INDEX trailerInterior
|
|
FLIP_OFF_DATA flipOffData
|
|
CAM_VIEW_MODE cachedCamMode
|
|
PUSH_IN_DATA pushInData
|
|
|
|
// Debug
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID trainCrashWidgets
|
|
TEXT_WIDGET_ID RBCamPosWidget, RBCamRotWidget
|
|
BOOL bDebugOverrideSpeed
|
|
FLOAT fDebugOverrideSpeed = 0.0
|
|
BOOL bDebugDontDoDistanceFail
|
|
VECTOR vDebugTrainCamOffset = <<0,0,0>>
|
|
VECTOR vDebugTrainCamPoint = <<0,0,0>>
|
|
FLOAT fDebugTrainCamFOV = 50
|
|
INT iDebugTrainPositions = -1
|
|
VECTOR vRBDebugCamPos, vRBDebugCamRot
|
|
FLOAT fRBDebugCamFOV
|
|
BOOL bRBDebugCamDoDump
|
|
BOOL bDebugWarpToJumps
|
|
BOOL bDebugWarpedTrainToBridge
|
|
BOOL bDebugJSkip
|
|
|
|
MissionStageMenuTextStruct stageMenu[MAX_SKIP_MENU_LENGTH]
|
|
INT iMenuMissionStage
|
|
|
|
INT iDebugStage = -1
|
|
#ENDIF
|
|
|
|
ENUM SELECT_PEDS
|
|
SEL_MICHAEL = 0,
|
|
SEL_FRANKLIN,
|
|
SEL_TREVOR
|
|
ENDENUM
|
|
|
|
//PURPOSE: If the ped is controlled by the player, return player. Else, return the ped.
|
|
FUNC PED_INDEX GET_SELECT_PED(SELECT_PEDS PedToGet)
|
|
SWITCH PedToGet
|
|
CASE SEL_MICHAEL
|
|
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) = SELECTOR_PED_MICHAEL
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
ENDIF
|
|
BREAK
|
|
CASE SEL_FRANKLIN
|
|
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) = SELECTOR_PED_FRANKLIN
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
ENDIF
|
|
BREAK
|
|
CASE SEL_TREVOR
|
|
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) = SELECTOR_PED_TREVOR
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
RETURN PLAYER_PED_ID()
|
|
ENDFUNC
|
|
|
|
//---------------------------¦ EXILE 3 SWITCH CAM ¦----------------------------
|
|
|
|
ENUM EXILE_SWITCH_CAM_STATE
|
|
SWITCH_CAM_IDLE,
|
|
SWITCH_CAM_REQUEST_ASSETS,
|
|
SWITCH_CAM_SETUP_GAMEPLAY,
|
|
SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_1,
|
|
SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_1,
|
|
SWITCH_CAM_SHUTDOWN_TRAIN_TO_BOAT_SPLINE_1,
|
|
SWITCH_CAM_TRAIN_TO_BOAT_CODE_CAM,
|
|
SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_2,
|
|
SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_2,
|
|
SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_CONTAINER_SPLINE,
|
|
SWITCH_CAM_SETUP_TREVOR_TO_MICHAEL_SPLINE,
|
|
SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_SPLINE,
|
|
SWITCH_CAM_PLAYING_SPLINE1,
|
|
SWITCH_CAM_SHUTDOWN_SPLINE1,
|
|
SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
ENDENUM
|
|
EXILE_SWITCH_CAM_STATE eSwitchCamState = SWITCH_CAM_IDLE
|
|
|
|
SWITCH_CAM_STRUCT scsSwitchCamTrainToBoat_Intro
|
|
SWITCH_CAM_STRUCT scsSwitchCamTrainToBoat_Outro
|
|
SWITCH_CAM_STRUCT scsSwitchCamMichealToTrevorContainer
|
|
//SWITCH_CAM_STRUCT scsSwitchCamMichaelToTrevorRiver
|
|
//SWITCH_CAM_STRUCT scsSwitchCamTrevorToMichaelRiver
|
|
|
|
|
|
//Container Switch Cam Switch Variables
|
|
//#IF IS_DEBUG_BUILD
|
|
//VECTOR vContainerSwitchTrevorTeleportPos = <<-483.6, 4395.3, 31.0>>
|
|
//FLOAT fContainerSwitchTrevorTeleportRot = 0.0
|
|
//#ENDIF
|
|
|
|
PED_INDEX piMichaelContainerSwitch
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
BOOL bSwitchCamDebugScenarioEnabled = FALSE
|
|
BOOL bResetDebugScenario = FALSE
|
|
#ENDIF
|
|
|
|
FLOAT fGameplayCamHeadingTrainToBoat = 0.0
|
|
FLOAT fGameplayCamPitchTrainToBoat = 0.0
|
|
FLOAT fSwitchCamTrainToBoat_DingyWarp_JumpcutDescent = 6700
|
|
FLOAT fSwitchCamTrainToBoat_DingyWarp_OutroSwoop = 5000
|
|
FLOAT fSwitchCamTrainToBoat_DingyWarp_EndingCam = 13000
|
|
VECTOR vDinghyInitLoc = <<475.5, 3944.2, 30.7>>
|
|
|
|
FLOAT fGameplayCamHeadingMichaelToTrevorContainer = 0.0
|
|
FLOAT fGameplayCamPitchMichaelToTrevorContainer = 0.0
|
|
INT iSwitchCam_Explosion_StartBoatMoveNode = 0
|
|
|
|
FLOAT fRiverChaseGameplayCamHeadingTrevor = 0.0
|
|
FLOAT fRiverChaseGameplayCamPitchTrevor = 0.0
|
|
FLOAT fRiverChaseGameplayCamHeadingMichael = 0.0
|
|
FLOAT fRiverChaseGameplayCamPitchMichael = -3.0
|
|
|
|
FLOAT fAudioRiverToMichaelSwitchSplinePhase = 0.9
|
|
FLOAT fAudioRiverToTrevorSwitchSplinePhase = 0.9
|
|
|
|
INT iWooshSND_ID = -1
|
|
//BOOL bWooshPlaying = FALSE
|
|
BOOL bWooshOut = FALSE
|
|
BOOL bPlayerControlGiven = FALSE
|
|
BOOL bPreventMissionFail_SwitchCamDebug = FALSE //[MF] Prevent the mission from failing.
|
|
|
|
BOOL bTrainSwitch_CodeCam_DingyPlaybacK
|
|
BOOL bTrainSwitchRestartDinghyRecording
|
|
|
|
BOOL bHasContainerSwitchCamExplosionHappened
|
|
//FLOAT fAudioContainerSwitchSplinePhaseStart = 0.25
|
|
//FLOAT fAudioContainerSwitchSplinePhaseEnd = 0.59
|
|
|
|
BOOL bAreShowingMichaelReverseSwitchCam
|
|
//FLOAT fMichaelReverseSwitchCamHeading = 189.0
|
|
//FLOAT fMichaelReverseSwitchCamPitch = -12.0
|
|
|
|
INT iContainerSwitch_ExplosionDelay = 250
|
|
BOOL bContainerSwitch_ExplosionHappened
|
|
BOOL bContainerSwitch_ShakeStopped
|
|
FLOAT fContainerSwitch_ShakeStoppedPhase = 0.22
|
|
VECTOR vContainerSwitch_ExplosionLocation = <<-491.0, 4434.7, 31.4>>
|
|
FLOAT fContainerSwitch_ExplosionScale = 2.7
|
|
FLOAT fContainerSwitch_StartTrevDialogue = 0.5//0.8
|
|
BOOL bContainerSwitch_PlayTrevFlash
|
|
FLOAT fContainerSwitch_StartTrevFlashPhase = 0.37
|
|
|
|
BOOL bTrevorSetupAfterContainerSwitch
|
|
|
|
BOOL bMichaelSearchAnimStarted
|
|
|
|
PROC Set_Ped_Position(PED_INDEX aPed, VECTOR aPosition, FLOAT aHeading = -1.0)
|
|
|
|
FLOAT ActualGroundPosition
|
|
GET_GROUND_Z_FOR_3D_COORD(aPosition, ActualGroundPosition)
|
|
IF NOT IS_ENTITY_DEAD(aPed)
|
|
/*SET_ENTITY_COORDS*/ SET_PED_COORDS_KEEP_VEHICLE(aPed, <<aPosition.x, aPosition.y, ActualGroundPosition>>)
|
|
IF aHeading > -1
|
|
SET_ENTITY_HEADING(aPed, aHeading)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_INTRO(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viSwitchTrain)
|
|
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_INTRO")
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
//--- Start of Cam Data ---
|
|
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[0].iNodeTime = 0
|
|
thisSwitchCam.nodes[0].vNodePos = <<6.8388, 6.4832, 3.3791>>
|
|
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[0].vNodeDir = <<-1.1998, 4.6534, 0.3761>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 60.0000
|
|
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[0].iCamEaseType = 0
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[0].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 1000
|
|
thisSwitchCam.nodes[1].vNodePos = <<6.5636, 2.4718, 19.5047>>
|
|
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[1].vNodeDir = <<0.0918, 1.7148, -0.0965>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 60.0000
|
|
thisSwitchCam.nodes[1].NodeTimePostFX_Type = SCANLINE_EFFECT
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 2.0000
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[1].iCamEaseType = 0
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[1].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
|
|
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[2].iNodeTime = 1000
|
|
thisSwitchCam.nodes[2].vNodePos = <<30.6156, 16.5366, 321.1555>>
|
|
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[2].vNodeDir = <<24.1739, 0.4516, -0.5067>>
|
|
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].fNodeFOV = 60.0000
|
|
thisSwitchCam.nodes[2].NodeTimePostFX_Type = SCANLINE_EFFECT
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[2].iCamEaseType = 0
|
|
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[2].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[2].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[2].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[2].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[2].iHoldDuration = 0
|
|
|
|
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[3].iNodeTime = 1000
|
|
thisSwitchCam.nodes[3].vNodePos = <<30.6160, 16.5370, 321.1560>>
|
|
thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[3].vNodeDir = <<24.1740, 0.4520, -0.5070>>
|
|
thisSwitchCam.nodes[3].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[3].fNodeFOV = 60.0000
|
|
thisSwitchCam.nodes[3].NodeTimePostFX_Type = SCANLINE_EFFECT
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[3].iCamEaseType = 0
|
|
thisSwitchCam.nodes[3].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[3].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[3].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[3].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[3].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[3].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[3].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[3].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[3].iHoldDuration = 0
|
|
|
|
thisSwitchCam.iNumNodes = 4
|
|
thisSwitchCam.iCamSwitchFocusNode = 0
|
|
thisSwitchCam.bSplineNoSmoothing = TRUE
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_TrainToBoat_intro.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_TrainToBoat_intro.xml"
|
|
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.viVehicles[0] = viSwitchTrain
|
|
|
|
|
|
ENDPROC
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viSwitchBoat)
|
|
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO")
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
|
|
//--- Start of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[0].iNodeTime = 2000
|
|
thisSwitchCam.nodes[0].vNodePos = <<-0.6110, 7.8007, 19.1691>>
|
|
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[0].vNodeDir = <<-79.0547, -0.0056, -109.0105>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[0].NodeTimePostFX_Type = SCANLINE_EFFECT
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[0].iCamEaseType = 0
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[0].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[0].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 2000
|
|
thisSwitchCam.nodes[1].vNodePos = <<-0.5746, 5.8001, 2.5385>>
|
|
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[1].vNodeDir = <<-0.2796, -0.1720, 0.4529>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 2.0000
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.5000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 1.0000
|
|
thisSwitchCam.nodes[1].iCamEaseType = 0
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[1].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[1].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[2].iNodeTime = 1500
|
|
thisSwitchCam.nodes[2].vNodePos = <<-1.5050, 4.3221, 1.7765>>
|
|
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[2].vNodeDir = <<-0.5112, -0.2806, 0.9605>>
|
|
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[2].fNodeCamShake = 1.0000
|
|
thisSwitchCam.nodes[2].iCamEaseType = 0
|
|
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[2].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[2].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[2].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[2].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[2].iHoldDuration = 0
|
|
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[3].iNodeTime = 1000
|
|
thisSwitchCam.nodes[3].vNodePos = <<-3.4175, -1.8931, 1.2862>>
|
|
thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[3].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[3].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[3].vNodeDir = <<-9.1707, -0.1333, -65.9724>>
|
|
thisSwitchCam.nodes[3].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[3].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[3].fNodeCamShake = 1.0000
|
|
thisSwitchCam.nodes[3].iCamEaseType = 0
|
|
thisSwitchCam.nodes[3].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[3].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[3].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[3].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[3].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[3].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[3].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[3].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[3].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[3].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[3].iHoldDuration = 0
|
|
thisSwitchCam.nodes[3].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[3].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[4].iNodeTime = 1000
|
|
thisSwitchCam.nodes[4].vNodePos = <<-3.6304, -3.7962, 1.2638>>
|
|
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[4].vNodeDir = <<0.2337, -0.1776, 1.0037>>
|
|
thisSwitchCam.nodes[4].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[4].fNodeCamShake = 0.5000
|
|
thisSwitchCam.nodes[4].iCamEaseType = 0
|
|
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[4].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[4].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[4].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[4].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[4].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[4].iHoldDuration = 0
|
|
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[5].bIsGameplayCamCopy = TRUE
|
|
thisSwitchCam.nodes[5].iNodeTime = 1000
|
|
thisSwitchCam.nodes[5].vNodePos = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[5].vNodeDir = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[5].fNodeFOV = 0.0000
|
|
thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[5].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[5].iCamEaseType = 0
|
|
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[5].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[5].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[5].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[5].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[5].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[5].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[5].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[5].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[5].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[5].iHoldDuration = 0
|
|
thisSwitchCam.nodes[5].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[5].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[5].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.camVelocityOverrides[0].fStartPoint = 0.0000
|
|
thisSwitchCam.camVelocityOverrides[0].fSpeed = 7.0000
|
|
thisSwitchCam.camVelocityOverrides[1].fStartPoint = 2.0000
|
|
thisSwitchCam.camVelocityOverrides[1].fSpeed = 7.0000
|
|
thisSwitchCam.camVelocityOverrides[2].fStartPoint = 3.0000
|
|
thisSwitchCam.camVelocityOverrides[2].fSpeed = 15.0000
|
|
thisSwitchCam.camVelocityOverrides[3].fStartPoint = 4.0000
|
|
thisSwitchCam.camVelocityOverrides[3].fSpeed = 15.0000
|
|
thisSwitchCam.camVelocityOverrides[4].fStartPoint = 4.9000
|
|
thisSwitchCam.camVelocityOverrides[4].fSpeed = 10.0000
|
|
thisSwitchCam.camVelocityOverrides[5].fStartPoint = 5.0000
|
|
thisSwitchCam.camVelocityOverrides[5].fSpeed = 3.0000
|
|
|
|
thisSwitchCam.iNumNodes = 6
|
|
thisSwitchCam.iCamSwitchFocusNode = 0
|
|
thisSwitchCam.bSplineNoSmoothing = TRUE
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
|
|
thisSwitchCam.iGameplayNodeBlendDuration = 0
|
|
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_TrainToBoat_outro.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_TrainToBoat_outro.xml"
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.viVehicles[0] = viSwitchBoat
|
|
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viSwitchBoat)
|
|
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO")
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
|
|
//--- Start of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[0].iNodeTime = 2000
|
|
thisSwitchCam.nodes[0].vNodePos = <<0.0746, 7.8007, 19.1691>>
|
|
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[0].vNodeDir = <<-79.0547, -0.0056, -118.0105>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 48.0000
|
|
thisSwitchCam.nodes[0].NodeTimePostFX_Type = SCANLINE_EFFECT
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[0].iCamEaseType = 0
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[0].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[0].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 2000
|
|
thisSwitchCam.nodes[1].vNodePos = <<-0.5746, 5.8001, 2.5385>>
|
|
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[1].vNodeDir = <<0, -0.1720, 0.4529>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 48.0000
|
|
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 2.0000
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.5000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 1.0000
|
|
thisSwitchCam.nodes[1].iCamEaseType = 0
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[1].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[1].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
/*
|
|
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[2].iNodeTime = 1500
|
|
thisSwitchCam.nodes[2].vNodePos = <<-1.5050, 4.8221, 1.7765>>
|
|
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[2].vNodeDir = <<0, -0.2806, 0.9605>>
|
|
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].fNodeFOV = 48.0000
|
|
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[2].fNodeCamShake = 1.0000
|
|
thisSwitchCam.nodes[2].iCamEaseType = 0
|
|
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[2].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[2].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[2].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[2].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[2].iHoldDuration = 0
|
|
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
*/
|
|
|
|
|
|
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[2].iNodeTime = 1000
|
|
thisSwitchCam.nodes[2].vNodePos = <<-4.0175, -0.8931, 1.6862>>
|
|
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[2].vNodeDir = <<-14.1707, -0.1333, -75.9724>>
|
|
thisSwitchCam.nodes[2].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[2].fNodeFOV = 48.0000
|
|
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[2].fNodeCamShake = 1.0000
|
|
thisSwitchCam.nodes[2].iCamEaseType = 0
|
|
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[2].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[2].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[2].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[2].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[2].iHoldDuration = 10000
|
|
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
|
|
/*
|
|
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[4].iNodeTime = 1000
|
|
thisSwitchCam.nodes[4].vNodePos = <<-4.4175, -1.8931, 1.6862>>
|
|
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[4].vNodeDir = <<-9.1707, -0.1333, -65.9724>>
|
|
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[4].fNodeCamShake = 1.0000
|
|
thisSwitchCam.nodes[4].iCamEaseType = 0
|
|
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[4].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[4].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[4].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[4].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[4].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[4].iHoldDuration = 10000
|
|
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
*/
|
|
/*
|
|
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[4].iNodeTime = 1000
|
|
thisSwitchCam.nodes[4].vNodePos = <<-3.6304, -3.7962, 1.2638>>
|
|
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[4].vNodeDir = <<0.2337, -0.1776, 1.0037>>
|
|
thisSwitchCam.nodes[4].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[4].fNodeCamShake = 0.5000
|
|
thisSwitchCam.nodes[4].iCamEaseType = 0
|
|
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[4].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[4].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[4].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[4].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[4].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[4].iHoldDuration = 0
|
|
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[5].bIsGameplayCamCopy = TRUE
|
|
thisSwitchCam.nodes[5].iNodeTime = 1000
|
|
thisSwitchCam.nodes[5].vNodePos = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000
|
|
//thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000
|
|
//thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[5].vNodeDir = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[5].fNodeFOV = 0.0000
|
|
thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeMotionBlur = 0.3000
|
|
thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[5].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[5].iCamEaseType = 0
|
|
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[5].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[5].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[5].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[5].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[5].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[5].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[5].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[5].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[5].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[5].iHoldDuration = 0
|
|
thisSwitchCam.nodes[5].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[5].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[5].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
*/
|
|
|
|
thisSwitchCam.camVelocityOverrides[0].fStartPoint = 0.0000
|
|
thisSwitchCam.camVelocityOverrides[0].fSpeed = 6.0000
|
|
thisSwitchCam.camVelocityOverrides[1].fStartPoint = 1.0000
|
|
thisSwitchCam.camVelocityOverrides[1].fSpeed = 6.0000
|
|
thisSwitchCam.camVelocityOverrides[2].fStartPoint = 1.9500
|
|
thisSwitchCam.camVelocityOverrides[2].fSpeed = 1.0
|
|
thisSwitchCam.camVelocityOverrides[3].fStartPoint = 2.0000
|
|
thisSwitchCam.camVelocityOverrides[3].fSpeed = 0.12
|
|
//thisSwitchCam.camVelocityOverrides[2].fStartPoint = 3.0000
|
|
//thisSwitchCam.camVelocityOverrides[2].fSpeed = 0.25//15.0000
|
|
//thisSwitchCam.camVelocityOverrides[3].fStartPoint = 4.0000
|
|
//thisSwitchCam.camVelocityOverrides[3].fSpeed = 0//15.0000
|
|
//thisSwitchCam.camVelocityOverrides[4].fStartPoint = 4.9000
|
|
//thisSwitchCam.camVelocityOverrides[4].fSpeed = 10.0000
|
|
//thisSwitchCam.camVelocityOverrides[5].fStartPoint = 5.0000
|
|
//thisSwitchCam.camVelocityOverrides[5].fSpeed = 3.0000
|
|
|
|
thisSwitchCam.iNumNodes = 3
|
|
thisSwitchCam.iCamSwitchFocusNode = 0
|
|
thisSwitchCam.bSplineNoSmoothing = FALSE
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
|
|
thisSwitchCam.iGameplayNodeBlendDuration = 0
|
|
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_TrainToBoat_outro.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_TrainToBoat_outro.xml"
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.viVehicles[0] = viSwitchBoat
|
|
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL PRELOAD_ASCENT_SHOT()
|
|
CDEBUG3LN(DEBUG_MISSION, "PRELOAD_ASCENT_SHOT")
|
|
|
|
RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, DEFAULT, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO | SWITCH_FLAG_PAUSE_BEFORE_ASCENT | SWITCH_FLAG_SKIP_OUTRO))
|
|
|
|
IF IS_SWITCH_READY_FOR_ASCENT()
|
|
CDEBUG3LN(DEBUG_MISSION, "Ascent Shot Ready.")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
CDEBUG3LN(DEBUG_MISSION, "Ascent Shot NOT READY!")
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
|
|
|
|
FUNC BOOL HANDLE_SWITCH_CAM_TRAIN_TO_BOAT(SWITCH_CAM_STRUCT &thisSwitchCam1, SWITCH_CAM_STRUCT &thisSwitchCam2)
|
|
|
|
INT iCurrentNode
|
|
|
|
SWITCH eSwitchCamState
|
|
|
|
CASE SWITCH_CAM_IDLE
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_REQUEST_ASSETS
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS")
|
|
//LOAD_CAM_SHAKE_LIBRARIES(thisSwitchCam1)
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_1
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE1")
|
|
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_INTRO(thisSwitchCam1, missionTrain)
|
|
|
|
CREATE_SPLINE_CAM(thisSwitchCam1)
|
|
|
|
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
|
|
OR GET_FOLLOW_VEHICLE_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
|
|
bFromTrainSwitchFirstPerson = TRUE
|
|
ELSE
|
|
bFromTrainSwitchFirstPerson = FALSE
|
|
ENDIF
|
|
|
|
IF NOT bFromTrainSwitchFirstPerson
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ELSE
|
|
SET_CAM_ACTIVE(fpsCam.theCam, TRUE)
|
|
ENDIF
|
|
|
|
CASCADE_SHADOWS_INIT_SESSION()
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
bPlayerControlGiven = FALSE
|
|
bTrainSwitch_CodeCam_DingyPlayback = FALSE
|
|
bTrainSwitchRestartDinghyRecording = FALSE
|
|
|
|
SETTIMERB(0)
|
|
|
|
eSwitchCamState = SWITCH_CAM_TRAIN_TO_BOAT_CODE_CAM
|
|
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_TRAIN_TO_BOAT_CODE_CAM
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_CODE_DRIVEN_SWITCH")
|
|
|
|
SWITCH_FLAGS switchFlags
|
|
IF NOT bFromTrainSwitchFirstPerson
|
|
switchFlags = SWITCH_FLAG_SKIP_INTRO | SWITCH_FLAG_SKIP_OUTRO
|
|
ELSE
|
|
switchFlags = SWITCH_FLAG_SKIP_INTRO | SWITCH_FLAG_SKIP_OUTRO | SWITCH_FLAG_PAUSE_BEFORE_ASCENT
|
|
ENDIF
|
|
|
|
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, DEFAULT, ENUM_TO_INT(switchFlags))
|
|
|
|
if GET_PLAYER_SWITCH_STATE() >= SWITCH_STATE_OUTRO_HOLD
|
|
|
|
sCamDetails.bSplineComplete = true
|
|
|
|
|
|
RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, switch_type_auto)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 001, "trcrash")
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], fSwitchCamTrainToBoat_DingyWarp_EndingCam)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(trainCrashVehicle[TCV_DINGHY], (<<0.0, 0.0, 0.7>>))
|
|
|
|
eSwitchCamState = SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_2
|
|
|
|
else
|
|
|
|
IF TIMERB() >= 250
|
|
OR NOT bFromTrainSwitchFirstPerson
|
|
ALLOW_PLAYER_SWITCH_ASCENT()
|
|
ENDIF
|
|
|
|
//[MF] Make sure that the boat is in it's proper end position so we don't encounter a streaming issue.
|
|
IF GET_PLAYER_SWITCH_STATE() >= SWITCH_STATE_JUMPCUT_DESCENT
|
|
IF NOT bTrainSwitch_CodeCam_DingyPlaybacK
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 001, "trcrash")
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], fSwitchCamTrainToBoat_DingyWarp_JumpcutDescent)
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(trainCrashVehicle[TCV_DINGHY], (<<0.0, 0.0, 0.7>>))
|
|
bTrainSwitch_CodeCam_DingyPlayback = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_PLAYER_SWITCH_STATE() >= SWITCH_STATE_OUTRO_SWOOP
|
|
IF NOT bTrainSwitchRestartDinghyRecording
|
|
PRINTLN("Skipping to recording point in vehicle...")
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 001, "trcrash")
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], fSwitchCamTrainToBoat_DingyWarp_OutroSwoop)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(trainCrashVehicle[TCV_DINGHY], (<<0.0, 0.0, 0.7>>))
|
|
bTrainSwitchRestartDinghyRecording = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
endif
|
|
ENDIF
|
|
|
|
|
|
FALLTHRU
|
|
|
|
CASE SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_2
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_2")
|
|
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
PRINTSTRING("first person boat!") PRINTNL()
|
|
bToBoatSwitchFirstPerson = TRUE
|
|
ELSE
|
|
PRINTSTRING("NOT first person boat!") PRINTNL()
|
|
bToBoatSwitchFirstPerson = FALSE
|
|
ENDIF
|
|
|
|
IF NOT bToBoatSwitchFirstPerson
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO(thisSwitchCam2, trainCrashVehicle[TCV_DINGHY])
|
|
ELSE
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO_FIRST_PERSON(thisSwitchCam2, trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
CREATE_SPLINE_CAM(thisSwitchCam2)
|
|
|
|
SET_SELECTOR_CAM_ACTIVE(FALSE)
|
|
|
|
SET_CAM_ACTIVE(thisSwitchCam2.ciSpline, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
bPlayerControlGiven = FALSE
|
|
|
|
IF bToBoatSwitchFirstPerson
|
|
FILL_PUSH_IN_DATA(pushInData, trainCrashVehicle[TCV_DINGHY], CHAR_MICHAEL, PUSH_IN_DISTANCE, PUSH_IN_INTERP_TIME, PUSH_IN_CUT_TIME, PUSH_IN_POSTFX_TIME, PUSH_IN_SPEED_UP_TIME)
|
|
SET_PUSH_IN_DIRECTION_MODIFIER(pushInData, <<13,0,-10>>)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
WAIT(0)//[MF] To allow time-cycle to exit out properly. Fix for assert in B* 1319699
|
|
|
|
eSwitchCamState = SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_2
|
|
|
|
FALLTHRU
|
|
|
|
|
|
CASE SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_2
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_2")
|
|
|
|
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam2)
|
|
|
|
IF IS_CAM_ACTIVE(thisSwitchCam2.ciSpline)
|
|
|
|
IF iCurrentNode >= thisSwitchCam2.iCamSwitchFocusNode
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fGameplayCamHeadingTrainToBoat)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fGameplayCamPitchTrainToBoat)
|
|
ENDIF
|
|
|
|
IF iCurrentNode >= 6
|
|
IF NOT sCamDetails.bOKToSwitchPed
|
|
sCamDetails.bOKToSwitchPed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam2.ciSpline) >= 1.00
|
|
IF bToBoatSwitchFirstPerson
|
|
WHILE NOT HANDLE_PUSH_IN(pushInData, TRUE, true, true, false, false)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fGameplayCamHeadingTrainToBoat)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fGameplayCamPitchTrainToBoat)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
//STOP_SOUND(iWooshOut_ID)
|
|
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = DESTROY_CAM(thisSwitchCam1.ciSpline)")
|
|
IF DOES_CAM_EXIST(thisSwitchCam2.ciSpline)
|
|
SET_CAM_ACTIVE(thisSwitchCam2.ciSpline, FALSE)
|
|
DESTROY_CAM(thisSwitchCam2.ciSpline)
|
|
ENDIF
|
|
DESTROY_ALL_CAMS()
|
|
|
|
IF NOT bPlayerControlGiven
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
bPlayerControlGiven = TRUE
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
//UNLOAD_ALL_CAM_SHAKE_ANIM_LIBRARIES()
|
|
|
|
eSwitchCamState = SWITCH_CAM_IDLE
|
|
|
|
RETURN TRUE
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX &piMichael, PED_INDEX &piTrevor)
|
|
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER")
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
//--- Start of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[0].iNodeTime = 0
|
|
thisSwitchCam.nodes[0].vNodePos = <<-489.2911, 4425.7729, 31.1429>>
|
|
thisSwitchCam.nodes[0].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
|
|
thisSwitchCam.nodes[0].fNodeOffsetDist = 5.0000
|
|
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[0].vNodeDir = <<-1.4144, 0.1731, 15.1899>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].iNodeToClone = 0
|
|
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.3030
|
|
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 2.9700
|
|
thisSwitchCam.nodes[0].iCamEaseType = 0
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 1.0000
|
|
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 1.0000
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[0].fTimeScale = 0.5000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.5000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[0].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 1000
|
|
thisSwitchCam.nodes[1].vNodePos = <<-489.2911, 4425.7729, 31.1429>>
|
|
thisSwitchCam.nodes[1].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
|
|
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[1].vNodeDir = <<-1.4144, 0.1731, 15.1899>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].iNodeToClone = 0
|
|
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.2000
|
|
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 1.00
|
|
thisSwitchCam.nodes[1].iCamEaseType = 0
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 1.0000
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[1].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[1].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = TRUE
|
|
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.0
|
|
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[2].iNodeTime = 1000
|
|
thisSwitchCam.nodes[2].vNodePos = <<-488.22, 4421.98, 31.26>>
|
|
thisSwitchCam.nodes[2].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
|
|
thisSwitchCam.nodes[2].fNodeOffsetDist = 5.0000
|
|
thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[2].vNodeDir = <<-1.32, 0.29, 15.23>>
|
|
thisSwitchCam.nodes[2].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[2].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].iNodeToClone = 0
|
|
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.2
|
|
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[2].fNodeCamShake = 0.0
|
|
thisSwitchCam.nodes[2].iCamEaseType = 0
|
|
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[2].fTimeScale = 1.0
|
|
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.5000
|
|
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[2].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[2].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[2].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[2].iHoldDuration = 0
|
|
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[3].iNodeTime = 600
|
|
thisSwitchCam.nodes[3].vNodePos = <<-484.8558, 4397.1348, 32.2383>>
|
|
thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[3].vNodeDir = <<-4.0959, 0.0000, 6.5427>>
|
|
thisSwitchCam.nodes[3].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[3].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[3].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].iNodeToClone = 0
|
|
thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.3000
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.2000
|
|
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[3].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[3].iCamEaseType = 0
|
|
thisSwitchCam.nodes[3].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[3].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[3].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[3].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[3].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[3].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[3].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[3].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[3].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[3].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[3].iHoldDuration = 0
|
|
thisSwitchCam.nodes[3].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[3].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[4].bIsGameplayCamCopy = TRUE
|
|
thisSwitchCam.nodes[4].iNodeTime = 500
|
|
thisSwitchCam.nodes[4].vNodePos = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[4].vNodeDir = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[4].fNodeFOV = 0.0000
|
|
thisSwitchCam.nodes[4].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].iNodeToClone = 0
|
|
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.2000
|
|
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[4].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[4].iCamEaseType = 0
|
|
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[4].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[4].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[4].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[4].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[4].iHoldDuration = 0
|
|
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
|
|
|
|
thisSwitchCam.iNumNodes = 5
|
|
thisSwitchCam.iCamSwitchFocusNode = 0
|
|
thisSwitchCam.fSwitchSoundAudioStartPhase = -1.0000
|
|
thisSwitchCam.fSwitchSoundAudioEndPhase = -1.0000
|
|
thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE
|
|
thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE
|
|
thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE
|
|
thisSwitchCam.bSplineNoSmoothing = TRUE
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
|
|
thisSwitchCam.iGameplayNodeBlendDuration = 0
|
|
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_MichaelToTrevor_Container.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_MichaelToTrevor_Container.xml"
|
|
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.piPeds[0] = piMichael
|
|
thisSwitchCam.piPeds[1] = piTrevor
|
|
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX &piMichael, PED_INDEX &piTrevor)
|
|
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER")
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
//--- Start of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[0].iNodeTime = 0
|
|
thisSwitchCam.nodes[0].vNodePos = <<-489.2911, 4425.7729, 31.1429>>
|
|
thisSwitchCam.nodes[0].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
|
|
thisSwitchCam.nodes[0].fNodeOffsetDist = 5.0000
|
|
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[0].vNodeDir = <<-1.4144, 0.1731, 15.1899>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].iNodeToClone = 0
|
|
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.3030
|
|
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 2.9700
|
|
thisSwitchCam.nodes[0].iCamEaseType = 0
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 1.0000
|
|
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[0].fTimeScale = 0.5000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.5000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[0].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 1000
|
|
thisSwitchCam.nodes[1].vNodePos = <<-489.2911, 4425.7729, 31.1429>>
|
|
thisSwitchCam.nodes[1].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
|
|
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[1].vNodeDir = <<-1.4144, 0.1731, 15.1899>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].iNodeToClone = 0
|
|
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.2000
|
|
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 1.00
|
|
thisSwitchCam.nodes[1].iCamEaseType = 0
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[1].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[1].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = TRUE
|
|
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.0
|
|
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[2].iNodeTime = 1000
|
|
thisSwitchCam.nodes[2].vNodePos = <<-488.22, 4421.98, 31.26>>
|
|
thisSwitchCam.nodes[2].vWorldPosLookAt = <<-491.2000, 4435.8999, 31.3000>>
|
|
thisSwitchCam.nodes[2].fNodeOffsetDist = 5.0000
|
|
thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[2].vNodeDir = <<-1.32, 0.29, 15.23>>
|
|
thisSwitchCam.nodes[2].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[2].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].iNodeToClone = 0
|
|
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.2
|
|
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[2].fNodeCamShake = 0.0
|
|
thisSwitchCam.nodes[2].iCamEaseType = 0
|
|
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[2].fTimeScale = 1.0
|
|
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.5000
|
|
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[2].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[2].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[2].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[2].iHoldDuration = 0
|
|
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[3].iNodeTime = 600
|
|
thisSwitchCam.nodes[3].vNodePos = <<-484.8558, 4397.1348, 32.2383>>
|
|
thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[3].vNodeDir = <<-4.0959, 0.0000, 6.5427>>
|
|
thisSwitchCam.nodes[3].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[3].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[3].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].iNodeToClone = 0
|
|
thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.3000
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.2000
|
|
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[3].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[3].iCamEaseType = 0
|
|
thisSwitchCam.nodes[3].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[3].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[3].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[3].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[3].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[3].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[3].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[3].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[3].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[3].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[3].iHoldDuration = 0
|
|
thisSwitchCam.nodes[3].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[3].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[4].iNodeTime = 500
|
|
thisSwitchCam.nodes[4].vNodePos = <<-484.8558, 4397.0348, 32.2383>>
|
|
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[4].vNodeDir = <<-4.0959, 0.0000, 6.5427>>
|
|
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[4].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].iNodeToClone = 0
|
|
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.3000
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.2000
|
|
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[4].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[4].iCamEaseType = 0
|
|
thisSwitchCam.nodes[4].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[4].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[4].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[4].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[4].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[4].iHoldDuration = 0
|
|
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
/*
|
|
thisSwitchCam.nodes[3].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[3].bIsGameplayCamCopy = TRUE
|
|
thisSwitchCam.nodes[3].iNodeTime = 2500
|
|
thisSwitchCam.nodes[3].vNodePos = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[3].vNodeDir = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[3].fNodeFOV = 0.0000
|
|
thisSwitchCam.nodes[3].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[3].iNodeToClone = 0
|
|
thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[3].fNodeMotionBlur = 0.2000
|
|
thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT
|
|
thisSwitchCam.nodes[3].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[3].iCamEaseType = 0
|
|
thisSwitchCam.nodes[3].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[3].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[3].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[3].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[3].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[3].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[3].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[3].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[3].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[3].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[3].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[3].iHoldDuration = 0
|
|
thisSwitchCam.nodes[3].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[3].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[3].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[3].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
*/
|
|
|
|
|
|
thisSwitchCam.iNumNodes = 5
|
|
thisSwitchCam.iCamSwitchFocusNode = 0
|
|
thisSwitchCam.fSwitchSoundAudioStartPhase = -1.0000
|
|
thisSwitchCam.fSwitchSoundAudioEndPhase = -1.0000
|
|
thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE
|
|
thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE
|
|
thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE
|
|
thisSwitchCam.bSplineNoSmoothing = TRUE
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
|
|
thisSwitchCam.iGameplayNodeBlendDuration = 0
|
|
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_MichaelToTrevor_Container.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_MichaelToTrevor_Container.xml"
|
|
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.piPeds[0] = piMichael
|
|
thisSwitchCam.piPeds[1] = piTrevor
|
|
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY_TREVOR_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viTrevor, VEHICLE_INDEX &viMichael)
|
|
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_TREVOR_TO_MICHAEL")
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
|
|
//--- Start of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[0].iNodeTime = 1000
|
|
thisSwitchCam.nodes[0].vNodePos = <<-0.5993, -3.4630, 1.5224>>
|
|
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[0].vNodeDir = <<0.1295, 0.1181, 0.5124>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 60.0000
|
|
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.2
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[0].iCamEaseType = 0
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].fTimeScale = 0.1000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 500
|
|
thisSwitchCam.nodes[1].vNodePos = <<-0.3493, -5.2114, 1.5501>>
|
|
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[1].vNodeDir = <<-0.0687, 0.1011, 0.4874>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 60.0000
|
|
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.2
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[1].iCamEaseType = 0
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].fTimeScale = 0.5000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
|
|
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[2].bIsGameplayCamCopy = TRUE
|
|
thisSwitchCam.nodes[2].iNodeTime = 300
|
|
thisSwitchCam.nodes[2].vNodePos = <<9.9178, -1.3892, 1.2530>>
|
|
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[2].vNodeDir = <<-0.1290, 0.1343, 0.7490>>
|
|
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[2].fNodeFOV = 60.0000
|
|
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.2
|
|
thisSwitchCam.nodes[2].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[2].iCamEaseType = 0
|
|
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[2].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[2].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[2].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[2].iHoldDuration = 0
|
|
|
|
thisSwitchCam.iNumNodes = 3
|
|
thisSwitchCam.iCamSwitchFocusNode = 3
|
|
thisSwitchCam.bSplineNoSmoothing = TRUE
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = TRUE
|
|
thisSwitchCam.iGameplayNodeBlendDuration = 1000
|
|
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_TrevorToMichael.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_TrevorToMichael.xml"
|
|
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.viVehicles[0] = viTrevor
|
|
thisSwitchCam.viVehicles[1] = viMichael
|
|
|
|
|
|
ENDPROC
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX &viMichael, VEHICLE_INDEX &viTrevor)
|
|
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICAEL_TO_TREVOR")
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
|
|
//--- Start of Cam Data ---
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = TRUE
|
|
thisSwitchCam.nodes[0].iNodeTime = 0
|
|
thisSwitchCam.nodes[0].vNodePos = <<-1588.2013, 4397.1216, 3.4046>>
|
|
thisSwitchCam.nodes[0].vNodeDir = <<-11.1489, 0.0000, -161.3704>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.2
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[0].iCamEaseType = 0
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[0].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 300
|
|
thisSwitchCam.nodes[1].vNodePos = <<-0.9217, 0.5790, 1.6262>>
|
|
thisSwitchCam.nodes[1].vNodeDir = <<-0.8974, -0.3626, 1.3974>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 60.0000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.2
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 0.0000
|
|
thisSwitchCam.nodes[1].iCamEaseType = 0
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[1].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
|
|
thisSwitchCam.iNumNodes = 2
|
|
thisSwitchCam.iCamSwitchFocusNode = 0
|
|
thisSwitchCam.bSplineNoSmoothing = TRUE
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = TRUE
|
|
thisSwitchCam.iGameplayNodeBlendDuration = 200
|
|
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_Exile3_MichaelToTrevor.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_Exile3_MichaelToTrevor.xml"
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.viVehicles[0] = viMichael
|
|
thisSwitchCam.viVehicles[1] = viTrevor
|
|
|
|
|
|
ENDPROC
|
|
|
|
/*
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
PROC CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS()
|
|
CDEBUG3LN(DEBUG_MISSION, "CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS")
|
|
|
|
START_WIDGET_GROUP("Custom Switch Cameras - Extra Tunables")
|
|
|
|
START_WIDGET_GROUP("Train To Boat")
|
|
START_WIDGET_GROUP("Boat Gameplay Cam Tuner")
|
|
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading Michael", fGameplayCamHeadingTrainToBoat, -180.0, 180.0, 0.25)
|
|
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch Michael", fGameplayCamPitchTrainToBoat, -180.0, 180.0, 0.25)
|
|
ADD_WIDGET_FLOAT_SLIDER("Dinghy Rec Skip JumpCutDescent", fSwitchCamTrainToBoat_DingyWarp_JumpcutDescent, 0, 20000.0, 500.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Dinghy Rec Skip OutroSwoop", fSwitchCamTrainToBoat_DingyWarp_OutroSwoop, 0, 20000.0, 500.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Dinghy Rec Skip Ending Cam", fSwitchCamTrainToBoat_DingyWarp_EndingCam, 0, 20000.0, 500.0)
|
|
ADD_WIDGET_VECTOR_SLIDER("Dinghy Start Loc", vDinghyInitLoc, -10000, 10000, 10.0)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Micheal To Trevor Container")
|
|
|
|
START_WIDGET_GROUP("Explosion Tuner")
|
|
ADD_WIDGET_INT_SLIDER("Explosion Delay (ms)", iContainerSwitch_ExplosionDelay, 0, 5000, 100)
|
|
ADD_WIDGET_VECTOR_SLIDER("Explosion Location", vContainerSwitch_ExplosionLocation, -10000, 10000, 0.3)
|
|
ADD_WIDGET_FLOAT_SLIDER("Explosion Scale", fContainerSwitch_ExplosionScale, 0.0, 10.0, 0.2)
|
|
ADD_WIDGET_FLOAT_SLIDER("Explosion Shake Stop Phase", fContainerSwitch_ShakeStoppedPhase, 0.0, 1.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Trevor Cam Switch Teleport Position Tuner")
|
|
ADD_WIDGET_VECTOR_SLIDER("Trevor Position", vContainerSwitchTrevorTeleportPos, -100000, 100000, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Trevor Heading", fContainerSwitchTrevorTeleportRot, 0.0, 500.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Trevor Gameplay Cam Tuner")
|
|
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading Trevor", fGameplayCamHeadingMichaelToTrevorContainer, -180.0, 180.0, 0.25)
|
|
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch Trevor", fGameplayCamPitchMichaelToTrevorContainer, -180.0, 180.0, 0.25)
|
|
STOP_WIDGET_GROUP()
|
|
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound Start Phase", fAudioContainerSwitchSplinePhaseStart, 0.0, 1.0, 0.05)
|
|
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound End Phase", fAudioContainerSwitchSplinePhaseEnd, 0.0, 1.0, 0.05)
|
|
ADD_WIDGET_INT_SLIDER("Start Boat Movement Node", iSwitchCam_Explosion_StartBoatMoveNode, 0, 10, 1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Play Trevor Dialogue Phase", fContainerSwitch_StartTrevDialogue, 0.0, 1.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Play Trev Switch APFX", fContainerSwitch_StartTrevFlashPhase, 0.0, 1.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("River Chase")
|
|
START_WIDGET_GROUP("Michael to Trevor Tuner")
|
|
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading Trevor", fRiverChaseGameplayCamHeadingTrevor, -180.0, 180.0, 0.25)
|
|
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch Trevor", fRiverChaseGameplayCamPitchTrevor, -180.0, 180.0, 0.25)
|
|
//ADD_WIDGET_FLOAT_SLIDER("Michael Reverse Angle Cam Heading", fMichaelReverseSwitchCamHeading, -360.0, 360.0, 1.0)
|
|
//ADD_WIDGET_FLOAT_SLIDER("Michael Reverse Angle Cam Pitch", fMichaelReverseSwitchCamPitch, -360.0, 360.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound Start Phase", fAudioRiverToTrevorSwitchSplinePhase, 0.0, 1.0, 0.05)
|
|
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound End Phase", fAudioRiverToTrevorSwitchSplinePhase, 0.0, 1.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Trevor To Michael Tuner")
|
|
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading Michael", fRiverChaseGameplayCamHeadingMichael, -180.0, 180.0, 0.25)
|
|
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch Michael", fRiverChaseGameplayCamPitchMichael, -180.0, 180.0, 0.25)
|
|
ADD_WIDGET_FLOAT_SLIDER("Switch 'Out' Sound Start Phase", fAudioRiverToMichaelSwitchSplinePhase, 0.0, 1.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
*/
|
|
|
|
|
|
// get model for a train crash model enum
|
|
FUNC MODEL_NAMES GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TRAIN_CRASH_MODEL_ENUM tcModel)
|
|
SWITCH tcModel
|
|
CASE TCM_MICHAEL
|
|
RETURN GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
BREAK
|
|
CASE TCM_TREVOR
|
|
RETURN GET_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
BREAK
|
|
CASE TCM_ENGINEER
|
|
RETURN S_M_M_LSMETRO_01
|
|
BREAK
|
|
CASE TCM_SOLDIER
|
|
RETURN S_M_Y_BLACKOPS_01
|
|
BREAK
|
|
CASE TCM_TRAIN_ENGINE
|
|
RETURN FREIGHT
|
|
BREAK
|
|
//CASE TCM_TRAIN_CONTAINER1
|
|
// RETURN FREIGHTCONT1
|
|
//BREAK
|
|
CASE TCM_TRAIN_CONTAINER2
|
|
RETURN FREIGHTCONT2
|
|
BREAK
|
|
CASE TCM_TRAIN_FLATBED
|
|
RETURN FREIGHTCAR
|
|
BREAK
|
|
CASE TCM_BIKE
|
|
RETURN SANCHEZ
|
|
BREAK
|
|
CASE TCM_MICHAEL_CAR
|
|
RETURN GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
BREAK
|
|
CASE TCM_MERC_CAR
|
|
RETURN MESA3
|
|
BREAK
|
|
CASE TCM_MERC_TRUCK
|
|
RETURN BARRACKS
|
|
BREAK
|
|
CASE TCM_CHASE_CHOPPER
|
|
RETURN BUZZARD
|
|
BREAK
|
|
CASE TCM_DINGHY
|
|
RETURN DINGHY2
|
|
BREAK
|
|
CASE TCM_ENEMY_DINGHY
|
|
RETURN DINGHY
|
|
BREAK
|
|
CASE TCM_BEACH_CAR
|
|
RETURN BFINJECTION
|
|
BREAK
|
|
CASE TCM_BEACH_TRUCK
|
|
RETURN SADLER
|
|
BREAK
|
|
CASE TCM_CONTAINER_DOORS
|
|
RETURN P_CS1_14B_TRAIN_S
|
|
BREAK
|
|
CASE TCM_CRATE
|
|
RETURN PROP_BOX_AMMO04A
|
|
BREAK
|
|
CASE TCM_CASE
|
|
RETURN PROP_IDOL_CASE_02
|
|
BREAK
|
|
CASE TCM_DEBRIS_CRATE
|
|
RETURN Prop_Box_Wood01A
|
|
BREAK
|
|
CASE TCM_DEBRIS_BARREL
|
|
RETURN Prop_Barrel_01A
|
|
BREAK
|
|
CASE TCM_ANCHOR
|
|
RETURN GET_RAPPEL_ANCHOR_MODEL_NAME()
|
|
BREAK
|
|
CASE TCM_DOOR_COLLISION_SHUT
|
|
RETURN P_CS1_14b_Train_S_col
|
|
BREAK
|
|
CASE TCM_DOOR_OPEN
|
|
RETURN P_CS1_14B_TRAIN_ESDOOR //P_CS1_14b_Train_S_colOpen
|
|
BREAK
|
|
CASE TCM_TRAILER_DOOR
|
|
RETURN v_ilev_trevtraildr
|
|
BREAK
|
|
CASE TCM_PATRICIA
|
|
RETURN GET_NPC_PED_MODEL(CHAR_PATRICIA)
|
|
BREAK
|
|
CASE TCM_RON
|
|
RETURN GET_NPC_PED_MODEL(CHAR_RON)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN DUMMY_MODEL_FOR_SCRIPT
|
|
ENDFUNC
|
|
|
|
|
|
PROC CREATE_OPEN_DOORS()
|
|
IF DOES_ENTITY_EXIST(doorCollisionObject)
|
|
DELETE_OBJECT(doorCollisionObject)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(doorsObject)
|
|
DELETE_OBJECT(doorsObject)
|
|
ENDIF
|
|
doorsObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DOOR_OPEN), <<0,1,2>>)
|
|
SET_ENTITY_COORDS(doorsObject,<<-491.690, 4434.900, 31.100>>)
|
|
SET_ENTITY_ROTATION(doorsObject,<<344.520, 343.820, 64.240>>)
|
|
FREEZE_ENTITY_POSITION(doorsObject, TRUE)
|
|
ENDPROC
|
|
|
|
|
|
FUNC BOOL HANDLE_SWITCH_CAM_MICHAEL_TO_TREVOR_CONTAINER(SWITCH_CAM_STRUCT &thisSwitchCam1)
|
|
|
|
INT iCurrentNode
|
|
|
|
SWITCH eSwitchCamState
|
|
|
|
CASE SWITCH_CAM_IDLE
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_REQUEST_ASSETS
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS")
|
|
LOAD_CAM_SHAKE_LIBRARIES(thisSwitchCam1)
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_CONTAINER_SPLINE
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE1")
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES()
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
|
|
PRINTSTRING("first person container!") PRINTNL()
|
|
bContainerSwitchFirstPerson = TRUE
|
|
ELSE
|
|
PRINTSTRING("NOT first person container!") PRINTNL()
|
|
bContainerSwitchFirstPerson = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
|
|
bContainerSwitchFirstPerson = TRUE
|
|
ELSE
|
|
bContainerSwitchFirstPerson = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
piMichaelContainerSwitch = PLAYER_PED_ID()
|
|
|
|
IF NOT bContainerSwitchFirstPerson
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER(thisSwitchCam1, piMichaelContainerSwitch, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ELSE
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER_FIRST_PERSON(thisSwitchCam1, piMichaelContainerSwitch, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM(thisSwitchCam1)
|
|
SET_CAM_SPLINE_SMOOTHING_STYLE(thisSwitchCam1.ciSPline, CAM_SPLINE_SLOW_IN_SMOOTH)
|
|
|
|
SET_CAM_ACTIVE(thisSwitchCam1.ciSpline, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
IF bContainerSwitchFirstPerson
|
|
cachedCamMode = CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-438, 4443, 30>>)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
//bWooshPlaying = FALSE
|
|
bPlayerControlGiven = FALSE
|
|
bContainerSwitch_ExplosionHappened = FALSE
|
|
bContainerSwitch_ShakeStopped = FALSE
|
|
bContainerSwitch_PlayTrevFlash = FALSE
|
|
|
|
SETTIMERB(0)
|
|
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
|
|
FALLTHRU
|
|
|
|
CASE SWITCH_CAM_PLAYING_SPLINE1
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1 Phase:", GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline))
|
|
|
|
IF IS_CAM_ACTIVE(thisSwitchCam1.ciSpline)
|
|
|
|
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam1)
|
|
|
|
IF iCurrentNode >= thisSwitchCam1.iCamSwitchFocusNode
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fGameplayCamHeadingMichaelToTrevorContainer)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fGameplayCamPitchMichaelToTrevorContainer)
|
|
ENDIF
|
|
|
|
IF iCurrentNode >= thisSwitchCam1.iCamSwitchFocusNode
|
|
sCamDetails.bOKToSwitchPed = TRUE
|
|
ENDIF
|
|
|
|
IF NOT bContainerSwitch_ExplosionHappened
|
|
IF TIMERB() >= iContainerSwitch_ExplosionDelay
|
|
PRINTLN("Playing container explosion effect....")
|
|
ADD_EXPLOSION(vContainerSwitch_ExplosionLocation, EXP_TAG_ROCKET, fContainerSwitch_ExplosionScale)
|
|
bContainerSwitch_ExplosionHappened = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bContainerSwitch_PlayTrevFlash
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) > fContainerSwitch_StartTrevFlashPhase
|
|
ANIMPOSTFX_PLAY("SwitchShortMichaelMid", 0, false)
|
|
bContainerSwitch_PlayTrevFlash = TRUE
|
|
iFlashTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bHitSound
|
|
IF bContainerSwitch_PlayTrevFlash
|
|
IF GET_GAME_TIMER() >= iFlashTime + 80
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
iHitTime = GET_GAME_TIMER()
|
|
bHitSound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bWooshStarted
|
|
IF bHitSound
|
|
IF GET_GAME_TIMER() >= iHitTime + 250
|
|
PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bWooshStarted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bContainerSwitch_ShakeStopped
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) > fContainerSwitch_ShakeStoppedPhase
|
|
PRINTLN("Stopping Cam Shake...")
|
|
SHAKE_CAM(thisSwitchCam1.ciSpline, "SKY_DIVING_SHAKE", 0.0)
|
|
bContainerSwitch_ShakeStopped = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/*
|
|
IF bWooshPlaying = FALSE
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= fAudioContainerSwitchSplinePhaseStart
|
|
AND GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) < fAudioContainerSwitchSplinePhaseEnd
|
|
//woosh in
|
|
iWooshSND_ID = GET_SOUND_ID()
|
|
PLAY_SOUND_FRONTEND(iWooshSND_ID , "All", "SHORT_PLAYER_SWITCH_SOUND_SET")
|
|
CDEBUG3LN(DEBUG_MISSION, "Playing: In")
|
|
bWooshPlaying = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bWooshPlaying = TRUE
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= fAudioContainerSwitchSplinePhaseEnd
|
|
STOP_SOUND(iWooshSND_ID)
|
|
bWooshPlaying = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= 0.99
|
|
FILL_PUSH_IN_DATA(pushInData, PLAYER_PED_ID(), CHAR_TREVOR, PUSH_IN_DISTANCE, PUSH_IN_INTERP_TIME, PUSH_IN_CUT_TIME, PUSH_IN_POSTFX_TIME, PUSH_IN_SPEED_UP_TIME, PUSH_IN_SPEED_UP_PROPORTION)
|
|
//SET_PUSH_IN_DIRECTION_MODIFIER(pushInData, <<0,0,0>>)
|
|
eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_SHUTDOWN_SPLINE1
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1")
|
|
BOOL bProgress
|
|
bProgress = FALSE
|
|
|
|
IF NOT bContainerSwitchFirstPerson
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam1.ciSpline)
|
|
DESTROY_CAM(thisSwitchCam1.ciSpline)
|
|
DESTROY_ALL_CAMS()
|
|
ENDIF
|
|
bProgress = TRUE
|
|
ELSE
|
|
bProgress = HANDLE_PUSH_IN(pushInData, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF bProgress
|
|
IF bContainerSwitchFirstPerson
|
|
PRINTSTRING("setting cam ") PRINTINT(ENUM_TO_INT(cachedCamMode)) PRINTNL()
|
|
SET_FOLLOW_PED_CAM_VIEW_MODE(cachedCamMode)
|
|
ENDIF
|
|
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
|
|
|
|
STOP_SOUND(iWooshSND_ID)
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
|
|
IF bContainerSwitchFirstPerson
|
|
DESTROY_PUSH_IN_CAMS(pushInData)
|
|
|
|
// CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ELSE
|
|
|
|
ENDIF
|
|
|
|
IF bContainerSwitchFirstPerson
|
|
CREATE_OPEN_DOORS()
|
|
STOP_FIRE_IN_RANGE(<<-491.2, 4435.3, 31.7>>, 5)
|
|
REMOVE_DECALS_IN_RANGE(<<-491.2, 4435.3, 31.7>>, 5)
|
|
ENDIF
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
SETTIMERA(0)
|
|
|
|
eSwitchCamState = SWITCH_CAM_IDLE
|
|
|
|
RETURN TRUE
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL HANDLE_SWITCH_CAM_RIVER_CHASE_TREVOR_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam1)
|
|
|
|
INT iCurrentNode
|
|
|
|
SWITCH eSwitchCamState
|
|
|
|
CASE SWITCH_CAM_IDLE
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_SETUP_TREVOR_TO_MICHAEL_SPLINE
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_TREVOR_TO_MICHAEL_SPLINE")
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
IF bPreventMissionFail_SwitchCamDebug
|
|
SET_ENTITY_INVINCIBLE(GET_SELECT_PED(SEL_MICHAEL), TRUE)
|
|
SET_ENTITY_CAN_BE_DAMAGED(GET_SELECT_PED(SEL_MICHAEL), FALSE)
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_ENTITY_CAN_BE_DAMAGED(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_TREVOR_TO_MICHAEL(thisSwitchCam1, trainCrashVehicle[TCV_DINGHY], trainCrashVehicle[TCV_DINGHY])
|
|
|
|
CREATE_SPLINE_CAM(thisSwitchCam1)
|
|
|
|
SET_CAM_ACTIVE(thisSwitchCam1.ciSpline, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
//woosh in
|
|
iWooshSND_ID = GET_SOUND_ID()
|
|
PLAY_SOUND_FRONTEND(iWooshSND_ID , "All", "SHORT_PLAYER_SWITCH_SOUND_SET")
|
|
|
|
bWooshOut = FALSE
|
|
bPlayerControlGiven = FALSE
|
|
|
|
SETTIMERB(0)
|
|
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_PLAYING_SPLINE1
|
|
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
|
|
|
|
IF IS_CAM_ACTIVE(thisSwitchCam1.ciSpline)
|
|
|
|
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam1)
|
|
IF iCurrentNode >= 1
|
|
IF GET_SELECT_PED(SEL_MICHAEL) = PLAYER_PED_ID()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fRiverChaseGameplayCamHeadingMichael)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRiverChaseGameplayCamPitchMichael)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//woosh out audio
|
|
IF bWooshOut = FALSE
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= fAudioRiverToMichaelSwitchSplinePhase
|
|
STOP_SOUND(iWooshSND_ID)
|
|
bWooshOut = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam1.ciSpline) >= 0.99
|
|
eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_SHUTDOWN_SPLINE1
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1")
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam1.ciSpline)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fRiverChaseGameplayCamHeadingMichael)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRiverChaseGameplayCamPitchMichael)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
|
|
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
|
|
|
|
STOP_SOUND(iWooshSND_ID)
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam1.ciSpline)
|
|
SET_CAM_ACTIVE(thisSwitchCam1.ciSpline, FALSE)
|
|
DESTROY_CAM(thisSwitchCam1.ciSpline)
|
|
ENDIF
|
|
DESTROY_ALL_CAMS()
|
|
|
|
IF NOT bPlayerControlGiven
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
bPlayerControlGiven = TRUE
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
eSwitchCamState = SWITCH_CAM_IDLE
|
|
|
|
RETURN TRUE
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
FUNC BOOL HANDLE_SWITCH_CAM_RIVER_CHASE_MICHAEL_TO_TREVOR(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
|
|
INT iCurrentNode
|
|
|
|
SWITCH eSwitchCamState
|
|
|
|
CASE SWITCH_CAM_IDLE
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_SPLINE
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_SPLINE")
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
IF bPreventMissionFail_SwitchCamDebug
|
|
SET_ENTITY_INVINCIBLE(GET_SELECT_PED(SEL_TREVOR), TRUE)
|
|
SET_ENTITY_CAN_BE_DAMAGED(GET_SELECT_PED(SEL_TREVOR), FALSE)
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_ENTITY_CAN_BE_DAMAGED(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR(thisSwitchCam, trainCrashVehicle[TCV_DINGHY], trainCrashVehicle[TCV_DINGHY])
|
|
|
|
CREATE_SPLINE_CAM(thisSwitchCam)
|
|
|
|
IF thisSwitchCam.nodes[0].SwitchCamType != SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
AND thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
|
|
ELSE
|
|
SET_CAM_ACTIVE(CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, thisSwitchCam.nodes[0].vNodePos, thisSwitchCam.nodes[0].vNodeDir, thisSwitchCam.nodes[0].fNodeFOV, TRUE), TRUE)
|
|
ENDIF
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
//woosh in
|
|
iWooshSND_ID = GET_SOUND_ID()
|
|
PLAY_SOUND_FRONTEND(iWooshSND_ID , "All", "SHORT_PLAYER_SWITCH_SOUND_SET")
|
|
|
|
bWooshOut = FALSE
|
|
bPlayerControlGiven = FALSE
|
|
|
|
SETTIMERB(0)
|
|
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_PLAYING_SPLINE1
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
|
|
|
|
IF NOT IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
|
|
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
|
|
|
|
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
|
|
|
|
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam)
|
|
|
|
CDEBUG3LN(DEBUG_MISSION, "iCurrentNode = ", iCurrentNode)
|
|
|
|
IF iCurrentNode >= 1
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fRiverChaseGameplayCamHeadingTrevor)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRiverChaseGameplayCamPitchTrevor)
|
|
ENDIF
|
|
|
|
//woosh out audio
|
|
IF bWooshOut = FALSE
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= fAudioRiverToTrevorSwitchSplinePhase
|
|
STOP_SOUND(iWooshSND_ID)
|
|
bWooshOut = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 0.99
|
|
eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1
|
|
ENDIF
|
|
endif
|
|
ELSE
|
|
CDEBUG3LN(DEBUG_MISSION, "CAM NOT ACTIVE... HOW IS THIS POSSIBLE?")
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_SHUTDOWN_SPLINE1
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SHUTDOWN_SPLINE1")
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fRiverChaseGameplayCamHeadingTrevor)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRiverChaseGameplayCamPitchTrevor)
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, 30)
|
|
ENDIF
|
|
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
//RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, FALSE)
|
|
DESTROY_CAM(thisSwitchCam.ciSpline)
|
|
ENDIF
|
|
DESTROY_ALL_CAMS()
|
|
STOP_SOUND(iWooshSND_ID)
|
|
|
|
IF NOT bPlayerControlGiven
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
bPlayerControlGiven = TRUE
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
eSwitchCamState = SWITCH_CAM_IDLE
|
|
|
|
RETURN TRUE
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PROC UPDATE_SPLINE_CAM_HELPERS()
|
|
//CDEBUG3LN(DEBUG_MISSION, "UPDATE_SPLINE_CAM_HELPERS")
|
|
|
|
IF bResetDebugScenario
|
|
|
|
bResetDebugScenario = FALSE
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
// get cutscene name
|
|
FUNC STRING GET_EXILE3_INTRO_CUTSCENE_NAME()
|
|
RETURN "exile_3_int"
|
|
ENDFUNC
|
|
|
|
// get recording prefix
|
|
FUNC STRING GET_TRAIN_CRASH_RECORDING_PREFIX()
|
|
RETURN "trcrash"
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_DESCRIPTION_FOR_STAGE_AS_STRING(MISSION_STAGE_ENUM thisStage)
|
|
SWITCH thisStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
RETURN "Intercept train"
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
RETURN "Chase and board train"
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
RETURN "Drive along train to engine"
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
RETURN "Get to bridge"
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
RETURN "Enter container"
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
RETURN "Protect Michael from mercs"
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
RETURN "Rapids chase"
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
RETURN "Get to cars"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "invalid"
|
|
ENDFUNC
|
|
|
|
// can advance mission
|
|
FUNC BOOL CAN_ADVANCE_MISSION()
|
|
IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED
|
|
AND NOT IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// do mission god text
|
|
FUNC BOOL DO_MISSION_GOD_TEXT(STRING sGodText, BOOL bSupercedeText = TRUE, BOOL bSupercedeSpeech = FALSE, INT iTime = DEFAULT_GOD_TEXT_TIME)
|
|
IF bSupercedeText OR NOT IS_MESSAGE_BEING_DISPLAYED()
|
|
IF bSupercedeSpeech
|
|
OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
|
|
IF CAN_ADVANCE_MISSION()
|
|
PRINT_NOW(sGodText, iTime, 1)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// do mission help text
|
|
FUNC BOOL DO_MISSION_HELP_TEXT(STRING sHelpText, BOOL bForever = FALSE, INT iTime = -1)
|
|
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
IF CAN_ADVANCE_MISSION()
|
|
IF NOT bForever
|
|
PRINT_HELP(sHelpText, iTime)
|
|
ELSE
|
|
PRINT_HELP_FOREVER(sHelpText)
|
|
ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// do mission speech
|
|
FUNC BOOL DO_MISSION_SPEECH(STRING sSpeech, BOOL bSupercedeText = FALSE, INT iLine = 0, BOOL bFromSpecifiedLine = FALSE, BOOL bAllowSpeechAfterFail = FALSE)
|
|
IF bSupercedeText OR NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND (CAN_ADVANCE_MISSION() OR (bAllowSpeechAfterFail AND NOT IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()))
|
|
IF iLine = 0
|
|
RETURN CREATE_CONVERSATION(trainCrashConversation, "EXL3AUD", sSpeech, CONV_PRIORITY_HIGH)
|
|
ELSE
|
|
TEXT_LABEL tLine
|
|
tLine = sSpeech
|
|
tLine+="_"
|
|
tLine+=iLine
|
|
IF NOT bFromSpecifiedLine
|
|
RETURN PLAY_SINGLE_LINE_FROM_CONVERSATION(trainCrashConversation, "EXL3AUD", sSpeech, tLine, CONV_PRIORITY_HIGH)
|
|
ELSE
|
|
RETURN CREATE_CONVERSATION_FROM_SPECIFIC_LINE(trainCrashConversation, "EXL3AUD", sSpeech, tLine, CONV_PRIORITY_HIGH)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// remove mission text
|
|
PROC REMOVE_MISSION_TEXT(BOOL bClearSpeech = TRUE, BOOL bClearGodText = TRUE, BOOL bClearHelpText = TRUE, BOOL bKeepSubs = FALSE)
|
|
IF bClearSpeech
|
|
KILL_ANY_CONVERSATION()
|
|
ENDIF
|
|
|
|
IF bClearGodText
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
OR (bClearSpeech AND NOT bKeepSubs)
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
CLEAR_REMINDER_MESSAGE()
|
|
ENDIF
|
|
|
|
IF bClearHelpText
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
CLEAR_HELP()
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_VEHICLE(VEHICLE_INDEX vehicle, bool isEnemyVehicle=FALSE)
|
|
IF CAN_ADVANCE_MISSION()
|
|
RETURN CREATE_BLIP_FOR_VEHICLE(vehicle, isEnemyVehicle)
|
|
ENDIF
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_PED(PED_INDEX ped, BOOL isEnemyPed=FALSE)
|
|
IF CAN_ADVANCE_MISSION()
|
|
RETURN CREATE_BLIP_FOR_PED(ped, isEnemyPed)
|
|
ENDIF
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_OBJECT(OBJECT_INDEX object)
|
|
IF CAN_ADVANCE_MISSION()
|
|
RETURN CREATE_BLIP_FOR_OBJECT(object)
|
|
ENDIF
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_COORD(VECTOR vCoords, BOOL bSetRoute = FALSE)
|
|
IF CAN_ADVANCE_MISSION()
|
|
RETURN CREATE_BLIP_FOR_COORD(vCoords, bSetRoute)
|
|
ENDIF
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TRIGGER_MISSION_MUSIC_EVENT(STRING sEvent)
|
|
RETURN TRIGGER_MUSIC_EVENT(sEvent)
|
|
ENDFUNC
|
|
|
|
// get michael ped
|
|
FUNC PED_INDEX GET_MICHAEL_PED()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
ENDIF
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
// get trevor ped
|
|
FUNC PED_INDEX GET_TREVOR_PED()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ENDIF
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
|
|
// get a weapon enum as a weapontype
|
|
FUNC WEAPON_TYPE GET_TRAIN_CRASH_WEAPON_TYPE(TRAIN_CRASH_WEAPON_ENUM weapon)
|
|
SWITCH weapon
|
|
CASE TC_WEAPON_SMG
|
|
RETURN WEAPONTYPE_MICROSMG
|
|
BREAK
|
|
CASE TC_WEAPON_PISTOL
|
|
RETURN WEAPONTYPE_PISTOL
|
|
BREAK
|
|
CASE TC_WEAPON_SHOTGUN
|
|
RETURN WEAPONTYPE_SAWNOFFSHOTGUN
|
|
BREAK
|
|
CASE TC_WEAPON_STICKY_BOMB
|
|
RETURN WEAPONTYPE_STICKYBOMB
|
|
BREAK
|
|
CASE TC_WEAPON_MERC_RIFLE
|
|
RETURN WEAPONTYPE_CARBINERIFLE
|
|
BREAK
|
|
CASE TC_WEAPON_MG
|
|
RETURN WEAPONTYPE_COMBATMG
|
|
BREAK
|
|
CASE TC_WEAPON_SNIPER_RIFLE
|
|
RETURN WEAPONTYPE_SNIPERRIFLE
|
|
BREAK
|
|
CASE TC_WEAPON_BACKUP_RIFLE
|
|
RETURN WEAPONTYPE_ASSAULTRIFLE
|
|
BREAK
|
|
CASE TC_WEAPON_CASE
|
|
RETURN WEAPONTYPE_BRIEFCASE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN WEAPONTYPE_UNARMED
|
|
ENDFUNC
|
|
|
|
// remove trevor MG
|
|
PROC REMOVE_TREVOR_MG()
|
|
PRINTSTRING("REMOVE MG") PRINTNL()
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
WEAPON_TYPE MGWeapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)
|
|
|
|
SET_PED_INFINITE_AMMO(trevorPed, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
SET_PED_INFINITE_AMMO_CLIP(trevorPed, FALSE)
|
|
ENDIF
|
|
|
|
printstring("here1") PRINTNL()
|
|
IF HAS_PED_GOT_WEAPON(trevorPed, MGWeapon)
|
|
SET_PED_INFINITE_AMMO(trevorPed, FALSE, MGWeapon)
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
printstring("here2") PRINTNL()
|
|
IF bCheckedInitialMG
|
|
printstring("here3") PRINTNL()
|
|
IF iInitialMGAmmo >= 0
|
|
printstring("here4") PRINTNL()
|
|
SET_CURRENT_PED_WEAPON(trevorPed, WEAPONTYPE_UNARMED, TRUE)
|
|
SET_PED_AMMO(trevorPed, MGWeapon, iInitialMGAmmo)
|
|
ELSE
|
|
printstring("here5") PRINTNL()
|
|
SET_CURRENT_PED_WEAPON(trevorPed, WEAPONTYPE_UNARMED, TRUE)
|
|
REMOVE_WEAPON_FROM_PED(trevorPed, MGWeapon)
|
|
ENDIF
|
|
ELSE
|
|
printstring("here6") PRINTNL()
|
|
SET_CURRENT_PED_WEAPON(trevorPed, WEAPONTYPE_UNARMED, TRUE)
|
|
REMOVE_WEAPON_FROM_PED(trevorPed, MGWeapon)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
SET_CURRENT_PED_WEAPON(trevorPed, WEAPONTYPE_UNARMED, TRUE)
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(trevorPed, FALSE)
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(trevorPed, WEAPONTYPE_MG)
|
|
IF iInitialMGAmmo >= 0
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
SET_PED_AMMO(trevorPed, WEAPONTYPE_MG, iInitialMGAmmo)
|
|
ENDIF
|
|
ENDIF
|
|
SET_PED_INFINITE_AMMO(trevorPed, FALSE, WEAPONTYPE_MG)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
STORE_PLAYER_PED_WEAPONS(trevorPed)
|
|
ENDPROC
|
|
|
|
// suppress vehicles
|
|
PROC SUPPRESS_MISSION_VEHICLES(BOOL bSuppress, BOOL bDoCountryVehicles = FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BIKE), bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL_CAR), bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BEACH_CAR), bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BEACH_TRUCK), bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_CAR), bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_TRUCK), bSuppress)
|
|
SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), bSuppress)
|
|
SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ENGINEER), bSuppress)
|
|
|
|
IF bDoCountryVehicles
|
|
OR NOT bSuppress
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(PRANGER, bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(SCORCHER, bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(BLAZER, bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(CUBAN800, bSuppress)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(LAZER, bSuppress)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set player out of any vehicle
|
|
PROC SET_PLAYER_OUT_OF_ANY_VEHICLE()
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VECTOR vCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<vCoords.x, vCoords.y, vCoords.z + 1>>)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// disable/reenable cargens
|
|
PROC ENABLE_CARGENS_FOR_MISSION(BOOL bEnable)
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-1643, 4346, -10>>, <<-1570, 4432, 100>>, bEnable)
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-42, 6240, -10>>, <<118, 6365, 100>>, bEnable)
|
|
ENDPROC
|
|
|
|
// switch off roads for mission
|
|
PROC SET_MISSION_ROADS_OFF(BOOL bSwitchOff)
|
|
INT i
|
|
VECTOR vMin
|
|
VECTOR vMax
|
|
|
|
REPEAT 2 i
|
|
SWITCH i
|
|
CASE 0
|
|
vMin = <<2777.7, 4396.9, 30.0>>
|
|
vMax = <<2799.2, 4427.3, 80.0>>
|
|
BREAK
|
|
CASE 1
|
|
vMin = <<2914.04346, 4436.28662, 0.21060>>
|
|
vMax = <<2991.63892, 4757.14990, 100.69784>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bSwitchOff
|
|
SET_ROADS_IN_AREA(vMin, vMax, FALSE)
|
|
ELSE
|
|
SET_ROADS_BACK_TO_ORIGINAL(vMin, vMax)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
FUNC STRING GET_TRAIN_CRASH_AUDIO_SCENE_AS_STRING(TRAIN_CRASH_AUDIO_SCENE_ENUM thisScene)
|
|
SWITCH thisScene
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_BIKE_START
|
|
RETURN "EXILE_3_TREVOR_BIKE_START"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN
|
|
RETURN "EXILE_3_TREVOR_BIKE_SEE_TRAIN"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP
|
|
RETURN "EXILE_3_TREVOR_BIKE_JUMP"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE
|
|
RETURN "EXILE_3_TREVOR_GET_TO_ENGINE"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_HIJACK_TRAIN
|
|
RETURN "EXILE_3_HIJACK_TRAIN"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_RIDE_TRAIN
|
|
RETURN "EXILE_3_TREVOR_TRAIN_RIDE"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL
|
|
RETURN "EXILE_3_TRAIN_ACCEL_CONTROL_SCENE"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL
|
|
RETURN "EXILE_3_TRAIN_DECEL_CONTROL_SCENE"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_GET_TO_BRIDGE
|
|
RETURN "EXILE_3_MICHAEL_GET_TO_BRIDGE"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_COLLISION
|
|
RETURN "EXILE_3_TRAIN_COLLISION"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_RAYFIRE
|
|
RETURN "EXILE_3_RAYFIRE"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_PLANT_BOMB
|
|
RETURN "EXILE_3_PLANT_BOMB"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL
|
|
RETURN "EXILE_3_DEFEND_MICHAEL"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR
|
|
RETURN "EXILE_3_RAPIDS_CHASE_TREVOR"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL
|
|
RETURN "EXILE_3_RAPIDS_CHASE_MICHAEL"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_GET_TO_BEACH
|
|
RETURN "EXILE_3_GET_TO_BEACH"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_HELI_1
|
|
RETURN "EXILE_3_HELI_ARRIVES_01"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_HELI_2
|
|
RETURN "EXILE_3_HELI_ARRIVES_02"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_HELI_3
|
|
RETURN "EXILE_3_HELI_ARRIVES_03"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_HELI_4
|
|
RETURN "EXILE_3_HELI_ARRIVES_04"
|
|
BREAK
|
|
CASE TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL
|
|
RETURN "EXILE_3_TRAIN_FALL"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN ""
|
|
ENDFUNC
|
|
|
|
// start train crash audio scene
|
|
FUNC BOOL START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_ENUM thisScene)
|
|
RETURN START_AUDIO_SCENE(GET_TRAIN_CRASH_AUDIO_SCENE_AS_STRING(thisScene))
|
|
ENDFUNC
|
|
|
|
// stop train crash audio scene
|
|
PROC STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_ENUM thisScene)
|
|
STOP_AUDIO_SCENE(GET_TRAIN_CRASH_AUDIO_SCENE_AS_STRING(thisScene))
|
|
ENDPROC
|
|
|
|
// stop all train crash audio scenes
|
|
PROC STOP_ALL_TRAIN_CRASH_AUDIO_SCENES()
|
|
INT i
|
|
REPEAT COUNT_OF(TRAIN_CRASH_AUDIO_SCENE_ENUM) i
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(INT_TO_ENUM(TRAIN_CRASH_AUDIO_SCENE_ENUM, i))
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
// multiply 2 script quaternions
|
|
/*
|
|
FUNC SCRIPT_QUAT MULTIPLY_SCRIPT_QUATS(SCRIPT_QUAT quat1, SCRIPT_QUAT quat2)
|
|
SCRIPT_QUAT returnQuat
|
|
returnQuat.w = (quat1.w * quat2.w) - (quat1.x * quat2.x) - (quat1.y * quat2.y) - (quat1.z * quat2.z)
|
|
returnQuat.x = (quat1.w * quat2.x) + (quat1.x * quat2.w) + (quat1.y * quat2.z) - (quat1.z * quat2.y)
|
|
returnQuat.y = (quat1.w * quat2.y) + (quat1.y * quat2.w) + (quat1.z * quat2.x) - (quat1.x * quat2.z)
|
|
returnQuat.z = (quat1.w * quat2.z) + (quat1.z * quat2.w) + (quat1.x * quat2.y) - (quat1.y * quat2.x)
|
|
|
|
RETURN returnQuat
|
|
ENDFUNC
|
|
|
|
// convert vector to quaternion
|
|
FUNC SCRIPT_QUAT CONVERT_ROTATION_TO_SCRIPT_QUAT(VECTOR vRot)
|
|
SCRIPT_QUAT xQuat, yQuat, zQuat
|
|
|
|
xQuat.w = COS(vRot.x/2)
|
|
xQuat.x = SIN(vRot.x/2)
|
|
xQuat.y = 0
|
|
xQuat.z = 0
|
|
|
|
yQuat.w = COS(vRot.y/2)
|
|
yQuat.x = 0
|
|
yQuat.y = SIN(vRot.y/2)
|
|
yQuat.z = 0
|
|
|
|
zQuat.w = COS(vRot.z/2)
|
|
zQuat.x = 0
|
|
xQuat.y = 0
|
|
zQuat.z = SIN(vRot.z/2)
|
|
|
|
RETURN MULTIPLY_SCRIPT_QUATS(MULTIPLY_SCRIPT_QUATS(xQuat, yQuat), zQuat)
|
|
ENDFUNC
|
|
*/
|
|
|
|
// make bike easy to land
|
|
PROC MAKE_BIKE_EASY_TO_LAND()
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_BIKE], FALSE, FALSE, FALSE, TRUE, FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// block the gps for jumps
|
|
PROC BLOCK_GPS_FOR_JUMPS()
|
|
SET_GPS_DISABLED_ZONE(<<2470.08276, 4942.88281, -43.04004>>, <<2561.70410, 5594.36475, 120.12917>>)
|
|
ENDPROC
|
|
|
|
// detach player from train
|
|
PROC DETACH_PLAYER_FROM_TRAIN()
|
|
IF (IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(PLAYER_PED_ID()) OR IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene))
|
|
AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
AND NOT GET_IS_PED_GADGET_EQUIPPED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
|
|
AND GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = NULL
|
|
// detach and set down player, hopefully somewhere he won't get whacked by a speeding train
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
VECTOR vDetachOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, <<2.3, 0, 1.0>>)
|
|
DETACH_ENTITY(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS_NO_OFFSET(PLAYER_PED_ID(), vDetachOffset)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// remove blips
|
|
PROC REMOVE_ALL_BLIPS()
|
|
INT i
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_BLIP(gotoBlip)
|
|
ENDIF
|
|
IF DOES_BLIP_EXIST(trainBlip)
|
|
REMOVE_BLIP(trainBlip)
|
|
ENDIF
|
|
IF DOES_BLIP_EXIST(buddyBlip)
|
|
REMOVE_BLIP(buddyBlip)
|
|
ENDIF
|
|
IF DOES_BLIP_EXIST(containerBlip)
|
|
REMOVE_BLIP(containerBlip)
|
|
ENDIF
|
|
IF DOES_BLIP_EXIST(vehicleBlip)
|
|
REMOVE_BLIP(vehicleBlip)
|
|
ENDIF
|
|
REPEAT 2 i
|
|
IF DOES_BLIP_EXIST(carBlip[i])
|
|
REMOVE_BLIP(carBlip[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
|
|
CLEANUP_AI_PED_BLIP(enemyPed[i].blipStruct)
|
|
ENDREPEAT
|
|
/*
|
|
REPEAT COUNT_OF(ENEMY_VEHICLE_ENUM) i
|
|
IF DOES_BLIP_EXIST(enemyVehicle[i].blip)
|
|
REMOVE_BLIP(enemyVehicle[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
|
|
IF DOES_BLIP_EXIST(enemyPed[i].blip)
|
|
REMOVE_BLIP(enemyPed[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
*/
|
|
ENDPROC
|
|
|
|
// delete train stuff
|
|
PROC DELETE_TRAIN_CRASH_TRAINS(BOOL bHardDelete = TRUE)
|
|
// get rid of engineer
|
|
IF DOES_ENTITY_EXIST(engineerPed[0])
|
|
DELETE_PED(engineerPed[0])
|
|
ENDIF
|
|
|
|
// get rid of all trains
|
|
//DELETE_ALL_TRAINS()
|
|
//DELETE_MISSION_TRAINS()
|
|
IF bHardDelete
|
|
IF DOES_ENTITY_EXIST(missionTrain)
|
|
DELETE_MISSION_TRAIN(missionTrain)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(crashTrain)
|
|
DELETE_MISSION_TRAIN(crashTrain)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(missionTrain)
|
|
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(missionTrain)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(crashTrain)
|
|
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(crashTrain)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// common player and cam cleanup stuff
|
|
PROC DO_COMMON_PLAYER_AND_CAM_CLEANUP()
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
SET_PLAYER_INVINCIBLE(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
DISABLE_CELLPHONE(FALSE)
|
|
RESET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct)
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
ENDPROC
|
|
|
|
// cleanup the mission
|
|
PROC MISSION_CLEANUP()
|
|
INT i
|
|
|
|
BLOCK_MISSION_TITLE(FALSE)
|
|
TRIGGER_MUSIC_EVENT("EXL3_MISSION_FAIL")
|
|
STOP_ALL_TRAIN_CRASH_AUDIO_SCENES()
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
|
|
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
|
|
SET_WIND(-1.0)
|
|
SET_WIND_DIRECTION(-1.0)
|
|
|
|
SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>)
|
|
|
|
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
|
|
|
|
REMOVE_MISSION_TEXT()
|
|
|
|
CASCADE_SHADOWS_INIT_SESSION()
|
|
|
|
WATER_OVERRIDE_SET_STRENGTH(0.0)
|
|
|
|
ALLOW_DIALOGUE_IN_WATER(FALSE)
|
|
|
|
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(wadePTFX)
|
|
STOP_PARTICLE_FX_LOOPED(wadePTFX)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX1)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX1)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX2)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX2)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX3)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX3)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisSplashPTFX)
|
|
STOP_PARTICLE_FX_LOOPED(debrisSplashPTFX)
|
|
ENDIF
|
|
|
|
SET_SEETHROUGH(FALSE)
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH, BUILDINGSTATE_NORMAL)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH_2, BUILDINGSTATE_NORMAL)
|
|
//REQUEST_IPL("canyonriver01")
|
|
//REMOVE_IPL("canyonriver01_traincrash")
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_AUTO_GIVE_SCUBA_GEAR_WHEN_EXIT_VEHICLE(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_WATER_VEHICLE_SCUBA_GEAR_UNLOCKED, TRUE)
|
|
|
|
//IF bPreStreamingSeamlessCutscene
|
|
// REMOVE_CUTSCENE()
|
|
//ENDIF
|
|
REMOVE_COVER_POINT(islandCover)
|
|
|
|
IF STREAMVOL_IS_VALID(bridgeVolume)
|
|
STREAMVOL_DELETE(bridgeVolume)
|
|
ENDIF
|
|
|
|
//ALLOW_DIALOGUE_IN_WATER(FALSE)
|
|
|
|
IF gotoFoamState = GOTO_FOAM_STATE_WAITING
|
|
OR swapCarriageState = SWAP_CARRIAGE_STATE_WAITING
|
|
OR bStartedIPLSwap
|
|
IPL_GROUP_SWAP_CANCEL()
|
|
ENDIF
|
|
|
|
SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE)
|
|
|
|
// detach ped if he is attached to anything
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
RESET_PED_WEAPON_MOVEMENT_CLIPSET(PLAYER_PED_ID())
|
|
RESET_PED_MOVEMENT_CLIPSET(PLAYER_PED_ID())
|
|
SET_PED_INFINITE_AMMO_CLIP(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_GetOutUndriveableVehicle, TRUE)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), FALSE)
|
|
|
|
IF currentMissionStage = STAGE_DRIVE_ALONG_TRAIN
|
|
OR (currentMissionStage = STAGE_GET_TO_BRIDGE AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR)
|
|
DETACH_PLAYER_FROM_TRAIN()
|
|
ELSE
|
|
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
|
|
IF NOT GET_IS_PED_GADGET_EQUIPPED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
|
|
IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = NULL
|
|
// CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
DETACH_ENTITY(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//SET_PLAYER_WEAPON_DEFENSE_MODIFIER(PLAYER_ID(), 1.0)
|
|
|
|
//IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
// SET_PED_HELMET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
//ENDIF
|
|
|
|
DO_COMMON_PLAYER_AND_CAM_CLEANUP()
|
|
|
|
// kill anim cam
|
|
IF DOES_CAM_EXIST(animCam)
|
|
DESTROY_CAM(animCam)
|
|
ENDIF
|
|
|
|
// fix ptfx
|
|
REPEAT NUMBER_CRASH_FIRES i
|
|
IF bFirePTFXActive[i]
|
|
STOP_PARTICLE_FX_LOOPED(firePTFX[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
CLEAR_PARTICLE_FX_SHOOTOUT_BOAT()
|
|
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_VEHICLE_STRONG(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF NOT bSuppressRemoveTrevorMG
|
|
REMOVE_TREVOR_MG()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE))
|
|
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE))
|
|
ENDIF
|
|
|
|
//IF DOES_ENTITY_EXIST(dummyBoatPed)
|
|
// DELETE_PED(dummyBoatPed)
|
|
//ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(caseObject)
|
|
IF IS_ENTITY_ATTACHED(caseObject)
|
|
DETACH_ENTITY(caseObject)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_MICHAEL_CAR])
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_MICHAEL_CAR], TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
SET_VEHICLE_HAS_STRONG_AXLES(trainCrashVehicle[TCV_BIKE], FALSE)
|
|
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[TCV_BIKE], TRUE)
|
|
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_BIKE], FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
IF IS_ENTITY_ATTACHED(trainCrashVehicle[TCV_BIKE])
|
|
DETACH_ENTITY(trainCrashVehicle[TCV_BIKE])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_DEFAULT)
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_DIES_IN_WATER(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_PROOFS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
IF bThoroughCleanup
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(engineerPed[0])
|
|
DELETE_PED(engineerPed[0])
|
|
ENDIF
|
|
|
|
// TEMP - REMOVE ALL CALLS TO THIS WHEN KENNETH HAS FIXED 210001
|
|
//SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
|
|
|
|
//REPEAT NUMBER_RAPPEL_ENEMIES i
|
|
// CLEANUP_RAPPEL(enemyRappelData[i].rappelData)
|
|
//ENDREPEAT
|
|
|
|
// reset trains
|
|
SET_RANDOM_BOATS(TRUE)
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
|
|
SET_IGNORE_NO_GPS_FLAG(FALSE)
|
|
|
|
SUPPRESS_MISSION_VEHICLES(FALSE)
|
|
ENABLE_CARGENS_FOR_MISSION(TRUE)
|
|
SET_MISSION_ROADS_OFF(FALSE)
|
|
REMOVE_SCENARIO_BLOCKING_AREA(rapidsScenarioBlocking)
|
|
//REMOVE_SCENARIO_BLOCKING_AREA(beachScenarioBlocking)
|
|
REMOVE_SCENARIO_BLOCKING_AREA(roadScenarioBlocking)
|
|
REMOVE_SCENARIO_BLOCKING_AREA(road2ScenarioBlocking)
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
|
|
STOP_STREAM()
|
|
|
|
//IF mocapStreamingStage >= MOCAP_STREAMING_STAGE_WAIT
|
|
REMOVE_CUTSCENE()
|
|
//ENDIF
|
|
|
|
// delete trains
|
|
BOOL bHardDeleteTrains
|
|
IF NOT bThoroughCleanup
|
|
bHardDeleteTrains = FALSE
|
|
ELSE
|
|
bHardDeleteTrains = TRUE
|
|
ENDIF
|
|
DELETE_TRAIN_CRASH_TRAINS(bHardDeleteTrains)
|
|
//SET_MISSION_TRAINS_AS_NO_LONGER_NEEDED()
|
|
|
|
bHasContainerSwitchCamExplosionHappened = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF DOES_TEXT_WIDGET_EXIST(RBCamPosWidget)
|
|
DELETE_TEXT_WIDGET(RBCamPosWidget)
|
|
ENDIF
|
|
IF DOES_TEXT_WIDGET_EXIST(RBCamRotWidget)
|
|
DELETE_TEXT_WIDGET(RBCamRotWidget)
|
|
ENDIF
|
|
IF DOES_WIDGET_GROUP_EXIST(trainCrashWidgets)
|
|
DELETE_WIDGET_GROUP(trainCrashWidgets)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
// mission passed
|
|
PROC MISSION_PASSED()
|
|
Mission_Flow_Mission_Passed()
|
|
|
|
MISSION_CLEANUP()
|
|
ENDPROC
|
|
|
|
// mission failed
|
|
PROC MISSION_FAILED(FAIL_REASON_ENUM reasonForFail)
|
|
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_ENTITY_DEAD(trainCrashVehicle[TCV_DINGHY])
|
|
OR NOT IS_ENTITY_DEAD(trainCrashVehicle[TCV_DINGHY])
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_ADVANCE_MISSION()
|
|
REMOVE_ALL_BLIPS()
|
|
SET_TIME_SCALE(1.0)
|
|
REMOVE_MISSION_TEXT(TRUE, TRUE, TRUE, TRUE)
|
|
TRIGGER_MUSIC_EVENT("EXL3_MISSION_FAIL")
|
|
missionFailState = MISSION_FAIL_STATE_WAIT_FOR_FADE
|
|
savedFailReason = reasonForFail
|
|
|
|
STRING failText
|
|
SWITCH savedFailReason
|
|
CASE FAIL_MICHAEL_DEAD
|
|
failText = "CMN_MDIED"
|
|
BREAK
|
|
CASE FAIL_TREVOR_DEAD
|
|
failText = "CMN_TDIED"
|
|
BREAK
|
|
CASE FAIL_MISSED_JUMPS
|
|
failText = "TC_FAIL4"
|
|
BREAK
|
|
CASE FAIL_TRAIN_STOPPED
|
|
failText = "TC_FAIL5"
|
|
BREAK
|
|
CASE FAIL_TRAIN_DEAD
|
|
failText = "TC_FAIL6"
|
|
BREAK
|
|
CASE FAIL_LOST_TRAIN
|
|
failText = "TC_FAIL7"
|
|
BREAK
|
|
CASE FAIL_FELL_OFF_TRAIN
|
|
failText = "TC_FAIL3"
|
|
BREAK
|
|
CASE FAIL_CAR_DEAD
|
|
failText = "CMN_MDEST"
|
|
BREAK
|
|
CASE FAIL_BIKE_DEAD
|
|
failText = "TC_FAIL8"
|
|
BREAK
|
|
CASE FAIL_BOAT_DEAD
|
|
failText = "TC_FAIL9"
|
|
BREAK
|
|
CASE FAIL_BOAT_GROUNDED
|
|
failText = "TC_FAIL10"
|
|
BREAK
|
|
CASE FAIL_CONTAINER_INACCESSIBLE
|
|
failText = "TC_FAIL2"
|
|
BREAK
|
|
CASE FAIL_NO_STICKY_BOMBS
|
|
failText = "TC_FAIL1"
|
|
BREAK
|
|
CASE FAIL_ABANDONED_MICHAEL
|
|
failText = "TC_FAIL13"
|
|
BREAK
|
|
CASE FAIL_ABANDONED_TREVOR
|
|
failText = "TC_FAIL11"
|
|
BREAK
|
|
CASE FAIL_ABANDONED_CONTAINER
|
|
failText = "TC_FAIL14"
|
|
BREAK
|
|
CASE FAIL_ABANDONED_GETAWAY_VEHICLES
|
|
failText = "TC_FAIL15"
|
|
BREAK
|
|
CASE FAIL_ABANDONED_BIKE
|
|
failText = "TC_FAIL16"
|
|
BREAK
|
|
CASE FAIL_ABANDONED_DINGHY
|
|
failText = "TC_FAIL17"
|
|
BREAK
|
|
CASE FAIL_ABANDONED_ESCAPE_ROUTE
|
|
failText = "TC_FAIL18"
|
|
BREAK
|
|
CASE FAIL_BEACH_CAR_DEAD
|
|
failText = "TC_FAIL12"
|
|
BREAK
|
|
CASE FAIL_TOO_LATE_BRIDGE
|
|
failText = "TC_FAIL19"
|
|
BREAK
|
|
CASE FAIL_BIKE_STUCK
|
|
failText = "TC_FAIL20"
|
|
BREAK
|
|
CASE FAIL_RON_DEAD
|
|
failText = "TC_FAIL21"
|
|
BREAK
|
|
CASE FAIL_PATRICIA_DEAD
|
|
failText = "TC_FAIL22"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON(failText)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// remove bike blip and text
|
|
PROC REMOVE_BIKE_BLIP_AND_TEXT()
|
|
IF DOES_BLIP_EXIST(vehicleBlip)
|
|
REMOVE_BLIP(vehicleBlip)
|
|
ENDIF
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETBCKBK")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETINBK")
|
|
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// remove dinghy blip and text
|
|
PROC REMOVE_DINGHY_BLIP_AND_TEXT()
|
|
IF DOES_BLIP_EXIST(vehicleBlip)
|
|
REMOVE_BLIP(vehicleBlip)
|
|
ENDIF
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_DINGHY2")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_DINGHY")
|
|
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// get mission vector
|
|
FUNC VECTOR GET_TRAIN_CRASH_VECTOR(TRAIN_CRASH_VECTOR_ENUM tcVec)
|
|
SWITCH tcVec
|
|
CASE TCVEC_PLAYER_INIT
|
|
RETURN <<1981.93579, 3818.08301, 31.31574>>//<<1985.25, 3825.79, 31.34>>
|
|
BREAK
|
|
CASE TCVEC_MICHAEL_INIT
|
|
RETURN <<1982.97742, 3822.15894, 31.45785>>//<<1982.69, 3833.00, 31.43>>
|
|
BREAK
|
|
CASE TCVEC_MICHAEL_AT_CONTAINER
|
|
RETURN <<-490.92, 4434.74, 30.25>>
|
|
BREAK
|
|
CASE TCVEC_MICHAEL_IN_CONTAINER
|
|
RETURN <<-492.81, 4436.04, 30.00>>
|
|
BREAK
|
|
CASE TCVEC_BIKE_INIT
|
|
RETURN <<1984.80, 3826.80, 31.59>>
|
|
BREAK
|
|
CASE TCVEC_BIKE_CHASE
|
|
RETURN <<2980.71, 4623.17, 52.01>>
|
|
BREAK
|
|
CASE TCVEC_MICHAEL_CAR_INIT
|
|
RETURN <<1984.40, 3831.00, 32.10>>
|
|
BREAK
|
|
CASE TCVEC_MICHAEL_AT_BEACH
|
|
RETURN <<-2566.23, 3687.51, 1.27>>
|
|
BREAK
|
|
CASE TCVEC_SECOND_TRAIN_INIT
|
|
RETURN <<-496.65, 4294.85, 87.97>>
|
|
BREAK
|
|
CASE TCVEC_TRAIN_CRASH_INIT
|
|
RETURN <<-533.65, 4563.88, 87.87>>
|
|
BREAK
|
|
CASE TCVEC_BIKE_DRIVE_ALONG_TRAIN
|
|
RETURN <<2340.45142, 5952.72852, 59.92357>>
|
|
BREAK
|
|
CASE TCVEC_PURSUIT_FOLLOW_STAGE
|
|
RETURN <<1211.04370, 6435.66943, 30.60235>>
|
|
BREAK
|
|
CASE TCVEC_TREVOR_BRIDGE
|
|
RETURN <<-522.08, 4463.91, 88.02>>
|
|
BREAK
|
|
CASE TCVEC_TREVOR_WATER
|
|
RETURN <<-482.89, 4396.48, 29.62>>
|
|
BREAK
|
|
CASE TCVEC_TREVOR_IN_WATER_INIT
|
|
RETURN <<-488.70, 4415.90, 29.0>>
|
|
BREAK
|
|
CASE TCVEC_TREVOR_SHOOTOUT_INIT
|
|
RETURN <<-485.32956, 4399.53662, 30.39912>>
|
|
BREAK
|
|
CASE TCVEC_TREVOR_SHOOTOUT_INIT_REPLAY
|
|
RETURN <<-485.2, 4400.3, 30.4>>//<<-485.11133, 4399.73877, 30.66846>>
|
|
BREAK
|
|
CASE TCVEC_TREVOR_AT_BEACH
|
|
RETURN <<-2570.33, 3684.61, 1.32>>
|
|
BREAK
|
|
CASE TCVEC_BRIDGE_TRIGGER
|
|
RETURN <<-502.94, 4426.99, 30.93>>//<<-480.40, 4432.08, 26.72>>
|
|
BREAK
|
|
CASE TCVEC_DINGHY_INIT
|
|
RETURN vDinghyInitLoc//<<530.5, 3922.2, 30.7>>//<<638.6, 3882.0, 30.6>> //<<608.76, 3894.39, 30.73>>
|
|
BREAK
|
|
CASE TCVEC_DINGHY_AT_BRIDGE
|
|
RETURN <<-402.89, 4441.2, 29.40>>
|
|
BREAK
|
|
CASE TCVEC_DINGHY_AT_CONTAINER
|
|
//RETURN <<-488.87, 4432.35, 30.0388>>
|
|
RETURN << -489.47, 4432.35, 30.0388 >>
|
|
BREAK
|
|
CASE TCVEC_DINGHY_AT_CONTAINER_ROTATION
|
|
RETURN <<0, 0, 156.682>>
|
|
BREAK
|
|
CASE TCVEC_DINGHY_AT_RAPIDS
|
|
RETURN <<-492.51, 4402.91, 29.73>>
|
|
BREAK
|
|
CASE TCVEC_DINGHY_AT_BEACH
|
|
RETURN <<-2174.28, 4753.77, -0.23>>
|
|
BREAK
|
|
CASE TCVEC_BEACH_CAR_INIT
|
|
RETURN <<-2522.44, 3657.84, 11.94>>
|
|
BREAK
|
|
CASE TCVEC_SILOS
|
|
RETURN <<2853.61, 4426.40, 47.94>>
|
|
BREAK
|
|
CASE TCVEC_PATH_START
|
|
RETURN <<2703.25, 5245.23, 61.06>>
|
|
BREAK
|
|
CASE TCVEC_RAPPEL_ANCHOR_POS
|
|
RETURN <<-499.27, 4412.00, 85.38>>
|
|
BREAK
|
|
CASE TCVEC_RAPPEL_ANCHOR_ROT
|
|
RETURN <<0,-5,0>>
|
|
BREAK
|
|
CASE TCVEC_CONTAINER_IN_RIVER
|
|
RETURN <<-493.91, 4414.20, 29.73>>
|
|
BREAK
|
|
CASE TCVEC_ACCESS_CONTAINER
|
|
RETURN <<-489.11, 4434.11, 30.32>>
|
|
BREAK
|
|
CASE TCVEC_BLIP_CONTAINER
|
|
RETURN <<-491.36, 4435.06, 30.00>>
|
|
BREAK
|
|
CASE TCVEC_IN_CONTAINER
|
|
RETURN <<-487.96, 4416.91, 29.93>>
|
|
BREAK
|
|
CASE TCVEC_PACKAGE
|
|
RETURN <<-486.43, 4414.22, 30.33>>
|
|
BREAK
|
|
CASE TCVEC_BOAT_ATTACH
|
|
RETURN <<0,-1.5,1.2>>
|
|
BREAK
|
|
CASE TCVEC_RIVER_MOUTH
|
|
RETURN <<-1770.94849, 4546.36279, 0.90>>
|
|
BREAK
|
|
CASE TCVEC_BEACH
|
|
RETURN <<-2464.23315, 4261.13916, 0.96957>>
|
|
BREAK
|
|
CASE TCVEC_BEACH_VEHICLES
|
|
RETURN <<-2431.49976, 4255.95166, 5.46902>>
|
|
BREAK
|
|
CASE TCVEC_RON_HOUSE
|
|
RETURN <<1679.28, 3726.58, 32.94>>
|
|
BREAK
|
|
CASE TCVEC_CLIMB_DOWN_START
|
|
RETURN <<-515.01, 4441.82, 88.99>>
|
|
BREAK
|
|
CASE TCVEC_ATTACH_BIKE_OFFSET
|
|
RETURN <<1.92, 3.27, -0.79>>
|
|
BREAK
|
|
CASE TCVEC_TRAIN_SWAY_INIT
|
|
RETURN <<-86.99, 0.0, -92.21>>
|
|
BREAK
|
|
CASE TCVEC_TRAIN_CAM_ATTACH
|
|
RETURN <<2.4, 0.0, 2.0>>
|
|
BREAK
|
|
CASE TCVEC_TRAIN_CAM_POINT
|
|
RETURN <<1.0,12.0,0.0>>
|
|
BREAK
|
|
CASE TCVEC_CRASH
|
|
RETURN <<-498.81, 4429.76, 30.9>>
|
|
BREAK
|
|
CASE TCVEC_GUNS_CHOPPER_HOVER
|
|
RETURN <<-513.18, 4406.67, 34.53>>//<<-472.80, 4435.28, 32.45>>
|
|
BREAK
|
|
CASE TCVEC_DROPOFF_CHOPPER_HOVER
|
|
RETURN <<-485.96, 4445.42, 40.72>>//<<-472.80, 4435.28, 32.45>>
|
|
BREAK
|
|
CASE TCVEC_MOVE_LAST_PLAYER_VEHICLE
|
|
RETURN <<1977.52, 3827.25, 31.34350>>
|
|
BREAK
|
|
CASE TCVEC_CONTAINER_ANIM_POS
|
|
RETURN <<-489.69, 4435.79, 30.59>>
|
|
BREAK
|
|
CASE TCVEC_CONTAINER_ANIM_ROT
|
|
RETURN <<0,0,64.2>>
|
|
BREAK
|
|
CASE TCVEC_TAKE_COVER
|
|
RETURN <<-485.27374, 4399.02393, 30.65386>>
|
|
BREAK
|
|
CASE TCVEC_INIT_BIKE_CAM_OFFSET
|
|
RETURN <<0.5, 3.0, 0>>
|
|
BREAK
|
|
CASE TCVEC_END_BIKE_CAM_OFFSET
|
|
RETURN <<0.5, 2.2, 0>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
// is boat at beach
|
|
FUNC BOOL IS_BOAT_AT_BEACH(BOOL bIncrement)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(trainCrashVehicle[TCV_DINGHY], <<-2406.739, 4235.841, -10.000>>, <<-2474.212, 4272.588, 15.000>>, 180.0)
|
|
RETURN TRUE
|
|
ELIF IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH), <<300,300,300>>, FALSE, FALSE) AND NOT IS_ENTITY_IN_WATER(trainCrashVehicle[TCV_DINGHY])
|
|
IF bIncrement
|
|
fForceBeachTime = fForceBeachTime +@ 1.0
|
|
ENDIF
|
|
IF fForceBeachTime >= 4.0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// headsets
|
|
PROC SET_PLAYER_PED_WITH_HEADSET(enumCharacterList headSetCharacter, BOOL bHasHeadset)
|
|
PED_INDEX headsetPed
|
|
PED_COMP_NAME_ENUM componentEnum
|
|
SWITCH headSetCharacter
|
|
CASE CHAR_MICHAEL
|
|
componentEnum = PROPS_P0_HEADSET
|
|
BREAK
|
|
CASE CHAR_FRANKLIN
|
|
componentEnum = PROPS_P1_HEADSET
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
componentEnum = PROPS_P2_HEADSET
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = headSetCharacter
|
|
headsetPed = PLAYER_PED_ID()
|
|
ELSE
|
|
headsetPed = sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(headSetCharacter)]
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(headsetPed)
|
|
IF bHasHeadset
|
|
SET_PED_COMP_ITEM_CURRENT_SP(headsetPed, COMP_TYPE_PROPS, componentEnum)
|
|
ELSE
|
|
REMOVE_PED_COMP_ITEM_SP(headsetPed, COMP_TYPE_PROPS, componentEnum)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// check all peds and vehicles for fail
|
|
PROC HANDLE_MISSION_FAIL_CHECKS()
|
|
INT i
|
|
|
|
IF NOT bRunningCutscene
|
|
// character peds
|
|
REPEAT COUNT_OF(sSelectorPeds.pedID) i
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i])
|
|
IF IS_PED_INJURED(sSelectorPeds.pedID[i])
|
|
enumCharacterList injuredChar = INT_TO_ENUM(enumCharacterList, i)
|
|
IF injuredChar <> GET_CURRENT_PLAYER_PED_ENUM()
|
|
IF DOES_BLIP_EXIST(buddyBlip)
|
|
REMOVE_BLIP(buddyBlip)
|
|
ENDIF
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_GETTREV")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_GETMIKE")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_SWCHM")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_SWCHT")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_WAITT")
|
|
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
SWITCH injuredChar
|
|
CASE CHAR_MICHAEL
|
|
// michael
|
|
IF currentMissionStage >= STAGE_GET_TO_BRIDGE
|
|
OR currentMissionStage <= STAGE_CHASE_TRAIN
|
|
MISSION_FAILED(FAIL_MICHAEL_DEAD)
|
|
ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
// trevor
|
|
MISSION_FAILED(FAIL_TREVOR_DEAD)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// vehicles
|
|
REPEAT COUNT_OF(trainCrashVehicle) i
|
|
TRAIN_CRASH_VEHICLE_ENUM vEnum = INT_TO_ENUM(TRAIN_CRASH_VEHICLE_ENUM, i)
|
|
IF NOT IS_VEHICLE_DRIVEABLE(trainCrashVehicle[i])
|
|
SWITCH vEnum
|
|
CASE TCV_BIKE
|
|
// bike
|
|
IF currentMissionStage <= STAGE_DRIVE_ALONG_TRAIN
|
|
REMOVE_BIKE_BLIP_AND_TEXT()
|
|
MISSION_FAILED(FAIL_BIKE_DEAD)
|
|
ENDIF
|
|
BREAK
|
|
CASE TCV_MICHAEL_CAR
|
|
IF DOES_ENTITY_EXIST(trainCrashVehicle[i])
|
|
IF currentMissionStage = STAGE_INTERCEPT_TRAIN
|
|
MISSION_FAILED(FAIL_CAR_DEAD)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE TCV_DINGHY
|
|
// boat
|
|
IF currentMissionStage >= STAGE_GET_TO_BRIDGE
|
|
IF currentMissionStage < STAGE_GET_HOME
|
|
OR NOT bDoneLeaveBoatWithCase
|
|
REMOVE_DINGHY_BLIP_AND_TEXT()
|
|
IF NOT HAS_PLAYER_LEFT_THE_WORLD(PLAYER_ID())
|
|
PED_INDEX trevorPed
|
|
trevorPed = GET_TREVOR_PED()
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
IF IS_ENTITY_ATTACHED(trevorPed)
|
|
IF boatRPGState >= BOAT_RPG_GET_IN_POSITION AND boatRPGState <= BOAT_RPG_RETURN_TO_SEAT
|
|
DETACH_ENTITY(trevorPed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
MISSION_FAILED(FAIL_BOAT_DEAD)
|
|
ELSE
|
|
MISSION_FAILED(FAIL_ABANDONED_ESCAPE_ROUTE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE TCV_BEACH_CAR
|
|
CASE TCV_BEACH_TRUCK
|
|
// car
|
|
IF beachCreationStage = BEACH_CREATION_DONE
|
|
AND currentMissionStage >= STAGE_RAPIDS_CHASE
|
|
IF NOT bMichaelDroveOff
|
|
IF vEnum = TCV_BEACH_CAR
|
|
IF DOES_BLIP_EXIST(carblip[0])
|
|
REMOVE_BLIP(carblip[0])
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(carblip[1])
|
|
REMOVE_BLIP(carblip[1])
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_CAR")
|
|
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
MISSION_FAILED(FAIL_BEACH_CAR_DEAD)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
// stuck checks
|
|
SWITCH vEnum
|
|
CASE TCV_BIKE
|
|
// bike
|
|
IF currentMissionStage <= STAGE_CHASE_TRAIN
|
|
OR currentMissionStage = STAGE_GET_TO_BRIDGE
|
|
IF IS_VEHICLE_STUCK_TIMER_UP(trainCrashVehicle[i], VEH_STUCK_JAMMED, JAMMED_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(trainCrashVehicle[i], VEH_STUCK_HUNG_UP, HUNG_UP_TIME)
|
|
REMOVE_BIKE_BLIP_AND_TEXT()
|
|
MISSION_FAILED(FAIL_BIKE_STUCK)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE TCV_DINGHY
|
|
// boat
|
|
IF currentMissionStage = STAGE_GO_TO_CONTAINER
|
|
OR currentMissionStage = STAGE_RAPIDS_CHASE
|
|
OR (currentMissionStage = STAGE_GET_HOME AND NOT (IS_BOAT_AT_BEACH(FALSE) OR bDoneLeaveBoatWithCase OR bGotToBeach))
|
|
OR (currentMissionStage = STAGE_GET_TO_BRIDGE AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
|
|
OR (currentMissionStage = STAGE_STEAL_FROM_CONTAINER AND bReadyToEscape)
|
|
IF IS_VEHICLE_STUCK_TIMER_UP(trainCrashVehicle[i], VEH_STUCK_JAMMED, JAMMED_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(trainCrashVehicle[i], VEH_STUCK_HUNG_UP, BEACHED_TIME)
|
|
REMOVE_DINGHY_BLIP_AND_TEXT()
|
|
MISSION_FAILED(FAIL_BOAT_GROUNDED)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// abandon checks
|
|
SWITCH vEnum
|
|
CASE TCV_BIKE
|
|
IF currentMissionStage <= STAGE_CHASE_TRAIN
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), trainCrashVehicle[i], FALSE) > STUCK_FAIL_RANGE_m
|
|
MISSION_FAILED(FAIL_ABANDONED_BIKE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TCV_DINGHY
|
|
IF (currentMissionStage = STAGE_GET_TO_BRIDGE AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
|
|
OR (currentMissionStage = STAGE_GO_TO_CONTAINER AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
|
|
OR currentMissionStage = STAGE_RAPIDS_CHASE
|
|
OR (currentMissionStage = STAGE_STEAL_FROM_CONTAINER AND bReadyToEscape)
|
|
OR (currentMissionStage = STAGE_GET_HOME AND NOT (IS_BOAT_AT_BEACH(FALSE) OR bDoneLeaveBoatWithCase OR bGotToBeach))
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), trainCrashVehicle[i], FALSE) > STUCK_FAIL_RANGE_m
|
|
MISSION_FAILED(FAIL_ABANDONED_DINGHY)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF currentMissionStage < STAGE_GET_TO_BRIDGE
|
|
OR (currentMissionStage = STAGE_GET_TO_BRIDGE AND NOT bDoneJumpOff)
|
|
// trains
|
|
IF DOES_ENTITY_EXIST(missionTrain)
|
|
IF NOT IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
MISSION_FAILED(FAIL_TRAIN_DEAD)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// handle the mission fail state
|
|
PROC HANDLE_MISSION_FAIL_STATE()
|
|
HANDLE_MISSION_FAIL_CHECKS()
|
|
|
|
SWITCH missionFailState
|
|
CASE MISSION_FAIL_STATE_NOT_FAILED
|
|
BREAK
|
|
CASE MISSION_FAIL_STATE_WAIT_FOR_FADE
|
|
// special fail speech
|
|
IF NOT bDoneFailSpeech
|
|
SWITCH savedFailReason
|
|
CASE FAIL_MISSED_JUMPS
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
VEHICLE_INDEX lastCarriage
|
|
lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
|
|
IF IS_VEHICLE_DRIVEABLE(lastCarriage)
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<140,140,140>>, FALSE, FALSE)
|
|
IF (IS_ENTITY_ON_SCREEN(lastCarriage) AND NOT IS_ENTITY_OCCLUDED(lastCarriage))
|
|
OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<30,30,30>>)
|
|
bDoneFailSpeech = DO_MISSION_SPEECH("EXL3_NOJUMPS", FALSE, 0, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE FAIL_TOO_LATE_BRIDGE
|
|
IF trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
|
|
bDoneFailSpeech = DO_MISSION_SPEECH("EXL3_MISSEDW", FALSE, 0, FALSE, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
|
|
|
// safe to cleanup
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
// get rid of hanging carriage
|
|
IF DOES_ENTITY_EXIST(hangingCarriageVehicle)
|
|
DELETE_VEHICLE(hangingCarriageVehicle)
|
|
ENDIF
|
|
|
|
SET_PLAYER_PED_WITH_HEADSET(GET_CURRENT_PLAYER_PED_ENUM(), FALSE)
|
|
|
|
// check if we need to respawn the player in a different position,
|
|
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-129.66879, 6216.20801, 30.20451>>, 28.3)
|
|
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-130.09, 6220.78, 30.62437>>, 45.9)
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
CASE STAGE_GET_HOME
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
BOOL bCreateAtRoad
|
|
bCreateAtRoad = TRUE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
OR (boatRPGState >= BOAT_RPG_GET_IN_POSITION AND boatRPGState <= BOAT_RPG_RETURN_TO_SEAT)
|
|
PED_INDEX driverPed
|
|
driverPed = GET_PED_IN_VEHICLE_SEAT(trainCrashVehicle[TCV_DINGHY])
|
|
IF DOES_ENTITY_EXIST(driverPed)
|
|
DELETE_PED(driverPed)
|
|
ENDIF
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
DETACH_ENTITY(PLAYER_PED_ID())
|
|
ENDIF
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
bCreateAtRoad = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCreateAtRoad
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-2236.63208, 4322.58154, 47.55075>>, -78.1)
|
|
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-2231.14, 4321.16, 47.99>>, -20.8)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, bHasChanged)
|
|
bThoroughCleanup = TRUE
|
|
MISSION_CLEANUP() // must only take 1 frame and terminate the thread
|
|
ELSE
|
|
//Maintain anything that could look weird during fade out (e.g. enemies walking off).
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
|
|
// do train speed
|
|
PROC HANDLE_TRAIN_SPEED()
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bDebugOverrideSpeed
|
|
#ENDIF
|
|
IF currentMissionStage <= STAGE_GET_TO_BRIDGE
|
|
IF cutsceneStage <> TC_CUT_STAGE_RUNNING
|
|
OR bStopTrain
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
VECTOR vFrontCarriagePos = GET_ENTITY_COORDS(missionTrain)
|
|
VECTOR vRearCarriagePos = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE))
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR vPlayerOffsetFromRearCarriage = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE), vPlayerPos)
|
|
FLOAT fDistanceToFront
|
|
FLOAT fDistanceToRear
|
|
|
|
FLOAT fTrainTargetSpeed
|
|
|
|
// check is past silos
|
|
IF NOT bTrainIsPastSilos
|
|
IF vRearCarriagePos.y >= 4550.00
|
|
bTrainIsPastSilos = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// if following the train, tweak speed so rubberbands catchup
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
CASE STAGE_CHASE_TRAIN
|
|
IF NOT bRunningCutscene
|
|
fDistanceToFront = GET_DISTANCE_BETWEEN_COORDS(vFrontCarriagePos, vPlayerPos)
|
|
fDistanceToRear = GET_DISTANCE_BETWEEN_COORDS(vRearCarriagePos, vPlayerPos)
|
|
|
|
//PRINTSTRING("front = ") PRINTFLOAT(fDistanceToFront) PRINTNL()
|
|
//PRINTSTRING("rear = ") PRINTFLOAT(fDistanceToRear) PRINTNL()
|
|
|
|
SWITCH trainMovementState
|
|
CASE TRAIN_MOVEMENT_STOPPED
|
|
// set vehicle density
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.8)
|
|
|
|
IF fDistanceToRear <= 540
|
|
OR fDistanceToFront <= 550
|
|
trainMovementState = TRAIN_MOVEMENT_VERY_SLOW
|
|
iTrainMovementStartTime = GET_GAME_TIMER()
|
|
ELSE
|
|
fTrainTargetSpeed = 0.0
|
|
ENDIF
|
|
BREAK
|
|
CASE TRAIN_MOVEMENT_VERY_SLOW
|
|
IF fDistanceToRear <= 400
|
|
trainMovementState = TRAIN_MOVEMENT_SLOW
|
|
ELSE
|
|
IF fDistanceToRear <= 450
|
|
fTrainTargetSpeed = 12.0
|
|
ELSE
|
|
fTrainTargetSpeed = 10.0
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE TRAIN_MOVEMENT_SLOW
|
|
IF fDistanceToRear <= 300
|
|
trainMovementState = TRAIN_MOVEMENT_FAST
|
|
ELSE
|
|
IF fDistanceToRear <= 350
|
|
fTrainTargetSpeed = 21.0
|
|
ELSE
|
|
fTrainTargetSpeed = 20.0
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE TRAIN_MOVEMENT_FAST
|
|
IF vRearCarriagePos.y >= 5248.0
|
|
trainMovementState = TRAIN_MOVEMENT_CATCHUP
|
|
ELIF vRearCarriagePos.y >= 4918.0
|
|
IF vPlayerOffsetFromRearCarriage.y < 0
|
|
IF fDistanceToRear > 300
|
|
fTrainTargetSpeed = 14
|
|
ELIF fDistanceToRear > 150
|
|
fTrainTargetSpeed = 22
|
|
ELIF fDistanceToRear > 60
|
|
fTrainTargetSpeed = 26
|
|
ELIF fDistanceToRear > 40
|
|
fTrainTargetSpeed = 27
|
|
ELIF fDistanceToRear > 28
|
|
fTrainTargetSpeed = 28
|
|
ELSE
|
|
fTrainTargetSpeed = 29
|
|
ENDIF
|
|
ELSE
|
|
fTrainTargetSpeed = 30
|
|
ENDIF
|
|
ELSE
|
|
IF vPlayerOffsetFromRearCarriage.y < 0
|
|
IF fDistanceToRear > 300
|
|
fTrainTargetSpeed = 12
|
|
ELIF fDistanceToRear > 150
|
|
fTrainTargetSpeed = 21
|
|
ELIF fDistanceToRear > 60
|
|
fTrainTargetSpeed = 26
|
|
ELIF fDistanceToRear > 40
|
|
fTrainTargetSpeed = 27
|
|
ELIF fDistanceToRear > 28
|
|
fTrainTargetSpeed = 28
|
|
ELSE
|
|
fTrainTargetSpeed = 29//32
|
|
ENDIF
|
|
ELSE
|
|
fTrainTargetSpeed = 30//33
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE TRAIN_MOVEMENT_CATCHUP
|
|
IF fDistanceToRear > 140
|
|
AND vPlayerOffsetFromRearCarriage.y < 0
|
|
fTrainTargetSpeed = 10
|
|
ELIF fDistanceToRear > 70
|
|
AND vPlayerOffsetFromRearCarriage.y < 0
|
|
SWITCH iCurrentJump
|
|
CASE 0
|
|
fTrainTargetSpeed = 12//15
|
|
BREAK
|
|
CASE 1
|
|
fTrainTargetSpeed = 11//14
|
|
BREAK
|
|
CASE 2
|
|
fTrainTargetSpeed = 10//13
|
|
BREAK
|
|
CASE 3
|
|
fTrainTargetSpeed = 9//12
|
|
BREAK
|
|
DEFAULT
|
|
fTrainTargetSpeed = 8//11
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
SWITCH iCurrentJump
|
|
CASE 0
|
|
fTrainTargetSpeed = 16//23
|
|
BREAK
|
|
CASE 1
|
|
fTrainTargetSpeed = 15//22
|
|
BREAK
|
|
CASE 2
|
|
fTrainTargetSpeed = 14//21
|
|
BREAK
|
|
CASE 3
|
|
fTrainTargetSpeed = 13//20
|
|
BREAK
|
|
DEFAULT
|
|
fTrainTargetSpeed = 12//19
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
IF bStopTrain
|
|
fTrainTargetSpeed = 0
|
|
ELSE
|
|
fTrainTargetSpeed = DRIVE_ALONG_TRAIN_SPEED
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
IF trainHotswapState = TRAIN_HOTSWAP_ON_MICHAEL
|
|
IF bCreatedCrashTrain
|
|
fTrainTargetSpeed = GET_TO_BRIDGE_SLOW_TRAIN_SPEED
|
|
fTrainCruiseSpeed = GET_TO_BRIDGE_SLOW_TRAIN_SPEED
|
|
ELSE
|
|
fTrainTargetSpeed = 0
|
|
fTrainCruiseSpeed = 0
|
|
ENDIF
|
|
ELIF trainHotswapState = TRAIN_HOTSWAP_TO_MICHAEL
|
|
IF bCamHighEnoughToFreezeTrain
|
|
fTrainTargetSpeed = 0
|
|
fTrainCruiseSpeed = 0
|
|
ELSE
|
|
fTrainTargetSpeed = fTrainCruiseSpeed
|
|
ENDIF
|
|
ELIF trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
|
|
IF NOT IS_SELECTOR_ONSCREEN()
|
|
BOOL bTrainIsAcceleratingForAudio
|
|
BOOL bTrainIsDeceleratingForAudio
|
|
BOOL bBrakePressed
|
|
bBrakePressed = FALSE
|
|
|
|
IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
fTrainSpeedMod = fTrainSpeedMod +@ 0.2
|
|
IF fTrainSpeedMod > 1.0
|
|
fTrainSpeedMod = 1.0
|
|
bTrainIsAcceleratingForAudio = FALSE
|
|
ELSE
|
|
bTrainIsAcceleratingForAudio = TRUE
|
|
ENDIF
|
|
bTrainIsDeceleratingForAudio = FALSE
|
|
ELIF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
bBrakePressed = TRUE
|
|
|
|
fTrainSpeedMod = fTrainSpeedMod -@ 0.2
|
|
IF fTrainSpeedMod < 0.35
|
|
fTrainSpeedMod = 0.35
|
|
bTrainIsDeceleratingForAudio = FALSE
|
|
ELSE
|
|
bTrainIsDeceleratingForAudio = TRUE
|
|
ENDIF
|
|
bTrainIsAcceleratingForAudio = FALSE
|
|
ELSE
|
|
bTrainIsAcceleratingForAudio = FALSE
|
|
bTrainIsDeceleratingForAudio = FALSE
|
|
ENDIF
|
|
|
|
IF bBrakePressed
|
|
IF NOT bDoneBrakePressSound
|
|
PLAY_SOUND_FRONTEND(-1, "EXILE_3_TRAIN_BRAKE_PULL_MASTER")
|
|
bDoneBrakePressSound = TRUE
|
|
ENDIF
|
|
bDoneBrakeReleaseSound = FALSE
|
|
ELSE
|
|
IF NOT bDoneBrakeReleaseSound
|
|
PLAY_SOUND_FRONTEND(-1, "EXILE_3_TRAIN_BRAKE_RELEASE_MASTER")
|
|
bDoneBrakeReleaseSound = TRUE
|
|
ENDIF
|
|
bDoneBrakePressSound = FALSE
|
|
ENDIF
|
|
|
|
IF bTrainIsAcceleratingForAudio
|
|
fTrainAccelerationTime = fTrainAccelerationTime +@ 1.0
|
|
fTrainDecelerationTime = 0.0
|
|
IF NOT bDoneTrainAccelerationAudioScene
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL)
|
|
bDoneTrainAccelerationAudioScene = TRUE
|
|
bDoneTrainDecelerationAudioScene = FALSE
|
|
ELSE
|
|
SET_AUDIO_SCENE_VARIABLE("EXILE_3_TRAIN_ACCEL_CONTROL_SCENE","TimeAccelerateHeldDown", fTrainAccelerationTime)
|
|
//PRINTSTRING("accel = ") PRINTFLOAT(fTrainAccelerationTime) PRINTNL()
|
|
ENDIF
|
|
ELIF bTrainIsDeceleratingForAudio
|
|
fTrainDecelerationTime = fTrainDecelerationTime +@ 1.0
|
|
fTrainAccelerationTime = 0.0
|
|
IF NOT bDoneTrainDecelerationAudioScene
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL)
|
|
|
|
bDoneTrainDecelerationAudioScene = TRUE
|
|
bDoneTrainAccelerationAudioScene = FALSE
|
|
ELSE
|
|
SET_AUDIO_SCENE_VARIABLE("EXILE_3_TRAIN_DECEL_CONTROL_SCENE","TimeDecelerateHeldDown", fTrainDecelerationTime)
|
|
//PRINTSTRING("decel = ") PRINTFLOAT(fTrainDecelerationTime) PRINTNL()
|
|
ENDIF
|
|
ELSE
|
|
fTrainAccelerationTime = 0.0
|
|
fTrainDecelerationTime = 0.0
|
|
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL)
|
|
|
|
bDoneTrainDecelerationAudioScene = FALSE
|
|
bDoneTrainAccelerationAudioScene = FALSE
|
|
ENDIF
|
|
|
|
|
|
|
|
fTrainTargetSpeed = GET_TO_BRIDGE_TRAIN_SPEED * fTrainSpeedMod
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
FLOAT fAcceleration
|
|
FLOAT fDeceleration
|
|
|
|
IF currentMissionStage <= STAGE_CHASE_TRAIN
|
|
IF NOT bSlowDownTrainForCatchup
|
|
fAcceleration = TRAIN_CHASE_ACCELERATION
|
|
fDeceleration = TRAIN_CHASE_DECELERATION
|
|
ELSE
|
|
fAcceleration = TRAIN_CATCHUP_ACCELERATION
|
|
fDeceleration = TRAIN_CATCHUP_DECELERATION
|
|
ENDIF
|
|
ELIF currentMissionStage = STAGE_DRIVE_ALONG_TRAIN
|
|
fAcceleration = TRAIN_SABOTAGE_ACCELERATION
|
|
fDeceleration = TRAIN_SABOTAGE_DECELERATION
|
|
ELIF currentMissionStage = STAGE_GET_TO_BRIDGE
|
|
fAcceleration = 5.0
|
|
fDeceleration = 5.0
|
|
ELSE
|
|
fAcceleration = TRAIN_STANDARD_ACCELERATION
|
|
fDeceleration = TRAIN_STANDARD_DECELERATION
|
|
ENDIF
|
|
|
|
IF bStopTrain
|
|
fDeceleration = 12.0
|
|
ENDIF
|
|
|
|
// modify current cruise speed based on target
|
|
IF fTrainTargetSpeed < fTrainCruiseSpeed
|
|
fTrainCruiseSpeed = fTrainCruiseSpeed -@ fDeceleration
|
|
IF fTrainCruiseSpeed < fTrainTargetSpeed
|
|
fTrainCruiseSpeed = fTrainTargetSpeed
|
|
ENDIF
|
|
ELIF fTrainTargetSpeed > fTrainCruiseSpeed
|
|
fTrainCruiseSpeed = fTrainCruiseSpeed +@ fAcceleration
|
|
IF fTrainCruiseSpeed > fTrainTargetSpeed
|
|
fTrainCruiseSpeed = fTrainTargetSpeed
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// set speed
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
SET_TRAIN_CRUISE_SPEED(missionTrain, fTrainCruiseSpeed)
|
|
SET_TRAIN_SPEED(missionTrain, fTrainCruiseSpeed)
|
|
PRINTSTRING("speed = ") PRINTFLOAT(fTrainCruiseSpeed) PRINTNL()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// override speed as requested by Klaas
|
|
#IF IS_DEBUG_BUILD
|
|
ELSE
|
|
IF NOT bDebugDontDoDistanceFail
|
|
bDebugDontDoDistanceFail = TRUE
|
|
ENDIF
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
SET_TRAIN_CRUISE_SPEED(missionTrain, fDebugOverrideSpeed)
|
|
SET_TRAIN_SPEED(missionTrain, fDebugOverrideSpeed)
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
// get closest train carriage to player
|
|
FUNC INT GET_CLOSEST_CARRIAGE(VECTOR vOverrideCoord, BOOL bOverrideCoord = FALSE)
|
|
INT i = EXILE3_LAST_CARRIAGE
|
|
INT iClosest = EXILE3_LAST_CARRIAGE
|
|
FLOAT fClosestDistance = 99999999
|
|
FLOAT fDistance
|
|
BOOL bDoneLoop = FALSE
|
|
VECTOR vCheckCoord
|
|
IF bOverrideCoord
|
|
vCheckCoord = vOverrideCoord
|
|
ELSE
|
|
vCheckCoord = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
WHILE NOT bDoneLoop
|
|
IF IS_VEHICLE_DRIVEABLE(GET_TRAIN_CARRIAGE(missionTrain, i))
|
|
fDistance = GET_DISTANCE_BETWEEN_COORDS(vCheckCoord, GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(missionTrain, i)), FALSE)
|
|
IF fDistance < fClosestDistance
|
|
fClosestDistance = fDistance
|
|
iClosest = i
|
|
ENDIF
|
|
ENDIF
|
|
i--
|
|
IF i < 0
|
|
bDoneLoop = TRUE
|
|
ENDIF
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
RETURN iClosest
|
|
ENDFUNC
|
|
|
|
PROC DO_DOORS_BLOW_OPEN(BOOL bSkip = FALSE)
|
|
IF DOES_ENTITY_EXIST(doorsObject)
|
|
PLAY_ENTITY_ANIM(doorsObject, "p_cs1_14b_train_s", "p_cs1_14b_train_s_break", INSTANT_BLEND_IN, FALSE, TRUE)
|
|
|
|
IF bSkip
|
|
WAIT(0)
|
|
IF IS_ENTITY_PLAYING_ANIM(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s")
|
|
SET_ENTITY_ANIM_CURRENT_TIME(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s", 1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(doorCollisionObject)
|
|
DELETE_OBJECT(doorCollisionObject)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC START_CRASH_PTFX()
|
|
IF NOT bFirePTFXActive[0]
|
|
firePTFX[0] = START_PARTICLE_FX_LOOPED_AT_COORD("scr_ex3_engine_fire", <<-507.46, 4452.73, 34.69>>, <<0,0,0>>)
|
|
bFirePTFXActive[0] = TRUE
|
|
ENDIF
|
|
|
|
IF NOT bFirePTFXActive[1]
|
|
firePTFX[1] = START_PARTICLE_FX_LOOPED_AT_COORD("scr_ex3_container_smoke", <<-494.47, 4433.65, 33.11>>, <<0,0,0>>)
|
|
bFirePTFXActive[1] = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC START_DEBRIS_FX()
|
|
IF NOT bStartedDebrisFX
|
|
debrisFallPTFX1 = START_PARTICLE_FX_LOOPED_AT_COORD("ent_ray_train_falling_debris", <<-515.7, 4428.5, 88.0>>, <<0,0,0>>)
|
|
debrisFallPTFX2 = START_PARTICLE_FX_LOOPED_AT_COORD("ent_ray_train_falling_debris", <<-514.0, 4403.2, 88.0>>, <<0,0,0>>)
|
|
debrisFallPTFX3 = START_PARTICLE_FX_LOOPED_AT_COORD("ent_ray_train_falling_debris", <<-519.9, 4457.7, 88.0>>, <<0,0,0>>)
|
|
debrisSplashPTFX = START_PARTICLE_FX_LOOPED_AT_COORD("ent_ray_train_debris_splash", <<-506.1, 4414.6, 30.0>>, <<0,0,0>>)
|
|
|
|
bStartedDebrisFX = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_DEBRIS_EVOLUTION(FLOAT fEvolution)
|
|
SET_PARTICLE_FX_LOOPED_EVOLUTION(debrisFallPTFX1, "debris", fEvolution)
|
|
SET_PARTICLE_FX_LOOPED_EVOLUTION(debrisFallPTFX2, "debris", fEvolution)
|
|
SET_PARTICLE_FX_LOOPED_EVOLUTION(debrisFallPTFX3, "debris", fEvolution)
|
|
SET_PARTICLE_FX_LOOPED_EVOLUTION(debrisSplashPTFX, "splashes", fEvolution)
|
|
ENDPROC
|
|
|
|
|
|
// set train crash geo
|
|
PROC SET_TRAIN_CRASH_GEO(BOOL bOn, BOOL bCarriageHanging = TRUE, BOOL bCreateDoorCollision = FALSE, BOOL bSetFoam = TRUE, BOOL bSetPTFX = TRUE)
|
|
IF bOn
|
|
// geo
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH, BUILDINGSTATE_DESTROYED)
|
|
IF bSetFoam
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH_2, BUILDINGSTATE_DESTROYED)
|
|
ENDIF
|
|
//REQUEST_IPL("canyonriver01_traincrash")
|
|
//REMOVE_IPL("canyonriver01")
|
|
|
|
IF bCarriageHanging
|
|
IF NOT DOES_ENTITY_EXIST(hangingCarriageVehicle)
|
|
// create the hanging carriage
|
|
hangingCarriageVehicle = CREATE_VEHICLE(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_TRAIN_CONTAINER2), <<-509.800, 4453.300, 80.200>>)
|
|
SET_ENTITY_ROTATION(hangingCarriageVehicle, <<90.000, 0.000, 87.060>>)
|
|
SET_VEHICLE_COLOUR_COMBINATION(hangingCarriageVehicle, 2)
|
|
FREEZE_ENTITY_POSITION(hangingCarriageVehicle, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// doors
|
|
IF NOT DOES_ENTITY_EXIST(doorsObject)
|
|
IF bCreateDoorCollision
|
|
doorsObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_CONTAINER_DOORS), <<0,1,2>>)
|
|
SET_ENTITY_COORDS(doorsObject,<<-491.690, 4434.900, 31.100>>)
|
|
SET_ENTITY_ROTATION(doorsObject,<<344.520, 343.820, 64.240>>)
|
|
FREEZE_ENTITY_POSITION(doorsObject, TRUE)
|
|
ELSE
|
|
CREATE_OPEN_DOORS()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCreateDoorCollision
|
|
IF DOES_ENTITY_EXIST(doorCollisionObject)
|
|
DELETE_OBJECT(doorCollisionObject)
|
|
ENDIF
|
|
|
|
doorCollisionObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DOOR_COLLISION_SHUT), <<0,1,2>>)
|
|
SET_ENTITY_COORDS(doorCollisionObject, GET_ENTITY_COORDS(doorsObject))
|
|
SET_ENTITY_ROTATION(doorCollisionObject, GET_ENTITY_ROTATION(doorsObject))
|
|
FREEZE_ENTITY_POSITION(doorCollisionObject, TRUE)
|
|
|
|
ENDIF
|
|
|
|
// ptfx
|
|
IF bSetPTFX
|
|
START_CRASH_PTFX()
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(hangingCarriageVehicle)
|
|
DELETE_VEHICLE(hangingCarriageVehicle)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(doorsObject)
|
|
DELETE_OBJECT(doorsObject)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(doorCollisionObject)
|
|
DELETE_OBJECT(doorCollisionObject)
|
|
ENDIF
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH, BUILDINGSTATE_NORMAL)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_EXL3_TRAIN_CRASH_2, BUILDINGSTATE_NORMAL)
|
|
//REQUEST_IPL("canyonriver01")
|
|
//REMOVE_IPL("canyonriver01_traincrash")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// get crate inside car pos
|
|
FUNC VECTOR GET_CRATE_POS(INT i)
|
|
SWITCH i
|
|
CASE 0
|
|
RETURN <<-495.07, 4436.97, 29.53>>
|
|
BREAK
|
|
CASE 1
|
|
RETURN <<-497.61, 4437.93, 29.63>>
|
|
BREAK
|
|
CASE 2
|
|
RETURN <<-497.34, 4436.72, 29.56>>
|
|
BREAK
|
|
CASE 3
|
|
RETURN <<-496.85, 4437.59, 28.82>>
|
|
BREAK
|
|
CASE 4
|
|
RETURN <<-499.36, 4439.40, 28.67>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
// get crate inside car rot
|
|
FUNC VECTOR GET_CRATE_ROT(INT i)
|
|
SWITCH i
|
|
CASE 0
|
|
RETURN <<-15.11, 0.0, -134.85>>
|
|
BREAK
|
|
CASE 1
|
|
RETURN <<20.76, 0.0, 35.61>>
|
|
BREAK
|
|
CASE 2
|
|
RETURN <<3.25, 0.0, -103.47>>
|
|
BREAK
|
|
CASE 3
|
|
RETURN <<-48.92, 0.0, 87.75>>
|
|
BREAK
|
|
CASE 4
|
|
RETURN <<0.77, 0.0, -106.11>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
// create crates inside traincar
|
|
PROC CREATE_CRATES_INSIDE_TRAINCAR()
|
|
INT i
|
|
|
|
REPEAT NUMBER_CRATES i
|
|
crateBob[i].obj = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_CRATE), GET_CRATE_POS(i))
|
|
|
|
SWITCH i
|
|
CASE 0
|
|
crateBob[i].fDisplacement = 0.01
|
|
crateBob[i].fSpeed = 0.03
|
|
crateBob[i].iDir = 1
|
|
BREAK
|
|
CASE 1
|
|
crateBob[i].fDisplacement = -0.02
|
|
crateBob[i].fSpeed = -0.01
|
|
crateBob[i].iDir = -1
|
|
BREAK
|
|
CASE 2
|
|
crateBob[i].fDisplacement = 0
|
|
crateBob[i].fSpeed = 0.04
|
|
crateBob[i].iDir = 1
|
|
BREAK
|
|
CASE 3
|
|
crateBob[i].fDisplacement = -0.01
|
|
crateBob[i].fSpeed = 0.02
|
|
crateBob[i].iDir = 1
|
|
BREAK
|
|
CASE 4
|
|
crateBob[i].fDisplacement = 0.02
|
|
crateBob[i].fSpeed = 0
|
|
crateBob[i].iDir = -1
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
|
|
SET_ENTITY_ROTATION(crateBob[i].obj, GET_CRATE_ROT(i))
|
|
FREEZE_ENTITY_POSITION(crateBob[i].obj, TRUE)
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
// remove crates inside traincar
|
|
PROC REMOVE_CRATES_INSIDE_TRAINCAR()
|
|
INT i
|
|
|
|
REPEAT NUMBER_CRATES i
|
|
IF DOES_ENTITY_EXIST(crateBob[i].obj)
|
|
DELETE_OBJECT(crateBob[i].obj)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
// handle crates bobbing inside car
|
|
CONST_FLOAT CRATE_BOB_MAX_SPEED 0.05
|
|
CONST_FLOAT CRATE_BOB_ACCEL 0.09
|
|
CONST_FLOAT CRATE_BOB_MAX_DISPLACE 0.04
|
|
PROC HANDLE_CRATE_BOB()
|
|
INT i
|
|
|
|
REPEAT NUMBER_CRATES i
|
|
IF DOES_ENTITY_EXIST(crateBob[i].obj)
|
|
|
|
crateBob[i].fSpeed = crateBob[i].fSpeed +@ (CRATE_BOB_ACCEL * crateBob[i].iDir)
|
|
IF crateBob[i].fSpeed >= CRATE_BOB_MAX_SPEED
|
|
crateBob[i].fSpeed = CRATE_BOB_MAX_SPEED
|
|
ELIF crateBob[i].fSpeed <= -CRATE_BOB_MAX_SPEED
|
|
crateBob[i].fSpeed = -CRATE_BOB_MAX_SPEED
|
|
ENDIF
|
|
|
|
crateBob[i].fDisplacement = crateBob[i].fDisplacement +@ crateBob[i].fSpeed
|
|
|
|
IF crateBob[i].fDisplacement >= CRATE_BOB_MAX_DISPLACE
|
|
crateBob[i].iDir = -1
|
|
ELIF crateBob[i].fDisplacement <= -CRATE_BOB_MAX_DISPLACE
|
|
crateBob[i].iDir = 1
|
|
ENDIF
|
|
|
|
//SET_ENTITY_COORDS(crateBob[i].obj, GET_CRATE_POS(i) + <<0,0,crateBob[i].fDisplacement>>)
|
|
SLIDE_OBJECT(crateBob[i].obj, GET_CRATE_POS(i) + <<0,0,crateBob[i].fDisplacement>>, <<1,1,1>>, FALSE)
|
|
SET_ENTITY_ROTATION(crateBob[i].obj, GET_CRATE_ROT(i))
|
|
SET_ENTITY_LOD_DIST(crateBob[i].obj, 100)
|
|
FREEZE_ENTITY_POSITION(crateBob[i].obj, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
// create debris
|
|
/*
|
|
PROC CREATE_DEBRIS()
|
|
INT i
|
|
|
|
VECTOR vPos
|
|
FLOAT fRot
|
|
BOOL bIsCrate
|
|
MODEL_NAMES model
|
|
|
|
REPEAT NUMBER_DEBRIS i
|
|
IF NOT DOES_ENTITY_EXIST(debris[i].obj)
|
|
SWITCH i
|
|
CASE 0
|
|
vPos = <<-472.4, 4419.0, 25.9>>
|
|
fRot = 142.5
|
|
bIsCrate = TRUE
|
|
BREAK
|
|
CASE 1
|
|
vPos = <<-474.6, 4426.0, 26.0>>
|
|
fRot = -50.5
|
|
bIsCrate = FALSE
|
|
BREAK
|
|
CASE 2
|
|
vPos = <<-468.4, 4430.8, 26.6>>
|
|
fRot = -24.5
|
|
bIsCrate = TRUE
|
|
BREAK
|
|
CASE 3
|
|
vPos = <<-496.8, 4422.6, 26.2>>
|
|
fRot = 10.0
|
|
bIsCrate = FALSE
|
|
BREAK
|
|
CASE 4
|
|
vPos = <<-502.2, 4414.1, 24.3>>
|
|
fRot = -10.0
|
|
bIsCrate = TRUE
|
|
BREAK
|
|
CASE 5
|
|
vPos = <<-492.0, 4420.6, 25.6>>
|
|
fRot = -70.0
|
|
bIsCrate = TRUE
|
|
BREAK
|
|
CASE 6
|
|
vPos = <<-520.7, 4410.2, 24.4>>
|
|
fRot = 70.0
|
|
bIsCrate = TRUE
|
|
BREAK
|
|
CASE 7
|
|
vPos = <<-516.0, 4423.9, 25.7>>
|
|
fRot = 40.0
|
|
bIsCrate = TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bIsCrate
|
|
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DEBRIS_CRATE)
|
|
ELSE
|
|
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DEBRIS_BARREL)
|
|
ENDIF
|
|
|
|
debris[i].obj = CREATE_OBJECT(model, vPos)
|
|
SET_ENTITY_HEADING(debris[i].obj, fRot)
|
|
FREEZE_ENTITY_POSITION(debris[i].obj, TRUE)
|
|
debris[i].bReleased = FALSE
|
|
debris[i].fOnScreenTime = 0.0
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
// handle debris
|
|
PROC HANDLE_DEBRIS()
|
|
INT i
|
|
FLOAT fTime
|
|
|
|
REPEAT NUMBER_DEBRIS i
|
|
IF NOT debris[i].bReleased
|
|
SWITCH i
|
|
CASE 0
|
|
fTime = 0.0
|
|
BREAK
|
|
CASE 1
|
|
fTime = 2.0
|
|
BREAK
|
|
CASE 2
|
|
fTime = 2.5
|
|
BREAK
|
|
CASE 3
|
|
fTime = 1.0
|
|
BREAK
|
|
CASE 4
|
|
fTime = 0.6
|
|
BREAK
|
|
CASE 5
|
|
fTime = 1.3
|
|
BREAK
|
|
CASE 6
|
|
fTime = 1.7
|
|
BREAK
|
|
CASE 7
|
|
fTime = 0.4
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF DOES_ENTITY_EXIST(debris[i].obj)
|
|
IF IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(debris[i].obj), 1.0)
|
|
debris[i].fOnScreenTime = debris[i].fOnScreenTime +@ 1.0
|
|
IF debris[i].fOnScreenTime >= fTime
|
|
OR IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID())
|
|
FREEZE_ENTITY_POSITION(debris[i].obj, FALSE)
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(debris[i].obj, APPLY_TYPE_IMPULSE, <<0,0,0.1>>, 0, TRUE, TRUE)
|
|
debris[i].bReleased = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
*/
|
|
|
|
// set case state
|
|
PROC SET_CASE_STATE(CASE_STATE_ENUM caseState)
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
IF DOES_ENTITY_EXIST(caseObject)
|
|
IF IS_ENTITY_ATTACHED(caseObject)
|
|
DETACH_ENTITY(caseObject)
|
|
ENDIF
|
|
|
|
SWITCH caseState
|
|
CASE CASE_IN_HAND_ANIM
|
|
ATTACH_ENTITY_TO_ENTITY(caseObject, michaelPed, GET_PED_BONE_INDEX(michaelPed, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>)
|
|
BREAK
|
|
CASE CASE_IN_HAND_ANIM_2
|
|
ATTACH_ENTITY_TO_ENTITY(caseObject, michaelPed, GET_PED_BONE_INDEX(michaelPed, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,180,-90>>)
|
|
GIVE_WEAPON_TO_PED(michaelPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE), INFINITE_AMMO, TRUE, TRUE)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
|
|
BREAK
|
|
CASE CASE_IN_HAND_GAMEPLAY
|
|
//ATTACH_ENTITY_TO_ENTITY(caseObject, michaelPed, GET_PED_BONE_INDEX(michaelPed, BONETAG_PH_R_HAND), <<0,0,0.04>>, <<-90,0,0>>)
|
|
IF DOES_ENTITY_EXIST(caseObject)
|
|
DELETE_OBJECT(caseObject)
|
|
//CLEAR_PED_TASKS(michaelPed)
|
|
//FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), FALSE)
|
|
GIVE_WEAPON_TO_PED(michaelPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE), INFINITE_AMMO, TRUE, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
CASE CASE_UNDER_SEAT
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
//ATTACH_ENTITY_TO_ENTITY(caseObject, trainCrashVehicle[TCV_DINGHY], 0, <<-0.499178,0.0651846, 0.579191 >>, <<-90,-90,0>>, FALSE, FALSE, TRUE)
|
|
ATTACH_ENTITY_TO_ENTITY(caseObject, trainCrashVehicle[TCV_DINGHY], 0, <<-0.599678,0.0851846, 0.549191 >>, <<-90,-90,0>>, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// create the case
|
|
PROC CREATE_CASE(CASE_STATE_ENUM caseState)
|
|
IF NOT DOES_ENTITY_EXIST(caseObject)
|
|
caseObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_CASE), GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
ENDIF
|
|
SET_CASE_STATE(caseState)
|
|
ENDPROC
|
|
|
|
// destroy a scripted cam if it exists
|
|
PROC DESTROY_MISSION_STATIC_CAM(CAMERA_INDEX &camIndex)
|
|
IF DOES_CAM_EXIST(camIndex)
|
|
DESTROY_CAM(camIndex)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// create a scripted stationary cam if it doesn't already exist
|
|
PROC CREATE_MISSION_STATIC_CAM(CAMERA_INDEX &camIndex, BOOL bCreateActive = TRUE)
|
|
// get rid of any existing interp cams
|
|
IF DOES_CAM_EXIST(interpCam)
|
|
DESTROY_CAM(interpCam)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(camIndex)
|
|
DESTROY_CAM(camIndex)
|
|
ENDIF
|
|
|
|
IF NOT DOES_CAM_EXIST(camIndex)
|
|
camIndex = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", bCreateActive)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// destroy anim cam
|
|
PROC DESTROY_MISSION_ANIM_CAM()
|
|
IF DOES_CAM_EXIST(animCam)
|
|
DESTROY_CAM(animCam)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// load objects if screen faded out
|
|
PROC LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
IF IS_SCREEN_FADED_OUT()
|
|
LOAD_ALL_OBJECTS_NOW()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// get correct model for mission vehicle
|
|
FUNC TRAIN_CRASH_MODEL_ENUM GET_MODEL_ENUM_FOR_TRAIN_CRASH_VEHICLE(TRAIN_CRASH_VEHICLE_ENUM tcVehicle)
|
|
SWITCH tcVehicle
|
|
CASE TCV_BIKE
|
|
RETURN TCM_BIKE
|
|
BREAK
|
|
CASE TCV_DINGHY
|
|
RETURN TCM_DINGHY
|
|
BREAK
|
|
CASE TCV_MICHAEL_CAR
|
|
RETURN TCM_MICHAEL_CAR
|
|
BREAK
|
|
CASE TCV_BEACH_CAR
|
|
RETURN TCM_BEACH_CAR
|
|
BREAK
|
|
CASE TCV_BEACH_TRUCK
|
|
RETURN TCM_BEACH_TRUCK
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN TCM_BIKE
|
|
ENDFUNC
|
|
|
|
// is this model required on this stage?
|
|
FUNC BOOL IS_MODEL_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_MODEL_ENUM tcModel, MISSION_STAGE_ENUM reqStage)
|
|
SWITCH tcModel
|
|
CASE TCM_MICHAEL
|
|
CASE TCM_TREVOR
|
|
RETURN TRUE
|
|
BREAK
|
|
CASE TCM_TRAIN_ENGINE
|
|
IF reqStage <= STAGE_GET_TO_BRIDGE
|
|
AND reqStage > STAGE_INTERCEPT_TRAIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_TRAIN_CONTAINER2
|
|
IF reqStage < STAGE_RAPIDS_CHASE
|
|
AND reqStage > STAGE_INTERCEPT_TRAIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_BIKE
|
|
IF reqStage <= STAGE_DRIVE_ALONG_TRAIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_MICHAEL_CAR
|
|
IF reqStage = STAGE_INTERCEPT_TRAIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_CHASE_CHOPPER
|
|
IF reqStage >= STAGE_STEAL_FROM_CONTAINER
|
|
AND reqStage < STAGE_GET_HOME
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_DINGHY
|
|
IF reqStage >= STAGE_GET_TO_BRIDGE
|
|
//IF reqStage >= STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_ENEMY_DINGHY
|
|
IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
OR reqStage = STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_MERC_CAR
|
|
IF reqStage = STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_BEACH_CAR
|
|
CASE TCM_BEACH_TRUCK
|
|
//IF reqStage >= STAGE_GET_HOME
|
|
// RETURN TRUE
|
|
//ENDIF
|
|
BREAK
|
|
CASE TCM_SOLDIER
|
|
IF (reqStage >= STAGE_STEAL_FROM_CONTAINER
|
|
AND reqStage < STAGE_GET_HOME)
|
|
//OR reqStage = STAGE_DRIVE_ALONG_TRAIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_ENGINEER
|
|
IF reqStage = STAGE_GET_TO_BRIDGE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_TRAIN_FLATBED
|
|
IF reqStage = STAGE_GET_TO_BRIDGE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_CONTAINER_DOORS
|
|
IF reqStage >= STAGE_GO_TO_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_CRATE
|
|
IF reqStage >= STAGE_GO_TO_CONTAINER
|
|
AND reqStage <= STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_CASE
|
|
IF reqStage >= STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_DEBRIS_CRATE
|
|
CASE TCM_DEBRIS_BARREL
|
|
IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_ANCHOR
|
|
//IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
IF reqStage = STAGE_GET_TO_BRIDGE
|
|
OR reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_DOOR_COLLISION_SHUT
|
|
IF reqStage = STAGE_GO_TO_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_DOOR_OPEN
|
|
IF reqStage >= STAGE_GO_TO_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TCM_PATRICIA
|
|
CASE TCM_RON
|
|
IF reqStage = STAGE_INTERCEPT_TRAIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// add a request for a model
|
|
PROC ADD_MODEL_REQUEST(INT i)
|
|
MODEL_NAMES mModelToRequest = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i))
|
|
REQUEST_MODEL(mModelToRequest)
|
|
bModelRequestTracker[i] = TRUE
|
|
ENDPROC
|
|
|
|
// remove request
|
|
PROC CLEAR_MODEL_REQUEST(INT i)
|
|
IF bModelRequestTracker[i]
|
|
MODEL_NAMES mModelToRequest = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i))
|
|
IF HAS_MODEL_LOADED(mModelToRequest)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mModelToRequest)
|
|
ENDIF
|
|
bModelRequestTracker[i] = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// have all requests for models succeeded?
|
|
FUNC BOOL HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
|
|
INT i
|
|
|
|
// loop through and check for empty
|
|
REPEAT NUMBER_MODEL_REQUEST_SLOTS i
|
|
IF bModelRequestTracker[i] = TRUE
|
|
IF NOT HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i)))
|
|
// a full slot is not loaded, return false
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
// request the models for a particular stage
|
|
PROC REQUEST_MODELS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepModelsForCurrentStage)
|
|
|
|
INT i
|
|
REPEAT NUMBER_MODEL_REQUEST_SLOTS i
|
|
IF IS_MODEL_REQUIRED_FOR_MISSION_STAGE(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i), requestStage)
|
|
// if we need this model, request it
|
|
ADD_MODEL_REQUEST(i)
|
|
ELSE
|
|
// otherwise try and get rid of it
|
|
IF NOT IS_MODEL_REQUIRED_FOR_MISSION_STAGE(INT_TO_ENUM(TRAIN_CRASH_MODEL_ENUM, i), currentMissionStage)
|
|
OR NOT bKeepModelsForCurrentStage
|
|
CLEAR_MODEL_REQUEST(i)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// if wait for load, don't quit out 'til all the models are in
|
|
IF bWaitForLoad
|
|
IF NOT HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// is this recording required on this stage?
|
|
FUNC BOOL IS_RECORDING_REQUIRED_FOR_MISSION_STAGE(INT iRec, MISSION_STAGE_ENUM reqStage)
|
|
SWITCH iRec
|
|
CASE 001 // dinghy towards bridge
|
|
SWITCH reqStage
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
RETURN TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
//CASE 004 // bike jumps
|
|
//CASE 005
|
|
//CASE 007
|
|
//CASE 008
|
|
// IF reqStage = STAGE_CHASE_TRAIN
|
|
// RETURN TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
|
|
CASE 004 // off waterfall
|
|
CASE 005 // bad guy 1 waterfall
|
|
CASE 007 // bad guy 2 waterfall
|
|
IF reqStage = STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 008 // michael drive at end
|
|
IF reqStage = STAGE_GET_HOME
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
// enemy vehicles - shootout
|
|
CASE 003 // wave 1 boat 1
|
|
CASE 002 // wave 1 boat 2
|
|
CASE 010 // wave 1 boat 3
|
|
CASE 011 // wave 1 heli 1
|
|
CASE 015 // wave 2 heli 1
|
|
CASE 017 // wave 4 heli 1
|
|
IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
//CASE 010 // 4wd pull out in front of train
|
|
// IF reqStage = STAGE_GET_TO_BRIDGE
|
|
// RETURN TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
|
|
CASE 006 // dinghy pull up to containers
|
|
IF reqStage = STAGE_GET_TO_BRIDGE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
//CASE 021 // dinghy backup from rapids
|
|
// IF reqStage = STAGE_GO_TO_CONTAINER
|
|
// RETURN TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
|
|
CASE 014 // dinghy pickup trevor
|
|
IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
// enemy vehicles - chase
|
|
CASE 009 // first bad guy boats - centre
|
|
CASE 016 // first bad guy boats - left
|
|
//CASE 017 // first bad guy boats - right
|
|
CASE 022 // second bad guy boats - right
|
|
//CASE 023 // second bad guy boats - right
|
|
//CASE 018 // third bad guy boats - left
|
|
//CASE 019 // third bad guy boats - right
|
|
CASE 020 // chopper
|
|
CASE 012 // flee boat 1
|
|
CASE 013 // flee boat 2
|
|
IF reqStage = STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// add a request for a model
|
|
PROC ADD_RECORDING_REQUEST(INT iRec)
|
|
bVehicleRecordingRequestTracker[iRec-1] = TRUE
|
|
REQUEST_VEHICLE_RECORDING(iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
ENDPROC
|
|
|
|
// clear a recording request slot
|
|
PROC CLEAR_RECORDING_REQUEST(INT iRec)
|
|
IF bVehicleRecordingRequestTracker[iRec-1]
|
|
bVehicleRecordingRequestTracker[iRec-1] = FALSE
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
REMOVE_VEHICLE_RECORDING(iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// have all requests for models succeeded?
|
|
FUNC BOOL HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()
|
|
INT i
|
|
|
|
// loop through and check for empty
|
|
REPEAT NUMBER_RECORDING_REQUEST_SLOTS i
|
|
IF bVehicleRecordingRequestTracker[i]
|
|
IF NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(i+1, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
// a full slot is not loaded, return false
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
// get recordings for particular stage
|
|
PROC REQUEST_VEHICLE_RECORDINGS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepRecordingsForCurrentStage)
|
|
|
|
INT i
|
|
REPEAT NUMBER_RECORDING_REQUEST_SLOTS i
|
|
IF IS_RECORDING_REQUIRED_FOR_MISSION_STAGE(i+1, requestStage)
|
|
// if we need this recording, request it
|
|
ADD_RECORDING_REQUEST(i+1)
|
|
ELSE
|
|
// otherwise try and get rid of it
|
|
IF NOT IS_RECORDING_REQUIRED_FOR_MISSION_STAGE(i+1, currentMissionStage)
|
|
OR NOT bKeepRecordingsForCurrentStage
|
|
CLEAR_RECORDING_REQUEST(i+1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// if wait for load, don't quit out 'til all the recordings are in
|
|
IF bWaitForLoad
|
|
IF NOT HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// is this waypoint required on this stage?
|
|
FUNC BOOL IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(INT iWaypoint, MISSION_STAGE_ENUM reqStage)
|
|
SWITCH iWaypoint + 1
|
|
CASE 1 // player escape
|
|
CASE 2 // 1 centre
|
|
CASE 3 // 1 left
|
|
CASE 4 // car
|
|
//CASE 8 // 2 left
|
|
//CASE 9 // 2 right
|
|
//CASE 6 // 3 right
|
|
//CASE 7 // 4 centre
|
|
IF reqStage = STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6 // l hand circle
|
|
CASE 7 // middle circle
|
|
CASE 8 // r hand circle
|
|
IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
|
|
CASE 5 // drive to beach
|
|
IF reqStage >= STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC TEXT_LABEL GET_WAYPOINT_LABEL_FROM_INT(INT iWaypoint)
|
|
TEXT_LABEL tWaypoint = "exile3"
|
|
tWaypoint += (iWaypoint+1)
|
|
RETURN tWaypoint
|
|
ENDFUNC
|
|
|
|
// add a request for a waypoint
|
|
PROC ADD_WAYPOINT_REQUEST(INT iWaypoint)
|
|
bWaypointRequestTracker[iWaypoint] = TRUE
|
|
TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(iWaypoint)
|
|
REQUEST_WAYPOINT_RECORDING(tWaypoint)
|
|
ENDPROC
|
|
|
|
// clear a waypoint request slot
|
|
PROC CLEAR_WAYPOINT_REQUEST(INT iWaypoint)
|
|
IF bWaypointRequestTracker[iWaypoint]
|
|
bWaypointRequestTracker[iWaypoint] = FALSE
|
|
TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(iWaypoint)
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(tWaypoint) = FALSE
|
|
REMOVE_WAYPOINT_RECORDING(tWaypoint)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// have all requests for waypoints succeeded?
|
|
FUNC BOOL HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED()
|
|
INT i
|
|
|
|
// loop through and check for empty
|
|
REPEAT NUMBER_WAYPOINT_REQUEST_SLOTS i
|
|
IF bWaypointRequestTracker[i]
|
|
TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(i)
|
|
IF NOT GET_IS_WAYPOINT_RECORDING_LOADED(tWaypoint)
|
|
// a full slot is not loaded, return false
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
// get recordings for particular stage
|
|
PROC REQUEST_WAYPOINT_RECORDINGS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepWaypointsForCurrentStage)
|
|
INT i
|
|
REPEAT NUMBER_WAYPOINT_REQUEST_SLOTS i
|
|
IF IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(i, requestStage)
|
|
// if we need this waypoint, request it
|
|
ADD_WAYPOINT_REQUEST(i)
|
|
ELSE
|
|
// otherwise try and get rid of it
|
|
IF NOT IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(i, currentMissionStage)
|
|
OR NOT bKeepWaypointsForCurrentStage
|
|
CLEAR_WAYPOINT_REQUEST(i)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// if wait for load, don't quit out 'til all the waypoints are in
|
|
IF bWaitForLoad
|
|
IF NOT HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED()
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// get an anim dict enum as string
|
|
FUNC STRING GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TRAIN_CRASH_ANIM_DICT_ENUM animDict)
|
|
SWITCH animDict
|
|
CASE TC_ANIM_DICT_MISSION
|
|
RETURN "MISSTRCRASH"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_TRAIN
|
|
RETURN "MISSEXILE3"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_BIKE_LAND
|
|
RETURN "MISSEXILE3@TRAIN_"
|
|
BREAK
|
|
//CASE TC_ANIM_DICT_RAPPEL
|
|
// RETURN GET_RAPPEL_ANIM_DICT_NAME()
|
|
//BREAK
|
|
CASE TC_ANIM_DICT_RPG
|
|
RETURN "MISSEXILE3_RPG"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_DOORS
|
|
RETURN "p_cs1_14b_train_s_break"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_TREVOR_IDLE_ENTER
|
|
RETURN "missexile3@trevor_idle@enter"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_TREVOR_IDLE_BASE
|
|
RETURN "missexile3@trevor_idle@base"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_TREVOR_IDLE_VAR
|
|
RETURN "missexile3@trevor_idle@idle_a"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_TREVOR_IDLE_EXIT
|
|
RETURN "missexile3@trevor_idle@exit"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_CRASH
|
|
RETURN "MISSEXILE3@TRAINCRASH"
|
|
BREAK
|
|
CASE TC_ANIM_DICT_SWITCH
|
|
RETURN "MISSEXILE3SWITCH"
|
|
BREAK
|
|
|
|
//CASE TC_ANIM_DICT_GESTURE_ENT
|
|
// RETURN "amb@standwatch@shocked@male@enter"
|
|
//BREAK
|
|
//CASE TC_ANIM_DICT_GESTURES
|
|
// RETURN "amb@standwatch@shocked@male@idle_b"
|
|
//BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "invalid!"
|
|
ENDFUNC
|
|
|
|
// is this anim dict required on this stage?
|
|
FUNC BOOL IS_ANIM_DICT_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_ANIM_DICT_ENUM animDict, MISSION_STAGE_ENUM reqStage)
|
|
SWITCH animDict
|
|
CASE TC_ANIM_DICT_MISSION
|
|
IF (reqStage >= STAGE_DRIVE_ALONG_TRAIN
|
|
AND reqStage <= STAGE_GET_TO_BRIDGE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_ANIM_DICT_TRAIN
|
|
IF reqStage >= STAGE_DRIVE_ALONG_TRAIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_ANIM_DICT_BIKE_LAND
|
|
IF reqStage = STAGE_DRIVE_ALONG_TRAIN
|
|
OR reqStage = STAGE_GET_TO_BRIDGE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
//CASE TC_ANIM_DICT_RAPPEL
|
|
// IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
// RETURN TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
//CASE TC_ANIM_DICT_GESTURES
|
|
//CASE TC_ANIM_DICT_GESTURE_ENT
|
|
// IF reqStage = STAGE_GET_TO_BRIDGE
|
|
// RETURN TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
CASE TC_ANIM_DICT_RPG
|
|
IF reqStage >= STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_ANIM_DICT_DOORS
|
|
IF reqStage >= STAGE_GO_TO_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_ANIM_DICT_TREVOR_IDLE_ENTER
|
|
CASE TC_ANIM_DICT_TREVOR_IDLE_EXIT
|
|
CASE TC_ANIM_DICT_TREVOR_IDLE_BASE
|
|
CASE TC_ANIM_DICT_TREVOR_IDLE_VAR
|
|
CASE TC_ANIM_DICT_SWITCH
|
|
IF reqStage = STAGE_GO_TO_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_ANIM_DICT_CRASH
|
|
IF reqStage = STAGE_GET_TO_BRIDGE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// add a request for an anim
|
|
PROC ADD_ANIM_DICT_REQUEST(TRAIN_CRASH_ANIM_DICT_ENUM animDict)
|
|
bAnimDictRequestTracker[animDict] = TRUE
|
|
STRING sAnimDict = GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(animDict)
|
|
REQUEST_ANIM_DICT(sAnimDict)
|
|
ENDPROC
|
|
|
|
// clear an anim request slot
|
|
PROC CLEAR_ANIM_DICT_REQUEST(TRAIN_CRASH_ANIM_DICT_ENUM animDict)
|
|
IF bAnimDictRequestTracker[animDict]
|
|
bAnimDictRequestTracker[animDict] = FALSE
|
|
STRING sAnimDict = GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(animDict)
|
|
IF HAS_ANIM_DICT_LOADED(sAnimDict)
|
|
REMOVE_ANIM_DICT(sAnimDict)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// have all requests for anims succeeded?
|
|
FUNC BOOL HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
|
|
INT i
|
|
|
|
// loop through and check for empty
|
|
REPEAT COUNT_OF(TRAIN_CRASH_ANIM_DICT_ENUM) i
|
|
IF bAnimDictRequestTracker[i]
|
|
IF NOT HAS_ANIM_DICT_LOADED(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(INT_TO_ENUM(TRAIN_CRASH_ANIM_DICT_ENUM, i)))
|
|
// a full slot is not loaded, return false
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
// get anims for particular stage
|
|
PROC REQUEST_ANIM_DICTS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepAnimsForCurrentStage)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(TRAIN_CRASH_ANIM_DICT_ENUM) i
|
|
TRAIN_CRASH_ANIM_DICT_ENUM thisAnimDict = INT_TO_ENUM(TRAIN_CRASH_ANIM_DICT_ENUM, i)
|
|
|
|
IF IS_ANIM_DICT_REQUIRED_FOR_MISSION_STAGE(thisAnimDict, requestStage)
|
|
// if we need this recording, request it
|
|
ADD_ANIM_DICT_REQUEST(thisAnimDict)
|
|
ELSE
|
|
// otherwise try and get rid of it
|
|
IF NOT IS_ANIM_DICT_REQUIRED_FOR_MISSION_STAGE(thisAnimDict, currentMissionStage)
|
|
OR NOT bKeepAnimsForCurrentStage
|
|
CLEAR_ANIM_DICT_REQUEST(thisAnimDict)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// if wait for load, don't quit out 'til all the recordings are in
|
|
IF bWaitForLoad
|
|
IF NOT HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// is this weapon required on this stage?
|
|
FUNC BOOL IS_WEAPON_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_WEAPON_ENUM weapon, MISSION_STAGE_ENUM reqStage)
|
|
SWITCH weapon
|
|
CASE TC_WEAPON_STICKY_BOMB
|
|
IF reqStage = STAGE_GO_TO_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_WEAPON_SHOTGUN
|
|
//IF reqStage = STAGE_DRIVE_ALONG_TRAIN
|
|
// RETURN TRUE
|
|
//ENDIF
|
|
BREAK
|
|
CASE TC_WEAPON_SMG
|
|
IF reqStage >= STAGE_GO_TO_CONTAINER
|
|
AND reqStage < STAGE_GET_HOME
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_WEAPON_PISTOL
|
|
IF reqStage = STAGE_RAPIDS_CHASE
|
|
OR reqStage = STAGE_DRIVE_ALONG_TRAIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_WEAPON_MERC_RIFLE
|
|
IF (reqStage >= STAGE_GO_TO_CONTAINER
|
|
AND reqStage < STAGE_GET_HOME)
|
|
OR reqStage = STAGE_DRIVE_ALONG_TRAIN
|
|
OR reqStage = STAGE_GET_TO_BRIDGE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_WEAPON_MG
|
|
IF reqStage = STAGE_RAPIDS_CHASE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_WEAPON_SNIPER_RIFLE
|
|
IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_WEAPON_BACKUP_RIFLE
|
|
IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
OR reqStage = STAGE_GO_TO_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TC_WEAPON_CASE
|
|
IF reqStage = STAGE_GET_HOME
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// add a request for a weapon
|
|
PROC ADD_WEAPON_REQUEST(TRAIN_CRASH_WEAPON_ENUM weapon)
|
|
bWeaponRequestTracker[weapon] = TRUE
|
|
WEAPON_TYPE weaponType = GET_TRAIN_CRASH_WEAPON_TYPE(weapon)
|
|
REQUEST_WEAPON_ASSET(weaponType)
|
|
ENDPROC
|
|
|
|
// clear a weapon request slot
|
|
PROC CLEAR_WEAPON_REQUEST(TRAIN_CRASH_WEAPON_ENUM weapon)
|
|
IF bWeaponRequestTracker[weapon]
|
|
bWeaponRequestTracker[weapon] = FALSE
|
|
WEAPON_TYPE weaponType = GET_TRAIN_CRASH_WEAPON_TYPE(weapon)
|
|
IF HAS_WEAPON_ASSET_LOADED(weaponType)
|
|
REMOVE_WEAPON_ASSET(weaponType)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// have all requests for weapons succeeded?
|
|
FUNC BOOL HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED()
|
|
INT i
|
|
|
|
// loop through and check for empty
|
|
REPEAT COUNT_OF(TRAIN_CRASH_WEAPON_ENUM) i
|
|
IF bWeaponRequestTracker[i]
|
|
IF NOT HAS_WEAPON_ASSET_LOADED(GET_TRAIN_CRASH_WEAPON_TYPE(INT_TO_ENUM(TRAIN_CRASH_WEAPON_ENUM, i)))
|
|
// a full slot is not loaded, return false
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
// get weapons for particular stage
|
|
PROC REQUEST_WEAPONS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepWeaponsForCurrentStage)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(TRAIN_CRASH_WEAPON_ENUM) i
|
|
TRAIN_CRASH_WEAPON_ENUM thisWeapon = INT_TO_ENUM(TRAIN_CRASH_WEAPON_ENUM, i)
|
|
|
|
IF IS_WEAPON_REQUIRED_FOR_MISSION_STAGE(thisWeapon, requestStage)
|
|
// if we need this recording, request it
|
|
ADD_WEAPON_REQUEST(thisWeapon)
|
|
ELSE
|
|
// otherwise try and get rid of it
|
|
IF NOT IS_WEAPON_REQUIRED_FOR_MISSION_STAGE(thisWeapon, currentMissionStage)
|
|
OR NOT bKeepWeaponsForCurrentStage
|
|
CLEAR_WEAPON_REQUEST(thisWeapon)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
// if wait for load, don't quit out 'til all the recordings are in
|
|
IF bWaitForLoad
|
|
IF NOT HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED()
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/*
|
|
// get a ptfx enum as string
|
|
FUNC STRING GET_TRAIN_CRASH_PTFX_AS_STRING(TRAIN_CRASH_PTFX_ENUM ptfx)
|
|
SWITCH ptfx
|
|
CASE TC_PTFX_SCRIPT
|
|
RETURN "script"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "invalid!"
|
|
ENDFUNC
|
|
*/
|
|
|
|
// is this ptfx required on this stage?
|
|
FUNC BOOL IS_PTFX_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_PTFX_ENUM ptfx, MISSION_STAGE_ENUM reqStage)
|
|
SWITCH ptfx
|
|
CASE TC_PTFX_SCRIPT
|
|
IF reqStage >= STAGE_GO_TO_CONTAINER
|
|
AND reqStage < STAGE_GET_HOME
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// add a request for a ptfx
|
|
PROC ADD_PTFX_REQUEST(TRAIN_CRASH_PTFX_ENUM ptfx)
|
|
bPTFXRequestTracker[ptfx] = TRUE
|
|
// STRING sPTFX = GET_TRAIN_CRASH_PTFX_AS_STRING(ptfx)
|
|
REQUEST_PTFX_ASSET()
|
|
ENDPROC
|
|
|
|
// clear a ptfx request slot
|
|
PROC CLEAR_PTFX_REQUEST(TRAIN_CRASH_PTFX_ENUM ptfx)
|
|
IF bPTFXRequestTracker[ptfx]
|
|
bPTFXRequestTracker[ptfx] = FALSE
|
|
// STRING sPTFX = GET_TRAIN_CRASH_PTFX_AS_STRING(ptfx)
|
|
IF HAS_PTFX_ASSET_LOADED()
|
|
REMOVE_PTFX_ASSET()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// have all requests for ptfx succeeded?
|
|
FUNC BOOL HAVE_ALL_PTFX_REQUESTS_SUCCEEDED()
|
|
INT i
|
|
|
|
// loop through and check for empty
|
|
REPEAT COUNT_OF(TRAIN_CRASH_PTFX_ENUM) i
|
|
IF bPTFXRequestTracker[i]
|
|
IF NOT HAS_PTFX_ASSET_LOADED()
|
|
// a full slot is not loaded, return false
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
// get ptfx for particular stage
|
|
PROC REQUEST_PTFX_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepPTFXForCurrentStage)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(TRAIN_CRASH_PTFX_ENUM) i
|
|
TRAIN_CRASH_PTFX_ENUM thisPTFX = INT_TO_ENUM(TRAIN_CRASH_PTFX_ENUM, i)
|
|
|
|
IF IS_PTFX_REQUIRED_FOR_MISSION_STAGE(thisPTFX, requestStage)
|
|
// if we need this recording, request it
|
|
ADD_PTFX_REQUEST(thisPTFX)
|
|
ELSE
|
|
// otherwise try and get rid of it
|
|
IF NOT IS_PTFX_REQUIRED_FOR_MISSION_STAGE(thisPTFX, currentMissionStage)
|
|
OR NOT bKeepPTFXForCurrentStage
|
|
CLEAR_PTFX_REQUEST(thisPTFX)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
// if wait for load, don't quit out 'til all the recordings are in
|
|
IF bWaitForLoad
|
|
IF NOT HAVE_ALL_PTFX_REQUESTS_SUCCEEDED()
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_PTFX_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// get a sfx enum as string
|
|
FUNC STRING GET_TRAIN_CRASH_SFX_AS_STRING(TRAIN_CRASH_SFX_ENUM sfx)
|
|
SWITCH sfx
|
|
CASE TC_SFX_TRAIN_FALL
|
|
RETURN "EXILE_3_TRAIN_FALL"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "invalid!"
|
|
ENDFUNC
|
|
|
|
// is this sfx required on this stage?
|
|
FUNC BOOL IS_SFX_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_SFX_ENUM sfx, MISSION_STAGE_ENUM reqStage)
|
|
SWITCH sfx
|
|
CASE TC_SFX_TRAIN_FALL
|
|
IF reqStage = STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// add a request for a sfx
|
|
PROC ADD_SFX_REQUEST(TRAIN_CRASH_SFX_ENUM sfx)
|
|
bSFXRequestTracker[sfx] = TRUE
|
|
STRING sSFX = GET_TRAIN_CRASH_SFX_AS_STRING(sfx)
|
|
REQUEST_SCRIPT_AUDIO_BANK(sSFX)
|
|
ENDPROC
|
|
|
|
// clear a sfx request slot
|
|
PROC CLEAR_SFX_REQUEST(TRAIN_CRASH_SFX_ENUM sfx)
|
|
IF bSFXRequestTracker[sfx]
|
|
bSFXRequestTracker[sfx] = FALSE
|
|
STRING sSFX = GET_TRAIN_CRASH_SFX_AS_STRING(sfx)
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK(sSFX)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// have all requests for sfx succeeded?
|
|
FUNC BOOL HAVE_ALL_SFX_REQUESTS_SUCCEEDED()
|
|
INT i
|
|
|
|
// loop through and check for empty
|
|
REPEAT COUNT_OF(TRAIN_CRASH_SFX_ENUM) i
|
|
IF bSFXRequestTracker[i]
|
|
IF NOT REQUEST_SCRIPT_AUDIO_BANK(GET_TRAIN_CRASH_SFX_AS_STRING(INT_TO_ENUM(TRAIN_CRASH_SFX_ENUM, i)))
|
|
// a full slot is not loaded, return false
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
// get sfx for particular stage
|
|
PROC REQUEST_SFX_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepSFXForCurrentStage)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(TRAIN_CRASH_SFX_ENUM) i
|
|
TRAIN_CRASH_SFX_ENUM thisSFX = INT_TO_ENUM(TRAIN_CRASH_SFX_ENUM, i)
|
|
|
|
IF IS_SFX_REQUIRED_FOR_MISSION_STAGE(thisSFX, requestStage)
|
|
// if we need this recording, request it
|
|
ADD_SFX_REQUEST(thisSFX)
|
|
ELSE
|
|
// otherwise try and get rid of it
|
|
IF NOT IS_SFX_REQUIRED_FOR_MISSION_STAGE(thisSFX, currentMissionStage)
|
|
OR NOT bKeepSFXForCurrentStage
|
|
CLEAR_SFX_REQUEST(thisSFX)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// if wait for load, don't quit out 'til all the recordings are in
|
|
IF bWaitForLoad
|
|
IF NOT HAVE_ALL_SFX_REQUESTS_SUCCEEDED()
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_SFX_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// is this misc asset required on this stage?
|
|
FUNC BOOL IS_MISC_ASSET_REQUIRED_FOR_MISSION_STAGE(TRAIN_CRASH_MISC_ASSET_ENUM miscAsset, MISSION_STAGE_ENUM reqStage)
|
|
SWITCH miscAsset
|
|
CASE TC_MISC_ASSET_DINGHY_ANIMS
|
|
IF reqStage >= STAGE_GET_TO_BRIDGE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
//CASE TC_MISC_ASSET_TOWN_PATHS
|
|
// IF reqStage = STAGE_INTERCEPT_TRAIN
|
|
// RETURN TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
//CASE TC_MISC_ASSET_BRIEFCASE_CLIPSET
|
|
// IF reqStage = STAGE_GET_HOME
|
|
// RETURN TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// add a request for a misc asset
|
|
PROC ADD_MISC_ASSET_REQUEST(TRAIN_CRASH_MISC_ASSET_ENUM miscAsset)
|
|
bMiscAssetRequestTracker[miscAsset] = TRUE
|
|
|
|
SWITCH miscAsset
|
|
CASE TC_MISC_ASSET_DINGHY_ANIMS
|
|
REQUEST_VEHICLE_ASSET(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DINGHY))
|
|
BREAK
|
|
//CASE TC_MISC_ASSET_BRIEFCASE_CLIPSET
|
|
// REQUEST_CLIP_SET("move_m@briefcase")
|
|
//BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// clear a misc asset slot
|
|
PROC CLEAR_MISC_ASSET_REQUEST(TRAIN_CRASH_MISC_ASSET_ENUM miscAsset)
|
|
IF bMiscAssetRequestTracker[miscAsset]
|
|
bMiscAssetRequestTracker[miscAsset] = FALSE
|
|
SWITCH miscAsset
|
|
CASE TC_MISC_ASSET_DINGHY_ANIMS
|
|
REMOVE_VEHICLE_ASSET(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DINGHY))
|
|
BREAK
|
|
//CASE TC_MISC_ASSET_BRIEFCASE_CLIPSET
|
|
// REMOVE_CLIP_SET("move_m@briefcase")
|
|
//BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// have all requests for misc assets succeeded?
|
|
FUNC BOOL HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED()
|
|
INT i
|
|
|
|
// loop through and check for empty
|
|
REPEAT COUNT_OF(TRAIN_CRASH_MISC_ASSET_ENUM) i
|
|
IF bMiscAssetRequestTracker[i]
|
|
SWITCH INT_TO_ENUM(TRAIN_CRASH_MISC_ASSET_ENUM, i)
|
|
CASE TC_MISC_ASSET_DINGHY_ANIMS
|
|
IF NOT HAS_VEHICLE_ASSET_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DINGHY))
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
//CASE TC_MISC_ASSET_TOWN_PATHS
|
|
/// IF NOT ARE_NODES_LOADED_FOR_AREA(TOWN_PATHS_MIN_X, TOWN_PATHS_MIN_Y, TOWN_PATHS_MAX_X, TOWN_PATHS_MAX_Y)
|
|
// RETURN FALSE
|
|
// ENDIF
|
|
//BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
// get misc assets for particular stage
|
|
PROC REQUEST_MISC_ASSETS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepMiscAssetsForCurrentStage)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(TRAIN_CRASH_MISC_ASSET_ENUM) i
|
|
TRAIN_CRASH_MISC_ASSET_ENUM thisMiscAsset = INT_TO_ENUM(TRAIN_CRASH_MISC_ASSET_ENUM, i)
|
|
|
|
IF IS_MISC_ASSET_REQUIRED_FOR_MISSION_STAGE(thisMiscAsset, requestStage)
|
|
// if we need this asset, request it
|
|
ADD_MISC_ASSET_REQUEST(thisMiscAsset)
|
|
ELSE
|
|
// otherwise try and get rid of it
|
|
IF NOT IS_MISC_ASSET_REQUIRED_FOR_MISSION_STAGE(thisMiscAsset, currentMissionStage)
|
|
OR NOT bKeepMiscAssetsForCurrentStage
|
|
CLEAR_MISC_ASSET_REQUEST(thisMiscAsset)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// if wait for load, don't quit out 'til all the recordings are in
|
|
IF bWaitForLoad
|
|
IF NOT HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED()
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// request the text for the mission
|
|
PROC REQUEST_TEXT(BOOL bWaitForLoad)
|
|
REQUEST_ADDITIONAL_TEXT("TCRASH", MISSION_TEXT_SLOT)
|
|
IF bWaitForLoad
|
|
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set all common variables to what they should be when a new stage starts
|
|
PROC RESET_ALL_COMMON_VARIABLES()
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
streamingStage = MISSION_STREAMING_STAGE_REQUEST
|
|
cutsceneStage = TC_CUT_STAGE_INIT
|
|
bRunningCutscene = FALSE
|
|
bSkippedCutscene = FALSE
|
|
bClearedForCutscene = FALSE
|
|
bCutsceneWaitStarted = FALSE
|
|
bShownGodText = FALSE
|
|
bDoneGotoSpeech = FALSE
|
|
bShouldDoGetInText = FALSE
|
|
bSavedBanter = FALSE
|
|
bWaitForBuddyPrompt = FALSE
|
|
bGetBuddyPrompt = FALSE
|
|
bForceIntoDinghy = FALSE
|
|
bSuccessfullyForcedIntoDinghy = FALSE
|
|
bSuppressRemoveTrevorMG = FALSE
|
|
iNextRandomSpeechTime = -1
|
|
ENDPROC
|
|
|
|
// get all variables in the correct state for this stage
|
|
PROC RESET_VARIABLES_FOR_STAGE(MISSION_STAGE_ENUM resetStage)
|
|
RESET_ALL_COMMON_VARIABLES()
|
|
INT i
|
|
|
|
SWITCH resetStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
createTrainStage = CREATE_TRAIN_STAGE_NOT_STARTED
|
|
createEngineerStage = CREATE_ENGINEER_STAGE_NOT_STARTED
|
|
trainMovementState = TRAIN_MOVEMENT_STOPPED
|
|
bDoneMichaelNoFollowPrompt = FALSE
|
|
bDoneTrainBanter = FALSE
|
|
bTrainIsPastSilos = FALSE
|
|
bDoneMissionStartCue = FALSE
|
|
bDoneSeeTrainSpeech = FALSE
|
|
bPreparedSeeTrainCue = FALSE
|
|
bDoneBikeStartAudioScene = FALSE
|
|
bDoneSeeTrainAudioScene = FALSE
|
|
bDoneMichaelGoOnFoot = FALSE
|
|
bMichaelWasInVehicle = FALSE
|
|
bRemovedMichael = FALSE
|
|
bDeletedRonAndPatricia = FALSE
|
|
iTrainMovementStartTime = -1
|
|
iGetInTextStage = 0
|
|
iMichaelDriveCarStage = 0
|
|
iInterceptTrainTime = GET_GAME_TIMER()
|
|
fTrainOnScreenTime = 0.0
|
|
fSeeTrainSpeechTime = 0.0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
bDebugWarpToJumps = FALSE
|
|
#ENDIF
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
trainMovementState = TRAIN_MOVEMENT_FAST
|
|
|
|
bSlowDownTrainForCatchup = FALSE
|
|
bObjectiveIsJump = FALSE
|
|
bShownJumpPrompt = FALSE
|
|
bShownPathHelp = FALSE
|
|
bDoPathHelp = FALSE
|
|
bDoneJumpSpeech = FALSE
|
|
bDoneGetBombsSpeech = FALSE
|
|
bTempSuppressVehicleSpawning = FALSE
|
|
bTempPreventStillVehicleState = FALSE
|
|
bDoneBikeJumpAudioScene = FALSE
|
|
iCurrentJump = -1
|
|
fPlayerIsOnTrainTimer = 0.0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
bDebugWarpToJumps = FALSE
|
|
#ENDIF
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
jackingTrainShot = JACKING_TRAIN_OFF_BIKE
|
|
|
|
trainRideState = TRAIN_RIDE_STATE_LOW
|
|
createMercPickupStage = CREATE_MERC_PICKUP_STAGE_NOT_STARTED
|
|
bDoneEnterCabSpeech = FALSE
|
|
bDetachedBike = FALSE
|
|
bTempPreventStillVehicleState = FALSE
|
|
bLoadedHitDriverAudio = FALSE
|
|
bSetSceneAudioEntity = FALSE
|
|
//iFightStage = 0
|
|
//iBashedDriverCount = 0
|
|
//iBashSpeechStage = 0
|
|
iGetInTextStage = 2
|
|
|
|
REPEAT NUMBER_CLIMB_ENEMIES i
|
|
climbEnemy[i].state = CLIMB_ENEMY_STATE_NOT_CREATED
|
|
climbEnemy[i].bDoneSpeech = FALSE
|
|
ENDREPEAT
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
RESET_PUSH_IN(pushInData)
|
|
trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
|
|
trainRideState = TRAIN_RIDE_STATE_LOW
|
|
trainCrashShot = TRAIN_CRASH_RAYFIRE
|
|
gotoFoamState = GOTO_FOAM_STATE_NOT_STARTED
|
|
swapCarriageState = SWAP_CARRIAGE_STATE_NOT_STARTED
|
|
//fTrainClearBridgeMod = 0.0
|
|
//bPreStreamingSeamlessCutscene = FALSE
|
|
bShownJumpPrompt = FALSE
|
|
bDoneRidingTrainSpeech = FALSE
|
|
bDoneRidingTrainSpeech2 = FALSE
|
|
bDoneAlmostThereSpeech = FALSE
|
|
//bDoneSeeTrainSpeech = FALSE
|
|
bShownSwitchPrompt = FALSE
|
|
bStartedPlaybackDinghy = FALSE
|
|
bStoppedPlaybackDinghy = FALSE
|
|
bArrivedAtBridge = FALSE
|
|
bSelectorLocked = FALSE
|
|
bSetToJump = FALSE
|
|
bCreatedCrashTrain = FALSE
|
|
bDoneForceDinghyStop = FALSE
|
|
//bSetTrainLocationForCrash = FALSE
|
|
//bRepositionedMichaelAtAnchor = FALSE
|
|
bCreatedCrashTrain = FALSE
|
|
bDoingRideIdle1 = FALSE
|
|
bCamHighEnoughToFreezeTrain = FALSE
|
|
//bChangedToLadderCam = FALSE
|
|
//bDoneLookForTrainSpeech = FALSE
|
|
//bGettingReadySpeech = FALSE
|
|
bDoneJumpOff = FALSE
|
|
bDoneJumpSpeech = FALSE
|
|
bStopTrain = FALSE
|
|
bRemovedMercPickup = FALSE
|
|
bDoneMercAngeredAnims = FALSE
|
|
bDoneMercsRun = FALSE
|
|
bDoneTrevorTauntMercsSpeech = FALSE
|
|
//bExplodedTrackMercs = FALSE
|
|
//bDoneTrackMercsShoot = FALSE
|
|
bDoneGoingToCrashSpeech = FALSE
|
|
bLoadedCrashStream = FALSE
|
|
bPreparedSwapToMichaelCue = FALSE
|
|
bDoneSwapToMichaelCue = FALSE
|
|
bPreparedSideOnCue = FALSE
|
|
//bPreparedCollisionCue = FALSE
|
|
bDoneCollisionCue = FALSE
|
|
//bPreparedHitWaterCue = FALSE
|
|
bDoneHitWaterCue = FALSE
|
|
bTrevorPutAwayGun = FALSE
|
|
bDoneTrainAccelerationAudioScene = FALSE
|
|
bDoneTrainDecelerationAudioScene = FALSE
|
|
bDoneBrakePressSound = FALSE
|
|
bDoneBrakeReleaseSound = TRUE
|
|
bCreatedTrucks = FALSE
|
|
bDoneCamShake = FALSE
|
|
bSlowedDown = FALSE
|
|
bSpedUp = FALSE
|
|
bStartedDebrisFX = FALSE
|
|
bStartedIPLSwap = FALSE
|
|
//bDoneEncourageOpenSpeech = FALSE
|
|
|
|
iCreateTruckFrame = 0
|
|
iGetInTextStage = 2
|
|
iBeenAtBridgeTime = -1
|
|
iBridgeSmashStage = 0
|
|
fRepositionBoatTime = 0//3000
|
|
fTrainSpeedMod = 0.5
|
|
fTrainTooLowSpeedTime = 0.0
|
|
fTrainAccelerationTime = 0.0
|
|
fTrainDecelerationTime = 0.0
|
|
fWaterOverride = 0.25
|
|
fRayfireEvolution = 0.0
|
|
|
|
REPEAT NUMBER_SPLASHES i
|
|
bAddedSplash[i] = FALSE
|
|
ENDREPEAT
|
|
#IF IS_DEBUG_BUILD
|
|
bDebugWarpedTrainToBridge = FALSE
|
|
#ENDIF
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
RESET_PUSH_IN(pushInData)
|
|
trevorIdleState = TREVOR_IDLE_STATE_NOT_STARTED
|
|
bShownBombHelp = FALSE
|
|
bDoneSwitchToBombHelp = FALSE
|
|
bFoundBomb = FALSE
|
|
bForceDoorsOpen = FALSE
|
|
// bAtSafeDistance = FALSE
|
|
bShownSwitchPrompt = FALSE
|
|
bExplodedDoors = FALSE
|
|
bSwappedToTrevor = FALSE
|
|
bRepositionedDinghy = FALSE
|
|
//bPreparedSwapToTrevorCue = FALSE
|
|
bDoneSwapToTrevorCue = FALSE
|
|
bPreparedEnemiesArriveCue = FALSE
|
|
bDoneEnemiesArriveCue = FALSE
|
|
bDoneHurrySpeech = FALSE
|
|
//bDoneEnterCover = FALSE
|
|
// bShownCoverPrompt = FALSE
|
|
bDoneEncourageOpenSpeech = FALSE
|
|
bDoneFirstHurryUpSpeech = FALSE
|
|
bDoneThrowBombSpeech = FALSE
|
|
bDoneFindLootSpeech = FALSE
|
|
bDoneMichaelSearchSpeech = FALSE
|
|
bDoMerryweatherMassacre = FALSE
|
|
bCreatedMerryweatherMassacre = FALSE
|
|
bTrevorEquippedWeapon = FALSE
|
|
bDoneFoundUsSpeech = FALSE
|
|
bThermalOn = FALSE
|
|
bThermalSwitchedOn = FALSE
|
|
bRemovedStreamVol = FALSE
|
|
bTurnOffUnderwaterDialogue = FALSE
|
|
bRestoredControl = FALSE
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_FIRST_WAVE] = FALSE
|
|
bSwappedDoors = FALSE
|
|
bDonePushIn = FALSE
|
|
bHitSound = FALSE
|
|
bWooshStarted = FALSE
|
|
|
|
iNoBombsTime = -1
|
|
iGetInTextStage = 2
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
//crashHotswapState = CRASH_HOTSWAP_ON_TREVOR
|
|
boatRPGState = BOAT_RPG_NOT_STARTED
|
|
boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
|
|
michaelTrevorArgueStage = MT_ARGUE_WAIT
|
|
iNextArgueTime = GET_GAME_TIMER() + 12000
|
|
REPEAT COUNT_OF(bTriggeredEnemyWave) i
|
|
bEnemyWaveState[i] = FALSE
|
|
bTriggeredEnemyWave[i] = FALSE
|
|
ENDREPEAT
|
|
|
|
// REPEAT NUMBER_RAPPEL_ENEMIES i
|
|
// enemyRappelData[i].rappelState = ENEMY_RAPPEL_STATE_CLAMBERING
|
|
// ENDREPEAT
|
|
bMichaelSearching = FALSE
|
|
bShownSwitchPrompt = FALSE
|
|
bDoneFoundItem = FALSE
|
|
bDoneTrevorRespondSpeech = FALSE
|
|
bSetupMichaelForShootout = FALSE
|
|
bMichaelInDinghy = FALSE
|
|
bMichaelAnchoredDinghy = FALSE
|
|
bMichaelStopForTrevorSwimming = FALSE
|
|
bSkippedWaterfallCutaway = FALSE
|
|
bDoneDropOnBridgeSpeech = FALSE
|
|
bDoneUseThermalSpeech = FALSE
|
|
bDoChopperSpinOut = FALSE
|
|
bDoneHeliOnMichaelSpeech = FALSE
|
|
bDoneFoundUsSpeech = FALSE
|
|
bDoneCarriageFall = FALSE
|
|
bDoneCarriageExplosion = FALSE
|
|
bDoneCarriageSplash = false
|
|
bDoneImmediateGetInSpeech = FALSE
|
|
bStoppedDefendMichaelAudioScene = FALSE
|
|
bDoneWaterfallCutaway = FALSE
|
|
bReadyToEscape = FALSE
|
|
bPreparedRapidsStartCue = FALSE
|
|
bDoneRapidsStartCue = FALSE
|
|
bDoLastBoatCircle = FALSE
|
|
bUppedAccuracyForCircle = FALSE
|
|
bDoMerryweatherMassacre = FALSE
|
|
bIncreasedBoatAccuracy = FALSE
|
|
bDoneBoatHitWaterSound = FALSE
|
|
bDidntPullAwayFromContainer = FALSE
|
|
bLateAimAtRapids = FALSE
|
|
bDoneSniperHelp1 = FALSE
|
|
bDoneSniperHelp2 = FALSE
|
|
bShouldDoSniperHelp = FALSE
|
|
bGotFirstSniperSpeech = FALSE
|
|
bDoneKilledSnipersSpeech = FALSE
|
|
bDoneSeenParachutesSpeech = FALSE
|
|
bDoneParachute1 = FALSE
|
|
bDoneParachute2 = FALSE
|
|
bStoppingDinghy = FALSE
|
|
bDoneWaterTrail[0] = FALSE
|
|
bDoneWaterTrail[1] = FALSE
|
|
bDoneWaterTrail[2] = FALSE
|
|
bSetTrevorHelmet = FALSE
|
|
bDoneSetTrevorHelmetSpeech = FALSE
|
|
bExplodedChopperFromCarriage = FALSE
|
|
bReloadingSniperRifle = FALSE
|
|
|
|
bStartedChopper1AudioScene = FALSE
|
|
bStartedChopper2AudioScene = FALSE
|
|
bStartedChopper3AudioScene = FALSE
|
|
bStoppedChopper3AudioScene = FALSE
|
|
bRemovedChopper1Audio = FALSE
|
|
bRemovedChopper2Audio = FALSE
|
|
|
|
iGetInTextStage = 0
|
|
iCurrentSearch = 0
|
|
iHeliOnMichaelTime = -1
|
|
iDelayFindItemTime = -1
|
|
iGotSniperTime = -1
|
|
fHangingCarriageOnScreenTime = 0.0
|
|
fThirdWaveAccuracy = 0.0
|
|
fFifthWaveAccuracy = 0.0
|
|
fMichaelToIslandPlaybackSpeed = 1.0
|
|
//iChopperSpinModifier = 0
|
|
//fChopperSpinForce = 0.0
|
|
//fPushChopperToWallForce = 0.0
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
|
|
beachCreationStage = BEACH_CREATION_NOT_STARTED
|
|
//michaelDrivebyState = MICHAEL_DRIVEBY_WAITING
|
|
trevorTargetPed = NULL
|
|
//michaelTargetPed = NULL
|
|
REPEAT COUNT_OF(bTriggeredEnemyWave) i
|
|
bEnemyWaveState[i] = FALSE
|
|
bTriggeredEnemyWave[i] = FALSE
|
|
ENDREPEAT
|
|
bDoneBoatSound[0] = false
|
|
bDoneBoatSound[1] = false
|
|
//REPEAT NUMBER_BRIDGE_ENEMIES i
|
|
// enemyBridgeState[i] = ENEMY_BRIDGE_STATE_NOT_STARTED
|
|
//ENDREPEAT
|
|
REPEAT COUNT_OF(RAPIDS_SPEECH_INTERRUPT_ENUM) i
|
|
bDoneRapidsSpeechInterrupt[i] = FALSE
|
|
ENDREPEAT
|
|
//bChopperUsingRockets = FALSE
|
|
bFinishedFollowRapids = FALSE
|
|
bDoneWaterfallCutaway = TRUE
|
|
//bPreventUpWaterfall = FALSE
|
|
bGivenRPG = FALSE
|
|
//bDoneMortarSpeech = FALSE
|
|
//bSetExplosionProofs = FALSE
|
|
//bDoHoverChopperHovering = FALSE
|
|
bDoMopUp = FALSE
|
|
bStartedChopper4AudioScene = FALSE
|
|
// bDoneBugOut = FALSE
|
|
// bDoneBoatsFlee = FALSE
|
|
bShownSwitchPrompt = FALSE
|
|
bSelectorLocked = FALSE
|
|
bRapidsSpeechInterruptPending = FALSE
|
|
bCreatedSmoothCam = FALSE
|
|
bSmoothCamBackToGameplay = FALSE
|
|
// bEnemiesExplosionProof = FALSE
|
|
bRemovedCrashModels = FALSE
|
|
bBlippedCarWave = FALSE
|
|
bDoMerryweatherMassacre = FALSE
|
|
bForceResetTrevorTask = FALSE
|
|
bForceMichaelSwitch = FALSE
|
|
|
|
|
|
iGetInTextStage = 2
|
|
|
|
//iChopperHoverStage = 0
|
|
//iStartMortarTime = -1
|
|
//iTriggerFleeWaveTime = -1
|
|
|
|
//fAttackChopperHoverSpeed = 1.0
|
|
fEnemyBoatSpeed = 1.2
|
|
fBoatRPGPhase = 0.0
|
|
fMopUpAccuracy = 4.0
|
|
iRapidsSpeechStage = 0
|
|
iAdvanceToGetHomeTime = -1
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
bGotToBeach = FALSE
|
|
bDoneLeaveBoatWithCase = FALSE
|
|
bDoneDriveHomeBanter = FALSE
|
|
bKilledDriveHomeBanter = FALSE
|
|
bDoneCarSpeech = FALSE
|
|
bFinishedFollowRapids = TRUE
|
|
bDoneLandAtBeachCue = FALSE
|
|
bDoneAtBeachCue = FALSE
|
|
bMichaelDroveOff = FALSE
|
|
bForcedTrevorOutOfBoat = FALSE
|
|
bBeenAtGetawayVehicles = FALSE
|
|
bDoneForceDinghyStop = FALSE
|
|
bExtendMichaelAbandon = FALSE
|
|
bPutWeaponAway = FALSE
|
|
bDoTrevorBoom = FALSE
|
|
bForceMichaelSwitch = FALSE
|
|
bAttachedCaseToHand = FALSE
|
|
fForceBeachTime = 0.0
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// return the correct character to start a particular stage on
|
|
FUNC enumCharacterList GET_CHARACTER_FOR_MISSION_STAGE(MISSION_STAGE_ENUM getStage)
|
|
SWITCH getStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
RETURN CHAR_TREVOR
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
RETURN CHAR_TREVOR
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
RETURN CHAR_TREVOR
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
RETURN CHAR_TREVOR
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
RETURN CHAR_MICHAEL
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
RETURN CHAR_TREVOR
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
RETURN CHAR_TREVOR
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
RETURN CHAR_MICHAEL
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN CHAR_MICHAEL
|
|
ENDFUNC
|
|
|
|
// create a player vehicle for the mission
|
|
PROC TRAIN_CRASH_CREATE_VEHICLE(TRAIN_CRASH_VEHICLE_ENUM tcVehicle, VECTOR vCreatePos, FLOAT fCreateRot, BOOL bKeepModel = TRUE, BOOL bKeepVehicle = TRUE, BOOL bMakeInvincible = FALSE)
|
|
INT i
|
|
IF NOT IS_VEHICLE_DRIVEABLE(trainCrashVehicle[tcVehicle])
|
|
TRAIN_CRASH_MODEL_ENUM vehicleModelEnum = GET_MODEL_ENUM_FOR_TRAIN_CRASH_VEHICLE(tcVehicle)
|
|
|
|
// if using a specific player vehicle
|
|
IF tcVehicle = TCV_MICHAEL_CAR
|
|
CREATE_PLAYER_VEHICLE(trainCrashVehicle[tcVehicle], CHAR_MICHAEL, vCreatePos, fCreateRot, FALSE)
|
|
ELSE
|
|
trainCrashVehicle[tcVehicle] = CREATE_VEHICLE(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(vehicleModelEnum), vCreatePos, fCreateRot)
|
|
ENDIF
|
|
|
|
//IF tcVehicle <> TCV_DINGHY
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(trainCrashVehicle[tcVehicle])
|
|
//ENDIF
|
|
|
|
IF NOT bKeepModel
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(vehicleModelEnum))
|
|
ENDIF
|
|
|
|
IF bMakeInvincible
|
|
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(trainCrashVehicle[tcVehicle], FALSE)
|
|
SET_VEHICLE_CAN_BREAK(trainCrashVehicle[tcVehicle], FALSE)
|
|
SET_ENTITY_PROOFS(trainCrashVehicle[tcVehicle], TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT bKeepVehicle
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[tcVehicle])
|
|
ENDIF
|
|
|
|
SET_VEHICLE_CAN_LEAK_OIL(trainCrashVehicle[tcVehicle], FALSE)
|
|
SET_VEHICLE_CAN_LEAK_PETROL(trainCrashVehicle[tcVehicle], FALSE)
|
|
|
|
SWITCH tcVehicle
|
|
CASE TCV_BIKE
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(trainCrashVehicle[tcVehicle])
|
|
SET_VEHICLE_COLOUR_COMBINATION(trainCrashVehicle[tcVehicle], 0)
|
|
SET_VEHICLE_LIVERY(trainCrashVehicle[tcVehicle], 2)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(trainCrashVehicle[tcVehicle], TRUE)
|
|
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[tcVehicle], FALSE)
|
|
BREAK
|
|
CASE TCV_DINGHY
|
|
SET_VEHICLE_COLOUR_COMBINATION(trainCrashVehicle[tcVehicle], 0)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(trainCrashVehicle[tcVehicle], TRUE)
|
|
SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(trainCrashVehicle[tcVehicle], TRUE)
|
|
SET_VEHICLE_EXTRA(trainCrashVehicle[tcVehicle], 1, TRUE)
|
|
SET_VEHICLE_EXTRA(trainCrashVehicle[tcVehicle], 2, TRUE)
|
|
SET_VEHICLE_COLOURS(trainCrashVehicle[tcVehicle], 1, 46)
|
|
SET_VEHICLE_EXTRA_COLOURS(trainCrashVehicle[tcVehicle], 132, 0)
|
|
BREAK
|
|
CASE TCV_MICHAEL_CAR
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[tcVehicle], FALSE)
|
|
BREAK
|
|
CASE TCV_BEACH_CAR
|
|
SET_VEHICLE_COLOUR_COMBINATION(trainCrashVehicle[tcVehicle], 3)
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[tcVehicle], VEHICLELOCK_LOCKED)
|
|
FOR i=1 TO 8
|
|
SET_VEHICLE_EXTRA(trainCrashVehicle[tcVehicle], i, TRUE)
|
|
ENDFOR
|
|
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[tcVehicle], FALSE)
|
|
BREAK
|
|
CASE TCV_BEACH_TRUCK
|
|
//SET_VEHICLE_COLOUR_COMBINATION(trainCrashVehicle[tcVehicle], 6)
|
|
SET_VEHICLE_COLOURS(trainCrashVehicle[tcVehicle], 48, 48)
|
|
SET_VEHICLE_EXTRA_COLOURS(trainCrashVehicle[tcVehicle], 48, 48)
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[tcVehicle], VEHICLELOCK_LOCKED)
|
|
REMOVE_VEHICLE_WINDOW(trainCrashVehicle[tcVehicle], SC_WINDOW_FRONT_LEFT)
|
|
FOR i=1 TO 8
|
|
SET_VEHICLE_EXTRA(trainCrashVehicle[tcVehicle], i, TRUE)
|
|
ENDFOR
|
|
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[tcVehicle], FALSE)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// setup player character with their correct variations
|
|
PROC SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PED_INDEX ped, enumCharacterList createChar, MISSION_STAGE_ENUM setStage)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SWITCH createChar
|
|
CASE CHAR_MICHAEL
|
|
IF setStage >= STAGE_GET_TO_BRIDGE
|
|
SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_OUTFIT, OUTFIT_P0_COMMANDO, FALSE)
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
|
|
// commando suit
|
|
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_DECL, 0, 0)
|
|
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_BERD, 0, 0)
|
|
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_FEET, 4, 0)
|
|
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, 4, 0)
|
|
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 4, 0)
|
|
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAND, 6, 0)
|
|
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, 4, 0)
|
|
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL2, 0, 0)
|
|
|
|
//CLEAR_ALL_PED_PROPS(ped)
|
|
ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
IF setStage >= STAGE_RAPIDS_CHASE
|
|
IF GET_PED_PROP_INDEX(ped, ANCHOR_HEAD) < 0
|
|
//SET_PED_PROP_INDEX(ped, ANCHOR_HEAD, 9)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_PROPS, PROPS_P2_CRASH_HELMET, FALSE)
|
|
bSetTrevorHelmet = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// apply attributes
|
|
PROC APPLY_PLAYER_ATTRIBUTES(PED_INDEX ped)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_CAN_BE_TARGETTED(ped, FALSE)
|
|
SET_PED_KEEP_TASK(ped, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(ped, TRUE)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_WillFlyThroughWindscreen, FALSE)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_GetOutBurningVehicle, FALSE)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_GetOutUndriveableVehicle, FALSE)
|
|
SET_PED_DIES_IN_WATER(ped, FALSE)
|
|
SET_ENTITY_AS_MISSION_ENTITY(ped, TRUE, TRUE)
|
|
ENDPROC
|
|
|
|
// create player character
|
|
PROC TRAIN_CRASH_CREATE_PLAYER_CHARACTER(enumCharacterList createChar, MISSION_STAGE_ENUM setStage, VECTOR vPos, FLOAT fRot, VEHICLE_INDEX veh = NULL, VEHICLE_SEAT seat = VS_DRIVER)
|
|
SELECTOR_SLOTS_ENUM selectorSlot = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(createChar)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[selectorSlot])
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
// create in vehicle
|
|
IF NOT CREATE_PLAYER_PED_INSIDE_VEHICLE(sSelectorPeds.pedID[selectorSlot], createChar, veh, seat, FALSE)
|
|
SCRIPT_ASSERT("could not create train crash player ped (vehicle is not dead)!")
|
|
IF NOT HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(createChar))
|
|
SCRIPT_ASSERT("ped was not created because the ped model was not loaded, please give rob a shout! thanks")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// create on foot
|
|
CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[selectorSlot], createChar, vPos, fRot, FALSE)
|
|
ENDIF
|
|
|
|
SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(sSelectorPeds.pedID[selectorSlot], createChar, setStage)
|
|
ENDIF
|
|
|
|
// apply the attributes
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[selectorSlot])
|
|
APPLY_PLAYER_ATTRIBUTES(sSelectorPeds.pedID[selectorSlot])
|
|
|
|
// specific attributes
|
|
SWITCH createChar
|
|
CASE CHAR_MICHAEL
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, sSelectorPeds.pedID[selectorSlot], "MICHAEL")
|
|
IF setStage > STAGE_INTERCEPT_TRAIN
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[selectorSlot], PCF_GetOutUndriveableVehicle, FALSE)
|
|
ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 1, sSelectorPeds.pedID[selectorSlot], "TREVOR")
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set player in vehicle if not already in
|
|
PROC SET_PLAYER_PED_INTO_TRAIN_CRASH_VEHICLE(TRAIN_CRASH_VEHICLE_ENUM tcVehicle, VEHICLE_SEAT seat, BOOL bKeepVehicle = TRUE)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[tcVehicle])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[tcVehicle])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[tcVehicle], seat)
|
|
IF NOT bKeepVehicle
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[tcVehicle])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// create the player characters, and transport if appropriate, for a mission stage
|
|
PROC CREATE_PLAYER_CHARACTERS_WITH_TRANSPORT_IN_MISSION_STAGE(MISSION_STAGE_ENUM setStage, BOOL bIsIntro = FALSE)
|
|
// create transport
|
|
SWITCH setStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_MICHAEL_CAR, GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_CAR_INIT), MICHAEL_CAR_INIT_ROT)
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_BIKE, GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_INIT), BIKE_INIT_ROT)
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_BIKE, GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_CHASE), BIKE_CHASE_ROT)
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_BIKE, GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_DRIVE_ALONG_TRAIN), 0)
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_INIT), DINGHY_INIT_ROT)
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BRIDGE), DINGHY_AT_BRIDGE_ROT)
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_CONTAINER), DINGHY_AT_CONTAINER_ROT)
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, <<-565, 4424, 15>>, 82)
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BEACH), DINGHY_AT_BEACH_ROT)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// create the player characters
|
|
SWITCH setStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
// michael
|
|
IF NOT bIsIntro
|
|
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_INIT), MICHAEL_INIT_ROT)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_CHASE_TRAIN
|
|
// trevor
|
|
//SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
BREAK
|
|
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
// trevor
|
|
//SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
BREAK
|
|
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
//trevor
|
|
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
|
|
BREAK
|
|
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
// trevor
|
|
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_IN_WATER_INIT), TREVOR_IN_WATER_INIT_ROT)
|
|
// michael
|
|
//SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
BREAK
|
|
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
// trevor
|
|
//SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_SHOOTOUT_INIT_REPLAY))
|
|
//SET_ENTITY_HEADING(PLAYER_PED_ID(), TREVOR_SHOOTOUT_INIT_ROT)
|
|
//michael
|
|
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_IN_CONTAINER), MICHAEL_IN_CONTAINER_ROT)
|
|
BREAK
|
|
|
|
CASE STAGE_RAPIDS_CHASE
|
|
// michael
|
|
// SET_PLAYER_PED_INTO_TRAIN_CRASH_VEHICLE(TCV_DINGHY, VS_DRIVER)
|
|
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
|
|
// trevor
|
|
// TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
|
|
//SET_PLAYER_PED_INTO_TRAIN_CRASH_VEHICLE(TCV_DINGHY, VS_FRONT_RIGHT)
|
|
BREAK
|
|
|
|
CASE STAGE_GET_HOME
|
|
// michael
|
|
//SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_AT_BEACH))
|
|
//SET_ENTITY_HEADING(PLAYER_PED_ID(), MICHAEL_AT_BEACH_ROT)
|
|
//SET_PLAYER_PED_INTO_TRAIN_CRASH_VEHICLE(TCV_DINGHY, VS_DRIVER)
|
|
// trevor
|
|
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// fill train init
|
|
FUNC VECTOR GET_TRAIN_INIT(MISSION_STAGE_ENUM trainStage)
|
|
SWITCH trainStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
RETURN <<2842.66, 4938.20, 63.03>>
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
RETURN <<2726.87, 5179.56, 62.90>>
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
RETURN <<1835.16, 6277.90, 50.30>>
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
//RETURN <<-541, 5059, 91>>
|
|
//RETURN <<1213.76, 6433.22, 31.44>>
|
|
RETURN <<1042.66089, 6435.62305, 31.04007>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
// set init train speed for stage
|
|
PROC SET_TRAIN_SPEED_FOR_STAGE(MISSION_STAGE_ENUM trainStage)
|
|
SWITCH trainStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
fTrainCruiseSpeed = 0.0
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
fTrainCruiseSpeed = 30//40.0 // 35.0
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
fTrainCruiseSpeed = DRIVE_ALONG_TRAIN_SPEED
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
fTrainCruiseSpeed = GET_TO_BRIDGE_TRAIN_SPEED * fTrainSpeedMod
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// setup playback of recording
|
|
PROC START_TRAIN_MOVEMENT_FOR_STAGE(MISSION_STAGE_ENUM playbackStage)
|
|
// set recording to play and time to start
|
|
VECTOR vStartCoords = GET_TRAIN_INIT(playbackStage)
|
|
SET_TRAIN_SPEED_FOR_STAGE(playbackStage)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
SET_MISSION_TRAIN_COORDS(missionTrain, vStartCoords)
|
|
SET_TRAIN_CRUISE_SPEED(missionTrain, fTrainCruiseSpeed)
|
|
SET_TRAIN_SPEED(missionTrain, fTrainCruiseSpeed)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// check fail for losing train
|
|
PROC DO_LOSE_TRAIN_CHECK()
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE), FALSE) > LOSE_TRAIN_DISTANCE
|
|
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), missionTrain, FALSE) > LOSE_TRAIN_DISTANCE
|
|
MISSION_FAILED(FAIL_LOST_TRAIN)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// get crashed train carriage pos
|
|
FUNC VECTOR GET_CRASHED_CARRIAGE_POSITION(INT iCarriage)
|
|
SWITCH iCarriage
|
|
CASE 0
|
|
RETURN <<-475.50, 4399.24, 30.50>>
|
|
BREAK
|
|
CASE 1
|
|
RETURN <<-499.00, 4412.00, 57.00>>
|
|
BREAK
|
|
CASE 2
|
|
RETURN <<-505.70, 4453.00, 76.00>>
|
|
BREAK
|
|
CASE 3
|
|
RETURN <<-513.20, 4458.50, 88.50>>
|
|
BREAK
|
|
CASE 4
|
|
RETURN <<-522.53, 4473.74, 90.32>>
|
|
BREAK
|
|
CASE 5
|
|
RETURN <<-504.70, 4453.00, 57.00>>
|
|
BREAK
|
|
CASE 6
|
|
RETURN <<-524.20, 4514.00, 89.20>>
|
|
BREAK
|
|
CASE 7
|
|
RETURN <<-524.20, 4496.00, 88.70>>
|
|
BREAK
|
|
CASE 8
|
|
RETURN <<-520.70, 4474.50, 88.70>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
// get crashed train carriage rot
|
|
FUNC VECTOR GET_CRASHED_CARRIAGE_ROTATION(INT iCarriage)
|
|
SWITCH iCarriage
|
|
CASE 0
|
|
RETURN <<55.12, 40.48, 207.44>>
|
|
BREAK
|
|
CASE 1
|
|
RETURN <<202.20, 93.16, 68.12>>
|
|
BREAK
|
|
CASE 2
|
|
RETURN <<202.20, 94.16, 68.12>>
|
|
BREAK
|
|
CASE 3
|
|
RETURN <<154.20, 143.16, 68.12>>
|
|
BREAK
|
|
CASE 4
|
|
RETURN <<169.56, 180.32, 198.56>>
|
|
BREAK
|
|
CASE 5
|
|
RETURN <<202.20, 93.16, 68.12>>
|
|
BREAK
|
|
CASE 6
|
|
RETURN <<154.08, 276.48, 154.08>>
|
|
BREAK
|
|
CASE 7
|
|
RETURN <<186.48, 218.40, 189.48>>
|
|
BREAK
|
|
CASE 8
|
|
RETURN <<182.48, 199.40, 189.48>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
// fill position, rotation, FOV for a camera shot
|
|
PROC FILL_CAMERA_PROPERTIES_FOR_TRAIN_CRASH_SHOT(TRAIN_CRASH_SHOT_DETAILS_ENUM cutsceneShot, VECTOR &vCamPos, VECTOR &vCamRot, FLOAT &fCamFOV)
|
|
SWITCH cutsceneShot
|
|
CASE TC_SHOT_JUMP1
|
|
vCamPos = <<2680.14, 5341.57, 68.52>>
|
|
vCamRot = <<-5.9, 0.3, 169.60>>
|
|
fCamFOV = 38.33
|
|
BREAK
|
|
CASE TC_SHOT_JUMP1B
|
|
vCamPos = <<2680.14, 5341.57, 68.52>>
|
|
vCamRot = <<-5.9, 0.3, 50.15>>
|
|
fCamFOV = 38.33
|
|
BREAK
|
|
CASE TC_SHOT_JUMP2
|
|
vCamPos = <<2595.74, 5503.83, 68.45>>
|
|
vCamRot = <<-4.64, -1.21, -121.86>>
|
|
fCamFOV = 21.48
|
|
BREAK
|
|
CASE TC_SHOT_JUMP2B
|
|
vCamPos = <<2595.74, 5503.83, 68.45>>
|
|
vCamRot = <<-7.41, -1.21, -46.16>>
|
|
fCamFOV = 21.48
|
|
BREAK
|
|
CASE TC_SHOT_JUMP3
|
|
vCamPos = <<2597.16, 5543.30, 66.14>>
|
|
vCamRot = <<-1.76, 0.29, 28.17>>
|
|
fCamFOV = 38.33
|
|
BREAK
|
|
CASE TC_SHOT_JUMP3B
|
|
vCamPos = <<2580.29, 5574.52, 65.55>>
|
|
vCamRot = <<-1.76, 0.29, 28.17>>
|
|
fCamFOV = 38.33
|
|
BREAK
|
|
CASE TC_SHOT_JUMP4
|
|
vCamPos = <<2479.43, 5758.67, 69.68>>
|
|
vCamRot = <<4.76, 0.30, -126.79>>
|
|
fCamFOV = 45.00
|
|
BREAK
|
|
CASE TC_SHOT_JUMP4B
|
|
vCamPos = <<2457.69, 5776.81, 70.24>>
|
|
vCamRot = <<-18.54, 0.60, -125.20>>
|
|
fCamFOV = 45.00
|
|
BREAK
|
|
CASE TC_SHOT_JUMP5
|
|
vCamPos = <<2382.67, 5925.39, 76.14>>
|
|
vCamRot = <<-8.39, 0.75, 165.33>>
|
|
fCamFOV = 39.35
|
|
BREAK
|
|
CASE TC_SHOT_JUMP5B
|
|
vCamPos = <<2383.38, 5926.52, 76.21>>
|
|
vCamRot = <<-22.62, 0.29, 77.40>>
|
|
fCamFOV = 39.35
|
|
BREAK
|
|
CASE TC_SHOT_CRASH_BRIDGE
|
|
vCamPos = <<-474.7, 4432.8, 35.5>>
|
|
vCamRot = <<-43.4, 0.0, 96.1>>
|
|
fCamFOV = 49.5
|
|
BREAK
|
|
CASE TC_SHOT_START_DRILL
|
|
vCamPos = <<-484.61, 4404.90, 31.72>>
|
|
vCamRot = <<0.89, 0.0, 159.48>>
|
|
fCamFOV = 26.922
|
|
BREAK
|
|
CASE TC_SHOT_START_DRILLB
|
|
vCamPos = <<-484.61, 4404.90, 31.72>>
|
|
vCamRot = <<0.89, 0.0, 16.16>>
|
|
fCamFOV = 26.922
|
|
BREAK
|
|
CASE TC_SHOT_EXPLODE_DOORS
|
|
vCamPos = <<-483.73, 4417.28, 32.86>>
|
|
vCamRot = <<-16.86, 0.0, 86.55>>
|
|
fCamFOV = 41.33
|
|
BREAK
|
|
CASE TC_SHOT_ENTER_CONTAINER
|
|
vCamPos = <<-488.40, 4429.60, 31.69>>
|
|
vCamRot = <<-5.74, 0.0, 38.66>>
|
|
fCamFOV = 36.400
|
|
BREAK
|
|
CASE TC_SHOT_PLANT_BOMB
|
|
vCamPos = <<-490.93, 4431.94, 31.13>>
|
|
vCamRot = <<0.16, 0.0, 4.61>>
|
|
fCamFOV = 30.486
|
|
BREAK
|
|
CASE TC_SHOT_INTO_BOAT
|
|
vCamPos = <<-487.22, 4429.32, 31.45>>
|
|
vCamRot = <<-6.79, 0.0, 29.80>>
|
|
fCamFOV = 33.061
|
|
BREAK
|
|
CASE TC_SHOT_WATERFALL
|
|
vCamPos = <<-559.99, 4425.27, 33.36>>
|
|
vCamRot =<<-6.92, -1.99, -104.29>>
|
|
fCamFOV = 52.0
|
|
BREAK
|
|
CASE TC_SHOT_WATERFALLB
|
|
vCamPos = <<-554.15, 4424.10, 31.95>>
|
|
vCamRot = <<-6.93, -2, -104.30>>
|
|
fCamFOV = 52.0
|
|
BREAK
|
|
CASE TC_SHOT_END
|
|
vCamPos = <<-2518.27, 3659.61, 13.59>>
|
|
vCamRot = <<-8.47, 0.0, 102.94>>
|
|
fCamFOV = 32.14
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
//HUD elements
|
|
PROC SET_CUTSCENE_HUD_ELEMENTS()
|
|
DISABLE_CELLPHONE(TRUE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDPROC
|
|
|
|
// setup mocap cutscene
|
|
PROC SET_MISSION_MOCAP_CUTSCENE()
|
|
REMOVE_MISSION_TEXT()
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
SET_CUTSCENE_HUD_ELEMENTS()
|
|
ENDPROC
|
|
|
|
// setup stuff for train crash cutscene
|
|
PROC SET_MISSION_CUTSCENE(BOOL bStart, BOOL bResetControlAndCameras = TRUE, BOOL bDoFade = TRUE, BOOL bInterpToGameCam = FALSE, BOOL bJustResetHUD = FALSE, BOOL bClearText = TRUE, BOOL bResetHeading = TRUE, BOOL bToggleMultihead = TRUE)
|
|
IF bClearText
|
|
REMOVE_MISSION_TEXT()
|
|
ENDIF
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(bStart, DEFAULT, bToggleMultihead)
|
|
|
|
IF bStart
|
|
SET_CUTSCENE_HUD_ELEMENTS()
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
iAllowSkipCutsceneTime = GET_GAME_TIMER()
|
|
ELSE
|
|
IF bResetControlAndCameras
|
|
IF NOT bJustResetHUD
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
IF NOT bJustResetHUD
|
|
RENDER_SCRIPT_CAMS(FALSE, bInterpToGameCam)
|
|
ENDIF
|
|
|
|
DESTROY_MISSION_ANIM_CAM()
|
|
DESTROY_MISSION_STATIC_CAM(staticCam)
|
|
DESTROY_MISSION_STATIC_CAM(interpCam)
|
|
|
|
IF NOT bJustResetHUD
|
|
IF bResetHeading
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
bRunningCutscene = FALSE
|
|
bSkippedCutscene = FALSE
|
|
bClearedForCutscene = FALSE
|
|
bCutsceneWaitStarted = FALSE
|
|
cutsceneStage = TC_CUT_STAGE_INIT
|
|
|
|
IF bDoFade
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// prevent wanted level for cut
|
|
PROC PREVENT_WANTED_LEVEL_FOR_CUTSCENE()
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDPROC
|
|
|
|
// force the engineer dead
|
|
PROC FORCE_ENGINEER_DEAD(BOOL bDeadStraightAway)
|
|
IF NOT IS_PED_INJURED(engineerPed[0])
|
|
AND IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
iDeadSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iDeadSyncScene, missionTrain, 0)
|
|
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iDeadSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_outro_driver", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_NONE, RBF_VEHICLE_IMPACT)
|
|
IF NOT bDeadStraightAway
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iDeadSyncScene, 0.277)
|
|
ELSE
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iDeadSyncScene, 1.0)
|
|
ENDIF
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(engineerPed[0])
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// create train engineer
|
|
PROC CREATE_TRAIN_ENGINEER(MISSION_STAGE_ENUM createStage)
|
|
engineerPed[0] = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ENGINEER), <<5,6,7>>)
|
|
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_HEAD, 1, 1)
|
|
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_HAIR, 2, 0)
|
|
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_TORSO, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_LEG, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(engineerPed[0], PED_COMP_DECL, 0, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(engineerPed[0], TRUE)
|
|
IF createStage >= STAGE_GET_TO_BRIDGE
|
|
FORCE_ENGINEER_DEAD(TRUE)
|
|
ELSE
|
|
SET_PED_INTO_VEHICLE(engineerPed[0], missionTrain, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
SET_ENTITY_PROOFS(engineerPed[0], TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
SET_PED_KEEP_TASK(engineerPed[0], TRUE)
|
|
ENDPROC
|
|
|
|
// handle create the negineer
|
|
PROC HANDLE_CREATE_ENGINEER(BOOL bIgnoreDistance = FALSE)
|
|
SWITCH createEngineerStage
|
|
CASE CREATE_ENGINEER_STAGE_NOT_STARTED
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), missionTrain, <<220,220,220>>, FALSE, FALSE)
|
|
OR bIgnoreDistance
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_ENGINEER))
|
|
createEngineerStage = CREATE_ENGINEER_STAGE_WAITING
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE CREATE_ENGINEER_STAGE_WAITING
|
|
IF NOT bModelRequestTracker[TCM_ENGINEER]
|
|
createEngineerStage = CREATE_ENGINEER_STAGE_NOT_STARTED
|
|
ELSE
|
|
IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
|
|
CREATE_TRAIN_ENGINEER(currentMissionStage)
|
|
createEngineerStage = CREATE_ENGINEER_STAGE_DONE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// create das train
|
|
PROC CREATE_TRAIN_FOR_STAGE(MISSION_STAGE_ENUM createStage, BOOL bCreateEngineer = TRUE)
|
|
IF createStage <= STAGE_GET_TO_BRIDGE
|
|
// create a moving train for all stages up to train crash
|
|
IF NOT DOES_ENTITY_EXIST(missionTrain)
|
|
// create the train
|
|
missionTrain = CREATE_MISSION_TRAIN(17, GET_TRAIN_INIT(createStage), FALSE)
|
|
SET_ENTITY_PROOFS(missionTrain, TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(missionTrain, FALSE)
|
|
|
|
IF bCreateEngineer
|
|
CREATE_TRAIN_ENGINEER(createStage)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
// colour carriages
|
|
INT i
|
|
FOR i=0 TO EXILE3_LAST_CARRIAGE
|
|
|
|
VEHICLE_INDEX thisCarriage = GET_TRAIN_CARRIAGE(missionTrain, i)
|
|
IF IS_VEHICLE_DRIVEABLE(thisCarriage)
|
|
SET_ENTITY_LOD_DIST(thisCarriage, 350)
|
|
IF i>=0
|
|
INT iColour
|
|
|
|
SWITCH i
|
|
CASE 0
|
|
iColour = 0
|
|
BREAK
|
|
CASE 1
|
|
iColour = 3
|
|
BREAK
|
|
CASE 2
|
|
iColour = 1
|
|
BREAK
|
|
CASE 3
|
|
iColour = 0
|
|
BREAK
|
|
CASE 4
|
|
iColour = 1
|
|
BREAK
|
|
CASE 5
|
|
iColour = 2
|
|
BREAK
|
|
CASE 6
|
|
iColour = 2
|
|
BREAK
|
|
CASE 7
|
|
iColour = 3
|
|
BREAK
|
|
CASE 8
|
|
iColour = 3
|
|
BREAK
|
|
CASE 9
|
|
iColour = 3
|
|
BREAK
|
|
CASE 10
|
|
iColour = 0
|
|
BREAK
|
|
CASE 11
|
|
iColour = 2
|
|
BREAK
|
|
CASE 12
|
|
iColour = 0
|
|
BREAK
|
|
CASE 13
|
|
iColour = 1
|
|
BREAK
|
|
CASE 14
|
|
iColour = 1
|
|
BREAK
|
|
CASE 15
|
|
iColour = 1
|
|
BREAK
|
|
CASE 16
|
|
iColour = 1
|
|
BREAK
|
|
CASE 17
|
|
iColour = 2
|
|
BREAK
|
|
CASE 18
|
|
iColour = 0
|
|
BREAK
|
|
CASE 19
|
|
iColour = 1
|
|
BREAK
|
|
CASE 20
|
|
iColour = 3
|
|
BREAK
|
|
CASE 21
|
|
iColour = 0
|
|
BREAK
|
|
CASE 22
|
|
iColour = 0
|
|
BREAK
|
|
CASE 23
|
|
iColour = 3
|
|
BREAK
|
|
CASE 24
|
|
iColour = 2
|
|
BREAK
|
|
CASE 25
|
|
iColour = 0
|
|
BREAK
|
|
CASE 26
|
|
iColour = 1
|
|
BREAK
|
|
CASE 27
|
|
iColour = 0
|
|
BREAK
|
|
CASE 28
|
|
iColour = 2
|
|
BREAK
|
|
CASE 29
|
|
iColour = 2
|
|
BREAK
|
|
CASE 30
|
|
iColour = 0
|
|
BREAK
|
|
CASE 31
|
|
iColour = 0
|
|
BREAK
|
|
CASE 32
|
|
iColour = 0
|
|
BREAK
|
|
CASE 33
|
|
iColour = 2
|
|
BREAK
|
|
CASE 34
|
|
iColour = 0
|
|
BREAK
|
|
CASE 35
|
|
iColour = 3
|
|
BREAK
|
|
CASE 36
|
|
iColour = 1
|
|
BREAK
|
|
CASE 37
|
|
iColour = 0
|
|
BREAK
|
|
CASE 38
|
|
iColour = 3
|
|
BREAK
|
|
CASE 39
|
|
iColour = 3
|
|
BREAK
|
|
CASE 40
|
|
iColour = 1
|
|
BREAK
|
|
DEFAULT
|
|
iColour = 4
|
|
BREAK
|
|
ENDSWITCH
|
|
SET_VEHICLE_COLOUR_COMBINATION(thisCarriage, iColour)
|
|
|
|
IF i=EXILE3_LAST_CARRIAGE
|
|
IF createStage = STAGE_INTERCEPT_TRAIN
|
|
TRACK_VEHICLE_VISIBILITY(thisCarriage)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
START_TRAIN_MOVEMENT_FOR_STAGE(createStage)
|
|
ENDIF
|
|
|
|
// setup attributes
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
// blip if appropriate
|
|
IF NOT DOES_BLIP_EXIST(trainBlip)
|
|
IF createStage = STAGE_DRIVE_ALONG_TRAIN
|
|
trainBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(GET_TRAIN_CARRIAGE(missionTrain, 0))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// set horn on/off
|
|
// IF createStage >= STAGE_GET_TO_BRIDGE
|
|
// SET_HORN_ENABLED(missionTrain, FALSE)
|
|
// ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// create crash train
|
|
PROC CREATE_CRASH_TRAIN()
|
|
crashTrain = CREATE_MISSION_TRAIN(0, <<-498.41226, 4304.29980, 88.40305>>, TRUE)
|
|
CONST_FLOAT CRASH_TRAIN_SPEED 20.0
|
|
SET_TRAIN_CRUISE_SPEED(crashTrain, CRASH_TRAIN_SPEED)
|
|
SET_TRAIN_SPEED(crashTrain, CRASH_TRAIN_SPEED)
|
|
|
|
SET_VEHICLE_COLOUR_COMBINATION(GET_TRAIN_CARRIAGE(crashTrain, 0), 0)
|
|
|
|
INT i
|
|
FOR i=0 TO 2
|
|
SET_ENTITY_LOD_DIST(GET_TRAIN_CARRIAGE(crashTrain,i), 500)
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
// apply anti rapids force to dinghy
|
|
PROC APPLY_ANTI_RAPIDS_FORCE_TO_DINGHY()
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_ENTITY_IN_ANGLED_AREA(trainCrashVehicle[TCV_DINGHY], <<-487.820, 4422.430, 28.000>>, <<-497.780, 4427.270, 34.710>>, 24.0)
|
|
APPLY_FORCE_TO_ENTITY(trainCrashVehicle[TCV_DINGHY], APPLY_TYPE_FORCE, <<45,0,0>>, <<0,0,-0.25>>, 0, FALSE, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// delete all enemies
|
|
PROC DELETE_ALL_ENEMIES()
|
|
INT i
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
|
|
DELETE_PED(enemyPed[i].ped)
|
|
ENDIF
|
|
ENDREPEAT
|
|
REPEAT COUNT_OF(enemyVehicle) i
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
|
|
DELETE_VEHICLE(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDREPEAT
|
|
CLEAR_AREA(<<-497.30844, 4425.88330, 29.99993>>, 100, TRUE)
|
|
ENDPROC
|
|
|
|
// create enemy vehicle
|
|
PROC CREATE_ENEMY_VEHICLE(ENEMY_VEHICLE_ENUM vehicleEnum, MISSION_STAGE_ENUM createStage)
|
|
// vehicle
|
|
MODEL_NAMES model
|
|
INT iRec = 000
|
|
VECTOR vPos = <<2000 + ENUM_TO_INT(vehicleEnum) * 10, 0, 1000>>
|
|
FLOAT fRot = 0.0
|
|
FLOAT fSkip = 0.0
|
|
FLOAT fSpeed = 1.0
|
|
//BOOL bOnlyDamagedByPlayer = FALSE
|
|
//BOOL bCollisionDamage = FALSE
|
|
//BOOL bDamagedByOthersExploding = TRUE
|
|
BOOL bExtra1 = FALSE
|
|
BOOL bExtra2 = FALSE
|
|
|
|
// reset ai
|
|
enemyVehicle[vehicleEnum].aiEnum = EVAI_FOLLOW_RECORDING
|
|
enemyVehicle[vehicleEnum].iAiStage = 0
|
|
|
|
// model
|
|
SWITCH vehicleEnum
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ENEMY_DINGHY)
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
//CASE EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
|
|
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_CHASE_CHOPPER)
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
model = GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_CAR)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// details
|
|
SWITCH vehicleEnum
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
iRec = 003
|
|
IF createStage = STAGE_GO_TO_CONTAINER
|
|
fSkip = 8600//9300//7300
|
|
ELSE
|
|
fSkip = 16600//17300//1500//3500.0
|
|
ENDIF
|
|
//bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
iRec = 002
|
|
IF createStage = STAGE_GO_TO_CONTAINER
|
|
fSkip = 10600//9600
|
|
ELSE
|
|
fSkip = 18600//2000.0
|
|
ENDIF
|
|
bExtra1 = TRUE
|
|
//bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
iRec = 010
|
|
IF createStage = STAGE_GO_TO_CONTAINER
|
|
fSkip = 4600//9600
|
|
ELSE
|
|
fSkip = 12600//2000.0
|
|
ENDIF
|
|
//bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
iRec = 011
|
|
IF createStage = STAGE_GO_TO_CONTAINER
|
|
fSkip = 0//1000.0//4000//2000
|
|
ELSE
|
|
fSkip = 6000//7000.0//10000//2000.0
|
|
ENDIF
|
|
fSpeed = 0.8
|
|
//bOnlyDamagedByPlayer = TRUE
|
|
//bDamagedByOthersExploding = TRUE
|
|
//bCollisionDamage = TRUE
|
|
BREAK
|
|
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
iRec = 015
|
|
fSkip = 5000.0
|
|
fSpeed = 1.09
|
|
//bOnlyDamagedByPlayer = TRUE
|
|
//bDamagedByOthersExploding = TRUE
|
|
//bCollisionDamage = TRUE
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
iRec = 017
|
|
fSkip = 4000.0
|
|
fSpeed = 1.10
|
|
//bOnlyDamagedByPlayer = TRUE
|
|
//bDamagedByOthersExploding = TRUE
|
|
//bCollisionDamage = TRUE
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
iRec = 020
|
|
fSkip = 4000
|
|
fSpeed = 1.1//1.25
|
|
//vPos = <<-1291.28491, 4400.72119, 23.5>>
|
|
//fRot = -91.0
|
|
//bDamagedByOthersExploding = TRUE
|
|
//bCollisionDamage = TRUE
|
|
BREAK
|
|
//CASE EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
|
|
// iRec = 010
|
|
// bDamagedByOthersExploding = TRUE
|
|
// bCollisionDamage = TRUE
|
|
//BREAK
|
|
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
IF createStage = STAGE_STEAL_FROM_CONTAINER
|
|
iRec = 007
|
|
fSkip = 2000//1800
|
|
fSpeed = 1.07
|
|
ELSE
|
|
iRec = 009
|
|
IF bSkippedWaterfallCutaway
|
|
fSkip = 0
|
|
ELSE
|
|
fSkip = 3300//1200
|
|
ENDIF
|
|
fSpeed = 0.96//1.0
|
|
ENDIF
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
IF createStage = STAGE_STEAL_FROM_CONTAINER
|
|
iRec = 005
|
|
fSkip = 2200
|
|
fSpeed = 1.07
|
|
ELSE
|
|
iRec = 016
|
|
IF bSkippedWaterfallCutaway
|
|
fSkip = 1300
|
|
ELSE
|
|
fSkip = 4600//1200
|
|
ENDIF
|
|
fSpeed = 1.0
|
|
ENDIF
|
|
BREAK
|
|
//CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_3
|
|
// iRec = 017
|
|
// fSkip = 1200
|
|
// fSpeed = 1.27
|
|
//BREAK
|
|
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
|
|
// iRec = 022
|
|
// fSkip = 2300
|
|
// fSpeed = 1.25//1.36
|
|
//BREAK
|
|
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
|
|
// iRec = 023
|
|
// fSkip = 2300
|
|
// fSpeed = 1.5//1.36
|
|
//BREAK
|
|
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
|
|
// iRec = 018
|
|
// fSkip = 2500
|
|
// fSpeed = 1.5//1.38
|
|
//BREAK
|
|
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
|
|
// iRec = 019
|
|
// fSkip = 2500
|
|
// fSpeed = 1.5//1.38
|
|
//BREAK
|
|
//CASE EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
|
|
// iRec = 020
|
|
// fSkip = 1500
|
|
// fSpeed = 1.35//1.40
|
|
//BREAK
|
|
//CASE EV_FLEE_WAVE_BOAT_1
|
|
// iRec = 012
|
|
// fSkip = 6500
|
|
// fSpeed = 1.26//1.24//1.07
|
|
//BREAK
|
|
//CASE EV_FLEE_WAVE_BOAT_2
|
|
// iRec = 013
|
|
// fSkip = 6800
|
|
// fSpeed = 1.26//1.24//1.03
|
|
//BREAK
|
|
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
vPos = << -892.0786, 4424.8315, 19.8953 >>
|
|
fRot = 244.1
|
|
BREAK
|
|
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
// vPos = << -886.65851, 4430.65674, 20.03022 >>
|
|
// fRot = 170.4
|
|
//BREAK
|
|
ENDSWITCH
|
|
|
|
enemyVehicle[vehicleEnum].veh = CREATE_VEHICLE(model, vPos, fRot)
|
|
SET_VEHICLE_ENGINE_ON(enemyVehicle[vehicleEnum].veh, TRUE, TRUE)
|
|
SET_VEHICLE_CAN_BE_TARGETTED(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(enemyVehicle[vehicleEnum].veh, FALSE)
|
|
SET_VEHICLE_DOORS_LOCKED(enemyVehicle[vehicleEnum].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
//SET_ENTITY_ONLY_DAMAGED_BY_RELATIONSHIP_GROUP(enemyVehicle[vehicleEnum].veh, TRUE, RELGROUPHASH_PLAYER)
|
|
SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(enemyVehicle[vehicleEnum].veh, FALSE, enemyRelGroup)
|
|
|
|
//SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyVehicle[vehicleEnum].veh, bOnlyDamagedByPlayer)
|
|
//SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(enemyVehicle[vehicleEnum].veh, FALSE)
|
|
|
|
// vehicle extras
|
|
IF IS_THIS_MODEL_A_BOAT(model)
|
|
SET_VEHICLE_COLOURS(enemyVehicle[vehicleEnum].veh, 1, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(enemyVehicle[vehicleEnum].veh, 8, 0)
|
|
SET_VEHICLE_EXTRA(enemyVehicle[vehicleEnum].veh, 1, NOT bExtra1)
|
|
SET_VEHICLE_EXTRA(enemyVehicle[vehicleEnum].veh, 2, NOT bExtra2)
|
|
SET_BOAT_SINKS_WHEN_WRECKED(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_THIS_MODEL_A_CAR(model)
|
|
SET_VEHICLE_COLOUR_COMBINATION(enemyVehicle[vehicleEnum].veh, 0)
|
|
SET_VEHICLE_USE_ALTERNATE_HANDLING(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
//SCRIPT_ASSERT("here3")
|
|
ENDIF
|
|
|
|
IF IS_THIS_MODEL_A_HELI(model)
|
|
SET_HELI_BLADES_FULL_SPEED(enemyVehicle[vehicleEnum].veh)
|
|
ENDIF
|
|
IF iRec > 000
|
|
START_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh, iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SET_PLAYBACK_SPEED(enemyVehicle[vehicleEnum].veh, fSpeed)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh, fSkip)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyVehicle[vehicleEnum].veh)
|
|
ENDIF
|
|
|
|
IF vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
OR vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
TRACK_VEHICLE_VISIBILITY(enemyVehicle[vehicleEnum].veh)
|
|
ENDIF
|
|
|
|
IF vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
SET_VEHICLE_DISABLE_HEIGHT_MAP_AVOIDANCE(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(enemyVehicle[vehicleEnum].veh, "EXILE_3_HELI_01_Group")
|
|
ELIF vehicleEnum = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
SET_VEHICLE_DISABLE_HEIGHT_MAP_AVOIDANCE(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(enemyVehicle[vehicleEnum].veh, "EXILE_3_HELI_02_Group")
|
|
ENDIF
|
|
|
|
//IF NOT bCollisionDamage
|
|
// SET_ENTITY_PROOFS(enemyVehicle[vehicleEnum].veh, FALSE, TRUE, FALSE, TRUE, TRUE)
|
|
//ENDIF
|
|
//IF NOT bDamagedByOthersExploding
|
|
// SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(enemyVehicle[vehicleEnum].veh, FALSE)
|
|
//printstring("set explode on high explosion damage false ") printint(ENUM_TO_INT(vehicleEnum)) printnl()
|
|
//ENDIF
|
|
|
|
//IF bBlip
|
|
// enemyVehicle[vehicleEnum].blip = CREATE_MISSION_BLIP_FOR_VEHICLE(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
//ENDIF
|
|
enemyVehicle[vehicleEnum].bCommentedOnDestruction = FALSE
|
|
enemyVehicle[vehicleEnum].bExplodedVehicle = FALSE
|
|
enemyVehicle[vehicleEnum].bOccupantsDead = FALSE
|
|
enemyVehicle[vehicleEnum].bInSlowDownArea = FALSE
|
|
enemyVehicle[vehicleEnum].fPlaybackSpeed = fSpeed
|
|
ENDPROC
|
|
|
|
// setup the variations on an enemy ped
|
|
PROC SET_ENEMY_VARIATIONS(ENEMY_PED_ENUM enemyEnum)
|
|
PED_INDEX ped = enemyPed[enemyEnum].ped
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
INT iHairVar
|
|
INT iHeadVar
|
|
INT iHeadTex
|
|
INT iTorsoVar
|
|
INT iTorsoTex
|
|
INT iLegTex
|
|
INT iAccVar
|
|
INT iAccTex
|
|
INT iShadesVar = -1
|
|
INT iShadesTex = -1
|
|
INT iHatVar = -1
|
|
INT iHatTex = -1
|
|
BOOL bHasVariation = TRUE
|
|
|
|
SWITCH enemyEnum
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
|
|
iHairVar = 0
|
|
iHeadVar = 0
|
|
iHeadTex = 2
|
|
iTorsoVar = 1
|
|
iTorsoTex = 1
|
|
iLegTex = 2
|
|
iAccVar = 1
|
|
iAccTex = 0
|
|
iShadesVar = 0
|
|
iShadesTex = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
|
|
iHairVar = 1
|
|
iHeadVar = 1
|
|
iHeadTex = 2
|
|
iTorsoVar = 1
|
|
iTorsoTex = 3
|
|
iLegTex = 0
|
|
iAccVar = 0
|
|
iAccTex = 2
|
|
iShadesVar = 0
|
|
iShadesTex = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER
|
|
iHairVar = 0
|
|
iHeadVar = 1
|
|
iHeadTex = 2
|
|
iTorsoVar = 0
|
|
iTorsoTex = 4
|
|
iLegTex = 0
|
|
iAccVar = 0
|
|
iAccTex = 0
|
|
iShadesVar = 0
|
|
iShadesTex = 1
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
|
|
iHairVar = 1
|
|
iHeadVar = 0
|
|
iHeadTex = 1
|
|
iTorsoVar = 1
|
|
iTorsoTex = 2
|
|
iLegTex = 2
|
|
iAccVar = 1
|
|
iAccTex = 0
|
|
iHatVar = 0
|
|
iHatTex = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
|
|
iHairVar = 1
|
|
iHeadVar = 0
|
|
iHeadTex = 0
|
|
iTorsoVar = 1
|
|
iTorsoTex = 0
|
|
iLegTex = 0
|
|
iAccVar = 0
|
|
iAccTex = 2
|
|
iHatVar = 0
|
|
iHatTex = 1
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
|
|
iHairVar = 0
|
|
iHeadVar = 1
|
|
iHeadTex = 0
|
|
iTorsoVar = 0
|
|
iTorsoTex = 5
|
|
iLegTex = 2
|
|
iAccVar = 0
|
|
iAccTex = 1
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
|
|
iHairVar = 0
|
|
iHeadVar = 0
|
|
iHeadTex = 2
|
|
iTorsoVar = 0
|
|
iTorsoTex = 1
|
|
iLegTex = 1
|
|
iAccVar = 1
|
|
iAccTex = 0
|
|
iShadesVar = 0
|
|
iShadesTex = 0
|
|
iHatVar = 1
|
|
iHatTex = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
|
|
iHairVar = 1
|
|
iHeadVar = 1
|
|
iHeadTex = 0
|
|
iTorsoVar = 0
|
|
iTorsoTex = 4
|
|
iLegTex = 0
|
|
iAccVar = 0
|
|
iAccTex = 1
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
|
|
iHairVar = 1
|
|
iHeadVar = 0
|
|
iHeadTex = 1
|
|
iTorsoVar = 1
|
|
iTorsoTex = 1
|
|
iLegTex = 2
|
|
iAccVar = 1
|
|
iAccTex = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
|
|
iHairVar = 1
|
|
iHeadVar = 1
|
|
iHeadTex = 2
|
|
iTorsoVar = 1
|
|
iTorsoTex = 1
|
|
iLegTex = 0
|
|
iAccVar = 1
|
|
iAccTex = 0
|
|
iShadesVar = 0
|
|
iShadesTex = 0
|
|
BREAK
|
|
DEFAULT
|
|
bHasVariation = FALSE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bHasVariation
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, iHairVar, 0)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HEAD, iHeadVar, iHeadTex)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, iTorsoVar, iTorsoTex)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 0, iLegTex)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, iAccVar, iAccTex)
|
|
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL2, 0, 0)
|
|
|
|
CLEAR_PED_PROP(ped, ANCHOR_EYES)
|
|
CLEAR_PED_PROP(ped, ANCHOR_HEAD)
|
|
IF iShadesVar >= 0
|
|
SET_PED_PROP_INDEX(ped, ANCHOR_EYES, iShadesVar, iShadesTex)
|
|
ENDIF
|
|
IF iHatVar >= 0
|
|
SET_PED_PROP_INDEX(ped, ANCHOR_HEAD, iHatVar, iHatTex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// should do nm fall
|
|
FUNC BOOL SHOULD_THIS_SNIPER_FALL_ON_DEATH(ENEMY_PED_ENUM pedEnum)
|
|
SWITCH pedEnum
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_1
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_2
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_4
|
|
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
|
|
//CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
|
|
RETURN TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// enemy blip time
|
|
FUNC INT GET_BLIP_ENEMY_PED_TIME(ENEMY_PED_ENUM pedEnum)
|
|
SWITCH pedEnum
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
|
|
IF NOT bJumpedToShootout
|
|
RETURN 8245
|
|
ENDIF
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
|
|
IF NOT bJumpedToShootout
|
|
RETURN 6965
|
|
ENDIF
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
|
|
IF NOT bJumpedToShootout
|
|
RETURN 9401
|
|
ENDIF
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
|
|
IF NOT bJumpedToShootout
|
|
RETURN 23956//19035
|
|
ELSE
|
|
RETURN 16434//11477
|
|
ENDIF
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
|
|
RETURN 11726
|
|
BREAK
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_1
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_2
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_3
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_4
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
|
|
RETURN 8740
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
|
|
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
|
|
//CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
|
|
//CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_4
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
|
|
RETURN 2918
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_PASSFR
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER
|
|
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSFR
|
|
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
|
|
RETURN 999999999
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN 0
|
|
ENDFUNC
|
|
|
|
// create enemy ped
|
|
PROC CREATE_ENEMY_PED(ENEMY_PED_ENUM pedEnum)
|
|
VECTOR vPos = <<0,0,0>>
|
|
FLOAT fRot = 0.0
|
|
BOOL bInVehicle = TRUE
|
|
ENEMY_VEHICLE_ENUM vehicleEnum
|
|
VEHICLE_SEAT seat = VS_DRIVER
|
|
BOOL bDriveByPed = TRUE
|
|
BOOL bCritProof = FALSE
|
|
BOOL bBoostHealth = FALSE
|
|
BOOL bOnlyDamagedByPlayer = FALSE
|
|
INT iAccuracy = 2
|
|
WEAPON_TYPE weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SMG)
|
|
|
|
SWITCH pedEnum
|
|
// SHOOTOUT
|
|
// wave 1 boat 1
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
bOnlyDamagedByPlayer = TRUE
|
|
iAccuracy = 2
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
seat = VS_FRONT_RIGHT
|
|
bOnlyDamagedByPlayer = TRUE
|
|
iAccuracy = 2
|
|
BREAK
|
|
|
|
// wave 1 boat 2
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
bOnlyDamagedByPlayer = TRUE
|
|
iAccuracy = 2
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
seat = VS_FRONT_RIGHT
|
|
bOnlyDamagedByPlayer = TRUE
|
|
iAccuracy = 2
|
|
BREAK
|
|
|
|
// wave 1 boat 3
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
bOnlyDamagedByPlayer = TRUE
|
|
iAccuracy = 3
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
seat = VS_FRONT_RIGHT
|
|
bOnlyDamagedByPlayer = TRUE
|
|
iAccuracy = 3
|
|
BREAK
|
|
|
|
// wave 1 chopper 1
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
//bCritProof = TRUE
|
|
//bBoostHealth = TRUE
|
|
bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
seat = VS_BACK_LEFT
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
|
|
vehicleEnum = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
seat = VS_BACK_RIGHT
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
|
|
// wave 2 chopper 1
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
|
|
vehicleEnum = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
|
|
vehicleEnum = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
seat = VS_BACK_LEFT
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
|
|
vehicleEnum = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
seat = VS_BACK_RIGHT
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
|
|
// wave 3 foot 1
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_1
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
iAccuracy = 0
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
|
|
vPos = <<-510.41333, 4453.61816, 89.10837>>
|
|
fRot = -166.3
|
|
BREAK
|
|
|
|
// wave 3 foot 2
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_2
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
|
|
iAccuracy = 0
|
|
vPos = <<-522.07892, 4437.87119, 80.63990>>
|
|
fRot = -146.1
|
|
BREAK
|
|
|
|
// wave 3 foot 3
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_3
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
|
|
iAccuracy = 0
|
|
vPos = <<-523.91626, 4451.52188, 75.71128>>
|
|
fRot = -137.6
|
|
BREAK
|
|
|
|
// wave 3 foot 4
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_4
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
|
|
iAccuracy = 0
|
|
vPos = <<-527.52893, 4479.11475, 61.24358>>
|
|
fRot = -162.6
|
|
BREAK
|
|
|
|
// wave 4 chopper 1
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
|
|
vehicleEnum = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
bOnlyDamagedByPlayer = TRUE
|
|
//iAccuracy = 100
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL
|
|
vehicleEnum = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
seat = VS_BACK_LEFT
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
|
|
vehicleEnum = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
seat = VS_BACK_RIGHT
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
bOnlyDamagedByPlayer = TRUE
|
|
BREAK
|
|
|
|
// wave 5 foot 1
|
|
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
iAccuracy = 0
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
|
|
vPos = <<-543.41663, 4738.74414, 338.56232>>
|
|
fRot = -166.3
|
|
BREAK
|
|
|
|
// wave 5 foot 2
|
|
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
|
|
iAccuracy = 0
|
|
vPos = <<-508.26, 4680.58, 286.96>>//<<-519.7, 4682.61816, 296.10837>>
|
|
fRot = -162.8
|
|
BREAK
|
|
|
|
// wave 5 foot 3
|
|
/*
|
|
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
iAccuracy = 0
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
|
|
vPos = <<-502.05472, 4477.52783, 67.80651>>
|
|
fRot = -166.3
|
|
BREAK
|
|
|
|
// wave 5 foot 4
|
|
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_4
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)
|
|
iAccuracy = 0
|
|
vPos = <<-487.31683, 4500.89746, 80.46754>>
|
|
fRot = -177.7
|
|
BREAK
|
|
*/
|
|
|
|
// CHASE
|
|
// heli wave 1 chopper 1
|
|
CASE EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
|
|
vehicleEnum = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
iAccuracy = 7
|
|
BREAK
|
|
/*
|
|
CASE EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PASSBL
|
|
vehicleEnum = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
seat = VS_BACK_LEFT
|
|
weapon = GET_ENEMY_WEAPON(EWEAPON_RIFLE)
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PASSBR
|
|
vehicleEnum = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
seat = VS_BACK_RIGHT
|
|
weapon = GET_ENEMY_WEAPON(EWEAPON_RIFLE)
|
|
BREAK
|
|
*/
|
|
|
|
// heli wave 2 chopper 1
|
|
//CASE EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PILOT
|
|
// vehicleEnum = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
|
|
// bDriveByPed = FALSE
|
|
//BREAK
|
|
/*
|
|
CASE EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PASSBL
|
|
vehicleEnum = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
|
|
seat = VS_BACK_LEFT
|
|
weapon = GET_ENEMY_WEAPON(EWEAPON_RIFLE)
|
|
BREAK
|
|
CASE EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PASSBR
|
|
vehicleEnum = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
|
|
seat = VS_BACK_RIGHT
|
|
weapon = GET_ENEMY_WEAPON(EWEAPON_RIFLE)
|
|
BREAK
|
|
*/
|
|
|
|
// boat wave 1 boat 1
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
|
|
vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
iAccuracy = 1
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_PASSFR
|
|
vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
seat = VS_FRONT_RIGHT
|
|
iAccuracy = 1
|
|
BREAK
|
|
// boat wave 1 boat 2
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER
|
|
vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
iAccuracy = 1
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
|
|
vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
seat = VS_FRONT_RIGHT
|
|
iAccuracy = 1
|
|
BREAK
|
|
// boat wave 1 boat 2
|
|
//CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_3_DRIVER
|
|
// vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_3
|
|
//BREAK
|
|
//CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_3_PASSFR
|
|
// vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_3
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
|
|
// boat wave 2 boat 1
|
|
//CASE EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_DRIVER
|
|
// vehicleEnum = EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
|
|
//BREAK
|
|
//CASE EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_PASSFR
|
|
// vehicleEnum = EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
// boat wave 2 boat 2
|
|
//CASE EP_CHASE_SECOND_BOAT_WAVE_BOAT_2_DRIVER
|
|
// vehicleEnum = EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
|
|
//BREAK
|
|
//CASE EP_CHASE_SECOND_BOAT_WAVE_BOAT_2_PASSFR
|
|
/// vehicleEnum = EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
|
|
// boat wave 3 boat 1
|
|
//CASE EP_CHASE_THIRD_BOAT_WAVE_BOAT_1_DRIVER
|
|
// vehicleEnum = EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
|
|
//BREAK
|
|
//CASE EP_CHASE_THIRD_BOAT_WAVE_BOAT_1_PASSFR
|
|
// vehicleEnum = EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
// boat wave 3 boat 2
|
|
//CASE EP_CHASE_THIRD_BOAT_WAVE_BOAT_2_DRIVER
|
|
// vehicleEnum = EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
|
|
//BREAK
|
|
//CASE EP_CHASE_THIRD_BOAT_WAVE_BOAT_2_PASSFR
|
|
// vehicleEnum = EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
|
|
// boat wave 4 boat 1
|
|
//CASE EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_DRIVER
|
|
// vehicleEnum = EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
|
|
//BREAK
|
|
//CASE EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_PASSFR
|
|
// vehicleEnum = EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
|
|
// bridge wave foot
|
|
/*
|
|
CASE EP_CHASE_BRIDGE_WAVE_FOOT_1
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
vPos = <<-876.64, 4412.65, 19.91>>
|
|
fRot = -52.8
|
|
BREAK
|
|
CASE EP_CHASE_BRIDGE_WAVE_FOOT_2
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
vPos = <<-881.08, 4418.78, 19.91>>
|
|
fRot = -68.6
|
|
BREAK
|
|
CASE EP_CHASE_BRIDGE_WAVE_FOOT_3
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
vPos = <<-883.33, 4425.17, 19.84>>
|
|
fRot = -76.1
|
|
BREAK
|
|
CASE EP_CHASE_BRIDGE_WAVE_FOOT_4
|
|
bOnlyDamagedByPlayer = TRUE
|
|
bInVehicle = FALSE
|
|
weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE)
|
|
vPos = <<-882.87, 4429.75, 19.83>>
|
|
fRot = 0.0
|
|
BREAK
|
|
*/
|
|
|
|
// car wave 1
|
|
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER
|
|
vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
iAccuracy = 1
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSFR
|
|
vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
seat = VS_FRONT_RIGHT
|
|
iAccuracy = 2
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
|
|
vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
seat = VS_BACK_RIGHT
|
|
iAccuracy = 1
|
|
BREAK
|
|
//CASE EP_CHASE_FIRST_CAR_WAVE_CAR_2_DRIVER
|
|
// vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
//BREAK
|
|
//CASE EP_CHASE_FIRST_CAR_WAVE_CAR_2_PASSFR
|
|
// vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
//CASE EP_CHASE_FIRST_CAR_WAVE_CAR_2_PASSBR
|
|
// vehicleEnum = EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
// seat = VS_BACK_RIGHT
|
|
//BREAK
|
|
|
|
|
|
// FLEE
|
|
// boat 1
|
|
//CASE EP_FLEE_WAVE_BOAT_1_DRIVER
|
|
// vehicleEnum = EV_FLEE_WAVE_BOAT_1
|
|
//BREAK
|
|
//CASE EP_FLEE_WAVE_BOAT_1_PASSFR
|
|
// vehicleEnum = EV_FLEE_WAVE_BOAT_1
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
|
|
// boat 2
|
|
//CASE EP_FLEE_WAVE_BOAT_2_DRIVER
|
|
// vehicleEnum = EV_FLEE_WAVE_BOAT_2
|
|
//BREAK
|
|
//CASE EP_FLEE_WAVE_BOAT_2_PASSFR
|
|
// vehicleEnum = EV_FLEE_WAVE_BOAT_2
|
|
// seat = VS_FRONT_RIGHT
|
|
//BREAK
|
|
ENDSWITCH
|
|
|
|
IF bInVehicle
|
|
enemyPed[pedEnum].ped = CREATE_PED_INSIDE_VEHICLE(enemyVehicle[vehicleEnum].veh, PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), seat)
|
|
ELSE
|
|
enemyPed[pedEnum].ped = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), vPos, fRot)
|
|
//IF bBlip
|
|
//printstring("adding ped blip ") PRINTINT(ENUM_TO_INT(pedEnum)) PRINTNL()
|
|
//enemyPed[pedEnum].blip = CREATE_MISSION_BLIP_FOR_PED(enemyPed[pedEnum].ped, TRUE)
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
IF bDriveByPed
|
|
GIVE_WEAPON_TO_PED(enemyPed[pedEnum].ped, weapon, INFINITE_AMMO, TRUE, TRUE)
|
|
enemyPed[pedEnum].iRecheckDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
|
|
ELSE
|
|
enemyPed[pedEnum].iRecheckDrivebyTime = -1
|
|
ENDIF
|
|
|
|
IF bCritProof
|
|
SET_PED_SUFFERS_CRITICAL_HITS(enemyPed[pedEnum].ped, FALSE)
|
|
ENDIF
|
|
IF bBoostHealth
|
|
CONST_INT BOOST_HEALTH 250
|
|
SET_PED_MAX_HEALTH(enemyPed[pedEnum].ped, BOOST_HEALTH)
|
|
SET_ENTITY_HEALTH(enemyPed[pedEnum].ped, BOOST_HEALTH)
|
|
ENDIF
|
|
|
|
IF bDoMerryweatherMassacre
|
|
iAccuracy = 100
|
|
ENDIF
|
|
|
|
SET_PED_ACCURACY(enemyPed[pedEnum].ped, iAccuracy)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(enemyPed[pedEnum].ped, TRUE)
|
|
//SET_ENTITY_ONLY_DAMAGED_BY_RELATIONSHIP_GROUP(enemyPed[pedEnum].ped, TRUE, RELGROUPHASH_PLAYER)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(enemyPed[pedEnum].ped, enemyRelGroup)
|
|
SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(enemyPed[pedEnum].ped, FALSE, enemyRelGroup)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyPed[pedEnum].ped, bOnlyDamagedByPlayer)
|
|
SET_PED_KEEP_TASK(enemyPed[pedEnum].ped, TRUE)
|
|
SET_PED_DIES_WHEN_INJURED(enemyPed[pedEnum].ped, TRUE)
|
|
|
|
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_GetOutBurningVehicle, FALSE)
|
|
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_GetOutUndriveableVehicle, FALSE)
|
|
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_CanAttackNonWantedPlayerAsLaw, TRUE)
|
|
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_DisableHurt, TRUE)
|
|
|
|
IF pedEnum = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
|
|
OR pedEnum = EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
|
|
OR pedEnum = EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
|
|
SET_PED_CONFIG_FLAG(enemyPed[pedEnum].ped, PCF_PreventAutoShuffleToDriversSeat, TRUE)
|
|
ENDIF
|
|
|
|
IF pedEnum = EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
|
|
OR pedEnum = EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
|
|
OR pedEnum = EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
|
|
OR pedEnum = EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
|
|
SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[pedEnum].ped, WEAPONTYPE_VEHICLE_PLAYER_BUZZARD)
|
|
ENDIF
|
|
|
|
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(enemyPed[pedEnum].ped)
|
|
SET_ENEMY_VARIATIONS(pedEnum)
|
|
|
|
enemyPed[pedEnum].bRegisteredDead = FALSE
|
|
enemyPed[pedEnum].bRagdolled = FALSE
|
|
enemyPed[pedEnum].bBlipped = FALSE
|
|
enemyPed[pedEnum].bPauseGuns = FALSE
|
|
enemyPed[pedEnum].iKillTime = -1
|
|
|
|
IF pedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_1
|
|
OR pedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_2
|
|
OR pedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_3
|
|
OR pedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_4
|
|
OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
|
|
OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
|
|
//OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
|
|
//OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_4
|
|
IF NOT SHOULD_THIS_SNIPER_FALL_ON_DEATH(pedEnum)
|
|
SET_ENTITY_HEALTH(enemyPed[pedEnum].ped, 100)
|
|
ENDIF
|
|
SET_PED_COMBAT_MOVEMENT(enemyPed[pedEnum].ped, CM_STATIONARY)
|
|
SET_PED_COMBAT_ATTRIBUTES(enemyPed[pedEnum].ped, CA_USE_COVER, FALSE)
|
|
|
|
IF pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
|
|
OR pedEnum = EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
|
|
TASK_SKY_DIVE(enemyPed[pedEnum].ped)
|
|
SET_ENTITY_LOD_DIST(enemyPed[pedEnum].ped, 1000)
|
|
SET_PED_PARACHUTE_TINT_INDEX(enemyPed[pedEnum].ped, 6)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(enemyPed[pedEnum].ped, FALSE)
|
|
ELSE
|
|
TASK_SHOOT_AT_ENTITY(enemyPed[pedEnum].ped, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
|
|
ENDIF
|
|
SET_PED_SHOOT_RATE(enemyPed[pedEnum].ped, 65)
|
|
SET_PED_COMBAT_ATTRIBUTES(enemyPed[pedEnum].ped, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(enemyPed[pedEnum].ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// fill wave properties
|
|
PROC FILL_ENEMY_WAVE_PROPERTIES(ENEMY_WAVE_ENUM waveEnum, ENEMY_VEHICLE_ENUM &firstVehicle, ENEMY_VEHICLE_ENUM &lastVehicle, ENEMY_PED_ENUM &firstPed, ENEMY_PED_ENUM &lastPed, BOOL &bHasVehicles)
|
|
bHasVehicles = TRUE
|
|
|
|
SWITCH waveEnum
|
|
CASE EW_SHOOTOUT_FIRST_WAVE
|
|
firstVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
lastVehicle = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
firstPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
|
|
lastPed = EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
|
|
BREAK
|
|
CASE EW_SHOOTOUT_SECOND_WAVE
|
|
firstVehicle = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
lastVehicle = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
firstPed = EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
|
|
lastPed = EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
|
|
BREAK
|
|
CASE EW_SHOOTOUT_THIRD_WAVE
|
|
firstPed = EP_SHOOTOUT_THIRD_WAVE_FOOT_1
|
|
lastPed = EP_SHOOTOUT_THIRD_WAVE_FOOT_4
|
|
bHasVehicles = FALSE
|
|
BREAK
|
|
CASE EW_SHOOTOUT_FOURTH_WAVE
|
|
firstVehicle = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
lastVehicle = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
firstPed = EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
|
|
lastPed = EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
|
|
BREAK
|
|
CASE EW_SHOOTOUT_FIFTH_WAVE
|
|
firstPed = EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
|
|
lastPed = EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
|
|
bHasVehicles = FALSE
|
|
BREAK
|
|
CASE EW_CHASE_FIRST_HELI_WAVE
|
|
firstVehicle = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
lastVehicle = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
firstPed = EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
|
|
lastPed = EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
|
|
BREAK
|
|
//CASE EW_CHASE_SECOND_HELI_WAVE
|
|
// firstVehicle = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
|
|
// lastVehicle = EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
|
|
// firstPed = EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PILOT
|
|
// lastPed = EP_CHASE_SECOND_HELI_WAVE_CHOPPER_1_PILOT
|
|
//BREAK
|
|
CASE EW_CHASE_FIRST_BOAT_WAVE
|
|
firstVehicle = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
lastVehicle = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
firstPed = EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
|
|
lastPed = EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
|
|
BREAK
|
|
//CASE EW_CHASE_SECOND_BOAT_WAVE
|
|
// firstVehicle = EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
|
|
// lastVehicle = EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
|
|
// firstPed = EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_DRIVER
|
|
// lastPed = EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_PASSFR
|
|
//BREAK
|
|
//CASE EW_CHASE_THIRD_BOAT_WAVE
|
|
// firstVehicle = EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
|
|
// lastVehicle = EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
|
|
// firstPed = EP_CHASE_THIRD_BOAT_WAVE_BOAT_1_DRIVER
|
|
// lastPed = EP_CHASE_THIRD_BOAT_WAVE_BOAT_1_PASSFR
|
|
//BREAK
|
|
//CASE EW_CHASE_FOURTH_BOAT_WAVE
|
|
// firstVehicle = EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
|
|
// lastVehicle = EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
|
|
// firstPed = EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_DRIVER
|
|
// lastPed = EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_PASSFR
|
|
//BREAK
|
|
//CASE EW_CHASE_BRIDGE_WAVE
|
|
// firstPed = EP_CHASE_BRIDGE_WAVE_FOOT_1
|
|
// lastPed = EP_CHASE_BRIDGE_WAVE_FOOT_4
|
|
// bHasVehicles = FALSE
|
|
//BREAK
|
|
CASE EW_CHASE_FIRST_CAR_WAVE
|
|
firstVehicle = EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
lastVehicle = EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
firstPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER
|
|
lastPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
|
|
BREAK
|
|
//CASE EW_FLEE_WAVE
|
|
// firstVehicle = EV_FLEE_WAVE_BOAT_1
|
|
// lastVehicle = EV_FLEE_WAVE_BOAT_2
|
|
// firstPed = EP_FLEE_WAVE_BOAT_1_DRIVER
|
|
// lastPed = EP_FLEE_WAVE_BOAT_2_PASSFR
|
|
//BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
|
|
// blip enemy wave
|
|
PROC BLIP_ENEMY_WAVE(ENEMY_WAVE_ENUM waveEnum, BOOL bBlip = TRUE)
|
|
INT i
|
|
ENEMY_VEHICLE_ENUM firstVehicle
|
|
ENEMY_VEHICLE_ENUM lastVehicle
|
|
ENEMY_PED_ENUM firstPed
|
|
ENEMY_PED_ENUM lastPed
|
|
BOOL bHasVehicles
|
|
|
|
FILL_ENEMY_WAVE_PROPERTIES(waveEnum, firstVehicle, lastVehicle, firstPed, lastPed, bHasVehicles)
|
|
|
|
FOR i=firstPed TO lastPed
|
|
enemyPed[i].bBlipped = bBlip
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
// create enemy wave
|
|
PROC CREATE_ENEMY_WAVE(ENEMY_WAVE_ENUM waveEnum, BOOL bBlip, MISSION_STAGE_ENUM createStage)
|
|
INT i
|
|
ENEMY_VEHICLE_ENUM firstVehicle
|
|
ENEMY_VEHICLE_ENUM lastVehicle
|
|
ENEMY_PED_ENUM firstPed
|
|
ENEMY_PED_ENUM lastPed
|
|
BOOL bHasVehicles
|
|
|
|
FILL_ENEMY_WAVE_PROPERTIES(waveEnum, firstVehicle, lastVehicle, firstPed, lastPed, bHasVehicles)
|
|
|
|
IF bHasVehicles
|
|
FOR i=firstVehicle TO lastVehicle
|
|
CREATE_ENEMY_VEHICLE(INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i), createStage)
|
|
ENDFOR
|
|
ENDIF
|
|
FOR i=firstPed TO lastPed
|
|
CREATE_ENEMY_PED(INT_TO_ENUM(ENEMY_PED_ENUM, i))
|
|
ENDFOR
|
|
|
|
// special attribs.
|
|
SWITCH waveEnum
|
|
CASE EW_SHOOTOUT_FIRST_WAVE
|
|
BREAK
|
|
CASE EW_CHASE_FIRST_HELI_WAVE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iCreatedWaveTime[waveEnum] = GET_GAME_TIMER()
|
|
BLIP_ENEMY_WAVE(waveEnum, bBlip)
|
|
ENDPROC
|
|
|
|
// get health to explode enemy
|
|
FUNC INT GET_ENEMY_VEHICLE_EXPLODE_HEALTH(ENEMY_VEHICLE_ENUM vehicleEnum)
|
|
SWITCH vehicleEnum
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
RETURN 800
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
RETURN 450
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
RETURN 600
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
RETURN 860//600
|
|
BREAK
|
|
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
RETURN 860//550
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
RETURN 870//660
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
RETURN 820//650
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
RETURN 600
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
RETURN 500
|
|
BREAK
|
|
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
|
|
// RETURN 700
|
|
//BREAK
|
|
//CASE EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
|
|
// RETURN 550
|
|
//BREAK
|
|
//CASE EV_FLEE_WAVE_BOAT_1
|
|
// RETURN 400
|
|
//BREAK
|
|
//CASE EV_FLEE_WAVE_BOAT_2
|
|
// RETURN 550
|
|
//BREAK
|
|
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
// CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
RETURN 600
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN -1000
|
|
ENDFUNC
|
|
|
|
// should we stop playback on this vehicle
|
|
FUNC BOOL HANDLE_STOP_PLAYBACK_FOR_ENEMY_VEHICLE(ENEMY_VEHICLE_ENUM vehicleEnum)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[vehicleEnum].veh)
|
|
FLOAT fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(enemyVehicle[vehicleEnum].veh)
|
|
FLOAT fStopDistance = -1
|
|
FLOAT fStopTime = 99999999
|
|
BOOL bStopGreaterX = FALSE
|
|
VEHICLE_INDEX stopForVehicle = NULL
|
|
|
|
SWITCH vehicleEnum
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
fStopTime = 30500
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
// fStopTime = 4000.0
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
fStopTime = 22800.0
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
// fStopTime = 13000.0
|
|
BREAK
|
|
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
fStopTime = 25000.0
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
fStopTime = 13800.0
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
stopForVehicle = enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh
|
|
fStopDistance = 60.0
|
|
bStopGreaterX = TRUE
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
stopForVehicle = enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh
|
|
fStopDistance = 40.0
|
|
bStopGreaterX = TRUE
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
fStopDistance = 35.0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF fPlaybackTime >= fStopTime
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
|
|
RETURN TRUE
|
|
ELSE
|
|
IF fStopDistance >= 0.0
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), enemyVehicle[vehicleEnum].veh, FALSE) < fStopDistance
|
|
AND NOT enemyVehicle[vehicleEnum].bInSlowdownArea
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bStopGreaterX
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR vVehiclePos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
|
|
IF vVehiclePos.x < vPlayerPos.x + 20
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(stopForVehicle)
|
|
IF IS_ENTITY_AT_COORD(stopForVehicle, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(enemyVehicle[vehicleEnum].veh, <<0,12,0>>), <<5,5,5>>)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(stopForVehicle)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
// IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
/// IF IS_ENTITY_AT_ENTITY(enemyVehicle[vehicleEnum].veh, enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, <<6,6,6>>, FALSE, FALSE)
|
|
// STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[vehicleEnum].veh)
|
|
// RETURN TRUE
|
|
// ENDIF
|
|
// ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// convert rot to dir
|
|
FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR v_rot)
|
|
RETURN <<-SIN(v_rot.z) * COS(v_rot.x), COS(v_rot.z) * COS(v_rot.x), SIN(v_rot.x)>>
|
|
ENDFUNC
|
|
|
|
// handle sniper ragdoll
|
|
PROC HANDLE_SNIPER_RAGDOLL(ENEMY_PED_ENUM thisPed)
|
|
IF NOT enemyPed[thisPed].bRagdolled
|
|
IF NOT IS_PED_INJURED(enemyPed[thisPed].ped)
|
|
IF SHOULD_THIS_SNIPER_FALL_ON_DEATH(thisPed)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyPed[thisPed].ped, PLAYER_PED_ID())
|
|
IF CAN_PED_RAGDOLL(enemyPed[thisPed].ped)
|
|
FLOAT fHeading
|
|
SWITCH thisPed
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_1
|
|
fHeading = -95.1
|
|
BREAK
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_2
|
|
fHeading = -97.4
|
|
BREAK
|
|
CASE EP_SHOOTOUT_THIRD_WAVE_FOOT_4
|
|
fHeading = -93.7
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_1
|
|
fHeading = -108.1
|
|
BREAK
|
|
//CASE EP_SHOOTOUT_FIFTH_WAVE_FOOT_3
|
|
// fHeading = -148.6
|
|
//BREAK
|
|
ENDSWITCH
|
|
|
|
SET_PED_CAN_BE_TARGETTED(enemyPed[thisPed].ped, FALSE)
|
|
SET_PED_TO_RAGDOLL_WITH_FALL(enemyPed[thisPed].ped, 10000, 20000, TYPE_DIE_FROM_HIGH, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0,0,fHeading>>), 29.4, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
enemyPed[thisPed].bRagdolled = TRUE
|
|
enemyPed[thisPed].iRagdollTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(enemyPed[thisPed].ped)
|
|
VECTOR vSniperPos = GET_ENTITY_COORDS(enemyPed[thisPed].ped)
|
|
IF vSniperPos.z < 30.0
|
|
OR GET_GAME_TIMER() >= enemyPed[thisPed].iRagdollTime + 6000
|
|
APPLY_DAMAGE_TO_PED(enemyPed[thisPed].ped, 1000, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// should slow down?
|
|
FUNC BOOL IS_VEHICLE_AT_RAPIDS_SLOW_DOWN_AREA(VEHICLE_INDEX veh, BOOL bIsPlayer = TRUE)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
INT i
|
|
REPEAT 7 i
|
|
FLOAT fDistance
|
|
VECTOR vPos
|
|
|
|
SWITCH i
|
|
CASE 0
|
|
vPos = <<-877.51624, 4415.30225, 14.12306>>
|
|
fDistance = 25
|
|
BREAK
|
|
CASE 1
|
|
vPos = <<-957.37915, 4373.69629, 9.68289>>
|
|
IF bIsPlayer
|
|
fDistance = 18
|
|
ELSE
|
|
fDistance = 18//30
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
vPos = <<-1126.07434, 4400.73340, 9.71688>>
|
|
IF bIsPlayer
|
|
fDistance = 50
|
|
ELSE
|
|
fDistance = 50
|
|
//fDistance = 55
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
vPos = <<-1251.55200, 4377.40820, 4.73851>>
|
|
fDistance = 23
|
|
BREAK
|
|
|
|
CASE 4
|
|
vPos = <<-1358.41895, 4329.70166, 1.44652>>
|
|
fDistance = 45
|
|
BREAK
|
|
CASE 5
|
|
vPos = <<-1567.03735, 4360.92529, 0.04132>>
|
|
IF bIsPlayer
|
|
fDistance = 28
|
|
ELSE
|
|
fDistance = 28
|
|
//fDistance = 35
|
|
ENDIF
|
|
BREAK
|
|
CASE 6
|
|
vPos = <<-1716.22656, 4484.72266, 0.00000>>
|
|
IF bIsPlayer
|
|
fDistance = 0
|
|
ELSE
|
|
fDistance = 0
|
|
//fDistance = 45
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF IS_ENTITY_AT_COORD(veh, vPos, <<fDistance,fDistance,fDistance>>, FALSE, FALSE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// get goto pos for chase chopper
|
|
FUNC VECTOR GET_CHOPPER_NODE(INT iPos)
|
|
SWITCH iPos
|
|
CASE 0
|
|
RETURN <<-571.55, 4427.86, 34.62>>
|
|
BREAK
|
|
CASE 1
|
|
RETURN <<-865.79, 4416.12, 34.57>>
|
|
BREAK
|
|
CASE 2
|
|
RETURN <<-988.98, 4367.28, 27.33>>
|
|
BREAK
|
|
CASE 3
|
|
RETURN <<-1174.79, 4397.0, 27.97>>
|
|
BREAK
|
|
CASE 4
|
|
RETURN <<-1372.43, 4324.25, 18.53>>
|
|
BREAK
|
|
CASE 5
|
|
RETURN <<-1572.65, 4370.89, 16.13>>
|
|
BREAK
|
|
CASE 6
|
|
RETURN <<-1883.87, 4703.35, 20.73>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
// get a heading normalised between 0 and 360
|
|
FUNC FLOAT NORMALISE_HEADING(FLOAT fHeading)
|
|
FLOAT fReturn = fHeading
|
|
IF fReturn < 0
|
|
fReturn += 360
|
|
ELIF fReturn > 360
|
|
fReturn -= 360
|
|
ENDIF
|
|
RETURN fReturn
|
|
ENDFUNC
|
|
|
|
// get closest waypoint
|
|
FUNC INT GET_CLOSEST_BOAT_WAYPOINT(VEHICLE_INDEX boatVeh, STRING sRoute, BOOL bEnforceXGreater = TRUE, BOOL bAdd = FALSE)
|
|
INT iClosestWaypoint
|
|
VECTOR vClosestWaypoint
|
|
VECTOR vBoatPos
|
|
vBoatPos = GET_ENTITY_COORDS(boatVeh)
|
|
BOOL bFoundLaterWaypoint
|
|
bFoundLaterWaypoint = FALSE
|
|
INT iWaypointSearchCounter
|
|
iWaypointSearchCounter = 1
|
|
WHILE NOT bFoundLaterWaypoint
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(sRoute, vBoatPos + <<-15 * iWaypointSearchCounter,0,0>>, iClosestWaypoint)
|
|
WAYPOINT_RECORDING_GET_COORD(sRoute, iClosestWaypoint, vClosestWaypoint)
|
|
IF vClosestWaypoint.x < vBoatPos.x
|
|
OR NOT bEnforceXGreater
|
|
bFoundLaterWaypoint = TRUE
|
|
ELSE
|
|
iWaypointSearchCounter++
|
|
IF iWaypointSearchCounter > 3
|
|
iClosestWaypoint = -1
|
|
bFoundLaterWaypoint = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF bAdd
|
|
INT iAddedWaypoint = iClosestWaypoint + 10
|
|
INT iNumpoints
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(sRoute, iNumpoints)
|
|
IF iAddedWaypoint < iNumpoints - 1
|
|
iClosestWaypoint = iAddedWaypoint
|
|
ELSE
|
|
iClosestWaypoint = iNumpoints - 1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN iClosestWaypoint
|
|
ENDFUNC
|
|
|
|
FUNC BOOL CAN_BOAT_DRIVE(VEHICLE_INDEX veh)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_HEALTH(veh) > 550
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// get the enemy ai from the stage
|
|
PROC SET_ENEMY_VEHICLE_AI_FOR_STAGE(ENEMY_VEHICLE_ENUM vehicleEnum, PED_INDEX vehicleDriver)
|
|
ENEMY_VEHICLE_AI_ENUM setAIEnum = EVAI_NONE
|
|
VECTOR vTarget
|
|
FLOAT fTargetRadius = 3.0
|
|
TEMPACTION temporaryAction
|
|
VEHICLE_MISSION vehicleMission = MISSION_NONE
|
|
INT iActionTime = -1
|
|
FLOAT fSpeed = 20.0
|
|
FLOAT fOrientation = -1
|
|
INT iFlightHeight = 10
|
|
INT iHeightAboveTerrain = 5
|
|
STRING sRoute
|
|
|
|
// get the task details
|
|
SWITCH vehicleEnum
|
|
// FIRST WAVE
|
|
// boat 1
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
CASE 1
|
|
setAIEnum = EVAI_ANCHOR
|
|
BREAK
|
|
CASE 20
|
|
setAIEnum = EVAI_FOLLOW_WAYPOINT
|
|
fSpeed = 5.0
|
|
vTarget = <<-460.66696, 4443.94824, 29.99993>>
|
|
fTargetRadius = 3.5
|
|
BREAK
|
|
CASE 21
|
|
setAIEnum = EVAI_TEMPACTION
|
|
temporaryAction = TEMPACT_SWERVERIGHT_STOP
|
|
iActionTime = 4000
|
|
BREAK
|
|
CASE 22
|
|
setAIEnum = EVAI_ANCHOR
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
// boat 2
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
CASE 1
|
|
setAIEnum = EVAI_ANCHOR
|
|
BREAK
|
|
CASE 20
|
|
setAIEnum = EVAI_FOLLOW_WAYPOINT
|
|
fSpeed = 5.0
|
|
vTarget = <<-460.88925, 4433.06152, 29.99993>>
|
|
fTargetRadius = 6
|
|
BREAK
|
|
CASE 21
|
|
setAIEnum = EVAI_TEMPACTION
|
|
temporaryAction = TEMPACT_SWERVERIGHT_STOP
|
|
iActionTime = 4000
|
|
BREAK
|
|
CASE 22
|
|
setAIEnum = EVAI_ANCHOR
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
// boat 3
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
CASE 1
|
|
setAIEnum = EVAI_ANCHOR
|
|
BREAK
|
|
CASE 20
|
|
setAIEnum = EVAI_FOLLOW_WAYPOINT
|
|
fSpeed = 5.0
|
|
vTarget = <<-481.99393, 4407.47803, 29.99993>>
|
|
fTargetRadius = 6
|
|
BREAK
|
|
CASE 21
|
|
setAIEnum = EVAI_TEMPACTION
|
|
temporaryAction = TEMPACT_SWERVERIGHT_STOP
|
|
iActionTime = 4000
|
|
BREAK
|
|
CASE 22
|
|
setAIEnum = EVAI_ANCHOR
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
// chopper 1
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
CASE 1
|
|
setAIEnum = EVAI_CHOPPER_ATTACK
|
|
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID())
|
|
iFlightHeight = 48
|
|
iHeightAboveTerrain = 4
|
|
iActionTime = 7000
|
|
BREAK
|
|
CASE 2
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
vTarget = <<-508.31, 4448.87, 48.27>>
|
|
fTargetRadius = 8.0
|
|
fSpeed = 25.0
|
|
iFlightHeight = 48
|
|
iHeightAboveTerrain = 5
|
|
fOrientation = 161//-1//124
|
|
BREAK
|
|
CASE 3
|
|
/*
|
|
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
|
|
fOrientation = 200
|
|
iActionTime = 2000
|
|
*/
|
|
setAIEnum = EVAI_CHOPPER_ATTACK
|
|
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID())
|
|
iFlightHeight = 48
|
|
iHeightAboveTerrain = 4
|
|
iActionTime = 7000
|
|
BREAK
|
|
CASE 4
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
//vTarget = <<-524.90, 4401.21, 35.61>>
|
|
vTarget = <<-522.73, 4410.99, 37.33>>
|
|
fTargetRadius = 10.0
|
|
fSpeed = 20.0
|
|
iFlightHeight = 37
|
|
iHeightAboveTerrain = 2
|
|
fOrientation = -106//179//200
|
|
BREAK
|
|
CASE 5
|
|
/*
|
|
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
|
|
fOrientation = 200
|
|
iActionTime = 2000
|
|
*/
|
|
setAIEnum = EVAI_CHOPPER_ATTACK
|
|
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID())
|
|
iFlightHeight = 34
|
|
iHeightAboveTerrain = 4
|
|
BREAK
|
|
|
|
/*
|
|
// rotate to face opposite way
|
|
CASE 50
|
|
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
|
|
fOrientation = 320
|
|
iActionTime = 4000
|
|
BREAK
|
|
// escape
|
|
CASE 99
|
|
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
|
|
fOrientation = 270
|
|
iActionTime = 4000
|
|
BREAK
|
|
CASE 100
|
|
setAIEnum = EVAI_CHOPPER_ATTACK
|
|
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID()) + 3.0
|
|
iFlightHeight = 34
|
|
iHeightAboveTerrain = 4
|
|
BREAK
|
|
CASE 101
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
vTarget = GET_TRAIN_CRASH_VECTOR(TCVEC_GUNS_CHOPPER_HOVER)
|
|
fTargetRadius = 0.1
|
|
fSpeed = 15.0
|
|
iFlightHeight = CEIL(vTarget.z)
|
|
iHeightAboveTerrain = 4
|
|
VECTOR vChopperPos
|
|
vChopperPos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
|
|
VECTOR vTargetPos
|
|
vTargetPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
fOrientation = GET_HEADING_FROM_VECTOR_2D(vTargetPos.x - vChopperPos.x, vTargetPos.y - vChopperPos.y)
|
|
fOrientation = NORMALISE_HEADING(fOrientation)
|
|
BREAK
|
|
*/
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
// chopper 2
|
|
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
CASE 1
|
|
setAIEnum = EVAI_FLY_ACHIEVE_HEADING
|
|
fOrientation = 156
|
|
iActionTime = 100
|
|
BREAK
|
|
CASE 2
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
vTarget = <<-475.15, 4444.42, 39.26>>
|
|
fTargetRadius = 5.0
|
|
fSpeed = 30.0
|
|
iFlightHeight = 30
|
|
iHeightAboveTerrain = 7
|
|
fOrientation = 113
|
|
BREAK
|
|
CASE 3
|
|
setAIEnum = EVAI_CHOPPER_ATTACK_COORD
|
|
vTarget = <<-491.76651, 4435.12305, 30.49994>>
|
|
fTargetRadius = 25
|
|
iFlightHeight = 30
|
|
iHeightAboveTerrain = 7
|
|
iActionTime = GET_RANDOM_INT_IN_RANGE(9000, 13000)
|
|
BREAK
|
|
CASE 4
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
vTarget = <<-475.2, 4438.42, 39.26>>
|
|
fTargetRadius = 7.0
|
|
fSpeed = 30.0
|
|
iFlightHeight = 30
|
|
iHeightAboveTerrain = 7
|
|
fOrientation = 92
|
|
BREAK
|
|
CASE 5
|
|
setAIEnum = EVAI_CHOPPER_ATTACK_COORD
|
|
vTarget = <<-491.76651, 4435.12305, 30.49994>>
|
|
fTargetRadius = 25
|
|
iFlightHeight = 30
|
|
iHeightAboveTerrain = 7
|
|
iActionTime = GET_RANDOM_INT_IN_RANGE(9000, 13000)
|
|
BREAK
|
|
|
|
/*
|
|
CASE 3
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
vTarget = GET_TRAIN_CRASH_VECTOR(TCVEC_DROPOFF_CHOPPER_HOVER)
|
|
fTargetRadius = 0.1
|
|
fSpeed = 10.0
|
|
iFlightHeight = CEIL(vTarget.z)
|
|
iHeightAboveTerrain = 15
|
|
VECTOR vChopperPos
|
|
vChopperPos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
|
|
VECTOR vTargetPos
|
|
vTargetPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
fOrientation = GET_HEADING_FROM_VECTOR_2D(vTargetPos.x - vChopperPos.x, vTargetPos.y - vChopperPos.y)
|
|
fOrientation = NORMALISE_HEADING(fOrientation)
|
|
BREAK
|
|
*/
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
|
|
// chopper 3
|
|
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
CASE 1
|
|
/*
|
|
setAIEnum = EVAI_CHOPPER_ATTACK
|
|
fTargetRadius = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[vehicleEnum].veh, PLAYER_PED_ID()) + 3.0
|
|
iFlightHeight = 81
|
|
iHeightAboveTerrain = 2
|
|
*/
|
|
//vTarget = <<-524.90, 4401.21, 35.61>>
|
|
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
vTarget = <<-505.21, 4467.72, 79.31>>
|
|
fTargetRadius = 8.0
|
|
fSpeed = 30.0
|
|
iFlightHeight = 93
|
|
iHeightAboveTerrain = 5
|
|
fOrientation = 200
|
|
|
|
BREAK
|
|
/*
|
|
CASE 3
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
vTarget = GET_TRAIN_CRASH_VECTOR(TCVEC_DROPOFF_CHOPPER_HOVER)
|
|
fTargetRadius = 0.1
|
|
fSpeed = 10.0
|
|
iFlightHeight = CEIL(vTarget.z)
|
|
iHeightAboveTerrain = 15
|
|
VECTOR vChopperPos
|
|
vChopperPos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
|
|
VECTOR vTargetPos
|
|
vTargetPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
fOrientation = GET_HEADING_FROM_VECTOR_2D(vTargetPos.x - vChopperPos.x, vTargetPos.y - vChopperPos.y)
|
|
fOrientation = NORMALISE_HEADING(fOrientation)
|
|
BREAK
|
|
*/
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
|
|
|
|
// FIRST HELI WAVE
|
|
// chopper 1
|
|
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
/*
|
|
CASE 1
|
|
setAIEnum = EVAI_FLY_TO_COORD
|
|
vTarget = <<-1154.83, 4402.65, 14.95>>
|
|
fTargetRadius = 20.0
|
|
fSpeed = 40.0
|
|
iFlightHeight = 14
|
|
iHeightAboveTerrain = 5
|
|
BREAK
|
|
*/
|
|
CASE 1
|
|
setAIEnum = EVAI_CHOPPER_STRAFE
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
|
|
// SECOND HELI WAVE
|
|
// chopper 1
|
|
//CASE EV_CHASE_SECOND_HELI_WAVE_CHOPPER_1
|
|
// SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
// CASE 99
|
|
// setAIEnum = EVAI_CHOPPER_GUNS_STATIC
|
|
// BREAK
|
|
// ENDSWITCH
|
|
//BREAK
|
|
|
|
// FIRST BOAT WAVE
|
|
// boat 1
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
//CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_3
|
|
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
|
|
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
|
|
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
|
|
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
|
|
//CASE EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
CASE 1
|
|
setAIEnum = EVAI_FOLLOW_WAYPOINT
|
|
fSpeed = 20.0
|
|
BREAK
|
|
CASE 2
|
|
setAIEnum = EVAI_FOLLOW_DINGHY
|
|
IF vehicleEnum = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
vehicleMission = MISSION_ESCORT_LEFT
|
|
ELSE
|
|
vehicleMission = MISSION_ESCORT_RIGHT
|
|
ENDIF
|
|
fSpeed = 50.0
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
CASE 99
|
|
setAIEnum = EVAI_CAR_DRIVE_ALONG_RIVER
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
// FLEE WAVE
|
|
// boat 1
|
|
//CASE EV_FLEE_WAVE_BOAT_1
|
|
//CASE EV_FLEE_WAVE_BOAT_2
|
|
// SWITCH enemyVehicle[vehicleEnum].iAiStage
|
|
// CASE 99
|
|
// setAIEnum = EVAI_FOLLOW_DINGHY
|
|
// fSpeed = 32.0
|
|
// BREAK
|
|
// ENDSWITCH
|
|
//BREAK
|
|
ENDSWITCH
|
|
|
|
// apply the task
|
|
SWITCH setAIEnum
|
|
CASE EVAI_TEMPACTION
|
|
TASK_VEHICLE_TEMP_ACTION(vehicleDriver, enemyVehicle[vehicleEnum].veh, temporaryAction, iActionTime)
|
|
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
|
|
BREAK
|
|
CASE EVAI_DRIVE_TO_COORD
|
|
TASK_VEHICLE_DRIVE_TO_COORD(vehicleDriver, enemyVehicle[vehicleEnum].veh, vTarget, fSpeed, DRIVINGSTYLE_ACCURATE, GET_ENTITY_MODEL(enemyVehicle[vehicleEnum].veh), DRIVINGMODE_PLOUGHTHROUGH, 1.0, 300.0)
|
|
enemyVehicle[vehicleEnum].vTarget = vTarget
|
|
enemyVehicle[vehicleEnum].vTargetRadius = <<fTargetRadius,fTargetRadius,fTargetRadius>>
|
|
IF iActionTime > 0
|
|
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
|
|
ELSE
|
|
enemyVehicle[vehicleEnum].iTerminateActionTime = -1
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_FOLLOW_DINGHY
|
|
IF vehicleMission = MISSION_NONE
|
|
vehicleMission = MISSION_ESCORT_REAR
|
|
ENDIF
|
|
TASK_VEHICLE_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, trainCrashVehicle[TCV_DINGHY], vehicleMission, fSpeed, DRIVINGMODE_AVOIDCARS, 35, -1)
|
|
BREAK
|
|
CASE EVAI_FOLLOW_WAYPOINT
|
|
INT iClosestWaypoint
|
|
SWITCH vehicleEnum
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
sRoute = "exile32"
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
sRoute = "exile33"
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
sRoute = "exile36"
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
sRoute = "exile37"
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
sRoute = "exile38"
|
|
BREAK
|
|
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_1
|
|
/// sRoute = "exile38"
|
|
//BREAK
|
|
//CASE EV_CHASE_SECOND_BOAT_WAVE_BOAT_2
|
|
// sRoute = "exile39"
|
|
//BREAK
|
|
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_1
|
|
// sRoute = "exile35"
|
|
//BREAK
|
|
//CASE EV_CHASE_THIRD_BOAT_WAVE_BOAT_2
|
|
// sRoute = "exile36"
|
|
//BREAK
|
|
//CASE EV_CHASE_FOURTH_BOAT_WAVE_BOAT_1
|
|
// sRoute = "exile37"
|
|
//BREAK
|
|
ENDSWITCH
|
|
IF currentMissionStage <> STAGE_STEAL_FROM_CONTAINER
|
|
iClosestWaypoint = GET_CLOSEST_BOAT_WAYPOINT(enemyVehicle[vehicleEnum].veh, sRoute)
|
|
ELSE
|
|
enemyVehicle[vehicleEnum].vTarget = vTarget
|
|
enemyVehicle[vehicleEnum].vTargetRadius = <<fTargetRadius,fTargetRadius,fTargetRadius>>
|
|
iClosestWaypoint = 0
|
|
ENDIF
|
|
IF iClosestWaypoint >= 0
|
|
SET_BOAT_ANCHOR(enemyVehicle[vehicleEnum].veh, FALSE)
|
|
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(vehicleDriver, enemyVehicle[vehicleEnum].veh, sRoute, DRIVINGMODE_PLOUGHTHROUGH, iClosestWaypoint, EWAYPOINT_DEFAULT, -1, fSpeed)
|
|
SET_BOAT_DISABLE_AVOIDANCE(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_ANCHOR
|
|
//FREEZE_ENTITY_POSITION(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
//SET_ENTITY_LOAD_COLLISION_FLAG(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
//TASK_VEHICLE_TEMP_ACTION(vehicleDriver, enemyVehicle[vehicleEnum].veh, TEMPACT_WAIT, 2000)
|
|
BREAK
|
|
CASE EVAI_FLY_TO_COORD
|
|
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, NULL, vTarget, MISSION_GOTO, fSpeed, fTargetRadius, fOrientation, iFlightHeight, iHeightAboveTerrain)
|
|
enemyVehicle[vehicleEnum].vTarget = vTarget
|
|
enemyVehicle[vehicleEnum].vTargetRadius = <<fTargetRadius,fTargetRadius,fTargetRadius>>
|
|
BREAK
|
|
CASE EVAI_FLY_ACHIEVE_HEADING
|
|
VECTOR vChopperPos
|
|
vChopperPos = GET_ENTITY_COORDS(enemyVehicle[vehicleEnum].veh)
|
|
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, NULL, vChopperPos, MISSION_GOTO, 10, 10, fOrientation, FLOOR(vChopperPos.z), 1)
|
|
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
|
|
BREAK
|
|
CASE EVAI_CHOPPER_ATTACK
|
|
SET_PED_FIRING_PATTERN(vehicleDriver, FIRING_PATTERN_FULL_AUTO)
|
|
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, PLAYER_PED_ID(), <<0,0,0>>, MISSION_ATTACK, 10, fTargetRadius, fOrientation, iFlightHeight, iHeightAboveTerrain)
|
|
IF iActionTime > 0
|
|
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
|
|
ELSE
|
|
enemyVehicle[vehicleEnum].iTerminateActionTime = -1
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_CHOPPER_ATTACK_COORD
|
|
SET_PED_FIRING_PATTERN(vehicleDriver, FIRING_PATTERN_FULL_AUTO)
|
|
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, NULL, vTarget, MISSION_ATTACK, 10, fTargetRadius, fOrientation, iFlightHeight, iHeightAboveTerrain)
|
|
IF iActionTime > 0
|
|
enemyVehicle[vehicleEnum].iTerminateActionTime = GET_GAME_TIMER() + iActionTime
|
|
ELSE
|
|
enemyVehicle[vehicleEnum].iTerminateActionTime = -1
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_CHOPPER_STRAFE
|
|
|
|
//IF NOT IS_PED_INJURED(dummyBoatPed)
|
|
SET_PED_FIRING_PATTERN(vehicleDriver, FIRING_PATTERN_FULL_AUTO)
|
|
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, trainCrashVehicle[TCV_DINGHY], NULL, <<0,0,0>>, MISSION_ATTACK, 65, 25.0, -1, 16, 6) // 35.0 dist 19 height
|
|
|
|
// FLOAT CruiseSpeed, FLOAT TargetReachedDist, FLOAT HeliOrientation, INT FlightHeight, INT MinHeightAboveTerrain)
|
|
//ENDIF
|
|
BREAK
|
|
CASE EVAI_CHOPPER_GUNS_STATIC
|
|
SET_PED_FIRING_PATTERN(vehicleDriver, FIRING_PATTERN_FULL_AUTO)
|
|
TASK_HELI_MISSION(vehicleDriver, enemyVehicle[vehicleEnum].veh, NULL, PLAYER_PED_ID(), <<0,0,0>>, MISSION_ATTACK, 0, 5.0, 0, 0, 0)
|
|
BREAK
|
|
CASE EVAI_CAR_DRIVE_ALONG_RIVER
|
|
INT iStart
|
|
SWITCH vehicleEnum
|
|
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
sRoute = "exile34"
|
|
iStart = 4
|
|
BREAK
|
|
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
// sRoute = "exile39"
|
|
// iStart = 4
|
|
//BREAK
|
|
ENDSWITCH
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(vehicleDriver, enemyVehicle[vehicleEnum].veh, sRoute, DRIVINGMODE_PLOUGHTHROUGH, iStart)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
enemyVehicle[vehicleEnum].aiEnum = setAIEnum
|
|
ENDPROC
|
|
|
|
// do enemy vehicle AI
|
|
PROC DO_ENEMY_VEHICLE_AI(ENEMY_VEHICLE_ENUM vehicleEnum)
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[vehicleEnum].veh)
|
|
IF enemyVehicle[vehicleEnum].aiEnum <> EVAI_NONE
|
|
PED_INDEX vehicleDriver = GET_PED_IN_VEHICLE_SEAT(enemyVehicle[vehicleEnum].veh, VS_DRIVER)
|
|
IF NOT IS_PED_INJURED(vehicleDriver)
|
|
BOOL bDoNextAIStage = FALSE
|
|
BOOL bRepeatStage = FALSE
|
|
SWITCH enemyVehicle[vehicleEnum].aiEnum
|
|
CASE EVAI_FOLLOW_RECORDING
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[vehicleEnum].veh)
|
|
OR HANDLE_STOP_PLAYBACK_FOR_ENEMY_VEHICLE(vehicleEnum)
|
|
bDoNextAIStage = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_FOLLOW_WAYPOINT
|
|
IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER
|
|
IF IS_ENTITY_AT_COORD(enemyVehicle[vehicleEnum].veh, enemyVehicle[vehicleEnum].vTarget, enemyVehicle[vehicleEnum].vTargetRadius, FALSE, FALSE)
|
|
bDoNextAIStage = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_TEMPACTION
|
|
IF GET_GAME_TIMER() >= enemyVehicle[vehicleEnum].iTerminateActionTime
|
|
bDoNextAIStage = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_DRIVE_TO_COORD
|
|
IF IS_ENTITY_AT_COORD(enemyVehicle[vehicleEnum].veh, enemyVehicle[vehicleEnum].vTarget, enemyVehicle[vehicleEnum].vTargetRadius, FALSE, FALSE)
|
|
OR (enemyVehicle[vehicleEnum].iTerminateActionTime >= 0 AND GET_GAME_TIMER() >= enemyVehicle[vehicleEnum].iTerminateActionTime)
|
|
bDoNextAIStage = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_FLY_TO_COORD
|
|
IF IS_ENTITY_AT_COORD(enemyVehicle[vehicleEnum].veh, enemyVehicle[vehicleEnum].vTarget, enemyVehicle[vehicleEnum].vTargetRadius)
|
|
bDoNextAIStage = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_FLY_ACHIEVE_HEADING
|
|
IF GET_GAME_TIMER() >= enemyVehicle[vehicleEnum].iTerminateActionTime
|
|
bDoNextAIStage = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_CHOPPER_STRAFE
|
|
BREAK
|
|
CASE EVAI_CHOPPER_ATTACK
|
|
CASE EVAI_CHOPPER_ATTACK_COORD
|
|
IF enemyVehicle[vehicleEnum].iTerminateActionTime >= 0 AND GET_GAME_TIMER() >= enemyVehicle[vehicleEnum].iTerminateActionTime
|
|
bDoNextAIStage = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE EVAI_ANCHOR
|
|
//IF NOT HAS_ENTITY_COLLIDED_WITH_ANYTHING(enemyVehicle[vehicleEnum].veh)
|
|
printstring("anchor ") printint(enum_to_int(vehicleEnum)) PRINTNL()
|
|
SET_BOAT_ANCHOR(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
//FREEZE_ENTITY_POSITION(enemyVehicle[vehicleEnum].veh, TRUE)
|
|
bDoNextAIStage = TRUE
|
|
//ELSE
|
|
// printstring("colliding ") printint(enum_to_int(vehicleEnum)) PRINTNL()
|
|
//ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bDoNextAIStage
|
|
enemyVehicle[vehicleEnum].iAiStage++
|
|
SET_ENEMY_VEHICLE_AI_FOR_STAGE(vehicleEnum, vehicleDriver)
|
|
ELIF bRepeatStage
|
|
SET_ENEMY_VEHICLE_AI_FOR_STAGE(vehicleEnum, vehicleDriver)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// force enemy ai stage
|
|
PROC FORCE_ENEMY_VEHICLE_AI_STAGE(ENEMY_VEHICLE_ENUM vehicleEnum, INT iStage)
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[vehicleEnum].veh)
|
|
PED_INDEX vehicleDriver = GET_PED_IN_VEHICLE_SEAT(enemyVehicle[vehicleEnum].veh, VS_DRIVER)
|
|
IF NOT IS_PED_INJURED(vehicleDriver)
|
|
enemyVehicle[vehicleEnum].iAiStage = iStage
|
|
SET_ENEMY_VEHICLE_AI_FOR_STAGE(vehicleEnum, vehicleDriver)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// get the closest point in the recording to where the vehicle currently is
|
|
PROC CALCULATE_POINT_TO_START_DRIVE_RECORDING(VEHICLE_INDEX veh, INT iRec, FLOAT &fReturnTime, VECTOR &vReturnPos)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
VECTOR vStartCalculationPos
|
|
|
|
vStartCalculationPos = GET_ENTITY_COORDS(veh)
|
|
|
|
VECTOR vUpPointPos
|
|
VECTOR vDownPointPos
|
|
VECTOR vBestPointPos
|
|
FLOAT fCheckRecordingTime = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iRec, GET_TRAIN_CRASH_RECORDING_PREFIX()) / 2
|
|
FLOAT fSearchUpDownTime = fCheckRecordingTime / 2
|
|
FLOAT fUpTime
|
|
FLOAT fDownTime
|
|
FLOAT fUpDistanceFromPos
|
|
FLOAT fDownDistanceFromPos
|
|
INT iChecksPerformed = 0
|
|
|
|
WHILE iChecksPerformed < 80
|
|
// check up distance
|
|
fUpTime = fCheckRecordingTime + fSearchUpDownTime
|
|
vUpPointPos = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iRec, fUpTime, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
fUpDistanceFromPos = GET_DISTANCE_BETWEEN_COORDS(vStartCalculationPos, vUpPointPos)
|
|
|
|
// check down distance
|
|
fDownTime = fCheckRecordingTime - fSearchUpDownTime
|
|
vDownPointPos = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iRec, fDownTime, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
fDownDistanceFromPos = GET_DISTANCE_BETWEEN_COORDS(vStartCalculationPos, vDownPointPos)
|
|
|
|
// work out if we should be going up or down
|
|
IF fUpDistanceFromPos < fDownDistanceFromPos
|
|
fCheckRecordingTime = fUpTime
|
|
vBestPointPos = vUpPointPos
|
|
ELSE
|
|
fCheckRecordingTime = fDownTime
|
|
vBestPointPos = vDownPointPos
|
|
ENDIF
|
|
|
|
fSearchUpDownTime = fSearchUpDownTime / 2
|
|
iChecksPerformed++
|
|
ENDWHILE
|
|
|
|
fReturnTime = fCheckRecordingTime
|
|
vReturnPos = vBestPointPos
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// try and accelerate the shootout boats as they come round the corner
|
|
PROC HANDLE_SHOOTOUT_BOAT_SPEEDS()
|
|
INT i
|
|
FOR i=ENUM_TO_INT(EV_SHOOTOUT_FIRST_WAVE_BOAT_1) TO ENUM_TO_INT(EV_SHOOTOUT_FIRST_WAVE_BOAT_3)
|
|
ENEMY_VEHICLE_ENUM thisVehicle = INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[thisVehicle].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[thisVehicle].veh)
|
|
FLOAT fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(enemyVehicle[thisVehicle].veh)
|
|
FLOAT fAccelerateTime
|
|
FLOAT fAcceleration
|
|
FLOAT fDecelerateTime
|
|
FLOAT fDeceleration
|
|
FLOAT fMaxSpeed
|
|
FLOAT fMinSpeed
|
|
|
|
SWITCH thisVehicle
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
fAccelerateTime = 17800.0
|
|
fDecelerateTime = 24300.0
|
|
fAcceleration = 0.1
|
|
fDeceleration = 0.15
|
|
fMaxSpeed = 1.23
|
|
fMinSpeed = 0.0
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
fAccelerateTime = 19100.0
|
|
fDecelerateTime = 22300.0
|
|
fAcceleration = 0.3
|
|
fDeceleration = 0.2
|
|
fMaxSpeed = 1.5
|
|
fMinSpeed = 0.0
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
fAccelerateTime = 14300.0
|
|
fDecelerateTime = 18000.0
|
|
fAcceleration = 0.3
|
|
fDeceleration = 0.2
|
|
fMaxSpeed = 1.5
|
|
fMinSpeed = 0.0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF fPlaybackTime >= fDecelerateTime
|
|
enemyVehicle[thisVehicle].fPlaybackSpeed = enemyVehicle[thisVehicle].fPlaybackSpeed -@ fDeceleration
|
|
ELIF fPlaybackTime >= fAccelerateTime
|
|
enemyVehicle[thisVehicle].fPlaybackSpeed = enemyVehicle[thisVehicle].fPlaybackSpeed +@ fAcceleration
|
|
ENDIF
|
|
|
|
IF enemyVehicle[thisVehicle].fPlaybackSpeed > fMaxSpeed
|
|
enemyVehicle[thisVehicle].fPlaybackSpeed = fMaxSpeed
|
|
ELIF enemyVehicle[thisVehicle].fPlaybackSpeed < fMinSpeed
|
|
enemyVehicle[thisVehicle].fPlaybackSpeed = fMinSpeed
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(enemyVehicle[thisVehicle].veh, enemyVehicle[thisVehicle].fPlaybackSpeed)
|
|
ENDIF
|
|
|
|
IF enemyVehicle[thisVehicle].fPlaybackSpeed = 0
|
|
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[thisVehicle].veh)
|
|
IF bDoLastBoatCircle
|
|
#IF IS_DEBUG_BUILD
|
|
OR (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD6)
|
|
AND thisVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_1)
|
|
#ENDIF
|
|
IF enemyVehicle[thisVehicle].iAIStage < 20
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[thisVehicle].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[thisVehicle].veh)
|
|
ENDIF
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(thisVehicle, 20)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
// handle comment on vehicle destruction
|
|
PROC HANDLE_COMMENT_ON_VEHICLE_DESTRUCTION(ENEMY_VEHICLE_ENUM thisVehicle)
|
|
IF currentMissionStage = STAGE_RAPIDS_CHASE
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
AND NOT IS_PED_INJURED(trevorPed)
|
|
IF NOT enemyVehicle[thisVehicle].bCommentedOnDestruction
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[thisVehicle].veh)
|
|
IF NOT bRapidsSpeechInterruptPending
|
|
AND GET_GAME_TIMER() >= iRapidsSpeechInterruptTime + 3000
|
|
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[thisVehicle].veh))
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[thisVehicle].veh, michaelPed)
|
|
pendingRapidsSpeechInterrupt = RSI_M_DEST_CHOPPER
|
|
bRapidsSpeechInterruptPending = TRUE
|
|
ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[thisVehicle].veh, trevorPed)
|
|
pendingRapidsSpeechInterrupt = RSI_T_DEST_CHOPPER
|
|
bRapidsSpeechInterruptPending = TRUE
|
|
ENDIF
|
|
ELIF IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(enemyVehicle[thisVehicle].veh))
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[thisVehicle].veh, michaelPed)
|
|
pendingRapidsSpeechInterrupt = RSI_M_DEST_BOAT
|
|
bRapidsSpeechInterruptPending = TRUE
|
|
ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[thisVehicle].veh, trevorPed)
|
|
pendingRapidsSpeechInterrupt = RSI_T_DEST_BOAT
|
|
bRapidsSpeechInterruptPending = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bRapidsSpeechInterruptPending
|
|
iRapidsSpeechInterruptTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// cancel
|
|
IF NOT bShownGodText AND boatHotswapState <> BOAT_HOTSWAP_ON_TREVOR
|
|
bRapidsSpeechInterruptPending = FALSE
|
|
ENDIF
|
|
|
|
PRINTSTRING("comment on destruction ") PRINTINT(ENUM_TO_INT(thisVehicle)) PRINTNL()
|
|
enemyVehicle[thisVehicle].bCommentedOnDestruction = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/*
|
|
// proof enemies against explosions
|
|
PROC PROOF_ENEMIES_AGAINST_EXPLOSIONS(VEHICLE_INDEX dontProofVehicle, BOOL bDoProof)
|
|
INT i
|
|
|
|
IF bDoProof
|
|
REPEAT COUNT_OF(enemyVehicle) i
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
|
|
IF enemyVehicle[i].veh <> dontProofVehicle
|
|
IF IS_ENTITY_AT_ENTITY(enemyVehicle[i].veh, dontProofVehicle, <<20,20,20>>, FALSE, FALSE)
|
|
SET_ENTITY_PROOFS(enemyVehicle[i].veh, FALSE, TRUE, TRUE, TRUE, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyVehicle[i].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
IF IS_ENTITY_AT_ENTITY(enemyPed[i].ped, dontProofVehicle, <<20,20,20>>, FALSE, FALSE)
|
|
BOOL bProof = TRUE
|
|
IF IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
|
|
IF GET_VEHICLE_PED_IS_IN(enemyPed[i].ped) = dontProofVehicle
|
|
bProof = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bProof = FALSE
|
|
ENDIF
|
|
|
|
IF bProof
|
|
SET_ENTITY_PROOFS(enemyPed[i].ped, FALSE, TRUE, TRUE, TRUE, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyPed[i].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
bEnemiesExplosionProof = TRUE
|
|
iLastExplodeTime = GET_GAME_TIMER()
|
|
ELSE
|
|
REPEAT COUNT_OF(enemyVehicle) i
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
|
|
SET_ENTITY_PROOFS(enemyVehicle[i].veh, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyVehicle[i].veh, FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
SET_ENTITY_PROOFS(enemyPed[i].ped, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyPed[i].ped, FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
bEnemiesExplosionProof = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
*/
|
|
|
|
FUNC BOOL SHOULD_VEHICLE_HAVE_SEARCHLIGHT_ON(ENEMY_VEHICLE_ENUM thisVehicle)
|
|
INT iHours = GET_CLOCK_HOURS()
|
|
|
|
IF iHours <= 5
|
|
OR iHours >= 21
|
|
INT iMinutes
|
|
SWITCH thisVehicle
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
iMinutes = 1
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
iMinutes = 4
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
iMinutes = 2
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
iMinutes = 1
|
|
BREAK
|
|
CASE EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
iMinutes = 5
|
|
BREAK
|
|
CASE EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
iMinutes = 3
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
iMinutes = 0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF iHours = 21
|
|
IF GET_CLOCK_MINUTES() >= iMinutes
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELIF iHours = 5
|
|
IF GET_CLOCK_MINUTES() <= iMinutes
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// handle enemy wave
|
|
FUNC BOOL HANDLE_ENEMY_WAVE(ENEMY_WAVE_ENUM waveEnum, BOOL bDoDrivebys = TRUE, BOOL bAllowBlip = TRUE)
|
|
INT i, j
|
|
BOOL bWaveExists = FALSE
|
|
BOOL bHasVehicles
|
|
|
|
ENEMY_VEHICLE_ENUM firstVehicle
|
|
ENEMY_VEHICLE_ENUM lastVehicle
|
|
ENEMY_PED_ENUM firstPed
|
|
ENEMY_PED_ENUM lastPed
|
|
|
|
FILL_ENEMY_WAVE_PROPERTIES(waveEnum, firstVehicle, lastVehicle, firstPed, lastPed, bHasVehicles)
|
|
|
|
// vehicle stuff
|
|
IF bHasVehicles
|
|
FOR i=firstVehicle TO lastVehicle
|
|
ENEMY_VEHICLE_ENUM thisVehicle = INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
|
|
BOOL bDoExplode = FALSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
|
|
// vehicle ai
|
|
DO_ENEMY_VEHICLE_AI(thisVehicle)
|
|
|
|
// lights
|
|
IF thisVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_1
|
|
OR thisVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_2
|
|
OR thisVehicle = EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
OR thisVehicle = EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1
|
|
OR thisVehicle = EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
OR thisVehicle = EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
OR thisVehicle = EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1
|
|
IF NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[thisVehicle].veh, VS_DRIVER))
|
|
OR NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[thisVehicle].veh, VS_FRONT_RIGHT))
|
|
IF SHOULD_VEHICLE_HAVE_SEARCHLIGHT_ON(thisVehicle)
|
|
IF NOT IS_VEHICLE_SEARCHLIGHT_ON(enemyVehicle[i].veh)
|
|
SET_VEHICLE_SEARCHLIGHT(enemyVehicle[i].veh, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_SEARCHLIGHT_ON(enemyVehicle[i].veh)
|
|
SET_VEHICLE_SEARCHLIGHT(enemyVehicle[i].veh, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// check to stop playback
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
|
|
IF IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh, VS_DRIVER))
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// occupants dead check
|
|
BOOL bOccupantsDead = TRUE
|
|
BOOL bDriverDead = FALSE
|
|
FOR j=-1 TO 2
|
|
IF NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh, INT_TO_ENUM(VEHICLE_SEAT, j)))
|
|
bOccupantsDead = FALSE
|
|
ELSE
|
|
IF j=-1
|
|
bDriverDead = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF bDriverDead AND NOT bOccupantsDead
|
|
/*
|
|
IF IS_ENTITY_OCCLUDED(enemyVehicle[i].veh)
|
|
IF IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), enemyVehicle[i].veh, FALSE) > 30
|
|
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, 0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(enemyVehicle[i].veh, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
|
|
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
SET_VEHICLE_OUT_OF_CONTROL(enemyVehicle[i].veh, FALSE)
|
|
ELSE
|
|
IF currentMissionStage = STAGE_RAPIDS_CHASE
|
|
// force restart AI in case the passenger feels like taking over
|
|
enemyVehicle[i].aiEnum = EVAI_FOLLOW_RECORDING
|
|
enemyVehicle[i].iAiStage = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// remove blip
|
|
IF bOccupantsDead
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
|
|
SET_VEHICLE_CAN_BE_TARGETTED(enemyVehicle[i].veh, FALSE)
|
|
IF IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
SET_BOAT_ANCHOR(enemyVehicle[i].veh, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
enemyVehicle[i].bOccupantsDead = TRUE
|
|
HANDLE_COMMENT_ON_VEHICLE_DESTRUCTION(thisVehicle)
|
|
ENDIF
|
|
|
|
// exploding
|
|
IF IS_ENTITY_ON_FIRE(enemyVehicle[i].veh)
|
|
bDoExplode = TRUE
|
|
ELSE
|
|
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
OR IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
IF GET_ENTITY_HEALTH(enemyVehicle[i].veh) <= GET_ENEMY_VEHICLE_EXPLODE_HEALTH(thisVehicle)
|
|
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[i].veh, GET_TREVOR_PED())
|
|
bDoExplode = TRUE
|
|
ELSE
|
|
enemyVehicle[i].bExplodedVehicle = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh) <= GET_ENEMY_VEHICLE_EXPLODE_HEALTH(thisVehicle)
|
|
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyVehicle[i].veh, GET_TREVOR_PED())
|
|
bDoExplode = TRUE
|
|
ELSE
|
|
enemyVehicle[i].bExplodedVehicle = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// get rid of if too far away
|
|
IF currentMissionStage = STAGE_RAPIDS_CHASE
|
|
BOOL bSetNoLongerNeeded = FALSE
|
|
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[i].veh, <<200,200,200>>, FALSE, FALSE)//<<200, 200, 200>>)
|
|
//IF DOES_BLIP_EXIST(GET_BLIP_FROM_ENTITY(enemyVehicle[i].veh))
|
|
//IF bDoMopUp
|
|
//IF enemyVehicle[i].veh
|
|
IF thisVehicle <> EV_CHASE_FIRST_CAR_WAVE_CAR_1 OR bBlippedCarWave
|
|
bSetNoLongerNeeded = TRUE
|
|
ENDIF
|
|
ELIF waveEnum = EW_CHASE_FIRST_CAR_WAVE
|
|
IF bDoMopUp
|
|
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[i].veh, <<40, 40, 40>>)
|
|
bSetNoLongerNeeded = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF waveEnum = EW_CHASE_FIRST_BOAT_WAVE
|
|
IF bDoMopUp
|
|
IF NOT CAN_BOAT_DRIVE(enemyVehicle[i].veh)
|
|
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[i].veh, <<70, 70, 70>>)
|
|
bSetNoLongerNeeded = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bSetNoLongerNeeded
|
|
PED_INDEX driverPed = GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh)
|
|
IF NOT IS_PED_INJURED(driverPed)
|
|
CLEAR_PED_TASKS(driverPed)
|
|
ENDIF
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// remove blip if destroyed
|
|
//IF DOES_BLIP_EXIST(enemyVehicle[i].blip)
|
|
// REMOVE_BLIP(enemyVehicle[i].blip)
|
|
//ENDIF
|
|
|
|
// exploding
|
|
IF NOT IS_ENTITY_DEAD(enemyVehicle[i].veh)
|
|
IF NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
bDoExplode = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// handle explosions
|
|
IF bDoExplode
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
|
|
IF (currentMissionStage = STAGE_RAPIDS_CHASE OR NOT IS_ENTITY_ON_FIRE(enemyVehicle[i].veh))
|
|
OR IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[i].veh)
|
|
ENDIF
|
|
|
|
// comment on destruction
|
|
HANDLE_COMMENT_ON_VEHICLE_DESTRUCTION(thisVehicle)
|
|
|
|
IF thisVehicle <> EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1
|
|
IF NOT enemyVehicle[i].bExplodedVehicle
|
|
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, -100)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(enemyVehicle[i].veh, -100)
|
|
SET_VEHICLE_OUT_OF_CONTROL(enemyVehicle[i].veh, FALSE)
|
|
ELIF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, -100)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(enemyVehicle[i].veh, -100)
|
|
PED_INDEX driverPed = GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh)
|
|
IF NOT IS_PED_INJURED(driverPed)
|
|
CLEAR_SEQUENCE_TASK(sequence)
|
|
OPEN_SEQUENCE_TASK(sequence)
|
|
IF GET_ENTITY_SPEED(enemyVehicle[i].veh) >= 10
|
|
TASK_VEHICLE_TEMP_ACTION(NULL, enemyVehicle[i].veh, TEMPACT_TURNRIGHT, 3000)
|
|
ENDIF
|
|
TASK_VEHICLE_TEMP_ACTION(NULL, enemyVehicle[i].veh, TEMPACT_WAIT, 100000)
|
|
CLOSE_SEQUENCE_TASK(sequence)
|
|
TASK_PERFORM_SEQUENCE(driverPed, sequence)
|
|
ENDIF
|
|
|
|
ELSE
|
|
//IF IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(enemyVehicle[i].veh))
|
|
// SET_BOAT_ANCHOR(enemyVehicle[i].veh, FALSE)
|
|
//FREEZE_ENTITY_POSITION(enemyVehicle[i].veh, FALSE)
|
|
//ENDIF
|
|
IF currentMissionStage >= STAGE_RAPIDS_CHASE
|
|
//PROOF_ENEMIES_AGAINST_EXPLOSIONS(enemyVehicle[i].veh, TRUE)
|
|
explodeVehicle = enemyVehicle[i].veh
|
|
ELSE
|
|
//EXPLODE_VEHICLE(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDIF
|
|
enemyVehicle[i].bExplodedVehicle = TRUE
|
|
ENDIF
|
|
ELSE
|
|
// special case - spin out into wall
|
|
IF NOT IS_ENTITY_DEAD(enemyVehicle[i].veh)
|
|
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, -100)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(enemyVehicle[i].veh, -100)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
// ped AI
|
|
FOR i=firstPed TO lastPed
|
|
//ENEMY_PED_ENUM thisPed = INT_TO_ENUM(ENEMY_PED_ENUM, i)
|
|
IF enemyPed[i].bBlipped
|
|
IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED
|
|
BOOL bForceBlip = FALSE
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
IF IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
|
|
OR GET_PED_PARACHUTE_STATE(enemyPed[i].ped) > PPS_INVALID
|
|
bForceBlip = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT enemyPed[i].bRagdolled
|
|
UPDATE_AI_PED_BLIP(enemyPed[i].ped, enemyPed[i].blipStruct, -1, NULL, bForceBlip, FALSE, 10000)
|
|
ELSE
|
|
CLEANUP_AI_PED_BLIP(enemyPed[i].blipStruct)
|
|
ENDIF
|
|
|
|
IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER
|
|
IF DOES_BLIP_EXIST(enemyPed[i].blipStruct.BlipID)
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
|
|
SET_BLIP_SCALE(enemyPed[i].blipStruct.BlipID, 0.85)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
IF NOT enemyPed[i].bRagdolled
|
|
bWaveExists = TRUE
|
|
ENDIF
|
|
WEAPON_TYPE thisWeapon = WEAPONTYPE_UNARMED
|
|
|
|
IF enemyPed[i].iRecheckDrivebyTime >= 0
|
|
IF GET_GAME_TIMER() >= enemyPed[i].iRecheckDrivebyTime
|
|
IF IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
|
|
AND bDoDrivebys
|
|
ENEMY_PED_ENUM thisPed = INT_TO_ENUM(ENEMY_PED_ENUM, i)
|
|
IF thisPed = EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT
|
|
OR thisPed = EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT
|
|
OR thisPed = EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT
|
|
OR thisPed = EP_CHASE_FIRST_HELI_WAVE_CHOPPER_1_PILOT
|
|
GET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[i].ped, thisWeapon)
|
|
IF thisWeapon = WEAPONTYPE_VEHICLE_PLAYER_BUZZARD
|
|
IF NOT enemyPed[i].bPauseGuns
|
|
enemyPed[i].bPauseGuns = TRUE
|
|
SET_PED_FIRING_PATTERN(enemyPed[i].ped, FIRING_PATTERN_SINGLE_SHOT)
|
|
enemyPed[i].iRecheckDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2500, 4000)
|
|
ELSE
|
|
enemyPed[i].bPauseGuns = FALSE
|
|
SET_PED_FIRING_PATTERN(enemyPed[i].ped, FIRING_PATTERN_FULL_AUTO)
|
|
enemyPed[i].iRecheckDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5500)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// get the closest target between player and michael
|
|
PED_INDEX target = PLAYER_PED_ID()
|
|
|
|
IF bDoMerryweatherMassacre
|
|
IF i%2 = 0
|
|
target = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ENDIF
|
|
ENDIF
|
|
//IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER
|
|
// target = GET_TREVOR_PED()
|
|
//ELSE
|
|
// target = GET_MICHAEL_PED()
|
|
//ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(target)
|
|
IF HAS_PED_GOT_WEAPON(enemyPed[i].ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SMG))
|
|
SET_CURRENT_PED_WEAPON(enemyPed[i].ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SMG), TRUE)
|
|
ENDIF
|
|
//IF NOT bDoMerryweatherMassacre
|
|
|
|
FIRING_PATTERN_HASH firingPattern
|
|
IF thisPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_DRIVER
|
|
OR thisPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSFR
|
|
OR thisPed = EP_CHASE_FIRST_CAR_WAVE_CAR_1_PASSBR
|
|
firingPattern = FIRING_PATTERN_BURST_FIRE_DRIVEBY
|
|
ELIF thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER
|
|
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR
|
|
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER
|
|
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR
|
|
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER
|
|
OR thisPed = EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
|
|
firingPattern = FIRING_PATTERN_BURST_FIRE
|
|
ELSE
|
|
firingPattern = FIRING_PATTERN_BURST_FIRE_MICRO
|
|
ENDIF
|
|
|
|
|
|
TASK_DRIVE_BY(enemyPed[i].ped, target, NULL, <<0,0,0>>, 500, 100, TRUE, firingPattern)
|
|
//ELSE
|
|
// TASK_DRIVE_BY(enemyPed[i].ped, target, NULL, <<0,0,0>>, 500, 100, TRUE, FIRING_PATTERN_FULL_AUTO)
|
|
//ENDIF
|
|
ENDIF
|
|
enemyPed[i].iRecheckDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// TEMP kill them off if vehicle destroyed
|
|
IF IS_PED_IN_ANY_VEHICLE(enemyPed[i].ped)
|
|
IF IS_ENTITY_DEAD(GET_VEHICLE_PED_IS_IN(enemyPed[i].ped))
|
|
IF enemyPed[i].iKillTime < 0
|
|
INT iAddTime
|
|
iAddTime = 0
|
|
SWITCH INT_TO_ENUM(ENEMY_PED_ENUM, i)
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
|
|
iAddTime = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
|
|
iAddTime = 700
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
|
|
iAddTime = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
|
|
iAddTime = 700
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL
|
|
iAddTime = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
|
|
iAddTime = 700
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
enemyPed[i].iKillTime = GET_GAME_TIMER() + iAddTime
|
|
printstring("set kill time") printnl()
|
|
ELSE
|
|
|
|
|
|
IF GET_GAME_TIMER() >= enemyPed[i].iKillTime
|
|
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
|
|
printstring("do kill") printnl()
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT IS_ENTITY_A_MISSION_ENTITY(GET_VEHICLE_PED_IS_IN(enemyPed[i].ped))
|
|
//IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER
|
|
INT iAddTime
|
|
iAddTime = 0
|
|
SWITCH INT_TO_ENUM(ENEMY_PED_ENUM, i)
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL
|
|
iAddTime = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
|
|
iAddTime = 700
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBL
|
|
iAddTime = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PASSBR
|
|
iAddTime = 700
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBL
|
|
iAddTime = 0
|
|
BREAK
|
|
CASE EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PASSBR
|
|
iAddTime = 700
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF enemyPed[i].iKillTime < 0
|
|
enemyPed[i].iKillTime = GET_GAME_TIMER() + iAddTime
|
|
printstring("set kill time") printnl()
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= enemyPed[i].iKillTime
|
|
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
|
|
printstring("do kill") printnl()
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
//IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
// CLEAR_PED_TASKS(enemyPed[i].ped)
|
|
//ENDIF
|
|
//CLEANUP_AI_PED_BLIP(enemyPed[i].blipStruct)
|
|
//SET_PED_AS_NO_LONGER_NEEDED(enemyPed[i].ped)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_IN_WATER(enemyPed[i].ped)
|
|
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
|
|
ENDIF
|
|
IF currentMissionStage = STAGE_RAPIDS_CHASE
|
|
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyPed[i].ped, <<200,200,200>>, FALSE, FALSE)
|
|
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
|
|
//IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
// CLEAR_PED_TASKS(enemyPed[i].ped)
|
|
//ENDIF
|
|
//CLEANUP_AI_PED_BLIP(enemyPed[i].blipStruct)
|
|
//SET_PED_AS_NO_LONGER_NEEDED(enemyPed[i].ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// blip
|
|
IF NOT enemyPed[i].bBlipped
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[waveEnum] + GET_BLIP_ENEMY_PED_TIME(INT_TO_ENUM(ENEMY_PED_ENUM, i))
|
|
IF bAllowBlip
|
|
enemyPed[i].bBlipped = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ON_SCREEN(enemyPed[i].ped)
|
|
AND NOT IS_ENTITY_OCCLUDED(enemyPed[i].ped)
|
|
enemyPed[i].bBlipped = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//IF DOES_BLIP_EXIST(enemyPed[i].blip)
|
|
// REMOVE_BLIP(enemyPed[i].blip)
|
|
//ENDIF
|
|
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
|
|
IF NOT enemyPed[i].bRegisteredDead
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyPed[i].ped, PLAYER_PED_ID())
|
|
INFORM_MISSION_STATS_OF_INCREMENT(EXL3_KILLS)
|
|
ENDIF
|
|
enemyPed[i].bRegisteredDead = TRUE
|
|
ENDIF
|
|
|
|
SET_PED_AS_NO_LONGER_NEEDED(enemyPed[i].ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
RETURN bWaveExists
|
|
ENDFUNC
|
|
|
|
// rappel enemies
|
|
/*
|
|
PROC HANDLE_RAPPEL_ENEMIES()
|
|
// handle rappel enemies
|
|
INT i
|
|
BOOL bRappelAreaOnScreen = FALSE
|
|
IF IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 57>>, 3)
|
|
OR IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 51>>, 3)
|
|
OR IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 45>>, 3)
|
|
OR IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 39>>, 3)
|
|
OR IS_SPHERE_VISIBLE(<<-502.93, 4385.83, 33>>, 3)
|
|
bRappelAreaOnScreen = TRUE
|
|
ENDIF
|
|
|
|
REPEAT NUMBER_RAPPEL_ENEMIES i
|
|
PED_INDEX rappelPed
|
|
ENEMY_PED_ENUM thisPedEnum
|
|
|
|
SWITCH i
|
|
CASE 0
|
|
thisPedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_1
|
|
BREAK
|
|
CASE 1
|
|
thisPedEnum = EP_SHOOTOUT_THIRD_WAVE_FOOT_2
|
|
BREAK
|
|
ENDSWITCH
|
|
rappelPed = enemyPed[thisPedEnum].ped
|
|
|
|
SWITCH enemyRappelData[i].rappelState
|
|
CASE ENEMY_RAPPEL_STATE_CLAMBERING
|
|
IF NOT IS_PED_INJURED(rappelPed)
|
|
FLOAT fRappelTime
|
|
VECTOR vAnchorPos
|
|
FLOAT fStartZ
|
|
FLOAT fLimitZ
|
|
FLOAT fAttachHeading
|
|
FLOAT fRopeLength
|
|
|
|
SWITCH i
|
|
CASE 0
|
|
fRappelTime = 200
|
|
vAnchorPos = <<-502.99, 4385.78, 63.88>>
|
|
fStartZ = -2
|
|
fLimitZ = -32.5
|
|
fAttachHeading = -39.39
|
|
fRopeLength = 32
|
|
BREAK
|
|
CASE 1
|
|
fRappelTime = 500
|
|
vAnchorPos = <<-504.34, 4385.37, 63.98>>
|
|
fStartZ = -1.8
|
|
fLimitZ = -32.5
|
|
fAttachHeading = -42.11
|
|
fRopeLength = 32
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF GET_GAME_TIMER() >= enemyRappelData[i].iStateStartTime + fRappelTime
|
|
INIT_RAPPEL_WITH_ROPE(enemyRappelData[i].rappelData, NULL, vAnchorPos, <<0,0,fAttachHeading>>, fStartZ, fLimitZ, fRopeLength, FALSE, FALSE, TRUE, rappelPed, TRUE, FALSE, 1.0)
|
|
SET_RAPPEL_AI(enemyRappelData[i].rappelData, RAPPEL_AI_STOP)
|
|
enemyRappelData[i].iStateStartTime = GET_GAME_TIMER()
|
|
enemyRappelData[i].rappelState = ENEMY_RAPPEL_STATE_WAIT_ON_ROPE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ENEMY_RAPPEL_STATE_WAIT_ON_ROPE
|
|
IF NOT IS_PED_INJURED(rappelPed)
|
|
IF IS_ENTITY_ON_SCREEN(rappelPed)
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-502.93, 4385.83, 45.3>>, <<10,10,10>>, FALSE, FALSE)
|
|
OR bRappelAreaOnScreen
|
|
OR (bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE] AND NOT bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE] AND NOT bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE])
|
|
FLOAT fSpeed
|
|
SWITCH i
|
|
CASE 0
|
|
fSpeed = 4.2
|
|
BREAK
|
|
CASE 1
|
|
fSpeed = 4.7
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SET_RAPPEL_AI(enemyRappelData[i].rappelData, RAPPEL_AI_MOVE_FAST)
|
|
SET_RAPPEL_MAX_SLIDE_SPEED(enemyRappelData[i].rappelData, fSpeed)
|
|
enemyRappelData[i].iStateStartTime = GET_GAME_TIMER()
|
|
enemyRappelData[i].rappelState = ENEMY_RAPPEL_STATE_RAPPELLING
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ENEMY_RAPPEL_STATE_RAPPELLING
|
|
HANDLE_RAPPEL(enemyRappelData[i].rappelData, TRUE, FALSE)
|
|
|
|
IF HAS_FREE_ROPING_FINISHED(enemyRappelData[i].rappelData)
|
|
CANCEL_RAPPEL(enemyRappelData[i].rappelData)
|
|
IF NOT IS_PED_INJURED(rappelPed)
|
|
TASK_SHOOT_AT_ENTITY(rappelPed, PLAYER_PED_ID(), -1, FIRING_TYPE_CONTINUOUS)
|
|
enemyRappelData[i].iStateStartTime = GET_GAME_TIMER()
|
|
enemyRappelData[i].rappelState = ENEMY_RAPPEL_STATE_SHOOTING
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ENEMY_RAPPEL_STATE_SHOOTING
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDREPEAT
|
|
ENDPROC
|
|
*/
|
|
|
|
// target pos to switch sides on bridge
|
|
FUNC VECTOR GET_BRIDGE_ENEMY_MOVE_SIDES_TARGET(INT iEnemy)
|
|
SWITCH iEnemy
|
|
CASE 0
|
|
RETURN <<-881.11, 4408.80, 19.91>>
|
|
BREAK
|
|
CASE 1
|
|
RETURN <<-884.63, 4413.92, 19.91>>
|
|
BREAK
|
|
CASE 2
|
|
RETURN <<-891.17, 4419.68, 19.94>>
|
|
BREAK
|
|
CASE 3
|
|
RETURN <<-896.33, 4419.17, 20.71>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
|
|
CONST_FLOAT TREVOR_TARGET_MAX_RANGE 90.0
|
|
CONST_FLOAT TREVOR_TARGET_MIN_RANGE 10.0
|
|
// trevor shooting
|
|
PROC HANDLE_TREVOR_SHOOTING()
|
|
INT i
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
BOOL bRecheck = FALSE
|
|
IF GET_GAME_TIMER() >= iRecheckTrevorDrivebyTime
|
|
bRecheck = TRUE
|
|
ELIF DOES_ENTITY_EXIST(trevorTargetPed)
|
|
IF IS_PED_INJURED(trevorTargetPed)
|
|
bRecheck = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PLAY_ANIM) = FINISHED_TASK
|
|
AND NOT DOES_ENTITY_EXIST(trevorTargetPed)
|
|
bRecheck = TRUE
|
|
ENDIF
|
|
|
|
IF bRecheck
|
|
// get closest enemy vehicle
|
|
INT iClosestPed = -1
|
|
FLOAT fClosestDistance = 999999.0
|
|
FLOAT fThisDistance
|
|
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
fThisDistance = GET_DISTANCE_BETWEEN_ENTITIES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], enemyPed[i].ped, FALSE)
|
|
//VECTOR vDinghyOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], GET_ENTITY_COORDS(enemyPed[i].ped))
|
|
IF fThisDistance < TREVOR_TARGET_MAX_RANGE
|
|
//AND fThisDistance > TREVOR_TARGET_MIN_RANGE
|
|
//AND vDinghyOffset.y < -4.0
|
|
IF fThisDistance < fClosestDistance
|
|
iClosestPed = i
|
|
fClosestDistance = fThisDistance
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iClosestPed >= 0
|
|
IF enemyPed[iClosestPed].ped <> trevorTargetPed
|
|
IF boatRPGState = BOAT_RPG_USING
|
|
INT iAccuracy
|
|
IF NOT bDoMopUp
|
|
iAccuracy = 50
|
|
ELSE
|
|
iAccuracy = 80
|
|
ENDIF
|
|
|
|
SET_PED_ACCURACY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iAccuracy)
|
|
bForceResetTrevorTask=bForceResetTrevorTask
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_AIM_GUN_SCRIPTED) = FINISHED_TASK
|
|
OR bForceResetTrevorTask
|
|
TASK_AIM_GUN_SCRIPTED_WITH_TARGET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], enemyPed[iClosestPed].ped, <<0,0,0>>, SCRIPTED_GUN_TASK_DINGY_RPG)
|
|
bForceResetTrevorTask = FALSE
|
|
ELSE
|
|
UPDATE_TASK_AIM_GUN_SCRIPTED_TARGET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], enemyPed[iClosestPed].ped, <<0,0,0>>)
|
|
ENDIF
|
|
trevorTargetPed = enemyPed[iClosestPed].ped
|
|
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 5000
|
|
ENDIF
|
|
ELSE
|
|
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 2000
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(trevorTargetPed)
|
|
IF boatRPGState = BOAT_RPG_DONE
|
|
OR boatRPGState = BOAT_RPG_NOT_STARTED
|
|
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ELIF boatRPGState = BOAT_RPG_USING
|
|
TASK_PLAY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_RPG), "idle", REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
ENDIF
|
|
trevorTargetPed = NULL
|
|
ELSE
|
|
IF boatRPGState = BOAT_RPG_USING
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PLAY_ANIM) = FINISHED_TASK
|
|
TASK_PLAY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_RPG), "idle", REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 1000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// michael follow to pos
|
|
PROC DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(INT iStart, BOOL bAllowPlayer = FALSE, FLOAT fSpeed = 26.0)
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_MICHAEL OR bAllowPlayer
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(michaelPed, trainCrashVehicle[TCV_DINGHY], "exile31", DRIVINGMODE_PLOUGHTHROUGH, iStart, EWAYPOINT_DEFAULT, -1, fSpeed)
|
|
SET_BOAT_DISABLE_AVOIDANCE(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// mikhail driving
|
|
PROC HANDLE_MICHAEL_DRIVING()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_ENTER_VEHICLE) <> FINISHED_TASK
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
BRING_VEHICLE_TO_HALT(trainCrashVehicle[TCV_DINGHY], 15.0, 1)
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_ENTER_VEHICLE) = FINISHED_TASK
|
|
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY], 40000)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bFinishedFollowRapids
|
|
VECTOR vBoatPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
|
|
IF vBoatPos.x < -1785
|
|
TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY], <<-2091.73, 4779.18, 0.73>>, 45, DRIVINGSTYLE_NORMAL, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_DINGHY), DRIVINGMODE_AVOIDCARS, 10, 1000)
|
|
bFinishedFollowRapids = TRUE
|
|
ELIF currentMissionStage = STAGE_GET_HOME
|
|
bFinishedFollowRapids = TRUE
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = FINISHED_TASK
|
|
INT iClosestWaypoint
|
|
iClosestWaypoint = GET_CLOSEST_BOAT_WAYPOINT(trainCrashVehicle[TCV_DINGHY], "exile31")
|
|
IF iClosestWaypoint >= 0
|
|
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(iClosestWaypoint)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF currentMissionStage = STAGE_GET_HOME
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = FINISHED_TASK
|
|
INT iClosestWaypoint
|
|
iClosestWaypoint = GET_CLOSEST_BOAT_WAYPOINT(trainCrashVehicle[TCV_DINGHY], "exile35", FALSE, TRUE)
|
|
IF iClosestWaypoint >= 0
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY], "exile35", DRIVINGMODE_PLOUGHTHROUGH, iClosestWaypoint)
|
|
SET_BOAT_DISABLE_AVOIDANCE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/*
|
|
CONST_FLOAT MICHAEL_TARGET_MAX_RANGE 90.0
|
|
CONST_FLOAT MICHAEL_TARGET_MIN_RANGE 10.0
|
|
// michael shooting
|
|
PROC HANDLE_MICHAEL_SHOOTING()
|
|
INT i
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SWITCH michaelDrivebyState
|
|
CASE MICHAEL_DRIVEBY_WAITING
|
|
IF GET_GAME_TIMER() >= iRecheckMichaelDrivebyTime
|
|
michaelDrivebyState = MICHAEL_DRIVEBY_FIND_TARGET
|
|
ENDIF
|
|
BREAK
|
|
CASE MICHAEL_DRIVEBY_FIND_TARGET
|
|
IF GET_GAME_TIMER() >= iRecheckMichaelDrivebyTime
|
|
// get closest enemy vehicle
|
|
INT iClosestPed
|
|
iClosestPed = -1
|
|
FLOAT fClosestDistance
|
|
fClosestDistance = 999999.0
|
|
FLOAT fThisDistance
|
|
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
fThisDistance = GET_DISTANCE_BETWEEN_ENTITIES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], enemyPed[i].ped, FALSE)
|
|
IF fThisDistance < MICHAEL_TARGET_MAX_RANGE
|
|
//AND fThisDistance > MICHAEL_TARGET_MIN_RANGE
|
|
IF fThisDistance < fClosestDistance
|
|
iClosestPed = i
|
|
fClosestDistance = fThisDistance
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iClosestPed >= 0
|
|
AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
|
|
IF enemyPed[iClosestPed].ped <> michaelTargetPed
|
|
SET_PED_ACCURACY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 0)
|
|
TASK_DRIVE_BY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], enemyPed[iClosestPed].ped, NULL, <<0,0,0>>, MICHAEL_TARGET_MAX_RANGE, 100, TRUE)
|
|
michaelTargetPed = enemyPed[iClosestPed].ped
|
|
iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000)
|
|
michaelDrivebyState = MICHAEL_DRIVEBY_SHOOTING
|
|
ENDIF
|
|
ELSE
|
|
iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + 1000
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE MICHAEL_DRIVEBY_SHOOTING
|
|
IF GET_GAME_TIMER() >= iRecheckMichaelDrivebyTime
|
|
OR IS_PED_INJURED(michaelTargetPed)
|
|
IF DOES_ENTITY_EXIST(michaelTargetPed)
|
|
IF IS_PED_IN_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF IS_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
CLEAR_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
michaelTargetPed = NULL
|
|
michaelDrivebyState = MICHAEL_DRIVEBY_WAITING
|
|
iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 9000)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
*/
|
|
|
|
// attach
|
|
PROC ATTACH_TREVOR_TO_BOAT()
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
ATTACH_ENTITY_TO_ENTITY(trevorPed, trainCrashVehicle[TCV_DINGHY], 0, vTrevorAttachToBoatPos, vTrevorAttachToBoatRot, TRUE, FALSE, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
//PRINTSTRING("vTrevorAttachToBoatPos = ") printvector(vTrevorAttachToBoatPos) PRINTNL()
|
|
ENDPROC
|
|
|
|
PROC ATTACH_MICHAEL_TO_BOAT()
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
ATTACH_ENTITY_TO_ENTITY(michaelPed, trainCrashVehicle[TCV_DINGHY], 0, vMichaelAttachToBoatPos, vMichaelAttachToBoatRot, TRUE, FALSE, TRUE, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set boat RPG state
|
|
PROC SET_BOAT_RPG_STATE(BOAT_RPG_STATE_ENUM newState, BOOL bFromPhase = FALSE, BOOL bSetCoords = TRUE)
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SWITCH newState
|
|
CASE BOAT_RPG_GET_IN_POSITION
|
|
IF bSetCoords
|
|
SET_ENTITY_COORDS(trevorPed, GET_ENTITY_COORDS(trevorPed) + <<0,0,1>>)
|
|
ENDIF
|
|
|
|
IF NOT bFromPhase
|
|
fBoatRPGPhase = 0.0
|
|
ENDIF
|
|
|
|
vTrevorAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
|
|
vTrevorAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
|
|
ATTACH_TREVOR_TO_BOAT()
|
|
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE | AF_FORCE_START, fBoatRPGPhase)
|
|
//TASK_VEHICLE_PLAY_ANIM(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_DINGY")
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
|
|
BREAK
|
|
CASE BOAT_RPG_USING
|
|
trevorTargetPed = NULL
|
|
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 2000
|
|
|
|
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(TRUE)
|
|
|
|
// double check has mg
|
|
WEAPON_TYPE MGWeapon
|
|
MGWeapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)
|
|
IF NOT HAS_PED_GOT_WEAPON(trevorPed, MGWeapon)
|
|
GIVE_WEAPON_TO_PED(trevorPed, MGWeapon, INFINITE_AMMO, TRUE)
|
|
ENDIF
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(trevorPed, MGWeapon) = 0
|
|
SET_PED_AMMO(trevorPed, MGWeapon, 1)
|
|
ENDIF
|
|
SET_PED_INFINITE_AMMO(trevorPed, TRUE, MGWeapon)
|
|
SET_PED_INFINITE_AMMO_CLIP(trevorPed, TRUE)
|
|
|
|
IF trevorPed = PLAYER_PED_ID()
|
|
// SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE)
|
|
TASK_AIM_GUN_SCRIPTED(PLAYER_PED_ID(), SCRIPTED_GUN_TASK_DINGY_RPG)
|
|
ENDIF
|
|
ATTACH_TREVOR_TO_BOAT()
|
|
|
|
// set bad guys to have accuracy
|
|
INT i
|
|
FOR i=EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER TO EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
INT iAccuracy
|
|
SWITCH INT_TO_ENUM(ENEMY_PED_ENUM, i)
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER
|
|
iAccuracy = 2
|
|
BREAK
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_PASSFR
|
|
CASE EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_PASSFR
|
|
iAccuracy = 3
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SET_PED_ACCURACY(enemyPed[i].ped, iAccuracy)
|
|
ENDIF
|
|
ENDFOR
|
|
BREAK
|
|
CASE BOAT_RPG_RETURN_TO_SEAT
|
|
FLOAT fBlendIn
|
|
|
|
IF NOT bFromPhase
|
|
fBoatRPGPhase = 0.0
|
|
fBlendIn = NORMAL_BLEND_IN
|
|
ELSE
|
|
vTrevorAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
|
|
vTrevorAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
|
|
fBlendIn = INSTANT_BLEND_IN
|
|
ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
ENDIF
|
|
|
|
ATTACH_TREVOR_TO_BOAT()
|
|
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", fBlendIn, INSTANT_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE | AF_FORCE_START, fBoatRPGPhase)
|
|
//TASK_VEHICLE_PLAY_ANIM(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_DINGY")
|
|
IF bFromPhase
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE BOAT_RPG_DONE
|
|
REMOVE_TREVOR_MG()
|
|
SET_PED_CAN_SWITCH_WEAPON(trevorPed, TRUE)
|
|
DETACH_ENTITY(trevorPed)
|
|
SET_PED_INTO_VEHICLE(trevorPed, trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
AND GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
|
|
IF NOT bCreatedSmoothCam
|
|
|
|
FLOAT fHeading
|
|
FLOAT fPitch
|
|
|
|
fHeading = GET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
fPitch = GET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
CREATE_MISSION_STATIC_CAM(staticCam)
|
|
SET_CAM_COORD(staticCam, GET_FINAL_RENDERED_CAM_COORD())
|
|
SET_CAM_ROT(staticCam, GET_FINAL_RENDERED_CAM_ROT())
|
|
SET_CAM_FOV(staticCam, GET_FINAL_RENDERED_CAM_FOV())
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fHeading)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fPitch)
|
|
|
|
bCreatedSmoothCam = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
boatRPGState = newState
|
|
ENDPROC
|
|
|
|
// handle the rpg
|
|
PROC HANDLE_BOAT_RPG(BOOL bForce = FALSE)
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
VECTOR vBoatPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
SWITCH boatRPGState
|
|
CASE BOAT_RPG_NOT_STARTED
|
|
IF vBoatPos.x < -548
|
|
AND vBoatPos.z < 20.90
|
|
AND (bForce OR NOT bRunningCutscene)
|
|
SET_BOAT_RPG_STATE(BOAT_RPG_GET_IN_POSITION)
|
|
ENDIF
|
|
BREAK
|
|
CASE BOAT_RPG_GET_IN_POSITION
|
|
BOOL bAllowSetUsing
|
|
bAllowSetUsing = FALSE
|
|
|
|
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR")
|
|
fBoatRPGPhase = GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR")
|
|
|
|
IF fBoatRPGPhase >= 0
|
|
IF NOT bGivenRPG
|
|
IF fBoatRPGPhase >= 0.636
|
|
WEAPON_TYPE MGWeapon
|
|
MGWeapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)
|
|
IF NOT bCheckedInitialMG
|
|
IF HAS_PED_GOT_WEAPON(trevorPed, MGWeapon)
|
|
iInitialMGAmmo = GET_AMMO_IN_PED_WEAPON(trevorPed, MGWeapon)
|
|
ELSE
|
|
iInitialMGAmmo = -1
|
|
ENDIF
|
|
bCheckedInitialMG = TRUE
|
|
ENDIF
|
|
GIVE_WEAPON_TO_PED(trevorPed, MGWeapon, INFINITE_AMMO, TRUE)
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(trevorPed, MGWeapon) = 0
|
|
SET_PED_AMMO(trevorPed, MGWeapon, 1)
|
|
ENDIF
|
|
|
|
SET_PED_INFINITE_AMMO(trevorPed, TRUE, MGWeapon)
|
|
SET_PED_INFINITE_AMMO_CLIP(trevorPed, TRUE)
|
|
bGivenRPG = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fBoatRPGPhase >= 0.98
|
|
bAllowSetUsing = TRUE
|
|
ELSE
|
|
vTrevorAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
|
|
vTrevorAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_GET_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
|
|
ATTACH_TREVOR_TO_BOAT()
|
|
ENDIF
|
|
ELSE
|
|
fBoatRPGPhase = 0.0
|
|
ENDIF
|
|
ELSE
|
|
bAllowSetUsing = TRUE
|
|
ENDIF
|
|
|
|
IF bAllowSetUsing
|
|
SET_BOAT_RPG_STATE(BOAT_RPG_USING)
|
|
ENDIF
|
|
BREAK
|
|
CASE BOAT_RPG_USING
|
|
WEAPON_TYPE weapon
|
|
GET_CURRENT_PED_WEAPON(trevorPed, weapon)
|
|
IF weapon <> GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)
|
|
SET_CURRENT_PED_WEAPON(trevorPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG), TRUE)
|
|
ENDIF
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(trevorPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG)) = 0
|
|
SET_PED_AMMO(trevorPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG), 1)
|
|
ENDIF
|
|
SET_PED_INFINITE_AMMO(trevorPed, TRUE, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MG))
|
|
SET_PED_INFINITE_AMMO_CLIP(trevorPed, TRUE)
|
|
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR
|
|
SET_PED_CAN_TORSO_IK(trevorPed, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT bForceMichaelSwitch
|
|
IF currentMissionStage = STAGE_GET_HOME
|
|
bForceMichaelSwitch = TRUE
|
|
ENDIF
|
|
ELSE
|
|
SET_BOAT_RPG_STATE(BOAT_RPG_RETURN_TO_SEAT)
|
|
ENDIF
|
|
BREAK
|
|
CASE BOAT_RPG_RETURN_TO_SEAT
|
|
BOOL bAllowSetDone
|
|
bAllowSetDone = FALSE
|
|
|
|
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR")
|
|
fBoatRPGPhase = GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR")
|
|
IF fBoatRPGPhase >= 0
|
|
IF NOT bTrevorPutAwayGun
|
|
IF fBoatRPGPhase >= 0.0636
|
|
//IF HAS_ANIM_EVENT_FIRED(trevorPed, GET_HASH_KEY("DESTROY"))
|
|
PRINTSTRING("remove gun!") printnl()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
|
|
REMOVE_TREVOR_MG()
|
|
bTrevorPutAwayGun = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fBoatRPGPhase >= 0.98
|
|
bAllowSetDone = TRUE
|
|
ELSE
|
|
vTrevorAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
|
|
vTrevorAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_STOW_RPG_TREVOR", <<0,0,0>>, <<0,0,0>>, fBoatRPGPhase)
|
|
ATTACH_TREVOR_TO_BOAT()
|
|
ENDIF
|
|
ELSE
|
|
fBoatRPGPhase = 0.0
|
|
ENDIF
|
|
ELSE
|
|
bAllowSetDone = TRUE
|
|
ENDIF
|
|
|
|
IF bAllowSetDone
|
|
SET_BOAT_RPG_STATE(BOAT_RPG_DONE)
|
|
ENDIF
|
|
BREAK
|
|
CASE BOAT_RPG_DONE
|
|
// cam back to gameplay
|
|
IF bCreatedSmoothCam
|
|
IF NOT bSmoothCamBackToGameplay
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, 1300)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(staticCam)
|
|
DESTROY_CAM(staticCam)
|
|
ENDIF
|
|
bSmoothCamBackToGameplay = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF boatRPGState <> BOAT_RPG_NOT_STARTED
|
|
AND boatRPGState <> BOAT_RPG_DONE
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
|
|
IF boatRPGState <> BOAT_RPG_USING
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_CAN_SWITCH_WEAPON(trevorPed, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// create the beach
|
|
PROC CREATE_BEACH()
|
|
// car
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_BEACH_CAR, <<-2430.87, 4260.73, 5.37>>, -154.2)
|
|
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BEACH_CAR], << 7.84188, 9.1192, -154.234 >>)
|
|
// truck
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_BEACH_TRUCK, <<-2433.61, 4249.80, 5.78>>, -40.9)
|
|
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BEACH_TRUCK], << 5.84714, -12.8294, -40.5084 >> )
|
|
ENDPROC
|
|
|
|
// handle beach creation
|
|
PROC HANDLE_BEACH_CREATION(BOOL bForceRequest = FALSE)
|
|
SWITCH beachCreationStage
|
|
CASE BEACH_CREATION_NOT_STARTED
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), <<400,400,400>>, FALSE, FALSE)
|
|
OR bForceRequest
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_BEACH_CAR))
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_BEACH_TRUCK))
|
|
beachCreationStage = BEACH_CREATION_REQUESTING
|
|
ENDIF
|
|
BREAK
|
|
CASE BEACH_CREATION_REQUESTING
|
|
IF NOT bModelRequestTracker[TCM_BEACH_CAR]
|
|
OR NOT bModelRequestTracker[TCM_BEACH_TRUCK]
|
|
beachCreationStage = BEACH_CREATION_NOT_STARTED
|
|
ELSE
|
|
IF HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BEACH_CAR))
|
|
AND HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_BEACH_TRUCK))
|
|
CREATE_BEACH()
|
|
beachCreationStage = BEACH_CREATION_DONE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE BEACH_CREATION_DONE
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// create ron and patricia
|
|
PROC CREATE_RON_AND_PATRICIA(BOOL bWaitForStreaming)
|
|
IF NOT DOES_ENTITY_EXIST(ronPed)
|
|
CREATE_NPC_PED_ON_FOOT(ronPed, CHAR_RON, <<1971.79114, 3818.23218, 32.42871>>, -147.9, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ronPed, RELGROUPHASH_PLAYER)
|
|
TASK_LOOK_AT_ENTITY(ronPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
TASK_START_SCENARIO_IN_PLACE(ronPed, "WORLD_HUMAN_STAND_IMPATIENT", -1, FALSE)
|
|
SET_PED_KEEP_TASK(ronPed, TRUE)
|
|
SET_PED_PROP_INDEX(ronPed, ANCHOR_HEAD, 0)
|
|
SET_PED_PROP_INDEX(ronPed, ANCHOR_EYES, 0)
|
|
SET_PED_DIES_WHEN_INJURED(ronPed, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ronPed, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(ronPed, TRUE)
|
|
|
|
IF bWaitForStreaming
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
|
|
BOOL bRonStreamingCompleted = FALSE
|
|
WHILE NOT bRonStreamingCompleted
|
|
IF NOT IS_PED_INJURED(ronPed)
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(ronPed)
|
|
bRonStreamingCompleted = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bRonStreamingCompleted = TRUE
|
|
ENDIF
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(patriciaPed)
|
|
CREATE_NPC_PED_ON_FOOT(patriciaPed, CHAR_PATRICIA, <<1975.44312, 3820.43066, 32.45007>>, 139.6, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(patriciaPed, RELGROUPHASH_PLAYER)
|
|
TASK_LOOK_AT_ENTITY(patriciaPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
TASK_START_SCENARIO_IN_PLACE(patriciaPed, "WORLD_HUMAN_HANG_OUT_STREET", -1, FALSE)
|
|
|
|
SET_PED_COMPONENT_VARIATION(patriciaPed, PED_COMP_TORSO, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(patriciaPed, PED_COMP_LEG, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(patriciaPed, PED_COMP_FEET, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(patriciaPed, PED_COMP_SPECIAL, 0, 0)
|
|
|
|
SET_PED_DIES_WHEN_INJURED(patriciaPed, TRUE)
|
|
SET_PED_KEEP_TASK(patriciaPed, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(patriciaPed, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(patriciaPed, TRUE)
|
|
|
|
IF bWaitForStreaming
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
|
|
BOOL bPatriciaStreamingCompleted = FALSE
|
|
WHILE NOT bPatriciaStreamingCompleted
|
|
IF NOT IS_PED_INJURED(patriciaPed)
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(patriciaPed)
|
|
bPatriciaStreamingCompleted = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bPatriciaStreamingCompleted = TRUE
|
|
ENDIF
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DELETE_RON_AND_PATRICIA()
|
|
IF DOES_ENTITY_EXIST(ronPed)
|
|
SET_PED_AS_NO_LONGER_NEEDED(ronPed)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(patriciaPed)
|
|
SET_PED_AS_NO_LONGER_NEEDED(patriciaPed)
|
|
ENDIF
|
|
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_RON))
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_PATRICIA))
|
|
ENDPROC
|
|
|
|
// handle the mercs waiting for pickup
|
|
PROC HANDLE_MERC_PICKUP()
|
|
|
|
SWITCH createMercPickupStage
|
|
CASE CREATE_MERC_PICKUP_STAGE_NOT_STARTED
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<197.35889, 6379.99902, 30.41866>>, <<500,500,500>>, FALSE, FALSE)
|
|
//ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_CAR))
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_TRUCK))
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_SOLDIER))
|
|
//ADD_ANIM_DICT_REQUEST(TC_ANIM_DICT_GESTURE_ENT)
|
|
//ADD_ANIM_DICT_REQUEST(TC_ANIM_DICT_GESTURES)
|
|
createMercPickupStage = CREATE_MERC_PICKUP_STAGE_WAITING
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE CREATE_MERC_PICKUP_STAGE_WAITING
|
|
//IF HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_CAR))
|
|
IF HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MERC_TRUCK))
|
|
AND HAS_MODEL_LOADED(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER))
|
|
//AND HAS_ANIM_DICT_LOADED(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_GESTURE_ENT))
|
|
//AND HAS_ANIM_DICT_LOADED(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_GESTURES))
|
|
|
|
VECTOR vPos
|
|
FLOAT fRot
|
|
TRAIN_CRASH_MODEL_ENUM model
|
|
|
|
IF NOT bCreatedTrucks
|
|
SWITCH iCreateTruckFrame
|
|
CASE 0
|
|
vPos = <<36.87, 6284.69, 30.23>>
|
|
fRot = -62.4
|
|
model = TCM_MERC_TRUCK
|
|
BREAK
|
|
CASE 1
|
|
vPos = <<39.98, 6292.61, 30.23>>
|
|
fRot = 100.3
|
|
model = TCM_MERC_TRUCK
|
|
BREAK
|
|
CASE 2
|
|
vPos = <<15.55501, 6279.98584, 30.23803>>
|
|
fRot = 120.8
|
|
model = TCM_MERC_TRUCK
|
|
BREAK
|
|
CASE 3
|
|
vPos = <<51.32214, 6298.79297, 30.24123>>
|
|
fRot = -103.3
|
|
model = TCM_MERC_TRUCK
|
|
BREAK
|
|
CASE 4
|
|
vPos = <<9.62969, 6270.75879, 30.28201>>
|
|
fRot = 112.2
|
|
model = TCM_MERC_TRUCK
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
mercPickupVehicle[iCreateTruckFrame] = CREATE_VEHICLE(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(model), vPos, fRot)
|
|
|
|
IF iCreateTruckFrame=0
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(mercPickupVehicle[iCreateTruckFrame])
|
|
ELSE
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(mercPickupVehicle[iCreateTruckFrame])
|
|
//START_PLAYBACK_RECORDED_VEHICLE(mercPickupVehicle[i], 10, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
//SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(mercPickupVehicle[i], 3700)
|
|
//PAUSE_PLAYBACK_RECORDED_VEHICLE(mercPickupVehicle[i])
|
|
//SET_VEHICLE_ENGINE_ON(mercPickupVehicle[i], TRUE, TRUE)
|
|
ENDIF
|
|
|
|
IF iCreateTruckFrame = 4
|
|
bCreatedTrucks = TRUE
|
|
iCreateTruckFrame = 0
|
|
ELSE
|
|
iCreateTruckFrame++
|
|
ENDIF
|
|
ELSE
|
|
SWITCH iCreateTruckFrame
|
|
CASE 0
|
|
vPos = <<46.15843, 6285.14063, 30.36095>>
|
|
fRot = -122.5
|
|
BREAK
|
|
CASE 1
|
|
vPos = <<43.52159, 6289.26025, 30.26134>>
|
|
fRot = -132.5
|
|
BREAK
|
|
CASE 2
|
|
vPos = <<54.12662, 6297.37256, 30.25145>>
|
|
fRot = -121.1
|
|
BREAK
|
|
CASE 3
|
|
vPos = <<13.17000, 6281.27393, 30.23184>>
|
|
fRot = 116.2
|
|
BREAK
|
|
CASE 4
|
|
vPos = <<10.33347, 6281.09961, 30.22844>>
|
|
fRot = 116.2
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
mercPickupPed[iCreateTruckFrame] = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), vPos, fRot)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mercPickupPed[iCreateTruckFrame], TRUE)
|
|
SET_PED_KEEP_TASK(mercPickupPed[iCreateTruckFrame], TRUE)
|
|
|
|
TASK_LOOK_AT_ENTITY(mercPickupPed[iCreateTruckFrame], PLAYER_PED_ID(), -1, SLF_WIDEST_PITCH_LIMIT | SLF_WIDEST_YAW_LIMIT)
|
|
|
|
IF iCreateTruckFrame = 3
|
|
createMercPickupStage = CREATE_MERC_PICKUP_STAGE_DONE
|
|
ELSE
|
|
iCreateTruckFrame++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE CREATE_MERC_PICKUP_STAGE_DONE
|
|
INT i
|
|
|
|
IF currentMissionStage >= STAGE_GET_TO_BRIDGE
|
|
IF NOT bDoneMercsRun
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<53.56557, 6294.45654, 30.26339>>, <<80,80,100>>, FALSE, FALSE)
|
|
FOR i=3 TO 4
|
|
IF NOT IS_PED_INJURED(mercPickupPed[i])
|
|
VECTOR vRunToPos
|
|
SWITCH i
|
|
CASE 3
|
|
vRunToPos = <<-55.75646, 6271.71875, 30.39299>>
|
|
BREAK
|
|
CASE 4
|
|
vRunToPos = <<-69.33340, 6323.51172, 30.33929>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(mercPickupPed[i], vRunToPos, PEDMOVE_RUN)
|
|
ENDIF
|
|
ENDFOR
|
|
bDoneMercsRun = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneMercAngeredAnims
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<53.56557, 6294.45654, 30.26339>>, <<35,35,50>>, FALSE, FALSE)
|
|
FOR i=0 TO 2
|
|
IF NOT IS_PED_INJURED(mercPickupPed[i])
|
|
INT iWait
|
|
STRING sAnim
|
|
SWITCH i
|
|
CASE 0
|
|
iWait = 0
|
|
sAnim = "REACTION_FORWARD_BIG_INTRO_A"
|
|
BREAK
|
|
CASE 1
|
|
iWait = 300
|
|
sAnim = "REACTION_FORWARD_BIG_INTRO_B"
|
|
BREAK
|
|
CASE 2
|
|
iWait = 700
|
|
sAnim = "REACTION_FORWARD_BIG_INTRO_D"
|
|
BREAK
|
|
ENDSWITCH
|
|
CLEAR_SEQUENCE_TASK(sequence)
|
|
OPEN_SEQUENCE_TASK(sequence)
|
|
TASK_PAUSE(NULL, iWait)
|
|
TASK_PLAY_ANIM(NULL, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
|
|
CLOSE_SEQUENCE_TASK(sequence)
|
|
TASK_PERFORM_SEQUENCE(mercPickupPed[i], sequence)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
bDoneMercAngeredAnims = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneTrevorTauntMercsSpeech
|
|
bDoneTrevorTauntMercsSpeech = DO_MISSION_SPEECH("EXL3_STATION")
|
|
ENDIF
|
|
|
|
/*
|
|
FOR i=0 TO iLastPed
|
|
IF NOT IS_PED_INJURED(mercPickupPed[i])
|
|
STRING sAnim
|
|
SWITCH i
|
|
CASE 0
|
|
sAnim = "REACTION_FORWARD_BIG_INTRO_A"
|
|
BREAK
|
|
CASE 1
|
|
sAnim = "REACTION_FORWARD_BIG_INTRO_B"
|
|
BREAK
|
|
CASE 2
|
|
sAnim = "REACTION_FORWARD_BIG_INTRO_D"
|
|
BREAK
|
|
ENDSWITCH
|
|
IF IS_ENTITY_PLAYING_ANIM(mercPickupPed[i], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim)
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(mercPickupPed[i], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim) >= 0.98
|
|
|
|
TASK_PLAY_ANIM(mercPickupPed[i], GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EXIT_TO_GENERIC", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
*/
|
|
ENDIF
|
|
|
|
IF NOT bRemovedMercPickup
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<197.35889, 6379.99902, 30.41866>>, <<600,600,600>>, FALSE, FALSE)
|
|
REPEAT NUMBER_MERC_PICKUP_VEHICLES i
|
|
IF DOES_ENTITY_EXIST(mercPickupVehicle[i])
|
|
DELETE_VEHICLE(mercPickupVehicle[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT NUMBER_MERC_PICKUP_PEDS i
|
|
IF DOES_ENTITY_EXIST(mercPickupPed[i])
|
|
DELETE_PED(mercPickupPed[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
//CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_CAR))
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_TRUCK))
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_SOLDIER))
|
|
bRemovedMercPickup = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
FUNC INT GET_CARRIAGE_FOR_CLIMB_ENEMY(INT iEnemy)
|
|
SWITCH iEnemy
|
|
CASE 0
|
|
RETURN 20
|
|
BREAK
|
|
CASE 1
|
|
RETURN 6
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN 50
|
|
ENDFUNC
|
|
|
|
PROC HANDLE_KNOCK_CLIMB_ENEMY_PED_OFF(INT iEnemy)
|
|
IF climbEnemy[iEnemy].state < CLIMB_ENEMY_STATE_KNOCKED_OFF
|
|
IF NOT IS_PED_INJURED(climbEnemy[iEnemy].ped)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(climbEnemy[iEnemy].ped, PLAYER_PED_ID())
|
|
DETACH_ENTITY(climbEnemy[iEnemy].ped)
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(climbEnemy[iEnemy].ped, APPLY_TYPE_IMPULSE, <<4,0,0>>, 0, TRUE, TRUE)
|
|
climbEnemy[iEnemy].state = CLIMB_ENEMY_STATE_KNOCKED_OFF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// handle climb enemies
|
|
PROC HANDLE_CLIMB_ENEMIES()
|
|
INT i
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
REPEAT NUMBER_CLIMB_ENEMIES i
|
|
VEHICLE_INDEX carriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, GET_CARRIAGE_FOR_CLIMB_ENEMY(i))
|
|
IF IS_VEHICLE_DRIVEABLE(carriageVehicle)
|
|
SWITCH climbEnemy[i].state
|
|
CASE CLIMB_ENEMY_STATE_NOT_CREATED
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), carriageVehicle, <<150, 150, 150>>, FALSE, FALSE)
|
|
climbEnemy[i].ped = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), GET_ENTITY_COORDS(carriageVehicle), 0.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(climbEnemy[i].ped, TRUE)
|
|
SET_PED_KEEP_TASK(climbEnemy[i].ped, TRUE)
|
|
GIVE_WEAPON_TO_PED(climbEnemy[i].ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_MERC_RIFLE), INFINITE_AMMO)
|
|
SET_PED_ACCURACY(climbEnemy[i].ped, 0)
|
|
|
|
climbEnemy[i].iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-0.6,0,0.5>>, <<0,0,180>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(climbEnemy[i].iSyncScene, carriageVehicle, 0)
|
|
TASK_SYNCHRONIZED_SCENE(climbEnemy[i].ped, climbEnemy[i].iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "ex03_climb_ladder", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_NONE, RBF_VEHICLE_IMPACT)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(climbEnemy[i].iSyncScene, 0.4)
|
|
//SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(climbEnemy[i].iSyncScene, TRUE)
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(climbEnemy[i].ped)
|
|
|
|
SWITCH i
|
|
CASE 0
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 3, climbEnemy[i].ped, "EX3MERC1")
|
|
BREAK
|
|
CASE 1
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 4, climbEnemy[i].ped, "EX3MERC2")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
climbEnemy[i].state = CLIMB_ENEMY_STATE_CLIMBING
|
|
ENDIF
|
|
BREAK
|
|
CASE CLIMB_ENEMY_STATE_CLIMBING
|
|
IF NOT IS_PED_INJURED(climbEnemy[i].ped)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(climbEnemy[i].iSyncScene)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(climbEnemy[i].iSyncScene) >= 0.98
|
|
ATTACH_ENTITY_TO_ENTITY(climbEnemy[i].ped, carriageVehicle, 0, <<-0.6,0,4.3>>, <<0,0,180>>, TRUE, TRUE, TRUE, FALSE)
|
|
TASK_SHOOT_AT_ENTITY(climbEnemy[i].ped, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
|
|
climbEnemy[i].state = CLIMB_ENEMY_STATE_SHOOTING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE CLIMB_ENEMY_STATE_SHOOTING
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_PED_INJURED(climbEnemy[i].ped)
|
|
IF climbEnemy[i].state >= CLIMB_ENEMY_STATE_CLIMBING
|
|
HANDLE_KNOCK_CLIMB_ENEMY_PED_OFF(i)
|
|
|
|
IF NOT climbEnemy[i].bDoneSpeech
|
|
IF climbEnemy[i].state < CLIMB_ENEMY_STATE_KNOCKED_OFF
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), climbEnemy[i].ped, <<50, 50, 50>>, FALSE, FALSE)
|
|
IF i=0
|
|
//climbEnemy[i].bDoneSpeech = DO_MISSION_SPEECH("EXL3_MWTRN1")
|
|
ELSE
|
|
//climbEnemy[i].bDoneSpeech = DO_MISSION_SPEECH("EXL3_MWTRN2")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// create an anim cam for sync scenes
|
|
PROC CREATE_MISSION_ANIM_CAM(BOOL bStartActivated = TRUE, BOOL bRender = TRUE)
|
|
DESTROY_MISSION_ANIM_CAM()
|
|
IF bStartActivated
|
|
animCam = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", bStartActivated)
|
|
ENDIF
|
|
IF bRender
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// cam for a cutscene shot
|
|
PROC CREATE_CAM_FOR_TRAIN_CRASH_SHOT(TRAIN_CRASH_SHOT_DETAILS_ENUM cutsceneShot, BOOL bIsInterp = FALSE, INT iInterpTime = 10000)
|
|
VECTOR vCamPos, vCamRot
|
|
FLOAT fCamFOV
|
|
FILL_CAMERA_PROPERTIES_FOR_TRAIN_CRASH_SHOT(cutsceneShot, vCamPos, vCamRot, fCamFOV)
|
|
CREATE_MISSION_STATIC_CAM(staticCam)
|
|
DETACH_CAM(staticCam)
|
|
|
|
// pointing
|
|
STOP_CAM_POINTING(staticCam)
|
|
|
|
SET_CAM_COORD(staticCam, vCamPos)
|
|
SET_CAM_ROT(staticCam, vCamRot)
|
|
SET_CAM_FOV(staticCam, fCamFOV)
|
|
|
|
// setup for interpolation
|
|
IF bIsInterp
|
|
FILL_CAMERA_PROPERTIES_FOR_TRAIN_CRASH_SHOT(INT_TO_ENUM(TRAIN_CRASH_SHOT_DETAILS_ENUM, ENUM_TO_INT(cutsceneShot)+1), vCamPos, vCamRot, fCamFOV)
|
|
CREATE_MISSION_STATIC_CAM(interpCam)
|
|
SET_CAM_COORD(interpCam, vCamPos)
|
|
SET_CAM_ROT(interpCam, vCamRot)
|
|
SET_CAM_FOV(interpCam, fCamFOV)
|
|
SET_CAM_ACTIVE_WITH_INTERP(interpCam, staticCam, iInterpTime)
|
|
ENDIF
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDPROC
|
|
|
|
// create cam attached to train
|
|
PROC CREATE_CAM_ATTACHED_TO_TRAIN(STRING sCam, BOOL bActivated = TRUE, BOOL bRender = TRUE)
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
CREATE_MISSION_ANIM_CAM(bActivated, bRender)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, sCam, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND))
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC INTERP_FLOAT_TO_FLOAT_OVER_TIME(FLOAT f1, FLOAT f2, FLOAT &fChangeVar, FLOAT fTime)
|
|
FLOAT fTimeSinceLastFrame = GET_FRAME_TIME()
|
|
|
|
FLOAT fDiff = f2 - f1
|
|
FLOAT fTimePerMS = (fDiff / fTime)
|
|
fChangeVar += (fTimePerMS * fTimeSinceLastFrame)
|
|
ENDPROC
|
|
|
|
PROC INTERP_VECTOR_TO_VECTOR_OVER_TIME(VECTOR v1, VECTOR v2, VECTOR &vChangeVar, FLOAT fTime)
|
|
INTERP_FLOAT_TO_FLOAT_OVER_TIME(v1.x, v2.x, vChangeVar.x, fTime)
|
|
INTERP_FLOAT_TO_FLOAT_OVER_TIME(v1.y, v2.y, vChangeVar.y, fTime)
|
|
INTERP_FLOAT_TO_FLOAT_OVER_TIME(v1.z, v2.z, vChangeVar.z, fTime)
|
|
ENDPROC
|
|
|
|
PROC SET_BIKE_CAM_ROTATION()
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
SET_CAM_ROT(staticCam, <<12.1,-6.2,GET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE]) - 195>>) // 5.5
|
|
VECTOR vCamPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_BIKE], vCurrentBikeCamOffset)
|
|
SET_CAM_COORD(staticCam, <<vCamPos.x, vCamPos.y, fBikeCamHeight>>)
|
|
SET_CAM_FOV(staticCam, 37.5)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// create cam attached to train
|
|
PROC CREATE_CAM_AT_BIKE()
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
CREATE_MISSION_STATIC_CAM(staticCam)
|
|
DETACH_CAM(staticCam)
|
|
SET_BIKE_CAM_ROTATION()
|
|
SHAKE_CAM(staticCam, "SMALL_EXPLOSION_SHAKE", 0.25)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC APPLY_TEMP_DEAD_ZONE(INT &iMod)
|
|
IF iMod > 0
|
|
AND iMod < 10
|
|
iMod = 0
|
|
ENDIF
|
|
IF iMod < 0
|
|
AND iMod > -10
|
|
iMod = 0
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// update train cam
|
|
CONST_FLOAT FIRST_PERSON_CAM_SPEED 0.5
|
|
CONST_FLOAT FIRST_PERSON_CAM_X_LIMIT 10.0
|
|
CONST_FLOAT FIRST_PERSON_CAM_Z_MAX_LIMIT 64.0
|
|
CONST_FLOAT FIRST_PERSON_CAM_Z_MIN_LIMIT -79.0
|
|
|
|
PROC UPDATE_TRAIN_FIRST_PERSON_CAM(BOOL bForceUpdate)
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
IF bForceUpdate
|
|
OR NOT IS_SELECTOR_ONSCREEN()
|
|
vFirstPersonCamRot=vFirstPersonCamRot
|
|
/*
|
|
VECTOR vTrainRot = GET_ENTITY_ROTATION(missionTrain)
|
|
INT iLX, iLY, iRX, iRY
|
|
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLX, iLY, iRX, iRY)
|
|
|
|
APPLY_TEMP_DEAD_ZONE(iRX)
|
|
APPLY_TEMP_DEAD_ZONE(iRY)
|
|
|
|
vFirstPersonCamRot.z = vFirstPersonCamRot.z +@ iRX * FIRST_PERSON_CAM_SPEED * -1
|
|
IF vFirstPersonCamRot.z > FIRST_PERSON_CAM_Z_MAX_LIMIT
|
|
vFirstPersonCamRot.z = FIRST_PERSON_CAM_Z_MAX_LIMIT
|
|
ELIF vFirstPersonCamRot.z < FIRST_PERSON_CAM_Z_MIN_LIMIT
|
|
vFirstPersonCamRot.z = FIRST_PERSON_CAM_Z_MIN_LIMIT
|
|
ENDIF
|
|
|
|
FLOAT fMult = -1
|
|
IF IS_LOOK_INVERTED()
|
|
fMult = 1
|
|
ENDIF
|
|
|
|
vFirstPersonCamRot.x = vFirstPersonCamRot.x +@ iRY * FIRST_PERSON_CAM_SPEED * fMult
|
|
|
|
IF vFirstPersonCamRot.x > FIRST_PERSON_CAM_X_LIMIT
|
|
vFirstPersonCamRot.x = FIRST_PERSON_CAM_X_LIMIT
|
|
ELIF vFirstPersonCamRot.x < -FIRST_PERSON_CAM_X_LIMIT
|
|
vFirstPersonCamRot.x = -FIRST_PERSON_CAM_X_LIMIT
|
|
ENDIF
|
|
|
|
SET_CAM_ROT(firstPersonCam, vTrainRot + vFirstPersonCamRot)
|
|
*/
|
|
|
|
//SET_CAM_COORD(fpsCam.theCam, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, <<1.3, 4.7, 2.1>>))
|
|
|
|
fpsCam.vInitCamPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, <<1.2, 4.7, 2.1>>)
|
|
fpsCam.vInitCamRot = GET_ENTITY_ROTATION(missionTrain)
|
|
UPDATE_FIRST_PERSON_CAMERA(fpsCam, FALSE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
|
|
//ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), missionTrain, 0, <<1.23, 4.5, 1.5>>, <<0,0,vFirstPersonCamRot.z>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDPROC
|
|
|
|
// create cam attached to train
|
|
PROC CREATE_TRAIN_FIRST_PERSON_CAM()
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), missionTrain)
|
|
ENDIF
|
|
|
|
INIT_FIRST_PERSON_CAMERA(fpsCam, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, <<1.3, 4.7, 2.1>>), GET_ENTITY_ROTATION(missionTrain), 40.0, 64, 10)
|
|
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(TRUE)
|
|
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
|
|
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(1.2)
|
|
CASCADE_SHADOWS_SET_SPLIT_Z_EXP_WEIGHT(1)
|
|
//CREATE_MISSION_STATIC_CAM(firstPersonCam, TRUE)
|
|
//ATTACH_CAM_TO_ENTITY(firstPersonCam, missionTrain, <<1.3, 4.7, 2.1>>)
|
|
//vFirstPersonCamRot = <<0,0,0>>
|
|
//UPDATE_TRAIN_FIRST_PERSON_CAM(TRUE)
|
|
//SET_CAM_FOV(firstPersonCam, 40.0)
|
|
//RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set next random speech time
|
|
PROC SET_NEXT_RANDOM_SPEECH_TIME(INT iTime = -1, INT iRandomMin = -1, INT iRandomMax = -1)
|
|
IF iTime >= 0
|
|
// if supplied an argument, set it to that
|
|
iNextRandomSpeechTime = GET_GAME_TIMER() + iTime
|
|
ELSE
|
|
INT iNextTimeMin
|
|
INT iNextTimeMax
|
|
|
|
IF iRandomMin < 0
|
|
iNextTimeMin = MIN_RANDOM_SPEECH_TIME
|
|
ELSE
|
|
iNextTimeMin = iRandomMin
|
|
ENDIF
|
|
|
|
IF iRandomMax < 0
|
|
iNextTimeMax = MAX_RANDOM_SPEECH_TIME
|
|
ELSE
|
|
iNextTimeMax = iRandomMax
|
|
ENDIF
|
|
|
|
iNextRandomSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iNextTimeMin, iNextTimeMax)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// handle random speech
|
|
PROC DO_RANDOM_SPEECH(STRING sSpeech, INT iNextTime = -1, INT iRandomMin = -1, INT iRandomMax = -1)
|
|
// initialise next speech time if not yet done so
|
|
IF iNextRandomSpeechTime < 0
|
|
SET_NEXT_RANDOM_SPEECH_TIME()
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() >= iNextRandomSpeechTime
|
|
IF DO_MISSION_SPEECH(sSpeech)
|
|
IF iNextTime >= 0
|
|
SET_NEXT_RANDOM_SPEECH_TIME(iNextTime)
|
|
ELSE
|
|
SET_NEXT_RANDOM_SPEECH_TIME(-1, iRandomMin, iRandomMax)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set bike on the train
|
|
PROC SET_BIKE_ON_TRAIN()
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
VEHICLE_INDEX lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage)
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
ENDIF
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_BIKE])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_BIKE])
|
|
ENDIF
|
|
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_BIKE], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(lastCarriage, <<0, -6.0, 3.7>>)) //-7
|
|
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BIKE], <<0,0,GET_ENTITY_HEADING(lastCarriage)>>)
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
|
|
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BIKE], 38) // 35
|
|
TASK_VEHICLE_TEMP_ACTION(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], TEMPACT_GOFORWARD, 100)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// synced scene attached to train
|
|
PROC CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(VECTOR vAttach)
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
iSyncScene = CREATE_SYNCHRONIZED_SCENE(vAttach, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, missionTrain, 0)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set trev ready to jump from train
|
|
PROC SET_TREVOR_READY_TO_JUMP(BOOL bForce = FALSE)
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
VECTOR vAttach
|
|
STRING sAnim
|
|
BOOL bLooped
|
|
|
|
SWITCH trainRideState
|
|
CASE TRAIN_RIDE_STATE_LOW
|
|
vAttach = <<0,0,0>>
|
|
IF NOT bDoingRideIdle1
|
|
sAnim = "EX03_TRAIN_SIDE_IDLE_BASE"
|
|
bDoingRideIdle1 = TRUE
|
|
ELSE
|
|
sAnim = "EX03_TRAIN_SIDE_IDLE_A"
|
|
bDoingRideIdle1 = FALSE
|
|
ENDIF
|
|
bLooped = TRUE
|
|
BREAK
|
|
CASE TRAIN_RIDE_STATE_HIGH
|
|
vAttach = <<0,0,0>>
|
|
sAnim = "EX03_TRAIN_ROOF_IDLE"
|
|
bLooped = TRUE
|
|
BREAK
|
|
CASE TRAIN_RIDE_STATE_CLIMB_LADDER
|
|
vAttach = <<0,0,0>>
|
|
sAnim = "EX03_CLIMB_LADDER"
|
|
bLooped = FALSE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(vAttach)
|
|
|
|
FLOAT fBlend
|
|
IF bForce
|
|
fBlend = INSTANT_BLEND_IN
|
|
ELSE
|
|
fBlend = NORMAL_BLEND_IN
|
|
ENDIF
|
|
|
|
//DETACH_ENTITY(trevorPed)
|
|
IF IS_PED_IN_ANY_VEHICLE(trevorPed)
|
|
SET_ENTITY_COORDS(trevorPed, GET_ENTITY_COORDS(trevorPed) + <<0,0,1>>)
|
|
ENDIF
|
|
TASK_SYNCHRONIZED_SCENE(trevorPed, iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim, fBlend, NORMAL_BLEND_OUT)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, bLooped)
|
|
|
|
IF bForce
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// equip best player weapon
|
|
PROC EQUIP_BEST_PED_WEAPON(PED_INDEX ped, BOOL bForceIntoHand)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
WEAPON_TYPE bestWeapon = GET_BEST_PED_WEAPON(ped)
|
|
WEAPON_GROUP weaponGroup = GET_WEAPONTYPE_GROUP(bestWeapon)
|
|
INT iWeaponAmmo = GET_AMMO_IN_PED_WEAPON(ped, bestWeapon)
|
|
INT iGiveAmmo = -1
|
|
|
|
BOOL bWeaponIsSuitable = TRUE
|
|
|
|
//IF weaponGroup <> WEAPONGROUP_PISTOL
|
|
//IF weaponGroup <> WEAPONGROUP_SMG
|
|
IF weaponGroup <> WEAPONGROUP_RIFLE
|
|
AND weaponGroup <> WEAPONGROUP_MG
|
|
//AND weaponGroup <> WEAPONGROUP_SHOTGUN
|
|
bWeaponIsSuitable = FALSE
|
|
ELSE
|
|
INT iReasonableAmmo
|
|
SWITCH weaponGroup
|
|
CASE WEAPONGROUP_PISTOL
|
|
iReasonableAmmo = 240
|
|
BREAK
|
|
CASE WEAPONGROUP_SMG
|
|
iReasonableAmmo = 240
|
|
BREAK
|
|
CASE WEAPONGROUP_RIFLE
|
|
iReasonableAmmo = 240
|
|
BREAK
|
|
CASE WEAPONGROUP_MG
|
|
iReasonableAmmo = 300
|
|
BREAK
|
|
CASE WEAPONGROUP_SHOTGUN
|
|
iReasonableAmmo = 12
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF iWeaponAmmo < iReasonableAmmo
|
|
iGiveAmmo = iReasonableAmmo
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bWeaponIsSuitable
|
|
SET_CURRENT_PED_WEAPON(ped, bestWeapon, bForceIntoHand)
|
|
IF iGiveAmmo >= 0
|
|
SET_AMMO_IN_CLIP(ped, bestWeapon, GET_MAX_AMMO_IN_CLIP(ped, bestWeapon))
|
|
SET_PED_AMMO(ped, bestWeapon, iGiveAmmo)
|
|
ENDIF
|
|
ELSE
|
|
GIVE_WEAPON_TO_PED(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_BACKUP_RIFLE), 240, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// give ped pistol for boat chase
|
|
CONST_INT PISTOL_AMMO 128
|
|
PROC GIVE_PED_PISTOL_FOR_BOAT_CHASE(PED_INDEX ped)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF NOT HAS_PED_GOT_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL))
|
|
GIVE_WEAPON_TO_PED(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), PISTOL_AMMO)
|
|
ELSE
|
|
IF GET_AMMO_IN_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL)) < PISTOL_AMMO
|
|
SET_PED_AMMO(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), PISTOL_AMMO)
|
|
ENDIF
|
|
ENDIF
|
|
SET_CURRENT_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// give player smg for boat chase
|
|
PROC GIVE_PED_PISTOL_FOR_DRIVE_ON_TRAIN(PED_INDEX ped)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF NOT HAS_PED_GOT_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL))
|
|
GIVE_WEAPON_TO_PED(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), PISTOL_AMMO)
|
|
ELSE
|
|
IF GET_AMMO_IN_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL)) < PISTOL_AMMO
|
|
SET_PED_AMMO(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), PISTOL_AMMO)
|
|
ENDIF
|
|
ENDIF
|
|
SET_CURRENT_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_PISTOL), TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
CONST_INT SNIPER_AMMO 30
|
|
// give player sniper rifle for shootout
|
|
PROC GIVE_PED_SNIPER_RIFLE_FOR_SHOOTOUT(PED_INDEX ped)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF NOT HAS_PED_GOT_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE))
|
|
AND NOT HAS_PED_GOT_WEAPON(ped, WEAPONTYPE_HEAVYSNIPER)
|
|
GIVE_WEAPON_TO_PED(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE), SNIPER_AMMO)
|
|
ELSE
|
|
IF GET_AMMO_IN_PED_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE)) < SNIPER_AMMO
|
|
AND GET_AMMO_IN_PED_WEAPON(ped, WEAPONTYPE_HEAVYSNIPER) < SNIPER_AMMO
|
|
IF HAS_PED_GOT_WEAPON(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE))
|
|
SET_PED_AMMO(ped, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_SNIPER_RIFLE), SNIPER_AMMO)
|
|
ELSE
|
|
SET_PED_AMMO(ped, WEAPONTYPE_HEAVYSNIPER, SNIPER_AMMO)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC HANDLE_RIFLE_THERMAL()
|
|
|
|
WEAPON_TYPE weapon
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
|
|
|
|
IF weapon = WEAPONTYPE_SNIPERRIFLE
|
|
OR weapon = WEAPONTYPE_HEAVYSNIPER
|
|
IF bShouldDoSniperHelp
|
|
bDoneSniperHelp1 = TRUE
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_SNPHLP")
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
CLEAR_HELP(FALSE)
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bReloadingSniperRifle
|
|
IF GET_GAME_TIMER() >= iReloadSniperRifleTime + 2000
|
|
bReloadingSniperRifle = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bThermalOn
|
|
BOOL bTurnOn = FALSE
|
|
IF weapon = WEAPONTYPE_SNIPERRIFLE
|
|
OR weapon = WEAPONTYPE_HEAVYSNIPER
|
|
IF (IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL_TWO)
|
|
OR bThermalSwitchedOn)
|
|
AND GET_CONTROL_VALUE(PLAYER_CONTROL, INPUT_AIM) >= 132
|
|
AND NOT bReloadingSniperRifle
|
|
IF IS_FIRST_PERSON_AIM_CAM_ACTIVE()
|
|
bThermalSwitchedOn = TRUE
|
|
bTurnOn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bTurnOn
|
|
IF NOT GET_USINGSEETHROUGH()
|
|
SET_SEETHROUGH(TRUE)
|
|
ENDIF
|
|
bThermalOn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REPLAY_PREVENT_RECORDING_THIS_FRAME()
|
|
|
|
bDoneSniperHelp1 = TRUE
|
|
bDoneSniperHelp2 = TRUE
|
|
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_SNPHLP2")
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
CLEAR_HELP(FALSE)
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
INT iClip
|
|
BOOL bTurnOff = FALSE
|
|
IF weapon <> WEAPONTYPE_SNIPERRIFLE
|
|
AND weapon <> WEAPONTYPE_HEAVYSNIPER
|
|
bTurnOff = TRUE
|
|
ELSE
|
|
GET_AMMO_IN_CLIP(PLAYER_PED_ID(), weapon, iClip)
|
|
ENDIF
|
|
|
|
BOOL bLessThanMax = FALSE
|
|
IF weapon = WEAPONTYPE_SNIPERRIFLE
|
|
IF iClip < 10
|
|
bLessThanMax = TRUE
|
|
ENDIF
|
|
ELIF weapon = WEAPONTYPE_HEAVYSNIPER
|
|
IF iClip < 6
|
|
bLessThanMax = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bLessThanMax AND IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_RELOAD)
|
|
OR iClip = 0
|
|
bReloadingSniperRifle = TRUE
|
|
iReloadSniperRifleTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
IF NOT IS_FIRST_PERSON_AIM_CAM_ACTIVE()
|
|
OR GET_CONTROL_VALUE(PLAYER_CONTROL, INPUT_AIM) < 132
|
|
OR bReloadingSniperRifle
|
|
bTurnOff = TRUE
|
|
ENDIF
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL_TWO)
|
|
IF IS_FIRST_PERSON_AIM_CAM_ACTIVE()
|
|
bThermalSwitchedOn = FALSE
|
|
bTurnOff = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bTurnOff
|
|
IF GET_USINGSEETHROUGH()
|
|
SET_SEETHROUGH(FALSE)
|
|
ENDIF
|
|
bThermalOn = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// move the last player vehicle if at coord
|
|
PROC CLEAR_INIT_POS(VECTOR vCheckPos)
|
|
CLEAR_AREA(vCheckPos, CLEAR_POS_RADIUS, TRUE, TRUE)
|
|
ENDPROC
|
|
|
|
// position player at init pos for mission
|
|
PROC POSITION_PLAYER_AT_MISSION_INIT()
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT))
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), PLAYER_INIT_ROT)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set michael into the car
|
|
PROC DO_MICHAEL_INTO_CAR()
|
|
printstring("here3") printnl()
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
printstring("here5") printnl()
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_MICHAEL_CAR])
|
|
printstring("here6") printnl()
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_MICHAEL_CAR])
|
|
printstring("here4") printnl()
|
|
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL],MS_ON_FOOT_WALK,FALSE,FAUS_CUTSCENE_EXIT)
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL],PEDMOVE_WALK)
|
|
CLEAR_SEQUENCE_TASK(sequence)
|
|
OPEN_SEQUENCE_TASK(sequence)
|
|
TASK_ENTER_VEHICLE(NULL, trainCrashVehicle[TCV_MICHAEL_CAR], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVEBLENDRATIO_WALK)
|
|
TASK_VEHICLE_DRIVE_TO_COORD(NULL, trainCrashVehicle[TCV_MICHAEL_CAR], <<1992.65, 3839.31, 31.33>>, 5.0, DRIVINGSTYLE_NORMAL, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL_CAR), DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, 5, -1)
|
|
//TASK_VEHICLE_DRIVE_WANDER(NULL, trainCrashVehicle[TCV_MICHAEL_CAR], 20.0, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS)
|
|
CLOSE_SEQUENCE_TASK(sequence)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sequence)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// disable leave bike
|
|
PROC DISABLE_LEAVE_BIKE_ON_TRAIN()
|
|
IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// apply helper force
|
|
PROC APPLY_HELPER_FORCE_TO_BIKE_ON_TRAIN()
|
|
IF bDoHelperForceOnTrain
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_BIKE], APPLY_TYPE_FORCE, <<0,10,0>>, 0, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// chopper weapons swap
|
|
/*
|
|
PROC HANDLE_CHOPPER_WEAPON_SWAP(PED_INDEX ped, INT &iTime, BOOL &bRockets)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
AND NOT IS_PED_INJURED(dummyBoatPed)
|
|
IF NOT bRockets
|
|
IF GET_GAME_TIMER() >= iTime
|
|
SET_PED_FIRING_PATTERN(ped, FIRING_PATTERN_FULL_AUTO)
|
|
SET_CURRENT_PED_VEHICLE_WEAPON(ped, WEAPONTYPE_VEHICLE_SPACE_ROCKET)
|
|
iTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
|
|
bRockets = TRUE
|
|
ELSE
|
|
ATTACH_ENTITY_TO_ENTITY(dummyBoatPed, trainCrashVehicle[TCV_DINGHY], 0, <<0,0,0>>, <<0,0,0>>)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iTime
|
|
SET_PED_FIRING_PATTERN(ped, FIRING_PATTERN_FULL_AUTO)
|
|
SET_CURRENT_PED_VEHICLE_WEAPON(ped, WEAPONTYPE_VEHICLE_PLAYER_BULLET)
|
|
iTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 10000)
|
|
bRockets = FALSE
|
|
ELSE
|
|
ATTACH_ENTITY_TO_ENTITY(dummyBoatPed, trainCrashVehicle[TCV_DINGHY], 0, <<0,7.1,1.8>>, <<0,0,0>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
*/
|
|
|
|
// set michael searching in container
|
|
PROC SET_MICHAEL_SEARCHING_IN_CONTAINER(INT iSearchAnim, BOOL bInstant)
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
//iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<1,0.1,0>>, <<0,0,0>>)
|
|
iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_POS), GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_ROT))
|
|
//ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, trainCrashVehicle[TCV_DINGHY], 0)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, TRUE)
|
|
|
|
STRING sAnim
|
|
SWITCH iSearchAnim
|
|
CASE 0
|
|
sAnim = "EX03_DINGY_SEARCH_CASE_BASE_MICHAEL"
|
|
BREAK
|
|
CASE 1
|
|
sAnim = "EX03_DINGY_SEARCH_CASE_A_MICHAEL"
|
|
BREAK
|
|
CASE 2
|
|
sAnim = "EX03_DINGY_SEARCH_CASE_B_MICHAEL"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
FLOAT fBlendIn
|
|
IF bInstant
|
|
fBlendIn = INSTANT_BLEND_IN
|
|
ELSE
|
|
fBlendIn = SLOW_BLEND_IN
|
|
ENDIF
|
|
|
|
TASK_SYNCHRONIZED_SCENE(michaelPed, iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), sAnim, fBlendIn, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, blockingAllRagdoll)
|
|
IF bInstant
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// step into container
|
|
PROC SET_MICHAEL_STEP_INTO_CONTAINER(BOOL bSkipToPhase)
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
SET_ENTITY_COORDS(michaelPed, GET_ENTITY_COORDS(michaelPed) + <<0,0,1>>)
|
|
iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_POS), GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_ROT))
|
|
TASK_SYNCHRONIZED_SCENE(michaelPed, iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_CLIMB_DOWN_ENTER_MICHAEL", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, blockingAllRagdoll)
|
|
|
|
IF bSkipToPhase
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, SKIP_MICHAEL_INTO_CONTAINER_PHASE)
|
|
ENDIF
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
int iContDriveSyncScene
|
|
PROC DRIVE_BOAT_TO_COINTAINER()
|
|
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
AND NOT IS_PED_INJURED(michaelPed)
|
|
IF NOT IS_PED_IN_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iContDriveSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_POS) + <<0.04, 0.03, -0.0017>>, GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_ROT) + <<-1,0,-1.0>>)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(trainCrashVehicle[TCV_DINGHY], iContDriveSyncScene, "EX03_DINGY_DRIVE_UP_DINGY", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), INSTANT_BLEND_IN)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iContDriveSyncScene, 0.2)//0.15)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(trainCrashVehicle[TCV_DINGHY])
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Check if the dingy has finished playing it's sync scene of it driving up to the container.
|
|
/// RETURNS:
|
|
///
|
|
FUNC BOOL HAS_BOAT_DRIVEN_TO_CONTAINER()
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iContDriveSyncScene) > 0.4
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
// handle michael searching in container
|
|
PROC HANDLE_MICHAEL_SEARCHING_IN_CONTAINER()
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
FLOAT fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene)
|
|
IF fPhase >= 0.0
|
|
IF fPhase >= 0.98
|
|
INT iNewSearch
|
|
SWITCH iCurrentSearch
|
|
CASE 0
|
|
iNewSearch = 0
|
|
BREAK
|
|
CASE 1
|
|
iNewSearch = 1
|
|
BREAK
|
|
CASE 2
|
|
iNewSearch = 0
|
|
BREAK
|
|
CASE 3
|
|
iNewSearch = 2
|
|
BREAK
|
|
CASE 4
|
|
iNewSearch = 0
|
|
BREAK
|
|
ENDSWITCH
|
|
SET_MICHAEL_SEARCHING_IN_CONTAINER(iNewSearch, FALSE)
|
|
iCurrentSearch++
|
|
IF iCurrentSearch > 4
|
|
iCurrentSearch = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC BLIP_RIVER_MOUTH()
|
|
IF NOT DOES_BLIP_EXIST(gotoBlip)
|
|
IF NOT bDoMopUp
|
|
IF DOES_BLIP_EXIST(vehicleBlip)
|
|
REMOVE_BLIP(vehicleBlip)
|
|
ENDIF
|
|
|
|
IF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
|
|
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_RIVER_MOUTH))
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF boatHotswapState <> BOAT_HOTSWAP_ON_MICHAEL
|
|
REMOVE_BLIP(gotoBlip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bShownGodText
|
|
IF NOT bDoMopup
|
|
IF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
|
|
AND ((currentMissionStage = STAGE_STEAL_FROM_CONTAINER AND bDoneGotoSpeech) OR (bDoneRapidsSpeechInterrupt[RSI_BOATS_INTRO] AND NOT bRapidsSpeechInterruptPending))
|
|
bShownGodText = DO_MISSION_GOD_TEXT("TC_ESCAPE")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// reposition dinghy
|
|
PROC REPOSITION_DINGHY()
|
|
//PRINTSTRING("TRY REPOS") PRINTNL()
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(trainCrashVehicle[TCV_DINGHY], INSTANT_BLEND_OUT, TRUE)
|
|
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_CONTAINER))
|
|
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_CONTAINER_ROTATION))
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
//printstring("reposition dinghY") printnl()
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_LOCKED)
|
|
bRepositionedDinghy = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set trevor into cover for shootout
|
|
PROC SET_TREVOR_INTO_COVER_FOR_SHOOTOUT(BOOL bInstant = TRUE)
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
islandCover = ADD_COVER_POINT(<<-485.2, 4400.4, 30.4>>, 11.3, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
|
|
IF bInstant
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(trevorPed, <<-485.16, 4399.73, 30.67>>, -1, FALSE, 0, TRUE, FALSE, islandCover)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
ELSE
|
|
TASK_SEEK_COVER_TO_COVER_POINT(trevorPed, islandCover, <<-488.99, 4436.39, 31.15>>, -1, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// should we set the checkpoint for replay on this stage init?
|
|
FUNC BOOL SHOULD_SET_CHECKPOINT_FOR_THIS_STAGE(MISSION_STAGE_ENUM setStage)
|
|
SWITCH setStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
CASE STAGE_CHASE_TRAIN
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
CASE STAGE_RAPIDS_CHASE
|
|
CASE STAGE_GET_HOME
|
|
RETURN TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// clear the start area
|
|
PROC CLEAR_START_AREA()
|
|
// clear init areas
|
|
CLEAR_INIT_POS(GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT))
|
|
CLEAR_INIT_POS(GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_INIT))
|
|
CLEAR_INIT_POS(GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_INIT))
|
|
CLEAR_INIT_POS(GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_CAR_INIT))
|
|
ENDPROC
|
|
|
|
// set michael at init pos
|
|
PROC SET_MICHAEL_AT_INIT()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_INIT))
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], MICHAEL_INIT_ROT)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// boat at beach
|
|
PROC SETUP_BOAT_AND_BEACH()
|
|
WHILE beachCreationStage <> BEACH_CREATION_DONE
|
|
WAIT(0)
|
|
HANDLE_BEACH_CREATION(TRUE)
|
|
ENDWHILE
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-2462.42725, 4278.47510, 0.18656>>)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// start a particular stage of the mission
|
|
PROC SET_MISSION_STAGE(MISSION_STAGE_ENUM setStage, BOOL bJumpingToStage = FALSE, BOOL bClearTextAndSpeech = TRUE, BOOL bInitialisingAfterIntro = FALSE, BOOL bRemoveAllBlips = TRUE, BOOL bClearMap = TRUE, BOOL bHandleFadeIn = TRUE)
|
|
// no helmet plz
|
|
//SET_PED_HELMET(PLAYER_PED_ID(), FALSE)
|
|
|
|
IF bJumpingToStage
|
|
// clear area and load scene around start pos
|
|
VECTOR vStartPos
|
|
FLOAT fStartRot
|
|
|
|
SWITCH setStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT)
|
|
fStartRot = PLAYER_INIT_ROT
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_CHASE)
|
|
fStartRot = BIKE_CHASE_ROT
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_DRIVE_ALONG_TRAIN)
|
|
fStartRot = 45.8
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_PURSUIT_FOLLOW_STAGE)
|
|
fStartRot = PURSUIT_FOLLOW_STAGE_ROT
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
vStartPos = <<-402,4435,30>>
|
|
fStartRot = DINGHY_AT_BRIDGE_ROT
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_SHOOTOUT_INIT_REPLAY)
|
|
fStartRot = -80.0
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
vStartPos = <<-590.82245, 4401.20459, 15.17075>>
|
|
fStartRot = -92.7
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
IF NOT bForcePassOnShitskip
|
|
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BEACH)
|
|
fStartRot = DINGHY_AT_BEACH_ROT
|
|
ELSE
|
|
vStartPos = GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES)
|
|
fStartRot = -107.9
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// clear area for replay
|
|
SET_PLAYER_OUT_OF_ANY_VEHICLE()
|
|
IF bClearMap
|
|
CLEAR_AREA(vStartPos, 10000, TRUE)
|
|
ENDIF
|
|
WAIT(0)
|
|
|
|
// set weather
|
|
SET_WEATHER_TYPE_NOW_PERSIST("extrasunny")
|
|
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
AND NOT bSuppressFutureReplaySetups
|
|
START_REPLAY_SETUP(vStartPos, fStartRot)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vStartPos)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fStartRot)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// get the models and force their load
|
|
REQUEST_MODELS_FOR_STAGE(setStage, TRUE, FALSE)
|
|
|
|
// get the recordings and force their load
|
|
REQUEST_VEHICLE_RECORDINGS_FOR_STAGE(setStage, TRUE, FALSE)
|
|
|
|
// get the waypoints and force their load
|
|
REQUEST_WAYPOINT_RECORDINGS_FOR_STAGE(setStage, TRUE, FALSE)
|
|
|
|
// get the anims and force their load
|
|
REQUEST_ANIM_DICTS_FOR_STAGE(setStage, TRUE, FALSE)
|
|
|
|
// get the weapons and force their load
|
|
REQUEST_WEAPONS_FOR_STAGE(setStage, TRUE, FALSE)
|
|
|
|
// reset vars
|
|
IF setStage = STAGE_RAPIDS_CHASE
|
|
IF NOT bJumpingToStage
|
|
bCachedShownGodText = bShownGodText
|
|
ENDIF
|
|
ENDIF
|
|
RESET_VARIABLES_FOR_STAGE(setStage)
|
|
|
|
// get the ptfx and force their load
|
|
REQUEST_PTFX_FOR_STAGE(setStage, TRUE, FALSE)
|
|
|
|
// get the sfx and force their load
|
|
REQUEST_SFX_FOR_STAGE(setStage, TRUE, FALSE)
|
|
|
|
// get the misc assets and force their load
|
|
REQUEST_MISC_ASSETS_FOR_STAGE(setStage, TRUE, FALSE)
|
|
|
|
// get the text and force its load
|
|
REQUEST_TEXT(TRUE)
|
|
|
|
// reset mocap streaming
|
|
//IF mocapStreamingStage >= MOCAP_STREAMING_STAGE_WAIT
|
|
REMOVE_CUTSCENE()
|
|
mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST
|
|
//ENDIF
|
|
|
|
// get rid of blips and text
|
|
IF bRemoveAllBlips
|
|
REMOVE_ALL_BLIPS()
|
|
ENDIF
|
|
|
|
REMOVE_MISSION_TEXT(bClearTextAndSpeech OR bJumpingToStage, bClearTextAndSpeech OR bJumpingToStage)
|
|
|
|
// kill chase cam
|
|
RESET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct)
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
bDebugJSkip = FALSE
|
|
#ENDIF
|
|
|
|
IF bJumpingToStage
|
|
// set the correct player character if not already
|
|
enumCharacterList stageCharacter = GET_CHARACTER_FOR_MISSION_STAGE(setStage)
|
|
SELECTOR_SLOTS_ENUM selectorSlot = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(stageCharacter)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() <> stageCharacter
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[selectorSlot], stageCharacter, GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0,0,1>>, GET_ENTITY_HEADING(PLAYER_PED_ID()), FALSE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
WHILE NOT MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, selectorSlot)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
WHILE NOT TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
INT i
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i])
|
|
DELETE_PED(sSelectorPeds.pedID[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bJumpingToStage
|
|
OR bInitialisingAfterIntro
|
|
// remove all dialogue
|
|
IF bJumpingToStage
|
|
INT i
|
|
FOR i=0 TO 9
|
|
REMOVE_PED_FOR_DIALOGUE(trainCrashConversation, i)
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
// setup player with dialogue
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 1, PLAYER_PED_ID(), "TREVOR")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
sSelectorPeds.eCurrentSelectorPed = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CHARACTER_FOR_MISSION_STAGE(setStage))
|
|
// create the player characters for the stage
|
|
CREATE_PLAYER_CHARACTERS_WITH_TRANSPORT_IN_MISSION_STAGE(setStage)
|
|
SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PLAYER_PED_ID(), GET_CHARACTER_FOR_MISSION_STAGE(setStage), setStage)
|
|
|
|
IF bJumpingToStage
|
|
LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT()
|
|
WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
// create the train at correct point for the stage
|
|
IF setStage = STAGE_INTERCEPT_TRAIN
|
|
IF bJumpingToStage
|
|
CLEAR_AREA_OF_VEHICLES(GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT), 1000, TRUE) // temp?
|
|
WAIT(0)
|
|
ENDIF
|
|
ELSE
|
|
CREATE_TRAIN_FOR_STAGE(setStage, setStage >= STAGE_GET_TO_BRIDGE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (setStage <> STAGE_GET_TO_BRIDGE AND setStage <> STAGE_STEAL_FROM_CONTAINER AND setStage <> STAGE_INTERCEPT_TRAIN)
|
|
OR bJumpingToStage
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
|
|
// headsets
|
|
IF bJumpingToStage
|
|
OR setStage = STAGE_INTERCEPT_TRAIN
|
|
SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, TRUE)
|
|
SET_PLAYER_PED_WITH_HEADSET(CHAR_TREVOR, TRUE)
|
|
ENDIF
|
|
|
|
// suppress
|
|
IF setStage >= STAGE_GET_TO_BRIDGE
|
|
SUPPRESS_MISSION_VEHICLES(TRUE, TRUE)
|
|
ENDIF
|
|
|
|
// geo
|
|
IF setStage >= STAGE_GO_TO_CONTAINER
|
|
AND setStage < STAGE_GET_HOME
|
|
IF bJumpingToStage
|
|
SET_TRAIN_CRASH_GEO(TRUE, setStage < STAGE_RAPIDS_CHASE, setStage = STAGE_GO_TO_CONTAINER, DEFAULT, NOT bJumpingToStage)
|
|
ENDIF
|
|
IF bJumpingToStage
|
|
OR setStage = STAGE_GO_TO_CONTAINER
|
|
CREATE_CRATES_INSIDE_TRAINCAR()
|
|
ENDIF
|
|
|
|
// wait on jump
|
|
IF bJumpingToStage
|
|
//WAIT(100)
|
|
//LOAD_SCENE(<<-494.65686, 4433.42822, 29.99994>>)
|
|
//WAIT(500)
|
|
ENDIF
|
|
ELSE
|
|
SET_TRAIN_CRASH_GEO(FALSE)
|
|
REMOVE_CRATES_INSIDE_TRAINCAR()
|
|
ENDIF
|
|
|
|
//IF bJumpingToStage
|
|
// IF setStage >= STAGE_STEAL_FROM_CONTAINER
|
|
// DO_DOORS_BLOW_OPEN(TRUE)
|
|
// ENDIF
|
|
//ENDIF
|
|
|
|
// do any other necessary setup for the stage
|
|
SWITCH setStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
IF bJumpingToStage
|
|
WAIT(0)
|
|
SET_MICHAEL_AT_INIT()
|
|
DO_MICHAEL_INTO_CAR()
|
|
|
|
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
|
|
//SET_PED_HELMET(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
// michael earpiece
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_GetOutUndriveableVehicle, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_CAN_TAUNT_IN_VEHICLE, TRUE)
|
|
ENDIF
|
|
|
|
INIT_FLIP_OFF_PED(flipOffData, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
|
|
CREATE_RON_AND_PATRICIA(bJumpingToStage)
|
|
//gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_PATH_START), TRUE)
|
|
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
IF bJumpingToStage
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
createEngineerStage = CREATE_ENGINEER_STAGE_NOT_STARTED
|
|
GIVE_PED_HELMET(PLAYER_PED_ID(), FALSE)
|
|
|
|
iGetInTextStage = 2
|
|
|
|
bRemovedMichael = TRUE
|
|
bDoneSeeTrainSpeech = TRUE
|
|
bPreparedSeeTrainCue = TRUE
|
|
bDoneSeeTrainCue = TRUE
|
|
bPreparedLandOnTrainCue = FALSE
|
|
bDoneLandOnTrainCue = FALSE
|
|
bDoneSeeTrainAudioScene = FALSE
|
|
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_NOT_STARTED
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, TRUE)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
bTempSuppressVehicleSpawning = TRUE
|
|
bTempPreventStillVehicleState = TRUE
|
|
iSuppressVehicleSpawnTime = GET_GAME_TIMER()
|
|
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_SEE_TRAIN_RESTART")
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, NULL, "MICHAEL")
|
|
ELSE
|
|
bShownGodText = TRUE
|
|
ENDIF
|
|
|
|
DELETE_RON_AND_PATRICIA()
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_HARD)
|
|
SET_NEXT_RANDOM_SPEECH_TIME(10000)
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
IF bJumpingToStage
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
createEngineerStage = CREATE_ENGINEER_STAGE_NOT_STARTED
|
|
GIVE_PED_HELMET(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
// set the bike on the train
|
|
WAIT(0)
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_BIKE_LAND_RESTART")
|
|
|
|
iClosestCarriage = EXILE3_LAST_CARRIAGE
|
|
|
|
|
|
bTempPreventStillVehicleState = TRUE
|
|
bDoHelperForceOnTrain = FALSE
|
|
ELSE
|
|
IF NOT bDoneLandOnTrainCue
|
|
IF bPreparedLandOnTrainCue
|
|
bDoneLandOnTrainCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_BIKE_LAND")
|
|
printstring("trigger event EXL3_BIKE_LAND") printnl()
|
|
ENDIF
|
|
ENDIF
|
|
bDoHelperForceOnTrain = FALSE//TRUE
|
|
ENDIF
|
|
|
|
iCachedCarriage = iClosestCarriage
|
|
|
|
BLOCK_GPS_FOR_JUMPS()
|
|
|
|
MAKE_BIKE_EASY_TO_LAND()
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_MICHAEL_CAR])
|
|
DELETE_VEHICLE(trainCrashVehicle[TCV_MICHAEL_CAR])
|
|
ENDIF
|
|
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE)
|
|
|
|
//GIVE_PED_PISTOL_FOR_DRIVE_ON_TRAIN(PLAYER_PED_ID())
|
|
SET_NEXT_RANDOM_SPEECH_TIME(8000)
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>)
|
|
SET_TRAIN_SPEED_FOR_STAGE(STAGE_GET_TO_BRIDGE)
|
|
IF NOT bJumpingToStage
|
|
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_BIKE])
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[TCV_BIKE])
|
|
ENDIF
|
|
TRAIN_CRASH_CREATE_VEHICLE(TCV_DINGHY, GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_INIT), DINGHY_INIT_ROT)
|
|
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
|
|
|
|
SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, TRUE)
|
|
ELSE
|
|
createMercPickupStage = CREATE_MERC_PICKUP_STAGE_NOT_STARTED
|
|
// attach trevor to jump point
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
SET_MISSION_CUTSCENE(TRUE)
|
|
ENDIF
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_TRAIN_ROOF_RESTART")
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RIDE_TRAIN)
|
|
//CREATE_TRAIN_REVERSE_CAM()
|
|
DESTROY_MISSION_ANIM_CAM()
|
|
|
|
IF NOT IS_PED_INJURED(engineerPed[0])
|
|
SET_ENTITY_PROOFS(engineerPed[0], TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
SET_PED_CAN_RAGDOLL(engineerPed[0], FALSE)
|
|
SET_PED_CONFIG_FLAG(engineerPed[0], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(engineerPed[0], PCF_DisableExplosionReactions, TRUE)
|
|
ENDIF
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(EXL3_TRAIN_TIME)
|
|
|
|
DISPLAY_RADAR(TRUE) // display the radar
|
|
PRINT_HELP("TC_TRNHLP")
|
|
//SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
ALLOW_DIALOGUE_IN_WATER(TRUE)
|
|
|
|
IF bJumpingToStage
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF STREAMVOL_IS_VALID(bridgeVolume)
|
|
// STREAMVOL_DELETE(bridgeVolume)
|
|
//ENDIF
|
|
|
|
INT i
|
|
REPEAT NUMBER_MERC_PICKUP_VEHICLES i
|
|
IF DOES_ENTITY_EXIST(mercPickupVehicle[i])
|
|
DELETE_VEHICLE(mercPickupVehicle[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT NUMBER_MERC_PICKUP_PEDS i
|
|
IF DOES_ENTITY_EXIST(mercPickupPed[i])
|
|
DELETE_PED(mercPickupPed[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_ENTITY_EXIST(trainJumpAnchorObject)
|
|
DELETE_OBJECT(trainJumpAnchorObject)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
//STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF bJumpingToStage
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WEAPON_TYPE weaponStickyBomb
|
|
weaponStickyBomb = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
|
|
|
|
WEAPON_TYPE currentVehicleWeapon
|
|
GET_CURRENT_PED_VEHICLE_WEAPON(PLAYER_PED_ID(), currentVehicleWeapon)
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), weaponStickyBomb)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), weaponStickyBomb, 5, FALSE, FALSE)
|
|
ELSE
|
|
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), weaponStickyBomb) < 5
|
|
SET_PED_AMMO(PLAYER_PED_ID(), weaponStickyBomb, 5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF currentVehicleWeapon <> weaponStickyBomb
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
SET_CURRENT_PED_VEHICLE_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
|
|
ENDIF
|
|
|
|
IF bJumpingToStage
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_STICKY_BOMB_RESTART")
|
|
ENDIF
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_PLANT_BOMB)
|
|
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
|
|
//EQUIP_BEST_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
//SET_TREVOR_INTO_COVER_FOR_SHOOTOUT()
|
|
//SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weaponStickyBomb, TRUE)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF bJumpingToStage
|
|
REMOVE_PED_HELMET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
|
|
SET_PED_DIES_IN_WATER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
CLEAR_SEQUENCE_TASK(sequence)
|
|
OPEN_SEQUENCE_TASK(sequence)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, <<-477.46, 4401.26, 29.44>>, PEDMOVE_RUN)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<-482.12469, 4396.74756, 29.99994>>, PEDMOVE_RUN)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_SHOOTOUT_INIT), PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, TREVOR_SHOOTOUT_INIT_ROT)
|
|
CLOSE_SEQUENCE_TASK(sequence)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sequence)
|
|
|
|
buddyBlip = CREATE_BLIP_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
IF bJumpingToStage
|
|
bStartedDebrisFX = FALSE
|
|
ENDIF
|
|
|
|
SET_NEXT_RANDOM_SPEECH_TIME(8500)
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
//DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
//SET_MICHAEL_SEARCHING_IN_CONTAINER(0,bJumpingToStage)
|
|
//ALLOW_DIALOGUE_IN_WATER(TRUE)
|
|
//PRINTSTRING("JUMP TO STAGE") PRINTNL()
|
|
IF bJumpingToStage
|
|
//PRINTSTRING("INSIDE HERE") PRINTNL()
|
|
GIVE_PED_SNIPER_RIFLE_FOR_SHOOTOUT(PLAYER_PED_ID())
|
|
//CREATE_DEBRIS()
|
|
bThermalOn = FALSE
|
|
bThermalSwitchedOn = FALSE
|
|
|
|
bJumpedToShootout = TRUE
|
|
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
|
|
|
|
SET_MICHAEL_STEP_INTO_CONTAINER(TRUE)
|
|
EQUIP_BEST_PED_WEAPON(PLAYER_PED_ID(), TRUE)
|
|
SET_PED_WETNESS_HEIGHT(PLAYER_PED_ID(), 1.8)
|
|
//CREATE_ENEMY_WAVE(EW_SHOOTOUT_SECOND_WAVE, TRUE)
|
|
SET_TREVOR_INTO_COVER_FOR_SHOOTOUT()
|
|
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
|
|
ELSE
|
|
bJumpedToShootout = FALSE
|
|
//BLIP_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE)
|
|
ENDIF
|
|
|
|
SET_PED_PRELOAD_PROP_DATA(PLAYER_PED_ID(), ANCHOR_HEAD, 9, 0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(trainCrashVehicle[TCV_DINGHY], INSTANT_BLEND_OUT, TRUE)
|
|
SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
SET_VEHICLE_STRONG(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
ENDIF
|
|
|
|
// IF bJumpingToStage
|
|
REPOSITION_DINGHY()
|
|
// ENDIF
|
|
|
|
IF bJumpingToStage
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_FIGHT_RESTART")
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL)
|
|
bStartedDebrisFX = FALSE
|
|
ENDIF
|
|
|
|
iShootoutStartTime = GET_GAME_TIMER()
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
//SET_RAPPEL_ASSETS_AS_NO_LONGER_NEEDED()
|
|
//INT j
|
|
//REPEAT NUMBER_RAPPEL_ENEMIES j
|
|
/// CLEANUP_RAPPEL(enemyRappelData[j].rappelData)
|
|
//ENDREPEAT
|
|
//ALLOW_DIALOGUE_IN_WATER(TRUE)
|
|
|
|
IF bJumpingToStage
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
bSkippedWaterfallCutaway = FALSE
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_RESTART")
|
|
boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
|
|
CREATE_CASE(CASE_UNDER_SEAT)
|
|
boatRPGState = BOAT_RPG_NOT_STARTED
|
|
ENDIF
|
|
PED_INDEX michaelPed
|
|
michaelPed = GET_MICHAEL_PED()
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
GIVE_PED_PISTOL_FOR_BOAT_CHASE(michaelPed)
|
|
ENDIF
|
|
|
|
/*
|
|
REPEAT NUMBER_DEBRIS i
|
|
IF DOES_ENTITY_EXIST(debris[i].obj)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(debris[i].obj)
|
|
ENDIF
|
|
ENDREPEAT
|
|
*/
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_VEHICLE_EXPLODES_ON_HIGH_EXPLOSION_DAMAGE(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_VEHICLE_STRONG(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
// create dummy boat vehicle
|
|
/*
|
|
dummyBoatPed = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_SOLDIER), <<0,1,2>>)
|
|
SET_ENTITY_VISIBLE(dummyBoatPed, FALSE)
|
|
SET_ENTITY_COLLISION(dummyBoatPed, FALSE)
|
|
SET_ENTITY_FLAG_SUPPRESS_SHADOW(dummyBoatPed, TRUE)
|
|
SET_ENTITY_PROOFS(dummyBoatPed, TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
*/
|
|
ENDIF
|
|
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL)
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR)
|
|
|
|
SET_TIMECYCLE_MODIFIER("canyon_mission")
|
|
SET_TIMECYCLE_MODIFIER_STRENGTH(1.0)
|
|
|
|
IF NOT bJumpingToStage
|
|
bShownGodText = bCachedShownGodText
|
|
|
|
IF NOT bDoneRapidsStartCue
|
|
IF bPreparedRapidsStartCue
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_START")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + 8000
|
|
|
|
IF bJumpingToStage
|
|
bStartedDebrisFX = FALSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 004, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], SKIP_REC_AFTER_WATERFALL)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
WAIT(0)
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
CREATE_ENEMY_WAVE(EW_CHASE_FIRST_BOAT_WAVE, TRUE, STAGE_RAPIDS_CHASE)
|
|
bTriggeredEnemyWave[EW_CHASE_FIRST_BOAT_WAVE] = TRUE
|
|
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(20)
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_GET_HOME
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
//SET_PLAYER_WEAPON_DEFENSE_MODIFIER(PLAYER_ID(), 1.0)
|
|
|
|
IF bJumpingToStage
|
|
IF NOT bForcePassOnShitskip
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_END_RESTART")
|
|
boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
|
|
beachCreationStage = BEACH_CREATION_NOT_STARTED
|
|
CREATE_CASE(CASE_UNDER_SEAT)
|
|
boatRPGState = BOAT_RPG_DONE
|
|
iGetInTextStage = 2
|
|
|
|
IF bForcePassOnShitskip
|
|
bGotToBeach = TRUE
|
|
//SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES))
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES) + <<2,0,0>>)
|
|
ENDIF
|
|
SETUP_BOAT_AND_BEACH()
|
|
//LOAD_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES))
|
|
ELSE
|
|
|
|
ENDIF
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
ELSE
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_END")
|
|
ENDIF
|
|
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL)
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_BEACH)
|
|
|
|
//IF DOES_ENTITY_EXIST(dummyBoatPed)
|
|
// DELETE_PED(dummyBoatPed)
|
|
//ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF setStage <= STAGE_DRIVE_ALONG_TRAIN
|
|
SET_IGNORE_NO_GPS_FLAG(TRUE)
|
|
ELSE
|
|
SET_IGNORE_NO_GPS_FLAG(FALSE)
|
|
ENDIF
|
|
|
|
IF bJumpingToStage
|
|
IF setStage = STAGE_STEAL_FROM_CONTAINER
|
|
|
|
ELIF setStage = STAGE_RAPIDS_CHASE
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180)
|
|
ELSE
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// set value for replay
|
|
BOOL bFinalCheckpoint = FALSE
|
|
IF ENUM_TO_INT(setStage) >= ENUM_TO_INT(STAGE_GET_HOME)
|
|
bFinalCheckpoint = TRUE // skipping from this point would end the mission
|
|
ENDIF
|
|
IF SHOULD_SET_CHECKPOINT_FOR_THIS_STAGE(setStage)
|
|
Set_Replay_Mid_Mission_Stage_With_Name(ENUM_TO_INT(setStage), GET_DESCRIPTION_FOR_STAGE_AS_STRING(setStage), bFinalCheckpoint)
|
|
IF ENUM_TO_INT(setStage) <> 0
|
|
AND NOT bJumpingToStage
|
|
iReplayAttempt = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF setStage = STAGE_STEAL_FROM_CONTAINER
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
ELSE
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
// set wanted level
|
|
//IF setStage <= STAGE_GET_TO_BRIDGE
|
|
// SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
// SET_MAX_WANTED_LEVEL(5)
|
|
// ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
// ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
//ELSE
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
//ENDIF
|
|
|
|
// instance priority
|
|
IF setStage = STAGE_STEAL_FROM_CONTAINER
|
|
OR setStage = STAGE_RAPIDS_CHASE
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
|
|
ELIF setStage = STAGE_GET_TO_BRIDGE
|
|
OR setStage = STAGE_DRIVE_ALONG_TRAIN
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
|
|
ELSE
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
ENDIF
|
|
|
|
// shootout evo
|
|
IF setStage >= STAGE_STEAL_FROM_CONTAINER
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_PARTICLE_FX_SHOOTOUT_BOAT(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bJumpingToStage
|
|
WHILE IS_SCREEN_FADING_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF NOT bSuppressFutureReplaySetups
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
|
|
VEHICLE_INDEX endReplayVehicle
|
|
SWITCH setStage
|
|
CASE STAGE_CHASE_TRAIN
|
|
//CASE STAGE_DRIVE_ALONG_TRAIN
|
|
endReplayVehicle = trainCrashVehicle[TCV_BIKE]
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
CASE STAGE_RAPIDS_CHASE
|
|
CASE STAGE_GET_HOME
|
|
IF NOT bForcePassOnShitskip
|
|
endReplayVehicle = trainCrashVehicle[TCV_DINGHY]
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BOOL bReturnControl = TRUE
|
|
|
|
VEHICLE_SEAT seat = VS_DRIVER
|
|
IF setStage = STAGE_RAPIDS_CHASE
|
|
seat = VS_FRONT_RIGHT
|
|
ENDIF
|
|
|
|
END_REPLAY_SETUP(endReplayVehicle, seat, bReturnControl)
|
|
|
|
bSuppressFutureReplaySetups = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// post replay setup specific skip stuff
|
|
SWITCH setStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
IF NOT bSetTrevorExitIntro
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
|
|
ELSE
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_AIMING, TRUE, FAUS_CUTSCENE_EXIT)
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 1500)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BIKE], <<0,0,GET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE])>>)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BIKE], 26.0)
|
|
TASK_VEHICLE_TEMP_ACTION(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], TEMPACT_GOFORWARD, 100)
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
SET_BIKE_ON_STAND(trainCrashVehicle[TCV_BIKE],0, 0)
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
|
|
ENDIF
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
SET_BIKE_ON_TRAIN()
|
|
SET_BIKE_ON_STAND(trainCrashVehicle[TCV_BIKE],0, 0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
CASE STAGE_RAPIDS_CHASE
|
|
WAIT(0)
|
|
START_CRASH_PTFX()
|
|
START_DEBRIS_FX()
|
|
SET_DEBRIS_EVOLUTION(1)
|
|
IF setStage = STAGE_RAPIDS_CHASE
|
|
HANDLE_BOAT_RPG(TRUE)
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
WAIT(0)
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180)
|
|
ELIF setStage = STAGE_GO_TO_CONTAINER
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_DINGHY], << -402.866, 4441.25, 30.1213 >>)
|
|
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_DINGHY],<< 2.81146, -0.00711961, 91.4113 >>)
|
|
ENDIF
|
|
ELIF setStage = STAGE_STEAL_FROM_CONTAINER
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(40.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
WAIT(100)
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
//SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
|
|
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BEACH) + <<0,0,1>>)
|
|
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_DINGHY],<< 0, 0, DINGHY_AT_BEACH_ROT>>)
|
|
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_DINGHY], 26.0)
|
|
TASK_VEHICLE_TEMP_ACTION(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], TEMPACT_GOFORWARD, 100)
|
|
ENDIF
|
|
WAIT(0)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
// after rest of setup common stuff
|
|
SWITCH setStage
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
CREATE_TRAIN_FIRST_PERSON_CAM()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bJumpingToStage
|
|
IF bHandleFadeIn
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iStageStartTime = GET_GAME_TIMER()
|
|
currentMissionStage = setStage
|
|
ENDPROC
|
|
|
|
// handle streaming mocap
|
|
PROC HANDLE_STREAMING_MOCAP(STRING sMocap, VECTOR vStreamPos, FLOAT fStreamInDistance, FLOAT fStreamOutDistance)
|
|
SWITCH mocapStreamingStage
|
|
CASE MOCAP_STREAMING_STAGE_REQUEST
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamPos, <<fStreamInDistance, fStreamInDistance, fStreamInDistance>>)
|
|
REQUEST_CUTSCENE(sMocap)
|
|
mocapStreamingStage = MOCAP_STREAMING_STAGE_WAIT
|
|
ENDIF
|
|
BREAK
|
|
CASE MOCAP_STREAMING_STAGE_WAIT
|
|
IF HAS_CUTSCENE_LOADED()
|
|
mocapStreamingStage = MOCAP_STREAMING_STAGE_COMPLETE
|
|
ENDIF
|
|
BREAK
|
|
CASE MOCAP_STREAMING_STAGE_COMPLETE
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamPos, <<fStreamOutDistance, fStreamOutDistance, fStreamOutDistance>>)
|
|
REMOVE_CUTSCENE()
|
|
mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// should we start streaming for next mission stage?
|
|
FUNC BOOL SHOULD_START_STREAMING_FOR_NEXT_MISSION_STAGE()
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
CASE STAGE_CHASE_TRAIN
|
|
//IF bRunningCutscene
|
|
RETURN TRUE
|
|
//ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
IF bRunningCutscene
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
IF bCreatedCrashTrain
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
IF bFoundBomb
|
|
OR bDoMerryweatherMassacre
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
CASE STAGE_RAPIDS_CHASE
|
|
IF bDoMopUp
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_GET_HOME
|
|
RETURN FALSE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// stream in assets for next mission stage during gameplay to cut down on load times
|
|
PROC DO_STREAMING_FOR_NEXT_MISSION_STAGE(BOOL bStreamDuringIntro)
|
|
SWITCH streamingStage
|
|
CASE MISSION_STREAMING_STAGE_REQUEST
|
|
IF SHOULD_START_STREAMING_FOR_NEXT_MISSION_STAGE()
|
|
OR bStreamDuringIntro
|
|
MISSION_STAGE_ENUM nextStageEnum
|
|
IF bStreamDuringIntro
|
|
nextStageEnum = INT_TO_ENUM(MISSION_STAGE_ENUM, 0)
|
|
ELSE
|
|
nextStageEnum = INT_TO_ENUM(MISSION_STAGE_ENUM, ENUM_TO_INT(currentMissionStage) + 1)
|
|
ENDIF
|
|
REQUEST_MODELS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
|
|
REQUEST_VEHICLE_RECORDINGS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
|
|
REQUEST_WAYPOINT_RECORDINGS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
|
|
REQUEST_ANIM_DICTS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
|
|
REQUEST_WEAPONS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
|
|
REQUEST_PTFX_FOR_STAGE(nextStageEnum, FALSE, TRUE)
|
|
REQUEST_SFX_FOR_STAGE(nextStageEnum, FALSE, TRUE)
|
|
REQUEST_MISC_ASSETS_FOR_STAGE(nextStageEnum, FALSE, TRUE)
|
|
REQUEST_TEXT(FALSE)
|
|
streamingStage = MISSION_STREAMING_STAGE_WAIT
|
|
ENDIF
|
|
BREAK
|
|
CASE MISSION_STREAMING_STAGE_WAIT
|
|
IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
|
|
AND HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()
|
|
AND HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
|
|
AND HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED()
|
|
AND HAVE_ALL_PTFX_REQUESTS_SUCCEEDED()
|
|
AND HAVE_ALL_SFX_REQUESTS_SUCCEEDED()
|
|
AND HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED()
|
|
AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
|
|
streamingStage = MISSION_STREAMING_STAGE_COMPLETE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// debug skip mocap
|
|
#IF IS_DEBUG_BUILD
|
|
PROC DEBUG_SKIP_MOCAP()
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
STOP_CUTSCENE()
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
// get rid of everything
|
|
PROC CLEAR_MISSION_FOR_SKIP()
|
|
INT i
|
|
|
|
SET_PLAYER_OUT_OF_ANY_VEHICLE()
|
|
STOP_ALL_TRAIN_CRASH_AUDIO_SCENES()
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_SEETHROUGH(FALSE)
|
|
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(FALSE)
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
CASCADE_SHADOWS_INIT_SESSION()
|
|
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(wadePTFX)
|
|
STOP_PARTICLE_FX_LOOPED(wadePTFX)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX1)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX1)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX2)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX2)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX3)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX3)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisSplashPTFX)
|
|
STOP_PARTICLE_FX_LOOPED(debrisSplashPTFX)
|
|
ENDIF
|
|
|
|
//IF bPreStreamingSeamlessCutscene
|
|
// REMOVE_CUTSCENE()
|
|
//ENDIF
|
|
|
|
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
|
|
|
|
REMOVE_COVER_POINT(islandCover)
|
|
IF STREAMVOL_IS_VALID(bridgeVolume)
|
|
STREAMVOL_DELETE(bridgeVolume)
|
|
ENDIF
|
|
|
|
IF gotoFoamState = GOTO_FOAM_STATE_WAITING
|
|
OR swapCarriageState = SWAP_CARRIAGE_STATE_WAITING
|
|
IPL_GROUP_SWAP_CANCEL()
|
|
ENDIF
|
|
|
|
WATER_OVERRIDE_SET_STRENGTH(0.0)
|
|
|
|
STOP_STREAM()
|
|
|
|
// delete entities
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i])
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[i])
|
|
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[i])
|
|
ENDIF
|
|
DELETE_PED(sSelectorPeds.pedID[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT NUMBER_ENGINEERS i
|
|
IF DOES_ENTITY_EXIST(engineerPed[i])
|
|
DELETE_PED(engineerPed[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
|
|
DELETE_PED(enemyPed[i].ped)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT NUMBER_MERC_PICKUP_PEDS i
|
|
IF DOES_ENTITY_EXIST(mercPickupPed[i])
|
|
DELETE_PED(mercPickupPed[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT NUMBER_CLIMB_ENEMIES i
|
|
IF DOES_ENTITY_EXIST(climbEnemy[i].ped)
|
|
DELETE_PED(climbEnemy[i].ped)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_ENTITY_EXIST(patriciaPed)
|
|
DELETE_PED(patriciaPed)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(ronPed)
|
|
DELETE_PED(ronPed)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(enemyVehicle) i
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
|
|
DELETE_VEHICLE(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(trainCrashVehicle) i
|
|
IF DOES_ENTITY_EXIST(trainCrashVehicle[i])
|
|
DELETE_VEHICLE(trainCrashVehicle[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT NUMBER_MERC_PICKUP_VEHICLES i
|
|
IF DOES_ENTITY_EXIST(mercPickupVehicle[i])
|
|
DELETE_VEHICLE(mercPickupVehicle[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_ENTITY_EXIST(hangingCarriageVehicle)
|
|
DELETE_VEHICLE(hangingCarriageVehicle)
|
|
ENDIF
|
|
|
|
// delete trains
|
|
DELETE_TRAIN_CRASH_TRAINS()
|
|
|
|
WAIT(0)
|
|
REPEAT NUMBER_CRASH_FIRES i
|
|
IF bFirePTFXActive[i]
|
|
STOP_PARTICLE_FX_LOOPED(firePTFX[i])
|
|
bFirePTFXActive[i] = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_ENTITY_EXIST(doorsObject)
|
|
DELETE_OBJECT(doorsObject)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(doorCollisionObject)
|
|
DELETE_OBJECT(doorCollisionObject)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(caseObject)
|
|
DELETE_OBJECT(caseObject)
|
|
ENDIF
|
|
|
|
REPEAT NUMBER_CRATES i
|
|
IF DOES_ENTITY_EXIST(crateBob[i].obj)
|
|
DELETE_OBJECT(crateBob[i].obj)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
/*
|
|
REPEAT NUMBER_DEBRIS i
|
|
IF DOES_ENTITY_EXIST(debris[i].obj)
|
|
DELETE_OBJECT(debris[i].obj)
|
|
ENDIF
|
|
ENDREPEAT
|
|
*/
|
|
|
|
IF DOES_ENTITY_EXIST(trainJumpAnchorObject)
|
|
DELETE_OBJECT(trainJumpAnchorObject)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(targetObject)
|
|
DELETE_OBJECT(targetObject)
|
|
ENDIF
|
|
|
|
CLEAR_AREA(GET_TRAIN_CRASH_VECTOR(TCVEC_BIKE_INIT), 4000, TRUE)
|
|
ENDPROC
|
|
|
|
// common stuff to clear mission
|
|
PROC COMMON_MISSION_CLEAR()
|
|
//INT i
|
|
//REPEAT NUMBER_RAPPEL_ENEMIES i
|
|
// CANCEL_RAPPEL(enemyRappelData[i].rappelData)
|
|
//ENDREPEAT
|
|
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
|
|
IF NOT GET_IS_PED_GADGET_EQUIPPED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
|
|
IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = NULL
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
DETACH_ENTITY(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_RESET)
|
|
ENDIF
|
|
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
//CLEAR_WEATHER_TYPE_PERSIST()
|
|
SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>)
|
|
RESET_MISSION_STATS_ENTITY_WATCH()
|
|
//SET_PLAYER_WEAPON_DEFENSE_MODIFIER(PLAYER_ID(), 1.0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
CLEAR_MISSION_FOR_SKIP()
|
|
ENDPROC
|
|
|
|
// handle shitskip
|
|
FUNC BOOL HANDLE_MISSION_SHITSKIP()
|
|
// new shitskip system
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
IF g_bShitskipAccepted = TRUE
|
|
CPRINTLN(DEBUG_REPLAY, "Exile 3: starting shitskip")
|
|
// get next replay stage
|
|
MISSION_STAGE_ENUM nextReplayStage
|
|
//BOOL bPassMission = FALSE
|
|
SWITCH INT_TO_ENUM(MISSION_STAGE_ENUM, Get_Replay_Mid_Mission_Stage())
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
nextReplayStage = STAGE_CHASE_TRAIN
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
nextReplayStage = STAGE_DRIVE_ALONG_TRAIN
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
nextReplayStage = STAGE_GET_TO_BRIDGE
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
nextReplayStage = STAGE_GO_TO_CONTAINER
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
nextReplayStage = STAGE_STEAL_FROM_CONTAINER
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
nextReplayStage = STAGE_RAPIDS_CHASE
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
nextReplayStage = STAGE_GET_HOME
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
nextReplayStage = STAGE_GET_HOME
|
|
bForcePassOnShitskip = TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// set the next mission stage nicely
|
|
COMMON_MISSION_CLEAR()
|
|
|
|
SET_MISSION_STAGE(nextReplayStage, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
|
|
//WAIT(SKIP_FADE_WAIT_TIME)
|
|
IF NOT bForcePassOnShitskip
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
CPRINTLN(DEBUG_REPLAY, "Exile 3: no shitskip")
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE // did not do a shitskip
|
|
ENDFUNC
|
|
|
|
// do mission init start mission
|
|
PROC DO_MISSION_INIT_START_MISSION()
|
|
// relationships
|
|
ADD_RELATIONSHIP_GROUP("Enemy Group", enemyRelGroup)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, enemyRelGroup)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, enemyRelGroup, RELGROUPHASH_PLAYER)
|
|
|
|
// stats
|
|
//INFORM_MISSION_STATS_OF_MISSION_START_EXILE_THREE()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF NOT Is_Replay_In_Progress()
|
|
// no replay - kick mission off normally
|
|
IF NOT WAS_CUTSCENE_SKIPPED()
|
|
#IF IS_DEBUG_BUILD
|
|
IF iDebugStage >= 0
|
|
SET_MISSION_STAGE(INT_TO_ENUM(MISSION_STAGE_ENUM, iDebugStage), TRUE)
|
|
ELSE
|
|
#ENDIF
|
|
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, FALSE, TRUE, TRUE)
|
|
iDelayFirstLineTime = GET_GAME_TIMER() + 1000
|
|
#IF IS_DEBUG_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
ELSE
|
|
CLEAR_START_AREA()
|
|
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF HANDLE_MISSION_SHITSKIP()
|
|
CPRINTLN(DEBUG_REPLAY, "Exile 3: shitskip done")
|
|
ELSE
|
|
INT iReplayStage
|
|
iReplayStage = Get_Replay_Mid_Mission_Stage()
|
|
IF iReplayStage = 0
|
|
POSITION_PLAYER_AT_MISSION_INIT()
|
|
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
|
|
ELSE
|
|
SET_MISSION_STAGE(INT_TO_ENUM(MISSION_STAGE_ENUM, iReplayStage), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bForcePassOnShitskip
|
|
IF IS_SCREEN_FADED_OUT()
|
|
OR IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
missionInitStage = MISSION_INIT_DONE
|
|
ENDPROC
|
|
|
|
PROC SET_TREVOR_AS_MISSION_START_CHAR()
|
|
printstring("here2!!!") printnl()
|
|
IF NOT bStartingAsTrevor
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CLEAR_PRE_TIMELAPSE()
|
|
DESTROY_CAM(animCam)
|
|
IF DOES_ENTITY_EXIST(trevorDoorObject)
|
|
DELETE_OBJECT(trevorDoorObject)
|
|
ENDIF
|
|
|
|
CLEAR_ANIM_DICT_REQUEST(TC_ANIM_DICT_TRAIN)
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAILER_DOOR))
|
|
REMOVE_MODEL_HIDE(<<1972.3151, 3815.3379, 33.6879>>, 0.01, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_TRAILER_DOOR), FALSE)
|
|
ENDPROC
|
|
|
|
//INTERIOR_INSTANCE_INDEX trailerInterior
|
|
// initialise mission
|
|
FUNC BOOL INIT_MISSION()
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_Derailed")
|
|
|
|
SWITCH missionInitStage
|
|
CASE MISSION_INIT_PRE_INTRO
|
|
BLOCK_MISSION_TITLE(TRUE)
|
|
// TEMP
|
|
//REQUEST_IPL("canyonriver01")
|
|
//REMOVE_IPL("canyonriver01_traincrash")
|
|
|
|
bHasChanged = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_AUTO_GIVE_SCUBA_GEAR_WHEN_EXIT_VEHICLE(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_WATER_VEHICLE_SCUBA_GEAR_UNLOCKED, FALSE)
|
|
|
|
SET_WIND(0.2)
|
|
SET_WIND_DIRECTION(0.0)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
REMOVE_MISSION_TEXT()
|
|
|
|
IF NOT Is_Replay_In_Progress()
|
|
iReplayAttempt = 0
|
|
ELSE
|
|
iReplayAttempt = g_savedGlobals.sFlow.missionSavedData[SP_MISSION_EXILE_3].missionFailsNoProgress + 1
|
|
ENDIF
|
|
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("extrasunny", 30.0)
|
|
SUPPRESS_MISSION_VEHICLES(TRUE)
|
|
ENABLE_CARGENS_FOR_MISSION(FALSE)
|
|
SET_MISSION_ROADS_OFF(TRUE)
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
rapidsScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<-958.06500, 4353.00000, -10>>, <<-948.19800, 4363.93701, 125.66490>>)
|
|
//beachScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<-2769.7, 3571.1, -10>>, <<-2030.4, 4614.9, 28.8>>)
|
|
roadScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<2890.78174, 4458.23486, 0.21060>>, <<2912.66162, 4478.89795, 100.69784>>)
|
|
road2ScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<2944.97607, 4595.60059, 0.21060>>, <<2955.84082, 4604.47705, 100.69784>>)
|
|
|
|
g_savedGlobals.sAmbient.iChaseHelpTextDisplayed_mission = iCHASE_HINT_HELP_DISPLAY_MAX
|
|
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TREVOR))
|
|
WHILE NOT HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
DELETE_ALL_TRAINS()
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
SET_RANDOM_BOATS(FALSE)
|
|
|
|
missionInitStage = MISSION_INIT_REQUEST_INTRO
|
|
BREAK
|
|
|
|
CASE MISSION_INIT_REQUEST_INTRO
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
IF NOT Is_Replay_In_Progress()
|
|
#IF IS_DEBUG_BUILD
|
|
AND iDebugStage < 0
|
|
#ENDIF
|
|
// if Michael
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(GET_EXILE3_INTRO_CUTSCENE_NAME(), CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5 | CS_SECTION_6)
|
|
ADD_ANIM_DICT_REQUEST(TC_ANIM_DICT_TRAIN)
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAILER_DOOR))
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TREVOR))
|
|
|
|
BOOL bPinnedInterior
|
|
bPinnedInterior = FALSE
|
|
trailerInterior = GET_INTERIOR_AT_COORDS(<<1972.08, 3817.64, 34.53>>)
|
|
IF IS_VALID_INTERIOR(trailerInterior)
|
|
NEW_LOAD_SCENE_START_SPHERE(<<1972.08, 3817.64, 34.53>>, 15.0)
|
|
PIN_INTERIOR_IN_MEMORY(trailerInterior)
|
|
bPinnedInterior = TRUE
|
|
ENDIF
|
|
|
|
WHILE NOT HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED()
|
|
OR NOT HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF bPinnedInterior
|
|
WHILE NOT IS_INTERIOR_READY(trailerInterior)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
BLOCK_MISSION_TITLE(TRUE)
|
|
missionInitStage = MISSION_INIT_WAIT_FOR_INTRO
|
|
ELSE
|
|
BLOCK_MISSION_TITLE(FALSE)
|
|
STOP_CUTSCENE()
|
|
DO_MISSION_INIT_START_MISSION()
|
|
ENDIF
|
|
|
|
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_EXILE_3)
|
|
g_bAllowAmbientFriendLaunching = TRUE
|
|
BREAK
|
|
|
|
CASE MISSION_INIT_WAIT_FOR_INTRO
|
|
trevorDoorObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_TRAILER_DOOR), <<1972.3151, 3815.3379, -33.6879>>)
|
|
SET_ENTITY_VISIBLE(trevorDoorObject, FALSE)
|
|
WAIT(0)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA, TRUE)
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.8)
|
|
WAIT(1000)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
TRAIN_CRASH_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, STAGE_INTERCEPT_TRAIN, <<1975.19727, 3820.14502, 32.44555>>, 0)
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
|
|
|
|
//FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
VECTOR vReposPos
|
|
FLOAT fReposRot
|
|
GET_CAR_RESPOT_POS_FOR_NEAREST_SAVEHOUSE(<<1963.174, 3812.489, 30.397>>, CHAR_TREVOR, vReposPos, fReposRot)
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<1963.174, 3812.489, 30.397>>, <<2002.603, 3835.115, 36.268>>, 18, vReposPos, fReposRot, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE, TRUE)
|
|
|
|
CLEAR_AREA_OF_PROJECTILES(<<1973.85657, 3818.70776, 32.43631>>, 35)
|
|
STOP_FIRE_IN_RANGE(<<1973.85657, 3818.70776, 32.43631>>, 35)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(<<1973.85657, 3818.70776, 32.43631>>, 35)
|
|
|
|
SET_MISSION_CUTSCENE(TRUE)
|
|
iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<1977.3151, 3817.3379, 32.5879>>, <<-23.9549, 178.062, 47.6687>>)
|
|
|
|
DESTROY_MISSION_STATIC_CAM(staticCam)
|
|
CREATE_MISSION_ANIM_CAM()
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "_enter_trailer_cam", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN))
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_UNARMED, TRUE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "_enter_trailer", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_NONE, INSTANT_BLEND_IN, AIK_DISABLE_ARM_IK | AIK_DISABLE_LEG_IK | AIK_DISABLE_HEAD_IK | AIK_DISABLE_TORSO_IK | AIK_DISABLE_TORSO_REACT_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
|
|
//CREATE_MODEL_HIDE(<<1972.3151, 3815.3379, 33.6879>>, 0.0001, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_TRAILER_DOOR), FALSE)
|
|
SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA, TRUE)
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.8)
|
|
SET_ENTITY_VISIBLE(trevorDoorObject, TRUE)
|
|
//SET_ENTITY_COLLISION(PLAYER_PED_ID(), FALSE)
|
|
|
|
//SET_INTERIOR_ACTIVE(trailerInterior, TRUE)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(trevorDoorObject, iSyncScene, "_enter_trailer_door", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), INSTANT_BLEND_IN)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(trevorDoorObject)
|
|
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
missionInitStage = MISSION_INIT_PRE_TIMELAPSE
|
|
BREAK
|
|
|
|
|
|
CASE MISSION_INIT_PRE_TIMELAPSE
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
|
|
SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA, TRUE)
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.8)
|
|
|
|
IF NOT bEnteredTrailer
|
|
//DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_UNLOCKED, TRUE)
|
|
//DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.0)
|
|
|
|
BOOL bAdvance
|
|
bAdvance = FALSE
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
IF NOT bDoneEnterTrailerSpeech
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.20
|
|
bDoneEnterTrailerSpeech = DO_MISSION_SPEECH("EXL3_LI")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99
|
|
bAdvance = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bAdvance = TRUE
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED()
|
|
AND GET_GAME_TIMER() >= iAllowSkipCutsceneTime + 1000
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 1)
|
|
ENDIF
|
|
bAdvance = TRUE
|
|
ENDIF
|
|
|
|
IF bAdvance
|
|
bEnteredTrailer = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF DO_TIMELAPSE(SP_MISSION_EXILE_3, sTimelapse, TRUE)
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
|
|
// register entities and start cutscene
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
bStartingAsTrevor = TRUE
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
START_CUTSCENE(CUTSCENE_PLAYER_FP_FLASH_TREVOR)
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
missionInitStage = MISSION_INIT_PLAY_INTRO
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bWasTimeLapseRunning
|
|
IF DOES_CAM_EXIST(sTimelapse.splineCamera)
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
//SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_OPEN_THIS_FRAME)
|
|
|
|
bWasTimeLapseRunning = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_INIT_PLAY_INTRO
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF NOT bClearedForCutscene
|
|
IF IS_CUTSCENE_PLAYING()
|
|
CLEAR_PRE_TIMELAPSE()
|
|
RENDER_SCRIPT_CAMS(FALSE,FALSE)
|
|
|
|
BLOCK_MISSION_TITLE(FALSE)
|
|
IF bWasTimeLapseRunning
|
|
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
|
|
ENDIF
|
|
|
|
SET_MISSION_MOCAP_CUTSCENE()
|
|
//RESOLVE_VEHICLES_AT_MISSION_TRIGGER(GET_TRAIN_CRASH_VECTOR(TCVEC_MOVE_LAST_PLAYER_VEHICLE), MOVE_LAST_PLAYER_VEHICLE_ROT, GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL, VEHICLE_TYPE_DEFAULT, TRUE, FALSE, FALSE, FALSE)
|
|
|
|
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_MICHAEL)
|
|
|
|
SET_TREVOR_AS_MISSION_START_CHAR()
|
|
|
|
CLEAR_AREA_OF_PROJECTILES(<<1973.85657, 3818.70776, 32.43631>>, 35)
|
|
STOP_FIRE_IN_RANGE(<<1973.85657, 3818.70776, 32.43631>>, 35)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(<<1973.85657, 3818.70776, 32.43631>>, 35)
|
|
|
|
STOP_ENTITY_FIRE(PLAYER_PED_ID())
|
|
|
|
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0,0,0>>, TRUE)
|
|
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vReposPos, fReposRot)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
bClearedForCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// register trevor during mocap
|
|
IF NOT bStartingAsTrevor
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
|
|
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// register michael during mocap
|
|
IF bStartingAsTrevor
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michael"))
|
|
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michael"))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// preload assets
|
|
IF GET_CUTSCENE_TIME() >= 112332//177000
|
|
DO_STREAMING_FOR_NEXT_MISSION_STAGE(TRUE)
|
|
ENDIF
|
|
|
|
IF GET_CUTSCENE_TIME() >= 119867
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
|
|
ENDIF
|
|
|
|
|
|
// clear all vehicles
|
|
IF NOT bClearedVehiclesDuringIntro
|
|
IF GET_CUTSCENE_TIME() >= 96264//20629
|
|
CLEAR_AREA_OF_VEHICLES(GET_TRAIN_CRASH_VECTOR(TCVEC_PLAYER_INIT), 1000, TRUE) // temp?
|
|
bClearedVehiclesDuringIntro = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// pre-create mission entities not involved in cut
|
|
IF NOT bDoneIntroCreateEntities
|
|
IF streamingStage = MISSION_STREAMING_STAGE_COMPLETE
|
|
IF NOT bDoneIntroClearStart
|
|
CLEAR_START_AREA()
|
|
bDoneIntroClearStart = TRUE
|
|
ELSE
|
|
CREATE_PLAYER_CHARACTERS_WITH_TRANSPORT_IN_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE)
|
|
bDoneIntroCreateEntities = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// set exit state
|
|
PED_INDEX trevorPed
|
|
trevorPed = GET_TREVOR_PED()
|
|
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
bSkippedCutscene = TRUE
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
//IF NOT bSkippedCutscene
|
|
// SET_TREVOR_AS_MISSION_START_CHAR()
|
|
//ENDIF
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
|
|
FORCE_PED_MOTION_STATE(trevorPed, MS_ON_FOOT_WALK,FALSE,FAUS_CUTSCENE_EXIT)
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(trevorPed, PEDMOVE_WALK)
|
|
ELSE
|
|
FORCE_PED_MOTION_STATE(trevorPed, MS_AIMING,FALSE,FAUS_CUTSCENE_EXIT)
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
bSetTrevorExitIntro = TRUE
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
IF bSetTrevorExitIntro
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(trevorPed, PEDMOVE_WALK)
|
|
ENDIF
|
|
ELSE
|
|
IF bStartingAsTrevor
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
DO_MICHAEL_INTO_CAR()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bResetGameCamHeading
|
|
IF GET_CUTSCENE_TIME() >= 120500
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
REPLAY_STOP_EVENT()
|
|
bResetGameCamHeading = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_PLAYING()
|
|
IF bSkippedCutscene
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
//SET_TREVOR_AS_MISSION_START_CHAR()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
WAIT(0)
|
|
ENDIF
|
|
|
|
BOOL bCutsceneWasSkipped
|
|
bCutsceneWasSkipped = bSkippedCutscene
|
|
|
|
SET_MISSION_CUTSCENE(FALSE, TRUE, FALSE, FALSE, TRUE)
|
|
DO_MISSION_INIT_START_MISSION()
|
|
NEW_LOAD_SCENE_STOP()
|
|
IF IS_VALID_INTERIOR(trailerInterior)
|
|
IF IS_INTERIOR_READY(trailerInterior)
|
|
UNPIN_INTERIOR(trailerInterior)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCutsceneWasSkipped
|
|
DO_MICHAEL_INTO_CAR()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
//
|
|
//ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DEBUG_SKIP_MOCAP()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_INIT_DONE
|
|
|
|
RETURN TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// all player peds block non-temporary events and reset relationships
|
|
PROC REAPPLY_PLAYER_PED_ATTRIBUTES()
|
|
INT i
|
|
REPEAT COUNT_OF(sSelectorPeds.pedID) i
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[i])
|
|
APPLY_PLAYER_ATTRIBUTES(sSelectorPeds.pedID[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PED_DIES_IN_WATER(PLAYER_PED_ID(), TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// common start functions for creating a custom hotswap
|
|
PROC DO_COMMON_CUSTOM_HOTSWAP_START(CAMERA_TYPE camType)
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(sCamDetails.camInterpIDs) i
|
|
IF DOES_CAM_EXIST(sCamDetails.camInterpIDs[i])
|
|
DESTROY_CAM(sCamDetails.camInterpIDs[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_CAM_EXIST(sCamDetails.camID)
|
|
DESTROY_CAM(sCamDetails.camID)
|
|
ENDIF
|
|
|
|
sCamDetails.camID = CREATE_CAMERA(camType, FALSE)
|
|
ENDPROC
|
|
|
|
// common end functions for creating a custom hotswap
|
|
PROC DO_COMMON_CUSTOM_HOTSWAP_END()
|
|
SET_CAM_SPLINE_PHASE(sCamDetails.camID, 0.0)
|
|
sCamDetails.bSplineCreated = TRUE
|
|
sCamDetails.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
|
|
sCamDetails.bRun = TRUE
|
|
ENDPROC
|
|
|
|
// constantly run the hotswap selector/spline cam, and return true when selected the target ped
|
|
FUNC BOOL DO_MISSION_HOTSWAP(SELECTOR_SLOTS_ENUM targetCharacter, BOOL bInstantSwap = FALSE, HOTSWAP_CAM_ENUM hotswapCam = HOTSWAP_CAM_DEFAULT, BOOL bKeepTasks = FALSE, TAKE_CONTROL_OF_PED_FLAGS tcfChecks = TCF_NONE)
|
|
CONST_FLOAT TO_BOAT_OFFSET_X 0.0
|
|
CONST_FLOAT TO_BOAT_OFFSET_Y -45.0
|
|
CONST_FLOAT TO_BOAT_OFFSET_Z 80.0
|
|
CONST_FLOAT TO_BOAT_ANGLE_DOWN -15.0
|
|
|
|
CONST_FLOAT BACK_TO_TRAIN_OFFSET_X 5.0
|
|
CONST_FLOAT BACK_TO_TRAIN_OFFSET_Y -95.0
|
|
CONST_FLOAT BACK_TO_TRAIN_OFFSET_Z 28.0
|
|
CONST_FLOAT BACK_TO_TRAIN_ANGLE_DOWN -15.0
|
|
|
|
SWITCH hotswapStage
|
|
CASE MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
REMOVE_MISSION_TEXT(FALSE)
|
|
sSelectorPeds.bInitialised = TRUE
|
|
sSelectorPeds.eNewSelectorPed = targetCharacter
|
|
sCamDetails.pedTo = sSelectorPeds.pedID[targetCharacter]
|
|
sCamDetails.bPedSwitched = FALSE
|
|
//sCamDetails.bSplineActive = FALSE
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
|
|
|
|
IF NOT bInstantSwap
|
|
BOOL bDoingSwap
|
|
SWITCH hotswapCam
|
|
CASE HOTSWAP_CAM_DEFAULT
|
|
/*
|
|
FLOAT fHeading
|
|
FLOAT fPitch
|
|
fHeading = 0
|
|
fPitch = 0
|
|
IF hotswapCam = HOTSWAP_CAM_FORCE_ON_EXPLOSION
|
|
fHeading = 1000
|
|
fPitch = 1000
|
|
ENDIF
|
|
bDoingSwap = RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sCamDetails, fPitch, fHeading, camInterpType, 0)
|
|
*/
|
|
BOOL bOverrideSwitch
|
|
bOverrideSwitch = FALSE
|
|
IF currentMissionStage = STAGE_RAPIDS_CHASE
|
|
PED_INDEX michaelPed
|
|
michaelPed = GET_MICHAEL_PED()
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashvehicle[TCV_DINGHY])
|
|
IF IS_PED_IN_VEHICLE(michaelPed, trainCrashvehicle[TCV_DINGHY])
|
|
bOverrideSwitch = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bDoingSwap = RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, SWITCH_TYPE_SHORT, 0,
|
|
999.0,999.0,
|
|
FALSE, FALSE,
|
|
"", bOverrideSwitch, SHORT_SWITCH_STYLE_ROTATION)
|
|
BREAK
|
|
|
|
CASE HOTSWAP_CAM_TRAIN_TO_BOAT
|
|
|
|
////SET_CAM_COORD(sCamDetails.camInterpIDs[4], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], <<TO_BOAT_OFFSET_X, TO_BOAT_OFFSET_Y, TO_BOAT_OFFSET_Z>>))
|
|
//SET_CAM_ROT(sCamDetails.camInterpIDs[4], <<TO_BOAT_ANGLE_DOWN, 0, GET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY])>>)
|
|
//bDoingSwap = RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sCamDetails, 0.0, 0.0, camInterpType)
|
|
//bDoingSwap = RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails)//RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sCamDetails)
|
|
|
|
//bDoingSwap = RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails, SWITCH_TYPE_AUTO, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO | SWITCH_FLAG_START_FROM_CAMPOS))
|
|
|
|
IF HANDLE_SWITCH_CAM_TRAIN_TO_BOAT(scsSwitchCamTrainToBoat_Intro, scsSwitchCamTrainToBoat_Outro)
|
|
bDoingSwap = FALSE
|
|
ELSE
|
|
bDoingSwap = TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bDoingSwap
|
|
IF sCamDetails.bOKToSwitchPed
|
|
IF NOT sCamDetails.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, bKeepTasks, tcfChecks)
|
|
REAPPLY_PLAYER_PED_ATTRIBUTES()
|
|
sCamDetails.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// IF hotswapCam = HOTSWAP_CAM_TRAIN_TO_BOAT
|
|
// IF DOES_CAM_EXIST(staticCam)
|
|
// DESTROY_CAM(staticCam)
|
|
// ENDIF
|
|
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
// ENDIF
|
|
// ELSE
|
|
// IF hotswapCam = HOTSWAP_CAM_TRAIN_TO_BOAT
|
|
// RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
// ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = GET_PLAYER_PED_ENUM_FROM_SELECTOR_SLOT(targetCharacter)
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(sCamDetails.camInterpIDs) i
|
|
IF DOES_CAM_EXIST(sCamDetails.camInterpIDs[i])
|
|
DESTROY_CAM(sCamDetails.camInterpIDs[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_CAM_EXIST(sCamDetails.camID)
|
|
DESTROY_CAM(sCamDetails.camID)
|
|
ENDIF
|
|
|
|
IF NOT bPreventMissionFail_SwitchCamDebug
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_DONE
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
bDebugJSkip = FALSE
|
|
#ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, bKeepTasks, tcfChecks)
|
|
sCamDetails.bPedSwitched = TRUE
|
|
REAPPLY_PLAYER_PED_ATTRIBUTES()
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_DONE
|
|
#IF IS_DEBUG_BUILD
|
|
bDebugJSkip = FALSE
|
|
#ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// handle swap between michael and trevor
|
|
PROC HANDLE_MICHAEL_TREVOR_BOAT_SWAP_IN_RAPIDS()
|
|
IF boatHotswapState <> BOAT_HOTSWAP_ON_MICHAEL
|
|
// can't get out as trevor
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
ENDIF
|
|
//
|
|
//IF NOT bSelectorLocked
|
|
// IF currentMissionStage = STAGE_GET_HOME
|
|
// IF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
|
|
// ENDIF
|
|
// ENDIF
|
|
//ENDIF
|
|
|
|
IF GET_GAME_TIMER() < iLastSwitchTime + 500
|
|
HIDE_SELECTOR_THIS_FRAME()
|
|
ENDIF
|
|
|
|
SWITCH boatHotswapState
|
|
// on trevor
|
|
CASE BOAT_HOTSWAP_ON_TREVOR
|
|
// HANDLE_MICHAEL_SHOOTING()
|
|
// IF bDoneWaterfallCutaway
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
|
|
IF NOT bSelectorLocked
|
|
// switch menu
|
|
IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE)
|
|
OR bForceMichaelSwitch
|
|
#IF IS_DEBUG_BUILD
|
|
OR bDebugJSkip
|
|
#ENDIF
|
|
|
|
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
|
|
OR bForceMichaelSwitch
|
|
IF currentMissionStage = STAGE_RAPIDS_CHASE
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR)
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL)
|
|
ENDIF
|
|
INFORM_MISSION_STATS_OF_INCREMENT(EXL3_SWITCHES)
|
|
sCamDetails.bPedSwitched = FALSE
|
|
|
|
IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES()
|
|
IF NOT IS_PED_INJURED(GET_MICHAEL_PED())
|
|
IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON AND IS_PED_IN_ANY_VEHICLE(GET_MICHAEL_PED()))
|
|
OR (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON AND NOT IS_PED_IN_ANY_VEHICLE(GET_MICHAEL_PED()))
|
|
bRapidsSwitchFirstPerson = TRUE
|
|
ELSE
|
|
bRapidsSwitchFirstPerson = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
|
|
bRapidsSwitchFirstPerson = TRUE
|
|
ELSE
|
|
bRapidsSwitchFirstPerson = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
eSwitchCamState = SWITCH_CAM_SETUP_TREVOR_TO_MICHAEL_SPLINE
|
|
iLastSwitchTime = GET_GAME_TIMER()
|
|
boatHotswapState = BOAT_HOTSWAP_TO_MICHAEL
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
|
|
// on michael
|
|
CASE BOAT_HOTSWAP_ON_MICHAEL
|
|
// trevor shooting
|
|
HANDLE_TREVOR_SHOOTING()
|
|
|
|
IF currentMissionStage = STAGE_RAPIDS_CHASE
|
|
IF NOT bSelectorLocked
|
|
// switch menu
|
|
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
|
|
#IF IS_DEBUG_BUILD
|
|
OR bDebugJSkip
|
|
#ENDIF
|
|
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR
|
|
IF currentMissionStage = STAGE_RAPIDS_CHASE
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_MICHAEL)
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAPIDS_CHASE_TREVOR)
|
|
ENDIF
|
|
INFORM_MISSION_STATS_OF_INCREMENT(EXL3_SWITCHES)
|
|
eSwitchCamState = SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_SPLINE
|
|
sCamDetails.bPedSwitched = FALSE
|
|
|
|
IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES()
|
|
IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
OR (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
bRapidsSwitchFirstPerson = TRUE
|
|
ELSE
|
|
bRapidsSwitchFirstPerson = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
|
|
bRapidsSwitchFirstPerson = TRUE
|
|
ELSE
|
|
bRapidsSwitchFirstPerson = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
boatHotswapState = BOAT_HOTSWAP_TO_TREVOR
|
|
iLastSwitchTime = GET_GAME_TIMER()
|
|
bAreShowingMichaelReverseSwitchCam = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE BOAT_HOTSWAP_TO_TREVOR
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
|
|
// trevor shooting
|
|
HANDLE_TREVOR_SHOOTING()
|
|
|
|
TAKE_CONTROL_OF_PED_FLAGS tcfFlags
|
|
tcfFlags = TCF_NONE
|
|
IF boatRPGState = BOAT_RPG_USING
|
|
OR boatRPGState = BOAT_RPG_GET_IN_POSITION
|
|
OR boatRPGState = BOAT_RPG_RETURN_TO_SEAT
|
|
tcfFlags = TCF_CLEAR_TASK_INTERRUPT_CHECKS
|
|
ENDIF
|
|
|
|
IF DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, bRapidsSwitchFirstPerson, HOTSWAP_CAM_DEFAULT, TRUE, tcfFlags)
|
|
IF bRapidsSwitchFirstPerson
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, false)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDMichaelOut")
|
|
ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDTrevorOut")
|
|
ENDIF
|
|
|
|
//ANIMPOSTFX_PLAY("SwitchShortTrevorMid", 0, false)
|
|
// get michael to continue following waypoints
|
|
IF NOT bFinishedFollowRapids
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
|
|
INT iClosestWaypoint
|
|
iClosestWaypoint = GET_CLOSEST_BOAT_WAYPOINT(trainCrashVehicle[TCV_DINGHY], "exile31")
|
|
IF iClosestWaypoint >= 0
|
|
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(iClosestWaypoint)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF boatRPGState = BOAT_RPG_USING
|
|
OR boatRPGState = BOAT_RPG_GET_IN_POSITION
|
|
OR boatRPGState = BOAT_RPG_RETURN_TO_SEAT
|
|
SET_BOAT_RPG_STATE(boatRPGState, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF boatRPGState = BOAT_RPG_USING
|
|
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(TRUE)
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE)
|
|
ELSE
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
//michaelDrivebyState = MICHAEL_DRIVEBY_WAITING
|
|
//iRecheckMichaelDrivebyTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 6000)
|
|
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE)
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
|
|
boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
|
|
|
|
sCamDetails.bRun = FALSE
|
|
|
|
sCamDetails.bOKToSwitchPed = FALSE
|
|
sCamDetails.bPedSwitched = FALSE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE BOAT_HOTSWAP_TO_MICHAEL
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
|
|
// trevor shooting
|
|
HANDLE_TREVOR_SHOOTING()
|
|
|
|
IF DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, bRapidsSwitchFirstPerson, HOTSWAP_CAM_DEFAULT, TRUE)
|
|
|
|
IF bRapidsSwitchFirstPerson
|
|
ANIMPOSTFX_PLAY("SwitchSceneMichael", 0, false)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDMichaelOut")
|
|
ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDTrevorOut")
|
|
ENDIF
|
|
|
|
//ANIMPOSTFX_PLAY("SwitchShortMichaelMid", 0, false)
|
|
// reset trevor shooting
|
|
iRecheckTrevorDrivebyTime = GET_GAME_TIMER() + 500
|
|
trevorTargetPed = NULL
|
|
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(PLAYER_PED_ID())
|
|
CLEAR_DRIVEBY_TASK_UNDERNEATH_DRIVING_TASK(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF boatRPGState = BOAT_RPG_USING
|
|
OR boatRPGState = BOAT_RPG_GET_IN_POSITION
|
|
OR boatRPGState = BOAT_RPG_RETURN_TO_SEAT
|
|
SET_BOAT_RPG_STATE(boatRPGState, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_PARTICLE_FX_BULLET_TRACE_NO_ANGLE_REJECT(FALSE)
|
|
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
|
|
|
|
bForceResetTrevorTask = TRUE
|
|
|
|
sCamDetails.bOKToSwitchPed = FALSE
|
|
sCamDetails.bPedSwitched = FALSE
|
|
|
|
sCamDetails.bRun = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// handle swap between michael and trevor at crash
|
|
/*
|
|
PROC HANDLE_MICHAEL_TREVOR_BOAT_SWAP_AT_CRASH()
|
|
SWITCH crashHotswapState
|
|
// on trevor
|
|
CASE CRASH_HOTSWAP_ON_TREVOR
|
|
|
|
|
|
// switch menu
|
|
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
|
|
#IF IS_DEBUG_BUILD
|
|
OR bDebugJSkip
|
|
#ENDIF
|
|
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
|
|
crashHotswapState = CRASH_HOTSWAP_TO_MICHAEL
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
// on michael
|
|
CASE CRASH_HOTSWAP_ON_MICHAEL
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
|
|
// switch menu
|
|
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
|
|
#IF IS_DEBUG_BUILD
|
|
OR bDebugJSkip
|
|
#ENDIF
|
|
IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR
|
|
crashHotswapState = CRASH_HOTSWAP_TO_TREVOR
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
// to trevor
|
|
CASE CRASH_HOTSWAP_TO_TREVOR
|
|
IF DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, FALSE, HOTSWAP_CAM_STRAIGHT)
|
|
iSavedMichaelGetInTextStage = iGetInTextStage
|
|
iGetInTextStage = iSavedTrevorGetInTextStage
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
crashHotswapState = CRASH_HOTSWAP_ON_TREVOR
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
|
|
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_ALL_BLIPS()
|
|
ENDIF
|
|
BREAK
|
|
|
|
// to michael
|
|
CASE CRASH_HOTSWAP_TO_MICHAEL
|
|
IF DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, FALSE, HOTSWAP_CAM_STRAIGHT)
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], trainCrashVehicle[TCV_DINGHY])
|
|
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], trainCrashVehicle[TCV_DINGHY], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iSavedTrevorGetInTextStage = iGetInTextStage
|
|
iGetInTextStage = iSavedMichaelGetInTextStage
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
crashHotswapState = CRASH_HOTSWAP_ON_MICHAEL
|
|
ELSE
|
|
REMOVE_ALL_BLIPS()
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
*/
|
|
|
|
/*
|
|
// fail if train got too far without being sabotaged
|
|
PROC CHECK_FAIL_FOR_TRAIN_STOP()
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
IF NOT bRunningCutscene
|
|
VECTOR vTrainPos = GET_ENTITY_COORDS(missionTrain)
|
|
IF vTrainPos.x < FAIL_STOP_X
|
|
REQUEST_SCRIPT("delayTrainCleanup")
|
|
WHILE NOT HAS_SCRIPT_LOADED("delayTrainCleanup")
|
|
WAIT(0)
|
|
ENDWHILE
|
|
START_NEW_SCRIPT_WITH_ARGS("delayTrainCleanup", missionTrain, SIZE_OF(VEHICLE_INDEX), MINI_STACK_SIZE)
|
|
SET_SCRIPT_AS_NO_LONGER_NEEDED("delayTrainCleanup")
|
|
bLaunchedDelayTrainCleanupScript = TRUE
|
|
DETACH_PLAYER_FROM_TRAIN()
|
|
MISSION_FAILED(FAIL_TRAIN_STOPPED)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
*/
|
|
|
|
// fail if too far away from train
|
|
PROC CHECK_FAIL_FOR_LOSE_TRAIN()
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugDontDoDistanceFail
|
|
EXIT // if train is jumping around cause of skipping, let's not fail because IT'S QUITE ANNOYING
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(missionTrain), GET_ENTITY_COORDS(PLAYER_PED_ID())) >= 3000
|
|
MISSION_FAILED(FAIL_LOST_TRAIN)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// store banter
|
|
FUNC BOOL STORE_BANTER()
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
TEXT_LABEL_23 tBanter = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
IF ARE_STRINGS_EQUAL(tBanter, "EXL3_RAD1")
|
|
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_RAD2")
|
|
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_ESCAPE1")
|
|
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_DOCK1")
|
|
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_BANTER")
|
|
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_ESCAP1b")
|
|
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_DOCK1b")
|
|
OR ARE_STRINGS_EQUAL(tBanter, "EXL3_BANTER2")
|
|
bSavedBanter = TRUE
|
|
tSavedBanterRoot = tBanter
|
|
tResumeBanterLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// restore banter
|
|
FUNC BOOL RESTORE_BANTER()
|
|
IF bSavedBanter
|
|
IF CAN_ADVANCE_MISSION()
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(trainCrashConversation, "EXL3AUD", tSavedBanterRoot, tResumeBanterLabel, CONV_PRIORITY_HIGH)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// handle text for on bike
|
|
FUNC BOOL HANDLE_GET_TO_LOCATION(BOOL bWithVehicle, BOOL bWithBuddy)
|
|
TRAIN_CRASH_VEHICLE_ENUM vehicleEnum
|
|
SELECTOR_SLOTS_ENUM buddyEnum
|
|
|
|
BOOL bPlayerVehicleOK = TRUE
|
|
BOOL bBuddyVehicleOK = TRUE
|
|
BOOL bBuddyGroupOK = TRUE
|
|
BOOL bAllOK = FALSE
|
|
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
CASE STAGE_CHASE_TRAIN
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
vehicleEnum = TCV_BIKE
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
CASE STAGE_RAPIDS_CHASE
|
|
CASE STAGE_GET_HOME
|
|
vehicleEnum = TCV_DINGHY
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bWithBuddy
|
|
IF NOT IS_PED_GROUP_MEMBER(sSelectorPeds.pedID[buddyEnum], PLAYER_GROUP_ID())
|
|
bBuddyGroupOK = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bWithVehicle
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[vehicleEnum])
|
|
IF bWithBuddy
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[buddyEnum])
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[buddyEnum], trainCrashVehicle[vehicleEnum])
|
|
bBuddyVehicleOK = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[vehicleEnum])
|
|
IF NOT bForceIntoDinghy
|
|
bPlayerVehicleOK = FALSE
|
|
ELSE
|
|
IF bSuccessfullyForcedIntoDinghy
|
|
bPlayerVehicleOK = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bBuddyGroupOK
|
|
// buddy is group member / not required to be in group
|
|
IF bPlayerVehicleOK
|
|
// player is in vehicle
|
|
bAllOK = TRUE
|
|
|
|
IF bBuddyVehicleOK
|
|
IF iGetInTextStage < 2
|
|
iGetInTextStage = 2
|
|
ENDIF
|
|
// buddy is in the vehicle / not required to be in vehicle
|
|
RETURN TRUE
|
|
ELSE
|
|
// buddy is not in the vehicle - blip him
|
|
IF NOT DOES_BLIP_EXIST(buddyBlip)
|
|
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
|
|
REMOVE_ALL_BLIPS()
|
|
buddyBlip = CREATE_MISSION_BLIP_FOR_PED(sselectorPeds.pedID[buddyEnum])
|
|
ENDIF
|
|
|
|
IF NOT bWaitForBuddyPrompt
|
|
bWaitForBuddyPrompt = DO_MISSION_GOD_TEXT("TC_WAITT")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// player is not in the vehicle - blip it
|
|
|
|
IF NOT DOES_BLIP_EXIST(vehicleBlip)
|
|
IF currentMissionStage = STAGE_CHASE_TRAIN
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
|
|
REMOVE_ALL_BLIPS()
|
|
IF iGetInTextStage = 0
|
|
OR iGetInTextStage = 2
|
|
bShouldDoGetInText = TRUE
|
|
ENDIF
|
|
vehicleBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(trainCrashVehicle[vehicleEnum])
|
|
ENDIF
|
|
|
|
IF bShouldDoGetInText
|
|
STRING sGetInString
|
|
SWITCH iGetInTextStage
|
|
CASE 0
|
|
SWITCH vehicleEnum
|
|
CASE TCV_BIKE
|
|
sGetInString = "CMN_GENGETINBK"
|
|
BREAK
|
|
CASE TCV_DINGHY
|
|
sGetInString = "TC_DINGHY2"
|
|
BREAK
|
|
CASE TCV_BEACH_CAR
|
|
sGetInString = "TC_CAR"
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
CASE 2
|
|
SWITCH vehicleEnum
|
|
CASE TCV_BIKE
|
|
sGetInString = "CMN_GENGETBCKBK"
|
|
BREAK
|
|
CASE TCV_DINGHY
|
|
sGetInString = "TC_DINGHY"
|
|
BREAK
|
|
CASE TCV_BEACH_CAR
|
|
sGetInString = "TC_CAR1"
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF currentMissionStage = STAGE_STEAL_FROM_CONTAINER AND (IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR NOT bDoneGotoSpeech)
|
|
ELSE
|
|
IF (currentMissionStage <> STAGE_GET_HOME AND currentMissionStage <> STAGE_STEAL_FROM_CONTAINER AND currentMissionStage <> STAGE_INTERCEPT_TRAIN)
|
|
OR bDoneGotoSpeech
|
|
IF DO_MISSION_GOD_TEXT(sGetInString)
|
|
bShouldDoGetInText = FALSE
|
|
iGetInTextStage++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// buddy is not group member
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sselectorPeds.pedID[buddyEnum], <<12, 12, 6>>)
|
|
// re-add to group
|
|
SET_PED_AS_GROUP_MEMBER(sselectorPeds.pedID[buddyEnum], PLAYER_GROUP_ID())
|
|
ELSE
|
|
// do blip and god text
|
|
IF NOT DOES_BLIP_EXIST(buddyBlip)
|
|
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
|
|
REMOVE_ALL_BLIPS()
|
|
buddyBlip = CREATE_MISSION_BLIP_FOR_PED(sselectorPeds.pedID[buddyEnum])
|
|
ENDIF
|
|
IF NOT bGetBuddyPrompt
|
|
bGetBuddyPrompt = DO_MISSION_GOD_TEXT("CMN_TLEAVE")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bAllOK
|
|
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
|
|
bAllOK = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bAllOK
|
|
IF NOT bSavedBanter
|
|
IF STORE_BANTER()
|
|
KILL_ANY_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// check is at heading
|
|
FUNC BOOL IS_PED_AT_CORRECT_HEADING(PED_INDEX ped, FLOAT fAngle, FLOAT allowAngleFrom0 = 25.0)
|
|
FLOAT fPedHeading = NORMALISE_HEADING(GET_ENTITY_HEADING(ped))
|
|
FLOAT fAnimHeading = NORMALISE_HEADING(fAngle)
|
|
FLOAT fHeadingDiff = fPedHeading - fAnimHeading
|
|
IF fHeadingDiff < 0
|
|
fHeadingDiff *= -1
|
|
ENDIF
|
|
IF fHeadingDiff <= allowAngleFrom0
|
|
OR fHeadingDiff >= 360 - allowAngleFrom0
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// get coords for jump
|
|
FUNC VECTOR GET_JUMP_COORDS(INT iJump)
|
|
SWITCH iJump
|
|
CASE 0
|
|
RETURN <<2679.41, 5326.92, 65.76>>
|
|
BREAK
|
|
CASE 1
|
|
RETURN <<2622.84, 5481.42, 65.60>>
|
|
BREAK
|
|
CASE 2
|
|
RETURN <<2470.84, 5788.90, 69.05>>
|
|
BREAK
|
|
CASE 3
|
|
RETURN <<2383.02, 5913.01, 71.68>>
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN <<0,0,0>>
|
|
ENDFUNC
|
|
|
|
// does bike heading match jump heading
|
|
CONST_FLOAT ALLOW_JUMP_ANGLE 40.0
|
|
FUNC BOOL DOES_BIKE_MATCH_JUMP_HEADING(INT iJump)
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
FLOAT fJumpHeading
|
|
FLOAT fBikeHeading = NORMALISE_HEADING(GET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE]))
|
|
|
|
SWITCH iJump
|
|
CASE 0
|
|
fJumpHeading = 35.98
|
|
BREAK
|
|
CASE 1
|
|
fJumpHeading = 37.33
|
|
BREAK
|
|
CASE 2
|
|
fJumpHeading = 48.02
|
|
BREAK
|
|
CASE 3
|
|
fJumpHeading = 53.29
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
FLOAT fHeadingDiff = fBikeHeading - fJumpHeading
|
|
IF fHeadingDiff < 0
|
|
fHeadingDiff *= -1
|
|
ENDIF
|
|
IF fHeadingDiff <= ALLOW_JUMP_ANGLE
|
|
OR fHeadingDiff >= 360 - ALLOW_JUMP_ANGLE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// get track pos for jump
|
|
FUNC FLOAT GET_JUMP_TRACK_Y(INT iJump)
|
|
SWITCH iJump
|
|
CASE 0
|
|
RETURN 5338.80
|
|
BREAK
|
|
CASE 1
|
|
RETURN 5495.14
|
|
BREAK
|
|
CASE 2
|
|
//RETURN 5562.25
|
|
RETURN 5795.43
|
|
BREAK
|
|
CASE 3
|
|
//RETURN 5762.08
|
|
//RETURN 5908.77
|
|
RETURN 10000.0
|
|
BREAK
|
|
CASE 4
|
|
//RETURN 5870.79
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN 0.0
|
|
ENDFUNC
|
|
|
|
// get Y limit for jump
|
|
FUNC FLOAT GET_JUMP_Y_LIMIT(INT iJump)
|
|
SWITCH iJump
|
|
CASE 0
|
|
RETURN 5332.51
|
|
BREAK
|
|
CASE 1
|
|
RETURN 5487.61
|
|
BREAK
|
|
CASE 2
|
|
//RETURN 5564.55
|
|
RETURN 5795.04
|
|
BREAK
|
|
CASE 3
|
|
//RETURN 5795.04
|
|
//RETURN 5928.65
|
|
RETURN 10000.0
|
|
BREAK
|
|
CASE 4
|
|
RETURN 5944.21
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN 0.0
|
|
ENDFUNC
|
|
|
|
// is any carriage at jump
|
|
FUNC BOOL IS_CARRIAGE_AT_JUMP(INT iJump)
|
|
VEHICLE_INDEX carriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
|
|
IF IS_VEHICLE_DRIVEABLE(carriageVehicle)
|
|
VECTOR vCarriagePos = GET_ENTITY_COORDS(carriageVehicle)
|
|
FLOAT fTrackY = GET_JUMP_TRACK_Y(iJump)
|
|
|
|
//PRINTSTRING("carriage pos ") printvector(vCarriagePos) PRINTNL()
|
|
//PRINTSTRING("track y ") PRINTFLOAT(fTrackY) PRINTNL()
|
|
|
|
IF vCarriagePos.y < fTrackY
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// is player at jump
|
|
FUNC BOOL IS_PLAYER_AT_JUMP(INT iJump)
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_JUMP_COORDS(iJump), <<200.0, 200.0, 30.0>>)
|
|
IF vPlayerPos.y < GET_JUMP_Y_LIMIT(iJump)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// remove michael
|
|
PROC HANDLE_MICHAEL_CAR_DRIVE(BOOL bCanRemove)
|
|
IF NOT bRemovedMichael
|
|
BOOL bDoRemove = FALSE
|
|
|
|
REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(TOWN_PATHS_MIN_X, TOWN_PATHS_MIN_Y, TOWN_PATHS_MAX_X, TOWN_PATHS_MAX_Y)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<300,300,20>>, FALSE, FALSE)
|
|
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bDoRemove = TRUE
|
|
ELSE
|
|
HANDLE_FLIP_OFF_PED(flipOffData)
|
|
|
|
SWITCH iMichaelDriveCarStage
|
|
CASE 0
|
|
IF IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_MICHAEL_CAR], <<1992.65, 3839.31, 31.33>>, <<6.75,6.75,6.75>>)
|
|
TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_MICHAEL_CAR], <<1988.93, 3853.87, 31.37>>, 8.0, DRIVINGSTYLE_NORMAL, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL_CAR), DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, 5, -1)
|
|
iMichaelDriveCarStage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_MICHAEL_CAR], <<1988.93, 3853.87, 31.37>>, <<9,9,9>>)
|
|
TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_MICHAEL_CAR], <<676.07733, 3582.21680, 31.89429>>, 20.0, DRIVINGSTYLE_NORMAL, GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_MICHAEL_CAR), DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, 5, -1)
|
|
iMichaelDriveCarStage++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT bDoneMichaelGoOnFoot
|
|
IF bMichaelWasInVehicle
|
|
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<676.07733, 3582.21680, 31.89429>>, PEDMOVE_RUN, -1, DEFAULT_NAVMESH_RADIUS, ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
bDoneMichaelGoOnFoot = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bMichaelWasInVehicle = TRUE
|
|
ENDIF
|
|
|
|
IF NOT bDoneMichaelNoFollowPrompt
|
|
IF GET_GAME_TIMER() >= iInterceptTrainTime + 34000
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<40,40,40>>)
|
|
bDoneMichaelNoFollowPrompt = DO_MISSION_SPEECH("EXL3_MWHAT")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
bDoRemove = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCanRemove
|
|
IF bDoRemove
|
|
SET_PED_AS_NO_LONGER_NEEDED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REMOVE_PED_FOR_DIALOGUE(trainCrashConversation, 0)
|
|
ADD_PED_FOR_DIALOGUE(trainCrashConversation, 0, NULL, "MICHAEL")
|
|
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_MICHAEL_CAR])
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[TCV_MICHAEL_CAR])
|
|
ENDIF
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_MICHAEL_CAR))
|
|
|
|
bRemovedMichael = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// is the player on the train with the bike
|
|
FUNC BOOL IS_PLAYER_ON_TRAIN_WITH_BIKE()
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
IF iClosestCarriage > 0
|
|
AND iClosestCarriage <= EXILE3_LAST_CARRIAGE
|
|
VEHICLE_INDEX carriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage)
|
|
IF IS_VEHICLE_DRIVEABLE(carriageVehicle)
|
|
//PRINTSTRING("speed = ") PRINTFLOAT(GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE])) PRINTNL()
|
|
//IF GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE]) >= 5.0
|
|
IF IS_PED_AT_CORRECT_HEADING(PLAYER_PED_ID(), GET_ENTITY_HEADING(carriageVehicle), 40.0)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(trainCrashVehicle[TCV_BIKE], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(carriageVehicle, <<0, 8, 2.5>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(carriageVehicle, <<0, -8, 3.9>>), 2.6) // height was prev 4.8
|
|
//AND IS_ENTITY_TOUCHING_ENTITY(trainCrashVehicle[TCV_BIKE], carriageVehicle)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// create blip for container
|
|
PROC CREATE_CONTAINER_BLIP()
|
|
containerBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_BLIP_CONTAINER))
|
|
IF DOES_BLIP_EXIST(containerBlip)
|
|
SET_BLIP_COLOUR(containerBlip, BLIP_COLOUR_GREEN)
|
|
SET_BLIP_SCALE(containerBlip, BLIP_SIZE_OBJECT)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(containerBlip, "TC_CBLIP")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PROC DO_DEBUG_TRAIN_CAM_POSITION()
|
|
IF DOES_CAM_EXIST(staticCam)
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
ATTACH_CAM_TO_ENTITY(staticCam, missionTrain, vDebugTrainCamOffset)
|
|
POINT_CAM_AT_ENTITY(staticCam, missionTrain, vDebugTrainCamPoint)
|
|
SET_CAM_FOV(staticCam, fDebugTrainCamFOV)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
// common stuff for cutscene skip
|
|
PROC HANDLE_SKIP_CUTSCENE()
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED()
|
|
AND GET_GAME_TIMER() >= iAllowSkipCutsceneTime + 1000
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
bSkippedCutscene = TRUE
|
|
cutsceneStage = TC_CUT_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_SEE_TRAIN_SPEECH()
|
|
IF NOT bDoneSeeTrainSpeech
|
|
VEHICLE_INDEX lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<200, 200, 50>>)
|
|
AND IS_ENTITY_ON_SCREEN(lastCarriage)
|
|
AND IS_VEHICLE_VISIBLE(lastCarriage)
|
|
fSeeTrainSpeechTime = fSeeTrainSpeechTime +@ 1.0
|
|
IF fSeeTrainSpeechTime >= 1.2
|
|
bDoneSeeTrainSpeech = DO_MISSION_SPEECH("EXL3_SEETRN")
|
|
ENDIF
|
|
ELSE
|
|
fSeeTrainSpeechTime = 0.0
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// intercept train
|
|
PROC DO_STAGE_INTERCEPT_TRAIN()
|
|
|
|
SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), DOORSTATE_FORCE_LOCKED_THIS_FRAME, TRUE)
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(GET_HASH_KEY("DOORHASH_T_TRAILER_CS"), 1.0)
|
|
|
|
// create train
|
|
SWITCH createTrainStage
|
|
CASE CREATE_TRAIN_STAGE_NOT_STARTED
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAIN_ENGINE))
|
|
ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAIN_CONTAINER2))
|
|
//ADD_MODEL_REQUEST(ENUM_TO_INT(TCM_ENGINEER))
|
|
createTrainStage = CREATE_TRAIN_STAGE_WAITING
|
|
BREAK
|
|
CASE CREATE_TRAIN_STAGE_WAITING
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED()
|
|
CREATE_TRAIN_FOR_STAGE(STAGE_INTERCEPT_TRAIN, FALSE)
|
|
|
|
createTrainStage = CREATE_TRAIN_STAGE_DONE
|
|
ENDIF
|
|
BREAK
|
|
CASE CREATE_TRAIN_STAGE_DONE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
HANDLE_CREATE_ENGINEER()
|
|
|
|
IF NOT bDeletedRonAndPatricia
|
|
//SET_DOOR_STATE(DOORNAME_T_TRAILER_CS, DOORSTATE_FORCE_OPEN_THIS_FRAME)
|
|
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1973.85730, 3814.53687, 32.42491>>, <<250,250,250>>, FALSE, FALSE)
|
|
DELETE_RON_AND_PATRICIA()
|
|
bDeletedRonAndPatricia = TRUE
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(ronPed)
|
|
IF IS_PED_INJURED(ronPed)
|
|
MISSION_FAILED(FAIL_RON_DEAD)
|
|
ELSE
|
|
SET_PED_RESET_FLAG(ronPed, PRF_DisablePlayerMeleeFriendlyAttacks, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(patriciaPed)
|
|
IF IS_PED_INJURED(patriciaPed)
|
|
MISSION_FAILED(FAIL_PATRICIA_DEAD)
|
|
ELSE
|
|
SET_PED_RESET_FLAG(patriciaPed, PRF_DisablePlayerMeleeFriendlyAttacks, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneMissionStartCue
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bDoneMissionStartCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_MISSION_START")
|
|
IF bDoneMissionStartCue
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
// music cue
|
|
IF NOT bPreparedSeeTrainCue
|
|
bPreparedSeeTrainCue = PREPARE_MUSIC_EVENT("EXL3_SEE_TRAIN")
|
|
IF bPreparedSeeTrainCue
|
|
REPLAY_RECORD_BACK_FOR_TIME(00, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() <= iStageStartTime + 700
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// remove michael when far away
|
|
HANDLE_MICHAEL_CAR_DRIVE(FALSE)
|
|
|
|
// check fail for lose train
|
|
IF iTrainMovementStartTime >= 0
|
|
IF GET_GAME_TIMER() >= iTrainMovementStartTime + 15000
|
|
DO_LOSE_TRAIN_CHECK()
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iInterceptTrainTime + 70000
|
|
DO_RANDOM_SPEECH("EXL3_HURRYT", -1, 16000, 24000)
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() >= iInterceptTrainTime + 150000
|
|
OR NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<2842.36, 4423.54, 48.09>>, <<1500, 1500, 1500>>, FALSE, FALSE)
|
|
MISSION_FAILED(FAIL_LOST_TRAIN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
IF NOT bDoneGotoSpeech
|
|
IF GET_GAME_TIMER() >= iDelayFirstLineTime
|
|
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_GOBOAT")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// handle blipping of bike and train
|
|
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
IF NOT bDoneBikeStartAudioScene
|
|
bDoneBikeStartAudioScene = START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_START)
|
|
ENDIF
|
|
|
|
// add blip for intercept if doesn't exist
|
|
IF NOT DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_ALL_BLIPS()
|
|
REMOVE_MISSION_TEXT(FALSE)
|
|
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_PATH_START), TRUE)
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
SET_BLIP_COLOUR(gotoBlip, BLIP_COLOUR_BLUE)
|
|
SET_BLIP_ROUTE_COLOUR(gotoBlip, BLIP_COLOUR_BLUE)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bShownGodText
|
|
IF DO_MISSION_GOD_TEXT("TC_FOLTR")
|
|
bShownGodText = TRUE
|
|
iDoTrainBanterTime = GET_GAME_TIMER() + 12000
|
|
ENDIF
|
|
ELSE
|
|
// banter on way
|
|
IF NOT bDoneTrainBanter
|
|
IF GET_GAME_TIMER() >= iDoTrainBanterTime
|
|
IF iReplayAttempt % 2 = 0
|
|
bDoneTrainBanter = DO_MISSION_SPEECH("EXL3_RAD1")
|
|
ELSE
|
|
bDoneTrainBanter = DO_MISSION_SPEECH("EXL3_RAD2")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bSavedBanter
|
|
IF RESTORE_BANTER()
|
|
bSavedBanter = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
|
|
|
|
DO_SEE_TRAIN_SPEECH()
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<220, 220, 50>>)
|
|
AND IS_ENTITY_ON_SCREEN(lastCarriage)
|
|
IF bTrainIsPastSilos
|
|
fTrainOnScreenTime = fTrainOnScreenTime +@ 1.0
|
|
ENDIF
|
|
ELSE
|
|
fTrainOnScreenTime = 0.0
|
|
ENDIF
|
|
|
|
IF bDoneSeeTrainSpeech
|
|
IF NOT bDoneSeeTrainAudioScene
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_START)
|
|
bDoneSeeTrainAudioScene = START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
BOOL bAdvance = FALSE
|
|
BOOL bResetSeeSpeech = FALSE
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_SILOS), <<10.0, 10.0, LOCATE_SIZE_HEIGHT>>)
|
|
OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lastCarriage, <<150, 150, 50>>)
|
|
OR (bTrainIsPastSilos AND fTrainOnScreenTime >= 0.5)
|
|
bAdvance = TRUE
|
|
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_PATH_START), <<120,120,120>>, FALSE, FALSE)
|
|
bAdvance = TRUE
|
|
bResetSeeSpeech = TRUE
|
|
ENDIF
|
|
|
|
IF bAdvance
|
|
//IF bPreparedSeeTrainCue
|
|
// bDoneSeeTrainCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_SEE_TRAIN")
|
|
//ENDIF
|
|
//bPreparedSeeTrainCue = FALSE
|
|
bDoneSeeTrainCue = FALSE
|
|
bPreparedLandOnTrainCue = FALSE
|
|
bDoneLandOnTrainCue = FALSE
|
|
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_NOT_STARTED
|
|
SET_MISSION_STAGE(STAGE_CHASE_TRAIN, FALSE, FALSE, FALSE, FALSE)
|
|
|
|
IF bResetSeeSpeech
|
|
bDoneSeeTrainSpeech = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// jump onto train cutscene procedure
|
|
PROC DO_JUMP_ONTO_TRAIN_CUTSCENE()
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2160748
|
|
|
|
SWITCH cutsceneStage
|
|
CASE TC_CUT_STAGE_INIT
|
|
SET_MISSION_CUTSCENE(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE,DEFAULT,FALSE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
|
|
|
|
iRemovedJumpBlipTime = 0
|
|
//REMOVE_MISSION_TEXT(FALSE, FALSE, TRUE)
|
|
CLEAR_HELP()
|
|
|
|
REMOVE_ALL_BLIPS()
|
|
RESET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct)
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
SET_TRAIN_SPEED_FOR_STAGE(STAGE_DRIVE_ALONG_TRAIN)
|
|
iClosestCarriage = GET_CLOSEST_CARRIAGE(<<0,0,0>>)
|
|
SET_BIKE_ON_TRAIN()
|
|
TASK_VEHICLE_TEMP_ACTION(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], TEMPACT_GOFORWARD, 1000)
|
|
|
|
STOP_VEHICLE_FIRE(trainCrashVehicle[TCV_BIKE])
|
|
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_BIKE], APPLY_TYPE_IMPULSE, <<0,0,-2>>, 0, TRUE, TRUE)
|
|
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
|
|
|
|
VECTOR vBikePos
|
|
vBikePos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE])
|
|
fBikeCamHeight = vBikePos.Z - 0.1//- 0.2
|
|
bDoneFlash = FALSE
|
|
|
|
vCurrentBikeCamOffset = GET_TRAIN_CRASH_VECTOR(TCVEC_INIT_BIKE_CAM_OFFSET)
|
|
CREATE_CAM_AT_BIKE()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
PLAY_SOUND_FROM_ENTITY(-1, "EXILE_3_LAND_ON_TRAIN_MASTER", trainCrashVehicle[TCV_BIKE])
|
|
iTrainCrashCutsceneTime = GET_GAME_TIMER()
|
|
cutsceneStage = TC_CUT_STAGE_RUNNING
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_RUNNING
|
|
|
|
//RESET_VEHICLE_WHEELS(trainCrashVehicle[TCV_BIKE], TRUE)
|
|
// jump speech
|
|
IF NOT bDoneJumpSpeech
|
|
bDoneJumpSpeech = DO_MISSION_SPEECH("EXL3_BOTRAIN")
|
|
ENDIF
|
|
|
|
IF NOT bDoneLandOnTrainCue
|
|
IF bPreparedLandOnTrainCue
|
|
bDoneLandOnTrainCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_BIKE_LAND")
|
|
printstring("trigger event EXL3_BIKE_LAND") printnl()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
INTERP_VECTOR_TO_VECTOR_OVER_TIME(GET_TRAIN_CRASH_VECTOR(TCVEC_INIT_BIKE_CAM_OFFSET), GET_TRAIN_CRASH_VECTOR(TCVEC_END_BIKE_CAM_OFFSET), vCurrentBikeCamOffset, 0.69)
|
|
PRINTVECTOR(vCurrentBikeCamOffset) PRINTNL()
|
|
SET_BIKE_CAM_ROTATION()
|
|
|
|
//ATTACH_CAM_TO_ENTITY(staticCam, trainCrashVehicle[TCV_BIKE], vDebugTrainCamOffset)
|
|
//POINT_CAM_AT_ENTITY(staticCam, trainCrashVehicle[TCV_BIKE], vDebugTrainCamPoint)
|
|
//SET_CAM_FOV(staticCam, fDebugTrainCamFOV)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
VEHICLE_INDEX lastCarriage
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
lastCarriage = GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage)
|
|
IF IS_VEHICLE_DRIVEABLE(lastCarriage)
|
|
SET_ENTITY_ROTATION(trainCrashVehicle[TCV_BIKE], <<0,0,GET_ENTITY_HEADING(lastCarriage)>>)
|
|
ENDIF
|
|
ENDIF
|
|
//SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BIKE], 35.0)
|
|
ENDIF
|
|
|
|
IF NOT bDoneFlash
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_BIKE) = CAM_VIEW_MODE_FIRST_PERSON
|
|
IF GET_GAME_TIMER() >= iTrainCrashCutsceneTime + 380
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bDoneFlash = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() >= iTrainCrashCutsceneTime + 680//600
|
|
cutsceneStage = TC_CUT_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_CLEANUP
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
|
|
SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, FALSE, FALSE, FALSE,DEFAULT,FALSE)
|
|
SET_MISSION_STAGE(STAGE_DRIVE_ALONG_TRAIN, FALSE, FALSE)
|
|
SET_BIKE_ON_TRAIN()
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// chase the train and jump to it
|
|
PROC DO_STAGE_CHASE_TRAIN()
|
|
BOOL bDoBikeJumpAudioScene = FALSE
|
|
BOOL bJumpSucceeding = FALSE
|
|
|
|
IF bTempSuppressVehicleSpawning
|
|
IF GET_GAME_TIMER() <= iSuppressVehicleSpawnTime + 1500
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
ELSE
|
|
bTempSuppressVehicleSpawning = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bTempPreventStillVehicleState
|
|
IF GET_GAME_TIMER() <= iStageStartTime + 200
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
ELSE
|
|
bTempPreventStillVehicleState = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
HANDLE_CREATE_ENGINEER()
|
|
|
|
IF NOT bRunningCutscene
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
BOOL bOnBike = IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
IF NOT bOnBike
|
|
iRemovedJumpBlipTime = 0
|
|
ENDIF
|
|
DO_LOSE_TRAIN_CHECK()
|
|
|
|
IF NOT bDoneSeeTrainAudioScene
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_START)
|
|
//STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE)
|
|
bDoneSeeTrainAudioScene = START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_SEE_TRAIN)
|
|
ENDIF
|
|
|
|
// remove michael when far away
|
|
HANDLE_MICHAEL_CAR_DRIVE(TRUE)
|
|
|
|
// music cues
|
|
IF NOT bDoneSeeTrainCue
|
|
IF bPreparedSeeTrainCue
|
|
IF TRIGGER_MISSION_MUSIC_EVENT("EXL3_SEE_TRAIN")
|
|
iPrepareLandOnTrainCueTime = GET_GAME_TIMER() + 8000
|
|
bDoneSeeTrainCue = TRUE
|
|
ENDIF
|
|
ELSE
|
|
CANCEL_MUSIC_EVENT("EXL3_SEE_TRAIN")
|
|
bDoneSeeTrainCue = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bPreparedLandOnTrainCue
|
|
IF GET_GAME_TIMER() >= iPrepareLandOnTrainCueTime
|
|
bPreparedLandOnTrainCue = PREPARE_MUSIC_EVENT("EXL3_BIKE_LAND")
|
|
|
|
IF bPreparedLandOnTrainCue
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// handle blipping of bike and train
|
|
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETINBK")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETBCKBK")
|
|
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT bShownGodText
|
|
bShownGodText = DO_MISSION_GOD_TEXT("TC_FOLTR")
|
|
ELSE
|
|
//IF GET_GAME_TIMER() <= iStageStartTime + 6000
|
|
DO_SEE_TRAIN_SPEECH()
|
|
//ENDIF
|
|
|
|
IF NOT bDoneGetBombsSpeech
|
|
IF bDoneSeeTrainSpeech
|
|
VECTOR vPlayerPos
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
IF vPlayerPos. y > 4910
|
|
IF DO_MISSION_SPEECH("EXL3_STBOMBS")
|
|
bDoneGetBombsSpeech = TRUE
|
|
iNextRandomSpeechTime = GET_GAME_TIMER() + 15000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (IS_ENTITY_ON_SCREEN(missionTrain) OR IS_ENTITY_ON_SCREEN(GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)))
|
|
AND (GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), missionTrain, FALSE) <= 200 OR GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE), FALSE) <= 200)
|
|
IF bDoneSeeTrainSpeech
|
|
IF GET_GAME_TIMER() >= iJumpSucceedingTime + 2000
|
|
DO_RANDOM_SPEECH("EXL3_CHTRAIN")
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iNextRandomSpeechTime
|
|
SET_NEXT_RANDOM_SPEECH_TIME(GET_RANDOM_INT_IN_RANGE(4000, 6000))
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iNextRandomSpeechTime
|
|
SET_NEXT_RANDOM_SPEECH_TIME(GET_RANDOM_INT_IN_RANGE(1000, 3000))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bObjectiveIsJump
|
|
IF NOT DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_ALL_BLIPS()
|
|
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_PATH_START), TRUE)
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
SET_BLIP_COLOUR(gotoBlip, BLIP_COLOUR_BLUE)
|
|
SET_BLIP_ROUTE_COLOUR(gotoBlip, BLIP_COLOUR_BLUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(gotoBlip)
|
|
IF iCurrentJump >= 0
|
|
AND iCurrentJump < 4
|
|
IF GET_GAME_TIMER() >= iRemovedJumpBlipTime + 1000
|
|
IF NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
|
|
REMOVE_ALL_BLIPS()
|
|
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_JUMP_COORDS(iCurrentJump), TRUE)
|
|
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), GET_JUMP_COORDS(iCurrentJump) + <<0,0,1.5>>, -1, SLF_WHILE_NOT_IN_FOV)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE))
|
|
ENDIF
|
|
|
|
INT i
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
//IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
IF NOT bObjectiveIsJump
|
|
IF bOnBike
|
|
// is player near a jump
|
|
IF vPlayerPos.z >= 59.0
|
|
INT iFoundPlayer = -1
|
|
INT iFoundTrain = -1
|
|
REPEAT NUMBER_JUMPS i
|
|
IF iFoundPlayer < 0
|
|
IF IS_PLAYER_AT_JUMP(i)
|
|
iFoundPlayer = i
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT NUMBER_JUMPS i
|
|
IF iFoundTrain < 0
|
|
IF IS_CARRIAGE_AT_JUMP(i)
|
|
iFoundTrain = i
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iFoundPlayer >= 0
|
|
AND iFoundTrain >= 0
|
|
iCurrentJump = iFoundTrain
|
|
MAKE_BIKE_EASY_TO_LAND()
|
|
REMOVE_ALL_BLIPS()
|
|
BLOCK_GPS_FOR_JUMPS()
|
|
bObjectiveIsJump = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bOnBike
|
|
IF NOT bShownJumpPrompt
|
|
//bShownJumpPrompt = TRUE
|
|
bShownJumpPrompt = DO_MISSION_HELP_TEXT("TC_JUMP")
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_JUMP")
|
|
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_PATHLP")
|
|
CLEAR_HELP(FALSE)
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() >= iCheckClosestCarriageTime
|
|
iClosestCarriage = GET_CLOSEST_CARRIAGE(<<0,0,0>>)
|
|
iCheckClosestCarriageTime = GET_GAME_TIMER() + 250
|
|
ENDIF
|
|
|
|
// check to see if player is on train through some gta pro techniques
|
|
IF IS_PLAYER_ON_TRAIN_WITH_BIKE()
|
|
bJumpSucceeding = TRUE
|
|
iJumpSucceedingTime = GET_GAME_TIMER()
|
|
DISABLE_LEAVE_BIKE_ON_TRAIN()
|
|
//APPLY_HELPER_FORCE_TO_BIKE_ON_TRAIN()
|
|
|
|
//IF missionFailState = MISSION_FAIL_STATE_WAIT_FOR_FADE
|
|
// missionFailState = MISSION_FAIL_STATE_NOT_FAILED
|
|
//ENDIF
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
|
|
|
|
fPlayerIsOnTrainTimer = fPlayerIsOnTrainTimer +@ 1.0
|
|
IF fPlayerIsOnTrainTimer >= 0.10//0.4
|
|
//iClosestCarriage = GET_CLOSEST_CARRIAGE(<<0,0,0>>)
|
|
IF checkFirstJumpState = CHECK_FIRST_JUMP_STATE_CHECKING
|
|
PRINTSTRING("better than CJ!") PRINTNL()
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(EXL3_JUMPED_AT_FIRST_OPPERTUNITY)
|
|
ENDIF
|
|
|
|
bRunningCutscene = TRUE
|
|
//SET_MISSION_STAGE(STAGE_DRIVE_ALONG_TRAIN)
|
|
ENDIF
|
|
ELSE
|
|
// helper forces to assist towards
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
VEHICLE_INDEX closestCarriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage)
|
|
IF IS_VEHICLE_DRIVEABLE(closestCarriageVehicle)
|
|
VECTOR vBikePos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE])
|
|
VECTOR vCarriagePos = GET_ENTITY_COORDS(closestCarriageVehicle)
|
|
|
|
//PRINTFLOAT(GET_ENTITY_HEIGHT_ABOVE_GROUND(trainCrashVehicle[TCV_BIKE])) printnl()
|
|
IF IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
|
|
IF NOT IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_BIKE], <<2533.68359, 5680.99170, 61.13281>>, <<42,42,42>>, FALSE, FALSE)
|
|
IF GET_ENTITY_HEIGHT_ABOVE_GROUND(trainCrashVehicle[TCV_BIKE]) >= 2//3
|
|
//IF IS_ENTITY_AT_ENTITY(trainCrashVehicle[TCV_BIKE], closestCarriageVehicle, <<12,12,12>>, FALSE, FALSE)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(trainCrashVehicle[TCV_BIKE], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(closestCarriageVehicle, <<0, 14, 2.5>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(closestCarriageVehicle, <<0, -14, 6.9>>), 12.0) // height was prev 4.8
|
|
|
|
|
|
IF vBikePos.z >= vCarriagePos.z + 2.5//5.0//5.0
|
|
VECTOR vOffset = vBikePos - vCarriagePos
|
|
//PRINTSTRING("vOffset = ") PRINTVECTOR(vOffset) PRINTNL()
|
|
|
|
VECTOR vForce = <<-vOffset.x, -vOffset.y, 0>>
|
|
vForce *= <<1.7,1.7,1.7>>//<<3.4,3.4,3.4>>//<<5.0,5.0,5.0>>//<<3.15,3.15,3.15>>
|
|
//PRINTSTRING("vForce = ") PRINTVECTOR(vForce) PRINTNL()
|
|
|
|
VECTOR vVelocity = GET_ENTITY_VELOCITY(trainCrashVehicle[TCV_BIKE])
|
|
//PRINTSTRING("vVelocity = ") PRINTVECTOR(vVelocity) PRINTNL()
|
|
|
|
VECTOR vVelocityDiff = vOffset - vVelocity
|
|
//vVelocityDiff *= <<0.95,0.95,0.95>>
|
|
vVelocityDiff = <<2.7, 2.7, 2.7>>//<<5.4,5.4,5.4>>//<<8,8,8>>//<<10,10,10>>
|
|
//vVelocityDiff=vVelocityDiff
|
|
//PRINTSTRING("vVelocityDiff = ") PRINTVECTOR(vVelocityDiff) PRINTNL()
|
|
|
|
vForce.x += (vVelocityDiff.x)
|
|
vForce.y += (vVelocityDiff.y)
|
|
|
|
VECTOR vCarriageVelocity = GET_ENTITY_VELOCITY(closestCarriageVehicle)
|
|
|
|
vCarriageVelocity *= <<0.025, 0.025, 0.025>>//<<0.05,0.05,0>>//<<0.08, 0.08, 0>>
|
|
//PRINTSTRING("carriage vel = ") PRINTVECTOR(vCarriageVelocity) PRINTNL()
|
|
vForce += vCarriageVelocity
|
|
|
|
//PRINTSTRING("force = ") PRINTVECTOR(vForce) PRINTNL()
|
|
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_BIKE], APPLY_TYPE_FORCE, vForce, 0, FALSE, TRUE)
|
|
ENDIF
|
|
bJumpSucceeding = TRUE
|
|
iJumpSucceedingTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//PRINTSTRING("bikepos = ") PRINTVECTOR(vBikePos) PRINTNl()
|
|
//PRINTSTRING("carriagepos = ") PRINTVECTOR(vCarriagePos) PRINTNl()
|
|
//PRINTSTRING("dist = ") PRINTFLOAT(GET_DISTANCE_BETWEEN_COORDS(vBikePos, vCarriagePos, FALSE)) PRINTNl()
|
|
//PRINTSTRING("speed = ") PRINTFLOAT(GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE])) PRINTNl()
|
|
|
|
// check to see if should be doing in air audio scene
|
|
IF vBikePos.z >= vCarriagePos.z + 4.5
|
|
AND GET_DISTANCE_BETWEEN_COORDS(vBikePos, vCarriagePos, FALSE) < 10.0
|
|
AND GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE]) >= 18.0
|
|
bDoBikeJumpAudioScene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bJumpSucceeding
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
|
|
ELSE
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_HARD)
|
|
ENDIF
|
|
|
|
fPlayerIsOnTrainTimer = 0.0
|
|
|
|
// otherwise update the next jump
|
|
IF iCurrentJump < 3
|
|
IF vPlayerPos.y > GET_JUMP_Y_LIMIT(iCurrentJump)
|
|
OR NOT IS_CARRIAGE_AT_JUMP(iCurrentJump)
|
|
BOOL bFoundNewJump = FALSE
|
|
FOR i=iCurrentJump+1 TO NUMBER_JUMPS-1
|
|
IF NOT bFoundNewJump
|
|
IF IS_CARRIAGE_AT_JUMP(i)
|
|
IF vPlayerPos.y < GET_JUMP_Y_LIMIT(i)
|
|
iCurrentJump = i
|
|
IF iCurrentJump < 4
|
|
bDoPathHelp = TRUE
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_BLIP(gotoBlip)
|
|
ENDIF
|
|
iRemovedJumpBlipTime = GET_GAME_TIMER()
|
|
bFoundNewJump = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
//IF NOT bFoundNewJump
|
|
// IF DOES_BLIP_EXIST(gotoBlip)
|
|
// REMOVE_BLIP(gotoBlip)
|
|
// ENDIF
|
|
// iCurrentJump = 3
|
|
//ENDIF
|
|
ENDIF
|
|
ELSE
|
|
VEHICLE_INDEX carriageVehicle = GET_TRAIN_CARRIAGE(missionTrain, EXILE3_LAST_CARRIAGE)
|
|
IF IS_VEHICLE_DRIVEABLE(carriageVehicle)
|
|
VECTOR vCarriagePos = GET_ENTITY_COORDS(carriageVehicle)
|
|
IF vCarriagePos.x < 2345.36
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_JUMP")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_DRVTRN")
|
|
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
REMOVE_ALL_BLIPS()
|
|
MISSION_FAILED(FAIL_MISSED_JUMPS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bOnBike
|
|
IF NOT bShownPathHelp
|
|
IF bDoPathHelp
|
|
IF CAN_ADVANCE_MISSION()
|
|
IF NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
|
|
AND NOT bJumpSucceeding
|
|
AND DOES_BLIP_EXIST(gotoBlip)
|
|
AND iCurrentJump < 4
|
|
IF vPlayerPos.y < 5900
|
|
bShownPathHelp = DO_MISSION_HELP_TEXT("TC_PATHLP")
|
|
ELSE
|
|
bShownPathHelp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vJumpCoords = GET_JUMP_COORDS(iCurrentJump)
|
|
CONST_FLOAT MARKER_SIZE 2.5
|
|
IF bOnBike
|
|
IF CAN_ADVANCE_MISSION()
|
|
//DRAW_MARKER(MARKER_CYLINDER, vJumpCoords, <<0,0,0>>, <<0,0,0>>, <<MARKER_SIZE,MARKER_SIZE,MARKER_SIZE>>, 255, 255, 0, 178)
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vJumpCoords, <<LOCATE_SIZE_ON_FOOT_ONLY, LOCATE_SIZE_ON_FOOT_ONLY, LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/*
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vJumpCoords, <<3.0, 3.0, LOCATE_SIZE_HEIGHT>>)
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
IF GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE]) >= 12.0
|
|
IF DOES_BIKE_MATCH_JUMP_HEADING(iCurrentJump)
|
|
IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED
|
|
IF iCurrentJump = 0
|
|
//INFORM_STAT_EXILE_THREE_FIRST_JUMP_SUCCESS()
|
|
ENDIF
|
|
bRunningCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// check stat
|
|
SWITCH checkFirstJumpState
|
|
CASE CHECK_FIRST_JUMP_STATE_NOT_STARTED
|
|
IF bJumpSucceeding
|
|
VECTOR vPlayerPosForJump
|
|
vPlayerPosForJump = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
IF vPlayerPosForJump.y < 5408
|
|
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_CHECKING
|
|
iCheckFirstJumpStateTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE CHECK_FIRST_JUMP_STATE_CHECKING
|
|
IF NOT bJumpSucceeding
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
IF NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
|
|
IF GET_GAME_TIMER() >= iCheckFirstJumpStateTime + 3000
|
|
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_DONE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//PRINTINT(ENUM_TO_INT(checkFirstJumpState)) PRINTNL()
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
IF bDoBikeJumpAudioScene
|
|
IF NOT bDoneBikeJumpAudioScene
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
|
|
bDoneBikeJumpAudioScene = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF bDoneBikeJumpAudioScene
|
|
BOOL bAllowCancelScene = FALSE
|
|
|
|
IF fPlayerIsOnTrainTimer > 0.0
|
|
bAllowCancelScene = TRUE
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(trainCrashVehicle[TCV_BIKE])
|
|
OR NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_BIKE])
|
|
bAllowCancelScene = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bAllowCancelScene = TRUE
|
|
ENDIF
|
|
|
|
IF bAllowCancelScene
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_BIKE_JUMP)
|
|
bDoneBikeJumpAudioScene = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
DO_JUMP_ONTO_TRAIN_CUTSCENE()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set bike to player pos
|
|
PROC SET_BIKE_TO_PLAYER_POS(FLOAT fPhase)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
AND IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
VECTOR vPos
|
|
vPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(missionTrain, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "EX03_TRAIN_BIKE_SCENE", <<0,0,0>>, <<0,0,0>>, fPhase), GET_ENTITY_HEADING(PLAYER_PED_ID()), <<0, 0.23, -0.69>>)) //+ <<0, 0.23 + (JACK_TRAIN_SPEED * GET_FRAME_TIME()), -0.69>>)
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(trainCrashVehicle[TCV_BIKE], vpos)
|
|
SET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE], GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_BIKE], TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// knock out driver cutscene procedure
|
|
PROC DO_KNOCK_OUT_DRIVER_CUTSCENE()
|
|
SWITCH cutsceneStage
|
|
CASE TC_CUT_STAGE_INIT
|
|
SET_MISSION_CUTSCENE(TRUE,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,FALSE)
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_TRAIN_ROOF")
|
|
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HIJACK_TRAIN)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
fTrainCruiseSpeed = JACK_TRAIN_SPEED
|
|
SET_TRAIN_CRUISE_SPEED(missionTrain, fTrainCruiseSpeed)
|
|
SET_TRAIN_SPEED(missionTrain, fTrainCruiseSpeed)
|
|
ENDIF
|
|
|
|
INT i
|
|
REPEAT NUMBER_CLIMB_ENEMIES i
|
|
IF DOES_ENTITY_EXIST(climbEnemy[i].ped)
|
|
DELETE_PED(climbEnemy[i].ped)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
AND IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(<<0,0,0>>)
|
|
|
|
BOOL bEnteredWithHelmet
|
|
INT iHelmet
|
|
INT iTex
|
|
iHelmet = GET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD)
|
|
IF iHelmet = 9
|
|
OR iHelmet = 11
|
|
OR iHelmet = 23
|
|
iTex = GET_PED_PROP_TEXTURE_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD)
|
|
bEnteredWithHelmet = TRUE
|
|
ELSE
|
|
bEnteredWithHelmet = FALSE
|
|
ENDIF
|
|
|
|
// trevor
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0,0,10>>)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "EX03_TRAIN_BIKE_SCENE", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
IF bEnteredWithHelmet
|
|
GIVE_PED_HELMET(PLAYER_PED_ID(), TRUE, PV_FLAG_DEFAULT_HELMET, iTex)
|
|
SET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD, iHelmet, iTex)
|
|
ENDIF
|
|
|
|
// driver
|
|
IF NOT IS_PED_INJURED(engineerPed[0])
|
|
SET_ENTITY_COORDS(engineerPed[0], GET_ENTITY_COORDS(engineerPed[0]) + <<0,0,10>>)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(engineerPed[0])
|
|
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "EX03_TRAIN_BIKE_SCENE_DRIVER", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
SET_ENTITY_COLLISION(engineerPed[0], FALSE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(engineerPed[0])
|
|
ENDIF
|
|
|
|
// train
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(missionTrain, iSyncScene, "EX03_TRAIN_BIKE_SCENE_TRAIN", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), INSTANT_BLEND_IN)
|
|
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, FALSE)
|
|
|
|
IF bLoadedHitDriverAudio
|
|
PLAY_SYNCHRONIZED_AUDIO_EVENT(iSyncScene)
|
|
ENDIF
|
|
|
|
SET_BIKE_TO_PLAYER_POS(0)
|
|
|
|
// camera
|
|
CREATE_CAM_ATTACHED_TO_TRAIN("EX03_TRAIN_BIKE_SCENE_CAM")
|
|
ENDIF
|
|
|
|
bDoneFlash = FALSE
|
|
iTrainCrashCutsceneTime = GET_GAME_TIMER()
|
|
cutsceneStage = TC_CUT_STAGE_RUNNING
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_RUNNING
|
|
#IF IS_DEBUG_BUILD
|
|
// DO_DEBUG_TRAIN_CAM_POSITION()
|
|
#ENDIF
|
|
|
|
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SWITCH jackingTrainShot
|
|
CASE JACKING_TRAIN_OFF_BIKE
|
|
FLOAT fPhase
|
|
fPhase = 0.0
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene)
|
|
ENDIF
|
|
|
|
IF NOT bDetachedBike
|
|
SET_BIKE_TO_PLAYER_POS(fPhase)
|
|
|
|
IF GET_GAME_TIMER() >= iTrainCrashCutsceneTime + 200
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_BIKE], FALSE)
|
|
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BIKE], 32.0) // 43
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_BIKE], APPLY_TYPE_IMPULSE, <<-2.1,3.2,0>>, 0, TRUE, TRUE) //<<-3,4,0>>
|
|
bDetachedBike = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
IF NOT bDoneEnterCabSpeech
|
|
IF fPhase >= 0.85
|
|
bDoneEnterCabSpeech = DO_MISSION_SPEECH("EXL3_DRIVER", FALSE, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF NOT bDoneFlash
|
|
IF fPhase >= 0.982
|
|
PRINTSTRING("flash time = ") PRINTINT(GET_GAME_TIMER() - iTrainCrashCutsceneTime) PRINTNL()
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bDoneFlash = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fPhase >= 0.995
|
|
|
|
iTrainCrashCutsceneTime = GET_GAME_TIMER()
|
|
jackingTrainShot = JACKING_TRAIN_BASH_DRIVER
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
iTrainCrashCutsceneTime = GET_GAME_TIMER()
|
|
cutsceneStage = TC_CUT_STAGE_CLEANUP
|
|
//IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
// SET_HORN_ENABLED(missionTrain, FALSE)
|
|
//ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
|
|
/*
|
|
CASE JACKING_TRAIN_BASH_DRIVER
|
|
IF iBashSpeechStage < iBashedDriverCount
|
|
IF DO_MISSION_SPEECH("EXL3_DRIVER", FALSE, 2)
|
|
iBashSpeechStage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iFightStage
|
|
CASE 0 // intro
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99
|
|
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(<<0,0,0>>)
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_idle_driver", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
CREATE_CAM_ATTACHED_TO_TRAIN("ex03_attack_driver_idle_cam")
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, TRUE)
|
|
bLoadedHitDriverAudio = FALSE
|
|
bSetSceneAudioEntity = FALSE
|
|
//PRINT_HELP_FOREVER("TC_FIGHLP1")
|
|
iFightStage = 1
|
|
ENDIF
|
|
BREAK
|
|
CASE 1 // loop
|
|
//DISPLAY_HELP_TEXT_THIS_FRAME("TC_FIGHLP1", FALSE)
|
|
//IF IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
|
|
IF NOT bLoadedHitDriverAudio
|
|
IF NOT bSetSceneAudioEntity
|
|
INIT_SYNCH_SCENE_AUDIO_WITH_ENTITY("EX03_ATTACK_DRIVER_OUTRO", PLAYER_PED_ID())
|
|
//SET_SYNCH_SCENE_AUDIO_ENTITY(PLAYER_PED_ID())
|
|
bSetSceneAudioEntity = TRUE
|
|
ENDIF
|
|
bLoadedHitDriverAudio = PREPARE_SYNCHRONIZED_AUDIO_EVENT("EX03_ATTACK_DRIVER_OUTRO", 0)
|
|
ELSE
|
|
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(<<0,0,0>>)
|
|
IF iBashedDriverCount < 0
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_impact", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_impact_driver", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
CREATE_CAM_ATTACHED_TO_TRAIN("ex03_attack_driver_impact_cam")
|
|
iFightStage = 2
|
|
ELSE
|
|
CLEAR_HELP(FALSE)
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_outro", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_outro_driver", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_NONE, RBF_VEHICLE_IMPACT)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(missionTrain, INSTANT_BLEND_OUT, TRUE)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(missionTrain, iSyncScene, "ex03_attack_driver_outro_train", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), INSTANT_BLEND_IN)
|
|
PLAY_SYNCHRONIZED_AUDIO_EVENT(iSyncScene)
|
|
CREATE_CAM_ATTACHED_TO_TRAIN("ex03_attack_driver_outro_cam")
|
|
iFightStage = 3
|
|
ENDIF
|
|
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, FALSE)
|
|
iBashedDriverCount++
|
|
ENDIF
|
|
|
|
|
|
|
|
|
|
//ENDIF
|
|
BREAK
|
|
CASE 2 // hit
|
|
//DISPLAY_HELP_TEXT_THIS_FRAME("TC_FIGHLP1", FALSE)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.98
|
|
CREATE_SYNCED_SCENE_ATTACHED_TO_TRAIN(<<0,0,0>>)
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(engineerPed[0], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_BIKE_LAND), "ex03_attack_driver_idle_driver", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
CREATE_CAM_ATTACHED_TO_TRAIN("ex03_attack_driver_idle_cam")
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, TRUE)
|
|
|
|
iFightStage = 1
|
|
ENDIF
|
|
BREAK
|
|
CASE 3 // outro
|
|
//IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.60
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.19
|
|
//CREATE_CAM_ATTACHED_TO_TRAIN(TRUE, FALSE, TRAIN_CAM_RIDE_LOW)
|
|
iTrainCrashCutsceneTime = GET_GAME_TIMER()
|
|
cutsceneStage = TC_CUT_STAGE_CLEANUP
|
|
//jackingTrainShot = JACKING_TRAIN_READY_TO_JUMP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
*/
|
|
|
|
CASE JACKING_TRAIN_READY_TO_JUMP
|
|
//IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.98
|
|
// SET_TREVOR_READY_TO_JUMP()
|
|
// cutsceneStage = TC_CUT_STAGE_CLEANUP
|
|
//ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
HANDLE_SKIP_CUTSCENE()
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_CLEANUP
|
|
// back to gameplay
|
|
FORCE_ENGINEER_DEAD(FALSE)
|
|
IF bSkippedCutscene
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
STOP_SYNCHRONIZED_AUDIO_EVENT(iSyncScene)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
PRINTSTRING("end time = ") PRINTINT(GET_GAME_TIMER() - iTrainCrashCutsceneTime) PRINTNL()
|
|
|
|
// WAIT(0)
|
|
//ENDIF
|
|
REPLAY_STOP_EVENT()
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HIJACK_TRAIN)
|
|
SET_MISSION_STAGE(STAGE_GET_TO_BRIDGE, FALSE, FALSE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// drive along the train on the bike
|
|
PROC DO_STAGE_DRIVE_ALONG_TRAIN()
|
|
HANDLE_MERC_PICKUP()
|
|
|
|
IF NOT bRunningCutscene
|
|
DISABLE_LEAVE_BIKE_ON_TRAIN()
|
|
|
|
IF NOT bLoadedHitDriverAudio
|
|
IF NOT bSetSceneAudioEntity
|
|
INIT_SYNCH_SCENE_AUDIO_WITH_ENTITY("EX03_TRAIN_BIKE_LAND", PLAYER_PED_ID())
|
|
bSetSceneAudioEntity = TRUE
|
|
ENDIF
|
|
bLoadedHitDriverAudio = PREPARE_SYNCHRONIZED_AUDIO_EVENT("EX03_TRAIN_BIKE_LAND", 0)
|
|
ENDIF
|
|
|
|
HANDLE_CREATE_ENGINEER(TRUE)
|
|
|
|
IF bTempPreventStillVehicleState
|
|
IF GET_GAME_TIMER() <= iStageStartTime + 200
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
ELSE
|
|
bTempPreventStillVehicleState = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
// extra speed on bike
|
|
IF GET_GAME_TIMER() < iStageStartTime + 4000
|
|
APPLY_HELPER_FORCE_TO_BIKE_ON_TRAIN()
|
|
ENDIF
|
|
|
|
//PRINTSTRING("playerpos = ") PRINTVECTOR(vPlayerPos) PRINTNL()
|
|
//PRINTSTRING("enginepos = ") PRINTVECTOR(GET_ENTITY_COORDS(missionTrain)) PRINTNL()
|
|
|
|
VECTOR vTrainPos = GET_ENTITY_COORDS(missionTrain)
|
|
IF vTrainPos.x <= TRAIN_STOP_X
|
|
bStopTrain = TRUE
|
|
MISSION_FAILED(FAIL_TRAIN_STOPPED)
|
|
ENDIF
|
|
|
|
iClosestCarriage = GET_CLOSEST_CARRIAGE(<<0,0,0>>)
|
|
IF iClosestCarriage <> iCachedCarriage
|
|
IF IS_PLAYER_ON_TRAIN_WITH_BIKE()
|
|
PRINTSTRING("play sound!") printnl()
|
|
PLAY_SOUND_FROM_ENTITY(-1, "EXILE_3_TYRE_CHIRPS_MASTER", trainCrashVehicle[TCV_BIKE])
|
|
ENDIF
|
|
ENDIF
|
|
iCachedCarriage = iClosestCarriage
|
|
|
|
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
//DO_RANDOM_SPEECH("EXL3_DRTRAIN")
|
|
IF GET_ENTITY_SPEED(trainCrashVehicle[TCV_BIKE]) >= 29
|
|
DO_RANDOM_SPEECH("EXL3_PANIC")
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(trainBlip)
|
|
REMOVE_ALL_BLIPS()
|
|
REMOVE_MISSION_TEXT(FALSE)
|
|
trainBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(missionTrain)
|
|
ENDIF
|
|
IF NOT bShownGodText
|
|
bShownGodText = DO_MISSION_GOD_TEXT("TC_DRVTRN")
|
|
ENDIF
|
|
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), missionTrain, <<16.0, 16.0, 2.0>>, FALSE, FALSE)
|
|
VECTOR vEnginePos = GET_ENTITY_COORDS(missionTrain)
|
|
IF vPlayerPos.z > vEnginePos.z + 2.0
|
|
IF CAN_ADVANCE_MISSION()
|
|
bRunningCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// mission stage put back if falling off
|
|
IF NOT bRunningCutscene
|
|
IF IS_VEHICLE_DRIVEABLE(GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage))
|
|
VECTOR vClosestCarriageCoord = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(missionTrain, iClosestCarriage))
|
|
|
|
IF vPlayerPos.z < vClosestCarriageCoord.z + 1.6
|
|
IF vTrainPos.y >= 6247
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("TC_JUMP")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("TC_DRVTRN")
|
|
REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
REMOVE_ALL_BLIPS()
|
|
MISSION_FAILED(FAIL_FELL_OFF_TRAIN)
|
|
ELSE
|
|
IF CAN_ADVANCE_MISSION()
|
|
bPreparedSeeTrainCue = TRUE
|
|
bDoneSeeTrainCue = TRUE
|
|
bPreparedLandOnTrainCue = TRUE
|
|
bDoneLandOnTrainCue = TRUE
|
|
checkFirstJumpState = CHECK_FIRST_JUMP_STATE_DONE
|
|
SET_MISSION_STAGE(STAGE_CHASE_TRAIN)
|
|
trainMovementState = TRAIN_MOVEMENT_CATCHUP
|
|
bSlowDownTrainForCatchup = TRUE
|
|
bDoneSeeTrainAudioScene = FALSE
|
|
bObjectiveIsJump = TRUE
|
|
bDoneJumpSpeech = TRUE
|
|
bShownJumpPrompt = TRUE
|
|
bDoneGetBombsSpeech = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
DO_KNOCK_OUT_DRIVER_CUTSCENE()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// bridge smash
|
|
PROC HANDLE_BRIDGE_RAYFIRE(BOOL bDoSmashWhenPrimed, BOOL bSkipStraightToEnd = FALSE)
|
|
SWITCH iBridgeSmashStage
|
|
CASE 0
|
|
bridgeRayfire = GET_RAYFIRE_MAP_OBJECT(<<-532.305359, 4551.624023, 95.641785>>, 5, "DES_traincrash")
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) <> RFMO_STATE_SYNC_STARTING
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_RESET)
|
|
ENDIF
|
|
iBridgeSmashStage++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_PRIMING)
|
|
iBridgeSmashStage++
|
|
ELSE
|
|
iBridgeSmashStage = 0
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_PRIMED
|
|
IF bDoSmashWhenPrimed
|
|
IF NOT bSkipStraightToEnd
|
|
IF bLoadedCrashStream
|
|
PLAY_STREAM_FRONTEND()
|
|
ENDIF
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_START_ANIM)
|
|
iBridgeSmashStage++
|
|
ELSE
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_ENDING)
|
|
iBridgeSmashStage++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iBridgeSmashStage = 0
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
printint(enum_to_int(GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire))) printnl()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_MICHAEL_AT_BRIDGE()
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_ENTITY_VISIBLE(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_DINGHY], TRUE, TRUE)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 006, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 5500)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
//ENDIF
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// train crash cutscene procedure
|
|
PROC DO_TRAIN_CRASH_CUTSCENE()
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
|
|
SWITCH cutsceneStage
|
|
CASE TC_CUT_STAGE_INIT
|
|
REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<-490.5, 4407.6, 30.4>>)
|
|
//IF NOT bRegisteredJump
|
|
// DISPLAY_HELP_TEXT_THIS_FRAME("TC_JUMHLP", TRUE)
|
|
//ENDIF
|
|
IF NOT bStartedIPLSwap
|
|
IPL_GROUP_SWAP_START("railing_start", "railing_end")
|
|
ENDIF
|
|
bStartedIPLSwap = FALSE
|
|
HANDLE_BRIDGE_RAYFIRE(TRUE)
|
|
// temp before register
|
|
|
|
WAIT(0)
|
|
DELETE_TRAIN_CRASH_TRAINS()
|
|
|
|
CLEAR_AREA(<<-516.68, 4425.17, 92.99>>, 150.0, TRUE)
|
|
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
SET_MISSION_CUTSCENE(TRUE)
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
|
|
|
|
iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-508.64059, 4426.66016, 80.85294>>, <<0.0, 0.0, 7.81>>)
|
|
|
|
DESTROY_MISSION_STATIC_CAM(staticCam)
|
|
CREATE_MISSION_ANIM_CAM()
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "Traincrash_revised_CAM", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_CRASH))
|
|
//SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.1063)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, FALSE)
|
|
|
|
RESET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct)
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
DESTROY_MISSION_STATIC_CAM(fpsCam.theCam)
|
|
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAYFIRE)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_COLLISION)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_BRIDGE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
//BEGIN_SRL()
|
|
|
|
|
|
// attach trevor to anchor
|
|
/*
|
|
VECTOR vTrainAnchorStart
|
|
VECTOR vTrainAnchorEnd
|
|
vTrainAnchorStart = <<-516.51398, 4430.62598, 89.83>> //<<-528.36, 4519.64, 89.83>>
|
|
vTrainAnchorEnd = <<-505.51242, 4353.57080, 89.83>> //<<-514.73, 4420.41, 89.83>>
|
|
fTrainAnchorAngle = GET_HEADING_FROM_VECTOR_2D(vTrainAnchorEnd.x - vTrainAnchorStart.x, vTrainAnchorEnd.y - vTrainAnchorStart.y)
|
|
|
|
vTrainJumpAnchorPos = vTrainAnchorStart
|
|
CONST_FLOAT TIME_TO_CRASH 2.77//2.75
|
|
vTrainJumpAnchorSpeed.x = (vTrainAnchorEnd.x - vTrainAnchorStart.x) / TIME_TO_CRASH
|
|
vTrainJumpAnchorSpeed.y = (vTrainAnchorEnd.y - vTrainAnchorStart.y) / TIME_TO_CRASH
|
|
|
|
trainJumpAnchorObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ANCHOR), vTrainJumpAnchorPos)
|
|
SET_ENTITY_COORDS(trainJumpAnchorObject, vTrainJumpAnchorPos)
|
|
SET_ENTITY_ROTATION(trainJumpAnchorObject, <<0,0,fTrainAnchorAngle>>)
|
|
FREEZE_ENTITY_POSITION(trainJumpAnchorObject, TRUE)
|
|
SET_ENTITY_VISIBLE(trainJumpAnchorObject, FALSE)
|
|
SET_ENTITY_COLLISION(trainJumpAnchorObject, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(trevorPed)
|
|
DETACH_ENTITY(trevorPed)
|
|
CONST_FLOAT JUMP_INIT_PHASE 0.41//0.42
|
|
vTrainJumpRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_TRAIN_ROOF_JUMP", <<0,0,0>>, <<0,0,0>>, JUMP_INIT_PHASE)
|
|
vTrainJumpOffset = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_TRAIN_ROOF_JUMP", <<0,0,0>>, <<0,0,0>>, JUMP_INIT_PHASE)
|
|
ATTACH_ENTITY_TO_ENTITY(trevorPed, trainJumpAnchorObject, 0, vTrainJumpOffset, vTrainJumpRot)
|
|
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_TRAIN_ROOF_JUMP", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET, JUMP_INIT_PHASE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
|
|
bDoneJumpOff = TRUE
|
|
ENDIF
|
|
*/
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
DETACH_ENTITY(trevorPed)
|
|
REMOVE_PED_HELMET(trevorPed, TRUE)
|
|
TASK_SYNCHRONIZED_SCENE(trevorPed, iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_CRASH), "traincrash_revised_trevor", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
|
|
bDoneJumpOff = TRUE
|
|
ENDIF
|
|
|
|
// sort out michael
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
AND NOT IS_PED_INJURED(michaelPed)
|
|
IF NOT IS_PED_IN_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
BRING_VEHICLE_TO_HALT(trainCrashVehicle[TCV_DINGHY], 25.0, 1)
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-490.5, 4407.6, 30.4>>)
|
|
SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], 79.0)
|
|
SET_ENTITY_VISIBLE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_DINGHY], FALSE, TRUE)
|
|
ENDIF
|
|
STOP_VEHICLE_FIRE(trainCrashVehicle[TCV_DINGHY])
|
|
|
|
IF bPreparedSideOnCue
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_TUNNEL_EXIT")
|
|
ENDIF
|
|
|
|
iTrainCrashCutsceneTime = GET_GAME_TIMER()
|
|
|
|
IF STREAMVOL_IS_VALID(bridgeVolume)
|
|
STREAMVOL_DELETE(bridgeVolume)
|
|
ENDIF
|
|
//bridgeVolume = STREAMVOL_CREATE_FRUSTUM(<<-493.1, 4382.7, 99.2>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-13.4, 0.0, 35.0>>), 100, FLAG_MAPDATA)
|
|
|
|
bDoneFlash = FALSE
|
|
|
|
cutsceneStage = TC_CUT_STAGE_RUNNING
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_RUNNING
|
|
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
|
|
HANDLE_BRIDGE_RAYFIRE(TRUE)
|
|
|
|
//SET_SRL_TIME(TO_FLOAT(GET_GAME_TIMER() - iTrainCrashCutsceneTime))
|
|
|
|
SWITCH trainCrashShot
|
|
CASE TRAIN_CRASH_RAYFIRE
|
|
IF bSpedUp
|
|
fTimeScale = fTimeScale +@ 0.52
|
|
IF fTimeScale > 1
|
|
fTimeScale = 1
|
|
ENDIF
|
|
SET_TIME_SCALE(fTimeScale)
|
|
ENDIF
|
|
|
|
FLOAT fRayfirePhase
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
fRayfirePhase = GET_RAYFIRE_MAP_OBJECT_ANIM_PHASE(bridgeRayfire)
|
|
printstring("PHASE = ") PRINTFLOAT(fRayfirePhase) PRINTNL()
|
|
|
|
IF fRayfirePhase >= 0.0687
|
|
START_DEBRIS_FX()
|
|
fRayfireEvolution = fRayfireEvolution +@ 0.09
|
|
IF fRayfireEvolution > 1
|
|
fRayfireEvolution = 1
|
|
ENDIF
|
|
PRINTSTRING("evo = ") PRINTFLOAT(fRayfireEvolution) PRINTNL()
|
|
SET_DEBRIS_EVOLUTION(fRayfireEvolution)
|
|
ENDIF
|
|
|
|
IF NOT bDoneCamShake
|
|
IF fRayfirePhase >= 0.688
|
|
SHAKE_CAM(animCam, "SMALL_EXPLOSION_SHAKE", 0.15)
|
|
bDoneCamShake = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSlowedDown
|
|
IF fRayfirePhase >= 0.0274
|
|
fTimeScale = 0.5
|
|
SET_TIME_SCALE(fTimeScale)
|
|
bSlowedDown = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSpedUp
|
|
IF fRayfirePhase >= 0.127
|
|
bSpedUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH swapCarriageState
|
|
CASE SWAP_CARRIAGE_STATE_NOT_STARTED
|
|
printstring("here1") printnl()
|
|
swapCarriageState = SWAP_CARRIAGE_STATE_WAITING
|
|
BREAK
|
|
CASE SWAP_CARRIAGE_STATE_WAITING
|
|
printstring("here2") printnl()
|
|
|
|
IF fRayfirePhase >= 0.0
|
|
IF IPL_GROUP_SWAP_IS_READY()
|
|
printstring("ready") printnl()
|
|
ENDIF
|
|
ENDIF
|
|
//IF fRayfirePhase >= 0.15
|
|
// IF STREAMVOL_IS_VALID(bridgeVolume)
|
|
// STREAMVOL_DELETE(bridgeVolume)
|
|
// ENDIF
|
|
//ENDIF
|
|
|
|
IF fRayfirePhase >= 0.95
|
|
//BOOL bAdvance
|
|
//BOOL bCancel
|
|
//bAdvance = FALSE
|
|
//bCancel = FALSE
|
|
|
|
IF IPL_GROUP_SWAP_IS_READY()
|
|
printstring("here3A") printnl()
|
|
//bAdvance = TRUE
|
|
IPL_GROUP_SWAP_FINISH()
|
|
ELSE
|
|
printstring("here4") printnl()
|
|
IPL_GROUP_SWAP_CANCEL()
|
|
//bAdvance = TRUE
|
|
//bCancel = TRUE
|
|
ENDIF
|
|
|
|
|
|
|
|
//IF bAdvance
|
|
//SET_TRAIN_CRASH_GEO(TRUE, TRUE, TRUE, FALSE, TRUE)
|
|
SET_TRAIN_CRASH_GEO(TRUE, TRUE, TRUE, FALSE, TRUE)
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_ENDING)
|
|
swapCarriageState = SWAP_CARRIAGE_STATE_DONE
|
|
|
|
//ENDIF
|
|
|
|
//IF bCancel
|
|
|
|
//ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE SWAP_CARRIAGE_STATE_DONE
|
|
SWITCH gotoFoamState
|
|
CASE GOTO_FOAM_STATE_NOT_STARTED
|
|
PRINTINT(ENUM_tO_iNT(GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire))) PRINTNL()
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_END
|
|
PRINTSTRING("here5") printnl()
|
|
IPL_GROUP_SWAP_START("canyonriver01", "canyonriver01_traincrash")
|
|
gotoFoamState = GOTO_FOAM_STATE_WAITING
|
|
ENDIF
|
|
BREAK
|
|
CASE GOTO_FOAM_STATE_WAITING
|
|
PRINTSTRING("here6") printnl()
|
|
BREAK
|
|
CASE GOTO_FOAM_STATE_DONE
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF NOT bDoneCollisionCue
|
|
IF fRayfirePhase >= 0.186
|
|
IF TRIGGER_MISSION_MUSIC_EVENT("EXL3_TRAIN_CRASH_OS")
|
|
bDoneCollisionCue = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneHitWaterCue
|
|
IF fRayfirePhase >= 0.527
|
|
IF TRIGGER_MISSION_MUSIC_EVENT("EXL3_BRIDGE_FALL")
|
|
bDoneHitWaterCue = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
IF NOT bDoneJumpOff
|
|
bDoneJumpOff = TRUE
|
|
ELSE
|
|
IF NOT bDoneJumpSpeech
|
|
bDoneJumpSpeech = DO_MISSION_SPEECH("EXL3_JUTRAIN")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
FLOAT fSyncScenePhase
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
fSyncScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene)
|
|
ELSE
|
|
fSyncScenePhase = 1.0
|
|
ENDIF
|
|
|
|
// grey car
|
|
IF fSyncScenePhase >= 0.643
|
|
MODIFY_WATER( -508.0, 4419.3, 1.0, 0.5) // 1.4
|
|
ENDIF
|
|
|
|
IF fSyncScenePhase >= 0.643
|
|
MODIFY_WATER( -507.4, 4420.9, 1.0, 0.5)
|
|
ENDIF
|
|
|
|
IF fSyncScenePhase >= 0.643
|
|
MODIFY_WATER( -510.6, 4418.2, 1.0, 0.5)
|
|
ENDIF
|
|
|
|
// engine
|
|
IF fSyncScenePhase >= 0.670
|
|
MODIFY_WATER( -498.5, 4414.0, 1.0, 0.5)
|
|
ENDIF
|
|
|
|
IF fSyncScenePhase >= 0.670
|
|
MODIFY_WATER( -498.0, 4417.8, 1.0, 0.5)
|
|
ENDIF
|
|
|
|
// white car
|
|
IF fSyncScenePhase >= 0.649
|
|
MODIFY_WATER( -501.5, 4426.1, 5.0, 0.5)
|
|
ENDIF
|
|
IF fSyncScenePhase >= 0.806
|
|
MODIFY_WATER( -504.3, 4428.9, 5.0, 0.5)
|
|
ENDIF
|
|
|
|
IF fSyncScenePhase > 0.975
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
|
|
SET_MICHAEL_AT_BRIDGE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
INT i
|
|
REPEAT NUMBER_SPLASHES i
|
|
IF NOT bAddedSplash[i]
|
|
FLOAT fTriggerPhase
|
|
STRING sString
|
|
fTriggerPhase = 2.0
|
|
PED_BONETAG bone
|
|
SWITCH i
|
|
|
|
CASE 0
|
|
fTriggerPhase = 0.489
|
|
sString = "water_splash_ped"
|
|
bone = BONETAG_HEAD
|
|
BREAK
|
|
CASE 1
|
|
fTriggerPhase = 0.495
|
|
sString = "cs_fam5_water_splash_ped_wade"
|
|
bone = BONETAG_SPINE3
|
|
BREAK
|
|
CASE 2
|
|
fTriggerPhase = 0.510
|
|
sString = "cs_fam5_water_splash_ped_in"
|
|
bone = BONETAG_R_HAND
|
|
BREAK
|
|
CASE 3
|
|
fTriggerPhase = 0.515
|
|
sString = "cs_fam5_water_splash_ped_in"
|
|
bone = BONETAG_L_FOREARM
|
|
BREAK
|
|
CASE 4
|
|
fTriggerPhase = 0.547
|
|
sString = "cs_fam5_water_splash_ped_out"
|
|
bone = BONETAG_R_FOREARM
|
|
BREAK
|
|
CASE 5
|
|
fTriggerPhase = 0.549
|
|
sString = "cs_fam5_water_splash_ped_out"
|
|
bone = BONETAG_L_FOREARM
|
|
BREAK
|
|
CASE 6
|
|
fTriggerPhase = 0.805
|
|
sString = "cs_fam5_water_splash_ped_out"
|
|
bone = BONETAG_L_HAND
|
|
BREAK
|
|
CASE 7
|
|
fTriggerPhase = 0.839
|
|
sString = "cs_fam5_water_splash_ped_in"
|
|
bone = BONETAG_R_FOREARM
|
|
BREAK
|
|
CASE 8
|
|
fTriggerPhase = 0.855
|
|
sString = "cs_fam5_water_splash_ped_out"
|
|
bone = BONETAG_L_FOREARM
|
|
BREAK
|
|
CASE 9
|
|
fTriggerPhase = 0.865
|
|
sString = "cs_fam5_water_splash_ped_out"
|
|
bone = BONETAG_L_HAND
|
|
BREAK
|
|
CASE 10
|
|
fTriggerPhase = 0.883
|
|
sString = "cs_fam5_water_splash_ped_in"
|
|
bone = BONETAG_L_HAND
|
|
BREAK
|
|
CASE 11
|
|
fTriggerPhase = 0.889
|
|
sString = "cs_fam5_water_splash_ped_out"
|
|
bone = BONETAG_L_FOOT
|
|
BREAK
|
|
CASE 12
|
|
fTriggerPhase = 0.910
|
|
sString = "cs_fam5_water_splash_ped_in"
|
|
bone = BONETAG_L_FOOT
|
|
BREAK
|
|
CASE 13
|
|
fTriggerPhase = 0.954
|
|
sString = "cs_fam5_water_splash_ped_in"
|
|
bone = BONETAG_R_HAND
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
|
|
IF fSyncScenePhase >= fTriggerPhase
|
|
IF i <> 1
|
|
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE(sString, trevorPed, <<0,0,0>>, <<0,0,0>>, bone)
|
|
ELSE
|
|
wadePTFX = START_PARTICLE_FX_LOOPED_ON_PED_BONE(sString, trevorPed, <<0,0,0>>, <<0,0,0>>, bone)
|
|
ENDIF
|
|
bAddedSplash[i] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//IF swapCarriageState >= SWAP_CARRIAGE_STATE_DONE
|
|
//IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_END
|
|
//IF fSyncScenePhase >= 0.6
|
|
// IF NOT STREAMVOL_IS_VALID(bridgeVolume)
|
|
// bridgeVolume = STREAMVOL_CREATE_SPHERE(<<-401.2, 4436.1, 30.7>>, 30, FLAG_MAPDATA | FLAG_COLLISIONS_MOVER)
|
|
// ENDIF
|
|
//ENDIF
|
|
//
|
|
// ENDIF
|
|
//ENDIF
|
|
|
|
|
|
|
|
IF NOT bDoneFlash
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
IF fSyncScenePhase >= 0.971
|
|
PRINTSTRING("start time = ") PRINTINT(GET_GAME_TIMER() - iTrainCrashCutsceneTime) PRINTNL()
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bDoneFlash = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fSyncScenePhase >= 0.99
|
|
cutsceneStage = TC_CUT_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
HANDLE_SKIP_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE TRAIN_CRASH_MICHAEL_ONTO_CONTAINER
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_CLEANUP
|
|
IF bSkippedCutscene
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX1)
|
|
REMOVE_PARTICLE_FX(debrisFallPTFX1)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX2)
|
|
REMOVE_PARTICLE_FX(debrisFallPTFX2)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX3)
|
|
REMOVE_PARTICLE_FX(debrisFallPTFX3)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisSplashPTFX)
|
|
REMOVE_PARTICLE_FX(debrisSplashPTFX)
|
|
ENDIF
|
|
|
|
bStartedDebrisFX = FALSE
|
|
REMOVE_PARTICLE_FX_IN_RANGE(<<-492, 4435, 34>>, 40)
|
|
WAIT(0)
|
|
ENDIF
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
//END_SRL()
|
|
|
|
// skip to the end...
|
|
//IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
// SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_ENDING)
|
|
//ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(trevorPed)
|
|
SET_ENTITY_COORDS(trevorPed, GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_IN_WATER_INIT))
|
|
SET_ENTITY_HEADING(trevorPed, TREVOR_IN_WATER_INIT_ROT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_MICHAEL_AT_BRIDGE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF STREAMVOL_IS_VALID(bridgeVolume)
|
|
STREAMVOL_DELETE(bridgeVolume)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(wadePTFX)
|
|
STOP_PARTICLE_FX_LOOPED(wadePTFX)
|
|
ENDIF
|
|
|
|
START_DEBRIS_FX()
|
|
SET_DEBRIS_EVOLUTION(1)
|
|
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RAYFIRE)
|
|
|
|
IF gotoFoamState = GOTO_FOAM_STATE_WAITING
|
|
PRINTSTRING("here7") printnl()
|
|
IF IPL_GROUP_SWAP_IS_READY()
|
|
PRINTSTRING("here8") printnl()
|
|
IPL_GROUP_SWAP_FINISH()
|
|
ELSE
|
|
PRINTSTRING("here9") printnl()
|
|
IPL_GROUP_SWAP_CANCEL()
|
|
ENDIF
|
|
gotoFoamState = GOTO_FOAM_STATE_DONE
|
|
ENDIF
|
|
|
|
IF bSkippedCutscene
|
|
gotoFoamState = GOTO_FOAM_STATE_DONE
|
|
swapCarriageState = SWAP_CARRIAGE_STATE_DONE
|
|
IF gotoFoamState = GOTO_FOAM_STATE_WAITING
|
|
IPL_GROUP_SWAP_CANCEL()
|
|
ENDIF
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) <> RFMO_STATE_END
|
|
SET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire, RFMO_STATE_ENDING)
|
|
ENDIF
|
|
SET_TRAIN_CRASH_GEO(TRUE, TRUE, TRUE, DEFAULT, TRUE)
|
|
STOP_STREAM()
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
PAUSE_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
|
|
INT iWaitTime
|
|
iWaitTime = GET_GAME_TIMER()
|
|
WHILE (GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) <> RFMO_STATE_END
|
|
AND GET_GAME_TIMER() < iWaitTime + 4000)
|
|
OR GET_GAME_TIMER() < iWaitTime + 2000
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
IF bSkippedCutscene
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
WAIT(0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
PRINTSTRING("end time = ") PRINTINT(GET_GAME_TIMER() - iTrainCrashCutsceneTime) PRINTNL()
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
|
|
// back to gameplay
|
|
SET_MISSION_CUTSCENE(FALSE)
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
|
|
bDoneJumpOff = TRUE
|
|
|
|
bShownSwitchPrompt = FALSE
|
|
SET_MISSION_STAGE(STAGE_GO_TO_CONTAINER)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<-401.2, 4436.1, 30.7>>)
|
|
ENDPROC
|
|
|
|
// pick up the character who cut the brakes, then follow the train again
|
|
CONST_FLOAT CLOSE_TO_CRASH_Y 5800.0//5100.0
|
|
PROC DO_STAGE_GET_TO_BRIDGE()
|
|
HANDLE_MERC_PICKUP()
|
|
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2159601
|
|
|
|
IF NOT bRunningCutscene
|
|
IF NOT bDoneJumpOff
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
VECTOR vTrainPos = GET_ENTITY_COORDS(missionTrain)
|
|
|
|
IF NOT bPreparedSwapToMichaelCue
|
|
bPreparedSwapToMichaelCue = PREPARE_MUSIC_EVENT("EXL3_SWITCH_1")
|
|
ENDIF
|
|
|
|
// handle swapping back and forth to train
|
|
SWITCH trainHotswapState
|
|
// on trevor - jump
|
|
CASE TRAIN_HOTSWAP_ON_TREVOR
|
|
UPDATE_TRAIN_FIRST_PERSON_CAM(FALSE)
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
|
|
IF NOT bDoneRidingTrainSpeech
|
|
IF iReplayAttempt % 2 = 0
|
|
bDoneRidingTrainSpeech = DO_MISSION_SPEECH("EXL3_RADIO1")
|
|
ELSE
|
|
bDoneRidingTrainSpeech = DO_MISSION_SPEECH("EXL3_RADIO1b")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneAlmostThereSpeech
|
|
IF vTrainPos.y < 5922.0
|
|
AND vTrainPos.x < 983
|
|
bDoneAlmostThereSpeech = DO_MISSION_SPEECH("EXL3_NEARBRG")
|
|
IF bDoneAlmostThereSpeech
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//PRINTSTRING("speed = ") PRINTFLOAT(fTrainCruiseSpeed) PRINTNL()
|
|
IF fTrainCruiseSpeed < 10.0
|
|
fTrainTooLowSpeedTime = fTrainTooLowSpeedTime +@ 1.0
|
|
IF fTrainTooLowSpeedTime >= 30.0
|
|
IF NOT bPreventMissionFail_SwitchCamDebug
|
|
// MISSION_FAILED(FAIL_TOO_LATE_BRIDGE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
fTrainTooLowSpeedTime = fTrainTooLowSpeedTime -@ 1.0
|
|
IF fTrainTooLowSpeedTime < 0
|
|
fTrainTooLowSpeedTime = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF vTrainPos.y < 5647.0
|
|
AND vTrainPos.x < 983
|
|
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
#IF IS_DEBUG_BUILD
|
|
OR bDebugJSkip
|
|
#ENDIF
|
|
IF CAN_ADVANCE_MISSION()
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
bDoneRidingTrainSpeech = TRUE
|
|
bSetToJump = FALSE
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_RIDE_TRAIN)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_DECEL)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_ACCEL)
|
|
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
|
|
trainHotswapState = TRAIN_HOTSWAP_TO_MICHAEL
|
|
eSwitchCamState = SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_1
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
// on michael - get to bridge
|
|
CASE TRAIN_HOTSWAP_ON_MICHAEL
|
|
fWaterOverride = fWaterOverride -@ 0.07
|
|
IF fWaterOverride < 0
|
|
fWaterOverride = 0
|
|
ENDIF
|
|
WATER_OVERRIDE_SET_STRENGTH(fWaterOverride)
|
|
|
|
IF IPL_GROUP_SWAP_IS_READY()
|
|
PRINTSTRING("ready!") PRINTNL()
|
|
ELSE
|
|
PRINTSTRING("not ready!") PRINTNL()
|
|
ENDIF
|
|
|
|
// handle prime rayfire
|
|
HANDLE_BRIDGE_RAYFIRE(FALSE)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
|
|
|
|
VECTOR vMichaelPos
|
|
vMichaelPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF NOT bLoadedCrashStream
|
|
bLoadedCrashStream = LOAD_STREAM("EXILE_3_DERAILED_TRAIN_CRASH_MASTER")
|
|
ENDIF
|
|
|
|
IF bCreatedCrashTrain
|
|
REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<-490.5, 4407.6, 30.4>>)
|
|
//IF vTrainPos.y < 4549
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) <> CAM_VIEW_MODE_FIRST_PERSON
|
|
FORCE_CHASE_HINT_CAM(localChaseHintCamStruct, TRUE)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_LR)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_UD)
|
|
ENDIF
|
|
SET_CUSTOM_CHASE_HINT_CAM_INTERP_IN_TIME(localChaseHintCamStruct, 3000)
|
|
CONTROL_VEHICLE_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, missionTrain)
|
|
//ENDIF
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_PRIMED
|
|
IF NOT bDoneForceDinghyStop
|
|
IF vMichaelPos.y > 4402.55908
|
|
BRING_VEHICLE_TO_HALT(trainCrashVehicle[TCV_DINGHY], 45.0, -1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
bDoneForceDinghyStop = TRUE
|
|
ENDIF
|
|
ELSE
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
|
|
IF NOT bDoneGoingToCrashSpeech
|
|
IF vTrainPos.y < 4480
|
|
bDoneGoingToCrashSpeech = DO_MISSION_SPEECH("EXL3_GONCRSH", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iMichaelBoatStartTime + 100000
|
|
IF NOT bPreventMissionFail_SwitchCamDebug
|
|
MISSION_FAILED(FAIL_TOO_LATE_BRIDGE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// stop playback on dinghy
|
|
IF NOT bStoppedPlaybackDinghy
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
bStoppedPlaybackDinghy = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bPreparedSideOnCue
|
|
bPreparedSideOnCue = PREPARE_MUSIC_EVENT("EXL3_TUNNEL_EXIT")
|
|
ENDIF
|
|
|
|
IF NOT bCreatedCrashTrain
|
|
IF NOT bStartedIPLSwap
|
|
IF DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_PRIMED
|
|
IPL_GROUP_SWAP_START("railing_start", "railing_end")
|
|
bStartedIPLSwap = TRUE
|
|
iStartIPLSwapTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<350,350,350>>, FALSE, FALSE)
|
|
IF NOT STREAMVOL_IS_VALID(bridgeVolume)
|
|
bridgeVolume = STREAMVOL_CREATE_FRUSTUM(<<-468.9, 4430.8, 85.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<8.9, -1.2, 110.6>>), 500, FLAG_MAPDATA)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<400,400,400>>, FALSE, FALSE)
|
|
IF STREAMVOL_IS_VALID(bridgeVolume)
|
|
STREAMVOL_DELETE(bridgeVolume)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<265,265,265>>, FALSE, FALSE)
|
|
BOOL bForceTrain
|
|
bForceTrain = FALSE
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<150,150,150>>, FALSE, FALSE)
|
|
IF iBeenAtBridgeTime < 0
|
|
iBeenAtBridgeTime = GET_GAME_TIMER()
|
|
ELSE
|
|
PRINTSTRING("force train countdown = ") PRINTINT(GET_GAME_TIMER() - iBeenAtBridgeTime) PRINTNL()
|
|
IF GET_GAME_TIMER() >= iBeenAtBridgeTime + 10000
|
|
bForceTrain = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
endif
|
|
|
|
IF (DOES_RAYFIRE_MAP_OBJECT_EXIST(bridgeRayfire)
|
|
AND (IPL_GROUP_SWAP_IS_READY() OR (bStartedIPLSwap AND GET_GAME_TIMER() >= iStartIPLSwapTime+5000)))
|
|
OR bForceTrain
|
|
IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(bridgeRayfire) = RFMO_STATE_PRIMED
|
|
OR bForceTrain
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
SET_MISSION_TRAIN_COORDS(missionTrain, <<-531.47, 4544.52, 87.7>>)
|
|
|
|
// lod distance
|
|
INT i
|
|
FOR i=0 TO 15
|
|
VEHICLE_INDEX thisCarriage
|
|
thisCarriage = GET_TRAIN_CARRIAGE(missionTrain, i)
|
|
IF IS_VEHICLE_DRIVEABLE(thisCarriage)
|
|
SET_ENTITY_LOD_DIST(thisCarriage, 500)
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
//PREFETCH_SRL("ex3crash")
|
|
//SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
|
|
//IPL_GROUP_SWAP_START("railing_start", "railing_end")
|
|
CREATE_CRASH_TRAIN()
|
|
|
|
//IF NOT bForceTrain
|
|
//
|
|
//ENDIF
|
|
|
|
bCreatedCrashTrain = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT bArrivedAtBridge
|
|
IF NOT bShownSwitchPrompt
|
|
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
//IF CAN_ADVANCE_MISSION()
|
|
// IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
///ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_ALL_BLIPS()
|
|
REMOVE_MISSION_TEXT(FALSE)
|
|
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER))
|
|
ENDIF
|
|
|
|
IF NOT bShownGodText
|
|
bShownGodText = DO_MISSION_GOD_TEXT("TC_GOBRG")
|
|
ELSE
|
|
IF NOT bDoneRidingTrainSpeech2
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BRIDGE_TRIGGER), <<400, 400, 20>>, FALSE, FALSE)
|
|
|
|
IF iReplayAttempt % 2 = 0
|
|
bDoneRidingTrainSpeech2 = DO_MISSION_SPEECH("EXL3_RADIO2")
|
|
ELSE
|
|
bDoneRidingTrainSpeech2 = DO_MISSION_SPEECH("EXL3_RADIO2b")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
BOOL bDoCollisionAudioScene
|
|
bDoCollisionAudioScene = FALSE
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
TEXT_LABEL_23 tCurrentLabel
|
|
tCurrentLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
|
|
IF ARE_STRINGS_EQUAL(tCurrentLabel, "EXL3_RADIO2_3")
|
|
OR ARE_STRINGS_EQUAL(tCurrentLabel, "EXL3_RADIO2b_3")
|
|
bDoCollisionAudioScene = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoCollisionAudioScene = TRUE
|
|
ENDIF
|
|
|
|
IF bDoCollisionAudioScene
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_COLLISION)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// handle crash
|
|
IF vTrainPos.y < 4420
|
|
// run the crash cutscene at appropriate point
|
|
IF CAN_ADVANCE_MISSION()
|
|
bRunningCutscene = TRUE
|
|
ENDIF
|
|
|
|
bSelectorLocked = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TRAIN_HOTSWAP_TO_TREVOR
|
|
IF DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, FALSE, hotswapToTrainCamType)
|
|
SET_MISSION_CUTSCENE(TRUE)
|
|
REMOVE_ALL_BLIPS()
|
|
DISPLAY_RADAR(TRUE) // display the radar
|
|
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
|
|
ENDIF
|
|
BREAK
|
|
CASE TRAIN_HOTSWAP_TO_MICHAEL
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HANDLE_BRIDGE_RAYFIRE(FALSE)
|
|
|
|
//[SP] Fix for bug# 1571021 - "Cut to overhead switch intro shot contains a few weird in between frames" - (due to first person cam not updating)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
AND (eSwitchCamState = SWITCH_CAM_SETUP_TRAIN_TO_BOAT_SPLINE_1 OR bFromTrainSwitchFirstPerson)
|
|
UPDATE_TRAIN_FIRST_PERSON_CAM(FALSE)
|
|
ENDIF
|
|
|
|
IF NOT bDoneSwapToMichaelCue
|
|
IF bPreparedSwapToMichaelCue
|
|
bDoneSwapToMichaelCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_SWITCH_1")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bCamHighEnoughToFreezeTrain
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
IF IS_PLAYER_SWITCH_IN_PROGRESS()
|
|
IF GET_PLAYER_SWITCH_JUMP_CUT_INDEX() = 2
|
|
|
|
WATER_OVERRIDE_SET_SHOREWAVEAMPLITUDE(0)
|
|
WATER_OVERRIDE_SET_SHOREWAVEMINAMPLITUDE(0)
|
|
WATER_OVERRIDE_SET_SHOREWAVEMAXAMPLITUDE(0)
|
|
WATER_OVERRIDE_SET_OCEANNOISEMINAMPLITUDE(0)
|
|
WATER_OVERRIDE_SET_OCEANWAVEAMPLITUDE(0)
|
|
WATER_OVERRIDE_SET_OCEANWAVEMINAMPLITUDE(0)
|
|
WATER_OVERRIDE_SET_OCEANWAVEMAXAMPLITUDE(0)
|
|
WATER_OVERRIDE_SET_RIPPLEBUMPINESS(0)
|
|
WATER_OVERRIDE_SET_RIPPLEMINBUMPINESS(0)
|
|
WATER_OVERRIDE_SET_RIPPLEMAXBUMPINESS(0)
|
|
WATER_OVERRIDE_SET_RIPPLEDISTURB(0)
|
|
WATER_OVERRIDE_SET_STRENGTH(fWaterOverride)
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
printstring("bcamhigh") printnl()
|
|
bCamHighEnoughToFreezeTrain = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// start dinghy
|
|
IF NOT bStartedPlaybackDinghy
|
|
IF eSwitchCamState = SWITCH_CAM_PLAYING_TRAIN_TO_BOAT_SPLINE_1
|
|
IF DOES_CAM_EXIST(scsSwitchCamTrainToBoat_Intro.ciSpline)
|
|
IF GET_CAM_SPLINE_PHASE(scsSwitchCamTrainToBoat_Intro.ciSpline) >= 0.8
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 001, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], fRepositionBoatTime)
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(trainCrashVehicle[TCV_DINGHY], (<<0.0, 0.0, 0.7>>))
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bStoppedPlaybackDinghy = FALSE
|
|
bStartedPlaybackDinghy = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// trevor onto train
|
|
IF NOT bSetToJump
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
trainRideState = TRAIN_RIDE_STATE_HIGH
|
|
SET_TREVOR_READY_TO_JUMP(TRUE)
|
|
bSetToJump = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, FALSE, HOTSWAP_CAM_TRAIN_TO_BOAT, TRUE)
|
|
SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, FALSE, TRUE)
|
|
|
|
//IF bArrivedAtBridge
|
|
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
//ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REMOVE_PED_HELMET(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
SET_ENTITY_VISIBLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_ENTITY_PROOFS(trainCrashVehicle[TCV_DINGHY], FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_BRIDGE)
|
|
|
|
iMichaelBoatStartTime = GET_GAME_TIMER()
|
|
hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
trainHotswapState = TRAIN_HOTSWAP_ON_MICHAEL
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// doing the train crash cutscene
|
|
DO_TRAIN_CRASH_CUTSCENE()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// set found bomb
|
|
PROC SET_FOUND_BOMB()
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(containerBlip)
|
|
REMOVE_BLIP(containerBlip)
|
|
ENDIF
|
|
|
|
SET_NEXT_RANDOM_SPEECH_TIME(4000)
|
|
//REMOVE_ALL_BLIPS()
|
|
//bShownGodText = FALSE
|
|
bShownBombHelp = FALSE
|
|
bFoundBomb = TRUE
|
|
ENDPROC
|
|
|
|
// maintain trevor idle
|
|
PROC MAINTAIN_TREVOR_IDLE()
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
SWITCH trevorIdleState
|
|
CASE TREVOR_IDLE_STATE_NOT_STARTED
|
|
IF trevorPed <> PLAYER_PED_ID()
|
|
IF GET_SCRIPT_TASK_STATUS(trevorPed, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
|
|
AND IS_ENTITY_AT_COORD(trevorPed, GET_TRAIN_CRASH_VECTOR(TCVEC_TREVOR_SHOOTOUT_INIT), <<2,2,2>>)
|
|
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_ENTER), "enter", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
|
|
trevorIdleState = TREVOR_IDLE_STATE_ENTERING
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TREVOR_IDLE_STATE_ENTERING
|
|
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_ENTER), "enter")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_ENTER), "enter") >= 0.98
|
|
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_BASE), "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
trevorIdleState = TREVOR_IDLE_STATE_BASE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TREVOR_IDLE_STATE_BASE
|
|
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_BASE), "base")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_BASE), "base") >= 0.95
|
|
AND GET_GAME_TIMER() >= iLastTrevorVariationTime + 20000
|
|
iLastTrevorVariationTime = GET_GAME_TIMER()
|
|
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_VAR), "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
|
|
trevorIdleState = TREVOR_IDLE_STATE_VAR
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TREVOR_IDLE_STATE_VAR
|
|
IF IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_VAR), "idle_a")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_VAR), "idle_a") >= 0.98
|
|
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_BASE), "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
trevorIdleState = TREVOR_IDLE_STATE_BASE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TREVOR_IDLE_STATE_CLEAR
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_VAR), "exit")
|
|
CLEAR_PED_TASKS(trevorPed)
|
|
trevorIdleState = TREVOR_IDLE_STATE_DONE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF trevorIdleState = TREVOR_IDLE_STATE_BASE
|
|
OR trevorIdleState = TREVOR_IDLE_STATE_VAR
|
|
IF trevorPed = PLAYER_PED_ID()
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
//TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TREVOR_IDLE_EXIT), "exit", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
|
|
trevorIdleState = TREVOR_IDLE_STATE_DONE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// go to the container
|
|
PROC DO_STAGE_GO_TO_CONTAINER()
|
|
//HANDLE_CRATE_BOB()
|
|
|
|
//PRINTINT(GET_GAME_TIMER() - iCreatedWaveTime[EW_SHOOTOUT_FIRST_WAVE]) PRINTNL()
|
|
|
|
IF NOT bRunningCutscene
|
|
|
|
/*
|
|
IF IS_VEHICLE_DRIVEABLE(hangingCarriageVehicle)
|
|
SET_ENTITY_COORDS_NO_OFFSET(hangingCarriageVehicle, vHangingCarriagePos)
|
|
SET_ENTITY_ROTATION(hangingCarriageVehicle, vHangingCarriageRot)
|
|
FREEZE_ENTITY_POSITION(hangingCarriageVehicle, TRUE)
|
|
ENDIF
|
|
*/
|
|
|
|
/*
|
|
IF DOES_ENTITY_EXIST(doorsObject)
|
|
SET_ENTITY_COORDS_NO_OFFSET(doorsObject, vHangingCarriagePos)
|
|
SET_ENTITY_ROTATION(doorsObject, vHangingCarriageRot)
|
|
FREEZE_ENTITY_POSITION(doorsObject, TRUE)
|
|
ENDIF
|
|
*/
|
|
|
|
MAINTAIN_TREVOR_IDLE()
|
|
|
|
//PRINTVECTOR(GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])) printnl()
|
|
//PRINTVECTOR(GET_ENTITY_rotATION(trainCrashVehicle[TCV_DINGHY])) printnl()
|
|
|
|
IF NOT bRemovedStreamVol
|
|
IF GET_GAME_TIMER() >= iStageStartTime + 1000
|
|
IF STREAMVOL_IS_VALID(bridgeVolume)
|
|
STREAMVOL_DELETE(bridgeVolume)
|
|
ENDIF
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
bRemovedStreamVol = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bRestoredControl
|
|
IF GET_GAME_TIMER() >= iStageStartTime + 1000
|
|
OR HAS_COLLISION_LOADED_AROUND_ENTITY(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
bRestoredControl = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// fail for going off waterfall
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
//VECTOR vDinghyCoords = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
|
|
//IF vDinghyCoords.x <= -542.30
|
|
//AND vDinghyCoords.z <= 22.97
|
|
// MISSION_FAILED(FAIL_CONTAINER_INACCESSIBLE)
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_TRAIN_CRASH_VECTOR(TCVEC_CRASH), FALSE) >= 195
|
|
MISSION_FAILED(FAIL_ABANDONED_CONTAINER)
|
|
ENDIF
|
|
|
|
IF NOT bExplodedDoors
|
|
IF NOT IS_PED_INJURED(sSelectorpeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT IS_PED_HEADTRACKING_ENTITY(sSelectorpeds.pedID[SELECTOR_PED_TREVOR], PLAYER_PED_ID())
|
|
TASK_LOOK_AT_ENTITY(sSelectorpeds.pedID[SELECTOR_PED_TREVOR], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bShownGodText
|
|
IF NOT bDoneFindLootSpeech
|
|
IF DO_MISSION_SPEECH("EXL3_LOOT")
|
|
bDoneFindLootSpeech = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bTurnOffUnderwaterDialogue
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ALLOW_DIALOGUE_IN_WATER(FALSE)
|
|
bTurnOffUnderwaterDialogue = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bFoundBomb
|
|
IF NOT bDoneEncourageOpenSpeech
|
|
IF NOT bDoMerryweatherMassacre
|
|
IF GET_GAME_TIMER() >= iStageStartTime + 500
|
|
AND NOT IS_PED_RAGDOLL(GET_TREVOR_PED())
|
|
IF DO_MISSION_SPEECH("EXL3_INST1")
|
|
bDoneEncourageOpenSpeech = TRUE
|
|
iEncourageOpenSpeechTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoMerryweatherMassacre
|
|
IF NOT bShownGodText
|
|
IF DO_MISSION_GOD_TEXT("TC_DOBOMB", TRUE, FALSE, DEFAULT_GOD_TEXT_TIME + 2000)
|
|
iPromptedToBlowTime = GET_GAME_TIMER()
|
|
iOnFlatbedTime = GET_GAME_TIMER() + 200
|
|
bShownGodText = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneThrowBombSpeech
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
WEAPON_TYPE weapon
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
|
|
IF weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
|
|
bDoneThrowBombSpeech = DO_MISSION_SPEECH("EXL3_BOMB")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneFirstHurryUpSpeech
|
|
IF GET_GAME_TIMER() >= iOnFlatbedTime + 20000
|
|
IF DO_MISSION_SPEECH("EXL3_DOOPEN")
|
|
bDoneFirstHurryUpSpeech = TRUE
|
|
SET_NEXT_RANDOM_SPEECH_TIME()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
DO_RANDOM_SPEECH("EXL3_HIT")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(containerBlip)
|
|
AND NOT bDoMerryweatherMassacre
|
|
CREATE_CONTAINER_BLIP()
|
|
ENDIF
|
|
|
|
// bomb help text
|
|
WEAPON_TYPE weapon
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLP3")
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
CLEAR_HELP(FALSE)
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_CYCLEW")
|
|
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLP")
|
|
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLPB")
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
CLEAR_HELP(FALSE)
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bShownBombHelp
|
|
IF NOT bFoundBomb
|
|
IF weapon = GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
|
|
bDoneSwitchToBombHelp = TRUE
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_CYCLEW")
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
CLEAR_HELP(FALSE)
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() >= iOnFlatbedTime
|
|
AND NOT bDoMerryweatherMassacre
|
|
bDoneSwitchToBombHelp = TRUE
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT GET_IS_USING_ALTERNATE_DRIVEBY()
|
|
IF DO_MISSION_HELP_TEXT("TC_BMBHLP", FALSE, 13000)
|
|
bShownBombHelp = TRUE
|
|
iBombHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF DO_MISSION_HELP_TEXT("TC_BMBHLPB", FALSE, 13000)
|
|
bShownBombHelp = TRUE
|
|
iBombHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DO_MISSION_HELP_TEXT("TC_BMBHLP3", FALSE, 13000)
|
|
bShownBombHelp = TRUE
|
|
iBombHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF weapon <> GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
|
|
IF NOT bDoneSwitchToBombHelp
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF GET_GAME_TIMER() >= iEncourageOpenSpeechTime + 2000
|
|
IF bDoneEncourageOpenSpeech
|
|
AND NOT bDoMerryweatherMassacre
|
|
bDoneSwitchToBombHelp = DO_MISSION_HELP_TEXT("TC_CYCLEW", FALSE, 13000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLP")
|
|
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLPB")
|
|
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TC_BMBHLP3")
|
|
IF (weapon <> GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)
|
|
AND GET_GAME_TIMER() >= iBombHelpTime + 6000)
|
|
OR (IS_ENTITY_IN_WATER(PLAYER_PED_ID()) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
CLEAR_HELP(FALSE)
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-492.590, 4433.520, 29.800>>, <<-491.360, 4436.400, 32.700>>, 1.5)
|
|
AND NOT IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_MOLOTOV, <<-492.590, 4433.520, 29.800>>, <<-491.360, 4436.400, 32.700>>, 1.5)
|
|
AND NOT IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_BZGAS, <<-492.590, 4433.520, 29.800>>, <<-491.360, 4436.400, 32.700>>, 1.5)
|
|
SET_FOUND_BOMB()
|
|
bShownBombHelp = TRUE
|
|
bForceDoorsOpen = TRUE
|
|
ELIF IS_PROJECTILE_TYPE_IN_ANGLED_AREA(<<-492.590, 4433.520, 29.800>>, <<-491.360, 4436.400, 32.700>>, 1.5, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB), TRUE)
|
|
IF iFoundBombTime < 0
|
|
iFoundBombTime = GET_GAME_TIMER()
|
|
|
|
eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS
|
|
HANDLE_SWITCH_CAM_MICHAEL_TO_TREVOR_CONTAINER(scsSwitchCamMichealToTrevorContainer)
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iFoundBombTime + 200//800
|
|
IF GET_GAME_TIMER() >= iClearHelpTime + 1000
|
|
CLEAR_HELP(FALSE)
|
|
iClearHelpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
SET_FOUND_BOMB()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iFoundBombTime = -1
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB)) = 0
|
|
IF iNoBombsTime < 0
|
|
iNoBombsTime = GET_GAME_TIMER()
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iNoBombsTime + 3000
|
|
IF NOT bDoMerryweatherMassacre
|
|
MISSION_FAILED(FAIL_NO_STICKY_BOMBS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
IF NOT bDoMerryweatherMassacre
|
|
IF DOES_BLIP_EXIST(vehicleBlip)
|
|
//REMOVE_ALL_BLIPS()
|
|
REMOVE_BLIP(vehicleBlip)
|
|
REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF NOT DOES_BLIP_EXIST(containerBlip)
|
|
// REMOVE_ALL_BLIPS()
|
|
// REMOVE_MISSION_TEXT(FALSE)
|
|
// CREATE_CONTAINER_BLIP()
|
|
//ENDIF
|
|
|
|
IF NOT bDoMerryweatherMassacre
|
|
DO_RANDOM_SPEECH("EXL3_HURRY2")
|
|
ENDIF
|
|
|
|
IF NOT bShownBombHelp
|
|
IF NOT bDoMerryweatherMassacre
|
|
bShownBombHelp = DO_MISSION_HELP_TEXT("TC_BMBHLP2")
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bExplodedDoors
|
|
AND bFoundBomb
|
|
AND NOT bDoMerryWeatherMassacre
|
|
//IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-492.590, 4433.520, 29.400>>, <<-491.360, 4436.400, 32.900>>, 2.4)
|
|
//ENDIF
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
|
|
IF NOT IS_CUSTOM_MENU_ON_SCREEN()
|
|
IF IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)
|
|
OR bForceDoorsOpen
|
|
// CLEAR_AREA_OF_PROJECTILES(<<-492.590, 4433.520, 29.400>>, 2.4)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
EXPLODE_PROJECTILES(PLAYER_PED_ID(), GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_STICKY_BOMB), TRUE)
|
|
CLEAR_HELP(FALSE)
|
|
ALLOW_DIALOGUE_IN_WATER(FALSE)
|
|
//REMOVE_ALL_BLIPS()
|
|
bForceIntoDinghy = FALSE
|
|
bShownGodText = FALSE
|
|
bExplodedDoors = TRUE
|
|
iExplodedDoorsTime = GET_GAME_TIMER()
|
|
|
|
eSwitchCamState = SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_CONTAINER_SPLINE
|
|
// DO_DOORS_BLOW_OPEN()
|
|
bHasContainerSwitchCamExplosionHappened = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//STOP_GAMEPLAY_HINT_BEING_CANCELLED_THIS_UPDATE(TRUE)
|
|
ENDIF
|
|
|
|
IF bExplodedDoors
|
|
INT iExplodeWaitTime
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-490.46805, 4434.51855, 30.25891>>, <<6,6,6>>)
|
|
iExplodeWaitTime = 100
|
|
ELSE
|
|
iExplodeWaitTime = 0
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() > iExplodedDoorsTime + iExplodeWaitTime
|
|
IF NOT bDoneSwapToTrevorCue
|
|
bDoneSwapToTrevorCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_FIGHT_START")
|
|
PRINTSTRING("started fight cue!") PRINTNL()
|
|
ENDIF
|
|
|
|
IF NOT bSwappedToTrevor
|
|
|
|
IF NOT bContainerSwitchFirstPerson
|
|
IF NOT bSwappedDoors
|
|
IF DOES_ENTITY_EXIST(doorsObject)
|
|
IF IS_ENTITY_PLAYING_ANIM(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s")
|
|
PRINTSTRING("phase ") printfloat(GET_ENTITY_ANIM_CURRENT_TIME(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s") ) printnl()
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(doorsObject, "p_cs1_14b_train_s_break", "p_cs1_14b_train_s") >= 0.63
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
|
|
CREATE_OPEN_DOORS()
|
|
bSwappedDoors = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
STOP_FIRE_IN_RANGE(<<-491.2, 4435.3, 31.7>>, 5)
|
|
REMOVE_DECALS_IN_RANGE(<<-491.2, 4435.3, 31.7>>, 5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoMerryweatherMassacre
|
|
//AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CAN_ADVANCE_MISSION()
|
|
IF (HANDLE_SWITCH_CAM_MICHAEL_TO_TREVOR_CONTAINER(scsSwitchCamMichealToTrevorContainer)
|
|
OR (eSwitchCamState = SWITCH_CAM_IDLE AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR))
|
|
AND streamingStage = MISSION_STREAMING_STAGE_COMPLETE
|
|
|
|
//gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_TAKE_COVER))
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_PLANT_BOMB)
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL)
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
GIVE_PED_SNIPER_RIFLE_FOR_SHOOTOUT(PLAYER_PED_ID())
|
|
iSwappedToTrevorTime = GET_GAME_TIMER()
|
|
bSwappedToTrevor = TRUE
|
|
bTrevorSetupAfterContainerSwitch = FALSE
|
|
ELSE
|
|
|
|
//[MF] Stop the look at container gameplay hint cam
|
|
IF IS_GAMEPLAY_HINT_ACTIVE()
|
|
STOP_GAMEPLAY_HINT()
|
|
ENDIF
|
|
|
|
IF NOT bHasContainerSwitchCamExplosionHappened
|
|
IF bContainerSwitch_ExplosionHappened
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
DO_DOORS_BLOW_OPEN()
|
|
KILL_ANY_CONVERSATION()
|
|
bHasContainerSwitchCamExplosionHappened = TRUE
|
|
bMichaelSearchAnimStarted = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bRepositionedDinghy
|
|
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
|
|
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCamMichealToTrevorContainer.ciSpline) > iSwitchCam_Explosion_StartBoatMoveNode
|
|
//REPOSITION_DINGHY()
|
|
DRIVE_BOAT_TO_COINTAINER()
|
|
//CREATE_DEBRIS()
|
|
bRepositionedDinghy = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
|
|
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCamMichealToTrevorContainer.ciSpline) >= scsSwitchCamMichealToTrevorContainer.iCamSwitchFocusNode
|
|
DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, TRUE, HOTSWAP_CAM_DEFAULT, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF NOT bTrevorSetupAfterContainerSwitch
|
|
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCamMichealToTrevorContainer.ciSpline) > 0
|
|
SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(GET_TREVOR_PED())
|
|
CLEAR_PED_SECONDARY_TASK(GET_TREVOR_PED())
|
|
TASK_CLEAR_LOOK_AT(GET_TREVOR_PED())
|
|
trevorIdleState = TREVOR_IDLE_STATE_DONE
|
|
//WAIT(0)
|
|
SET_ENTITY_COORDS(GET_TREVOR_PED(), (<<-485.34943, 4399.22656, 29.37477>>))
|
|
SET_ENTITY_HEADING(GET_TREVOR_PED(), 5.16)
|
|
|
|
//CLEAR_PED_TASKS_IMMEDIATELY(GET_TREVOR_PED())
|
|
//CLEAR_PED_SECONDARY_TASK(GET_TREVOR_PED())
|
|
|
|
EQUIP_BEST_PED_WEAPON(GET_TREVOR_PED(), TRUE)
|
|
|
|
TASK_PLAY_ANIM(GET_TREVOR_PED(), GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_SWITCH), "ig_14_switch_mic_to_trev", INSTANT_BLEND_IN, -3, -1, AF_DEFAULT, 0.07)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_TREVOR_PED())
|
|
|
|
bTrevorSetupAfterContainerSwitch = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF eSwitchCamState < SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON)
|
|
ENDIF
|
|
//SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
IF NOT bDoneHurrySpeech
|
|
BOOL bDoDialogue
|
|
bDoDialogue = FALSE
|
|
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
|
|
IF GET_CAM_SPLINE_PHASE(scsSwitchCamMichealToTrevorContainer.ciSpline) >= fContainerSwitch_StartTrevDialogue
|
|
AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
AND IS_ENTITY_ON_SCREEN(PLAYER_PED_ID())
|
|
bDoDialogue = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoDialogue = TRUE
|
|
ENDIF
|
|
|
|
IF bDoDialogue
|
|
INT iLine
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0,3)
|
|
CASE 0
|
|
iLine = 1
|
|
BREAK
|
|
CASE 1
|
|
iLine = 3
|
|
BREAK
|
|
CASE 2
|
|
iLine = 5
|
|
BREAK
|
|
ENDSWITCH
|
|
CDEBUG3LN(DEBUG_MISSION, "Playing Dialogue: EXL3_SWITCH3 Line: ", iLine)
|
|
bDoneHurrySpeech = DO_MISSION_SPEECH("EXL3_SWITCH3", FALSE, iLine)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
/*
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF NOT bRepositionedDinghy
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
|
|
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCamMichealToTrevorContainer.ciSpline) > scsSwitchCamMichealToTrevorContainer.iCamSwitchFocusNode
|
|
REPOSITION_DINGHY()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDonePushIn
|
|
IF IS_GAMEPLAY_CAM_RENDERING()
|
|
IF DOES_CAM_EXIST(scsSwitchCamMichealToTrevorContainer.ciSpline)
|
|
SET_CAM_ACTIVE(scsSwitchCamMichealToTrevorContainer.ciSpline, FALSE)
|
|
DESTROY_CAM(scsSwitchCamMichealToTrevorContainer.ciSpline)
|
|
ENDIF
|
|
DESTROY_ALL_CAMS()
|
|
|
|
IF NOT bPlayerControlGiven
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
bPlayerControlGiven = TRUE
|
|
ENDIF
|
|
bDonePushIn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_FIRST_WAVE]
|
|
IF GET_GAME_TIMER() >= iSwappedToTrevorTime + 5000
|
|
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE, FALSE, STAGE_GO_TO_CONTAINER)
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_FIRST_WAVE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE)
|
|
ENDIF
|
|
|
|
HANDLE_RIFLE_THERMAL()
|
|
|
|
IF NOT bPreparedEnemiesArriveCue
|
|
IF bDoneSwapToTrevorCue
|
|
bPreparedEnemiesArriveCue = PREPARE_MUSIC_EVENT("EXL3_FIGHT_OS")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneHurrySpeech
|
|
// bDoneHurrySpeech = DO_MISSION_SPEECH("EXL3_INST2")
|
|
bDoneHurrySpeech = TRUE
|
|
ELSE
|
|
IF NOT bDoneMichaelSearchSpeech
|
|
bDoneMichaelSearchSpeech = DO_MISSION_SPEECH("EXL3_SCORE")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bTrevorEquippedWeapon
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_SWITCH), "ig_14_switch_mic_to_trev")
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE)
|
|
EQUIP_BEST_PED_WEAPON(GET_TREVOR_PED(), FALSE)
|
|
bTrevorEquippedWeapon = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMichaelSearchAnimStarted
|
|
BOOL bAdvanceStage
|
|
bAdvanceStage = FALSE
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= SKIP_MICHAEL_INTO_CONTAINER_PHASE
|
|
bAdvanceStage = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bAdvanceStage = TRUE
|
|
ENDIF
|
|
|
|
IF bAdvanceStage
|
|
AND bTriggeredEnemyWave[EW_SHOOTOUT_FIRST_WAVE]
|
|
IF NOT bDoneEnemiesArriveCue
|
|
IF bPreparedEnemiesArriveCue
|
|
bDoneEnemiesArriveCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_FIGHT_OS")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iFoundUsSpeechTime = GET_GAME_TIMER() + 600
|
|
SET_MISSION_STAGE(STAGE_STEAL_FROM_CONTAINER, FALSE, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF HAS_BOAT_DRIVEN_TO_CONTAINER()
|
|
STOP_FIRE_IN_RANGE(<<-490.79904, 4434.35205, 30.44730>>, 3)
|
|
REPOSITION_DINGHY()
|
|
SET_MICHAEL_STEP_INTO_CONTAINER(FALSE)
|
|
bMichaelSearchAnimStarted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDoMerryweatherMassacre
|
|
OR NOT bExplodedDoors
|
|
// merryweather come in and massacre you.
|
|
IF NOT bDoMerryweatherMassacre
|
|
|
|
VECTOR vMurderCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
IF GET_GAME_TIMER() >= iPromptedToBlowTime + 80000
|
|
AND bDoneFindLootSpeech
|
|
AND vMurderCoords.x < -379.5
|
|
AND NOT IS_SPHERE_VISIBLE(<<-341.46375, 4425.03906, 30.61806>>, 50.0)
|
|
AND NOT IS_SPHERE_VISIBLE(<<-35, 4136, 61>>, 70.0)
|
|
REMOVE_ALL_BLIPS()
|
|
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(GET_TREVOR_PED(), FALSE)
|
|
ENDIF
|
|
bDoMerryweatherMassacre = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bCreatedMerryweatherMassacre
|
|
IF streamingStage = MISSION_STREAMING_STAGE_COMPLETE
|
|
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE, FALSE, STAGE_GO_TO_CONTAINER)
|
|
bCreatedMerryweatherMassacre = TRUE
|
|
iCreateMerryweatherMassacreTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneFoundUsSpeech
|
|
bDoneFoundUsSpeech = DO_MISSION_SPEECH("EXL3_MEHERE")
|
|
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
|
|
AND NOT IS_PED_INJURED(enemyPed[0].ped)
|
|
TASK_SHOOT_AT_ENTITY(GET_TREVOR_PED(), enemyPed[0].ped, -1, FIRING_TYPE_RANDOM_BURSTS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE)
|
|
OR GET_GAME_TIMER() >= iCreateMerryweatherMassacreTime + 10000
|
|
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
|
|
APPLY_DAMAGE_TO_PED(GET_TREVOR_PED(), 1000, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/*
|
|
// cleanup find item cutscene
|
|
PROC CLEANUP_FIND_ITEM_CUTSCENE()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_POS), GET_TRAIN_CRASH_VECTOR(TCVEC_CONTAINER_ANIM_ROT))
|
|
//ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, trainCrashVehicle[TCV_DINGHY], 0)
|
|
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_CARRY_CASE_MICHAEL", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, blockingAllRagdoll)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.6)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
|
|
CREATE_CASE(CASE_IN_HAND_ANIM)
|
|
ENDIF
|
|
|
|
// get rid of bad guys
|
|
INT i
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
|
|
DELETE_PED(enemyPed[i].ped)
|
|
ENDIF
|
|
ENDREPEAT
|
|
REPEAT COUNT_OF(enemyVehicle) i
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
|
|
DELETE_VEHICLE(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
|
|
IF bSkippedCutscene
|
|
WAIT(500)
|
|
ENDIF
|
|
|
|
SET_MISSION_CUTSCENE(FALSE)
|
|
bDoneFoundItem = TRUE
|
|
ENDPROC
|
|
|
|
// end cutscene
|
|
PROC DO_FIND_ITEM_CUTSCENE()
|
|
SWITCH cutsceneStage
|
|
CASE TC_CUT_STAGE_INIT
|
|
SET_MISSION_CUTSCENE(TRUE)
|
|
|
|
// clear the area
|
|
CLEAR_AREA(GET_TRAIN_CRASH_VECTOR(TCVEC_MICHAEL_IN_CONTAINER), 4.0, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
START_CUTSCENE()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
cutsceneStage = TC_CUT_STAGE_RUNNING
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_RUNNING
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
bSkippedCutscene = TRUE
|
|
ENDIF
|
|
CLEANUP_FIND_ITEM_CUTSCENE()
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DEBUG_SKIP_MOCAP()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_CLEANUP
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
*/
|
|
|
|
PROC SET_TREVOR_BOAT_HELMET()
|
|
IF GET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD) < 0
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P2_CRASH_HELMET, FALSE)
|
|
bSetTrevorHelmet = TRUE
|
|
ENDIF
|
|
RELEASE_PED_PRELOAD_PROP_DATA(PLAYER_PED_ID())
|
|
ENDPROC
|
|
|
|
// waterfall cutaway procedure
|
|
PROC DO_WATERFALL_CUTSCENE()
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
|
|
SWITCH cutsceneStage
|
|
CASE TC_CUT_STAGE_INIT
|
|
SET_MISSION_CUTSCENE(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE)
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
|
|
//DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(20, TRUE)
|
|
|
|
CLEAR_AREA(<<-592.17896, 4420.87158, 14.71700>>, 28, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 004, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SET_PLAYBACK_SPEED(trainCrashVehicle[TCV_DINGHY], 0.75)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 4300)//4300)//4300)//3100)//6550)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
|
|
SET_ENTITY_VISIBLE(enemyPed[i].ped, FALSE)
|
|
SET_ENTITY_COLLISION(enemyPed[i].ped, FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(enemyVehicle) i
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
|
|
SET_ENTITY_VISIBLE(enemyVehicle[i].veh, FALSE)
|
|
SET_ENTITY_COLLISION(enemyVehicle[i].veh, FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
/*
|
|
REPEAT NUMBER_DEBRIS i
|
|
IF DOES_ENTITY_EXIST(debris[i].obj)
|
|
SET_ENTITY_VISIBLE(debris[i].obj, FALSE)
|
|
SET_ENTITY_COLLISION(debris[i].obj, FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
*/
|
|
|
|
//DELETE_ALL_ENEMIES()
|
|
//REMOVE_CRATES_INSIDE_TRAINCAR()
|
|
|
|
//INT i
|
|
//REPEAT NUMBER_DEBRIS i
|
|
// IF DOES_ENTITY_EXIST(debris[i].obj)
|
|
// DELETE_OBJECT(debris[i].obj)
|
|
// ENDIF
|
|
//ENDREPEAT
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
TASK_PLAY_ANIM(trevorPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_TREVOR_LOOK_DINGHY", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE, 0.15)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(trevorPed)
|
|
ENDIF
|
|
|
|
CREATE_ENEMY_WAVE(EW_CHASE_FIRST_BOAT_WAVE, TRUE, STAGE_STEAL_FROM_CONTAINER)
|
|
|
|
IF NOT bDoneRapidsStartCue
|
|
IF bPreparedRapidsStartCue
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_RAPIDS_START")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iDelete = 0
|
|
// position
|
|
//CREATE_CAM_FOR_TRAIN_CRASH_SHOT(TC_SHOT_WATERFALL, TRUE, 6000)//2700)
|
|
|
|
//iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-538.897, 4421.800, 28.188>>, <<0,0,2.0>>)
|
|
//CREATE_MISSION_ANIM_CAM(TRUE, TRUE)
|
|
//PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "WATERFALL_JUMP_CAM", GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN))
|
|
|
|
CREATE_CAM_FOR_TRAIN_CRASH_SHOT(TC_SHOT_WATERFALL, TRUE, 6000)
|
|
|
|
IF LOAD_STREAM("Boats_Jump", "EXILE_3_SOUNDS")
|
|
PLAY_STREAM_FRONTEND()
|
|
ENDIF
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iTrainCrashCutsceneTime = GET_GAME_TIMER()
|
|
cutsceneStage = TC_CUT_STAGE_RUNNING
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_RUNNING
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
|
|
IF iDelete < COUNT_OF(enemyPed)
|
|
IF INT_TO_ENUM(ENEMY_PED_ENUM, iDelete) <= EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
|
|
IF DOES_ENTITY_EXIST(enemyPed[iDelete].ped)
|
|
DELETE_PED(enemyPed[iDelete].ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iDelete < COUNT_OF(enemyVehicle)
|
|
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, iDelete) <= EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[iDelete].veh)
|
|
DELETE_VEHICLE(enemyVehicle[iDelete].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/*
|
|
IF iDelete < COUNT_OF(debris)
|
|
IF DOES_ENTITY_EXIST(debris[iDelete].obj)
|
|
DELETE_OBJECT(debris[iDelete].obj)
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
|
|
IF iDelete < COUNT_OF(crateBob)
|
|
IF DOES_ENTITY_EXIST(crateBob[iDelete].obj)
|
|
DELETE_OBJECT(crateBob[iDelete].obj)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iDelete++
|
|
|
|
IF NOT bDoneBoatHitWaterSound
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF GET_TIME_POSITION_IN_RECORDING(trainCrashVehicle[TCV_DINGHY]) >= 6215
|
|
PLAY_SOUND_FROM_ENTITY(-1, "BOAT_WAVE_HIT_SCRIPT", trainCrashVehicle[TCV_DINGHY])
|
|
bDoneBoatHitWaterSound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vDinghyPos
|
|
IF NOT bDoneWaterTrail[0]
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
vDinghyPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
|
|
IF vDinghyPos.y > 0
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_ex3_water_dinghy_wash", trainCrashVehicle[TCV_DINGHY], <<0,0,0>>, <<0,0,0>>, 1.0)
|
|
bDoneWaterTrail[0] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneWaterTrail[1]
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
vDinghyPos = GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
IF vDinghyPos.x < -541.0745
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_ex3_water_dinghy_wash", enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, <<0,0,0>>, <<0,0,0>>, 1.0)
|
|
bDoneWaterTrail[1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneWaterTrail[2]
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
vDinghyPos = GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
IF vDinghyPos.x < -540.7183
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_ex3_water_dinghy_wash", enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, <<0,0,0>>, <<0,0,0>>, 1.0)
|
|
bDoneWaterTrail[2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF NOT bDoneSetTrevorHelmetSpeech
|
|
IF GET_GAME_TIMER() >= (iTrainCrashCutsceneTime + 200)
|
|
bDoneSetTrevorHelmetSpeech = DO_MISSION_SPEECH("EXL3_PANIC")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSetTrevorHelmet
|
|
IF GET_GAME_TIMER() >= (iTrainCrashCutsceneTime + 2500)
|
|
SET_TREVOR_BOAT_HELMET()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() >= (iTrainCrashCutsceneTime + 5000)//3100) // 3000
|
|
cutsceneStage = TC_CUT_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
HANDLE_SKIP_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_CLEANUP
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
CLEAR_PED_TASKS(trevorPed)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF bSkippedCutscene
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], SKIP_REC_AFTER_WATERFALL - GET_TIME_POSITION_IN_RECORDING(trainCrashVehicle[TCV_DINGHY]))
|
|
WAIT(0)
|
|
ENDIF
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
ENDIF
|
|
START_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, 009, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SET_PLAYBACK_SPEED(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, 0.96)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, 3300)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
ENDIF
|
|
START_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, 016, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SET_PLAYBACK_SPEED(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, 1.0)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, 4600)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, FALSE)
|
|
ENDIF
|
|
|
|
|
|
IF bSkippedCutscene
|
|
SET_TREVOR_BOAT_HELMET()
|
|
ENDIF
|
|
|
|
// back to gameplay
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ELSE
|
|
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(20)
|
|
ENDIF
|
|
|
|
SET_MISSION_CUTSCENE(FALSE)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-5)
|
|
ELSE
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
ENDIF
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
|
|
SET_MISSION_STAGE(STAGE_RAPIDS_CHASE)
|
|
//CREATE_ENEMY_WAVE(EW_CHASE_FIRST_BOAT_WAVE, TRUE, STAGE_RAPIDS_CHASE)
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
STOP_STREAM()
|
|
|
|
HANDLE_BOAT_RPG(TRUE)
|
|
bTriggeredEnemyWave[EW_CHASE_FIRST_BOAT_WAVE] = TRUE
|
|
bDoneWaterfallCutaway = TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_PLAYER_AT_ISLAND()
|
|
RETURN IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<-542.34875, 4300.08887, 61.29320>>, <<-450.49066, 4419.17041, 29.99992>>, FALSE, FALSE)
|
|
ENDFUNC
|
|
|
|
PROC PULL_BOAT_AWAY_FROM_CONTAINER()
|
|
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 014, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY], 700)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
ENDPROC
|
|
|
|
// steal from the container
|
|
PROC DO_STAGE_STEAL_FROM_CONTAINER()
|
|
INT i
|
|
HANDLE_CRATE_BOB()
|
|
//HANDLE_DEBRIS()
|
|
HANDLE_RIFLE_THERMAL()
|
|
|
|
SET_PLAYER_LOCKON_RANGE_OVERRIDE(PLAYER_ID(), 120)
|
|
|
|
IF NOT bRunningCutscene
|
|
// PRINTINT(GET_GAME_TIMER() - iShootoutStartTime) PRINTNL()
|
|
// PRINTINT(GET_GAME_TIMER() - iCarriageFallTime) PRINTNL()
|
|
|
|
//PRINTINT(GET_GAME_TIMER() - iCreatedWaveTime[EW_SHOOTOUT_FIRST_WAVE]) PRINTNL()
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE) >= ABANDON_BUDDY_FAIL_RANGE
|
|
MISSION_FAILED(FAIL_ABANDONED_TREVOR)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE) >= ABANDON_BUDDY_FAIL_RANGE
|
|
MISSION_FAILED(FAIL_ABANDONED_MICHAEL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bReadyToEscape
|
|
IF NOT bDoneFoundUsSpeech
|
|
IF GET_GAME_TIMER() >= iFoundUsSpeechTime
|
|
bDoneFoundUsSpeech = DO_MISSION_SPEECH("EXL3_MEHERE")
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bShownGodText
|
|
bShownGodText = DO_MISSION_GOD_TEXT("TC_KEEPOFF")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSetupMichaelForShootout
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_DIES_IN_WATER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
bSetupMichaelForShootout = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// carriage fall
|
|
IF IS_VEHICLE_DRIVEABLE(hangingCarriageVehicle)
|
|
IF NOT bDoneCarriageFall
|
|
IF GET_GAME_TIMER() >= iShootoutStartTime + 15000
|
|
IF IS_ENTITY_ON_SCREEN(hangingCarriageVehicle)
|
|
AND NOT IS_ENTITY_OCCLUDED(hangingCarriageVehicle)
|
|
fHangingCarriageOnScreenTime = fHangingCarriageOnScreenTime +@ 1.0
|
|
IF fHangingCarriageOnScreenTime >= 2.0
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL)
|
|
FREEZE_ENTITY_POSITION(hangingCarriageVehicle, FALSE)
|
|
PLAY_SOUND_FROM_ENTITY(-1, "EXILE_3_TRAIN_FALL_MASTER", hangingCarriageVehicle)
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(hangingCarriageVehicle, APPLY_TYPE_IMPULSE, <<0,0,-1>>, 0, FALSE, TRUE)
|
|
bDoneCarriageFall = TRUE
|
|
ENDIF
|
|
ELSE
|
|
fHangingCarriageOnScreenTime = 0.0
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneCarriageExplosion
|
|
VECTOR vCarriagePos = GET_ENTITY_COORDS(hangingCarriageVehicle)
|
|
|
|
// blow up chopper if touching
|
|
IF NOT IS_ENTITY_DEAD(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
|
|
IF IS_ENTITY_TOUCHING_ENTITY(hangingCarriageVehicle, enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
|
|
EXPLODE_VEHICLE(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
|
|
bExplodedChopperFromCarriage = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF vCarriagePos.z < 41
|
|
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(hangingCarriageVehicle)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_TRAIN_FALL)
|
|
ADD_EXPLOSION(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hangingCarriageVehicle, <<0,-7,0>>), EXP_TAG_HI_OCTANE, 3.0)
|
|
|
|
bDoneCarriageExplosion = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneCarriageSplash
|
|
VECTOR vPos = GET_ENTITY_COORDS(hangingCarriageVehicle)
|
|
IF vPos.z < 31.2
|
|
vPos.z = 29.9
|
|
// new ptfx
|
|
IF NOT bExplodedChopperFromCarriage
|
|
START_PARTICLE_FX_NON_LOOPED_AT_COORD("ent_ray_train_splash", vPos, <<0,0,0>>, 1.0)
|
|
ENDIF
|
|
bDoneCarriageSplash = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// handle enemies
|
|
// 1st wave
|
|
bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FIRST_WAVE)
|
|
HANDLE_SHOOTOUT_BOAT_SPEEDS()
|
|
|
|
|
|
// chopper 1 audio
|
|
IF NOT bStartedChopper1AudioScene
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
|
|
INT iSceneTime
|
|
|
|
IF NOT bJumpedToShootout
|
|
iSceneTime = 23500
|
|
ELSE
|
|
iSceneTime = 16000
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FIRST_WAVE] + iSceneTime
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_1)
|
|
bStartedChopper1AudioScene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bRemovedChopper1Audio
|
|
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
|
|
//REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
|
|
bRemovedChopper1Audio = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// up boat accuracy
|
|
IF NOT bIncreasedBoatAccuracy
|
|
AND NOT bUppedAccuracyForCircle
|
|
IF GET_GAME_TIMER() >= iStageStartTime + 30000
|
|
FOR i=EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER TO EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
SET_PED_ACCURACY(enemyPed[i].ped, 8)
|
|
ENDIF
|
|
ENDFOR
|
|
bIncreasedBoatAccuracy = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// try and push dead boats over waterfall
|
|
FOR i=EV_SHOOTOUT_FIRST_WAVE_BOAT_1 TO EV_SHOOTOUT_FIRST_WAVE_BOAT_3
|
|
ENEMY_VEHICLE_ENUM thisBoat = INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[thisBoat].veh)
|
|
IF enemyVehicle[thisBoat].bOccupantsDead
|
|
VECTOR vBoatCoords = GET_ENTITY_COORDS(enemyVehicle[thisBoat].veh)
|
|
IF vBoatCoords.z < 22.4
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyVehicle[thisBoat].veh)
|
|
ELSE
|
|
IF IS_ENTITY_IN_AREA(enemyVehicle[thisBoat].veh, <<-505.47385, 4400.38330, 27.99983>>, <<-481.51172, 4410.57764, 34.99983>>)
|
|
APPLY_FORCE_TO_ENTITY(enemyVehicle[thisBoat].veh, APPLY_TYPE_EXTERNAL_FORCE, <<-0.2,1.0,1>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
|
|
ELSE
|
|
APPLY_FORCE_TO_ENTITY(enemyVehicle[thisBoat].veh, APPLY_TYPE_EXTERNAL_FORCE, <<-0.16,0.35,1>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
//IF NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped)
|
|
// SET_VEHICLE_SHOOT_AT_TARGET(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped, NULL, <<0,0,0>>)
|
|
//ENDIF
|
|
|
|
INT iFirstWavePedsLeft = 0
|
|
FOR i = EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER TO EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
iFirstWavePedsLeft++
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF NOT bDoLastBoatCircle
|
|
// horrible but game needs done
|
|
IF (IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR].ped))
|
|
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR].ped)
|
|
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR].ped, PCF_PreventAutoShuffleToDriversSeat, FALSE)
|
|
ENDIF
|
|
|
|
bDoLastBoatCircle = TRUE
|
|
ELIF (IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR].ped))
|
|
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR].ped)
|
|
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR].ped, PCF_PreventAutoShuffleToDriversSeat, FALSE)
|
|
ENDIF
|
|
|
|
bDoLastBoatCircle = TRUE
|
|
ELIF (IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_1_PASSFR].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_DRIVER].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR].ped))
|
|
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR].ped)
|
|
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIRST_WAVE_BOAT_2_PASSFR].ped, PCF_PreventAutoShuffleToDriversSeat, FALSE)
|
|
ENDIF
|
|
|
|
bDoLastBoatCircle = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bUppedAccuracyForCircle
|
|
IF bDoLastBoatCircle
|
|
FOR i=EP_SHOOTOUT_FIRST_WAVE_BOAT_1_DRIVER TO EP_SHOOTOUT_FIRST_WAVE_BOAT_3_PASSFR
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
SET_PED_ACCURACY(enemyPed[i].ped, 14)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
printstring("upped accuracy!") printnl()
|
|
bUppedAccuracyForCircle = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].veh)
|
|
OR iFirstWavePedsLeft > 2
|
|
OR bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE]
|
|
iCreateSnipersTime = GET_GAME_TIMER() + 3000
|
|
ENDIF
|
|
|
|
// START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_ENGINE)
|
|
|
|
// 2nd wave
|
|
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE]
|
|
//IF GET_GAME_TIMER() >= iShootoutStartTime + 21000
|
|
IF iFirstWavePedsLeft < 4
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
|
|
#ENDIF
|
|
CREATE_ENEMY_WAVE(EW_SHOOTOUT_SECOND_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE] = TRUE
|
|
bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_SECOND_WAVE)
|
|
|
|
IF NOT bStartedChopper2AudioScene
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_SECOND_WAVE] + 12000
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_2)
|
|
bStartedChopper2AudioScene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bRemovedChopper2Audio
|
|
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
//REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
bRemovedChopper2Audio = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// loop heli AI state
|
|
IF enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage > 5
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1, 2)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// 3rd wave
|
|
INT iThirdWavePedsLeft = 0
|
|
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE]
|
|
IF bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE]
|
|
AND NOT bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE]
|
|
AND NOT bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE]
|
|
AND (GET_GAME_TIMER() >= iCreateSnipersTime
|
|
OR NOT (IS_SPHERE_VISIBLE(<<-510.41333, 4453.61816, 89.10837>>, 1.0) OR IS_SPHERE_VISIBLE(<<-522.07892, 4437.87119, 80.63990>>, 1.0) OR IS_SPHERE_VISIBLE(<<-523.91626, 4451.52188, 75.71128>>, 1.0) OR IS_SPHERE_VISIBLE(<<-527.52893, 4479.11475, 61.24358>>, 1.0) ))
|
|
// IF GET_GAME_TIMER() >= iCreateSnipersTime
|
|
// PRINTSTRING("snipers timed out") PRINTNL()
|
|
// ELSE
|
|
// PRINTSTRING("snipers not on screen") PRINTNL()
|
|
// ENDIF
|
|
|
|
CREATE_ENEMY_WAVE(EW_SHOOTOUT_THIRD_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE] = TRUE
|
|
bEnemyWaveState[EW_SHOOTOUT_THIRD_WAVE] = TRUE
|
|
iThirdWavePedsLeft=4
|
|
ENDIF
|
|
ELSE
|
|
bEnemyWaveState[EW_SHOOTOUT_THIRD_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_THIRD_WAVE, TRUE, GET_GAME_TIMER() >= iCreateSnipersTime)
|
|
|
|
// gradually scale up sniper accuracy
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_THIRD_WAVE] + 8000
|
|
fThirdWaveAccuracy = fThirdWaveAccuracy +@ 0.3
|
|
IF fThirdWaveAccuracy > 100.0
|
|
fThirdWaveAccuracy = 100.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FOR i=EP_SHOOTOUT_THIRD_WAVE_FOOT_1 TO EP_SHOOTOUT_THIRD_WAVE_FOOT_4
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
iThirdWavePedsLeft++
|
|
SET_PED_ACCURACY(enemyPed[i].ped, FLOOR(fThirdWaveAccuracy))
|
|
HANDLE_SNIPER_RAGDOLL(INT_TO_ENUM(ENEMY_PED_ENUM, i))
|
|
|
|
IF GET_GAME_TIMER() < iCreateSnipersTime
|
|
SET_PED_RESET_FLAG(enemyPed[i].ped, PRF_BlockWeaponFire, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
// thermal help
|
|
IF NOT bShouldDoSniperHelp
|
|
IF bDoneUseThermalSpeech
|
|
AND GET_GAME_TIMER() >= iSniperSpeechTime + 2000
|
|
bShouldDoSniperHelp = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneSniperHelp1
|
|
bDoneSniperHelp1 = DO_MISSION_HELP_TEXT("TC_SNPHLP")
|
|
ELSE
|
|
WEAPON_TYPE weapon
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon)
|
|
IF weapon = WEAPONTYPE_SNIPERRIFLE
|
|
OR weapon = WEAPONTYPE_HEAVYSNIPER
|
|
IF NOT bDoneSniperHelp2
|
|
bDoneSniperHelp2 = DO_MISSION_HELP_TEXT("TC_SNPHLP2", FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE]
|
|
IF bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE]
|
|
iCreateMountainChopperTime = GET_GAME_TIMER() + 1400
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iThirdWavePedsLeft > 1
|
|
iCreateMountainChopperTime = GET_GAME_TIMER() + 1400
|
|
ENDIF
|
|
|
|
// 4th wave
|
|
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE]
|
|
IF (bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE]
|
|
AND GET_GAME_TIMER() >= iCreateMountainChopperTime)
|
|
#IF IS_DEBUG_BUILD
|
|
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD3)
|
|
#ENDIF
|
|
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FOURTH_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
|
|
iCreatedMountainChopperTime = GET_GAME_TIMER()
|
|
iNextHeliRocketTime = GET_GAME_TIMER() + 10000
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE] = TRUE
|
|
bEnemyWaveState[EW_SHOOTOUT_FOURTH_WAVE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bEnemyWaveState[EW_SHOOTOUT_FOURTH_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FOURTH_WAVE)
|
|
|
|
IF NOT bStartedChopper3AudioScene
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1].veh)
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FOURTH_WAVE] + 500
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_3)
|
|
bStartedChopper3AudioScene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bStoppedChopper3AudioScene
|
|
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1].veh)
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_3)
|
|
bStoppedChopper3AudioScene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1].veh)
|
|
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped)
|
|
IF GET_GAME_TIMER() >= iNextHeliRocketTime
|
|
SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, WEAPONTYPE_VEHICLE_SPACE_ROCKET)
|
|
IF DOES_ENTITY_EXIST(targetObject)
|
|
DELETE_OBJECT(targetObject)
|
|
ENDIF
|
|
|
|
VECTOR vMissOffset = <<0,0,0>>
|
|
IF GET_GAME_TIMER() <= iCreatedWaveTime[EW_SHOOTOUT_FOURTH_WAVE] + 45000
|
|
vMissOffset.z = GET_RANDOM_FLOAT_IN_RANGE(4,8)
|
|
vMissOffset.x = GET_RANDOM_FLOAT_IN_RANGE(5,12)
|
|
ELSE
|
|
vMissOffset.z = GET_RANDOM_FLOAT_IN_RANGE(1,2)
|
|
vMissOffset.x = GET_RANDOM_FLOAT_IN_RANGE(1,4)
|
|
ENDIF
|
|
IF GET_RANDOM_INT_IN_RANGE(0,2) = 0
|
|
vMissOffset.x *= -1
|
|
ENDIF
|
|
//vMissOffset.y = GET_RANDOM_FLOAT_IN_RANGE(2,7)
|
|
//IF GET_RANDOM_INT_IN_RANGE(0,2) = 0
|
|
// vMissOffset.y *= -1
|
|
//ENDIF
|
|
|
|
targetObject = CREATE_OBJECT(GET_MODEL_FOR_TRAIN_CRASH_MODEL_ENUM(TCM_ANCHOR), GET_ENTITY_COORDS(PLAYER_PED_ID()) + vMissOffset)
|
|
SET_ENTITY_COLLISION(targetObject, FALSE)
|
|
SET_ENTITY_VISIBLE(targetObject, FALSE)
|
|
SET_VEHICLE_SHOOT_AT_TARGET(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, targetObject, <<0,0,0>>)
|
|
|
|
//GET_ENTITY_FROM_PED_OR_VEHICLE
|
|
//printstring("fire7!!") printnl()
|
|
|
|
//SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, WEAPONTYPE_VEHICLE_SPACE_ROCKET)
|
|
//SET_VEHICLE_SHOOT_AT_TARGET(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, NULL, <<0,0,0>>)
|
|
//SET_PED_FIRING_PATTERN(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, FIRING_PATTERN_SINGLE_SHOT)
|
|
iNextHeliRocketTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 7000)
|
|
//FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FOURTH_WAVE_CHOPPER_1, 1)
|
|
|
|
//SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, WEAPONTYPE_VEHICLE_PLAYER_BULLET)
|
|
//printstring("fire!") printnl()
|
|
SET_CURRENT_PED_VEHICLE_WEAPON(enemyPed[EP_SHOOTOUT_FOURTH_WAVE_CHOPPER_1_PILOT].ped, WEAPONTYPE_VEHICLE_PLAYER_BUZZARD)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// 5th wave
|
|
IF NOT bTriggeredEnemyWave[EW_SHOOTOUT_FIFTH_WAVE]
|
|
IF (bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE]
|
|
AND GET_GAME_TIMER() >= iCreatedMountainChopperTime + 2000)
|
|
#IF IS_DEBUG_BUILD
|
|
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4)
|
|
#ENDIF
|
|
CREATE_ENEMY_WAVE(EW_SHOOTOUT_FIFTH_WAVE, FALSE, STAGE_STEAL_FROM_CONTAINER)
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_FIFTH_WAVE] = TRUE
|
|
bEnemyWaveState[EW_SHOOTOUT_FIFTH_WAVE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bEnemyWaveState[EW_SHOOTOUT_FIFTH_WAVE] = HANDLE_ENEMY_WAVE(EW_SHOOTOUT_FIFTH_WAVE)
|
|
|
|
// gradually scale up sniper accuracy
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FIFTH_WAVE] + 30000
|
|
fFifthWaveAccuracy = fFifthWaveAccuracy +@ 0.3
|
|
IF fFifthWaveAccuracy > 100.0
|
|
fFifthWaveAccuracy = 100.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneParachute1
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FIFTH_WAVE] + 0
|
|
SET_PED_USING_ACTION_MODE(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_1].ped, TRUE, -1, "DEFAULT_ACTION")
|
|
CLEAR_SEQUENCE_TASK(sequence)
|
|
OPEN_SEQUENCE_TASK(sequence)
|
|
TASK_PARACHUTE_TO_TARGET(NULL, <<-506.35675, 4512.24414, 83.99497>>)
|
|
TASK_SWAP_WEAPON(NULL, TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-501.51447, 4484.55518, 70.19113>>, PEDMOVE_RUN)
|
|
TASK_SHOOT_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
|
|
CLOSE_SEQUENCE_TASK(sequence)
|
|
TASK_PERFORM_SEQUENCE(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_1].ped, sequence)
|
|
|
|
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_1].ped, PCF_IgnoreLegIkRestrictions, TRUE)
|
|
bDoneParachute1 = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneParachute2
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_SHOOTOUT_FIFTH_WAVE] + 800
|
|
SET_PED_USING_ACTION_MODE(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_2].ped, TRUE, -1, "DEFAULT_ACTION")
|
|
CLEAR_SEQUENCE_TASK(sequence)
|
|
OPEN_SEQUENCE_TASK(sequence)
|
|
TASK_PARACHUTE_TO_TARGET(NULL, <<-488.58945, 4512.00732, 85.04370>>)
|
|
TASK_SWAP_WEAPON(NULL, TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-490.32205, 4505.53662, 82.68779>>, PEDMOVE_RUN)
|
|
TASK_SHOOT_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
|
|
CLOSE_SEQUENCE_TASK(sequence)
|
|
TASK_PERFORM_SEQUENCE(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_2].ped, sequence)
|
|
|
|
SET_PED_CONFIG_FLAG(enemyPed[EP_SHOOTOUT_FIFTH_WAVE_FOOT_2].ped, PCF_IgnoreLegIkRestrictions, TRUE)
|
|
bDoneParachute2 = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WEAPON_TYPE weapon
|
|
FOR i=EP_SHOOTOUT_FIFTH_WAVE_FOOT_1 TO EP_SHOOTOUT_FIFTH_WAVE_FOOT_2
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
GET_CURRENT_PED_WEAPON(enemyPed[i].ped, weapon)
|
|
IF weapon <> WEAPONTYPE_SNIPERRIFLE
|
|
IF GET_PED_PARACHUTE_STATE(enemyPed[i].ped) = PPS_INVALID
|
|
SET_CURRENT_PED_WEAPON(enemyPed[i].ped, WEAPONTYPE_SNIPERRIFLE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoneSeenParachutesSpeech
|
|
IF IS_ENTITY_ON_SCREEN(enemyPed[i].ped)
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(enemyPed[i].ped), FALSE) < 212
|
|
IF DO_MISSION_SPEECH("EXL3_PARA")
|
|
bDoneSeenParachutesSpeech = TRUE
|
|
iNextArgueTime = GET_GAME_TIMER() + 8000
|
|
michaelTrevorArgueStage = MT_ARGUE_WAIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_ACCURACY(enemyPed[i].ped, FLOOR(fFifthWaveAccuracy))
|
|
HANDLE_SNIPER_RAGDOLL(INT_TO_ENUM(ENEMY_PED_ENUM, i))
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
// handle first chopper rotate on spot / fly away
|
|
/*
|
|
IF bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE]
|
|
// rotate
|
|
IF enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].iAiStage = 4
|
|
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL].ped)
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// escape
|
|
IF enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].iAiStage < 99
|
|
IF IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBL].ped)
|
|
AND IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PASSBR].ped)
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1, 99)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped)
|
|
// handle first chopper stay in one place
|
|
SWITCH enemyVehicle[EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1].iAiStage
|
|
CASE 100
|
|
IF NOT IS_ENTITY_AT_COORD(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped, GET_TRAIN_CRASH_VECTOR(TCVEC_GUNS_CHOPPER_HOVER), <<6,6,6>>)
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1, 101)
|
|
ENDIF
|
|
BREAK
|
|
CASE 101
|
|
IF IS_ENTITY_AT_COORD(enemyPed[EP_SHOOTOUT_FIRST_WAVE_CHOPPER_1_PILOT].ped, GET_TRAIN_CRASH_VECTOR(TCVEC_GUNS_CHOPPER_HOVER), <<5.5,5.5,5.5>>)
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_FIRST_WAVE_CHOPPER_1, 100)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
|
|
// handle second chopper stay in a good place like a sensible person
|
|
/*
|
|
IF NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped)
|
|
SWITCH enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage
|
|
CASE 2
|
|
IF NOT IS_ENTITY_AT_COORD(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped, GET_TRAIN_CRASH_VECTOR(TCVEC_DROPOFF_CHOPPER_HOVER), <<6,6,6>>)
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1, 3)
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF IS_ENTITY_AT_COORD(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped, GET_TRAIN_CRASH_VECTOR(TCVEC_DROPOFF_CHOPPER_HOVER), <<5.5,5.5,5.5>>)
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1, 2)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
*/
|
|
|
|
// prompt that they're dropping on rail bridge
|
|
IF bEnemyWaveState[EW_SHOOTOUT_THIRD_WAVE]
|
|
IF NOT bDoneDropOnBridgeSpeech
|
|
IF GET_GAME_TIMER() >= iCreateSnipersTime + 1500
|
|
IF DO_MISSION_SPEECH("EXL3_SNIPER")
|
|
iNextArgueTime = GET_GAME_TIMER() + 15000
|
|
iSniperSpeechTime = GET_GAME_TIMER()
|
|
michaelTrevorArgueStage = MT_ARGUE_WAIT
|
|
bDoneDropOnBridgeSpeech = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneUseThermalSpeech
|
|
IF DO_MISSION_SPEECH("EXL3_THERMAL")
|
|
bDoneUseThermalSpeech = TRUE
|
|
iSniperSpeechTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bGotFirstSniperSpeech
|
|
IF iThirdWavePedsLeft < 4
|
|
IF iGotSniperTime < 0
|
|
iGotSniperTime = GET_GAME_TIMER()
|
|
ELSE
|
|
IF GET_GAME_TIMER() <= iGotSniperTime + 2000
|
|
IF DO_MISSION_SPEECH("EXL3_FIRST")
|
|
bGotFirstSniperSpeech = TRUE
|
|
iNextArgueTime = GET_GAME_TIMER() + 6000
|
|
michaelTrevorArgueStage = MT_ARGUE_WAIT
|
|
ENDIF
|
|
ELSE
|
|
bGotFirstSniperSpeech = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneKilledSnipersSpeech
|
|
IF bDoneDropOnBridgeSpeech
|
|
IF DO_MISSION_SPEECH("EXL3_DONE")
|
|
iNextArgueTime = GET_GAME_TIMER() + 10000
|
|
iSniperSpeechTime = GET_GAME_TIMER()
|
|
michaelTrevorArgueStage = MT_ARGUE_WAIT
|
|
bDoneKilledSnipersSpeech = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// exaggerated spin out on the chopper
|
|
IF bDoChopperSpinOut
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
IF NOT IS_ENTITY_DEAD(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
fPushChopperToWallForce = fPushChopperToWallForce +@ 25
|
|
IF fPushChopperToWallForce >= 60
|
|
fPushChopperToWallForce = 60
|
|
ENDIF
|
|
|
|
IF NOT IS_HELI_PART_BROKEN(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, TRUE, TRUE, TRUE)
|
|
// APPLY_FORCE_TO_ENTITY(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, APPLY_TYPE_FORCE, <<fChopperSpinForce, 0, 0>>, <<0, 2.2, 0>>, 0, TRUE, TRUE, TRUE)
|
|
// APPLY_FORCE_TO_ENTITY(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, APPLY_TYPE_FORCE, <<-fChopperSpinForce, 0, 0>>, <<0, -2.2, 0>>, 0, TRUE, TRUE, TRUE)
|
|
APPLY_FORCE_TO_ENTITY(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, APPLY_TYPE_FORCE, <<0,fPushChopperToWallForce,0>>, <<0,0,0>>, 0, FALSE, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
IF NOT IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
OR IS_PED_INJURED(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped)
|
|
IF NOT IS_ENTITY_DEAD(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
SET_VEHICLE_OUT_OF_CONTROL(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, FALSE)
|
|
ENDIF
|
|
IF enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage > 0
|
|
bDoChopperSpinOut = TRUE
|
|
//fCachedChopperSpeed = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// handle heli on michael
|
|
BOOL bHeliOnMichael = FALSE
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
AND NOT IS_PED_INJURED(enemyPed[EP_SHOOTOUT_SECOND_WAVE_CHOPPER_1_PILOT].ped)
|
|
IF enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage >= 3
|
|
IF iHeliOnMichaelTime < 0
|
|
iHeliOnMichaelTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
bHeliOnMichael = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bHeliOnMichael
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_GAME_TIMER() >= iHeliOnMichaelTime + 30000//1000000//18000
|
|
IF enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage = 3
|
|
OR enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].iAiStage = 5
|
|
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1000, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT bDoneFoundItem
|
|
// handle should michael be
|
|
IF GET_GAME_TIMER() >= iCheckInBoxcarTime
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<-502.47113, 4433.58203, 19.99993>>, <<-485.49841, 4439.79248, 35.99993>>)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
IF GET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) < 140
|
|
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1000, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
iCheckInBoxcarTime = GET_GAME_TIMER() + 1000
|
|
ENDIF
|
|
|
|
// do shouting
|
|
IF NOT bHeliOnMichael
|
|
IF iDelayFindItemTime < 0
|
|
SWITCH michaelTrevorArgueStage
|
|
CASE MT_ARGUE_WAIT
|
|
IF GET_GAME_TIMER() >= iNextArgueTime
|
|
AND NOT IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID())
|
|
IF DO_MISSION_SPEECH("EXL3_TSHOOT")
|
|
michaelTrevorArgueStage = MT_ARGUE_TREVOR
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE MT_ARGUE_TREVOR
|
|
IF DO_MISSION_SPEECH("EXL3_MSHOOT")
|
|
michaelTrevorArgueStage = MT_ARGUE_MICHAEL
|
|
ENDIF
|
|
BREAK
|
|
CASE MT_ARGUE_MICHAEL
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
iNextArgueTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 14000)
|
|
michaelTrevorArgueStage = MT_ARGUE_WAIT
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneHeliOnMichaelSpeech
|
|
IF DO_MISSION_SPEECH("EXL3_HELION")
|
|
bDoneHeliOnMichaelSpeech = TRUE
|
|
michaelTrevorArgueStage = MT_ARGUE_WAIT
|
|
SET_NEXT_RANDOM_SPEECH_TIME(12000)
|
|
ENDIF
|
|
ELSE
|
|
DO_RANDOM_SPEECH("EXL3_HELION2", -1, 12000, 20000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// michael searching
|
|
IF NOT bMichaelSearching
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99
|
|
SET_MICHAEL_SEARCHING_IN_CONTAINER(0,FALSE)
|
|
bMichaelSearching = TRUE
|
|
ENDIF
|
|
ELSE
|
|
HANDLE_MICHAEL_SEARCHING_IN_CONTAINER()
|
|
ENDIF
|
|
|
|
IF NOT bEnemyWaveState[EW_SHOOTOUT_FIRST_WAVE]
|
|
AND NOT bEnemyWaveState[EW_SHOOTOUT_SECOND_WAVE]
|
|
AND NOT bEnemyWaveState[EW_SHOOTOUT_THIRD_WAVE]
|
|
AND NOT bEnemyWaveState[EW_SHOOTOUT_FOURTH_WAVE]
|
|
AND NOT bEnemyWaveState[EW_SHOOTOUT_FIFTH_WAVE]
|
|
AND bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE]
|
|
AND bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE]
|
|
AND bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE]
|
|
AND bTriggeredEnemyWave[EW_SHOOTOUT_FIFTH_WAVE]
|
|
IF iDelayFindItemTime < 0
|
|
iDelayFindItemTime = GET_GAME_TIMER()
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iDelayFindItemTime + GET_RANDOM_INT_IN_RANGE(3500, 5000)
|
|
IF CAN_ADVANCE_MISSION()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, trainCrashVehicle[TCV_DINGHY], 0)
|
|
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], iSyncScene, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_CARRY_CASE_MICHAEL", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, blockingAllRagdoll)
|
|
//SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.2)
|
|
//SET_SYNCHRONIZED_SCENE_RATE(iSyncScene, 1.3)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
|
|
CREATE_CASE(CASE_IN_HAND_ANIM)
|
|
TRIGGER_MISSION_MUSIC_EVENT("EXL3_FIGHT_END")
|
|
bDoneFoundItem = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
|
|
IF NOT bPreparedRapidsStartCue
|
|
bPreparedRapidsStartCue = PREPARE_MUSIC_EVENT("EXL3_RAPIDS_START")
|
|
ENDIF
|
|
|
|
IF NOT bReadyToEscape
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
AND NOT IS_PED_INJURED(trevorPed)
|
|
IF NOT bDoneGotoSpeech
|
|
IF bDoneFoundItem
|
|
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_GOTIT")
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneTrevorRespondSpeech
|
|
bDoneTrevorRespondSpeech = DO_MISSION_SPEECH("EXL3_RESP")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iGetInTextStage = 0
|
|
SET_NEXT_RANDOM_SPEECH_TIME(12000)
|
|
ELSE
|
|
IF NOT bStoppedDefendMichaelAudioScene
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_DEFEND_MICHAEL)
|
|
bStoppedDefendMichaelAudioScene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF crashHotswapState = CRASH_HOTSWAP_ON_MICHAEL
|
|
//OR crashHotswapState = CRASH_HOTSWAP_ON_TREVOR
|
|
HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
//ENDIF
|
|
|
|
// michael is making way into dinghy
|
|
IF NOT bMichaelInDinghy
|
|
BOOL bDoNextScene
|
|
bDoNextScene = FALSE
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99
|
|
bDoNextScene = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoNextScene = TRUE
|
|
ENDIF
|
|
|
|
IF bDoNextScene
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
//STOP_SYNCHRONIZED_ENTITY_ANIM(trainCrashVehicle[TCV_DINGHY], 500, TRUE)
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_DINGHY])
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_CASE_STATE(CASE_UNDER_SEAT)
|
|
IF IS_PLAYER_AT_ISLAND()
|
|
PULL_BOAT_AWAY_FROM_CONTAINER()
|
|
ELSE
|
|
bDidntPullAwayFromContainer = TRUE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)//SLF_EXTEND_PITCH_LIMIT | SLF_EXTEND_YAW_LIMIT | )
|
|
ENDIF
|
|
bMichaelInDinghy = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
FLOAT fDinghyPlaybackTime = 0
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
fDinghyPlaybackTime = GET_TIME_POSITION_IN_RECORDING(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
|
|
IF NOT bMichaelStopForTrevorSwimming
|
|
IF ((IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], <<7,7,7>>, FALSE, FALSE)
|
|
OR NOT (IS_PLAYER_AT_ISLAND()))
|
|
AND NOT IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], <<-485.43494, 4398.68994, 30.64290>>, <<16,16,16>>, FALSE, FALSE))
|
|
OR bStoppingDinghy
|
|
IF (NOT HAS_ENTITY_COLLIDED_WITH_ANYTHING(trainCrashVehicle[TCV_DINGHY])
|
|
AND NOT bDidntPullAwayFromContainer)
|
|
OR bStoppingDinghy
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
fMichaelToIslandPlaybackSpeed = fMichaelToIslandPlaybackSpeed -@ 0.4
|
|
IF fMichaelToIslandPlaybackSpeed <= 0.1
|
|
fMichaelToIslandPlaybackSpeed = 0
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
CLEAR_PED_TASKS(michaelPed)
|
|
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
bMichaelStopForTrevorSwimming = TRUE
|
|
ELSE
|
|
bStoppingDinghy = TRUE
|
|
printstring("Here3") printnl()
|
|
SET_PLAYBACK_SPEED(trainCrashVehicle[TCV_DINGHY], fMichaelToIslandPlaybackSpeed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bMichaelAnchoredDinghy
|
|
IF fDinghyPlaybackTime >= 10500
|
|
CLEAR_PED_TASKS(michaelPed)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT HAS_ENTITY_COLLIDED_WITH_ANYTHING(trainCrashVehicle[TCV_DINGHY])
|
|
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], TRUE)
|
|
ENDIF
|
|
bMichaelAnchoredDinghy = TRUE
|
|
ENDIF
|
|
ELSE
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(trainCrashVehicle[TCV_DINGHY], APPLY_TYPE_FORCE, <<-2.0,0,0>>, 0, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
IF GET_SEAT_PED_IS_TRYING_TO_ENTER(PLAYER_PED_ID()) = ENUM_TO_INT(VS_FRONT_RIGHT)
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
|
|
ELSE
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF crashHotswapState = CRASH_HOTSWAP_ON_MICHAEL
|
|
//OR crashHotswapState = CRASH_HOTSWAP_ON_TREVOR
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PED_IN_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
|
|
AND IS_PED_IN_VEHICLE(trevorPed, trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
|
|
boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
|
|
|
|
FREEZE_ENTITY_POSITION(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
//SET_MISSION_STAGE(STAGE_RAPIDS_CHASE)
|
|
|
|
IF NOT bDidntPullAwayFromContainer
|
|
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(8, FALSE)
|
|
ELSE
|
|
PULL_BOAT_AWAY_FROM_CONTAINER()
|
|
ENDIF
|
|
bShownGodText = FALSE
|
|
bDoneGotoSpeech = FALSE
|
|
bReadyToEscape = TRUE
|
|
ELSE
|
|
IF NOT IS_PED_IN_VEHICLE(trevorPed, trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PED_IN_VEHICLE(michaelPed, trainCrashVehicle[TCV_DINGHY])
|
|
IF bDoneGotoSpeech
|
|
IF iGetInTextStage > 0
|
|
IF NOT bDoneImmediateGetInSpeech
|
|
IF IS_ENTITY_AT_ENTITY(trevorPed, trainCrashVehicle[TCV_DINGHY], <<5,5,5>>)
|
|
OR GET_GAME_TIMER() >= iNextRandomSpeechTime
|
|
OR bMichaelStopForTrevorSwimming
|
|
iNextRandomSpeechTime = 0
|
|
bDoneImmediateGetInSpeech = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], <<0, 4, 0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], <<0, -3.4, 3>>), 2.3)
|
|
DO_RANDOM_SPEECH("EXL3_GETIN")
|
|
ELSE
|
|
DO_RANDOM_SPEECH("EXL3_INSIT1")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vOffsetFromBoat
|
|
vOffsetFromBoat = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], <<4,4,4>>)
|
|
//AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-495.84711, 4432.77295, 28.41191>>, <<-491.86798, 4433.94775, 32.01966>>, 2.3)
|
|
//AND (vOffsetFromBoat.x < 1. OR NOT IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], <<-488.93961, 4433.09424, 30.26931>>, <<5,5,5>>) OR NOT IS_PED_SWIMMING(PLAYER_PED_ID()))
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ENTER)
|
|
CLEAR_SEQUENCE_TASK(sequence)
|
|
OPEN_SEQUENCE_TASK(sequence)
|
|
IF vOffsetFromBoat.x > 0
|
|
AND vOffsetFromBoat.z < 0
|
|
AND IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], <<-488.93961, 4433.09424, 30.26931>>, <<5,5,5>>)
|
|
AND NOT IS_PED_ON_VEHICLE(PLAYER_PED_ID())
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], <<-2,0,0>>), PEDMOVE_RUN)
|
|
ENDIF
|
|
TASK_ENTER_VEHICLE(NULL, trainCrashVehicle[TCV_DINGHY], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
|
|
CLOSE_SEQUENCE_TASK(sequence)
|
|
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), sequence)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) <> FINISHED_TASK
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
LOAD_STREAM("Boats_Jump", "EXILE_3_SOUNDS")
|
|
IF NOT IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<-3390, 3000, -10>>, <<-281, 5746, 100>>, FALSE)
|
|
MISSION_FAILED(FAIL_ABANDONED_ESCAPE_ROUTE)
|
|
ENDIF
|
|
|
|
IF NOT bLateAimAtRapids
|
|
IF bDidntPullAwayFromContainer
|
|
VECTOR vDinghyPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
|
|
IF vDinghyPos.y < 4428.5
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
DO_MICHAEL_FOLLOW_BOAT_WAYPOINT(8, FALSE)
|
|
bLateAimAtRapids = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//HANDLE_MICHAEL_TREVOR_BOAT_SWAP_IN_RAPIDS()
|
|
HANDLE_MICHAEL_DRIVING()
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(trainCrashVehicle[TCV_DINGHY], 24)
|
|
ENDIF
|
|
|
|
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
BLIP_RIVER_MOUTH()
|
|
IF NOT bDoneGotoSpeech
|
|
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_RAPIDS")
|
|
IF bDoneGotoSpeech
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 14.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// cutaway
|
|
VECTOR vPlayerCoords
|
|
vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF NOT bDoneWaterfallCutaway
|
|
// cutscene
|
|
IF vPlayerCoords.z < 19.0
|
|
bDoneWaterfallCutaway = TRUE
|
|
bSkippedWaterfallCutaway = TRUE
|
|
SET_MISSION_STAGE(STAGE_RAPIDS_CHASE)
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
AND NOT IS_PED_INJURED(GET_MICHAEL_PED())
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
IF hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
IF vPlayerCoords.y < 4431.22
|
|
AND vPlayerCoords.y > 4411.61
|
|
IF vPlayerCoords.x < -540.0
|
|
AND vPlayerCoords.z > 27.6
|
|
IF GET_ENTITY_SPEED(trainCrashVehicle[TCV_DINGHY]) >= 5.0
|
|
AND IS_PED_AT_CORRECT_HEADING(GET_MICHAEL_PED(), 84.8, 45)
|
|
IF CAN_ADVANCE_MISSION()
|
|
AND (boatHotswapState = BOAT_HOTSWAP_ON_TREVOR OR boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL)
|
|
bSkippedWaterfallCutaway = FALSE
|
|
bRunningCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
DO_WATERFALL_CUTSCENE()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// should do a specific rapids speech interrupt?
|
|
FUNC BOOL SHOULD_DO_RAPIDS_SPEECH_INTERRUPT(RAPIDS_SPEECH_INTERRUPT_ENUM thisInterrupt)
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
VECTOR vBoatPos = GET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY])
|
|
|
|
SWITCH thisInterrupt
|
|
CASE RSI_CHOPPER_INTRO
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_HELI_WAVE]
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh, <<120,120,120>>, FALSE, FALSE)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
|
|
IF GET_TIME_POSITION_IN_RECORDING(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh) >= 8000
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_CHOPPER_REMINDER
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_HELI_WAVE]
|
|
IF vBoatPos.x < -1660
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_BOATS_INTRO
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_BOATS_REMINDER_1
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
|
|
IF vBoatPos.x < -885
|
|
AND GET_GAME_TIMER() >= iLastBoatReminderTime + 12000
|
|
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
AND CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
//RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_BOATS_REMINDER_2
|
|
IF vBoatPos.x < -885
|
|
AND GET_GAME_TIMER() >= iLastBoatReminderTime + 12000
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
|
|
BOOL b1, b2
|
|
b1 = CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
b2 = CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
IF (b1 OR b2)
|
|
AND NOT (b1 AND b2)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_BOATS_REMINDER_3
|
|
IF vBoatPos.x < -885
|
|
AND GET_GAME_TIMER() >= iLastBoatReminderTime + 12000
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
|
|
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
OR CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_CARS_INTRO
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh)
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh, <<100,100,100>>, FALSE, FALSE)
|
|
IF vBoatPos.x < -955
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_CARS_REMINDER
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh)
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh, <<100,100,100>>, FALSE, FALSE)
|
|
IF vBoatPos.x < -1100
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_CARS_REMINDER_2
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh)
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh, <<100,100,100>>, FALSE, FALSE)
|
|
IF vBoatPos.x < -1310
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_M_DEST_CHOPPER
|
|
CASE RSI_M_DEST_BOAT
|
|
CASE RSI_T_DEST_CHOPPER
|
|
CASE RSI_T_DEST_BOAT
|
|
IF GET_GAME_TIMER() <= iRapidsSpeechInterruptTime + 3000
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// chased down the rapids
|
|
PROC DO_STAGE_RAPIDS_CHASE()
|
|
IF NOT bRunningCutscene
|
|
// remove crash
|
|
INT i
|
|
VECTOR vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
|
|
|
|
IF NOT bDoMopUp
|
|
IF NOT IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<-3390, 3000, -10>>, <<-281, 5746, 100>>, FALSE)
|
|
MISSION_FAILED(FAIL_ABANDONED_ESCAPE_ROUTE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// remove freight container model
|
|
IF NOT bRemovedCrashModels
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-520.18628, 4423.46436, 29.99983>>, <<400,400,400>>, FALSE, FALSE)
|
|
IF DOES_ENTITY_EXIST(hangingCarriageVehicle)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(hangingCarriageVehicle)
|
|
ENDIF
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_TRAIN_CONTAINER2))
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX1)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX1)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX2)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX2)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisFallPTFX3)
|
|
STOP_PARTICLE_FX_LOOPED(debrisFallPTFX3)
|
|
ENDIF
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(debrisSplashPTFX)
|
|
STOP_PARTICLE_FX_LOOPED(debrisSplashPTFX)
|
|
ENDIF
|
|
|
|
bRemovedCrashModels = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// handle swap between michael and trevor
|
|
HANDLE_MICHAEL_TREVOR_BOAT_SWAP_IN_RAPIDS()
|
|
HANDLE_MICHAEL_DRIVING()
|
|
HANDLE_BOAT_RPG()
|
|
|
|
// handle beach creation
|
|
HANDLE_BEACH_CREATION()
|
|
|
|
// on trevor
|
|
IF NOT IS_SELECTOR_ONSCREEN()
|
|
IF bAreShowingMichaelReverseSwitchCam
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
bAreShowingMichaelReverseSwitchCam = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(explodeVehicle)
|
|
IF GET_GAME_TIMER() >= iLastExplodeTime + 50
|
|
//EXPLODE_VEHICLE(explodeVehicle)
|
|
explodeVehicle = NULL
|
|
ENDIF
|
|
ELSE
|
|
explodeVehicle = NULL
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_VEHICLE_AT_RAPIDS_SLOW_DOWN_AREA(trainCrashVehicle[TCV_DINGHY])
|
|
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(trainCrashVehicle[TCV_DINGHY], 18)
|
|
ELSE
|
|
//VEHICLE_WAYPOINT_PLAYBACK_USE_DEFAULT_SPEED(trainCrashVehicle[TCV_DINGHY])
|
|
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(trainCrashVehicle[TCV_DINGHY], 24) //25
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//[MF] Prevent the player from making a switch while Trevor is still getting into position.
|
|
// we need to be able to do this - maybe short range code switches are the answer.
|
|
//IF boatRPGState <= BOAT_RPG_GET_IN_POSITION
|
|
// DISABLE_SELECTOR_THIS_FRAME()
|
|
//ENDIF
|
|
|
|
// chase enemies
|
|
FOR i=EW_CHASE_FIRST_HELI_WAVE TO EW_CHASE_FIRST_CAR_WAVE//EW_FLEE_WAVE
|
|
ENEMY_WAVE_ENUM thisWaveEnum = INT_TO_ENUM(ENEMY_WAVE_ENUM, i)
|
|
IF NOT bTriggeredEnemyWave[i]
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
OR (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR AND boatRPGState >= BOAT_RPG_GET_IN_POSITION)
|
|
BOOL bTrigger = FALSE
|
|
BOOL bBlip = FALSE
|
|
|
|
SWITCH thisWaveEnum
|
|
CASE EW_CHASE_FIRST_HELI_WAVE
|
|
IF vPlayerCoords.x <= -1370.2
|
|
//AND vPlayerCoords.z <= 22.97
|
|
bTrigger = TRUE
|
|
//bBlip = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
//CASE EW_CHASE_SECOND_HELI_WAVE
|
|
// IF vPlayerCoords.x <= -987.23
|
|
// bTrigger = TRUE
|
|
// bBlip = FALSE
|
|
// ENDIF
|
|
//BREAK
|
|
|
|
CASE EW_CHASE_FIRST_BOAT_WAVE
|
|
IF vPlayerCoords.x <= -590.10
|
|
OR bDoneWaterfallCutaway
|
|
bTrigger = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
//CASE EW_CHASE_SECOND_BOAT_WAVE
|
|
// IF vPlayerCoords.x <= -910.23
|
|
//bTrigger = TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
|
|
//CASE EW_CHASE_THIRD_BOAT_WAVE
|
|
// IF vPlayerCoords.x <= -1168.10
|
|
// bTrigger = TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
|
|
//CASE EW_CHASE_FOURTH_BOAT_WAVE
|
|
// IF vPlayerCoords.x <= -1381.10
|
|
// bTrigger = TRUE
|
|
// ENDIF
|
|
//BREAK
|
|
|
|
//CASE EW_CHASE_BRIDGE_WAVE
|
|
// IF vPlayerCoords.x <= -590.10
|
|
// bTrigger = TRUE
|
|
// bBlip = FALSE
|
|
// ENDIF
|
|
//BREAK
|
|
|
|
CASE EW_CHASE_FIRST_CAR_WAVE
|
|
IF vPlayerCoords.x <= -590.10
|
|
bTrigger = TRUE
|
|
bBlip = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
//CASE EW_FLEE_WAVE
|
|
// IF vPlayerCoords.x <= -1615.10
|
|
// bTrigger = TRUE
|
|
// bBlip = FALSE
|
|
// ENDIF
|
|
//BREAK
|
|
ENDSWITCH
|
|
|
|
IF bTrigger
|
|
CREATE_ENEMY_WAVE(thisWaveEnum, bBlip, STAGE_RAPIDS_CHASE)
|
|
|
|
SWITCH thisWaveEnum
|
|
CASE EW_CHASE_FIRST_CAR_WAVE
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_MERC_CAR))
|
|
BREAK
|
|
CASE EW_CHASE_FIRST_HELI_WAVE
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_CHASE_CHOPPER))
|
|
BREAK
|
|
CASE EW_CHASE_FIRST_BOAT_WAVE
|
|
CLEAR_MODEL_REQUEST(ENUM_TO_INT(TCM_ENEMY_DINGHY))
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
bTriggeredEnemyWave[thisWaveEnum] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bEnemyWaveState[thisWaveEnum] = HANDLE_ENEMY_WAVE(thisWaveEnum)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
// boat transitions
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
|
|
FOR i=EV_CHASE_FIRST_BOAT_WAVE_BOAT_1 TO EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
|
|
VECTOR vBoatPos = GET_ENTITY_COORDS(enemyVehicle[i].veh)
|
|
FLOAT fDist = GET_DISTANCE_BETWEEN_ENTITIES(enemyVehicle[i].veh, PLAYER_PED_ID(), FALSE)
|
|
enemyVehicle[i].bInSlowDownArea = IS_VEHICLE_AT_RAPIDS_SLOW_DOWN_AREA(enemyVehicle[i].veh, FALSE)
|
|
|
|
INT iBoatSound
|
|
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
iBoatSound = 0
|
|
ELSE
|
|
iBoatSound = 1
|
|
ENDIF
|
|
|
|
IF NOT bDoneBoatSound[iBoatSound]
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
|
|
FLOAT fTimeToPlay
|
|
IF iBoatSound=0
|
|
fTimeToPlay = 4000
|
|
ELSE
|
|
fTimeToPlay = 4700
|
|
ENDIF
|
|
IF GET_TIME_POSITION_IN_RECORDING(enemyVehicle[i].veh) >= fTimeToPlay
|
|
PLAY_SOUND_FROM_ENTITY(-1, "BOAT_WAVE_HIT_SCRIPT", enemyVehicle[i].veh)
|
|
bDoneBoatSound[iBoatSound] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// handle recording speed
|
|
IF enemyVehicle[i].iAiStage = 0
|
|
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
|
|
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
IF vBoatPos.x < -917
|
|
IF IS_ENTITY_AT_ENTITY(enemyVehicle[i].veh, enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, <<10,10,10>>, FALSE, FALSE)
|
|
fEnemyBoatSpeed = fEnemyBoatSpeed -@ 0.1
|
|
IF fEnemyBoatSpeed < 0.75
|
|
fEnemyBoatSpeed = 0.75
|
|
ENDIF
|
|
ELSE
|
|
fEnemyBoatSpeed = fEnemyBoatSpeed +@ 0.1
|
|
IF fEnemyBoatSpeed > 1.2
|
|
fEnemyBoatSpeed = 1.2
|
|
ENDIF
|
|
ENDIF
|
|
SET_PLAYBACK_SPEED(enemyVehicle[i].veh, fEnemyBoatSpeed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF enemyVehicle[i].iAiStage = 1
|
|
IF bDoMopUp
|
|
AND vBoatPos.x < -1800//1915
|
|
IF CAN_BOAT_DRIVE(enemyVehicle[i].veh)
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i), 2)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_VEHICLE_VISIBLE(enemyVehicle[i].veh)//(NOT IS_ENTITY_ON_SCREEN(enemyVehicle[i].veh) OR IS_ENTITY_OCCLUDED(enemyVehicle[i].veh))
|
|
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
|
|
AND fDist > 85//100
|
|
AND vBoatPos.x > vPlayerCoords.x
|
|
AND CAN_BOAT_DRIVE(enemyVehicle[i].veh)
|
|
AND NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyVehicle[i].veh))
|
|
FLOAT fRecTime = 0.0
|
|
VECTOR vRecPos = <<0,0,0>>
|
|
INT iRec
|
|
|
|
SWITCH INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
iRec = 009
|
|
BREAK
|
|
CASE EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
iRec = 016
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BOOL bDoRecording = TRUE
|
|
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
IF IS_ENTITY_AT_ENTITY(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, enemyVehicle[i].veh, <<12,12,12>>, FALSE, FALSE)
|
|
bDoRecording = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDoRecording
|
|
CALCULATE_POINT_TO_START_DRIVE_RECORDING(enemyVehicle[i].veh, iRec, fRecTime, vRecPos)
|
|
START_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[i].veh, iRec, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[i].veh, fRecTime)
|
|
SET_PLAYBACK_SPEED(enemyVehicle[i].veh, 1.2)
|
|
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
fEnemyBoatSpeed = 1.2
|
|
ENDIF
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyVehicle[i].veh, FALSE)
|
|
|
|
enemyVehicle[i].aiEnum = EVAI_FOLLOW_RECORDING
|
|
enemyVehicle[i].iAiStage = 0
|
|
ENDIF
|
|
ELSE
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
|
|
|
|
FLOAT fOverrideBoatSpeed = 26.0
|
|
|
|
//PRINTSTRING("speed = ") PRINTFLOAT(GET_ENTITY_SPEED(PLAYER_PED_ID())) PRINTNL()
|
|
|
|
|
|
IF NOT CAN_BOAT_DRIVE(enemyVehicle[i].veh)
|
|
AND NOT enemyVehicle[i].bInSlowDownArea
|
|
AND NOT (vBoatPos.x >= -923.2 AND vBoatPos.x <= -874.8)
|
|
IF GET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh) > 300
|
|
SET_VEHICLE_ENGINE_HEALTH(enemyVehicle[i].veh, 300)
|
|
ENDIF
|
|
fOverrideBoatSpeed = 0
|
|
ELSE
|
|
|
|
IF vBoatPos.x < vPlayerCoords.x - 5
|
|
fOverrideBoatSpeed = 0
|
|
ELSE
|
|
IF fDist < 20
|
|
fOverrideBoatSpeed = GET_ENTITY_SPEED(PLAYER_PED_ID()) - 15
|
|
IF fOverrideBoatSpeed < 0
|
|
fOverrideBoatSpeed = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// slow down area
|
|
IF enemyVehicle[i].bInSlowDownArea
|
|
fOverrideBoatSpeed = 20//16//18
|
|
ENDIF
|
|
|
|
// special case for 2nd boat
|
|
VECTOR vOtherBoatPos
|
|
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_1
|
|
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
IF IS_ENTITY_AT_ENTITY(enemyVehicle[i].veh, enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh, <<20,20,20>>, FALSE, FALSE) //15 //12
|
|
vOtherBoatPos = GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
IF vOtherBoatPos.x < vBoatPos.x - 4//5
|
|
fOverrideBoatSpeed = 6
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_BOAT_WAVE_BOAT_2
|
|
IF CAN_BOAT_DRIVE(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh)
|
|
IF IS_ENTITY_AT_ENTITY(enemyVehicle[i].veh, enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_1].veh, <<20,20,20>>, FALSE, FALSE) //12
|
|
vOtherBoatPos = GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_BOAT_WAVE_BOAT_2].veh)
|
|
|
|
IF vOtherBoatPos.x < vBoatPos.x - 5
|
|
fOverrideBoatSpeed = 8
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF i=enum_to_int(EV_CHASE_FIRST_BOAT_WAVE_BOAT_1)
|
|
// PRINTFLOAT(fOverrideBoatSpeed) printnl()
|
|
//ENDIF
|
|
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(enemyVehicle[i].veh, fOverrideBoatSpeed)
|
|
//printstring("override to 0") printnl()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
// cars
|
|
FOR i=EV_CHASE_FIRST_CAR_WAVE_CAR_1 TO EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
|
|
IF NOT bBlippedCarWave
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), enemyVehicle[i].veh, <<100,100,100>>, FALSE, FALSE)
|
|
BLIP_ENEMY_WAVE(EW_CHASE_FIRST_CAR_WAVE)
|
|
bBlippedCarWave = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF enemyVehicle[i].iAiStage = 1
|
|
FLOAT fStartDist
|
|
SWITCH INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i)
|
|
CASE EV_CHASE_FIRST_CAR_WAVE_CAR_1
|
|
fStartDist = 30//100
|
|
BREAK
|
|
//CASE EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
// fStartDist = 30
|
|
//BREAK
|
|
ENDSWITCH
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(trainCrashVehicle[TCV_DINGHY], enemyVehicle[i].veh) <= fStartDist
|
|
FORCE_ENEMY_VEHICLE_AI_STAGE(INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i), 99)
|
|
ENDIF
|
|
ELSE
|
|
VECTOR vCarPos = GET_ENTITY_COORDS(enemyVehicle[i].veh)
|
|
FLOAT fOverrideSpeed = -1
|
|
FLOAT fMaxSpeed = 80.0
|
|
FLOAT fMinSpeed = 0.0
|
|
FLOAT fDistanceAhead= -25.0//0.0
|
|
|
|
IF vCarPos.x > -895
|
|
// override at bridge
|
|
fOverrideSpeed = 30.0//60.0
|
|
ELSE
|
|
IF vCarPos.x < -1056
|
|
AND vCarPos.x > -1090
|
|
fMaxSpeed = 20.0
|
|
ENDIF
|
|
|
|
//IF vCarPos.x < -1559
|
|
//AND vCarPos.x > -1653
|
|
// fDistanceAhead = 20.0
|
|
//ENDIF
|
|
|
|
IF vPlayerCoords.x < vCarPos.x + fDistanceAhead
|
|
fOverrideSpeed = fMaxSpeed
|
|
ELSE
|
|
fOverrideSpeed = fMinSpeed
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// avoid front car
|
|
/*
|
|
IF fOverrideSpeed > 0
|
|
IF INT_TO_ENUM(ENEMY_VEHICLE_ENUM, i) = EV_CHASE_FIRST_CAR_WAVE_CAR_2
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh)
|
|
IF IS_ENTITY_AT_ENTITY(enemyVehicle[EV_CHASE_FIRST_CAR_WAVE_CAR_1].veh, enemyVehicle[i].veh, <<8,8,8>>, FALSE, FALSE)
|
|
fOverrideSpeed = 20
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[i].veh)
|
|
IF fOverrideSpeed >= 0
|
|
VEHICLE_WAYPOINT_PLAYBACK_OVERRIDE_SPEED(enemyVehicle[i].veh, fOverrideSpeed)
|
|
ELSE
|
|
VEHICLE_WAYPOINT_PLAYBACK_USE_DEFAULT_SPEED(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
// chopper audio
|
|
IF NOT bStartedChopper4AudioScene
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
|
|
IF GET_GAME_TIMER() >= iCreatedWaveTime[EW_CHASE_FIRST_HELI_WAVE] + 2000
|
|
START_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_HELI_4)
|
|
bStartedChopper4AudioScene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoMopUp
|
|
IF CAN_ADVANCE_MISSION()
|
|
//IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_RIVER_MOUTH), <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
//IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_RIVER_MOUTH), <<100, 100, LOCATE_SIZE_HEIGHT>>, FALSE, FALSE)
|
|
IF vPlayerCoords.x < -1750//-1731.58
|
|
//OR (iTriggerFleeWaveTime > 0 AND GET_GAME_TIMER() >= iTriggerFleeWaveTime + 6000)
|
|
//REMOVE_ALL_BLIPS()
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_BLIP(gotoBlip)
|
|
ENDIF
|
|
REMOVE_MISSION_TEXT(FALSE)
|
|
bDoneGotoSpeech = TRUE
|
|
|
|
IF bEnemyWaveState[EW_CHASE_FIRST_HELI_WAVE]
|
|
OR bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
|
|
//OR bEnemyWaveState[EW_CHASE_SECOND_BOAT_WAVE]
|
|
//OR bEnemyWaveState[EW_CHASE_FOURTH_BOAT_WAVE]
|
|
OR bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
|
|
bShownGodText = FALSE
|
|
ELSE
|
|
bShownGodText = TRUE
|
|
ENDIF
|
|
|
|
bDoMopUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
fMopUpAccuracy = fMopUpAccuracy +@ 3.0
|
|
IF fMopUpAccuracy > 30
|
|
fMopUpAccuracy = 30
|
|
ENDIF
|
|
// increase enemy accuracy
|
|
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
SET_PED_ACCURACY(enemyPed[i].ped, FLOOR(fMopUpAccuracy))
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
//IF NOT bEnemyWaveState[EW_FLEE_WAVE]
|
|
IF NOT bEnemyWaveState[EW_CHASE_FIRST_HELI_WAVE]
|
|
AND NOT bEnemyWaveState[EW_CHASE_FIRST_BOAT_WAVE]
|
|
//AND NOT bEnemyWaveState[EW_CHASE_SECOND_BOAT_WAVE]
|
|
//AND NOT bEnemyWaveState[EW_CHASE_FOURTH_BOAT_WAVE]
|
|
AND NOT bEnemyWaveState[EW_CHASE_FIRST_CAR_WAVE]
|
|
IF iAdvanceToGetHomeTime < 0
|
|
iAdvanceToGetHomeTime = GET_GAME_TIMER() + 800
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iAdvanceToGetHomeTime
|
|
// chase no longer needed
|
|
REPEAT COUNT_OF(enemyPed) i
|
|
IF DOES_ENTITY_EXIST(enemyPed[i].ped)
|
|
// clear the enemy driver tasks
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
ENEMY_PED_ENUM thisPedEnum = INT_TO_ENUM(ENEMY_PED_ENUM, i)
|
|
IF thisPedEnum = EP_CHASE_FIRST_BOAT_WAVE_BOAT_1_DRIVER
|
|
OR thisPedEnum = EP_CHASE_FIRST_BOAT_WAVE_BOAT_2_DRIVER
|
|
//OR thisPedEnum = EP_CHASE_SECOND_BOAT_WAVE_BOAT_1_DRIVER
|
|
//OR thisPedEnum = EP_CHASE_FOURTH_BOAT_WAVE_BOAT_1_DRIVER
|
|
CLEAR_PED_TASKS(enemyPed[i].ped)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_AS_NO_LONGER_NEEDED(enemyPed[i].ped)
|
|
ENDIF
|
|
ENDREPEAT
|
|
REPEAT COUNT_OF(enemyVehicle) i
|
|
IF DOES_ENTITY_EXIST(enemyVehicle[i].veh)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyVehicle[i].veh)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF CAN_ADVANCE_MISSION()
|
|
AND hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = PERFORMING_TASK
|
|
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
SET_MISSION_STAGE(STAGE_GET_HOME)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BOOL bDoMopUpStuff = FALSE
|
|
IF currentMissionStage <> STAGE_GET_HOME
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR AND boatRPGState >= BOAT_RPG_GET_IN_POSITION AND boatRPGState < BOAT_RPG_DONE
|
|
bDoMopUpStuff = TRUE
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
bDoMopUpStuff = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDoMopUpStuff
|
|
// check interrupts
|
|
IF NOT bRapidsSpeechInterruptPending
|
|
FOR i=RSI_CHOPPER_INTRO TO RSI_CARS_REMINDER_2
|
|
IF NOT bDoneRapidsSpeechInterrupt[i]
|
|
IF bShownGodText OR INT_TO_ENUM(RAPIDS_SPEECH_INTERRUPT_ENUM, i) = RSI_BOATS_INTRO OR boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
|
|
IF SHOULD_DO_RAPIDS_SPEECH_INTERRUPT(INT_TO_ENUM(RAPIDS_SPEECH_INTERRUPT_ENUM, i))
|
|
pendingRapidsSpeechInterrupt = INT_TO_ENUM(RAPIDS_SPEECH_INTERRUPT_ENUM, i)
|
|
bDoneRapidsSpeechInterrupt[i] = TRUE
|
|
bRapidsSpeechInterruptPending = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
// banter
|
|
IF iRapidsSpeechStage < 3
|
|
//IF bShownGodText
|
|
IF NOT IS_MESSAGE_BEING_DISPLAYED()
|
|
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
BOOL bCanDoBanter = FALSE
|
|
|
|
STRING sBanter
|
|
SWITCH iRapidsSpeechStage
|
|
CASE 0
|
|
IF vPlayerCoords.x < -719
|
|
bCanDoBanter = TRUE
|
|
ENDIF
|
|
IF iReplayAttempt % 2 = 0
|
|
sBanter = "EXL3_ESCAPE1"
|
|
ELSE
|
|
sBanter = "EXL3_ESCAP1b"
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF vPlayerCoords.x < -1185
|
|
bCanDoBanter = TRUE
|
|
ENDIF
|
|
sBanter = "EXL3_COOL"
|
|
BREAK
|
|
CASE 2
|
|
IF vPlayerCoords.x < -1534
|
|
bCanDoBanter = TRUE
|
|
ENDIF
|
|
IF iReplayAttempt % 2 = 0
|
|
sBanter = "EXL3_DOCK1"
|
|
ELSE
|
|
sBanter = "EXL3_DOCK1b"
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF bCanDoBanter
|
|
IF bDoneRapidsSpeechInterrupt[RSI_BOATS_INTRO]
|
|
AND NOT bRapidsSpeechInterruptPending
|
|
IF bShownGodText OR boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
|
|
IF DO_MISSION_SPEECH(sBanter)
|
|
iRapidsSpeechStage++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bSavedBanter
|
|
IF RESTORE_BANTER()
|
|
bSavedBanter = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT SHOULD_DO_RAPIDS_SPEECH_INTERRUPT(pendingRapidsSpeechInterrupt)
|
|
bRapidsSpeechInterruptPending = FALSE
|
|
ELSE
|
|
STRING sRapidsSpeechInterrupt
|
|
VECTOR vOffset
|
|
|
|
SWITCH pendingRapidsSpeechInterrupt
|
|
CASE RSI_CHOPPER_INTRO
|
|
// get the offset
|
|
vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], GET_ENTITY_COORDS(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh))
|
|
IF vOffset.y < 0
|
|
sRapidsSpeechInterrupt = "EXL3_TCHOP2"
|
|
ELSE
|
|
sRapidsSpeechInterrupt = "EXL3_TCHOP1"
|
|
IF boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
|
|
IF NOT IS_ENTITY_ON_SCREEN(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
|
|
sRapidsSpeechInterrupt = "EXL3_SEECHP2"
|
|
ENDIF
|
|
ELIF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
|
|
IF IS_ENTITY_ON_SCREEN(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
|
|
AND NOT IS_ENTITY_OCCLUDED(enemyVehicle[EV_CHASE_FIRST_HELI_WAVE_CHOPPER_1].veh)
|
|
sRapidsSpeechInterrupt = "EXL3_SEECHP2"
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE RSI_CHOPPER_REMINDER
|
|
sRapidsSpeechInterrupt = "EXL3_SEECHP1"
|
|
BREAK
|
|
CASE RSI_BOATS_INTRO
|
|
sRapidsSpeechInterrupt = "EXL3_TBOAT1"
|
|
BREAK
|
|
CASE RSI_BOATS_REMINDER_1
|
|
sRapidsSpeechInterrupt = "EXL3_SEEBT1"
|
|
BREAK
|
|
CASE RSI_BOATS_REMINDER_2
|
|
sRapidsSpeechInterrupt = "EXL3_TBOAT2"
|
|
BREAK
|
|
CASE RSI_BOATS_REMINDER_3
|
|
sRapidsSpeechInterrupt = "EXL3_SEEBT2"
|
|
BREAK
|
|
CASE RSI_CARS_INTRO
|
|
sRapidsSpeechInterrupt = "EXL3_CARS1"
|
|
BREAK
|
|
CASE RSI_CARS_REMINDER
|
|
sRapidsSpeechInterrupt = "EXL3_CARS2"
|
|
BREAK
|
|
CASE RSI_CARS_REMINDER_2
|
|
sRapidsSpeechInterrupt = "EXL3_CARS2"
|
|
BREAK
|
|
CASE RSI_M_DEST_CHOPPER
|
|
sRapidsSpeechInterrupt = "EXL3_MHELI"
|
|
BREAK
|
|
CASE RSI_M_DEST_BOAT
|
|
sRapidsSpeechInterrupt = "EXL3_MBOAT"
|
|
BREAK
|
|
CASE RSI_T_DEST_CHOPPER
|
|
sRapidsSpeechInterrupt = "EXL3_THELI"
|
|
BREAK
|
|
CASE RSI_T_DEST_BOAT
|
|
sRapidsSpeechInterrupt = "EXL3_TBOAT"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF DO_MISSION_SPEECH(sRapidsSpeechInterrupt)
|
|
IF pendingRapidsSpeechInterrupt = RSI_BOATS_REMINDER_1
|
|
OR pendingRapidsSpeechInterrupt = RSI_BOATS_REMINDER_2
|
|
OR pendingRapidsSpeechInterrupt = RSI_BOATS_REMINDER_3
|
|
iLastBoatReminderTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
bRapidsSpeechInterruptPending = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BLIP_RIVER_MOUTH()
|
|
|
|
/*
|
|
// temp
|
|
BOOL bCanDoBlockedSpeech = FALSE
|
|
VECTOR vBlockedOffset
|
|
FOR i=EV_FLEE_WAVE_BOAT_1 TO EV_FLEE_WAVE_BOAT_2
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[i].veh)
|
|
vBlockedOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(trainCrashVehicle[TCV_DINGHY], GET_ENTITY_COORDS(enemyVehicle[i].veh))
|
|
IF vBlockedOffset.y > 0
|
|
bCanDoBlockedSpeech = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF bCanDoBlockedSpeech
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0,3)
|
|
CASE 0
|
|
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_BLOCKED")
|
|
BREAK
|
|
CASE 1
|
|
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_BLOCK2")
|
|
BREAK
|
|
CASE 2
|
|
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_BLOCK")
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
IF NOT IS_MESSAGE_BEING_DISPLAYED()
|
|
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bDoneGotoSpeech = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
|
|
|
|
IF NOT bShownGodText
|
|
IF bDoMopUp
|
|
bShownGodText = DO_MISSION_GOD_TEXT("TC_MOPUP")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// end cutscene
|
|
PROC DO_END_CUTSCENE()
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
|
|
SWITCH cutsceneStage
|
|
CASE TC_CUT_STAGE_INIT
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(michaelPed, "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(trevorPed)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(trevorPed, "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(trainCrashVehicle[TCV_BEACH_CAR], "EXL_3_Parked_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(trainCrashVehicle[TCV_BEACH_TRUCK], "EXL_3_Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
//IF DOES_ENTITY_EXIST(caseObject)
|
|
// DETACH_ENTITY(caseObject)
|
|
// REGISTER_ENTITY_FOR_CUTSCENE(caseObject, "P_IDOL_CASE_S", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
//ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
CUTSCENE_OPTION_FLAGS flags
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
flags = CUTSCENE_NO_OPTIONS
|
|
ELSE
|
|
flags = CUTSCENE_PLAYER_FP_FLASH_TREVOR
|
|
ENDIF
|
|
|
|
START_CUTSCENE(flags)
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
cutsceneStage = TC_CUT_STAGE_RUNNING
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_RUNNING
|
|
IF NOT bClearedForCutscene
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_MISSION_MOCAP_CUTSCENE()
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(caseObject)
|
|
DELETE_OBJECT(caseObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(michaelPed)
|
|
REMOVE_WEAPON_FROM_PED(michaelPed, GET_TRAIN_CRASH_WEAPON_TYPE(TC_WEAPON_CASE))
|
|
ENDIF
|
|
|
|
IF bSetTrevorHelmet
|
|
IF NOT IS_PED_INJURED(GET_TREVOR_PED())
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_TREVOR_PED(), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, FALSE)
|
|
SET_PLAYER_PED_WITH_HEADSET(CHAR_TREVOR, FALSE)
|
|
|
|
// shift the boat
|
|
IF NOT IS_ENTITY_DEAD(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_ENTITY_AT_COORD(trainCrashVehicle[TCV_DINGHY], <<-2429.61523, 4255.58350, 5.82557>>, <<12,12,12>>)
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-2445.39355, 4259.45508, 2.82917>>)
|
|
SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], 160.2)
|
|
//SET_VEHICLE_ON_GROUND_PROPERLY(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_DINGHY])
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
// clear the area
|
|
STOP_FIRE_IN_RANGE(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), 20)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), 20)
|
|
CLEAR_AREA(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), 20.0, TRUE)
|
|
|
|
STOP_VEHICLE_FIRE(trainCrashVehicle[TCV_BEACH_CAR])
|
|
STOP_VEHICLE_FIRE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
|
|
bDoTrevorBoom = TRUE
|
|
ENDIF
|
|
|
|
bClearedForCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("P_IDOL_CASE_S")
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("EXL_3_Parked_car")
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(trainCrashVehicle[TCV_BEACH_CAR])
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_BEACH_CAR], VEHICLELOCK_UNLOCKED)
|
|
SET_VEHICLE_TYRES_CAN_BURST(trainCrashVehicle[TCV_BEACH_CAR], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_GetOutUndriveableVehicle, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
REMOVE_TREVOR_MG()
|
|
bSuppressRemoveTrevorMG = TRUE
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE)
|
|
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("EXL_3_Michaels_car")
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BEACH_TRUCK], TRUE, TRUE)
|
|
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_BEACH_TRUCK], 12.0)
|
|
START_PLAYBACK_RECORDED_VEHICLE_USING_AI(trainCrashVehicle[TCV_BEACH_TRUCK], 008, GET_TRAIN_CRASH_RECORDING_PREFIX(), 21, DRIVINGMODE_PLOUGHTHROUGH)
|
|
SET_VEHICLE_DOOR_SHUT(trainCrashVehicle[TCV_BEACH_TRUCK], SC_DOOR_FRONT_LEFT)
|
|
//SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER(trainCrashVehicle[TCV_BEACH_TRUCK], 1000, DRIVINGMODE_PLOUGHTHROUGH)
|
|
//START_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_BEACH_TRUCK], 008, GET_TRAIN_CRASH_RECORDING_PREFIX())
|
|
//SET_PLAYBACK_SPEED(trainCrashVehicle[TCV_BEACH_TRUCK], 1.2)
|
|
//SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_BEACH_TRUCK], 3440)
|
|
//FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
//PRINTSTRING("CAR EXIT STATE!") PRINTNL()
|
|
ENDIF
|
|
|
|
bMichaelDroveOff = TRUE
|
|
iMichaelDriveOffTime = GET_GAME_TIMER()
|
|
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
WAIT(500)
|
|
ENDIF
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE)
|
|
|
|
IF bDoTrevorBoom
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
|
|
//ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DEBUG_SKIP_MOCAP()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE TC_CUT_STAGE_CLEANUP
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC HIDE_AMMO_AS_MICHAEL()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
DISPLAY_AMMO_THIS_FRAME(FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// get home
|
|
PROC DO_STAGE_GET_HOME()
|
|
IF NOT bRunningCutscene
|
|
IF NOT bMichaelDroveOff
|
|
IF NOT bGotToBeach
|
|
// handle swap between michael and trevor
|
|
HANDLE_MICHAEL_TREVOR_BOAT_SWAP_IN_RAPIDS()
|
|
HANDLE_MICHAEL_DRIVING()
|
|
HANDLE_BOAT_RPG()
|
|
|
|
// handle beach creation
|
|
HANDLE_BEACH_CREATION()
|
|
|
|
// [MF] Make sure we abort the character select preview cam if player releases button and it's active in this section
|
|
IF NOT IS_SELECTOR_ONSCREEN()
|
|
IF bAreShowingMichaelReverseSwitchCam
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
bAreShowingMichaelReverseSwitchCam = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BOOL bCanDoStuff = FALSE
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR //AND boatRPGState >= BOAT_RPG_GET_IN_POSITION AND boatRPGState < BOAT_RPG_DONE
|
|
REMOVE_DINGHY_BLIP_AND_TEXT()
|
|
bCanDoStuff = TRUE
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF HANDLE_GET_TO_LOCATION(TRUE, FALSE)
|
|
bCanDoStuff = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCanDoStuff
|
|
IF boatHotswapState = BOAT_HOTSWAP_ON_MICHAEL
|
|
IF NOT DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_ALL_BLIPS()
|
|
gotoBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH))
|
|
ELSE
|
|
IF CAN_ADVANCE_MISSION()
|
|
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH), <<7, 7, LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_BLIP(gotoBlip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// goto speech
|
|
IF NOT bDoneGotoSpeech
|
|
bDoneGotoSpeech = DO_MISSION_SPEECH("EXL3_GDOCK")
|
|
IF bDoneGotoSpeech
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneLandAtBeachCue
|
|
bDoneLandAtBeachCue = TRIGGER_MISSION_MUSIC_EVENT("EXL3_BEACH")
|
|
ENDIF
|
|
|
|
// god text
|
|
IF NOT bShownGodText
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
bShownGodText = DO_MISSION_GOD_TEXT("TC_DROPOFF")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// banter stuff
|
|
IF bShownGodText OR boatHotswapState = BOAT_HOTSWAP_ON_TREVOR
|
|
IF NOT bDoneDriveHomeBanter
|
|
IF IS_PED_SITTING_IN_VEHICLE(GET_TREVOR_PED(), trainCrashVehicle[TCV_DINGHY])
|
|
AND IS_PED_SITTING_IN_VEHICLE(GET_MICHAEL_PED(), trainCrashVehicle[TCV_DINGHY])
|
|
bDoneDriveHomeBanter = DO_MISSION_SPEECH("EXL3_BANTER2")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// kill banter
|
|
IF NOT bKilledDriveHomeBanter
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH), <<150, 150, 150>>, FALSE, FALSE)
|
|
KILL_ANY_CONVERSATION()
|
|
bKilledDriveHomeBanter = TRUE
|
|
bDoneDriveHomeBanter = TRUE
|
|
ELSE
|
|
IF bSavedBanter
|
|
IF IS_PED_SITTING_IN_VEHICLE(GET_TREVOR_PED(), trainCrashVehicle[TCV_DINGHY])
|
|
AND IS_PED_SITTING_IN_VEHICLE(GET_MICHAEL_PED(), trainCrashVehicle[TCV_DINGHY])
|
|
IF RESTORE_BANTER()
|
|
bSavedBanter = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneCarSpeech
|
|
bDoneCarSpeech = DO_MISSION_SPEECH("EXL3_RONCAR")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// next stage when hit beach
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_BOAT_AT_BEACH(TRUE)
|
|
AND hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_AS_GROUP_MEMBER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PLAYER_GROUP_ID())
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
|
|
carBlip[0] = CREATE_MISSION_BLIP_FOR_VEHICLE(trainCrashVehicle[TCV_BEACH_CAR])
|
|
ENDIF
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
carBlip[1] = CREATE_MISSION_BLIP_FOR_VEHICLE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_VEHICLE_DOORS_LOCKED(trainCrashVehicle[TCV_DINGHY], VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
|
|
bShownGodText = FALSE
|
|
bGotToBeach = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneCarSpeech
|
|
bDoneCarSpeech = DO_MISSION_SPEECH("EXL3_RONCAR")
|
|
ENDIF
|
|
|
|
IF NOT bDoneAtBeachCue
|
|
bDoneAtBeachCue = TRIGGER_MUSIC_EVENT("EXL3_STOP")
|
|
ENDIF
|
|
|
|
PED_INDEX michaelPed = GET_MICHAEL_PED()
|
|
//PED_INDEX trevorPed = GET_TREVOR_PED()
|
|
|
|
IF NOT bShownGodText
|
|
bShownGodText = DO_MISSION_GOD_TEXT("TC_CAR")
|
|
ENDIF
|
|
|
|
IF NOT bDoneForceDinghyStop
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_ENTITY_IN_WATER(trainCrashVehicle[TCV_DINGHY])
|
|
AND NOT IS_ENTITY_IN_AIR(trainCrashVehicle[TCV_DINGHY])
|
|
BRING_VEHICLE_TO_HALT(trainCrashVehicle[TCV_DINGHY], 25.0, 5)
|
|
bDoneForceDinghyStop = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
HANDLE_STREAMING_MOCAP("exl_3_ext", GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST)
|
|
|
|
// abandon trevor check
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE) > ABANDON_BUDDY_FAIL_RANGE
|
|
MISSION_FAILED(FAIL_ABANDONED_TREVOR)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE) > ABANDON_BUDDY_FAIL_RANGE
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE) > 400
|
|
OR NOT bExtendMichaelAbandon
|
|
MISSION_FAILED(FAIL_ABANDONED_MICHAEL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// abandon vehicles check
|
|
FLOAT fDistanceFromGetaway = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), FALSE)
|
|
IF bBeenAtGetawayVehicles
|
|
IF fDistanceFromGetaway > STUCK_FAIL_RANGE_m
|
|
MISSION_FAILED(FAIL_ABANDONED_GETAWAY_VEHICLES)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH), <<320,320,320>>, FALSE, FALSE)
|
|
MISSION_FAILED(FAIL_ABANDONED_GETAWAY_VEHICLES)
|
|
ELSE
|
|
IF fDistanceFromGetaway < 80
|
|
AND bDoneLeaveBoatWithCase
|
|
bBeenAtGetawayVehicles = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// disable get out of boat
|
|
IF NOT IS_ENTITY_DEAD(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT bDoneLeaveBoatWithCase
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ENTER)
|
|
OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
SET_ENTITY_COORDS(michaelPed, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0,0,1>>)
|
|
SET_CASE_STATE(CASE_IN_HAND_ANIM_2)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
DISABLE_CELLPHONE(TRUE)
|
|
ENDIF
|
|
//HANG_UP_AND_PUT_AWAY_PHONE()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_DINGHY], FALSE, FALSE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(michaelPed, WEAPONTYPE_UNARMED, TRUE)
|
|
vMichaelAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", <<0,0,0>>, <<0,0,0>>, 0)
|
|
vMichaelAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", <<0,0,0>>, <<0,0,0>>, 0)
|
|
ATTACH_MICHAEL_TO_BOAT()
|
|
TASK_PLAY_ANIM(michaelPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
|
|
SET_PED_STEALTH_MOVEMENT(michaelPed, FALSE)
|
|
|
|
//SET_PED_WEAPON_MOVEMENT_CLIPSET(michaelPed, "move_m@briefcase")
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed)
|
|
|
|
STOP_TRAIN_CRASH_AUDIO_SCENE(TRAIN_CRASH_AUDIO_SCENE_GET_TO_BEACH)
|
|
|
|
bDoneLeaveBoatWithCase = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT bPutWeaponAway
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
|
|
bPutWeaponAway = TRUE
|
|
ENDIF
|
|
SET_PED_CAN_SWITCH_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
//SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_KeepWeaponHolsteredUnlessFired, TRUE)
|
|
//printstring("don't switch") printnl()
|
|
//WEAPON_TYPE weapon
|
|
//GET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], weapon)
|
|
//IF weapon <> WEAPONTYPE_UNARMED
|
|
// SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(michaelPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL")
|
|
FLOAT fPhase = GET_ENTITY_ANIM_CURRENT_TIME(michaelPed, GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL")
|
|
|
|
IF fPhase >= 0
|
|
IF NOT bForcedTrevorOutOfBoat
|
|
IF fPhase >= 0.42
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
TASK_LEAVE_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
bForcedTrevorOutOfBoat = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bAttachedCaseToHand
|
|
IF fPhase >= 0.65
|
|
SET_CASE_STATE(CASE_IN_HAND_GAMEPLAY)
|
|
HIDE_AMMO_AS_MICHAEL()
|
|
bAttachedCaseToHand = TRUE
|
|
ENDIF
|
|
ELSE
|
|
HIDE_AMMO_AS_MICHAEL()
|
|
ENDIF
|
|
|
|
IF fPhase >= 0.8
|
|
DETACH_ENTITY(michaelPed, FALSE, FALSE)
|
|
//CLEAR_PED_TASKS(michaelPed)
|
|
iDetachMichaelTime = GET_GAME_TIMER()
|
|
|
|
|
|
ELSE
|
|
vMichaelAttachToBoatPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", <<0,0,0>>, <<0,0,0>>, fPhase)
|
|
vMichaelAttachToBoatRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_TRAIN_CRASH_ANIM_DICT_AS_STRING(TC_ANIM_DICT_TRAIN), "EX03_DINGY_PICKUP_CASE_MICHAEL", <<0,0,0>>, <<0,0,0>>, fPhase)
|
|
HIDE_AMMO_AS_MICHAEL()
|
|
ATTACH_MICHAEL_TO_BOAT()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
|
|
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
|
|
IF GET_GAME_TIMER() <= iDetachMichaelTime + 2000
|
|
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_PED_ID(), -1)
|
|
CLEAR_SEQUENCE_TASK(sequence)
|
|
OPEN_SEQUENCE_TASK(sequence)
|
|
TASK_ACHIEVE_HEADING(NULL, GET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) + 90)
|
|
//TASK_JUMP(NULL, TRUE)
|
|
TASK_PAUSE(NULL, 800)
|
|
TASK_CLIMB(NULL, TRUE)
|
|
CLOSE_SEQUENCE_TASK(sequence)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sequence)
|
|
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
iPerformSequenceTime = GET_GAME_TIMER()
|
|
ELSE
|
|
IF GET_GAME_TIMER() >= iPerformSequenceTime + 2000
|
|
AND GET_GAME_TIMER() <= iPerformSequenceTime + 4000
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PEDMOVE_WALK)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<-2431.49878, 4254.95313, 5.48735>>, <<15,15,15>>)
|
|
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<-2439.87695, 4259.56592, 3.72802>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP)
|
|
iMichaelTaskTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
|
|
IF GET_SEQUENCE_PROGRESS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) = 1
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PEDMOVE_WALK)
|
|
ENDIF
|
|
ELIF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = PERFORMING_TASK
|
|
IF GET_GAME_TIMER() >= iMichaelTaskTime + 30000
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<-2439.87695, 4259.56592, 3.72802>>)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
bExtendMichaelAbandon = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// TEMP - REMOVE
|
|
//IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(),trainCrashVehicle[TCV_DINGHY])
|
|
// SET_CASE_STATE(CASE_IN_HAND_GAMEPLAY)
|
|
// bDoneLeaveBoatWithCase = TRUE
|
|
//ENDIF
|
|
|
|
IF bDoneLeaveBoatWithCase
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
HIDE_AMMO_AS_MICHAEL()
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bCutsceneWaitStarted
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
|
|
AND IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_BEACH_CAR], <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>)
|
|
OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), trainCrashVehicle[TCV_BEACH_TRUCK], <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>)
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES), <<13, 13, LOCATE_SIZE_HEIGHT>>)
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(GET_TREVOR_PED())
|
|
AND NOT IS_PED_IN_ANY_VEHICLE(GET_MICHAEL_PED())
|
|
AND NOT IS_ENTITY_ATTACHED(GET_MICHAEL_PED())
|
|
IF mocapStreamingStage > MOCAP_STREAMING_STAGE_REQUEST
|
|
IF CAN_PLAYER_START_CUTSCENE()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_PED_IN_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
TASK_LEAVE_ANY_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
ENDIF
|
|
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
//REMOVE_ALL_BLIPS()
|
|
KILL_ANY_CONVERSATION()
|
|
iCutsceneTriggerTime = GET_GAME_TIMER()
|
|
iCutsceneTriggerTime=iCutsceneTriggerTime
|
|
bCutsceneWaitStarted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//IF GET_GAME_TIMER() >= iCutsceneTriggerTime + DEFAULT_CAR_STOPPING_TO_CUTSCENE
|
|
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// PRINTSTRING("waiting for a conversation to finish") PRINTNL()
|
|
//ENDIF
|
|
//IF NOT HAS_CUTSCENE_LOADED()
|
|
// PRINTSTRING("waiting for the cutscene to load") PRINTNL()
|
|
//ENDIF
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CAN_ADVANCE_MISSION()
|
|
AND hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
REMOVE_ALL_BLIPS()
|
|
bRunningCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
MISSION_FAILED(FAIL_BEACH_CAR_DEAD)
|
|
ENDIF
|
|
|
|
//PRINTINT(GET_GAME_TIMER() - iMichaelDriveOffTime) PRINTNL()
|
|
|
|
IF GET_GAME_TIMER() >= iMichaelDriveOffTime + 9700//8500//7000
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
DELETE_VEHICLE(trainCrashVehicle[TCV_BEACH_TRUCK])
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BEACH_CAR])
|
|
SET_LAST_DRIVEN_VEHICLE(trainCrashVehicle[TCV_BEACH_CAR])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
MISSION_PASSED()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
DO_END_CUTSCENE()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// debug only
|
|
#IF IS_DEBUG_BUILD
|
|
// create widgets
|
|
PROC CREATE_TRAIN_CRASH_WIDGETS()
|
|
trainCrashWidgets = START_WIDGET_GROUP("Train Crash")
|
|
//trainCrashWidgets = START_WIDGET_GROUP("MISSION DEBUG")
|
|
ADD_WIDGET_BOOL("Override Speed", bDebugOverrideSpeed)
|
|
ADD_WIDGET_FLOAT_SLIDER("Speed", fDebugOverrideSpeed, 0, 30, 1)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Carriage to move", iDebugTrainPositions, -1, 9, 1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Train cam Offset", vDebugTrainCamOffset, -20, 20, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Train cam Point", vDebugTrainCamPoint, -20, 20, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Train cam FOV", fDebugTrainCamFOV, 0.0, 360.0, 0.5)
|
|
|
|
//ADD_WIDGET_VECTOR_SLIDER("Hanging carriage pos ", vHangingCarriagePos, -5000, 5000, 0.1)
|
|
//ADD_WIDGET_VECTOR_SLIDER("Hanging carriage rot ", vHangingCarriageRot, -360, 360, 0.1)
|
|
|
|
RBCamPosWidget = ADD_TEXT_WIDGET("Cam Position")
|
|
RBCamRotWidget = ADD_TEXT_WIDGET("Cam Rotation")
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Cam FOV", fRBDebugCamFOV, 0, 80, 1.0)
|
|
ADD_WIDGET_BOOL("Do Dump", bRBDebugCamDoDump)
|
|
|
|
//CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS()//[MF] Add in Switch Cam Script Specific Widgets
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
// setup the debug menu
|
|
PROC SETUP_TRAIN_CRASH_DEBUG_MENU()
|
|
stageMenu[0].sTxtLabel = "Cutscene EXILE_3_INT"
|
|
stageMenu[0].bSelectable = FALSE
|
|
stageMenu[1].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_INTERCEPT_TRAIN)
|
|
stageMenu[2].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_CHASE_TRAIN)
|
|
stageMenu[3].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_DRIVE_ALONG_TRAIN)
|
|
stageMenu[4].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GET_TO_BRIDGE)
|
|
stageMenu[5].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GO_TO_CONTAINER)
|
|
stageMenu[6].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_STEAL_FROM_CONTAINER)
|
|
stageMenu[7].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_RAPIDS_CHASE)
|
|
stageMenu[8].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GET_HOME)
|
|
stageMenu[9].sTxtLabel = "Cutscene EXL_3_EXT"
|
|
stageMenu[9].bSelectable = FALSE
|
|
//IF bEnabledTrainClimbers
|
|
// stageMenu[10].sTxtLabel = "Train climb enemies ENABLED"
|
|
//ELSE
|
|
// stageMenu[10].sTxtLabel = "Train climb enemies DISABLED"
|
|
//ENDIF
|
|
//IF bEnabledJeepOnTracks
|
|
// stageMenu[11].sTxtLabel = "Jeep on tracks ENABLED"
|
|
// stageMenu[11].sTxtLabel = "Jeep on tracks DISABLED"
|
|
//ENDIF
|
|
ENDPROC
|
|
|
|
// debug skips
|
|
PROC DO_DEBUG_SKIPS()
|
|
// mission pass S
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
|
|
bThoroughCleanup = TRUE
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
MISSION_PASSED()
|
|
ENDIF
|
|
|
|
// mission fail F
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
|
|
MISSION_FAILED(FAIL_LOST_TRAIN)
|
|
ENDIF
|
|
|
|
// skip stage J
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
INT i
|
|
bDebugDontDoDistanceFail = TRUE // cheating so lets not do distance check
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
//AND (NOT bRunningCutscene OR currentMissionStage = STAGE_GO_TO_CONTAINER)
|
|
AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
|
|
AND NOT bRunningCutscene
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
DO_SCREEN_FADE_OUT(500)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
COMMON_MISSION_CLEAR()
|
|
SET_MISSION_STAGE(STAGE_CHASE_TRAIN, TRUE)
|
|
|
|
DO_SCREEN_FADE_IN(500)
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
AND IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF NOT bDebugWarpToJumps
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
|
|
ENDIF
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE], <<2695.6858, 5293.1099, 63.6167>>)
|
|
SET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE], 24.82)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
SET_MISSION_TRAIN_COORDS(missionTrain, <<2693.48, 5273.51, 61.56>>)
|
|
ENDIF
|
|
trainMovementState = TRAIN_MOVEMENT_CATCHUP
|
|
fTrainCruiseSpeed = 24.0
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_BLIP(gotoBlip)
|
|
ENDIF
|
|
bDebugWarpToJumps = TRUE
|
|
ELSE
|
|
DO_SCREEN_FADE_OUT(500)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
COMMON_MISSION_CLEAR()
|
|
SET_MISSION_STAGE(STAGE_DRIVE_ALONG_TRAIN, TRUE)
|
|
|
|
DO_SCREEN_FADE_IN(500)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
bRunningCutscene = TRUE
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
IF NOT bArrivedAtBridge
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_MICHAEL
|
|
sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
|
|
bDebugJSkip = TRUE
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_BRIDGE))
|
|
SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], DINGHY_AT_BRIDGE_ROT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR
|
|
sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR
|
|
bDebugJSkip = TRUE
|
|
ELSE
|
|
IF trainHotswapState = TRAIN_HOTSWAP_ON_TREVOR
|
|
IF NOT bDoneJumpOff
|
|
IF NOT bDebugWarpedTrainToBridge
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
SET_MISSION_TRAIN_COORDS(missionTrain, <<-539, 4681, 90>>)
|
|
bDebugWarpedTrainToBridge = TRUE
|
|
ENDIF
|
|
ELSE
|
|
DO_SCREEN_FADE_OUT(500)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
COMMON_MISSION_CLEAR()
|
|
SET_MISSION_STAGE(STAGE_GO_TO_CONTAINER, TRUE)
|
|
|
|
DO_SCREEN_FADE_IN(500)
|
|
ENDIF
|
|
ELSE
|
|
//IF NOT bSelectedMichael
|
|
// sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
|
|
// bDebugJSkip = TRUE
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
IF NOT bFoundBomb
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
bFoundBomb = TRUE
|
|
ELSE
|
|
IF NOT bExplodedDoors
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
//SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-446.05, 4428.41, 30.00>>)
|
|
//SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], 80.10)
|
|
// ADD_EXPLOSION(<<-491.58, 4434.94, 30.74>>, EXP_TAG_GRENADE)
|
|
CLEAR_AREA(<<-491.58, 4434.94, 30.74>>, 10, TRUE)
|
|
// DO_DOORS_BLOW_OPEN()
|
|
eSwitchCamState = SWITCH_CAM_SETUP_MICHAEL_TO_TREVOR_CONTAINER_SPLINE
|
|
bHasContainerSwitchCamExplosionHappened = FALSE
|
|
bExplodedDoors = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.98)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
IF NOT bMichaelInDinghy
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_SECOND_WAVE] = TRUE
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_THIRD_WAVE] = TRUE
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_FOURTH_WAVE] = TRUE
|
|
bTriggeredEnemyWave[EW_SHOOTOUT_FIFTH_WAVE] = TRUE
|
|
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
iDelayFindItemTime = 0
|
|
REMOVE_MISSION_TEXT()
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.98)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bReadyToEscape
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
bMichaelAnchoredDinghy = TRUE
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY], VS_FRONT_RIGHT)
|
|
ENDIF
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], GET_TRAIN_CRASH_VECTOR(TCVEC_DINGHY_AT_RAPIDS))
|
|
SET_ENTITY_HEADING(trainCrashVehicle[TCV_DINGHY], DINGHY_AT_RAPIDS_ROT)
|
|
ENDIF
|
|
ELSE
|
|
bRunningCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_DINGHY])
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_DINGHY])
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bDoMopUp
|
|
KILL_ANY_CONVERSATION()
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_DINGHY], <<-1806.11, 4581.43, 0.74>>)
|
|
SET_BOAT_ANCHOR(trainCrashVehicle[TCV_DINGHY], FALSE)
|
|
SET_VEHICLE_FORWARD_SPEED(trainCrashVehicle[TCV_DINGHY], 20)
|
|
ELSE
|
|
KILL_ANY_CONVERSATION()
|
|
REPEAT COUNT_OF(ENEMY_PED_ENUM) i
|
|
IF NOT IS_PED_INJURED(enemyPed[i].ped)
|
|
APPLY_DAMAGE_TO_PED(enemyPed[i].ped, 1000, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
IF NOT bGotToBeach
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_MICHAEL
|
|
KILL_ANY_CONVERSATION()
|
|
sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL
|
|
bDebugJSkip = TRUE
|
|
ELSE
|
|
KILL_ANY_CONVERSATION()
|
|
SETUP_BOAT_AND_BEACH()
|
|
ENDIF
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_TRAIN_CRASH_VECTOR(TCVEC_BEACH_VEHICLES))
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
IF bRunningCutscene
|
|
AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
DO_SCREEN_FADE_OUT(500)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
COMMON_MISSION_CLEAR()
|
|
SET_MISSION_STAGE(STAGE_GET_TO_BRIDGE, TRUE)
|
|
|
|
DO_SCREEN_FADE_IN(500)
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
STOP_CUTSCENE()
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// previous stage P
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
|
|
TRIGGER_MUSIC_EVENT("EXL3_MISSION_FAIL")
|
|
IF currentMissionStage <> STAGE_CHASE_TRAIN
|
|
OR (currentMissionStage = STAGE_CHASE_TRAIN AND NOT bObjectiveIsJump)
|
|
DO_SCREEN_FADE_OUT(500)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
COMMON_MISSION_CLEAR()
|
|
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
POSITION_PLAYER_AT_MISSION_INIT()
|
|
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE)
|
|
BREAK
|
|
CASE STAGE_CHASE_TRAIN
|
|
POSITION_PLAYER_AT_MISSION_INIT()
|
|
SET_MISSION_STAGE(STAGE_INTERCEPT_TRAIN, TRUE)
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
SET_MISSION_STAGE(STAGE_CHASE_TRAIN, TRUE)
|
|
BREAK
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
SET_MISSION_STAGE(STAGE_DRIVE_ALONG_TRAIN, TRUE)
|
|
BREAK
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
SET_MISSION_STAGE(STAGE_GET_TO_BRIDGE, TRUE)
|
|
BREAK
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
SET_MISSION_STAGE(STAGE_GO_TO_CONTAINER, TRUE)
|
|
BREAK
|
|
CASE STAGE_RAPIDS_CHASE
|
|
SET_MISSION_STAGE(STAGE_STEAL_FROM_CONTAINER, TRUE)
|
|
BREAK
|
|
CASE STAGE_GET_HOME
|
|
SET_MISSION_STAGE(STAGE_RAPIDS_CHASE, TRUE)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
DO_SCREEN_FADE_IN(500)
|
|
ELSE
|
|
// custom p skip for jumps
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
AND IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
|
|
ENDIF
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE], <<2754.90259, 5111.79443, 61.78289>>)
|
|
SET_ENTITY_HEADING(trainCrashVehicle[TCV_BIKE], 11.62)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(missionTrain)
|
|
SET_MISSION_TRAIN_COORDS(missionTrain, <<2501.48, 5718.51, 61.56>>)
|
|
ENDIF
|
|
trainMovementState = TRAIN_MOVEMENT_CATCHUP
|
|
fTrainCruiseSpeed = 18.0
|
|
IF DOES_BLIP_EXIST(gotoBlip)
|
|
REMOVE_BLIP(gotoBlip)
|
|
ENDIF
|
|
bObjectiveIsJump = FALSE
|
|
bShownJumpPrompt = FALSE
|
|
bShownPathHelp = FALSE
|
|
bDoneJumpSpeech = FALSE
|
|
iCurrentJump = -1
|
|
fPlayerIsOnTrainTimer = 0.0
|
|
bDebugWarpToJumps = FALSE
|
|
REMOVE_ALL_BLIPS()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// stage menu
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM
|
|
IF LAUNCH_MISSION_STAGE_MENU(stageMenu, iMenuMissionStage)
|
|
// convert debug stage to mission stage
|
|
MISSION_STAGE_ENUM setStage
|
|
SWITCH iMenuMissionStage
|
|
CASE 1
|
|
setStage = STAGE_INTERCEPT_TRAIN
|
|
BREAK
|
|
CASE 2
|
|
setStage = STAGE_CHASE_TRAIN
|
|
BREAK
|
|
CASE 3
|
|
setStage = STAGE_DRIVE_ALONG_TRAIN
|
|
BREAK
|
|
CASE 4
|
|
setStage = STAGE_GET_TO_BRIDGE
|
|
BREAK
|
|
CASE 5
|
|
setStage = STAGE_GO_TO_CONTAINER
|
|
BREAK
|
|
CASE 6
|
|
setStage = STAGE_STEAL_FROM_CONTAINER
|
|
BREAK
|
|
CASE 7
|
|
setStage = STAGE_RAPIDS_CHASE
|
|
BREAK
|
|
CASE 8
|
|
setStage = STAGE_GET_HOME
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF iMenuMissionStage <= 8
|
|
TRIGGER_MUSIC_EVENT("EXL3_MISSION_FAIL")
|
|
|
|
DO_SCREEN_FADE_OUT(500)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
COMMON_MISSION_CLEAR()
|
|
IF setStage = STAGE_INTERCEPT_TRAIN
|
|
POSITION_PLAYER_AT_MISSION_INIT()
|
|
ENDIF
|
|
SET_MISSION_STAGE(setStage, TRUE)
|
|
|
|
DO_SCREEN_FADE_IN(500)
|
|
//ELIF iMenuMissionStage = 10
|
|
// bEnabledTrainClimbers = NOT bEnabledTrainClimbers
|
|
// SETUP_TRAIN_CRASH_DEBUG_MENU()
|
|
//ELIF iMenuMissionStage = 11
|
|
// bEnabledJeepOnTracks = NOT bEnabledJeepOnTracks
|
|
// SETUP_TRAIN_CRASH_DEBUG_MENU()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// stage specific stuff numpad 2
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_CHASE_TRAIN
|
|
IF iCurrentJump >= 0
|
|
IF IS_VEHICLE_DRIVEABLE(trainCrashVehicle[TCV_BIKE])
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), trainCrashVehicle[TCV_BIKE], VS_DRIVER)
|
|
ENDIF
|
|
SET_VEHICLE_ENGINE_ON(trainCrashVehicle[TCV_BIKE], TRUE, TRUE)
|
|
SET_ENTITY_COORDS(trainCrashVehicle[TCV_BIKE], GET_JUMP_COORDS(iCurrentJump))
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// there must be an easier way to do this
|
|
PROC FORMAT_FLOAT_FOR_RB_CAM_DUMP(FLOAT fInputFloat, INT &iBeforeDec, INT &iAfterDec)
|
|
IF fInputFloat >= 0
|
|
iBeforeDec = FLOOR(fInputFloat)
|
|
ELSE
|
|
iBeforeDec = CEIL(fInputFloat)
|
|
ENDIF
|
|
|
|
fInputFloat -= iBeforeDec
|
|
fInputFloat *= 100
|
|
IF fInputFloat < 0
|
|
fInputFloat *= (-1)
|
|
ENDIF
|
|
IF fInputFloat < 10
|
|
fInputFloat *= 10
|
|
ENDIF
|
|
|
|
iAfterDec = FLOOR(fInputFloat)
|
|
ENDPROC
|
|
|
|
// dump the cam coords to a widget
|
|
PROC DO_RB_DEBUG_CAM_DUMP()
|
|
IF bRBDebugCamDoDump
|
|
CAMERA_INDEX tempCam = GET_DEBUG_CAM()
|
|
|
|
vRBDebugCamPos = GET_CAM_COORD(tempCam)
|
|
vRBDebugCamRot = GET_CAM_ROT(tempCam)
|
|
fRBDebugCamFOV = GET_CAM_FOV(tempCam)
|
|
|
|
TEXT_LABEL_63 tPos
|
|
TEXT_LABEL_63 tRot
|
|
INT iBefore, iAfter
|
|
|
|
// fill position
|
|
tPos = "<<"
|
|
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.x, iBefore, iAfter)
|
|
tPos += iBefore
|
|
tPos += "."
|
|
tPos += iAfter
|
|
tPos += ", "
|
|
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.y, iBefore, iAfter)
|
|
tPos += iBefore
|
|
tPos += "."
|
|
tPos += iAfter
|
|
tPos += ", "
|
|
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.z, iBefore, iAfter)
|
|
tPos += iBefore
|
|
tPos += "."
|
|
tPos += iAfter
|
|
tPos += ">>"
|
|
|
|
// fill rotation
|
|
tRot = "<<"
|
|
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.x, iBefore, iAfter)
|
|
tRot += iBefore
|
|
tRot += "."
|
|
tRot += iAfter
|
|
tRot += ", "
|
|
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.y, iBefore, iAfter)
|
|
tRot += iBefore
|
|
tRot += "."
|
|
tRot += iAfter
|
|
tRot += ", "
|
|
FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.z, iBefore, iAfter)
|
|
tRot += iBefore
|
|
tRot += "."
|
|
tRot += iAfter
|
|
tRot += ">>"
|
|
|
|
// set widgets
|
|
SET_CONTENTS_OF_TEXT_WIDGET(RBCamPosWidget, tPos)
|
|
SET_CONTENTS_OF_TEXT_WIDGET(RBCamRotWidget, tRot)
|
|
|
|
bRBDebugCamDoDump = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
// main script
|
|
SCRIPT
|
|
|
|
SET_MISSION_FLAG(TRUE)
|
|
IF HAS_FORCE_CLEANUP_OCCURRED()
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, bHasChanged)
|
|
Mission_Flow_Mission_Force_Cleanup()
|
|
MISSION_CLEANUP()
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CREATE_TRAIN_CRASH_WIDGETS()
|
|
SETUP_TRAIN_CRASH_DEBUG_MENU()
|
|
#ENDIF
|
|
|
|
/*
|
|
#IF IS_DEBUG_BUILD
|
|
IF bSwitchCamDebugScenarioEnabled
|
|
//SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR(scsSwitchCamMichaelToTrevorRiver, trainCrashVehicle[TCV_DINGHY], trainCrashVehicle[TCV_DINGHY])
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_TREVOR_CONTAINER(scsSwitchCamMichealToTrevorContainer, piMichaelContainerSwitch, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
//SETUP_SPLINE_CAM_NODE_ARRAY_TREVOR_TO_MICHAEL(scsSwitchCamTrevorToMichaelRiver, trainCrashVehicle[TCV_DINGHY], trainCrashVehicle[TCV_DINGHY])
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_INTRO(scsSwitchCamTrainToBoat_Intro, missionTrain)
|
|
SETUP_SPLINE_CAM_NODE_ARRAY_TRAIN_TO_BOAT_OUTRO(scsSwitchCamTrainToBoat_Outro, trainCrashVehicle[TCV_DINGHY])
|
|
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrainToBoat_Intro, "Train", "", trainCrashWidgets)
|
|
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrainToBoat_Outro, "Boat", "", trainCrashWidgets)
|
|
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichealToTrevorContainer, "Michael Container", "Trevor Container", trainCrashWidgets)
|
|
//CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichaelToTrevorRiver, "Michael", "Trevor", trainCrashWidgets)
|
|
// CREATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrevorToMichaelRiver, "Trevor", "Michael", trainCrashWidgets)
|
|
ENDIF
|
|
#ENDIF
|
|
*/
|
|
//TRACE_NATIVE_COMMAND("set_gameplay_cam_relative_heading")
|
|
|
|
|
|
|
|
WHILE TRUE
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_Derailed")
|
|
|
|
//g_bDontLetBuddiesReactToNextPlayerDeath = TRUE
|
|
IF INIT_MISSION()
|
|
#IF IS_DEBUG_BUILD
|
|
IF bSwitchCamDebugScenarioEnabled
|
|
UPDATE_SPLINE_CAM_HELPERS()
|
|
// UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichaelToTrevorRiver)
|
|
// UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrevorToMichaelRiver)
|
|
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrainToBoat_Intro)
|
|
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamTrainToBoat_Outro)
|
|
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCamMichealToTrevorContainer)
|
|
ENDIF
|
|
#ENDIF
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
// do streaming for next stage
|
|
DO_STREAMING_FOR_NEXT_MISSION_STAGE(FALSE)
|
|
|
|
// do fail checks
|
|
IF NOT bPreventMissionFail_SwitchCamDebug
|
|
HANDLE_MISSION_FAIL_STATE()
|
|
ENDIF
|
|
|
|
// handle train
|
|
IF currentMissionStage <= STAGE_GET_TO_BRIDGE
|
|
HANDLE_TRAIN_SPEED()
|
|
ENDIF
|
|
|
|
// damage stat
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
// head tracking
|
|
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
|
|
|
|
// run appropriate stage
|
|
SWITCH currentMissionStage
|
|
CASE STAGE_INTERCEPT_TRAIN
|
|
DO_STAGE_INTERCEPT_TRAIN()
|
|
BREAK
|
|
|
|
CASE STAGE_CHASE_TRAIN
|
|
DO_STAGE_CHASE_TRAIN()
|
|
BREAK
|
|
|
|
CASE STAGE_DRIVE_ALONG_TRAIN
|
|
DO_STAGE_DRIVE_ALONG_TRAIN()
|
|
BREAK
|
|
|
|
CASE STAGE_GET_TO_BRIDGE
|
|
DO_STAGE_GET_TO_BRIDGE()
|
|
BREAK
|
|
|
|
CASE STAGE_GO_TO_CONTAINER
|
|
DO_STAGE_GO_TO_CONTAINER()
|
|
BREAK
|
|
|
|
CASE STAGE_STEAL_FROM_CONTAINER
|
|
DO_STAGE_STEAL_FROM_CONTAINER()
|
|
BREAK
|
|
|
|
CASE STAGE_RAPIDS_CHASE
|
|
DO_STAGE_RAPIDS_CHASE()
|
|
BREAK
|
|
|
|
CASE STAGE_GET_HOME
|
|
DO_STAGE_GET_HOME()
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF CAN_ADVANCE_MISSION()
|
|
DO_DEBUG_SKIPS()
|
|
ENDIF
|
|
DO_RB_DEBUG_CAM_DUMP()
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
//printstring("pos = ") printvector(get_entity_coords(traincrashvehicle[tcv_dinghy])) printnl()
|
|
//printstring("rot = ") printvector(get_entity_rotation(traincrashvehicle[tcv_dinghy])) printnl()
|
|
|
|
//IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1)
|
|
// PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
//ENDIF
|
|
|
|
//IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
|
|
// PLAY_SOUND_FRONTEND(-1, "EXILE_3_TRAIN_BRAKE_RELEASE_MASTER")
|
|
//ENDIF
|
|
|
|
/*
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
|
|
IF IS_VEHICLE_DRIVEABLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh, 23000 - GET_TIME_POSITION_IN_RECORDING(enemyVehicle[EV_SHOOTOUT_SECOND_WAVE_CHOPPER_1].veh))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDSCRIPT
|